rea-agents 6.3.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/README.md +7 -4
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/dist/adb/AdbConfiguration.js +88 -0
  6. package/dist/adb/AdbDeviceOutput.js +186 -0
  7. package/dist/adb/AdbProvider.js +1190 -0
  8. package/dist/adb/AdbShellOutput.js +309 -0
  9. package/dist/android/AndroidTargetSnapshot.js +104 -22
  10. package/dist/android/JadxConfiguration.js +44 -24
  11. package/dist/android/JadxProvider.js +51 -19
  12. package/dist/apktool/ApktoolConfiguration.js +84 -0
  13. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  14. package/dist/apktool/ApktoolProvider.js +506 -0
  15. package/dist/application/AnalysisProvider.js +8 -2
  16. package/dist/application/AppBundleExecutable.js +27 -22
  17. package/dist/application/BinaryTargetResolver.js +22 -2
  18. package/dist/application/CapabilityInventory.js +11 -1
  19. package/dist/application/ClientConfigurationDocument.js +70 -0
  20. package/dist/application/ClientConfigurationFiles.js +91 -0
  21. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  22. package/dist/application/ClientRegistrationStatus.js +66 -31
  23. package/dist/application/DirectAnalysis.js +2 -2
  24. package/dist/application/DirectAnalysisCleanup.js +1 -1
  25. package/dist/application/DirectAnalysisStatus.js +1 -1
  26. package/dist/application/Doctor.js +5 -3
  27. package/dist/application/DoctorDiagnostics.js +1 -1
  28. package/dist/application/EvidenceBundleCommands.js +6 -12
  29. package/dist/application/GeminiClientSettings.js +139 -0
  30. package/dist/application/HermesClientHome.js +115 -0
  31. package/dist/application/HopperDownload.js +39 -0
  32. package/dist/application/InvestigationProviders.js +6 -0
  33. package/dist/application/JsonFiles.js +6 -5
  34. package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
  35. package/dist/application/LinuxHopper.js +4 -12
  36. package/dist/application/MacHopper.js +172 -149
  37. package/dist/application/MipsElfAbiFlags.js +140 -0
  38. package/dist/application/ProviderOperationExecution.js +31 -0
  39. package/dist/application/ReconstructionObligationCandidates.js +9 -3
  40. package/dist/application/ReferenceSourceImport.js +76 -29
  41. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  42. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  43. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  44. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  45. package/dist/application/RegularFileRead.js +93 -7
  46. package/dist/application/Setup.js +54 -6
  47. package/dist/application/SetupClientConfiguration.js +116 -16
  48. package/dist/application/SetupHost.js +102 -24
  49. package/dist/application/SetupPlan.js +5 -8
  50. package/dist/application/SetupSkill.js +58 -39
  51. package/dist/application/SupportedClients.js +290 -65
  52. package/dist/application/Uninstall.js +158 -10
  53. package/dist/application/UpdateMaintenance.js +17 -21
  54. package/dist/application/Utf8JsonInput.js +7 -0
  55. package/dist/application/WebScriptExportService.js +131 -65
  56. package/dist/application/WebSourceLocationService.js +3 -0
  57. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  58. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  59. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  60. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  61. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  62. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  63. package/dist/application/binary/BinarySession.js +2 -1
  64. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  65. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  66. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  67. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  68. package/dist/application/evm/EvmInterfaceService.js +3 -0
  69. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  70. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  71. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  72. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  73. package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
  74. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  75. package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
  76. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  77. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
  78. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  79. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
  80. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  81. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  82. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
  83. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  84. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
  85. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
  86. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  89. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
  90. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
  91. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
  92. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
  93. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
  94. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
  95. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
  96. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  97. package/dist/application/jeb/JebAnalysisService.js +13 -0
  98. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  99. package/dist/application/native/NativeUiActionTrace.js +16 -8
  100. package/dist/application/native/NativeValueTrace.js +23 -6
  101. package/dist/application/process/ProcessCli.js +25 -20
  102. package/dist/artifacts/ArtifactPaths.js +129 -8
  103. package/dist/artifacts/ArtifactProvider.js +20 -15
  104. package/dist/artifacts/ArtifactReader.js +23 -0
  105. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  106. package/dist/artifacts/AsarArtifactReader.js +176 -102
  107. package/dist/artifacts/AsarHeader.js +24 -0
  108. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  109. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  110. package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
  111. package/dist/artifacts/SafeOutputTree.js +245 -70
  112. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  113. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  114. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  115. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  116. package/dist/artifacts/ZipArtifactReader.js +77 -27
  117. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  118. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  119. package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
  120. package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
  121. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
  122. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  123. package/dist/artifacts/inventory/classify.js +75 -32
  124. package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
  125. package/dist/artifacts/inventory/reader.js +13 -5
  126. package/dist/artifacts/inventory/scanCanonical.js +62 -25
  127. package/dist/artifacts/inventory/scanReader.js +38 -11
  128. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
  129. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  130. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  131. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  132. package/dist/browser/CdpBrowserProvider.js +5 -0
  133. package/dist/browser/CdpCaptureDocuments.js +40 -6
  134. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  135. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  136. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  137. package/dist/browser/CdpCaptureEvents.js +4 -9
  138. package/dist/browser/CdpConnection.js +22 -5
  139. package/dist/browser/CdpPageCapture.js +1 -1
  140. package/dist/browser/CdpTargetSession.js +30 -34
  141. package/dist/browser/CdpWebMcpDiscovery.js +32 -10
  142. package/dist/browser/ElectronFileScope.js +99 -9
  143. package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
  144. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  145. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  146. package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
  147. package/dist/browser/PlaywrightScenarioSession.js +127 -54
  148. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  149. package/dist/browser/PngVisualDiff.js +198 -29
  150. package/dist/browser/WebSourceMapFetcher.js +3 -3
  151. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  152. package/dist/browser/assets/PublishWebScripts.js +75 -20
  153. package/dist/browser/assets/WebArtifactReads.js +23 -1
  154. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  155. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  156. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  157. package/dist/browser/history/HarCapture.js +14 -0
  158. package/dist/browser/history/HarCaptureProcess.js +2 -10
  159. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  160. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  161. package/dist/cli/adbCommands.js +337 -0
  162. package/dist/cli/analysisViewCommands.js +39 -1
  163. package/dist/cli/apktoolCommands.js +53 -0
  164. package/dist/cli/artifactCommands.js +8 -11
  165. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  166. package/dist/cli/browserAdvancedCommands.js +65 -36
  167. package/dist/cli/coreBinaryCommands.js +0 -5
  168. package/dist/cli/coreNativeCommands.js +1 -14
  169. package/dist/cli/electronCommands.js +6 -1
  170. package/dist/cli/evmCommands.js +13 -4
  171. package/dist/cli/firmwareCommands.js +7 -2
  172. package/dist/cli/javascriptApplicationAnalysis.js +17 -1
  173. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  174. package/dist/cli/jebCommands.js +99 -0
  175. package/dist/cli/jsonOutput.js +11 -4
  176. package/dist/cli/referenceSourceImportStatus.js +7 -0
  177. package/dist/cli/setupCommands.js +15 -3
  178. package/dist/cli/utilityCommands.js +66 -18
  179. package/dist/cli/webScriptCommands.js +20 -1
  180. package/dist/cli/webSourceLocationCommands.js +21 -9
  181. package/dist/cli.js +6 -0
  182. package/dist/cliBrowserScenarioCommands.js +2 -1
  183. package/dist/cliCommandNames.js +32 -0
  184. package/dist/cliJsonInput.js +2 -2
  185. package/dist/cliObservationOptions.js +3 -0
  186. package/dist/composition/adb.js +3 -0
  187. package/dist/composition/apktool.js +3 -0
  188. package/dist/composition/binaryDiagnostics.js +4 -0
  189. package/dist/composition/directAnalysis.js +12 -4
  190. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  191. package/dist/composition/jeb.js +6 -0
  192. package/dist/config/environment.js +10 -0
  193. package/dist/config/ghidraLanguageOverride.js +9 -0
  194. package/dist/config/mcpInputSchemaProfile.js +27 -0
  195. package/dist/config/parseConfig.js +28 -1
  196. package/dist/contracts/adb/adbToolContracts.js +353 -0
  197. package/dist/contracts/advertisedInputExamples.js +48 -0
  198. package/dist/contracts/analysisDetail.js +10 -0
  199. package/dist/contracts/analysisViewToolContracts.js +17 -2
  200. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  201. package/dist/contracts/artifactToolContracts.js +8 -5
  202. package/dist/contracts/browserToolContracts.js +1 -1
  203. package/dist/contracts/compactInputSchema.js +256 -0
  204. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  205. package/dist/contracts/inputSchemaPresentation.js +10 -10
  206. package/dist/contracts/javascript/electronToolContracts.js +15 -3
  207. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  208. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  209. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  210. package/dist/contracts/officialToolContracts.js +5 -5
  211. package/dist/contracts/sessionToolContracts.js +2 -2
  212. package/dist/contracts/sessionToolSchemas.js +6 -2
  213. package/dist/contracts/toolContractExamples.js +6 -0
  214. package/dist/contracts/toolContractTypes.js +3 -0
  215. package/dist/contracts/toolContracts.js +6 -0
  216. package/dist/contracts/toolEffects.js +167 -0
  217. package/dist/contracts/toolOutputSchemaGroups.js +5 -3
  218. package/dist/contracts/toolSchemaMetadata.js +82 -7
  219. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  220. package/dist/domain/analysisErrorCleanup.js +29 -0
  221. package/dist/domain/analysisErrorPresentation.js +18 -6
  222. package/dist/domain/analysisErrorProjection.js +4 -1
  223. package/dist/domain/analysisSnapshot.js +2 -1
  224. package/dist/domain/analysisView/analysisView.js +52 -2
  225. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  226. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  227. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  228. package/dist/domain/android/androidApplication.js +25 -20
  229. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  230. package/dist/domain/apple/appleApplication.js +40 -23
  231. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  232. package/dist/domain/apple/dyldPaths.js +9 -1
  233. package/dist/domain/apple/dylibResolution.js +2 -2
  234. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  235. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  236. package/dist/domain/artifactComparison.js +35 -7
  237. package/dist/domain/artifactGraph.js +5 -3
  238. package/dist/domain/artifactIdentity.js +30 -2
  239. package/dist/domain/artifactInspection.js +3 -43
  240. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  241. package/dist/domain/artifactInventoryEvidence.js +11 -12
  242. package/dist/domain/artifactPathSyntax.js +1 -1
  243. package/dist/domain/binaryTarget.js +16 -0
  244. package/dist/domain/binaryTargetTypes.js +8 -1
  245. package/dist/domain/browserObservationSchemas.js +8 -4
  246. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  247. package/dist/domain/compactStringIdentity.js +9 -0
  248. package/dist/domain/evidence.js +2 -1
  249. package/dist/domain/evidenceRecordSummary.js +144 -0
  250. package/dist/domain/inputIssueProjection.js +16 -1
  251. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
  252. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
  253. package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
  254. package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
  255. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  256. package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
  257. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
  258. package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
  259. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  260. package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
  261. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
  262. package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
  263. package/dist/domain/javascript/javascriptAstValues.js +32 -0
  264. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  265. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  266. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
  267. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  268. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  269. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
  270. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
  271. package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
  272. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  273. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  274. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  275. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  276. package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
  277. package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
  278. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
  279. package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
  280. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
  281. package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
  282. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  283. package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
  284. package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
  285. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
  286. package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
  287. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
  288. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  289. package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
  290. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  291. package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
  292. package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
  293. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  294. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  295. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
  296. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  297. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  298. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  299. package/dist/domain/jeb/jebAnalysis.js +114 -0
  300. package/dist/domain/jsonShape.js +63 -52
  301. package/dist/domain/jsonValue.js +3 -0
  302. package/dist/domain/managed/managedApplicationGraph.js +37 -0
  303. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  304. package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
  305. package/dist/domain/managed/managedArtifact.js +1 -0
  306. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  307. package/dist/domain/native/nativeAotPe.js +1408 -0
  308. package/dist/domain/native/nativeInstruction.js +21 -0
  309. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  310. package/dist/domain/native/peResources.js +94 -0
  311. package/dist/domain/nativeConvention.js +33 -0
  312. package/dist/domain/process/processCapture.js +91 -1
  313. package/dist/domain/process/processCaptureExample.js +24 -0
  314. package/dist/domain/process/processCaptureValidation.js +79 -0
  315. package/dist/domain/process/processScenario.js +59 -7
  316. package/dist/domain/propertyListKeys.js +3 -1
  317. package/dist/domain/referenceSourceGraph.js +25 -16
  318. package/dist/domain/referenceSourceImportParsing.js +6 -3
  319. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  320. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  321. package/dist/domain/webBundleAnalyzerInspection.js +14 -2
  322. package/dist/domain/webCaptureDiff.js +102 -4
  323. package/dist/domain/webScriptExportError.js +10 -4
  324. package/dist/domain/webScriptExportPlan.js +7 -13
  325. package/dist/domain/zipPackageFormat.js +4 -1
  326. package/dist/domain/zodCollectionSteps.js +24 -0
  327. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  328. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  329. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  330. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  331. package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
  332. package/dist/dotnet/ManagedMemberRows.js +9 -4
  333. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  334. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  335. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  336. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  337. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  338. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  339. package/dist/dotnet/ManagedPeReader.js +41 -25
  340. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  341. package/dist/dotnet/ManagedStaticProvider.js +55 -24
  342. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  343. package/dist/evaluation/CodexAgentEval.js +43 -13
  344. package/dist/evm/EvmoleFailures.js +0 -2
  345. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  346. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  347. package/dist/filesystem/OwnedFileHandle.js +36 -0
  348. package/dist/filesystem/RegularFile.js +33 -1
  349. package/dist/filesystem/StableFileHash.js +46 -0
  350. package/dist/filesystem/readFileHandleChunks.js +26 -0
  351. package/dist/firmware/FirmwareCommand.js +25 -3
  352. package/dist/firmware/FirmwareFiles.js +23 -8
  353. package/dist/firmware/FirmwareProvider.js +156 -32
  354. package/dist/firmware/FirmwarePublication.js +24 -3
  355. package/dist/firmware/FirmwareRelease.js +1 -0
  356. package/dist/generatedPackageMetadata.js +2 -2
  357. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  358. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  359. package/dist/ghidra/GhidraClient.js +76 -4
  360. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  361. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  362. package/dist/ghidra/GhidraInstallation.js +1 -1
  363. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  364. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  365. package/dist/ghidra/GhidraLauncher.js +80 -39
  366. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  367. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  368. package/dist/ghidra/GhidraProvider.js +57 -9
  369. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  370. package/dist/ghidra/GhidraProviderClient.js +282 -21
  371. package/dist/ghidra/GhidraSessionValues.js +9 -2
  372. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  373. package/dist/hopper/HopperClient.js +15 -6
  374. package/dist/hopper/HopperMachOImage.js +2 -0
  375. package/dist/hopper/HopperProvider.js +13 -2
  376. package/dist/ida/IdaOperationRunner.js +8 -2
  377. package/dist/ida/IdaProvider.js +7 -0
  378. package/dist/ida/IdaSessionClient.js +3 -1
  379. package/dist/ida/IdaWorkspace.js +4 -2
  380. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  381. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  382. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  383. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  384. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  385. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  386. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  387. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  388. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  389. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  390. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  391. package/dist/javascript/recovery/WakaruReport.js +12 -7
  392. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  393. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  394. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  395. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  396. package/dist/jeb/JebMcpConnection.js +179 -0
  397. package/dist/jeb/JebMcpEndpoint.js +40 -0
  398. package/dist/jeb/JebProvider.js +299 -0
  399. package/dist/mcpDoctor.js +15 -6
  400. package/dist/native/AppleDispatchCoverage.js +25 -12
  401. package/dist/native/AppleDispatchMetadata.js +14 -7
  402. package/dist/native/AppleMachoFixups.js +71 -15
  403. package/dist/native/AppleMachoSelection.js +23 -3
  404. package/dist/native/NativeMacOSProvider.js +91 -16
  405. package/dist/native/NativeMachoInspection.js +11 -7
  406. package/dist/native/NativeUiHelperRuntime.js +6 -1
  407. package/dist/native/NativeUiObservation.js +4 -3
  408. package/dist/native/pe/PeResourceLayout.js +120 -0
  409. package/dist/native/pe/PeResourceParser.js +286 -0
  410. package/dist/native/pe/PeResourcesProvider.js +63 -0
  411. package/dist/process/BoundedFileBytes.js +30 -7
  412. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  413. package/dist/process/OwnedCommand.js +4 -3
  414. package/dist/process/ProcessOwnership.js +104 -112
  415. package/dist/process/ProcessOwnershipObservation.js +96 -39
  416. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  417. package/dist/process/ProcessRunTokenObservations.js +48 -0
  418. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  419. package/dist/process/ProviderProcess.js +4 -3
  420. package/dist/process/capture/FilesystemSnapshot.js +28 -4
  421. package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
  422. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  423. package/dist/process/capture/ProcessHarness.js +194 -26
  424. package/dist/process/capture/ProcessNormalization.js +3 -1
  425. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  426. package/dist/process/capture/TerminalRenderer.js +24 -7
  427. package/dist/reference/ReferenceSourceReader.js +22 -5
  428. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  429. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  430. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  431. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  432. package/dist/server/EvidenceMcpServer.js +36 -1
  433. package/dist/server/admittedToolOperation.js +9 -0
  434. package/dist/server/contractToolHandler.js +21 -0
  435. package/dist/server/createServer.js +97 -25
  436. package/dist/server/registerAdbTools.js +36 -0
  437. package/dist/server/registerAnalysisViewTool.js +4 -9
  438. package/dist/server/registerAndroidTools.js +3 -12
  439. package/dist/server/registerApktoolTools.js +14 -0
  440. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
  441. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  442. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  443. package/dist/server/registerApplicationTools/coverage.js +3 -2
  444. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  445. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  446. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  447. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  448. package/dist/server/registerArtifactComparisonTool.js +5 -2
  449. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  450. package/dist/server/registerBrowserScenarioTool.js +10 -7
  451. package/dist/server/registerBrowserTools.js +12 -9
  452. package/dist/server/registerBundleComparisonTool.js +16 -2
  453. package/dist/server/registerCloseLifecycleTool.js +32 -3
  454. package/dist/server/registerElectronTools.js +28 -10
  455. package/dist/server/registerEvmTools.js +4 -9
  456. package/dist/server/registerFirmwareTools.js +3 -11
  457. package/dist/server/registerFunctionComparisonTool.js +5 -2
  458. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  459. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  460. package/dist/server/registerJebTools.js +16 -0
  461. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  462. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  463. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  464. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  465. package/dist/server/registerPeResourcesTool.js +9 -0
  466. package/dist/server/registerProcessComparisonTool.js +5 -2
  467. package/dist/server/registerRecordedCrashTools.js +4 -9
  468. package/dist/server/registerSessionRecordTools.js +2 -1
  469. package/dist/server/registerSessionTools.js +49 -18
  470. package/dist/server/registerWebModuleTool.js +4 -9
  471. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  472. package/dist/server/registerWebRuntimeTools.js +6 -5
  473. package/dist/server/registerWebScriptTool.js +6 -3
  474. package/dist/server/registerWebSourceLocationTool.js +4 -9
  475. package/dist/server/toolResult.js +21 -2
  476. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  477. package/install.sh +7 -4
  478. package/licenses/nativeaot-parser-MIT.txt +28 -0
  479. package/native/windows/build/manifest.json +2 -2
  480. package/native/windows/build/rea-windows-x64.node +0 -0
  481. package/package.json +33 -5
  482. package/scripts/rea.mjs +16 -1
  483. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  484. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  485. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  486. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  487. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
