rea-agents 6.2.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/README.md +24 -23
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -32,6 +32,8 @@ export const inspectCall = (source, node, context) => {
32
32
  addReference(context, { node, kind: "service-worker", specifier: first });
33
33
  inspectEndpointCall(node, name, first, context);
34
34
  inspectStorageCall(node, name, first, context);
35
+ if (first === "audio" || first === "video")
36
+ noteMediaElementPreloads(node, accumulator);
35
37
  if (name.endsWith("loadFile") && first !== undefined)
36
38
  addLocatedFinding(context, {
37
39
  collection: accumulator.roles,
@@ -61,6 +63,18 @@ export const inspectCall = (source, node, context) => {
61
63
  },
62
64
  });
63
65
  };
66
+ // Element factories such as jsx("audio", props) and createElement("video",
67
+ // props) carry the HTML media `preload` hint ("none", "metadata", "auto"),
68
+ // which never names an Electron preload script.
69
+ const noteMediaElementPreloads = (node, accumulator) => {
70
+ const props = node.arguments[1];
71
+ if (!t.isObjectExpression(props))
72
+ return;
73
+ for (const property of props.properties)
74
+ if (t.isObjectProperty(property) &&
75
+ semanticStaticPropertyName(property.key, property.computed) === "preload")
76
+ accumulator.mediaElementPreloads.add(property);
77
+ };
64
78
  const requireCallSpecifier = (node, name, moduleRequireName) => {
65
79
  if (name === "require" || name.endsWith(".require"))
66
80
  return { specifier: argumentValue(node.arguments[0]) };
@@ -114,6 +128,12 @@ const inspectEndpointCall = (node, name, first, context) => {
114
128
  mechanism: `call:${name}`,
115
129
  });
116
130
  };
