rea-agents 3.1.0 → 3.2.1

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
@@ -86,12 +86,6 @@ const validateLifecycle = (capture, require) => {
86
86
  require(capture.exit.reason === "exited" ||
87
87
  capture.exit.code ===
88
88
  null, "exit", "deadline termination cannot declare a normal exit code");
89
- require(capture.settlement.state !== "quiesced" ||
90
- capture.settlement.cleanup_outcome ===
91
- "not_required", "settlement.cleanup_outcome", "quiesced settlement cannot require cleanup");
92
- require(capture.settlement.state === "quiesced" ||
93
- capture.settlement.cleanup_outcome !==
94
- "not_required", "settlement.cleanup_outcome", "non-quiesced settlement must report cleanup");
95
89
  };
96
90
  const shimPlans = (capture) => capture.manifest.shim_plan.flatMap((shim) => typeof shim === "object" &&
97
91
  shim !== null &&
@@ -202,7 +196,7 @@ const validateReplayEvents = (capture, require) => {
202
196
  }
203
197
  };
204
198
  /** Recompute v4 commitments and cross-field invariants without side effects. */
205
- export const validateProcessCapture = (capture) => {
199
+ export const collectProcessCaptureIssues = (capture) => {
206
200
  const issues = [];
207
201
  const require = (condition, path, message) => {
208
202
  if (!condition)
@@ -1,6 +1,5 @@
1
1
  import canonicalize from "canonicalize";
2
2
  import { z } from "zod";
3
- import { validateProcessCapture } from "./processCapture.js";
4
3
  import { jsonValueSchema } from "./jsonValue.js";
5
4
  import { compareProcessTraces, processTraceOutcomesDiffer, processTraceComparisonResultSchema, } from "./processTraceComparison.js";
6
5
  import { dimensionsForTraceSources, traceCoversObservedDimension, } from "./processTraceDimensionProjection.js";
@@ -169,16 +168,8 @@ const chooseFirstDivergence = (candidates) => {
169
168
  })[0] ?? { status: "none" });
170
169
  };
171
170
  const assertComparable = (left, right, options) => {
172
- const invalid = [
173
- ...validateProcessCapture(left),
174
- ...validateProcessCapture(right),
175
- ];
176
- const firstInvalid = invalid.at(0);
177
- if (firstInvalid !== undefined)
178
- throw new TypeError(`Invalid Process Capture v4: ${firstInvalid.path}`);
179
- if (left.schema_version !== right.schema_version ||
180
- left.manifest.comparison_contract_sha256 !==
181
- right.manifest.comparison_contract_sha256)
171
+ if (left.manifest.comparison_contract_sha256 !==
172
+ right.manifest.comparison_contract_sha256)
182
173
  throw new TypeError("Process captures have incompatible comparison contracts");
183
174
  if (options.maxCaptureAgeMs === undefined)
184
175
  return;
@@ -255,7 +246,7 @@ const compareDimensions = (left, right, sameNormalization) => {
255
246
  };
256
247
  };
