rea-agents 6.0.0 → 6.2.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 (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,6 +1,6 @@
1
1
  import { builtinModules } from "node:module";
2
2
  import { posix } from "node:path";
3
- import { admitsCanonicalPathSyntax, hasScheme, looksExternal, stripQueryAndFragment, } from "../../domain/artifactPathSyntax.js";
3
+ import { admitsCanonicalPathSyntax, hasScheme, htmlUrlText, looksExternal, percentDecodeUrlPath, stripQueryAndFragment, } from "../../domain/artifactPathSyntax.js";
4
4
  const EXTENSIONS = [
5
5
  ".js",
6
6
  ".cjs",
@@ -32,12 +32,16 @@ const resolvePackagePath = (input, packageChain, mode = "full", exportsTargetUrl
32
32
  `The exact HTML resource ${confined} was not found among the selected application files.`,
33
33
  ],
34
34
  });
35
- const resolved = mode === "files-and-index"
36
- ? (resolveFileCandidates(input, [
37
- ...fileCandidates(confined),
38
- ...indexCandidates(confined),
39
- ]) ?? notFoundCandidate())
40
- : resolveCandidate(input, confined, packageChain);
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);
41
45
  return outcome(input, resolved);
42
46
  };
43
47
  const rejectDeclaration = (input) => {
@@ -148,7 +152,7 @@ const hasContainerCandidate = (files, candidate, containerSha256) => [
148
152
  file.container_sha256 === containerSha256));
149
153
  });
