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
@@ -1,4 +1,5 @@
1
1
  import { semanticContainer, semanticPropertyPointer, } from "../../domain/javascript/javascriptSemanticSlots.js";
2
+ import { digestCanonicalValue } from "../../domain/canonicalDigest.js";
2
3
  import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
3
4
  import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
4
5
  import { observedSemanticEvidence, unknownSemanticEvidence, } from "./JavaScriptSemanticGraphEvidence.js";
@@ -72,17 +73,20 @@ const projectValue = (input) => {
72
73
  detail: `Initializer container has unknown ${value.status === "object" ? "properties" : "items"}${container.coverage.omitted === null ? " with an unknown omitted count" : `; ${container.coverage.omitted} omitted`}.`,
73
74
  candidate_node_ids: [target.node_id],
74
75
  evidence: unknownSemanticEvidence(context.file, binding.definitions[0]?.location ?? null),
75
- }));
76
+ }, context.state.evidenceContexts));
76
77
  }
77
- else if (value.status === "unknown" && value.resourceLimit !== undefined) {
78
+ else if (value.status === "unknown" ||
79
+ value.status === "ambiguous" ||
80
+ value.status === "cycle") {
78
81
  const location = binding.definitions[0]?.location ?? null;
79
82
  const evidence = observedSemanticEvidence(context.file, location);
80
- const isPropertyValue = role.startsWith("property:");
81
83
  addSemanticGraphUnknown(context.state, createJavaScriptSemanticGraphUnknown({
82
84
  node_id: target.node_id,
83
- family: isPropertyValue ? "object-flow" : "data-flow",
84
- relation_kinds: [isPropertyValue ? "writes-property" : "defines"],
85
- reason: "resource-limit",
85
+ family: "data-flow",
86
+ relation_kinds: ["defines"],
87
+ reason: value.resourceLimit === undefined
88
+ ? "unknown-value"
89
+ : "resource-limit",
86
90
  detail: `${value.reason} Unknown value at ${role}.`,
87
91
  candidate_node_ids: [target.node_id],
88
92
  evidence: {
@@ -92,17 +96,27 @@ const projectValue = (input) => {
92
96
  confidence: "unknown",
93
97
  limitations: [value.reason],
94
98
  },
95
- }));
99
+ }, context.state.evidenceContexts));
96
100
  }
97
101
  };
98
- const addLiteralNode = (context, binding, value, role) => retainSemanticGraphNode(context.state, context.file, {
99
- kind: "literal",
100
- roleKey: `literal:${binding.bindingId}:${role}:${JSON.stringify(value)}`,
101
- location: binding.definitions[0]?.location ?? null,
102
- label: JSON.stringify(value),
103
- functionNodeId: context.bindingNodes.get(binding.bindingId)?.function_node_id ?? null,
104
- properties: { value },
105
- });
102
+ const addLiteralNode = (context, binding, value, role) => {
103
+ const encodedValue = JSON.stringify(value);
104
+ const valueDigest = `value-sha256:${digestCanonicalValue(value, "Semantic literal")}`;
105
+ const valueKey = encodedValue.length <= valueDigest.length ? encodedValue : valueDigest;
106
+ const stringLabel = "string literal";
107
+ return retainSemanticGraphNode(context.state, context.file, {
108
+ kind: "literal",
109
+ // Identity needs an exact value commitment, not another payload copy.
110
+ // Keep the complete literal in properties for queries and Evidence export.
111
+ roleKey: `literal:${binding.bindingId}:${role}:${valueKey}`,
112
+ location: binding.definitions[0]?.location ?? null,
113
+ label: typeof value === "string" && encodedValue.length > stringLabel.length
114
+ ? stringLabel
115
+ : encodedValue,
116
+ functionNodeId: context.bindingNodes.get(binding.bindingId)?.function_node_id ?? null,
117
+ properties: { value },
118
+ });
119
+ };
106
120
  /** Create one canonical slot for a root binding and exact static property path. */
