rea-agents 4.0.0 → 4.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 (416) hide show
  1. package/README.md +93 -30
  2. package/bridge/ghidra/ReaGhidraBridge.java +358 -15
  3. package/bridge/ghidra/ReaGhidraExtensions.java +113 -0
  4. package/bridge/ghidra/ReaGhidraPrepareCom.java +32 -0
  5. package/dist/android/AndroidTargetSnapshot.js +34 -0
  6. package/dist/android/JadxAnalysis.js +191 -0
  7. package/dist/android/JadxConfiguration.js +41 -0
  8. package/dist/android/JadxMcpTransport.js +145 -0
  9. package/dist/android/JadxProtocol.js +101 -0
  10. package/dist/android/JadxProvider.js +170 -0
  11. package/dist/android/JadxRelease.js +19 -0
  12. package/dist/android/JadxSession.js +97 -0
  13. package/dist/application/AnalysisContextQueries.js +2 -1
  14. package/dist/application/AnalysisProviderEvaluation.js +5 -3
  15. package/dist/application/AnalysisProviderRegistry.js +2 -1
  16. package/dist/application/AnalysisSnapshotCache.js +4 -1
  17. package/dist/application/AnalysisSnapshotFiles.js +1 -1
  18. package/dist/application/AndroidAnalysisPort.js +1 -0
  19. package/dist/application/AndroidAnalysisService.js +37 -0
  20. package/dist/application/ArtifactExtraction.js +7 -4
  21. package/dist/application/ArtifactGraphConstruction.js +10 -17
  22. package/dist/application/ArtifactInventory/scanCanonical.js +8 -7
  23. package/dist/application/BinarySession.js +16 -3
  24. package/dist/application/BinarySessionExecution.js +4 -1
  25. package/dist/application/BinarySessionOpen.js +3 -2
  26. package/dist/application/BinarySessionRecords.js +9 -3
  27. package/dist/application/BinaryTargetResolver.js +25 -6
  28. package/dist/application/BrowserObservationService.js +2 -1
  29. package/dist/application/BrowserScenarioCaptureService.js +2 -1
  30. package/dist/application/BrowserScenarioEvidence.js +2 -2
  31. package/dist/application/CallPathTracing.js +2 -1
  32. package/dist/application/CapabilityInventory.js +18 -0
  33. package/dist/application/ClientConfigPath.js +3 -1
  34. package/dist/application/ClientConfigurationDocument.js +11 -1
  35. package/dist/application/ClientRegistrationStatus.js +8 -1
  36. package/dist/application/CompositeProvider.js +1 -1
  37. package/dist/application/DirectAnalysis.js +23 -7
  38. package/dist/application/DirectAnalysisStatus.js +3 -3
  39. package/dist/application/Doctor.js +48 -8
  40. package/dist/application/DoctorDiagnostics.js +7 -5
  41. package/dist/application/DoctorScope.js +1 -1
  42. package/dist/application/ElectronActiveEvidence.js +2 -2
  43. package/dist/application/ElectronActiveObservationService.js +2 -1
  44. package/dist/application/ElectronBoundaryAnalysis.js +1 -1
  45. package/dist/application/ElectronObservationService.js +2 -1
  46. package/dist/application/EnhancedLiteralTracing.js +2 -1
  47. package/dist/application/EnhancedToolTypes.js +2 -1
  48. package/dist/application/EnhancedTools.js +3 -1
  49. package/dist/application/EvidenceBundleCommands.js +2 -1
  50. package/dist/application/EvidenceBundleFiles.js +1 -1
  51. package/dist/application/EvidenceInputResolver.js +30 -0
  52. package/dist/application/EvidenceLedger.js +2 -1
  53. package/dist/application/FirmwareAnalysisPort.js +1 -0
  54. package/dist/application/FirmwareAnalysisService.js +35 -0
  55. package/dist/application/FunctionAnalysisEvidence.js +32 -0
  56. package/dist/application/InventoryProjectionEvidence.js +2 -1
  57. package/dist/application/JavaScriptApplicationService.js +50 -3
  58. package/dist/application/JavaScriptApplicationWorkflowService.js +2 -1
  59. package/dist/application/JavaScriptArtifactAnalysis.js +4 -2
  60. package/dist/application/JavaScriptArtifactFiles.js +4 -2
  61. package/dist/application/JavaScriptArtifactPathResolution.js +6 -2
  62. package/dist/application/JavaScriptJsonModules.js +3 -2
  63. package/dist/application/JavaScriptModuleRelationships.js +4 -2
  64. package/dist/application/JavaScriptRuntimeObservationService.js +2 -1
  65. package/dist/application/JavaScriptRuntimeReconciliationService.js +2 -1
  66. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -1
  67. package/dist/application/JavaScriptSemanticTraceService.js +2 -1
  68. package/dist/application/JsonFiles.js +1 -1
  69. package/dist/application/LazyAnalysisProvider.js +3 -1
  70. package/dist/application/LinuxHopper.js +12 -4
  71. package/dist/application/MacHopper.js +20 -7
  72. package/dist/application/ManagedApplicationGraphService.js +2 -1
  73. package/dist/application/ManagedMemberComparisonService.js +3 -1
  74. package/dist/application/ManagedNativeVerificationService.js +2 -1
  75. package/dist/application/ManagedReconstructionService.js +2 -1
  76. package/dist/application/NativeCallRoutes.js +1 -1
  77. package/dist/application/NativeDispatchMetadataInspection.js +1 -1
  78. package/dist/application/NativeUiActionTrace.js +2 -1
  79. package/dist/application/NativeValueTrace.js +1 -1
  80. package/dist/application/ProcessCaptureError.js +1 -1
  81. package/dist/application/ProcessCaptureJournal.js +3 -1
  82. package/dist/application/ProcessCaptureLifecycle.js +6 -3
  83. package/dist/application/ProcessCli.js +9 -5
  84. package/dist/application/ProcessEvidence.js +2 -6
  85. package/dist/application/ProcessHarness.js +3 -2
  86. package/dist/application/ProcessNormalization.js +12 -5
  87. package/dist/application/ProcessSampling.js +3 -1
  88. package/dist/application/ReconstructionCoverageService.js +2 -1
  89. package/dist/application/ReconstructionObligationLedgerService.js +2 -1
  90. package/dist/application/ReferenceSourceImportEntries.js +2 -0
  91. package/dist/application/ReferenceSourceImportPolicy.js +4 -2
  92. package/dist/application/ReferenceSourceVcsAdapter.js +35 -4
  93. package/dist/application/SessionProviderRouter.js +4 -1
  94. package/dist/application/Setup.js +1 -128
  95. package/dist/application/SetupClientConfiguration.js +17 -6
  96. package/dist/application/SetupHost.js +111 -0
  97. package/dist/application/SetupRegistrationEnvironment.js +1 -2
  98. package/dist/application/SetupSkill.js +9 -3
  99. package/dist/application/SetupTypes.js +17 -0
  100. package/dist/application/StoreFileLock.js +7 -2
  101. package/dist/application/SupportedClients.js +8 -0
  102. package/dist/application/Uninstall.js +9 -4
  103. package/dist/application/UpdateRuntime.js +5 -2
  104. package/dist/application/WindowsCapabilities.js +7 -7
  105. package/dist/application/runtime.js +3 -1
  106. package/dist/artifacts/ArtifactProvider.js +3 -1
  107. package/dist/artifacts/DirectoryArtifactReader.js +2 -0
  108. package/dist/artifacts/NativeDmgArtifactReader.js +10 -3
  109. package/dist/artifacts/NibArchive.js +4 -2
  110. package/dist/artifacts/SafeOutputTree.js +26 -10
  111. package/dist/artifacts/ZipArtifactReader.js +1 -0
  112. package/dist/browser/BrowserProcessStartup.js +3 -1
  113. package/dist/browser/CdpAuthorizedMainFrame.js +1 -1
  114. package/dist/browser/CdpBrowserProvider.js +4 -1
  115. package/dist/browser/CdpCaptureDocuments.js +3 -1
  116. package/dist/browser/CdpCaptureEventHandlers.js +6 -2
  117. package/dist/browser/CdpCaptureStorageFingerprints.js +1 -1
  118. package/dist/browser/CdpCaptureValues.js +6 -2
  119. package/dist/browser/CdpConnection.js +8 -6
  120. package/dist/browser/CdpElectronInspection.js +3 -3
  121. package/dist/browser/CdpElectronProvider.js +4 -1
  122. package/dist/browser/CdpElectronScripts.js +2 -2
  123. package/dist/browser/CdpEndpoint.js +22 -10
  124. package/dist/browser/CdpObservationSession.js +2 -1
  125. package/dist/browser/CdpOptionalCommand.js +1 -1
  126. package/dist/browser/CdpPageCapture.js +2 -1
  127. package/dist/browser/CdpSafeMetadata.js +53 -8
  128. package/dist/browser/CdpScreenshot.js +1 -1
  129. package/dist/browser/CdpTargetSession.js +8 -5
  130. package/dist/browser/CdpWebMcpDiscovery.js +1 -1
  131. package/dist/browser/ElectronFileScope.js +9 -3
  132. package/dist/browser/JavaScriptRuntimeScope.js +3 -1
  133. package/dist/browser/PlaywrightBrowserScenarioProvider.js +3 -1
  134. package/dist/browser/PlaywrightElectronActiveActions.js +1 -1
  135. package/dist/browser/PlaywrightElectronActiveProvider.js +6 -2
  136. package/dist/browser/PlaywrightExecutionBoundary.js +1 -1
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +10 -5
  138. package/dist/browser/PlaywrightScenarioBrowser.js +3 -1
  139. package/dist/browser/PlaywrightScenarioEvents.js +6 -2
  140. package/dist/browser/PlaywrightScenarioSession.js +5 -2
  141. package/dist/browser/V8InspectorEndpoint.js +2 -1
  142. package/dist/browser/V8InspectorProvider.js +6 -1
  143. package/dist/browser/WebSourceMapFetcher.js +24 -11
  144. package/dist/cli/androidCommands.js +81 -0
  145. package/dist/{cliApplicationCommands.js → cli/applicationCommands.js} +18 -16
  146. package/dist/{cliBrowserAdvancedCommands.js → cli/browserAdvancedCommands.js} +13 -16
  147. package/dist/{cliBrowserCommands.js → cli/browserCommands.js} +9 -9
  148. package/dist/cli/commandCancellation.js +24 -0
  149. package/dist/cli/coreAnalysisCommands.js +110 -17
  150. package/dist/{cliElectronCommands.js → cli/electronCommands.js} +14 -13
  151. package/dist/cli/firmwareCommands.js +75 -0
  152. package/dist/{cliSetup.js → cli/interactiveSetup.js} +1 -1
  153. package/dist/cli/javascriptApplicationAnalysis.js +1 -1
  154. package/dist/cli/managedCommands.js +1 -1
  155. package/dist/cli/managedProjectGraphCommand.js +1 -1
  156. package/dist/cli/options.js +7 -1
  157. package/dist/{cliProcessCommands.js → cli/processCommands.js} +3 -3
  158. package/dist/cli/referenceSourceImportStatus.js +10 -0
  159. package/dist/cli/setupCommands.js +4 -2
  160. package/dist/cli/utilityCommands.js +3 -2
  161. package/dist/cli.js +10 -15
  162. package/dist/cliBrowserContext.js +1 -1
  163. package/dist/cliBrowserScenarioCommands.js +2 -1
  164. package/dist/cliCommandNames.js +11 -2
  165. package/dist/cliEvidenceCommands.js +2 -1
  166. package/dist/cliJavaScriptRuntimeCommands.js +2 -1
  167. package/dist/cliJsonInput.js +26 -11
  168. package/dist/cliLogging.js +2 -1
  169. package/dist/cliOutput.js +15 -16
  170. package/dist/config/environment.js +11 -1
  171. package/dist/config/parseConfig.js +7 -1
  172. package/dist/config/parsers.js +1 -1
  173. package/dist/contracts/androidToolContracts.js +77 -0
  174. package/dist/contracts/applicationToolContracts.js +32 -5
  175. package/dist/contracts/applicationWorkflowInputContracts.js +13 -13
  176. package/dist/contracts/artifactComparisonExample.js +7 -14
  177. package/dist/contracts/enhancedToolContracts.js +31 -0
  178. package/dist/contracts/errorSchemas.js +4 -2
  179. package/dist/contracts/evidenceInputContracts.js +13 -0
  180. package/dist/contracts/firmwareToolContracts.js +38 -0
  181. package/dist/contracts/officialToolContracts.js +66 -0
  182. package/dist/contracts/promptContracts.js +1 -1
  183. package/dist/contracts/sessionLifecycleInputs.js +4 -0
  184. package/dist/contracts/sessionToolContracts.js +43 -0
  185. package/dist/contracts/sessionToolSchemas.js +1 -1
  186. package/dist/contracts/toolContractExamples.js +5 -0
  187. package/dist/contracts/toolContractTypes.js +2 -0
  188. package/dist/contracts/toolContracts.js +7 -130
  189. package/dist/contracts/toolEffects.js +43 -0
  190. package/dist/contracts/toolOutputSchemaGroups.js +4 -0
  191. package/dist/contracts/toolOutputSchemaPrimitives.js +1 -0
  192. package/dist/doctorRuntime.js +5 -1
  193. package/dist/domain/analysisErrorBase.js +33 -0
  194. package/dist/domain/analysisErrorCore.js +60 -0
  195. package/dist/domain/analysisErrorPresentation.js +22 -2
  196. package/dist/domain/analysisErrorProjection.js +24 -3
  197. package/dist/domain/analysisSnapshot.js +1 -0
  198. package/dist/domain/androidAnalysis.js +141 -0
  199. package/dist/domain/appleAssetCatalog.js +1 -1
  200. package/dist/domain/artifactGraph.js +1 -0
  201. package/dist/domain/artifactInspection.js +19 -17
  202. package/dist/domain/artifactInventoryEvidence.js +20 -25
  203. package/dist/domain/artifactOperationError.js +16 -0
  204. package/dist/domain/browserObservation.js +12 -4
  205. package/dist/domain/browserObservationError.js +23 -0
  206. package/dist/domain/browserScenario.js +1 -1
  207. package/dist/domain/browserScenarioCapture.js +1 -1
  208. package/dist/domain/browserScenarioDiff.js +1 -1
  209. package/dist/domain/browserScenarioNormalization.js +6 -11
  210. package/dist/domain/browserScenarioValues.js +3 -1
  211. package/dist/domain/callPath.js +47 -7
  212. package/dist/domain/canonicalDigest.js +65 -0
  213. package/dist/domain/canonicalOrdering.js +11 -0
  214. package/dist/domain/changedBehavior.js +8 -7
  215. package/dist/domain/comparisonSemantics.js +2 -4
  216. package/dist/domain/configurationErrors.js +25 -0
  217. package/dist/domain/dosCom.js +8 -0
  218. package/dist/domain/electronActiveObservation.js +3 -1
  219. package/dist/domain/electronStaticAnalysisBrowser.js +13 -23
  220. package/dist/domain/electronStaticAnalysisNative.js +2 -1
  221. package/dist/domain/electronStaticAnalysisValues.js +23 -3
  222. package/dist/domain/evidence.js +3 -11
  223. package/dist/domain/evidenceErrors.js +30 -0
  224. package/dist/domain/firmwareAnalysis.js +121 -0
  225. package/dist/domain/functionComparison.js +4 -2
  226. package/dist/domain/functionComparisonDimensions.js +6 -4
  227. package/dist/domain/functionComparisonNormalization.js +8 -1
  228. package/dist/domain/functionComparisonResults.js +1 -4
  229. package/dist/domain/hopperErrors.js +78 -0
  230. package/dist/domain/hopperValues.js +2 -1
  231. package/dist/domain/interfaceBuilderGraph.js +3 -1
  232. package/dist/domain/javascriptApplicationChangeGraph.js +2 -2
  233. package/dist/domain/javascriptApplicationGraph.js +13 -22
  234. package/dist/domain/javascriptApplicationVersionComparison.js +3 -11
  235. package/dist/domain/javascriptApplicationVersionItems.js +3 -3
  236. package/dist/domain/javascriptApplicationVersionKeys.js +1 -1
  237. package/dist/domain/javascriptAstFingerprint.js +1 -1
  238. package/dist/domain/javascriptExportShapeComparison.js +1 -2
  239. package/dist/domain/javascriptExportShapeSelection.js +1 -1
  240. package/dist/domain/javascriptExportShapeVariants.js +7 -3
  241. package/dist/domain/javascriptFeatureSeed.js +29 -9
  242. package/dist/domain/javascriptFeatureTrace.js +9 -13
  243. package/dist/domain/javascriptFeatureTraversal.js +2 -1
  244. package/dist/domain/javascriptNativeHandoff.js +2 -1
  245. package/dist/domain/javascriptRuntimeLoadState.js +2 -2
  246. package/dist/domain/javascriptRuntimeReconciliationActive.js +3 -10
  247. package/dist/domain/javascriptRuntimeReconciliationGraph.js +2 -2
  248. package/dist/domain/javascriptRuntimeReconciliationMatching.js +4 -3
  249. package/dist/domain/javascriptRuntimeReconciliationParsing.js +8 -14
  250. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -4
  251. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +5 -2
  252. package/dist/domain/javascriptRuntimeStaticCandidates.js +8 -4
  253. package/dist/domain/javascriptSemanticAnalysis.js +40 -3
  254. package/dist/domain/javascriptSemanticCallResolution.js +2 -1
  255. package/dist/domain/javascriptSemanticChildProcesses.js +2 -1
  256. package/dist/domain/javascriptSemanticDataEffects.js +2 -1
  257. package/dist/domain/javascriptSemanticFingerprints.js +1 -1
  258. package/dist/domain/javascriptSemanticGraph.js +23 -28
  259. package/dist/domain/javascriptSemanticPrimitives.js +9 -2
  260. package/dist/domain/javascriptSemanticProjection.js +2 -1
  261. package/dist/domain/javascriptSemanticPromises.js +2 -1
  262. package/dist/domain/javascriptSemanticProvenance.js +1 -1
  263. package/dist/domain/javascriptSemanticQuery.js +7 -8
  264. package/dist/domain/javascriptSemanticQueryAssessment.js +1 -2
  265. package/dist/domain/javascriptSemanticQueryIdentity.js +1 -2
  266. package/dist/domain/javascriptSemanticReturns.js +2 -1
  267. package/dist/domain/javascriptSemanticValues.js +50 -16
  268. package/dist/domain/javascriptSourceParser.js +4 -2
  269. package/dist/domain/javascriptStaticAnalysis.js +1 -1
  270. package/dist/domain/javascriptStaticAnalysisBundler.js +2 -1
  271. package/dist/domain/javascriptStaticAnalysisCalls.js +14 -6
  272. package/dist/domain/javascriptStaticAnalysisHelpers.js +31 -4
  273. package/dist/domain/jsonShape.js +6 -2
  274. package/dist/domain/managedMemberComparison.js +1 -0
  275. package/dist/domain/managedMemberComparisonItems.js +2 -0
  276. package/dist/domain/managedNativeVerificationMatch.js +5 -3
  277. package/dist/domain/nativeDataType.js +2 -0
  278. package/dist/domain/nativeFunctionAnnotations.js +43 -0
  279. package/dist/domain/nativeLoadImage.js +95 -0
  280. package/dist/domain/nativeMetadataRecovery.js +55 -0
  281. package/dist/domain/processCapture.js +0 -1
  282. package/dist/domain/processEvidenceProvider.js +11 -0
  283. package/dist/domain/processTraceComparison.js +1 -1
  284. package/dist/domain/providerAdapterError.js +17 -0
  285. package/dist/domain/providerCleanupError.js +1 -1
  286. package/dist/domain/providerSelectionError.js +44 -0
  287. package/dist/domain/reconstructionUnknowns.js +1 -1
  288. package/dist/domain/reconstructionVerification.js +22 -8
  289. package/dist/domain/referenceSourceClassification.js +5 -6
  290. package/dist/domain/referenceSourceGraph.js +9 -17
  291. package/dist/domain/referenceSourceImportParsing.js +38 -23
  292. package/dist/domain/runtimeIdentification.js +1 -1
  293. package/dist/domain/runtimeVersion.js +4 -7
  294. package/dist/domain/safeJson.js +13 -0
  295. package/dist/domain/sourceToBundleComparison.js +5 -7
  296. package/dist/domain/sourceToBundleSignals.js +6 -6
  297. package/dist/domain/staticRuntimeCorrelation.js +9 -7
  298. package/dist/domain/unknownRegistryError.js +10 -0
  299. package/dist/domain/webBundleAnalyzerAst.js +22 -5
  300. package/dist/domain/webBundleAnalyzerInspection.js +20 -14
  301. package/dist/dotnet/ManagedMemberRows.js +1 -1
  302. package/dist/dotnet/ManagedMetadataHeaps.js +3 -2
  303. package/dist/dotnet/ManagedMetadataInventoryRows.js +4 -2
  304. package/dist/dotnet/ManagedMethodBodyReader.js +8 -1
  305. package/dist/dotnet/ManagedStaticProvider.js +3 -1
  306. package/dist/firmware/FirmwareCommand.js +163 -0
  307. package/dist/firmware/FirmwareFiles.js +190 -0
  308. package/dist/firmware/FirmwareProvider.js +258 -0
  309. package/dist/firmware/FirmwarePublication.js +84 -0
  310. package/dist/firmware/FirmwareRelease.js +32 -0
  311. package/dist/firmware/FirmwareReports.js +223 -0
  312. package/dist/generatedMcpToolCatalog.js +1 -1
  313. package/dist/generatedPackageMetadata.js +5 -5
  314. package/dist/ghidra/GhidraAnalysisProfile.js +37 -8
  315. package/dist/ghidra/GhidraClient.js +52 -6
  316. package/dist/ghidra/GhidraDiagnostics.js +3 -0
  317. package/dist/ghidra/GhidraDoctor.js +38 -14
  318. package/dist/ghidra/GhidraFunctionValues.js +10 -4
  319. package/dist/ghidra/GhidraInstallation.js +10 -4
  320. package/dist/ghidra/GhidraInventoryValues.js +39 -2
  321. package/dist/ghidra/GhidraLauncher.js +91 -26
  322. package/dist/ghidra/GhidraLoadImageValues.js +199 -0
  323. package/dist/ghidra/GhidraProvider.js +129 -13
  324. package/dist/ghidra/GhidraProviderCapabilities.js +52 -15
  325. package/dist/ghidra/GhidraRequestQueue.js +2 -2
  326. package/dist/ghidra/GhidraSessionError.js +31 -4
  327. package/dist/ghidra/GhidraSessionValues.js +10 -7
  328. package/dist/ghidra/GhidraTargetSnapshot.js +16 -2
  329. package/dist/ghidra/GhidraTransport.js +12 -0
  330. package/dist/ghidra/extensions/GhidraExtensionFailures.js +20 -0
  331. package/dist/ghidra/extensions/GhidraExtensions.js +170 -0
  332. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +21 -0
  333. package/dist/ghidra/extensions/nativeaot/NativeAotReport.js +84 -0
  334. package/dist/hopper/BridgeLauncher.js +4 -2
  335. package/dist/hopper/HopperAnalysisProfile.js +7 -2
  336. package/dist/hopper/HopperCleanup.js +55 -9
  337. package/dist/hopper/HopperClient.js +14 -4
  338. package/dist/hopper/HopperProcessDiagnostic.js +1 -1
  339. package/dist/hopper/HopperProvider.js +8 -4
  340. package/dist/hopper/HopperRequestQueue.js +7 -3
  341. package/dist/hopper/HopperSessionValues.js +1 -1
  342. package/dist/hopper/HopperSocketConnection.js +1 -1
  343. package/dist/hopper/HopperTargetLease.js +23 -15
  344. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +7 -8
  345. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -2
  346. package/dist/hopper/protocol.js +8 -8
  347. package/dist/ida/IdaConfiguration.js +56 -0
  348. package/dist/ida/IdaDoctor.js +53 -0
  349. package/dist/ida/IdaInput.js +62 -0
  350. package/dist/ida/IdaMcpConnection.js +111 -0
  351. package/dist/ida/IdaOperationRunner.js +299 -0
  352. package/dist/ida/IdaProtocolValues.js +178 -0
  353. package/dist/ida/IdaProvider.js +126 -0
  354. package/dist/ida/IdaProviderCapabilities.js +60 -0
  355. package/dist/ida/IdaSessionClient.js +306 -0
  356. package/dist/ida/IdaWorkspace.js +54 -0
  357. package/dist/main/shutdown.js +21 -1
  358. package/dist/main/startup.js +1 -1
  359. package/dist/main/transport.js +8 -4
  360. package/dist/main.js +5 -2
  361. package/dist/native/AppleDispatchMetadata.js +31 -10
  362. package/dist/native/NativeMacOSProvider.js +87 -15
  363. package/dist/native/NativeMachoInspection.js +42 -12
  364. package/dist/native/NativeUiHelperRuntime.js +7 -1
  365. package/dist/native/NativeUiObservation.js +6 -2
  366. package/dist/native/parsers/demangle.js +1 -1
  367. package/dist/native/parsers/dyldInfo.js +3 -3
  368. package/dist/native/parsers/otool.js +4 -1
  369. package/dist/native/parsers/plist.js +11 -3
  370. package/dist/process/PrivateRuntimeRoot.js +13 -3
  371. package/dist/process/ProcessOwnership.js +5 -73
  372. package/dist/process/ProcessOwnershipObservation.js +62 -2
  373. package/dist/process/ProcessOwnershipProcessTree.js +13 -0
  374. package/dist/process/ProviderProcess.js +24 -7
  375. package/dist/process/ProviderRunLineage.js +1 -1
  376. package/dist/process/WindowsAuthority.js +20 -1
  377. package/dist/reference/ReferenceSourceReaderEntries.js +5 -1
  378. package/dist/reference/ReferenceSourceReaderFile.js +1 -0
  379. package/dist/server/createServer.js +25 -2
  380. package/dist/server/mcpProgress.js +2 -1
  381. package/dist/server/promptCompletion.js +3 -3
  382. package/dist/server/registerAndroidTools.js +30 -0
  383. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -1
  384. package/dist/server/registerApplicationTools/compareSourceToBundle.js +7 -2
  385. package/dist/server/registerApplicationTools/compareVersions.js +5 -1
  386. package/dist/server/registerApplicationTools/traceFeature.js +7 -2
  387. package/dist/server/registerApplicationTools/traceSemantics.js +7 -2
  388. package/dist/server/registerEnhancedTools.js +28 -1
  389. package/dist/server/registerFirmwareTools.js +22 -0
  390. package/dist/server/registerFunctionComparisonTool.js +1 -1
  391. package/dist/server/registerInvestigationTools/helpers.js +2 -1
  392. package/dist/server/registerManagedTools.js +1 -1
  393. package/dist/server/registerManagedWorkflowTools/evidence.js +1 -1
  394. package/dist/server/registerOfficialTools.js +4 -1
  395. package/dist/server/registerProcessComparisonTool.js +5 -2
  396. package/dist/server/registerSessionTools.js +3 -1
  397. package/dist/server/runDerivedOperation.js +1 -1
  398. package/dist/server/sessionAvailabilityPolicy.js +3 -0
  399. package/dist/server/sessionEvidence.js +1 -1
  400. package/dist/server/toolResult.js +2 -1
  401. package/dist/windows/WindowsNativeLoader.js +108 -0
  402. package/dist/windows/WindowsOwnedProcess.js +168 -0
  403. package/dist/windows/WindowsPrivateRuntime.js +137 -0
  404. package/install.sh +4 -6
  405. package/native/windows/README.md +102 -0
  406. package/native/windows/build/manifest.json +9 -0
  407. package/native/windows/build/rea-windows-x64.node +0 -0
  408. package/package.json +38 -24
  409. package/scripts/rea.mjs +1 -1
  410. package/scripts/verify-windows-native-artifact.mjs +39 -0
  411. package/skills/reverse-engineer-anything/SKILL.md +92 -24
  412. package/skills/reverse-engineer-anything/references/android-applications.md +31 -0
  413. package/skills/reverse-engineer-anything/references/javascript-applications.md +19 -2
  414. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +52 -4
  415. package/dist/browser/CdpCanonicalJsonDigest.js +0 -9
  416. package/dist/domain/errors.js +0 -324
