@methodts/runtime 0.1.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 (537) hide show
  1. package/dist/__fixtures__/executor-fixtures.d.ts +10 -0
  2. package/dist/__fixtures__/executor-fixtures.d.ts.map +1 -0
  3. package/dist/__fixtures__/executor-fixtures.js +36 -0
  4. package/dist/__fixtures__/executor-fixtures.js.map +1 -0
  5. package/dist/architecture.test.d.ts +2 -0
  6. package/dist/architecture.test.d.ts.map +1 -0
  7. package/dist/architecture.test.js +143 -0
  8. package/dist/architecture.test.js.map +1 -0
  9. package/dist/config/cost-governor-config.d.ts +40 -0
  10. package/dist/config/cost-governor-config.d.ts.map +1 -0
  11. package/dist/config/cost-governor-config.js +48 -0
  12. package/dist/config/cost-governor-config.js.map +1 -0
  13. package/dist/config/index.d.ts +7 -0
  14. package/dist/config/index.d.ts.map +1 -0
  15. package/dist/config/index.js +6 -0
  16. package/dist/config/index.js.map +1 -0
  17. package/dist/config/sessions-config.d.ts +29 -0
  18. package/dist/config/sessions-config.d.ts.map +1 -0
  19. package/dist/config/sessions-config.js +37 -0
  20. package/dist/config/sessions-config.js.map +1 -0
  21. package/dist/config/strategies-config.d.ts +38 -0
  22. package/dist/config/strategies-config.d.ts.map +1 -0
  23. package/dist/config/strategies-config.js +41 -0
  24. package/dist/config/strategies-config.js.map +1 -0
  25. package/dist/cost-governor/backpressure-queue.d.ts +20 -0
  26. package/dist/cost-governor/backpressure-queue.d.ts.map +1 -0
  27. package/dist/cost-governor/backpressure-queue.js +78 -0
  28. package/dist/cost-governor/backpressure-queue.js.map +1 -0
  29. package/dist/cost-governor/backpressure-queue.test.d.ts +2 -0
  30. package/dist/cost-governor/backpressure-queue.test.d.ts.map +1 -0
  31. package/dist/cost-governor/backpressure-queue.test.js +48 -0
  32. package/dist/cost-governor/backpressure-queue.test.js.map +1 -0
  33. package/dist/cost-governor/cost-events.d.ts +65 -0
  34. package/dist/cost-governor/cost-events.d.ts.map +1 -0
  35. package/dist/cost-governor/cost-events.js +48 -0
  36. package/dist/cost-governor/cost-events.js.map +1 -0
  37. package/dist/cost-governor/cost-governor-app-id.test.d.ts +19 -0
  38. package/dist/cost-governor/cost-governor-app-id.test.d.ts.map +1 -0
  39. package/dist/cost-governor/cost-governor-app-id.test.js +201 -0
  40. package/dist/cost-governor/cost-governor-app-id.test.js.map +1 -0
  41. package/dist/cost-governor/cost-oracle-impl.d.ts +19 -0
  42. package/dist/cost-governor/cost-oracle-impl.d.ts.map +1 -0
  43. package/dist/cost-governor/cost-oracle-impl.js +52 -0
  44. package/dist/cost-governor/cost-oracle-impl.js.map +1 -0
  45. package/dist/cost-governor/estimator.d.ts +22 -0
  46. package/dist/cost-governor/estimator.d.ts.map +1 -0
  47. package/dist/cost-governor/estimator.js +119 -0
  48. package/dist/cost-governor/estimator.js.map +1 -0
  49. package/dist/cost-governor/estimator.test.d.ts +2 -0
  50. package/dist/cost-governor/estimator.test.d.ts.map +1 -0
  51. package/dist/cost-governor/estimator.test.js +141 -0
  52. package/dist/cost-governor/estimator.test.js.map +1 -0
  53. package/dist/cost-governor/index.d.ts +75 -0
  54. package/dist/cost-governor/index.d.ts.map +1 -0
  55. package/dist/cost-governor/index.js +120 -0
  56. package/dist/cost-governor/index.js.map +1 -0
  57. package/dist/cost-governor/observations-store.d.ts +49 -0
  58. package/dist/cost-governor/observations-store.d.ts.map +1 -0
  59. package/dist/cost-governor/observations-store.js +179 -0
  60. package/dist/cost-governor/observations-store.js.map +1 -0
  61. package/dist/cost-governor/observations-store.test.d.ts +2 -0
  62. package/dist/cost-governor/observations-store.test.d.ts.map +1 -0
  63. package/dist/cost-governor/observations-store.test.js +191 -0
  64. package/dist/cost-governor/observations-store.test.js.map +1 -0
  65. package/dist/cost-governor/percentile.d.ts +17 -0
  66. package/dist/cost-governor/percentile.d.ts.map +1 -0
  67. package/dist/cost-governor/percentile.js +33 -0
  68. package/dist/cost-governor/percentile.js.map +1 -0
  69. package/dist/cost-governor/percentile.test.d.ts +2 -0
  70. package/dist/cost-governor/percentile.test.d.ts.map +1 -0
  71. package/dist/cost-governor/percentile.test.js +46 -0
  72. package/dist/cost-governor/percentile.test.js.map +1 -0
  73. package/dist/cost-governor/rate-governor-impl.d.ts +73 -0
  74. package/dist/cost-governor/rate-governor-impl.d.ts.map +1 -0
  75. package/dist/cost-governor/rate-governor-impl.js +148 -0
  76. package/dist/cost-governor/rate-governor-impl.js.map +1 -0
  77. package/dist/cost-governor/signature-builder.d.ts +22 -0
  78. package/dist/cost-governor/signature-builder.d.ts.map +1 -0
  79. package/dist/cost-governor/signature-builder.js +43 -0
  80. package/dist/cost-governor/signature-builder.js.map +1 -0
  81. package/dist/cost-governor/signature-builder.test.d.ts +2 -0
  82. package/dist/cost-governor/signature-builder.test.d.ts.map +1 -0
  83. package/dist/cost-governor/signature-builder.test.js +58 -0
  84. package/dist/cost-governor/signature-builder.test.js.map +1 -0
  85. package/dist/cost-governor/token-bucket.d.ts +57 -0
  86. package/dist/cost-governor/token-bucket.d.ts.map +1 -0
  87. package/dist/cost-governor/token-bucket.js +109 -0
  88. package/dist/cost-governor/token-bucket.js.map +1 -0
  89. package/dist/cost-governor/token-bucket.test.d.ts +2 -0
  90. package/dist/cost-governor/token-bucket.test.d.ts.map +1 -0
  91. package/dist/cost-governor/token-bucket.test.js +67 -0
  92. package/dist/cost-governor/token-bucket.test.js.map +1 -0
  93. package/dist/dlq/cortex-dlq-observer.d.ts +22 -0
  94. package/dist/dlq/cortex-dlq-observer.d.ts.map +1 -0
  95. package/dist/dlq/cortex-dlq-observer.js +29 -0
  96. package/dist/dlq/cortex-dlq-observer.js.map +1 -0
  97. package/dist/dlq/dlq-observer.test.d.ts +8 -0
  98. package/dist/dlq/dlq-observer.test.d.ts.map +1 -0
  99. package/dist/dlq/dlq-observer.test.js +103 -0
  100. package/dist/dlq/dlq-observer.test.js.map +1 -0
  101. package/dist/dlq/index.d.ts +6 -0
  102. package/dist/dlq/index.d.ts.map +1 -0
  103. package/dist/dlq/index.js +6 -0
  104. package/dist/dlq/index.js.map +1 -0
  105. package/dist/event-bus/adapters.d.ts +50 -0
  106. package/dist/event-bus/adapters.d.ts.map +1 -0
  107. package/dist/event-bus/adapters.js +51 -0
  108. package/dist/event-bus/adapters.js.map +1 -0
  109. package/dist/event-bus/adapters.test.d.ts +5 -0
  110. package/dist/event-bus/adapters.test.d.ts.map +1 -0
  111. package/dist/event-bus/adapters.test.js +73 -0
  112. package/dist/event-bus/adapters.test.js.map +1 -0
  113. package/dist/event-bus/agent-event-adapter.d.ts +22 -0
  114. package/dist/event-bus/agent-event-adapter.d.ts.map +1 -0
  115. package/dist/event-bus/agent-event-adapter.js +49 -0
  116. package/dist/event-bus/agent-event-adapter.js.map +1 -0
  117. package/dist/event-bus/agent-event-adapter.test.d.ts +5 -0
  118. package/dist/event-bus/agent-event-adapter.test.d.ts.map +1 -0
  119. package/dist/event-bus/agent-event-adapter.test.js +170 -0
  120. package/dist/event-bus/agent-event-adapter.test.js.map +1 -0
  121. package/dist/event-bus/channel-sink.d.ts +71 -0
  122. package/dist/event-bus/channel-sink.d.ts.map +1 -0
  123. package/dist/event-bus/channel-sink.js +159 -0
  124. package/dist/event-bus/channel-sink.js.map +1 -0
  125. package/dist/event-bus/channel-sink.test.d.ts +5 -0
  126. package/dist/event-bus/channel-sink.test.d.ts.map +1 -0
  127. package/dist/event-bus/channel-sink.test.js +234 -0
  128. package/dist/event-bus/channel-sink.test.js.map +1 -0
  129. package/dist/event-bus/event-types.snapshot.test.d.ts +27 -0
  130. package/dist/event-bus/event-types.snapshot.test.d.ts.map +1 -0
  131. package/dist/event-bus/event-types.snapshot.test.js +165 -0
  132. package/dist/event-bus/event-types.snapshot.test.js.map +1 -0
  133. package/dist/event-bus/genesis-sink.d.ts +55 -0
  134. package/dist/event-bus/genesis-sink.d.ts.map +1 -0
  135. package/dist/event-bus/genesis-sink.js +141 -0
  136. package/dist/event-bus/genesis-sink.js.map +1 -0
  137. package/dist/event-bus/genesis-sink.test.d.ts +5 -0
  138. package/dist/event-bus/genesis-sink.test.d.ts.map +1 -0
  139. package/dist/event-bus/genesis-sink.test.js +160 -0
  140. package/dist/event-bus/genesis-sink.test.js.map +1 -0
  141. package/dist/event-bus/in-memory-event-bus.d.ts +60 -0
  142. package/dist/event-bus/in-memory-event-bus.d.ts.map +1 -0
  143. package/dist/event-bus/in-memory-event-bus.js +274 -0
  144. package/dist/event-bus/in-memory-event-bus.js.map +1 -0
  145. package/dist/event-bus/in-memory-event-bus.test.d.ts +5 -0
  146. package/dist/event-bus/in-memory-event-bus.test.d.ts.map +1 -0
  147. package/dist/event-bus/in-memory-event-bus.test.js +457 -0
  148. package/dist/event-bus/in-memory-event-bus.test.js.map +1 -0
  149. package/dist/event-bus/index.d.ts +22 -0
  150. package/dist/event-bus/index.d.ts.map +1 -0
  151. package/dist/event-bus/index.js +17 -0
  152. package/dist/event-bus/index.js.map +1 -0
  153. package/dist/event-bus/persistence-sink.d.ts +74 -0
  154. package/dist/event-bus/persistence-sink.d.ts.map +1 -0
  155. package/dist/event-bus/persistence-sink.js +193 -0
  156. package/dist/event-bus/persistence-sink.js.map +1 -0
  157. package/dist/event-bus/persistence-sink.test.d.ts +6 -0
  158. package/dist/event-bus/persistence-sink.test.d.ts.map +1 -0
  159. package/dist/event-bus/persistence-sink.test.js +319 -0
  160. package/dist/event-bus/persistence-sink.test.js.map +1 -0
  161. package/dist/event-bus/session-checkpoint-sink.d.ts +91 -0
  162. package/dist/event-bus/session-checkpoint-sink.d.ts.map +1 -0
  163. package/dist/event-bus/session-checkpoint-sink.js +107 -0
  164. package/dist/event-bus/session-checkpoint-sink.js.map +1 -0
  165. package/dist/event-bus/session-checkpoint-sink.test.d.ts +5 -0
  166. package/dist/event-bus/session-checkpoint-sink.test.d.ts.map +1 -0
  167. package/dist/event-bus/session-checkpoint-sink.test.js +215 -0
  168. package/dist/event-bus/session-checkpoint-sink.test.js.map +1 -0
  169. package/dist/event-bus/webhook-connector.d.ts +59 -0
  170. package/dist/event-bus/webhook-connector.d.ts.map +1 -0
  171. package/dist/event-bus/webhook-connector.js +191 -0
  172. package/dist/event-bus/webhook-connector.js.map +1 -0
  173. package/dist/event-bus/webhook-connector.test.d.ts +5 -0
  174. package/dist/event-bus/webhook-connector.test.d.ts.map +1 -0
  175. package/dist/event-bus/webhook-connector.test.js +214 -0
  176. package/dist/event-bus/webhook-connector.test.js.map +1 -0
  177. package/dist/executors/cortex-job-backed-executor.d.ts +137 -0
  178. package/dist/executors/cortex-job-backed-executor.d.ts.map +1 -0
  179. package/dist/executors/cortex-job-backed-executor.js +441 -0
  180. package/dist/executors/cortex-job-backed-executor.js.map +1 -0
  181. package/dist/executors/cortex-job-backed-executor.test.d.ts +13 -0
  182. package/dist/executors/cortex-job-backed-executor.test.d.ts.map +1 -0
  183. package/dist/executors/cortex-job-backed-executor.test.js +303 -0
  184. package/dist/executors/cortex-job-backed-executor.test.js.map +1 -0
  185. package/dist/executors/index.d.ts +9 -0
  186. package/dist/executors/index.d.ts.map +1 -0
  187. package/dist/executors/index.js +9 -0
  188. package/dist/executors/index.js.map +1 -0
  189. package/dist/index.d.ts +2 -0
  190. package/dist/index.d.ts.map +1 -0
  191. package/dist/index.js +13 -0
  192. package/dist/index.js.map +1 -0
  193. package/dist/ports/checkpoint-sink.d.ts +69 -0
  194. package/dist/ports/checkpoint-sink.d.ts.map +1 -0
  195. package/dist/ports/checkpoint-sink.js +16 -0
  196. package/dist/ports/checkpoint-sink.js.map +1 -0
  197. package/dist/ports/checkpoint.d.ts +68 -0
  198. package/dist/ports/checkpoint.d.ts.map +1 -0
  199. package/dist/ports/checkpoint.js +14 -0
  200. package/dist/ports/checkpoint.js.map +1 -0
  201. package/dist/ports/continuation-envelope-cross-app.test.d.ts +10 -0
  202. package/dist/ports/continuation-envelope-cross-app.test.d.ts.map +1 -0
  203. package/dist/ports/continuation-envelope-cross-app.test.js +95 -0
  204. package/dist/ports/continuation-envelope-cross-app.test.js.map +1 -0
  205. package/dist/ports/continuation-envelope.d.ts +199 -0
  206. package/dist/ports/continuation-envelope.d.ts.map +1 -0
  207. package/dist/ports/continuation-envelope.js +69 -0
  208. package/dist/ports/continuation-envelope.js.map +1 -0
  209. package/dist/ports/conversation.d.ts +64 -0
  210. package/dist/ports/conversation.d.ts.map +1 -0
  211. package/dist/ports/conversation.js +19 -0
  212. package/dist/ports/conversation.js.map +1 -0
  213. package/dist/ports/cost-oracle.d.ts +26 -0
  214. package/dist/ports/cost-oracle.d.ts.map +1 -0
  215. package/dist/ports/cost-oracle.js +9 -0
  216. package/dist/ports/cost-oracle.js.map +1 -0
  217. package/dist/ports/cross-app-invoker.d.ts +198 -0
  218. package/dist/ports/cross-app-invoker.d.ts.map +1 -0
  219. package/dist/ports/cross-app-invoker.js +157 -0
  220. package/dist/ports/cross-app-invoker.js.map +1 -0
  221. package/dist/ports/dlq-observer.d.ts +40 -0
  222. package/dist/ports/dlq-observer.d.ts.map +1 -0
  223. package/dist/ports/dlq-observer.js +20 -0
  224. package/dist/ports/dlq-observer.js.map +1 -0
  225. package/dist/ports/event-bus.d.ts +169 -0
  226. package/dist/ports/event-bus.d.ts.map +1 -0
  227. package/dist/ports/event-bus.js +20 -0
  228. package/dist/ports/event-bus.js.map +1 -0
  229. package/dist/ports/event-reader.d.ts +21 -0
  230. package/dist/ports/event-reader.d.ts.map +1 -0
  231. package/dist/ports/event-reader.js +12 -0
  232. package/dist/ports/event-reader.js.map +1 -0
  233. package/dist/ports/event-rotator.d.ts +39 -0
  234. package/dist/ports/event-rotator.d.ts.map +1 -0
  235. package/dist/ports/event-rotator.js +15 -0
  236. package/dist/ports/event-rotator.js.map +1 -0
  237. package/dist/ports/file-system.d.ts +48 -0
  238. package/dist/ports/file-system.d.ts.map +1 -0
  239. package/dist/ports/file-system.js +10 -0
  240. package/dist/ports/file-system.js.map +1 -0
  241. package/dist/ports/historical-observations.d.ts +39 -0
  242. package/dist/ports/historical-observations.d.ts.map +1 -0
  243. package/dist/ports/historical-observations.js +12 -0
  244. package/dist/ports/historical-observations.js.map +1 -0
  245. package/dist/ports/in-memory-source.d.ts +46 -0
  246. package/dist/ports/in-memory-source.d.ts.map +1 -0
  247. package/dist/ports/in-memory-source.js +69 -0
  248. package/dist/ports/in-memory-source.js.map +1 -0
  249. package/dist/ports/index.d.ts +32 -0
  250. package/dist/ports/index.d.ts.map +1 -0
  251. package/dist/ports/index.js +10 -0
  252. package/dist/ports/index.js.map +1 -0
  253. package/dist/ports/job-backed-executor.d.ts +139 -0
  254. package/dist/ports/job-backed-executor.d.ts.map +1 -0
  255. package/dist/ports/job-backed-executor.js +56 -0
  256. package/dist/ports/job-backed-executor.js.map +1 -0
  257. package/dist/ports/methodology-source.d.ts +95 -0
  258. package/dist/ports/methodology-source.d.ts.map +1 -0
  259. package/dist/ports/methodology-source.js +26 -0
  260. package/dist/ports/methodology-source.js.map +1 -0
  261. package/dist/ports/native-session-discovery.d.ts +20 -0
  262. package/dist/ports/native-session-discovery.d.ts.map +1 -0
  263. package/dist/ports/native-session-discovery.js +13 -0
  264. package/dist/ports/native-session-discovery.js.map +1 -0
  265. package/dist/ports/projection-store.d.ts +48 -0
  266. package/dist/ports/projection-store.d.ts.map +1 -0
  267. package/dist/ports/projection-store.js +17 -0
  268. package/dist/ports/projection-store.js.map +1 -0
  269. package/dist/ports/projection.d.ts +29 -0
  270. package/dist/ports/projection.d.ts.map +1 -0
  271. package/dist/ports/projection.js +13 -0
  272. package/dist/ports/projection.js.map +1 -0
  273. package/dist/ports/rate-governor.d.ts +17 -0
  274. package/dist/ports/rate-governor.d.ts.map +1 -0
  275. package/dist/ports/rate-governor.js +11 -0
  276. package/dist/ports/rate-governor.js.map +1 -0
  277. package/dist/ports/schedule-client.d.ts +29 -0
  278. package/dist/ports/schedule-client.d.ts.map +1 -0
  279. package/dist/ports/schedule-client.js +2 -0
  280. package/dist/ports/schedule-client.js.map +1 -0
  281. package/dist/ports/session-pool.d.ts +162 -0
  282. package/dist/ports/session-pool.d.ts.map +1 -0
  283. package/dist/ports/session-pool.js +21 -0
  284. package/dist/ports/session-pool.js.map +1 -0
  285. package/dist/ports/session-store-errors.d.ts +22 -0
  286. package/dist/ports/session-store-errors.d.ts.map +1 -0
  287. package/dist/ports/session-store-errors.js +29 -0
  288. package/dist/ports/session-store-errors.js.map +1 -0
  289. package/dist/ports/session-store-types.d.ts +132 -0
  290. package/dist/ports/session-store-types.d.ts.map +1 -0
  291. package/dist/ports/session-store-types.js +14 -0
  292. package/dist/ports/session-store-types.js.map +1 -0
  293. package/dist/ports/session-store.d.ts +69 -0
  294. package/dist/ports/session-store.d.ts.map +1 -0
  295. package/dist/ports/session-store.js +23 -0
  296. package/dist/ports/session-store.js.map +1 -0
  297. package/dist/ports/yaml-loader.d.ts +15 -0
  298. package/dist/ports/yaml-loader.d.ts.map +1 -0
  299. package/dist/ports/yaml-loader.js +13 -0
  300. package/dist/ports/yaml-loader.js.map +1 -0
  301. package/dist/scheduling/index.d.ts +6 -0
  302. package/dist/scheduling/index.d.ts.map +1 -0
  303. package/dist/scheduling/index.js +6 -0
  304. package/dist/scheduling/index.js.map +1 -0
  305. package/dist/scheduling/scheduled-pact.d.ts +97 -0
  306. package/dist/scheduling/scheduled-pact.d.ts.map +1 -0
  307. package/dist/scheduling/scheduled-pact.js +89 -0
  308. package/dist/scheduling/scheduled-pact.js.map +1 -0
  309. package/dist/sessions/__tests__/cognitive-modules.test.d.ts +10 -0
  310. package/dist/sessions/__tests__/cognitive-modules.test.d.ts.map +1 -0
  311. package/dist/sessions/__tests__/cognitive-modules.test.js +535 -0
  312. package/dist/sessions/__tests__/cognitive-modules.test.js.map +1 -0
  313. package/dist/sessions/__tests__/cognitive-provider.test.d.ts +13 -0
  314. package/dist/sessions/__tests__/cognitive-provider.test.d.ts.map +1 -0
  315. package/dist/sessions/__tests__/cognitive-provider.test.js +331 -0
  316. package/dist/sessions/__tests__/cognitive-provider.test.js.map +1 -0
  317. package/dist/sessions/__tests__/cognitive-sink.test.d.ts +19 -0
  318. package/dist/sessions/__tests__/cognitive-sink.test.d.ts.map +1 -0
  319. package/dist/sessions/__tests__/cognitive-sink.test.js +334 -0
  320. package/dist/sessions/__tests__/cognitive-sink.test.js.map +1 -0
  321. package/dist/sessions/__tests__/runtime-tools.test.d.ts +2 -0
  322. package/dist/sessions/__tests__/runtime-tools.test.d.ts.map +1 -0
  323. package/dist/sessions/__tests__/runtime-tools.test.js +83 -0
  324. package/dist/sessions/__tests__/runtime-tools.test.js.map +1 -0
  325. package/dist/sessions/auto-retro.d.ts +29 -0
  326. package/dist/sessions/auto-retro.d.ts.map +1 -0
  327. package/dist/sessions/auto-retro.js +181 -0
  328. package/dist/sessions/auto-retro.js.map +1 -0
  329. package/dist/sessions/auto-retro.test.d.ts +2 -0
  330. package/dist/sessions/auto-retro.test.d.ts.map +1 -0
  331. package/dist/sessions/auto-retro.test.js +361 -0
  332. package/dist/sessions/auto-retro.test.js.map +1 -0
  333. package/dist/sessions/channels.d.ts +55 -0
  334. package/dist/sessions/channels.d.ts.map +1 -0
  335. package/dist/sessions/channels.js +118 -0
  336. package/dist/sessions/channels.js.map +1 -0
  337. package/dist/sessions/channels.test.d.ts +2 -0
  338. package/dist/sessions/channels.test.d.ts.map +1 -0
  339. package/dist/sessions/channels.test.js +285 -0
  340. package/dist/sessions/channels.test.js.map +1 -0
  341. package/dist/sessions/cognitive-modules.d.ts +100 -0
  342. package/dist/sessions/cognitive-modules.d.ts.map +1 -0
  343. package/dist/sessions/cognitive-modules.js +458 -0
  344. package/dist/sessions/cognitive-modules.js.map +1 -0
  345. package/dist/sessions/cognitive-provider.d.ts +42 -0
  346. package/dist/sessions/cognitive-provider.d.ts.map +1 -0
  347. package/dist/sessions/cognitive-provider.js +208 -0
  348. package/dist/sessions/cognitive-provider.js.map +1 -0
  349. package/dist/sessions/cognitive-sink.d.ts +73 -0
  350. package/dist/sessions/cognitive-sink.d.ts.map +1 -0
  351. package/dist/sessions/cognitive-sink.js +154 -0
  352. package/dist/sessions/cognitive-sink.js.map +1 -0
  353. package/dist/sessions/diagnostics.d.ts +70 -0
  354. package/dist/sessions/diagnostics.d.ts.map +1 -0
  355. package/dist/sessions/diagnostics.js +129 -0
  356. package/dist/sessions/diagnostics.js.map +1 -0
  357. package/dist/sessions/diagnostics.test.d.ts +2 -0
  358. package/dist/sessions/diagnostics.test.d.ts.map +1 -0
  359. package/dist/sessions/diagnostics.test.js +135 -0
  360. package/dist/sessions/diagnostics.test.js.map +1 -0
  361. package/dist/sessions/index.d.ts +32 -0
  362. package/dist/sessions/index.d.ts.map +1 -0
  363. package/dist/sessions/index.js +33 -0
  364. package/dist/sessions/index.js.map +1 -0
  365. package/dist/sessions/pool.d.ts +218 -0
  366. package/dist/sessions/pool.d.ts.map +1 -0
  367. package/dist/sessions/pool.js +991 -0
  368. package/dist/sessions/pool.js.map +1 -0
  369. package/dist/sessions/pool.test.d.ts +2 -0
  370. package/dist/sessions/pool.test.d.ts.map +1 -0
  371. package/dist/sessions/pool.test.js +633 -0
  372. package/dist/sessions/pool.test.js.map +1 -0
  373. package/dist/sessions/print-session.d.ts +142 -0
  374. package/dist/sessions/print-session.d.ts.map +1 -0
  375. package/dist/sessions/print-session.js +325 -0
  376. package/dist/sessions/print-session.js.map +1 -0
  377. package/dist/sessions/print-session.test.d.ts +2 -0
  378. package/dist/sessions/print-session.test.d.ts.map +1 -0
  379. package/dist/sessions/print-session.test.js +418 -0
  380. package/dist/sessions/print-session.test.js.map +1 -0
  381. package/dist/sessions/runtime-tools.d.ts +22 -0
  382. package/dist/sessions/runtime-tools.d.ts.map +1 -0
  383. package/dist/sessions/runtime-tools.js +162 -0
  384. package/dist/sessions/runtime-tools.js.map +1 -0
  385. package/dist/sessions/scope-hook.d.ts +77 -0
  386. package/dist/sessions/scope-hook.d.ts.map +1 -0
  387. package/dist/sessions/scope-hook.js +323 -0
  388. package/dist/sessions/scope-hook.js.map +1 -0
  389. package/dist/sessions/scope-hook.test.d.ts +2 -0
  390. package/dist/sessions/scope-hook.test.d.ts.map +1 -0
  391. package/dist/sessions/scope-hook.test.js +249 -0
  392. package/dist/sessions/scope-hook.test.js.map +1 -0
  393. package/dist/sessions/session-store/checkpoint-sink-impl.d.ts +16 -0
  394. package/dist/sessions/session-store/checkpoint-sink-impl.d.ts.map +1 -0
  395. package/dist/sessions/session-store/checkpoint-sink-impl.js +191 -0
  396. package/dist/sessions/session-store/checkpoint-sink-impl.js.map +1 -0
  397. package/dist/sessions/session-store/checkpoint-sink-impl.test.d.ts +5 -0
  398. package/dist/sessions/session-store/checkpoint-sink-impl.test.d.ts.map +1 -0
  399. package/dist/sessions/session-store/checkpoint-sink-impl.test.js +137 -0
  400. package/dist/sessions/session-store/checkpoint-sink-impl.test.js.map +1 -0
  401. package/dist/sessions/session-store/conformance.d.ts +59 -0
  402. package/dist/sessions/session-store/conformance.d.ts.map +1 -0
  403. package/dist/sessions/session-store/conformance.js +172 -0
  404. package/dist/sessions/session-store/conformance.js.map +1 -0
  405. package/dist/sessions/session-store/conformance.test.d.ts +7 -0
  406. package/dist/sessions/session-store/conformance.test.d.ts.map +1 -0
  407. package/dist/sessions/session-store/conformance.test.js +22 -0
  408. package/dist/sessions/session-store/conformance.test.js.map +1 -0
  409. package/dist/sessions/session-store/in-memory-session-store.d.ts +23 -0
  410. package/dist/sessions/session-store/in-memory-session-store.d.ts.map +1 -0
  411. package/dist/sessions/session-store/in-memory-session-store.js +197 -0
  412. package/dist/sessions/session-store/in-memory-session-store.js.map +1 -0
  413. package/dist/sessions/session-store/in-memory-session-store.test.d.ts +6 -0
  414. package/dist/sessions/session-store/in-memory-session-store.test.d.ts.map +1 -0
  415. package/dist/sessions/session-store/in-memory-session-store.test.js +183 -0
  416. package/dist/sessions/session-store/in-memory-session-store.test.js.map +1 -0
  417. package/dist/sessions/session-store/index.d.ts +20 -0
  418. package/dist/sessions/session-store/index.d.ts.map +1 -0
  419. package/dist/sessions/session-store/index.js +15 -0
  420. package/dist/sessions/session-store/index.js.map +1 -0
  421. package/dist/sessions/session-store/resume.d.ts +88 -0
  422. package/dist/sessions/session-store/resume.d.ts.map +1 -0
  423. package/dist/sessions/session-store/resume.js +96 -0
  424. package/dist/sessions/session-store/resume.js.map +1 -0
  425. package/dist/sessions/session-store/resume.test.d.ts +5 -0
  426. package/dist/sessions/session-store/resume.test.d.ts.map +1 -0
  427. package/dist/sessions/session-store/resume.test.js +119 -0
  428. package/dist/sessions/session-store/resume.test.js.map +1 -0
  429. package/dist/sessions/spawn-queue.d.ts +28 -0
  430. package/dist/sessions/spawn-queue.d.ts.map +1 -0
  431. package/dist/sessions/spawn-queue.js +63 -0
  432. package/dist/sessions/spawn-queue.js.map +1 -0
  433. package/dist/sessions/spawn-queue.test.d.ts +2 -0
  434. package/dist/sessions/spawn-queue.test.d.ts.map +1 -0
  435. package/dist/sessions/spawn-queue.test.js +65 -0
  436. package/dist/sessions/spawn-queue.test.js.map +1 -0
  437. package/dist/sessions/types.d.ts +16 -0
  438. package/dist/sessions/types.d.ts.map +1 -0
  439. package/dist/sessions/types.js +11 -0
  440. package/dist/sessions/types.js.map +1 -0
  441. package/dist/sessions/worktree-stale.test.d.ts +2 -0
  442. package/dist/sessions/worktree-stale.test.d.ts.map +1 -0
  443. package/dist/sessions/worktree-stale.test.js +468 -0
  444. package/dist/sessions/worktree-stale.test.js.map +1 -0
  445. package/dist/strategy/artifact-store.d.ts +12 -0
  446. package/dist/strategy/artifact-store.d.ts.map +1 -0
  447. package/dist/strategy/artifact-store.js +12 -0
  448. package/dist/strategy/artifact-store.js.map +1 -0
  449. package/dist/strategy/artifact-store.test.d.ts +2 -0
  450. package/dist/strategy/artifact-store.test.d.ts.map +1 -0
  451. package/dist/strategy/artifact-store.test.js +170 -0
  452. package/dist/strategy/artifact-store.test.js.map +1 -0
  453. package/dist/strategy/context-load-executor.d.ts +23 -0
  454. package/dist/strategy/context-load-executor.d.ts.map +1 -0
  455. package/dist/strategy/context-load-executor.js +87 -0
  456. package/dist/strategy/context-load-executor.js.map +1 -0
  457. package/dist/strategy/context-load-executor.test.d.ts +16 -0
  458. package/dist/strategy/context-load-executor.test.d.ts.map +1 -0
  459. package/dist/strategy/context-load-executor.test.js +158 -0
  460. package/dist/strategy/context-load-executor.test.js.map +1 -0
  461. package/dist/strategy/cortex-cross-app-invoker.stub.d.ts +65 -0
  462. package/dist/strategy/cortex-cross-app-invoker.stub.d.ts.map +1 -0
  463. package/dist/strategy/cortex-cross-app-invoker.stub.js +68 -0
  464. package/dist/strategy/cortex-cross-app-invoker.stub.js.map +1 -0
  465. package/dist/strategy/cross-app-node-executor.d.ts +54 -0
  466. package/dist/strategy/cross-app-node-executor.d.ts.map +1 -0
  467. package/dist/strategy/cross-app-node-executor.js +98 -0
  468. package/dist/strategy/cross-app-node-executor.js.map +1 -0
  469. package/dist/strategy/cross-app-node-executor.test.d.ts +13 -0
  470. package/dist/strategy/cross-app-node-executor.test.d.ts.map +1 -0
  471. package/dist/strategy/cross-app-node-executor.test.js +160 -0
  472. package/dist/strategy/cross-app-node-executor.test.js.map +1 -0
  473. package/dist/strategy/gates.d.ts +13 -0
  474. package/dist/strategy/gates.d.ts.map +1 -0
  475. package/dist/strategy/gates.js +13 -0
  476. package/dist/strategy/gates.js.map +1 -0
  477. package/dist/strategy/gates.test.d.ts +2 -0
  478. package/dist/strategy/gates.test.d.ts.map +1 -0
  479. package/dist/strategy/gates.test.js +299 -0
  480. package/dist/strategy/gates.test.js.map +1 -0
  481. package/dist/strategy/human-approval-resolver.d.ts +23 -0
  482. package/dist/strategy/human-approval-resolver.d.ts.map +1 -0
  483. package/dist/strategy/human-approval-resolver.js +94 -0
  484. package/dist/strategy/human-approval-resolver.js.map +1 -0
  485. package/dist/strategy/human-approval-resolver.test.d.ts +16 -0
  486. package/dist/strategy/human-approval-resolver.test.d.ts.map +1 -0
  487. package/dist/strategy/human-approval-resolver.test.js +200 -0
  488. package/dist/strategy/human-approval-resolver.test.js.map +1 -0
  489. package/dist/strategy/in-process-cross-app-invoker.d.ts +105 -0
  490. package/dist/strategy/in-process-cross-app-invoker.d.ts.map +1 -0
  491. package/dist/strategy/in-process-cross-app-invoker.js +206 -0
  492. package/dist/strategy/in-process-cross-app-invoker.js.map +1 -0
  493. package/dist/strategy/in-process-cross-app-invoker.test.d.ts +15 -0
  494. package/dist/strategy/in-process-cross-app-invoker.test.d.ts.map +1 -0
  495. package/dist/strategy/in-process-cross-app-invoker.test.js +190 -0
  496. package/dist/strategy/in-process-cross-app-invoker.test.js.map +1 -0
  497. package/dist/strategy/index.d.ts +29 -0
  498. package/dist/strategy/index.d.ts.map +1 -0
  499. package/dist/strategy/index.js +29 -0
  500. package/dist/strategy/index.js.map +1 -0
  501. package/dist/strategy/pacta-strategy.d.ts +97 -0
  502. package/dist/strategy/pacta-strategy.d.ts.map +1 -0
  503. package/dist/strategy/pacta-strategy.js +117 -0
  504. package/dist/strategy/pacta-strategy.js.map +1 -0
  505. package/dist/strategy/pacta-strategy.test.d.ts +2 -0
  506. package/dist/strategy/pacta-strategy.test.d.ts.map +1 -0
  507. package/dist/strategy/pacta-strategy.test.js +234 -0
  508. package/dist/strategy/pacta-strategy.test.js.map +1 -0
  509. package/dist/strategy/retro-generator.d.ts +18 -0
  510. package/dist/strategy/retro-generator.d.ts.map +1 -0
  511. package/dist/strategy/retro-generator.js +22 -0
  512. package/dist/strategy/retro-generator.js.map +1 -0
  513. package/dist/strategy/retro-writer.d.ts +25 -0
  514. package/dist/strategy/retro-writer.d.ts.map +1 -0
  515. package/dist/strategy/retro-writer.js +65 -0
  516. package/dist/strategy/retro-writer.js.map +1 -0
  517. package/dist/strategy/strategy-executor.d.ts +39 -0
  518. package/dist/strategy/strategy-executor.d.ts.map +1 -0
  519. package/dist/strategy/strategy-executor.js +253 -0
  520. package/dist/strategy/strategy-executor.js.map +1 -0
  521. package/dist/strategy/strategy-executor.test.d.ts +8 -0
  522. package/dist/strategy/strategy-executor.test.d.ts.map +1 -0
  523. package/dist/strategy/strategy-executor.test.js +1301 -0
  524. package/dist/strategy/strategy-executor.test.js.map +1 -0
  525. package/dist/strategy/strategy-parser.d.ts +30 -0
  526. package/dist/strategy/strategy-parser.d.ts.map +1 -0
  527. package/dist/strategy/strategy-parser.js +30 -0
  528. package/dist/strategy/strategy-parser.js.map +1 -0
  529. package/dist/strategy/sub-strategy-source.d.ts +27 -0
  530. package/dist/strategy/sub-strategy-source.d.ts.map +1 -0
  531. package/dist/strategy/sub-strategy-source.js +77 -0
  532. package/dist/strategy/sub-strategy-source.js.map +1 -0
  533. package/dist/strategy/types.d.ts +12 -0
  534. package/dist/strategy/types.d.ts.map +1 -0
  535. package/dist/strategy/types.js +9 -0
  536. package/dist/strategy/types.js.map +1 -0
  537. package/package.json +87 -0
