rea-agents 5.0.0 → 6.1.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 (507) hide show
  1. package/README.md +168 -655
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +173 -47
  4. package/bridge/hopper_bridge.py +310 -128
  5. package/bridge/mitmproxy/capture.py +208 -0
  6. package/bridge/native/rea_lldb_tracer.py +839 -0
  7. package/bridge/process/ProcessRunTokenReader.swift +297 -0
  8. package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
  9. package/bridge/pwndbg/core_context.py +101 -0
  10. package/bridge/pwndbg/launch.py +39 -0
  11. package/bridge/pwndbg/launch_impl.py +34 -0
  12. package/bridge/pwntools/decoder_runtime.py +59 -0
  13. package/bridge/pwntools/layout.py +39 -0
  14. package/bridge/pwntools/layout_impl.py +309 -0
  15. package/bridge/pwntools/recorded_crash.py +39 -0
  16. package/bridge/pwntools/recorded_crash_impl.py +147 -0
  17. package/dist/android/JadxConfiguration.js +196 -33
  18. package/dist/android/JadxMcpTransport.js +4 -0
  19. package/dist/android/JadxProtocol.js +6 -0
  20. package/dist/android/JadxProvider.js +20 -2
  21. package/dist/android/JadxSession.js +23 -4
  22. package/dist/application/AnalysisContextQueries.js +8 -35
  23. package/dist/application/AnalysisDocument.js +32 -0
  24. package/dist/application/AppBundleExecutable.js +67 -21
  25. package/dist/application/CallPathTracing.js +19 -3
  26. package/dist/application/CapabilityInventory.js +27 -3
  27. package/dist/application/ClientConfigurationDocument.js +871 -6
  28. package/dist/application/ClientRegistrationIdentity.js +26 -5
  29. package/dist/application/ClientRegistrationStatus.js +29 -14
  30. package/dist/application/DirectAnalysis.js +97 -33
  31. package/dist/application/Doctor.js +4 -2
  32. package/dist/application/DoctorScope.js +25 -13
  33. package/dist/application/EnhancedLiteralTracing.js +22 -25
  34. package/dist/application/EnhancedTools.js +13 -11
  35. package/dist/application/EvidenceBundleFiles.js +24 -12
  36. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  37. package/dist/application/InventoryProjectionEvidence.js +4 -3
  38. package/dist/application/InvestigationProviders.js +3 -2
  39. package/dist/application/JsonFiles.js +50 -28
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/ReconstructionCoverageService.js +7 -4
  42. package/dist/application/ReconstructionObligationCandidates.js +5 -1
  43. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  44. package/dist/application/Setup.js +13 -1
  45. package/dist/application/SetupClientConfiguration.js +10 -15
  46. package/dist/application/SetupHost.js +5 -2
  47. package/dist/application/SetupPlan.js +5 -3
  48. package/dist/application/SupportedClients.js +34 -1
  49. package/dist/application/Uninstall.js +4 -3
  50. package/dist/application/Update.js +18 -3
  51. package/dist/application/UpdateRuntime.js +46 -25
  52. package/dist/application/WebModuleTraceService.js +4 -2
  53. package/dist/application/WebNetworkCapturePort.js +1 -0
  54. package/dist/application/WebNetworkCaptureService.js +134 -0
  55. package/dist/application/WebRuntimeService.js +5 -3
  56. package/dist/application/WebScriptExportService.js +2 -2
  57. package/dist/application/WebSourceLocationService.js +4 -2
  58. package/dist/application/WindowsCapabilities.js +1 -1
  59. package/dist/application/WorkflowEvidence.js +82 -0
  60. package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
  61. package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
  62. package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
  63. package/dist/application/binary/BinarySession.js +131 -76
  64. package/dist/application/binary/BinarySessionOpen.js +19 -6
  65. package/dist/application/binary/BinarySessionRecords.js +45 -3
  66. package/dist/application/binary/BinarySessionStatus.js +17 -1
  67. package/dist/application/binary/CompositeProvider.js +13 -0
  68. package/dist/application/binary/LazyAnalysisProvider.js +3 -0
  69. package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
  70. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
  71. package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
  72. package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
  73. package/dist/application/evm/EvmInterfacePort.js +1 -0
  74. package/dist/application/evm/EvmInterfaceService.js +64 -0
  75. package/dist/application/investigation/EvidenceLedger.js +21 -7
  76. package/dist/application/investigation/InvestigationRecords.js +8 -0
  77. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  78. package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
  79. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  80. package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
  81. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  82. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
  83. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
  84. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
  85. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
  86. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  89. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
  90. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  91. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
  92. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
  93. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
  94. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
  95. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
  96. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
  97. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
  98. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
  99. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
  100. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
  101. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  102. package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
  103. package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
  104. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  105. package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
  106. package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
  107. package/dist/application/workflowInputError.js +18 -0
  108. package/dist/artifacts/ArtifactProvider.js +42 -5
  109. package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
  110. package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
  111. package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
  112. package/dist/artifacts/ZipArtifactReader.js +3 -0
  113. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
  114. package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
  115. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  116. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  117. package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
  118. package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
  119. package/dist/artifacts/apple/NibArchive.js +81 -14
  120. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  121. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  122. package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
  123. package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
  124. package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
  125. package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
  126. package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
  127. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
  128. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
  129. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  130. package/dist/artifacts/readStableArtifact.js +20 -4
  131. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  132. package/dist/browser/CdpCaptureEventHandlers.js +165 -12
  133. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  134. package/dist/browser/CdpCaptureEvents.js +34 -0
  135. package/dist/browser/CdpConnection.js +30 -11
  136. package/dist/browser/CdpOptionalCommand.js +2 -3
  137. package/dist/browser/CdpPageCapture.js +23 -1
  138. package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
  139. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  140. package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
  141. package/dist/browser/WebSourceMapFetcher.js +426 -72
  142. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  143. package/dist/browser/history/CaptureFailures.js +137 -0
  144. package/dist/browser/history/CaptureFormatError.js +10 -0
  145. package/dist/browser/history/CaptureRedaction.js +65 -0
  146. package/dist/browser/history/CaptureRelease.js +17 -0
  147. package/dist/browser/history/HarCapture.js +165 -0
  148. package/dist/browser/history/HarCaptureAdapter.js +20 -0
  149. package/dist/browser/history/HarCaptureProcess.js +57 -0
  150. package/dist/browser/history/HarJson.js +92 -0
  151. package/dist/browser/history/HarSchema.js +72 -0
  152. package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
  153. package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
  154. package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
  155. package/dist/cli/analysisSelector.js +23 -0
  156. package/dist/cli/applicationCommands.js +2 -3
  157. package/dist/cli/artifactCommands.js +26 -1
  158. package/dist/cli/binaryDiagnosticsCommands.js +39 -0
  159. package/dist/cli/coreAnalysisCommands.js +2 -2
  160. package/dist/cli/coreBinaryCommands.js +78 -20
  161. package/dist/cli/electronCommands.js +21 -13
  162. package/dist/cli/evmCommands.js +24 -0
  163. package/dist/cli/firmwareCommands.js +6 -3
  164. package/dist/cli/javascriptApplicationAnalysis.js +20 -3
  165. package/dist/cli/jsonOutput.js +38 -0
  166. package/dist/cli/nativeCallCommands.js +34 -0
  167. package/dist/cli/processCommands.js +1 -1
  168. package/dist/cli/streamedJsonOutput.js +56 -0
  169. package/dist/cli/utilityCommands.js +2 -0
  170. package/dist/cli/webNetworkCaptureCommands.js +40 -0
  171. package/dist/cli/webRuntimeCommands.js +8 -8
  172. package/dist/cli.js +11 -4
  173. package/dist/cliBrowserScenarioCommands.js +2 -2
  174. package/dist/cliCommandNames.js +6 -1
  175. package/dist/cliJsonInput.js +35 -1
  176. package/dist/cliOutput.js +21 -6
  177. package/dist/composition/binaryDiagnostics.js +8 -0
  178. package/dist/composition/evm.js +4 -0
  179. package/dist/composition/webNetworkCaptures.js +6 -0
  180. package/dist/config/environment.js +4 -0
  181. package/dist/config/ghidraStartupTimeout.js +17 -0
  182. package/dist/config/mcpResponseBudget.js +22 -0
  183. package/dist/config/parseConfig.js +2 -1
  184. package/dist/contracts/artifactToolContracts.js +6 -0
  185. package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
  186. package/dist/contracts/browserToolContracts.js +4 -3
  187. package/dist/contracts/enhancedInputs.js +5 -3
  188. package/dist/contracts/enhancedToolContracts.js +3 -3
  189. package/dist/contracts/errorSchemas.js +8 -1
  190. package/dist/contracts/evm/evmToolContracts.js +20 -0
  191. package/dist/contracts/hopperMemoryContracts.js +2 -5
  192. package/dist/contracts/investigationExamples.js +2 -2
  193. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  194. package/dist/contracts/managed/managedToolContracts.js +8 -6
  195. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
  196. package/dist/contracts/native/nativeToolContracts.js +21 -3
  197. package/dist/contracts/officialToolContracts.js +26 -24
  198. package/dist/contracts/process/processCaptureExample.js +2 -0
  199. package/dist/contracts/promptContracts.js +3 -3
  200. package/dist/contracts/sessionLifecycleInputs.js +18 -5
  201. package/dist/contracts/sessionStatusContract.js +8 -2
  202. package/dist/contracts/sessionToolContracts.js +8 -3
  203. package/dist/contracts/sessionToolSchemas.js +8 -4
  204. package/dist/contracts/toolContractExamples.js +1 -2
  205. package/dist/contracts/toolContractHelpers.js +4 -1
  206. package/dist/contracts/toolContracts.js +6 -0
  207. package/dist/contracts/toolEffects.js +30 -1
  208. package/dist/contracts/toolOutputSchemaGroups.js +33 -28
  209. package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
  210. package/dist/contracts/toolSchemaMetadata.js +69 -10
  211. package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
  212. package/dist/domain/analysisErrorBase.js +22 -2
  213. package/dist/domain/analysisErrorCore.js +61 -5
  214. package/dist/domain/analysisErrorPresentation.js +95 -12
  215. package/dist/domain/analysisErrorProjection.js +148 -19
  216. package/dist/domain/analysisSnapshot.js +166 -2
  217. package/dist/domain/android/androidAnalysis.js +2 -4
  218. package/dist/domain/android/androidApplication.js +17 -9
  219. package/dist/domain/apple/appleApplication.js +41 -14
  220. package/dist/domain/apple/dyldEnvironment.js +73 -0
  221. package/dist/domain/apple/dyldPaths.js +81 -0
  222. package/dist/domain/apple/dylibResolution.js +478 -0
  223. package/dist/domain/apple/dylibResolutionFindings.js +77 -0
  224. package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
  225. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  226. package/dist/domain/apple/keyedArchive.js +9 -1
  227. package/dist/domain/apple/machoContainer.js +54 -0
  228. package/dist/domain/apple/plistNumbers.js +76 -0
  229. package/dist/domain/artifactIdentity.js +29 -0
  230. package/dist/domain/artifactInventoryEvidence.js +19 -24
  231. package/dist/domain/artifactPathSyntax.js +1 -1
  232. package/dist/domain/bridgeCandidateProjection.js +71 -0
  233. package/dist/domain/browserCompleteness.js +1 -0
  234. package/dist/domain/browserObservation.js +1 -1
  235. package/dist/domain/browserObservationError.js +24 -5
  236. package/dist/domain/browserObservationSchemas.js +13 -0
  237. package/dist/domain/browserScenarioValues.js +5 -2
  238. package/dist/domain/bundleComparison.js +3 -2
  239. package/dist/domain/callPathSchemas.js +1 -1
  240. package/dist/domain/canonicalDigest.js +13 -1
  241. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  242. package/dist/domain/canonicalOrdering.js +9 -5
  243. package/dist/domain/changedBehavior.js +9 -9
  244. package/dist/domain/comparisonSourceEvidence.js +40 -0
  245. package/dist/domain/comparisonStatus.js +2 -30
  246. package/dist/domain/configurationErrors.js +1 -1
  247. package/dist/domain/conformanceTrustGate.js +0 -16
  248. package/dist/domain/evidence.js +78 -11
  249. package/dist/domain/evidenceBundle.js +42 -1
  250. package/dist/domain/evidenceErrors.js +12 -1
  251. package/dist/domain/evm/evmInterface.js +63 -0
  252. package/dist/domain/explicitSensitiveFailure.js +108 -0
  253. package/dist/domain/explicitSensitiveValues.js +10 -0
  254. package/dist/domain/firmware/firmwareAnalysis.js +10 -4
  255. package/dist/domain/hopperErrors.js +23 -2
  256. package/dist/domain/hopperValues.js +51 -8
  257. package/dist/domain/immutableJson.js +114 -0
  258. package/dist/domain/inputIssueProjection.js +3 -0
  259. package/dist/domain/javascript/electronActiveObservation.js +37 -6
  260. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  261. package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
  262. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  263. package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
  264. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  265. package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
  266. package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
  267. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  268. package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
  269. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  270. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  271. package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
  272. package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
  273. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  274. package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
  275. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  276. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  277. package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
  278. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  279. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  280. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  281. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
  282. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  283. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
  284. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  285. package/dist/domain/jsonSerialization.js +109 -0
  286. package/dist/domain/jsonValue.js +91 -3
  287. package/dist/domain/localPath.js +8 -0
  288. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  289. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  290. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  291. package/dist/domain/managed/managedNativeVerification.js +3 -9
  292. package/dist/domain/native/binaryLayout.js +357 -0
  293. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  294. package/dist/domain/native/nativeCallObservation.js +186 -0
  295. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  296. package/dist/domain/native/objcSwiftMetadata.js +0 -39
  297. package/dist/domain/native/recordedCrash.js +266 -0
  298. package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
  299. package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
  300. package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
  301. package/dist/domain/process/processCaptureParsing.js +54 -0
  302. package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
  303. package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
  304. package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
  305. package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
  306. package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
  307. package/dist/domain/propertyListKeys.js +1 -1
  308. package/dist/domain/propertyListXmlText.js +19 -0
  309. package/dist/domain/providerAdapterError.js +1 -1
  310. package/dist/domain/providerOperationHealth.js +54 -0
  311. package/dist/domain/providerSelectionError.js +4 -2
  312. package/dist/domain/reconstructionVerification.js +9 -46
  313. package/dist/domain/reconstructionVerificationSchemas.js +3 -3
  314. package/dist/domain/residualUnknown.js +3 -2
  315. package/dist/domain/staticRuntimeCorrelation.js +9 -46
  316. package/dist/domain/webBundleAnalysis.js +20 -8
  317. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  318. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  319. package/dist/domain/webCaptureDiff.js +1 -0
  320. package/dist/domain/webNetworkCapture.js +118 -0
  321. package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
  322. package/dist/domain/webRuntime.js +19 -5
  323. package/dist/domain/webSourceLocation.js +1 -0
  324. package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
  325. package/dist/dotnet/ManagedMemberInspector.js +4 -2
  326. package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
  327. package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
  328. package/dist/dotnet/ManagedMemberRows.js +14 -3
  329. package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
  330. package/dist/dotnet/ManagedMetadataInventory.js +38 -28
  331. package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
  332. package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
  333. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
  334. package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
  335. package/dist/dotnet/ManagedPeReader.js +11 -0
  336. package/dist/evm/EvmBytecodeCarrier.js +21 -0
  337. package/dist/evm/EvmWorkerLimits.js +40 -0
  338. package/dist/evm/EvmoleFailures.js +126 -0
  339. package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
  340. package/dist/evm/EvmoleInterfaceProvider.js +273 -0
  341. package/dist/evm/EvmoleInterfaceWorker.js +87 -0
  342. package/dist/evm/EvmoleRelease.js +16 -0
  343. package/dist/firmware/FirmwareCommand.js +1 -0
  344. package/dist/firmware/FirmwareFiles.js +1 -1
  345. package/dist/generatedPackageMetadata.js +2 -2
  346. package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
  347. package/dist/ghidra/GhidraClient.js +47 -14
  348. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  349. package/dist/ghidra/GhidraFunctionValues.js +10 -7
  350. package/dist/ghidra/GhidraInstallation.js +18 -21
  351. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  352. package/dist/ghidra/GhidraJavaLaunch.js +62 -0
  353. package/dist/ghidra/GhidraLauncher.js +34 -16
  354. package/dist/ghidra/GhidraProvider.js +2 -2
  355. package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
  356. package/dist/ghidra/GhidraProviderClient.js +23 -12
  357. package/dist/ghidra/GhidraSessionError.js +11 -7
  358. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  359. package/dist/ghidra/GhidraTransport.js +20 -0
  360. package/dist/hopper/BridgeLauncher.js +33 -11
  361. package/dist/hopper/HopperAnalysisProfile.js +62 -4
  362. package/dist/hopper/HopperCleanup.js +15 -3
  363. package/dist/hopper/HopperClient.js +222 -14
  364. package/dist/hopper/HopperFileOffset.js +237 -0
  365. package/dist/hopper/HopperMachOImage.js +196 -0
  366. package/dist/hopper/HopperOperationStage.js +6 -0
  367. package/dist/hopper/HopperProvider.js +63 -9
  368. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  369. package/dist/hopper/HopperRegexSearch.js +137 -0
  370. package/dist/hopper/HopperRegexWorker.js +27 -0
  371. package/dist/hopper/HopperRequestQueue.js +68 -19
  372. package/dist/hopper/HopperTargetLease.js +3 -2
  373. package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
  374. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  375. package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
  376. package/dist/inspector/V8InspectorProvider.js +47 -11
  377. package/dist/javascript/recovery/WakaruCommand.js +3 -0
  378. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  379. package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
  380. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  381. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  382. package/dist/mcpDoctor.js +62 -2
  383. package/dist/native/AppleDispatchCoverage.js +47 -6
  384. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  385. package/dist/native/AppleDispatchMetadata.js +6 -3
  386. package/dist/native/AppleMachoFixups.js +48 -24
  387. package/dist/native/AppleMachoSelection.js +32 -16
  388. package/dist/native/AppleObjcCategories.js +6 -2
  389. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  390. package/dist/native/AppleObjcProperties.js +2 -1
  391. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  392. package/dist/native/AppleSwiftVtables.js +21 -15
  393. package/dist/native/CommandRunner.js +82 -84
  394. package/dist/native/LldbCallTracer.js +541 -0
  395. package/dist/native/LldbRetainedObservations.js +178 -0
  396. package/dist/native/NativeCallObservation.js +194 -0
  397. package/dist/native/NativeMacOSProvider.js +117 -20
  398. package/dist/native/NativeMacOSProviderMetadata.js +8 -3
  399. package/dist/native/SignatureTargetBinding.js +155 -0
  400. package/dist/native/parsers/lipo.js +71 -1
  401. package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
  402. package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
  403. package/dist/native/pwntools/PwntoolsFailures.js +180 -0
  404. package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
  405. package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
  406. package/dist/native/pwntools/PwntoolsRelease.js +19 -0
  407. package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
  408. package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
  409. package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
  410. package/dist/process/DarwinProcessRunTokenReader.js +293 -0
  411. package/dist/process/ExecFileOutput.js +20 -0
  412. package/dist/process/OwnedCommand.js +118 -0
  413. package/dist/process/ProcessOwnership.js +431 -51
  414. package/dist/process/ProcessOwnershipObservation.js +209 -27
  415. package/dist/process/ProviderProcess.js +68 -10
  416. package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
  417. package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
  418. package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
  419. package/dist/{application → process/capture}/ProcessHarness.js +195 -29
  420. package/dist/{application → process/capture}/ProcessSampling.js +2 -2
  421. package/dist/server/EvidenceMcpServer.js +146 -0
  422. package/dist/server/createServer.js +37 -8
  423. package/dist/server/promptCompletion.js +10 -3
  424. package/dist/server/registerAndroidTools.js +2 -4
  425. package/dist/server/registerApplicationTools/helpers.js +2 -4
  426. package/dist/server/registerArtifactComparisonTool.js +11 -7
  427. package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
  428. package/dist/server/registerBrowserScenarioTool.js +2 -4
  429. package/dist/server/registerBrowserTools.js +2 -4
  430. package/dist/server/registerBundleComparisonTool.js +2 -3
  431. package/dist/server/registerCloseLifecycleTool.js +8 -18
  432. package/dist/server/registerElectronTools.js +2 -4
  433. package/dist/server/registerEnhancedTools.js +18 -59
  434. package/dist/server/registerEvidenceTools.js +3 -5
  435. package/dist/server/registerEvmTools.js +15 -0
  436. package/dist/server/registerFirmwareTools.js +2 -4
  437. package/dist/server/registerFunctionComparisonTool.js +10 -6
  438. package/dist/server/registerInvestigationTools.js +7 -7
  439. package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
  440. package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
  441. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
  442. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
  443. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
  444. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
  445. package/dist/server/registerOfficialTools.js +2 -4
  446. package/dist/server/registerProcessComparisonTool.js +72 -46
  447. package/dist/server/registerRecordedCrashTools.js +15 -0
  448. package/dist/server/registerSessionRecordTools.js +5 -6
  449. package/dist/server/registerSessionStatusTool.js +17 -3
  450. package/dist/server/registerSessionTools.js +13 -5
  451. package/dist/server/registerWebModuleTool.js +2 -4
  452. package/dist/server/registerWebNetworkCaptureTool.js +26 -0
  453. package/dist/server/registerWebRuntimeTools.js +3 -7
  454. package/dist/server/registerWebScriptTool.js +2 -4
  455. package/dist/server/registerWebSourceLocationTool.js +2 -4
  456. package/dist/server/runDerivedOperation.js +15 -3
  457. package/dist/server/sessionAvailabilityPolicy.js +3 -1
  458. package/dist/server/sessionToolPolicies.js +1 -1
  459. package/dist/server/toolRegistrationOptions.js +2 -2
  460. package/dist/server/toolResult.js +63 -11
  461. package/dist/server/toolResultEncoding.js +33 -0
  462. package/install.sh +1 -1
  463. package/native/windows/build/manifest.json +2 -2
  464. package/native/windows/build/rea-windows-x64.node +0 -0
  465. package/package.json +42 -9
  466. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  467. package/scripts/electron-active-hook.cjs +241 -37
  468. package/scripts/rea.mjs +11 -3
  469. package/skills/reverse-engineer-anything/SKILL.md +32 -4
  470. package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
  471. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
  472. package/third_party/README.md +60 -0
  473. package/third_party/evmole/LICENSE +21 -0
  474. package/third_party/evmole/README.md +22 -0
  475. package/third_party/pwndbg/LICENSE.md +21 -0
  476. package/third_party/pwndbg/README.md +23 -0
  477. package/third_party/pwntools/README.md +40 -0
  478. package/dist/application/AuthorizedArtifactInventory.js +0 -7
  479. package/dist/application/ProcessCaptureLifecycle.js +0 -299
  480. package/dist/application/StoreFileLock.js +0 -124
  481. package/dist/contracts/processCaptureExample.js +0 -2
  482. package/dist/domain/bytecodeProvider.js +0 -178
  483. package/dist/domain/customProtocolCapture.js +0 -137
  484. package/dist/domain/eventProcessTree.js +0 -225
  485. package/dist/domain/mobileApplicationInvestigation.js +0 -159
  486. package/dist/domain/packageAnalysis.js +0 -123
  487. package/dist/domain/peInspection.js +0 -197
  488. package/dist/domain/processCaptureParsing.js +0 -21
  489. package/dist/domain/protocolCapture.js +0 -217
  490. package/dist/domain/runtimeIdentification.js +0 -212
  491. package/dist/generatedMcpToolCatalog.js +0 -37
  492. package/dist/ghidra/GhidraDefaults.js +0 -2
  493. /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
  494. /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
  495. /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
  496. /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
  497. /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
  498. /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
  499. /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
  500. /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
  501. /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
  502. /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
  503. /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
  504. /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
  505. /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
  506. /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
  507. /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