@@ -0,0 +1,22 @@
1
+ import { toolContract } from "../contracts/toolContracts.js";
2
+ import { logToolExecution } from "./toolLogging.js";
3
+ import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
4
+ import { toCallToolResult } from "./toolResult.js";
5
+ /** Bind firmware handlers to their exact named schemas. */
6
+ export const registerFirmwareTools = (server, service, logger, recordEvidence) => {
7
+ const handler = (contract) => async (input, context) => {
8
+ const result = await logToolExecution(logger, contract.name, () => service.execute(contract.name, input, {
9
+ signal: context.mcpReq.signal,
10
+ }));
11
+ if (!result.ok)
12
+ return toCallToolResult(result, contract);
13
+ const recorded = recordEvidence?.(result.value);
14
+ return recorded !== undefined && !recorded.ok
15
+ ? toCallToolResult(recorded, contract)
16
+ : toCallToolResult(result, contract);
17
+ };
18
+ const inspect = toolContract("inspect_firmware_regions");
19
+ server.registerTool(inspect.name, toolRegistrationOptions(inspect), handler(inspect));
20
+ const extract = toolContract("extract_firmware");
21
+ server.registerTool(extract.name, toolRegistrationOptions(extract), handler(extract));
22
+ };
@@ -1,6 +1,6 @@
1
1
  import { toolContract } from "../contracts/toolContracts.js";