150
154
  const htmlCandidate = (input) => {
151
- const declared = stripQueryAndFragment(input.declaredPath);
155
+ const declared = stripQueryAndFragment(htmlUrlText(input.declaredPath));
152
156
  if (looksExternal(declared))
153
157
  return unresolvedOutcome(input, "external", [
154
158
  "External HTML references are not mapped to local artifact assets.",
@@ -156,15 +160,26 @@ const htmlCandidate = (input) => {
156
160
  const rawBase = input.htmlBaseHref;
157
161
  const base = rawBase === undefined || rawBase === null
158
162
  ? rawBase
159
- : stripQueryAndFragment(rawBase);
163
+ : stripQueryAndFragment(htmlUrlText(rawBase));
160
164
  if (base !== undefined && base !== null && looksExternal(base))
161
165
  return unresolvedOutcome(input, "external", [
162
166
  "The document base href is external, so its script reference is not a local artifact path.",
163
167
  ]);
164
- if (declared.startsWith("/"))
165
- return declared.slice(1);
168
+ // Removing URL tabs and newlines can join an encoded dot or separator that
169
+ // the raw declaration split, so admit the parsed URL text again.
170
+ if (!admitsCanonicalPathSyntax(declared))
171
+ return unresolvedOutcome(input, "rejected", [
172
+ "Encoded dot or separator bytes are rejected before artifact path resolution.",
173
+ ]);
174
+ const declaredPath = percentDecodeUrlPath(declared);
175
+ if (declaredPath === null)
176
+ return unresolvedOutcome(input, "rejected", [
177
+ "The HTML reference path percent-decodes to NUL or to bytes that are not UTF-8.",
178
+ ]);
179
+ if (declaredPath.startsWith("/"))
180
+ return declaredPath.slice(1);
166
181
  if (base === undefined || base === null || base === "")
167
- return posix.join(posix.dirname(input.sourcePath), declared);
182
+ return posix.join(posix.dirname(input.sourcePath), declaredPath);
168
183
  // A local base href is a second untrusted path input; apply the same
169
184
  // admission rules a declared path gets so it cannot smuggle traversal or
170
185
  // separator syntax past canonicalization.
@@ -172,10 +187,15 @@ const htmlCandidate = (input) => {
172
187
  return unresolvedOutcome(input, "rejected", [
173
188
  "The document base href uses NUL, backslash, or encoded dot and separator bytes that are not admitted for canonical artifact paths.",
174
189
  ]);
175
- const basePath = base.startsWith("/")
176
- ? base.slice(1)
177
- : posix.join(posix.dirname(input.sourcePath), base);
178
- return posix.join(htmlBaseDirectory(base, basePath), declared);
190
+ const decodedBase = percentDecodeUrlPath(base);
191
+ if (decodedBase === null)
192
+ return unresolvedOutcome(input, "rejected", [
193
+ "The document base href path percent-decodes to NUL or to bytes that are not UTF-8.",
194
+ ]);
195
+ const basePath = decodedBase.startsWith("/")
196
+ ? decodedBase.slice(1)
197
+ : posix.join(posix.dirname(input.sourcePath), decodedBase);
198
+ return posix.join(htmlBaseDirectory(decodedBase, basePath), declaredPath);
179
199
  };
180
200
  /**
181
201
  * The directory a relative HTML reference resolves against. A base path
@@ -315,9 +335,12 @@ const packageEntry = (text, moduleKind, useExports) => {
315
335
  ? { ...exported, source: "exports" }
316
336
  : exported;
317
337
  }
318
- const preferred = moduleKind === "import"
319
- ? [Reflect.get(value, "module"), Reflect.get(value, "main")]
320
- : [Reflect.get(value, "main"), Reflect.get(value, "module")];
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
+ ];
321
344
  const entry = preferred.find((candidate) => candidate !== undefined);
322
345
  if (entry === undefined)
323
346
  return { status: "missing" };
@@ -428,6 +451,13 @@ const notFoundCandidate = () => ({
428
451
  "No extension, directory package, or index candidate exists in the inventoried artifact container.",
429
452
  ],
430
453
  });
454
+ const exactExportsTargetNotFound = (path) => ({
455
+ resolvedPath: null,
456
+ status: "not-found",
457
+ limitations: [
458
+ `The selected package exports target ${path} does not exist in the inventoried artifact container; exports targets are exact files, so no extension or directory index was tried.`,
459
+ ],
460
+ });
431
461
  const fileUrlPath = (value) => {
432
462
  if (!value.startsWith("file://"))
433
463
  return undefined;
@@ -1,21 +1,25 @@
1
- import { lstat, realpath } from "node:fs/promises";
1
+ import { constants } from "node:fs";
2
+ import { access, lstat, realpath } from "node:fs/promises";
2
3
  import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
4
+ import { AnalysisAccessDeniedError, AnalysisInputError, AnalysisUnsupportedTargetError, } from "../../domain/analysisErrorCore.js";
3
5
  import { createJavaScriptArtifactReader as createReader } from "../../artifacts/javascript/JavaScriptArtifactReader.js";
4
6
  import { analyzeAndProjectJavaScriptArtifactFiles } from "./JavaScriptArtifactAnalysis.js";
5
7
  import { readJavaScriptArtifactFiles } from "../../artifacts/javascript/JavaScriptArtifactFiles.js";
6
- import { buildJavaScriptArtifactGraph } from "./JavaScriptArtifactGraphBuilder.js";
8
+ import { buildImmutableJavaScriptArtifactGraphSteps } from "./JavaScriptArtifactGraphBuilder.js";
7
9
  import { javascriptArtifactReconstructionInputSchema, } from "./JavaScriptArtifactReconstructionInput.js";
8
- import { scanCanonicalArtifactInventory } from "../../artifacts/inventory/ArtifactInventory.js";
10
+ import { scanCanonicalArtifactInventory } from "../../artifacts/inventory/scanCanonical.js";
9
11
  import { summarizeElectronBoundaries } from "./ElectronBoundaryAnalysis.js";
10
12
  import { createJavaScriptSemanticGraphProjection } from "./JavaScriptSemanticGraphBuilder.js";
13
+ import { checkpointJavaScriptAnalysis, completeJavaScriptAnalysisSteps, } from "./JavaScriptAnalysisControl.js";
11
14
  /** Reconstruct one local ASAR or extracted directory without executing code. */
12
15
  export const reconstructJavaScriptArtifact = async (rawInput, signal, progress) => {
13
16
  const reportPhase = async (phase, message) => {
14
17
  await progress?.report({ phase, completed: 0, total: 1, message });
18
+ await checkpointJavaScriptAnalysis(signal);
15
19
  };
16
20
  const input = javascriptArtifactReconstructionInputSchema.parse(rawInput);
17
21
  abortIfNeeded(signal);
18
- const path = await realpath(input.input_path);
22
+ const path = await resolveSelectedInput(input.input_path);
19
23
  const format = await resolveFormat(path, input);
20
24
  const snapshot = await scanCanonicalArtifactInventory(path, { signal });
21
25
  if (snapshot.manifest.root_format !== format)
@@ -36,11 +40,17 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
36
40
  });
37
41
  abortIfNeeded(signal);
38
42
  });
43
+ await checkpointJavaScriptAnalysis(signal);
39
44
  abortIfNeeded(signal);
40
45
  await reportPhase("build_javascript_application_graph", "Constructing application and Electron boundary relationships");
41
- const graph = buildJavaScriptArtifactGraph(snapshot, files, analysis);
46
+ const applicationGraphSteps = buildImmutableJavaScriptArtifactGraphSteps(snapshot, files, analysis);
47
+ await reportPhase("seal_javascript_application_graph", "Sealing the validated application graph");
48
+ const graph = await completeJavaScriptAnalysisSteps(applicationGraphSteps, signal);
42
49
  await reportPhase("build_javascript_semantic_graph", "Binding and validating static semantic relationships");
43
- const semanticGraph = semanticProjection.finish(snapshot.manifest.root_sha256, graph, analysis);
50
+ const semanticGraphSteps = semanticProjection.finishImmutableSteps(snapshot.manifest.root_sha256, graph, analysis);
51
+ await reportPhase("seal_javascript_semantic_graph", "Validating and sealing the semantic graph");
52
+ const semanticGraph = await completeJavaScriptAnalysisSteps(semanticGraphSteps, signal);
53
+ await checkpointJavaScriptAnalysis(signal);
44
54
  return {
45
55
  input_path: path,
46
56
  format,
@@ -69,6 +79,35 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
69
79
  await reader.close();
70
80
  }
71
81
  };