107
121
  export const semanticPropertySlot = (context, objectBindingId, path, fact) => retainSemanticGraphNode(context.state, context.file, {
108
122
  kind: "property-slot",
@@ -1,25 +1,30 @@
1
1
  import { z } from "zod";
2
2
  import { AnalysisInputError, AnalysisProtocolError, } from "../../domain/analysisErrorCore.js";
3
3
  import {} from "../../domain/analysisErrorBase.js";
4
+ import { applicationGraphEvidenceInputError, parseApplicationGraphEvidence, } from "./JavaScriptApplicationEvidenceGraph.js";
4
5
  import { jsonValueSchema } from "../../domain/jsonValue.js";
5
6
  import { queryJavaScriptSemanticGraph } from "../../domain/javascript/javascriptSemanticQuery.js";
6
7
  import { javaScriptSemanticTraceResultSchema, traceJavaScriptSemanticsInputSchema, } from "../../domain/javascript/javascriptSemanticTraceSchemas.js";
7
8
  import { err, ok } from "../../domain/result.js";
8
- import { parseApplicationGraphEvidence } from "./JavaScriptApplicationEvidenceGraph.js";
9
9
  import { createJavaScriptSemanticTraceEvidence } from "./JavaScriptApplicationWorkflowEvidence.js";
10
10
  const OPERATION = "trace_javascript_semantics";
11
11
  /** Trace semantic relations from input already parsed by a trusted adapter. */
12
12
  export const traceJavaScriptSemanticsEvidenceValidated = (input) => {
13
+ const sourceResult = parseApplicationGraphEvidence(input.application, [
14
+ "application",
15
+ ]);
16
+ if (!sourceResult.ok)
17
+ return err(applicationGraphEvidenceInputError(OPERATION, sourceResult.error));
18
+ const source = sourceResult.value;
19
+ if (source.semanticGraph === null)
20
+ return err(new AnalysisInputError(OPERATION, undefined, [
21
+ {
22
+ path: ["application"],
23
+ reason: "invalid_value",
24
+ expected: "inline Evidence from analyze_javascript_application with a semantic graph",
25
+ },
26
+ ]));
13
27
  try {
14
- const source = parseApplicationGraphEvidence(input.application);
15
- if (source.semanticGraph === null)
16
- return err(new AnalysisInputError(OPERATION, undefined, [
17
- {
18
- path: ["application"],
19
- reason: "invalid_value",
20
- expected: "inline Evidence from analyze_javascript_application with a semantic graph",
21
- },
22
- ]));
23
28
  const query = queryJavaScriptSemanticGraph(source.semanticGraph, input.query);
24
29
  const result = javaScriptSemanticTraceResultSchema.parse({
25
30
  ...query,
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { jebRequestSchema, } from "../../domain/jeb/jebAnalysis.js";
2
+ import { executeProviderOperation } from "../ProviderOperationExecution.js";
3
+ /** Shared CLI/MCP admission, execution and Evidence composition for JEB. */
4
+ export class JebAnalysisService {
5
+ provider;
6
+ constructor(provider) {
7
+ this.provider = provider;
8
+ }
9
+ /** Run one caller-selected JEB request and retain engine provenance inline. */
10
+ async execute(operation, input, options) {
11
+ return executeProviderOperation(operation, input, options, jebRequestSchema, this.provider, operation === "decompile_jeb_item" ? "derived" : "observed");
12
+ }
13
+ }
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
3
3
  import {} from "../../domain/analysisErrorBase.js";
4
- import { createEvidence } from "../../domain/evidence.js";
4
+ import { createEvidence, } from "../../domain/evidence.js";
5
5
  import { jsonValueSchema } from "../../domain/jsonValue.js";
6
6
  import { managedApplicationGraphResultSchema, projectManagedApplicationGraph, projectManagedApplicationGraphInputSchema, } from "../../domain/managed/managedApplicationGraph.js";
7
7
  import { err, ok } from "../../domain/result.js";
@@ -3,16 +3,14 @@ import { parseRelatedAddresses, referenceKindSchema, } from "../../domain/hopper
3
3
  import { err, ok } from "../../domain/result.js";
4
4
  import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
5
5
  const referencesSchema = z.object({
6
- reference_kinds_available: z.boolean().optional(),
6
+ reference_kinds_available: z.boolean(),
7
7
  references: z.array(z.object({
8
8
  source_address: z.string(),
9
9
  target_address: z.string(),
10
10
  target_procedure: z.object({ address: z.string() }).nullable(),
11
11
  kind: referenceKindSchema,
12
12
  })),
13
- unresolved_calls: z
14
- .array(z.object({ address: z.string(), reason: z.string() }))
15
- .default([]),
13
+ unresolved_calls: z.array(z.object({ address: z.string(), reason: z.string() })),
16
14
  });
17
15
  /** Prefer typed static call references, preserving computed targets and targetless sites. */
18
16
  export const readNativeCallRoutes = async (analysis, procedure, signal) => {
@@ -35,14 +35,23 @@ export const traceNativeUiAction = async (analysis, input, signal) => {
35
35
  if (decoded.data.target_sha256 !== targetSha256)
36
36
  return err(new AnalysisOutputError("decode_interface_builder", "UI and native provider results refer to different target SHA-256 values"));
37
37
  graph = joinInterfaceBuilderDispatch(decoded.data.graph, metadata.result);
38
+ const archiveDecode = decoded.data.graph.coverage.find((facet) => facet.facet === "archive_decode");
39
+ const documentsFound = decoded.data.documents.length > 0;
38
40
  coverage.push({
39
41
  facet: "interface_builder_archives",
40
- status: decoded.data.documents.length > 0 ? "complete" : "unsupported",
41
- reason: decoded.data.documents.length > 0
42
- ? null
43
- : "no_compiled_interface_builder_archives_found",
44
- examined: decoded.data.documents.length,
45
- omitted: 0,
42
+ status: archiveDecode?.status === "partial" ||
43
+ archiveDecode?.status === "complete" ||
44
+ archiveDecode?.status === "unsupported"
45
+ ? archiveDecode.status
46
+ : documentsFound
47
+ ? "complete"
48
+ : "unsupported",
49
+ reason: archiveDecode?.reason ??
50
+ (documentsFound
51
+ ? null
52
+ : "no_compiled_interface_builder_archives_found"),
53
+ examined: archiveDecode?.examined ?? decoded.data.documents.length,
54
+ omitted: archiveDecode?.omitted ?? 0,
46
55
  });
47
56
  const bounded = boundUiGraph(graph, input.max_nodes, input.max_edges);
48
57
  graph = bounded.graph;
@@ -218,8 +227,7 @@ const resolveUiAction = (graph, query) => {
218
227
  };
219
228
  const objectMatches = graph.nodes.filter((node) => ["control", "view", "view_controller", "scene"].includes(node.kind) &&
220
229
  (node.id === query ||
221
- node.attributes.interface_builder_object_id === query ||
222
- node.id.endsWith(`:object:${query}`)));
230
+ node.attributes.interface_builder_object_id === query));
223
231
  const actionIds = new Set(graph.edges.flatMap((edge) => edge.resolution === "observed" &&
224
232
  edge.relation === "target_action" &&
225
233
  objectMatches.some(({ id }) => edge.from === id) &&
@@ -8,6 +8,7 @@ import { err, ok } from "../../domain/result.js";
8
8
  export const traceNativeValues = async (analysis, parameters, signal) => {
9
9
  const input = nativeValueTraceInputSchema.parse(parameters);
10
10
  const nodes = [];
11
+ const nodeIds = new Set();
11
12
  const edges = [];
12
13
  const procedures = [];
13
14
  const unknowns = [];
@@ -116,24 +117,27 @@ export const traceNativeValues = async (analysis, parameters, signal) => {
116
117
  bytes += size;
117
118
  ids.add(operation.id);
118
119
  nodes.push(node);
120
+ nodeIds.add(node.id);
119
121
  }
120
122
  for (const parameter of flow.parameters) {
121
123
  if (nodes.length >= input.max_nodes) {
122
124
  truncated = true;
123
125
  break;
124
126
  }
127
+ const id = `${address}/parameter:${parameter.ordinal}`;
125
128
  nodes.push({
126
- id: `${address}/parameter:${parameter.ordinal}`,
129
+ id,
127
130
  procedure: address,
128
131
  evidence_id: evidenceId,
129
132
  kind: "parameter",
130
133
  operation: null,
131
134
  parameter,
132
135
  });
136
+ nodeIds.add(id);
133
137
  }
134
138
  for (const use of flow.parameter_uses) {
135
139
  if (!ids.has(use.use) ||
136
- !nodes.some((node) => node.id === `${address}/parameter:${use.ordinal}`))
140
+ !nodeIds.has(`${address}/parameter:${use.ordinal}`))
137
141
  continue;
138
142
  if (edges.length >= input.max_edges) {
139
143
  truncated = true;
@@ -243,8 +247,23 @@ export const traceNativeValues = async (analysis, parameters, signal) => {
243
247
  }
244
248
  if (targetSha256 === undefined)
245
249
  return err(new AnalysisOutputError("trace_native_values", "No seed function could be analyzed"));
250
+ const parametersByProcedure = new Map();
251
+ const returnsByProcedure = new Map();
252
+ for (const node of nodes) {
253
+ if (node.kind === "parameter") {
254
+ const parameters = parametersByProcedure.get(node.procedure) ?? [];
255
+ parameters.push(node);
256
+ parametersByProcedure.set(node.procedure, parameters);
257
+ }
258
+ else if (node.operation?.opcode === "RETURN" &&
259
+ node.operation.inputs.length > 1) {
260
+ const returns = returnsByProcedure.get(node.procedure) ?? [];
261
+ returns.push(node);
262
+ returnsByProcedure.set(node.procedure, returns);
263
+ }
264
+ }
246
265
  for (const binding of callBindings) {
247
- const parameters = nodes.filter((node) => node.procedure === binding.callee && node.kind === "parameter");
266
+ const parameters = parametersByProcedure.get(binding.callee) ?? [];
248
267
  if (parameters.length === 0)
249
268
  unknowns.push({
250
269
  procedure: binding.caller,
@@ -275,9 +294,7 @@ export const traceNativeValues = async (analysis, parameters, signal) => {
275
294
  });
276
295
  }
277
296
  if (binding.output)
278
- for (const node of nodes.filter((node) => node.procedure === binding.callee &&
279
- node.operation?.opcode === "RETURN" &&
280
- node.operation.inputs.length > 1)) {
297
+ for (const node of returnsByProcedure.get(binding.callee) ?? []) {
281
298
  if (edges.length >= input.max_edges) {
282
299
  truncated = true;
283
300
  break;
@@ -1,4 +1,3 @@
1
- import { readFile } from "node:fs/promises";
2
1
  import { z } from "zod";
3
2
  import { AnalysisError } from "../../domain/analysisErrorBase.js";
4
3
  import { AnalysisInputError } from "../../domain/analysisErrorCore.js";
@@ -11,9 +10,12 @@ import { processTraceSpecificationSchema } from "../../domain/process/processTra
11
10
  import { processScenarioSchema } from "../../domain/process/processScenario.js";
12
11
  import { compareProcessCaptures } from "../../domain/process/processComparison.js";
13
12
  import { parseProcessCapture } from "../../domain/process/processCaptureParsing.js";
13
+ import { createProgressReporter } from "../ProgressReporter.js";
14
14
  import { captureProcessScenario } from "../../process/capture/ProcessHarness.js";
15
+ import { ProcessCaptureResourceScope } from "../../process/capture/ProcessCaptureLifecycle.js";
15
16
  import { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
16
17
  import { createProcessCaptureEvidence } from "./ProcessEvidence.js";
18
+ import { readJsonFile } from "../JsonFiles.js";
17
19
  /** Identify the process workflow's typed diagnostic result for CLI exit status. */
18
20
  export const isProcessCliFailure = (value) => typeof value === "object" &&
19
21
  value !== null &&
@@ -30,7 +32,19 @@ export const captureProcessScenarioFile = async (path, environment = process.env
30
32
  const parsed = processScenarioSchema.safeParse(input);
31
33
  if (!parsed.success)
32
34
  throw analysisInputErrorFromIssues("capture_process_scenario", parsed.error.issues, input, { cause: parsed.error });
33
- const captured = await captureProcessScenario(parsed.data, signal, process.platform, environment);
35
+ const progress = createProgressReporter(async (update) => {
36
+ process.stderr.write(`${JSON.stringify({ rea_progress: update })}\n`);
37
+ }, { minimumIntervalMs: 100 });
38
+ const resourceScope = new ProcessCaptureResourceScope();
39
+ const captured = await captureProcessScenario(parsed.data, signal, process.platform, environment, undefined, undefined, progress, resourceScope);
40
+ try {
41
+ await resourceScope.close();
42
+ }
43
+ catch (cause) {
44
+ if (!captured.ok)
45
+ return cliAnalysisError(captured.error);
46
+ throw cause;
47
+ }
34
48
  if (!captured.ok)
35
49
  return cliAnalysisError(captured.error);
36
50
  return createProcessCaptureEvidence(parsed.data, captured.value);
@@ -115,24 +129,15 @@ const parseTraceSpecification = (input) => {
115
129
  };
116
130
  const invalidCaptureEvidence = (cause) => new ProcessCliFailure("invalid_input", `Capture evidence is malformed (${describeValidationFailure(cause)}). Create new capture evidence, then try again.`);
117
131
  const readJson = async (path) => {
118
- let bytes;
119
- try {
120
- bytes = await readFile(path);
121
- }
122
- catch (cause) {
123
- throw new ProcessCliFailure("invalid_input", `Process input file could not be read: ${path} (${describeValidationFailure(cause)}). Check the reported filesystem constraint and retry.`);
124
- }
125
- try {
126
- const text = new TextDecoder("utf-8", {
127
- fatal: true,
128
- ignoreBOM: true,
129
- }).decode(bytes);
130
- const parsed = JSON.parse(text);
131
- return parsed;
132
- }
133
- catch (cause) {
134
- throw new ProcessCliFailure("invalid_input", `Process input file is not valid UTF-8 JSON: ${path} (${describeValidationFailure(cause)}). Repair the file, then try again.`);
135
- }
132
+ const loaded = await readJsonFile(path);
133
+ if (loaded.ok)
134
+ return loaded.value;
135
+ if (loaded.error._tag !== "EvidenceFileError")
136
+ throw loaded.error;
137
+ const detail = describeValidationFailure(loaded.error.cause);
138
+ throw new ProcessCliFailure("invalid_input", loaded.error.reason === "invalid-json"
139
+ ? `Process input file is not valid UTF-8 JSON: ${path} (${detail}). Repair the file, then try again.`
140
+ : `Process input file could not be read: ${path} (${detail}). Check the reported filesystem constraint and retry.`);
136
141
  };
137
142
  class ProcessCliFailure extends Error {
138
143
  category;
@@ -1,6 +1,17 @@
1
1
  import { posix } from "node:path";
2
+ import { logicalPathNfc } from "../domain/artifactIdentity.js";
3
+ import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
2
4
  import { ArtifactReaderFailure } from "./ArtifactReader.js";
3
5
  const DRIVE_OR_UNC = /^(?:[A-Za-z]:|\\|\/\/)/u;
6
+ /**
7
+ * English Unicode case folding used only to describe logical names a
8
+ * case-insensitive destination might collapse. It is not a filesystem case table.
9
+ */
10
+ const ENGLISH_UNICODE_CASE_NOTE = "This comparison is not a filesystem observation.";
11
+ /** Inventory limitation when logical names collide under English Unicode case folding. */
12
+ export const ENGLISH_UNICODE_CASE_INVENTORY_LIMITATION = `Logical archive names collide under English (en-US) Unicode case folding; a case-insensitive destination cannot store both spellings. ${ENGLISH_UNICODE_CASE_NOTE}`;
13
+ /** User-facing prefix for a destination that cannot keep two logical spellings. */
14
+ export const DESTINATION_CASE_COLLISION_PREFIX = "Destination filesystem cannot store both ";
4
15
  /** Normalize an untrusted logical archive path without touching filesystem. */
5
16
  export const normalizeArtifactPath = (input) => {
6
17
  if (input.includes("\0") ||
@@ -8,7 +19,7 @@ export const normalizeArtifactPath = (input) => {
8
19
  input.startsWith("/") ||
9
20
  DRIVE_OR_UNC.test(input))
10
21
  throw new ArtifactReaderFailure("path", `Artifact path is absolute or unsafe: ${JSON.stringify(input)}`);
11
- const normalized = input.normalize("NFC").replace(/\/+$/u, "");
22
+ const normalized = logicalPathNfc(input).replace(/\/+$/u, "");
12
23
  const parts = normalized.split("/");
13
24
  if (normalized.length === 0 ||
14
25
  parts.some((part) => part === "" || part === "." || part === "..") ||
@@ -16,7 +27,7 @@ export const normalizeArtifactPath = (input) => {
16
27
  throw new ArtifactReaderFailure("path", `Artifact path is not normalized: ${JSON.stringify(input)}`);
17
28
  return normalized;
18
29
  };
19
- /** Reject exact, Unicode-normalized, case-folded, and prefix collisions. */
30
+ /** Reject exact and same-spelling prefix collisions. Case-distinct names stay distinct. */
20
31
  export class ArtifactPathRegistry {
21
32
  #root = { kind: undefined, children: new Map() };
22
33
  add(path, kind) {
@@ -25,13 +36,10 @@ export class ArtifactPathRegistry {
25
36
  for (const [index, part] of parts.entries()) {
26
37
  if (node.kind !== undefined && node.kind !== "directory")
27
38
  throw new ArtifactReaderFailure("path", `Artifact prefix conflict: ${path}`);
28
- const foldedPart = part.toLocaleLowerCase("en-US");
29
- let child = node.children.get(foldedPart);
30
- if (child !== undefined && child.spelling !== part)
31
- throw new ArtifactReaderFailure("path", `Artifact path collision: ${path} differs only in case from ${[...parts.slice(0, index), child.spelling].join("/")}`);
39
+ let child = node.children.get(part);
32
40
  if (child === undefined) {
33
- child = { spelling: part, kind: undefined, children: new Map() };
34
- node.children.set(foldedPart, child);
41
+ child = { kind: undefined, children: new Map() };
42
+ node.children.set(part, child);
35
43
  }
36
44
  node = child;
37
45
  if (index === parts.length - 1) {
@@ -44,3 +52,116 @@ export class ArtifactPathRegistry {
44
52
  node.kind = kind;
45
53
  }
46
54
  }
55
+ const emptyCaseNode = () => ({
56
+ bySpelling: new Map(),
57
+ spellingsByFold: new Map(),
58
+ terminals: [],
59
+ });
60
+ const englishCaseFold = (part) => part.toLocaleLowerCase("en-US");
61
+ /**
62
+ * Record English (en-US) Unicode case collisions on each affected occurrence.
63
+ * Returns the inventory limitation when any logical names collide.
64
+ */
65
+ export const annotateEnglishUnicodeCaseCollisions = (occurrences) => {
66
+ const collisions = englishUnicodeCaseCollisions(occurrences.map(({ logical_path }) => logical_path));
67
+ if (collisions.size === 0)
68
+ return undefined;
69
+ for (const occurrence of occurrences)
70
+ for (const collision of collisions.get(occurrence.logical_path) ?? [])
71
+ occurrence.limitations.push(caseCollisionLimitation(occurrence.logical_path, collision));
72
+ return ENGLISH_UNICODE_CASE_INVENTORY_LIMITATION;
73
+ };
74
+ const caseCollisionLimitation = (path, { prefix, other, additional }) => {
75
+ const others = additional === 0
76
+ ? other
77
+ : `${other} and ${String(additional)} other spelling${additional === 1 ? "" : "s"}`;
78
+ const subject = prefix === path
79
+ ? `Logical path ${path} collides`
80
+ : `Logical path ${path} is under ${prefix}, which collides`;
81
+ return `${subject} under English (en-US) Unicode case folding with ${others}; a case-insensitive destination cannot store both. ${ENGLISH_UNICODE_CASE_NOTE}`;
82
+ };
83
+ /**
84
+ * Name the directory-listing spelling that differs from the requested segment
85
+ * only by English (en-US) Unicode case. Exact matches are the same logical name.
86
+ */
87
+ export const destinationCaseCollisionMessage = (requestedPath, existingNames) => {
88
+ const slash = requestedPath.lastIndexOf("/");
89
+ const segment = slash < 0 ? requestedPath : requestedPath.slice(slash + 1);
90
+ if (existingNames.includes(segment))
91
+ return undefined;
92
+ const folded = englishCaseFold(segment);
93
+ const existing = existingNames
94
+ .filter((name) => englishCaseFold(name) === folded)
95
+ .sort(compareUnicodeCodePoints)[0];
96
+ if (existing === undefined)
97
+ return undefined;
98
+ const parent = slash < 0 ? "" : requestedPath.slice(0, slash + 1);
99
+ return `${DESTINATION_CASE_COLLISION_PREFIX}${requestedPath} and ${parent}${existing}; inventory retains both logical names.`;
100
+ };
101
+ const englishUnicodeCaseCollisions = (paths) => {
102
+ const root = emptyCaseNode();
103
+ for (const path of paths) {
104
+ if (path.length === 0 || path === ".")
105
+ continue;
106
+ let node = root;
107
+ for (const part of path.split("/")) {
108
+ let child = node.bySpelling.get(part);
109
+ if (child === undefined) {
110
+ const folded = englishCaseFold(part);
111
+ const spellings = node.spellingsByFold.get(folded);
112
+ if (spellings === undefined)
113
+ node.spellingsByFold.set(folded, [part]);
114
+ else
115
+ spellings.push(part);
116
+ child = emptyCaseNode();
117
+ node.bySpelling.set(part, child);
118
+ }
119
+ node = child;
120
+ }
121
+ node.terminals.push(path);
122
+ }
123
+ // A collision is recorded once, at the segment where spellings diverge, and
124
+ // shared down the subtree. Pairing every descendant of one spelling with
125
+ // every descendant of another grew quadratically with the subtree sizes.
126
+ // The walk is iterative because a ZIP name can hold more components than
127
+ // the call stack allows.
128
+ const collisions = new Map();
129
+ const pending = [{ node: root, prefix: undefined, chain: undefined }];
130
+ for (let item = pending.pop(); item !== undefined; item = pending.pop()) {
131
+ const { node, prefix, chain } = item;
132
+ if (chain !== undefined)
133
+ for (const path of node.terminals)
134
+ collisions.set(path, collisionsAlong(chain));
135
+ for (const spellings of node.spellingsByFold.values())
136
+ spellings.sort(compareUnicodeCodePoints);
137
+ for (const [spelling, child] of node.bySpelling) {
138
+ const childPrefix = prefix === undefined ? spelling : `${prefix}/${spelling}`;
139
+ const spellings = node.spellingsByFold.get(englishCaseFold(spelling)) ?? [];
140
+ const other = spellings[0] === spelling ? spellings[1] : spellings[0];
141
+ pending.push({
142
+ node: child,
143
+ prefix: childPrefix,
144
+ chain: other === undefined
145
+ ? chain
146
+ : {
147
+ collision: {
148
+ prefix: childPrefix,
149
+ other: prefix === undefined ? other : `${prefix}/${other}`,
150
+ additional: spellings.length - 2,
151
+ },
152
+ parent: chain,
153
+ },
154
+ });
155
+ }
156
+ }
157
+ return collisions;
158
+ };
159
+ const collisionsAlong = (chain) => {
160
+ const collisions = [];
161
+ let link = chain;
162
+ while (link !== undefined) {
163
+ collisions.push(link.collision);
164
+ link = link.parent;
165
+ }
166
+ return collisions.reverse();
167
+ };