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,5 +1,6 @@
1
- import { builtinModules } from "node:module";
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,60 +12,59 @@ const EXTENSIONS = [
11
12
  ".html",
12
13
  ".node",
13
14
  ];
14
- const NODE_BUILTINS = new Set(builtinModules.map((name) => name.replace(/^node:/u, "")));
15
- /** Resolve one declaration under its exact syntax/metadata context. */
16
- export const resolveArtifactPathByContext = (input) => resolvePackagePath(input, new Set());
17
- const resolvePackagePath = (input, packageChain, mode = "full", exportsTargetUrl = false) => {
18
- 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);
19
36
  if (rejected !== null)
20
37
  return rejected;
21
- const candidate = contextualCandidate(input, exportsTargetUrl);
38
+ const candidate = contextualCandidate(input);
22
39
  if (typeof candidate !== "string")
23
40
  return candidate;
24
- const confined = confineCandidate(input, candidate);
41
+ const confined = confineCandidate(candidate);
25
42
  if (typeof confined !== "string")
26
43
  return confined;
27
44
  if (input.context === "html-reference")
28
- return outcome(input, resolveFileCandidates(input, [confined]) ?? {
29
- resolvedPath: null,
30
- status: "not-found",
31
- limitations: [
45
+ return (resolveFileCandidates(input, [confined]) ??
46
+ unresolvedCandidate("not-found", [
32
47
  `The exact HTML resource ${confined} was not found among the selected application files.`,
33
- ],
34
- });
35
- // An exports target names one exact file; Node tries no extension or index.
36
- const resolved = exportsTargetUrl
37
- ? (resolveFileCandidates(input, [confined]) ??
38
- exactExportsTargetNotFound(confined))
39
- : mode === "files-and-index"
40
- ? (resolveFileCandidates(input, [
41
- ...fileCandidates(confined),
42
- ...indexCandidates(confined),
43
- ]) ?? notFoundCandidate())
44
- : resolveCandidate(input, confined, packageChain);
45
- return outcome(input, resolved);
48
+ ]));
49
+ return resolveCandidate(input, confined, new Set());
46
50
  };