131
+ /** Record tRPC procedures, tRPC link URLs and named GraphQL operations. */
132
+ export const inspectRpcNode = (node, context) => {
133
+ const rpc = context.rpcScan.inspect(node);
134
+ if (rpc !== undefined)
135
+ addEndpoint(context, { node, kind: "network", ...rpc });
136
+ };
117
137
  export const inspectRouteProperty = (node, context) => {
118
138
  const key = semanticStaticPropertyName(node.key, node.computed);
119
139
  if ((key === "path" || key === "route") && t.isStringLiteral(node.value))
@@ -127,6 +147,8 @@ export const inspectRouteProperty = (node, context) => {
127
147
  export const inspectRoleProperty = (node, context) => {
128
148
  if (semanticStaticPropertyName(node.key, node.computed) !== "preload")
129
149
  return;
150
+ if (context.accumulator.mediaElementPreloads.has(node))
151
+ return;
130
152
  const path = staticPath(node.value);
131
153
  if (path === undefined)
132
154
  return;
@@ -213,13 +235,35 @@ export const addSourceMapDirectives = (source, comments, accumulator) => {
213
235
  end === undefined ||
214
236
  end === null)
215
237
  continue;
216
- const match = /^(?:\/\/|\/\*)[#@]\s*sourceMappingURL\s*=\s*([^\s*]+)/u.exec(source.slice(start, end));
217
- if (match === null)
238
+ const commentSource = source.slice(start, end);
239
+ if (!(commentSource.startsWith("//") || commentSource.startsWith("/*")) ||
240
+ !(commentSource[2] === "#" || commentSource[2] === "@"))
241
+ continue;
242
+ // Single-class searches avoid regex backtracking over unbounded whitespace
243
+ // or inline URLs, which can exhaust the engine stack on two-byte strings.
244
+ const nameOffset = commentSource.slice(3).search(/\S/u);
245
+ if (nameOffset === -1)
246
+ continue;
247
+ const nameStart = 3 + nameOffset;
248
+ if (!commentSource.startsWith("sourceMappingURL", nameStart))
249
+ continue;
250
+ const nameEnd = nameStart + "sourceMappingURL".length;
251
+ const equalsOffset = commentSource.slice(nameEnd).search(/\S/u);
252
+ if (equalsOffset === -1)
253
+ continue;
254
+ const equalsStart = nameEnd + equalsOffset;
255
+ if (!commentSource.startsWith("=", equalsStart))
256
+ continue;
257
+ const urlOffset = commentSource.slice(equalsStart + 1).search(/\S/u);
258
+ if (urlOffset === -1)
218
259
  continue;
219
- const declared = match[1];
220
- if (declared === undefined || declared.length === 0)
260
+ const declaredStart = equalsStart + 1 + urlOffset;
261
+ const terminator = commentSource.slice(declaredStart).search(/[\s*]/u);
262
+ const declaredEnd = terminator === -1 ? commentSource.length : declaredStart + terminator;
263
+ if (declaredEnd === declaredStart)
221
264
  continue;
222
- const location = rangeForOffsets(source, start, start + match[0].length);
265
+ const declared = commentSource.slice(declaredStart, declaredEnd);
266
+ const location = rangeForOffsets(source, start, start + declaredEnd);
223
267
  addFindingOnce(accumulator, `source-map\0${declared}`, () => accumulator.sourceMaps.push({ declared_url: declared, location }));
224
268
  }
225
269
  };
@@ -76,7 +76,11 @@ export const addFindingOnce = (accumulator, key, add) => {
76
76
  add();
77
77
  };
78
78
  /** Attach recovered bundle-module ownership to findings after traversal. */
79
- export const finalizeLocatedFindings = (values, modules) => values.map(({ offset, value }) => ({
80
- ...value,
81
- module_key: modules.find(offset)?.key ?? null,
82
- }));
79
+ export const finalizeLocatedFindings = (values, modules) => values.map(({ offset, value }) => {
80
+ const module = modules.find(offset);
81
+ return {
82
+ ...value,
83
+ module_key: module?.key ?? null,
84
+ ...(module === undefined ? {} : { module_runtime: module.runtime }),
85
+ };
86
+ });
@@ -2,8 +2,8 @@ import { createHash } from "node:crypto";
2
2
  import { posix } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import * as t from "@babel/types";
5
- import { readExactJavaScriptLiteral, semanticStaticPropertyName, } from "./javascriptAstValues.js";
6
- import { compareCodePoints } from "../canonicalOrdering.js";
5
+ import { readExactJavaScriptLiteral, semanticStaticPropertyName, unwrapJavaScriptExpression, } from "./javascriptAstValues.js";
6
+ import { compareUnicodeCodePoints, compositeKey, } from "../unicodeCodePointOrder.js";
7
7
  /** Explicit result for source text that Babel cannot parse. */
8
8
  export const failedJavaScriptStaticAnalysis = () => ({
9
9
  parse_status: "failed",
@@ -67,8 +67,9 @@ const findChunkRuntime = (node) => {
67
67
  pending.push(current.right, current.left);
68
68
  continue;
69
69
  }
70
- if (t.isParenthesizedExpression(current) || t.isTSAsExpression(current))
71
- pending.push(current.expression);
70
+ const unwrapped = unwrapJavaScriptExpression(current).node;
71
+ if (unwrapped !== current)
72
+ pending.push(unwrapped);
72
73
  }
73
74
  return undefined;
74
75
  };
@@ -102,26 +103,25 @@ export const staticArrayValues = (array) => {
102
103
  const value = argumentValue(element);
103
104
  return value === undefined ? [] : [value];
104
105
  });
105
- const values = [...new Set(staticValues)].sort(compareCodePoints);
106
+ const values = [...new Set(staticValues)].sort(compareUnicodeCodePoints);
106
107
  return {
107
108
  values,
108
109
  unknown: array.elements.length - staticValues.length,
109
110
  };
110
111
  };
111
- /** Resolve a path composed only from inert literal syntax. */
112
- export const staticPath = (node) => staticPathAt(node);
113
112
  /** Classify whether inert path syntax is a module specifier or file expression. */
114
113
  export const staticPathResolutionContext = (node) => isFilesystemPathExpression(node)
115
114
  ? "filesystem-expression"
116
115
  : "module-specifier";
