rea-agents 5.0.0 → 6.1.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 (507) hide show
  1. package/README.md +168 -655
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +173 -47
  4. package/bridge/hopper_bridge.py +310 -128
  5. package/bridge/mitmproxy/capture.py +208 -0
  6. package/bridge/native/rea_lldb_tracer.py +839 -0
  7. package/bridge/process/ProcessRunTokenReader.swift +297 -0
  8. package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
  9. package/bridge/pwndbg/core_context.py +101 -0
  10. package/bridge/pwndbg/launch.py +39 -0
  11. package/bridge/pwndbg/launch_impl.py +34 -0
  12. package/bridge/pwntools/decoder_runtime.py +59 -0
  13. package/bridge/pwntools/layout.py +39 -0
  14. package/bridge/pwntools/layout_impl.py +309 -0
  15. package/bridge/pwntools/recorded_crash.py +39 -0
  16. package/bridge/pwntools/recorded_crash_impl.py +147 -0
  17. package/dist/android/JadxConfiguration.js +196 -33
  18. package/dist/android/JadxMcpTransport.js +4 -0
  19. package/dist/android/JadxProtocol.js +6 -0
  20. package/dist/android/JadxProvider.js +20 -2
  21. package/dist/android/JadxSession.js +23 -4
  22. package/dist/application/AnalysisContextQueries.js +8 -35
  23. package/dist/application/AnalysisDocument.js +32 -0
  24. package/dist/application/AppBundleExecutable.js +67 -21
  25. package/dist/application/CallPathTracing.js +19 -3
  26. package/dist/application/CapabilityInventory.js +27 -3
  27. package/dist/application/ClientConfigurationDocument.js +871 -6
  28. package/dist/application/ClientRegistrationIdentity.js +26 -5
  29. package/dist/application/ClientRegistrationStatus.js +29 -14
  30. package/dist/application/DirectAnalysis.js +97 -33
  31. package/dist/application/Doctor.js +4 -2
  32. package/dist/application/DoctorScope.js +25 -13
  33. package/dist/application/EnhancedLiteralTracing.js +22 -25
  34. package/dist/application/EnhancedTools.js +13 -11
  35. package/dist/application/EvidenceBundleFiles.js +24 -12
  36. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  37. package/dist/application/InventoryProjectionEvidence.js +4 -3
  38. package/dist/application/InvestigationProviders.js +3 -2
  39. package/dist/application/JsonFiles.js +50 -28
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/ReconstructionCoverageService.js +7 -4
  42. package/dist/application/ReconstructionObligationCandidates.js +5 -1
  43. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  44. package/dist/application/Setup.js +13 -1
  45. package/dist/application/SetupClientConfiguration.js +10 -15
  46. package/dist/application/SetupHost.js +5 -2
  47. package/dist/application/SetupPlan.js +5 -3
  48. package/dist/application/SupportedClients.js +34 -1
  49. package/dist/application/Uninstall.js +4 -3
  50. package/dist/application/Update.js +18 -3
  51. package/dist/application/UpdateRuntime.js +46 -25
  52. package/dist/application/WebModuleTraceService.js +4 -2
  53. package/dist/application/WebNetworkCapturePort.js +1 -0
  54. package/dist/application/WebNetworkCaptureService.js +134 -0
  55. package/dist/application/WebRuntimeService.js +5 -3
  56. package/dist/application/WebScriptExportService.js +2 -2
  57. package/dist/application/WebSourceLocationService.js +4 -2
  58. package/dist/application/WindowsCapabilities.js +1 -1
  59. package/dist/application/WorkflowEvidence.js +82 -0
  60. package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
  61. package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
  62. package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
  63. package/dist/application/binary/BinarySession.js +131 -76
  64. package/dist/application/binary/BinarySessionOpen.js +19 -6
  65. package/dist/application/binary/BinarySessionRecords.js +45 -3
  66. package/dist/application/binary/BinarySessionStatus.js +17 -1
  67. package/dist/application/binary/CompositeProvider.js +13 -0
  68. package/dist/application/binary/LazyAnalysisProvider.js +3 -0
  69. package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
  70. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
  71. package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
  72. package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
  73. package/dist/application/evm/EvmInterfacePort.js +1 -0
  74. package/dist/application/evm/EvmInterfaceService.js +64 -0
  75. package/dist/application/investigation/EvidenceLedger.js +21 -7
  76. package/dist/application/investigation/InvestigationRecords.js +8 -0
  77. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  78. package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
  79. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  80. package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
  81. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  82. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
  83. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
  84. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
  85. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
  86. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  89. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
  90. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  91. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
  92. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
  93. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
  94. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
  95. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
  96. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
  97. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
  98. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
  99. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
  100. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
  101. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  102. package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
  103. package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
  104. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  105. package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
  106. package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
  107. package/dist/application/workflowInputError.js +18 -0
  108. package/dist/artifacts/ArtifactProvider.js +42 -5
  109. package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
  110. package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
  111. package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
  112. package/dist/artifacts/ZipArtifactReader.js +3 -0
  113. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
  114. package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
  115. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  116. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  117. package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
  118. package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
  119. package/dist/artifacts/apple/NibArchive.js +81 -14
  120. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  121. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  122. package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
  123. package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
  124. package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
  125. package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
  126. package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
  127. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
  128. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
  129. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  130. package/dist/artifacts/readStableArtifact.js +20 -4
  131. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  132. package/dist/browser/CdpCaptureEventHandlers.js +165 -12
  133. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  134. package/dist/browser/CdpCaptureEvents.js +34 -0
  135. package/dist/browser/CdpConnection.js +30 -11
  136. package/dist/browser/CdpOptionalCommand.js +2 -3
  137. package/dist/browser/CdpPageCapture.js +23 -1
  138. package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
  139. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  140. package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
  141. package/dist/browser/WebSourceMapFetcher.js +426 -72
  142. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  143. package/dist/browser/history/CaptureFailures.js +137 -0
  144. package/dist/browser/history/CaptureFormatError.js +10 -0
  145. package/dist/browser/history/CaptureRedaction.js +65 -0
  146. package/dist/browser/history/CaptureRelease.js +17 -0
  147. package/dist/browser/history/HarCapture.js +165 -0
  148. package/dist/browser/history/HarCaptureAdapter.js +20 -0
  149. package/dist/browser/history/HarCaptureProcess.js +57 -0
  150. package/dist/browser/history/HarJson.js +92 -0
  151. package/dist/browser/history/HarSchema.js +72 -0
  152. package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
  153. package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
  154. package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
  155. package/dist/cli/analysisSelector.js +23 -0
  156. package/dist/cli/applicationCommands.js +2 -3
  157. package/dist/cli/artifactCommands.js +26 -1
  158. package/dist/cli/binaryDiagnosticsCommands.js +39 -0
  159. package/dist/cli/coreAnalysisCommands.js +2 -2
  160. package/dist/cli/coreBinaryCommands.js +78 -20
  161. package/dist/cli/electronCommands.js +21 -13
  162. package/dist/cli/evmCommands.js +24 -0
  163. package/dist/cli/firmwareCommands.js +6 -3
  164. package/dist/cli/javascriptApplicationAnalysis.js +20 -3
  165. package/dist/cli/jsonOutput.js +38 -0
  166. package/dist/cli/nativeCallCommands.js +34 -0
  167. package/dist/cli/processCommands.js +1 -1
  168. package/dist/cli/streamedJsonOutput.js +56 -0
  169. package/dist/cli/utilityCommands.js +2 -0
  170. package/dist/cli/webNetworkCaptureCommands.js +40 -0
  171. package/dist/cli/webRuntimeCommands.js +8 -8
  172. package/dist/cli.js +11 -4
  173. package/dist/cliBrowserScenarioCommands.js +2 -2
  174. package/dist/cliCommandNames.js +6 -1
  175. package/dist/cliJsonInput.js +35 -1
  176. package/dist/cliOutput.js +21 -6
  177. package/dist/composition/binaryDiagnostics.js +8 -0
  178. package/dist/composition/evm.js +4 -0
  179. package/dist/composition/webNetworkCaptures.js +6 -0
  180. package/dist/config/environment.js +4 -0
  181. package/dist/config/ghidraStartupTimeout.js +17 -0
  182. package/dist/config/mcpResponseBudget.js +22 -0
  183. package/dist/config/parseConfig.js +2 -1
  184. package/dist/contracts/artifactToolContracts.js +6 -0
  185. package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
  186. package/dist/contracts/browserToolContracts.js +4 -3
  187. package/dist/contracts/enhancedInputs.js +5 -3
  188. package/dist/contracts/enhancedToolContracts.js +3 -3
  189. package/dist/contracts/errorSchemas.js +8 -1
  190. package/dist/contracts/evm/evmToolContracts.js +20 -0
  191. package/dist/contracts/hopperMemoryContracts.js +2 -5
  192. package/dist/contracts/investigationExamples.js +2 -2
  193. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  194. package/dist/contracts/managed/managedToolContracts.js +8 -6
  195. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
  196. package/dist/contracts/native/nativeToolContracts.js +21 -3
  197. package/dist/contracts/officialToolContracts.js +26 -24
  198. package/dist/contracts/process/processCaptureExample.js +2 -0
  199. package/dist/contracts/promptContracts.js +3 -3
  200. package/dist/contracts/sessionLifecycleInputs.js +18 -5
  201. package/dist/contracts/sessionStatusContract.js +8 -2
  202. package/dist/contracts/sessionToolContracts.js +8 -3
  203. package/dist/contracts/sessionToolSchemas.js +8 -4
  204. package/dist/contracts/toolContractExamples.js +1 -2
  205. package/dist/contracts/toolContractHelpers.js +4 -1
  206. package/dist/contracts/toolContracts.js +6 -0
  207. package/dist/contracts/toolEffects.js +30 -1
  208. package/dist/contracts/toolOutputSchemaGroups.js +33 -28
  209. package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
  210. package/dist/contracts/toolSchemaMetadata.js +69 -10
  211. package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
  212. package/dist/domain/analysisErrorBase.js +22 -2
  213. package/dist/domain/analysisErrorCore.js +61 -5
  214. package/dist/domain/analysisErrorPresentation.js +95 -12
  215. package/dist/domain/analysisErrorProjection.js +148 -19
  216. package/dist/domain/analysisSnapshot.js +166 -2
  217. package/dist/domain/android/androidAnalysis.js +2 -4
  218. package/dist/domain/android/androidApplication.js +17 -9
  219. package/dist/domain/apple/appleApplication.js +41 -14
  220. package/dist/domain/apple/dyldEnvironment.js +73 -0
  221. package/dist/domain/apple/dyldPaths.js +81 -0
  222. package/dist/domain/apple/dylibResolution.js +478 -0
  223. package/dist/domain/apple/dylibResolutionFindings.js +77 -0
  224. package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
  225. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  226. package/dist/domain/apple/keyedArchive.js +9 -1
  227. package/dist/domain/apple/machoContainer.js +54 -0
  228. package/dist/domain/apple/plistNumbers.js +76 -0
  229. package/dist/domain/artifactIdentity.js +29 -0
  230. package/dist/domain/artifactInventoryEvidence.js +19 -24
  231. package/dist/domain/artifactPathSyntax.js +1 -1
  232. package/dist/domain/bridgeCandidateProjection.js +71 -0
  233. package/dist/domain/browserCompleteness.js +1 -0
  234. package/dist/domain/browserObservation.js +1 -1
  235. package/dist/domain/browserObservationError.js +24 -5
  236. package/dist/domain/browserObservationSchemas.js +13 -0
  237. package/dist/domain/browserScenarioValues.js +5 -2
  238. package/dist/domain/bundleComparison.js +3 -2
  239. package/dist/domain/callPathSchemas.js +1 -1
  240. package/dist/domain/canonicalDigest.js +13 -1
  241. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  242. package/dist/domain/canonicalOrdering.js +9 -5
  243. package/dist/domain/changedBehavior.js +9 -9
  244. package/dist/domain/comparisonSourceEvidence.js +40 -0
  245. package/dist/domain/comparisonStatus.js +2 -30
  246. package/dist/domain/configurationErrors.js +1 -1
  247. package/dist/domain/conformanceTrustGate.js +0 -16
  248. package/dist/domain/evidence.js +78 -11
  249. package/dist/domain/evidenceBundle.js +42 -1
  250. package/dist/domain/evidenceErrors.js +12 -1
  251. package/dist/domain/evm/evmInterface.js +63 -0
  252. package/dist/domain/explicitSensitiveFailure.js +108 -0
  253. package/dist/domain/explicitSensitiveValues.js +10 -0
  254. package/dist/domain/firmware/firmwareAnalysis.js +10 -4
  255. package/dist/domain/hopperErrors.js +23 -2
  256. package/dist/domain/hopperValues.js +51 -8
  257. package/dist/domain/immutableJson.js +114 -0
  258. package/dist/domain/inputIssueProjection.js +3 -0
  259. package/dist/domain/javascript/electronActiveObservation.js +37 -6
  260. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  261. package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
  262. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  263. package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
  264. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  265. package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
  266. package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
  267. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  268. package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
  269. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  270. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  271. package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
  272. package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
  273. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  274. package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
  275. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  276. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  277. package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
  278. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  279. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  280. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  281. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
  282. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  283. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
  284. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  285. package/dist/domain/jsonSerialization.js +109 -0
  286. package/dist/domain/jsonValue.js +91 -3
  287. package/dist/domain/localPath.js +8 -0
  288. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  289. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  290. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  291. package/dist/domain/managed/managedNativeVerification.js +3 -9
  292. package/dist/domain/native/binaryLayout.js +357 -0
  293. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  294. package/dist/domain/native/nativeCallObservation.js +186 -0
  295. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  296. package/dist/domain/native/objcSwiftMetadata.js +0 -39
  297. package/dist/domain/native/recordedCrash.js +266 -0
  298. package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
  299. package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
  300. package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
  301. package/dist/domain/process/processCaptureParsing.js +54 -0
  302. package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
  303. package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
  304. package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
  305. package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
  306. package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
  307. package/dist/domain/propertyListKeys.js +1 -1
  308. package/dist/domain/propertyListXmlText.js +19 -0
  309. package/dist/domain/providerAdapterError.js +1 -1
  310. package/dist/domain/providerOperationHealth.js +54 -0
  311. package/dist/domain/providerSelectionError.js +4 -2
  312. package/dist/domain/reconstructionVerification.js +9 -46
  313. package/dist/domain/reconstructionVerificationSchemas.js +3 -3
  314. package/dist/domain/residualUnknown.js +3 -2
  315. package/dist/domain/staticRuntimeCorrelation.js +9 -46
  316. package/dist/domain/webBundleAnalysis.js +20 -8
  317. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  318. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  319. package/dist/domain/webCaptureDiff.js +1 -0
  320. package/dist/domain/webNetworkCapture.js +118 -0
  321. package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
  322. package/dist/domain/webRuntime.js +19 -5
  323. package/dist/domain/webSourceLocation.js +1 -0
  324. package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
  325. package/dist/dotnet/ManagedMemberInspector.js +4 -2
  326. package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
  327. package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
  328. package/dist/dotnet/ManagedMemberRows.js +14 -3
  329. package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
  330. package/dist/dotnet/ManagedMetadataInventory.js +38 -28
  331. package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
  332. package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
  333. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
  334. package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
  335. package/dist/dotnet/ManagedPeReader.js +11 -0
  336. package/dist/evm/EvmBytecodeCarrier.js +21 -0
  337. package/dist/evm/EvmWorkerLimits.js +40 -0
  338. package/dist/evm/EvmoleFailures.js +126 -0
  339. package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
  340. package/dist/evm/EvmoleInterfaceProvider.js +273 -0
  341. package/dist/evm/EvmoleInterfaceWorker.js +87 -0
  342. package/dist/evm/EvmoleRelease.js +16 -0
  343. package/dist/firmware/FirmwareCommand.js +1 -0
  344. package/dist/firmware/FirmwareFiles.js +1 -1
  345. package/dist/generatedPackageMetadata.js +2 -2
  346. package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
  347. package/dist/ghidra/GhidraClient.js +47 -14
  348. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  349. package/dist/ghidra/GhidraFunctionValues.js +10 -7
  350. package/dist/ghidra/GhidraInstallation.js +18 -21
  351. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  352. package/dist/ghidra/GhidraJavaLaunch.js +62 -0
  353. package/dist/ghidra/GhidraLauncher.js +34 -16
  354. package/dist/ghidra/GhidraProvider.js +2 -2
  355. package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
  356. package/dist/ghidra/GhidraProviderClient.js +23 -12
  357. package/dist/ghidra/GhidraSessionError.js +11 -7
  358. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  359. package/dist/ghidra/GhidraTransport.js +20 -0
  360. package/dist/hopper/BridgeLauncher.js +33 -11
  361. package/dist/hopper/HopperAnalysisProfile.js +62 -4
  362. package/dist/hopper/HopperCleanup.js +15 -3
  363. package/dist/hopper/HopperClient.js +222 -14
  364. package/dist/hopper/HopperFileOffset.js +237 -0
  365. package/dist/hopper/HopperMachOImage.js +196 -0
  366. package/dist/hopper/HopperOperationStage.js +6 -0
  367. package/dist/hopper/HopperProvider.js +63 -9
  368. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  369. package/dist/hopper/HopperRegexSearch.js +137 -0
  370. package/dist/hopper/HopperRegexWorker.js +27 -0
  371. package/dist/hopper/HopperRequestQueue.js +68 -19
  372. package/dist/hopper/HopperTargetLease.js +3 -2
  373. package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
  374. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  375. package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
  376. package/dist/inspector/V8InspectorProvider.js +47 -11
  377. package/dist/javascript/recovery/WakaruCommand.js +3 -0
  378. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  379. package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
  380. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  381. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  382. package/dist/mcpDoctor.js +62 -2
  383. package/dist/native/AppleDispatchCoverage.js +47 -6
  384. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  385. package/dist/native/AppleDispatchMetadata.js +6 -3
  386. package/dist/native/AppleMachoFixups.js +48 -24
  387. package/dist/native/AppleMachoSelection.js +32 -16
  388. package/dist/native/AppleObjcCategories.js +6 -2
  389. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  390. package/dist/native/AppleObjcProperties.js +2 -1
  391. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  392. package/dist/native/AppleSwiftVtables.js +21 -15
  393. package/dist/native/CommandRunner.js +82 -84
  394. package/dist/native/LldbCallTracer.js +541 -0
  395. package/dist/native/LldbRetainedObservations.js +178 -0
  396. package/dist/native/NativeCallObservation.js +194 -0
  397. package/dist/native/NativeMacOSProvider.js +117 -20
  398. package/dist/native/NativeMacOSProviderMetadata.js +8 -3
  399. package/dist/native/SignatureTargetBinding.js +155 -0
  400. package/dist/native/parsers/lipo.js +71 -1
  401. package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
  402. package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
  403. package/dist/native/pwntools/PwntoolsFailures.js +180 -0
  404. package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
  405. package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
  406. package/dist/native/pwntools/PwntoolsRelease.js +19 -0
  407. package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
  408. package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
  409. package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
  410. package/dist/process/DarwinProcessRunTokenReader.js +293 -0
  411. package/dist/process/ExecFileOutput.js +20 -0
  412. package/dist/process/OwnedCommand.js +118 -0
  413. package/dist/process/ProcessOwnership.js +431 -51
  414. package/dist/process/ProcessOwnershipObservation.js +209 -27
  415. package/dist/process/ProviderProcess.js +68 -10
  416. package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
  417. package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
  418. package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
  419. package/dist/{application → process/capture}/ProcessHarness.js +195 -29
  420. package/dist/{application → process/capture}/ProcessSampling.js +2 -2
  421. package/dist/server/EvidenceMcpServer.js +146 -0
  422. package/dist/server/createServer.js +37 -8
  423. package/dist/server/promptCompletion.js +10 -3
  424. package/dist/server/registerAndroidTools.js +2 -4
  425. package/dist/server/registerApplicationTools/helpers.js +2 -4
  426. package/dist/server/registerArtifactComparisonTool.js +11 -7
  427. package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
  428. package/dist/server/registerBrowserScenarioTool.js +2 -4
  429. package/dist/server/registerBrowserTools.js +2 -4
  430. package/dist/server/registerBundleComparisonTool.js +2 -3
  431. package/dist/server/registerCloseLifecycleTool.js +8 -18
  432. package/dist/server/registerElectronTools.js +2 -4
  433. package/dist/server/registerEnhancedTools.js +18 -59
  434. package/dist/server/registerEvidenceTools.js +3 -5
  435. package/dist/server/registerEvmTools.js +15 -0
  436. package/dist/server/registerFirmwareTools.js +2 -4
  437. package/dist/server/registerFunctionComparisonTool.js +10 -6
  438. package/dist/server/registerInvestigationTools.js +7 -7
  439. package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
  440. package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
  441. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
  442. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
  443. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
  444. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
  445. package/dist/server/registerOfficialTools.js +2 -4
  446. package/dist/server/registerProcessComparisonTool.js +72 -46
  447. package/dist/server/registerRecordedCrashTools.js +15 -0
  448. package/dist/server/registerSessionRecordTools.js +5 -6
  449. package/dist/server/registerSessionStatusTool.js +17 -3
  450. package/dist/server/registerSessionTools.js +13 -5
  451. package/dist/server/registerWebModuleTool.js +2 -4
  452. package/dist/server/registerWebNetworkCaptureTool.js +26 -0
  453. package/dist/server/registerWebRuntimeTools.js +3 -7
  454. package/dist/server/registerWebScriptTool.js +2 -4
  455. package/dist/server/registerWebSourceLocationTool.js +2 -4
  456. package/dist/server/runDerivedOperation.js +15 -3
  457. package/dist/server/sessionAvailabilityPolicy.js +3 -1
  458. package/dist/server/sessionToolPolicies.js +1 -1
  459. package/dist/server/toolRegistrationOptions.js +2 -2
  460. package/dist/server/toolResult.js +63 -11
  461. package/dist/server/toolResultEncoding.js +33 -0
  462. package/install.sh +1 -1
  463. package/native/windows/build/manifest.json +2 -2
  464. package/native/windows/build/rea-windows-x64.node +0 -0
  465. package/package.json +42 -9
  466. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  467. package/scripts/electron-active-hook.cjs +241 -37
  468. package/scripts/rea.mjs +11 -3
  469. package/skills/reverse-engineer-anything/SKILL.md +32 -4
  470. package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
  471. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
  472. package/third_party/README.md +60 -0
  473. package/third_party/evmole/LICENSE +21 -0
  474. package/third_party/evmole/README.md +22 -0
  475. package/third_party/pwndbg/LICENSE.md +21 -0
  476. package/third_party/pwndbg/README.md +23 -0
  477. package/third_party/pwntools/README.md +40 -0
  478. package/dist/application/AuthorizedArtifactInventory.js +0 -7
  479. package/dist/application/ProcessCaptureLifecycle.js +0 -299
  480. package/dist/application/StoreFileLock.js +0 -124
  481. package/dist/contracts/processCaptureExample.js +0 -2
  482. package/dist/domain/bytecodeProvider.js +0 -178
  483. package/dist/domain/customProtocolCapture.js +0 -137
  484. package/dist/domain/eventProcessTree.js +0 -225
  485. package/dist/domain/mobileApplicationInvestigation.js +0 -159
  486. package/dist/domain/packageAnalysis.js +0 -123
  487. package/dist/domain/peInspection.js +0 -197
  488. package/dist/domain/processCaptureParsing.js +0 -21
  489. package/dist/domain/protocolCapture.js +0 -217
  490. package/dist/domain/runtimeIdentification.js +0 -212
  491. package/dist/generatedMcpToolCatalog.js +0 -37
  492. package/dist/ghidra/GhidraDefaults.js +0 -2
  493. /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
  494. /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
  495. /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
  496. /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
  497. /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
  498. /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
  499. /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
  500. /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
  501. /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
  502. /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
  503. /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
  504. /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
  505. /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
  506. /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
  507. /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