2
2
  import { createEvidence, parseEvidence, } from "../domain/evidence.js";
3
- import { EvidenceIntegrityError } from "../domain/errors.js";
3
+ import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
4
4
  import { err } from "../domain/result.js";
5
5
  import { compareFunctions } from "../domain/functionComparison.js";
6
6
  import { jsonValueSchema } from "../domain/jsonValue.js";
@@ -1,4 +1,5 @@
1
- import { EvidenceIntegrityError, } from "../../domain/errors.js";
1
+ import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
2
+ import {} from "../../domain/analysisErrorBase.js";
2
3
  import { err, ok } from "../../domain/result.js";
3
4
  import { recordDerivedEvidence } from "../recordDerivedEvidence.js";
4
5
  export const isIncomplete = (status) => status === "unknown" || status === "truncated";
@@ -1,5 +1,5 @@
1
1
  import { MANAGED_TOOL_CONTRACTS } from "../contracts/managedToolContracts.js";
2
- import { AnalysisInputError } from "../domain/errors.js";
2
+ import { AnalysisInputError } from "../domain/analysisErrorCore.js";
3
3
  import { err } from "../domain/result.js";
4
4
  import { registerEvidenceTools } from "./registerEvidenceTools.js";
5
5
  import { runManagedProviderExecution } from "../application/DirectAnalysis.js";