117
- const staticPathAt = (node) => {
116
+ /** Resolve a path composed only from inert literal syntax. */
117
+ export const staticPath = (node) => {
118
118
  if (t.isStringLiteral(node))
119
119
  return node.value;
120
120
  if (t.isTemplateLiteral(node) && node.expressions.length === 0)
121
121
  return stringValue(node);
122
122
  if (t.isBinaryExpression(node, { operator: "+" })) {
123
- const left = staticPathAt(node.left);
124
- const right = staticPathAt(node.right);
123
+ const left = staticPath(node.left);
124
+ const right = staticPath(node.right);
125
125
  return left === undefined || right === undefined
126
126
  ? undefined
127
127
  : `${left}${right}`;
@@ -152,7 +152,7 @@ const staticCallPath = (node) => {
152
152
  for (const argument of node.arguments) {
153
153
  if (isDirectoryIdentity(argumentNode(argument)))
154
154
  continue;
155
- const value = t.isNode(argument) ? staticPathAt(argument) : undefined;
155
+ const value = t.isNode(argument) ? staticPath(argument) : undefined;
156
156
  if (value === undefined)
157
157
  return undefined;
158
158
  parts.push(value);
@@ -164,7 +164,7 @@ const staticFileUrlPath = (argument) => {
164
164
  return undefined;
165
165
  return isSourceFileUrl(argument)
166
166
  ? sourceRelativeFileUrlPath(argument)
167
- : staticPathAt(argument);
167
+ : staticPath(argument);
168
168
  };
169
169
  /** Project a known source-relative URL through the actual file URL decoder. */
170
170
  const sourceRelativeFileUrlPath = (node) => {
@@ -213,7 +213,7 @@ const staticResolvedPath = (node) => {
213
213
  parts.push(null);
214
214
  continue;
215
215
  }
216
- const value = t.isNode(argument) ? staticPathAt(argument) : undefined;
216
+ const value = t.isNode(argument) ? staticPath(argument) : undefined;
217
217
  // Validate every argument, including those before the last anchor.
218
218
  if (value === undefined)
219
219
  return undefined;
@@ -521,9 +521,20 @@ const pointForOffset = (source, offset) => {
521
521
  /** Observe known bundler/framework marker strings without claiming dependency use. */
522
522
  export const detectVendors = (source) => vendorPatterns.flatMap(({ name, patterns }) => patterns.some((pattern) => source.includes(pattern)) ? [name] : []);
523
523
  /** Commit the static semantic content used to deduplicate registrations. */
524
- export const registrationKey = (registration) => `${registration.runtime}\0${registration.chunk_keys.join("\0")}\0${String(registration.unknown_chunk_keys)}\0${registration.modules.map(({ module_key: key, source_sha256: digest }) => `${key}:${digest}`).join("\0")}`;
524
+ export const registrationKey = (registration) =>
525
+ // Collision-free tuple: chunk/module keys are variable-length source-derived
526
+ // lists, so NUL-joins would collapse ["a\0b"] with ["a", "b"].
527
+ compositeKey([
528
+ registration.runtime,
529
+ registration.chunk_keys,
530
+ String(registration.unknown_chunk_keys),
531
+ registration.modules.map(({ module_key: key, source_sha256: digest }) => [
532
+ key,
533
+ digest,
534
+ ]),
535
+ ]);
525
536
  /** Sort values by a deterministic unique semantic key. */
526
- export const sortedUnique = (values, key) => [...new Map(values.map((value) => [key(value), value])).values()].sort((left, right) => compareCodePoints(key(left), key(right)));
537
+ export const sortedUnique = (values, key) => [...new Map(values.map((value) => [key(value), value])).values()].sort((left, right) => compareUnicodeCodePoints(key(left), key(right)));
527
538
  /** Hash exact UTF-8 source text. */
528
539
  export const sha256Text = (value) => createHash("sha256").update(value).digest("hex");
529
540
  /** Recognized route-construction call suffixes. */
@@ -14,6 +14,7 @@ export const createJavaScriptAnalysisAccumulator = (sourceLength) => ({
14
14
  utilityProcesses: [],
15
15
  nativeAddonBindings: [],
16
16
  moduleRangeIndex: new JavaScriptModuleRangeIndex(sourceLength),
17
+ mediaElementPreloads: new WeakSet(),
17
18
  seen: new Set(),
18
19
  visitedNodes: 0,
19
20
  unknownFindings: 0,
@@ -1,5 +1,7 @@
1
- import { compareCodePoints, uniqueSorted } from "../canonicalOrdering.js";
2
- import { absenceClaimable, canonicalDigest } from "../comparisonSemantics.js";
1
+ import { uniqueSorted } from "../canonicalOrdering.js";
2
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
3
+ import { absenceClaimable } from "../comparisonSemantics.js";
4
+ import { digestCanonicalValue } from "../canonicalDigest.js";
3
5
  import { SOURCE_TO_BUNDLE_SIGNAL_WEIGHTS, sourceToBundleComparisonResultSchema, } from "./sourceToBundleComparisonSchemas.js";
4
6
  import { buildSourceToBundleCandidateIndex, candidateHasDigest, candidateIdsForSource, historicalSourceFiles, scoreSourceToBundleCandidate, sourceBearingNodes, } from "./sourceToBundleSignals.js";
5
7
  /** Compare historical source files to static source-bearing application nodes. */
@@ -33,7 +35,7 @@ export const compareSourceToBundle = (input) => {
33
35
  };
34
36
  return sourceToBundleComparisonResultSchema.parse({
35
37
  ...semanticResult,
36
- comparison_id: `stbc_${canonicalDigest(semanticResult, "Source-to-bundle comparison")}`,
38
+ comparison_id: `stbc_${digestCanonicalValue(semanticResult, "Source-to-bundle comparison")}`,
37
39
  });
38
40
  };
39
41
  const projectComparison = (input) => {
@@ -218,7 +220,7 @@ const markMergedMappings = (input, items) => {
218
220
  return { ...semantic, mapping_id: mappingId(input, semantic) };
219
221
  });
220
222
  };
221
- const mappingId = (input, item) => `stbc_item_${canonicalDigest({
223
+ const mappingId = (input, item) => `stbc_item_${digestCanonicalValue({
222
224
  reference_root_sha256: input.reference.root_sha256,
223
225
  application_graph_id: input.application.graph.graph_id,
224
226
  ...item,
@@ -256,4 +258,4 @@ const comparisonLimitations = (factors) => uniqueSorted([
256
258
  ]);
257
259
  const hasSignal = (candidate, kind) => candidate.signals.some((signal) => signal.kind === kind);
258
260
  const compareCandidates = (left, right) => right.score - left.score ||
259
- compareCodePoints(left.current_node_id, right.current_node_id);
261
+ compareUnicodeCodePoints(left.current_node_id, right.current_node_id);
@@ -1,5 +1,5 @@
1
1
  import { posix } from "node:path";
2
- import { compareCodePoints } from "../canonicalOrdering.js";
2
+ import { compareUnicodeCodePoints, compositeKey, } from "../unicodeCodePointOrder.js";
3
3
  import { SOURCE_TO_BUNDLE_SIGNAL_WEIGHTS, } from "./sourceToBundleComparisonSchemas.js";
4
4
  import { isDigest } from "../digests.js";
5
5
  const RELEVANT_NODE_KINDS = new Set([
@@ -24,11 +24,11 @@ const signalWeight = (kind) => {
24
24
  /** Keep source-bearing application nodes in stable identifier order. */
25
25
  export const sourceBearingNodes = (nodes) => nodes
26
26
  .filter(({ kind }) => RELEVANT_NODE_KINDS.has(kind))
27
- .sort((left, right) => compareCodePoints(left.node_id, right.node_id));
27
+ .sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id));
28
28
  /** Keep historical source files in stable path order. */
29
29
  export const historicalSourceFiles = (graph) => graph.entries
30
30
  .filter((entry) => entry.kind === "file" && entry.classifications.includes("source"))
31
- .sort((left, right) => compareCodePoints(left.path, right.path));
31
+ .sort((left, right) => compareUnicodeCodePoints(left.path, right.path));
32
32
  /** Build deterministic candidate indices without assigning fuzzy matches. */
33
33
  export const buildSourceToBundleCandidateIndex = (nodes) => {
34
34
  const projections = nodes.map(projectCurrentNode);
@@ -65,7 +65,7 @@ export const candidateIdsForSource = (source, index) => {
65
65
  for (const group of groups) {
66
66
  if (group === undefined)
67
67
  continue;
68
- for (const nodeId of [...group].sort(compareCodePoints)) {
68
+ for (const nodeId of [...group].sort(compareUnicodeCodePoints)) {
69
69
  if (seen.has(nodeId))
70
70
  continue;
71
71
  seen.add(nodeId);
@@ -166,7 +166,7 @@ const signal = (kind, sourceValue, currentValues) => ({
166
166
  kind,
167
167
  weight: signalWeight(kind),
168
168
  source_value: sourceValue,
169
- current_values: [...new Set(currentValues)].sort(compareCodePoints),
169
+ current_values: [...new Set(currentValues)].sort(compareUnicodeCodePoints),
170
170
  });
171
171
  const candidateConfidence = (signals) => {
172
172
  const kinds = new Set(signals.map(({ kind }) => kind));
@@ -216,10 +216,10 @@ const normalizeCurrentPath = (raw) => {
216
216
  };
217
217
  const uniquePaths = (paths) => [
218
218
  ...new Map(paths.map((path) => [
219
- `${path.kind}\0${path.value}\0${String(path.allowSuffix)}`,
219
+ compositeKey([path.kind, path.value, String(path.allowSuffix)]),
220
220
  path,
221
221
  ])).values(),
222
- ].sort((left, right) => compareCodePoints(`${left.kind}\0${left.value}`, `${right.kind}\0${right.value}`));
222
+ ].sort((left, right) => compareUnicodeCodePoints(compositeKey([left.kind, left.value]), compositeKey([right.kind, right.value])));
223
223
  const pathSuffixes = (path) => {
224
224
  const parts = path.split("/");
225
225
  return parts.map((_, index) => parts.slice(index).join("/"));
@@ -0,0 +1,114 @@
1
+ import { z } from "zod";
2
+ import { localPathStringSchema } from "../localPath.js";
3
+ /**
4
+ * Caller intent for JEB-backed inspection, independent of the engine build.
5
+ *
6
+ * JEB resolves paths on the host running the JEB client that serves MCP; REA
7
+ * never launches the engine or opens the target itself.
8
+ */
9
+ export const jebInputSchemas = {
10
+ inspect_jeb_client: z.strictObject({}),
11
+ open_jeb_project: z.strictObject({
12
+ path: localPathStringSchema.describe("Artifact file or existing .jdb2 project database, resolved by the running JEB client"),
13
+ }),
14
+ list_jeb_units: z.strictObject({
15
+ filter: z
16
+ .string()
17
+ .optional()
18
+ .describe("Wildcard filter matched against unit paths; '*' allowed"),
19
+ parent_unit_path: z
20
+ .string()
21
+ .min(1)
22
+ .optional()
23
+ .describe("Restrict results to descendants of this unit path"),
24
+ index: z
25
+ .number()
26
+ .int()
27
+ .nonnegative()
28
+ .default(0)
29
+ .describe("Zero-based index of the first result to return"),
30
+ count: z
31
+ .number()
32
+ .int()
33
+ .min(1)
34
+ .max(100)
35
+ .default(100)
36
+ .describe("Maximum results to return; the engine protocol caps pages at 100"),
37
+ }),
38
+ decompile_jeb_item: z.strictObject({
39
+ unit_path: z
40
+ .string()
41
+ .min(1)
42
+ .optional()
43
+ .describe("Target code unit; the engine's first code unit in the project when omitted"),
44
+ item_address: z
45
+ .string()
46
+ .min(1)
47
+ .describe("Type or method address within the unit, as listed by the engine"),
48
+ item_kind: z.enum(["type", "method"]).describe("Kind of item to decompile"),
49
+ }),
50
+ };
51
+ /** Validate operation and input together so their types remain correlated. */
52
+ export const jebRequestSchema = z.discriminatedUnion("operation", [
53
+ z.strictObject({
54
+ operation: z.literal("inspect_jeb_client"),
55
+ input: jebInputSchemas.inspect_jeb_client,
56
+ }),
57
+ z.strictObject({
58
+ operation: z.literal("open_jeb_project"),
59
+ input: jebInputSchemas.open_jeb_project,
60
+ }),
61
+ z.strictObject({
62
+ operation: z.literal("list_jeb_units"),
63
+ input: jebInputSchemas.list_jeb_units,
64
+ }),
65
+ z.strictObject({
66
+ operation: z.literal("decompile_jeb_item"),
67
+ input: jebInputSchemas.decompile_jeb_item,
68
+ }),
69
+ ]);
70
+ const engine = z.strictObject({
71
+ name: z.string().min(1),
72
+ version: z.string().nullable(),
73
+ endpoint: z.string().min(1),
74
+ gui_client: z.boolean().nullable(),
75
+ });
76
+ const unit = z.strictObject({
77
+ unit_path: z.string(),
78
+ unit_type: z.string(),
79
+ });
80
+ /** Portable JEB observations with explicit identity and coverage limitations. */
81
+ export const jebResultSchemas = {
82
+ inspect_jeb_client: z.strictObject({
83
+ engine,
84
+ startup_ts: z.number().int().nonnegative().nullable(),
85
+ message: z.string().nullable(),
86
+ }),
87
+ open_jeb_project: z.strictObject({
88
+ engine,
89
+ project_name: z.string().nullable(),
90
+ creation_datetime: z.string().nullable(),
91
+ input_files: z.array(z.strictObject({
92
+ file_name: z.string(),
93
+ file_size: z.number().int().nonnegative(),
94
+ contents_sha256_hash: z.string(),
95
+ })),
96
+ units: z.array(unit),
97
+ }),
98
+ list_jeb_units: z.strictObject({
99
+ engine,
100
+ filter: z.string().nullable(),
101
+ parent_unit_path: z.string().nullable(),
102
+ index: z.number().int().nonnegative(),
103
+ count: z.number().int().positive(),
104
+ units: z.array(unit),
105
+ coverage: z.enum(["complete", "partial"]),
106
+ }),
107
+ decompile_jeb_item: z.strictObject({
108
+ engine,
109
+ unit_path: z.string().nullable(),
110
+ item_address: z.string(),
111
+ item_kind: z.enum(["type", "method"]),
112
+ text: z.string(),
113
+ }),
114
+ };
@@ -1,10 +1,10 @@
1
1
  /** Encode ordinary JSON as bounded string parts without a document-sized allocation. */
2
2
  export function* jsonParts(value, pretty = false) {
3
- yield* encodeValue(value, pretty, 0, new Set(), false);
3
+ yield* encodeValue(value, pretty, false);
4
4
  }
5
5
  /** Encode validated JSON with canonical key ordering without allocating the whole document. */
6
6
  export function* canonicalJsonParts(value) {
7
- yield* encodeValue(value, false, 0, new Set(), true);
7
+ yield* encodeValue(value, false, true);
8
8
  }
9
9
  /** Buffer JSON parts while preserving complete UTF-16 surrogate pairs. */
10
10
  export function* bufferedJsonParts(parts) {
@@ -41,69 +41,123 @@ function* encodeString(value) {
41
41
  }
42
42
  yield '"';
43
43
  }
44
- function* encodeValue(value, pretty, depth, ancestors, canonical) {
45
- if (typeof value === "string") {
46
- yield* encodeString(value);
47
- return;
48
- }
49
- if (value === null || typeof value === "boolean") {
50
- yield value === null ? "null" : String(value);
51
- return;
52
- }
53
- if (typeof value === "number" && Number.isFinite(value)) {
54
- yield String(value);
55
- return;
56
- }
44
+ /** Encoded text accumulated before it is yielded as one part. */
45
+ const PART_CHARACTERS = 16 * 1024;
46
+ const indentation = [];
47
+ const indent = (depth) => (indentation[depth] ??= `\n${" ".repeat(depth)}`);
48
+ /** Encoded text of a scalar, or undefined for a container or a long string. */
49
+ const scalarText = (value) => {
50
+ if (typeof value === "string")
51
+ return value.length <= 8192 ? JSON.stringify(value) : undefined;
52
+ if (value === null)
53
+ return "null";
54
+ if (typeof value === "boolean")
55
+ return String(value);
56
+ if (typeof value === "number" && Number.isFinite(value))
57
+ return String(value);
58
+ return undefined;
59
+ };
60
+ const openContainer = (value, depth, ancestors, canonical) => {
57
61
  if (typeof value !== "object" || value === null)
58
62
  throw new TypeError("JSON output requires ordinary JSON values");
59
63
  if (ancestors.has(value))
60
64
  throw new TypeError("JSON output contains a circular reference");
61
- if (!Array.isArray(value) &&
62
- Object.prototype.toString.call(value) !== "[object Object]")
65
+ const array = Array.isArray(value);
66
+ if (!array && Object.prototype.toString.call(value) !== "[object Object]")
63
67
  throw new TypeError("JSON output requires ordinary JSON objects");
64
68
  ancestors.add(value);
65
- try {
66
- const array = Array.isArray(value);
67
- const keys = array ? undefined : Object.keys(value);
68
- if (canonical)
69
- keys?.sort();
70
- const count = array ? value.length : (keys?.length ?? 0);
71
- let written = 0;
72
- yield array ? "[" : "{";
73
- for (let index = 0; index < count; index += 1) {
74
- let item;
75
- let key;
76
- if (array) {
77
- item = value[index];
69
+ const keys = array ? undefined : Object.keys(value);
70
+ if (canonical)
71
+ keys?.sort();
72
+ const count = array ? value.length : (keys?.length ?? 0);
73
+ return { value, array, keys, count, depth, index: 0, written: 0 };
74
+ };
75
+ /** The next written member of a container, skipping values JSON omits. */
76
+ const nextMember = (frame) => {
77
+ while (frame.index < frame.count) {
78
+ const index = frame.index;
79
+ frame.index += 1;
80
+ if (frame.array)
81
+ return { key: undefined, item: Reflect.get(frame.value, index) };
82
+ const key = frame.keys?.[index];
83
+ if (key === undefined)
84
+ throw new TypeError("JSON object changed during serialization");
85
+ const item = Reflect.get(frame.value, key);
86
+ // Incur's filter can select inherited methods. Match native JSON's
87
+ // omission without eagerly reading the rest of a bounded result.
88
+ if (item !== undefined &&
89
+ typeof item !== "function" &&
90
+ typeof item !== "symbol")
91
+ return { key, item };
92
+ }
93
+ return undefined;
94
+ };
95
+ /**
96
+ * Encode iteratively into bounded parts. Recursive `yield*` delegation passed
97
+ * every token through one generator frame per nesting level, which dominated
98
+ * the cost of writing large nested results.
99
+ */
100
+ function* encodeValue(root, pretty, canonical) {
101
+ const ancestors = new Set();
102
+ const stack = [];
103
+ let buffer = "";
104
+ let pending = root;
105
+ let hasPending = true;
106
+ while (true) {
107
+ if (hasPending) {
108
+ hasPending = false;
109
+ const text = scalarText(pending);
110
+ if (text !== undefined)
111
+ buffer += text;
112
+ else if (typeof pending === "string") {
113
+ // A long string is split into surrogate-safe parts of its own.
114
+ if (buffer !== "")
115
+ yield buffer;
116
+ buffer = "";
117
+ yield* encodeString(pending);
78
118
  }
79
119
  else {
80
- key = keys?.[index];
81
- if (key === undefined)
82
- throw new TypeError("JSON object changed during serialization");
83
- item = Reflect.get(value, key);
84
- // Incur's filter can select inherited methods. Match native JSON's
85
- // omission without eagerly reading the rest of a bounded result.
86
- if (item === undefined ||
87
- typeof item === "function" ||
88
- typeof item === "symbol")
89
- continue;
120
+ const frame = openContainer(pending, stack.length, ancestors, canonical);
121
+ stack.push(frame);
122
+ buffer += frame.array ? "[" : "{";
90
123
  }
91
- if (written > 0)
92
- yield ",";
93
- if (pretty)
94
- yield `\n${" ".repeat(depth + 1)}`;
95
- if (key !== undefined) {
96
- yield* encodeString(key);
97
- yield pretty ? ": " : ":";
124
+ }
125
+ if (buffer.length >= PART_CHARACTERS) {
126
+ yield buffer;
127
+ buffer = "";
128
+ }
129
+ const frame = stack.at(-1);
130
+ if (frame === undefined)
131
+ break;
132
+ const member = nextMember(frame);
133
+ if (member === undefined) {
134
+ if (pretty && frame.written > 0)
135
+ buffer += indent(frame.depth);
136
+ buffer += frame.array ? "]" : "}";
137
+ ancestors.delete(frame.value);
138
+ stack.pop();
139
+ continue;
140
+ }
141
+ if (frame.written > 0)
142
+ buffer += ",";
143
+ if (pretty)
144
+ buffer += indent(frame.depth + 1);
145
+ if (member.key !== undefined) {
146
+ const key = scalarText(member.key);
147
+ if (key !== undefined)
148
+ buffer += key;
149
+ else {
150
+ if (buffer !== "")
151
+ yield buffer;
152
+ buffer = "";
153
+ yield* encodeString(member.key);
98
154
  }
99
- yield* encodeValue(item, pretty, depth + 1, ancestors, canonical);
100
- written += 1;
155
+ buffer += pretty ? ": " : ":";
101
156
  }
102
- if (pretty && written > 0)
103
- yield `\n${" ".repeat(depth)}`;
104
- yield array ? "]" : "}";
105
- }
106
- finally {
107
- ancestors.delete(value);
157
+ frame.written += 1;
158
+ pending = member.item;
159
+ hasPending = true;
108
160
  }
161
+ if (buffer !== "")
162
+ yield buffer;
109
163
  }