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,6 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
+ import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
4
5
  import { prefixedDigestSchema } from "./../domain/digests.js";
5
6
  const evidenceIdSchema = prefixedDigestSchema("ev");
6
7
  const unknownIdSchema = prefixedDigestSchema("unk");
@@ -232,5 +233,5 @@ const canonicalJson = (value) => {
232
233
  throw new TypeError("Unknown identity failed");
233
234
  return serialized;
234
235
  };
235
- const sortedUnique = (values) => [...new Set(values)].sort((left, right) => left.localeCompare(right));
236
- const sortedRelationships = (values) => [...values].sort((left, right) => `${left.type}:${left.unknown_id}`.localeCompare(`${right.type}:${right.unknown_id}`));
236
+ const sortedUnique = (values) => [...new Set(values)].sort(compareUnicodeCodePoints);
237
+ const sortedRelationships = (values) => [...values].sort((left, right) => compareUnicodeCodePoints(compositeKey([left.type, left.unknown_id]), compositeKey([right.type, right.unknown_id])));
@@ -3,11 +3,12 @@ import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
4
  import { artifactComparisonResultSchema } from "./artifactComparison.js";
5
5
  import { uniqueSorted } from "./canonicalOrdering.js";
6
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
6
7
  import { comparisonSourceEvidenceIds } from "./comparisonSourceEvidence.js";
7
8
  import { evidenceSchema, parseEvidence } from "./evidence.js";
8
- import { functionComparisonResultSchema } from "./functionComparison.js";
9
+ import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
9
10
  import { PROCESS_PROVIDER, isProcessEvidenceProvider, } from "./process/processEvidenceProvider.js";
10
- import { comparisonStatusSchema, processCaptureComparisonSchema, } from "./process/processCapture.js";
11
+ import { comparisonStatusSchema, processCaptureComparisonSchema, } from "./process/processComparison.js";
11
12
  import { PROCESS_COMPARISON_DIMENSIONS } from "./process/processComparison.js";
12
13
  import { prefixedDigestSchema } from "./../domain/digests.js";
13
14
  const evidenceIdSchema = prefixedDigestSchema("ev");
