rea-agents 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/README.md +83 -108
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -1,10 +1,10 @@
1
- import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
2
- import { realpath, stat } from "node:fs/promises";
1
+ import { dirname, isAbsolute, resolve } from "node:path";
2
+ import { stat } from "node:fs/promises";
3
3
  import { parse as parseXmlPlist } from "plist";
4
4
  import { z } from "zod";
5
5
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
6
6
  import { NATIVE_TOOL_CONTRACTS, } from "../contracts/nativeToolContracts.js";
7
- import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, AnalysisTimeoutError, ProviderAdapterError, } from "../domain/errors.js";
7
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, ProviderAdapterError, } from "../domain/errors.js";
8
8
  import { jsonValueSchema } from "../domain/jsonValue.js";
9
9
  import { demangleSwiftSchema, inspectPlistSchema, inspectSignatureSchema, listArchitecturesSchema, } from "../domain/nativeInspection.js";
10
10
  import { err, ok } from "../domain/result.js";
@@ -21,8 +21,6 @@ export const NATIVE_MACOS_PROVIDER_IDENTITY = Object.freeze({
21
21
  version: null,
22
22
  });
23
23
  const IDENTITY = NATIVE_MACOS_PROVIDER_IDENTITY;
24
- const TIMEOUT_MS = 30_000;
25
- const OUTPUT_LIMIT = 4 * 1024 * 1024;
26
24
  /** Read-only semantic provider composed from Xcode command-line utilities. */
27
25
  export class NativeMacOSProvider {
28
26
  runner;
@@ -41,11 +39,7 @@ export class NativeMacOSProvider {
41
39
  return Object.freeze({
42
40
  provider: IDENTITY,
43
41
  operation: contract.name,
44
- inputContractVersion: 1,
45
- outputContractVersion: 1,
46
42
  ...availability,
47
- pagination: "none",
48
- exhaustive: contract.name !== "inspect_macho",
49
43
  effects: Object.freeze({
50
44
  mutatesArtifact: false,
51
45
  launchesProcess: true,
@@ -55,11 +49,6 @@ export class NativeMacOSProvider {
55
49
  changesPermissions: false,
56
50
  requiresRoot: false,
57
51
  }),
58
- limits: Object.freeze({
59
- maxResults: contract.name === "demangle_swift" ? 500 : null,
60
- maxPayloadBytes: OUTPUT_LIMIT,
61
- timeoutMs: TIMEOUT_MS,
62
- }),
63
52
  limitations: Object.freeze([
64
53
  "Availability and textual formats depend on the installed macOS/Xcode toolchain.",
65
54
  ]),
@@ -199,9 +188,9 @@ class NativeMacOSClient {
199
188
  });
200
189
  }
201
190
  async #inspectPlist(parameters, signal) {
202
- const requested = parameters.relative_path;
203
- if (typeof requested !== "string")
204
- return err(new AnalysisOutputError("inspect_plist", "relative_path was not a string"));
191
+ const requested = parameters.path;
192
+ if (requested !== undefined && typeof requested !== "string")
193
+ return err(new AnalysisOutputError("inspect_plist", "path was not a string"));
205
194
  const plist = await resolvePlistPath(this.target, requested);
206
195
  if (!plist.ok)
207
196
  return plist;
@@ -220,7 +209,7 @@ class NativeMacOSClient {
220
209
  ? "xml"
221
210
  : "unknown",
222
211
  ...parsed,
223
- source_path: requested,
212
+ source_path: plist.value,
224
213
  provenance,
225
214
  limitations: [],
226
215
  });
@@ -228,7 +217,7 @@ class NativeMacOSClient {
228
217
  result: jsonValueSchema.parse(result),
229
218
  provenance,
230
219
  limitations: [],
231
- locations: [{ kind: "artifact-path", path: requested }],
220
+ locations: [{ kind: "artifact-path", path: plist.value }],
232
221
  });
233
222
  }
234
223
  async #inspectMacho(signal) {