@@ -1,14 +1,19 @@
1
- import { createJavaScriptApplicationGraph, } from "../../domain/javascript/javascriptApplicationGraph.js";
1
+ import { createJavaScriptApplicationGraph, createImmutableJavaScriptApplicationGraphSteps, } from "../../domain/javascript/javascriptApplicationGraph.js";
2
2
  import { JavaScriptArtifactGraphAccumulator } from "./JavaScriptArtifactGraphAccumulator.js";
3
3
  import { addJavaScriptHtmlRoles, addJavaScriptSourceMapOriginals, } from "./JavaScriptArtifactGraphDocuments.js";
4
4
  import { addJavaScriptStaticFindings } from "./JavaScriptArtifactGraphFindings.js";
5
5
  import { addJavaScriptModuleRelationships, addJavaScriptSourceModules, } from "./JavaScriptModuleRelationships.js";
6
6
  import { completeApplicationCoverage, partialApplicationCoverage, } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
7
+ import { semanticCoverageResourceLimits } from "../../domain/javascript/javascriptSemanticCoverage.js";
8
+ import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT, semanticResourceLimitReason, } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
7
9
  import { addJavaScriptArtifactContainers, addJavaScriptArtifactFiles, addJavaScriptBundlerNodes, addJavaScriptPackageNodes, createJavaScriptArtifactRootNode, } from "./JavaScriptArtifactGraphStructure.js";
