rea-agents 6.1.0 → 6.3.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 (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,53 +1,79 @@
1
- import { createReadStream } from "node:fs";
1
+ import { compareUnicodeCodePoints } from "../../domain/unicodeCodePointOrder.js";
2
+ import { AsarArtifactReader } from "../AsarArtifactReader.js";
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
7
  import { artifactContradictionId, artifactGraphDigest, artifactManifestId, } from "../../domain/artifactIdentity.js";
7
- import { classifyRoot } from "./classify.js";
8
- import { hashReadable } from "../ArtifactHash.js";
8
+ import { classifyAndHashRoot } from "./classify.js";
9
+ import {} from "../ArtifactHash.js";
10
+ import { hashStableRootArtifact } from "./hashStableRootArtifact.js";
9
11
  import { createReader, inventoryLimitations } from "./reader.js";
10
12
  import { scanReader, } from "./scanReader.js";
11
13
  import { STRICT_INTEGRITY_POLICY, } from "./types.js";
12
- export const scanCanonicalArtifactInventory = async (path, options = {}) => {
14
+ export const scanCanonicalArtifactInventory = async (path, options = {}, readerFactory = createReader) => {
13
15
  const integrity = options.integrity ?? STRICT_INTEGRITY_POLICY;
14
16
  const metadata = await lstat(path);
15
- const rootFormat = await classifyRoot(path, metadata.isDirectory());
16
- const rootDigest = metadata.isDirectory()
17
- ? null
18
- : await hashReadable(createReadStream(path), options.signal);
19
- const reader = await createReader(path, rootFormat, options.signal);
17
+ const { format: rootFormat, digest: rootDigest } = await classifyAndHashRoot(path, metadata.isDirectory(), metadata, options.signal);
18
+ const reader = await readerFactory(path, rootFormat, options.environment ?? {}, options.signal);
19
+ const ownedReaders = reader === undefined ? [] : [reader];
20
+ let outcome;
20
21
  try {
21
- 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
- });
22
+ if (reader instanceof AsarArtifactReader)
23
+ await reader.prepareContainer(rootDigest?.sha256, options.signal);
24
+ const { nodes, occurrences, pendingContradictions } = await scanReader(reader, ownedReaders, options.signal, integrity);
25
+ outcome = {
26
+ kind: "completed",
27
+ snapshot: await buildInventorySnapshot({
28
+ path,
29
+ metadata,
30
+ rootFormat,
31
+ rootDigest,
32
+ reader,
33
+ signal: options.signal,
34
+ nodes,
35
+ occurrences,
36
+ pendingContradictions,
37
+ }),
38
+ };
33
39
  }
34
- finally {
35
- await reader?.close();
40
+ catch (cause) {
41
+ outcome = { kind: "failed", cause };
36
42
  }
43
+ let cleanupFailure;
44
+ for (const owned of ownedReaders.reverse()) {
45
+ try {
46
+ await owned.close();
47
+ }
48
+ catch (cleanupCause) {
49
+ const cleanup = ArtifactReaderFailure.cleanupObservation(cleanupCause, `artifact reader for ${path}`);
50
+ cleanupFailure = ArtifactReaderFailure.withCleanup(cleanupFailure ??
51
+ (outcome.kind === "failed" ? outcome.cause : cleanupCause), cleanup, outcome.kind === "completed"
52
+ ? { kind: "artifact-inventory", inventory: outcome.snapshot }
53
+ : undefined);
54
+ }
55
+ }
56
+ if (cleanupFailure !== undefined)
57
+ throw cleanupFailure;
58
+ if (outcome.kind === "failed")
59
+ throw outcome.cause;
60
+ return outcome.snapshot;
37
61
  };
38
62
  const buildInventorySnapshot = async (input) => {
39
63
  const { path, metadata, rootFormat, rootDigest, reader, signal } = input;
40
64
  materializeDirectoryNodes(input.occurrences, input.nodes);
41
65
  const rootNode = createRootNode({
42
- path,
43
- format: rootFormat,
44
- directory: metadata.isDirectory(),
45
66
  digest: rootDigest,
46
67
  occurrences: input.occurrences,
47
68
  });
48
69
  input.nodes.set(rootNode.artifact_id, rootNode);
49
70
  rekeyOccurrences(rootNode.artifact_id, input.occurrences);
50
- const rootOccurrence = rootOccurrenceFor(rootNode, metadata.size);
71
+ const rootOccurrence = rootOccurrenceFor(rootNode, {
72
+ size: metadata.size,
73
+ executable: (metadata.mode & 0o111) !== 0,
74
+ format: rootFormat,
75
+ path,
76
+ });
51
77
  for (const occurrence of input.occurrences)
52
78
  if (occurrence.parent_occurrence_id === null)
53
79
  occurrence.parent_occurrence_id = rootOccurrence.occurrence_id;
@@ -61,7 +87,10 @@ const buildInventorySnapshot = async (input) => {
61
87
  const edges = createArtifactEdges(rootNode.artifact_id, input.occurrences, reader?.provenance()[0]);
62
88
  const orderedNodes = sortNodes([...input.nodes.values()]);
63
89
  const orderedOccurrences = sortOccurrences(input.occurrences);
64
- const orderedEdges = sortEdges(edges);
90
+ const orderedEdges = sortEdges(edges).map((edge, ordinal) => ({
91
+ ...edge,
92
+ ordinal,
93
+ }));
65
94
  await verifyRootDigest(path, rootDigest, signal);
66
95
  const graphSha256 = artifactGraphDigest({
67
96
  nodes: orderedNodes,
@@ -71,6 +100,7 @@ const buildInventorySnapshot = async (input) => {
71
100
  });
72
101
  const manifest = buildManifest({
73
102
  rootNode,
103
+ rootFormat,
74
104
  graphSha256,
75
105
  orderedNodes,
76
106
  orderedOccurrences,
@@ -118,19 +148,19 @@ const buildIntegrityContradictions = (pending, occurrenceByPath, occurrenceById,
118
148
  const verifyRootDigest = async (path, rootDigest, signal) => {
119
149
  if (rootDigest === null)
120
150
  return;
121
- const verified = await hashReadable(createReadStream(path), signal);
151
+ const verified = await hashStableRootArtifact(path, signal);
122
152
  if (verified.sha256 !== rootDigest.sha256 ||
123
153
  verified.bytes !== rootDigest.bytes)
124
154
  throw new ArtifactReaderFailure("integrity", "Root artifact changed during inventory");
125
155
  };
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({
156
+ const sortNodes = (nodes) => nodes.sort((left, right) => compareUnicodeCodePoints(left.artifact_id, right.artifact_id));
157
+ const sortOccurrences = (occurrences) => occurrences.sort((left, right) => compareUnicodeCodePoints(left.logical_path, right.logical_path));
158
+ const sortEdges = (edges) => edges.sort((left, right) => compareUnicodeCodePoints(left.edge_id, right.edge_id));
159
+ const buildManifest = ({ rootNode, rootFormat, graphSha256, orderedNodes, orderedOccurrences, orderedEdges, }) => artifactInventoryResultSchema.shape.manifest.parse({
130
160
  manifest_id: artifactManifestId(rootNode.artifact_id, graphSha256),
131
161
  root_artifact_id: rootNode.artifact_id,
132
162
  root_sha256: rootNode.sha256,
133
- root_format: rootNode.format,
163
+ root_format: rootFormat,
134
164
  graph_sha256: graphSha256,
135
165
  node_count: orderedNodes.length,
136
166
  occurrence_count: orderedOccurrences.length,
@@ -2,12 +2,12 @@ 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.";
9
9
  const emptyScan = () => ({ nodes: new Map(), occurrences: [], pendingContradictions: [] });
10
- export const scanReader = async (reader, signal, integrity = STRICT_INTEGRITY_POLICY) => {
10
+ export const scanReader = async (reader, ownedReaders, signal, integrity = STRICT_INTEGRITY_POLICY) => {
11
11
  const { nodes, occurrences, pendingContradictions } = emptyScan();
12
12
  if (reader === undefined)
13
13
  return { nodes, occurrences, pendingContradictions };
@@ -21,6 +21,7 @@ export const scanReader = async (reader, signal, integrity = STRICT_INTEGRITY_PO
21
21
  occurrenceByPath: new Map(),
22
22
  registry: new ArtifactPathRegistry(),
23
23
  expandedContainerIds: new Set(),
24
+ ownedReaders,
24
25
  };
25
26
  await visitArtifactEntries(context, reader, "");
26
27
  // Archive directories may appear after their children. Resolve containment
@@ -36,7 +37,6 @@ const visitArtifactEntries = async (context, currentReader, prefix) => {
36
37
  reader: currentReader,
37
38
  prefix,
38
39
  iterator: currentReader.entries(context.signal)[Symbol.asyncIterator](),
39
- owned: false,
40
40
  },
41
41
  ];
42
42
  try {
@@ -47,8 +47,6 @@ const visitArtifactEntries = async (context, currentReader, prefix) => {
47
47
  const next = await frame.iterator.next();
48
48
  if (next.done) {
49
49
  stack.pop();
50
- if (frame.owned)
51
- await frame.reader.close();
52
50
  continue;
53
51
  }
54
52
  const entry = next.value;
@@ -71,6 +69,8 @@ const visitArtifactEntries = async (context, currentReader, prefix) => {
71
69
  if (digested !== undefined) {
72
70
  context.nodes.set(digested.node.artifact_id, digested.node);
73
71
  occurrence.artifact_id = digested.node.artifact_id;
72
+ occurrence.artifact_kind = digested.classification.kind;
73
+ occurrence.artifact_format = digested.classification.format;
74
74
  occurrence.hash_status = digested.mismatched
75
75
  ? "mismatched"
76
76
  : "verified";
@@ -79,26 +79,24 @@ const visitArtifactEntries = async (context, currentReader, prefix) => {
79
79
  }
80
80
  context.occurrences.push(occurrence);
81
81
  context.occurrenceByPath.set(logicalPath, occurrence);
82
- if (expandableAsar && digested?.mismatched !== true) {
82
+ if (expandableAsar && digested !== undefined && !digested.mismatched) {
83
83
  const nested = new AsarArtifactReader(entry.adapterKey);
84
+ context.ownedReaders.push(nested);
85
+ await nested.prepareContainer(digested.node.sha256, context.signal);
84
86
  // Only traversed containers can own members, not opaque ASAR-named files.
85
87
  context.expandedContainerIds.add(occurrence.occurrence_id);
86
88
  stack.push({
87
89
  reader: nested,
88
90
  prefix: logicalPath,
89
91
  iterator: nested.entries(context.signal)[Symbol.asyncIterator](),
90
- owned: true,
91
92
  });
92
93
  }
93
94
  }
94
95
  }
95
96
  finally {
96
- await Promise.allSettled(stack
97
- .filter(({ owned }) => owned)
98
- .map(async ({ reader, iterator }) => {
97
+ // Readers remain owned by the inventory until its complete observation is built.
98
+ for (const { iterator } of stack)
99
99
  await iterator.return?.();
100
- await reader.close();
101
- }));
102
100
  }
103
101
  };
104
102
  const digestArtifactEntry = async (context, currentReader, entry, logicalPath) => {
@@ -129,17 +127,11 @@ const digestArtifactEntry = async (context, currentReader, entry, logicalPath) =
129
127
  node: createArtifactNode({
130
128
  sha256: digest.sha256,
131
129
  size: digest.bytes,
132
- kind: classified.kind,
133
- format: classified.format,
134
- executable: entry.executable,
130
+ format: classifyArtifactBytes(digest.prefix, digest.bytes),
135
131
  contentState: "embedded",
136
- limitations: mismatched
137
- ? [
138
- "Observed content contradicts declared integrity metadata and is untrusted.",
139
- ]
140
- : [],
141
132
  }),
142
133
  mismatched,
134
+ classification: classified,
143
135
  };
144
136
  };
145
137
  const isExpandableAsar = (entry, logicalPath) => entry.kind === "file" &&
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { isAbsolute } from "node:path";
3
- import { compareCodePoints } from "../../domain/canonicalOrdering.js";
3
+ import { compareUnicodeCodePoints } from "../../domain/unicodeCodePointOrder.js";
4
4
  import { AsarArtifactReader } from "../AsarArtifactReader.js";
5
5
  import { ArtifactPathRegistry, normalizeArtifactPath, } from "../ArtifactPaths.js";
6
6
  import { ArtifactReaderFailure, } from "../ArtifactReader.js";
@@ -12,7 +12,7 @@ export const readJavaScriptArtifactFiles = async (reader, snapshot, signal) => {
12
12
  const root = snapshot.nodes.find(({ artifact_id }) => artifact_id === snapshot.manifest.root_artifact_id);
13
13
  if (root === undefined)
14
14
  throw new ArtifactReaderFailure("integrity", "Root artifact node is missing");
15
- await verifyEntryBytes(reader.openContainer(signal), { path: ".", sha256: root.sha256, bytes: root.size }, signal);
15
+ await verifyEntryBytes(await reader.openContainer(signal), { path: ".", sha256: root.sha256, bytes: root.size }, signal);
16
16
  }
17
17
  const inventory = expectedInventory(snapshot);
18
18
  const expected = inventory.files;
@@ -27,11 +27,11 @@ export const readJavaScriptArtifactFiles = async (reader, snapshot, signal) => {
27
27
  invalidUtf8: 0,
28
28
  };
29
29
  await visitReader(reader, "", snapshot.manifest.root_sha256, context);
30
- const files = context.files.sort((left, right) => compareCodePoints(left.path, right.path));
30
+ const files = context.files.sort((left, right) => compareUnicodeCodePoints(left.path, right.path));
31
31
  assertExpectedFilesWereVisited(expected, files);
32
32
  return {
33
33
  files,
34
- containers: context.containers.sort((left, right) => compareCodePoints(left.path, right.path)),
34
+ containers: context.containers.sort((left, right) => compareUnicodeCodePoints(left.path, right.path)),
35
35
  text_bytes_read: context.textBytes,
36
36
  invalid_utf8_files: context.invalidUtf8,
37
37
  };
@@ -43,9 +43,10 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
43
43
  prefix,
44
44
  containerSha256,
45
45
  iterator: reader.entries(context.signal)[Symbol.asyncIterator](),
46
- owned: false,
47
46
  },
48
47
  ];
48
+ const ownedReaders = [];
49
+ let failure;
49
50
  try {
50
51
  while (stack.length > 0) {
51
52
  const frame = stack.at(-1);
@@ -54,8 +55,6 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
54
55
  const next = await frame.iterator.next();
55
56
  if (next.done) {
56
57
  stack.pop();
57
- if (frame.owned)
58
- await frame.reader.close();
59
58
  continue;
60
59
  }
61
60
  const entry = next.value;
@@ -64,17 +63,32 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
64
63
  const nestedAsar = isFilesystemAsar(entry, path);
65
64
  context.registry.add(path, nestedAsar ? "directory" : entry.kind);
66
65
  if (nestedAsar) {
67
- const inventory = expectedContainer(path, context);
66
+ const container = context.expectedContainers.get(path);
67
+ // Inventory deliberately does not expand unverified or unavailable
68
+ // nested archives. Keep the same boundary here when reconstruction
69
+ // reads the active entries again.
70
+ if (container === undefined)
71
+ throw new ArtifactReaderFailure("integrity", `Nested ASAR was not present in inventory: ${path}`);
72
+ if (container.hash_status === "mismatched")
73
+ continue;
74
+ if (container.hash_status === "unavailable")
75
+ throw new ArtifactReaderFailure("unavailable", `Nested ASAR bytes were unavailable during inventory: ${path}`);
76
+ if (container.hash_status !== "verified")
77
+ throw new ArtifactReaderFailure("integrity", `Nested ASAR was not integrity-verified: ${path}`);
78
+ const inventory = container.inventory;
79
+ if (inventory === null)
80
+ throw new ArtifactReaderFailure("integrity", `Verified nested ASAR has no inventory node: ${path}`);
68
81
  await verifyEntryBytes(await frame.reader.open(entry, context.signal), inventory, context.signal);
69
82
  context.containers.push(inventory);
70
83
  const nested = new AsarArtifactReader(entry.adapterKey);
84
+ ownedReaders.push(nested);
71
85
  stack.push({
72
86
  reader: nested,
73
87
  prefix: path,
74
88
  containerSha256: inventory.sha256,
75
89
  iterator: nested.entries(context.signal)[Symbol.asyncIterator](),
76
- owned: true,
77
90
  });
91
+ await nested.prepareContainer(inventory.sha256, context.signal);
78
92
  continue;
79
93
  }
80
94
  const expected = context.expected.get(path);
@@ -97,20 +111,31 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
97
111
  });
98
112
  }
99
113
  }
114
+ catch (cause) {
115
+ failure = { cause };
116
+ }
100
117
  finally {
101
- await Promise.allSettled(stack
102
- .filter(({ owned }) => owned)
103
- .map(async ({ reader, iterator }) => {
104
- await iterator.return?.();
105
- await reader.close();
106
- }));
118
+ for (const { iterator } of stack) {
119
+ try {
120
+ await iterator.return?.();
121
+ }
122
+ catch (cause) {
123
+ failure ??= { cause };
124
+ }
125
+ }
126
+ for (const owned of ownedReaders.reverse()) {
127
+ try {
128
+ await owned.close();
129
+ }
130
+ catch (cause) {
131
+ failure = {
132
+ cause: ArtifactReaderFailure.withCleanup(failure?.cause ?? cause, ArtifactReaderFailure.cleanupObservation(cause, `nested ASAR reader for ${prefix}`)),
133
+ };
134
+ }
135
+ }
107
136
  }
108
- };
109
- const expectedContainer = (path, context) => {
110
- const container = context.expectedContainers.get(path);
111
- if (container === undefined)
112
- throw new ArtifactReaderFailure("integrity", `Nested ASAR disappeared from inventory: ${path}`);
113
- return container;
137
+ if (failure !== undefined)
138
+ throw failure.cause;
114
139
  };
115
140
  const readText = async (context, input) => {
116
141
  if (input.expected.kind === "native-addon") {
@@ -155,8 +180,18 @@ const expectedInventory = (snapshot) => {
155
180
  const files = new Map();
156
181
  const containers = new Map();
157
182
  for (const occurrence of snapshot.occurrences) {
158
- if (occurrence.artifact_id === null || occurrence.logical_path === ".")
183
+ if (occurrence.logical_path === ".")
159
184
  continue;
185
+ const isNestedAsar = occurrence.entry_kind === "file" &&
186
+ occurrence.logical_path.toLowerCase().endsWith(".asar");
187
+ if (occurrence.artifact_id === null) {
188
+ if (isNestedAsar)
189
+ containers.set(occurrence.logical_path, {
190
+ hash_status: occurrence.hash_status,
191
+ inventory: null,
192
+ });
193
+ continue;
194
+ }
160
195
  const node = nodes.get(occurrence.artifact_id);
161
196
  if (node === undefined)
162
197
  throw new ArtifactReaderFailure("integrity", `Artifact inventory node is missing: ${occurrence.logical_path}`);
@@ -165,12 +200,15 @@ const expectedInventory = (snapshot) => {
165
200
  // node_modules/@zip.js remains a graph node and must never be opened.
166
201
  if (occurrence.entry_kind !== "file")
167
202
  continue;
168
- if (occurrence.logical_path.toLowerCase().endsWith(".asar"))
203
+ if (isNestedAsar)
169
204
  containers.set(occurrence.logical_path, {
170
- path: occurrence.logical_path,
171
- sha256: node.sha256,
172
- bytes: node.size,
173
- inventory_artifact_id: node.artifact_id,
205
+ hash_status: occurrence.hash_status,
206
+ inventory: {
207
+ path: occurrence.logical_path,
208
+ sha256: node.sha256,
209
+ bytes: node.size,
210
+ inventory_artifact_id: node.artifact_id,
211
+ },
174
212
  });
175
213
  const kind = relevantKind(occurrence.logical_path);
176
214
  if (kind === undefined)
@@ -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,15 +20,12 @@ 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
- const IDENTITY = CDP_BROWSER_PROVIDER_IDENTITY;
26
24
  const CLEANUP_DOMAINS = ["Network", "Debugger", "Runtime", "Page"];
27
25
  /** Passive browser observation through a selected user-owned CDP endpoint. */
28
26
  export class CdpBrowserProvider {
29
27
  identity() {
30
- return IDENTITY;
28
+ return CDP_BROWSER_PROVIDER_IDENTITY;
31
29
  }
32
30
  async listTargets(input, options = {}) {
33
31
  try {
@@ -263,4 +261,6 @@ const providerError = (cause, operation) => cause instanceof BrowserObservationE
263
261
  ? new BrowserObservationError(operation, cause.reason, { cause })
264
262
  : cause instanceof AnalysisError
265
263
  ? cause
266
- : new ProviderAdapterError(IDENTITY.id, operation, { cause });
264
+ : new ProviderAdapterError(CDP_BROWSER_PROVIDER_IDENTITY.id, operation, {
265
+ cause,
266
+ });
@@ -1,6 +1,6 @@
1
1
  import { inferJsonShape } from "../domain/jsonShape.js";
2
2
  import { safeResponseMetadata } from "./CdpSafeMetadata.js";
3
- import { allowedSanitizedUrl, isHttpUrl, numberValue, recordValue, recordsValue, cdpStringValue, } from "./CdpCaptureValues.js";
3
+ import { allowedSanitizedUrl, isHttpUrl, numberValue, recordValue, recordsValue, scriptMetadataValues, cdpStringValue, } from "./CdpCaptureValues.js";
4
4
  import { requestBodyShape, updateResponseBodyShape, } from "./CdpCaptureEventBodyShapes.js";
5
5
  import { consolePrimitive, decodeBase64, exclusionReasonForUrl, executionContextKey, firstCallFrame, initiatorLocation, integerOrNull, isJsonMediaType, isMainFrameNavigation, } from "./CdpCaptureEventHelpers.js";
6
6
  import { CDP_CAPTURE_SCRIPT_METADATA_LIMITS, } from "./CdpCaptureEventTypes.js";
@@ -44,9 +44,7 @@ export const handleScriptParsed = (state, params) => {
44
44
  rawUrl,
45
45
  url: sanitized.url,
46
46
  origin: sanitized.origin,
47
- hash: cdpStringValue(params.hash) ?? "",
48
- length: Math.max(0, Math.min(Number.MAX_SAFE_INTEGER, Math.trunc(numberValue(params.length) ?? 0))),
49
- isModule: params.isModule === true,
47
+ ...scriptMetadataValues(params),
50
48
  language: cdpStringValue(params.scriptLanguage) ?? null,
51
49
  executionContextKey: executionContextKey(params.executionContextId),
52
50
  };
@@ -3,7 +3,6 @@ import * as bodyShapes from "./CdpCaptureEventBodyShapes.js";
3
3
  import * as handlers from "./CdpCaptureEventHandlers.js";
4
4
  import { isJsonMediaType } from "./CdpCaptureEventHelpers.js";
5
5
  import { recordValue } from "./CdpCaptureValues.js";
6
- export {} from "./CdpCaptureEventTypes.js";
7
6
  /** Event accumulator that validates and normalizes payloads at ingestion. */
8
7
  export class CdpCaptureEvents {
9
8
  #scriptMetadataBudgetExclusionsRecorded = false;
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
- import { compareCodePoints } from "../domain/canonicalOrdering.js";
3
+ import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
4
4
  import { CdpConnection } from "./CdpConnection.js";
5
5
  import { optionalCdpCommand } from "./CdpOptionalCommand.js";
6
6
  import { recordValue, recordsValue, cdpStringValue, } from "./CdpCaptureValues.js";
@@ -16,7 +16,7 @@ export const captureStorageFingerprints = async ({ context, origin, cookieUrl, l
16
16
  await addCookies(run, cookieUrl);
17
17
  await addIndexedDb(run, origin, indexedDbNames);
18
18
  await addCaches(run, caches);
19
- state.items.sort((left, right) => compareCodePoints(`${left.scope}:${left.identity_sha256}`, `${right.scope}:${right.identity_sha256}`));
19
+ state.items.sort((left, right) => compareUnicodeCodePoints(`${left.scope}:${left.identity_sha256}`, `${right.scope}:${right.identity_sha256}`));
20
20
  const complete = state.complete && state.items.every(({ complete }) => complete);
21
21
  return { items: state.items, complete };
22
22
  };
@@ -282,7 +282,7 @@ const stableValue = (value) => {
282
282
  return String(value);
283
283
  return Object.fromEntries(Object.entries(record)
284
284
  .filter(([key]) => key !== "objectId" && key !== "customPreview")
285
- .sort(([left], [right]) => compareCodePoints(left, right))
285
+ .sort(([left], [right]) => compareUnicodeCodePoints(left, right))
286
286
  .map(([key, item]) => [key, stableValue(item)]));
287
287
  };
288
288
  const stableValueComplete = (value) => {
@@ -13,12 +13,32 @@ export const recordsValue = (value) => Array.isArray(value)
13
13
  : [];
14
14
  export const cdpStringValue = (value) => typeof value === "string" ? value : undefined;
15
15
  export const numberValue = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
16
+ /** Preserve partial script declarations; omitted or invalid fields remain unknown. */
17
+ export const scriptMetadataValues = (value) => {
18
+ const length = numberValue(value?.length);
19
+ return {
20
+ hash: cdpStringValue(value?.hash) ?? null,
21
+ length: length !== undefined && Number.isSafeInteger(length) && length >= 0
22
+ ? length
23
+ : null,
24
+ isModule: typeof value?.isModule === "boolean" ? value.isModule : null,
25
+ };
26
+ };
16
27
  export const requiredRecord = (value) => {
17
28
  const record = recordValue(value);
18
29
  if (record === undefined)
19
30
  throw new BrowserObservationError("inspect_web_page", "protocol_error");
20
31
  return record;
21
32
  };
33
+ /** Require producer source text; an absent source is distinct from an empty script. */
34
+ export const requiredScriptSource = (value, operation) => {
35
+ const source = cdpStringValue(recordValue(value)?.scriptSource);
36
+ if (source === undefined)
37
+ throw new BrowserObservationError(operation, "protocol_error", {
38
+ detail: "Debugger.getScriptSource returned malformed source text: scriptSource must be a string.",
39
+ });
40
+ return source;
41
+ };
22
42
  export const isHttpUrl = (value) => {
23
43
  if (value === undefined)
24
44
  return false;