rea-agents 3.1.0 → 3.2.1

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 (590) hide show
  1. package/README.md +72 -95
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisSnapshotCache.js +0 -1
  6. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  7. package/dist/application/AndroidApplicationService.js +1 -1
  8. package/dist/application/AppleApplicationService.js +1 -1
  9. package/dist/application/ArtifactExtraction.js +35 -54
  10. package/dist/application/ArtifactExtractionDestination.js +17 -0
  11. package/dist/application/ArtifactGraphConstruction.js +2 -17
  12. package/dist/application/ArtifactInventory/classify.js +2 -6
  13. package/dist/application/ArtifactInventory/hash.js +2 -20
  14. package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
  15. package/dist/application/ArtifactInventory/scanReader.js +69 -51
  16. package/dist/application/ArtifactInventory.js +6 -14
  17. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  18. package/dist/application/BinarySession.js +41 -13
  19. package/dist/application/BinarySessionComposition.js +0 -11
  20. package/dist/application/BinarySessionOpen.js +2 -1
  21. package/dist/application/BinarySessionRecords.js +5 -93
  22. package/dist/application/BinarySessionStatus.js +5 -16
  23. package/dist/application/BinaryTargetResolver.js +216 -0
  24. package/dist/application/BrowserEvidence.js +42 -58
  25. package/dist/application/BrowserObservationService.js +3 -6
  26. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  27. package/dist/application/BrowserScenarioEvidence.js +3 -3
  28. package/dist/application/CallPathTracing.js +2 -36
  29. package/dist/application/CapabilityInventory.js +10 -15
  30. package/dist/application/ClientConfigurationDocument.js +27 -0
  31. package/dist/application/ClientRegistrationStatus.js +16 -13
  32. package/dist/application/CommandShimReplay.js +14 -1
  33. package/dist/application/DirectAnalysis.js +22 -46
  34. package/dist/application/DirectAnalysisStatus.js +5 -61
  35. package/dist/application/Doctor.js +11 -32
  36. package/dist/application/DoctorDiagnostics.js +1 -2
  37. package/dist/application/DoctorScope.js +1 -1
  38. package/dist/application/ElectronActiveEvidence.js +3 -8
  39. package/dist/application/ElectronActiveObservationService.js +3 -6
  40. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  41. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  42. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  43. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  44. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  45. package/dist/application/ElectronEvidence.js +4 -7
  46. package/dist/application/ElectronObservationService.js +5 -9
  47. package/dist/application/EnhancedLiteralTracing.js +42 -65
  48. package/dist/application/EnhancedTools.js +76 -44
  49. package/dist/application/EvidenceBundleCommands.js +11 -11
  50. package/dist/application/EvidenceBundleFiles.js +9 -15
  51. package/dist/application/EvidenceLedger.js +6 -41
  52. package/dist/application/FilesystemSnapshot.js +2 -3
  53. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  54. package/dist/application/InventoryProjectionEvidence.js +4 -2
  55. package/dist/application/InvestigationProviders.js +1 -1
  56. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  57. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  58. package/dist/application/JavaScriptApplicationService.js +6 -29
  59. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  60. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  61. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  62. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  63. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  64. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  65. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  66. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  67. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  68. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  69. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  70. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  71. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  72. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  73. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  74. package/dist/application/JavaScriptJsonModules.js +2 -2
  75. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  76. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  77. package/dist/application/JavaScriptReplayService.js +6 -32
  78. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  79. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  80. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  81. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  82. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  83. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  84. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  85. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  86. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  87. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  88. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  89. package/dist/application/JsonFiles.js +79 -0
  90. package/dist/application/LinuxHopper.js +11 -9
  91. package/dist/application/LoopbackReplay.js +26 -23
  92. package/dist/application/LoopbackReplayRecorder.js +29 -1
  93. package/dist/application/ManagedApplicationGraphService.js +1 -2
  94. package/dist/application/ManagedMemberComparisonService.js +11 -41
  95. package/dist/application/ManagedNativeVerificationService.js +1 -2
  96. package/dist/application/ManagedReconstructionService.js +1 -1
  97. package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
  98. package/dist/application/NativeApiInspection.js +2 -7
  99. package/dist/application/NativeUiActionTrace.js +394 -0
  100. package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
  101. package/dist/application/PermissionAuthority.js +15 -7
  102. package/dist/application/PermissionFailure.js +5 -0
  103. package/dist/application/ProcessCaptureAuthority.js +5 -7
  104. package/dist/application/ProcessCaptureJournal.js +3 -2
  105. package/dist/application/ProcessCaptureLifecycle.js +5 -12
  106. package/dist/application/ProcessCheckpoints.js +29 -11
  107. package/dist/application/ProcessCli.js +6 -16
  108. package/dist/application/ProcessEvidence.js +5 -7
  109. package/dist/application/ProcessHarness.js +52 -17
  110. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  111. package/dist/application/ProcessReactiveEffects.js +9 -3
  112. package/dist/application/ProcessReactiveHarness.js +13 -7
  113. package/dist/application/ProcessSampling.js +2 -4
  114. package/dist/application/ProcessTimer.js +39 -0
  115. package/dist/application/ProjectPermissionStore.js +39 -96
  116. package/dist/application/RealHopperAssertions.js +20 -66
  117. package/dist/application/ReconstructionCoverageService.js +12 -58
  118. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  119. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  120. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  121. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  122. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  123. package/dist/application/ReferenceSourceImport.js +19 -45
  124. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  125. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  126. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  127. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  128. package/dist/application/SessionProviderRouter.js +2 -2
  129. package/dist/application/Setup.js +1 -3
  130. package/dist/application/SetupClientConfiguration.js +22 -93
  131. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  132. package/dist/application/StoreFileLock.js +119 -0
  133. package/dist/application/TerminalRenderer.js +2 -3
  134. package/dist/application/Uninstall.js +9 -14
  135. package/dist/application/UnknownEvidence.js +1 -1
  136. package/dist/artifacts/ArtifactPaths.js +2 -5
  137. package/dist/artifacts/ArtifactProvider.js +36 -58
  138. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  139. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  140. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  141. package/dist/artifacts/NibArchive.js +269 -0
  142. package/dist/artifacts/SafeOutputTree.js +15 -24
  143. package/dist/browser/BrowserProcessStartup.js +1 -2
  144. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  145. package/dist/browser/CdpBrowserProvider.js +3 -13
  146. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  147. package/dist/browser/CdpCaptureDocuments.js +28 -76
  148. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  149. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  150. package/dist/browser/CdpCaptureEvents.js +2 -8
  151. package/dist/browser/CdpCaptureStorage.js +9 -20
  152. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
  153. package/dist/browser/CdpCaptureValues.js +21 -21
  154. package/dist/browser/CdpConnection.js +10 -25
  155. package/dist/browser/CdpElectronInspection.js +26 -50
  156. package/dist/browser/CdpElectronProvider.js +10 -35
  157. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  158. package/dist/browser/CdpElectronScripts.js +6 -35
  159. package/dist/browser/CdpElectronWorkers.js +6 -10
  160. package/dist/browser/CdpEndpoint.js +25 -41
  161. package/dist/browser/CdpObservationSession.js +14 -26
  162. package/dist/browser/CdpPageCapture.js +34 -48
  163. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  164. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  165. package/dist/browser/CdpSafeMetadata.js +19 -22
  166. package/dist/browser/CdpScreenshot.js +3 -5
  167. package/dist/browser/CdpTargetSession.js +1 -2
  168. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  169. package/dist/browser/ElectronFileScope.js +8 -19
  170. package/dist/browser/JavaScriptRuntimeScope.js +9 -14
  171. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  172. package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
  174. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  175. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  176. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  177. package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
  178. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  179. package/dist/browser/PlaywrightScenarioSession.js +14 -30
  180. package/dist/browser/PngVisualDiff.js +22 -14
  181. package/dist/browser/SensitiveTextCapture.js +0 -17
  182. package/dist/browser/V8InspectorCaptureProjection.js +7 -8
  183. package/dist/browser/V8InspectorEndpoint.js +12 -14
  184. package/dist/browser/V8InspectorProvider.js +20 -61
  185. package/dist/browser/WebSourceMapFetcher.js +56 -176
  186. package/dist/catalogIdentity.js +0 -54
  187. package/dist/cli/artifactCommands.js +49 -77
  188. package/dist/cli/coreAnalysisCommands.js +83 -133
  189. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  190. package/dist/cli/managedCommands.js +5 -270
  191. package/dist/cli/setupCommands.js +3 -12
  192. package/dist/cli/utilityCommands.js +7 -41
  193. package/dist/cli.js +0 -2
  194. package/dist/cliApplicationCommands.js +42 -112
  195. package/dist/cliBrowserAdvancedCommands.js +10 -106
  196. package/dist/cliBrowserCommands.js +15 -127
  197. package/dist/cliBrowserContext.js +30 -0
  198. package/dist/cliCommandNames.js +4 -5
  199. package/dist/cliElectronCommands.js +8 -72
  200. package/dist/cliEvidenceCommands.js +8 -77
  201. package/dist/cliJavaScriptRuntimeCommands.js +9 -91
  202. package/dist/cliJsonInput.js +4 -14
  203. package/dist/cliObservationOptions.js +11 -96
  204. package/dist/cliPolicyCommands.js +2 -17
  205. package/dist/cliProcessCommands.js +3 -3
  206. package/dist/cliSetup.js +0 -13
  207. package/dist/config/browserScenario.js +2 -2
  208. package/dist/config/environment.js +0 -9
  209. package/dist/config/parseConfig.js +1 -33
  210. package/dist/config/parsers.js +6 -27
  211. package/dist/config/passiveObservation.js +7 -77
  212. package/dist/config/permissions.js +0 -7
  213. package/dist/contracts/analysisSearchContract.js +2 -5
  214. package/dist/contracts/applicationToolContracts.js +56 -109
  215. package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
  216. package/dist/contracts/artifactComparisonExample.js +58 -60
  217. package/dist/contracts/artifactToolContracts.js +20 -67
  218. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  219. package/dist/contracts/browserToolContracts.js +8 -73
  220. package/dist/contracts/electronToolContracts.js +8 -108
  221. package/dist/contracts/enhancedInputs.js +23 -54
  222. package/dist/contracts/errorSchemas.js +0 -1
  223. package/dist/contracts/functionComparisonExample.js +10 -24
  224. package/dist/contracts/functionInstructionContract.js +1 -3
  225. package/dist/contracts/functionWorkflowToolContracts.js +2 -2
  226. package/dist/contracts/hopperMemoryContracts.js +3 -3
  227. package/dist/contracts/investigationExamples.js +14 -11
  228. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  229. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  230. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  231. package/dist/contracts/managedToolContracts.js +6 -95
  232. package/dist/contracts/managedWorkflowExamples.js +77 -128
  233. package/dist/contracts/managedWorkflowToolContracts.js +51 -77
  234. package/dist/contracts/nativeToolContracts.js +7 -11
  235. package/dist/contracts/processCaptureExample.js +2 -69
  236. package/dist/contracts/promptContracts.js +49 -67
  237. package/dist/contracts/providerSelection.js +0 -1
  238. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  239. package/dist/contracts/sessionStatusContract.js +1 -17
  240. package/dist/contracts/sessionToolSchemas.js +6 -15
  241. package/dist/contracts/toolContractExamples.js +11 -11
  242. package/dist/contracts/toolContractHelpers.js +0 -4
  243. package/dist/contracts/toolContracts.js +60 -71
  244. package/dist/contracts/toolEffects.js +5 -13
  245. package/dist/contracts/toolOutputSchemaGroups.js +37 -91
  246. package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
  247. package/dist/contracts/toolSchemaMetadata.js +8 -19
  248. package/dist/contracts/unknownContractExamples.js +0 -2
  249. package/dist/domain/analysisErrorPresentation.js +46 -54
  250. package/dist/domain/analysisErrorProjection.js +28 -37
  251. package/dist/domain/analysisProfile.js +3 -31
  252. package/dist/domain/analysisSnapshot.js +3 -12
  253. package/dist/domain/androidApplication.js +15 -54
  254. package/dist/domain/appleApplication.js +24 -67
  255. package/dist/domain/artifactComparison.js +11 -29
  256. package/dist/domain/artifactGraph.js +14 -44
  257. package/dist/domain/artifactInspection.js +38 -69
  258. package/dist/domain/artifactInventoryEvidence.js +27 -21
  259. package/dist/domain/binaryTarget.js +2 -221
  260. package/dist/domain/browserCaptureComparison.js +47 -24
  261. package/dist/domain/browserObservation.js +28 -193
  262. package/dist/domain/browserObservationSchemas.js +5 -23
  263. package/dist/domain/browserScenario.js +11 -14
  264. package/dist/domain/browserScenarioCapture.js +11 -12
  265. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  266. package/dist/domain/browserScenarioDiff.js +2 -59
  267. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  268. package/dist/domain/browserScenarioDiffValues.js +21 -38
  269. package/dist/domain/browserScenarioValues.js +80 -109
  270. package/dist/domain/browserSession.js +4 -7
  271. package/dist/domain/bundleComparison.js +6 -32
  272. package/dist/domain/bytecodeProvider.js +20 -19
  273. package/dist/domain/callPath.js +47 -167
  274. package/dist/domain/callPathSchemas.js +79 -0
  275. package/dist/domain/changedBehavior.js +34 -60
  276. package/dist/domain/completionLedgerGeneration.js +8 -14
  277. package/dist/domain/conformancePackage.js +126 -97
  278. package/dist/domain/conformanceReplay.js +36 -8
  279. package/dist/domain/conformanceTrustGate.js +23 -14
  280. package/dist/domain/customProtocolCapture.js +1 -1
  281. package/dist/domain/electronActiveObservation.js +70 -103
  282. package/dist/domain/electronObservation.js +14 -80
  283. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  284. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  285. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  286. package/dist/domain/electronStaticAnalysisValues.js +10 -17
  287. package/dist/domain/errors.js +33 -54
  288. package/dist/domain/eventProcessTree.js +20 -12
  289. package/dist/domain/evidence.js +2 -10
  290. package/dist/domain/evidenceBundle.js +3 -5
  291. package/dist/domain/evidenceCompletionLedger.js +6 -8
  292. package/dist/domain/functionComparison.js +4 -14
  293. package/dist/domain/functionComparisonNormalization.js +4 -11
  294. package/dist/domain/functionComparisonResults.js +25 -15
  295. package/dist/domain/functionComparisonSchemas.js +49 -33
  296. package/dist/domain/functionDossierEvidence.js +31 -156
  297. package/dist/domain/hopperStartupFailure.js +1 -1
  298. package/dist/domain/hopperValues.js +15 -136
  299. package/dist/domain/interfaceBuilderGraph.js +654 -0
  300. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  301. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  302. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  303. package/dist/domain/javascriptApplicationGraph.js +3 -13
  304. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  305. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  306. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  307. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  308. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  309. package/dist/domain/javascriptAstFingerprint.js +25 -58
  310. package/dist/domain/javascriptAstValues.js +9 -0
  311. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  312. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  313. package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
  314. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  315. package/dist/domain/javascriptFeatureSeed.js +20 -12
  316. package/dist/domain/javascriptFeatureTrace.js +13 -67
  317. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  318. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  319. package/dist/domain/javascriptNativeHandoff.js +1 -1
  320. package/dist/domain/javascriptReplay.js +24 -41
  321. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  322. package/dist/domain/javascriptRuntimeObservation.js +42 -103
  323. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  324. package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
  325. package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
  326. package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
  327. package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
  328. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
  329. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  330. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
  331. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  332. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  333. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  334. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  335. package/dist/domain/javascriptSemanticCalls.js +5 -32
  336. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  337. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  338. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  339. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  340. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  341. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  342. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  343. package/dist/domain/javascriptSemanticIr.js +1 -29
  344. package/dist/domain/javascriptSemanticObjects.js +1 -5
  345. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  346. package/dist/domain/javascriptSemanticProjection.js +0 -18
  347. package/dist/domain/javascriptSemanticPromises.js +9 -16
  348. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  349. package/dist/domain/javascriptSemanticQuery.js +17 -139
  350. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  351. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  352. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  353. package/dist/domain/javascriptSemanticResources.js +1 -6
  354. package/dist/domain/javascriptSemanticReturns.js +10 -27
  355. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  356. package/dist/domain/javascriptSemanticValues.js +44 -62
  357. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  358. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  359. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  360. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  361. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  362. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  363. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  364. package/dist/domain/jsonShape.js +7 -33
  365. package/dist/domain/localPath.js +7 -0
  366. package/dist/domain/managedApplicationGraph.js +9 -41
  367. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  368. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  369. package/dist/domain/managedArtifact.js +14 -27
  370. package/dist/domain/managedMemberComparison.js +90 -92
  371. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  372. package/dist/domain/managedMemberComparisonItems.js +221 -0
  373. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  374. package/dist/domain/managedNativeVerification.js +3 -6
  375. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  376. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  377. package/dist/domain/managedReconstruction.js +19 -23
  378. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  379. package/dist/domain/nativeApiBoundary.js +2 -7
  380. package/dist/domain/nativeInspection.js +0 -2
  381. package/dist/domain/nativeInvestigationGraph.js +351 -0
  382. package/dist/domain/nativeValueFlow.js +61 -0
  383. package/dist/domain/nodeRuntimeCharacterization.js +1 -5
  384. package/dist/domain/objcSwiftMetadata.js +254 -0
  385. package/dist/domain/peInspection.js +1 -1
  386. package/dist/domain/permissionPolicy.js +13 -0
  387. package/dist/domain/processCapture.js +76 -113
  388. package/dist/domain/processCaptureExample.js +68 -0
  389. package/dist/domain/processCaptureParsing.js +21 -0
  390. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  391. package/dist/domain/processCaptureValidation.js +1 -7
  392. package/dist/domain/processComparison.js +3 -12
  393. package/dist/domain/processReactiveMatching.js +29 -50
  394. package/dist/domain/processReactiveRuntime.js +4 -8
  395. package/dist/domain/processReactiveScenario.js +28 -94
  396. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  397. package/dist/domain/processReactiveTransition.js +33 -18
  398. package/dist/domain/processScenario.js +56 -90
  399. package/dist/domain/processTraceComparison.js +0 -8
  400. package/dist/domain/processTraceEvaluation.js +14 -4
  401. package/dist/domain/processTraceSpecification.js +11 -17
  402. package/dist/domain/protocolCapture.js +3 -3
  403. package/dist/domain/reconstructionCoverage.js +62 -129
  404. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  405. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  406. package/dist/domain/reconstructionReadiness.js +1 -2
  407. package/dist/domain/reconstructionReadinessSchemas.js +36 -38
  408. package/dist/domain/reconstructionUnknowns.js +3 -3
  409. package/dist/domain/reconstructionVerification.js +13 -47
  410. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  411. package/dist/domain/referenceSourceGraph.js +53 -61
  412. package/dist/domain/referenceSourceImportParsing.js +1 -5
  413. package/dist/domain/replayMachine.js +19 -31
  414. package/dist/domain/replayMachineRun.js +15 -63
  415. package/dist/domain/replayMachineRuntime.js +41 -41
  416. package/dist/domain/replayMachineValues.js +84 -0
  417. package/dist/domain/residualUnknown.js +25 -30
  418. package/dist/domain/runtimeCharacterization.js +15 -16
  419. package/dist/domain/runtimeIdentification.js +48 -47
  420. package/dist/domain/sourceToBundleComparison.js +9 -85
  421. package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
  422. package/dist/domain/sourceToBundleSignals.js +4 -15
  423. package/dist/domain/staticRuntimeCorrelation.js +37 -49
  424. package/dist/domain/symbolAnalysis.js +10 -19
  425. package/dist/domain/unicodeCodePointOrder.js +12 -0
  426. package/dist/domain/webBundleAnalysis.js +70 -99
  427. package/dist/domain/webBundleAnalyzer.js +2 -4
  428. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  429. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  430. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  431. package/dist/domain/webCaptureDiff.js +33 -73
  432. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  433. package/dist/domain/webContentArtifact.js +1 -10
  434. package/dist/domain/webMcpDiscovery.js +3 -14
  435. package/dist/domain/webScreenshot.js +58 -34
  436. package/dist/domain/zipPackageFormat.js +7 -0
  437. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  438. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  439. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  440. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  441. package/dist/dotnet/ManagedMemberRows.js +16 -16
  442. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  443. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  444. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  445. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  446. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  447. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  448. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
  449. package/dist/dotnet/ManagedPeReader.js +2 -2
  450. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  451. package/dist/generatedMcpToolCatalog.js +1 -1
  452. package/dist/generatedPackageMetadata.js +1 -1
  453. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  454. package/dist/ghidra/GhidraClient.js +4 -12
  455. package/dist/ghidra/GhidraClientWire.js +9 -5
  456. package/dist/ghidra/GhidraDefaults.js +0 -18
  457. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  458. package/dist/ghidra/GhidraDoctor.js +16 -12
  459. package/dist/ghidra/GhidraFunctionValues.js +65 -108
  460. package/dist/ghidra/GhidraInstallation.js +98 -42
  461. package/dist/ghidra/GhidraInventoryValues.js +16 -85
  462. package/dist/ghidra/GhidraLauncher.js +0 -8
  463. package/dist/ghidra/GhidraProvider.js +15 -22
  464. package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
  465. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  466. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  467. package/dist/ghidra/GhidraSessionValues.js +0 -2
  468. package/dist/ghidra/GhidraTransport.js +4 -7
  469. package/dist/ghidra/protocol.js +2 -2
  470. package/dist/hopper/BridgeLauncher.js +112 -36
  471. package/dist/hopper/HopperAnalysisProfile.js +1 -1
  472. package/dist/hopper/HopperCleanup.js +6 -3
  473. package/dist/hopper/HopperClient.js +4 -7
  474. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  475. package/dist/hopper/HopperProvider.js +0 -16
  476. package/dist/hopper/HopperRequestQueue.js +21 -40
  477. package/dist/hopper/HopperResponseStream.js +1 -9
  478. package/dist/hopper/HopperSessionValues.js +3 -2
  479. package/dist/hopper/HopperTargetLease.js +119 -0
  480. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  481. package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
  482. package/dist/hopper/protocol.js +6 -4
  483. package/dist/main/reload.js +0 -3
  484. package/dist/main/shutdown.js +1 -1
  485. package/dist/main/state.js +0 -9
  486. package/dist/main/transport.js +0 -5
  487. package/dist/mcpDoctor.js +25 -45
  488. package/dist/native/CommandRunner.js +18 -25
  489. package/dist/native/NativeMacOSProvider.js +13 -38
  490. package/dist/native/NativeMachoInspection.js +1 -1
  491. package/dist/process/BoundedFileBytes.js +17 -0
  492. package/dist/process/ExecFileOutput.js +11 -0
  493. package/dist/process/PendingOperations.js +8 -6
  494. package/dist/process/ProcessOwnership.js +3 -2
  495. package/dist/process/ProcessOwnershipObservation.js +0 -1
  496. package/dist/process/ProviderProcess.js +7 -28
  497. package/dist/reference/ReferenceSourceReader.js +8 -24
  498. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  499. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  500. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  501. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  502. package/dist/replay/JavaScriptReplayWorker.js +3 -5
  503. package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
  504. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  505. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  506. package/dist/replay/ReplayOutcome.js +1 -3
  507. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  508. package/dist/replay/ReplaySeccompFile.js +29 -0
  509. package/dist/replay/ReplayWorkerProtocol.js +0 -2
  510. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  511. package/dist/server/ProcessCaptureElicitation.js +4 -8
  512. package/dist/server/createServer.js +6 -44
  513. package/dist/server/promptCompletion.js +37 -61
  514. package/dist/server/recordDerivedEvidence.js +1 -1
  515. package/dist/server/registerApplicationTools/characterization.js +4 -8
  516. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
  517. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
  518. package/dist/server/registerApplicationTools/compareVersions.js +5 -10
  519. package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
  520. package/dist/server/registerApplicationTools/coverage.js +6 -71
  521. package/dist/server/registerApplicationTools/helpers.js +1 -13
  522. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  523. package/dist/server/registerApplicationTools/traceFeature.js +5 -9
  524. package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
  525. package/dist/server/registerApplicationTools.js +0 -2
  526. package/dist/server/registerArtifactComparisonTool.js +23 -27
  527. package/dist/server/registerBrowserScenarioTool.js +4 -4
  528. package/dist/server/registerBrowserTools.js +5 -8
  529. package/dist/server/registerBundleComparisonTool.js +5 -7
  530. package/dist/server/registerCloseLifecycleTool.js +2 -16
  531. package/dist/server/registerElectronTools.js +10 -29
  532. package/dist/server/registerEnhancedTools.js +10 -11
  533. package/dist/server/registerEvidenceTools.js +15 -22
  534. package/dist/server/registerFunctionComparisonTool.js +30 -25
  535. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  536. package/dist/server/registerInvestigationTools.js +20 -116
  537. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
  538. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
  539. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  540. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  541. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  542. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
  543. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
  544. package/dist/server/registerOfficialTools.js +1 -43
  545. package/dist/server/registerProcessComparisonTool.js +33 -23
  546. package/dist/server/registerPrompts.js +19 -17
  547. package/dist/server/registerSessionRecordTools.js +10 -156
  548. package/dist/server/registerSessionStatusTool.js +6 -69
  549. package/dist/server/registerSessionTools.js +10 -51
  550. package/dist/server/sessionAvailabilityPolicy.js +0 -2
  551. package/dist/server/sessionEvidence.js +9 -15
  552. package/dist/server/sessionToolPolicies.js +0 -8
  553. package/dist/server/toolResult.js +14 -50
  554. package/dist/serverIdentity.js +0 -20
  555. package/install.sh +1 -1
  556. package/package.json +11 -7
  557. package/scripts/electron-active-hook.cjs +23 -55
  558. package/scripts/hopper-demo-x11.py +13 -32
  559. package/skills/reverse-engineer-anything/SKILL.md +47 -12
  560. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  561. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  562. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  563. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
  564. package/dist/application/BoundedJsonFiles.js +0 -86
  565. package/dist/application/CrossVersionInventory.js +0 -129
  566. package/dist/application/CrossVersionInvestigation.js +0 -301
  567. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  568. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  569. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  570. package/dist/application/DeferredFileAuthorization.js +0 -61
  571. package/dist/application/DoctorProjection.js +0 -43
  572. package/dist/application/EnhancedToolPagination.js +0 -22
  573. package/dist/application/EvidenceReferenceResolver.js +0 -26
  574. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  575. package/dist/application/ProcessPairedExperiment.js +0 -72
  576. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  577. package/dist/application/ReconstructionReadinessService.js +0 -48
  578. package/dist/cliInvestigationCommands.js +0 -173
  579. package/dist/domain/boundedCartesianProjection.js +0 -15
  580. package/dist/domain/investigationWorkspace.js +0 -347
  581. package/dist/domain/jsonLimits.js +0 -26
  582. package/dist/domain/knownPageCoverage.js +0 -29
  583. package/dist/domain/processPairedExperiment.js +0 -128
  584. package/dist/server/javascriptApplicationResult.js +0 -106
  585. package/dist/server/permissionFailure.js +0 -12
  586. package/dist/server/registerApplicationTools/readiness.js +0 -50
  587. package/dist/server/registerEvidenceResources.js +0 -315
  588. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  589. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  590. package/dist/server/registerReconstructionReadinessResource.js +0 -32
