pi-harness-runtime 0.9.19 → 0.9.21

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 (445) hide show
  1. package/index.ts +60 -10
  2. package/package.json +2 -3
  3. package/packages/clipboard/dist/clipboard.d.ts +11 -0
  4. package/packages/clipboard/dist/clipboard.d.ts.map +1 -0
  5. package/packages/clipboard/dist/clipboard.js +40 -0
  6. package/packages/clipboard/dist/clipboard.js.map +1 -0
  7. package/packages/clipboard/dist/index.d.ts +2 -0
  8. package/packages/clipboard/dist/index.d.ts.map +1 -0
  9. package/packages/clipboard/dist/index.js +2 -0
  10. package/packages/clipboard/dist/index.js.map +1 -0
  11. package/packages/clipboard/dist/src/clipboard.d.ts +11 -0
  12. package/packages/clipboard/dist/src/clipboard.d.ts.map +1 -0
  13. package/packages/clipboard/dist/src/clipboard.js +43 -0
  14. package/packages/clipboard/dist/src/clipboard.js.map +1 -0
  15. package/packages/clipboard/dist/src/index.d.ts +2 -0
  16. package/packages/clipboard/dist/src/index.d.ts.map +1 -0
  17. package/packages/clipboard/dist/src/index.js +2 -0
  18. package/packages/clipboard/dist/src/index.js.map +1 -0
  19. package/packages/clipboard/dist/src/types.d.ts +13 -0
  20. package/packages/clipboard/dist/src/types.d.ts.map +1 -0
  21. package/packages/clipboard/dist/src/types.js +5 -0
  22. package/packages/clipboard/dist/src/types.js.map +1 -0
  23. package/packages/clipboard/dist/types.d.ts +13 -0
  24. package/packages/clipboard/dist/types.d.ts.map +1 -0
  25. package/packages/clipboard/dist/types.js +5 -0
  26. package/packages/clipboard/dist/types.js.map +1 -0
  27. package/packages/clipboard/package.json +12 -0
  28. package/packages/clipboard/src/clipboard.ts +52 -0
  29. package/packages/clipboard/src/index.ts +1 -0
  30. package/packages/clipboard/src/types.ts +14 -0
  31. package/packages/clipboard/tsconfig.json +10 -0
  32. package/packages/context-discovery/dist/discover.d.ts +3 -0
  33. package/packages/context-discovery/dist/discover.d.ts.map +1 -0
  34. package/packages/context-discovery/dist/discover.js +42 -0
  35. package/packages/context-discovery/dist/discover.js.map +1 -0
  36. package/packages/context-discovery/dist/discovery.d.ts +28 -0
  37. package/packages/context-discovery/dist/discovery.d.ts.map +1 -0
  38. package/packages/context-discovery/dist/discovery.js +21 -0
  39. package/packages/context-discovery/dist/discovery.js.map +1 -0
  40. package/packages/context-discovery/dist/index.d.ts +3 -0
  41. package/packages/context-discovery/dist/index.d.ts.map +1 -0
  42. package/packages/context-discovery/dist/index.js +2 -0
  43. package/packages/context-discovery/dist/index.js.map +1 -0
  44. package/packages/context-discovery/dist/src/discover.d.ts +3 -0
  45. package/packages/context-discovery/dist/src/discover.d.ts.map +1 -0
  46. package/packages/context-discovery/dist/src/discover.js +42 -0
  47. package/packages/context-discovery/dist/src/discover.js.map +1 -0
  48. package/packages/context-discovery/dist/src/discovery.d.ts +28 -0
  49. package/packages/context-discovery/dist/src/discovery.d.ts.map +1 -0
  50. package/packages/context-discovery/dist/src/discovery.js +21 -0
  51. package/packages/context-discovery/dist/src/discovery.js.map +1 -0
  52. package/packages/context-discovery/dist/src/index.d.ts +3 -0
  53. package/packages/context-discovery/dist/src/index.d.ts.map +1 -0
  54. package/packages/context-discovery/dist/src/index.js +2 -0
  55. package/packages/context-discovery/dist/src/index.js.map +1 -0
  56. package/packages/context-discovery/dist/src/types.d.ts +16 -0
  57. package/packages/context-discovery/dist/src/types.d.ts.map +1 -0
  58. package/packages/context-discovery/dist/src/types.js +2 -0
  59. package/packages/context-discovery/dist/src/types.js.map +1 -0
  60. package/packages/context-discovery/dist/types.d.ts +16 -0
  61. package/packages/context-discovery/dist/types.d.ts.map +1 -0
  62. package/packages/context-discovery/dist/types.js +2 -0
  63. package/packages/context-discovery/dist/types.js.map +1 -0
  64. package/packages/context-discovery/package.json +12 -0
  65. package/packages/context-discovery/src/discover.ts +42 -0
  66. package/packages/context-discovery/src/discovery.ts +44 -0
  67. package/packages/context-discovery/src/index.ts +2 -0
  68. package/packages/context-discovery/src/types.ts +15 -0
  69. package/packages/context-discovery/tsconfig.json +10 -0
  70. package/packages/dependency-analyzer/dist/analyzer.d.ts +17 -0
  71. package/packages/dependency-analyzer/dist/analyzer.d.ts.map +1 -0
  72. package/packages/dependency-analyzer/dist/analyzer.js +106 -0
  73. package/packages/dependency-analyzer/dist/analyzer.js.map +1 -0
  74. package/packages/dependency-analyzer/dist/imports.d.ts +12 -0
  75. package/packages/dependency-analyzer/dist/imports.d.ts.map +1 -0
  76. package/packages/dependency-analyzer/dist/imports.js +73 -0
  77. package/packages/dependency-analyzer/dist/imports.js.map +1 -0
  78. package/packages/dependency-analyzer/dist/index.d.ts +4 -0
  79. package/packages/dependency-analyzer/dist/index.d.ts.map +1 -0
  80. package/packages/dependency-analyzer/dist/index.js +3 -0
  81. package/packages/dependency-analyzer/dist/index.js.map +1 -0
  82. package/packages/dependency-analyzer/dist/src/analyzer.d.ts +17 -0
  83. package/packages/dependency-analyzer/dist/src/analyzer.d.ts.map +1 -0
  84. package/packages/dependency-analyzer/dist/src/analyzer.js +119 -0
  85. package/packages/dependency-analyzer/dist/src/analyzer.js.map +1 -0
  86. package/packages/dependency-analyzer/dist/src/imports.d.ts +12 -0
  87. package/packages/dependency-analyzer/dist/src/imports.d.ts.map +1 -0
  88. package/packages/dependency-analyzer/dist/src/imports.js +73 -0
  89. package/packages/dependency-analyzer/dist/src/imports.js.map +1 -0
  90. package/packages/dependency-analyzer/dist/src/index.d.ts +4 -0
  91. package/packages/dependency-analyzer/dist/src/index.d.ts.map +1 -0
  92. package/packages/dependency-analyzer/dist/src/index.js +3 -0
  93. package/packages/dependency-analyzer/dist/src/index.js.map +1 -0
  94. package/packages/dependency-analyzer/dist/src/types.d.ts +28 -0
  95. package/packages/dependency-analyzer/dist/src/types.d.ts.map +1 -0
  96. package/packages/dependency-analyzer/dist/src/types.js +5 -0
  97. package/packages/dependency-analyzer/dist/src/types.js.map +1 -0
  98. package/packages/dependency-analyzer/dist/test/analyzer.test.js +37 -0
  99. package/packages/dependency-analyzer/dist/types.d.ts +28 -0
  100. package/packages/dependency-analyzer/dist/types.d.ts.map +1 -0
  101. package/packages/dependency-analyzer/dist/types.js +5 -0
  102. package/packages/dependency-analyzer/dist/types.js.map +1 -0
  103. package/packages/dependency-analyzer/package.json +12 -0
  104. package/packages/dependency-analyzer/src/analyzer.ts +140 -0
  105. package/packages/dependency-analyzer/src/imports.ts +93 -0
  106. package/packages/dependency-analyzer/src/index.ts +9 -0
  107. package/packages/dependency-analyzer/src/types.ts +38 -0
  108. package/packages/dependency-analyzer/test/analyzer.test.js +37 -0
  109. package/packages/dependency-analyzer/test/analyzer.test.ts +48 -0
  110. package/packages/dependency-analyzer/tsconfig.json +10 -0
  111. package/packages/event-bus/dist/bus.d.ts +15 -0
  112. package/packages/event-bus/dist/bus.d.ts.map +1 -0
  113. package/packages/event-bus/dist/bus.js +90 -0
  114. package/packages/event-bus/dist/bus.js.map +1 -0
  115. package/packages/event-bus/dist/index.d.ts +4 -0
  116. package/packages/event-bus/dist/index.d.ts.map +1 -0
  117. package/packages/event-bus/dist/index.js +3 -0
  118. package/packages/event-bus/dist/index.js.map +1 -0
  119. package/packages/event-bus/dist/src/bus.d.ts +15 -0
  120. package/packages/event-bus/dist/src/bus.d.ts.map +1 -0
  121. package/packages/event-bus/dist/src/bus.js +98 -0
  122. package/packages/event-bus/dist/src/bus.js.map +1 -0
  123. package/packages/event-bus/dist/src/index.d.ts +4 -0
  124. package/packages/event-bus/dist/src/index.d.ts.map +1 -0
  125. package/packages/event-bus/dist/src/index.js +3 -0
  126. package/packages/event-bus/dist/src/index.js.map +1 -0
  127. package/packages/event-bus/dist/src/types.d.ts +27 -0
  128. package/packages/event-bus/dist/src/types.d.ts.map +1 -0
  129. package/packages/event-bus/dist/src/types.js +10 -0
  130. package/packages/event-bus/dist/src/types.js.map +1 -0
  131. package/packages/event-bus/dist/test/bus.test.js +52 -0
  132. package/packages/event-bus/dist/types.d.ts +27 -0
  133. package/packages/event-bus/dist/types.d.ts.map +1 -0
  134. package/packages/event-bus/dist/types.js +10 -0
  135. package/packages/event-bus/dist/types.js.map +1 -0
  136. package/packages/event-bus/package.json +12 -0
  137. package/packages/event-bus/src/bus.ts +111 -0
  138. package/packages/event-bus/src/index.ts +9 -0
  139. package/packages/event-bus/src/types.ts +59 -0
  140. package/packages/event-bus/test/bus.test.ts +88 -0
  141. package/packages/event-bus/tsconfig.json +10 -0
  142. package/packages/event-store/dist/index.d.ts +3 -0
  143. package/packages/event-store/dist/index.d.ts.map +1 -0
  144. package/packages/event-store/dist/index.js +2 -0
  145. package/packages/event-store/dist/index.js.map +1 -0
  146. package/packages/event-store/dist/src/index.d.ts +3 -0
  147. package/packages/event-store/dist/src/index.d.ts.map +1 -0
  148. package/packages/event-store/dist/src/index.js +2 -0
  149. package/packages/event-store/dist/src/index.js.map +1 -0
  150. package/packages/event-store/dist/src/store.d.ts +15 -0
  151. package/packages/event-store/dist/src/store.d.ts.map +1 -0
  152. package/packages/event-store/dist/src/store.js +139 -0
  153. package/packages/event-store/dist/src/store.js.map +1 -0
  154. package/packages/event-store/dist/src/types.d.ts +48 -0
  155. package/packages/event-store/dist/src/types.d.ts.map +1 -0
  156. package/packages/event-store/dist/src/types.js +5 -0
  157. package/packages/event-store/dist/src/types.js.map +1 -0
  158. package/packages/event-store/dist/store.d.ts +15 -0
  159. package/packages/event-store/dist/store.d.ts.map +1 -0
  160. package/packages/event-store/dist/store.js +131 -0
  161. package/packages/event-store/dist/store.js.map +1 -0
  162. package/packages/event-store/dist/test/store.test.js +57 -0
  163. package/packages/event-store/dist/types.d.ts +48 -0
  164. package/packages/event-store/dist/types.d.ts.map +1 -0
  165. package/packages/event-store/dist/types.js +5 -0
  166. package/packages/event-store/dist/types.js.map +1 -0
  167. package/packages/event-store/package.json +12 -0
  168. package/packages/event-store/src/index.ts +11 -0
  169. package/packages/event-store/src/store.ts +168 -0
  170. package/packages/event-store/src/types.d.ts +48 -0
  171. package/packages/event-store/src/types.d.ts.map +1 -0
  172. package/packages/event-store/src/types.js +5 -0
  173. package/packages/event-store/src/types.js.map +1 -0
  174. package/packages/event-store/src/types.ts +65 -0
  175. package/packages/event-store/test/store.test.ts +115 -0
  176. package/packages/event-store/tsconfig.json +10 -0
  177. package/packages/intent-analyzer/dist/analyzer.d.ts +13 -0
  178. package/packages/intent-analyzer/dist/analyzer.d.ts.map +1 -0
  179. package/packages/intent-analyzer/dist/analyzer.js +72 -0
  180. package/packages/intent-analyzer/dist/analyzer.js.map +1 -0
  181. package/packages/intent-analyzer/dist/index.d.ts +3 -0
  182. package/packages/intent-analyzer/dist/index.d.ts.map +1 -0
  183. package/packages/intent-analyzer/dist/index.js +2 -0
  184. package/packages/intent-analyzer/dist/index.js.map +1 -0
  185. package/packages/intent-analyzer/dist/src/analyzer.d.ts +13 -0
  186. package/packages/intent-analyzer/dist/src/analyzer.d.ts.map +1 -0
  187. package/packages/intent-analyzer/dist/src/analyzer.js +239 -0
  188. package/packages/intent-analyzer/dist/src/analyzer.js.map +1 -0
  189. package/packages/intent-analyzer/dist/src/index.d.ts +3 -0
  190. package/packages/intent-analyzer/dist/src/index.d.ts.map +1 -0
  191. package/packages/intent-analyzer/dist/src/index.js +2 -0
  192. package/packages/intent-analyzer/dist/src/index.js.map +1 -0
  193. package/packages/intent-analyzer/dist/src/types.d.ts +26 -0
  194. package/packages/intent-analyzer/dist/src/types.d.ts.map +1 -0
  195. package/packages/intent-analyzer/dist/src/types.js +7 -0
  196. package/packages/intent-analyzer/dist/src/types.js.map +1 -0
  197. package/packages/intent-analyzer/dist/test/analyzer.test.js +56 -0
  198. package/packages/intent-analyzer/dist/types.d.ts +26 -0
  199. package/packages/intent-analyzer/dist/types.d.ts.map +1 -0
  200. package/packages/intent-analyzer/dist/types.js +7 -0
  201. package/packages/intent-analyzer/dist/types.js.map +1 -0
  202. package/packages/intent-analyzer/package.json +12 -0
  203. package/packages/intent-analyzer/src/analyzer.ts +259 -0
  204. package/packages/intent-analyzer/src/index.ts +8 -0
  205. package/packages/intent-analyzer/src/types.ts +44 -0
  206. package/packages/intent-analyzer/test/analyzer.test.ts +72 -0
  207. package/packages/intent-analyzer/tsconfig.json +10 -0
  208. package/packages/projection-engine/dist/engine.d.ts +61 -0
  209. package/packages/projection-engine/dist/engine.d.ts.map +1 -0
  210. package/packages/projection-engine/dist/engine.js +76 -0
  211. package/packages/projection-engine/dist/engine.js.map +1 -0
  212. package/packages/projection-engine/dist/index.d.ts +2 -0
  213. package/packages/projection-engine/dist/index.d.ts.map +1 -0
  214. package/packages/projection-engine/dist/index.js +2 -0
  215. package/packages/projection-engine/dist/index.js.map +1 -0
  216. package/packages/projection-engine/dist/project.d.ts +3 -0
  217. package/packages/projection-engine/dist/project.d.ts.map +1 -0
  218. package/packages/projection-engine/dist/project.js +24 -0
  219. package/packages/projection-engine/dist/project.js.map +1 -0
  220. package/packages/projection-engine/dist/src/engine.d.ts +61 -0
  221. package/packages/projection-engine/dist/src/engine.d.ts.map +1 -0
  222. package/packages/projection-engine/dist/src/engine.js +87 -0
  223. package/packages/projection-engine/dist/src/engine.js.map +1 -0
  224. package/packages/projection-engine/dist/src/index.d.ts +2 -0
  225. package/packages/projection-engine/dist/src/index.d.ts.map +1 -0
  226. package/packages/projection-engine/dist/src/index.js +2 -0
  227. package/packages/projection-engine/dist/src/index.js.map +1 -0
  228. package/packages/projection-engine/dist/src/project.d.ts +3 -0
  229. package/packages/projection-engine/dist/src/project.d.ts.map +1 -0
  230. package/packages/projection-engine/dist/src/project.js +24 -0
  231. package/packages/projection-engine/dist/src/project.js.map +1 -0
  232. package/packages/projection-engine/dist/src/types.d.ts +55 -0
  233. package/packages/projection-engine/dist/src/types.d.ts.map +1 -0
  234. package/packages/projection-engine/dist/src/types.js +5 -0
  235. package/packages/projection-engine/dist/src/types.js.map +1 -0
  236. package/packages/projection-engine/dist/types.d.ts +55 -0
  237. package/packages/projection-engine/dist/types.d.ts.map +1 -0
  238. package/packages/projection-engine/dist/types.js +5 -0
  239. package/packages/projection-engine/dist/types.js.map +1 -0
  240. package/packages/projection-engine/package.json +12 -0
  241. package/packages/projection-engine/src/engine.ts +134 -0
  242. package/packages/projection-engine/src/index.ts +8 -0
  243. package/packages/projection-engine/src/project.ts +24 -0
  244. package/packages/projection-engine/src/types.d.ts +55 -0
  245. package/packages/projection-engine/src/types.d.ts.map +1 -0
  246. package/packages/projection-engine/src/types.js +5 -0
  247. package/packages/projection-engine/src/types.js.map +1 -0
  248. package/packages/projection-engine/src/types.ts +60 -0
  249. package/packages/projection-engine/tsconfig.json +10 -0
  250. package/packages/providers/dist/provider-id.d.ts.map +1 -1
  251. package/packages/providers/dist/provider-id.js +3 -0
  252. package/packages/providers/dist/provider-id.js.map +1 -1
  253. package/packages/providers/src/provider-id.ts +2 -0
  254. package/packages/quota-manager/dist/tui-usage-monitor.d.ts.map +1 -1
  255. package/packages/quota-manager/dist/tui-usage-monitor.js +5 -0
  256. package/packages/quota-manager/dist/tui-usage-monitor.js.map +1 -1
  257. package/packages/quota-manager/src/tui-usage-monitor.ts +21 -0
  258. package/packages/session-api/dist/api.d.ts +83 -0
  259. package/packages/session-api/dist/api.d.ts.map +1 -0
  260. package/packages/session-api/dist/api.js +35 -0
  261. package/packages/session-api/dist/api.js.map +1 -0
  262. package/packages/session-api/dist/index.d.ts +2 -0
  263. package/packages/session-api/dist/index.d.ts.map +1 -0
  264. package/packages/session-api/dist/index.js +2 -0
  265. package/packages/session-api/dist/index.js.map +1 -0
  266. package/packages/session-api/dist/src/api.d.ts +83 -0
  267. package/packages/session-api/dist/src/api.d.ts.map +1 -0
  268. package/packages/session-api/dist/src/api.js +49 -0
  269. package/packages/session-api/dist/src/api.js.map +1 -0
  270. package/packages/session-api/dist/src/index.d.ts +2 -0
  271. package/packages/session-api/dist/src/index.d.ts.map +1 -0
  272. package/packages/session-api/dist/src/index.js +2 -0
  273. package/packages/session-api/dist/src/index.js.map +1 -0
  274. package/packages/session-api/dist/src/types.d.ts +22 -0
  275. package/packages/session-api/dist/src/types.d.ts.map +1 -0
  276. package/packages/session-api/dist/src/types.js +5 -0
  277. package/packages/session-api/dist/src/types.js.map +1 -0
  278. package/packages/session-api/dist/types.d.ts +22 -0
  279. package/packages/session-api/dist/types.d.ts.map +1 -0
  280. package/packages/session-api/dist/types.js +5 -0
  281. package/packages/session-api/dist/types.js.map +1 -0
  282. package/packages/session-api/package.json +12 -0
  283. package/packages/session-api/src/api.ts +117 -0
  284. package/packages/session-api/src/index.ts +1 -0
  285. package/packages/session-api/src/types.ts +23 -0
  286. package/packages/session-api/tsconfig.json +10 -0
  287. package/packages/session-export/dist/exporter.d.ts +28 -0
  288. package/packages/session-export/dist/exporter.d.ts.map +1 -0
  289. package/packages/session-export/dist/exporter.js +38 -0
  290. package/packages/session-export/dist/exporter.js.map +1 -0
  291. package/packages/session-export/dist/index.d.ts +2 -0
  292. package/packages/session-export/dist/index.d.ts.map +1 -0
  293. package/packages/session-export/dist/index.js +2 -0
  294. package/packages/session-export/dist/index.js.map +1 -0
  295. package/packages/session-export/dist/src/exporter.d.ts +28 -0
  296. package/packages/session-export/dist/src/exporter.d.ts.map +1 -0
  297. package/packages/session-export/dist/src/exporter.js +42 -0
  298. package/packages/session-export/dist/src/exporter.js.map +1 -0
  299. package/packages/session-export/dist/src/index.d.ts +2 -0
  300. package/packages/session-export/dist/src/index.d.ts.map +1 -0
  301. package/packages/session-export/dist/src/index.js +2 -0
  302. package/packages/session-export/dist/src/index.js.map +1 -0
  303. package/packages/session-export/dist/src/types.d.ts +20 -0
  304. package/packages/session-export/dist/src/types.d.ts.map +1 -0
  305. package/packages/session-export/dist/src/types.js +5 -0
  306. package/packages/session-export/dist/src/types.js.map +1 -0
  307. package/packages/session-export/dist/types.d.ts +20 -0
  308. package/packages/session-export/dist/types.d.ts.map +1 -0
  309. package/packages/session-export/dist/types.js +5 -0
  310. package/packages/session-export/dist/types.js.map +1 -0
  311. package/packages/session-export/package.json +12 -0
  312. package/packages/session-export/src/exporter.ts +81 -0
  313. package/packages/session-export/src/index.ts +1 -0
  314. package/packages/session-export/src/types.ts +22 -0
  315. package/packages/session-export/tsconfig.json +10 -0
  316. package/packages/subscription-engine/dist/engine.d.ts +13 -0
  317. package/packages/subscription-engine/dist/engine.d.ts.map +1 -0
  318. package/packages/subscription-engine/dist/engine.js +40 -0
  319. package/packages/subscription-engine/dist/engine.js.map +1 -0
  320. package/packages/subscription-engine/dist/index.d.ts +2 -0
  321. package/packages/subscription-engine/dist/index.d.ts.map +1 -0
  322. package/packages/subscription-engine/dist/index.js +2 -0
  323. package/packages/subscription-engine/dist/index.js.map +1 -0
  324. package/packages/subscription-engine/dist/src/engine.d.ts +13 -0
  325. package/packages/subscription-engine/dist/src/engine.d.ts.map +1 -0
  326. package/packages/subscription-engine/dist/src/engine.js +40 -0
  327. package/packages/subscription-engine/dist/src/engine.js.map +1 -0
  328. package/packages/subscription-engine/dist/src/index.d.ts +2 -0
  329. package/packages/subscription-engine/dist/src/index.d.ts.map +1 -0
  330. package/packages/subscription-engine/dist/src/index.js +2 -0
  331. package/packages/subscription-engine/dist/src/index.js.map +1 -0
  332. package/packages/subscription-engine/dist/src/subscriptions.d.ts +19 -0
  333. package/packages/subscription-engine/dist/src/subscriptions.d.ts.map +1 -0
  334. package/packages/subscription-engine/dist/src/subscriptions.js +39 -0
  335. package/packages/subscription-engine/dist/src/subscriptions.js.map +1 -0
  336. package/packages/subscription-engine/dist/src/types.d.ts +24 -0
  337. package/packages/subscription-engine/dist/src/types.d.ts.map +1 -0
  338. package/packages/subscription-engine/dist/src/types.js +5 -0
  339. package/packages/subscription-engine/dist/src/types.js.map +1 -0
  340. package/packages/subscription-engine/dist/subscriptions.d.ts +19 -0
  341. package/packages/subscription-engine/dist/subscriptions.d.ts.map +1 -0
  342. package/packages/subscription-engine/dist/subscriptions.js +32 -0
  343. package/packages/subscription-engine/dist/subscriptions.js.map +1 -0
  344. package/packages/subscription-engine/dist/types.d.ts +24 -0
  345. package/packages/subscription-engine/dist/types.d.ts.map +1 -0
  346. package/packages/subscription-engine/dist/types.js +5 -0
  347. package/packages/subscription-engine/dist/types.js.map +1 -0
  348. package/packages/subscription-engine/package.json +12 -0
  349. package/packages/subscription-engine/src/engine.ts +55 -0
  350. package/packages/subscription-engine/src/index.ts +6 -0
  351. package/packages/subscription-engine/src/subscriptions.ts +55 -0
  352. package/packages/subscription-engine/src/types.ts +27 -0
  353. package/packages/subscription-engine/tsconfig.json +10 -0
  354. package/packages/workflow-events/dist/events.d.ts +38 -0
  355. package/packages/workflow-events/dist/events.d.ts.map +1 -0
  356. package/packages/workflow-events/dist/events.js +46 -0
  357. package/packages/workflow-events/dist/events.js.map +1 -0
  358. package/packages/workflow-events/dist/index.d.ts +2 -0
  359. package/packages/workflow-events/dist/index.d.ts.map +1 -0
  360. package/packages/workflow-events/dist/index.js +2 -0
  361. package/packages/workflow-events/dist/index.js.map +1 -0
  362. package/packages/workflow-events/dist/pipeline.d.ts +21 -0
  363. package/packages/workflow-events/dist/pipeline.d.ts.map +1 -0
  364. package/packages/workflow-events/dist/pipeline.js +27 -0
  365. package/packages/workflow-events/dist/pipeline.js.map +1 -0
  366. package/packages/workflow-events/dist/src/events.d.ts +38 -0
  367. package/packages/workflow-events/dist/src/events.d.ts.map +1 -0
  368. package/packages/workflow-events/dist/src/events.js +55 -0
  369. package/packages/workflow-events/dist/src/events.js.map +1 -0
  370. package/packages/workflow-events/dist/src/index.d.ts +2 -0
  371. package/packages/workflow-events/dist/src/index.d.ts.map +1 -0
  372. package/packages/workflow-events/dist/src/index.js +2 -0
  373. package/packages/workflow-events/dist/src/index.js.map +1 -0
  374. package/packages/workflow-events/dist/src/pipeline.d.ts +21 -0
  375. package/packages/workflow-events/dist/src/pipeline.d.ts.map +1 -0
  376. package/packages/workflow-events/dist/src/pipeline.js +36 -0
  377. package/packages/workflow-events/dist/src/pipeline.js.map +1 -0
  378. package/packages/workflow-events/dist/src/types.d.ts +110 -0
  379. package/packages/workflow-events/dist/src/types.d.ts.map +1 -0
  380. package/packages/workflow-events/dist/src/types.js +5 -0
  381. package/packages/workflow-events/dist/src/types.js.map +1 -0
  382. package/packages/workflow-events/dist/types.d.ts +110 -0
  383. package/packages/workflow-events/dist/types.d.ts.map +1 -0
  384. package/packages/workflow-events/dist/types.js +5 -0
  385. package/packages/workflow-events/dist/types.js.map +1 -0
  386. package/packages/workflow-events/package.json +12 -0
  387. package/packages/workflow-events/src/events.ts +86 -0
  388. package/packages/workflow-events/src/index.ts +19 -0
  389. package/packages/workflow-events/src/pipeline.ts +41 -0
  390. package/packages/workflow-events/src/types.d.ts +110 -0
  391. package/packages/workflow-events/src/types.d.ts.map +1 -0
  392. package/packages/workflow-events/src/types.js +5 -0
  393. package/packages/workflow-events/src/types.js.map +1 -0
  394. package/packages/workflow-events/src/types.ts +139 -0
  395. package/packages/workflow-events/tsconfig.json +10 -0
  396. package/packages/workspace-scanner/dist/detect.d.ts +3 -0
  397. package/packages/workspace-scanner/dist/detect.d.ts.map +1 -0
  398. package/packages/workspace-scanner/dist/detect.js +58 -0
  399. package/packages/workspace-scanner/dist/detect.js.map +1 -0
  400. package/packages/workspace-scanner/dist/git.d.ts +7 -0
  401. package/packages/workspace-scanner/dist/git.d.ts.map +1 -0
  402. package/packages/workspace-scanner/dist/git.js +75 -0
  403. package/packages/workspace-scanner/dist/git.js.map +1 -0
  404. package/packages/workspace-scanner/dist/index.d.ts +5 -0
  405. package/packages/workspace-scanner/dist/index.d.ts.map +1 -0
  406. package/packages/workspace-scanner/dist/index.js +4 -0
  407. package/packages/workspace-scanner/dist/index.js.map +1 -0
  408. package/packages/workspace-scanner/dist/scanner.d.ts +11 -0
  409. package/packages/workspace-scanner/dist/scanner.d.ts.map +1 -0
  410. package/packages/workspace-scanner/dist/scanner.js +46 -0
  411. package/packages/workspace-scanner/dist/scanner.js.map +1 -0
  412. package/packages/workspace-scanner/dist/src/detect.d.ts +3 -0
  413. package/packages/workspace-scanner/dist/src/detect.d.ts.map +1 -0
  414. package/packages/workspace-scanner/dist/src/detect.js +60 -0
  415. package/packages/workspace-scanner/dist/src/detect.js.map +1 -0
  416. package/packages/workspace-scanner/dist/src/git.d.ts +7 -0
  417. package/packages/workspace-scanner/dist/src/git.d.ts.map +1 -0
  418. package/packages/workspace-scanner/dist/src/git.js +75 -0
  419. package/packages/workspace-scanner/dist/src/git.js.map +1 -0
  420. package/packages/workspace-scanner/dist/src/index.d.ts +5 -0
  421. package/packages/workspace-scanner/dist/src/index.d.ts.map +1 -0
  422. package/packages/workspace-scanner/dist/src/index.js +4 -0
  423. package/packages/workspace-scanner/dist/src/index.js.map +1 -0
  424. package/packages/workspace-scanner/dist/src/scanner.d.ts +11 -0
  425. package/packages/workspace-scanner/dist/src/scanner.d.ts.map +1 -0
  426. package/packages/workspace-scanner/dist/src/scanner.js +59 -0
  427. package/packages/workspace-scanner/dist/src/scanner.js.map +1 -0
  428. package/packages/workspace-scanner/dist/src/types.d.ts +35 -0
  429. package/packages/workspace-scanner/dist/src/types.d.ts.map +1 -0
  430. package/packages/workspace-scanner/dist/src/types.js +5 -0
  431. package/packages/workspace-scanner/dist/src/types.js.map +1 -0
  432. package/packages/workspace-scanner/dist/test/scanner.test.js +34 -0
  433. package/packages/workspace-scanner/dist/types.d.ts +35 -0
  434. package/packages/workspace-scanner/dist/types.d.ts.map +1 -0
  435. package/packages/workspace-scanner/dist/types.js +5 -0
  436. package/packages/workspace-scanner/dist/types.js.map +1 -0
  437. package/packages/workspace-scanner/package.json +12 -0
  438. package/packages/workspace-scanner/src/detect.ts +77 -0
  439. package/packages/workspace-scanner/src/git.ts +83 -0
  440. package/packages/workspace-scanner/src/index.ts +9 -0
  441. package/packages/workspace-scanner/src/scanner.ts +73 -0
  442. package/packages/workspace-scanner/src/types.ts +48 -0
  443. package/packages/workspace-scanner/test/scanner.test.js +31 -0
  444. package/packages/workspace-scanner/test/scanner.test.ts +42 -0
  445. package/packages/workspace-scanner/tsconfig.json +10 -0
