rea-agents 6.3.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 (487) hide show
  1. package/README.md +7 -4
  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/dist/adb/AdbConfiguration.js +88 -0
  6. package/dist/adb/AdbDeviceOutput.js +186 -0
  7. package/dist/adb/AdbProvider.js +1190 -0
  8. package/dist/adb/AdbShellOutput.js +309 -0
  9. package/dist/android/AndroidTargetSnapshot.js +104 -22
  10. package/dist/android/JadxConfiguration.js +44 -24
  11. package/dist/android/JadxProvider.js +51 -19
  12. package/dist/apktool/ApktoolConfiguration.js +84 -0
  13. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  14. package/dist/apktool/ApktoolProvider.js +506 -0
  15. package/dist/application/AnalysisProvider.js +8 -2
  16. package/dist/application/AppBundleExecutable.js +27 -22
  17. package/dist/application/BinaryTargetResolver.js +22 -2
  18. package/dist/application/CapabilityInventory.js +11 -1
  19. package/dist/application/ClientConfigurationDocument.js +70 -0
  20. package/dist/application/ClientConfigurationFiles.js +91 -0
  21. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  22. package/dist/application/ClientRegistrationStatus.js +66 -31
  23. package/dist/application/DirectAnalysis.js +2 -2
  24. package/dist/application/DirectAnalysisCleanup.js +1 -1
  25. package/dist/application/DirectAnalysisStatus.js +1 -1
  26. package/dist/application/Doctor.js +5 -3
  27. package/dist/application/DoctorDiagnostics.js +1 -1
  28. package/dist/application/EvidenceBundleCommands.js +6 -12
  29. package/dist/application/GeminiClientSettings.js +139 -0
  30. package/dist/application/HermesClientHome.js +115 -0
  31. package/dist/application/HopperDownload.js +39 -0
  32. package/dist/application/InvestigationProviders.js +6 -0
  33. package/dist/application/JsonFiles.js +6 -5
  34. package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
  35. package/dist/application/LinuxHopper.js +4 -12
  36. package/dist/application/MacHopper.js +172 -149
  37. package/dist/application/MipsElfAbiFlags.js +140 -0
  38. package/dist/application/ProviderOperationExecution.js +31 -0
  39. package/dist/application/ReconstructionObligationCandidates.js +9 -3
  40. package/dist/application/ReferenceSourceImport.js +76 -29
  41. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  42. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  43. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  44. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  45. package/dist/application/RegularFileRead.js +93 -7
  46. package/dist/application/Setup.js +54 -6
  47. package/dist/application/SetupClientConfiguration.js +116 -16
  48. package/dist/application/SetupHost.js +102 -24
  49. package/dist/application/SetupPlan.js +5 -8
  50. package/dist/application/SetupSkill.js +58 -39
  51. package/dist/application/SupportedClients.js +290 -65
  52. package/dist/application/Uninstall.js +158 -10
  53. package/dist/application/UpdateMaintenance.js +17 -21
  54. package/dist/application/Utf8JsonInput.js +7 -0
  55. package/dist/application/WebScriptExportService.js +131 -65
  56. package/dist/application/WebSourceLocationService.js +3 -0
  57. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  58. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  59. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  60. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  61. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  62. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  63. package/dist/application/binary/BinarySession.js +2 -1
  64. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  65. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  66. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  67. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  68. package/dist/application/evm/EvmInterfaceService.js +3 -0
  69. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  70. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  71. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  72. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  73. package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
  74. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  75. package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
  76. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  77. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
  78. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  79. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
  80. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  81. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  82. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
  83. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  84. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
  85. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
  86. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  89. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
  90. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
  91. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
  92. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
  93. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
  94. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
  95. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
  96. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  97. package/dist/application/jeb/JebAnalysisService.js +13 -0
  98. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  99. package/dist/application/native/NativeUiActionTrace.js +16 -8
  100. package/dist/application/native/NativeValueTrace.js +23 -6
  101. package/dist/application/process/ProcessCli.js +25 -20
  102. package/dist/artifacts/ArtifactPaths.js +129 -8
  103. package/dist/artifacts/ArtifactProvider.js +20 -15
  104. package/dist/artifacts/ArtifactReader.js +23 -0
  105. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  106. package/dist/artifacts/AsarArtifactReader.js +176 -102
  107. package/dist/artifacts/AsarHeader.js +24 -0
  108. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  109. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  110. package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
  111. package/dist/artifacts/SafeOutputTree.js +245 -70
  112. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  113. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  114. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  115. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  116. package/dist/artifacts/ZipArtifactReader.js +77 -27
  117. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  118. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  119. package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
  120. package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
  121. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
  122. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  123. package/dist/artifacts/inventory/classify.js +75 -32
  124. package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
  125. package/dist/artifacts/inventory/reader.js +13 -5
  126. package/dist/artifacts/inventory/scanCanonical.js +62 -25
  127. package/dist/artifacts/inventory/scanReader.js +38 -11
  128. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
  129. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  130. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  131. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  132. package/dist/browser/CdpBrowserProvider.js +5 -0
  133. package/dist/browser/CdpCaptureDocuments.js +40 -6
  134. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  135. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  136. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  137. package/dist/browser/CdpCaptureEvents.js +4 -9
  138. package/dist/browser/CdpConnection.js +22 -5
  139. package/dist/browser/CdpPageCapture.js +1 -1
  140. package/dist/browser/CdpTargetSession.js +30 -34
  141. package/dist/browser/CdpWebMcpDiscovery.js +32 -10
  142. package/dist/browser/ElectronFileScope.js +99 -9
  143. package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
  144. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  145. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  146. package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
  147. package/dist/browser/PlaywrightScenarioSession.js +127 -54
  148. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  149. package/dist/browser/PngVisualDiff.js +198 -29
  150. package/dist/browser/WebSourceMapFetcher.js +3 -3
  151. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  152. package/dist/browser/assets/PublishWebScripts.js +75 -20
  153. package/dist/browser/assets/WebArtifactReads.js +23 -1
  154. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  155. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  156. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  157. package/dist/browser/history/HarCapture.js +14 -0
  158. package/dist/browser/history/HarCaptureProcess.js +2 -10
  159. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  160. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  161. package/dist/cli/adbCommands.js +337 -0
  162. package/dist/cli/analysisViewCommands.js +39 -1
  163. package/dist/cli/apktoolCommands.js +53 -0
  164. package/dist/cli/artifactCommands.js +8 -11
  165. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  166. package/dist/cli/browserAdvancedCommands.js +65 -36
  167. package/dist/cli/coreBinaryCommands.js +0 -5
  168. package/dist/cli/coreNativeCommands.js +1 -14
  169. package/dist/cli/electronCommands.js +6 -1
  170. package/dist/cli/evmCommands.js +13 -4
  171. package/dist/cli/firmwareCommands.js +7 -2
  172. package/dist/cli/javascriptApplicationAnalysis.js +17 -1
  173. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  174. package/dist/cli/jebCommands.js +99 -0
  175. package/dist/cli/jsonOutput.js +11 -4
  176. package/dist/cli/referenceSourceImportStatus.js +7 -0
  177. package/dist/cli/setupCommands.js +15 -3
  178. package/dist/cli/utilityCommands.js +66 -18
  179. package/dist/cli/webScriptCommands.js +20 -1
  180. package/dist/cli/webSourceLocationCommands.js +21 -9
  181. package/dist/cli.js +6 -0
  182. package/dist/cliBrowserScenarioCommands.js +2 -1
  183. package/dist/cliCommandNames.js +32 -0
  184. package/dist/cliJsonInput.js +2 -2
  185. package/dist/cliObservationOptions.js +3 -0
  186. package/dist/composition/adb.js +3 -0
  187. package/dist/composition/apktool.js +3 -0
  188. package/dist/composition/binaryDiagnostics.js +4 -0
  189. package/dist/composition/directAnalysis.js +12 -4
  190. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  191. package/dist/composition/jeb.js +6 -0
  192. package/dist/config/environment.js +10 -0
  193. package/dist/config/ghidraLanguageOverride.js +9 -0
  194. package/dist/config/mcpInputSchemaProfile.js +27 -0
  195. package/dist/config/parseConfig.js +28 -1
  196. package/dist/contracts/adb/adbToolContracts.js +353 -0
  197. package/dist/contracts/advertisedInputExamples.js +48 -0
  198. package/dist/contracts/analysisDetail.js +10 -0
  199. package/dist/contracts/analysisViewToolContracts.js +17 -2
  200. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  201. package/dist/contracts/artifactToolContracts.js +8 -5
  202. package/dist/contracts/browserToolContracts.js +1 -1
  203. package/dist/contracts/compactInputSchema.js +256 -0
  204. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  205. package/dist/contracts/inputSchemaPresentation.js +10 -10
  206. package/dist/contracts/javascript/electronToolContracts.js +15 -3
  207. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  208. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  209. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  210. package/dist/contracts/officialToolContracts.js +5 -5
  211. package/dist/contracts/sessionToolContracts.js +2 -2
  212. package/dist/contracts/sessionToolSchemas.js +6 -2
  213. package/dist/contracts/toolContractExamples.js +6 -0
  214. package/dist/contracts/toolContractTypes.js +3 -0
  215. package/dist/contracts/toolContracts.js +6 -0
  216. package/dist/contracts/toolEffects.js +167 -0
  217. package/dist/contracts/toolOutputSchemaGroups.js +5 -3
  218. package/dist/contracts/toolSchemaMetadata.js +82 -7
  219. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  220. package/dist/domain/analysisErrorCleanup.js +29 -0
  221. package/dist/domain/analysisErrorPresentation.js +18 -6
  222. package/dist/domain/analysisErrorProjection.js +4 -1
  223. package/dist/domain/analysisSnapshot.js +2 -1
  224. package/dist/domain/analysisView/analysisView.js +52 -2
  225. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  226. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  227. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  228. package/dist/domain/android/androidApplication.js +25 -20
  229. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  230. package/dist/domain/apple/appleApplication.js +40 -23
  231. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  232. package/dist/domain/apple/dyldPaths.js +9 -1
  233. package/dist/domain/apple/dylibResolution.js +2 -2
  234. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  235. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  236. package/dist/domain/artifactComparison.js +35 -7
  237. package/dist/domain/artifactGraph.js +5 -3
  238. package/dist/domain/artifactIdentity.js +30 -2
  239. package/dist/domain/artifactInspection.js +3 -43
  240. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  241. package/dist/domain/artifactInventoryEvidence.js +11 -12
  242. package/dist/domain/artifactPathSyntax.js +1 -1
  243. package/dist/domain/binaryTarget.js +16 -0
  244. package/dist/domain/binaryTargetTypes.js +8 -1
  245. package/dist/domain/browserObservationSchemas.js +8 -4
  246. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  247. package/dist/domain/compactStringIdentity.js +9 -0
  248. package/dist/domain/evidence.js +2 -1
  249. package/dist/domain/evidenceRecordSummary.js +144 -0
  250. package/dist/domain/inputIssueProjection.js +16 -1
  251. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
  252. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
  253. package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
  254. package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
  255. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  256. package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
  257. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
  258. package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
  259. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  260. package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
  261. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
  262. package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
  263. package/dist/domain/javascript/javascriptAstValues.js +32 -0
  264. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  265. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  266. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
  267. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  268. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  269. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
  270. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
  271. package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
  272. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  273. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  274. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  275. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  276. package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
  277. package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
  278. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
  279. package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
  280. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
  281. package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
  282. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  283. package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
  284. package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
  285. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
  286. package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
  287. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
  288. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  289. package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
  290. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  291. package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
  292. package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
  293. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  294. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  295. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
  296. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  297. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  298. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  299. package/dist/domain/jeb/jebAnalysis.js +114 -0
  300. package/dist/domain/jsonShape.js +63 -52
  301. package/dist/domain/jsonValue.js +3 -0
  302. package/dist/domain/managed/managedApplicationGraph.js +37 -0
  303. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  304. package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
  305. package/dist/domain/managed/managedArtifact.js +1 -0
  306. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  307. package/dist/domain/native/nativeAotPe.js +1408 -0
  308. package/dist/domain/native/nativeInstruction.js +21 -0
  309. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  310. package/dist/domain/native/peResources.js +94 -0
  311. package/dist/domain/nativeConvention.js +33 -0
  312. package/dist/domain/process/processCapture.js +91 -1
  313. package/dist/domain/process/processCaptureExample.js +24 -0
  314. package/dist/domain/process/processCaptureValidation.js +79 -0
  315. package/dist/domain/process/processScenario.js +59 -7
  316. package/dist/domain/propertyListKeys.js +3 -1
  317. package/dist/domain/referenceSourceGraph.js +25 -16
  318. package/dist/domain/referenceSourceImportParsing.js +6 -3
  319. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  320. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  321. package/dist/domain/webBundleAnalyzerInspection.js +14 -2
  322. package/dist/domain/webCaptureDiff.js +102 -4
  323. package/dist/domain/webScriptExportError.js +10 -4
  324. package/dist/domain/webScriptExportPlan.js +7 -13
  325. package/dist/domain/zipPackageFormat.js +4 -1
  326. package/dist/domain/zodCollectionSteps.js +24 -0
  327. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  328. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  329. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  330. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  331. package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
  332. package/dist/dotnet/ManagedMemberRows.js +9 -4
  333. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  334. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  335. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  336. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  337. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  338. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  339. package/dist/dotnet/ManagedPeReader.js +41 -25
  340. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  341. package/dist/dotnet/ManagedStaticProvider.js +55 -24
  342. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  343. package/dist/evaluation/CodexAgentEval.js +43 -13
  344. package/dist/evm/EvmoleFailures.js +0 -2
  345. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  346. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  347. package/dist/filesystem/OwnedFileHandle.js +36 -0
  348. package/dist/filesystem/RegularFile.js +33 -1
  349. package/dist/filesystem/StableFileHash.js +46 -0
  350. package/dist/filesystem/readFileHandleChunks.js +26 -0
  351. package/dist/firmware/FirmwareCommand.js +25 -3
  352. package/dist/firmware/FirmwareFiles.js +23 -8
  353. package/dist/firmware/FirmwareProvider.js +156 -32
  354. package/dist/firmware/FirmwarePublication.js +24 -3
  355. package/dist/firmware/FirmwareRelease.js +1 -0
  356. package/dist/generatedPackageMetadata.js +2 -2
  357. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  358. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  359. package/dist/ghidra/GhidraClient.js +76 -4
  360. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  361. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  362. package/dist/ghidra/GhidraInstallation.js +1 -1
  363. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  364. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  365. package/dist/ghidra/GhidraLauncher.js +80 -39
  366. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  367. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  368. package/dist/ghidra/GhidraProvider.js +57 -9
  369. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  370. package/dist/ghidra/GhidraProviderClient.js +282 -21
  371. package/dist/ghidra/GhidraSessionValues.js +9 -2
  372. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  373. package/dist/hopper/HopperClient.js +15 -6
  374. package/dist/hopper/HopperMachOImage.js +2 -0
  375. package/dist/hopper/HopperProvider.js +13 -2
  376. package/dist/ida/IdaOperationRunner.js +8 -2
  377. package/dist/ida/IdaProvider.js +7 -0
  378. package/dist/ida/IdaSessionClient.js +3 -1
  379. package/dist/ida/IdaWorkspace.js +4 -2
  380. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  381. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  382. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  383. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  384. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  385. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  386. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  387. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  388. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  389. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  390. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  391. package/dist/javascript/recovery/WakaruReport.js +12 -7
  392. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  393. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  394. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  395. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  396. package/dist/jeb/JebMcpConnection.js +179 -0
  397. package/dist/jeb/JebMcpEndpoint.js +40 -0
  398. package/dist/jeb/JebProvider.js +299 -0
  399. package/dist/mcpDoctor.js +15 -6
  400. package/dist/native/AppleDispatchCoverage.js +25 -12
  401. package/dist/native/AppleDispatchMetadata.js +14 -7
  402. package/dist/native/AppleMachoFixups.js +71 -15
  403. package/dist/native/AppleMachoSelection.js +23 -3
  404. package/dist/native/NativeMacOSProvider.js +91 -16
  405. package/dist/native/NativeMachoInspection.js +11 -7
  406. package/dist/native/NativeUiHelperRuntime.js +6 -1
  407. package/dist/native/NativeUiObservation.js +4 -3
  408. package/dist/native/pe/PeResourceLayout.js +120 -0
  409. package/dist/native/pe/PeResourceParser.js +286 -0
  410. package/dist/native/pe/PeResourcesProvider.js +63 -0
  411. package/dist/process/BoundedFileBytes.js +30 -7
  412. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  413. package/dist/process/OwnedCommand.js +4 -3
  414. package/dist/process/ProcessOwnership.js +104 -112
  415. package/dist/process/ProcessOwnershipObservation.js +96 -39
  416. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  417. package/dist/process/ProcessRunTokenObservations.js +48 -0
  418. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  419. package/dist/process/ProviderProcess.js +4 -3
  420. package/dist/process/capture/FilesystemSnapshot.js +28 -4
  421. package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
  422. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  423. package/dist/process/capture/ProcessHarness.js +194 -26
  424. package/dist/process/capture/ProcessNormalization.js +3 -1
  425. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  426. package/dist/process/capture/TerminalRenderer.js +24 -7
  427. package/dist/reference/ReferenceSourceReader.js +22 -5
  428. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  429. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  430. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  431. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  432. package/dist/server/EvidenceMcpServer.js +36 -1
  433. package/dist/server/admittedToolOperation.js +9 -0
  434. package/dist/server/contractToolHandler.js +21 -0
  435. package/dist/server/createServer.js +97 -25
  436. package/dist/server/registerAdbTools.js +36 -0
  437. package/dist/server/registerAnalysisViewTool.js +4 -9
  438. package/dist/server/registerAndroidTools.js +3 -12
  439. package/dist/server/registerApktoolTools.js +14 -0
  440. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
  441. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  442. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  443. package/dist/server/registerApplicationTools/coverage.js +3 -2
  444. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  445. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  446. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  447. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  448. package/dist/server/registerArtifactComparisonTool.js +5 -2
  449. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  450. package/dist/server/registerBrowserScenarioTool.js +10 -7
  451. package/dist/server/registerBrowserTools.js +12 -9
  452. package/dist/server/registerBundleComparisonTool.js +16 -2
  453. package/dist/server/registerCloseLifecycleTool.js +32 -3
  454. package/dist/server/registerElectronTools.js +28 -10
  455. package/dist/server/registerEvmTools.js +4 -9
  456. package/dist/server/registerFirmwareTools.js +3 -11
  457. package/dist/server/registerFunctionComparisonTool.js +5 -2
  458. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  459. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  460. package/dist/server/registerJebTools.js +16 -0
  461. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  462. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  463. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  464. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  465. package/dist/server/registerPeResourcesTool.js +9 -0
  466. package/dist/server/registerProcessComparisonTool.js +5 -2
  467. package/dist/server/registerRecordedCrashTools.js +4 -9
  468. package/dist/server/registerSessionRecordTools.js +2 -1
  469. package/dist/server/registerSessionTools.js +49 -18
  470. package/dist/server/registerWebModuleTool.js +4 -9
  471. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  472. package/dist/server/registerWebRuntimeTools.js +6 -5
  473. package/dist/server/registerWebScriptTool.js +6 -3
  474. package/dist/server/registerWebSourceLocationTool.js +4 -9
  475. package/dist/server/toolResult.js +21 -2
  476. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  477. package/install.sh +7 -4
  478. package/licenses/nativeaot-parser-MIT.txt +28 -0
  479. package/native/windows/build/manifest.json +2 -2
  480. package/native/windows/build/rea-windows-x64.node +0 -0
  481. package/package.json +33 -5
  482. package/scripts/rea.mjs +16 -1
  483. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  484. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  485. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  486. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  487. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
