rea-agents 3.1.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 (590) hide show
  1. package/README.md +72 -95
  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/AnalysisSnapshotCache.js +0 -1
  6. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  7. package/dist/application/AndroidApplicationService.js +1 -1
  8. package/dist/application/AppleApplicationService.js +1 -1
  9. package/dist/application/ArtifactExtraction.js +35 -54
  10. package/dist/application/ArtifactExtractionDestination.js +17 -0
  11. package/dist/application/ArtifactGraphConstruction.js +2 -17
  12. package/dist/application/ArtifactInventory/classify.js +2 -6
  13. package/dist/application/ArtifactInventory/hash.js +2 -20
  14. package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
  15. package/dist/application/ArtifactInventory/scanReader.js +69 -51
  16. package/dist/application/ArtifactInventory.js +6 -14
  17. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  18. package/dist/application/BinarySession.js +41 -13
  19. package/dist/application/BinarySessionComposition.js +0 -11
  20. package/dist/application/BinarySessionOpen.js +2 -1
  21. package/dist/application/BinarySessionRecords.js +5 -93
  22. package/dist/application/BinarySessionStatus.js +5 -16
  23. package/dist/application/BinaryTargetResolver.js +216 -0
  24. package/dist/application/BrowserEvidence.js +42 -58
  25. package/dist/application/BrowserObservationService.js +3 -6
  26. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  27. package/dist/application/BrowserScenarioEvidence.js +3 -3
  28. package/dist/application/CallPathTracing.js +2 -36
  29. package/dist/application/CapabilityInventory.js +10 -15
  30. package/dist/application/ClientConfigurationDocument.js +27 -0
  31. package/dist/application/ClientRegistrationStatus.js +16 -13
  32. package/dist/application/CommandShimReplay.js +14 -1
  33. package/dist/application/DirectAnalysis.js +22 -46
  34. package/dist/application/DirectAnalysisStatus.js +5 -61
  35. package/dist/application/Doctor.js +11 -32
  36. package/dist/application/DoctorDiagnostics.js +1 -2
  37. package/dist/application/DoctorScope.js +1 -1
  38. package/dist/application/ElectronActiveEvidence.js +3 -8
  39. package/dist/application/ElectronActiveObservationService.js +3 -6
  40. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  41. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  42. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  43. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  44. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  45. package/dist/application/ElectronEvidence.js +4 -7
  46. package/dist/application/ElectronObservationService.js +5 -9
  47. package/dist/application/EnhancedLiteralTracing.js +42 -65
  48. package/dist/application/EnhancedTools.js +76 -44
  49. package/dist/application/EvidenceBundleCommands.js +11 -11
  50. package/dist/application/EvidenceBundleFiles.js +9 -15
  51. package/dist/application/EvidenceLedger.js +6 -41
  52. package/dist/application/FilesystemSnapshot.js +2 -3
  53. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  54. package/dist/application/InventoryProjectionEvidence.js +4 -2
  55. package/dist/application/InvestigationProviders.js +1 -1
  56. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  57. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  58. package/dist/application/JavaScriptApplicationService.js +6 -29
  59. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  60. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  61. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  62. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  63. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  64. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  65. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  66. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  67. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  68. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  69. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  70. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  71. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  72. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  73. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  74. package/dist/application/JavaScriptJsonModules.js +2 -2
  75. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  76. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  77. package/dist/application/JavaScriptReplayService.js +6 -32
  78. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  79. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  80. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  81. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  82. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  83. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  84. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  85. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  86. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  87. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  88. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  89. package/dist/application/JsonFiles.js +79 -0
  90. package/dist/application/LinuxHopper.js +11 -9
  91. package/dist/application/LoopbackReplay.js +26 -23
  92. package/dist/application/LoopbackReplayRecorder.js +29 -1
  93. package/dist/application/ManagedApplicationGraphService.js +1 -2
  94. package/dist/application/ManagedMemberComparisonService.js +11 -41
  95. package/dist/application/ManagedNativeVerificationService.js +1 -2
  96. package/dist/application/ManagedReconstructionService.js +1 -1
  97. package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
  98. package/dist/application/NativeApiInspection.js +2 -7
  99. package/dist/application/NativeUiActionTrace.js +394 -0
  100. package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
  101. package/dist/application/PermissionAuthority.js +15 -7
  102. package/dist/application/PermissionFailure.js +5 -0
  103. package/dist/application/ProcessCaptureAuthority.js +5 -7
  104. package/dist/application/ProcessCaptureJournal.js +3 -2
  105. package/dist/application/ProcessCaptureLifecycle.js +5 -12
  106. package/dist/application/ProcessCheckpoints.js +29 -11
  107. package/dist/application/ProcessCli.js +6 -16
  108. package/dist/application/ProcessEvidence.js +5 -7
  109. package/dist/application/ProcessHarness.js +52 -17
  110. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  111. package/dist/application/ProcessReactiveEffects.js +9 -3
  112. package/dist/application/ProcessReactiveHarness.js +13 -7
  113. package/dist/application/ProcessSampling.js +2 -4
  114. package/dist/application/ProcessTimer.js +39 -0
  115. package/dist/application/ProjectPermissionStore.js +39 -96
  116. package/dist/application/RealHopperAssertions.js +20 -66
  117. package/dist/application/ReconstructionCoverageService.js +12 -58
  118. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  119. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  120. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  121. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  122. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  123. package/dist/application/ReferenceSourceImport.js +19 -45
  124. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  125. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  126. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  127. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  128. package/dist/application/SessionProviderRouter.js +2 -2
  129. package/dist/application/Setup.js +1 -3
  130. package/dist/application/SetupClientConfiguration.js +22 -93
  131. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  132. package/dist/application/StoreFileLock.js +119 -0
  133. package/dist/application/TerminalRenderer.js +2 -3
  134. package/dist/application/Uninstall.js +9 -14
  135. package/dist/application/UnknownEvidence.js +1 -1
  136. package/dist/artifacts/ArtifactPaths.js +2 -5
  137. package/dist/artifacts/ArtifactProvider.js +36 -58
  138. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  139. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  140. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  141. package/dist/artifacts/NibArchive.js +269 -0
  142. package/dist/artifacts/SafeOutputTree.js +15 -24
  143. package/dist/browser/BrowserProcessStartup.js +1 -2
  144. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  145. package/dist/browser/CdpBrowserProvider.js +3 -13
  146. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  147. package/dist/browser/CdpCaptureDocuments.js +28 -76
  148. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  149. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  150. package/dist/browser/CdpCaptureEvents.js +2 -8
  151. package/dist/browser/CdpCaptureStorage.js +9 -20
  152. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
  153. package/dist/browser/CdpCaptureValues.js +21 -21
  154. package/dist/browser/CdpConnection.js +10 -25
  155. package/dist/browser/CdpElectronInspection.js +26 -50
  156. package/dist/browser/CdpElectronProvider.js +10 -35
  157. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  158. package/dist/browser/CdpElectronScripts.js +6 -35
  159. package/dist/browser/CdpElectronWorkers.js +6 -10
  160. package/dist/browser/CdpEndpoint.js +25 -41
  161. package/dist/browser/CdpObservationSession.js +14 -26
  162. package/dist/browser/CdpPageCapture.js +34 -48
  163. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  164. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  165. package/dist/browser/CdpSafeMetadata.js +19 -22
  166. package/dist/browser/CdpScreenshot.js +3 -5
  167. package/dist/browser/CdpTargetSession.js +1 -2
  168. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  169. package/dist/browser/ElectronFileScope.js +8 -19
  170. package/dist/browser/JavaScriptRuntimeScope.js +9 -14
  171. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  172. package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
  174. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  175. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  176. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  177. package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
  178. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  179. package/dist/browser/PlaywrightScenarioSession.js +14 -30
  180. package/dist/browser/PngVisualDiff.js +22 -14
  181. package/dist/browser/SensitiveTextCapture.js +0 -17
  182. package/dist/browser/V8InspectorCaptureProjection.js +7 -8
  183. package/dist/browser/V8InspectorEndpoint.js +12 -14
  184. package/dist/browser/V8InspectorProvider.js +20 -61
  185. package/dist/browser/WebSourceMapFetcher.js +56 -176
  186. package/dist/catalogIdentity.js +0 -54
  187. package/dist/cli/artifactCommands.js +49 -77
  188. package/dist/cli/coreAnalysisCommands.js +83 -133
  189. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  190. package/dist/cli/managedCommands.js +5 -270
  191. package/dist/cli/setupCommands.js +3 -12
  192. package/dist/cli/utilityCommands.js +7 -41
  193. package/dist/cli.js +0 -2
  194. package/dist/cliApplicationCommands.js +42 -112
  195. package/dist/cliBrowserAdvancedCommands.js +10 -106
  196. package/dist/cliBrowserCommands.js +15 -127
  197. package/dist/cliBrowserContext.js +30 -0
  198. package/dist/cliCommandNames.js +4 -5
  199. package/dist/cliElectronCommands.js +8 -72
  200. package/dist/cliEvidenceCommands.js +8 -77
  201. package/dist/cliJavaScriptRuntimeCommands.js +9 -91
  202. package/dist/cliJsonInput.js +4 -14
  203. package/dist/cliObservationOptions.js +11 -96
  204. package/dist/cliPolicyCommands.js +2 -17
  205. package/dist/cliProcessCommands.js +3 -3
  206. package/dist/cliSetup.js +0 -13
  207. package/dist/config/browserScenario.js +2 -2
  208. package/dist/config/environment.js +0 -9
  209. package/dist/config/parseConfig.js +1 -33
  210. package/dist/config/parsers.js +6 -27
  211. package/dist/config/passiveObservation.js +7 -77
  212. package/dist/config/permissions.js +0 -7
  213. package/dist/contracts/analysisSearchContract.js +2 -5
  214. package/dist/contracts/applicationToolContracts.js +56 -109
  215. package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
  216. package/dist/contracts/artifactComparisonExample.js +58 -60
  217. package/dist/contracts/artifactToolContracts.js +20 -67
  218. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  219. package/dist/contracts/browserToolContracts.js +8 -73
  220. package/dist/contracts/electronToolContracts.js +8 -108
  221. package/dist/contracts/enhancedInputs.js +23 -54
  222. package/dist/contracts/errorSchemas.js +0 -1
  223. package/dist/contracts/functionComparisonExample.js +10 -24
  224. package/dist/contracts/functionInstructionContract.js +1 -3
  225. package/dist/contracts/functionWorkflowToolContracts.js +2 -2
  226. package/dist/contracts/hopperMemoryContracts.js +3 -3
  227. package/dist/contracts/investigationExamples.js +14 -11
  228. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  229. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  230. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  231. package/dist/contracts/managedToolContracts.js +6 -95
  232. package/dist/contracts/managedWorkflowExamples.js +77 -128
  233. package/dist/contracts/managedWorkflowToolContracts.js +51 -77
  234. package/dist/contracts/nativeToolContracts.js +7 -11
  235. package/dist/contracts/processCaptureExample.js +2 -69
  236. package/dist/contracts/promptContracts.js +49 -67
  237. package/dist/contracts/providerSelection.js +0 -1
  238. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  239. package/dist/contracts/sessionStatusContract.js +1 -17
  240. package/dist/contracts/sessionToolSchemas.js +6 -15
  241. package/dist/contracts/toolContractExamples.js +11 -11
  242. package/dist/contracts/toolContractHelpers.js +0 -4
  243. package/dist/contracts/toolContracts.js +60 -71
  244. package/dist/contracts/toolEffects.js +5 -13
  245. package/dist/contracts/toolOutputSchemaGroups.js +37 -91
  246. package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
  247. package/dist/contracts/toolSchemaMetadata.js +8 -19
  248. package/dist/contracts/unknownContractExamples.js +0 -2
  249. package/dist/domain/analysisErrorPresentation.js +46 -54
  250. package/dist/domain/analysisErrorProjection.js +28 -37
  251. package/dist/domain/analysisProfile.js +3 -31
  252. package/dist/domain/analysisSnapshot.js +3 -12
  253. package/dist/domain/androidApplication.js +15 -54
  254. package/dist/domain/appleApplication.js +24 -67
  255. package/dist/domain/artifactComparison.js +11 -29
  256. package/dist/domain/artifactGraph.js +14 -44
  257. package/dist/domain/artifactInspection.js +38 -69
  258. package/dist/domain/artifactInventoryEvidence.js +27 -21
  259. package/dist/domain/binaryTarget.js +2 -221
  260. package/dist/domain/browserCaptureComparison.js +47 -24
  261. package/dist/domain/browserObservation.js +28 -193
  262. package/dist/domain/browserObservationSchemas.js +5 -23
  263. package/dist/domain/browserScenario.js +11 -14
  264. package/dist/domain/browserScenarioCapture.js +11 -12
  265. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  266. package/dist/domain/browserScenarioDiff.js +2 -59
  267. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  268. package/dist/domain/browserScenarioDiffValues.js +21 -38
  269. package/dist/domain/browserScenarioValues.js +80 -109
  270. package/dist/domain/browserSession.js +4 -7
  271. package/dist/domain/bundleComparison.js +6 -32
  272. package/dist/domain/bytecodeProvider.js +20 -19
  273. package/dist/domain/callPath.js +47 -167
  274. package/dist/domain/callPathSchemas.js +79 -0
  275. package/dist/domain/changedBehavior.js +34 -60
  276. package/dist/domain/completionLedgerGeneration.js +8 -14
  277. package/dist/domain/conformancePackage.js +126 -97
  278. package/dist/domain/conformanceReplay.js +36 -8
  279. package/dist/domain/conformanceTrustGate.js +23 -14
  280. package/dist/domain/customProtocolCapture.js +1 -1
  281. package/dist/domain/electronActiveObservation.js +70 -103
  282. package/dist/domain/electronObservation.js +14 -80
  283. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  284. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  285. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  286. package/dist/domain/electronStaticAnalysisValues.js +10 -17
  287. package/dist/domain/errors.js +33 -54
  288. package/dist/domain/eventProcessTree.js +20 -12
  289. package/dist/domain/evidence.js +2 -10
  290. package/dist/domain/evidenceBundle.js +3 -5
  291. package/dist/domain/evidenceCompletionLedger.js +6 -8
  292. package/dist/domain/functionComparison.js +4 -14
  293. package/dist/domain/functionComparisonNormalization.js +4 -11
  294. package/dist/domain/functionComparisonResults.js +25 -15
  295. package/dist/domain/functionComparisonSchemas.js +49 -33
  296. package/dist/domain/functionDossierEvidence.js +31 -156
  297. package/dist/domain/hopperStartupFailure.js +1 -1
  298. package/dist/domain/hopperValues.js +15 -136
  299. package/dist/domain/interfaceBuilderGraph.js +654 -0
  300. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  301. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  302. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  303. package/dist/domain/javascriptApplicationGraph.js +3 -13
  304. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  305. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  306. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  307. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  308. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  309. package/dist/domain/javascriptAstFingerprint.js +25 -58
  310. package/dist/domain/javascriptAstValues.js +9 -0
  311. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  312. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  313. package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
  314. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  315. package/dist/domain/javascriptFeatureSeed.js +20 -12
  316. package/dist/domain/javascriptFeatureTrace.js +13 -67
  317. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  318. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  319. package/dist/domain/javascriptNativeHandoff.js +1 -1
  320. package/dist/domain/javascriptReplay.js +24 -41
  321. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  322. package/dist/domain/javascriptRuntimeObservation.js +42 -103
  323. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  324. package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
  325. package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
  326. package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
  327. package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
  328. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
  329. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  330. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
  331. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  332. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  333. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  334. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  335. package/dist/domain/javascriptSemanticCalls.js +5 -32
  336. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  337. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  338. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  339. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  340. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  341. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  342. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  343. package/dist/domain/javascriptSemanticIr.js +1 -29
  344. package/dist/domain/javascriptSemanticObjects.js +1 -5
  345. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  346. package/dist/domain/javascriptSemanticProjection.js +0 -18
  347. package/dist/domain/javascriptSemanticPromises.js +9 -16
  348. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  349. package/dist/domain/javascriptSemanticQuery.js +17 -139
  350. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  351. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  352. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  353. package/dist/domain/javascriptSemanticResources.js +1 -6
  354. package/dist/domain/javascriptSemanticReturns.js +10 -27
  355. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  356. package/dist/domain/javascriptSemanticValues.js +44 -62
  357. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  358. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  359. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  360. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  361. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  362. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  363. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  364. package/dist/domain/jsonShape.js +7 -33
  365. package/dist/domain/localPath.js +7 -0
  366. package/dist/domain/managedApplicationGraph.js +9 -41
  367. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  368. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  369. package/dist/domain/managedArtifact.js +14 -27
  370. package/dist/domain/managedMemberComparison.js +90 -92
  371. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  372. package/dist/domain/managedMemberComparisonItems.js +221 -0
  373. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  374. package/dist/domain/managedNativeVerification.js +3 -6
  375. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  376. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  377. package/dist/domain/managedReconstruction.js +19 -23
  378. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  379. package/dist/domain/nativeApiBoundary.js +2 -7
  380. package/dist/domain/nativeInspection.js +0 -2
  381. package/dist/domain/nativeInvestigationGraph.js +351 -0
  382. package/dist/domain/nativeValueFlow.js +61 -0
  383. package/dist/domain/nodeRuntimeCharacterization.js +1 -5
  384. package/dist/domain/objcSwiftMetadata.js +254 -0
  385. package/dist/domain/peInspection.js +1 -1
  386. package/dist/domain/permissionPolicy.js +13 -0
  387. package/dist/domain/processCapture.js +76 -113
  388. package/dist/domain/processCaptureExample.js +68 -0
  389. package/dist/domain/processCaptureParsing.js +21 -0
  390. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  391. package/dist/domain/processCaptureValidation.js +1 -7
  392. package/dist/domain/processComparison.js +3 -12
  393. package/dist/domain/processReactiveMatching.js +29 -50
  394. package/dist/domain/processReactiveRuntime.js +4 -8
  395. package/dist/domain/processReactiveScenario.js +28 -94
  396. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  397. package/dist/domain/processReactiveTransition.js +33 -18
  398. package/dist/domain/processScenario.js +56 -90
  399. package/dist/domain/processTraceComparison.js +0 -8
  400. package/dist/domain/processTraceEvaluation.js +14 -4
  401. package/dist/domain/processTraceSpecification.js +11 -17
  402. package/dist/domain/protocolCapture.js +3 -3
  403. package/dist/domain/reconstructionCoverage.js +62 -129
  404. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  405. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  406. package/dist/domain/reconstructionReadiness.js +1 -2
  407. package/dist/domain/reconstructionReadinessSchemas.js +36 -38
  408. package/dist/domain/reconstructionUnknowns.js +3 -3
  409. package/dist/domain/reconstructionVerification.js +13 -47
  410. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  411. package/dist/domain/referenceSourceGraph.js +53 -61
  412. package/dist/domain/referenceSourceImportParsing.js +1 -5
  413. package/dist/domain/replayMachine.js +19 -31
  414. package/dist/domain/replayMachineRun.js +15 -63
  415. package/dist/domain/replayMachineRuntime.js +41 -41
  416. package/dist/domain/replayMachineValues.js +84 -0
  417. package/dist/domain/residualUnknown.js +25 -30
  418. package/dist/domain/runtimeCharacterization.js +15 -16
  419. package/dist/domain/runtimeIdentification.js +48 -47
  420. package/dist/domain/sourceToBundleComparison.js +9 -85
  421. package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
  422. package/dist/domain/sourceToBundleSignals.js +4 -15
  423. package/dist/domain/staticRuntimeCorrelation.js +37 -49
  424. package/dist/domain/symbolAnalysis.js +10 -19
  425. package/dist/domain/unicodeCodePointOrder.js +12 -0
  426. package/dist/domain/webBundleAnalysis.js +70 -99
  427. package/dist/domain/webBundleAnalyzer.js +2 -4
  428. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  429. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  430. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  431. package/dist/domain/webCaptureDiff.js +33 -73
  432. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  433. package/dist/domain/webContentArtifact.js +1 -10
  434. package/dist/domain/webMcpDiscovery.js +3 -14
  435. package/dist/domain/webScreenshot.js +58 -34
  436. package/dist/domain/zipPackageFormat.js +7 -0
  437. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  438. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  439. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  440. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  441. package/dist/dotnet/ManagedMemberRows.js +16 -16
  442. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  443. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  444. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  445. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  446. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  447. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  448. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
  449. package/dist/dotnet/ManagedPeReader.js +2 -2
  450. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  451. package/dist/generatedMcpToolCatalog.js +1 -1
  452. package/dist/generatedPackageMetadata.js +1 -1
  453. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  454. package/dist/ghidra/GhidraClient.js +4 -12
  455. package/dist/ghidra/GhidraClientWire.js +9 -5
  456. package/dist/ghidra/GhidraDefaults.js +0 -18
  457. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  458. package/dist/ghidra/GhidraDoctor.js +16 -12
  459. package/dist/ghidra/GhidraFunctionValues.js +65 -108
  460. package/dist/ghidra/GhidraInstallation.js +98 -42
  461. package/dist/ghidra/GhidraInventoryValues.js +16 -85
  462. package/dist/ghidra/GhidraLauncher.js +0 -8
  463. package/dist/ghidra/GhidraProvider.js +15 -22
  464. package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
  465. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  466. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  467. package/dist/ghidra/GhidraSessionValues.js +0 -2
  468. package/dist/ghidra/GhidraTransport.js +4 -7
  469. package/dist/ghidra/protocol.js +2 -2
  470. package/dist/hopper/BridgeLauncher.js +112 -36
  471. package/dist/hopper/HopperAnalysisProfile.js +1 -1
  472. package/dist/hopper/HopperCleanup.js +6 -3
  473. package/dist/hopper/HopperClient.js +4 -7
  474. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  475. package/dist/hopper/HopperProvider.js +0 -16
  476. package/dist/hopper/HopperRequestQueue.js +21 -40
  477. package/dist/hopper/HopperResponseStream.js +1 -9
  478. package/dist/hopper/HopperSessionValues.js +3 -2
  479. package/dist/hopper/HopperTargetLease.js +119 -0
  480. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  481. package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
  482. package/dist/hopper/protocol.js +6 -4
  483. package/dist/main/reload.js +0 -3
  484. package/dist/main/shutdown.js +1 -1
  485. package/dist/main/state.js +0 -9
  486. package/dist/main/transport.js +0 -5
  487. package/dist/mcpDoctor.js +25 -45
  488. package/dist/native/CommandRunner.js +18 -25
  489. package/dist/native/NativeMacOSProvider.js +13 -38
  490. package/dist/native/NativeMachoInspection.js +1 -1
  491. package/dist/process/BoundedFileBytes.js +17 -0
  492. package/dist/process/ExecFileOutput.js +11 -0
  493. package/dist/process/PendingOperations.js +8 -6
  494. package/dist/process/ProcessOwnership.js +3 -2
  495. package/dist/process/ProcessOwnershipObservation.js +0 -1
  496. package/dist/process/ProviderProcess.js +7 -28
  497. package/dist/reference/ReferenceSourceReader.js +8 -24
  498. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  499. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  500. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  501. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  502. package/dist/replay/JavaScriptReplayWorker.js +3 -5
  503. package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
  504. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  505. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  506. package/dist/replay/ReplayOutcome.js +1 -3
  507. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  508. package/dist/replay/ReplaySeccompFile.js +29 -0
  509. package/dist/replay/ReplayWorkerProtocol.js +0 -2
  510. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  511. package/dist/server/ProcessCaptureElicitation.js +4 -8
  512. package/dist/server/createServer.js +6 -44
  513. package/dist/server/promptCompletion.js +37 -61
  514. package/dist/server/recordDerivedEvidence.js +1 -1
  515. package/dist/server/registerApplicationTools/characterization.js +4 -8
  516. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
  517. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
  518. package/dist/server/registerApplicationTools/compareVersions.js +5 -10
  519. package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
  520. package/dist/server/registerApplicationTools/coverage.js +6 -71
  521. package/dist/server/registerApplicationTools/helpers.js +1 -13
  522. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  523. package/dist/server/registerApplicationTools/traceFeature.js +5 -9
  524. package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
  525. package/dist/server/registerApplicationTools.js +0 -2
  526. package/dist/server/registerArtifactComparisonTool.js +23 -27
  527. package/dist/server/registerBrowserScenarioTool.js +4 -4
  528. package/dist/server/registerBrowserTools.js +5 -8
  529. package/dist/server/registerBundleComparisonTool.js +5 -7
  530. package/dist/server/registerCloseLifecycleTool.js +2 -16
  531. package/dist/server/registerElectronTools.js +10 -29
  532. package/dist/server/registerEnhancedTools.js +10 -11
  533. package/dist/server/registerEvidenceTools.js +15 -22
  534. package/dist/server/registerFunctionComparisonTool.js +30 -25
  535. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  536. package/dist/server/registerInvestigationTools.js +20 -116
  537. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
  538. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
  539. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  540. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  541. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  542. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
  543. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
  544. package/dist/server/registerOfficialTools.js +1 -43
  545. package/dist/server/registerProcessComparisonTool.js +33 -23
  546. package/dist/server/registerPrompts.js +19 -17
  547. package/dist/server/registerSessionRecordTools.js +10 -156
  548. package/dist/server/registerSessionStatusTool.js +6 -69
  549. package/dist/server/registerSessionTools.js +10 -51
  550. package/dist/server/sessionAvailabilityPolicy.js +0 -2
  551. package/dist/server/sessionEvidence.js +9 -15
  552. package/dist/server/sessionToolPolicies.js +0 -8
  553. package/dist/server/toolResult.js +14 -50
  554. package/dist/serverIdentity.js +0 -20
  555. package/install.sh +1 -1
  556. package/package.json +11 -7
  557. package/scripts/electron-active-hook.cjs +23 -55
  558. package/scripts/hopper-demo-x11.py +13 -32
  559. package/skills/reverse-engineer-anything/SKILL.md +47 -12
  560. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  561. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  562. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  563. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
  564. package/dist/application/BoundedJsonFiles.js +0 -86
  565. package/dist/application/CrossVersionInventory.js +0 -129
  566. package/dist/application/CrossVersionInvestigation.js +0 -301
  567. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  568. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  569. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  570. package/dist/application/DeferredFileAuthorization.js +0 -61
  571. package/dist/application/DoctorProjection.js +0 -43
  572. package/dist/application/EnhancedToolPagination.js +0 -22
  573. package/dist/application/EvidenceReferenceResolver.js +0 -26
  574. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  575. package/dist/application/ProcessPairedExperiment.js +0 -72
  576. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  577. package/dist/application/ReconstructionReadinessService.js +0 -48
  578. package/dist/cliInvestigationCommands.js +0 -173
  579. package/dist/domain/boundedCartesianProjection.js +0 -15
  580. package/dist/domain/investigationWorkspace.js +0 -347
  581. package/dist/domain/jsonLimits.js +0 -26
  582. package/dist/domain/knownPageCoverage.js +0 -29
  583. package/dist/domain/processPairedExperiment.js +0 -128
  584. package/dist/server/javascriptApplicationResult.js +0 -106
  585. package/dist/server/permissionFailure.js +0 -12
  586. package/dist/server/registerApplicationTools/readiness.js +0 -50
  587. package/dist/server/registerEvidenceResources.js +0 -315
  588. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  589. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  590. package/dist/server/registerReconstructionReadinessResource.js +0 -32
