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
@@ -2,13 +2,12 @@ import { createHash } from "node:crypto";
2
2
  import { posix } from "node:path";
3
3
  import canonicalize from "canonicalize";
4
4
  import { z } from "zod";
5
- const MAX_PATH = 4_096;
5
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
6
6
  const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
7
- const boundedTextSchema = z.string().min(1).max(1_024);
7
+ const boundedTextSchema = z.string().min(1);
8
8
  const relativePathSchema = z
9
9
  .string()
10
10
  .min(1)
11
- .max(MAX_PATH)
12
11
  .refine((path) => !path.startsWith("/") &&
13
12
  !path.includes("\\") &&
14
13
  path
@@ -26,40 +25,33 @@ const classificationSchema = z.enum([
26
25
  ]);
27
26
  const entryBaseShape = {
28
27
  path: relativePathSchema,
29
- classifications: z.array(classificationSchema).min(1).max(8),
30
- limitations: z.array(boundedTextSchema).max(100),
28
+ classifications: z.array(classificationSchema).min(1),
29
+ limitations: z.array(boundedTextSchema),
31
30
  };
32
- const sourceFileSchema = z
33
- .strictObject({
31
+ const sourceFileBaseShape = {
34
32
  ...entryBaseShape,
35
33
  kind: z.literal("file"),
36
- sha256: digestSchema.nullable(),
37
- size: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).nullable(),
38
- language: z.string().min(1).max(100).nullable(),
39
- content_state: z.enum([
40
- "hashed",
41
- "redacted-secret",
42
- "excluded",
43
- "unreadable",
44
- "too-large",
45
- "unknown",
46
- ]),
47
- })
48
- .superRefine((file, context) => {
49
- checkSortedUnique(file.classifications, "classifications", context);
50
- if ((file.content_state === "hashed") !== (file.sha256 !== null))
51
- context.addIssue({
52
- code: "custom",
53
- message: "Only hashed files have a content digest",
54
- path: ["sha256"],
55
- });
56
- if (file.content_state === "hashed" && file.size === null)
57
- context.addIssue({
58
- code: "custom",
59
- message: "Hashed files require a byte size",
60
- path: ["size"],
61
- });
62
- });
34
+ language: z.string().min(1).nullable(),
35
+ };
36
+ const sourceFileSchema = z.union([
37
+ z.strictObject({
38
+ ...sourceFileBaseShape,
39
+ sha256: digestSchema,
40
+ size: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
41
+ content_state: z.literal("hashed"),
42
+ }),
43
+ z.strictObject({
44
+ ...sourceFileBaseShape,
45
+ sha256: z.null(),
46
+ size: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).nullable(),
47
+ content_state: z.enum([
48
+ "redacted-secret",
49
+ "excluded",
50
+ "unreadable",
51
+ "unknown",
52
+ ]),
53
+ }),
54
+ ]);
63
55
  const sourceDirectorySchema = z.strictObject({
64
56
  ...entryBaseShape,
65
57
  kind: z.literal("directory"),
@@ -74,7 +66,6 @@ const sourceDirectorySchema = z.strictObject({
74
66
  const symlinkTargetSchema = z
75
67
  .string()
76
68
  .min(1)
77
- .max(MAX_PATH)
78
69
  .refine((target) => target === "<outside-root>" ||
79
70
  (!target.startsWith("/") &&
80
71
  !target.includes("\\") &&
@@ -91,21 +82,21 @@ const sourceSymlinkSchema = z.strictObject({
91
82
  "unknown",
92
83
  ]),
93
84
  });
94
- const sourceEntrySchema = z.discriminatedUnion("kind", [
85
+ const sourceEntrySchema = z.union([
95
86
  sourceFileSchema,
96
87
  sourceDirectorySchema,
97
88
  sourceSymlinkSchema,
98
89
  ]);
99
90
  const sourceRelationshipSchema = z.strictObject({
100
91
  from_path: relativePathSchema,
101
- to: z.string().min(1).max(MAX_PATH),
92
+ to: z.string().min(1),
102
93
  kind: z.enum(["imports", "requires", "references", "declares-module"]),
103
94
  resolution: z.enum(["internal", "external", "unresolved", "unknown"]),
104
95
  parse_state: z.enum(["parsed", "partial", "unknown"]),
105
96
  });
106
97
  const parseFailureSchema = z.strictObject({
107
98
  path: relativePathSchema,
108
- parser: z.string().min(1).max(100),
99
+ parser: z.string().min(1),
109
100
  reason: boundedTextSchema,
110
101
  });
111
102
  const exclusionSchema = z.strictObject({
@@ -139,28 +130,27 @@ const vcsSchema = z
139
130
  ])
140
131
  .nullable();
141
132
  const graphShape = {
142
- schema: z.literal("HistoricalSourceGraph/v1"),
133
+ schema: z.literal("HistoricalSourceGraph"),
143
134
  authority: z.literal("historical-reference"),
144
135
  root_alias: z.literal("$REFERENCE_ROOT"),
145
136
  root_sha256: digestSchema,
146
137
  inventory_state: z.enum(["complete", "partial", "unknown"]),
147
- entries: z.array(sourceEntrySchema).max(100_000),
148
- relationships: z.array(sourceRelationshipSchema).max(200_000),
149
- parse_failures: z.array(parseFailureSchema).max(10_000),
150
- exclusions: z.array(exclusionSchema).max(100_000),
151
- languages: z.array(z.string().min(1).max(100)).max(1_000),
152
- manifests: z.array(relativePathSchema).max(10_000),
138
+ entries: z.array(sourceEntrySchema),
139
+ relationships: z.array(sourceRelationshipSchema),
140
+ parse_failures: z.array(parseFailureSchema),
141
+ exclusions: z.array(exclusionSchema),
142
+ languages: z.array(z.string().min(1)),
143
+ manifests: z.array(relativePathSchema),
153
144
  vcs: vcsSchema,
154
145
  provenance: z.strictObject({
155
- importer: z.string().min(1).max(100),
156
- importer_version: z.string().min(1).max(100).nullable(),
146
+ importer: z.string().min(1),
147
+ importer_version: z.string().min(1).nullable(),
157
148
  caller: z
158
149
  .string()
159
150
  .min(1)
160
- .max(200)
161
151
  .regex(/^[\w .:@/+-]+$/u),
162
152
  }),
163
- limitations: z.array(boundedTextSchema).max(1_000),
153
+ limitations: z.array(boundedTextSchema),
164
154
  };
165
155
  const historicalSourceGraphStructureSchema = z
166
156
  .strictObject(graphShape)
@@ -178,14 +168,14 @@ const historicalSourceGraphInputSchema = z.strictObject({
178
168
  root_sha256: z.never().optional(),
179
169
  });
180
170
  const historicalSourceManifestBaseSchema = z.strictObject({
181
- schema: z.literal("HistoricalSourceManifest/v1"),
171
+ schema: z.literal("HistoricalSourceManifest"),
182
172
  authority: z.literal("historical-reference"),
183
173
  manifest_id: z.string().regex(/^hsm_[a-f0-9]{64}$/u),
184
174
  graph_sha256: digestSchema,
185
175
  root_sha256: digestSchema,
186
176
  inventory_state: z.enum(["complete", "partial", "unknown"]),
187
- entry_count: z.number().int().min(0).max(100_000),
188
- relationship_count: z.number().int().min(0).max(200_000),
177
+ entry_count: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
178
+ relationship_count: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
189
179
  });
190
180
  /** Stable identity used to sort and deduplicate source parse failures. */
191
181
  export const historicalSourceParseFailureKey = (failure) => `${failure.path}\u0000${failure.parser}\u0000${failure.reason}`;
@@ -197,10 +187,10 @@ const canonicalJson = (value) => {
197
187
  };
198
188
  const digestCanonical = (value) => createHash("sha256").update(canonicalJson(value)).digest("hex");
199
189
  const relationshipKey = (relationship) => `${relationship.from_path}\u0000${relationship.to}\u0000${relationship.kind}\u0000${relationship.resolution}\u0000${relationship.parse_state}`;
200
- const compareCodePoints = (left, right) => left < right ? -1 : left > right ? 1 : 0;
201
190
  const checkSortedUnique = (values, field, context) => {
202
191
  for (let index = 1; index < values.length; index += 1)
203
- if (compareCodePoints(values[index - 1] ?? "", values[index] ?? "") >= 0) {
192
+ if (compareUnicodeCodePoints(values[index - 1] ?? "", values[index] ?? "") >=
193
+ 0) {
204
194
  context.addIssue({
205
195
  code: "custom",
206
196
  message: `${field} must be sorted and unique by Unicode code point`,
@@ -209,16 +199,18 @@ const checkSortedUnique = (values, field, context) => {
209
199
  return;
210
200
  }
211
201
  };
212
- const expectedLanguages = (entries) => [
202
+ /** Derive the canonical language index from inventoried source files. */
203
+ export const historicalSourceLanguages = (entries) => [
213
204
  ...new Set(entries.flatMap((entry) => entry.kind === "file" && entry.language !== null
214
205
  ? [entry.language]
215
206
  : [])),
216
- ].sort(compareCodePoints);
217
- const expectedManifests = (entries) => entries
207
+ ].sort(compareUnicodeCodePoints);
208
+ /** Derive the canonical manifest path index from inventoried source files. */
209
+ export const historicalSourceManifests = (entries) => entries
218
210
  .flatMap((entry) => entry.kind === "file" && entry.classifications.includes("manifest")
219
211
  ? [entry.path]
220
212
  : [])
221
- .sort(compareCodePoints);
213
+ .sort(compareUnicodeCodePoints);
222
214
  const checkRelationships = (graph, paths, context) => {
223
215
  const files = new Set(graph.entries.flatMap((entry) => entry.kind === "file" ? [entry.path] : []));
224
216
  for (const [index, relationship] of graph.relationships.entries()) {
@@ -292,14 +284,14 @@ function checkGraphInvariants(graph, context) {
292
284
  checkSortedUnique(graph.parse_failures.map(historicalSourceParseFailureKey), "parse_failures", context);
293
285
  checkSortedUnique(graph.exclusions.map(({ path, reason }) => `${path}\u0000${reason}`), "exclusions", context);
294
286
  if (canonicalJson(graph.languages) !==
295
- canonicalJson(expectedLanguages(graph.entries)))
287
+ canonicalJson(historicalSourceLanguages(graph.entries)))
296
288
  context.addIssue({
297
289
  code: "custom",
298
290
  message: "languages must be derived from file entries",
299
291
  path: ["languages"],
300
292
  });
301
293
  if (canonicalJson(graph.manifests) !==
302
- canonicalJson(expectedManifests(graph.entries)))
294
+ canonicalJson(historicalSourceManifests(graph.entries)))
303
295
  context.addIssue({
304
296
  code: "custom",
305
297
  message: "manifests must be derived from classified file entries",
@@ -355,7 +347,7 @@ export const computeHistoricalSourceGraphSha256 = (input) => digestCanonical(par
355
347
  export const createHistoricalSourceManifest = (input) => {
356
348
  const graph = parseHistoricalSourceGraph(input);
357
349
  const semantic = {
358
- schema: "HistoricalSourceManifest/v1",
350
+ schema: "HistoricalSourceManifest",
359
351
  authority: "historical-reference",
360
352
  graph_sha256: computeHistoricalSourceGraphSha256(graph),
361
353
  root_sha256: graph.root_sha256,
@@ -1,10 +1,6 @@
1
1
  import { parse } from "@babel/parser";
2
2
  import { isCallExpression, isExportAllDeclaration, isExportNamedDeclaration, isIdentifier, isImport, isImportDeclaration, isMemberExpression, isNode, isStringLiteral, isTSExternalModuleReference, isTSImportEqualsDeclaration, isTSModuleDeclaration, } from "@babel/types";
3
- const MAX_REASON_LENGTH = 1_024;
4
3
  const codeSourceLanguages = new Set(["JavaScript", "TypeScript", "JSX", "TSX"]);
5
- const truncateReason = (reason) => reason.length > MAX_REASON_LENGTH
6
- ? `${reason.slice(0, MAX_REASON_LENGTH - 3)}...`
7
- : reason;
8
4
  const safeModuleName = (node) => {
9
5
  if (isStringLiteral(node))
10
6
  return node.value;
@@ -220,7 +216,7 @@ export const parseReferenceSourceImports = (path, bytes, language) => {
220
216
  {
221
217
  path,
222
218
  parser: "babel",
223
- reason: truncateReason(reason ?? "Unknown parse failure"),
219
+ reason: reason ?? "Unknown parse failure",
224
220
  },
225
221
  ],
226
222
  };
@@ -2,12 +2,8 @@ import { MultiDirectedGraph } from "graphology";
2
2
  import { singleSource } from "graphology-shortest-path";
3
3
  import canonicalize from "canonicalize";
4
4
  import { z } from "zod";
5
- const replayIdentifierSchema = z
6
- .string()
7
- .regex(/^[A-Za-z][A-Za-z0-9_-]{0,63}$/u);
8
- const replayPathSchema = z
9
- .array(z.union([z.string().max(256), z.number().int().nonnegative()]))
10
- .max(32);
5
+ const replayIdentifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9_-]*$/u);
6
+ const replayPathSchema = z.array(z.union([z.string(), z.number().int().nonnegative()]));
11
7
  const sensitiveHeaderNames = new Set([
12
8
  "authorization",
13
9
  "cookie",
@@ -17,12 +13,8 @@ const sensitiveHeaderNames = new Set([
17
13
  const headerNameSchema = z
18
14
  .string()
19
15
  .min(1)
20
- .max(256)
21
16
  .regex(/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u);
22
- const headerValueSchema = z
23
- .string()
24
- .max(8_192)
25
- .regex(/^[\t\x20-\x7e\x80-\xff]*$/u);
17
+ const headerValueSchema = z.string().regex(/^[\t\x20-\x7e\x80-\xff]*$/u);
26
18
  const replayHeaderMatchersSchema = z
27
19
  .record(headerNameSchema, headerValueSchema)
28
20
  .superRefine((headers, context) => {
@@ -65,11 +57,10 @@ const replayTriggerSchema = z.discriminatedUnion("protocol", [
65
57
  method: z
66
58
  .string()
67
59
  .min(1)
68
- .max(16)
69
60
  .transform((method) => method.toUpperCase()),
70
61
  path: z.string().startsWith("/"),
71
62
  headers: replayHeaderMatchersSchema.default({}),
72
- body: z.string().max(1_000_000).nullable().default(null),
63
+ body: z.string().nullable().default(null),
73
64
  }),
74
65
  z.strictObject({
75
66
  protocol: z.literal("websocket_connect"),
@@ -79,7 +70,7 @@ const replayTriggerSchema = z.discriminatedUnion("protocol", [
79
70
  z.strictObject({
80
71
  protocol: z.literal("websocket_message"),
81
72
  path: z.string().startsWith("/"),
82
- body: z.string().max(1_000_000).nullable().default(null),
73
+ body: z.string().nullable().default(null),
83
74
  }),
84
75
  ]);
85
76
  const replayActionSchema = z.discriminatedUnion("type", [
@@ -87,30 +78,29 @@ const replayActionSchema = z.discriminatedUnion("type", [
87
78
  type: z.literal("http_response"),
88
79
  status: z.number().int().min(100).max(599),
89
80
  headers: z.record(headerNameSchema, headerValueSchema).default({}),
90
- body: z.string().max(1_000_000),
81
+ body: z.string(),
91
82
  }),
92
83
  z.strictObject({
93
84
  type: z.literal("websocket_send"),
94
- data: z.string().max(1_000_000),
85
+ data: z.string(),
95
86
  }),
96
87
  z.strictObject({ type: z.literal("disconnect") }),
97
88
  z.strictObject({
98
89
  type: z.literal("delay"),
99
- duration_ms: z.number().int().nonnegative().max(30_000),
90
+ duration_ms: z.number().int().safe().nonnegative(),
100
91
  }),
101
92
  ]);
102
93
  const replayTransitionSchema = z.strictObject({
103
94
  id: replayIdentifierSchema,
104
95
  from: replayIdentifierSchema,
105
96
  to: replayIdentifierSchema,
106
- priority: z.number().int().min(0).max(1_000).default(100),
97
+ priority: z.number().int().min(0).default(100),
107
98
  trigger: replayTriggerSchema,
108
99
  guards: z
109
100
  .array(z.strictObject({
110
101
  variable: replayIdentifierSchema,
111
102
  value: replayValueSourceSchema,
112
103
  }))
113
- .max(32)
114
104
  .default([]),
115
105
  captures: z
116
106
  .array(z.strictObject({
@@ -118,10 +108,9 @@ const replayTransitionSchema = z.strictObject({
118
108
  value: replayValueSourceSchema,
119
109
  sensitive: z.boolean().default(false),
120
110
  }))
121
- .max(32)
122
111
  .default([]),
123
- actions: z.array(replayActionSchema).min(1).max(32),
124
- max_uses: z.number().int().min(1).max(10_000),
112
+ actions: z.array(replayActionSchema).min(1),
113
+ max_uses: z.number().int().min(1),
125
114
  });
126
115
  const transitionSignature = (transition) => {
127
116
  const signature = canonicalize({
@@ -139,18 +128,17 @@ const replayMachineBaseSchema = z.strictObject({
139
128
  .array(z.strictObject({
140
129
  name: replayIdentifierSchema,
141
130
  terminal: z.boolean().default(false),
142
- max_visits: z.number().int().min(1).max(100_000).default(100_000),
131
+ max_visits: z.number().int().min(1).default(100_000),
143
132
  }))
144
- .min(1)
145
- .max(256),
146
- transitions: z.array(replayTransitionSchema).min(1).max(2_000),
147
- max_transitions: z.number().int().min(1).max(100_000),
133
+ .min(1),
134
+ transitions: z.array(replayTransitionSchema).min(1),
135
+ max_transitions: z.number().int().min(1),
148
136
  limits: z
149
137
  .strictObject({
150
- connections: z.number().int().min(1).max(1_000).default(100),
151
- messages: z.number().int().min(1).max(100_000).default(10_000),
152
- bytes: z.number().int().min(1).max(10_000_000).default(1_000_000),
153
- duration_ms: z.number().int().min(1).max(300_000).default(30_000),
138
+ connections: z.number().int().min(1).default(100),
139
+ messages: z.number().int().min(1).default(10_000),
140
+ bytes: z.number().int().min(1).default(1_000_000),
141
+ duration_ms: z.number().int().min(1).default(30_000),
154
142
  })
155
143
  .default({
156
144
  connections: 100,
@@ -10,48 +10,10 @@ const refusalOutcomeSchema = z.enum([
10
10
  "unexpected_reconnect",
11
11
  "limit_exhausted",
12
12
  ]);
13
- const MAX_DIRECT_REPLAY_EVENTS = 10_000;
14
- const MAX_DIRECT_REPLAY_ACTION_BYTES = 4 * 1_024 * 1_024;
15
- const MAX_DIRECT_REPLAY_ACTION_FIELDS = 1_024;
16
- const MAX_DIRECT_REPLAY_SENSITIVE_CAPTURES = 1_024;
17
- const actionFieldCount = (machine) => machine.transitions.reduce((total, transition) => total +
18
- transition.actions.reduce((fields, action) => fields +
19
- (action.type === "http_response"
20
- ? Object.keys(action.headers).length + 1
21
- : action.type === "websocket_send"
22
- ? 1
23
- : 0), 0), 0);
24
- const maximumSensitiveCapturesPerEvent = (machine) => Math.max(0, ...machine.transitions.map(({ captures }) => captures.filter(({ sensitive }) => sensitive).length));
25
13
  /** Complete declarative input for one direct replay-machine run. */
26
- export const replayMachineRunInputSchema = z
27
- .strictObject({
14
+ export const replayMachineRunInputSchema = z.strictObject({
28
15
  machine: replayMachineSchema,
29
- events: z.array(replayMachineEventSchema).max(MAX_DIRECT_REPLAY_EVENTS),
30
- })
31
- .superRefine(({ machine, events }, context) => {
32
- const actionBytes = Buffer.byteLength(JSON.stringify(machine.transitions.map(({ id, actions }) => ({ id, actions }))));
33
- if (actionBytes > MAX_DIRECT_REPLAY_ACTION_BYTES)
34
- context.addIssue({
35
- code: "custom",
36
- path: ["machine", "transitions"],
37
- message: "direct replay actions exceed the 4 MiB output boundary",
38
- input: machine.transitions,
39
- });
40
- if (actionFieldCount(machine) > MAX_DIRECT_REPLAY_ACTION_FIELDS)
41
- context.addIssue({
42
- code: "custom",
43
- path: ["machine", "transitions"],
44
- message: "direct replay actions exceed the 1,024-field output boundary",
45
- input: machine.transitions,
46
- });
47
- if (maximumSensitiveCapturesPerEvent(machine) * events.length >
48
- MAX_DIRECT_REPLAY_SENSITIVE_CAPTURES)
49
- context.addIssue({
50
- code: "custom",
51
- path: ["events"],
52
- message: "direct replay events exceed the 1,024 sensitive-capture operation boundary",
53
- input: events,
54
- });
16
+ events: z.array(replayMachineEventSchema),
55
17
  });
56
18
  const replayMachineRunDecisionSchema = z.strictObject({
57
19
  event_sequence: z.number().int().nonnegative(),
@@ -65,18 +27,17 @@ const replayRunActionSchema = z.discriminatedUnion("type", [
65
27
  headers: z.record(z
66
28
  .string()
67
29
  .min(1)
68
- .max(256)
69
- .regex(/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u), z.string().max(8_192)),
70
- body: z.string().max(1_000_000),
30
+ .regex(/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u), z.string()),
31
+ body: z.string(),
71
32
  }),
72
33
  z.strictObject({
73
34
  type: z.literal("websocket_send"),
74
- data: z.string().max(1_000_000),
35
+ data: z.string(),
75
36
  }),
76
37
  z.strictObject({ type: z.literal("disconnect") }),
77
38
  z.strictObject({
78
39
  type: z.literal("delay"),
79
- duration_ms: z.number().int().nonnegative().max(30_000),
40
+ duration_ms: z.number().int().nonnegative(),
80
41
  }),
81
42
  ]);
82
43
  const replayRunIdentifierSchema = z
@@ -88,31 +49,22 @@ const replayMachineRunJournalEntrySchema = z.strictObject({
88
49
  transition_id: replayRunIdentifierSchema,
89
50
  state_before: replayRunIdentifierSchema,
90
51
  state_after: replayRunIdentifierSchema,
91
- captured_aliases: z
92
- .array(z.strictObject({
52
+ captured_aliases: z.array(z.strictObject({
93
53
  name: replayRunIdentifierSchema,
94
54
  sensitive: z.boolean(),
95
- }))
96
- .max(32),
55
+ })),
97
56
  });
98
57
  /** Capture-value-free result of directly evaluating a finite replay machine. */
99
58
  export const replayMachineRunOutputSchema = z.strictObject({
100
- schema_version: z.literal(1),
101
59
  initial_state: replayRunIdentifierSchema,
102
60
  final_state: replayRunIdentifierSchema,
103
61
  terminal: z.boolean(),
104
- decisions: z
105
- .array(replayMachineRunDecisionSchema)
106
- .max(MAX_DIRECT_REPLAY_EVENTS),
107
- transition_journal: z
108
- .array(replayMachineRunJournalEntrySchema)
109
- .max(MAX_DIRECT_REPLAY_EVENTS),
110
- transition_actions: z
111
- .array(z.strictObject({
62
+ decisions: z.array(replayMachineRunDecisionSchema),
63
+ transition_journal: z.array(replayMachineRunJournalEntrySchema),
64
+ transition_actions: z.array(z.strictObject({
112
65
  transition_id: replayRunIdentifierSchema,
113
- actions: z.array(replayRunActionSchema).max(32),
114
- }))
115
- .max(2_000),
66
+ actions: z.array(replayRunActionSchema),
67
+ })),
116
68
  limits: z.strictObject({
117
69
  configured: z.strictObject({
118
70
  transitions: z.number().int().positive(),
@@ -156,6 +108,7 @@ export const runReplayMachine = (input) => {
156
108
  const decisions = [];
157
109
  const transitionJournal = [];
158
110
  const usedTransitionIds = new Set();
111
+ const transitionById = new Map(input.machine.transitions.map((transition) => [transition.id, transition]));
159
112
  for (const [eventSequence, event] of input.events.entries()) {
160
113
  const decision = runtime.dispatch(event);
161
114
  decisions.push({
@@ -166,7 +119,7 @@ export const runReplayMachine = (input) => {
166
119
  if (decision.outcome !== "matched")
167
120
  continue;
168
121
  usedTransitionIds.add(decision.transition.transition_id);
169
- const definition = input.machine.transitions.find(({ id }) => id === decision.transition.transition_id);
122
+ const definition = transitionById.get(decision.transition.transition_id);
170
123
  if (definition === undefined)
171
124
  throw new TypeError("Replay runtime selected an unknown transition");
172
125
  transitionJournal.push({
@@ -189,7 +142,6 @@ export const runReplayMachine = (input) => {
189
142
  actions: actions.map((action) => redactAction(runtime, action)),
190
143
  }));
191
144
  return replayMachineRunOutputSchema.parse({
192
- schema_version: 1,
193
145
  initial_state: input.machine.initial_state,
194
146
  final_state: runtime.state,
195
147
  terminal: input.machine.states.find(({ name }) => name === runtime.state)
@@ -1,15 +1,11 @@
1
- import canonicalize from "canonicalize";
2
1
  import { z } from "zod";
2
+ import { isJsonCompatible, replayValuesEqual } from "./replayMachineValues.js";
3
3
  /** One bounded inbound protocol event offered to a replay machine. */
4
4
  const replayEventHeadersSchema = z
5
5
  .record(z
6
6
  .string()
7
7
  .min(1)
8
- .max(256)
9
- .regex(/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u), z
10
- .string()
11
- .max(8_192)
12
- .regex(/^[\t\x20-\x7e\x80-\xff]*$/u))
8
+ .regex(/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u), z.string().regex(/^[\t\x20-\x7e\x80-\xff]*$/u))
13
9
  .superRefine((headers, context) => {
14
10
  const normalized = Object.keys(headers).map((name) => name.toLowerCase());
15
11
  if (new Set(normalized).size !== normalized.length)
@@ -21,9 +17,9 @@ const replayEventHeadersSchema = z
21
17
  });
22
18
  const replayEventFields = {
23
19
  at_ms: z.number().int().safe().nonnegative(),
24
- path: z.string().startsWith("/").max(8_192),
20
+ path: z.string().startsWith("/"),
25
21
  headers: replayEventHeadersSchema,
26
- body: z.string().max(1_000_000),
22
+ body: z.string(),
27
23
  };
28
24
  export const replayMachineEventSchema = z.discriminatedUnion("protocol", [
29
25
  z.strictObject({
@@ -32,7 +28,6 @@ export const replayMachineEventSchema = z.discriminatedUnion("protocol", [
32
28
  method: z
33
29
  .string()
34
30
  .min(1)
35
- .max(16)
36
31
  .transform((method) => method.toUpperCase()),
37
32
  ...replayEventFields,
38
33
  }),
@@ -84,6 +79,7 @@ const actionJsonBody = (transition) => {
84
79
  return action.data;
85
80
  return undefined;
86
81
  };
82
+ const triggerKey = (transition) => `${transition.trigger.protocol}\0${transition.trigger.path}`;
87
83
  const readValue = (source, event, transition) => {
88
84
  switch (source.source) {
89
85
  case "request_header":
@@ -114,20 +110,6 @@ const triggerMatches = (transition, event) => {
114
110
  return trigger.body === null || trigger.body === event.body;
115
111
  return true;
116
112
  };
117
- const isJsonCompatible = (value) => {
118
- if (value === null || typeof value === "string" || typeof value === "boolean")
119
- return true;
120
- if (typeof value === "number")
121
- return Number.isFinite(value);
122
- if (Array.isArray(value))
123
- return value.every(isJsonCompatible);
124
- if (typeof value !== "object")
125
- return false;
126
- return Object.values(value).every(isJsonCompatible);
127
- };
128
- const replayValuesEqual = (left, right) => isJsonCompatible(left) &&
129
- isJsonCompatible(right) &&
130
- (Object.is(left, right) || canonicalize(left) === canonicalize(right));
131
113
  const createTransitionRecord = ({ sequence, atMs, stateBefore, transition, captures, }) => ({
132
114
  sequence,
133
115
  at_ms: atMs,
@@ -142,6 +124,7 @@ const createTransitionRecord = ({ sequence, atMs, stateBefore, transition, captu
142
124
  /** Stateful evaluator for one validated replay-machine instance. */
143
125
  export class ReplayMachineRuntime {
144
126
  machine;
127
+ #transitionsByTrigger = new Map();
145
128
  #variables = new Map();
146
129
  #sensitiveValues = new Map();
147
130
  #uses = new Map();
@@ -157,6 +140,16 @@ export class ReplayMachineRuntime {
157
140
  this.machine = machine;
158
141
  this.#state = machine.initial_state;
159
142
  this.#stateVisits.set(machine.initial_state, 1);
143
+ const byTrigger = new Map();
144
+ for (const [declarationOrder, transition,] of machine.transitions.entries()) {
145
+ const key = triggerKey(transition);
146
+ const indexed = byTrigger.get(key) ?? [];
147
+ indexed.push({ transition, declarationOrder });
148
+ byTrigger.set(key, indexed);
149
+ }
150
+ for (const [key, indexed] of byTrigger)
151
+ this.#transitionsByTrigger.set(key, indexed.sort((left, right) => left.transition.priority - right.transition.priority ||
152
+ left.declarationOrder - right.declarationOrder));
160
153
  }
161
154
  /** Current machine state after all accepted transitions. */
162
155
  get state() {
@@ -207,25 +200,11 @@ export class ReplayMachineRuntime {
207
200
  };
208
201
  if (!this.#admitEvent(normalizedEvent))
209
202
  return this.#refusal("limit_exhausted");
210
- const matching = this.machine.transitions
211
- .map((transition, declarationOrder) => ({
212
- transition,
213
- declarationOrder,
214
- }))
215
- .filter(({ transition }) => triggerMatches(transition, normalizedEvent));
216
- const eligible = matching
217
- .filter(({ transition }) => transition.from === this.#state)
218
- .sort((left, right) => left.transition.priority - right.transition.priority ||
219
- left.declarationOrder - right.declarationOrder);
203
+ const matching = this.#matchingTransitions(normalizedEvent);
204
+ const eligible = matching.filter(({ transition }) => this.#transitionStartsHere(transition));
220
205
  if (eligible.length === 0)
221
- return this.#refusal(matching.length === 0
222
- ? "unmatched"
223
- : normalizedEvent.protocol === "websocket_connect" &&
224
- normalizedEvent.connection === "reconnect"
225
- ? "unexpected_reconnect"
226
- : "invalid_state");
227
- const guarded = eligible.filter(({ transition }) => transition.guards.every((guard) => this.#variables.has(guard.variable) &&
228
- replayValuesEqual(this.#variables.get(guard.variable), readValue(guard.value, normalizedEvent, transition))));
206
+ return this.#refusal(this.#noEligibleReason(matching, normalizedEvent));
207
+ const guarded = eligible.filter(({ transition }) => this.#transitionGuardsMatch(transition, normalizedEvent));
229
208
  if (guarded.length === 0)
230
209
  return this.#refusal("guard_failed");
231
210
  if (this.#timeline.length >= this.machine.max_transitions)
@@ -272,6 +251,27 @@ export class ReplayMachineRuntime {
272
251
  transition: record,
273
252
  };
274
253
  }
254
+ #matchingTransitions(event) {
255
+ return (this.#transitionsByTrigger.get(`${event.protocol}\0${event.path}`) ?? []).filter(({ transition }) => triggerMatches(transition, event));
256
+ }
257
+ #transitionStartsHere(transition) {
258
+ return transition.from === this.#state;
259
+ }
260
+ #noEligibleReason(matching, event) {
261
+ if (matching.length === 0)
262
+ return "unmatched";
263
+ return event.protocol === "websocket_connect" &&
264
+ event.connection === "reconnect"
265
+ ? "unexpected_reconnect"
266
+ : "invalid_state";
267
+ }
268
+ #transitionGuardsMatch(transition, event) {
269
+ return transition.guards.every((guard) => {
270
+ if (!this.#variables.has(guard.variable))
271
+ return false;
272
+ return replayValuesEqual(this.#variables.get(guard.variable), readValue(guard.value, event, transition));
273
+ });
274
+ }
275
275
  #admitEvent(event) {
276
276
  const connections = this.#connections + (event.protocol === "websocket_connect" ? 1 : 0);
277
277
  const messages = this.#messages + (event.protocol === "websocket_message" ? 1 : 0);