@@ -246,8 +235,6 @@ class NativeMacOSClient {
246
235
  async #run(operation, tool, arguments_, options = {}) {
247
236
  const captured = await this.runner.run(tool, arguments_, {
248
237
  ...(options.signal === undefined ? {} : { signal: options.signal }),
249
- timeoutMs: TIMEOUT_MS,
250
- maxOutputBytes: OUTPUT_LIMIT,
251
238
  acceptNonZero: options.acceptNonZero ?? false,
252
239
  });
253
240
  if (captured.ok)
@@ -261,8 +248,6 @@ const translateCommandFailure = (operation, failure) => {
261
248
  return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, `${failure.tool} is unavailable through xcrun.`);
262
249
  if (failure.reason === "cancelled")
263
250
  return new AnalysisCancelledError(operation);
264
- if (failure.reason === "timeout")
265
- return new AnalysisTimeoutError(operation, TIMEOUT_MS);
266
251
  return new ProviderAdapterError(IDENTITY.id, operation, { cause: failure });
267
252
  };
268
253
  const invocation = (capture, artifactPath, alias = "$ARTIFACT") => ({
@@ -277,8 +262,6 @@ const invocation = (capture, artifactPath, alias = "$ARTIFACT") => ({
277
262
  exit: { code: capture.exitCode, signal: capture.signal },
278
263
  stdout_bytes: capture.stdoutBytes,
279
264
  stderr_bytes: capture.stderrBytes,
280
- stdout_truncated: capture.stdoutTruncated,
281
- stderr_truncated: capture.stderrTruncated,
282
265
  });
283
266
  const parseEntitlements = (output) => {
284
267
  const start = output.indexOf("<?xml");
@@ -290,23 +273,15 @@ const parseEntitlements = (output) => {
290
273
  const resolvePlistPath = async (target, requested) => {
291
274
  try {
292
275
  const source = target.sourcePath ?? target.path;
276
+ if (requested !== undefined && isAbsolute(requested))
277
+ return ok(resolve(requested));
293
278
  const sourceMetadata = await stat(source);
294
279
  const root = sourceMetadata.isDirectory() ? source : dirname(target.path);
295
- const candidate = resolve(root, requested);
296
- if (!within(root, candidate))
297
- return err(new ProviderAdapterError(IDENTITY.id, "inspect_plist"));
298
- const canonicalRoot = await realpath(root);
299
- const canonical = await realpath(candidate);
300
- if (!within(canonicalRoot, canonical))
301
- return err(new ProviderAdapterError(IDENTITY.id, "inspect_plist"));
302
- return ok(canonical);
280
+ return ok(requested === undefined
281
+ ? resolve(root, "Contents/Info.plist")
282
+ : resolve(root, requested));
303
283
  }
304
284
  catch (cause) {
305
285
  return err(new ProviderAdapterError(IDENTITY.id, "inspect_plist", { cause }));
306
286
  }
307
287
  };
308
- const within = (root, candidate) => {
309
- const child = relative(root, candidate);
310
- return (child === "" ||
311
- (!child.startsWith(`..${sep}`) && child !== ".." && !isAbsolute(child)));
312
- };
@@ -15,7 +15,7 @@ const REQUIRED_COMMANDS = [
15
15
  ];
16
16
  const OPTIONAL_VTOOL_COMMAND = ["vtool", ["-show-build"]];
17
17
  const VTOOL_UNAVAILABLE_LIMITATION = "vtool is unavailable; build metadata is normalized from otool only.";
18
- /** Inspect one Mach-O with bounded native commands and normalized output. */
18
+ /** Inspect one Mach-O with the required native commands and normalized output. */
19
19
  export const inspectNativeMacho = async (context) => {
20
20
  const captures = [];
21
21
  for (const [tool, prefix] of REQUIRED_COMMANDS) {
@@ -0,0 +1,17 @@
1
+ /** Read through EOF, returning undefined on overflow; consume at most maxBytes + 1 bytes without closing the handle. */
2
+ export const readBoundedFileBytes = async (handle, maxBytes) => {
3
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
4
+ throw new RangeError("File byte limit must be a nonnegative safe integer");
5
+ const chunks = [];
6
+ const buffer = Buffer.allocUnsafe(Math.min(64 * 1_024, maxBytes + 1));
7
+ let total = 0;
8
+ for (;;) {
9
+ const { bytesRead } = await handle.read(buffer, 0, Math.min(buffer.length, maxBytes - total + 1), null);
10
+ if (bytesRead === 0)
11
+ return Buffer.concat(chunks, total);
12
+ total += bytesRead;
13
+ if (total > maxBytes)
14
+ return undefined;
15
+ chunks.push(Buffer.from(buffer.subarray(0, bytesRead)));
16
+ }
17
+ };
@@ -0,0 +1,11 @@
1
+ import { execFile, } from "node:child_process";
2
+ /** Run a shell-free command while capturing its complete UTF-8 output. */
3
+ export const execFileOutput = (command, arguments_, options = {}) => new Promise((resolve, reject) => {
4
+ execFile(command, [...arguments_], { ...options, encoding: "utf8", maxBuffer: Number.POSITIVE_INFINITY }, (error, stdout, stderr) => {
5
+ if (error !== null) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ resolve({ stdout, stderr });
10
+ });
11
+ });
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * Correlates event-driven provider replies with bounded waits.
3
3
  *
4
- * The registry owns every request timer and abort listener. Settling, timing
5
- * out, cancelling, or failing an operation removes both before resolution, so
6
- * late protocol replies can be ignored without retaining request resources.
4
+ * The registry owns optional request timers and cancellation listeners.
5
+ * Settling, timing out, cancelling, or failing removes these before resolution.
7
6
  */
8
7
  export class PendingOperations {
9
8
  #pending = new Map();
@@ -15,7 +14,7 @@ export class PendingOperations {
15
14
  has(key) {
16
15
  return this.#pending.has(key);
17
16
  }
18
- /** Register one unique operation key and start its bounded wait. */
17
+ /** Register one unique operation key and await its reply or cancellation. */
19
18
  wait(key, options) {
20
19
  if (this.#pending.has(key))
21
20
  throw new Error("Pending operation key is already registered");
@@ -25,7 +24,9 @@ export class PendingOperations {
25
24
  const onAbort = options.signal === undefined
26
25
  ? undefined
27
26
  : () => this.#finish(key, options.cancelledValue());
28
- const timer = setTimeout(() => this.#finish(key, options.timeoutValue()), options.timeoutMs);
27
+ const timer = options.timeoutMs === undefined
28
+ ? undefined
29
+ : setTimeout(() => this.#finish(key, options.timeoutValue()), options.timeoutMs);
29
30
  this.#pending.set(key, {
30
31
  resolve,
31
32
  timer,
@@ -50,7 +51,8 @@ export class PendingOperations {
50
51
  if (pending === undefined)
51
52
  return false;
52
53
  this.#pending.delete(key);
53
- clearTimeout(pending.timer);
54
+ if (pending.timer !== undefined)
55
+ clearTimeout(pending.timer);
54
56
  if (pending.signal !== undefined && pending.onAbort !== undefined)
55
57
  pending.signal.removeEventListener("abort", pending.onAbort);
56
58
  pending.resolve(value);
@@ -1,6 +1,19 @@
1
1
  import { chmod, mkdtemp, rm } from "node:fs/promises";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
+ import { windowsNativeCapabilities, } from "./WindowsAuthority.js";
5
+ /** Report whether this process can establish a private runtime root. */
6
+ export const privateRuntimeRootCapability = (platform = process.platform) => platform === "win32"
7
+ ? windowsNativeCapabilities(platform).private_runtime_dacl
8
+ : { available: true, reason: null, proof: "posix-mode-0700" };
9
+ /** Expected failure when a runtime root's privacy boundary is unavailable. */
10
+ export class PrivateRuntimeRootUnavailableError extends Error {
11
+ code = "private-runtime-root-authority-unavailable";
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = "PrivateRuntimeRootUnavailableError";
15
+ }
16
+ }
4
17
  /**
5
18
  * Owns one POSIX mode-0700 temporary runtime root and removes it idempotently.
6
19
  *
@@ -16,6 +29,10 @@ export class PrivateRuntimeRoot {
16
29
  }
17
30
  /** Allocate a new private runtime root without performing protocol work. */
18
31
  static async create(options = {}) {
32
+ const platform = options.platform ?? process.platform;
33
+ const capability = privateRuntimeRootCapability(platform);
34
+ if (!capability.available)
35
+ throw new PrivateRuntimeRootUnavailableError(capability.reason);
19
36
  const path = await mkdtemp(join(options.parent ?? tmpdir(), options.prefix ?? "rea-provider-"));
20
37
  try {
21
38
  await chmod(path, 0o700);
@@ -1,13 +1,17 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { promisify } from "node:util";
4
- import { matchesOwnedProcessCommand } from "./ProcessCommandIdentity.js";
4
+ import { observeOwnedProcessGroupWithHost, observeOwnedProcessLineageWithHost, } from "./ProcessOwnershipObservation.js";
5
+ import { launcherIdentityFailure } from "./ProcessOwnershipIdentity.js";
6
+ import { descendantsOf, liveProcesses } from "./ProcessOwnershipProcessTree.js";
7
+ import { execFileOutput } from "./ExecFileOutput.js";
5
8
  const execFileAsync = promisify(execFile);
6
9
  /**
7
10
  * Terminate one Windows process tree through the platform utility.
8
11
  *
9
12
  * This is a bounded P0 cleanup mechanism, not Job Object ownership proof. The
10
- * caller-visible Windows limitations must preserve that distinction.
13
+ * caller-visible Windows capability report remains unavailable until a native
14
+ * authority verifies Job Object creation, membership, and cleanup semantics.
11
15
  */
12
16
  export const cleanupWindowsProcessTree = async (rootPid, host = systemWindowsProcessTreeHost) => {
13
17
  if (!Number.isSafeInteger(rootPid) || rootPid <= 0)
@@ -48,7 +52,7 @@ const systemHost = {
48
52
  async listProcesses() {
49
53
  if (process.platform === "win32")
50
54
  return [];
51
- const { stdout } = await execFileAsync("ps", [
55
+ const { stdout } = await execFileOutput("ps", [
52
56
  "-axo",
53
57
  "pid=,ppid=,pgid=,stat=,command=",
54
58
  ]);
@@ -68,10 +72,13 @@ const systemHost = {
68
72
  if (process.platform === "linux") {
69
73
  return parseProcessEnvironment(await readFile(`/proc/${pid}/environ`, "utf8"));
70
74
  }
71
- const { stdout } = await execFileAsync("ps", ["eww", "-p", String(pid)]);
75
+ const { stdout } = await execFileOutput("ps", ["eww", "-p", String(pid)]);
72
76
  const environment = {};
73
- for (const match of stdout.matchAll(/(?:^|\s)([A-Za-z_][A-Za-z0-9_]*)=([^\s]*)/gu))
74
- environment[match[1]] = match[2] ?? "";
77
+ for (const match of stdout.matchAll(/(?:^|\s)([A-Za-z_][A-Za-z0-9_]*)=([^\s]*)/gu)) {
78
+ const name = match[1];
79
+ if (name !== undefined)
80
+ environment[name] = match[2] ?? "";
81
+ }
75
82
  return environment;
76
83
  },
77
84
  signalGroup(processGroupId, signal) {
@@ -97,13 +104,9 @@ const systemWindowsProcessTreeHost = {
97
104
  export const readProcessRunId = async (pid, host = systemHost) => (await host.environment(pid)).REA_PROCESS_RUN_ID;
98
105
  /** Token-validate every rooted POSIX process group before signaling any. */
99
106
  export const cleanupOwnedProcessGroup = async (ownership, host = systemHost) => {
100
- let processes;
101
- try {
102
- processes = liveProcesses(await host.listProcesses());
103
- }
104
- catch {
107
+ const processes = await readLiveProcessTable(host);
108
+ if (processes === undefined)
105
109
  return { cleaned: false, reason: "process table could not be inspected" };
106
- }
107
110
  const plan = await createOwnedCleanupPlan(ownership, processes, host);
108
111
  if ("cleaned" in plan)
109
112
  return plan;
@@ -126,10 +129,38 @@ export const cleanupOwnedProcessGroup = async (ownership, host = systemHost) =>
126
129
  }
127
130
  return { cleaned: true, signaled };
128
131
  };
132
+ /** Verify that no live process still carries an owned capture run token. */
133
+ export const verifyNoTokenOwnedProcesses = async (runId, host = systemHost) => {
134
+ const processes = await readLiveProcessTable(host);
135
+ if (processes === undefined)
136
+ return { cleaned: false, reason: "process table could not be inspected" };
137
+ const scan = await scanTokenOwnedProcesses(processes, runId, host);
138
+ if (scan.failures.length > 0)
139
+ return cleanupValidationFailure(scan.failures);
140
+ return scan.owned.length === 0
141
+ ? { cleaned: true, signaled: false }
142
+ : { cleaned: false, reason: "token-owned process remained after cleanup" };
143
+ };
144
+ const readLiveProcessTable = async (host) => {
145
+ try {
146
+ return liveProcesses(await host.listProcesses());
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ };
129
152
  const createOwnedCleanupPlan = async (ownership, processes, host) => {
153
+ const tokenOwned = ownership.sweepTokenOwnedProcesses === true
154
+ ? await scanTokenOwnedProcesses(processes, ownership.runId, host)
155
+ : { owned: [], failures: [] };
156
+ if (tokenOwned.failures.length > 0)
157
+ return cleanupValidationFailure(tokenOwned.failures);
158
+ const tokenOwnedGroupIds = new Set(tokenOwned.owned.map(({ processGroupId }) => processGroupId));
130
159
  const launcher = processes.find(({ pid }) => pid === ownership.leaderPid);
131
160
  const rootMembers = processes.filter(({ processGroupId }) => processGroupId === ownership.processGroupId);
132
- if (launcher === undefined && rootMembers.length === 0)
161
+ if (launcher === undefined &&
162
+ rootMembers.length === 0 &&
163
+ tokenOwned.owned.length === 0)
133
164
  return { cleaned: true, signaled: false };
134
165
  let descendants = [];
135
166
  if (launcher !== undefined) {
@@ -142,11 +173,14 @@ const createOwnedCleanupPlan = async (ownership, processes, host) => {
142
173
  const processGroupIds = new Set([ownership.processGroupId]);
143
174
  for (const descendant of descendants)
144
175
  processGroupIds.add(descendant.processGroupId);
176
+ for (const process of tokenOwned.owned)
177
+ processGroupIds.add(process.processGroupId);
145
178
  for (const processGroupId of processGroupIds) {
146
179
  if (processGroupId === ownership.processGroupId)
147
180
  continue;
148
181
  const groupLeader = processes.find(({ pid, processGroupId: observedGroupId }) => pid === processGroupId && observedGroupId === processGroupId);
149
- if (groupLeader === undefined || !descendantPids.has(groupLeader.pid))
182
+ if ((groupLeader === undefined || !descendantPids.has(groupLeader.pid)) &&
183
+ !tokenOwnedGroupIds.has(processGroupId))
150
184
  return {
151
185
  cleaned: false,
152
186
  reason: "descendant process-group leader identity could not be verified",
@@ -162,17 +196,6 @@ const createOwnedCleanupPlan = async (ownership, processes, host) => {
162
196
  .sort((left, right) => left - right)),
163
197
  };
164
198
  };
165
- const launcherIdentityFailure = (launcher, ownership) => {
166
- if (launcher.processGroupId !== ownership.processGroupId)
167
- return "owned launcher process-group identity did not match";
168
- if (ownership.expectedParentPid !== undefined &&
169
- launcher.parentPid !== ownership.expectedParentPid)
170
- return "owned launcher parent identity did not match";
171
- if (ownership.expectedCommand !== undefined &&
172
- !matchesOwnedProcessCommand(launcher.command, ownership.expectedCommand))
173
- return `owned launcher command identity did not match (observed=${launcher.command}; expected=${ownership.expectedCommand})`;
174
- return null;
175
- };
176
199
  const revalidateOwnedProcessGroup = async (processGroupId, ownership, host) => {
177
200
  let members;
178
201
  try {
@@ -197,7 +220,8 @@ const revalidateOwnedProcessGroup = async (processGroupId, ownership, host) => {
197
220
  }
198
221
  if (processGroupId !== ownership.processGroupId &&
199
222
  members.length > 0 &&
200
- !members.some(({ pid }) => pid === processGroupId))
223
+ !members.some(({ pid }) => pid === processGroupId) &&
224
+ ownership.sweepTokenOwnedProcesses !== true)
201
225
  return {
202
226
  cleaned: false,
203
227
  reason: "descendant process-group leader identity could not be revalidated",
@@ -230,39 +254,28 @@ const processOwnershipFailures = async (members, runId, host) => {
230
254
  }
231
255
  return failures;
232
256
  };
233
- /** Observe one group without signaling it, failing closed on identity doubt. */
234
- export const observeOwnedProcessGroup = async (ownership, host = systemHost) => {
235
- let members;
236
- try {
237
- members = (await host.listProcesses()).filter(({ processGroupId }) => processGroupId === ownership.processGroupId);
238
- }
239
- catch {
240
- return {
241
- state: "unverifiable",
242
- reason: "process group could not be inspected",
243
- };
244
- }
245
- const liveMembers = liveProcesses(members);
246
- if (liveMembers.length === 0)
247
- return { state: "empty" };
248
- for (const member of liveMembers) {
257
+ const scanTokenOwnedProcesses = async (processes, runId, host) => {
258
+ const owned = [];
259
+ const failures = [];
260
+ for (const process of processes) {
249
261
  try {
250
- if ((await host.environment(member.pid)).REA_PROCESS_RUN_ID !==
251
- ownership.runId)
252
- return {
253
- state: "unverifiable",
254
- reason: "process ownership did not match",
255
- };
262
+ if ((await host.environment(process.pid)).REA_PROCESS_RUN_ID === runId)
263
+ owned.push(process);
256
264
  }
257
265
  catch {
258
- return {
259
- state: "unverifiable",
260
- reason: "process ownership could not be revalidated",
261
- };
266
+ try {
267
+ const live = liveProcesses(await host.listProcesses());
268
+ if (!live.some(({ pid }) => pid === process.pid))
269
+ continue;
270
+ }
271
+ catch { }
272
+ failures.push({ pid: process.pid, reason: "environment-unreadable" });
262
273
  }
263
274
  }
264
- return { state: "alive" };
275
+ return { owned, failures };
265
276
  };
277
+ /** Observe one group without signaling it, failing closed on identity doubt. */
278
+ export const observeOwnedProcessGroup = async (ownership, host = systemHost) => observeOwnedProcessGroupWithHost(ownership, host);
266
279
  /**
267
280
  * Record the live launcher and descendant lineage after run-token validation.
268
281
  *
@@ -270,80 +283,4 @@ export const observeOwnedProcessGroup = async (ownership, host = systemHost) =>
270
283
  * list means no descendants were live during this observation, not that the
271
284
  * run never created a short-lived child.
272
285
  */
273
- export const observeOwnedProcessLineage = async (ownership, host = systemHost) => {
274
- let processes;
275
- try {
276
- processes = liveProcesses(await host.listProcesses());
277
- }
278
- catch {
279
- return unavailableLineage(ownership, "process table could not be inspected");
280
- }
281
- const launcher = processes.find(({ pid }) => pid === ownership.leaderPid);
282
- if (launcher === undefined)
283
- return unavailableLineage(ownership, "owned launcher is not live");
284
- if (launcher.processGroupId !== ownership.processGroupId)
285
- return unavailableLineage(ownership, "owned launcher process-group identity did not match");
286
- if (ownership.expectedParentPid !== undefined &&
287
- launcher.parentPid !== ownership.expectedParentPid)
288
- return unavailableLineage(ownership, "owned launcher parent identity did not match");
289
- if (ownership.expectedCommand !== undefined &&
290
- !matchesOwnedProcessCommand(launcher.command, ownership.expectedCommand))
291
- return unavailableLineage(ownership, `owned launcher command identity did not match (observed=${launcher.command}; expected=${ownership.expectedCommand})`);
292
- const descendants = descendantsOf(launcher.pid, processes);
293
- for (const member of [launcher, ...descendants]) {
294
- try {
295
- if ((await host.environment(member.pid)).REA_PROCESS_RUN_ID !==
296
- ownership.runId)
297
- return unavailableLineage(ownership, "process lineage contains an unowned or PID-reused process");
298
- }
299
- catch {
300
- return unavailableLineage(ownership, "process ownership could not be revalidated");
301
- }
302
- }
303
- return {
304
- status: "verified",
305
- observedAt: new Date().toISOString(),
306
- lineage: {
307
- schemaVersion: 1,
308
- runId: ownership.runId,
309
- launcherPid: launcher.pid,
310
- launcherParentPid: launcher.parentPid,
311
- processGroupId: launcher.processGroupId,
312
- descendants: descendants
313
- .sort((left, right) => left.pid - right.pid)
314
- .map(({ pid, parentPid, processGroupId }) => ({
315
- pid,
316
- parentPid,
317
- processGroupId,
318
- })),
319
- },
320
- };
321
- };
322
- const descendantsOf = (launcherPid, processes) => {
323
- const childrenByParent = new Map();
324
- for (const process of processes) {
325
- const siblings = childrenByParent.get(process.parentPid) ?? [];
326
- siblings.push(process);
327
- childrenByParent.set(process.parentPid, siblings);
328
- }
329
- const descendants = [];
330
- const pending = [...(childrenByParent.get(launcherPid) ?? [])];
331
- const visited = new Set([launcherPid]);
332
- for (const process of pending) {
333
- if (visited.has(process.pid))
334
- continue;
335
- visited.add(process.pid);
336
- descendants.push(process);
337
- pending.push(...(childrenByParent.get(process.pid) ?? []));
338
- }
339
- return descendants;
340
- };
341
- const unavailableLineage = (ownership, reason) => ({
342
- status: "unavailable",
343
- observedAt: new Date().toISOString(),
344
- runId: ownership.runId,
345
- launcherPid: ownership.leaderPid,
346
- processGroupId: ownership.processGroupId,
347
- reason,
348
- });
349
- const liveProcesses = (members) => members.filter(({ state }) => !state.startsWith("Z"));
286
+ export const observeOwnedProcessLineage = async (ownership, host = systemHost) => observeOwnedProcessLineageWithHost(ownership, host);
@@ -0,0 +1,13 @@
1
+ import { matchesOwnedProcessCommand } from "./ProcessCommandIdentity.js";
2
+ /** Compare a live launcher against the identity committed at process launch. */
3
+ export const launcherIdentityFailure = (launcher, ownership) => {
4
+ if (launcher.processGroupId !== ownership.processGroupId)
5
+ return "owned launcher process-group identity did not match";
6
+ if (ownership.expectedParentPid !== undefined &&
7
+ launcher.parentPid !== ownership.expectedParentPid)
8
+ return "owned launcher parent identity did not match";
9
+ if (ownership.expectedCommand !== undefined &&
10
+ !matchesOwnedProcessCommand(launcher.command, ownership.expectedCommand))
11
+ return `owned launcher command identity did not match (observed=${launcher.command}; expected=${ownership.expectedCommand})`;
12
+ return null;
13
+ };
@@ -0,0 +1,87 @@
1
+ import { launcherIdentityFailure } from "./ProcessOwnershipIdentity.js";
2
+ import { descendantsOf, liveProcesses } from "./ProcessOwnershipProcessTree.js";
3
+ /** Observe one group without signaling it, failing closed on identity doubt. */
4
+ export const observeOwnedProcessGroupWithHost = async (ownership, host) => {
5
+ let members;
6
+ try {
7
+ members = (await host.listProcesses()).filter(({ processGroupId }) => processGroupId === ownership.processGroupId);
8
+ }
9
+ catch {
10
+ return {
11
+ state: "unverifiable",
12
+ reason: "process group could not be inspected",
13
+ };
14
+ }
15
+ const liveMembers = liveProcesses(members);
16
+ if (liveMembers.length === 0)
17
+ return { state: "empty" };
18
+ for (const member of liveMembers) {
19
+ try {
20
+ if ((await host.environment(member.pid)).REA_PROCESS_RUN_ID !==
21
+ ownership.runId)
22
+ return {
23
+ state: "unverifiable",
24
+ reason: "process ownership did not match",
25
+ };
26
+ }
27
+ catch {
28
+ return {
29
+ state: "unverifiable",
30
+ reason: "process ownership could not be revalidated",
31
+ };
32
+ }
33
+ }
34
+ return { state: "alive" };
35
+ };
36
+ /** Record the live launcher and descendant lineage after run-token validation. */
37
+ export const observeOwnedProcessLineageWithHost = async (ownership, host) => {
38
+ let processes;
39
+ try {
40
+ processes = liveProcesses(await host.listProcesses());
41
+ }
42
+ catch {
43
+ return unavailableLineage(ownership, "process table could not be inspected");
44
+ }
45
+ const launcher = processes.find(({ pid }) => pid === ownership.leaderPid);
46
+ if (launcher === undefined)
47
+ return unavailableLineage(ownership, "owned launcher is not live");
48
+ const identityFailure = launcherIdentityFailure(launcher, ownership);
49
+ if (identityFailure !== null)
50
+ return unavailableLineage(ownership, identityFailure);
51
+ const descendants = descendantsOf(launcher.pid, processes);
52
+ for (const member of [launcher, ...descendants]) {
53
+ try {
54
+ if ((await host.environment(member.pid)).REA_PROCESS_RUN_ID !==
55
+ ownership.runId)
56
+ return unavailableLineage(ownership, "process lineage contains an unowned or PID-reused process");
57
+ }
58
+ catch {
59
+ return unavailableLineage(ownership, "process ownership could not be revalidated");
60
+ }
61
+ }
62
+ return {
63
+ status: "verified",
64
+ observedAt: new Date().toISOString(),
65
+ lineage: {
66
+ runId: ownership.runId,
67
+ launcherPid: launcher.pid,
68
+ launcherParentPid: launcher.parentPid,
69
+ processGroupId: launcher.processGroupId,
70
+ descendants: descendants
71
+ .sort((left, right) => left.pid - right.pid)
72
+ .map(({ pid, parentPid, processGroupId }) => ({
73
+ pid,
74
+ parentPid,
75
+ processGroupId,
76
+ })),
77
+ },
78
+ };
79
+ };
80
+ const unavailableLineage = (ownership, reason) => ({
81
+ status: "unavailable",
82
+ observedAt: new Date().toISOString(),
83
+ runId: ownership.runId,
84
+ launcherPid: ownership.leaderPid,
85
+ processGroupId: ownership.processGroupId,
86
+ reason,
87
+ });
@@ -0,0 +1,22 @@
1
+ /** Exclude process-table entries that the operating system has already reaped. */
2
+ export const liveProcesses = (members) => members.filter(({ state }) => !state.startsWith("Z"));
3
+ /** Return every live-table descendant of a launcher in breadth-first order. */
4
+ export const descendantsOf = (launcherPid, processes) => {
5
+ const childrenByParent = new Map();
6
+ for (const process of processes) {
7
+ const siblings = childrenByParent.get(process.parentPid) ?? [];
8
+ siblings.push(process);
9
+ childrenByParent.set(process.parentPid, siblings);
10
+ }
11
+ const descendants = [];
12
+ const pending = [...(childrenByParent.get(launcherPid) ?? [])];
13
+ const visited = new Set([launcherPid]);
14
+ for (const process of pending) {
15
+ if (visited.has(process.pid))
16
+ continue;
17
+ visited.add(process.pid);
18
+ descendants.push(process);
19
+ pending.push(...(childrenByParent.get(process.pid) ?? []));
20
+ }
21
+ return descendants;
22
+ };