@@ -1,4 +1,5 @@
1
1
  import { snapshotRoots } from "./FilesystemSnapshot.js";
2
+ import { scheduleProcessDelay } from "./ProcessTimer.js";
2
3
  /** Classify path-stable filesystem effects between two bounded states. */
3
4
  export const classifyFilesystemEffects = (before, after) => {
4
5
  const beforeByPath = new Map(before.map((file) => [file.path, file]));
@@ -8,14 +9,31 @@ export const classifyFilesystemEffects = (before, after) => {
8
9
  .map((path) => {
9
10
  const beforeFile = beforeByPath.get(path) ?? null;
10
11
  const afterFile = afterByPath.get(path) ?? null;
11
- const status = beforeFile === null
12
- ? "created"
13
- : afterFile === null
14
- ? "deleted"
15
- : JSON.stringify(beforeFile) === JSON.stringify(afterFile)
16
- ? "unchanged"
17
- : "modified";
18
- return { path, status, before: beforeFile, after: afterFile };
12
+ if (beforeFile === null) {
13
+ if (afterFile === null)
14
+ throw new TypeError(`Filesystem effect ${path} has no file state`);
15
+ return {
16
+ path,
17
+ status: "created",
18
+ before: null,
19
+ after: afterFile,
20
+ };
21
+ }
22
+ if (afterFile === null)
23
+ return {
24
+ path,
25
+ status: "deleted",
26
+ before: beforeFile,
27
+ after: null,
28
+ };
29
+ return {
30
+ path,
31
+ status: JSON.stringify(beforeFile) === JSON.stringify(afterFile)
32
+ ? "unchanged"
33
+ : "modified",
34
+ before: beforeFile,
35
+ after: afterFile,
36
+ };
19
37
  });
20
38
  };
21
39
  /** Coordinates named lifecycle filesystem observations without overlapping scans. */
@@ -47,7 +65,7 @@ export class ProcessCheckpoints {
47
65
  for (const checkpoint of scenario.checkpoints) {
48
66
  if (checkpoint.trigger.type !== "time")
49
67
  continue;
50
- const timer = setTimeout(() => this.capture(checkpoint.name), checkpoint.trigger.at_ms);
68
+ const timer = scheduleProcessDelay(checkpoint.trigger.at_ms, () => this.capture(checkpoint.name));
51
69
  this.#timers.add(timer);
52
70
  }
53
71
  }
@@ -124,7 +142,7 @@ export class ProcessCheckpoints {
124
142
  /** Finish pending snapshots and return them in observation order. */
125
143
  async finish(after) {
126
144
  for (const timer of this.#timers)
127
- clearTimeout(timer);
145
+ timer.cancel();
128
146
  await this.#pending;
129
147
  const previous = this.#captures.at(-1)?.files ?? [];
130
148
  const index = this.#captures.length;
@@ -141,7 +159,7 @@ export class ProcessCheckpoints {
141
159
  /** Cancel scheduled captures and await any snapshot already in progress. */
142
160
  async dispose() {
143
161
  for (const timer of this.#timers)
144
- clearTimeout(timer);
162
+ timer.cancel();
145
163
  this.#timers.clear();
146
164
  await this.#pending;
147
165
  }
@@ -1,16 +1,16 @@
1
+ import { projectPermissionFailure } from "./PermissionFailure.js";
1
2
  import { readFile } from "node:fs/promises";
2
3
  import { parseConfig } from "../config.js";
3
- import { AnalysisError, AnalysisInputError, AnalysisProtocolError, PermissionRequiredError, projectAnalysisError, } from "../domain/errors.js";
4
+ import { AnalysisError, AnalysisInputError, projectAnalysisError, } from "../domain/errors.js";
4
5
  import { createEvidence, parseEvidence } from "../domain/evidence.js";
5
6
  import { jsonValueSchema } from "../domain/jsonValue.js";
6
7
  import { projectInputIssues } from "../domain/inputIssueProjection.js";
7
8
  import { processTraceSpecificationSchema } from "../domain/processTraceComparison.js";
8
- import { compareProcessCaptures, LEGACY_PROCESS_CAPTURE_MESSAGE, parseProcessScenario, parseProcessCapture, } from "../domain/processCapture.js";
9
+ import { compareProcessCaptures, parseProcessScenario, parseProcessCapture, } from "../domain/processCapture.js";
9
10
  import { captureProcessScenario } from "./ProcessHarness.js";
10
11
  import { processCapturePermissionRequest } from "./ProcessCapturePermission.js";
11
12
  import { PROCESS_PROVIDER, createProcessCaptureEvidence, } from "./ProcessEvidence.js";
12
13
  import { loadConfiguredPermissionAuthority } from "./PermissionConfiguration.js";
13
- const MAX_INPUT_BYTES = 64 * 1024 * 1024;
14
14
  /** Capture one JSON scenario through the same policy and evidence contract as MCP. */
15
15
  export const captureProcessScenarioFile = async (path) => {
16
16
  try {
@@ -30,11 +30,7 @@ export const captureProcessScenarioFile = async (path) => {
30
30
  return cliAnalysisError(authority.error);
31
31
  const authorized = await authority.value.authorize(processCapturePermissionRequest(scenario), "read");
32
32
  if (!authorized.ok)
33
- return cliAnalysisError(authorized.error instanceof PermissionRequiredError
34
- ? authorized.error
35
- : new AnalysisProtocolError(authorized.error.message, {
36
- cause: authorized.error,
37
- }));
33
+ return cliAnalysisError(projectPermissionFailure(authorized.error));
38
34
  const captured = await captureProcessScenario(scenario, config.value.processExecutionPolicy);
39
35
  if (!captured.ok)
40
36
  return cliAnalysisError(captured.error);
@@ -58,9 +54,7 @@ export const compareProcessEvidenceFiles = async (leftPath, rightPath, traceSpec
58
54
  traceSpecification,
59
55
  });
60
56
  return createEvidence(undefined, PROCESS_PROVIDER, {
61
- predicateType: traceSpecification === undefined
62
- ? "rea.process-comparison/v3"
63
- : "rea.process-comparison/v4",
57
+ predicateType: "rea.process-comparison",
64
58
  operation: "compare_process_captures",
65
59
  parameters: {
66
60
  left_evidence_id: left.id,
@@ -92,11 +86,9 @@ const parseCaptureEvidence = (input) => {
92
86
  throw invalidCaptureEvidence();
93
87
  }
94
88
  if (evidence.operation !== "capture_process_scenario" ||
95
- evidence.predicate_type !== "rea.process-capture/v4" ||
89
+ evidence.predicate_type !== "rea.process-capture" ||
96
90
  evidence.provider.id !== PROCESS_PROVIDER.id ||
97
91
  evidence.provider.version !== PROCESS_PROVIDER.version) {
98
- if (evidence.predicate_type === "rea.process-capture/v3")
99
- throw new ProcessCliFailure("invalid_input", LEGACY_PROCESS_CAPTURE_MESSAGE);
100
92
  throw new ProcessCliFailure("invalid_input", "Capture evidence is not from the current process-capture workflow. Create new capture evidence, then try again.");
101
93
  }
102
94
  try {
@@ -125,8 +117,6 @@ const readJson = async (path) => {
125
117
  catch {
126
118
  throw new ProcessCliFailure("invalid_input", "Process input file could not be read. Check that the path exists and is readable.");
127
119
  }
128
- if (bytes.length > MAX_INPUT_BYTES)
129
- throw new ProcessCliFailure("truncated", "Process input file is too large. Reduce it below 64 MiB, then try again.");
130
120
  try {
131
121
  const parsed = JSON.parse(bytes.toString("utf8"));
132
122
  return parsed;
@@ -1,7 +1,6 @@
1
1
  import { createEvidence } from "../domain/evidence.js";
2
2
  import { jsonValueSchema } from "../domain/jsonValue.js";
3
- import { parseProcessCapture } from "../domain/processCapture.js";
4
- /** Provider identity for controlled Process Capture v4 evidence. */
3
+ /** Provider identity for controlled process capture evidence. */
5
4
  export const PROCESS_PROVIDER = {
6
5
  id: "rea-process",
7
6
  name: "REA deterministic process harness",
@@ -17,14 +16,13 @@ const processEvidenceParameters = (scenario) => ({
17
16
  command_shim_count: scenario.command_shims.length,
18
17
  normalization: scenario.normalization,
19
18
  });
20
- /** Create one canonical observed Process Capture v4 Evidence record. */
19
+ /** Create one canonical observed process capture Evidence record. */
21
20
  export const createProcessCaptureEvidence = (scenario, capture) => {
22
- const validatedCapture = parseProcessCapture(capture);
23
21
  return createEvidence(undefined, PROCESS_PROVIDER, {
24
- predicateType: "rea.process-capture/v4",
22
+ predicateType: "rea.process-capture",
25
23
  operation: "capture_process_scenario",
26
24
  parameters: processEvidenceParameters(scenario),
27
- result: jsonValueSchema.parse(validatedCapture),
25
+ result: jsonValueSchema.parse(capture),
28
26
  confidence: "observed",
29
27
  authority: "controlled-replay",
30
28
  environment: {
@@ -33,6 +31,6 @@ export const createProcessCaptureEvidence = (scenario, capture) => {
33
31
  architecture: process.arch,
34
32
  isolation: "process",
35
33
  },
36
- limitations: validatedCapture.limitations,
34
+ limitations: capture.limitations,
37
35
  });
38
36
  };
@@ -1,4 +1,4 @@
1
- import { validateProcessCapture } from "../domain/processCapture.js";
1
+ import { parseProcessCapture } from "../domain/processCapture.js";
2
2
  import { err, ok } from "../domain/result.js";
3
3
  import { ProcessCaptureError, processCaptureCancelled, } from "./ProcessCaptureError.js";
4
4
  export { ProcessCaptureError } from "./ProcessCaptureError.js";
@@ -33,11 +33,35 @@ const createTerminalRenderer = (scenario, temporaryRoot, terminalPid, recordEven
33
33
  columns: scenario.terminal.columns,
34
34
  rows: scenario.terminal.rows,
35
35
  scrollback: scenario.terminal.scrollback,
36
- maxFrames: scenario.limits.frames,
37
36
  maxBytes: scenario.limits.output_bytes,
38
37
  normalize: (value) => normalizeProcessText(value, scenario, temporaryRoot, terminalPid()),
39
38
  recordEvent,
40
39
  });
40
+ /**
41
+ * Wait until the capture journal stops growing.
42
+ *
43
+ * node-pty reports buffered output through `onData` callbacks rather than an
44
+ * awaitable read, so chunks can still be in flight after the child exits. The
45
+ * quiet interval is measured in elapsed time rather than scheduler turns:
46
+ * consecutive `setImmediate` turns elapse in microseconds, so any fixed number
47
+ * of them finishes long before a delayed pty callback under host contention,
48
+ * which is exactly when the trailing chunk matters. `maxWaitMs` bounds the
49
+ * total wait so a pathological stream cannot stall exit.
50
+ */
51
+ const settleTrailingJournal = async (journal, quietMs = 25, maxWaitMs = 500) => {
52
+ const deadline = Date.now() + maxWaitMs;
53
+ let observed = journal.length;
54
+ let lastChangeAt = Date.now();
55
+ while (Date.now() < deadline) {
56
+ await new Promise((resolve) => setTimeout(resolve, 4));
57
+ if (journal.length !== observed) {
58
+ observed = journal.length;
59
+ lastChangeAt = Date.now();
60
+ }
61
+ else if (Date.now() - lastChangeAt >= quietMs)
62
+ return;
63
+ }
64
+ };
41
65
  const reactiveCapture = (options, protocolEvents) => ({
42
66
  ...options,
43
67
  processSamples: options.samples,
@@ -154,24 +178,28 @@ const finishProcessRun = async (options) => {
154
178
  });
155
179
  await options.runtime?.reactive?.coordinator.close();
156
180
  let { capture, executionFailure } = options;
157
- if (capture !== undefined) {
158
- capture = {
181
+ let verifiedCapture;
182
+ if (capture !== undefined && cleanupFailure === undefined) {
183
+ const settlement = capture.settlement.state === "quiesced"
184
+ ? { ...capture.settlement, cleanup_outcome: "not_required" }
185
+ : { ...capture.settlement, cleanup_outcome: "cleaned" };
186
+ const completedCapture = {
159
187
  ...capture,
160
188
  reactive_run: projectProcessReactiveRun(options.runtime?.reactive),
161
- settlement: {
162
- ...capture.settlement,
163
- cleanup_outcome: capture.settlement.state === "quiesced"
164
- ? "not_required"
165
- : cleanupFailure === undefined
166
- ? "cleaned"
167
- : "failed",
189
+ settlement,
190
+ cleanup: {
191
+ owned_process_group: "verified",
192
+ temporary_root: "removed",
168
193
  },
169
194
  };
170
- const issue = validateProcessCapture(capture)[0];
171
- if (issue !== undefined)
172
- executionFailure = new ProcessCaptureError(`process capture validation failed: ${issue.path}: ${issue.message}`);
195
+ try {
196
+ verifiedCapture = parseProcessCapture(completedCapture);
197
+ }
198
+ catch (cause) {
199
+ executionFailure = new ProcessCaptureError(`process capture validation failed${cause instanceof Error ? `: ${cause.message}` : ""}`, { cause });
200
+ }
173
201
  }
174
- return resolveProcessResult(capture, executionFailure, cleanupFailure);
202
+ return resolveProcessResult(verifiedCapture, executionFailure, cleanupFailure);
175
203
  };
176
204
  const completeCapture = async (options) => {
177
205
  const { runtime, scenario } = options;
@@ -192,6 +220,14 @@ const completeCapture = async (options) => {
192
220
  // during settlement after the PTY exits. Make target loss terminal only
193
221
  // after that journal has drained, otherwise the coordinator's control
194
222
  // priority discards a valid multi-source completion predicate.
223
+ //
224
+ // Draining the coordinator is not sufficient on its own: node-pty delivers
225
+ // buffered output through onData callbacks, which run outside the
226
+ // coordinator's queue. A trailing chunk that has not been delivered yet has
227
+ // produced no journal entry, so the drain has nothing to wait for and the
228
+ // target is declared lost while a terminal trigger is still satisfiable.
229
+ // Let any trailing chunks land first.
230
+ await settleTrailingJournal(options.eventJournal);
195
231
  await runtime.reactive.coordinator.drain();
196
232
  await runtime.reactive.coordinator.submit({ kind: "target_lost" });
197
233
  runtime.reactive.unsubscribe();
@@ -215,7 +251,6 @@ const completeCapture = async (options) => {
215
251
  exit: { ...options.exit, reason },
216
252
  samples: options.samples,
217
253
  replay: runtime.replay,
218
- reactiveRun: projectProcessReactiveRun(runtime.reactive),
219
254
  before: options.before,
220
255
  after,
221
256
  truncated,
@@ -226,7 +261,7 @@ const completeCapture = async (options) => {
226
261
  interactions: options.interactions,
227
262
  checkpoints,
228
263
  shimEvents: normalizedShimEvents(runtime, scenario, options.temporaryRoot),
229
- settlement: { ...settlement, cleanup_outcome: "not_required" },
264
+ settlement,
230
265
  manifest,
231
266
  eventJournal: options.eventJournal,
232
267
  });
@@ -1,9 +1,7 @@
1
1
  import { commitProcessReactiveProposal, createProcessReactiveSnapshot, reduceProcessReactiveScenario, } from "../domain/processReactiveRuntime.js";
2
+ import { scheduleProcessDelay } from "./ProcessTimer.js";
2
3
  const systemTimerHost = {
3
- schedule: (callback, delayMs) => {
4
- const timer = setTimeout(callback, delayMs);
5
- return { cancel: () => clearTimeout(timer) };
6
- },
4
+ schedule: (callback, delayMs) => scheduleProcessDelay(delayMs, callback),
7
5
  };
8
6
  /**
9
7
  * Serializes live observations, deadlines, and effect commits for one run.
@@ -1,4 +1,5 @@
1
1
  import { createProcessObservation } from "../domain/processObservation.js";
2
+ import { normalizeProcessElapsedTime } from "./ProcessNormalization.js";
2
3
  const elapsed = (host) => Math.max(0, host.now() - host.startedAtMs);
3
4
  const interactionData = (action) => {
4
5
  if (action.type === "send_input")
@@ -20,12 +21,17 @@ const interactionType = (action) => {
20
21
  return "stdin_close";
21
22
  return "signal";
22
23
  };
23
- const performTerminalAction = (terminal, renderer, action, atMs) => {
24
+ const performTerminalAction = (host, terminal, action, atMs) => {
24
25
  if (action.type === "send_input")
25
26
  terminal.write(action.data);
26
27
  else if (action.type === "resize") {
27
28
  terminal.resize(action.columns, action.rows);
28
- renderer.resize(action.columns, action.rows, atMs);
29
+ // Rendered frames share the normalized clock used by captured terminal
30
+ // frames and by the scheduled-event resize path. Passing the raw elapsed
31
+ // time here stamped this frame on a different clock, so the next bucketed
32
+ // frame could appear to move backwards and fail capture validation with
33
+ // "rendered_frames: timestamps must be ordered".
34
+ host.renderer.resize(action.columns, action.rows, normalizeProcessElapsedTime(atMs, host.timeBucketMs));
29
35
  }
30
36
  else if (action.type === "close_stdin")
31
37
  terminal.closeInput();
@@ -67,7 +73,7 @@ const executeTerminalAction = (host, action) => {
67
73
  const atMs = elapsed(host);
68
74
  let outcome = "dispatched";
69
75
  try {
70
- performTerminalAction(terminal, host.renderer, action, atMs);
76
+ performTerminalAction(host, terminal, action, atMs);
71
77
  }
72
78
  catch {
73
79
  outcome = "failed";
@@ -49,6 +49,7 @@ export const startProcessReactiveHarness = (options) => {
49
49
  journal: options.capture.journal,
50
50
  startedAtMs: options.started,
51
51
  now: Date.now,
52
+ timeBucketMs: options.scenario.normalization.time_bucket_ms,
52
53
  }, actions, signal),
53
54
  },
54
55
  onDecision: (decision, input) => {
@@ -89,12 +90,17 @@ export const startProcessReactiveHarness = (options) => {
89
90
  };
90
91
  };
91
92
  /** Project internal reducer state into the stable Process Capture shape. */
92
- export const projectProcessReactiveRun = (harness) => harness === undefined
93
- ? null
94
- : {
95
- status: harness.coordinator.snapshot.status,
96
- outcome: harness.coordinator.snapshot.outcome,
97
- active_state: harness.coordinator.snapshot.active_state,
98
- transitions: harness.coordinator.snapshot.transitions,
93
+ export const projectProcessReactiveRun = (harness) => {
94
+ if (harness === undefined)
95
+ return null;
96
+ const snapshot = harness.coordinator.snapshot;
97
+ const completion = snapshot.status === "running"
98
+ ? { status: snapshot.status, outcome: null }
99
+ : { status: snapshot.status, outcome: snapshot.outcome };
100
+ return {
101
+ ...completion,
102
+ active_state: snapshot.active_state,
103
+ transitions: snapshot.transitions,
99
104
  controls: harness.controls,
100
105
  };
106
+ };
@@ -1,8 +1,6 @@
1
- import { execFile } from "node:child_process";
2
1
  import { readFile, readdir } from "node:fs/promises";
3
- import { promisify } from "node:util";
2
+ import { execFileOutput } from "../process/ExecFileOutput.js";
4
3
  import { readProcessRunId } from "../process/ProcessOwnership.js";
5
- const execFileAsync = promisify(execFile);
6
4
  const PROC_READ_CONCURRENCY = 64;
7
5
  /** Prove that forkpty completed session setup and installed the run token. */
8
6
  export const isInitializedPtyRoot = (options) => {
@@ -210,7 +208,7 @@ const sampleLinux = async (context) => {
210
208
  return rows;
211
209
  };
212
210
  const readPsRows = async (signal) => {
213
- const { stdout } = await execFileAsync("ps", ["-axo", "pid=,ppid=,pgid=,sess=,command="], { signal });
211
+ const { stdout } = await execFileOutput("ps", ["-axo", "pid=,ppid=,pgid=,sess=,command="], { signal });
214
212
  return stdout
215
213
  .split("\n")
216
214
  .map((line) => /\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(.*)/u.exec(line))
@@ -0,0 +1,39 @@
1
+ const systemTimerScheduler = (callback, delayMs) => {
2
+ const timer = setTimeout(callback, delayMs);
3
+ return { cancel: () => clearTimeout(timer) };
4
+ };
5
+ /** Schedule a delay using consecutive Node timers without shortening long waits. */
6
+ export const scheduleProcessDelay = (delayMs, callback, schedule = systemTimerScheduler) => {
7
+ if (!Number.isSafeInteger(delayMs) || delayMs < 0)
8
+ throw new RangeError("Process delay must be a nonnegative safe integer");
9
+ const maximumTimerDelay = 2_147_483_647;
10
+ let remaining = delayMs;
11
+ let timer;
12
+ let cancelled = false;
13
+ const scheduleNext = () => {
14
+ if (cancelled)
15
+ return;
16
+ const interval = Math.min(remaining, maximumTimerDelay);
17
+ timer = schedule(() => {
18
+ if (cancelled)
19
+ return;
20
+ remaining -= interval;
21
+ if (remaining === 0)
22
+ callback();
23
+ else
24
+ scheduleNext();
25
+ }, interval);
26
+ };
27
+ scheduleNext();
28
+ return {
29
+ cancel: () => {
30
+ cancelled = true;
31
+ timer?.cancel();
32
+ },
33
+ };
34
+ };
35
+ /** Create an owned interval that shares process-capture cancellation handling. */
36
+ export const scheduleProcessInterval = (callback, intervalMs) => {
37
+ const timer = setInterval(callback, intervalMs);
38
+ return { cancel: () => clearInterval(timer) };
39
+ };
@@ -1,32 +1,16 @@
1
+ import { createStoreFileLock, removeStaleStoreFileLock, } from "./StoreFileLock.js";
1
2
  import { createHash } from "node:crypto";
2
3
  import { constants } from "node:fs";
3
- import { lstat, mkdir, open, readFile, realpath, unlink, } from "node:fs/promises";
4
+ import { lstat, mkdir, open, realpath, } from "node:fs/promises";
4
5
  import { dirname } from "node:path";
5
6
  import { setTimeout as delay } from "node:timers/promises";
6
7
  import writeFileAtomic from "write-file-atomic";
7
8
  import { z } from "zod";
9
+ import { PERMISSION_CAPABILITIES, } from "../domain/permissionPolicy.js";
8
10
  import { err, ok } from "../domain/result.js";
9
11
  const grantSchema = z.object({
10
12
  grant_id: z.string().min(1),
11
- capability: z.enum([
12
- "process_capture",
13
- "browser_observe",
14
- "browser_automate",
15
- "electron_observe",
16
- "electron_automate",
17
- "evidence_read",
18
- "evidence_write",
19
- "investigation_input",
20
- "investigation_workspace_read",
21
- "investigation_workspace_write",
22
- "snapshot_read",
23
- "snapshot_write",
24
- "artifact_extract",
25
- "native_mount",
26
- "reference_read",
27
- "javascript_replay",
28
- "managed_runtime",
29
- ]),
13
+ capability: z.enum(PERMISSION_CAPABILITIES),
30
14
  roots: z.array(z.string()),
31
15
  executables: z.array(z.string()),
32
16
  environment_names: z.array(z.string()),
@@ -38,10 +22,9 @@ const grantSchema = z.object({
38
22
  expires_at: z.iso.datetime().nullable(),
39
23
  });
40
24
  const storeSchema = z.object({
41
- schema_version: z.literal(1),
42
25
  project_id: z.string().regex(/^project_[a-f0-9]{64}$/u),
43
26
  project_root: z.string(),
44
- grants: z.array(grantSchema).max(1_000),
27
+ grants: z.array(grantSchema),
45
28
  });
46
29
  /** Owner-only project policy persistence failure. */
47
30
  export class ProjectPermissionStoreError extends Error {
@@ -110,7 +93,6 @@ export const writeProjectPermissionStore = async (path, projectRoot, grants) =>
110
93
  if (!project.ok)
111
94
  return project;
112
95
  const candidate = storeSchema.safeParse({
113
- schema_version: 1,
114
96
  project_id: project.value.id,
115
97
  project_root: project.value.root,
116
98
  grants,
@@ -119,26 +101,38 @@ export const writeProjectPermissionStore = async (path, projectRoot, grants) =>
119
101
  return err(new ProjectPermissionStoreError("invalid", { cause: candidate.error }));
120
102
  if (process.getuid === undefined)
121
103
  return err(new ProjectPermissionStoreError("not_owner_only"));
122
- try {
123
- await mkdir(dirname(path), { recursive: true, mode: 0o700 });
124
- await writeFileAtomic(path, `${JSON.stringify(candidate.data, null, 2)}\n`, {
125
- encoding: "utf8",
126
- mode: 0o600,
127
- });
128
- const verified = await readProjectPermissionStore(path, projectRoot);
129
- if (!verified.ok)
130
- return verified;
131
- if (verified.value === null ||
132
- JSON.stringify(verified.value) !== JSON.stringify(candidate.data))
133
- return err(new ProjectPermissionStoreError("invalid"));
134
- return ok(candidate.data);
135
- }
136
- catch (cause) {
137
- return err(new ProjectPermissionStoreError("io", { cause }));
138
- }
104
+ return withPermissionStoreLock(path, () => writePreparedPermissionStore(path, projectRoot, candidate.data));
105
+ };
106
+ const writePreparedPermissionStore = async (path, projectRoot, candidate) => {
107
+ await writeFileAtomic(path, `${JSON.stringify(candidate, null, 2)}\n`, {
108
+ encoding: "utf8",
109
+ mode: 0o600,
110
+ });
111
+ const verified = await readProjectPermissionStore(path, projectRoot);
112
+ if (!verified.ok)
113
+ return verified;
114
+ if (verified.value === null ||
115
+ JSON.stringify(verified.value) !== JSON.stringify(candidate))
116
+ return err(new ProjectPermissionStoreError("invalid"));
117
+ return ok(candidate);
139
118
  };
140
119
  /** Revoke one grant while serializing the complete read-modify-write cycle. */
141
- export const revokeProjectPermissionGrant = async (path, projectRoot, grantId) => {
120
+ export const revokeProjectPermissionGrant = async (path, projectRoot, grantId) => withPermissionStoreLock(path, async () => {
121
+ const current = await readProjectPermissionStore(path, projectRoot);
122
+ if (!current.ok)
123
+ return current;
124
+ if (current.value === null)
125
+ return ok(false);
126
+ const retained = current.value.grants.filter(({ grant_id }) => grant_id !== grantId);
127
+ if (retained.length === current.value.grants.length)
128
+ return ok(false);
129
+ const written = await writePreparedPermissionStore(path, projectRoot, {
130
+ ...current.value,
131
+ grants: retained,
132
+ });
133
+ return written.ok ? ok(true) : written;
134
+ });
135
+ const withPermissionStoreLock = async (path, action) => {
142
136
  let lock;
143
137
  try {
144
138
  await mkdir(dirname(path), { recursive: true, mode: 0o700 });
@@ -146,34 +140,26 @@ export const revokeProjectPermissionGrant = async (path, projectRoot, grantId) =
146
140
  if (!acquired.ok)
147
141
  return acquired;
148
142
  lock = acquired.value;
149
- const current = await readProjectPermissionStore(path, projectRoot);
150
- if (!current.ok)
151
- return current;
152
- const grants = current.value?.grants ?? [];
153
- const retained = grants.filter(({ grant_id }) => grant_id !== grantId);
154
- if (retained.length === grants.length)
155
- return ok(false);
156
- const written = await writeProjectPermissionStore(path, projectRoot, retained);
157
- return written.ok ? ok(true) : written;
143
+ return await action();
158
144
  }
159
145
  catch (cause) {
160
146
  return err(new ProjectPermissionStoreError("io", { cause }));
161
147
  }
162
148
  finally {
163
149
  if (lock !== undefined)
164
- await releasePermissionStoreLock(lock);
150
+ await lock.release();
165
151
  }
166
152
  };
167
153
  const acquirePermissionStoreLock = async (destination) => {
168
154
  const path = `${destination}.lock`;
169
155
  for (let attempt = 0; attempt < 100; attempt += 1) {
170
156
  try {
171
- return ok(await createPermissionStoreLock(path));
157
+ return ok(await createStoreFileLock(path));
172
158
  }
173
159
  catch (cause) {
174
160
  if (!isAlreadyExists(cause))
175
161
  return err(new ProjectPermissionStoreError("io", { cause }));
176
- if (await removeStalePermissionStoreLock(path))
162
+ if (await removeStaleStoreFileLock(path))
177
163
  continue;
178
164
  if (attempt === 99)
179
165
  return err(new ProjectPermissionStoreError("locked", { cause }));
@@ -182,49 +168,6 @@ const acquirePermissionStoreLock = async (destination) => {
182
168
  }
183
169
  return err(new ProjectPermissionStoreError("locked"));
184
170
  };
185
- const createPermissionStoreLock = async (path) => {
186
- const handle = await open(path, "wx", 0o600);
187
- try {
188
- await handle.writeFile(`${String(process.pid)}\n`, "utf8");
189
- await handle.sync();
190
- return { path, handle };
191
- }
192
- catch (cause) {
193
- await handle.close().catch(() => undefined);
194
- await unlink(path).catch(() => undefined);
195
- throw cause;
196
- }
197
- };
198
- const removeStalePermissionStoreLock = async (path) => {
199
- try {
200
- const metadata = await lstat(path);
201
- if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > 32)
202
- return false;
203
- const encoded = (await readFile(path, "utf8")).trim();
204
- if (!/^[1-9][0-9]{0,9}$/u.test(encoded))
205
- return false;
206
- if (processIsAlive(Number(encoded)))
207
- return false;
208
- await unlink(path);
209
- return true;
210
- }
211
- catch {
212
- return false;
213
- }
214
- };
215
- const processIsAlive = (pid) => {
216
- try {
217
- process.kill(pid, 0);
218
- return true;
219
- }
220
- catch (cause) {
221
- return errorCode(cause) !== "ESRCH";
222
- }
223
- };
224
- const releasePermissionStoreLock = async (lock) => {
225
- await lock.handle.close().catch(() => undefined);
226
- await unlink(lock.path).catch(() => undefined);
227
- };
228
171
  const isNotFound = (cause) => errorCode(cause) === "ENOENT";
229
172
  const openPrivateStore = async (path) => {
230
173
  let handle;