rea-agents 6.2.0 → 6.4.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 (636) hide show
  1. package/README.md +24 -23
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -1,4 +1,5 @@
1
- import { canonicalDigest } from "./comparisonSemantics.js";
1
+ import { digestCanonicalValue } from "./canonicalDigest.js";
2
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
2
3
  import { webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
3
4
  /** Compare normalized observations without treating incomplete absence as proof. */
4
5
  export const compareWebCaptures = (input) => {
@@ -23,7 +24,7 @@ export const compareWebCaptures = (input) => {
23
24
  dimensions,
24
25
  limitations: [
25
26
  "A changed status proves an observed difference; an unknown status means absence could not be established from capture completeness.",
26
- "Network comparison covers only activity observed after each CDP attachment.",
27
+ "Network comparison covers only activity observed after each CDP attachment. WebSocket connections with the same URL are compared as an unordered collection of ordered frame streams, retaining connection counts; their individual identities are not stable across captures.",
27
28
  "Accessibility roles, ignored state, text, and hierarchy are compared only when the accessibility tree was fully captured and text capture was selected and not truncated.",
28
29
  "Storage key inventories are compared only when selected and complete; usage and quota are compared only when reported. Redacted content is compared through complete SHA-256 fingerprints.",
29
30
  ],
@@ -41,8 +42,8 @@ const compareIdentities = (before, after) => {
41
42
  for (const identity of after.keys())
42
43
  if (!before.has(identity))
43
44
  changes.push({ identity, change: "added" });
44
- return changes.sort((left, right) => left.identity.localeCompare(right.identity) ||
45
- left.change.localeCompare(right.change));
45
+ return changes.sort((left, right) => compareUnicodeCodePoints(left.identity, right.identity) ||
46
+ compareUnicodeCodePoints(left.change, right.change));
46
47
  };
47
48
  const compareDimension = (before, after, complete, reason) => {
48
49
  const all = compareIdentities(before, after).filter(({ change }) => complete || change === "modified");
@@ -72,7 +73,7 @@ const accessibilityDimension = (before, after) => {
72
73
  const afterAccess = accessibilityComparable(after);
73
74
  const textComparable = beforeAccess.text && afterAccess.text;
74
75
  const nodesComparable = beforeAccess.nodes && afterAccess.nodes;
75
- return compareDimension(singleton("accessibility_tree", digest(accessibilityProjection(before.accessibility, textComparable, nodesComparable))), singleton("accessibility_tree", digest(accessibilityProjection(after.accessibility, textComparable, nodesComparable))), beforeAccess.complete && afterAccess.complete, "Accessibility tree or text capture was incomplete in at least one observation.");
76
+ return compareDimension(singleton("accessibility_tree", digestCanonicalValue(accessibilityProjection(before.accessibility, textComparable, nodesComparable))), singleton("accessibility_tree", digestCanonicalValue(accessibilityProjection(after.accessibility, textComparable, nodesComparable))), beforeAccess.complete && afterAccess.complete, "Accessibility tree or text capture was incomplete in at least one observation.");
76
77
  };
77
78
  const storageDimension = (before, after) => {
78
79
  const keysComplete = storageKeysComparable(before) && storageKeysComparable(after);
@@ -86,32 +87,87 @@ const storageDimension = (before, after) => {
86
87
  const compareWebCaptureDimensions = (input) => {
87
88
  const before = input.before.inspection;
88
89
  const after = input.after.inspection;
89
- const dimension = compareDimension;
90
90
  return {
91
- dom_structure: dimension(singleton("document", digest(domProjection(before))), singleton("document", digest(domProjection(after))), sectionsComplete(before, ["frames", "dom"]) &&
91
+ dom_structure: compareDimension(singleton("document", digestCanonicalValue(domProjection(before))), singleton("document", digestCanonicalValue(domProjection(after))), sectionsComplete(before, ["frames", "dom"]) &&
92
92
  sectionsComplete(after, ["frames", "dom"]), "DOM or frame capture was incomplete in at least one observation."),
93
- scripts: dimension(keyed(before.scripts.items.map(scriptProjection), (item) => item.script_key), keyed(after.scripts.items.map(scriptProjection), (item) => item.script_key), sectionsComplete(before, ["scripts"]) &&
93
+ scripts: compareDimension(keyed(before.scripts.items.map(scriptProjection), (item) => item.script_key), keyed(after.scripts.items.map(scriptProjection), (item) => item.script_key), sectionsComplete(before, ["scripts"]) &&
94
94
  sectionsComplete(after, ["scripts"]), "Script inventory was incomplete in at least one observation."),
95
- resources: dimension(keyed(before.resources, (item) => item.resource_key), keyed(after.resources, (item) => item.resource_key), sectionsComplete(before, ["resources"]) &&
95
+ resources: compareDimension(keyed(before.resources, (item) => item.resource_key), keyed(after.resources, (item) => item.resource_key), sectionsComplete(before, ["resources"]) &&
96
96
  sectionsComplete(after, ["resources"]), "Resource inventory was incomplete in at least one observation."),
97
- network: dimension(networkMap(before), networkMap(after), sectionsComplete(before, ["network_requests"]) &&
98
- sectionsComplete(after, ["network_requests"]), "Network capture is attach-window limited or incomplete."),
99
- metadata: dimension(singleton("metadata", digest(metadataProjection(before))), singleton("metadata", digest(metadataProjection(after))), sectionsComplete(before, ["metadata"]) &&
97
+ network: networkDimension(before, after),
98
+ metadata: compareDimension(singleton("metadata", digestCanonicalValue(metadataProjection(before))), singleton("metadata", digestCanonicalValue(metadataProjection(after))), sectionsComplete(before, ["metadata"]) &&
100
99
  sectionsComplete(after, ["metadata"]), "Safe metadata capture was incomplete in at least one observation."),
101
- webmcp: dimension(webMcpMap(input.before.webmcp), webMcpMap(input.after.webmcp), webMcpComplete(input.before.webmcp) && webMcpComplete(input.after.webmcp), "WebMCP discovery was unavailable or incomplete in at least one capture."),
100
+ webmcp: compareDimension(webMcpMap(input.before.webmcp), webMcpMap(input.after.webmcp), webMcpComplete(input.before.webmcp) && webMcpComplete(input.after.webmcp), "WebMCP discovery was unavailable or incomplete in at least one capture."),
102
101
  accessibility: accessibilityDimension(before, after),
103
102
  storage: storageDimension(before, after),
104
103
  };
105
104
  };
106
- const keyed = (values, identity) => new Map(values.map((value) => [identity(value), digest(value)]));
107
- const networkMap = (inspection) => {
105
+ const keyed = (values, identity) => new Map(values.map((value) => [identity(value), digestCanonicalValue(value)]));
106
+ const bodyShapesSelected = (inspection) => !inspection.completeness.excluded.some(({ section, reason }) => section === "json_body_shapes" && reason === "not_approved") &&
107
+ (inspection.network.requests.length === 0 ||
108
+ inspection.network.requests.some(({ body_shapes }) => body_shapes.status !== "not_approved"));
109
+ const webSocketShapesSelected = (inspection) => !inspection.completeness.excluded.some(({ section, reason }) => section === "websocket_shapes" && reason === "not_approved");
110
+ const networkIdentity = (request) => `net_${digestCanonicalValue({ method: request.method, url: request.url, resource_type: request.resource_type })}`;
111
+ const networkDimension = (before, after) => {
112
+ const selected = bodyShapesSelected(before) && bodyShapesSelected(after);
113
+ const webSocketShapes = webSocketShapesSelected(before) && webSocketShapesSelected(after);
114
+ const sources = new Map();
115
+ if (selected) {
116
+ const observedSources = (inspection) => {
117
+ const result = new Map();
118
+ for (const request of inspection.network.requests) {
119
+ const identity = networkIdentity(request);
120
+ const previous = result.get(identity);
121
+ result.set(identity, {
122
+ request: previous?.request !== false && request.body_shapes.request !== null,
123
+ response: previous?.response !== false &&
124
+ request.body_shapes.response !== null,
125
+ });
126
+ }
127
+ return result;
128
+ };
129
+ const left = observedSources(before);
130
+ const right = observedSources(after);
131
+ for (const [identity, coverage] of left) {
132
+ const next = right.get(identity);
133
+ sources.set(identity, {
134
+ request: coverage.request && next?.request === true,
135
+ response: coverage.response && next?.response === true,
136
+ });
137
+ }
138
+ }
139
+ const shapesComplete = !selected ||
140
+ [before, after].every((inspection) => sectionsComplete(inspection, ["json_body_shapes"]) &&
141
+ inspection.network.requests.every(({ body_shapes }) => body_shapes.status === "included"));
142
+ const webSocketShapesComplete = !webSocketShapes ||
143
+ [before, after].every((inspection) => sectionsComplete(inspection, ["websocket_shapes"]) &&
144
+ inspection.network.websocket_connections.every((connection) => connection.events.every((event) => event.payload_shape !== null)));
145
+ const webSocketPayloadBytesComplete = [before, after].every((inspection) => inspection.network.websocket_connections.every((connection) => connection.events.every((event) => event.payload_bytes !== null)));
146
+ const beforeWebSockets = webSocketGroups(before);
147
+ const afterWebSockets = webSocketGroups(after);
148
+ const [beforeWebSocketPayload, afterWebSocketPayload] = webSocketPayloadMaps(beforeWebSockets, afterWebSockets, webSocketShapes);
149
+ return compareDimension(new Map([
150
+ ...networkMap(before, sources),
151
+ ...webSocketMetadataMap(beforeWebSockets),
152
+ ...beforeWebSocketPayload,
153
+ ]), new Map([
154
+ ...networkMap(after, sources),
155
+ ...webSocketMetadataMap(afterWebSockets),
156
+ ...afterWebSocketPayload,
157
+ ]), [before, after].every((inspection) => sectionsComplete(inspection, [
158
+ "network_requests",
159
+ "websocket_connections",
160
+ "websocket_frames",
161
+ ])) &&
162
+ shapesComplete &&
163
+ webSocketPayloadBytesComplete &&
164
+ webSocketShapesComplete, "Network capture or selected HTTP/WebSocket payload-shape coverage is attach-window limited, unavailable, or incomplete.");
165
+ };
166
+ const networkMap = (inspection, sources) => {
108
167
  const grouped = new Map();
109
168
  for (const request of inspection.network.requests) {
110
- const identity = `net_${digest({
111
- method: request.method,
112
- url: request.url,
113
- resource_type: request.resource_type,
114
- })}`;
169
+ const identity = networkIdentity(request);
170
+ const shapes = sources.get(identity);
115
171
  const values = grouped.get(identity) ?? [];
116
172
  values.push({
117
173
  status: request.status,
@@ -119,15 +175,96 @@ const networkMap = (inspection) => {
119
175
  encoded_data_length: request.encoded_data_length,
120
176
  redirects: (request.redirects ?? []).map(({ request_timestamp: _requestTimestamp, redirect_event_timestamp: _redirectEventTimestamp, ...redirect }) => redirect),
121
177
  initiator: request.initiator,
122
- body_shapes: request.body_shapes,
178
+ ...(shapes?.request === true
179
+ ? { request_shape: request.body_shapes.request }
180
+ : {}),
181
+ ...(shapes?.response === true
182
+ ? { response_shape: request.body_shapes.response }
183
+ : {}),
123
184
  });
124
185
  grouped.set(identity, values);
125
186
  }
126
187
  return new Map([...grouped].map(([identity, values]) => [
127
188
  identity,
128
- digest(values.map((value) => digest(value)).sort()),
189
+ digestCanonicalValue(values.map((value) => digestCanonicalValue(value)).sort()),
190
+ ]));
191
+ };
192
+ const webSocketGroups = (inspection) => {
193
+ const groups = new Map();
194
+ for (const connection of inspection.network.websocket_connections) {
195
+ const stream = digestCanonicalValue(connection.events.map(({ direction, opcode }) => ({
196
+ direction,
197
+ opcode,
198
+ })));
199
+ const key = digestCanonicalValue({ url: connection.url, stream });
200
+ const previous = groups.get(key);
201
+ if (previous !== undefined)
202
+ previous.connections.push(connection);
203
+ else
204
+ groups.set(key, {
205
+ url: connection.url,
206
+ stream,
207
+ connections: [connection],
208
+ });
209
+ }
210
+ return groups;
211
+ };
212
+ const webSocketMetadataMap = (groups) => {
213
+ const byUrl = new Map();
214
+ for (const group of groups.values()) {
215
+ const streams = byUrl.get(group.url) ?? [];
216
+ for (let index = 0; index < group.connections.length; index += 1)
217
+ streams.push(group.stream);
218
+ byUrl.set(group.url, streams);
219
+ }
220
+ return new Map([...byUrl].map(([url, streams]) => [
221
+ `ws_${digestCanonicalValue(url)}`,
222
+ digestCanonicalValue(streams.sort(compareUnicodeCodePoints)),
129
223
  ]));
130
224
  };
225
+ const webSocketPayloadMaps = (beforeGroups, afterGroups, selected) => {
226
+ const left = new Map();
227
+ const right = new Map();
228
+ for (const [groupKey, beforeGroup] of beforeGroups) {
229
+ const afterGroup = afterGroups.get(groupKey);
230
+ if (afterGroup === undefined ||
231
+ beforeGroup.connections.length !== afterGroup.connections.length)
232
+ continue;
233
+ const eventCount = beforeGroup.connections[0]?.events.length ?? 0;
234
+ const comparableBytes = new Set();
235
+ const comparableShapes = new Set();
236
+ for (let index = 0; index < eventCount; index += 1) {
237
+ if (beforeGroup.connections.every((connection) => connection.events[index]?.payload_bytes !== null) &&
238
+ afterGroup.connections.every((connection) => connection.events[index]?.payload_bytes !== null))
239
+ comparableBytes.add(index);
240
+ // Compare only when every same-metadata connection has shape evidence
241
+ // on both sides; this avoids assigning an unknown shape to a known one.
242
+ if (selected &&
243
+ beforeGroup.connections.every((connection) => connection.events[index]?.payload_shape !== null) &&
244
+ afterGroup.connections.every((connection) => connection.events[index]?.payload_shape !== null))
245
+ comparableShapes.add(index);
246
+ }
247
+ if (comparableBytes.size === 0 && comparableShapes.size === 0)
248
+ continue;
249
+ const project = (group) => digestCanonicalValue(group.connections
250
+ .map((connection) => connection.events.map((event, index) => {
251
+ const comparablePayload = {};
252
+ if (comparableBytes.has(index))
253
+ comparablePayload.payload_bytes = event.payload_bytes;
254
+ if (comparableShapes.has(index))
255
+ comparablePayload.payload_shape = event.payload_shape;
256
+ return Object.keys(comparablePayload).length === 0
257
+ ? null
258
+ : comparablePayload;
259
+ }))
260
+ .map((stream) => digestCanonicalValue(stream))
261
+ .sort(compareUnicodeCodePoints));
262
+ const identity = `wss_${groupKey}`;
263
+ left.set(identity, project(beforeGroup));
264
+ right.set(identity, project(afterGroup));
265
+ }
266
+ return [left, right];
267
+ };
131
268
  const webMcpMap = (discovery) => discovery === null
132
269
  ? new Map()
133
270
  : keyed(discovery.tools.items, (tool) => tool.tool_key);
@@ -147,7 +284,9 @@ const incompleteSections = (completeness) => new Set([
147
284
  const domProjection = (inspection) => ({
148
285
  frames: inspection.frames
149
286
  .map(({ url, origin }) => ({ url, origin }))
150
- .sort((left, right) => left.url.localeCompare(right.url)),
287
+ .sort((left, right) => compareUnicodeCodePoints(left.url, right.url) ||
288
+ compareUnicodeCodePoints(left.origin ?? "", right.origin ?? "") ||
289
+ Number(left.origin !== null) - Number(right.origin !== null)),
151
290
  nodes: inspection.dom.nodes.map(({ index: _index, ...node }) => node),
152
291
  });
153
292
  const scriptProjection = (script) => ({
@@ -162,17 +301,18 @@ const scriptProjection = (script) => ({
162
301
  const metadataProjection = (inspection) => ({
163
302
  responses: inspection.metadata.responses
164
303
  .map(({ request_id: _requestId, ...response }) => response)
165
- .map((value) => digest(value))
304
+ .map((value) => digestCanonicalValue(value))
305
+ .sort(),
306
+ dom_urls: inspection.metadata.dom_urls
307
+ .map((value) => digestCanonicalValue(value))
166
308
  .sort(),
167
- dom_urls: inspection.metadata.dom_urls.map((value) => digest(value)).sort(),
168
309
  agent_hints: inspection.metadata.agent_hints
169
- .map((value) => digest(value))
310
+ .map((value) => digestCanonicalValue(value))
170
311
  .sort(),
171
312
  excluded_dom_urls: inspection.metadata.excluded_dom_urls,
172
313
  headers_allowlisted: inspection.metadata.headers_allowlisted,
173
314
  });
174
315
  const singleton = (key, value) => new Map([[key, value]]);
175
- const digest = (value) => canonicalDigest(value);
176
316
  const accessibilityComparable = (inspection) => {
177
317
  const text = inspection.accessibility.text_capture.status === "included" &&
178
318
  inspection.accessibility.text_capture.excluded_fields === 0;
@@ -209,7 +349,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
209
349
  const map = new Map([
210
350
  [
211
351
  "storage:summary",
212
- digest({
352
+ digestCanonicalValue({
213
353
  origin: storage.origin,
214
354
  values_redacted: storage.values_redacted,
215
355
  ...(includeUsage
@@ -225,7 +365,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
225
365
  return map;
226
366
  const add = (kind, keys) => {
227
367
  for (const key of keys) {
228
- map.set(`storage:${kind}:${key}`, digest(key));
368
+ map.set(`storage:${kind}:${key}`, digestCanonicalValue(key));
229
369
  }
230
370
  };
231
371
  add("local_storage", storage.local_storage_keys);
@@ -236,7 +376,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
236
376
  const identity = `${fingerprint.scope}:${fingerprint.identity_sha256}`;
237
377
  if (!fingerprintIdentities.has(identity))
238
378
  continue;
239
- map.set(`storage:content:${identity}`, digest(fingerprint.value_sha256));
379
+ map.set(`storage:content:${identity}`, digestCanonicalValue(fingerprint.value_sha256));
240
380
  }
241
381
  return map;
242
382
  };
@@ -50,12 +50,6 @@ const dimensionSchema = z.union([
50
50
  reason: z.string(),
51
51
  }),
52
52
  ]);
53
- const legacyUnknownDimension = {
54
- status: "unknown",
55
- total_changes: 0,
56
- changes: [],
57
- reason: "Dimension was not recorded by this version 1 capture diff.",
58
- };
59
53
  /** Completeness-aware changes across stable browser evidence dimensions. */
60
54
  export const webCaptureDiffSchema = z
61
55
  .object({
@@ -69,8 +63,8 @@ export const webCaptureDiffSchema = z
69
63
  network: dimensionSchema,
70
64
  metadata: dimensionSchema,
71
65
  webmcp: dimensionSchema,
72
- accessibility: dimensionSchema.default(legacyUnknownDimension),
73
- storage: dimensionSchema.default(legacyUnknownDimension),
66
+ accessibility: dimensionSchema,
67
+ storage: dimensionSchema,
74
68
  }),
75
69
  limitations: z.array(z.string()),
76
70
  })
@@ -1,5 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
3
4
  /** Assign deterministic identities to a bounded resource inventory. */
4
5
  export const stableWebResources = (resources) => {
5
6
  const keyed = resources.map((resource) => ({
@@ -8,8 +9,8 @@ export const stableWebResources = (resources) => {
8
9
  }));
9
10
  return [
10
11
  ...new Map(keyed.map((resource) => [resource.resource_key, resource])).values(),
11
- ].sort((left, right) => left.resource_key.localeCompare(right.resource_key) ||
12
- left.url.localeCompare(right.url));
12
+ ].sort((left, right) => compareUnicodeCodePoints(left.resource_key, right.resource_key) ||
13
+ compareUnicodeCodePoints(left.url, right.url));
13
14
  };
14
15
  /** Reconcile one script with resource-tree observations without fuzzy matching. */
15
16
  export const reconcileWebScript = (script, resources) => {
@@ -2,8 +2,8 @@ import { z } from "zod";
2
2
  import { browserCompletenessSchema } from "./browserCompleteness.js";
3
3
  import { browserAllowedOriginsSchema, browserEndpointSchema, } from "./browserObservation.js";
4
4
  import { browserVersionSchema } from "./browserObservationSchemas.js";
5
- import { jsonShapeSchema } from "./jsonShape.js";
6
- import { prefixedDigestSchema } from "./../domain/digests.js";
5
+ import { jsonValueSchema } from "./jsonValue.js";
6
+ import { digestSchema, prefixedDigestSchema } from "./../domain/digests.js";
7
7
  /** Input for passive discovery of page-registered WebMCP tools. */
8
8
  export const discoverWebMcpToolsInputSchema = z.strictObject({
9
9
  cdp_endpoint: browserEndpointSchema,
@@ -19,7 +19,8 @@ const webMcpToolSchema = z.object({
19
19
  frame_url: z.string(),
20
20
  owner_origin: z.string(),
21
21
  declaration_kind: z.enum(["declarative", "imperative"]),
22
- input_schema_shape: jsonShapeSchema.nullable(),
22
+ input_schema: jsonValueSchema.nullable(),
23
+ input_schema_sha256: digestSchema.nullable(),
23
24
  annotations: z.object({
24
25
  read_only: z.boolean().nullable(),
25
26
  untrusted_content: z.boolean().nullable(),
@@ -24,7 +24,7 @@ const sourceSchema = z.discriminatedUnion("kind", [
24
24
  }),
25
25
  z.strictObject({
26
26
  kind: z.literal("scenario-response"),
27
- transaction_id: z.string().nullable(),
27
+ transaction_id: z.string().min(1),
28
28
  request_sequence: z.number().int().min(1),
29
29
  response_sequence: z.number().int().min(1).nullable(),
30
30
  status: z.number().nullable(),
@@ -4,10 +4,16 @@ export class WebScriptExportError extends ArtifactOperationError {
4
4
  userMessage;
5
5
  cleanupIncomplete;
6
6
  cleanupResources;
7
- constructor(reason, target, diagnostic, residualPaths = []) {
8
- super("export_web_scripts", reason);
7
+ constructor(reason, target, diagnostic, options = {}) {
8
+ super("export_web_scripts", reason, undefined, undefined, options);
9
9
  this.userMessage = `Script export failed for ${target}: ${diagnostic}`;
10
- this.cleanupResources = residualPaths;
11
- this.cleanupIncomplete = residualPaths.length > 0;
10
+ this.cleanupResources = [
11
+ ...new Set([
12
+ ...(options.cleanup?.resources ?? []),
13
+ ...(options.residualPaths ?? []),
14
+ ]),
15
+ ];
16
+ this.cleanupIncomplete =
17
+ options.cleanup !== undefined || (options.residualPaths?.length ?? 0) > 0;
12
18
  }
13
19
  }
@@ -18,7 +18,7 @@ export const planWebScriptExport = (scripts) => {
18
18
  };
19
19
  const candidate = candidates[index];
20
20
  const reason = conflicts.has(index)
21
- ? "Captured paths collide by content version, case, or file/directory prefix."
21
+ ? "Captured paths collide by content version or file/directory prefix."
22
22
  : (candidate?.reason ?? null);
23
23
  const path = reason === null ? candidate?.path : undefined;
24
24
  return {
@@ -74,8 +74,9 @@ const candidatePath = (script) => {
74
74
  : null,
75
75
  };
76
76
  };
77
- // Register every prefix so case collisions in parent directories and a file
78
- // conflicting with a directory isolate all affected sources, not just the last.
77
+ // Register every exact prefix so a repeated path, or a file that is also a
78
+ // directory prefix, isolates every affected source. Case-distinct spellings
79
+ // stay distinct until the destination filesystem reports a collision.
79
80
  const conflictingPaths = (candidates) => {
80
81
  const prefixes = new Map();
81
82
  candidates.forEach(({ path }, index) => {
@@ -84,23 +85,16 @@ const conflictingPaths = (candidates) => {
84
85
  const parts = path.split("/");
85
86
  parts.forEach((_, position) => {
86
87
  const spelling = parts.slice(0, position + 1).join("/");
87
- const key = spelling.toLowerCase();
88
- const entry = prefixes.get(key) ?? {
89
- spellings: new Set(),
90
- indices: [],
91
- files: [],
92
- };
93
- entry.spellings.add(spelling);
88
+ const entry = prefixes.get(spelling) ?? { indices: [], files: [] };
94
89
  entry.indices.push(index);
95
90
  if (position === parts.length - 1)
96
91
  entry.files.push(index);
97
- prefixes.set(key, entry);
92
+ prefixes.set(spelling, entry);
98
93
  });
99
94
  });
100
95
  const conflicts = new Set();
101
96
  for (const entry of prefixes.values())
102
- if (entry.spellings.size > 1 ||
103
- entry.files.length > 1 ||
97
+ if (entry.files.length > 1 ||
104
98
  (entry.files.length > 0 && entry.indices.length > entry.files.length))
105
99
  for (const index of entry.indices)
106
100
  conflicts.add(index);
@@ -17,7 +17,8 @@ export const zipPackageFormatForPath = (path) => {
17
17
  return "zip";
18
18
  if (lower.endsWith(".ipa"))
19
19
  return "ipa";
20
- if (lower.endsWith(".apk") || lower.endsWith(".aab"))
20
+ // An Android App Bundle is a ZIP archive, not a standalone APK.
21
+ if (lower.endsWith(".apk"))
21
22
  return "apk";
22
23
  if (lower.endsWith(".msix") || lower.endsWith(".msixbundle"))
23
24
  return "msix";
@@ -25,3 +26,5 @@ export const zipPackageFormatForPath = (path) => {
25
26
  return "appx";
26
27
  return undefined;
27
28
  };
29
+ /** Inventory cannot see bytes that are not central-directory entries. */
30
+ export const ZIP_NON_ENTRY_TAIL_LIMITATION = "ZIP inventory lists central-directory entries only. Bytes after the central directory, including an APK Signing Block or a ZIP comment, are not occurrences.";
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * An array schema's own constraints, such as a minimum length, without its
4
+ * element schema. Pair it with {@link parseElementSteps} to validate a large
5
+ * collection in cooperative steps.
6
+ */
7
+ export const arrayContainerSchema = (array) => array.clone({ ...array.def, element: z.unknown() });
8
+ /** Elements validated between yields, in the issues and paths a whole-array parse reports. */
9
+ export function* parseElementSteps(element, values, path, issues) {
10
+ const parsed = [];
11
+ for (const [index, value] of values.entries()) {
12
+ if (index % 64 === 0)
13
+ yield;
14
+ const result = element.safeParse(value);
15
+ if (result.success)
16
+ parsed.push(result.data);
17
+ else
18
+ issues.push(...result.error.issues.map((issue) => ({
19
+ ...issue,
20
+ path: [...path, index, ...issue.path],
21
+ })));
22
+ }
23
+ return parsed;
24
+ }
@@ -1,3 +1,4 @@
1
+ import { admitManagedProjection, managedDecodeBudget, } from "./ManagedDecodeBudget.js";
1
2
  import { managedArtifactInspectionSchema, } from "../domain/managed/managedArtifact.js";
2
3
  import { readManagedPeLayout, } from "./ManagedPeReader.js";
3
4
  import { managedTableRowCounts, readManagedMetadataInventory, readManagedResourceDirectory, } from "./ManagedMetadataInventory.js";
@@ -73,7 +74,7 @@ const unavailableResult = (target, bytes, layout) => {
73
74
  : [
74
75
  "The PE has no CLI data directory; managed metadata and CIL are unavailable.",
75
76
  ];
76
- return managedArtifactInspectionSchema.parse({
77
+ return managedArtifactInspectionSchema.parse(admitManagedProjection({
77
78
  ...base(target, bytes, layout),
78
79
  classification: {
79
80
  status: malformed ? "malformed" : "not-managed",
@@ -83,7 +84,9 @@ const unavailableResult = (target, bytes, layout) => {
83
84
  managed_architecture: "unknown",
84
85
  evidence: [
85
86
  {
86
- code: malformed ? "cli-directory-malformed" : "cli-directory-absent",
87
+ code: malformed
88
+ ? "cli-directory-malformed"
89
+ : "cli-directory-absent",
87
90
  detail: limitations[0],
88
91
  file_offset: layout.cliIssue?.offset ?? null,
89
92
  },
@@ -106,7 +109,7 @@ const unavailableResult = (target, bytes, layout) => {
106
109
  issues,
107
110
  },
108
111
  limitations,
109
- });
112
+ }));
110
113
  };
111
114
  const runtimeFamilyFor = (cli, inventory, metadata, layout) => {
112
115
  const evidence = [
@@ -198,7 +201,7 @@ const runtimeClassification = ({ layout, metadata, inventory, }) => {
198
201
  const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
199
202
  ...base(target, bytes, layout),
200
203
  classification: {
201
- status: "malformed",
204
+ status: issue.code === "resource-limit" ? "managed" : "malformed",
202
205
  container: "pe",
203
206
  runtime_family: (layout.cli?.flags ?? 1) & 1 ? "unknown" : "mixed-clr-native",
204
207
  implementation: "unknown",
@@ -212,7 +215,7 @@ const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
212
215
  ],
213
216
  },
214
217
  metadata: {
215
- status: "malformed",
218
+ status: issue.code === "resource-limit" ? "partial" : "malformed",
216
219
  version: null,
217
220
  stream_names: [],
218
221
  table_row_counts: {},
@@ -225,7 +228,9 @@ const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
225
228
  attributes: [],
226
229
  coverage: { state: "partial", issues: [issue] },
227
230
  limitations: [
228
- "CLI metadata could not be read because the PE/CLI structure is malformed or unsupported.",
231
+ issue.code === "resource-limit"
232
+ ? "CLI metadata inspection stopped at its representation budget; omitted facts are unknown."
233
+ : "CLI metadata could not be read because the PE/CLI structure is malformed or unsupported.",
229
234
  ],
230
235
  });
231
236
  /** Inspect PE/CLI identity directly from local bytes without CLR loading. */
@@ -242,48 +247,55 @@ export const inspectManagedArtifactBytes = (bytes, target) => {
242
247
  catch (cause) {
243
248
  if (!(cause instanceof ManagedReaderFailure))
244
249
  throw cause;
245
- return managedArtifactInspectionSchema.parse(partialMetadataResult({
250
+ return managedArtifactInspectionSchema.parse(admitManagedProjection(partialMetadataResult({
246
251
  target,
247
252
  bytes,
248
253
  layout,
249
254
  issue: cause.issue,
250
- }));
255
+ })));
251
256
  }
252
257
  const resourceIssues = [];
253
258
  const resourceDirectory = readManagedResourceDirectory(layout, resourceIssues);
254
- const inventory = readManagedMetadataInventory(bytes, metadata, resourceDirectory);
255
- const issues = [...resourceIssues, ...inventory.issues];
256
- const limitations = [
257
- ...(issues.length === 0
258
- ? []
259
- : [
260
- "At least one metadata or resource item could not be read; coverage is partial.",
261
- ]),
262
- "Static inspection did not load the assembly, resolve dependencies through a CLR, decompile C#, or execute target code.",
263
- ];
264
- return managedArtifactInspectionSchema.parse({
265
- ...base(target, bytes, layout),
266
- classification: {
267
- status: "managed",
268
- container: "pe",
269
- ...runtimeClassification({ layout, metadata, inventory }),
270
- },
271
- metadata: {
272
- status: issues.length === 0 ? "complete" : "partial",
273
- version: metadata.version,
274
- stream_names: metadata.streamNames,
275
- table_row_counts: managedTableRowCounts(metadata),
276
- },
277
- module: inventory.module,
278
- assembly: inventory.assembly,
279
- target_frameworks: inventory.targetFrameworks,
280
- references: inventory.references,
281
- resources: inventory.resources,
282
- attributes: inventory.attributes,
283
- coverage: {
284
- state: issues.length === 0 ? "complete" : "partial",
285
- issues,
286
- },
287
- limitations,
288
- });
259
+ try {
260
+ const inventory = readManagedMetadataInventory(bytes, metadata, resourceDirectory);
261
+ const issues = [...resourceIssues, ...inventory.issues];
262
+ const limitations = [
263
+ ...(issues.length === 0
264
+ ? []
265
+ : [
266
+ "At least one metadata or resource item could not be read; coverage is partial.",
267
+ ]),
268
+ "Static inspection did not load the assembly, resolve dependencies through a CLR, decompile C#, or execute target code.",
269
+ ];
270
+ return managedArtifactInspectionSchema.parse(admitManagedProjection({
271
+ ...base(target, bytes, layout),
272
+ classification: {
273
+ status: "managed",
274
+ container: "pe",
275
+ ...runtimeClassification({ layout, metadata, inventory }),
276
+ },
277
+ metadata: {
278
+ status: issues.length === 0 ? "complete" : "partial",
279
+ version: metadata.version,
280
+ stream_names: metadata.streamNames,
281
+ table_row_counts: managedTableRowCounts(metadata),
282
+ },
283
+ module: inventory.module,
284
+ assembly: inventory.assembly,
285
+ target_frameworks: inventory.targetFrameworks,
286
+ references: inventory.references,
287
+ resources: inventory.resources,
288
+ attributes: inventory.attributes,
289
+ coverage: {
290
+ state: issues.length === 0 ? "complete" : "partial",
291
+ issues,
292
+ },
293
+ limitations,
294
+ }, managedDecodeBudget(metadata)));
295
+ }
296
+ catch (cause) {
297
+ if (!(cause instanceof ManagedReaderFailure))
298
+ throw cause;
299
+ return managedArtifactInspectionSchema.parse(admitManagedProjection(partialMetadataResult({ target, bytes, layout, issue: cause.issue })));
300
+ }
289
301
  };