82
+ const OPERATION = "analyze_javascript_application";
83
+ /**
84
+ * Resolve the caller-selected input. A missing or unreadable selection is a
85
+ * caller or host-permission failure, not a damaged artifact.
86
+ */
87
+ const resolveSelectedInput = async (inputPath) => {
88
+ try {
89
+ const path = await realpath(inputPath);
90
+ await access(path, constants.R_OK);
91
+ return path;
92
+ }
93
+ catch (cause) {
94
+ const code = cause instanceof Error && "code" in cause ? String(cause.code) : "";
95
+ if (code === "EACCES" || code === "EPERM")
96
+ throw new AnalysisAccessDeniedError(OPERATION, inputPath, code, {
97
+ cause,
98
+ });
99
+ if (code === "ENOENT" || code === "ENOTDIR")
100
+ throw new AnalysisInputError(OPERATION, { cause }, [
101
+ {
102
+ path: ["input_path"],
103
+ reason: "invalid_value",
104
+ message: `No file or directory exists at the selected input path (${code}): ${inputPath}`,
105
+ },
106
+ ]);
107
+ throw cause;
108
+ }
109
+ };
110
+ /** The selected input's kind, checked against the caller's requested format. */
72
111
  const resolveFormat = async (path, input) => {
73
112
  const metadata = await lstat(path);
74
113
  const observed = metadata.isDirectory()
@@ -77,9 +116,18 @@ const resolveFormat = async (path, input) => {
77
116
  ? "asar"
78
117
  : undefined;
79
118
  if (observed === undefined)
80
- throw new ArtifactReaderFailure("format", `JavaScript artifact reconstruction accepts only a directory or .asar file: ${path}`);
119
+ throw new AnalysisUnsupportedTargetError(OPERATION, input.input_path, "JavaScript application analysis accepts only a directory or an .asar file", {
120
+ remediationAction: "Select an extracted application directory, an app bundle, or an .asar file such as Contents/Resources/app.asar.",
121
+ });
81
122
  if (input.format !== "auto" && input.format !== observed)
82
- throw new ArtifactReaderFailure("format", `Requested ${input.format} input but observed ${observed}: ${path}`);
123
+ throw new AnalysisInputError(OPERATION, undefined, [
124
+ {
125
+ path: ["format"],
126
+ reason: "invalid_value",
127
+ message: `Requested ${input.format} input, but the selected input is ${observed === "asar" ? "an .asar file" : "a directory"}: ${input.input_path}`,
128
+ expected: ["auto", observed],
129
+ },
130
+ ]);
83
131
  return observed;
84
132
  };
85
133
  const abortIfNeeded = (signal) => {
@@ -1,10 +1,12 @@
1
1
  import { posix } from "node:path";
2
2
  import { compareCodePoints } from "../../domain/canonicalOrdering.js";
3
3
  import { completeApplicationCoverage, partialApplicationCoverage, } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
4
+ import { semanticCoverageResourceLimits } from "../../domain/javascript/javascriptSemanticCoverage.js";
5
+ import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT, semanticResourceLimitReason, } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
4
6
  import { addAstContainsEdge, artifactLocalIdentity, } from "./JavaScriptArtifactGraphContext.js";
5
7
  import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
6
8
  import { resolveArtifactPathByContext, } from "./JavaScriptArtifactPathResolution.js";
7
- import { projectJavaScriptExportReturnShapes } from "./JavaScriptReturnShapeProjection.js";
9
+ import { projectJavaScriptExportReturnShapes } from "../../domain/javascript/javascriptExportReturnShapeProjection.js";
8
10
  /** Create one path-scoped source-module identity for every analyzed source file. */
9
11
  export const addJavaScriptSourceModules = (context) => {
10
12
  for (const analyzed of context.analysis.files) {
@@ -58,6 +60,7 @@ export const addJavaScriptSourceModules = (context) => {
58
60
  };
59
61
  /** Compose bounded CommonJS and ESM binding relationships across artifact files. */
60
62
  export const addJavaScriptModuleRelationships = (context) => {
63
+ const omissions = { selfImports: 0 };
61
64
  for (const analyzed of context.analysis.files) {
62
65
  const { file, semantic } = analyzed;
63
66
  const source = context.sourceModuleNodes.get(file.path);
@@ -66,16 +69,17 @@ export const addJavaScriptModuleRelationships = (context) => {
66
69
  for (const link of semantic.ir.moduleLinks) {
67
70
  const input = { context, file, semantic, source, link };
68
71
  if (isExportLink(link))
69
- addExportRelationship(input);
72
+ addExportRelationship(input, omissions);
70
73
  else if (link.specifier !== null)
71
- addImportRelationship(input, source, {
74
+ addImportRelationship(input, source, omissions, {
72
75
  specifier: link.specifier,
73
76
  importedPath: link.importedName === null ? [] : [link.importedName],
74
77
  });
75
78
  }
76
79
  }
80
+ return omissions;
77
81
  };
78
- const addExportRelationship = (input) => {
82
+ const addExportRelationship = (input, omissions) => {
79
83
  const { context, file, semantic, source, link } = input;
80
84
  if (link.exportedName === null)
81
85
  return;
@@ -137,10 +141,18 @@ const addExportRelationship = (input) => {
137
141
  });
138
142
  const origin = moduleOriginForExport(semantic.ir, link);
139
143
  if (origin !== null)
140
- addImportRelationship(input, exported, origin);
144
+ addImportRelationship(input, exported, omissions, origin);
141
145
  };
142
- const addImportRelationship = (input, source, origin) => {
146
+ const addImportRelationship = (input, source, omissions, origin) => {
143
147
  const target = resolveModuleTarget(input, origin.specifier);
148
+ // A specifier that resolves back to the importing module itself (a literal
149
+ // self-import, self-require, or artifact-confined path alias)
150
+ // cannot become an edge: the application graph forbids self-referential
151
+ // edges, and emitting one fails result validation for the whole analysis.
152
+ if (target.node.node_id === source.node_id) {
153
+ omissions.selfImports += 1;
154
+ return;
155
+ }
144
156
  input.context.accumulator.addEdge({
145
157
  source_node_id: source.node_id,
146
158
  target_node_id: target.node.node_id,
@@ -242,12 +254,29 @@ const relationshipEvidence = (input, operation, limitations, confidence = "high"
242
254
  operation,
243
255
  coverage: semanticCoverage(input.semantic),
244
256
  confidence,
245
- limitations: [...input.semantic.ir.limitations, ...limitations],
257
+ limitations: [
258
+ ...input.semantic.ir.limitations,
259
+ ...semanticCoverageResourceLimits(input.semantic.ir.coverage).map(semanticResourceLimitReason),
260
+ ...limitations,
261
+ ],
246
262
  });
247
263
  const semanticCoverage = (semantic) => {
248
- if (semantic.ir.coverage.status === "complete")
264
+ const resourceLimits = semanticCoverageResourceLimits(semantic.ir.coverage);
265
+ if (semantic.ir.coverage.status === "complete" && resourceLimits.length === 0)
249
266
  return completeApplicationCoverage();
250
- return partialApplicationCoverage([], semantic.ir.coverage.omittedCount);
267
+ return partialApplicationCoverage(resourceLimits.map((resourceLimit) => ({
268
+ name: `javascript_semantic_${resourceLimit.replaceAll("-", "_")}`,
269
+ value: resourceLimit === "primitive-candidates"
270
+ ? SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT
271
+ : resourceLimit === "primitive-bytes"
272
+ ? SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT
273
+ : SEMANTIC_EXPRESSION_DEPTH_LIMIT,
274
+ unit: resourceLimit === "expression-depth"
275
+ ? "depth"
276
+ : resourceLimit === "primitive-bytes"
277
+ ? "bytes"
278
+ : "items",
279
+ })), semantic.ir.coverage.omittedCount);
251
280
  };
252
281
  const moduleFormat = (path, ir) => {
253
282
  const extension = posix.extname(path).toLowerCase();
@@ -3,7 +3,7 @@ import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from
3
3
  import { createEvidence } from "../../domain/evidence.js";
4
4
  import { javascriptRecoveryInputSchema, javascriptRecoveryResultSchema, } from "../../domain/javascript/javascriptRecovery.js";
5
5
  import { jsonObjectSchema } from "../../domain/jsonValue.js";
6
- import { projectInputIssues } from "../../domain/inputIssueProjection.js";
6
+ import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
7
7
  import { err, ok } from "../../domain/result.js";
8
8
  const OPERATION = "recover_javascript_sources";
9
9
  /** Shared CLI/MCP parsing and Evidence for derived JavaScript artifacts. */
@@ -18,7 +18,9 @@ export class JavaScriptRecoveryService {
18
18
  return err(new AnalysisCancelledError(OPERATION));
19
19
  const parsed = javascriptRecoveryInputSchema.safeParse(input);
20
20
  if (!parsed.success)
21
- return err(new AnalysisInputError(OPERATION, { cause: parsed.error }, projectInputIssues(parsed.error.issues, input)));
21
+ return err(analysisInputErrorFromIssues(OPERATION, parsed.error.issues, input, {
22
+ cause: parsed.error,
23
+ }));
22
24
  const invalidPaths = ["path", "output_directory"].filter((field) => !isAbsolute(parsed.data[field]));
23
25
  if (invalidPaths.length > 0)
24
26
  return err(new AnalysisInputError(OPERATION, undefined, invalidPaths.map((field) => ({
@@ -1,5 +1,5 @@
1
1
  import { createJavaScriptRuntimeObservationEvidence } from "./JavaScriptRuntimeObservationEvidence.js";
2
- import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
2
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, } from "../../domain/analysisErrorCore.js";
3
3
  import {} from "../../domain/analysisErrorBase.js";
4
4
  import { err, ok } from "../../domain/result.js";
5
5
  /** List targets exposed by the explicitly selected loopback Inspector. */
@@ -18,9 +18,11 @@ export const observeJavaScriptRuntime = async (provider, input, options = {}) =>
18
18
  if (!ready.ok)
19
19
  return ready;
20
20
  const result = await ready.value.observe(input, options);
21
- return result.ok
22
- ? ok(createJavaScriptRuntimeObservationEvidence("observe_javascript_runtime", input, result.value, ready.value.identity()))
23
- : result;
21
+ if (!result.ok)
22
+ return result;
23
+ if (options.signal?.aborted === true)
24
+ return err(new AnalysisCancelledError("observe_javascript_runtime"));
25
+ return ok(createJavaScriptRuntimeObservationEvidence("observe_javascript_runtime", input, result.value, ready.value.identity()));
24
26
  };
25
27
  const requireProvider = (provider, operation) => provider === undefined
26
28
  ? err(new AnalysisCapabilityUnavailableError("rea-v8-inspector", operation, "V8 Inspector observation provider is not configured"))
@@ -2,7 +2,7 @@ import { resolve } from "node:path";
2
2
  import { z } from "zod";
3
3
  import { AnalysisInputError, AnalysisProtocolError, } from "../../domain/analysisErrorCore.js";
4
4
  import {} from "../../domain/analysisErrorBase.js";
5
- import { projectInputIssues } from "../../domain/inputIssueProjection.js";
5
+ import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
6
6
  import { reconcileJavaScriptRuntime } from "../../domain/javascript/javascriptRuntimeReconciliation.js";
7
7
  import { reconcileJavaScriptRuntimeInputSchema } from "../../domain/javascript/javascriptRuntimeReconciliationSchemas.js";
8
8
  import { err, ok } from "../../domain/result.js";
@@ -12,7 +12,7 @@ const OPERATION = "reconcile_javascript_runtime";
12
12
  export const reconcileJavaScriptRuntimeEvidence = (rawInput) => {
13
13
  const parsed = reconcileJavaScriptRuntimeInputSchema.safeParse(rawInput);
14
14
  if (!parsed.success)
15
- return err(new AnalysisInputError(OPERATION, undefined, projectInputIssues(parsed.error.issues, rawInput)));
15
+ return err(analysisInputErrorFromIssues(OPERATION, parsed.error.issues, rawInput));
16
16
  return reconcileJavaScriptRuntimeEvidenceValidated(parsed.data);
17
17
  };
18
18
  /** Reconcile input already parsed by a trusted adapter boundary. */
@@ -24,7 +24,7 @@ export const reconcileJavaScriptRuntimeEvidenceValidated = (parsedInput) => {
24
24
  }
25
25
  catch (cause) {
26
26
  if (cause instanceof z.ZodError)
27
- return err(new AnalysisInputError(OPERATION, undefined, projectInputIssues(cause.issues, parsedInput)));
27
+ return err(analysisInputErrorFromIssues(OPERATION, cause.issues, parsedInput));
28
28
  if (cause instanceof TypeError &&
29
29
  SAFE_RECONCILIATION_INPUT_CONSTRAINTS.has(cause.message))
30
30
  return err(new AnalysisInputError(OPERATION, undefined, [
@@ -1,7 +1,6 @@
1
1
  import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
2
2
  import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
3
3
  import { unknownSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
4
- import { semanticCallSiteAt, } from "./JavaScriptSemanticGraphFlowProjection.js";
5
4
  /** Project literal EventEmitter registrations, removals, and dispatches. */
6
5
  export const projectSemanticEvents = (context) => {
7
6
  const eventNodes = new Map();
@@ -116,7 +115,7 @@ export const projectSemanticTimers = (context) => {
116
115
  };
117
116
  const projectTimerSchedule = (context, operation, timerNodes) => {
118
117
  addSemanticGraphRelation(context.state, {
119
- source: semanticCallSiteAt(context, operation.location),
118
+ source: context.callSiteAt(operation.location),
120
119
  target: timerNodes.get(operation.timerId),
121
120
  relation: "schedules-timer",
122
121
  resolution: "resolved",
@@ -134,7 +133,7 @@ const projectTimerSchedule = (context, operation, timerNodes) => {
134
133
  });
135
134
  };
136
135
  const projectTimerCancellation = (context, operation, timerNodes) => {
137
- const callSite = semanticCallSiteAt(context, operation.location);
136
+ const callSite = context.callSiteAt(operation.location);
138
137
  const target = operation.linkedTimerId === null
139
138
  ? undefined
140
139
  : timerNodes.get(operation.linkedTimerId);
@@ -1,4 +1,4 @@
1
- import { createJavaScriptSemanticGraph, } from "../../domain/javascript/javascriptSemanticGraph.js";
1
+ import { createJavaScriptSemanticGraph, createImmutableJavaScriptSemanticGraphSteps, } from "../../domain/javascript/javascriptSemanticGraph.js";
2
2
  import { JAVASCRIPT_SEMANTIC_RELATION_FAMILIES, JAVASCRIPT_SEMANTIC_RELATION_FAMILY, } from "../../domain/javascript/javascriptSemanticGraphSchemas.js";
3
3
  import { sourceRangesEqual as rangesEqual } from "../../domain/javascript/javascriptStaticAnalysisHelpers.js";
4
4
  import { projectSemanticEvents, projectSemanticTimers, } from "./JavaScriptSemanticGraphAsyncProjection.js";
@@ -68,68 +68,70 @@ export const createJavaScriptSemanticGraphProjection = () => {
68
68
  truncatedFiles += 1;
69
69
  state.fileNodeBudget = null;
70
70
  };
71
+ const finishWith = (factory, rootArtifactSha256, applicationGraph, analysis) => {
72
+ bindSemanticGraphApplicationNodes(state, applicationGraph);
73
+ if (state.roots.size === 0)
74
+ addFallbackRoot(rootArtifactSha256, state);
75
+ const unknowns = [...state.unknowns.values()];
76
+ const graph = factory({
77
+ schema: "JavaScriptSemanticRelationGraph",
78
+ root_artifact_sha256: rootArtifactSha256,
79
+ application_graph_id: applicationGraph.graph_id,
80
+ root_node_ids: [...state.roots],
81
+ nodes: [...state.nodes.values()],
82
+ relations: [...state.relations.values()],
83
+ fingerprints,
84
+ unknowns,
85
+ coverage: {
86
+ status: truncatedFiles > 0 ? "partial" : "unknown",
87
+ truncated: truncatedFiles > 0,
88
+ omitted_nodes: truncatedFiles > 0 ? null : 0,
89
+ omitted_relations: truncatedFiles > 0 ? null : 0,
90
+ limits: truncatedFiles > 0
91
+ ? [
92
+ {
93
+ name: "semantic_graph_node_ceiling",
94
+ value: SEMANTIC_GRAPH_NODE_CEILING,
95
+ unit: "items",
96
+ },
97
+ ]
98
+ : [],
99
+ families: JAVASCRIPT_SEMANTIC_RELATION_FAMILIES.map((family) => ({
100
+ family,
101
+ status: semanticFamilyStatus(family, analysis),
102
+ retained_relations: [...state.relations.values()].filter((relation) => JAVASCRIPT_SEMANTIC_RELATION_FAMILY[relation.relation] ===
103
+ family).length,
104
+ omitted_relations: truncatedFiles > 0 ? null : 0,
105
+ unknown_ids: unknowns
106
+ .filter((unknown) => unknown.family === family)
107
+ .map(({ unknown_id: identifier }) => identifier),
108
+ })),
109
+ },
110
+ limitations: [
111
+ "The semantic graph contains static syntax observations and conservative relationship candidates; it does not claim runtime execution.",
112
+ "Local data flow does not claim control-flow-sensitive reaching definitions or arbitrary dynamic property resolution.",
113
+ "Promise ownership covers explicit unshadowed Promise construction, static factories, aggregation, chaining, and await syntax only.",
114
+ "Function fingerprints are static candidates; equal digests can remain ambiguous and do not prove behavioral equivalence.",
115
+ "Event extraction covers EventEmitter-style literal registrations, removals, and dispatch candidates; dynamic names remain unknown.",
116
+ "Timer extraction covers global or node:timers scheduling and exact local-handle cancellation.",
117
+ "Child-process extraction covers asynchronous node:child_process creation, literal argv/env/stdio options, exit/error listeners, and kill signals.",
118
+ "Configuration extraction covers process.env, process.argv, node:fs reads, and direct logical defaults.",
119
+ "Request extraction covers fetch, WebSocket, node:http/node:https construction, direct option fields, and exact local response consumers.",
120
+ "Boundary extraction covers unshadowed JSON/global coercions plus parse and validation method candidates.",
121
+ "Resource extraction covers built-in filesystem/network acquisition and exact local close/destroy/end handles.",
122
+ ],
123
+ });
124
+ state.nodes.clear();
125
+ state.relations.clear();
126
+ state.unknowns.clear();
127
+ state.roots.clear();
128
+ fingerprints.length = 0;
129
+ return graph;
130
+ };
71
131
  return {
72
132
  projectFile: projectSource,
73
- finish: (rootArtifactSha256, applicationGraph, analysis) => {
74
- bindSemanticGraphApplicationNodes(state, applicationGraph);
75
- if (state.roots.size === 0)
76
- addFallbackRoot(rootArtifactSha256, state);
77
- const unknowns = [...state.unknowns.values()];
78
- const graph = createJavaScriptSemanticGraph({
79
- schema: "JavaScriptSemanticRelationGraph",
80
- root_artifact_sha256: rootArtifactSha256,
81
- application_graph_id: applicationGraph.graph_id,
82
- root_node_ids: [...state.roots],
83
- nodes: [...state.nodes.values()],
84
- relations: [...state.relations.values()],
85
- fingerprints,
86
- unknowns,
87
- coverage: {
88
- status: truncatedFiles > 0 ? "partial" : "unknown",
89
- truncated: truncatedFiles > 0,
90
- omitted_nodes: truncatedFiles > 0 ? null : 0,
91
- omitted_relations: truncatedFiles > 0 ? null : 0,
92
- limits: truncatedFiles > 0
93
- ? [
94
- {
95
- name: "semantic_graph_node_ceiling",
96
- value: SEMANTIC_GRAPH_NODE_CEILING,
97
- unit: "items",
98
- },
99
- ]
100
- : [],
101
- families: JAVASCRIPT_SEMANTIC_RELATION_FAMILIES.map((family) => ({
102
- family,
103
- status: semanticFamilyStatus(family, analysis),
104
- retained_relations: [...state.relations.values()].filter((relation) => JAVASCRIPT_SEMANTIC_RELATION_FAMILY[relation.relation] ===
105
- family).length,
106
- omitted_relations: truncatedFiles > 0 ? null : 0,
107
- unknown_ids: unknowns
108
- .filter((unknown) => unknown.family === family)
109
- .map(({ unknown_id: identifier }) => identifier),
110
- })),
111
- },
112
- limitations: [
113
- "The semantic graph contains static syntax observations and conservative relationship candidates; it does not claim runtime execution.",
114
- "Local data flow does not claim control-flow-sensitive reaching definitions or arbitrary dynamic property resolution.",
115
- "Promise ownership covers explicit unshadowed Promise construction, static factories, aggregation, chaining, and await syntax only.",
116
- "Function fingerprints are static candidates; equal digests can remain ambiguous and do not prove behavioral equivalence.",
117
- "Event extraction covers EventEmitter-style literal registrations, removals, and dispatch candidates; dynamic names remain unknown.",
118
- "Timer extraction covers global or node:timers scheduling and exact local-handle cancellation.",
119
- "Child-process extraction covers asynchronous node:child_process creation, literal argv/env/stdio options, exit/error listeners, and kill signals.",
120
- "Configuration extraction covers process.env, process.argv, node:fs reads, and direct logical defaults.",
121
- "Request extraction covers fetch, WebSocket, node:http/node:https construction, direct option fields, and exact local response consumers.",
122
- "Boundary extraction covers unshadowed JSON/global coercions plus parse and validation method candidates.",
123
- "Resource extraction covers built-in filesystem/network acquisition and exact local close/destroy/end handles.",
124
- ],
125
- });
126
- state.nodes.clear();
127
- state.relations.clear();
128
- state.unknowns.clear();
129
- state.roots.clear();
130
- fingerprints.length = 0;
131
- return graph;
132
- },
133
+ finish: (rootArtifactSha256, applicationGraph, analysis) => finishWith(createJavaScriptSemanticGraph, rootArtifactSha256, applicationGraph, analysis),
134
+ finishImmutableSteps: (rootArtifactSha256, applicationGraph, analysis) => finishWith(createImmutableJavaScriptSemanticGraphSteps, rootArtifactSha256, applicationGraph, analysis),
133
135
  };
134
136
  };
135
137
  const projectFile = (file, ir, state) => {
@@ -1,7 +1,6 @@
1
1
  import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
2
2
  import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
3
3
  import { unknownSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
4
- import { semanticCallSiteAt, } from "./JavaScriptSemanticGraphFlowProjection.js";
5
4
  /** Project child creation, argv/env/stdio, listeners, and signals. */
6
5
  export const projectSemanticChildProcesses = (context) => {
7
6
  const processNodes = new Map(context.ir.childProcessSpawns.flatMap((spawn) => {
@@ -34,7 +33,7 @@ const addChildProcessNode = (context, spawn) => retainSemanticGraphNode(context.
34
33
  },
35
34
  });
36
35
  const projectSpawn = (context, spawn, child) => {
37
- const callSite = semanticCallSiteAt(context, spawn.location);
36
+ const callSite = context.callSiteAt(spawn.location);
38
37
  addSemanticGraphRelation(context.state, {
39
38
  source: callSite,
40
39
  target: child,
@@ -1,7 +1,6 @@
1
1
  import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
2
2
  import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
3
3
  import { unknownSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
4
- import { semanticCallSiteAt, } from "./JavaScriptSemanticGraphFlowProjection.js";
5
4
  /** Project environment, argv, file, default, and precedence candidates. */
6
5
  export const projectSemanticConfiguration = (context) => {
7
6
  const configNodes = new Map(context.ir.configurationOperations.flatMap((operation) => {
@@ -110,7 +109,7 @@ const addRequestNode = (context, operation) => retainSemanticGraphNode(context.s
110
109
  },
111
110
  });
112
111
  const projectRequestConstruction = (context, operation, request) => {
113
- const callSite = semanticCallSiteAt(context, operation.location);
112
+ const callSite = context.callSiteAt(operation.location);
114
113
  addSemanticGraphRelation(context.state, {
115
114
  source: callSite,
116
115
  target: request,
@@ -142,7 +141,7 @@ const projectRequestConstruction = (context, operation, request) => {
142
141
  const projectResponseConsumer = (context, operation, response) => {
143
142
  addSemanticGraphRelation(context.state, {
144
143
  source: response,
145
- target: semanticCallSiteAt(context, operation.location),
144
+ target: context.callSiteAt(operation.location),
146
145
  relation: "consumed-by",
147
146
  resolution: operation.resolution === "complete" ? "resolved" : "candidate",
148
147
  properties: { method: operation.method },
@@ -2,10 +2,6 @@ import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/ja
2
2
  import { sourceRangesEqual } from "../../domain/javascript/javascriptStaticAnalysisHelpers.js";
3
3
  import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
4
4
  import { inferredSemanticEvidenceAt, unknownSemanticEvidence, } from "./JavaScriptSemanticGraphEvidence.js";
5
- /** Find the retained call-site node at one exact semantic source range. */
6
- export const semanticCallSiteAt = (context, location) => {
7
- return context.callSiteAt(location);
8
- };
9
5
  /** Project explicit static Promise/task ownership without runtime claims. */
10
6
  export const projectSemanticPromises = (context) => {
11
7
  const promiseNodes = new Map(context.ir.promiseOperations.flatMap((operation) => {
@@ -46,7 +42,7 @@ const projectPromiseCreation = (context, operation, promise) => {
46
42
  if (operation.kind === "awaited-expression")
47
43
  return;
48
44
  addSemanticGraphRelation(context.state, {
49
- source: semanticCallSiteAt(context, operation.location),
45
+ source: context.callSiteAt(operation.location),
50
46
  target: promise,
51
47
  relation: "creates-promise",
52
48
  resolution: operation.kind === "chain" || operation.sourceResolution !== "complete"