@@ -0,0 +1,37 @@
1
+ import { describe, it } from "node:test";
2
+ import { deepEqual } from "node:assert";
3
+ import { parseImports } from "../src/imports.js";
4
+ describe("parseImports", () => {
5
+ it("parses ESM default import", () => {
6
+ const result = parseImports("import x from './y';", "file.ts");
7
+ deepEqual(result, ["./y"]);
8
+ });
9
+ it("parses ESM named import", () => {
10
+ const result = parseImports("import { a, b } from './x';", "file.ts");
11
+ deepEqual(result, ["./x"]);
12
+ });
13
+ it("parses ESM package import", () => {
14
+ const result = parseImports("import lodash from 'lodash';", "file.ts");
15
+ deepEqual(result, ["lodash"]);
16
+ });
17
+ it("parses CommonJS require", () => {
18
+ const result = parseImports("const x = require('./y');", "file.ts");
19
+ deepEqual(result, ["./y"]);
20
+ });
21
+ it("parses Python from-import", () => {
22
+ const result = parseImports("from os import path", "file.py");
23
+ deepEqual(result, ["os"]);
24
+ });
25
+ it("parses Python direct import", () => {
26
+ const result = parseImports("import numpy", "file.py");
27
+ deepEqual(result, ["numpy"]);
28
+ });
29
+ it("returns empty for empty file", () => {
30
+ const result = parseImports("", "file.ts");
31
+ deepEqual(result, []);
32
+ });
33
+ it("deduplicates imports", () => {
34
+ const result = parseImports("import x from './y';\nimport z from './y';", "file.ts");
35
+ deepEqual(result, ["./y"]);
36
+ });
37
+ });
@@ -0,0 +1,48 @@
1
+ import { describe, it } from "node:test";
2
+ import { equal, deepEqual } from "node:assert";
3
+ import { parseImports } from "../src/imports.js";
4
+
5
+ describe("parseImports", () => {
6
+ it("parses ESM default import", () => {
7
+ const result = parseImports("import x from './y';", "file.ts");
8
+ deepEqual(result, ["./y"]);
9
+ });
10
+
11
+ it("parses ESM named import", () => {
12
+ const result = parseImports("import { a, b } from './x';", "file.ts");
13
+ deepEqual(result, ["./x"]);
14
+ });
15
+
16
+ it("parses ESM package import", () => {
17
+ const result = parseImports("import lodash from 'lodash';", "file.ts");
18
+ deepEqual(result, ["lodash"]);
19
+ });
20
+
21
+ it("parses CommonJS require", () => {
22
+ const result = parseImports("const x = require('./y');", "file.ts");
23
+ deepEqual(result, ["./y"]);
24
+ });
25
+
26
+ it("parses Python from-import", () => {
27
+ const result = parseImports("from os import path", "file.py");
28
+ deepEqual(result, ["os"]);
29
+ });
30
+
31
+ it("parses Python direct import", () => {
32
+ const result = parseImports("import numpy", "file.py");
33
+ deepEqual(result, ["numpy"]);
34
+ });
35
+
36
+ it("returns empty for empty file", () => {
37
+ const result = parseImports("", "file.ts");
38
+ deepEqual(result, []);
39
+ });
40
+
41
+ it("deduplicates imports", () => {
42
+ const result = parseImports(
43
+ "import x from './y';\nimport z from './y';",
44
+ "file.ts",
45
+ );
46
+ deepEqual(result, ["./y"]);
47
+ });
48
+ });
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": ".",
6
+ "types": ["node"],
7
+ "lib": ["ES2022"]
8
+ },
9
+ "include": ["src/**/*"]
10
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Event Bus — pub/sub implementation
3
+ */
4
+ import type { Subscriber, Subscription, EventPayload } from "./types.js";
5
+ export declare class EventBus {
6
+ private readonly subs;
7
+ private readonly byTopic;
8
+ publish<T>(topic: string, data: T, source?: string): string;
9
+ subscribe<T>(topic: string, subscriber: Subscriber<T>, filter?: (data: T) => boolean, priority?: number): string;
10
+ unsubscribe(subscriptionId: string): void;
11
+ unsubscribeAll(topic?: string): void;
12
+ replay(topic: string, events: EventPayload<unknown>[]): void;
13
+ getSubscribers(topic?: string): Subscription[];
14
+ }
15
+ //# sourceMappingURL=bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwC;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAE/D,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,SAAW,GAAG,MAAM,CA6B5D;IAED,SAAS,CAAC,CAAC,EACV,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,EAC7B,QAAQ,SAAI,GACV,MAAM,CAcR;IAED,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAMxC;IAED,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAWnC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAM3D;IAED,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAM7C;CACD"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Event Bus — pub/sub implementation
3
+ */
4
+ import { randomUUID } from "node:crypto";
5
+ export class EventBus {
6
+ subs = new Map();
7
+ byTopic = new Map();
8
+ publish(topic, data, source = "system") {
9
+ const eventId = randomUUID();
10
+ const timestamp = new Date().toISOString();
11
+ const payload = { topic, data, timestamp, eventId, source };
12
+ const topicIds = this.byTopic.get(topic) ?? new Set();
13
+ const wildcardIds = this.byTopic.get("*") ?? new Set();
14
+ const matches = [];
15
+ for (const sid of [...topicIds, ...wildcardIds]) {
16
+ const sub = this.subs.get(sid);
17
+ if (!sub || !sub.active)
18
+ continue;
19
+ if (sub.filter && !sub.filter(data))
20
+ continue;
21
+ matches.push({ sub, payload });
22
+ }
23
+ matches.sort((a, b) => b.sub.priority - a.sub.priority);
24
+ for (const { sub } of matches) {
25
+ try {
26
+ sub.subscriber(payload);
27
+ }
28
+ catch {
29
+ sub.active = false;
30
+ this.subs.delete(sub.id);
31
+ this.byTopic.get(sub.topic)?.delete(sub.id);
32
+ }
33
+ }
34
+ return eventId;
35
+ }
36
+ subscribe(topic, subscriber, filter, priority = 0) {
37
+ const id = randomUUID();
38
+ const sub = {
39
+ id,
40
+ topic,
41
+ subscriber: subscriber,
42
+ filter: filter,
43
+ priority,
44
+ active: true,
45
+ };
46
+ this.subs.set(id, sub);
47
+ if (!this.byTopic.has(topic))
48
+ this.byTopic.set(topic, new Set());
49
+ this.byTopic.get(topic).add(id);
50
+ return id;
51
+ }
52
+ unsubscribe(subscriptionId) {
53
+ const sub = this.subs.get(subscriptionId);
54
+ if (!sub)
55
+ return;
56
+ sub.active = false;
57
+ this.subs.delete(subscriptionId);
58
+ this.byTopic.get(sub.topic)?.delete(subscriptionId);
59
+ }
60
+ unsubscribeAll(topic) {
61
+ if (topic) {
62
+ const ids = this.byTopic.get(topic);
63
+ if (ids) {
64
+ for (const id of ids)
65
+ this.unsubscribe(id);
66
+ this.byTopic.delete(topic);
67
+ }
68
+ }
69
+ else {
70
+ for (const id of this.subs.keys())
71
+ this.unsubscribe(id);
72
+ this.byTopic.clear();
73
+ }
74
+ }
75
+ replay(topic, events) {
76
+ for (const event of events) {
77
+ if (event.topic === topic || topic === "*") {
78
+ this.publish(event.topic, event.data, event.source);
79
+ }
80
+ }
81
+ }
82
+ getSubscribers(topic) {
83
+ if (topic) {
84
+ const ids = this.byTopic.get(topic) ?? new Set();
85
+ return [...ids].map((id) => this.subs.get(id)).filter((s) => s !== undefined);
86
+ }
87
+ return [...this.subs.values()].filter((s) => s.active);
88
+ }
89
+ }
90
+ //# sourceMappingURL=bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { EventBus } from "./bus.js";
2
+ export { EventBusError } from "./types.js";
3
+ export type { Topic, EventPayload, Subscriber, Subscription, BusOptions } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { EventBus } from "./bus.js";
2
+ export { EventBusError } from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Event Bus — pub/sub implementation
3
+ */
4
+ import type { Subscriber, Subscription, EventPayload } from "./types.js";
5
+ export declare class EventBus {
6
+ private readonly subs;
7
+ private readonly byTopic;
8
+ publish<T>(topic: string, data: T, source?: string): string;
9
+ subscribe<T>(topic: string, subscriber: Subscriber<T>, filter?: (data: T) => boolean, priority?: number): string;
10
+ unsubscribe(subscriptionId: string): void;
11
+ unsubscribeAll(topic?: string): void;
12
+ replay(topic: string, events: EventPayload<unknown>[]): void;
13
+ getSubscribers(topic?: string): Subscription[];
14
+ }
15
+ //# sourceMappingURL=bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/bus.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwC;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAE/D,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,SAAW,GAAG,MAAM,CAsC5D;IAED,SAAS,CAAC,CAAC,EACV,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,EAC7B,QAAQ,SAAI,GACV,MAAM,CAcR;IAED,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAMxC;IAED,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAWnC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAM3D;IAED,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAQ7C;CACD"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Event Bus — pub/sub implementation
3
+ */
4
+ import { randomUUID } from "node:crypto";
5
+ export class EventBus {
6
+ subs = new Map();
7
+ byTopic = new Map();
8
+ publish(topic, data, source = "system") {
9
+ const eventId = randomUUID();
10
+ const timestamp = new Date().toISOString();
11
+ const payload = {
12
+ topic,
13
+ data,
14
+ timestamp,
15
+ eventId,
16
+ source,
17
+ };
18
+ const topicIds = this.byTopic.get(topic) ?? new Set();
19
+ const wildcardIds = this.byTopic.get("*") ?? new Set();
20
+ const matches = [];
21
+ for (const sid of [...topicIds, ...wildcardIds]) {
22
+ const sub = this.subs.get(sid);
23
+ if (!sub || !sub.active)
24
+ continue;
25
+ if (sub.filter && !sub.filter(data))
26
+ continue;
27
+ matches.push({ sub, payload });
28
+ }
29
+ matches.sort((a, b) => b.sub.priority - a.sub.priority);
30
+ for (const { sub } of matches) {
31
+ try {
32
+ sub.subscriber(payload);
33
+ }
34
+ catch {
35
+ sub.active = false;
36
+ this.subs.delete(sub.id);
37
+ this.byTopic.get(sub.topic)?.delete(sub.id);
38
+ }
39
+ }
40
+ return eventId;
41
+ }
42
+ subscribe(topic, subscriber, filter, priority = 0) {
43
+ const id = randomUUID();
44
+ const sub = {
45
+ id,
46
+ topic,
47
+ subscriber: subscriber,
48
+ filter: filter,
49
+ priority,
50
+ active: true,
51
+ };
52
+ this.subs.set(id, sub);
53
+ if (!this.byTopic.has(topic))
54
+ this.byTopic.set(topic, new Set());
55
+ this.byTopic.get(topic).add(id);
56
+ return id;
57
+ }
58
+ unsubscribe(subscriptionId) {
59
+ const sub = this.subs.get(subscriptionId);
60
+ if (!sub)
61
+ return;
62
+ sub.active = false;
63
+ this.subs.delete(subscriptionId);
64
+ this.byTopic.get(sub.topic)?.delete(subscriptionId);
65
+ }
66
+ unsubscribeAll(topic) {
67
+ if (topic) {
68
+ const ids = this.byTopic.get(topic);
69
+ if (ids) {
70
+ for (const id of ids)
71
+ this.unsubscribe(id);
72
+ this.byTopic.delete(topic);
73
+ }
74
+ }
75
+ else {
76
+ for (const id of this.subs.keys())
77
+ this.unsubscribe(id);
78
+ this.byTopic.clear();
79
+ }
80
+ }
81
+ replay(topic, events) {
82
+ for (const event of events) {
83
+ if (event.topic === topic || topic === "*") {
84
+ this.publish(event.topic, event.data, event.source);
85
+ }
86
+ }
87
+ }
88
+ getSubscribers(topic) {
89
+ if (topic) {
90
+ const ids = this.byTopic.get(topic) ?? new Set();
91
+ return [...ids]
92
+ .map((id) => this.subs.get(id))
93
+ .filter((s) => s !== undefined);
94
+ }
95
+ return [...this.subs.values()].filter((s) => s.active);
96
+ }
97
+ }
98
+ //# sourceMappingURL=bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../../src/bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { EventBus } from "./bus.js";
2
+ export { EventBusError } from "./types.js";
3
+ export type { Topic, EventPayload, Subscriber, Subscription, BusOptions, } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EACX,KAAK,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,GACV,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { EventBus } from "./bus.js";
2
+ export { EventBusError } from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Event Bus — Types
3
+ */
4
+ export type Topic = "session.message" | "session.assistant_start" | "session.assistant_end" | "session.tool_start" | "session.tool_end" | "session.checkpoint" | "session.compact" | "task.assigned" | "task.started" | "task.completed" | "task.failed" | "review.requested" | "review.completed" | "decision.made" | "approval.requested" | "approval.granted" | "workflow.started" | "workflow.finished" | "knowledge.extracted" | "system.quota_exceeded" | "system.checkpoint_saved" | "system.error";
5
+ export interface EventPayload<T = unknown> {
6
+ topic: string;
7
+ data: T;
8
+ timestamp: string;
9
+ eventId: string;
10
+ source: string;
11
+ }
12
+ export type Subscriber<T = unknown> = (payload: EventPayload<T>) => void | Promise<void>;
13
+ export interface Subscription {
14
+ id: string;
15
+ topic: string;
16
+ subscriber: Subscriber<unknown>;
17
+ filter?: (data: unknown) => boolean;
18
+ priority: number;
19
+ active: boolean;
20
+ }
21
+ export interface BusOptions {
22
+ deliveryGuarantee?: "at_least_once" | "at_most_once" | "exactly_once";
23
+ }
24
+ export declare class EventBusError extends Error {
25
+ constructor(message: string);
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,KAAK,GACd,iBAAiB,GACjB,yBAAyB,GACzB,uBAAuB,GACvB,oBAAoB,GACpB,kBAAkB,GAClB,oBAAoB,GACpB,iBAAiB,GACjB,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,aAAa,GACb,kBAAkB,GAClB,kBAAkB,GAClB,eAAe,GACf,oBAAoB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,GACrB,uBAAuB,GACvB,yBAAyB,GACzB,cAAc,CAAC;AAElB,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,CACrC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KACpB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IAC1B,iBAAiB,CAAC,EAAE,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;CACtE;AAED,qBAAa,aAAc,SAAQ,KAAK;IACvC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Event Bus — Types
3
+ */
4
+ export class EventBusError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "EventBusError";
8
+ }
9
+ }
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmDH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACvC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC7B,CAAC;CACD"}
@@ -0,0 +1,52 @@
1
+ import { describe, it } from "node:test";
2
+ import { equal, deepEqual } from "node:assert";
3
+ import { EventBus } from "../src/bus.js";
4
+ describe("EventBus", () => {
5
+ const bus = new EventBus();
6
+ it("publish returns eventId", () => {
7
+ const id = bus.publish("test.topic", { msg: "hello" });
8
+ equal(typeof id, "string");
9
+ equal(id.length > 0, true);
10
+ });
11
+ it("subscriber receives event", () => {
12
+ let received = null;
13
+ bus.subscribe("test.1", (p) => { received = p; });
14
+ bus.publish("test.1", { data: "hello" });
15
+ equal(received.data, "hello");
16
+ });
17
+ it("multiple subscribers all called", () => {
18
+ const calls = [];
19
+ bus.subscribe("test.2", () => { calls.push(1); });
20
+ bus.subscribe("test.2", () => { calls.push(2); });
21
+ bus.publish("test.2", { x: 1 });
22
+ deepEqual(calls, [1, 2]);
23
+ });
24
+ it("unsubscribe stops notifications", () => {
25
+ let called = false;
26
+ const id = bus.subscribe("test.3", () => { called = true; });
27
+ bus.unsubscribe(id);
28
+ bus.publish("test.3", {});
29
+ equal(called, false);
30
+ });
31
+ it("filter predicates work", () => {
32
+ let called = false;
33
+ bus.subscribe("test.4", () => { called = true; }, (d) => d.ok === true);
34
+ bus.publish("test.4", { ok: false });
35
+ equal(called, false);
36
+ bus.publish("test.4", { ok: true });
37
+ equal(called, true);
38
+ });
39
+ it("priority ordering respected", () => {
40
+ const order = [];
41
+ bus.subscribe("test.5", () => { order.push(1); }, undefined, 1);
42
+ bus.subscribe("test.5", () => { order.push(2); }, undefined, 2);
43
+ bus.publish("test.5", {});
44
+ deepEqual(order, [2, 1]); // higher priority first
45
+ });
46
+ it("unsubscribeAll(topic) removes all for topic", () => {
47
+ bus.subscribe("test.6", () => { });
48
+ bus.subscribe("test.6", () => { });
49
+ bus.unsubscribeAll("test.6");
50
+ equal(bus.getSubscribers("test.6").length, 0);
51
+ });
52
+ });
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Event Bus — Types
3
+ */
4
+ export type Topic = "session.message" | "session.assistant_start" | "session.assistant_end" | "session.tool_start" | "session.tool_end" | "session.checkpoint" | "session.compact" | "task.assigned" | "task.started" | "task.completed" | "task.failed" | "review.requested" | "review.completed" | "decision.made" | "approval.requested" | "approval.granted" | "workflow.started" | "workflow.finished" | "knowledge.extracted" | "system.quota_exceeded" | "system.checkpoint_saved" | "system.error";
5
+ export interface EventPayload<T = unknown> {
6
+ topic: string;
7
+ data: T;
8
+ timestamp: string;
9
+ eventId: string;
10
+ source: string;
11
+ }
12
+ export type Subscriber<T = unknown> = (payload: EventPayload<T>) => void | Promise<void>;
13
+ export interface Subscription {
14
+ id: string;
15
+ topic: string;
16
+ subscriber: Subscriber<unknown>;
17
+ filter?: (data: unknown) => boolean;
18
+ priority: number;
19
+ active: boolean;
20
+ }
21
+ export interface BusOptions {
22
+ deliveryGuarantee?: "at_least_once" | "at_most_once" | "exactly_once";
23
+ }
24
+ export declare class EventBusError extends Error {
25
+ constructor(message: string);
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,KAAK,GACd,iBAAiB,GACjB,yBAAyB,GACzB,uBAAuB,GACvB,oBAAoB,GACpB,kBAAkB,GAClB,oBAAoB,GACpB,iBAAiB,GACjB,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,aAAa,GACb,kBAAkB,GAClB,kBAAkB,GAClB,eAAe,GACf,oBAAoB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,GACrB,uBAAuB,GACvB,yBAAyB,GACzB,cAAc,CAAC;AAElB,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,CACrC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KACpB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IAC1B,iBAAiB,CAAC,EAAE,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;CACtE;AAED,qBAAa,aAAc,SAAQ,KAAK;IACvC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Event Bus — Types
3
+ */
4
+ export class EventBusError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "EventBusError";
8
+ }
9
+ }
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmDH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACvC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC7B,CAAC;CACD"}
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "@pi/event-bus",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "src/index.ts",
6
+ "exports": {
7
+ ".": "./src/index.ts"
8
+ },
9
+ "scripts": {
10
+ "test": "node --test"
11
+ }
12
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Event Bus — pub/sub implementation
3
+ */
4
+
5
+ import { randomUUID } from "node:crypto";
6
+ import type { Subscriber, Subscription, EventPayload } from "./types.js";
7
+
8
+ export class EventBus {
9
+ private readonly subs: Map<string, Subscription> = new Map();
10
+ private readonly byTopic: Map<string, Set<string>> = new Map();
11
+
12
+ publish<T>(topic: string, data: T, source = "system"): string {
13
+ const eventId = randomUUID();
14
+ const timestamp = new Date().toISOString();
15
+ const payload: EventPayload<T> = {
16
+ topic,
17
+ data,
18
+ timestamp,
19
+ eventId,
20
+ source,
21
+ };
22
+
23
+ const topicIds = this.byTopic.get(topic) ?? new Set();
24
+ const wildcardIds = this.byTopic.get("*") ?? new Set();
25
+
26
+ const matches: Array<{
27
+ sub: Subscription;
28
+ payload: EventPayload<unknown>;
29
+ }> = [];
30
+ for (const sid of [...topicIds, ...wildcardIds]) {
31
+ const sub = this.subs.get(sid);
32
+ if (!sub || !sub.active) continue;
33
+ if (sub.filter && !sub.filter(data)) continue;
34
+ matches.push({ sub, payload });
35
+ }
36
+
37
+ matches.sort((a, b) => b.sub.priority - a.sub.priority);
38
+
39
+ for (const { sub } of matches) {
40
+ try {
41
+ (sub.subscriber as Subscriber)(payload);
42
+ } catch {
43
+ sub.active = false;
44
+ this.subs.delete(sub.id);
45
+ this.byTopic.get(sub.topic)?.delete(sub.id);
46
+ }
47
+ }
48
+
49
+ return eventId;
50
+ }
51
+
52
+ subscribe<T>(
53
+ topic: string,
54
+ subscriber: Subscriber<T>,
55
+ filter?: (data: T) => boolean,
56
+ priority = 0,
57
+ ): string {
58
+ const id = randomUUID();
59
+ const sub: Subscription = {
60
+ id,
61
+ topic,
62
+ subscriber: subscriber as Subscriber<unknown>,
63
+ filter: filter as (data: unknown) => boolean,
64
+ priority,
65
+ active: true,
66
+ };
67
+ this.subs.set(id, sub);
68
+ if (!this.byTopic.has(topic)) this.byTopic.set(topic, new Set());
69
+ this.byTopic.get(topic)!.add(id);
70
+ return id;
71
+ }
72
+
73
+ unsubscribe(subscriptionId: string): void {
74
+ const sub = this.subs.get(subscriptionId);
75
+ if (!sub) return;
76
+ sub.active = false;
77
+ this.subs.delete(subscriptionId);
78
+ this.byTopic.get(sub.topic)?.delete(subscriptionId);
79
+ }
80
+
81
+ unsubscribeAll(topic?: string): void {
82
+ if (topic) {
83
+ const ids = this.byTopic.get(topic);
84
+ if (ids) {
85
+ for (const id of ids) this.unsubscribe(id);
86
+ this.byTopic.delete(topic);
87
+ }
88
+ } else {
89
+ for (const id of this.subs.keys()) this.unsubscribe(id);
90
+ this.byTopic.clear();
91
+ }
92
+ }
93
+
94
+ replay(topic: string, events: EventPayload<unknown>[]): void {
95
+ for (const event of events) {
96
+ if (event.topic === topic || topic === "*") {
97
+ this.publish(event.topic, event.data, event.source);
98
+ }
99
+ }
100
+ }
101
+
102
+ getSubscribers(topic?: string): Subscription[] {
103
+ if (topic) {
104
+ const ids = this.byTopic.get(topic) ?? new Set();
105
+ return [...ids]
106
+ .map((id) => this.subs.get(id)!)
107
+ .filter((s): s is Subscription => s !== undefined);
108
+ }
109
+ return [...this.subs.values()].filter((s) => s.active);
110
+ }
111
+ }