@reventlessdev/reventless-local 3.0.0-alpha.113

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 (334) hide show
  1. package/CHANGELOG.md +1197 -0
  2. package/LICENSE +202 -0
  3. package/__mocks__/emptyModule.js +2 -0
  4. package/__mocks__/nodeSqlite.mjs +6 -0
  5. package/package.json +67 -0
  6. package/rescript.json +39 -0
  7. package/src/Platform.res +2162 -0
  8. package/src/Platform.res.mjs +3389 -0
  9. package/src/adapter/Api/LocalGraphQL_Adapter.res +29 -0
  10. package/src/adapter/Api/LocalGraphQL_Adapter.res.mjs +26 -0
  11. package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res +146 -0
  12. package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res.mjs +88 -0
  13. package/src/adapter/Auth/Auth_GraphqlContext.res +83 -0
  14. package/src/adapter/Auth/Auth_GraphqlContext.res.mjs +76 -0
  15. package/src/adapter/Auth/LocalAuth.res +239 -0
  16. package/src/adapter/Auth/LocalAuth.res.mjs +247 -0
  17. package/src/adapter/Auth/UserStore.res +134 -0
  18. package/src/adapter/Auth/UserStore.res.mjs +146 -0
  19. package/src/adapter/Backend.res +46 -0
  20. package/src/adapter/Backend.res.mjs +66 -0
  21. package/src/adapter/BackendState.res +34 -0
  22. package/src/adapter/BackendState.res.mjs +42 -0
  23. package/src/adapter/Cloner/LocalClonerRunner.res +13 -0
  24. package/src/adapter/Cloner/LocalClonerRunner.res.mjs +12 -0
  25. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +329 -0
  26. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res.mjs +301 -0
  27. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +76 -0
  28. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res.mjs +57 -0
  29. package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res +19 -0
  30. package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res.mjs +19 -0
  31. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +104 -0
  32. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs +82 -0
  33. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res +32 -0
  34. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res.mjs +38 -0
  35. package/src/adapter/Counter/LocalCounterHandler.res +42 -0
  36. package/src/adapter/Counter/LocalCounterHandler.res.mjs +45 -0
  37. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res +131 -0
  38. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res.mjs +140 -0
  39. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res +334 -0
  40. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res.mjs +299 -0
  41. package/src/adapter/DomainGraphQL_Server.res +565 -0
  42. package/src/adapter/DomainGraphQL_Server.res.mjs +576 -0
  43. package/src/adapter/DomainMCP_Server.res +369 -0
  44. package/src/adapter/DomainMCP_Server.res.mjs +358 -0
  45. package/src/adapter/EventCollector/LocalEventCollectorChannel.res +87 -0
  46. package/src/adapter/EventCollector/LocalEventCollectorChannel.res.mjs +45 -0
  47. package/src/adapter/EventLog/EventLogStorage_InMemory.res +105 -0
  48. package/src/adapter/EventLog/EventLogStorage_InMemory.res.mjs +117 -0
  49. package/src/adapter/EventLog/EventLogStorage_Sqlite.res +145 -0
  50. package/src/adapter/EventLog/EventLogStorage_Sqlite.res.mjs +155 -0
  51. package/src/adapter/EventTopic/LocalEventTopicPublisher.res +36 -0
  52. package/src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs +31 -0
  53. package/src/adapter/GraphQL_Server.res +6 -0
  54. package/src/adapter/GraphQL_Server.res.mjs +154 -0
  55. package/src/adapter/GraphQL_ServerInstance.res +310 -0
  56. package/src/adapter/GraphQL_ServerInstance.res.mjs +257 -0
  57. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res +57 -0
  58. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res.mjs +34 -0
  59. package/src/adapter/LocalBus.res +498 -0
  60. package/src/adapter/LocalBus.res.mjs +1011 -0
  61. package/src/adapter/LocalPluginSpec.res +16 -0
  62. package/src/adapter/LocalPluginSpec.res.mjs +33 -0
  63. package/src/adapter/LocalSideEffectHandler.res +44 -0
  64. package/src/adapter/LocalSideEffectHandler.res.mjs +34 -0
  65. package/src/adapter/MCP_Server.res +4 -0
  66. package/src/adapter/MCP_Server.res.mjs +67 -0
  67. package/src/adapter/MCP_ServerInstance.res +362 -0
  68. package/src/adapter/MCP_ServerInstance.res.mjs +313 -0
  69. package/src/adapter/PlatformGraphQL_Server.res +75 -0
  70. package/src/adapter/PlatformGraphQL_Server.res.mjs +84 -0
  71. package/src/adapter/PlatformMCP_Server.res +23 -0
  72. package/src/adapter/PlatformMCP_Server.res.mjs +46 -0
  73. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +793 -0
  74. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res.mjs +569 -0
  75. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +242 -0
  76. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +241 -0
  77. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +339 -0
  78. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +318 -0
  79. package/src/adapter/QueryDb/SortKey_Filter.res +48 -0
  80. package/src/adapter/QueryDb/SortKey_Filter.res.mjs +46 -0
  81. package/src/adapter/QueryEngine/LocalQueryEngine.res +57 -0
  82. package/src/adapter/QueryEngine/LocalQueryEngine.res.mjs +56 -0
  83. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +91 -0
  84. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res.mjs +50 -0
  85. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +47 -0
  86. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs +37 -0
  87. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res +11 -0
  88. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res.mjs +30 -0
  89. package/src/adapter/Runtime/LocalRuntimeEnvironment.res +54 -0
  90. package/src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs +40 -0
  91. package/src/adapter/Scheduler/LocalScheduledPublisher.res +102 -0
  92. package/src/adapter/Scheduler/LocalScheduledPublisher.res.mjs +84 -0
  93. package/src/adapter/SqliteDriver.res +52 -0
  94. package/src/adapter/SqliteDriver.res.mjs +76 -0
  95. package/src/adapter/SqliteDriver.resi +31 -0
  96. package/src/adapter/Task/LocalTaskBucket.res +75 -0
  97. package/src/adapter/Task/LocalTaskBucket.res.mjs +48 -0
  98. package/src/adapter/Task/TaskBucket_Sqlite.res +47 -0
  99. package/src/adapter/Task/TaskBucket_Sqlite.res.mjs +40 -0
  100. package/src/components/Aggregate_Builder.res +55 -0
  101. package/src/components/Aggregate_Builder.res.mjs +140 -0
  102. package/src/components/AutomationSlice_Builder.res +41 -0
  103. package/src/components/AutomationSlice_Builder.res.mjs +57 -0
  104. package/src/components/Counter_Builder.res +14 -0
  105. package/src/components/Counter_Builder.res.mjs +32 -0
  106. package/src/components/DcbEventLog_Builder.res +18 -0
  107. package/src/components/DcbEventLog_Builder.res.mjs +24 -0
  108. package/src/components/ExtensionPoint_Builder.res +25 -0
  109. package/src/components/ExtensionPoint_Builder.res.mjs +44 -0
  110. package/src/components/InboundTranslationSlice_Builder.res +34 -0
  111. package/src/components/InboundTranslationSlice_Builder.res.mjs +45 -0
  112. package/src/components/OutboundTranslationSlice_Builder.res +43 -0
  113. package/src/components/OutboundTranslationSlice_Builder.res.mjs +59 -0
  114. package/src/components/Plugin_Builder.res +37 -0
  115. package/src/components/Plugin_Builder.res.mjs +67 -0
  116. package/src/components/ReadModel_Builder.res +47 -0
  117. package/src/components/ReadModel_Builder.res.mjs +54 -0
  118. package/src/components/StateChangeSlice_Builder.res +19 -0
  119. package/src/components/StateChangeSlice_Builder.res.mjs +21 -0
  120. package/src/components/StateViewSlice_Builder.res +42 -0
  121. package/src/components/StateViewSlice_Builder.res.mjs +58 -0
  122. package/src/components/Task_Builder.res +28 -0
  123. package/src/components/Task_Builder.res.mjs +41 -0
  124. package/src/reexport/CommandTopic.res +3 -0
  125. package/src/reexport/CommandTopic.res.mjs +55 -0
  126. package/src/test/Mocks/MockDcbEventLogStorage.res +136 -0
  127. package/src/test/Mocks/MockDcbEventLogStorage.res.mjs +146 -0
  128. package/src/test/Mocks/MockEventLogStorage.res +57 -0
  129. package/src/test/Mocks/MockEventLogStorage.res.mjs +65 -0
  130. package/src/test/Mocks/MockPublisher.res +29 -0
  131. package/src/test/Mocks/MockPublisher.res.mjs +28 -0
  132. package/src/test/Mocks/MockQueryDbStorage.res +104 -0
  133. package/src/test/Mocks/MockQueryDbStorage.res.mjs +136 -0
  134. package/src/test/TestRunner.res +96 -0
  135. package/src/test/TestRunner.res.mjs +71 -0
  136. package/tests/SplitApiFixtures.res +84 -0
  137. package/tests/SplitApiFixtures.res.mjs +88 -0
  138. package/tests/SplitApiTest.res +102 -0
  139. package/tests/SplitApiTest.res.mjs +82 -0
  140. package/tests/TestFixtures.res +54 -0
  141. package/tests/TestFixtures.res.mjs +65 -0
  142. package/tests/adapter/BackendParityTest.res +94 -0
  143. package/tests/adapter/BackendParityTest.res.mjs +96 -0
  144. package/tests/adapter/CollectNEventsTest.res +82 -0
  145. package/tests/adapter/CollectNEventsTest.res.mjs +83 -0
  146. package/tests/adapter/CommandAuthorizationTest.res +200 -0
  147. package/tests/adapter/CommandAuthorizationTest.res.mjs +190 -0
  148. package/tests/adapter/CommandTopicChannelTest.res +174 -0
  149. package/tests/adapter/CommandTopicChannelTest.res.mjs +170 -0
  150. package/tests/adapter/CounterHandlerTest.res +113 -0
  151. package/tests/adapter/CounterHandlerTest.res.mjs +96 -0
  152. package/tests/adapter/DcbEventLogStorageSqliteTest.res +157 -0
  153. package/tests/adapter/DcbEventLogStorageSqliteTest.res.mjs +165 -0
  154. package/tests/adapter/DcbEventLogStorageTest.res +187 -0
  155. package/tests/adapter/DcbEventLogStorageTest.res.mjs +195 -0
  156. package/tests/adapter/EventCollectorChannelTest.res +166 -0
  157. package/tests/adapter/EventCollectorChannelTest.res.mjs +178 -0
  158. package/tests/adapter/EventLogStorageSqliteTest.res +105 -0
  159. package/tests/adapter/EventLogStorageSqliteTest.res.mjs +116 -0
  160. package/tests/adapter/EventTapTest.res +102 -0
  161. package/tests/adapter/EventTapTest.res.mjs +94 -0
  162. package/tests/adapter/EventTopicPublisherTest.res +76 -0
  163. package/tests/adapter/EventTopicPublisherTest.res.mjs +86 -0
  164. package/tests/adapter/GraphQL_SchemaInspectorTest.res +763 -0
  165. package/tests/adapter/GraphQL_SchemaInspectorTest.res.mjs +578 -0
  166. package/tests/adapter/GraphQL_SubscriptionResolversTest.res +161 -0
  167. package/tests/adapter/GraphQL_SubscriptionResolversTest.res.mjs +134 -0
  168. package/tests/adapter/HeartbeatRunnerTest.res +136 -0
  169. package/tests/adapter/HeartbeatRunnerTest.res.mjs +96 -0
  170. package/tests/adapter/LocalAuthHttpTest.res +224 -0
  171. package/tests/adapter/LocalAuthHttpTest.res.mjs +237 -0
  172. package/tests/adapter/LocalAuthLoginTest.res +180 -0
  173. package/tests/adapter/LocalAuthLoginTest.res.mjs +207 -0
  174. package/tests/adapter/LocalAuthTest.res +106 -0
  175. package/tests/adapter/LocalAuthTest.res.mjs +145 -0
  176. package/tests/adapter/LocalAuthUserStoreTest.res +172 -0
  177. package/tests/adapter/LocalAuthUserStoreTest.res.mjs +208 -0
  178. package/tests/adapter/LocalBusBoundedTest.res +157 -0
  179. package/tests/adapter/LocalBusBoundedTest.res.mjs +168 -0
  180. package/tests/adapter/LocalBusPubSubTest.res +81 -0
  181. package/tests/adapter/LocalBusPubSubTest.res.mjs +81 -0
  182. package/tests/adapter/QueryDbGsiTtlTest.res +268 -0
  183. package/tests/adapter/QueryDbGsiTtlTest.res.mjs +209 -0
  184. package/tests/adapter/QueryDbListResolverTest.res +361 -0
  185. package/tests/adapter/QueryDbListResolverTest.res.mjs +426 -0
  186. package/tests/adapter/QueryDbStorageSqliteTest.res +159 -0
  187. package/tests/adapter/QueryDbStorageSqliteTest.res.mjs +126 -0
  188. package/tests/adapter/QueryDbStorageTest.res +171 -0
  189. package/tests/adapter/QueryDbStorageTest.res.mjs +170 -0
  190. package/tests/adapter/QueryEngineTest.res +152 -0
  191. package/tests/adapter/QueryEngineTest.res.mjs +148 -0
  192. package/tests/adapter/ScheduledPublisherTest.res +199 -0
  193. package/tests/adapter/ScheduledPublisherTest.res.mjs +203 -0
  194. package/tests/adapter/SortKey_FilterTest.res +103 -0
  195. package/tests/adapter/SortKey_FilterTest.res.mjs +135 -0
  196. package/tests/adapter/SqliteDriverTest.res +86 -0
  197. package/tests/adapter/SqliteDriverTest.res.mjs +101 -0
  198. package/tests/adapter/TaskBucketSqliteTest.res +44 -0
  199. package/tests/adapter/TaskBucketSqliteTest.res.mjs +40 -0
  200. package/tests/adapter/TaskBucketTest.res +106 -0
  201. package/tests/adapter/TaskBucketTest.res.mjs +118 -0
  202. package/tests/components/aggregate/AggregateFixtures.res +78 -0
  203. package/tests/components/aggregate/AggregateFixtures.res.mjs +109 -0
  204. package/tests/components/aggregate/AggregateTest.res +129 -0
  205. package/tests/components/aggregate/AggregateTest.res.mjs +129 -0
  206. package/tests/components/automationslice/AutomationSliceCallbackTest.res +212 -0
  207. package/tests/components/automationslice/AutomationSliceCallbackTest.res.mjs +233 -0
  208. package/tests/components/automationslice/AutomationSliceFixtures.res +189 -0
  209. package/tests/components/automationslice/AutomationSliceFixtures.res.mjs +276 -0
  210. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +289 -0
  211. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res.mjs +453 -0
  212. package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res +47 -0
  213. package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res.mjs +31 -0
  214. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res +213 -0
  215. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res.mjs +268 -0
  216. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res +118 -0
  217. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res.mjs +99 -0
  218. package/tests/components/commandgenerator/CommandGeneratorFixtures.res +73 -0
  219. package/tests/components/commandgenerator/CommandGeneratorFixtures.res.mjs +109 -0
  220. package/tests/components/commandgenerator/CommandGeneratorTest.res +43 -0
  221. package/tests/components/commandgenerator/CommandGeneratorTest.res.mjs +46 -0
  222. package/tests/components/commandtopic/CommandTopicFixtures.res +37 -0
  223. package/tests/components/commandtopic/CommandTopicFixtures.res.mjs +68 -0
  224. package/tests/components/commandtopic/CommandTopicStreamFixtures.res +43 -0
  225. package/tests/components/commandtopic/CommandTopicStreamFixtures.res.mjs +91 -0
  226. package/tests/components/commandtopic/CommandTopicStreamTest.res +30 -0
  227. package/tests/components/commandtopic/CommandTopicStreamTest.res.mjs +35 -0
  228. package/tests/components/commandtopic/CommandTopicTest.res +55 -0
  229. package/tests/components/commandtopic/CommandTopicTest.res.mjs +62 -0
  230. package/tests/components/counter/CounterFixtures.res +42 -0
  231. package/tests/components/counter/CounterFixtures.res.mjs +34 -0
  232. package/tests/components/counter/CounterTest.res +46 -0
  233. package/tests/components/counter/CounterTest.res.mjs +61 -0
  234. package/tests/components/dcb/DcbCrossPartitionFixtures.res +170 -0
  235. package/tests/components/dcb/DcbCrossPartitionFixtures.res.mjs +276 -0
  236. package/tests/components/dcb/DcbCrossPartitionReadTest.res +68 -0
  237. package/tests/components/dcb/DcbCrossPartitionReadTest.res.mjs +78 -0
  238. package/tests/components/dcb/DcbEventLogAppendStreamTest.res +72 -0
  239. package/tests/components/dcb/DcbEventLogAppendStreamTest.res.mjs +82 -0
  240. package/tests/components/dcb/DcbEventLogStreamTest.res +103 -0
  241. package/tests/components/dcb/DcbEventLogStreamTest.res.mjs +91 -0
  242. package/tests/components/dcb/DcbFixtures.res +145 -0
  243. package/tests/components/dcb/DcbFixtures.res.mjs +221 -0
  244. package/tests/components/dcb/DcbTest.res +55 -0
  245. package/tests/components/dcb/DcbTest.res.mjs +55 -0
  246. package/tests/components/eventcollector/EventCollectorFixtures.res +42 -0
  247. package/tests/components/eventcollector/EventCollectorFixtures.res.mjs +49 -0
  248. package/tests/components/eventcollector/EventCollectorTest.res +37 -0
  249. package/tests/components/eventcollector/EventCollectorTest.res.mjs +36 -0
  250. package/tests/components/eventlog/EventLogAppendStreamTest.res +93 -0
  251. package/tests/components/eventlog/EventLogAppendStreamTest.res.mjs +113 -0
  252. package/tests/components/eventlog/EventLogConflictTest.res +86 -0
  253. package/tests/components/eventlog/EventLogConflictTest.res.mjs +81 -0
  254. package/tests/components/eventlog/EventLogFixtures.res +52 -0
  255. package/tests/components/eventlog/EventLogFixtures.res.mjs +80 -0
  256. package/tests/components/eventlog/EventLogStreamTest.res +98 -0
  257. package/tests/components/eventlog/EventLogStreamTest.res.mjs +142 -0
  258. package/tests/components/eventlog/EventLogTest.res +53 -0
  259. package/tests/components/eventlog/EventLogTest.res.mjs +74 -0
  260. package/tests/components/eventtopic/EventTopicFixtures.res +47 -0
  261. package/tests/components/eventtopic/EventTopicFixtures.res.mjs +77 -0
  262. package/tests/components/eventtopic/EventTopicStreamFixtures.res +27 -0
  263. package/tests/components/eventtopic/EventTopicStreamFixtures.res.mjs +62 -0
  264. package/tests/components/eventtopic/EventTopicStreamTest.res +35 -0
  265. package/tests/components/eventtopic/EventTopicStreamTest.res.mjs +44 -0
  266. package/tests/components/eventtopic/EventTopicTest.res +35 -0
  267. package/tests/components/eventtopic/EventTopicTest.res.mjs +43 -0
  268. package/tests/components/extensionpoint/ExtensionPointFixtures.res +145 -0
  269. package/tests/components/extensionpoint/ExtensionPointFixtures.res.mjs +188 -0
  270. package/tests/components/extensionpoint/ExtensionPointTest.res +62 -0
  271. package/tests/components/extensionpoint/ExtensionPointTest.res.mjs +55 -0
  272. package/tests/components/heartbeat/HeartbeatFixtures.res +48 -0
  273. package/tests/components/heartbeat/HeartbeatFixtures.res.mjs +46 -0
  274. package/tests/components/heartbeat/HeartbeatTest.res +67 -0
  275. package/tests/components/heartbeat/HeartbeatTest.res.mjs +65 -0
  276. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res +241 -0
  277. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res.mjs +239 -0
  278. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res +36 -0
  279. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res.mjs +73 -0
  280. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res +191 -0
  281. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res.mjs +297 -0
  282. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +78 -0
  283. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res.mjs +137 -0
  284. package/tests/components/querydb/QueryDbFixtures.res +39 -0
  285. package/tests/components/querydb/QueryDbFixtures.res.mjs +73 -0
  286. package/tests/components/querydb/QueryDbSubIdFixtures.res +44 -0
  287. package/tests/components/querydb/QueryDbSubIdFixtures.res.mjs +80 -0
  288. package/tests/components/querydb/QueryDbSubIdTest.res +104 -0
  289. package/tests/components/querydb/QueryDbSubIdTest.res.mjs +104 -0
  290. package/tests/components/querydb/QueryDbTest.res +81 -0
  291. package/tests/components/querydb/QueryDbTest.res.mjs +126 -0
  292. package/tests/components/readmodel/DcbReadModelE2EFixtures.res +215 -0
  293. package/tests/components/readmodel/DcbReadModelE2EFixtures.res.mjs +308 -0
  294. package/tests/components/readmodel/DcbReadModelE2ETest.res +45 -0
  295. package/tests/components/readmodel/DcbReadModelE2ETest.res.mjs +37 -0
  296. package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res +88 -0
  297. package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res.mjs +152 -0
  298. package/tests/components/readmodel/MixedSourceReadModelFixtures.res +181 -0
  299. package/tests/components/readmodel/MixedSourceReadModelFixtures.res.mjs +277 -0
  300. package/tests/components/readmodel/MixedSourceReadModelTest.res +61 -0
  301. package/tests/components/readmodel/MixedSourceReadModelTest.res.mjs +68 -0
  302. package/tests/components/readmodel/ReadModelFixtures.res +138 -0
  303. package/tests/components/readmodel/ReadModelFixtures.res.mjs +169 -0
  304. package/tests/components/readmodel/ReadModelTest.res +46 -0
  305. package/tests/components/readmodel/ReadModelTest.res.mjs +36 -0
  306. package/tests/components/scheduler/SchedulerFixtures.res +59 -0
  307. package/tests/components/scheduler/SchedulerFixtures.res.mjs +63 -0
  308. package/tests/components/scheduler/SchedulerTest.res +76 -0
  309. package/tests/components/scheduler/SchedulerTest.res.mjs +86 -0
  310. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res +133 -0
  311. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +149 -0
  312. package/tests/components/sideeffecthandler/SideEffectHandlerTest.res +39 -0
  313. package/tests/components/sideeffecthandler/SideEffectHandlerTest.res.mjs +28 -0
  314. package/tests/components/stateviewslice/StateViewSliceFixtures.res +117 -0
  315. package/tests/components/stateviewslice/StateViewSliceFixtures.res.mjs +188 -0
  316. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +117 -0
  317. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res.mjs +183 -0
  318. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res +78 -0
  319. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res.mjs +107 -0
  320. package/tests/components/stateviewslice/StateViewSliceTest.res +59 -0
  321. package/tests/components/stateviewslice/StateViewSliceTest.res.mjs +72 -0
  322. package/tests/components/task/TaskFixtures.res +87 -0
  323. package/tests/components/task/TaskFixtures.res.mjs +82 -0
  324. package/tests/components/task/TaskTest.res +98 -0
  325. package/tests/components/task/TaskTest.res.mjs +46 -0
  326. package/tests/plugin/PluginBehavior_GWT.res +146 -0
  327. package/tests/plugin/PluginBehavior_GWT.res.mjs +281 -0
  328. package/tests/plugin/Plugin_Fixtures.res +61 -0
  329. package/tests/plugin/Plugin_Fixtures.res.mjs +105 -0
  330. package/tests/plugin/PluginsProjection_GWT.res +95 -0
  331. package/tests/plugin/PluginsProjection_GWT.res.mjs +120 -0
  332. package/tests/plugin/UIFragmentRegistryProjection_GWT.res +72 -0
  333. package/tests/plugin/UIFragmentRegistryProjection_GWT.res.mjs +117 -0
  334. package/tests/setup/sqliteGlobal.cjs +12 -0