47
- const rejectDeclaration = (input) => {
48
- const declared = input.declaredPath;
51
+ const rejectDeclaration = (declared) => {
49
52
  if (declared.length === 0)
50
- return unresolvedOutcome(input, "rejected", [
51
- "The declared path is empty.",
52
- ]);
53
+ return unresolvedCandidate("rejected", ["The declared path is empty."]);
53
54
  if (declared.includes("\0") || declared.includes("\\"))
54
- return unresolvedOutcome(input, "rejected", [
55
+ return unresolvedCandidate("rejected", [
55
56
  "NUL and backslash path syntax are not admitted for canonical artifact paths.",
56
57
  ]);
57
58
  if (!admitsCanonicalPathSyntax(declared))
58
- return unresolvedOutcome(input, "rejected", [
59
+ return unresolvedCandidate("rejected", [
59
60
  "Encoded dot or separator bytes are rejected before artifact path resolution.",
60
61
  ]);
61
62
  return null;
62
63
  };
63
- const contextualCandidate = (input, exportsTargetUrl) => {
64
+ const contextualCandidate = (input) => {
64
65
  const { context } = input;
65
66
  let declared = context === "html-reference" ||
66
67
  context === "url-reference" ||
67
- exportsTargetUrl ||
68
68
  (context === "module-specifier" && input.moduleKind !== "require")
69
69
  ? stripQueryAndFragment(input.declaredPath)
70
70
  : input.declaredPath;
@@ -75,64 +75,117 @@ const contextualCandidate = (input, exportsTargetUrl) => {
75
75
  if (fileUrl !== undefined)
76
76
  return fileUrl;
77
77
  if (hasScheme(declared))
78
- return unresolvedOutcome(input, "external", [
78
+ return unresolvedCandidate("external", [
79
79
  "URL and Node builtin schemes are outside static artifact module resolution.",
80
80
  ]);
81
81
  if (!declared.startsWith(".") && !declared.startsWith("/"))
82
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
+ }
83
89
  }
84
90
  else if (looksExternal(declared))
85
- return unresolvedOutcome(input, "external", [
91
+ return unresolvedCandidate("external", [
86
92
  "URL schemes and protocol-relative URLs are outside this local artifact path context.",
87
93
  ]);
88
- // Exports targets use URL paths for both loaders; legacy main fields remain literal.
89
- if (exportsTargetUrl ||
90
- (context === "module-specifier" && input.moduleKind !== "require")) {
91
- try {
92
- declared = decodeURIComponent(declared);
93
- }
94
- catch (cause) {
95
- void cause;
96
- return unresolvedOutcome(input, "rejected", [
97
- "The module URL path contains malformed percent encoding.",
98
- ]);
99
- }
100
- if (declared.includes("\0"))
101
- return unresolvedOutcome(input, "rejected", [
102
- "The decoded module URL path contains NUL.",
103
- ]);
94
+ return relativeCandidate(input.sourcePath, declared);
95
+ };
96
+ const decodeModuleUrlPath = (declared) => {
97
+ let decoded;
98
+ try {
99
+ decoded = decodeURIComponent(declared);
104
100
  }
105
- const relative = declared.startsWith("/") ? declared.slice(1) : declared;
106
- return declared.startsWith("/")
107
- ? relative
108
- : 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;
109
112
  };
113
+ const relativeCandidate = (sourcePath, declared) => declared.startsWith("/")
114
+ ? declared.slice(1)
115
+ : posix.join(posix.dirname(sourcePath), declared);
110
116
  const bareModuleCandidate = (input, declared) => {
111
117
  const packageName = barePackageName(declared);
112
- if (packageName === null ||
113
- NODE_BUILTINS.has(packageName) ||
114
- declared.startsWith("#"))
115
- return unresolvedOutcome(input, "external", [
118
+ if (packageName === null || isBuiltin(declared) || declared.startsWith("#"))
119
+ return unresolvedCandidate("external", [
116
120
  "The bare specifier is a Node builtin, package import map, or invalid package name.",
117
121
  ]);
118
- if (declared !== packageName)
119
- return unresolvedOutcome(input, "external", [
120
- "Bare package subpaths remain unresolved unless an exact package-exports subpath model is available.",
121
- ]);
122
+ const subpath = declared === packageName ? "." : `.${declared.slice(packageName.length)}`;
122
123
  const source = input.files.get(input.sourcePath);
123
124
  let directory = posix.dirname(input.sourcePath);
124
125
  while (true) {
125
- const candidate = posix.join(directory, "node_modules", declared);
126
- if (hasContainerCandidate(input.files, candidate, source?.container_sha256))
127
- 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);
128
134
  if (directory === "." || directory === "")
129
135
  break;
130
136
  directory = posix.dirname(directory);
131
137
  }
132
- return unresolvedOutcome(input, "external", [
138
+ return unresolvedCandidate("external", [
133
139
  "No matching bare package was inventoried in an enclosing node_modules directory.",
134
140
  ]);
135
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
+ };
136
189
  const barePackageName = (specifier) => {
137
190
  const segments = specifier.split("/");
138
191
  if (specifier.startsWith("@"))
@@ -141,20 +194,28 @@ const barePackageName = (specifier) => {
141
194
  : null;
142
195
  return segments[0] === "" ? null : (segments[0] ?? null);
143
196
  };
144
- const hasContainerCandidate = (files, candidate, containerSha256) => [
145
- ...fileCandidates(candidate),
146
- ...indexCandidates(candidate),
147
- posix.join(candidate, "package.json"),
148
- ].some((path) => {
149
- const file = files.get(path);
150
- return (file !== undefined &&
151
- (containerSha256 === undefined ||
152
- file.container_sha256 === containerSha256));
153
- });
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
+ };
154
215
  const htmlCandidate = (input) => {
155
216
  const declared = stripQueryAndFragment(htmlUrlText(input.declaredPath));
156
217
  if (looksExternal(declared))
157
- return unresolvedOutcome(input, "external", [
218
+ return unresolvedCandidate("external", [
158
219
  "External HTML references are not mapped to local artifact assets.",
159
220
  ]);
160
221
  const rawBase = input.htmlBaseHref;
@@ -162,151 +223,156 @@ const htmlCandidate = (input) => {
162
223
  ? rawBase
163
224
  : stripQueryAndFragment(htmlUrlText(rawBase));
164
225
  if (base !== undefined && base !== null && looksExternal(base))
165
- return unresolvedOutcome(input, "external", [
226
+ return unresolvedCandidate("external", [
166
227
  "The document base href is external, so its script reference is not a local artifact path.",
167
228
  ]);
168
229
  // Removing URL tabs and newlines can join an encoded dot or separator that
169
230
  // the raw declaration split, so admit the parsed URL text again.
170
231
  if (!admitsCanonicalPathSyntax(declared))
171
- return unresolvedOutcome(input, "rejected", [
232
+ return unresolvedCandidate("rejected", [
172
233
  "Encoded dot or separator bytes are rejected before artifact path resolution.",
173
234
  ]);
174
235
  const declaredPath = percentDecodeUrlPath(declared);
175
236
  if (declaredPath === null)
176
- return unresolvedOutcome(input, "rejected", [
237
+ return unresolvedCandidate("rejected", [
177
238
  "The HTML reference path percent-decodes to NUL or to bytes that are not UTF-8.",
178
239
  ]);
179
240
  if (declaredPath.startsWith("/"))
180
241
  return declaredPath.slice(1);
181
242
  if (base === undefined || base === null || base === "")
182
- return posix.join(posix.dirname(input.sourcePath), declaredPath);
243
+ return declaredPath === ""
244
+ ? input.sourcePath
245
+ : posix.join(posix.dirname(input.sourcePath), declaredPath);
183
246
  // A local base href is a second untrusted path input; apply the same
184
247
  // admission rules a declared path gets so it cannot smuggle traversal or
185
248
  // separator syntax past canonicalization.
186
249
  if (!admitsCanonicalPathSyntax(base))
187
- return unresolvedOutcome(input, "rejected", [
250
+ return unresolvedCandidate("rejected", [
188
251
  "The document base href uses NUL, backslash, or encoded dot and separator bytes that are not admitted for canonical artifact paths.",
189
252
  ]);
190
253
  const decodedBase = percentDecodeUrlPath(base);
191
254
  if (decodedBase === null)
192
- return unresolvedOutcome(input, "rejected", [
255
+ return unresolvedCandidate("rejected", [
193
256
  "The document base href path percent-decodes to NUL or to bytes that are not UTF-8.",
194
257
  ]);
195
258
  const basePath = decodedBase.startsWith("/")
196
259
  ? decodedBase.slice(1)
197
260
  : posix.join(posix.dirname(input.sourcePath), decodedBase);
261
+ if (declaredPath === "")
262
+ return emptyHtmlReference(decodedBase, basePath);
198
263
  return posix.join(htmlBaseDirectory(decodedBase, basePath), declaredPath);
199
264
  };
265
+ const emptyHtmlReference = (base, basePath) => {
266
+ if (!htmlBaseIsDirectory(base))
267
+ return basePath;
268
+ const confined = confineCandidate(basePath);
269
+ if (typeof confined !== "string")
270
+ return confined;
271
+ return unresolvedCandidate("not-found", [
272
+ `The HTML reference resolves to directory ${confined || "."}, not an exact selected application file.`,
273
+ ]);
274
+ };
200
275
  /**
201
276
  * The directory a relative HTML reference resolves against. A base path
202
277
  * ending in "/" or in a "." or ".." segment is already a directory, because a
203
278
  * relative reference resolves against the base URL's directory and those
204
279
  * segments are dropped rather than stepped through.
205
280
  */
206
- const htmlBaseDirectory = (base, basePath) => base.endsWith("/") ||
281
+ const htmlBaseIsDirectory = (base) => base.endsWith("/") ||
207
282
  base.endsWith("/.") ||
208
283
  base.endsWith("/..") ||
209
284
  base === "." ||
210
- base === ".."
211
- ? basePath
212
- : posix.dirname(basePath);
213
- const confineCandidate = (input, candidate) => {
214
- const normalized = posix.normalize(candidate);
215
- if (normalized === ".." ||
216
- normalized.startsWith("../") ||
217
- normalized.startsWith("/"))
218
- return unresolvedOutcome(input, "rejected", [
285
+ base === "..";
286
+ const htmlBaseDirectory = (base, basePath) => htmlBaseIsDirectory(base) ? basePath : posix.dirname(basePath);
287
+ const confineCandidate = (candidate) => {
288
+ const normalized = normalizeJoinedLogicalPath(candidate);
289
+ if (logicalPathEscapesRoot(normalized))
290
+ return unresolvedCandidate("rejected", [
219
291
  "The resolved candidate escapes the canonical artifact root.",
220
292
  ]);
221
293
  return normalized === "." ? "" : normalized;
222
294
  };
223
- const resolveCandidate = (input, candidate, packageChain) => {
224
- const direct = resolveFileCandidates(input, fileCandidates(candidate));
225
- if (direct !== null)
226
- return direct;
295
+ const readPackageMetadata = (input, directory) => {
296
+ const path = posix.join(directory, "package.json");
297
+ const file = input.files.get(path);
227
298
  const source = input.files.get(input.sourcePath);
228
- const packagePath = posix.join(candidate, "package.json");
229
- const packageFile = input.files.get(packagePath);
230
- if (packageFile === undefined ||
231
- (source !== undefined &&
232
- packageFile.container_sha256 !== source.container_sha256))
233
- return (resolveFileCandidates(input, indexCandidates(candidate)) ??
234
- notFoundCandidate());
235
- if (!packageFile.text.included)
236
- return {
237
- resolvedPath: null,
238
- status: "unavailable",
239
- limitations: [
240
- `Directory package metadata ${packagePath} was inventoried but its text is unavailable: ${packageFile.text.reason}.`,
241
- ],
242
- };
243
- const main = packageEntry(packageFile.text.value, input.moduleKind, input.context === "module-specifier" &&
244
- !input.declaredPath.startsWith(".") &&
245
- !input.declaredPath.startsWith("/") &&
246
- !hasScheme(input.declaredPath));
247
- if (main.status === "invalid")
248
- return {
249
- resolvedPath: null,
250
- status: "unavailable",
251
- limitations: [
252
- `Directory package metadata ${packagePath} is not valid package JSON.`,
253
- ],
254
- };
255
- if (main.status === "rejected")
256
- return {
257
- resolvedPath: null,
258
- status: "rejected",
259
- limitations: [`Package metadata ${packagePath}: ${main.limitation}`],
260
- };
261
- if (main.status === "unmatched")
299
+ if (file === undefined ||
300
+ (source !== undefined && file.container_sha256 !== source.container_sha256))
301
+ return { kind: "absent" };
302
+ if (!file.text.included)
262
303
  return {
263
- resolvedPath: null,
264
- status: "external",
265
- limitations: [
266
- `Directory package metadata ${packagePath} declares no exports target for the active conditions; it declares ${main.declared.join(", ")}.`,
267
- ],
304
+ kind: "unavailable",
305
+ limitation: `Directory package metadata ${path} was inventoried but its text is unavailable: ${file.text.reason}.`,
268
306
  };
269
- if (packageChain.has(packagePath)) {
307
+ let value;
308
+ try {
309
+ value = JSON.parse(file.text.value);
310
+ }
311
+ catch (cause) {
312
+ void cause;
270
313
  return {
271
- resolvedPath: null,
272
- status: "unavailable",
273
- limitations: [
274
- `Directory package entrypoint cycle includes ${packagePath}.`,
275
- ],
314
+ kind: "unavailable",
315
+ limitation: `Directory package metadata ${path} is not valid package JSON.`,
276
316
  };
277
317
  }
278
- if (main.status === "missing")
279
- 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)) ??
280
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
+ ]);
281
352
  const entryInput = {
282
- declaredPath: main.value,
283
- sourcePath: packagePath,
353
+ declaredPath: entry,
354
+ sourcePath: metadata.path,
284
355
  context: "package-entrypoint",
285
356
  files: input.files,
357
+ ...(input.moduleKind === undefined ? {} : { moduleKind: input.moduleKind }),
286
358
  };
287
- const chain = new Set([...packageChain, packagePath]);
288
- if (main.source === "legacy") {
289
- const entry = resolvePackagePath(entryInput, chain, "files-and-index");
290
- if (entry.resolution_status !== "not-found")
291
- return candidateOutcome(entry);
292
- const index = resolveFileCandidates(input, indexCandidates(candidate));
293
- if (index !== null)
294
- return index;
295
- }
296
- // Preserve recursive artifact package lookup only after legacy file/index fallbacks.
297
- 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]));
298
375
  };
299
- const candidateOutcome = (nested) => nested.resolution_status === "resolved"
300
- ? {
301
- resolvedPath: nested.resolved_path,
302
- status: nested.resolution_status,
303
- limitations: nested.limitations,
304
- }
305
- : {
306
- resolvedPath: null,
307
- status: nested.resolution_status,
308
- limitations: nested.limitations,
309
- };
310
376
  const resolveFileCandidates = (input, candidates) => {
311
377
  const source = input.files.get(input.sourcePath);
312
378
  for (const path of candidates) {
@@ -323,50 +389,44 @@ const fileCandidates = (candidate) => [
323
389
  ...EXTENSIONS.map((extension) => `${candidate}${extension}`),
324
390
  ];
325
391
  const indexCandidates = (candidate) => EXTENSIONS.map((extension) => posix.join(candidate, `index${extension}`));
326
- const packageEntry = (text, moduleKind, useExports) => {
327
- try {
328
- const value = JSON.parse(text);
329
- if (typeof value !== "object" || value === null)
330
- return { status: "invalid" };
331
- const rawExports = Reflect.get(value, "exports");
332
- if (useExports && rawExports !== undefined && rawExports !== null) {
333
- const exported = packageExport(rawExports, moduleKind);
334
- return exported.status === "value"
335
- ? { ...exported, source: "exports" }
336
- : exported;
392
+ /** Only exact non-directory keys participate; wildcard expansion is unsupported. */
393
+ const selectPackageExport = (value, subpath, moduleKind) => {
394
+ let target = value;
395
+ let declared = [];
396
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
397
+ const keys = Object.keys(value);
398
+ const hasSubpaths = keys.some((key) => key.startsWith("."));
399
+ if (hasSubpaths && keys.some((key) => !key.startsWith(".")))
400
+ return {
401
+ status: "rejected",
402
+ limitation: "The package exports configuration mixes subpath keys and condition keys.",
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);
337
411
  }
338
- // Node imports and requires ignore the bundler-only module field. Keep
339
- // that fallback for callers without an explicit module-loading kind.
340
- const preferred = [
341
- Reflect.get(value, "main"),
342
- ...(moduleKind === undefined ? [Reflect.get(value, "module")] : []),
343
- ];
344
- const entry = preferred.find((candidate) => candidate !== undefined);
345
- if (entry === undefined)
346
- return { status: "missing" };
347
- const legacy = packagePathValue(entry);
348
- return legacy.status === "value" ? { ...legacy, source: "legacy" } : legacy;
349
- }
350
- catch (cause) {
351
- // Reflect-based manifest reads fail closed as invalid.
352
- void cause;
353
- return { status: "invalid" };
412
+ else if (subpath !== ".")
413
+ return { status: "unmatched", declared };
354
414
  }
355
- };
356
- const packageExport = (value, moduleKind) => {
357
- const root = typeof value === "object" && value !== null && Object.hasOwn(value, ".")
358
- ? Reflect.get(value, ".")
359
- : value;
360
- const flattened = exportTargets(root, packageExportConditions(moduleKind));
361
- if (flattened.kind === "invalid")
362
- return { status: "rejected", limitation: flattened.limitation };
363
- const first = flattened.kind === "unmatched" ? undefined : flattened.values[0];
364
- return first === undefined
365
- ? {
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 {
366
422
  status: "unmatched",
367
- declared: typeof root === "object" && root !== null ? Object.keys(root) : [],
368
- }
369
- : { 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 };
370
430
  };
371
431
  const invalidExportTarget = (value, reason) => ({
372
432
  kind: "invalid",
@@ -389,21 +449,24 @@ const forbiddenExportSegment = (value) => value
389
449
  * An array skips unmatched and invalid entries, stops at its first string, and
390
450
  * preserves the final invalid-versus-null refusal if no string is selected.
391
451
  */
392
- const exportTargets = (value, conditions) => {
452
+ const selectExportTarget = (value, conditions) => {
393
453
  if (typeof value === "string") {
394
454
  if (!value.startsWith("./"))
395
455
  return invalidExportTarget(value, 'must start with "./"');
396
456
  const forbidden = forbiddenExportSegment(value);
397
457
  return forbidden === undefined
398
- ? { kind: "targets", values: [value] }
458
+ ? { kind: "value", value }
399
459
  : invalidExportTarget(value, `contains forbidden path segment ${JSON.stringify(forbidden)} before URL normalization`);
400
460
  }
401
461
  if (value === null)
402
- return { kind: "targets", values: [] };
462
+ return { kind: "blocked" };
403
463
  if (Array.isArray(value)) {
404
464
  let invalid = null;
405
465
  for (const entry of value) {
406
- const nested = exportTargets(entry, conditions);
466
+ const nested = selectExportTarget(entry, conditions);
467
+ // Node's array fallback catches invalid targets, not invalid configuration.
468
+ if (nested.kind === "invalid-config")
469
+ return nested;
407
470
  if (nested.kind === "invalid") {
408
471
  invalid = nested.limitation;
409
472
  continue;
@@ -411,19 +474,27 @@ const exportTargets = (value, conditions) => {
411
474
  if (nested.kind === "unmatched")
412
475
  continue;
413
476
  invalid = null;
414
- if (nested.values.length > 0)
477
+ if (nested.kind === "value")
415
478
  return nested;
416
479
  }
417
480
  return invalid === null
418
- ? { kind: "targets", values: [] }
481
+ ? { kind: "blocked" }
419
482
  : { kind: "invalid", limitation: invalid };
420
483
  }
421
484
  if (typeof value !== "object")
422
485
  return invalidExportTarget(value, "must be a relative string, object, array, or null");
486
+ for (const key of Object.keys(value)) {
487
+ const numeric = Number(key);
488
+ if (String(numeric) === key && numeric >= 0 && numeric < 0xffff_ffff)
489
+ return {
490
+ kind: "invalid-config",
491
+ limitation: `The package exports configuration contains numeric condition key ${JSON.stringify(key)}.`,
492
+ };
493
+ }
423
494
  for (const [condition, target] of Object.entries(value)) {
424
495
  if (!conditions.has(condition))
425
496
  continue;
426
- const nested = exportTargets(target, conditions);
497
+ const nested = selectExportTarget(target, conditions);
427
498
  if (nested.kind !== "unmatched")
428
499
  return nested;
429
500
  }
@@ -433,17 +504,16 @@ const exportTargets = (value, conditions) => {
433
504
  * Node selects an exports target by walking the declared keys in order and
434
505
  * taking the first whose condition is active for the calling resolver.
435
506
  * "default" is always active, and "node" plus "node-addons" are active for the
436
- * built-in resolver that owns installed-package imports and requires.
507
+ * built-in resolver that owns installed-package imports and requires. The
508
+ * supported Node runtimes also activate "module-sync" for both loaders.
437
509
  */
438
510
  const packageExportConditions = (moduleKind) => new Set([
439
511
  "node",
440
512
  "node-addons",
513
+ "module-sync",
441
514
  ...(moduleKind === undefined ? [] : [moduleKind]),
442
515
  "default",
443
516
  ]);
444
- const packagePathValue = (value) => typeof value === "string" && value.length > 0
445
- ? { status: "value", value }
446
- : { status: "invalid" };
447
517
  const notFoundCandidate = () => ({
448
518
  resolvedPath: null,
449
519
  status: "not-found",
@@ -473,19 +543,4 @@ const fileUrlPath = (value) => {
473
543
  return undefined;
474
544
  }
475
545
  };
476
- const outcome = (input, resolution) => resolution.status === "resolved"
477
- ? {
478
- declared_path: input.declaredPath,
479
- resolution_context: input.context,
480
- resolved_path: resolution.resolvedPath,
481
- resolution_status: resolution.status,
482
- limitations: resolution.limitations,
483
- }
484
- : {
485
- declared_path: input.declaredPath,
486
- resolution_context: input.context,
487
- resolved_path: null,
488
- resolution_status: resolution.status,
489
- limitations: resolution.limitations,
490
- };
491
- const unresolvedOutcome = (input, status, limitations) => outcome(input, { resolvedPath: null, status, limitations });
546
+ const unresolvedCandidate = (status, limitations) => ({ resolvedPath: null, status, limitations });