@@ -1,5 +1,5 @@
1
1
  import { parseEvidence } from "../../domain/evidence.js";
2
- import { EvidenceIntegrityError } from "../../domain/errors.js";
2
+ import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
3
3
  import { err, ok } from "../../domain/result.js";
4
4
  const parseExpectedEvidence = (rawEvidence, expectedOperations) => {
5
5
  try {
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { OFFICIAL_TOOL_CONTRACTS } from "../contracts/toolContracts.js";
2
+ import { OFFICIAL_TOOL_CONTRACTS } from "../contracts/officialToolContracts.js";
3
3
  import { createEvidence } from "../domain/evidence.js";
4
4
  import { jsonObjectSchema, jsonValueSchema, } from "../domain/jsonValue.js";
5
5
  import { mcpProgressReporter } from "./mcpProgress.js";
@@ -66,6 +66,9 @@ const runOfficialOperation = async (analysis, contract, arguments_, execution) =
66
66
  return result;
67
67
  };
68
68
  const projectOfficialArguments = (contract, input) => {
69
+ // Annotation omissions preserve existing values; they are not Python defaults.
70
+ if (contract.name === "annotate_native_function")
71
+ return jsonObjectSchema.parse(contract.inputSchema.parse(input));
69
72
  const parsed = jsonObjectSchema.parse(input);
70
73
  if (!(contract.inputSchema instanceof z.ZodObject))
71
74
  throw new TypeError("Official tool input contract must be an object schema");
@@ -1,5 +1,5 @@
1
1
  import { toolContract } from "../contracts/toolContracts.js";
2
- import { EvidenceIntegrityError } from "../domain/errors.js";
2
+ import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
3
3
  import { createEvidence, parseEvidence, } from "../domain/evidence.js";
4
4
  import { jsonValueSchema } from "../domain/jsonValue.js";
5
5
  import { compareProcessCaptures, parseProcessCapture, } from "../domain/processCapture.js";
@@ -81,6 +81,7 @@ export const registerProcessComparisonTool = (server, session, contract, now = D
81
81
  return toCallToolResult(recordDerivedEvidence(session, evidence, comparisonUnknownInput({
82
82
  left_evidence_id: leftRecord.evidence_id,
83
83
  right_evidence_id: rightRecord.evidence_id,
84
+ comparison_evidence_id: evidence.evidence_id,
84
85
  }, comparison)), contract);
85
86
  });
86
87
  };