@@ -0,0 +1,16 @@
1
+ // Plugin_Builder Spec for the local platform.
2
+ // Provides no-op runtime operations, identity resource naming, and "local" environment.
3
+
4
+ let runtimeOps: ReventlessCore.PluginRuntimeOperations.operations = {
5
+ messagePublish: {
6
+ sendMessageToChannel: (~channelId as _, ~messageBody as _) => Promise.resolve(),
7
+ },
8
+ }
9
+
10
+ let resourceNaming: ReventlessInfra.ResourceNaming.operations = {
11
+ validateName: name => name,
12
+ urnName: name => name,
13
+ }
14
+
15
+ let environment = "local"
16
+ let platformName = "local"
@@ -0,0 +1,33 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+
4
+ let runtimeOps = {
5
+ messagePublish: {
6
+ sendMessageToChannel: (param, param$1) => Promise.resolve()
7
+ }
8
+ };
9
+
10
+ function resourceNaming_validateName(name) {
11
+ return name;
12
+ }
13
+
14
+ function resourceNaming_urnName(name) {
15
+ return name;
16
+ }
17
+
18
+ let resourceNaming = {
19
+ validateName: resourceNaming_validateName,
20
+ urnName: resourceNaming_urnName
21
+ };
22
+
23
+ let environment = "local";
24
+
25
+ let platformName = "local";
26
+
27
+ export {
28
+ runtimeOps,
29
+ resourceNaming,
30
+ environment,
31
+ platformName,
32
+ }
33
+ /* No side effect */
@@ -0,0 +1,44 @@
1
+ // In-memory SideEffectHandler.
2
+ // In typical test scenarios, TaskSpec.setup returns sideEffects: None,
3
+ // so this make function is never called.
4
+ //
5
+ // When called, the scheduler operations (createSchedule/deleteSchedule) are
6
+ // forwarded to the provided ~scheduler; enqueueEvent remains a no-op.
7
+
8
+ let make = (
9
+ ~name,
10
+ ~sideEffects as _,
11
+ ~allEventTopics as _,
12
+ ~allCommandTopics as _,
13
+ ~targets as _=?,
14
+ ~queryEngine as _,
15
+ ~scheduler: ReventlessInfra.Scheduler.operations,
16
+ ~resourceNaming as _,
17
+ ~memorySize as _=?,
18
+ ~timeout as _=?,
19
+ ~opts=?,
20
+ ): ReventlessCore.SideEffectHandler.component => {
21
+ let noopEnqueueEvent: ReventlessInfra.EventCollector.enqueueEvent = async (_, _, _) => ()
22
+ let ops: ReventlessCore.SideEffectHandler.operations = {
23
+ enqueueEvent: noopEnqueueEvent,
24
+ // Delegate to the Scheduler adapter, passing empty resources (in-memory has no target queue).
25
+ createSchedule: async schedule => await scheduler.createSchedule([], schedule),
26
+ deleteSchedule: async scheduleName => await scheduler.deleteSchedule([], scheduleName),
27
+ }
28
+ let eventCollectorOutputs: ReventlessInfra.EventCollector.outputs = {
29
+ name,
30
+ resources: [],
31
+ }
32
+ ReventlessCore.Component.make(
33
+ ~componentType=ReventlessCore.SideEffectHandler.componentType->ReventlessCore.ComponentType.toString,
34
+ ~name,
35
+ ~construct=(self, cname) => {
36
+ self->ReventlessCore.Component.setOperations(Pulumi.Output.make(ops))
37
+ self->ReventlessCore.Component.setOutputs({
38
+ ReventlessCore.SideEffectHandler.name: cname,
39
+ eventCollector: eventCollectorOutputs,
40
+ })
41
+ },
42
+ ~opts=opts,
43
+ )
44
+ }
@@ -0,0 +1,34 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Pulumi from "@pulumi/pulumi";
4
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
5
+ import * as ComponentType$ReventlessCore from "@reventlessdev/reventless-core/src/ComponentType.res.mjs";
6
+ import * as SideEffectHandler$ReventlessCore from "@reventlessdev/reventless-core/src/components/SideEffectHandler/SideEffectHandler.res.mjs";
7
+
8
+ function make(name, param, param$1, param$2, param$3, param$4, scheduler, param$5, param$6, param$7, opts) {
9
+ let noopEnqueueEvent = async (param, param$1, param$2) => {};
10
+ let ops_createSchedule = async schedule => await scheduler.createSchedule([], schedule);
11
+ let ops_deleteSchedule = async scheduleName => await scheduler.deleteSchedule([], scheduleName);
12
+ let ops = {
13
+ enqueueEvent: noopEnqueueEvent,
14
+ createSchedule: ops_createSchedule,
15
+ deleteSchedule: ops_deleteSchedule
16
+ };
17
+ let eventCollectorOutputs_resources = [];
18
+ let eventCollectorOutputs = {
19
+ name: name,
20
+ resources: eventCollectorOutputs_resources
21
+ };
22
+ return Component$ReventlessCore.make(ComponentType$ReventlessCore.toString(SideEffectHandler$ReventlessCore.componentType), name, (self, cname) => {
23
+ Component$ReventlessCore.setOperations(self, Pulumi.output(ops));
24
+ return Component$ReventlessCore.setOutputs(self, {
25
+ name: cname,
26
+ eventCollector: eventCollectorOutputs
27
+ });
28
+ }, opts);
29
+ }
30
+
31
+ export {
32
+ make,
33
+ }
34
+ /* @pulumi/pulumi Not a pure module */
@@ -0,0 +1,4 @@
1
+ // Backwards-compatibility shim — re-exports DomainMCP_Server as the default MCP server.
2
+ // Note: the old MCP_Server.res has been renamed to DomainMCP_Server.res.
3
+ // MCP_Server.res now re-exports this module for backwards compatibility.
4
+ include DomainMCP_Server
@@ -0,0 +1,67 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as DomainMCP_Server$ReventlessLocal from "./DomainMCP_Server.res.mjs";
4
+
5
+ let log = DomainMCP_Server$ReventlessLocal.log;
6
+
7
+ let tools = DomainMCP_Server$ReventlessLocal.tools;
8
+
9
+ let resources = DomainMCP_Server$ReventlessLocal.resources;
10
+
11
+ let resourceTemplates = DomainMCP_Server$ReventlessLocal.resourceTemplates;
12
+
13
+ let registerTool = DomainMCP_Server$ReventlessLocal.registerTool;
14
+
15
+ let registerResource = DomainMCP_Server$ReventlessLocal.registerResource;
16
+
17
+ let registerResourceTemplate = DomainMCP_Server$ReventlessLocal.registerResourceTemplate;
18
+
19
+ let registerToolsFromEntries = DomainMCP_Server$ReventlessLocal.registerToolsFromEntries;
20
+
21
+ let registerResourcesFromEntries = DomainMCP_Server$ReventlessLocal.registerResourcesFromEntries;
22
+
23
+ let registerEventHistoryResourcesFromEntries = DomainMCP_Server$ReventlessLocal.registerEventHistoryResourcesFromEntries;
24
+
25
+ let activeServer = DomainMCP_Server$ReventlessLocal.activeServer;
26
+
27
+ let debug = DomainMCP_Server$ReventlessLocal.debug;
28
+
29
+ let extractIdentity = DomainMCP_Server$ReventlessLocal.extractIdentity;
30
+
31
+ let createServerInstance = DomainMCP_Server$ReventlessLocal.createServerInstance;
32
+
33
+ let start = DomainMCP_Server$ReventlessLocal.start;
34
+
35
+ let stop = DomainMCP_Server$ReventlessLocal.stop;
36
+
37
+ let reset = DomainMCP_Server$ReventlessLocal.reset;
38
+
39
+ let diagnostics = DomainMCP_Server$ReventlessLocal.diagnostics;
40
+
41
+ let printDiagnostics = DomainMCP_Server$ReventlessLocal.printDiagnostics;
42
+
43
+ let asInterface = DomainMCP_Server$ReventlessLocal.asInterface;
44
+
45
+ export {
46
+ log,
47
+ tools,
48
+ resources,
49
+ resourceTemplates,
50
+ registerTool,
51
+ registerResource,
52
+ registerResourceTemplate,
53
+ registerToolsFromEntries,
54
+ registerResourcesFromEntries,
55
+ registerEventHistoryResourcesFromEntries,
56
+ activeServer,
57
+ debug,
58
+ extractIdentity,
59
+ createServerInstance,
60
+ start,
61
+ stop,
62
+ reset,
63
+ diagnostics,
64
+ printDiagnostics,
65
+ asInterface,
66
+ }
67
+ /* DomainMCP_Server-ReventlessLocal Not a pure module */
@@ -0,0 +1,362 @@
1
+ // MCP server instance factory.
2
+ // Creates independent server instances with isolated registries.
3
+ // Used by Platform to create separate core and plugin servers in split mode.
4
+
5
+ let log = ReventlessCore.Logger.fromEnv()
6
+
7
+ type toolHandler = (JSON.t, Reventless.Identity.t) => promise<McpSdk.callToolResult>
8
+ type resourceHandler = string => promise<McpSdk.readResourceResult>
9
+
10
+ type registeredTool = {
11
+ definition: ReventlessCore.MCP_SchemaGenerator.mcpToolDefinition,
12
+ handler: toolHandler,
13
+ }
14
+
15
+ type registeredResource = {
16
+ definition: ReventlessCore.MCP_SchemaGenerator.mcpResourceDefinition,
17
+ handler: resourceHandler,
18
+ }
19
+
20
+ type diagnostics = {
21
+ registeredTools: array<string>,
22
+ registeredResources: array<string>,
23
+ toolCount: int,
24
+ resourceCount: int,
25
+ serverRunning: bool,
26
+ }
27
+
28
+ type t = {
29
+ registerTool: (~name: string, ~definition: ReventlessCore.MCP_SchemaGenerator.mcpToolDefinition, ~handler: toolHandler) => unit,
30
+ registerResource: (~name: string, ~definition: ReventlessCore.MCP_SchemaGenerator.mcpResourceDefinition, ~handler: resourceHandler) => unit,
31
+ registerResourceTemplate: (~name: string, ~definition: ReventlessCore.MCP_SchemaGenerator.mcpResourceDefinition, ~handler: resourceHandler) => unit,
32
+ registerToolsFromEntries: (
33
+ ~pluginName: string,
34
+ ~mutationEntries: array<ReventlessInfra.Api.mutationSchemaEntry>,
35
+ ~commandHandler: (string, JSON.t, Reventless.Identity.t) => promise<string>,
36
+ ) => unit,
37
+ registerResourcesFromEntries: (
38
+ ~pluginName: string,
39
+ ~queryEntries: array<ReventlessInfra.Api.querySchemaEntry>,
40
+ ~queryHandler: (string, string) => promise<JSON.t>,
41
+ ) => unit,
42
+ registerEventHistoryResourcesFromEntries: (
43
+ ~pluginName: string,
44
+ ~eventLogEntries: array<ReventlessInfra.Api.eventLogSchemaEntry>,
45
+ ~eventLogHandler: (string, string) => promise<JSON.t>,
46
+ ) => unit,
47
+ start: (~port: int=?, unit) => unit,
48
+ stop: unit => unit,
49
+ reset: unit => unit,
50
+ diagnostics: unit => diagnostics,
51
+ printDiagnostics: unit => unit,
52
+ }
53
+
54
+ @val external processEnv: dict<string> = "process.env"
55
+ let debug = processEnv->Dict.get("MCP_DEBUG")->Option.isSome
56
+
57
+ let make = (~label: string="MCP"): t => {
58
+ let tools: ref<dict<registeredTool>> = ref(Dict.make())
59
+ let resources: ref<dict<registeredResource>> = ref(Dict.make())
60
+ let resourceTemplates: ref<dict<registeredResource>> = ref(Dict.make())
61
+ let activeServer: ref<option<McpSdk.httpServer>> = ref(None)
62
+
63
+ let registerTool = (~name: string, ~definition, ~handler: toolHandler) => {
64
+ tools.contents->Dict.set(name, {definition, handler})
65
+ }
66
+
67
+ let registerResource = (~name: string, ~definition, ~handler: resourceHandler) => {
68
+ resources.contents->Dict.set(name, {definition, handler})
69
+ }
70
+
71
+ let registerResourceTemplate = (~name: string, ~definition, ~handler: resourceHandler) => {
72
+ resourceTemplates.contents->Dict.set(name, {definition, handler})
73
+ }
74
+
75
+ let registerToolsFromEntries = (
76
+ ~pluginName: string,
77
+ ~mutationEntries: array<ReventlessInfra.Api.mutationSchemaEntry>,
78
+ ~commandHandler: (string, JSON.t, Reventless.Identity.t) => promise<string>,
79
+ ) => {
80
+ let toolDefs = ReventlessCore.MCP_SchemaGenerator.generateTools(~pluginName, ~mutationEntries)
81
+ toolDefs->Array.forEach(def => {
82
+ let handler: toolHandler = async (args, identity) => {
83
+ try {
84
+ let result = await commandHandler(def.name, args, identity)
85
+ McpSdk_Helpers.toolResult(result)
86
+ } catch {
87
+ | exn =>
88
+ let msg =
89
+ exn
90
+ ->JsExn.fromException
91
+ ->Option.flatMap(JsExn.message)
92
+ ->Option.getOr("Command failed")
93
+ McpSdk_Helpers.toolError(msg)
94
+ }
95
+ }
96
+ registerTool(~name=def.name, ~definition=def, ~handler)
97
+ })
98
+ }
99
+
100
+ let registerResourcesFromEntries = (
101
+ ~pluginName: string,
102
+ ~queryEntries: array<ReventlessInfra.Api.querySchemaEntry>,
103
+ ~queryHandler: (string, string) => promise<JSON.t>,
104
+ ) => {
105
+ let resourceDefs = ReventlessCore.MCP_SchemaGenerator.generateResources(
106
+ ~pluginName,
107
+ ~queryEntries,
108
+ )
109
+ resourceDefs->Array.forEach(def => {
110
+ let handler: resourceHandler = async uri => {
111
+ let result = await queryHandler(def.name, uri)
112
+ {
113
+ McpSdk.contents: [
114
+ {
115
+ McpSdk.uri,
116
+ text: result->JSON.stringify,
117
+ },
118
+ ],
119
+ }
120
+ }
121
+ if def.uriTemplate->String.includes("{") {
122
+ registerResourceTemplate(~name=def.name, ~definition=def, ~handler)
123
+ } else {
124
+ registerResource(~name=def.name, ~definition=def, ~handler)
125
+ }
126
+ })
127
+ }
128
+
129
+ let registerEventHistoryResourcesFromEntries = (
130
+ ~pluginName: string,
131
+ ~eventLogEntries: array<ReventlessInfra.Api.eventLogSchemaEntry>,
132
+ ~eventLogHandler: (string, string) => promise<JSON.t>,
133
+ ) => {
134
+ let resourceDefs = ReventlessCore.MCP_SchemaGenerator.generateEventHistoryResources(
135
+ ~pluginName,
136
+ ~eventLogEntries,
137
+ )
138
+ resourceDefs->Array.forEach(def => {
139
+ let handler: resourceHandler = async uri => {
140
+ let result = await eventLogHandler(def.name, uri)
141
+ {
142
+ McpSdk.contents: [
143
+ {
144
+ McpSdk.uri,
145
+ text: result->JSON.stringify,
146
+ },
147
+ ],
148
+ }
149
+ }
150
+ registerResourceTemplate(~name=def.name, ~definition=def, ~handler)
151
+ })
152
+ }
153
+
154
+ let extractIdentity = (req: McpSdk.incomingMessage): Reventless.Identity.t => {
155
+ try {
156
+ let headers: dict<string> = (req->Obj.magic)["headers"]
157
+ switch headers->Dict.get("x-identity") {
158
+ | Some(json) =>
159
+ json
160
+ ->JSON.parseOrThrow
161
+ ->S.parseOrThrow(Reventless.Identity.schema)
162
+ | None => Reventless.Identity.anonymous
163
+ }
164
+ } catch {
165
+ | _ => Reventless.Identity.anonymous
166
+ }
167
+ }
168
+
169
+ let createServerInstance = (identity: Reventless.Identity.t) => {
170
+ let server = McpSdk.newServer(
171
+ {name: `reventless-${label->String.toLowerCase}`, version: "1.0.0"},
172
+ {capabilities: {tools: {_placeholder: false}, resources: {_placeholder: false}}},
173
+ )
174
+
175
+ server->McpSdk_Helpers.onListTools(async () => {
176
+ let toolDefs =
177
+ tools.contents
178
+ ->Dict.valuesToArray
179
+ ->Array.map(({definition}) => {
180
+ McpSdk.name: definition.name,
181
+ description: definition.description,
182
+ inputSchema: definition.inputSchema,
183
+ })
184
+ {McpSdk.tools: toolDefs}
185
+ })
186
+
187
+ server->McpSdk_Helpers.onCallTool(async req => {
188
+ let toolName = req.params.name
189
+ let args = req.params.arguments->Option.getOr(JSON.Encode.null)
190
+ if debug {
191
+ log.info(~comp=label, `tools/call: ${toolName}`)
192
+ }
193
+ switch tools.contents->Dict.get(toolName) {
194
+ | Some({handler}) => await handler(args, identity)
195
+ | None => McpSdk_Helpers.toolError(`Unknown tool: ${toolName}`)
196
+ }
197
+ })
198
+
199
+ server->McpSdk_Helpers.onListResources(async () => {
200
+ let resourceDefs =
201
+ resources.contents
202
+ ->Dict.valuesToArray
203
+ ->Array.map(({definition}) => {
204
+ McpSdk.uri: definition.uriTemplate,
205
+ name: definition.name,
206
+ description: definition.description,
207
+ mimeType: definition.mimeType,
208
+ })
209
+ {McpSdk.resources: resourceDefs}
210
+ })
211
+
212
+ server->McpSdk_Helpers.onListResourceTemplates(async () => {
213
+ let templateDefs =
214
+ resourceTemplates.contents
215
+ ->Dict.valuesToArray
216
+ ->Array.map(({definition}) => {
217
+ McpSdk.uriTemplate: definition.uriTemplate,
218
+ name: definition.name,
219
+ description: definition.description,
220
+ mimeType: definition.mimeType,
221
+ })
222
+ {McpSdk.resourceTemplates: templateDefs}
223
+ })
224
+
225
+ server->McpSdk_Helpers.onReadResource(async req => {
226
+ let uri = req.params.uri
227
+ if debug {
228
+ log.info(~comp=label, `resources/read: ${uri}`)
229
+ }
230
+ let matchedResource =
231
+ resources.contents
232
+ ->Dict.valuesToArray
233
+ ->Array.find(({definition}) => uri->String.includes(definition.name))
234
+ switch matchedResource {
235
+ | Some({definition, handler}) =>
236
+ if debug {
237
+ log.debug(~comp=label, `matched resource: ${definition.name}`)
238
+ }
239
+ await handler(uri)
240
+ | None =>
241
+ let matchedTemplate =
242
+ resourceTemplates.contents
243
+ ->Dict.valuesToArray
244
+ ->Array.find(({definition}) => uri->String.includes(definition.name))
245
+ switch matchedTemplate {
246
+ | Some({definition, handler}) =>
247
+ if debug {
248
+ log.debug(~comp=label, `matched template: ${definition.name}`)
249
+ }
250
+ await handler(uri)
251
+ | None => {
252
+ McpSdk.contents: [
253
+ {McpSdk.uri, text: `{"error": "Resource not found: ${uri}"}`},
254
+ ],
255
+ }
256
+ }
257
+ }
258
+ })
259
+
260
+ server
261
+ }
262
+
263
+ let start = (~port: int=3001, ()) => {
264
+ let httpServer = McpSdk.createHttpServer((req, res) => {
265
+ let _ = (async () => {
266
+ let reqMethod = req->McpSdk.method
267
+ let reqUrl = req->McpSdk.url
268
+
269
+ res->McpSdk.setHeader("Access-Control-Allow-Origin", "*")
270
+ res->McpSdk.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS")
271
+ res->McpSdk.setHeader("Access-Control-Allow-Headers", "Content-Type")
272
+
273
+ if reqUrl == "/mcp" || reqUrl->String.startsWith("/mcp?") {
274
+ switch reqMethod {
275
+ | "OPTIONS" =>
276
+ res->McpSdk.setStatusCode(204)
277
+ res->McpSdk.endResponseNoBody
278
+ | "POST" =>
279
+ let body = await McpSdk_Helpers.parseJsonBody(req)
280
+ let identity = extractIdentity(req)
281
+ let server = createServerInstance(identity)
282
+ let transport = McpSdk.newStreamableHTTPTransport({
283
+ enableJsonResponse: true,
284
+ })
285
+ let _ = await server->McpSdk.connect(transport)
286
+ let _ = await transport->McpSdk.handleRequest(req, res, body)
287
+ | "GET" =>
288
+ res->McpSdk.setHeader("Content-Type", "text/plain")
289
+ res->McpSdk.endResponse(`${label} server running`)
290
+ | "DELETE" =>
291
+ res->McpSdk.setStatusCode(200)
292
+ res->McpSdk.endResponseNoBody
293
+ | _ =>
294
+ res->McpSdk.setStatusCode(405)
295
+ res->McpSdk.endResponse("Method not allowed")
296
+ }
297
+ } else {
298
+ res->McpSdk.setStatusCode(404)
299
+ res->McpSdk.endResponse("Not found")
300
+ }
301
+ })()
302
+ })
303
+
304
+ httpServer->McpSdk.listen(port, () => {
305
+ log.info(~comp=label, `listening on http://localhost:${port->Int.toString}/mcp`)
306
+ })
307
+ activeServer.contents = Some(httpServer)
308
+ }
309
+
310
+ let stop = () =>
311
+ switch activeServer.contents {
312
+ | Some(server) =>
313
+ server->McpSdk.close(() => ())
314
+ activeServer.contents = None
315
+ | None => ()
316
+ }
317
+
318
+ let reset = () => {
319
+ tools.contents = Dict.make()
320
+ resources.contents = Dict.make()
321
+ resourceTemplates.contents = Dict.make()
322
+ }
323
+
324
+ let diagnostics = (): diagnostics => {
325
+ let toolNames = tools.contents->Dict.keysToArray
326
+ let resourceNames =
327
+ resources.contents
328
+ ->Dict.keysToArray
329
+ ->Array.concat(resourceTemplates.contents->Dict.keysToArray)
330
+ {
331
+ registeredTools: toolNames,
332
+ registeredResources: resourceNames,
333
+ toolCount: toolNames->Array.length,
334
+ resourceCount: resourceNames->Array.length,
335
+ serverRunning: activeServer.contents->Option.isSome,
336
+ }
337
+ }
338
+
339
+ let printDiagnostics = () => {
340
+ let d = diagnostics()
341
+ log.info(~comp=label, "diagnostics")
342
+ log.info(~comp=label, ` tools (${d.toolCount->Int.toString}):`)
343
+ d.registeredTools->Array.forEach(t => log.info(~comp=label, ` - ${t}`))
344
+ log.info(~comp=label, ` resources (${d.resourceCount->Int.toString}):`)
345
+ d.registeredResources->Array.forEach(r => log.info(~comp=label, ` - ${r}`))
346
+ log.info(~comp=label, ` server running: ${d.serverRunning ? "yes" : "no"}`)
347
+ }
348
+
349
+ {
350
+ registerTool,
351
+ registerResource,
352
+ registerResourceTemplate,
353
+ registerToolsFromEntries,
354
+ registerResourcesFromEntries,
355
+ registerEventHistoryResourcesFromEntries,
356
+ start,
357
+ stop,
358
+ reset,
359
+ diagnostics,
360
+ printDiagnostics,
361
+ }
362
+ }