257
248
  /**
258
- * Compare two Process Capture v4 observations without treating absence as proof.
249
+ * Compare two process capture observations without treating absence as proof.
259
250
  *
260
251
  * Observed differences outrank residual unknowns. A capture may therefore be
261
252
  * definitively changed in one dimension while completeness remains unknown.
@@ -1,18 +1,10 @@
1
1
  import canonicalize from "canonicalize";
2
2
  import { comparableProcessObservationPayload } from "./processObservation.js";
3
- import { PROCESS_REACTIVE_LIMITS, } from "./processReactiveScenario.js";
4
- const spendEvaluationWork = (budget, units) => {
5
- if (units > budget.remaining)
6
- return false;
7
- budget.remaining -= units;
8
- return true;
9
- };
10
- const noMatch = (overflow = false) => ({
11
- matched: false,
3
+ const noMatch = () => ({
12
4
  eventIds: [],
13
5
  consumeIds: [],
14
6
  lastOrder: -1,
15
- overflow,
7
+ matched: false,
16
8
  });
17
9
  const frontierOrder = (frontier, snapshot) => {
18
10
  switch (frontier.kind) {
@@ -47,8 +39,6 @@ const matchEvent = (trigger, context) => {
47
39
  const expected = canonicalJson(comparableProcessObservationPayload(trigger.exact, trigger.ignore_fields));
48
40
  const matches = [];
49
41
  for (const observation of eligibleObservations(trigger.since, context)) {
50
- if (!spendEvaluationWork(context.budget, 1))
51
- return noMatch(true);
52
42
  if (observation.source === trigger.source &&
53
43
  canonicalJson(comparableProcessObservationPayload(observation.payload, trigger.ignore_fields)) === expected)
54
44
  matches.push(observation);
@@ -58,11 +48,10 @@ const matchEvent = (trigger, context) => {
58
48
  return noMatch();
59
49
  const eventIds = matches.map(({ event_id }) => event_id);
60
50
  return {
61
- matched: true,
62
51
  eventIds,
63
52
  consumeIds: trigger.consume ? eventIds : [],
64
53
  lastOrder: matches.at(-1)?.capture_order ?? context.afterOrder,
65
- overflow: false,
54
+ matched: true,
66
55
  };
67
56
  };
68
57
  const occurrenceRange = (haystack, needle, occurrence) => {
@@ -79,8 +68,6 @@ const occurrenceRange = (haystack, needle, occurrence) => {
79
68
  const matchTerminalText = (trigger, context) => {
80
69
  const chunks = [];
81
70
  for (const observation of eligibleObservations(trigger.since, context)) {
82
- if (!spendEvaluationWork(context.budget, 1))
83
- return noMatch(true);
84
71
  if (observation.source === "terminal_raw" &&
85
72
  typeof observation.payload === "object" &&
86
73
  observation.payload !== null &&
@@ -88,16 +75,6 @@ const matchTerminalText = (trigger, context) => {
88
75
  typeof observation.payload["data"] === "string")
89
76
  chunks.push({ observation, text: observation.payload["data"] });
90
77
  }
91
- let rawBytes = 0;
92
- for (const { text } of chunks) {
93
- if (text.length > PROCESS_REACTIVE_LIMITS.terminalMatchBytes)
94
- return noMatch(true);
95
- const bytes = Buffer.byteLength(text);
96
- rawBytes += bytes;
97
- if (rawBytes > PROCESS_REACTIVE_LIMITS.terminalMatchBytes ||
98
- !spendEvaluationWork(context.budget, bytes))
99
- return noMatch(true);
100
- }
101
78
  const range = occurrenceRange(chunks.map(({ text }) => text).join(""), trigger.literal, trigger.occurrence);
102
79
  if (range === null)
103
80
  return noMatch();
@@ -118,26 +95,31 @@ const matchTerminalText = (trigger, context) => {
118
95
  .map(({ observation }) => observation);
119
96
  const eventIds = matched.map(({ event_id }) => event_id);
120
97
  return {
121
- matched: true,
122
98
  eventIds,
123
99
  consumeIds: trigger.consume ? eventIds : [],
124
100
  lastOrder: matched.at(-1)?.capture_order ?? context.afterOrder,
125
- overflow: false,
101
+ matched: true,
126
102
  };
127
103
  };
128
104
  const mergeMatches = (matches) => {
129
- const base = {
130
- eventIds: [...new Set(matches.flatMap(({ eventIds }) => eventIds))],
131
- consumeIds: [...new Set(matches.flatMap(({ consumeIds }) => consumeIds))],
132
- lastOrder: Math.max(-1, ...matches.map(({ lastOrder }) => lastOrder)),
105
+ const eventIds = new Set();
106
+ const consumeIds = new Set();
107
+ let lastOrder = -1;
108
+ let matched = true;
109
+ for (const match of matches) {
110
+ for (const eventId of match.eventIds)
111
+ eventIds.add(eventId);
112
+ for (const eventId of match.consumeIds)
113
+ consumeIds.add(eventId);
114
+ lastOrder = Math.max(lastOrder, match.lastOrder);
115
+ matched &&= match.matched;
116
+ }
117
+ return {
118
+ eventIds: [...eventIds],
119
+ consumeIds: [...consumeIds],
120
+ lastOrder,
121
+ matched,
133
122
  };
134
- return matches.every(({ matched }) => matched)
135
- ? { ...base, matched: true, overflow: false }
136
- : {
137
- ...base,
138
- matched: false,
139
- overflow: matches.some(({ overflow }) => overflow),
140
- };
141
123
  };
142
124
  const matchEarliestPrefix = (trigger, context) => {
143
125
  for (const observation of context.snapshot.observations) {
@@ -150,7 +132,7 @@ const matchEarliestPrefix = (trigger, context) => {
150
132
  ...context,
151
133
  upperOrder: observation.capture_order,
152
134
  });
153
- if (matched.matched || matched.overflow)
135
+ if (matched.matched)
154
136
  return matched;
155
137
  }
156
138
  return noMatch();
@@ -165,9 +147,7 @@ const matchTrigger = (trigger, context) => {
165
147
  if (trigger.kind === "any") {
166
148
  const evaluated = trigger.triggers.map((child) => matchTrigger(child, context));
167
149
  const matches = evaluated.filter(({ matched }) => matched);
168
- return matches.length === 0
169
- ? noMatch(evaluated.some(({ overflow }) => overflow))
170
- : mergeMatches(matches);
150
+ return matches.length === 0 ? noMatch() : mergeMatches(matches);
171
151
  }
172
152
  if (trigger.kind === "sequence") {
173
153
  const matches = [];
@@ -178,7 +158,7 @@ const matchTrigger = (trigger, context) => {
178
158
  afterOrder: cursor,
179
159
  });
180
160
  if (!matched.matched)
181
- return noMatch(matched.overflow);
161
+ return noMatch();
182
162
  matches.push(matched);
183
163
  cursor = matched.lastOrder;
184
164
  }
@@ -201,17 +181,16 @@ const matchTrigger = (trigger, context) => {
201
181
  ...context,
202
182
  afterOrder: cursor,
203
183
  });
204
- if (excess.matched || excess.overflow)
205
- return noMatch(excess.overflow);
184
+ if (excess.matched)
185
+ return noMatch();
206
186
  }
207
187
  if (matches.length < trigger.min)
208
- return noMatch(matches.some(({ overflow }) => overflow));
188
+ return noMatch();
209
189
  return mergeMatches(matches);
210
190
  };
211
- /** Match one trigger using a shared deterministic work budget. */
212
- export const matchProcessReactiveTrigger = (trigger, snapshot, budget) => matchTrigger(trigger, {
191
+ /** Match one trigger against every eligible retained observation. */
192
+ export const matchProcessReactiveTrigger = (trigger, snapshot) => matchTrigger(trigger, {
213
193
  snapshot,
214
- budget,
215
194
  afterOrder: -1,
216
195
  upperOrder: null,
217
196
  });
@@ -1,5 +1,5 @@
1
1
  import { matchProcessReactiveTrigger } from "./processReactiveMatching.js";
2
- import { PROCESS_REACTIVE_LIMITS, } from "./processReactiveScenario.js";
2
+ import {} from "./processReactiveScenario.js";
3
3
  export { commitProcessReactiveProposal } from "./processReactiveTransition.js";
4
4
  const counterValue = (counters, id) => counters.find((counter) => counter.id === id)?.count ?? 0;
5
5
  const observeInput = (snapshot, observation) => {
@@ -7,8 +7,7 @@ const observeInput = (snapshot, observation) => {
7
7
  if (duplicate !== undefined)
8
8
  return { kind: "invalid" };
9
9
  const prior = snapshot.observations.at(-1);
10
- if ((prior !== undefined && observation.capture_order <= prior.capture_order) ||
11
- snapshot.observations.length >= PROCESS_REACTIVE_LIMITS.retainedObservations)
10
+ if (prior !== undefined && observation.capture_order <= prior.capture_order)
12
11
  return { kind: "invalid" };
13
12
  return {
14
13
  kind: "new",
@@ -69,14 +68,11 @@ export const reduceProcessReactiveScenario = (scenario, snapshot, input) => {
69
68
  const state = scenario.states.find(({ id }) => id === observed.active_state);
70
69
  if (state === undefined)
71
70
  return finishedDecision(observed, "target_lost");
72
- const budget = { remaining: PROCESS_REACTIVE_LIMITS.evaluationWork };
73
71
  const matches = state.on.map((transition) => ({
74
72
  transition,
75
- match: matchProcessReactiveTrigger(transition.when, observed, budget),
73
+ match: matchProcessReactiveTrigger(transition.when, observed),
76
74
  uses: counterValue(observed.transition_uses, transition.id),
77
75
  }));
78
- if (matches.some(({ match }) => match.overflow))
79
- return finishedDecision(observed, "capture_incomplete");
80
76
  const evaluations = matches.map(({ transition, match, uses }) => ({
81
77
  transition_id: transition.id,
82
78
  status: uses >= transition.max_uses
@@ -89,7 +85,7 @@ export const reduceProcessReactiveScenario = (scenario, snapshot, input) => {
89
85
  const eligible = matches.filter(({ transition, match, uses }) => match.matched && uses < transition.max_uses);
90
86
  if (eligible.length === 0)
91
87
  return { kind: "waiting", snapshot: observed, evaluations };
92
- const minimumPriority = Math.min(...eligible.map(({ transition }) => transition.priority));
88
+ const minimumPriority = eligible.reduce((minimum, { transition }) => Math.min(minimum, transition.priority), Number.POSITIVE_INFINITY);
93
89
  const winners = eligible.filter(({ transition }) => transition.priority === minimumPriority);
94
90
  if (winners.length !== 1)
95
91
  return finishedDecision(observed, "ambiguous_match", evaluations);
@@ -3,34 +3,15 @@ import { jsonValueSchema } from "./jsonValue.js";
3
3
  import { processObservationSourceSchema } from "./processObservation.js";
4
4
  import { definitelyAvailableCheckpoints } from "./processReactiveCheckpointDataflow.js";
5
5
  import { preflightProcessReactiveScenario } from "./processReactiveScenarioPreflight.js";
6
- /** Fixed public bounds for Process Reactive Scenario v1. */
6
+ /** Structural depth guard for recursive Zod parsing. */
7
7
  export const PROCESS_REACTIVE_LIMITS = {
8
- states: 32,
9
- transitions: 128,
10
- triggerDepth: 6,
11
- predicates: 64,
12
- actions: 256,
13
- actionsPerTransition: 16,
14
- childrenPerComposite: 16,
15
- stateVisits: 256,
16
- transitionUses: 256,
17
- repeat: 64,
18
- retainedObservations: 256,
19
- terminalMatchBytes: 65_536,
20
- evaluationWork: 8_192,
21
- jsonDepth: 20,
22
- jsonNodes: 1_024,
23
- runtimeMs: 300_000,
8
+ // Recursive Zod schemas need a practical stack guard, not a small tree quota.
9
+ triggerDepth: 256,
10
+ jsonDepth: 256,
24
11
  };
25
- const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]{0,63}$/u);
26
- const checkpointNameSchema = z
27
- .string()
28
- .regex(/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/u);
29
- const positiveRuntime = z
30
- .number()
31
- .int()
32
- .positive()
33
- .max(PROCESS_REACTIVE_LIMITS.runtimeMs);
12
+ const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
13
+ const checkpointNameSchema = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_-]*$/u);
14
+ const positiveRuntime = z.number().int().safe().positive();
34
15
  const frontierSchema = z.discriminatedUnion("kind", [
35
16
  z.strictObject({ kind: z.literal("scenario_start") }),
36
17
  z.strictObject({ kind: z.literal("state_entry") }),
@@ -51,7 +32,6 @@ const processReactiveTriggerSchema = z.lazy(() => z.discriminatedUnion("kind", [
51
32
  exact: jsonValueSchema,
52
33
  ignore_fields: z
53
34
  .array(ignoredFieldSchema)
54
- .max(5)
55
35
  .refine((values) => new Set(values).size === values.length, {
56
36
  message: "ignored event fields must be unique",
57
37
  }),
@@ -59,8 +39,8 @@ const processReactiveTriggerSchema = z.lazy(() => z.discriminatedUnion("kind", [
59
39
  consume: z.boolean(),
60
40
  cardinality: z
61
41
  .strictObject({
62
- min: z.number().int().positive().max(256),
63
- max: z.number().int().positive().max(256),
42
+ min: z.number().int().safe().positive(),
43
+ max: z.number().int().safe().positive(),
64
44
  })
65
45
  .refine(({ min, max }) => min <= max, {
66
46
  message: "cardinality min must not exceed max",
@@ -70,40 +50,31 @@ const processReactiveTriggerSchema = z.lazy(() => z.discriminatedUnion("kind", [
70
50
  kind: z.literal("terminal_text"),
71
51
  view: z.literal("decoded"),
72
52
  encoding: z.literal("utf8"),
73
- literal: z.string().min(1).max(10_000),
53
+ literal: z.string().min(1),
74
54
  case_sensitive: z.literal(true),
75
55
  control_sequences: z.literal("include"),
76
- occurrence: z.number().int().positive().max(1_000),
56
+ occurrence: z.number().int().safe().positive(),
77
57
  since: frontierSchema,
78
58
  consume: z.boolean(),
79
59
  }),
80
60
  z.strictObject({
81
61
  kind: z.literal("all"),
82
- triggers: z
83
- .array(processReactiveTriggerSchema)
84
- .min(2)
85
- .max(PROCESS_REACTIVE_LIMITS.childrenPerComposite),
62
+ triggers: z.array(processReactiveTriggerSchema).min(2),
86
63
  }),
87
64
  z.strictObject({
88
65
  kind: z.literal("any"),
89
- triggers: z
90
- .array(processReactiveTriggerSchema)
91
- .min(2)
92
- .max(PROCESS_REACTIVE_LIMITS.childrenPerComposite),
66
+ triggers: z.array(processReactiveTriggerSchema).min(2),
93
67
  }),
94
68
  z.strictObject({
95
69
  kind: z.literal("sequence"),
96
- triggers: z
97
- .array(processReactiveTriggerSchema)
98
- .min(1)
99
- .max(PROCESS_REACTIVE_LIMITS.childrenPerComposite),
70
+ triggers: z.array(processReactiveTriggerSchema).min(1),
100
71
  }),
101
72
  z
102
73
  .strictObject({
103
74
  kind: z.literal("repeat"),
104
75
  trigger: processReactiveTriggerSchema,
105
- min: z.number().int().positive().max(PROCESS_REACTIVE_LIMITS.repeat),
106
- max: z.number().int().positive().max(PROCESS_REACTIVE_LIMITS.repeat),
76
+ min: z.number().int().safe().positive(),
77
+ max: z.number().int().safe().positive(),
107
78
  })
108
79
  .refine(({ min, max }) => min <= max, {
109
80
  message: "repeat min must not exceed max",
@@ -120,13 +91,13 @@ const signalTargetSchema = z.discriminatedUnion("kind", [
120
91
  const processReactiveActionSchema = z.discriminatedUnion("type", [
121
92
  z.strictObject({
122
93
  type: z.literal("send_input"),
123
- data: z.string().max(1_000_000),
94
+ data: z.string(),
124
95
  sensitive: z.boolean(),
125
96
  }),
126
97
  z.strictObject({
127
98
  type: z.literal("resize"),
128
- columns: z.number().int().min(1).max(1_000),
129
- rows: z.number().int().min(1).max(1_000),
99
+ columns: z.number().int().positive(),
100
+ rows: z.number().int().positive(),
130
101
  }),
131
102
  z.strictObject({ type: z.literal("close_stdin") }),
132
103
  z.strictObject({
@@ -142,42 +113,30 @@ const transitionTargetSchema = z.discriminatedUnion("kind", [
142
113
  ]);
143
114
  const transitionSchema = z.strictObject({
144
115
  id: identifierSchema,
145
- priority: z.number().int().min(0).max(1_000),
146
- max_uses: z
147
- .number()
148
- .int()
149
- .positive()
150
- .max(PROCESS_REACTIVE_LIMITS.transitionUses),
116
+ priority: z.number().int().safe().min(0),
117
+ max_uses: z.number().int().safe().positive(),
151
118
  when: processReactiveTriggerSchema,
152
- actions: z
153
- .array(processReactiveActionSchema)
154
- .max(PROCESS_REACTIVE_LIMITS.actionsPerTransition),
119
+ actions: z.array(processReactiveActionSchema),
155
120
  target: transitionTargetSchema,
156
121
  });
157
122
  const stateSchema = z.strictObject({
158
123
  id: identifierSchema,
159
- max_visits: z
160
- .number()
161
- .int()
162
- .positive()
163
- .max(PROCESS_REACTIVE_LIMITS.stateVisits),
124
+ max_visits: z.number().int().safe().positive(),
164
125
  deadline_ms: positiveRuntime,
165
- on: z.array(transitionSchema).min(1).max(128),
126
+ on: z.array(transitionSchema).min(1),
166
127
  });
167
128
  const scenarioShapeSchema = z.strictObject({
168
- version: z.literal(1),
169
129
  initial_state: identifierSchema,
170
130
  deadline_ms: positiveRuntime,
171
- states: z.array(stateSchema).min(1).max(PROCESS_REACTIVE_LIMITS.states),
131
+ states: z.array(stateSchema).min(1),
172
132
  });
173
133
  const measureTrigger = (trigger) => {
174
134
  if (trigger.kind === "event" || trigger.kind === "terminal_text")
175
- return { depth: 1, predicates: 1 };
135
+ return { depth: 1 };
176
136
  const children = trigger.kind === "repeat" ? [trigger.trigger] : trigger.triggers;
177
137
  const measured = children.map(measureTrigger);
178
138
  return {
179
- depth: 1 + Math.max(...measured.map(({ depth }) => depth)),
180
- predicates: measured.reduce((total, { predicates }) => total + predicates, 0),
139
+ depth: 1 + measured.reduce((maximum, { depth }) => Math.max(maximum, depth), 0),
181
140
  };
182
141
  };
183
142
  const collectCheckpointFrontiers = (trigger) => {
@@ -218,15 +177,12 @@ const validateTriggerSemantics = (trigger, path, context) => {
218
177
  };
219
178
  const validateTransition = (input) => {
220
179
  const { transition, validation, path, context } = input;
221
- validation.transitions += 1;
222
- validation.actions += transition.actions.length;
223
180
  const measured = measureTrigger(transition.when);
224
- validation.predicates += measured.predicates;
225
181
  validateTriggerSemantics(transition.when, [...path, "when"], context);
226
182
  if (measured.depth > PROCESS_REACTIVE_LIMITS.triggerDepth)
227
183
  context.addIssue({
228
184
  code: "custom",
229
- message: "trigger nesting exceeds the v1 limit",
185
+ message: "trigger nesting exceeds the configured limit",
230
186
  path: [...path, "when"],
231
187
  });
232
188
  if (validation.transitionIds.has(transition.id))
@@ -266,25 +222,6 @@ const validateTransition = (input) => {
266
222
  validation.adjacency.get(input.stateId)?.add(transition.target.state);
267
223
  };
268
224
  const validateTotalsAndReferences = (scenario, validation, context) => {
269
- for (const [count, limit, message] of [
270
- [
271
- validation.transitions,
272
- PROCESS_REACTIVE_LIMITS.transitions,
273
- "scenario has too many transitions",
274
- ],
275
- [
276
- validation.predicates,
277
- PROCESS_REACTIVE_LIMITS.predicates,
278
- "scenario has too many predicates",
279
- ],
280
- [
281
- validation.actions,
282
- PROCESS_REACTIVE_LIMITS.actions,
283
- "scenario has too many actions",
284
- ],
285
- ])
286
- if (count > limit)
287
- context.addIssue({ code: "custom", message, path: ["states"] });
288
225
  const available = definitelyAvailableCheckpoints(scenario);
289
226
  for (const reference of validation.checkpointReferences)
290
227
  if (!available.get(reference.stateId)?.has(reference.name))
@@ -335,9 +272,6 @@ const validateScenarioGraph = (scenario, context) => {
335
272
  checkpoints: new Set(),
336
273
  checkpointReferences: [],
337
274
  adjacency: new Map(stateIds.map((id) => [id, new Set()])),
338
- transitions: 0,
339
- predicates: 0,
340
- actions: 0,
341
275
  };
342
276
  for (const [stateIndex, state] of scenario.states.entries()) {
343
277
  if (state.deadline_ms > scenario.deadline_ms)
@@ -7,24 +7,18 @@ const reject = (context, message) => {
7
7
  const inspectJsonValue = (value, context, limits) => {
8
8
  const pending = [{ value, depth: 1 }];
9
9
  const seen = new WeakSet();
10
- let nodes = 0;
11
10
  while (pending.length > 0) {
12
11
  const current = pending.pop();
13
12
  if (current === undefined)
14
13
  break;
15
- nodes += 1;
16
- if (nodes > limits.jsonNodes)
17
- return reject(context, "event exact JSON exceeds the v1 node limit");
18
14
  if (current.depth > limits.jsonDepth)
19
- return reject(context, "event exact JSON exceeds the v1 depth limit");
15
+ return reject(context, "event exact JSON exceeds the configured depth limit");
20
16
  if (typeof current.value !== "object" || current.value === null)
21
17
  continue;
22
18
  if (seen.has(current.value))
23
19
  return reject(context, "event exact JSON must not contain cycles");
24
20
  seen.add(current.value);
25
21
  if (Array.isArray(current.value)) {
26
- if (current.value.length + nodes > limits.jsonNodes)
27
- return reject(context, "event exact JSON exceeds the v1 node limit");
28
22
  for (const child of current.value)
29
23
  pending.push({ value: child, depth: current.depth + 1 });
30
24
  continue;
@@ -34,8 +28,6 @@ const inspectJsonValue = (value, context, limits) => {
34
28
  for (const key in current.value) {
35
29
  if (!Object.hasOwn(current.value, key))
36
30
  continue;
37
- if (nodes + pending.length >= limits.jsonNodes)
38
- return reject(context, "event exact JSON exceeds the v1 node limit");
39
31
  pending.push({
40
32
  value: current.value[key],
41
33
  depth: current.depth + 1,
@@ -44,17 +36,11 @@ const inspectJsonValue = (value, context, limits) => {
44
36
  }
45
37
  return true;
46
38
  };
47
- const collectTriggerRoots = (states, context, limits) => {
39
+ const collectTriggerRoots = (states) => {
48
40
  const pending = [];
49
- let transitions = 0;
50
41
  for (const stateValue of states) {
51
42
  if (!isUnknownRecord(stateValue) || !Array.isArray(stateValue["on"]))
52
43
  continue;
53
- transitions += stateValue["on"].length;
54
- if (transitions > limits.transitions) {
55
- reject(context, "scenario has too many transitions");
56
- return null;
57
- }
58
44
  for (const transitionValue of stateValue["on"])
59
45
  if (isUnknownRecord(transitionValue))
60
46
  pending.push({ value: transitionValue["when"], depth: 1 });
@@ -73,24 +59,17 @@ const enqueueTriggerChildren = (trigger, depth, traversal) => {
73
59
  const children = trigger["triggers"];
74
60
  if (!Array.isArray(children))
75
61
  return true;
76
- if (children.length > traversal.limits.childrenPerComposite)
77
- return reject(traversal.context, "trigger group has too many children");
78
62
  for (const child of children)
79
63
  traversal.pending.push({ value: child, depth: depth + 1 });
80
64
  return true;
81
65
  };
82
66
  const inspectTriggerTree = (pending, context, limits) => {
83
- let nodes = 0;
84
- const maximumNodes = limits.predicates * limits.triggerDepth;
85
67
  while (pending.length > 0) {
86
68
  const current = pending.pop();
87
69
  if (current === undefined)
88
70
  break;
89
- nodes += 1;
90
- if (nodes > maximumNodes)
91
- return reject(context, "trigger tree exceeds the v1 limit");
92
71
  if (current.depth > limits.triggerDepth)
93
- return reject(context, "trigger nesting exceeds the v1 limit");
72
+ return reject(context, "trigger nesting exceeds the configured limit");
94
73
  if (isUnknownRecord(current.value) &&
95
74
  current.value["kind"] === "event" &&
96
75
  !inspectJsonValue(current.value["exact"], context, limits))
@@ -109,12 +88,8 @@ const inspectTriggerTree = (pending, context, limits) => {
109
88
  export const preflightProcessReactiveScenario = (input, context, limits) => {
110
89
  if (!isUnknownRecord(input) || !Array.isArray(input["states"]))
111
90
  return input;
112
- if (input["states"].length > limits.states) {
113
- reject(context, "scenario has too many states");
114
- return z.NEVER;
115
- }
116
- const pending = collectTriggerRoots(input["states"], context, limits);
117
- if (pending === null || !inspectTriggerTree(pending, context, limits))
91
+ const pending = collectTriggerRoots(input["states"]);
92
+ if (!inspectTriggerTree(pending, context, limits))
118
93
  return z.NEVER;
119
94
  return input;
120
95
  };
@@ -1,3 +1,24 @@
1
+ const createTransitionRecord = (input) => {
2
+ const state = {
3
+ sequence: input.sequence,
4
+ transition_id: input.transition.id,
5
+ state_before: input.stateBefore,
6
+ trigger_event_ids: input.triggerEventIds,
7
+ action_event_ids: input.effectResults.map(({ observation }) => observation.event_id),
8
+ action_types: input.transition.actions.map(({ type }) => type),
9
+ };
10
+ return input.transition.target.kind === "finish"
11
+ ? {
12
+ ...state,
13
+ state_after: null,
14
+ outcome: input.transition.target.outcome,
15
+ }
16
+ : {
17
+ ...state,
18
+ state_after: input.transition.target.state,
19
+ outcome: null,
20
+ };
21
+ };
1
22
  const counterValue = (counters, id) => counters.find((counter) => counter.id === id)?.count ?? 0;
2
23
  const incrementCounter = (counters, id) => {
3
24
  let found = false;
@@ -13,22 +34,15 @@ const incrementCounter = (counters, id) => {
13
34
  const applyProcessReactiveTransition = (input) => {
14
35
  if (input.effectResults.length !== input.transition.actions.length)
15
36
  throw new TypeError("Reactive transition effects do not match the admitted actions");
16
- const outcome = input.transition.target.kind === "finish"
17
- ? input.transition.target.outcome
18
- : null;
19
- const stateAfter = input.transition.target.kind === "goto"
20
- ? input.transition.target.state
21
- : null;
22
- const record = {
37
+ const record = createTransitionRecord({
23
38
  sequence: input.snapshot.transitions.length,
24
- transition_id: input.transition.id,
25
- state_before: input.snapshot.active_state,
26
- state_after: stateAfter,
27
- outcome,
28
- trigger_event_ids: input.triggerEventIds,
29
- action_event_ids: input.effectResults.map(({ observation }) => observation.event_id),
30
- action_types: input.transition.actions.map(({ type }) => type),
31
- };
39
+ stateBefore: input.snapshot.active_state,
40
+ transition: input.transition,
41
+ triggerEventIds: input.triggerEventIds,
42
+ effectResults: input.effectResults,
43
+ });
44
+ const outcome = record.outcome;
45
+ const stateAfter = record.state_after;
32
46
  const consumed = new Set(input.snapshot.consumed_event_ids);
33
47
  for (const eventId of input.consumeEventIds)
34
48
  consumed.add(eventId);
@@ -45,10 +59,8 @@ const applyProcessReactiveTransition = (input) => {
45
59
  });
46
60
  }
47
61
  const completedCaptureOrder = Math.max(input.observation.capture_order, ...input.effectResults.map(({ observation }) => observation.capture_order));
48
- let next = {
62
+ const nextState = {
49
63
  ...input.snapshot,
50
- status: outcome === null ? "running" : "finished",
51
- outcome,
52
64
  active_state: stateAfter ?? input.snapshot.active_state,
53
65
  state_entry_capture_order: stateAfter === null
54
66
  ? input.snapshot.state_entry_capture_order
@@ -61,6 +73,9 @@ const applyProcessReactiveTransition = (input) => {
61
73
  checkpoints,
62
74
  transitions: [...input.snapshot.transitions, record],
63
75
  };
76
+ let next = outcome === null
77
+ ? { ...nextState, status: "running", outcome: null }
78
+ : { ...nextState, status: "finished", outcome };
64
79
  if (stateAfter !== null) {
65
80
  const nextState = input.scenario.states.find(({ id }) => id === stateAfter);
66
81
  if (nextState === undefined ||