8
10
  import { addElectronBoundaries } from "./ElectronBoundaryGraph.js";
9
11
  import { classifyElectronIpcPairings, collectElectronIpcRecords, } from "./ElectronBoundaryAnalysis.js";
10
12
  /** Project artifact and AST facts into JavaScript Application Graph. */
11
- export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) => {
13
+ export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) => createJavaScriptApplicationGraph(buildJavaScriptArtifactGraphInput(snapshot, fileSet, analysis));
14
+ /** Build a validated application graph with cooperative immutable ownership. */
15
+ export const buildImmutableJavaScriptArtifactGraphSteps = (snapshot, fileSet, analysis) => createImmutableJavaScriptApplicationGraphSteps(buildJavaScriptArtifactGraphInput(snapshot, fileSet, analysis));
16
+ const buildJavaScriptArtifactGraphInput = (snapshot, fileSet, analysis) => {
12
17
  const accumulator = new JavaScriptArtifactGraphAccumulator();
13
18
  const root = createJavaScriptArtifactRootNode(accumulator, snapshot);
14
19
  const context = {
@@ -30,13 +35,13 @@ export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) => {
30
35
  const packageRoots = addJavaScriptPackageNodes(context);
31
36
  addJavaScriptSourceModules(context);
32
37
  addJavaScriptBundlerNodes(context);
33
- addJavaScriptModuleRelationships(context);
38
+ const relationshipOmissions = addJavaScriptModuleRelationships(context);
34
39
  addJavaScriptStaticFindings(context);
35
40
  addElectronBoundaries(context);
36
41
  addJavaScriptHtmlRoles(context);
37
42
  addJavaScriptSourceMapOriginals(context);
38
43
  const coverage = graphCoverage(context);
39
- return createJavaScriptApplicationGraph({
44
+ return {
40
45
  schema: "JavaScriptApplicationGraph",
41
46
  root_node_ids: packageRoots.length === 0
42
47
  ? [root.node_id]
@@ -44,10 +49,11 @@ export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) => {
44
49
  nodes: accumulator.nodes(),
45
50
  edges: accumulator.edges(),
46
51
  coverage,
47
- limitations: graphLimitations(context, coverage.status),
48
- });
52
+ limitations: graphLimitations(context, coverage.status, relationshipOmissions),
53
+ };
49
54
  };
50
55
  const graphCoverage = (context) => {
56
+ const resourceLimits = semanticResourceLimits(context);
51
57
  const sourceMapPolicyGap = context.analysis.source_maps.some(({ status }) => status === "invalid");
52
58
  const malformedStructuredData = context.analysis.packages.some(({ status }) => status !== "included") ||
53
59
  context.analysis.json_modules.some(({ status }) => status !== "included") ||
@@ -60,11 +66,31 @@ const graphCoverage = (context) => {
60
66
  partialJavaScript;
61
67
  if (context.analysis.truncated_scopes > 0)
62
68
  return partialApplicationCoverage([], null);
69
+ if (resourceLimits.length > 0)
70
+ return partialApplicationCoverage(resourceLimits.map(applicationGraphResourceLimit), null);
63
71
  if (unknownGap)
64
72
  return partialApplicationCoverage([], null);
65
73
  return completeApplicationCoverage();
66
74
  };
67
- const graphLimitations = (context, coverage) => {
75
+ const semanticResourceLimits = (context) => [
76
+ ...new Set(context.analysis.files.flatMap(({ semantic }) => semantic === null
77
+ ? []
78
+ : semanticCoverageResourceLimits(semantic.ir.coverage))),
79
+ ].sort();
80
+ const applicationGraphResourceLimit = (resourceLimit) => ({
81
+ name: `javascript_semantic_${resourceLimit.replaceAll("-", "_")}`,
82
+ value: resourceLimit === "primitive-candidates"
83
+ ? SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT
84
+ : resourceLimit === "primitive-bytes"
85
+ ? SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT
86
+ : SEMANTIC_EXPRESSION_DEPTH_LIMIT,
87
+ unit: resourceLimit === "expression-depth"
88
+ ? "depth"
89
+ : resourceLimit === "primitive-bytes"
90
+ ? "bytes"
91
+ : "items",
92
+ });
93
+ const graphLimitations = (context, coverage, relationshipOmissions) => {
68
94
  const ipc = collectElectronIpcRecords(context.analysis);
69
95
  const pairings = classifyElectronIpcPairings(ipc);
70
96
  const electronFindings = context.analysis.files.reduce((count, { javascript }) => count +
@@ -78,6 +104,11 @@ const graphLimitations = (context, coverage) => {
78
104
  javascript.electron.native_addon_bindings.length), 0);
79
105
  return [
80
106
  ...context.analysis.limitations,
107
+ ...(relationshipOmissions.selfImports > 0
108
+ ? [
109
+ `${String(relationshipOmissions.selfImports)} import ${relationshipOmissions.selfImports === 1 ? "specifier" : "specifiers"} resolved back to the importing module itself and ${relationshipOmissions.selfImports === 1 ? "was" : "were"} omitted; application graph edges cannot be self-referential.`,
110
+ ]
111
+ : []),
81
112
  "CommonJS and ESM binding relationships were recovered from inert syntax and resolved only within the inventoried artifact container.",
82
113
  "Webpack/Rspack factories were recovered from AST literals; REA did not invoke push handlers or bundle bootstrap code.",
83
114
  "Static imports, entrypoints, workers, endpoints, and storage relationships do not prove runtime execution.",
@@ -101,6 +132,7 @@ const graphLimitations = (context, coverage) => {
101
132
  "Sender, frame, URL, and origin checks are observations only; REA does not claim that they enforce a complete authorization policy.",
102
133
  ]
103
134
  : []),
135
+ ...semanticResourceLimits(context).map(semanticResourceLimitReason),
104
136
  ...(context.analysis.files.some(({ javascript }) => (javascript?.electron.native_addon_bindings.length ?? 0) > 0)
105
137
  ? [
106
138
  "Native member names are requested by JavaScript syntax and are not verified binary exports in this workflow.",
@@ -1,5 +1,5 @@
1
1
  import { addArtifactContainsEdge, addStaticInferenceEdge, createElectronRoleNode, linkElectronRoleToAsset, } from "./JavaScriptArtifactGraphContext.js";
2
- import { artifactObservationEvidence } from "./JavaScriptArtifactGraphEvidence.js";
2
+ import { artifactObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
3
3
  import { completeApplicationCoverage } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
4
4
  import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js";
5
5
  /** Project HTML renderer entrypoints and their local script assets. */
@@ -46,8 +46,32 @@ export const addJavaScriptHtmlRoles = (context) => {
46
46
  htmlBaseHref: script.base_href,
47
47
  });
48
48
  const resolvedPath = resolution.resolved_path;
49
- if (resolvedPath === null)
49
+ if (resolvedPath === null) {
50
+ context.accumulator.addNode({
51
+ kind: role.kind,
52
+ identity: role.identity,
53
+ observations: [
54
+ {
55
+ label: script.script_path,
56
+ properties: {
57
+ mechanism: "html-script-reference",
58
+ script_path: script.script_path,
59
+ base_href: script.base_href,
60
+ ...resolution,
61
+ },
62
+ evidence: staticInferenceEvidence({
63
+ sha256: html.sha256,
64
+ path: html.path,
65
+ range: script.location,
66
+ operation: "resolve-html-script-reference",
67
+ coverage: completeApplicationCoverage(),
68
+ limitations: resolution.limitations,
69
+ }),
70
+ },
71
+ ],
72
+ });
50
73
  continue;
74
+ }
51
75
  const resolved = context.fileNodes.get(resolvedPath);
52
76
  if (resolved === undefined)
53
77
  continue;
@@ -14,16 +14,24 @@ const EXTENSIONS = [
14
14
  const NODE_BUILTINS = new Set(builtinModules.map((name) => name.replace(/^node:/u, "")));
15
15
  /** Resolve one declaration under its exact syntax/metadata context. */
16
16
  export const resolveArtifactPathByContext = (input) => resolvePackagePath(input, new Set());
17
- const resolvePackagePath = (input, packageChain, mode = "full") => {
17
+ const resolvePackagePath = (input, packageChain, mode = "full", exportsTargetUrl = false) => {
18
18
  const rejected = rejectDeclaration(input);
19
19
  if (rejected !== null)
20
20
  return rejected;
21
- const candidate = contextualCandidate(input);
21
+ const candidate = contextualCandidate(input, exportsTargetUrl);
22
22
  if (typeof candidate !== "string")
23
23
  return candidate;
24
24
  const confined = confineCandidate(input, candidate);
25
25
  if (typeof confined !== "string")
26
26
  return confined;
27
+ if (input.context === "html-reference")
28
+ return outcome(input, resolveFileCandidates(input, [confined]) ?? {
29
+ resolvedPath: null,
30
+ status: "not-found",
31
+ limitations: [
32
+ `The exact HTML resource ${confined} was not found among the selected application files.`,
33
+ ],
34
+ });
27
35
  const resolved = mode === "files-and-index"
28
36
  ? (resolveFileCandidates(input, [
29
37
  ...fileCandidates(confined),
@@ -48,10 +56,11 @@ const rejectDeclaration = (input) => {
48
56
  ]);
49
57
  return null;
50
58
  };
51
- const contextualCandidate = (input) => {
59
+ const contextualCandidate = (input, exportsTargetUrl) => {
52
60
  const { context } = input;
53
- const declared = context === "html-reference" ||
61
+ let declared = context === "html-reference" ||
54
62
  context === "url-reference" ||
63
+ exportsTargetUrl ||
55
64
  (context === "module-specifier" && input.moduleKind !== "require")
56
65
  ? stripQueryAndFragment(input.declaredPath)
57
66
  : input.declaredPath;
@@ -72,6 +81,23 @@ const contextualCandidate = (input) => {
72
81
  return unresolvedOutcome(input, "external", [
73
82
  "URL schemes and protocol-relative URLs are outside this local artifact path context.",
74
83
  ]);
84
+ // Exports targets use URL paths for both loaders; legacy main fields remain literal.
85
+ if (exportsTargetUrl ||
86
+ (context === "module-specifier" && input.moduleKind !== "require")) {
87
+ try {
88
+ declared = decodeURIComponent(declared);
89
+ }
90
+ catch (cause) {
91
+ void cause;
92
+ return unresolvedOutcome(input, "rejected", [
93
+ "The module URL path contains malformed percent encoding.",
94
+ ]);
95
+ }
96
+ if (declared.includes("\0"))
97
+ return unresolvedOutcome(input, "rejected", [
98
+ "The decoded module URL path contains NUL.",
99
+ ]);
100
+ }
75
101
  const relative = declared.startsWith("/") ? declared.slice(1) : declared;
76
102
  return declared.startsWith("/")
77
103
  ? relative
@@ -206,6 +232,12 @@ const resolveCandidate = (input, candidate, packageChain) => {
206
232
  `Directory package metadata ${packagePath} is not valid package JSON.`,
207
233
  ],
208
234
  };
235
+ if (main.status === "rejected")
236
+ return {
237
+ resolvedPath: null,
238
+ status: "rejected",
239
+ limitations: [`Package metadata ${packagePath}: ${main.limitation}`],
240
+ };
209
241
  if (main.status === "unmatched")
210
242
  return {
211
243
  resolvedPath: null,
@@ -242,7 +274,7 @@ const resolveCandidate = (input, candidate, packageChain) => {
242
274
  return index;
243
275
  }
244
276
  // Preserve recursive artifact package lookup only after legacy file/index fallbacks.
245
- return candidateOutcome(resolvePackagePath(entryInput, chain));
277
+ return candidateOutcome(resolvePackagePath(entryInput, chain, "full", main.source === "exports"));
246
278
  };
247
279
  const candidateOutcome = (nested) => nested.resolution_status === "resolved"
248
280
  ? {
@@ -283,9 +315,12 @@ const packageEntry = (text, moduleKind, useExports) => {
283
315
  ? { ...exported, source: "exports" }
284
316
  : exported;
285
317
  }
286
- const preferred = moduleKind === "import"
287
- ? [Reflect.get(value, "module"), Reflect.get(value, "main")]
288
- : [Reflect.get(value, "main"), Reflect.get(value, "module")];
318
+ // Node imports and requires ignore the bundler-only module field. Keep
319
+ // that fallback for callers without an explicit module-loading kind.
320
+ const preferred = [
321
+ Reflect.get(value, "main"),
322
+ ...(moduleKind === undefined ? [Reflect.get(value, "module")] : []),
323
+ ];
289
324
  const entry = preferred.find((candidate) => candidate !== undefined);
290
325
  if (entry === undefined)
291
326
  return { status: "missing" };
@@ -299,23 +334,35 @@ const packageEntry = (text, moduleKind, useExports) => {
299
334
  }
300
335
  };
301
336
  const packageExport = (value, moduleKind) => {
302
- if (typeof value === "string")
303
- return packagePathValue(value);
304
- if (typeof value !== "object" || value === null || Array.isArray(value))
305
- return { status: "invalid" };
306
- const root = Reflect.get(value, ".") ?? value;
307
- if (typeof root === "string")
308
- return packagePathValue(root);
309
- if (typeof root !== "object" || root === null || Array.isArray(root))
310
- return { status: "invalid" };
337
+ const root = typeof value === "object" && value !== null && Object.hasOwn(value, ".")
338
+ ? Reflect.get(value, ".")
339
+ : value;
311
340
  const flattened = exportTargets(root, packageExportConditions(moduleKind));
312
341
  if (flattened.kind === "invalid")
313
- return { status: "invalid" };
342
+ return { status: "rejected", limitation: flattened.limitation };
314
343
  const first = flattened.kind === "unmatched" ? undefined : flattened.values[0];
315
344
  return first === undefined
316
- ? { status: "unmatched", declared: Object.keys(root) }
345
+ ? {
346
+ status: "unmatched",
347
+ declared: typeof root === "object" && root !== null ? Object.keys(root) : [],
348
+ }
317
349
  : { status: "value", value: first };
318
350
  };
351
+ const invalidExportTarget = (value, reason) => ({
352
+ kind: "invalid",
353
+ limitation: `The package exports target ${JSON.stringify(value) ?? String(value)} ${reason}.`,
354
+ });
355
+ // Node checks raw target segments before URL normalization. Compare encoded
356
+ // segment names here; full URL decoding follows array target selection.
357
+ const forbiddenExportSegment = (value) => value
358
+ .slice(2)
359
+ .split(/[\\/]/u)
360
+ .find((raw) => {
361
+ const segment = raw.replace(/%[0-9a-f]{2}/giu, (encoded) => String.fromCharCode(Number.parseInt(encoded.slice(1), 16)));
362
+ return (segment === "." ||
363
+ segment === ".." ||
364
+ segment.toLowerCase() === "node_modules");
365
+ });
319
366
  /**
320
367
  * Resolve a target in Node's declared order. Explicit null blocks an active
321
368
  * condition, whereas an unmatched nested object permits the next condition.
@@ -323,30 +370,36 @@ const packageExport = (value, moduleKind) => {
323
370
  * preserves the final invalid-versus-null refusal if no string is selected.
324
371
  */
325
372
  const exportTargets = (value, conditions) => {
326
- if (typeof value === "string")
327
- return value.startsWith("./")
373
+ if (typeof value === "string") {
374
+ if (!value.startsWith("./"))
375
+ return invalidExportTarget(value, 'must start with "./"');
376
+ const forbidden = forbiddenExportSegment(value);
377
+ return forbidden === undefined
328
378
  ? { kind: "targets", values: [value] }
329
- : { kind: "invalid" };
379
+ : invalidExportTarget(value, `contains forbidden path segment ${JSON.stringify(forbidden)} before URL normalization`);
380
+ }
330
381
  if (value === null)
331
382
  return { kind: "targets", values: [] };
332
383
  if (Array.isArray(value)) {
333
- let invalid = false;
384
+ let invalid = null;
334
385
  for (const entry of value) {
335
386
  const nested = exportTargets(entry, conditions);
336
387
  if (nested.kind === "invalid") {
337
- invalid = true;
388
+ invalid = nested.limitation;
338
389
  continue;
339
390
  }
340
391
  if (nested.kind === "unmatched")
341
392
  continue;
342
- invalid = false;
393
+ invalid = null;
343
394
  if (nested.values.length > 0)
344
395
  return nested;
345
396
  }
346
- return invalid ? { kind: "invalid" } : { kind: "targets", values: [] };
397
+ return invalid === null
398
+ ? { kind: "targets", values: [] }
399
+ : { kind: "invalid", limitation: invalid };
347
400
  }
348
401
  if (typeof value !== "object")
349
- return { kind: "invalid" };
402
+ return invalidExportTarget(value, "must be a relative string, object, array, or null");
350
403
  for (const [condition, target] of Object.entries(value)) {
351
404
  if (!conditions.has(condition))
352
405
  continue;
@@ -1,15 +1,20 @@
1
1
  import { lstat, realpath } from "node:fs/promises";
2
2
  import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
3
3
  import { createJavaScriptArtifactReader as createReader } from "../../artifacts/javascript/JavaScriptArtifactReader.js";
4
- import { analyzeJavaScriptArtifactFiles } from "./JavaScriptArtifactAnalysis.js";
4
+ import { analyzeAndProjectJavaScriptArtifactFiles } from "./JavaScriptArtifactAnalysis.js";
5
5
  import { readJavaScriptArtifactFiles } from "../../artifacts/javascript/JavaScriptArtifactFiles.js";
6
- import { buildJavaScriptArtifactGraph } from "./JavaScriptArtifactGraphBuilder.js";
6
+ import { buildImmutableJavaScriptArtifactGraphSteps } from "./JavaScriptArtifactGraphBuilder.js";
7
7
  import { javascriptArtifactReconstructionInputSchema, } from "./JavaScriptArtifactReconstructionInput.js";
8
- import { scanCanonicalArtifactInventory } from "../ArtifactInventory.js";
8
+ import { scanCanonicalArtifactInventory } from "../../artifacts/inventory/ArtifactInventory.js";
9
9
  import { summarizeElectronBoundaries } from "./ElectronBoundaryAnalysis.js";
10
- import { buildJavaScriptSemanticGraph } from "./JavaScriptSemanticGraphBuilder.js";
10
+ import { createJavaScriptSemanticGraphProjection } from "./JavaScriptSemanticGraphBuilder.js";
11
+ import { checkpointJavaScriptAnalysis, completeJavaScriptAnalysisSteps, } from "./JavaScriptAnalysisControl.js";
11
12
  /** Reconstruct one local ASAR or extracted directory without executing code. */
12
- export const reconstructJavaScriptArtifact = async (rawInput, signal) => {
13
+ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress) => {
14
+ const reportPhase = async (phase, message) => {
15
+ await progress?.report({ phase, completed: 0, total: 1, message });
16
+ await checkpointJavaScriptAnalysis(signal);
17
+ };
13
18
  const input = javascriptArtifactReconstructionInputSchema.parse(rawInput);
14
19
  abortIfNeeded(signal);
15
20
  const path = await realpath(input.input_path);
@@ -19,15 +24,31 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal) => {
19
24
  throw new ArtifactReaderFailure("format", `Artifact inventory classified ${path} as ${snapshot.manifest.root_format}, not ${format}`);
20
25
  const reader = createReader(path, format);
21
26
  try {
27
+ await reportPhase("read_javascript_artifacts", "Reading inventoried JavaScript application sources");
22
28
  const files = await readJavaScriptArtifactFiles(reader, snapshot, signal);
23
- const analysis = analyzeJavaScriptArtifactFiles(files);
24
- abortIfNeeded(signal);
25
- const graph = buildJavaScriptArtifactGraph(snapshot, files, analysis);
26
- const semanticGraph = buildJavaScriptSemanticGraph({
27
- rootArtifactSha256: snapshot.manifest.root_sha256,
28
- applicationGraph: graph,
29
- analysis,
29
+ await reportPhase("parse_javascript_sources", `Parsing and projecting ${String(files.files.length)} application source files`);
30
+ const semanticProjection = createJavaScriptSemanticGraphProjection();
31
+ const analysis = await analyzeAndProjectJavaScriptArtifactFiles(files, semanticProjection.projectFile, async (file, completed, total) => {
32
+ abortIfNeeded(signal);
33
+ await progress?.report({
34
+ phase: "parse_javascript_source",
35
+ completed: 0,
36
+ total: 1,
37
+ message: `Parsing and projecting ${file.path} (${String(completed + 1)}/${String(total)})`,
38
+ });
39
+ abortIfNeeded(signal);
30
40
  });
41
+ await checkpointJavaScriptAnalysis(signal);
42
+ abortIfNeeded(signal);
43
+ await reportPhase("build_javascript_application_graph", "Constructing application and Electron boundary relationships");
44
+ const applicationGraphSteps = buildImmutableJavaScriptArtifactGraphSteps(snapshot, files, analysis);
45
+ await reportPhase("seal_javascript_application_graph", "Sealing the validated application graph");
46
+ const graph = await completeJavaScriptAnalysisSteps(applicationGraphSteps, signal);
47
+ await reportPhase("build_javascript_semantic_graph", "Binding and validating static semantic relationships");
48
+ const semanticGraphSteps = semanticProjection.finishImmutableSteps(snapshot.manifest.root_sha256, graph, analysis);
49
+ await reportPhase("seal_javascript_semantic_graph", "Sealing the validated semantic graph");
50
+ const semanticGraph = await completeJavaScriptAnalysisSteps(semanticGraphSteps, signal);
51
+ await checkpointJavaScriptAnalysis(signal);
31
52
  return {
32
53
  input_path: path,
33
54
  format,
@@ -1,6 +1,8 @@
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";
@@ -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,6 +18,8 @@ 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
+ if (options.signal?.aborted === true)
22
+ return err(new AnalysisCancelledError("observe_javascript_runtime"));
21
23
  return result.ok
22
24
  ? ok(createJavaScriptRuntimeObservationEvidence("observe_javascript_runtime", input, result.value, ready.value.identity()))
23
25
  : result;
@@ -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,5 +1,5 @@
1
1
  import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
2
- import { addSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, constructSemanticGraphNode, } from "./JavaScriptSemanticGraphConstruction.js";
2
+ import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
3
3
  import { unknownSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
4
4
  import { semanticCallSiteAt, } from "./JavaScriptSemanticGraphFlowProjection.js";
5
5
  /** Project literal EventEmitter registrations, removals, and dispatches. */
@@ -34,7 +34,7 @@ export const projectSemanticEvents = (context) => {
34
34
  addEventUnknown(context, operation, event, relation);
35
35
  }
36
36
  };
37
- const addEventNode = (context, operation, eventKey) => addSemanticGraphNode(context.state, constructSemanticGraphNode(context.file, {
37
+ const addEventNode = (context, operation, eventKey) => retainSemanticGraphNode(context.state, context.file, {
38
38
  kind: "event",
39
39
  roleKey: `event:${eventKey}`,
40
40
  location: operation.eventName === null ? operation.location : null,
@@ -44,8 +44,8 @@ const addEventNode = (context, operation, eventKey) => addSemanticGraphNode(cont
44
44
  emitter_key: operation.emitterKey,
45
45
  event_name: operation.eventName,
46
46
  },
47
- }, context.state));
48
- const addListenerNode = (context, operation) => addSemanticGraphNode(context.state, constructSemanticGraphNode(context.file, {
47
+ });
48
+ const addListenerNode = (context, operation) => retainSemanticGraphNode(context.state, context.file, {
49
49
  kind: "listener",
50
50
  roleKey: `listener:${operation.eventId}`,
51
51
  location: operation.listenerLocation ?? operation.location,
@@ -61,7 +61,7 @@ const addListenerNode = (context, operation) => addSemanticGraphNode(context.sta
61
61
  event_name: operation.eventName,
62
62
  method: operation.method,
63
63
  },
64
- }, context.state));
64
+ });
65
65
  const eventEmitterNode = (context, operation) => (operation.emitterBindingId === null
66
66
  ? undefined
67
67
  : context.bindingNodes.get(operation.emitterBindingId)) ??
@@ -95,7 +95,7 @@ export const projectSemanticTimers = (context) => {
95
95
  const owner = operation.ownerCallableId === null
96
96
  ? undefined
97
97
  : context.callableNodes.get(operation.ownerCallableId);
98
- const timer = addSemanticGraphNode(context.state, constructSemanticGraphNode(context.file, {
98
+ const timer = retainSemanticGraphNode(context.state, context.file, {
99
99
  kind: "timer",
100
100
  roleKey: operation.timerId,
101
101
  location: operation.location,
@@ -105,7 +105,7 @@ export const projectSemanticTimers = (context) => {
105
105
  delay_milliseconds: operation.delayMilliseconds,
106
106
  method: operation.method,
107
107
  },
108
- }, context.state));
108
+ });
109
109
  return timer === null ? [] : [[operation.timerId, timer]];
110
110
  }));
111
111
  for (const operation of context.ir.timerOperations)