@@ -97,8 +97,12 @@ const validateCompleteInventory = (inventory) => {
97
97
  throw new TypeError("Artifact root occurrence does not match its manifest representation");
98
98
  for (const occurrence of inventory.occurrences)
99
99
  validateOccurrence(occurrence, inventory, nodeIds, occurrenceIds);
100
+ const occurrencesById = new Map(inventory.occurrences.map((occurrence) => [
101
+ occurrence.occurrence_id,
102
+ occurrence,
103
+ ]));
100
104
  for (const edge of inventory.edges)
101
- validateEdge(edge, nodeIds, occurrenceIds);
105
+ validateEdge(edge, nodeIds, occurrencesById);
102
106
  for (const contradiction of inventory.integrityContradictions) {
103
107
  if (!nodeIds.has(contradiction.parent_artifact_id) ||
104
108
  !occurrenceIds.has(contradiction.occurrence_id))
@@ -138,19 +142,14 @@ const validateOccurrence = (occurrence, inventory, nodeIds, occurrenceIds) => {
138
142
  if (occurrence.occurrence_id !== expectedId)
139
143
  throw new TypeError("Artifact occurrence ID does not match its identity");
140
144
  };
141
- const validateEdge = (edge, nodeIds, occurrenceIds) => {
145
+ const validateEdge = (edge, nodeIds, occurrences) => {
146
+ const occurrence = occurrences.get(edge.occurrence_id);
142
147
  if (!nodeIds.has(edge.parent_artifact_id) ||
143
- !nodeIds.has(edge.child_artifact_id) ||
144
- !occurrenceIds.has(edge.occurrence_id))
148
+ occurrence?.artifact_id === null ||
149
+ occurrence === undefined ||
150
+ !nodeIds.has(occurrence.artifact_id))
145
151
  throw new TypeError("Artifact edge references a missing graph member");
146
- const semantic = {
147
- parent_artifact_id: edge.parent_artifact_id,
148
- child_artifact_id: edge.child_artifact_id,
149
- relation: edge.relation,
150
- occurrence_id: edge.occurrence_id,
151
- logical_path: edge.logical_path,
152
- };
153
- if (edge.edge_id !== artifactEdgeId(semantic))
152
+ if (edge.edge_id !== artifactEdgeId(edge, occurrence))
154
153
  throw new TypeError("Artifact edge ID does not match its identity");
155
154
  };
156
155
  const mergeExact = (output, key, value, label) => {
@@ -6,7 +6,7 @@
6
6
  * Policy divergence (deliberate, not yet unified):
7
7
  * - Local artifact paths resolve against an inventoried container root and
8
8
  * report rejected | external | not-found. Confinement is lexical
9
- * (posix.normalize must stay inside the root).
9
+ * (normalizeJoinedLogicalPath must stay inside the root).
10
10
  * - Live DOM destinations resolve against the document base URL and report
11
11
  * approved | outside_policy | unsupported against allowedOrigins
12
12
  * (see CdpCaptureDocuments.domDestination).
@@ -103,6 +103,20 @@ const parseElf = (bytes, fileSize) => {
103
103
  const architecture = elfArchitecture(machine);
104
104
  if (architecture === undefined)
105
105
  return err("unsupported ELF architecture");
106
+ if (architecture === "mips")
107
+ return ok({
108
+ format: "elf",
109
+ architecture,
110
+ availableArchitectures: [architecture],
111
+ mips: {
112
+ elfClass: bytes[4] === 1 ? 32 : 64,
113
+ byteOrder: little ? "little" : "big",
114
+ type: little ? bytes.readUInt16LE(16) : bytes.readUInt16BE(16),
115
+ flags: little
116
+ ? bytes.readUInt32LE(bytes[4] === 1 ? 36 : 48)
117
+ : bytes.readUInt32BE(bytes[4] === 1 ? 36 : 48),
118
+ },
119
+ });
106
120
  return ok({
107
121
  format: "elf",
108
122
  architecture,
@@ -197,6 +211,8 @@ const elfArchitecture = (machine) => {
197
211
  return "x86";
198
212
  case 62:
199
213
  return "x86_64";
214
+ case 8: // EM_MIPS: ISA, ABI and byte order remain separate ELF facts.
215
+ return "mips";
200
216
  case 40:
201
217
  return "arm";
202
218
  case 183:
@@ -1 +1,8 @@
1
- export {};
1
+ /** Provider-neutral CPU families detected from supported executable headers. */
2
+ export const BINARY_ARCHITECTURES = [
3
+ "x86",
4
+ "x86_64",
5
+ "arm",
6
+ "arm64",
7
+ "mips",
8
+ ];
@@ -159,11 +159,10 @@ const browserConsoleEventSchema = z.object({
159
159
  retained_bytes: z.number().int().min(0),
160
160
  }),
161
161
  });
162
- const browserWebSocketEventSchema = z.object({
163
- request_id: z.string(),
162
+ const browserWebSocketFrameSchema = z.object({
164
163
  direction: z.enum(["sent", "received"]),
165
164
  opcode: z.number().int().min(0),
166
- payload_bytes: z.number().int().min(0),
165
+ payload_bytes: z.number().int().min(0).nullable(),
167
166
  payload_shape: z
168
167
  .object({
169
168
  format: z.enum(["json", "text", "binary"]),
@@ -171,6 +170,11 @@ const browserWebSocketEventSchema = z.object({
171
170
  })
172
171
  .nullable(),
173
172
  });
173
+ const browserWebSocketConnectionSchema = z.object({
174
+ request_id: z.string(),
175
+ url: z.string(),
176
+ events: z.array(browserWebSocketFrameSchema),
177
+ });
174
178
  const browserWorkerSchema = z.object({
175
179
  target_id: z.string(),
176
180
  type: z.string(),
@@ -275,7 +279,7 @@ export const webPageInspectionSchema = z.object({
275
279
  resources: z.array(browserResourceSchema),
276
280
  network: z.object({
277
281
  requests: z.array(browserNetworkRequestSchema),
278
- websocket_events: z.array(browserWebSocketEventSchema),
282
+ websocket_connections: z.array(browserWebSocketConnectionSchema),
279
283
  coverage_started_at: z.iso.datetime(),
280
284
  prior_activity_available: z.literal(false),
281
285
  }),
@@ -4,6 +4,9 @@ export function* canonicalJsonDigestSteps(value) {
4
4
  const hash = createHash("sha256");
5
5
  const ancestors = new Set();
6
6
  const stack = [{ kind: "value", value }];
7
+ const encodedKeys = new Map();
8
+ // Keep reusable key encodings within one existing digest-buffer quantum.
9
+ let remainingKeyCodeUnits = 8192;
7
10
  let buffered = "";
8
11
  let flushed = false;
9
12
  const emit = (part) => {
@@ -46,21 +49,22 @@ export function* canonicalJsonDigestSteps(value) {
46
49
  stack.push(frame);
47
50
  continue;
48
51
  }
52
+ let item;
49
53
  if (frame.kind === "array") {
50
54
  if (frame.index === frame.length) {
51
55
  emit("]");
52
56
  ancestors.delete(frame.value);
53
57
  continue;
54
58
  }
55
- const item = frame.value[frame.index];
56
- if (item === undefined)
59
+ const element = frame.value[frame.index];
60
+ if (element === undefined)
57
61
  throw new TypeError("Canonical JSON digest requires dense JSON arrays");
58
62
  if (frame.index++ > 0)
59
63
  emit(",");
60
- stack.push(frame, { kind: "value", value: item });
61
- continue;
64
+ stack.push(frame);
65
+ item = element;
62
66
  }
63
- if (frame.kind === "object") {
67
+ else if (frame.kind === "object") {
64
68
  if (frame.index === frame.keys.length) {
65
69
  emit("}");
66
70
  ancestors.delete(frame.value);
@@ -69,22 +73,39 @@ export function* canonicalJsonDigestSteps(value) {
69
73
  const key = frame.keys[frame.index++];
70
74
  if (key === undefined)
71
75
  throw new TypeError("Canonical JSON object changed during hashing");
72
- const item = frame.value[key];
73
- if (item === undefined)
76
+ const property = frame.value[key];
77
+ if (property === undefined) {
78
+ stack.push(frame);
74
79
  continue;
80
+ }
75
81
  if (frame.written++ > 0)
76
82
  emit(",");
77
83
  if (key.length > 8192) {
78
84
  emit('"');
79
- stack.push(frame, { kind: "value", value: item }, { kind: "separator" }, { kind: "string", value: key, index: 0 });
85
+ stack.push(frame, { kind: "value", value: property }, { kind: "separator" }, { kind: "string", value: key, index: 0 });
80
86
  continue;
81
87
  }
82
- emit(JSON.stringify(key));
88
+ let encodedKey = encodedKeys.get(key);
89
+ if (encodedKey === undefined) {
90
+ encodedKey = JSON.stringify(key);
91
+ if (encodedKey.length <= remainingKeyCodeUnits) {
92
+ encodedKeys.set(key, encodedKey);
93
+ remainingKeyCodeUnits -= encodedKey.length;
94
+ }
95
+ }
96
+ emit(encodedKey);
83
97
  emit(":");
84
- stack.push(frame, { kind: "value", value: item });
85
- continue;
98
+ stack.push(frame);
99
+ item = property;
100
+ }
101
+ else {
102
+ item = frame.value;
103
+ }
104
+ // Resume containers directly; scalar members need no temporary value frame.
105
+ if (flushed) {
106
+ flushed = false;
107
+ yield;
86
108
  }
87
- const item = frame.value;
88
109
  if (typeof item === "string" && item.length > 8192) {
89
110
  emit('"');
90
111
  stack.push({ kind: "string", value: item, index: 0 });
@@ -128,6 +149,7 @@ export function* canonicalJsonDigestSteps(value) {
128
149
  finally {
129
150
  stack.length = 0;
130
151
  ancestors.clear();
152
+ encodedKeys.clear();
131
153
  buffered = "";
132
154
  }
133
155
  }
@@ -0,0 +1,9 @@
1
+ import { digestCanonicalValue } from "./canonicalDigest.js";
2
+ /** Retain short exact string keys or commit their value in a reserved digest namespace. */
3
+ export const compactStringIdentityKey = (value) => {
4
+ const prefix = "value-sha256:";
5
+ const digestKey = `${prefix}${digestCanonicalValue(value, "String identity")}`;
6
+ return value.length <= digestKey.length && !value.startsWith(prefix)
7
+ ? value
8
+ : digestKey;
9
+ };
@@ -2,6 +2,7 @@ import { z } from "zod";
2
2
  import { digestCanonicalValue } from "./canonicalDigest.js";
3
3
  import { canonicalJsonDigestSteps } from "./canonicalJsonDigestSteps.js";
4
4
  import { analysisProfileSchema, } from "./analysisProfile.js";
5
+ import { BINARY_ARCHITECTURES, } from "./binaryTargetTypes.js";
5
6
  import { jsonObjectSchema, jsonValueSchema, jsonValueValidationIssue, jsonValueValidationSteps, } from "./jsonValue.js";
6
7
  import { freezeJsonSnapshot, isImmutableJsonSnapshot, } from "./immutableJson.js";
7
8
  import { digestSchema } from "./../domain/digests.js";
@@ -41,7 +42,7 @@ const subjectSchema = z.object({
41
42
  "javascript-bundle",
42
43
  "entitlements",
43
44
  ]),
44
- architecture: z.enum(["x86", "x86_64", "arm", "arm64"]).nullable(),
45
+ architecture: z.enum(BINARY_ARCHITECTURES).nullable(),
45
46
  local_path: z.string(),
46
47
  });
47
48
  /** Source location attached to an evidence observation. */
@@ -0,0 +1,144 @@
1
+ import { z } from "zod";
2
+ import { digestSchema, prefixedDigestSchema } from "./digests.js";
3
+ import { evidenceSchema } from "./evidence.js";
4
+ /** Exact retained-record selectors; selection never resolves a provider address. */
5
+ export const evidenceRecordFiltersSchema = z.strictObject({
6
+ evidence_id: prefixedDigestSchema("ev").optional(),
7
+ operation: z.string().min(1).optional(),
8
+ target_sha256: digestSchema.optional(),
9
+ analysis_profile_digest: digestSchema.optional(),
10
+ procedure_address: z.string().min(1).optional(),
11
+ });
12
+ const countSchema = z.number().int().nonnegative();
13
+ const nativeMetadataSchema = z.object({
14
+ procedure: z.object({ address: z.string(), name: z.string().nullish() }),
15
+ native_value_flow: z.unknown().optional(),
16
+ });
17
+ const valueFlowMetadataSchema = z.union([
18
+ z.object({
19
+ available: z.literal(true),
20
+ truncated: z.boolean(),
21
+ omitted_operations_lower_bound: countSchema.optional(),
22
+ known_omitted_inputs: countSchema.optional(),
23
+ known_omitted_edges: countSchema.optional(),
24
+ }),
25
+ z.object({ available: z.literal(false), reason: z.string() }),
26
+ ]);
27
+ const nativeSummarySchema = z.discriminatedUnion("available", [
28
+ z.strictObject({
29
+ available: z.literal(true),
30
+ procedure_address: z.string(),
31
+ procedure_name: z.string().nullable(),
32
+ value_flow: z.discriminatedUnion("status", [
33
+ z.strictObject({
34
+ status: z.literal("observed"),
35
+ truncated: z.boolean(),
36
+ omitted_operations_lower_bound: countSchema.nullable(),
37
+ known_omitted_inputs: countSchema.nullable(),
38
+ known_omitted_edges: countSchema.nullable(),
39
+ }),
40
+ z.strictObject({ status: z.literal("unavailable"), reason: z.string() }),
41
+ z.strictObject({ status: z.literal("not-recorded") }),
42
+ z.strictObject({ status: z.literal("unknown"), reason: z.string() }),
43
+ ]),
44
+ }),
45
+ z.strictObject({
46
+ available: z.literal(false),
47
+ reason: z.enum(["different-operation", "not-recorded-or-incompatible"]),
48
+ }),
49
+ ]);
50
+ /** Metadata for complete retained records, independent of analysis completeness. */
51
+ export const evidenceBundleSummarySchema = z.strictObject({
52
+ kind: z.literal("evidence-bundle-summary"),
53
+ filters: z.record(z.string(), z.string()),
54
+ total_retained_records: countSchema,
55
+ matching_records: countSchema,
56
+ unknown_revisions: countSchema,
57
+ records: z.array(z.strictObject({
58
+ evidence_id: evidenceSchema.shape.evidence_id,
59
+ subject: evidenceSchema.shape.subject,
60
+ provider: evidenceSchema.shape.provider,
61
+ operation: evidenceSchema.shape.operation,
62
+ confidence: evidenceSchema.shape.confidence,
63
+ authority: evidenceSchema.shape.authority,
64
+ analysis_profile_digest: digestSchema.nullable(),
65
+ retention: z.literal("complete-record"),
66
+ limitation_count: countSchema,
67
+ native_dossier: nativeSummarySchema,
68
+ })),
69
+ });
70
+ const nativeSummary = (evidence) => {
71
+ if (evidence.operation !== "analyze_function")
72
+ return { available: false, reason: "different-operation" };
73
+ // Read only producer metadata. Parsing the full dossier would allocate every
74
+ // large collection merely to discover its already authenticated parent ID.
75
+ const parsed = nativeMetadataSchema.safeParse(evidence.normalized_result);
76
+ if (!parsed.success)
77
+ return { available: false, reason: "not-recorded-or-incompatible" };
78
+ const flow = valueFlowMetadataSchema.safeParse(parsed.data.native_value_flow);
79
+ return {
80
+ available: true,
81
+ procedure_address: parsed.data.procedure.address,
82
+ procedure_name: parsed.data.procedure.name ?? null,
83
+ value_flow: parsed.data.native_value_flow == null
84
+ ? { status: "not-recorded" }
85
+ : !flow.success
86
+ ? {
87
+ status: "unknown",
88
+ reason: "Value-flow metadata has an incompatible representation.",
89
+ }
90
+ : flow.data.available
91
+ ? {
92
+ status: "observed",
93
+ truncated: flow.data.truncated,
94
+ omitted_operations_lower_bound: flow.data.omitted_operations_lower_bound ?? null,
95
+ known_omitted_inputs: flow.data.known_omitted_inputs ?? null,
96
+ known_omitted_edges: flow.data.known_omitted_edges ?? null,
97
+ }
98
+ : { status: "unavailable", reason: flow.data.reason },
99
+ };
100
+ };
101
+ /** Discover retained Evidence without reading or copying its complete payloads. */
102
+ export const summarizeEvidenceBundle = (bundle, filters = {}) => {
103
+ const selectedFilters = {};
104
+ for (const [field, value] of Object.entries(filters))
105
+ if (value !== undefined)
106
+ selectedFilters[field] = value;
107
+ const records = [];
108
+ for (const evidence of bundle.records) {
109
+ if ((filters.evidence_id !== undefined &&
110
+ filters.evidence_id !== evidence.evidence_id) ||
111
+ (filters.operation !== undefined &&
112
+ filters.operation !== evidence.operation) ||
113
+ (filters.target_sha256 !== undefined &&
114
+ filters.target_sha256 !== evidence.subject?.digest.sha256) ||
115
+ (filters.analysis_profile_digest !== undefined &&
116
+ filters.analysis_profile_digest !== evidence.analysis_profile?.digest))
117
+ continue;
118
+ const native = nativeSummary(evidence);
119
+ if (filters.procedure_address !== undefined &&
120
+ (!native.available ||
121
+ filters.procedure_address !== native.procedure_address))
122
+ continue;
123
+ records.push({
124
+ evidence_id: evidence.evidence_id,
125
+ subject: evidence.subject,
126
+ provider: evidence.provider,
127
+ operation: evidence.operation,
128
+ confidence: evidence.confidence,
129
+ authority: evidence.authority,
130
+ analysis_profile_digest: evidence.analysis_profile?.digest ?? null,
131
+ retention: "complete-record",
132
+ limitation_count: evidence.limitations.length,
133
+ native_dossier: native,
134
+ });
135
+ }
136
+ return {
137
+ kind: "evidence-bundle-summary",
138
+ filters: selectedFilters,
139
+ total_retained_records: bundle.records.length,
140
+ matching_records: records.length,
141
+ unknown_revisions: bundle.unknowns.length,
142
+ records,
143
+ };
144
+ };
@@ -6,8 +6,23 @@ export const projectInputIssues = (issues, input) => issues.flatMap((issue) => p
6
6
  const projectIssue = (issue, input) => {
7
7
  const path = issue.path.flatMap((part) => typeof part === "string" || typeof part === "number" ? [part] : []);
8
8
  // Branch issue paths are relative to the union; branches often agree.
9
- if (issue.code === "invalid_union")
9
+ if (issue.code === "invalid_union") {
10
+ // Unmatched discriminators and ambiguous unions have no branch issues.
11
+ // Keep their outer failure instead of flattening it into an empty list.
12
+ if (issue.errors.length === 0) {
13
+ const expected = "options" in issue ? issue.options?.filter(isSafeExpected) : undefined;
14
+ return [
15
+ {
16
+ path,
17
+ reason: valueAtPath(input, path) === undefined
18
+ ? "missing_argument"
19
+ : "invalid_value",
20
+ ...(expected === undefined ? {} : { expected }),
21
+ },
22
+ ];
23
+ }
10
24
  return uniqueIssues(issue.errors.flatMap((branch) => branch.flatMap((branchIssue) => projectIssue({ ...branchIssue, path: [...issue.path, ...branchIssue.path] }, input))));
25
+ }
11
26
  if (issue.code === "invalid_key")
12
27
  return issue.issues.flatMap((keyIssue) => projectIssue({ ...keyIssue, path: [...issue.path, ...keyIssue.path] }, input));
13
28
  if (issue.code === "unrecognized_keys")
@@ -1,21 +1,21 @@
1
1
  import * as t from "@babel/types";
2
- import { boundedExpression, collectContextBridgeMembers, electronStaticValue, objectProperty, } from "./electronStaticAnalysisValues.js";
2
+ import { boundedExpression, collectContextBridgeMembers, electronCalleePath, electronStaticValue, objectProperty, } from "./electronStaticAnalysisValues.js";
3
3
  import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
4
4
  import { addLocatedFinding } from "./javascriptStaticAnalysisFindings.js";
5
- import { argumentNode, calleeName, range, staticPath, staticPathResolutionContext, } from "./javascriptStaticAnalysisHelpers.js";
5
+ import { argumentNode, range, staticPath, staticPathResolutionContext, } from "./javascriptStaticAnalysisHelpers.js";
6
6
  import { semanticStaticPropertyName } from "./javascriptAstValues.js";
7
7
  /** Inspect BrowserWindow, contextBridge, and utility-process syntax. */
8
8
  export const inspectElectronBrowserNode = (node, context) => {
9
9
  if (t.isNewExpression(node))
10
10
  inspectBrowserWindow(node, context);
11
- if (!t.isCallExpression(node))
11
+ if (!t.isCallExpression(node) && !t.isOptionalCallExpression(node))
12
12
  return;
13
13
  inspectContextBridge(node, context);
14
14
  inspectUtilityProcess(node, context);
15
15
  };
16
16
  const inspectBrowserWindow = (node, context) => {
17
- const name = calleeName(node.callee);
18
- if (name !== "BrowserWindow" && !name.endsWith(".BrowserWindow"))
17
+ const path = electronCalleePath(node.callee, context);
18
+ if (path?.length !== 1 || path[0] !== "BrowserWindow")
19
19
  return;
20
20
  const options = argumentNode(node.arguments[0]);
21
21
  const collected = collectWindowOptions(context.source, options);
@@ -34,7 +34,7 @@ const inspectBrowserWindow = (node, context) => {
34
34
  };
35
35
  addLocatedFinding(context, {
36
36
  collection: context.accumulator.browserWindows,
37
- key: `electron-window\0${name}`,
37
+ key: "electron-window\0BrowserWindow",
38
38
  node,
39
39
  value: finding,
40
40
  });
@@ -107,11 +107,10 @@ const collectWebPreferences = (source, object) => {
107
107
  };
108
108
  };
109
109
  const inspectContextBridge = (node, context) => {
110
- const name = calleeName(node.callee);
111
- const main = name === "contextBridge.exposeInMainWorld" ||
112
- name.endsWith(".contextBridge.exposeInMainWorld");
113
- const isolated = name === "contextBridge.exposeInIsolatedWorld" ||
114
- name.endsWith(".contextBridge.exposeInIsolatedWorld");
110
+ const path = electronCalleePath(node.callee, context);
111
+ const exposureMethod = path?.length === 2 && path[0] === "contextBridge" ? path[1] : undefined;
112
+ const main = exposureMethod === "exposeInMainWorld";
113
+ const isolated = exposureMethod === "exposeInIsolatedWorld";
115
114
  if (!main && !isolated)
116
115
  return;
117
116
  const keyNode = argumentNode(node.arguments[isolated ? 1 : 0]);
@@ -148,8 +147,8 @@ const inspectContextBridge = (node, context) => {
148
147
  });
149
148
  };
150
149
  const inspectUtilityProcess = (node, context) => {
151
- const name = calleeName(node.callee);
152
- if (name !== "utilityProcess.fork" && !name.endsWith(".utilityProcess.fork"))
150
+ const path = electronCalleePath(node.callee, context);
151
+ if (path?.length !== 2 || path[0] !== "utilityProcess" || path[1] !== "fork")
153
152
  return;
154
153
  const moduleNode = argumentNode(node.arguments[0]);
155
154
  const modulePath = moduleNode === undefined ? undefined : staticPath(moduleNode);
@@ -1,12 +1,12 @@
1
1
  import * as t from "@babel/types";
2
- import { boundedExpression, electronStaticValue, handlerKind, } from "./electronStaticAnalysisValues.js";
2
+ import { boundedExpression, electronCalleePath, electronStaticValue, handlerKind, } from "./electronStaticAnalysisValues.js";
3
3
  import { addLocatedFinding } from "./javascriptStaticAnalysisFindings.js";
4
4
  import { argumentNode, calleeName, range, } from "./javascriptStaticAnalysisHelpers.js";
5
5
  import { semanticStaticPropertyName } from "./javascriptAstValues.js";
6
6
  import { compositeKey } from "../unicodeCodePointOrder.js";
7
7
  /** Inspect Electron IPC operations and validation candidates. */
8
8
  export const inspectElectronIpcNode = (node, context) => {
9
- if (t.isCallExpression(node)) {
9
+ if (t.isCallExpression(node) || t.isOptionalCallExpression(node)) {
10
10
  inspectIpcCall(node, context);
11
11
  inspectValidationCall(node, context);
12
12
  }
@@ -14,8 +14,7 @@ export const inspectElectronIpcNode = (node, context) => {
14
14
  inspectValidationComparison(node, context);
15
15
  };
16
16
  const inspectIpcCall = (node, context) => {
17
- const name = calleeName(node.callee);
18
- const descriptor = ipcDescriptor(name);
17
+ const descriptor = ipcDescriptor(electronCalleePath(node.callee, context));
19
18
  if (descriptor === undefined)
20
19
  return;
21
20
  const channelNode = argumentNode(node.arguments[0]);
@@ -129,9 +128,12 @@ const addValidation = (context, node, input) => {
129
128
  value: finding,
130
129
  });
131
130
  };
132
- const ipcDescriptor = (name) => {
133
- const renderer = suffixOperation(name, "ipcRenderer");
134
- if (renderer !== undefined) {
131
+ const ipcDescriptor = (path) => {
132
+ if (path?.length !== 2)
133
+ return undefined;
134
+ const [object, operation] = path;
135
+ if (object === "ipcRenderer" && operation !== undefined) {
136
+ const renderer = operation;
135
137
  switch (renderer) {
136
138
  case "send":
137
139
  return { side: "renderer", operation: "send", mode: "send" };
@@ -157,7 +159,7 @@ const ipcDescriptor = (name) => {
157
159
  return { side: "renderer", operation: "once", mode: "listen" };
158
160
  }
159
161
  }
160
- const main = suffixOperation(name, "ipcMain");
162
+ const main = object === "ipcMain" ? operation : undefined;
161
163
  switch (main) {
162
164
  case "on":
163
165
  return { side: "main", operation: "on", mode: "listen" };
@@ -171,19 +173,8 @@ const ipcDescriptor = (name) => {
171
173
  return undefined;
172
174
  }
173
175
  };
174
- const suffixOperation = (name, object) => {
175
- const marker = `${object}.`;
176
- const index = name.lastIndexOf(marker);
177
- if (index < 0)
178
- return undefined;
179
- const prefix = name.slice(0, index);
180
- if (prefix !== "" && !prefix.endsWith("."))
181
- return undefined;
182
- const operation = name.slice(index + marker.length);
183
- return operation.includes(".") ? undefined : operation;
184
- };
185
176
  const senderSubject = (node) => {
186
- const name = t.isCallExpression(node)
177
+ const name = t.isCallExpression(node) || t.isOptionalCallExpression(node)
187
178
  ? calleeName(node.callee)
188
179
  : calleeName(node);
189
180
  if (/(?:^|\.)sender\.getURL$/u.test(name))