@@ -1,5 +1,6 @@
1
1
  import { isBuiltin } from "node:module";
2
2
  import { posix } from "node:path";
3
+ import { normalizeJoinedLogicalPath, logicalPathEscapesRoot, } from "../../domain/artifactIdentity.js";
3
4
  import { admitsCanonicalPathSyntax, hasScheme, htmlUrlText, looksExternal, percentDecodeUrlPath, stripQueryAndFragment, } from "../../domain/artifactPathSyntax.js";
4
5
  const EXTENSIONS = [
5
6
  ".js",
@@ -11,59 +12,59 @@ const EXTENSIONS = [
11
12
  ".html",
12
13
  ".node",
13
14
  ];
14
- /** Resolve one declaration under its exact syntax/metadata context. */
15
- export const resolveArtifactPathByContext = (input) => resolvePackagePath(input, new Set());
16
- const resolvePackagePath = (input, packageChain, mode = "full", exportsTargetUrl = false) => {
17
- const rejected = rejectDeclaration(input);
15
+ /** Resolve one declaration while preserving its original input identity. */
16
+ export const resolveArtifactPathByContext = (input) => {
17
+ const resolution = resolvePath(input);
18
+ return resolution.status === "resolved"
19
+ ? {
20
+ declared_path: input.declaredPath,
21
+ resolution_context: input.context,
22
+ resolved_path: resolution.resolvedPath,
23
+ resolution_status: resolution.status,
24
+ limitations: resolution.limitations,
25
+ }
26
+ : {
27
+ declared_path: input.declaredPath,
28
+ resolution_context: input.context,
29
+ resolved_path: null,
30
+ resolution_status: resolution.status,
31
+ limitations: resolution.limitations,
32
+ };
33
+ };
34
+ const resolvePath = (input) => {
35
+ const rejected = rejectDeclaration(input.declaredPath);
18
36
  if (rejected !== null)
19
37
  return rejected;
20
- const candidate = contextualCandidate(input, exportsTargetUrl);
38
+ const candidate = contextualCandidate(input);
21
39
  if (typeof candidate !== "string")
22
40
  return candidate;
23
- const confined = confineCandidate(input, candidate);
41
+ const confined = confineCandidate(candidate);
24
42
  if (typeof confined !== "string")
25
43
  return confined;
26
44
  if (input.context === "html-reference")
27
- return outcome(input, resolveFileCandidates(input, [confined]) ?? {
28
- resolvedPath: null,
29
- status: "not-found",
30
- limitations: [
45
+ return (resolveFileCandidates(input, [confined]) ??
46
+ unresolvedCandidate("not-found", [
31
47
  `The exact HTML resource ${confined} was not found among the selected application files.`,
32
- ],
33
- });
34
- // An exports target names one exact file; Node tries no extension or index.
35
- const resolved = exportsTargetUrl
36
- ? (resolveFileCandidates(input, [confined]) ??
37
- exactExportsTargetNotFound(confined))
38
- : mode === "files-and-index"
39
- ? (resolveFileCandidates(input, [
40
- ...fileCandidates(confined),
41
- ...indexCandidates(confined),
42
- ]) ?? notFoundCandidate())
43
- : resolveCandidate(input, confined, packageChain);
44
- return outcome(input, resolved);
48
+ ]));
49
+ return resolveCandidate(input, confined, new Set());
45
50
  };
46
- const rejectDeclaration = (input) => {
47
- const declared = input.declaredPath;
51
+ const rejectDeclaration = (declared) => {
48
52
  if (declared.length === 0)
49
- return unresolvedOutcome(input, "rejected", [
50
- "The declared path is empty.",
51
- ]);
53
+ return unresolvedCandidate("rejected", ["The declared path is empty."]);
52
54
  if (declared.includes("\0") || declared.includes("\\"))
53
- return unresolvedOutcome(input, "rejected", [
55
+ return unresolvedCandidate("rejected", [
54
56
  "NUL and backslash path syntax are not admitted for canonical artifact paths.",
55
57
  ]);
56
58
  if (!admitsCanonicalPathSyntax(declared))
57
- return unresolvedOutcome(input, "rejected", [
59
+ return unresolvedCandidate("rejected", [
58
60
  "Encoded dot or separator bytes are rejected before artifact path resolution.",
59
61
  ]);
60
62
  return null;
61
63
  };
62
- const contextualCandidate = (input, exportsTargetUrl) => {
64
+ const contextualCandidate = (input) => {
63
65
  const { context } = input;
64
66
  let declared = context === "html-reference" ||
65
67
  context === "url-reference" ||
66
- exportsTargetUrl ||
67
68
  (context === "module-specifier" && input.moduleKind !== "require")
68
69
  ? stripQueryAndFragment(input.declaredPath)
69
70
  : input.declaredPath;
@@ -74,62 +75,117 @@ const contextualCandidate = (input, exportsTargetUrl) => {
74
75
  if (fileUrl !== undefined)
75
76
  return fileUrl;
76
77
  if (hasScheme(declared))
77
- return unresolvedOutcome(input, "external", [
78
+ return unresolvedCandidate("external", [
78
79
  "URL and Node builtin schemes are outside static artifact module resolution.",
79
80
  ]);
80
81
  if (!declared.startsWith(".") && !declared.startsWith("/"))
81
82
  return bareModuleCandidate(input, declared);
83
+ if (input.moduleKind !== "require") {
84
+ const decoded = decodeModuleUrlPath(declared);
85
+ if (typeof decoded !== "string")
86
+ return decoded;
87
+ declared = decoded;
88
+ }
82
89
  }
83
90
  else if (looksExternal(declared))
84
- return unresolvedOutcome(input, "external", [
91
+ return unresolvedCandidate("external", [
85
92
  "URL schemes and protocol-relative URLs are outside this local artifact path context.",
86
93
  ]);
87
- // Exports targets use URL paths for both loaders; legacy main fields remain literal.
88
- if (exportsTargetUrl ||
89
- (context === "module-specifier" && input.moduleKind !== "require")) {
90
- try {
91
- declared = decodeURIComponent(declared);
92
- }
93
- catch (cause) {
94
- void cause;
95
- return unresolvedOutcome(input, "rejected", [
96
- "The module URL path contains malformed percent encoding.",
97
- ]);
98
- }
99
- if (declared.includes("\0"))
100
- return unresolvedOutcome(input, "rejected", [
101
- "The decoded module URL path contains NUL.",
102
- ]);
94
+ return relativeCandidate(input.sourcePath, declared);
95
+ };
96
+ const decodeModuleUrlPath = (declared) => {
97
+ let decoded;
98
+ try {
99
+ decoded = decodeURIComponent(declared);
103
100
  }
104
- const relative = declared.startsWith("/") ? declared.slice(1) : declared;
105
- return declared.startsWith("/")
106
- ? relative
107
- : posix.join(posix.dirname(input.sourcePath), relative);
101
+ catch (cause) {
102
+ void cause;
103
+ return unresolvedCandidate("rejected", [
104
+ "The module URL path contains malformed percent encoding.",
105
+ ]);
106
+ }
107
+ return decoded.includes("\0")
108
+ ? unresolvedCandidate("rejected", [
109
+ "The decoded module URL path contains NUL.",
110
+ ])
111
+ : decoded;
108
112
  };
113
+ const relativeCandidate = (sourcePath, declared) => declared.startsWith("/")
114
+ ? declared.slice(1)
115
+ : posix.join(posix.dirname(sourcePath), declared);
109
116
  const bareModuleCandidate = (input, declared) => {
110
117
  const packageName = barePackageName(declared);
111
118
  if (packageName === null || isBuiltin(declared) || declared.startsWith("#"))
112
- return unresolvedOutcome(input, "external", [
119
+ return unresolvedCandidate("external", [
113
120
  "The bare specifier is a Node builtin, package import map, or invalid package name.",
114
121
  ]);
115
- if (declared !== packageName)
116
- return unresolvedOutcome(input, "external", [
117
- "Bare package subpaths remain unresolved unless an exact package-exports subpath model is available.",
118
- ]);
122
+ const subpath = declared === packageName ? "." : `.${declared.slice(packageName.length)}`;
119
123
  const source = input.files.get(input.sourcePath);
120
124
  let directory = posix.dirname(input.sourcePath);
121
125
  while (true) {
122
- const candidate = posix.join(directory, "node_modules", declared);
123
- if (hasContainerCandidate(input.files, candidate, source?.container_sha256))
124
- return candidate;
126
+ const candidate = posix.join(directory, "node_modules", packageName);
127
+ if (subpath === ".") {
128
+ const direct = resolveFileCandidates(input, fileCandidates(candidate));
129
+ if (direct !== null)
130
+ return direct;
131
+ }
132
+ if (hasContainerDirectory(input.files, candidate, source?.container_sha256))
133
+ return resolvePackageSpecifier(input, candidate, subpath);
125
134
  if (directory === "." || directory === "")
126
135
  break;
127
136
  directory = posix.dirname(directory);
128
137
  }
129
- return unresolvedOutcome(input, "external", [
138
+ return unresolvedCandidate("external", [
130
139
  "No matching bare package was inventoried in an enclosing node_modules directory.",
131
140
  ]);
132
141
  };
142
+ /** Package roots and exact subpaths share metadata and exports selection. */
143
+ const resolvePackageSpecifier = (input, directory, subpath) => {
144
+ const metadata = readPackageMetadata(input, directory);
145
+ if (metadata.kind === "unavailable")
146
+ return unresolvedCandidate("unavailable", [metadata.limitation]);
147
+ const rawExports = metadata.kind === "available"
148
+ ? Reflect.get(metadata.value, "exports")
149
+ : undefined;
150
+ if (rawExports === undefined || rawExports === null) {
151
+ if (subpath === ".")
152
+ return resolveDirectory(input, directory, metadata, new Set());
153
+ // Preserve the trailing slash for a package directory request.
154
+ const candidate = confineCandidate(`${directory}/${subpath.slice(2)}`);
155
+ return typeof candidate === "string"
156
+ ? resolveCandidate(input, candidate, new Set())
157
+ : candidate;
158
+ }
159
+ const exported = selectPackageExport(rawExports, subpath, input.moduleKind);
160
+ const packagePath = posix.join(directory, "package.json");
161
+ if (exported.status === "rejected")
162
+ return unresolvedCandidate("rejected", [
163
+ `Package metadata ${packagePath}: ${exported.limitation}`,
164
+ ]);
165
+ if (exported.status === "unmatched")
166
+ return unresolvedCandidate("external", [
167
+ `Directory package metadata ${packagePath} declares no exports target ${subpath === "." ? "for the active conditions" : `for subpath ${subpath}`}; exports encapsulation permits no file or index lookup. It declares ${exported.declared.join(", ") || "a root target only"}.`,
168
+ ]);
169
+ if (exported.status === "blocked")
170
+ return unresolvedCandidate("external", [
171
+ `Directory package metadata ${packagePath} blocks subpath ${subpath} with an explicit null exports target.`,
172
+ ]);
173
+ return resolveExportTarget(input, packagePath, exported.value);
174
+ };
175
+ /** An exports target is a URL naming one exact file for both Node loaders. */
176
+ const resolveExportTarget = (input, packagePath, target) => {
177
+ const rejected = rejectDeclaration(target);
178
+ if (rejected !== null)
179
+ return rejected;
180
+ const decoded = decodeModuleUrlPath(stripQueryAndFragment(target));
181
+ if (typeof decoded !== "string")
182
+ return decoded;
183
+ const candidate = confineCandidate(relativeCandidate(packagePath, decoded));
184
+ if (typeof candidate !== "string")
185
+ return candidate;
186
+ return (resolveFileCandidates(input, [candidate]) ??
187
+ exactExportsTargetNotFound(candidate));
188
+ };
133
189
  const barePackageName = (specifier) => {
134
190
  const segments = specifier.split("/");
135
191
  if (specifier.startsWith("@"))
@@ -138,20 +194,28 @@ const barePackageName = (specifier) => {
138
194
  : null;
139
195
  return segments[0] === "" ? null : (segments[0] ?? null);
140
196
  };
141
- const hasContainerCandidate = (files, candidate, containerSha256) => [
142
- ...fileCandidates(candidate),
143
- ...indexCandidates(candidate),
144
- posix.join(candidate, "package.json"),
145
- ].some((path) => {
146
- const file = files.get(path);
147
- return (file !== undefined &&
148
- (containerSha256 === undefined ||
149
- file.container_sha256 === containerSha256));
150
- });
197
+ const hasContainerDirectory = (files, candidate, containerSha256) => {
198
+ if ([...indexCandidates(candidate), posix.join(candidate, "package.json")].some((path) => {
199
+ const file = files.get(path);
200
+ return (file !== undefined &&
201
+ (containerSha256 === undefined ||
202
+ file.container_sha256 === containerSha256));
203
+ }))
204
+ return true;
205
+ // Inventory has files rather than directory entries. Any same-container
206
+ // descendant establishes a package directory even without package.json.
207
+ const prefix = `${candidate}/`;
208
+ for (const [path, file] of files)
209
+ if (path.startsWith(prefix) &&
210
+ (containerSha256 === undefined ||
211
+ file.container_sha256 === containerSha256))
212
+ return true;
213
+ return false;
214
+ };
151
215
  const htmlCandidate = (input) => {
152
216
  const declared = stripQueryAndFragment(htmlUrlText(input.declaredPath));
153
217
  if (looksExternal(declared))
154
- return unresolvedOutcome(input, "external", [
218
+ return unresolvedCandidate("external", [
155
219
  "External HTML references are not mapped to local artifact assets.",
156
220
  ]);
157
221
  const rawBase = input.htmlBaseHref;
@@ -159,18 +223,18 @@ const htmlCandidate = (input) => {
159
223
  ? rawBase
160
224
  : stripQueryAndFragment(htmlUrlText(rawBase));
161
225
  if (base !== undefined && base !== null && looksExternal(base))
162
- return unresolvedOutcome(input, "external", [
226
+ return unresolvedCandidate("external", [
163
227
  "The document base href is external, so its script reference is not a local artifact path.",
164
228
  ]);
165
229
  // Removing URL tabs and newlines can join an encoded dot or separator that
166
230
  // the raw declaration split, so admit the parsed URL text again.
167
231
  if (!admitsCanonicalPathSyntax(declared))
168
- return unresolvedOutcome(input, "rejected", [
232
+ return unresolvedCandidate("rejected", [
169
233
  "Encoded dot or separator bytes are rejected before artifact path resolution.",
170
234
  ]);
171
235
  const declaredPath = percentDecodeUrlPath(declared);
172
236
  if (declaredPath === null)
173
- return unresolvedOutcome(input, "rejected", [
237
+ return unresolvedCandidate("rejected", [
174
238
  "The HTML reference path percent-decodes to NUL or to bytes that are not UTF-8.",
175
239
  ]);
176
240
  if (declaredPath.startsWith("/"))
@@ -183,28 +247,28 @@ const htmlCandidate = (input) => {
183
247
  // admission rules a declared path gets so it cannot smuggle traversal or
184
248
  // separator syntax past canonicalization.
185
249
  if (!admitsCanonicalPathSyntax(base))
186
- return unresolvedOutcome(input, "rejected", [
250
+ return unresolvedCandidate("rejected", [
187
251
  "The document base href uses NUL, backslash, or encoded dot and separator bytes that are not admitted for canonical artifact paths.",
188
252
  ]);
189
253
  const decodedBase = percentDecodeUrlPath(base);
190
254
  if (decodedBase === null)
191
- return unresolvedOutcome(input, "rejected", [
255
+ return unresolvedCandidate("rejected", [
192
256
  "The document base href path percent-decodes to NUL or to bytes that are not UTF-8.",
193
257
  ]);
194
258
  const basePath = decodedBase.startsWith("/")
195
259
  ? decodedBase.slice(1)
196
260
  : posix.join(posix.dirname(input.sourcePath), decodedBase);
197
261
  if (declaredPath === "")
198
- return emptyHtmlReference(input, decodedBase, basePath);
262
+ return emptyHtmlReference(decodedBase, basePath);
199
263
  return posix.join(htmlBaseDirectory(decodedBase, basePath), declaredPath);
200
264
  };
201
- const emptyHtmlReference = (input, base, basePath) => {
265
+ const emptyHtmlReference = (base, basePath) => {
202
266
  if (!htmlBaseIsDirectory(base))
203
267
  return basePath;
204
- const confined = confineCandidate(input, basePath);
268
+ const confined = confineCandidate(basePath);
205
269
  if (typeof confined !== "string")
206
270
  return confined;
207
- return unresolvedOutcome(input, "not-found", [
271
+ return unresolvedCandidate("not-found", [
208
272
  `The HTML reference resolves to directory ${confined || "."}, not an exact selected application file.`,
209
273
  ]);
210
274
  };
@@ -220,103 +284,95 @@ const htmlBaseIsDirectory = (base) => base.endsWith("/") ||
220
284
  base === "." ||
221
285
  base === "..";
222
286
  const htmlBaseDirectory = (base, basePath) => htmlBaseIsDirectory(base) ? basePath : posix.dirname(basePath);
223
- const confineCandidate = (input, candidate) => {
224
- const normalized = posix.normalize(candidate);
225
- if (normalized === ".." ||
226
- normalized.startsWith("../") ||
227
- normalized.startsWith("/"))
228
- return unresolvedOutcome(input, "rejected", [
287
+ const confineCandidate = (candidate) => {
288
+ const normalized = normalizeJoinedLogicalPath(candidate);
289
+ if (logicalPathEscapesRoot(normalized))
290
+ return unresolvedCandidate("rejected", [
229
291
  "The resolved candidate escapes the canonical artifact root.",
230
292
  ]);
231
293
  return normalized === "." ? "" : normalized;
232
294
  };
233
- const resolveCandidate = (input, candidate, packageChain) => {
234
- const direct = resolveFileCandidates(input, fileCandidates(candidate));
235
- if (direct !== null)
236
- return direct;
295
+ const readPackageMetadata = (input, directory) => {
296
+ const path = posix.join(directory, "package.json");
297
+ const file = input.files.get(path);
237
298
  const source = input.files.get(input.sourcePath);
238
- const packagePath = posix.join(candidate, "package.json");
239
- const packageFile = input.files.get(packagePath);
240
- if (packageFile === undefined ||
241
- (source !== undefined &&
242
- packageFile.container_sha256 !== source.container_sha256))
243
- return (resolveFileCandidates(input, indexCandidates(candidate)) ??
244
- notFoundCandidate());
245
- if (!packageFile.text.included)
246
- return {
247
- resolvedPath: null,
248
- status: "unavailable",
249
- limitations: [
250
- `Directory package metadata ${packagePath} was inventoried but its text is unavailable: ${packageFile.text.reason}.`,
251
- ],
252
- };
253
- const main = packageEntry(packageFile.text.value, input.moduleKind, input.context === "module-specifier" &&
254
- !input.declaredPath.startsWith(".") &&
255
- !input.declaredPath.startsWith("/") &&
256
- !hasScheme(input.declaredPath));
257
- if (main.status === "invalid")
258
- return {
259
- resolvedPath: null,
260
- status: "unavailable",
261
- limitations: [
262
- `Directory package metadata ${packagePath} is not valid package JSON.`,
263
- ],
264
- };
265
- if (main.status === "rejected")
299
+ if (file === undefined ||
300
+ (source !== undefined && file.container_sha256 !== source.container_sha256))
301
+ return { kind: "absent" };
302
+ if (!file.text.included)
266
303
  return {
267
- resolvedPath: null,
268
- status: "rejected",
269
- limitations: [`Package metadata ${packagePath}: ${main.limitation}`],
304
+ kind: "unavailable",
305
+ limitation: `Directory package metadata ${path} was inventoried but its text is unavailable: ${file.text.reason}.`,
270
306
  };
271
- if (main.status === "unmatched")
272
- return {
273
- resolvedPath: null,
274
- status: "external",
275
- limitations: [
276
- `Directory package metadata ${packagePath} declares no exports target for the active conditions; it declares ${main.declared.join(", ")}.`,
277
- ],
278
- };
279
- if (packageChain.has(packagePath)) {
307
+ let value;
308
+ try {
309
+ value = JSON.parse(file.text.value);
310
+ }
311
+ catch (cause) {
312
+ void cause;
280
313
  return {
281
- resolvedPath: null,
282
- status: "unavailable",
283
- limitations: [
284
- `Directory package entrypoint cycle includes ${packagePath}.`,
285
- ],
314
+ kind: "unavailable",
315
+ limitation: `Directory package metadata ${path} is not valid package JSON.`,
286
316
  };
287
317
  }
288
- if (main.status === "missing")
289
- return (resolveFileCandidates(input, indexCandidates(candidate)) ??
318
+ return typeof value === "object" && value !== null
319
+ ? { kind: "available", path, value }
320
+ : {
321
+ kind: "unavailable",
322
+ limitation: `Directory package metadata ${path} is not valid package JSON.`,
323
+ };
324
+ };
325
+ /** File and directory lookup never interprets a nested directory's exports. */
326
+ const resolveCandidate = (input, candidate, packageChain) => resolveFileCandidates(input, fileCandidates(candidate)) ??
327
+ resolveDirectory(input, candidate, readPackageMetadata(input, candidate), packageChain);
328
+ const resolveDirectory = (input, directory, metadata, packageChain) => {
329
+ if (metadata.kind === "absent")
330
+ return (resolveFileCandidates(input, indexCandidates(directory)) ??
290
331
  notFoundCandidate());
332
+ if (metadata.kind === "unavailable")
333
+ return unresolvedCandidate("unavailable", [metadata.limitation]);
334
+ if (packageChain.has(metadata.path))
335
+ return unresolvedCandidate("unavailable", [
336
+ `Directory package entrypoint cycle includes ${metadata.path}.`,
337
+ ]);
338
+ const preferred = [
339
+ Reflect.get(metadata.value, "main"),
340
+ ...(input.moduleKind === undefined
341
+ ? [Reflect.get(metadata.value, "module")]
342
+ : []),
343
+ ];
344
+ const entry = preferred.find((value) => value !== undefined);
345
+ if (entry === undefined)
346
+ return (resolveFileCandidates(input, indexCandidates(directory)) ??
347
+ notFoundCandidate());
348
+ if (typeof entry !== "string" || entry.length === 0)
349
+ return unresolvedCandidate("unavailable", [
350
+ `Directory package metadata ${metadata.path} is not valid package JSON.`,
351
+ ]);
291
352
  const entryInput = {
292
- declaredPath: main.value,
293
- sourcePath: packagePath,
353
+ declaredPath: entry,
354
+ sourcePath: metadata.path,
294
355
  context: "package-entrypoint",
295
356
  files: input.files,
357
+ ...(input.moduleKind === undefined ? {} : { moduleKind: input.moduleKind }),
296
358
  };
297
- const chain = new Set([...packageChain, packagePath]);
298
- if (main.source === "legacy") {
299
- const entry = resolvePackagePath(entryInput, chain, "files-and-index");
300
- if (entry.resolution_status !== "not-found")
301
- return candidateOutcome(entry);
302
- const index = resolveFileCandidates(input, indexCandidates(candidate));
303
- if (index !== null)
304
- return index;
305
- }
306
- // Preserve recursive artifact package lookup only after legacy file/index fallbacks.
307
- return candidateOutcome(resolvePackagePath(entryInput, chain, "full", main.source === "exports"));
359
+ const rejected = rejectDeclaration(entryInput.declaredPath);
360
+ if (rejected !== null)
361
+ return rejected;
362
+ const candidate = contextualCandidate(entryInput);
363
+ if (typeof candidate !== "string")
364
+ return candidate;
365
+ const confined = confineCandidate(candidate);
366
+ if (typeof confined !== "string")
367
+ return confined;
368
+ const selected = resolveFileCandidates(entryInput, [
369
+ ...fileCandidates(confined),
370
+ ...indexCandidates(confined),
371
+ ]) ?? resolveFileCandidates(input, indexCandidates(directory));
372
+ if (selected !== null)
373
+ return selected;
374
+ return resolveCandidate(entryInput, confined, new Set([...packageChain, metadata.path]));
308
375
  };
309
- const candidateOutcome = (nested) => nested.resolution_status === "resolved"
310
- ? {
311
- resolvedPath: nested.resolved_path,
312
- status: nested.resolution_status,
313
- limitations: nested.limitations,
314
- }
315
- : {
316
- resolvedPath: null,
317
- status: nested.resolution_status,
318
- limitations: nested.limitations,
319
- };
320
376
  const resolveFileCandidates = (input, candidates) => {
321
377
  const source = input.files.get(input.sourcePath);
322
378
  for (const path of candidates) {
@@ -333,59 +389,44 @@ const fileCandidates = (candidate) => [
333
389
  ...EXTENSIONS.map((extension) => `${candidate}${extension}`),
334
390
  ];
335
391
  const indexCandidates = (candidate) => EXTENSIONS.map((extension) => posix.join(candidate, `index${extension}`));
336
- const packageEntry = (text, moduleKind, useExports) => {
337
- try {
338
- const value = JSON.parse(text);
339
- if (typeof value !== "object" || value === null)
340
- return { status: "invalid" };
341
- const rawExports = Reflect.get(value, "exports");
342
- if (useExports && rawExports !== undefined && rawExports !== null) {
343
- const exported = packageExport(rawExports, moduleKind);
344
- return exported.status === "value"
345
- ? { ...exported, source: "exports" }
346
- : exported;
347
- }
348
- // Node imports and requires ignore the bundler-only module field. Keep
349
- // that fallback for callers without an explicit module-loading kind.
350
- const preferred = [
351
- Reflect.get(value, "main"),
352
- ...(moduleKind === undefined ? [Reflect.get(value, "module")] : []),
353
- ];
354
- const entry = preferred.find((candidate) => candidate !== undefined);
355
- if (entry === undefined)
356
- return { status: "missing" };
357
- const legacy = packagePathValue(entry);
358
- return legacy.status === "value" ? { ...legacy, source: "legacy" } : legacy;
359
- }
360
- catch (cause) {
361
- // Reflect-based manifest reads fail closed as invalid.
362
- void cause;
363
- return { status: "invalid" };
364
- }
365
- };
366
- const packageExport = (value, moduleKind) => {
392
+ /** Only exact non-directory keys participate; wildcard expansion is unsupported. */
393
+ const selectPackageExport = (value, subpath, moduleKind) => {
394
+ let target = value;
395
+ let declared = [];
367
396
  if (typeof value === "object" && value !== null && !Array.isArray(value)) {
368
397
  const keys = Object.keys(value);
369
- if (keys.some((key) => key.startsWith(".")) &&
370
- keys.some((key) => !key.startsWith(".")))
398
+ const hasSubpaths = keys.some((key) => key.startsWith("."));
399
+ if (hasSubpaths && keys.some((key) => !key.startsWith(".")))
371
400
  return {
372
401
  status: "rejected",
373
402
  limitation: "The package exports configuration mixes subpath keys and condition keys.",
374
403
  };
404
+ declared = keys;
405
+ if (hasSubpaths) {
406
+ if (subpath.endsWith("/") ||
407
+ subpath.includes("*") ||
408
+ !Object.hasOwn(value, subpath))
409
+ return { status: "unmatched", declared };
410
+ target = Reflect.get(value, subpath);
411
+ }
412
+ else if (subpath !== ".")
413
+ return { status: "unmatched", declared };
375
414
  }
376
- const root = typeof value === "object" && value !== null && Object.hasOwn(value, ".")
377
- ? Reflect.get(value, ".")
378
- : value;
379
- const flattened = exportTargets(root, packageExportConditions(moduleKind));
380
- if (flattened.kind === "invalid" || flattened.kind === "invalid-config")
381
- return { status: "rejected", limitation: flattened.limitation };
382
- const first = flattened.kind === "unmatched" ? undefined : flattened.values[0];
383
- return first === undefined
384
- ? {
415
+ else if (subpath !== ".")
416
+ return { status: "unmatched", declared };
417
+ const selected = selectExportTarget(target, packageExportConditions(moduleKind));
418
+ if (selected.kind === "invalid" || selected.kind === "invalid-config")
419
+ return { status: "rejected", limitation: selected.limitation };
420
+ if (selected.kind === "unmatched")
421
+ return {
385
422
  status: "unmatched",
386
- declared: typeof root === "object" && root !== null ? Object.keys(root) : [],
387
- }
388
- : { status: "value", value: first };
423
+ declared: typeof target === "object" && target !== null
424
+ ? Object.keys(target)
425
+ : declared,
426
+ };
427
+ return selected.kind === "blocked"
428
+ ? { status: "blocked" }
429
+ : { status: "value", value: selected.value };
389
430
  };
390
431
  const invalidExportTarget = (value, reason) => ({
391
432
  kind: "invalid",
@@ -408,21 +449,21 @@ const forbiddenExportSegment = (value) => value
408
449
  * An array skips unmatched and invalid entries, stops at its first string, and
409
450
  * preserves the final invalid-versus-null refusal if no string is selected.
410
451
  */
411
- const exportTargets = (value, conditions) => {
452
+ const selectExportTarget = (value, conditions) => {
412
453
  if (typeof value === "string") {
413
454
  if (!value.startsWith("./"))
414
455
  return invalidExportTarget(value, 'must start with "./"');
415
456
  const forbidden = forbiddenExportSegment(value);
416
457
  return forbidden === undefined
417
- ? { kind: "targets", values: [value] }
458
+ ? { kind: "value", value }
418
459
  : invalidExportTarget(value, `contains forbidden path segment ${JSON.stringify(forbidden)} before URL normalization`);
419
460
  }
420
461
  if (value === null)
421
- return { kind: "targets", values: [] };
462
+ return { kind: "blocked" };
422
463
  if (Array.isArray(value)) {
423
464
  let invalid = null;
424
465
  for (const entry of value) {
425
- const nested = exportTargets(entry, conditions);
466
+ const nested = selectExportTarget(entry, conditions);
426
467
  // Node's array fallback catches invalid targets, not invalid configuration.
427
468
  if (nested.kind === "invalid-config")
428
469
  return nested;
@@ -433,11 +474,11 @@ const exportTargets = (value, conditions) => {
433
474
  if (nested.kind === "unmatched")
434
475
  continue;
435
476
  invalid = null;
436
- if (nested.values.length > 0)
477
+ if (nested.kind === "value")
437
478
  return nested;
438
479
  }
439
480
  return invalid === null
440
- ? { kind: "targets", values: [] }
481
+ ? { kind: "blocked" }
441
482
  : { kind: "invalid", limitation: invalid };
442
483
  }
443
484
  if (typeof value !== "object")
@@ -453,7 +494,7 @@ const exportTargets = (value, conditions) => {
453
494
  for (const [condition, target] of Object.entries(value)) {
454
495
  if (!conditions.has(condition))
455
496
  continue;
456
- const nested = exportTargets(target, conditions);
497
+ const nested = selectExportTarget(target, conditions);
457
498
  if (nested.kind !== "unmatched")
458
499
  return nested;
459
500
  }
@@ -473,9 +514,6 @@ const packageExportConditions = (moduleKind) => new Set([
473
514
  ...(moduleKind === undefined ? [] : [moduleKind]),
474
515
  "default",
475
516
  ]);
476
- const packagePathValue = (value) => typeof value === "string" && value.length > 0
477
- ? { status: "value", value }
478
- : { status: "invalid" };
479
517
  const notFoundCandidate = () => ({
480
518
  resolvedPath: null,
481
519
  status: "not-found",
@@ -505,19 +543,4 @@ const fileUrlPath = (value) => {
505
543
  return undefined;
506
544
  }
507
545
  };
508
- const outcome = (input, resolution) => resolution.status === "resolved"
509
- ? {
510
- declared_path: input.declaredPath,
511
- resolution_context: input.context,
512
- resolved_path: resolution.resolvedPath,
513
- resolution_status: resolution.status,
514
- limitations: resolution.limitations,
515
- }
516
- : {
517
- declared_path: input.declaredPath,
518
- resolution_context: input.context,
519
- resolved_path: null,
520
- resolution_status: resolution.status,
521
- limitations: resolution.limitations,
522
- };
523
- const unresolvedOutcome = (input, status, limitations) => outcome(input, { resolvedPath: null, status, limitations });
546
+ const unresolvedCandidate = (status, limitations) => ({ resolvedPath: null, status, limitations });