@@ -146,7 +147,7 @@ export const correlateStaticAndRuntime = (input) => {
146
147
  const runtimeById = byId(runtimeEvidence);
147
148
  const correlations = parsed.mappings
148
149
  .map((mapping) => correlate(mapping, staticById, runtimeById))
149
- .sort((left, right) => left.correlation_id.localeCompare(right.correlation_id, "en"));
150
+ .sort((left, right) => compareUnicodeCodePoints(left.correlation_id, right.correlation_id));
150
151
  if (new Set(correlations.map(({ correlation_id: id }) => id)).size !==
151
152
  correlations.length)
152
153
  throw new TypeError("Static/runtime correlation rejects duplicate mappings");
@@ -0,0 +1,6 @@
1
+ /** Portable ASCII identifier starting with a letter. */
2
+ export const IDENTIFIER_PATTERN = /^[A-Za-z][A-Za-z0-9._\x2d]*$/u;
3
+ /** Stable evidence identifier, also admitting namespace and path separators. */
4
+ export const STABLE_IDENTIFIER_PATTERN = /^[A-Za-z][A-Za-z0-9._:\x2f\x2d]*$/u;
5
+ /** Canonical padded base64, including zero pad bits and the empty encoding. */
6
+ export const CANONICAL_BASE64_PATTERN = /^(?:[A-Za-z0-9+\x2f]{4})*(?:[A-Za-z0-9+\x2f][AQgw]==|[A-Za-z0-9+\x2f]{2}[AEIMQUYcgkosw048]=)?$/;
@@ -0,0 +1,66 @@
1
+ const LEGACY_CATEGORIES = [
2
+ ["_TtC", "classes"],
3
+ ["_TtV", "structs"],
4
+ ["_TtO", "enums"],
5
+ ["_TtP", "protocols"],
6
+ ["_TtE", "extensions"],
7
+ ];
8
+ const NOMINAL_CATEGORIES = new Map([
9
+ ["C", "classes"],
10
+ ["V", "structs"],
11
+ ["O", "enums"],
12
+ ["P", "protocols"],
13
+ ]);
14
+ /**
15
+ * Recognize Swift manglings and decode literal module/nominal contexts.
16
+ * Substitutions, generic contexts, and other encodings remain unknown.
17
+ */
18
+ export const classifySwiftSymbol = (name) => {
19
+ const prefix = /^_?(?:\$[sS]|_T0)/u.exec(name);
20
+ if (prefix === null) {
21
+ if (!name.includes("_Tt"))
22
+ return undefined;
23
+ return {
24
+ category: LEGACY_CATEGORIES.find(([prefix]) => name.startsWith(prefix))?.[1] ??
25
+ null,
26
+ };
27
+ }
28
+ const mangling = name.slice(prefix[0].length);
29
+ let offset = identifierEnd(mangling, 0);
30
+ if (offset === undefined)
31
+ return { category: null };
32
+ let category = null;
33
+ for (;;) {
34
+ const end = identifierEnd(mangling, offset);
35
+ if (end === undefined)
36
+ break;
37
+ const kind = mangling.charAt(end);
38
+ const nominal = NOMINAL_CATEGORIES.get(kind);
39
+ if (nominal === undefined) {
40
+ // Current swiftc emits protocol descriptors as `…<Nominal>Mp` without
41
+ // the nominal `P` marker (e.g. `_$s4main7ScoringMp`). Decode that exact
42
+ // suffix; unknown substitution encodings stay unclassified, never guessed.
43
+ if (mangling.slice(end) === "Mp")
44
+ category = "protocols";
45
+ else if (kind === "E" && category !== null)
46
+ category = "extensions";
47
+ break;
48
+ }
49
+ category = nominal;
50
+ offset = end + 1;
51
+ }
52
+ return { category };
53
+ };
54
+ const identifierEnd = (mangling, offset) => {
55
+ const lengthToken = /^[1-9][0-9]*/u.exec(mangling.slice(offset))?.[0];
56
+ if (lengthToken === undefined)
57
+ return undefined;
58
+ const start = offset + lengthToken.length;
59
+ const end = start + Number(lengthToken);
60
+ // Swift identifiers with substitutions/punycode need a fuller decoder.
61
+ if (!Number.isSafeInteger(end) ||
62
+ end > mangling.length ||
63
+ !/^[A-Za-z_][A-Za-z0-9_]*$/u.test(mangling.slice(start, end)))
64
+ return undefined;
65
+ return end;
66
+ };
@@ -1,7 +1,20 @@
1
+ import { classifySwiftSymbol, } from "./swiftSymbolClassification.js";
2
+ /** Objective-C class definition markers emitted by modern Apple clang. */
3
+ const OBJC_CLASS_MARKER = "OBJC_CLASS_$_";
4
+ /** Local class records emitted by Apple's fragile Objective-C ABI. */
5
+ const LEGACY_OBJC_CLASS_PREFIX = "l_OBJC_CLASS_";
6
+ /**
7
+ * Objective-C protocol declaration marker. `PROTOCOL_REFERENCE` slots
8
+ * share the substring but are uses, not definitions.
9
+ */
10
+ const OBJC_PROTOCOL_MARKER = "OBJC_PROTOCOL_$_";
1
11
  /** Select and deduplicate Objective-C class labels. */
2
12
  export const discoverObjcClasses = (names, pattern) => {
3
13
  const classes = uniqueByName(names
4
- .filter(({ name }) => ["OBJC_CLASS", "OBJC_$_CLASS"].some((marker) => name.includes(marker)))
14
+ .filter(({ name }) => name.includes(OBJC_CLASS_MARKER) ||
15
+ (name.startsWith(LEGACY_OBJC_CLASS_PREFIX) &&
16
+ name.length > LEGACY_OBJC_CLASS_PREFIX.length &&
17
+ !/^l_OBJC_CLASS_NAME_(?:\.\d+)?$/u.test(name)))
5
18
  .filter(({ name }) => pattern.length === 0 || name.includes(pattern)));
6
19
  return {
7
20
  count: classes.length,
@@ -10,39 +23,89 @@ export const discoverObjcClasses = (names, pattern) => {
10
23
  };
11
24
  /** Select and deduplicate Objective-C and Swift protocol labels. */
12
25
  export const discoverObjcProtocols = (names) => {
13
- const protocols = uniqueByName(names.filter(({ name }) => name.includes("OBJC_PROTOCOL") || name.includes("_TtP")));
26
+ const protocols = uniqueByName(names.filter(({ name }) => name.includes(OBJC_PROTOCOL_MARKER) ||
27
+ name.includes("_TtP") ||
28
+ (name.endsWith("Mp") &&
29
+ classifySwiftSymbol(name)?.category === "protocols")));
14
30
  return {
15
31
  count: protocols.length,
16
32
  protocols: protocols.map(toJsonEntry),
17
33
  };
18
34
  };
19
- const SWIFT_CATEGORIES = [
20
- ["classes", "_TtC"],
21
- ["structs", "_TtV"],
22
- ["enums", "_TtO"],
23
- ["protocols", "_TtP"],
24
- ["extensions", "_TtE"],
25
- ];
26
- /** Categorize deduplicated Swift mangled symbols. */
27
- export const categorizeSwiftTypes = (procedures, filter = {}) => {
28
- const groups = Object.fromEntries([...SWIFT_CATEGORIES.map(([category]) => category), "other"].map((category) => [category, []]));
35
+ /** Categorize procedure names using Swift manglings at their exact addresses. */
36
+ export const categorizeSwiftTypes = (procedures, filter = {}, symbols = []) => {
37
+ const groups = Object.fromEntries(["classes", "structs", "enums", "protocols", "extensions", "other"].map((category) => [category, []]));
38
+ const aliases = swiftAliasesByAddress(symbols);
39
+ const pattern = filter.pattern;
29
40
  const seen = new Set();
41
+ const unclassifiedNames = new Set();
42
+ const unclassified = [];
30
43
  for (const entry of procedures) {
31
- if (!entry.name.includes("_Tt") || seen.has(entry.name))
44
+ if (seen.has(entry.name))
32
45
  continue;
33
- const category = SWIFT_CATEGORIES.find(([, prefix]) => entry.name.startsWith(prefix))?.[0] ?? "other";
34
- if (filter.category !== undefined && filter.category !== category)
46
+ const mangledNames = [
47
+ ...new Set([
48
+ ...(classifySwiftSymbol(entry.name) === undefined ? [] : [entry.name]),
49
+ ...(aliases.get(entry.address) ?? []),
50
+ ]),
51
+ ];
52
+ if (mangledNames.length === 0)
35
53
  continue;
36
- if (filter.pattern !== undefined && !entry.name.includes(filter.pattern))
54
+ if (pattern !== undefined &&
55
+ ![entry.name, ...mangledNames].some((name) => name.includes(pattern)))
37
56
  continue;
38
- seen.add(entry.name);
39
- groups[category]?.push(entry);
57
+ const kinds = new Set(mangledNames.map((name) => classifySwiftSymbol(name)?.category ?? null));
58
+ const category = kinds.size === 1 ? ([...kinds][0] ?? null) : null;
59
+ const item = {
60
+ address: entry.address,
61
+ name: entry.name,
62
+ mangled_names: mangledNames,
63
+ };
64
+ if (category === null && !unclassifiedNames.has(entry.name)) {
65
+ unclassifiedNames.add(entry.name);
66
+ unclassified.push({
67
+ ...item,
68
+ reason: kinds.size > 1 && !kinds.has(null)
69
+ ? "conflicting_categories"
70
+ : "category_not_decoded",
71
+ });
72
+ }
73
+ const bucket = category ?? "other";
74
+ if (filter.category === undefined || filter.category === bucket) {
75
+ seen.add(entry.name);
76
+ groups[bucket]?.push(item);
77
+ }
40
78
  }
41
79
  const categories = Object.fromEntries(Object.entries(groups).map(([category, items]) => [
42
80
  category,
43
- { count: items.length, items: items.map(toJsonEntry) },
81
+ { count: items.length, items },
44
82
  ]));
45
- return { total: seen.size, categories };
83
+ return {
84
+ total: Object.values(groups).reduce((sum, items) => sum + items.length, 0),
85
+ categories,
86
+ unclassified,
87
+ limitations: [
88
+ "Identification uses Swift mangled procedure names or same-address symbol aliases. Demangled names without retained Swift manglings cannot be identified. Counts deduplicate procedure names, not source declarations.",
89
+ ...(unclassified.length === 0
90
+ ? []
91
+ : [
92
+ "Some Swift categories could not be established from the retained manglings. Unclassified observations remain inline regardless of the category filter.",
93
+ ]),
94
+ ],
95
+ };
96
+ };
97
+ const swiftAliasesByAddress = (symbols) => {
98
+ const aliases = new Map();
99
+ for (const { address, name } of symbols) {
100
+ if (classifySwiftSymbol(name) === undefined)
101
+ continue;
102
+ const existing = aliases.get(address);
103
+ if (existing === undefined)
104
+ aliases.set(address, [name]);
105
+ else
106
+ existing.push(name);
107
+ }
108
+ return aliases;
46
109
  };
47
110
  const uniqueByName = (entries) => {
48
111
  const seen = new Set();
@@ -15,3 +15,9 @@ export const compareUnicodeCodePoints = (left, right) => {
15
15
  return 0;
16
16
  return leftIndex === left.length ? -1 : 1;
17
17
  };
18
+ /**
19
+ * Collision-free composite key for deduplication/sorting. `\0`-joins
20
+ * collide when any component contains NUL (valid in JS property names);
21
+ * a JSON tuple escapes every component. Single owner for composite keys.
22
+ */
23
+ export const compositeKey = (parts) => JSON.stringify(parts);
@@ -1,6 +1,7 @@
1
1
  import { parse } from "@babel/parser";
2
2
  import * as t from "@babel/types";
3
3
  import { sanitizeEndpointCandidate } from "./browserObservation.js";
4
+ import { compositeKey } from "./unicodeCodePointOrder.js";
4
5
  import { traverseJavaScriptAst } from "./javascript/javascriptSemanticTraversal.js";
5
6
  import { classifyParsedJavaScriptOpenReceivers } from "./javascript/javascriptSemanticAnalysis.js";
6
7
  import { semanticStaticPropertyName } from "./javascript/javascriptAstValues.js";
@@ -169,7 +170,14 @@ const addWebMcpDeclaration = (script, node, accumulator) => {
169
170
  ].filter(Boolean)
170
171
  : [])
171
172
  : [];
172
- const key = `webmcp\0${script.script_key}\0${name ?? ""}\0${schemaPropertyNames.join("\0")}`;
173
+ // Property names are a variable-length source-derived list: NUL-joins
174
+ // would collapse ["a\0b"] with ["a", "b"] and drop a declaration.
175
+ const key = compositeKey([
176
+ "webmcp",
177
+ script.script_key,
178
+ name ?? "",
179
+ schemaPropertyNames,
180
+ ]);
173
181
  addUnique(accumulator, key, () => accumulator.webMcp.push({
174
182
  name: name ?? null,
175
183
  description: description ?? null,
@@ -1,6 +1,6 @@
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
- export { captureSnapshotSchema, compareWebCapturesInputSchema, webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
4
4
  /** Compare normalized observations without treating incomplete absence as proof. */
5
5
  export const compareWebCaptures = (input) => {
6
6
  const before = input.before.inspection;
@@ -42,8 +42,8 @@ const compareIdentities = (before, after) => {
42
42
  for (const identity of after.keys())
43
43
  if (!before.has(identity))
44
44
  changes.push({ identity, change: "added" });
45
- return changes.sort((left, right) => left.identity.localeCompare(right.identity) ||
46
- left.change.localeCompare(right.change));
45
+ return changes.sort((left, right) => compareUnicodeCodePoints(left.identity, right.identity) ||
46
+ compareUnicodeCodePoints(left.change, right.change));
47
47
  };
48
48
  const compareDimension = (before, after, complete, reason) => {
49
49
  const all = compareIdentities(before, after).filter(({ change }) => complete || change === "modified");
@@ -73,7 +73,7 @@ const accessibilityDimension = (before, after) => {
73
73
  const afterAccess = accessibilityComparable(after);
74
74
  const textComparable = beforeAccess.text && afterAccess.text;
75
75
  const nodesComparable = beforeAccess.nodes && afterAccess.nodes;
76
- 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.");
77
77
  };
78
78
  const storageDimension = (before, after) => {
79
79
  const keysComplete = storageKeysComparable(before) && storageKeysComparable(after);
@@ -87,32 +87,65 @@ const storageDimension = (before, after) => {
87
87
  const compareWebCaptureDimensions = (input) => {
88
88
  const before = input.before.inspection;
89
89
  const after = input.after.inspection;
90
- const dimension = compareDimension;
91
90
  return {
92
- 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"]) &&
93
92
  sectionsComplete(after, ["frames", "dom"]), "DOM or frame capture was incomplete in at least one observation."),
94
- 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"]) &&
95
94
  sectionsComplete(after, ["scripts"]), "Script inventory was incomplete in at least one observation."),
96
- 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"]) &&
97
96
  sectionsComplete(after, ["resources"]), "Resource inventory was incomplete in at least one observation."),
98
- network: dimension(networkMap(before), networkMap(after), sectionsComplete(before, ["network_requests"]) &&
99
- sectionsComplete(after, ["network_requests"]), "Network capture is attach-window limited or incomplete."),
100
- 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"]) &&
101
99
  sectionsComplete(after, ["metadata"]), "Safe metadata capture was incomplete in at least one observation."),
102
- 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."),
103
101
  accessibility: accessibilityDimension(before, after),
104
102
  storage: storageDimension(before, after),
105
103
  };
106
104
  };
107
- const keyed = (values, identity) => new Map(values.map((value) => [identity(value), digest(value)]));
108
- 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 networkIdentity = (request) => `net_${digestCanonicalValue({ method: request.method, url: request.url, resource_type: request.resource_type })}`;
110
+ const networkDimension = (before, after) => {
111
+ const selected = bodyShapesSelected(before) && bodyShapesSelected(after);
112
+ const sources = new Map();
113
+ if (selected) {
114
+ const observedSources = (inspection) => {
115
+ const result = new Map();
116
+ for (const request of inspection.network.requests) {
117
+ const identity = networkIdentity(request);
118
+ const previous = result.get(identity);
119
+ result.set(identity, {
120
+ request: previous?.request !== false && request.body_shapes.request !== null,
121
+ response: previous?.response !== false &&
122
+ request.body_shapes.response !== null,
123
+ });
124
+ }
125
+ return result;
126
+ };
127
+ const left = observedSources(before);
128
+ const right = observedSources(after);
129
+ for (const [identity, coverage] of left) {
130
+ const next = right.get(identity);
131
+ sources.set(identity, {
132
+ request: coverage.request && next?.request === true,
133
+ response: coverage.response && next?.response === true,
134
+ });
135
+ }
136
+ }
137
+ const shapesComplete = !selected ||
138
+ [before, after].every((inspection) => sectionsComplete(inspection, ["json_body_shapes"]) &&
139
+ inspection.network.requests.every(({ body_shapes }) => body_shapes.status === "included"));
140
+ return compareDimension(networkMap(before, sources), networkMap(after, sources), sectionsComplete(before, ["network_requests"]) &&
141
+ sectionsComplete(after, ["network_requests"]) &&
142
+ shapesComplete, "Network capture or selected JSON body-shape coverage is attach-window limited, unavailable, or incomplete.");
143
+ };
144
+ const networkMap = (inspection, sources) => {
109
145
  const grouped = new Map();
110
146
  for (const request of inspection.network.requests) {
111
- const identity = `net_${digest({
112
- method: request.method,
113
- url: request.url,
114
- resource_type: request.resource_type,
115
- })}`;
147
+ const identity = networkIdentity(request);
148
+ const shapes = sources.get(identity);
116
149
  const values = grouped.get(identity) ?? [];
117
150
  values.push({
118
151
  status: request.status,
@@ -120,13 +153,18 @@ const networkMap = (inspection) => {
120
153
  encoded_data_length: request.encoded_data_length,
121
154
  redirects: (request.redirects ?? []).map(({ request_timestamp: _requestTimestamp, redirect_event_timestamp: _redirectEventTimestamp, ...redirect }) => redirect),
122
155
  initiator: request.initiator,
123
- body_shapes: request.body_shapes,
156
+ ...(shapes?.request === true
157
+ ? { request_shape: request.body_shapes.request }
158
+ : {}),
159
+ ...(shapes?.response === true
160
+ ? { response_shape: request.body_shapes.response }
161
+ : {}),
124
162
  });
125
163
  grouped.set(identity, values);
126
164
  }
127
165
  return new Map([...grouped].map(([identity, values]) => [
128
166
  identity,
129
- digest(values.map((value) => digest(value)).sort()),
167
+ digestCanonicalValue(values.map((value) => digestCanonicalValue(value)).sort()),
130
168
  ]));
131
169
  };
132
170
  const webMcpMap = (discovery) => discovery === null
@@ -148,7 +186,9 @@ const incompleteSections = (completeness) => new Set([
148
186
  const domProjection = (inspection) => ({
149
187
  frames: inspection.frames
150
188
  .map(({ url, origin }) => ({ url, origin }))
151
- .sort((left, right) => left.url.localeCompare(right.url)),
189
+ .sort((left, right) => compareUnicodeCodePoints(left.url, right.url) ||
190
+ compareUnicodeCodePoints(left.origin ?? "", right.origin ?? "") ||
191
+ Number(left.origin !== null) - Number(right.origin !== null)),
152
192
  nodes: inspection.dom.nodes.map(({ index: _index, ...node }) => node),
153
193
  });
154
194
  const scriptProjection = (script) => ({
@@ -163,17 +203,18 @@ const scriptProjection = (script) => ({
163
203
  const metadataProjection = (inspection) => ({
164
204
  responses: inspection.metadata.responses
165
205
  .map(({ request_id: _requestId, ...response }) => response)
166
- .map((value) => digest(value))
206
+ .map((value) => digestCanonicalValue(value))
207
+ .sort(),
208
+ dom_urls: inspection.metadata.dom_urls
209
+ .map((value) => digestCanonicalValue(value))
167
210
  .sort(),
168
- dom_urls: inspection.metadata.dom_urls.map((value) => digest(value)).sort(),
169
211
  agent_hints: inspection.metadata.agent_hints
170
- .map((value) => digest(value))
212
+ .map((value) => digestCanonicalValue(value))
171
213
  .sort(),
172
214
  excluded_dom_urls: inspection.metadata.excluded_dom_urls,
173
215
  headers_allowlisted: inspection.metadata.headers_allowlisted,
174
216
  });
175
217
  const singleton = (key, value) => new Map([[key, value]]);
176
- const digest = (value) => canonicalDigest(value);
177
218
  const accessibilityComparable = (inspection) => {
178
219
  const text = inspection.accessibility.text_capture.status === "included" &&
179
220
  inspection.accessibility.text_capture.excluded_fields === 0;
@@ -210,7 +251,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
210
251
  const map = new Map([
211
252
  [
212
253
  "storage:summary",
213
- digest({
254
+ digestCanonicalValue({
214
255
  origin: storage.origin,
215
256
  values_redacted: storage.values_redacted,
216
257
  ...(includeUsage
@@ -226,7 +267,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
226
267
  return map;
227
268
  const add = (kind, keys) => {
228
269
  for (const key of keys) {
229
- map.set(`storage:${kind}:${key}`, digest(key));
270
+ map.set(`storage:${kind}:${key}`, digestCanonicalValue(key));
230
271
  }
231
272
  };
232
273
  add("local_storage", storage.local_storage_keys);
@@ -237,7 +278,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
237
278
  const identity = `${fingerprint.scope}:${fingerprint.identity_sha256}`;
238
279
  if (!fingerprintIdentities.has(identity))
239
280
  continue;
240
- map.set(`storage:content:${identity}`, digest(fingerprint.value_sha256));
281
+ map.set(`storage:content:${identity}`, digestCanonicalValue(fingerprint.value_sha256));
241
282
  }
242
283
  return map;
243
284
  };
@@ -1,11 +1,14 @@
1
1
  import { z } from "zod";
2
2
  import { emptyArraySchema } from "./emptyArraySchema.js";
3
- import { webPageInspectionSchema } from "./browserObservation.js";
3
+ import { webPageInspectionSchema } from "./browserObservationSchemas.js";
4
4
  import { webMcpDiscoverySchema } from "./webMcpDiscovery.js";
5
5
  /** One normalized passive page snapshot accepted by capture comparison. */
6
6
  export const captureSnapshotSchema = z.object({
7
- inspection: webPageInspectionSchema,
8
- webmcp: webMcpDiscoverySchema.nullable().default(null),
7
+ inspection: webPageInspectionSchema.describe("Complete normalized_result from inspect_web_page, including capture identity, observations, completeness, and limitations."),
8
+ webmcp: webMcpDiscoverySchema
9
+ .nullable()
10
+ .default(null)
11
+ .describe("Complete normalized_result from discover_webmcp_tools for this capture, or null when it was not recorded."),
9
12
  });
10
13
  /** Input for deterministic comparison of two normalized web captures. */
11
14
  export const compareWebCapturesInputSchema = z.strictObject({
@@ -47,12 +50,6 @@ const dimensionSchema = z.union([
47
50
  reason: z.string(),
48
51
  }),
49
52
  ]);
50
- const legacyUnknownDimension = {
51
- status: "unknown",
52
- total_changes: 0,
53
- changes: [],
54
- reason: "Dimension was not recorded by this version 1 capture diff.",
55
- };
56
53
  /** Completeness-aware changes across stable browser evidence dimensions. */
57
54
  export const webCaptureDiffSchema = z
58
55
  .object({
@@ -66,8 +63,8 @@ export const webCaptureDiffSchema = z
66
63
  network: dimensionSchema,
67
64
  metadata: dimensionSchema,
68
65
  webmcp: dimensionSchema,
69
- accessibility: dimensionSchema.default(legacyUnknownDimension),
70
- storage: dimensionSchema.default(legacyUnknownDimension),
66
+ accessibility: dimensionSchema,
67
+ storage: dimensionSchema,
71
68
  }),
72
69
  limitations: z.array(z.string()),
73
70
  })
@@ -1,12 +1,13 @@
1
1
  import { z } from "zod";
2
- import { webRuntimeBrowserSchema, webRuntimeLocationSchema, webRuntimeScopeSchema, webRuntimeSourceSchema, webRuntimeTargetSchema, } from "./webRuntime.js";
2
+ import { webRuntimeLocationSchema, webRuntimeScopeSchema, webRuntimeSourceSchema, webRuntimeTargetSchema, } from "./webRuntime.js";
3
+ import { browserVersionSchema } from "./browserObservationSchemas.js";
3
4
  /** Inspect listeners registered directly on the first main-document CSS match. */
4
5
  export const inspectWebEventListenersInputSchema = webRuntimeScopeSchema.extend({
5
6
  selector: z.string().min(1),
6
7
  });
7
8
  /** A listener declaration and its source location do not establish that it ran. */
8
9
  export const webEventListenersSchema = z.object({
9
- browser: webRuntimeBrowserSchema,
10
+ browser: browserVersionSchema,
10
11
  target: webRuntimeTargetSchema,
11
12
  inspected_at: z.iso.datetime(),
12
13
  selected_node: z.object({
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { jsonObjectSchema } from "./jsonValue.js";
3
- import { webRuntimeBrowserSchema, webRuntimeLocationSchema, webRuntimeScopeSchema, webRuntimeSourceSchema, webRuntimeTargetSchema, } from "./webRuntime.js";
3
+ import { webRuntimeLocationSchema, webRuntimeScopeSchema, webRuntimeSourceSchema, webRuntimeTargetSchema, } from "./webRuntime.js";
4
+ import { browserVersionSchema } from "./browserObservationSchemas.js";
4
5
  /** Explicit instrumentation request for one finite, externally driven execution window. */
5
6
  export const observeWebExecutionInputSchema = webRuntimeScopeSchema.extend({
6
7
  observation_ms: z.number().int().min(1).max(2_147_483_647).default(10_000),
@@ -18,7 +19,7 @@ const functionSchema = z.object({
18
19
  });
19
20
  /** Precise V8 ranges retain their nested structure and counts without summing them. */
20
21
  export const webExecutionSchema = z.object({
21
- browser: webRuntimeBrowserSchema,
22
+ browser: browserVersionSchema,
22
23
  target: webRuntimeTargetSchema,
23
24
  window: z.object({
24
25
  armed_at: z.iso.datetime(),
@@ -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(),
@@ -71,8 +71,6 @@ export const webRuntimeTargetSchema = z.object({
71
71
  frame_id: z.string().min(1),
72
72
  loader_id: z.string().nullable(),
73
73
  });
74
- /** Producer product identity is observed separately from the unknown host platform. */
75
- export const webRuntimeBrowserSchema = browserVersionSchema;
76
74
  /** Complete runtime evidence has explicit byte budgets rather than silent item truncation. */
77
75
  export const WEB_RUNTIME_LIMITS = {
78
76
  protocolBytes: 64 * 1024 * 1024,
@@ -18,13 +18,13 @@ const sourceSchema = z.discriminatedUnion("kind", [
18
18
  kind: z.literal("page-script"),
19
19
  script_key: z.string().min(1),
20
20
  frame_id: z.string().nullable(),
21
- is_module: z.boolean(),
21
+ is_module: z.boolean().nullable(),
22
22
  language: z.string().nullable(),
23
23
  source_map_url: z.string().nullable(),
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(),