@@ -1,16 +1,32 @@
1
1
  import * as t from "@babel/types";
2
2
  import { compareCodePoints } from "../canonicalOrdering.js";
3
3
  import { semanticPrimitiveKey } from "./javascriptSemanticProvenance.js";
4
+ import { readExactJavaScriptLiteral } from "./javascriptAstValues.js";
5
+ import { SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, exceedsSemanticPrimitiveStringByteBudget, semanticResourceLimitUnknown, } from "./javascriptSemanticResourceLimits.js";
6
+ /**
7
+ * Keep eight independent binary choices exact, while bounding the next
8
+ * exponential expansion before it allocates hundreds more alternatives.
9
+ */
10
+ export const MAX_SEMANTIC_PRIMITIVE_CANDIDATES = SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT;
4
11
  /** Normalize one bounded collection of possible primitive values. */
5
12
  export const semanticPrimitiveSet = (values) => {
6
- if (values.some((value) => typeof value === "number" && !Number.isFinite(value)))
7
- return {
8
- status: "unknown",
9
- reason: "Nonfinite numbers are outside the JSON primitive lattice.",
10
- };
11
- const unique = [
12
- ...new Map(values.map((value) => [semanticPrimitiveKey(value), value])).values(),
13
- ].sort((left, right) => compareCodePoints(semanticPrimitiveKey(left), semanticPrimitiveKey(right)));
13
+ const uniqueValues = new Set();
14
+ for (const value of values) {
15
+ if (typeof value === "number" && !Number.isFinite(value))
16
+ return {
17
+ status: "unknown",
18
+ reason: "Nonfinite numbers are outside the JSON primitive lattice.",
19
+ };
20
+ uniqueValues.add(value);
21
+ if (uniqueValues.size > MAX_SEMANTIC_PRIMITIVE_CANDIDATES)
22
+ return semanticResourceLimitUnknown("primitive-candidates");
23
+ }
24
+ if (exceedsSemanticPrimitiveStringByteBudget([...uniqueValues].flatMap((value) => typeof value === "string" ? [value] : [])))
25
+ return semanticResourceLimitUnknown("primitive-bytes");
26
+ const unique = [...uniqueValues]
27
+ .map((value) => ({ key: semanticPrimitiveKey(value), value }))
28
+ .sort((left, right) => compareCodePoints(left.key, right.key))
29
+ .map(({ value }) => value);
14
30
  const only = unique[0];
15
31
  return unique.length === 1 && only !== undefined
16
32
  ? { status: "literal", value: only }
@@ -24,13 +40,5 @@ export const semanticPrimitiveCandidates = (value) => value.status === "literal"
24
40
  : null;
25
41
  /** Parse one Babel primitive literal without evaluating code. */
26
42
  export const semanticPrimitiveValue = (node) => {
27
- if (t.isStringLiteral(node))
28
- return { found: true, value: node.value };
29
- if (t.isNumericLiteral(node) && Number.isFinite(node.value))
30
- return { found: true, value: node.value };
31
- if (t.isBooleanLiteral(node))
32
- return { found: true, value: node.value };
33
- if (t.isNullLiteral(node))
34
- return { found: true, value: null };
35
- return { found: false };
43
+ return readExactJavaScriptLiteral(node);
36
44
  };
@@ -4,12 +4,16 @@ import { jsonValueSchema } from "../jsonValue.js";
4
4
  import { digestSchema } from "../digests.js";
5
5
  import { prefixedDigestSchema } from "../digests.js";
6
6
  const semanticNodeIdSchema = prefixedDigestSchema("jsrg_node");
7
+ const literalValueSchema = jsonValueSchema.refine((value) => value === null ||
8
+ typeof value === "string" ||
9
+ typeof value === "number" ||
10
+ typeof value === "boolean", "Literal seeds accept only JSON primitive values");
11
+ // Zod derivations drop the shared schema's JSON Schema projection override;
12
+ // re-apply it so MCP catalog generation keeps projecting `{}`.
13
+ literalValueSchema._zod.toJSONSchema = () => ({});
7
14
  const literalSeedSchema = z.strictObject({
8
15
  kind: z.literal("literal"),
9
- value: jsonValueSchema.refine((value) => value === null ||
10
- typeof value === "string" ||
11
- typeof value === "number" ||
12
- typeof value === "boolean", "Literal seeds accept only JSON primitive values"),
16
+ value: literalValueSchema,
13
17
  });
14
18
  /** Authenticated starting points accepted by semantic tracing. */
15
19
  export const javaScriptSemanticQuerySeedSchema = z.discriminatedUnion("kind", [
@@ -0,0 +1,77 @@
1
+ /** Maximum distinct alternatives retained in one normalized primitive value. */
2
+ export const SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT = 256;
3
+ /** Maximum active expression nesting during inert semantic evaluation. */
4
+ export const SEMANTIC_EXPRESSION_DEPTH_LIMIT = 256;
5
+ /** Bound normalized strings and transient keys independently of transport limits. */
6
+ export const SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT = 1_048_576;
7
+ const RESOURCE_LIMIT_REASON = {
8
+ "primitive-candidates": "Primitive candidate budget exceeded (maximum 256 alternatives).",
9
+ "primitive-bytes": "Primitive string-byte budget exceeded (maximum 1048576 estimated JSON bytes).",
10
+ "expression-depth": "Semantic expression depth budget exceeded (maximum 256 nested expressions).",
11
+ };
12
+ /** Check UTF-16 length against worst-case JSON escaping without flattening. */
13
+ const jsonStringBytesFromLength = (codeUnits) => codeUnits * 6 + 2;
14
+ /** Bound string payload before JSON key serialization or candidate creation. */
15
+ export const exceedsSemanticPrimitiveStringByteBudget = (strings) => {
16
+ let total = 0;
17
+ for (const value of strings) {
18
+ total += jsonStringBytesFromLength(value.length);
19
+ if (total > SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT)
20
+ return true;
21
+ }
22
+ return false;
23
+ };
24
+ /** Bound all outputs of a primitive addition before concatenating any. */
25
+ export const exceedsSemanticPrimitiveAdditionByteBudget = (left, right) => {
26
+ let total = 0;
27
+ for (const leftValue of left) {
28
+ for (const rightValue of right) {
29
+ if (typeof leftValue !== "string" && typeof rightValue !== "string")
30
+ continue;
31
+ const length = String(leftValue).length + String(rightValue).length;
32
+ total += jsonStringBytesFromLength(length);
33
+ if (total > SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT)
34
+ return true;
35
+ }
36
+ }
37
+ return false;
38
+ };
39
+ /** Bound template interpolation outputs before creating concatenated strings. */
40
+ export const exceedsSemanticTemplateByteBudget = (prefixes, suffixes) => {
41
+ let total = 0;
42
+ for (const prefix of prefixes) {
43
+ for (const suffix of suffixes) {
44
+ total += jsonStringBytesFromLength(prefix.length + suffix.length);
45
+ if (total > SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT)
46
+ return true;
47
+ }
48
+ }
49
+ return false;
50
+ };
51
+ /** Make an explicit unknown value tagged with the semantic resource bound. */
52
+ export const semanticResourceLimitUnknown = (resourceLimit) => ({
53
+ status: "unknown",
54
+ reason: RESOURCE_LIMIT_REASON[resourceLimit],
55
+ resourceLimit,
56
+ });
57
+ /** Collect resource-limit classifications from nested semantic values. */
58
+ export const semanticResourceLimitsIn = (values) => {
59
+ const found = new Set();
60
+ const pending = [...values];
61
+ while (pending.length > 0) {
62
+ const value = pending.pop();
63
+ if (value === undefined)
64
+ continue;
65
+ if (value.status === "unknown" && value.resourceLimit !== undefined)
66
+ found.add(value.resourceLimit);
67
+ else if (value.status === "object")
68
+ for (const property of value.properties)
69
+ pending.push(property.value);
70
+ else if (value.status === "array")
71
+ for (const item of value.items)
72
+ pending.push(item);
73
+ }
74
+ return [...found].sort();
75
+ };
76
+ /** Display label for one stable resource classification. */
77
+ export const semanticResourceLimitReason = (resourceLimit) => RESOURCE_LIMIT_REASON[resourceLimit];
@@ -5,16 +5,46 @@ import { semanticRequireOrigin } from "./javascriptSemanticRequireOrigin.js";
5
5
  import { compareCodePoints } from "../canonicalOrdering.js";
6
6
  import { semanticStaticPropertyKey } from "./javascriptAstValues.js";
7
7
  import { semanticAmbiguousProvenance, semanticLocalProvenance, semanticOriginsProvenance, semanticUnresolvedProvenance, uniqueSemanticOrigins, } from "./javascriptSemanticProvenance.js";
8
- import { semanticPrimitiveCandidates as primitiveCandidates, semanticPrimitiveSet as primitiveSet, semanticPrimitiveValue as primitiveValue, } from "./javascriptSemanticPrimitives.js";
8
+ import { MAX_SEMANTIC_PRIMITIVE_CANDIDATES, semanticPrimitiveCandidates as primitiveCandidates, semanticPrimitiveSet as primitiveSet, semanticPrimitiveValue as primitiveValue, } from "./javascriptSemanticPrimitives.js";
9
+ import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, exceedsSemanticPrimitiveAdditionByteBudget, exceedsSemanticTemplateByteBudget, semanticResourceLimitUnknown, semanticResourceLimitReason, } from "./javascriptSemanticResourceLimits.js";
10
+ const primitiveBindingValuesByState = new WeakMap();
11
+ const primitiveBindingValuesFor = (state) => {
12
+ const existing = primitiveBindingValuesByState.get(state);
13
+ if (existing !== undefined)
14
+ return existing;
15
+ const values = new Map();
16
+ primitiveBindingValuesByState.set(state, values);
17
+ return values;
18
+ };
19
+ // Cap expression recursion independently from graph nodes and primitive unions.
20
+ const isSemanticResourceLimit = (value) => value.status === "unknown" && value.resourceLimit !== undefined;
9
21
  /** Evaluate one binding in the bounded constant-value lattice. */
10
- export const evaluateSemanticBinding = (binding, state) => evaluateBinding(binding, { state, bindings: new Set() });
22
+ export const evaluateSemanticBinding = (binding, state) => evaluateBinding(binding, {
23
+ state,
24
+ bindings: new Set(),
25
+ expressionDepth: 0,
26
+ primitiveBindingValues: primitiveBindingValuesFor(state),
27
+ });
11
28
  /** Evaluate one arbitrary inert expression in the established lexical state. */
12
- export const evaluateSemanticExpression = (node, state) => evaluateExpression(node, { state, bindings: new Set() });
29
+ export const evaluateSemanticExpression = (node, state) => evaluateExpression(node, {
30
+ state,
31
+ bindings: new Set(),
32
+ expressionDepth: 0,
33
+ primitiveBindingValues: primitiveBindingValuesFor(state),
34
+ });
13
35
  /** Follow module provenance through destructuring, members, and aliases. */
14
- export const evaluateSemanticProvenance = (binding, state) => provenanceForBinding(binding, { state, bindings: new Set() });
36
+ export const evaluateSemanticProvenance = (binding, state) => provenanceForBinding(binding, {
37
+ state,
38
+ bindings: new Set(),
39
+ expressionDepth: 0,
40
+ primitiveBindingValues: primitiveBindingValuesFor(state),
41
+ });
15
42
  const evaluateBinding = (binding, context) => {
16
43
  if (context.bindings.has(binding.bindingId))
17
44
  return { status: "cycle", reason: `Alias cycle at ${binding.name}.` };
45
+ const cached = context.primitiveBindingValues.get(binding.bindingId);
46
+ if (cached !== undefined)
47
+ return cached;
18
48
  if (binding.initializers.length === 0)
19
49
  return {
20
50
  status: "unknown",
@@ -30,9 +60,18 @@ const evaluateBinding = (binding, context) => {
30
60
  return { status: "unknown", reason: "Missing binding initializer." };
31
61
  const nested = nestedContext(context, binding.bindingId);
32
62
  const value = projectValue(evaluateExpression(initializer.node, nested), initializer.projection);
33
- return binding.mutatedPaths.reduce(invalidateSemanticMutationPath, value);
63
+ const projected = binding.mutatedPaths.reduce(invalidateSemanticMutationPath, value);
64
+ if (projected.status === "literal" ||
65
+ projected.status === "union" ||
66
+ (isSemanticResourceLimit(projected) &&
67
+ (projected.resourceLimit === "primitive-bytes" ||
68
+ projected.resourceLimit === "primitive-candidates")))
69
+ context.primitiveBindingValues.set(binding.bindingId, projected);
70
+ return projected;
34
71
  };
35
72
  const evaluateExpression = (node, context) => {
73
+ if (context.expressionDepth > SEMANTIC_EXPRESSION_DEPTH_LIMIT)
74
+ return semanticResourceLimitUnknown("expression-depth");
36
75
  const literal = primitiveValue(node);
37
76
  if (literal.found)
38
77
  return { status: "literal", value: literal.value };
@@ -75,18 +114,31 @@ const evaluateTemplate = (node, context) => {
75
114
  let candidates = [""];
76
115
  for (let index = 0; index < node.quasis.length; index += 1) {
77
116
  const quasi = node.quasis[index];
117
+ // Semantic template evaluation retains its established raw fallback for
118
+ // synthetic AST inputs; exact atom readers remain cooked-only.
78
119
  const text = quasi?.value.cooked ?? quasi?.value.raw ?? "";
120
+ if (exceedsSemanticTemplateByteBudget(candidates, [text]))
121
+ return semanticResourceLimitUnknown("primitive-bytes");
79
122
  candidates = candidates.map((prefix) => `${prefix}${text}`);
80
123
  const expression = node.expressions[index];
81
124
  if (expression === undefined)
82
125
  continue;
83
- const values = primitiveCandidates(evaluateExpression(expression, nestedContext(context)));
84
- if (values === null)
126
+ const evaluated = evaluateExpression(expression, nestedContext(context));
127
+ const values = primitiveCandidates(evaluated);
128
+ if (values === null) {
129
+ if (isSemanticResourceLimit(evaluated))
130
+ return evaluated;
85
131
  return {
86
132
  status: "unknown",
87
133
  reason: "Template expression is not a bounded primitive.",
88
134
  };
89
- candidates = candidates.flatMap((prefix) => values.map((value) => `${prefix}${String(value)}`));
135
+ }
136
+ if (candidates.length > SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT / values.length)
137
+ return semanticResourceLimitUnknown("primitive-candidates");
138
+ const suffixes = values.map((value) => String(value));
139
+ if (exceedsSemanticTemplateByteBudget(candidates, suffixes))
140
+ return semanticResourceLimitUnknown("primitive-bytes");
141
+ candidates = candidates.flatMap((prefix) => suffixes.map((suffix) => `${prefix}${suffix}`));
90
142
  }
91
143
  return primitiveSet(candidates);
92
144
  };
@@ -231,17 +283,30 @@ const evaluateAddition = (node, context) => {
231
283
  const addPrimitiveValues = (leftValue, rightValue) => {
232
284
  const left = primitiveCandidates(leftValue);
233
285
  const right = primitiveCandidates(rightValue);
234
- if (left === null || right === null)
286
+ if (left === null || right === null) {
287
+ if (isSemanticResourceLimit(leftValue))
288
+ return leftValue;
289
+ if (isSemanticResourceLimit(rightValue))
290
+ return rightValue;
235
291
  return { status: "unknown", reason: "Non-primitive addition." };
292
+ }
293
+ if (left.length > MAX_SEMANTIC_PRIMITIVE_CANDIDATES / right.length)
294
+ return semanticResourceLimitUnknown("primitive-candidates");
295
+ if (exceedsSemanticPrimitiveAdditionByteBudget(left, right))
296
+ return semanticResourceLimitUnknown("primitive-bytes");
236
297
  const values = left.flatMap((leftValue) => right.map((rightValue) => typeof leftValue === "string" || typeof rightValue === "string"
237
298
  ? `${String(leftValue)}${String(rightValue)}`
238
299
  : Number(leftValue) + Number(rightValue)));
239
300
  return primitiveSet(values);
240
301
  };
241
302
  const evaluateUnary = (node, context) => {
242
- const argument = primitiveCandidates(evaluateExpression(node.argument, nestedContext(context)));
243
- if (argument === null)
303
+ const evaluated = evaluateExpression(node.argument, nestedContext(context));
304
+ const argument = primitiveCandidates(evaluated);
305
+ if (argument === null) {
306
+ if (isSemanticResourceLimit(evaluated))
307
+ return evaluated;
244
308
  return { status: "unknown", reason: "Non-primitive unary operand." };
309
+ }
245
310
  if (node.operator === "!")
246
311
  return primitiveSet(argument.map((value) => !value));
247
312
  if (node.operator === "+")
@@ -318,6 +383,8 @@ const provenanceForBinding = (binding, context) => {
318
383
  })));
319
384
  };
320
385
  const provenanceForExpression = (node, context) => {
386
+ if (context.expressionDepth > SEMANTIC_EXPRESSION_DEPTH_LIMIT)
387
+ return semanticUnresolvedProvenance("unknown", semanticResourceLimitReason("expression-depth"));
321
388
  const required = semanticRequireOrigin(node, context.state);
322
389
  if (required !== undefined)
323
390
  return semanticOriginsProvenance([required]);
@@ -364,6 +431,9 @@ const provenanceForExpression = (node, context) => {
364
431
  return semanticLocalProvenance();
365
432
  };
366
433
  const mergeValues = (values) => {
434
+ const resourceLimit = values.find(isSemanticResourceLimit);
435
+ if (resourceLimit !== undefined)
436
+ return resourceLimit;
367
437
  const primitives = values.flatMap((value) => primitiveCandidates(value) ?? []);
368
438
  return values.every((value) => value.status === "union" || value.status === "literal")
369
439
  ? primitiveSet(primitives)
@@ -371,6 +441,8 @@ const mergeValues = (values) => {
371
441
  };
372
442
  const nestedContext = (context, bindingId) => ({
373
443
  state: context.state,
444
+ primitiveBindingValues: context.primitiveBindingValues,
445
+ expressionDepth: context.expressionDepth + 1,
374
446
  bindings: bindingId === undefined
375
447
  ? context.bindings
376
448
  : new Set([...context.bindings, bindingId]),
@@ -1,6 +1,6 @@
1
1
  import { parse } from "@babel/parser";
2
2
  /** Parse JavaScript or TypeScript once without attaching comments to AST nodes. */
3
- export const parseJavaScriptSource = (source) => {
3
+ export const parseJavaScriptSource = (source, sourcePath) => {
4
4
  try {
5
5
  return parse(source, {
6
6
  sourceType: "unambiguous",
@@ -10,7 +10,11 @@ export const parseJavaScriptSource = (source) => {
10
10
  // forms, including parameter decorators. Without it a decorated
11
11
  // TypeScript source fails to parse at all rather than reporting
12
12
  // recovered syntax, which loses every fact derived from that source.
13
- plugins: ["decorators-legacy", "jsx", "typescript"],
13
+ // Plain .ts artifacts admit angle-bracket type assertions instead of JSX.
14
+ // Unknown paths retain the existing JSX-capable parser contract.
15
+ plugins: sourcePath?.toLowerCase().endsWith(".ts") === true
16
+ ? ["decorators-legacy", "typescript"]
17
+ : ["decorators-legacy", "jsx", "typescript"],
14
18
  });
15
19
  }
16
20
  catch (cause) {
@@ -6,26 +6,27 @@ import { addReference, addSourceMapDirectives, inspectCall, inspectRouteProperty
6
6
  import { inspectBundlerRegistration, inspectEsbuildWrapper, } from "./javascriptStaticAnalysisBundler.js";
7
7
  import { finalizeLocatedFindings } from "./javascriptStaticAnalysisFindings.js";
8
8
  import { createJavaScriptAnalysisAccumulator, } from "./javascriptStaticAnalysisState.js";
9
+ import { classifyParsedJavaScriptOpenReceivers, } from "./javascriptSemanticAnalysis.js";
9
10
  import { parseJavaScriptSource, } from "./javascriptSourceParser.js";
10
11
  /** Parse one JavaScript artifact and recover static structure only. */
11
12
  export const analyzeJavaScriptStaticSource = (source) => {
12
13
  const file = parseJavaScriptSource(source);
13
14
  return file === null
14
15
  ? failedJavaScriptStaticAnalysis()
15
- : analyzeParsedJavaScriptStaticSource(source, file);
16
+ : analyzeParsedJavaScriptStaticSource(source, file, classifyParsedJavaScriptOpenReceivers(file));
16
17
  };
17
18
  /** Recover static structure from an already parsed JavaScript artifact. */
18
- export const analyzeParsedJavaScriptStaticSource = (source, file) => {
19
- const accumulator = createJavaScriptAnalysisAccumulator();
20
- traverseStaticSource(source, file, accumulator);
19
+ export const analyzeParsedJavaScriptStaticSource = (source, file, openReceiverFacts) => {
20
+ const accumulator = createJavaScriptAnalysisAccumulator(source.length);
21
+ traverseStaticSource(source, file, accumulator, openReceiverFacts);
21
22
  addSourceMapDirectives(source, file.comments ?? [], accumulator);
22
23
  return finalizeStaticAnalysis(source, file, accumulator);
23
24
  };
24
- const traverseStaticSource = (source, file, accumulator) => {
25
+ const traverseStaticSource = (source, file, accumulator, openReceiverFacts) => {
25
26
  traverseJavaScriptAst(file, {
26
27
  enter: (node) => {
27
28
  accumulator.visitedNodes += 1;
28
- inspectNode(source, node, accumulator);
29
+ inspectNode(source, node, accumulator, openReceiverFacts);
29
30
  return undefined;
30
31
  },
31
32
  });
@@ -51,28 +52,29 @@ const finalizeStaticAnalysis = (source, file, accumulator) => {
51
52
  : "complete",
52
53
  parse_error_count: parserErrors,
53
54
  visited_ast_nodes: accumulator.visitedNodes,
54
- references: finalizeLocatedFindings(accumulator.references, accumulator.modules),
55
- endpoints: finalizeLocatedFindings(accumulator.endpoints, accumulator.modules),
56
- storage: finalizeLocatedFindings(accumulator.storage, accumulator.modules),
55
+ references: finalizeLocatedFindings(accumulator.references, accumulator.moduleRangeIndex),
56
+ endpoints: finalizeLocatedFindings(accumulator.endpoints, accumulator.moduleRangeIndex),
57
+ storage: finalizeLocatedFindings(accumulator.storage, accumulator.moduleRangeIndex),
57
58
  bundler_registrations: sortedUnique(accumulator.registrations, registrationKey),
58
- role_paths: finalizeLocatedFindings(accumulator.roles, accumulator.modules),
59
+ role_paths: finalizeLocatedFindings(accumulator.roles, accumulator.moduleRangeIndex),
59
60
  source_map_urls: accumulator.sourceMaps,
60
61
  vendors: detectVendors(source),
61
62
  electron: {
62
- browser_windows: finalizeLocatedFindings(accumulator.browserWindows, accumulator.modules),
63
- context_bridge_apis: finalizeLocatedFindings(accumulator.contextBridgeApis, accumulator.modules),
64
- ipc: finalizeLocatedFindings(accumulator.ipc, accumulator.modules),
65
- sender_validations: finalizeLocatedFindings(accumulator.senderValidations, accumulator.modules),
66
- utility_processes: finalizeLocatedFindings(accumulator.utilityProcesses, accumulator.modules),
67
- native_addon_bindings: finalizeLocatedFindings(accumulator.nativeAddonBindings, accumulator.modules),
63
+ browser_windows: finalizeLocatedFindings(accumulator.browserWindows, accumulator.moduleRangeIndex),
64
+ context_bridge_apis: finalizeLocatedFindings(accumulator.contextBridgeApis, accumulator.moduleRangeIndex),
65
+ ipc: finalizeLocatedFindings(accumulator.ipc, accumulator.moduleRangeIndex),
66
+ sender_validations: finalizeLocatedFindings(accumulator.senderValidations, accumulator.moduleRangeIndex),
67
+ utility_processes: finalizeLocatedFindings(accumulator.utilityProcesses, accumulator.moduleRangeIndex),
68
+ native_addon_bindings: finalizeLocatedFindings(accumulator.nativeAddonBindings, accumulator.moduleRangeIndex),
68
69
  },
69
70
  limitations,
70
71
  };
71
72
  };
72
- const inspectNode = (source, node, accumulator) => {
73
+ const inspectNode = (source, node, accumulator, openReceiverFacts) => {
73
74
  const findings = {
74
75
  source,
75
76
  accumulator,
77
+ ...(openReceiverFacts === undefined ? {} : { openReceiverFacts }),
76
78
  };
77
79
  inspectElectronStaticNode(node, findings);
78
80
  if (t.isCallExpression(node)) {
@@ -80,6 +82,9 @@ const inspectNode = (source, node, accumulator) => {
80
82
  inspectEsbuildWrapper(source, node, accumulator);
81
83
  inspectCall(source, node, findings);
82
84
  }
85
+ else if (t.isOptionalCallExpression(node)) {
86
+ inspectCall(source, node, findings);
87
+ }
83
88
  else if (t.isNewExpression(node))
84
89
  inspectCall(source, node, findings);
85
90
  if ((t.isImportDeclaration(node) || t.isExportAllDeclaration(node)) &&
@@ -104,13 +104,15 @@ const recoverBundlerModule = (source, property, accumulator) => {
104
104
  const exportsValue = collectJavaScriptExports(factory);
105
105
  const requireName = factoryRequireName(factory);
106
106
  const asyncChunks = collectBundlerAsyncChunkKeys(factory, requireName);
107
- if (typeof factory.start === "number" && typeof factory.end === "number")
108
- accumulator.modules.push({
107
+ if (typeof factory.start === "number" && typeof factory.end === "number") {
108
+ const moduleRange = {
109
109
  start: factory.start,
110
110
  end: factory.end,
111
111
  key,
112
112
  requireName,
113
- });
113
+ };
114
+ accumulator.moduleRangeIndex.add(moduleRange);
115
+ }
114
116
  return {
115
117
  module: {
116
118
  module_key: key,
@@ -1,13 +1,13 @@
1
1
  import * as t from "@babel/types";
2
2
  import { sanitizeEndpointCandidate } from "../browserObservation.js";
3
- import { addFindingOnce, addLocatedFinding, moduleAtOffset, } from "./javascriptStaticAnalysisFindings.js";
3
+ import { addFindingOnce, addLocatedFinding, } from "./javascriptStaticAnalysisFindings.js";
4
4
  import { STATIC_ROUTE_CALL_NAMES, argumentValue, calleeName, endpointArgument as endpointArgumentHelper, prefixedArgument, semanticStaticPropertyName, range, rangeForOffsets, sourceSlice, staticPath, staticPathResolutionContext, storageKind, stringValue, } from "./javascriptStaticAnalysisHelpers.js";
5
5
  /** Inspect one call or new expression for references, endpoints, storage, and roles. */
6
6
  export const inspectCall = (source, node, context) => {
7
7
  const { accumulator } = context;
8
8
  const name = calleeName(node.callee);
9
9
  const first = stringValue(node.arguments[0]);
10
- const module = moduleAtOffset(node.start, context.accumulator.modules);
10
+ const module = context.accumulator.moduleRangeIndex.find(node.start);
11
11
  const moduleRequireName = module?.requireName ?? null;
12
12
  const requireCall = requireCallSpecifier(node, name, moduleRequireName);
13
13
  if (requireCall !== null)
@@ -103,7 +103,8 @@ const inspectEndpointCall = (node, name, first, context) => {
103
103
  value: first,
104
104
  mechanism: `call:${name}`,
105
105
  });
106
- const endpoint = endpointArgumentHelper(name, node.arguments, node.callee);
106
+ const receiverFact = context.openReceiverFacts?.get(node.start ?? -1);
107
+ const endpoint = endpointArgumentHelper(name, node.arguments, node.callee, receiverFact);
107
108
  if (endpoint !== undefined)
108
109
  addEndpoint(context, {
109
110
  node,
@@ -143,7 +144,16 @@ export const inspectRoleProperty = (node, context) => {
143
144
  });
144
145
  };
145
146
  const inspectStorageCall = (node, name, first, context) => {
146
- const storage = storageKind(name);
147
+ const receiverFact = context.openReceiverFacts?.get(node.start ?? -1);
148
+ const storage = receiverFact === "local" ||
149
+ receiverFact === "local-indexed-db" ||
150
+ receiverFact === "local-cache-storage"
151
+ ? undefined
152
+ : receiverFact === "indexed-db"
153
+ ? "indexed-db"
154
+ : receiverFact === "cache-storage"
155
+ ? "cache-storage"
156
+ : storageKind(name);
147
157
  if (storage === undefined)
148
158
  return;
149
159
  addLocatedFinding(context, {
@@ -1,3 +1,68 @@
1
+ /** Incremental point lookup preserving insertion-order precedence for overlaps. */
2
+ export class JavaScriptModuleRangeIndex {
3
+ root = {};
4
+ end;
5
+ nextOrder = 0;
6
+ /** Create an empty offset index bounded by the analyzed source length. */
7
+ constructor(sourceLength) {
8
+ this.end = Math.max(1, sourceLength + 1);
9
+ }
10
+ /** Add a module range in the same discovery order used by the analysis pass. */
11
+ add(range) {
12
+ const indexed = { order: this.nextOrder, range };
13
+ this.nextOrder += 1;
14
+ const start = Math.max(0, range.start);
15
+ const end = Math.min(this.end, range.end + 1);
16
+ if (start < end)
17
+ this.insert(this.root, 0, this.end, start, end, indexed);
18
+ }
19
+ /** Return the first discovered inclusive range containing an offset. */
20
+ find(offset) {
21
+ if (offset === null ||
22
+ offset === undefined ||
23
+ !Number.isSafeInteger(offset) ||
24
+ offset < 0 ||
25
+ offset >= this.end)
26
+ return undefined;
27
+ let node = this.root;
28
+ let low = 0;
29
+ let high = this.end;
30
+ let best;
31
+ while (node !== undefined) {
32
+ if (node.best !== undefined &&
33
+ (best === undefined || node.best.order < best.order))
34
+ best = node.best;
35
+ if (high - low <= 1)
36
+ break;
37
+ const middle = low + Math.floor((high - low) / 2);
38
+ if (offset < middle) {
39
+ node = node.left;
40
+ high = middle;
41
+ }
42
+ else {
43
+ node = node.right;
44
+ low = middle;
45
+ }
46
+ }
47
+ return best?.range;
48
+ }
49
+ insert(node, low, high, queryLow, queryHigh, value) {
50
+ if (queryLow <= low && high <= queryHigh) {
51
+ if (node.best === undefined || value.order < node.best.order)
52
+ node.best = value;
53
+ return;
54
+ }
55
+ const middle = low + Math.floor((high - low) / 2);
56
+ if (queryLow < middle) {
57
+ node.left ??= {};
58
+ this.insert(node.left, low, middle, queryLow, queryHigh, value);
59
+ }
60
+ if (queryHigh > middle) {
61
+ node.right ??= {};
62
+ this.insert(node.right, middle, high, queryLow, queryHigh, value);
63
+ }
64
+ }
65
+ }
1
66
  /** Add one module-attributable finding once per source location. */
2
67
  export const addLocatedFinding = (context, input) => addFindingOnce(context.accumulator, `${input.key}\0${String(input.node.start)}`, () => input.collection.push({
3
68
  offset: input.node.start ?? -1,
@@ -13,11 +78,5 @@ export const addFindingOnce = (accumulator, key, add) => {
13
78
  /** Attach recovered bundle-module ownership to findings after traversal. */
14
79
  export const finalizeLocatedFindings = (values, modules) => values.map(({ offset, value }) => ({
15
80
  ...value,
16
- module_key: moduleAtOffset(offset, modules)?.key ?? null,
81
+ module_key: modules.find(offset)?.key ?? null,
17
82
  }));
18
- /** Locate the recovered bundle factory containing one exact source offset. */
19
- export const moduleAtOffset = (offset, modules) => {
20
- if (offset === null || offset === undefined)
21
- return undefined;
22
- return modules.find(({ start, end }) => offset >= start && offset <= end);
23
- };