@@ -1,77 +1,50 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { analyzeParsedJavaScriptStaticSource } from "../domain/javascriptStaticAnalysis.js";
3
3
  import { analyzeParsedJavaScriptSemantics } from "../domain/javascriptSemanticAnalysis.js";
4
- import { DEFAULT_JAVASCRIPT_SEMANTIC_LIMITS, } from "../domain/javascriptSemanticIr.js";
5
4
  import { parseJavaScriptSource } from "../domain/javascriptSourceParser.js";
6
5
  import { failedJavaScriptStaticAnalysis } from "../domain/javascriptStaticAnalysisHelpers.js";
7
6
  import { analyzeJavaScriptJsonModule } from "./JavaScriptJsonModules.js";
8
- /** Analyze selected text files under one shared AST, finding, module, and time budget. */
9
- export const analyzeJavaScriptArtifactFiles = (fileSet, input, now) => {
7
+ /** Analyze every text source from the artifact without a result quota. */
8
+ export const analyzeJavaScriptArtifactFiles = (fileSet) => {
10
9
  const state = emptyArtifactAnalysis();
11
- const context = {
12
- state,
13
- input,
14
- deadline: now() + input.limits.max_parse_milliseconds,
15
- now,
16
- };
10
+ const context = { state };
17
11
  for (const file of fileSet.files)
18
12
  analyzeArtifactFile(file, context);
19
- return finalizeArtifactAnalysis(state, input);
13
+ return finalizeArtifactAnalysis(state);
20
14
  };
21
- const finalizeArtifactAnalysis = (state, input) => {
22
- const omittedHtmlFindings = Math.max(0, state.htmlScripts.length + state.findings - input.limits.max_findings);
23
- const findings = Math.min(input.limits.max_findings, state.findings + state.htmlScripts.length);
24
- const sourceMapTruncations = state.sourceMaps.filter(({ status }) => status === "truncated").length;
25
- const truncatedScopes = state.truncatedScopes +
26
- sourceMapTruncations +
27
- (omittedHtmlFindings > 0 ? 1 : 0);
15
+ const finalizeArtifactAnalysis = (state) => {
16
+ const truncatedScopes = state.truncatedScopes;
28
17
  return {
29
18
  files: state.files,
30
19
  packages: state.packages,
31
20
  json_modules: state.jsonModules,
32
- html_scripts: state.htmlScripts.slice(0, input.limits.max_findings),
21
+ html_scripts: state.htmlScripts,
33
22
  source_maps: state.sourceMaps,
34
23
  visited_ast_nodes: state.visitedNodes,
35
- findings,
24
+ findings: state.findings + state.htmlScripts.length,
36
25
  modules: state.modules,
37
26
  parse_failures: state.parseFailures,
38
27
  truncated_scopes: truncatedScopes,
39
28
  limitations: [
40
29
  "JavaScript and HTML were parsed as inert text; bundle bootstrap code was never executed.",
41
30
  "Static paths and relationships may remain unresolved when expressions are dynamic or obfuscated.",
42
- ...(input.source_map_read_approved
43
- ? []
44
- : [
45
- "Source maps were inventoried but their contents were not read without separate approval.",
46
- ]),
47
31
  ...(truncatedScopes === 0
48
32
  ? []
49
- : ["One or more static-analysis scopes reached an approved bound."]),
33
+ : ["Some static-analysis scopes were truncated."]),
50
34
  ],
51
35
  };
52
36
  };
53
37
  const analyzeArtifactFile = (file, context) => {
54
- const { state, input } = context;
38
+ const { state } = context;
55
39
  addStructuredObservations(file, state);
56
40
  if (file.kind === "html" && file.text.included)
57
- state.htmlScripts.push(...parseHtmlScripts(file.path, file.text.value, Math.max(0, input.limits.max_findings - state.findings)));
41
+ state.htmlScripts.push(...parseHtmlScripts(file.path, file.text.value));
58
42
  if (file.kind === "source-map")
59
43
  addSourceMap(file, context);
60
44
  if (file.kind !== "javascript" || !file.text.included) {
61
45
  state.files.push({ file, javascript: null, semantic: null });
62
46
  return;
63
47
  }
64
- const remainingNodes = input.limits.max_ast_nodes - state.visitedNodes;
65
- const remainingFindings = input.limits.max_findings - state.findings;
66
- const remainingModules = input.limits.max_modules - state.modules;
67
- if (remainingNodes <= 0 ||
68
- remainingFindings <= 0 ||
69
- remainingModules <= 0 ||
70
- context.now() > context.deadline) {
71
- state.files.push({ file, javascript: null, semantic: null });
72
- state.truncatedScopes += 1;
73
- return;
74
- }
75
48
  const parsed = parseJavaScriptSource(file.text.value);
76
49
  if (parsed === null) {
77
50
  const analysis = failedJavaScriptStaticAnalysis();
@@ -79,50 +52,25 @@ const analyzeArtifactFile = (file, context) => {
79
52
  state.parseFailures += 1;
80
53
  return;
81
54
  }
82
- const analysis = analyzeParsedJavaScriptStaticSource(file.text.value, parsed, {
83
- maxAstNodes: remainingNodes,
84
- maxFindings: remainingFindings,
85
- maxModules: remainingModules,
86
- deadline: context.deadline,
87
- now: context.now,
88
- });
55
+ const analysis = analyzeParsedJavaScriptStaticSource(file.text.value, parsed);
89
56
  const staticFindings = findingCount(analysis);
90
- const semanticFindingBudget = Math.max(0, input.limits.max_findings - state.findings - staticFindings);
91
- const semanticLimits = {
92
- ...DEFAULT_JAVASCRIPT_SEMANTIC_LIMITS,
93
- maxScopes: remainingNodes,
94
- maxBindings: remainingNodes,
95
- maxCallables: remainingNodes,
96
- maxReferences: remainingNodes,
97
- maxModuleLinks: semanticFindingBudget,
98
- };
99
57
  const semantics = analysis.parse_status === "complete" || analysis.parse_status === "partial"
100
- ? analyzeParsedJavaScriptSemantics(parsed, semanticLimits)
58
+ ? analyzeParsedJavaScriptSemantics(parsed)
101
59
  : null;
102
60
  state.files.push({
103
61
  file,
104
62
  javascript: analysis,
105
- semantic: semantics === null ? null : { ir: semantics, limits: semanticLimits },
63
+ semantic: semantics === null ? null : { ir: semantics },
106
64
  });
107
65
  state.visitedNodes += analysis.visited_ast_nodes;
108
66
  state.findings += staticFindings + (semantics?.moduleLinks.length ?? 0);
109
67
  state.modules += analysis.bundler_registrations.reduce((count, registration) => count + registration.modules.length, 0);
110
68
  if (analysis.parse_status === "failed")
111
69
  state.parseFailures += 1;
112
- if (analysis.parse_status === "truncated")
113
- state.truncatedScopes += 1;
114
- if (semantics?.coverage.status === "truncated")
115
- state.truncatedScopes += 1;
116
70
  };
117
71
  const addSourceMap = (file, context) => {
118
- const sourceMap = parseSourceMap(file, {
119
- deadline: context.deadline,
120
- now: context.now,
121
- maximumSources: Math.max(0, context.input.limits.max_source_map_sources -
122
- context.state.sourceMapSources),
123
- });
72
+ const sourceMap = parseSourceMap(file);
124
73
  context.state.sourceMaps.push(sourceMap);
125
- context.state.sourceMapSources += sourceMap.sources.length;
126
74
  };
127
75
  const emptyArtifactAnalysis = () => ({
128
76
  files: [],
@@ -135,7 +83,6 @@ const emptyArtifactAnalysis = () => ({
135
83
  modules: 0,
136
84
  parseFailures: 0,
137
85
  truncatedScopes: 0,
138
- sourceMapSources: 0,
139
86
  });
140
87
  const addStructuredObservations = (file, state) => {
141
88
  if (file.kind === "package-json")
@@ -163,12 +110,12 @@ const parsePackage = (file) => {
163
110
  path: file.path,
164
111
  sha256: file.sha256,
165
112
  status: "included",
166
- name: boundedString(value.name),
167
- version: boundedString(value.version),
168
- main: boundedString(value.main),
169
- renderer: boundedString(value.renderer) ??
170
- boundedString(value.browser) ??
171
- boundedString(value.module),
113
+ name: optionalString(value.name),
114
+ version: optionalString(value.version),
115
+ main: optionalString(value.main),
116
+ renderer: optionalString(value.renderer) ??
117
+ optionalString(value.browser) ??
118
+ optionalString(value.module),
172
119
  limitation: null,
173
120
  };
174
121
  };
@@ -186,14 +133,14 @@ const unavailablePackage = (file, limitation) => ({
186
133
  renderer: null,
187
134
  limitation,
188
135
  });
189
- const parseHtmlScripts = (path, text, maximum) => {
136
+ const parseHtmlScripts = (path, text) => {
190
137
  const scripts = [];
191
138
  const baseHref = htmlBaseHref(text);
192
139
  const pattern = /<script\b[^>]*\bsrc\s*=\s*(["'])([^"']+)\1[^>]*>/giu;
193
140
  for (const match of text.matchAll(pattern)) {
194
- const script = match[2]?.slice(0, 4_096);
195
- if (script === undefined || scripts.length >= maximum)
196
- break;
141
+ const script = match[2];
142
+ if (script === undefined)
143
+ continue;
197
144
  const start = match.index;
198
145
  scripts.push({
199
146
  html_path: path,
@@ -206,13 +153,11 @@ const parseHtmlScripts = (path, text, maximum) => {
206
153
  };
207
154
  const htmlBaseHref = (text) => {
208
155
  const match = /<base\b[^>]*\bhref\s*=\s*(["'])([^"']+)\1[^>]*>/iu.exec(text);
209
- return match?.[2]?.slice(0, 4_096) ?? null;
156
+ return match?.[2] ?? null;
210
157
  };
211
- const parseSourceMap = (file, context) => {
158
+ const parseSourceMap = (file) => {
212
159
  if (!file.text.included)
213
160
  return unavailableSourceMap(file);
214
- if (context.now() > context.deadline)
215
- return truncatedSourceMap(file, null, "Parse deadline reached before source-map decoding.");
216
161
  let value;
217
162
  try {
218
163
  value = JSON.parse(file.text.value);
@@ -220,16 +165,13 @@ const parseSourceMap = (file, context) => {
220
165
  catch {
221
166
  return invalidSourceMap(file, "Source map is not valid JSON.");
222
167
  }
223
- if (context.now() > context.deadline)
224
- return truncatedSourceMap(file, null, "Parse deadline elapsed during source-map decoding.");
225
- const maps = flattenSourceMaps(value, 10_000);
168
+ const maps = flattenSourceMaps(value);
226
169
  if (maps === undefined)
227
- return invalidSourceMap(file, "Source map is not a bounded version 3 map.");
228
- return collectSourceMapOriginals(file, maps, context);
170
+ return invalidSourceMap(file, "Source map is not a version 3 map.");
171
+ return collectSourceMapOriginals(file, maps);
229
172
  };
230
- const collectSourceMapOriginals = (file, maps, context) => {
173
+ const collectSourceMapOriginals = (file, maps) => {
231
174
  const sources = [];
232
- let total = 0;
233
175
  for (const map of maps) {
234
176
  const names = map.sources;
235
177
  if (!Array.isArray(names))
@@ -239,20 +181,8 @@ const collectSourceMapOriginals = (file, maps, context) => {
239
181
  : [];
240
182
  const root = typeof map.sourceRoot === "string" ? map.sourceRoot : "";
241
183
  for (const [index, raw] of names.entries()) {
242
- if (total % 1_024 === 0 && context.now() > context.deadline)
243
- return {
244
- path: file.path,
245
- sha256: file.sha256,
246
- status: "truncated",
247
- sources,
248
- omitted_sources: null,
249
- limitation: "Parse deadline elapsed during source-map traversal.",
250
- };
251
184
  if (typeof raw !== "string")
252
185
  return invalidSourceMap(file, "Source map contains a non-string source name.");
253
- total += 1;
254
- if (sources.length >= context.maximumSources)
255
- continue;
256
186
  const content = typeof contents[index] === "string" ? contents[index] : null;
257
187
  sources.push({
258
188
  source: resolveSourceName(root, raw),
@@ -261,34 +191,26 @@ const collectSourceMapOriginals = (file, maps, context) => {
261
191
  });
262
192
  }
263
193
  }
264
- const omitted = total - sources.length;
265
194
  return {
266
195
  path: file.path,
267
196
  sha256: file.sha256,
268
- status: omitted === 0 ? "included" : "truncated",
197
+ status: "included",
269
198
  sources,
270
- omitted_sources: omitted,
271
- limitation: omitted === 0
272
- ? null
273
- : "Original-source inventory reached the approved source-map limit.",
199
+ limitation: null,
274
200
  };
275
201
  };
276
202
  const unavailableSourceMap = (file) => {
277
203
  if (file.text.included)
278
204
  throw new TypeError("Expected unavailable source-map text");
279
- const notApproved = file.text.reason === "not-approved";
280
205
  return {
281
206
  path: file.path,
282
207
  sha256: file.sha256,
283
- status: notApproved ? "not-approved" : "invalid",
208
+ status: "invalid",
284
209
  sources: [],
285
- omitted_sources: 0,
286
- limitation: notApproved
287
- ? "Source-map content requires separate approval."
288
- : "Source-map text was unavailable within approved limits.",
210
+ limitation: "Source-map text could not be decoded as UTF-8.",
289
211
  };
290
212
  };
291
- const flattenSourceMaps = (root, maximum) => {
213
+ const flattenSourceMaps = (root) => {
292
214
  if (!isRecord(root) || root.version !== 3)
293
215
  return undefined;
294
216
  const maps = [];
@@ -298,8 +220,6 @@ const flattenSourceMaps = (root, maximum) => {
298
220
  if (map === undefined || map.version !== 3)
299
221
  return undefined;
300
222
  if (Array.isArray(map.sections)) {
301
- if (pending.length + maps.length + map.sections.length > maximum)
302
- return undefined;
303
223
  for (const section of map.sections) {
304
224
  if (!isRecord(section) || !isRecord(section.map))
305
225
  return undefined;
@@ -311,20 +231,11 @@ const flattenSourceMaps = (root, maximum) => {
311
231
  }
312
232
  return maps;
313
233
  };
314
- const truncatedSourceMap = (file, omitted, limitation) => ({
315
- path: file.path,
316
- sha256: file.sha256,
317
- status: "truncated",
318
- sources: [],
319
- omitted_sources: omitted,
320
- limitation,
321
- });
322
234
  const invalidSourceMap = (file, limitation) => ({
323
235
  path: file.path,
324
236
  sha256: file.sha256,
325
237
  status: "invalid",
326
238
  sources: [],
327
- omitted_sources: 0,
328
239
  limitation,
329
240
  });
330
241
  const findingCount = (analysis) => analysis.references.length +
@@ -347,7 +258,7 @@ const pointForOffset = (text, offset) => {
347
258
  const lines = text.slice(0, offset).split("\n");
348
259
  return { line: lines.length, column: lines.at(-1)?.length ?? 0 };
349
260
  };
350
- const resolveSourceName = (root, source) => `${root}${root !== "" && !root.endsWith("/") ? "/" : ""}${source}`.slice(0, 4_096);
351
- const boundedString = (value) => typeof value === "string" && value.length > 0 ? value.slice(0, 4_096) : null;
261
+ const resolveSourceName = (root, source) => `${root}${root !== "" && !root.endsWith("/") ? "/" : ""}${source}`;
262
+ const optionalString = (value) => typeof value === "string" && value.length > 0 ? value : null;
352
263
  const sha256 = (value) => createHash("sha256").update(value).digest("hex");
353
264
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
@@ -4,16 +4,13 @@ import { AsarArtifactReader } from "../artifacts/AsarArtifactReader.js";
4
4
  import { ArtifactPathRegistry, normalizeArtifactPath, } from "../artifacts/ArtifactPaths.js";
5
5
  import { ArtifactReaderFailure, } from "../artifacts/ArtifactReader.js";
6
6
  import { streamChunkToBuffer } from "../artifacts/StreamBytes.js";
7
- /** Read only selected textual entries through an already-inventoried reader. */
8
- export const readJavaScriptArtifactFiles = async (reader, snapshot, input, signal) => {
7
+ /** Read all relevant textual entries through an already-inventoried reader. */
8
+ export const readJavaScriptArtifactFiles = async (reader, snapshot, signal) => {
9
9
  const inventory = expectedInventory(snapshot);
10
10
  const expected = inventory.files;
11
- const selections = selectTextFiles(expected, input);
12
11
  const context = {
13
- input,
14
12
  expected,
15
13
  expectedContainers: inventory.containers,
16
- selections,
17
14
  registry: new ArtifactPathRegistry(),
18
15
  files: [],
19
16
  containers: [],
@@ -24,62 +21,80 @@ export const readJavaScriptArtifactFiles = async (reader, snapshot, input, signa
24
21
  await visitReader(reader, "", snapshot.manifest.root_sha256, context);
25
22
  const files = context.files.sort((left, right) => compareCodePoints(left.path, right.path));
26
23
  assertExpectedFilesWereVisited(expected, files);
27
- const selected = [...selections.values()].filter(({ selected: isSelected }) => isSelected).length;
28
24
  return {
29
25
  files,
30
26
  containers: context.containers.sort((left, right) => compareCodePoints(left.path, right.path)),
31
- text_files_selected: selected,
32
27
  text_bytes_read: context.textBytes,
33
- omitted_text_files: [...selections.values()].filter(({ selected: isSelected }) => !isSelected).length,
34
- limit_omitted_text_files: [...selections.values()].filter(({ reason }) => reason === "file-limit" || reason === "byte-limit").length,
35
- policy_filtered_text_files: [...selections.values()].filter(({ reason }) => reason === "not-approved").length,
36
28
  invalid_utf8_files: context.invalidUtf8,
37
29
  };
38
30
  };
39
31
  const visitReader = async (reader, prefix, containerSha256, context) => {
40
- for await (const entry of reader.entries(context.signal)) {
41
- abortIfNeeded(context.signal);
42
- const path = normalizeArtifactPath(prefix === "" ? entry.path : `${prefix}/${entry.path}`, {
43
- maxDepth: context.input.limits.max_depth,
44
- maxPathBytes: context.input.limits.max_path_bytes,
45
- });
46
- const nestedAsar = isFilesystemAsar(entry, path);
47
- context.registry.add(path, nestedAsar ? "directory" : entry.kind);
48
- if (nestedAsar) {
49
- await visitNestedAsar(entry, path, context);
50
- continue;
51
- }
52
- const expected = context.expected.get(path);
53
- if (expected === undefined)
54
- continue;
55
- const selection = context.selections.get(path);
56
- const text = await readTextIfSelected(context, {
32
+ const stack = [
33
+ {
57
34
  reader,
58
- entry,
59
- expected,
60
- selection,
61
- });
62
- context.files.push({
63
- path,
64
- container_sha256: containerSha256,
65
- sha256: expected.sha256,
66
- bytes: expected.bytes,
67
- inventory_artifact_id: expected.inventoryArtifactId,
68
- kind: expected.kind,
69
- unpacked: entry.unpacked,
70
- text,
71
- });
72
- }
73
- };
74
- const visitNestedAsar = async (entry, path, context) => {
75
- const inventory = expectedContainer(path, context);
76
- context.containers.push(inventory);
77
- const nested = new AsarArtifactReader(entry.adapterKey);
35
+ prefix,
36
+ containerSha256,
37
+ iterator: reader.entries(context.signal)[Symbol.asyncIterator](),
38
+ owned: false,
39
+ },
40
+ ];
78
41
  try {
79
- await visitReader(nested, path, inventory.sha256, context);
42
+ while (stack.length > 0) {
43
+ const frame = stack.at(-1);
44
+ if (frame === undefined)
45
+ break;
46
+ const next = await frame.iterator.next();
47
+ if (next.done) {
48
+ stack.pop();
49
+ if (frame.owned)
50
+ await frame.reader.close();
51
+ continue;
52
+ }
53
+ const entry = next.value;
54
+ abortIfNeeded(context.signal);
55
+ const path = normalizeArtifactPath(frame.prefix === "" ? entry.path : `${frame.prefix}/${entry.path}`);
56
+ const nestedAsar = isFilesystemAsar(entry, path);
57
+ context.registry.add(path, nestedAsar ? "directory" : entry.kind);
58
+ if (nestedAsar) {
59
+ const inventory = expectedContainer(path, context);
60
+ context.containers.push(inventory);
61
+ const nested = new AsarArtifactReader(entry.adapterKey);
62
+ stack.push({
63
+ reader: nested,
64
+ prefix: path,
65
+ containerSha256: inventory.sha256,
66
+ iterator: nested.entries(context.signal)[Symbol.asyncIterator](),
67
+ owned: true,
68
+ });
69
+ continue;
70
+ }
71
+ const expected = context.expected.get(path);
72
+ if (expected === undefined)
73
+ continue;
74
+ const text = await readText(context, {
75
+ reader: frame.reader,
76
+ entry,
77
+ expected,
78
+ });
79
+ context.files.push({
80
+ path,
81
+ container_sha256: frame.containerSha256,
82
+ sha256: expected.sha256,
83
+ bytes: expected.bytes,
84
+ inventory_artifact_id: expected.inventoryArtifactId,
85
+ kind: expected.kind,
86
+ unpacked: entry.unpacked,
87
+ text,
88
+ });
89
+ }
80
90
  }
81
91
  finally {
82
- await nested.close();
92
+ await Promise.allSettled(stack
93
+ .filter(({ owned }) => owned)
94
+ .map(async ({ reader, iterator }) => {
95
+ await iterator.return?.();
96
+ await reader.close();
97
+ }));
83
98
  }
84
99
  };
85
100
  const expectedContainer = (path, context) => {
@@ -88,15 +103,10 @@ const expectedContainer = (path, context) => {
88
103
  throw new ArtifactReaderFailure("integrity", `Nested ASAR disappeared from inventory: ${path}`);
89
104
  return container;
90
105
  };
91
- const readTextIfSelected = async (context, input) => {
106
+ const readText = async (context, input) => {
92
107
  if (input.expected.kind === "native-addon")
93
108
  return { included: false, reason: "not-applicable" };
94
- if (input.selection?.selected !== true)
95
- return {
96
- included: false,
97
- reason: input.selection?.reason ?? "file-limit",
98
- };
99
- const bytes = await readBounded(await input.reader.open(input.entry, context.signal), context.input.limits.max_text_file_bytes, context.signal);
109
+ const bytes = await readAll(await input.reader.open(input.entry, context.signal), context.signal);
100
110
  const digest = createHash("sha256").update(bytes).digest("hex");
101
111
  if (digest !== input.expected.sha256 || bytes.length !== input.expected.bytes)
102
112
  throw new ArtifactReaderFailure("integrity", `Artifact entry changed after inventory: ${input.expected.path}`);
@@ -142,47 +152,13 @@ const expectedInventory = (snapshot) => {
142
152
  }
143
153
  return { files, containers };
144
154
  };
145
- const selectTextFiles = (files, input) => {
146
- const selected = new Map();
147
- let fileCount = 0;
148
- let bytes = 0;
149
- const ordered = [...files.values()].sort((left, right) => {
150
- const priority = filePriority(left.kind) - filePriority(right.kind);
151
- return priority === 0 ? compareCodePoints(left.path, right.path) : priority;
152
- });
153
- for (const file of ordered) {
154
- if (file.kind === "native-addon")
155
- continue;
156
- if (file.kind === "source-map" && !input.source_map_read_approved) {
157
- selected.set(file.path, { selected: false, reason: "not-approved" });
158
- continue;
159
- }
160
- if (fileCount >= input.limits.max_text_files ||
161
- file.bytes > input.limits.max_text_file_bytes) {
162
- selected.set(file.path, { selected: false, reason: "file-limit" });
163
- continue;
164
- }
165
- if (bytes + file.bytes > input.limits.max_total_text_bytes) {
166
- selected.set(file.path, { selected: false, reason: "byte-limit" });
167
- continue;
168
- }
169
- selected.set(file.path, { selected: true, reason: null });
170
- fileCount += 1;
171
- bytes += file.bytes;
172
- }
173
- return selected;
174
- };
175
- const readBounded = async (stream, maximum, signal) => {
155
+ const readAll = async (stream, signal) => {
176
156
  const chunks = [];
177
157
  let bytes = 0;
178
158
  for await (const raw of stream) {
179
159
  abortIfNeeded(signal);
180
160
  const chunk = streamChunkToBuffer(raw);
181
161
  bytes += chunk.length;
182
- if (bytes > maximum) {
183
- stream.destroy();
184
- throw new ArtifactReaderFailure("limit", "Selected JavaScript artifact text exceeded its byte limit");
185
- }
186
162
  chunks.push(chunk);
187
163
  }
188
164
  return Buffer.concat(chunks, bytes);
@@ -209,22 +185,6 @@ const relevantKind = (path) => {
209
185
  return "native-addon";
210
186
  return undefined;
211
187
  };
212
- const filePriority = (kind) => {
213
- switch (kind) {
214
- case "package-json":
215
- return 0;
216
- case "html":
217
- return 1;
218
- case "javascript":
219
- return 2;
220
- case "json":
221
- return 3;
222
- case "source-map":
223
- return 4;
224
- case "native-addon":
225
- return 5;
226
- }
227
- };
228
188
  const isFilesystemAsar = (entry, path) => entry.kind === "file" &&
229
189
  path.toLowerCase().endsWith(".asar") &&
230
190
  isAbsolute(entry.adapterKey);
@@ -3,7 +3,6 @@ import { createJavaScriptApplicationEdge, createJavaScriptApplicationNode, } fro
3
3
  export class JavaScriptArtifactGraphAccumulator {
4
4
  #nodes = new Map();
5
5
  #edges = new Map();
6
- #omittedObservations = 0;
7
6
  /** Create or merge one canonical node. */
8
7
  addNode(input) {
9
8
  const created = createJavaScriptApplicationNode(input);
@@ -18,9 +17,7 @@ export class JavaScriptArtifactGraphAccumulator {
18
17
  ]));
19
18
  const observations = [...bySemanticId.entries()]
20
19
  .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
21
- .slice(0, 64)
22
20
  .map(([, observation]) => observation);
23
- this.#omittedObservations += Math.max(0, bySemanticId.size - 64);
24
21
  const merged = createJavaScriptApplicationNode({
25
22
  kind: existing.kind,
26
23
  identity: existing.identity,
@@ -43,10 +40,6 @@ export class JavaScriptArtifactGraphAccumulator {
43
40
  edges() {
44
41
  return [...this.#edges.values()];
45
42
  }
46
- /** Count distinct node observations omitted by the graph contract bound. */
47
- omittedObservations() {
48
- return this.#omittedObservations;
49
- }
50
43
  }
51
44
  const observationInput = (observation) => {
52
45
  const { observation_id: _observationId, identifier_strategy: _strategy, ...input } = observation;