@@ -0,0 +1,141 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * GenesisSink — PRD 026 Phase 4.
4
+ *
5
+ * Feeds events to the Genesis agent session via a narrow callback interface.
6
+ * Events are batched in a configurable time window (default 30s) and
7
+ * summarized into a human-readable prompt. Only events matching the severity
8
+ * filter are buffered (default: warning + error + critical).
9
+ *
10
+ * The sink receives a promptSession callback — NOT the SessionPool itself
11
+ * — to respect G-BOUNDARY. The composition root wires the callback.
12
+ */
13
+ const DEFAULT_BATCH_WINDOW_MS = 30_000;
14
+ const DEFAULT_SEVERITY_FILTER = ['warning', 'error', 'critical'];
15
+ // ── GenesisSink ─────────────────────────────────────────────────
16
+ export class GenesisSink {
17
+ name = 'genesis';
18
+ promptSession;
19
+ sessionId;
20
+ batchWindowMs;
21
+ severityFilter;
22
+ buffer = [];
23
+ timer = null;
24
+ disposed = false;
25
+ constructor(options) {
26
+ this.promptSession = options.promptSession;
27
+ this.sessionId = options.sessionId;
28
+ this.batchWindowMs = options.batchWindowMs ?? DEFAULT_BATCH_WINDOW_MS;
29
+ this.severityFilter = new Set(options.severityFilter ?? DEFAULT_SEVERITY_FILTER);
30
+ }
31
+ // ── EventSink interface ──────────────────────────────────────
32
+ onEvent(event) {
33
+ if (this.disposed)
34
+ return;
35
+ // Severity filter
36
+ if (!this.severityFilter.has(event.severity))
37
+ return;
38
+ this.buffer.push(event);
39
+ // Start batch window timer if not already running
40
+ if (!this.timer) {
41
+ this.timer = setTimeout(() => this.flush(), this.batchWindowMs);
42
+ }
43
+ }
44
+ onError(error, event) {
45
+ console.error(`[genesis-sink] Error processing event ${event.id}:`, error.message);
46
+ }
47
+ // ── Flush & summarize ────────────────────────────────────────
48
+ /**
49
+ * Flush the buffer and prompt Genesis with a summary.
50
+ * Exposed for testing — normally called by the batch timer.
51
+ */
52
+ async flush() {
53
+ if (this.timer) {
54
+ clearTimeout(this.timer);
55
+ this.timer = null;
56
+ }
57
+ const events = this.buffer;
58
+ this.buffer = [];
59
+ if (events.length === 0)
60
+ return;
61
+ const summary = GenesisSink.summarize(events);
62
+ try {
63
+ await this.promptSession(this.sessionId, summary);
64
+ }
65
+ catch {
66
+ // Genesis is dead or unavailable — gracefully ignore.
67
+ // Events are lost, which is acceptable (best-effort delivery).
68
+ }
69
+ }
70
+ /**
71
+ * Summarize buffered events into a human-readable prompt for Genesis.
72
+ * Groups by domain and severity for efficient consumption.
73
+ */
74
+ static summarize(events) {
75
+ // Group by domain
76
+ const byDomain = new Map();
77
+ for (const e of events) {
78
+ const group = byDomain.get(e.domain) ?? [];
79
+ group.push(e);
80
+ byDomain.set(e.domain, group);
81
+ }
82
+ // Count by severity
83
+ const severityCounts = { warning: 0, error: 0, critical: 0 };
84
+ for (const e of events) {
85
+ if (e.severity in severityCounts) {
86
+ severityCounts[e.severity]++;
87
+ }
88
+ }
89
+ const lines = [
90
+ `SYSTEM EVENT SUMMARY — ${events.length} event(s) in last batch`,
91
+ `Severity: ${severityCounts.critical > 0 ? `${severityCounts.critical} critical, ` : ''}${severityCounts.error} error, ${severityCounts.warning} warning`,
92
+ '',
93
+ ];
94
+ for (const [domain, domainEvents] of byDomain) {
95
+ lines.push(`[${domain}] (${domainEvents.length} event${domainEvents.length > 1 ? 's' : ''}):`);
96
+ for (const e of domainEvents) {
97
+ const session = e.sessionId ? ` session=${e.sessionId.substring(0, 8)}` : '';
98
+ const project = e.projectId ? ` project=${e.projectId}` : '';
99
+ const detail = summarizePayload(e.payload);
100
+ lines.push(` - ${e.type} [${e.severity}]${session}${project}${detail ? ` — ${detail}` : ''}`);
101
+ }
102
+ }
103
+ lines.push('');
104
+ lines.push('Use bus query tools or project_read_events() to investigate further.');
105
+ return lines.join('\n');
106
+ }
107
+ // ── Lifecycle ────────────────────────────────────────────────
108
+ /** Clean up timer. Call on shutdown. */
109
+ dispose() {
110
+ this.disposed = true;
111
+ if (this.timer) {
112
+ clearTimeout(this.timer);
113
+ this.timer = null;
114
+ }
115
+ // Discard any remaining buffered events
116
+ this.buffer = [];
117
+ }
118
+ /** Number of events currently buffered (for testing/monitoring). */
119
+ get bufferedCount() {
120
+ return this.buffer.length;
121
+ }
122
+ }
123
+ // ── Helpers ───────────────────────────────────────────────────
124
+ /** Extract a short detail string from the event payload. */
125
+ function summarizePayload(payload) {
126
+ const parts = [];
127
+ if (typeof payload.error === 'string') {
128
+ parts.push(payload.error.substring(0, 100));
129
+ }
130
+ else if (typeof payload.message === 'string') {
131
+ parts.push(payload.message.substring(0, 100));
132
+ }
133
+ else if (typeof payload.reason === 'string') {
134
+ parts.push(payload.reason.substring(0, 100));
135
+ }
136
+ if (typeof payload.gate === 'string') {
137
+ parts.push(`gate=${payload.gate}`);
138
+ }
139
+ return parts.join(', ');
140
+ }
141
+ //# sourceMappingURL=genesis-sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genesis-sink.js","sourceRoot":"","sources":["../../src/event-bus/genesis-sink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Unit tests for GenesisSink (PRD 026 Phase 4).
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=genesis-sink.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genesis-sink.test.d.ts","sourceRoot":"","sources":["../../src/event-bus/genesis-sink.test.ts"],"names":[],"mappings":"AACA;;GAEG"}
@@ -0,0 +1,160 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Unit tests for GenesisSink (PRD 026 Phase 4).
4
+ */
5
+ import { describe, it, beforeEach, afterEach } from 'node:test';
6
+ import assert from 'node:assert/strict';
7
+ import { GenesisSink } from './genesis-sink.js';
8
+ // ── Test helpers ───────────────────────────────────────────────
9
+ function makeEvent(seq, overrides = {}) {
10
+ return {
11
+ id: `evt-${seq}`,
12
+ version: 1,
13
+ timestamp: new Date(Date.now() + seq).toISOString(),
14
+ sequence: seq,
15
+ domain: 'session',
16
+ type: 'session.stale',
17
+ severity: 'warning',
18
+ payload: {},
19
+ source: 'test',
20
+ sessionId: 'sess-1',
21
+ ...overrides,
22
+ };
23
+ }
24
+ // ── Tests ──────────────────────────────────────────────────────
25
+ describe('GenesisSink', () => {
26
+ let sink;
27
+ let prompts;
28
+ let promptCallback;
29
+ beforeEach(() => {
30
+ prompts = [];
31
+ promptCallback = async (sessionId, prompt) => {
32
+ prompts.push({ sessionId, prompt });
33
+ };
34
+ sink = new GenesisSink({
35
+ promptSession: promptCallback,
36
+ sessionId: 'genesis-1',
37
+ batchWindowMs: 50, // Short for testing
38
+ });
39
+ });
40
+ afterEach(() => {
41
+ sink.dispose();
42
+ });
43
+ describe('severity filtering', () => {
44
+ it('accepts warning/error/critical events', () => {
45
+ sink.onEvent(makeEvent(1, { severity: 'warning' }));
46
+ sink.onEvent(makeEvent(2, { severity: 'error' }));
47
+ sink.onEvent(makeEvent(3, { severity: 'critical' }));
48
+ assert.equal(sink.bufferedCount, 3);
49
+ });
50
+ it('rejects info events by default', () => {
51
+ sink.onEvent(makeEvent(1, { severity: 'info' }));
52
+ assert.equal(sink.bufferedCount, 0);
53
+ });
54
+ it('respects custom severity filter', () => {
55
+ sink.dispose();
56
+ sink = new GenesisSink({
57
+ promptSession: promptCallback,
58
+ sessionId: 'genesis-1',
59
+ batchWindowMs: 50,
60
+ severityFilter: ['critical'],
61
+ });
62
+ sink.onEvent(makeEvent(1, { severity: 'warning' }));
63
+ sink.onEvent(makeEvent(2, { severity: 'critical' }));
64
+ assert.equal(sink.bufferedCount, 1);
65
+ });
66
+ });
67
+ describe('batching', () => {
68
+ it('buffers events and flushes after batch window', async () => {
69
+ sink.onEvent(makeEvent(1, { severity: 'warning' }));
70
+ sink.onEvent(makeEvent(2, { severity: 'error' }));
71
+ assert.equal(prompts.length, 0, 'should not prompt before batch window');
72
+ // Wait for batch window to fire
73
+ await new Promise((r) => setTimeout(r, 100));
74
+ assert.equal(prompts.length, 1);
75
+ assert.equal(prompts[0].sessionId, 'genesis-1');
76
+ assert.ok(prompts[0].prompt.includes('2 event(s)'));
77
+ });
78
+ it('manual flush sends immediately', async () => {
79
+ sink.onEvent(makeEvent(1, { severity: 'error' }));
80
+ sink.onEvent(makeEvent(2, { severity: 'warning' }));
81
+ await sink.flush();
82
+ assert.equal(prompts.length, 1);
83
+ assert.equal(sink.bufferedCount, 0);
84
+ });
85
+ it('flush with empty buffer is a no-op', async () => {
86
+ await sink.flush();
87
+ assert.equal(prompts.length, 0);
88
+ });
89
+ });
90
+ describe('graceful when Genesis is dead', () => {
91
+ it('handles promptSession rejection silently', async () => {
92
+ const failingSink = new GenesisSink({
93
+ promptSession: async () => { throw new Error('session dead'); },
94
+ sessionId: 'genesis-dead',
95
+ batchWindowMs: 50,
96
+ });
97
+ failingSink.onEvent(makeEvent(1, { severity: 'error' }));
98
+ await failingSink.flush();
99
+ // No throw — events are silently lost
100
+ assert.equal(failingSink.bufferedCount, 0);
101
+ failingSink.dispose();
102
+ });
103
+ });
104
+ describe('dispose', () => {
105
+ it('stops accepting events after dispose', () => {
106
+ sink.dispose();
107
+ sink.onEvent(makeEvent(1, { severity: 'error' }));
108
+ assert.equal(sink.bufferedCount, 0);
109
+ });
110
+ it('clears pending timer on dispose', async () => {
111
+ sink.onEvent(makeEvent(1, { severity: 'error' }));
112
+ sink.dispose();
113
+ // Wait past batch window — no prompt should fire
114
+ await new Promise((r) => setTimeout(r, 100));
115
+ assert.equal(prompts.length, 0);
116
+ });
117
+ });
118
+ describe('summarize', () => {
119
+ it('groups by domain', () => {
120
+ const events = [
121
+ makeEvent(1, { domain: 'session', type: 'session.stale', severity: 'warning' }),
122
+ makeEvent(2, { domain: 'strategy', type: 'strategy.gate_failed', severity: 'error', payload: { gate: 'G-TEST' } }),
123
+ makeEvent(3, { domain: 'session', type: 'session.killed', severity: 'error' }),
124
+ ];
125
+ const summary = GenesisSink.summarize(events);
126
+ assert.ok(summary.includes('[session] (2 events)'));
127
+ assert.ok(summary.includes('[strategy] (1 event)'));
128
+ assert.ok(summary.includes('strategy.gate_failed [error]'));
129
+ assert.ok(summary.includes('gate=G-TEST'));
130
+ });
131
+ it('includes severity counts', () => {
132
+ const events = [
133
+ makeEvent(1, { severity: 'critical' }),
134
+ makeEvent(2, { severity: 'error' }),
135
+ makeEvent(3, { severity: 'warning' }),
136
+ makeEvent(4, { severity: 'warning' }),
137
+ ];
138
+ const summary = GenesisSink.summarize(events);
139
+ assert.ok(summary.includes('1 critical'));
140
+ assert.ok(summary.includes('1 error'));
141
+ assert.ok(summary.includes('2 warning'));
142
+ });
143
+ it('includes session and project context', () => {
144
+ const events = [
145
+ makeEvent(1, { sessionId: 'abcdef12', projectId: 'my-project', severity: 'error' }),
146
+ ];
147
+ const summary = GenesisSink.summarize(events);
148
+ assert.ok(summary.includes('session=abcdef12'));
149
+ assert.ok(summary.includes('project=my-project'));
150
+ });
151
+ it('includes payload details', () => {
152
+ const events = [
153
+ makeEvent(1, { severity: 'error', payload: { error: 'connection timeout' } }),
154
+ ];
155
+ const summary = GenesisSink.summarize(events);
156
+ assert.ok(summary.includes('connection timeout'));
157
+ });
158
+ });
159
+ });
160
+ //# sourceMappingURL=genesis-sink.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genesis-sink.test.js","sourceRoot":"","sources":["../../src/event-bus/genesis-sink.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * InMemoryEventBus — Production implementation of the EventBus port (PRD 026).
3
+ *
4
+ * Uses a ring buffer with configurable capacity (default 10,000 events).
5
+ * Oldest events are evicted on overflow. Sinks receive events asynchronously
6
+ * via direct dispatch — no sink failure blocks emit().
7
+ */
8
+ import type { EventBus, EventSink, ConnectorHealth, EventFilter, EventSubscription, RuntimeEvent, RuntimeEventInput } from '../ports/event-bus.js';
9
+ export interface InMemoryEventBusOptions {
10
+ /** Ring buffer capacity. Default: 10,000 events. */
11
+ capacity?: number;
12
+ }
13
+ export interface BusStats {
14
+ /** Total events emitted via emit(). */
15
+ totalEmitted: number;
16
+ /** Total events imported via importEvent(). */
17
+ totalImported: number;
18
+ /** Current ring buffer occupancy. */
19
+ bufferSize: number;
20
+ /** Ring buffer capacity. */
21
+ bufferCapacity: number;
22
+ /** Number of registered sinks. */
23
+ sinkCount: number;
24
+ /** Number of active subscribers. */
25
+ subscriberCount: number;
26
+ }
27
+ export declare class InMemoryEventBus implements EventBus {
28
+ private readonly buffer;
29
+ private readonly capacity;
30
+ private readonly sinks;
31
+ private readonly subscribers;
32
+ private sequence;
33
+ private nextSubscriberId;
34
+ private _totalEmitted;
35
+ private _totalImported;
36
+ constructor(options?: InMemoryEventBusOptions);
37
+ emit(input: RuntimeEventInput): RuntimeEvent;
38
+ subscribe(filter: EventFilter, handler: (event: RuntimeEvent) => void): EventSubscription;
39
+ query(filter: EventFilter, options?: {
40
+ limit?: number;
41
+ since?: string;
42
+ }): RuntimeEvent[];
43
+ /** Get current bus statistics for monitoring/system.bus_stats emission. */
44
+ getStats(): BusStats;
45
+ importEvent(event: RuntimeEvent): void;
46
+ registerSink(sink: EventSink): void;
47
+ /** Check if a sink implements the EventConnector interface. */
48
+ private isConnector;
49
+ /** Connect all registered connectors. Call after all sinks registered. */
50
+ connectAll(): Promise<void>;
51
+ /** Disconnect all registered connectors. Call on shutdown. */
52
+ disconnectAll(): Promise<void>;
53
+ /** Get health status of all registered connectors. */
54
+ connectorHealth(): Array<{
55
+ name: string;
56
+ health: ConnectorHealth;
57
+ }>;
58
+ private dispatch;
59
+ }
60
+ //# sourceMappingURL=in-memory-event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-event-bus.d.ts","sourceRoot":"","sources":["../../src/event-bus/in-memory-event-bus.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,QAAQ,EACR,SAAS,EAET,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EAGlB,MAAM,uBAAuB,CAAC;AAkH/B,MAAM,WAAW,uBAAuB;IACtC,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;gBAEf,OAAO,CAAC,EAAE,uBAAuB;IAK7C,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY;IA6C5C,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,iBAAiB;IAazF,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,EAAE;IAIxF,2EAA2E;IAC3E,QAAQ,IAAI,QAAQ;IAWpB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAetC,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAMnC,+DAA+D;IAC/D,OAAO,CAAC,WAAW;IAInB,0EAA0E;IACpE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC,8DAA8D;IACxD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAYpC,sDAAsD;IACtD,eAAe,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,CAAC;IAYnE,OAAO,CAAC,QAAQ;CAoCjB"}
@@ -0,0 +1,274 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * InMemoryEventBus — Production implementation of the EventBus port (PRD 026).
4
+ *
5
+ * Uses a ring buffer with configurable capacity (default 10,000 events).
6
+ * Oldest events are evicted on overflow. Sinks receive events asynchronously
7
+ * via direct dispatch — no sink failure blocks emit().
8
+ */
9
+ import { randomUUID } from 'node:crypto';
10
+ // ── Filter matching ─────────────────────────────────────────────
11
+ /**
12
+ * Convert a simple glob pattern (e.g., 'session.*', 'strategy.gate_*')
13
+ * to a RegExp. Only supports '*' as wildcard.
14
+ */
15
+ function globToRegex(pattern) {
16
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
17
+ return new RegExp(`^${escaped}$`);
18
+ }
19
+ function matchesFilter(event, filter) {
20
+ // Domain filter
21
+ if (filter.domain !== undefined) {
22
+ const domains = Array.isArray(filter.domain) ? filter.domain : [filter.domain];
23
+ if (!domains.includes(event.domain))
24
+ return false;
25
+ }
26
+ // Type filter (supports glob patterns)
27
+ if (filter.type !== undefined) {
28
+ const types = Array.isArray(filter.type) ? filter.type : [filter.type];
29
+ const matched = types.some(pattern => {
30
+ if (pattern.includes('*')) {
31
+ return globToRegex(pattern).test(event.type);
32
+ }
33
+ return pattern === event.type;
34
+ });
35
+ if (!matched)
36
+ return false;
37
+ }
38
+ // Project filter
39
+ if (filter.projectId !== undefined && event.projectId !== filter.projectId) {
40
+ return false;
41
+ }
42
+ // Session filter
43
+ if (filter.sessionId !== undefined && event.sessionId !== filter.sessionId) {
44
+ return false;
45
+ }
46
+ // Severity filter
47
+ if (filter.severity !== undefined) {
48
+ const severities = Array.isArray(filter.severity) ? filter.severity : [filter.severity];
49
+ if (!severities.includes(event.severity))
50
+ return false;
51
+ }
52
+ return true;
53
+ }
54
+ // ── Ring buffer ─────────────────────────────────────────────────
55
+ class EventRingBuffer {
56
+ buf;
57
+ head = 0;
58
+ count = 0;
59
+ capacity;
60
+ constructor(capacity) {
61
+ if (capacity < 1)
62
+ throw new Error(`EventRingBuffer capacity must be >= 1, got ${capacity}`);
63
+ this.capacity = capacity;
64
+ this.buf = new Array(capacity);
65
+ }
66
+ get length() { return this.count; }
67
+ push(event) {
68
+ const writeIdx = (this.head + this.count) % this.capacity;
69
+ this.buf[writeIdx] = event;
70
+ if (this.count === this.capacity) {
71
+ this.head = (this.head + 1) % this.capacity;
72
+ }
73
+ else {
74
+ this.count++;
75
+ }
76
+ }
77
+ /** Return events matching a filter, oldest first. */
78
+ query(filter, options) {
79
+ const result = [];
80
+ const limit = options?.limit ?? this.count;
81
+ const sinceTime = options?.since ? new Date(options.since).getTime() : 0;
82
+ for (let i = 0; i < this.count; i++) {
83
+ const event = this.buf[(this.head + i) % this.capacity];
84
+ // Since filter: skip events before the timestamp
85
+ if (sinceTime > 0 && new Date(event.timestamp).getTime() <= sinceTime) {
86
+ continue;
87
+ }
88
+ if (matchesFilter(event, filter)) {
89
+ result.push(event);
90
+ if (result.length >= limit)
91
+ break;
92
+ }
93
+ }
94
+ return result;
95
+ }
96
+ }
97
+ // ── InMemoryEventBus ────────────────────────────────────────────
98
+ const DEFAULT_CAPACITY = 10_000;
99
+ const MAX_PAYLOAD_SIZE = 65_536; // 64KB
100
+ export class InMemoryEventBus {
101
+ buffer;
102
+ capacity;
103
+ sinks = [];
104
+ subscribers = [];
105
+ sequence = 0;
106
+ nextSubscriberId = 1;
107
+ _totalEmitted = 0;
108
+ _totalImported = 0;
109
+ constructor(options) {
110
+ this.capacity = options?.capacity ?? DEFAULT_CAPACITY;
111
+ this.buffer = new EventRingBuffer(this.capacity);
112
+ }
113
+ emit(input) {
114
+ // Enforce max payload size
115
+ const payloadStr = JSON.stringify(input.payload);
116
+ if (payloadStr.length > MAX_PAYLOAD_SIZE) {
117
+ // Emit a system error event about the oversized payload, then reject
118
+ const errorEvent = {
119
+ id: randomUUID(),
120
+ version: 1,
121
+ timestamp: new Date().toISOString(),
122
+ sequence: ++this.sequence,
123
+ domain: 'system',
124
+ type: 'system.bus_error',
125
+ severity: 'error',
126
+ payload: {
127
+ error: 'payload_too_large',
128
+ original_type: input.type,
129
+ size: payloadStr.length,
130
+ max: MAX_PAYLOAD_SIZE,
131
+ },
132
+ source: 'runtime/event-bus/in-memory',
133
+ };
134
+ this.buffer.push(errorEvent);
135
+ this.dispatch(errorEvent);
136
+ return errorEvent;
137
+ }
138
+ const event = {
139
+ ...input,
140
+ id: randomUUID(),
141
+ version: 1,
142
+ timestamp: new Date().toISOString(),
143
+ sequence: ++this.sequence,
144
+ };
145
+ this._totalEmitted++;
146
+ // Store in ring buffer
147
+ this.buffer.push(event);
148
+ // Dispatch to sinks and subscribers
149
+ this.dispatch(event);
150
+ return event;
151
+ }
152
+ subscribe(filter, handler) {
153
+ const id = this.nextSubscriberId++;
154
+ const subscriber = { id, filter, handler };
155
+ this.subscribers.push(subscriber);
156
+ return {
157
+ unsubscribe: () => {
158
+ const idx = this.subscribers.findIndex(s => s.id === id);
159
+ if (idx !== -1)
160
+ this.subscribers.splice(idx, 1);
161
+ },
162
+ };
163
+ }
164
+ query(filter, options) {
165
+ return this.buffer.query(filter, options);
166
+ }
167
+ /** Get current bus statistics for monitoring/system.bus_stats emission. */
168
+ getStats() {
169
+ return {
170
+ totalEmitted: this._totalEmitted,
171
+ totalImported: this._totalImported,
172
+ bufferSize: this.buffer.length,
173
+ bufferCapacity: this.capacity,
174
+ sinkCount: this.sinks.length,
175
+ subscriberCount: this.subscribers.length,
176
+ };
177
+ }
178
+ importEvent(event) {
179
+ // Update sequence to prevent collisions with future emits
180
+ if (event.sequence > this.sequence) {
181
+ this.sequence = event.sequence;
182
+ }
183
+ this._totalImported++;
184
+ // Store in ring buffer
185
+ this.buffer.push(event);
186
+ // Dispatch to sinks and subscribers
187
+ this.dispatch(event);
188
+ }
189
+ registerSink(sink) {
190
+ this.sinks.push(sink);
191
+ }
192
+ // ── Connector lifecycle (PRD 026 Phase 5) ──────────────────
193
+ /** Check if a sink implements the EventConnector interface. */
194
+ isConnector(sink) {
195
+ return 'connect' in sink && 'disconnect' in sink && 'health' in sink;
196
+ }
197
+ /** Connect all registered connectors. Call after all sinks registered. */
198
+ async connectAll() {
199
+ for (const sink of this.sinks) {
200
+ if (this.isConnector(sink)) {
201
+ try {
202
+ await sink.connect();
203
+ }
204
+ catch (err) {
205
+ console.error(`[event-bus] Connector ${sink.name} failed to connect:`, err.message);
206
+ }
207
+ }
208
+ }
209
+ }
210
+ /** Disconnect all registered connectors. Call on shutdown. */
211
+ async disconnectAll() {
212
+ for (const sink of this.sinks) {
213
+ if (this.isConnector(sink)) {
214
+ try {
215
+ await sink.disconnect();
216
+ }
217
+ catch (err) {
218
+ console.error(`[event-bus] Connector ${sink.name} failed to disconnect:`, err.message);
219
+ }
220
+ }
221
+ }
222
+ }
223
+ /** Get health status of all registered connectors. */
224
+ connectorHealth() {
225
+ const results = [];
226
+ for (const sink of this.sinks) {
227
+ if (this.isConnector(sink)) {
228
+ results.push({ name: sink.name, health: sink.health() });
229
+ }
230
+ }
231
+ return results;
232
+ }
233
+ // ── Internal dispatch ───────────────────────────────────────
234
+ dispatch(event) {
235
+ // Snapshot arrays to guard against mutation during dispatch
236
+ // (e.g., a handler calling unsubscribe or registerSink)
237
+ const sinks = [...this.sinks];
238
+ const subscribers = [...this.subscribers];
239
+ // Dispatch to sinks (fire-and-forget)
240
+ for (const sink of sinks) {
241
+ try {
242
+ const result = sink.onEvent(event);
243
+ // Handle async sinks — catch errors without blocking
244
+ if (result && typeof result.catch === 'function') {
245
+ result.catch(err => {
246
+ if (sink.onError) {
247
+ sink.onError(err, event);
248
+ }
249
+ });
250
+ }
251
+ }
252
+ catch (err) {
253
+ if (sink.onError) {
254
+ try {
255
+ sink.onError(err, event);
256
+ }
257
+ catch { /* double fault — swallow */ }
258
+ }
259
+ }
260
+ }
261
+ // Dispatch to subscribers (filter-matched, synchronous)
262
+ for (const sub of subscribers) {
263
+ if (matchesFilter(event, sub.filter)) {
264
+ try {
265
+ sub.handler(event);
266
+ }
267
+ catch {
268
+ // Subscriber errors are non-fatal
269
+ }
270
+ }
271
+ }
272
+ }
273
+ }
274
+ //# sourceMappingURL=in-memory-event-bus.js.map