@@ -97,8 +98,10 @@ const comparisonUnknownInput = (parsed, comparison) => {
97
98
  .filter(([, status]) => status !== "unchanged")
98
99
  .map(([scope]) => scope)
99
100
  .join(", ");
101
+ // Unknown identity uses the question, not its supporting records. Bind the
102
+ // question to this comparison so distinct capture pairs and policies coexist.
100
103
  return {
101
- question: `Process captures disagree across: ${differingScopes}`,
104
+ question: `Process captures disagree across: ${differingScopes} (comparison ${parsed.comparison_evidence_id})`,
102
105
  severity: "high",
103
106
  domain: "process-comparison",
104
107
  supporting_evidence_ids: [parsed.left_evidence_id],
@@ -4,7 +4,8 @@ import { readAnalysisSnapshot } from "../application/AnalysisSnapshotFiles.js";
4
4
  import { createProcessCaptureEvidence } from "../application/ProcessEvidence.js";
5
5
  import { captureProcessScenario } from "../application/ProcessHarness.js";
6
6
  import { toolContract } from "../contracts/toolContracts.js";
7
- import { UnknownRegistryError } from "../domain/errors.js";
7
+ import { UnknownRegistryError } from "../domain/unknownRegistryError.js";
8
+ import {} from "../domain/analysisErrorBase.js";
8
9
  import { ok } from "../domain/result.js";
9
10
  import { mcpProgressReporter } from "./mcpProgress.js";
10
11
  import { registerArtifactComparisonTool } from "./registerArtifactComparisonTool.js";
@@ -98,6 +99,7 @@ const registerOpenLifecycleTool = ({ server, session, logger, openContract, }) =
98
99
  }
99
100
  const opened = await logToolExecution(logger, openContract.name, () => session.open(input.path, {
100
101
  signal: context.mcpReq.signal,
102
+ ...(input.format === undefined ? {} : { formatHint: input.format }),
101
103
  ...(input.provider_id === undefined
102
104
  ? {}
103
105
  : { providerId: input.provider_id }),
@@ -1,5 +1,5 @@
1
1
  import { setImmediate } from "node:timers/promises";
2
- import { AnalysisCancelledError, AnalysisInputError, } from "../domain/errors.js";
2
+ import { AnalysisCancelledError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
3
3
  import { err, ok } from "../domain/result.js";
4
4
  import { mcpProgressReporter } from "./mcpProgress.js";
5
5
  /** Run synchronous derived work with transport yields and a publication guard. */
@@ -3,6 +3,9 @@ import { platform } from "node:process";
3
3
  export const sessionAvailabilityPolicy = (configured, defaults) => configured ??
4
4
  (() => ({
5
5
  processCaptureEnabled: platform !== "win32",
6
+ firmwareInspectionEnabled: defaults.optionalFeatures?.firmwareInspectionEnabled ?? false,
7
+ firmwareExtractionEnabled: defaults.optionalFeatures?.firmwareExtractionEnabled ?? false,
8
+ androidAnalysisEnabled: defaults.optionalFeatures?.androidAnalysisEnabled ?? false,
6
9
  browserObservationEnabled: defaults.optionalFeatures?.browserObservationEnabled ?? false,
7
10
  browserScenarioEnabled: defaults.optionalFeatures?.browserScenarioEnabled ?? false,
8
11
  electronObservationEnabled: defaults.optionalFeatures?.electronObservationEnabled ?? false,
@@ -1,4 +1,4 @@
1
- import { EvidenceIntegrityError } from "../domain/errors.js";
1
+ import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
2
2
  import { ok } from "../domain/result.js";
3
3
  /** Record source evidence in order, stopping at the first session rejection. */
4
4
  export const recordSessionEvidenceSources = (recordEvidence, sources) => {
@@ -1,4 +1,5 @@
1
- import { projectAnalysisError } from "../domain/errors.js";
1
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
2
+ import {} from "../domain/analysisErrorBase.js";
2
3
  /**
3
4
  * Serialize an application result as MCP text and structured content.
4
5
  * Shared error projection preserves actionable local diagnostics while omitting
@@ -0,0 +1,108 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import { fileURLToPath } from "node:url";
5
+ import { z } from "zod";
6
+ import { PACKAGE_METADATA } from "../generatedPackageMetadata.js";
7
+ /** A native resource remains opaque until the addon validates its object tag. */
8
+ export const windowsHandleSchema = z.custom((value) => typeof value === "object" && value !== null && !Array.isArray(value));
9
+ /** Observed identity of an opened local NTFS object. */
10
+ export const windowsFileIdentitySchema = z.strictObject({
11
+ requestedPath: z.string(),
12
+ finalPath: z.string(),
13
+ filesystem: z.literal("NTFS"),
14
+ volumeSerial: z.string().regex(/^[a-f0-9]{16}$/u),
15
+ fileId: z.string().regex(/^[a-f0-9]{32}$/u),
16
+ size: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER),
17
+ directory: z.boolean(),
18
+ });
19
+ /** Metadata bound to one packaged Windows x64 Node-API artifact. */
20
+ export const windowsNativeManifestSchema = z.strictObject({
21
+ packageVersion: z.string(),
22
+ platform: z.literal("win32"),
23
+ architecture: z.literal("x64"),
24
+ abiVersion: z.literal(1),
25
+ nodeApiVersion: z.literal(8),
26
+ artifact: z.literal("rea-windows-x64.node"),
27
+ artifactSha256: z.string().regex(/^[a-f0-9]{64}$/u),
28
+ });
29
+ const inspectionSchema = z.strictObject({
30
+ abiVersion: z.literal(1),
31
+ nodeApiVersion: z.literal(8),
32
+ architecture: z.literal("x64"),
33
+ filesystem: windowsFileIdentitySchema,
34
+ privateDacl: z.literal(true),
35
+ atomicJobAssignment: z.literal(true),
36
+ killOnOwnerClose: z.literal(true),
37
+ });
38
+ const bindingSchema = z.strictObject({
39
+ call: z.custom((value) => typeof value === "function"),
40
+ });
41
+ /** Validate compatibility and artifact identity before invoking the native addon. */
42
+ export const loadWindowsNativeAuthority = (host) => {
43
+ if (host.platform !== "win32" || host.architecture !== "x64")
44
+ return {
45
+ available: false,
46
+ reason: "REA Windows native controls require a Windows x64 host.",
47
+ };
48
+ try {
49
+ const manifest = windowsNativeManifestSchema.parse(host.readManifest());
50
+ if (manifest.packageVersion !== host.packageVersion)
51
+ throw new Error("Windows native artifact belongs to another REA version");
52
+ const nodeApiVersion = Number(host.nodeApiVersion);
53
+ if (!Number.isSafeInteger(nodeApiVersion) || nodeApiVersion < 8)
54
+ throw new Error("Windows native artifact requires Node-API 8 or newer");
55
+ const artifact = host.readArtifact();
56
+ if (createHash("sha256").update(artifact).digest("hex") !==
57
+ manifest.artifactSha256)
58
+ throw new Error("Windows native artifact SHA-256 does not match package metadata");
59
+ assertWindowsX64Artifact(artifact);
60
+ const binding = bindingSchema.parse(host.loadArtifact());
61
+ const inspection = inspectionSchema.parse(binding.call("inspect", []));
62
+ return { available: true, authority: { call: binding.call, inspection } };
63
+ }
64
+ catch (cause) {
65
+ return {
66
+ available: false,
67
+ reason: `REA Windows native controls are unavailable: ${cause instanceof Error ? cause.message : String(cause)}`,
68
+ };
69
+ }
70
+ };
71
+ const assertWindowsX64Artifact = (bytes) => {
72
+ if (bytes.length < 64 || bytes.toString("ascii", 0, 2) !== "MZ")
73
+ throw new Error("Windows native artifact is not a PE image");
74
+ const offset = bytes.readUInt32LE(0x3c);
75
+ if (offset > bytes.length - 26 ||
76
+ bytes.toString("ascii", offset, offset + 4) !== "PE\0\0" ||
77
+ bytes.readUInt16LE(offset + 4) !== 0x8664 ||
78
+ bytes.readUInt16LE(offset + 24) !== 0x20b)
79
+ throw new Error("Windows native artifact is not a Windows x64 PE32+ image");
80
+ };
81
+ let cached;
82
+ /** Load only the package-owned artifact, lazily and once per process. */
83
+ export const systemWindowsNativeAuthority = () => {
84
+ cached ??= loadWindowsNativeAuthority({
85
+ platform: process.platform,
86
+ architecture: process.arch,
87
+ nodeApiVersion: process.versions.napi,
88
+ packageVersion: PACKAGE_METADATA.version,
89
+ readManifest: () => {
90
+ const encoded = readFileSync(new URL("../../native/windows/build/manifest.json", import.meta.url), "utf8");
91
+ const value = JSON.parse(encoded);
92
+ return value;
93
+ },
94
+ readArtifact: () => readFileSync(new URL("../../native/windows/build/rea-windows-x64.node", import.meta.url)),
95
+ loadArtifact: () => {
96
+ const value = createRequire(import.meta.url)(fileURLToPath(new URL("../../native/windows/build/rea-windows-x64.node", import.meta.url)));
97
+ return value;
98
+ },
99
+ });
100
+ return cached;
101
+ };
102
+ /** Require the verified backend when an operation depends on native authority. */
103
+ export const requireWindowsNativeAuthority = () => {
104
+ const loaded = systemWindowsNativeAuthority();
105
+ if (!loaded.available)
106
+ throw new Error(loaded.reason);
107
+ return loaded.authority;
108
+ };
@@ -0,0 +1,168 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { PassThrough } from "node:stream";
3
+ import { z } from "zod";
4
+ import { requireWindowsNativeAuthority, windowsHandleSchema, } from "./WindowsNativeLoader.js";
5
+ const launchSchema = z.strictObject({
6
+ pid: z.number().int().positive().max(0xffff_ffff),
7
+ handle: windowsHandleSchema,
8
+ jobAssigned: z.literal(true),
9
+ killOnOwnerClose: z.literal(true),
10
+ });
11
+ const pollSchema = z.strictObject({
12
+ stdout: z.instanceof(Buffer),
13
+ stderr: z.instanceof(Buffer),
14
+ stdoutEnded: z.boolean(),
15
+ stderrEnded: z.boolean(),
16
+ exitCode: z.number().int().nonnegative().max(0xffff_ffff).nullable(),
17
+ activeProcesses: z.number().int().nonnegative(),
18
+ });
19
+ /** Encode one ordinary Windows argv token using the CRT backslash rules. */
20
+ export const quoteWindowsProcessArgument = (value) => {
21
+ if (value.includes("\0"))
22
+ throw new TypeError("Windows process argument contains NUL");
23
+ return `"${value.replace(/(\\*)"/gu, '$1$1\\"').replace(/(\\+)$/u, "$1$1")}"`;
24
+ };
25
+ /** Process events and streams backed by a retained native Job Object. */
26
+ export class WindowsOwnedProcess extends EventEmitter {
27
+ stdout = new PassThrough();
28
+ stderr = new PassThrough();
29
+ signalCode = null;
30
+ exitCode = null;
31
+ pid;
32
+ #handle;
33
+ #authority;
34
+ #settled;
35
+ #settle;
36
+ #closed = false;
37
+ #verifiedSettlement = false;
38
+ #failure;
39
+ #timer;
40
+ #cleanup;
41
+ constructor(command, arguments_, cwd, environment, verbatim) {
42
+ super();
43
+ this.#authority = requireWindowsNativeAuthority();
44
+ const entries = Object.entries(environment)
45
+ .filter((entry) => entry[1] !== undefined)
46
+ .map(([key, value]) => `${key}=${value}`);
47
+ const line = [
48
+ quoteWindowsProcessArgument(command),
49
+ ...arguments_.map((value) => verbatim ? value : quoteWindowsProcessArgument(value)),
50
+ ].join(" ");
51
+ const launched = launchSchema.parse(this.#authority.call("process_spawn", [
52
+ command,
53
+ line,
54
+ cwd ?? "",
55
+ entries,
56
+ ]));
57
+ this.pid = launched.pid;
58
+ this.#handle = launched.handle;
59
+ this.#settled = new Promise((resolve) => {
60
+ this.#settle = resolve;
61
+ });
62
+ this.#schedule();
63
+ }
64
+ /** Terminate the retained job, never a PID supplied by another caller. */
65
+ kill(signal) {
66
+ if (signal === 0)
67
+ return (!this.#closed &&
68
+ z
69
+ .number()
70
+ .parse(this.#authority.call("process_alive", [this.#handle])) > 0);
71
+ return this.#closed
72
+ ? false
73
+ : z
74
+ .boolean()
75
+ .parse(this.#authority.call("process_terminate", [this.#handle]));
76
+ }
77
+ /** Terminate and verify that the entire job has settled before releasing it. */
78
+ cleanup() {
79
+ this.#cleanup ??= this.#stop();
80
+ return this.#cleanup;
81
+ }
82
+ async #stop() {
83
+ if (this.#closed)
84
+ return this.#verifiedSettlement
85
+ ? { cleaned: true, signaled: false }
86
+ : {
87
+ cleaned: false,
88
+ reason: this.#failure ?? "Windows Job Object settlement was not verified",
89
+ };
90
+ let timer;
91
+ try {
92
+ const signaled = this.kill();
93
+ const settled = await Promise.race([
94
+ this.#settled.then(() => true),
95
+ new Promise((resolve) => {
96
+ timer = setTimeout(() => resolve(false), 5_000);
97
+ }),
98
+ ]);
99
+ return settled && this.#verifiedSettlement
100
+ ? { cleaned: true, signaled }
101
+ : {
102
+ cleaned: false,
103
+ reason: this.#failure ??
104
+ "Windows Job Object did not settle within the cleanup deadline",
105
+ };
106
+ }
107
+ catch (cause) {
108
+ return {
109
+ cleaned: false,
110
+ reason: cause instanceof Error ? cause.message : String(cause),
111
+ };
112
+ }
113
+ finally {
114
+ if (timer !== undefined)
115
+ clearTimeout(timer);
116
+ if (!this.#closed)
117
+ this.#release();
118
+ }
119
+ }
120
+ #schedule() {
121
+ this.#timer = setTimeout(() => this.#poll(), 25);
122
+ }
123
+ #poll() {
124
+ if (this.#closed)
125
+ return;
126
+ try {
127
+ const state = pollSchema.parse(this.#authority.call("process_poll", [this.#handle]));
128
+ if (state.stdout.length > 0)
129
+ this.stdout.write(state.stdout);
130
+ if (state.stderr.length > 0)
131
+ this.stderr.write(state.stderr);
132
+ if (state.exitCode !== null && this.exitCode === null) {
133
+ this.exitCode = state.exitCode;
134
+ this.emit("exit", state.exitCode, null);
135
+ }
136
+ if (state.exitCode !== null &&
137
+ state.stdoutEnded &&
138
+ state.stderrEnded &&
139
+ state.activeProcesses === 0) {
140
+ this.#verifiedSettlement = true;
141
+ this.#release();
142
+ }
143
+ else
144
+ this.#schedule();
145
+ }
146
+ catch (cause) {
147
+ const failure = cause instanceof Error ? cause : new Error(String(cause));
148
+ this.#failure = failure.message;
149
+ // Native lifecycle failures belong to the error/cleanup channels, never
150
+ // the captured stderr observation produced by the child itself.
151
+ if (this.listenerCount("error") > 0)
152
+ this.emit("error", failure);
153
+ this.#release();
154
+ }
155
+ }
156
+ #release() {
157
+ if (this.#closed)
158
+ return;
159
+ if (this.#timer !== undefined)
160
+ clearTimeout(this.#timer);
161
+ this.#authority.call("process_close", [this.#handle]);
162
+ this.#closed = true;
163
+ this.stdout.end();
164
+ this.stderr.end();
165
+ this.#settle?.();
166
+ this.emit("close", this.exitCode, null);
167
+ }
168
+ }
@@ -0,0 +1,137 @@
1
+ import { win32 } from "node:path";
2
+ import { z } from "zod";
3
+ import { requireWindowsNativeAuthority, windowsFileIdentitySchema, windowsHandleSchema, } from "./WindowsNativeLoader.js";
4
+ const runtimeSchema = windowsFileIdentitySchema.extend({
5
+ path: z.string(),
6
+ handle: windowsHandleSchema,
7
+ privateDacl: z.literal(true),
8
+ });
9
+ const snapshotSchema = z.strictObject({
10
+ sha256: z.string().regex(/^[a-f0-9]{64}$/u),
11
+ source: windowsFileIdentitySchema,
12
+ snapshot: windowsFileIdentitySchema,
13
+ });
14
+ const fileSchema = windowsFileIdentitySchema.extend({
15
+ handle: windowsHandleSchema,
16
+ });
17
+ const runtimes = new Map();
18
+ /** Retain private DACL and path handles until native recursive cleanup settles. */
19
+ export class WindowsPrivateRuntime {
20
+ observation;
21
+ authority;
22
+ // One native snapshot can own cancellation for this runtime at a time. A
23
+ // second request throws ERROR_BUSY before #pending or its abort listener is
24
+ // replaced, so aborting a rejected request cannot cancel the accepted copy.
25
+ #pending;
26
+ #closed = false;
27
+ #closePromise;
28
+ constructor(observation, authority) {
29
+ this.observation = observation;
30
+ this.authority = authority;
31
+ }
32
+ /** Create a new directory with its private DACL installed at creation. */
33
+ static create(parent, prefix) {
34
+ const authority = requireWindowsNativeAuthority();
35
+ const observation = runtimeSchema.parse(authority.call("runtime_create", [parent, prefix]));
36
+ const runtime = new WindowsPrivateRuntime(observation, authority);
37
+ runtimes.set(observation.path.toLowerCase(), runtime);
38
+ return runtime;
39
+ }
40
+ /** Open a private child directory through retained, verified parent handles. */
41
+ mkdir(relativePath) {
42
+ this.authority.call("runtime_mkdir", [
43
+ this.observation.handle,
44
+ relativePath,
45
+ ]);
46
+ }
47
+ /** Write a new private file once and retain its immutable handle. */
48
+ writeFile(relativePath, content) {
49
+ this.authority.call("runtime_write", [
50
+ this.observation.handle,
51
+ relativePath,
52
+ Buffer.from(content),
53
+ ]);
54
+ }
55
+ /** Copy admitted source bytes and digest the bytes actually written. */
56
+ async snapshot(sourcePath, relativePath, signal) {
57
+ // Admission is synchronous; record ownership only after native acceptance.
58
+ const pending = Promise.resolve(this.authority.call("runtime_snapshot", [
59
+ this.observation.handle,
60
+ sourcePath,
61
+ relativePath,
62
+ ]));
63
+ this.#pending = pending;
64
+ const cancel = () => {
65
+ this.authority.call("runtime_snapshot_cancel", [this.observation.handle]);
66
+ };
67
+ signal?.addEventListener("abort", cancel, { once: true });
68
+ if (signal?.aborted === true)
69
+ cancel();
70
+ try {
71
+ return snapshotSchema.parse(await pending);
72
+ }
73
+ finally {
74
+ signal?.removeEventListener("abort", cancel);
75
+ if (this.#pending === pending)
76
+ this.#pending = undefined;
77
+ }
78
+ }
79
+ /** Read a private endpoint from an opened file, without re-opening its path. */
80
+ readFile(relativePath) {
81
+ const file = fileSchema.parse(this.authority.call("runtime_open", [
82
+ this.observation.handle,
83
+ relativePath,
84
+ ]));
85
+ try {
86
+ const chunks = [];
87
+ for (let offset = 0; offset < file.size;) {
88
+ const value = z
89
+ .instanceof(Buffer)
90
+ .parse(this.authority.call("read", [
91
+ file.handle,
92
+ offset,
93
+ Math.min(65_536, file.size - offset),
94
+ ]));
95
+ if (value.length === 0)
96
+ throw new Error("Private runtime file ended before its observed size");
97
+ offset += value.length;
98
+ chunks.push(value);
99
+ }
100
+ return Buffer.concat(chunks).toString("utf8");
101
+ }
102
+ finally {
103
+ this.authority.call("close", [file.handle]);
104
+ }
105
+ }
106
+ /** Remove owned objects by handle, unlinking reparse entries without traversal. */
107
+ close() {
108
+ this.#closePromise ??= this.#remove();
109
+ return this.#closePromise;
110
+ }
111
+ async #remove() {
112
+ if (this.#closed)
113
+ return;
114
+ if (this.#pending !== undefined)
115
+ this.authority.call("runtime_snapshot_cancel", [this.observation.handle]);
116
+ await this.#pending?.catch(() => undefined);
117
+ try {
118
+ this.authority.call("runtime_close", [this.observation.handle]);
119
+ }
120
+ finally {
121
+ this.#closed = true;
122
+ runtimes.delete(this.observation.path.toLowerCase());
123
+ }
124
+ }
125
+ }
126
+ /** Select an already-owned runtime; an arbitrary pathname cannot grant authority. */
127
+ export const windowsPrivateRuntime = (rootPath) => {
128
+ const runtime = runtimes.get(rootPath.toLowerCase());
129
+ if (runtime === undefined)
130
+ throw new Error(`No native private runtime owns ${rootPath}`);
131
+ return runtime;
132
+ };
133
+ /** Read a runtime endpoint using the lease that owns its parent directory. */
134
+ export const readWindowsPrivateRuntimeFile = (path) => {
135
+ const parent = win32.dirname(path);
136
+ return windowsPrivateRuntime(parent).readFile(win32.basename(path));
137
+ };
package/install.sh CHANGED
@@ -55,17 +55,15 @@ fi
55
55
  platform="$(uname -s)"
56
56
  [[ "$platform" == "Darwin" || "$platform" == "Linux" ]] || fail "REA supports macOS and selected 64-bit Linux distributions."
57
57
  command -v curl >/dev/null 2>&1 || fail "curl is required. Install curl, then rerun this installer."
58
- command -v node >/dev/null 2>&1 || fail "Node.js 22.19+ or 24.11+ is required; install it from https://nodejs.org and retry."
58
+ command -v node >/dev/null 2>&1 || fail "Node.js 22.x (>=22.19), 24.x (>=24.11), or 26+ is required; install it from https://nodejs.org and retry."
59
59
  command -v npm >/dev/null 2>&1 || fail "npm is required; install it with Node.js and retry."
60
60
 
61
61
  node_version="$(node -p 'process.versions.node' 2>/dev/null || true)"
62
62
  IFS=. read -r node_major node_minor _node_patch <<<"$node_version"
63
63
  [[ "$node_major" =~ ^[0-9]+$ && "$node_minor" =~ ^[0-9]+$ ]] || fail "the active Node.js version could not be read. Check that node works and is on PATH, then retry."
64
- if ! ((node_major == 22 && node_minor >= 19 || node_major >= 24)); then
65
- fail "Node.js $node_version is unsupported; use Node.js 22.19+ or 24.11+."
66
- fi
67
- if ((node_major == 24 && node_minor < 11)); then
68
- fail "Node.js $node_version is unsupported; use Node.js 24.11 or newer."
64
+ if ! [[ "$_node_patch" =~ ^[0-9]+(\+[0-9A-Za-z.-]+)?$ ]] ||
65
+ ! ((node_major == 22 && node_minor >= 19 || node_major == 24 && node_minor >= 11 || node_major >= 26)); then
66
+ fail "Node.js $node_version is unsupported; use Node.js 22.x (>=22.19), 24.x (>=24.11), or 26+."
69
67
  fi
70
68
 
71
69
  if [[ -n "$version" ]]; then