@overlordai/server 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/database/migrations/001-init-schema.sql +226 -0
  2. package/database/migrations/002-add-indexes.sql +17 -0
  3. package/database/migrations/003-add-settings-table.sql +4 -0
  4. package/database/migrations/004-add-developer-id-index.sql +5 -0
  5. package/dist/adapters/adapter.interface.d.ts +41 -0
  6. package/dist/adapters/adapter.interface.d.ts.map +1 -0
  7. package/dist/adapters/adapter.interface.js +6 -0
  8. package/dist/adapters/adapter.interface.js.map +1 -0
  9. package/dist/adapters/adapter.module.d.ts +3 -0
  10. package/dist/adapters/adapter.module.d.ts.map +1 -0
  11. package/dist/adapters/adapter.module.js +54 -0
  12. package/dist/adapters/adapter.module.js.map +1 -0
  13. package/dist/adapters/adapter.registry.d.ts +19 -0
  14. package/dist/adapters/adapter.registry.d.ts.map +1 -0
  15. package/dist/adapters/adapter.registry.js +51 -0
  16. package/dist/adapters/adapter.registry.js.map +1 -0
  17. package/dist/adapters/lark/lark-card.builder.d.ts +48 -0
  18. package/dist/adapters/lark/lark-card.builder.d.ts.map +1 -0
  19. package/dist/adapters/lark/lark-card.builder.js +259 -0
  20. package/dist/adapters/lark/lark-card.builder.js.map +1 -0
  21. package/dist/adapters/lark/lark-message.parser.d.ts +51 -0
  22. package/dist/adapters/lark/lark-message.parser.d.ts.map +1 -0
  23. package/dist/adapters/lark/lark-message.parser.js +189 -0
  24. package/dist/adapters/lark/lark-message.parser.js.map +1 -0
  25. package/dist/adapters/lark/lark-signature.d.ts +13 -0
  26. package/dist/adapters/lark/lark-signature.d.ts.map +1 -0
  27. package/dist/adapters/lark/lark-signature.js +58 -0
  28. package/dist/adapters/lark/lark-signature.js.map +1 -0
  29. package/dist/adapters/lark/lark.adapter.d.ts +65 -0
  30. package/dist/adapters/lark/lark.adapter.d.ts.map +1 -0
  31. package/dist/adapters/lark/lark.adapter.js +565 -0
  32. package/dist/adapters/lark/lark.adapter.js.map +1 -0
  33. package/dist/adapters/lark/lark.controller.d.ts +21 -0
  34. package/dist/adapters/lark/lark.controller.d.ts.map +1 -0
  35. package/dist/adapters/lark/lark.controller.js +120 -0
  36. package/dist/adapters/lark/lark.controller.js.map +1 -0
  37. package/dist/adapters/slack/slack.adapter.d.ts +19 -0
  38. package/dist/adapters/slack/slack.adapter.d.ts.map +1 -0
  39. package/dist/adapters/slack/slack.adapter.js +42 -0
  40. package/dist/adapters/slack/slack.adapter.js.map +1 -0
  41. package/dist/app.module.d.ts +5 -0
  42. package/dist/app.module.d.ts.map +1 -0
  43. package/dist/app.module.js +48 -0
  44. package/dist/app.module.js.map +1 -0
  45. package/dist/auth/auth.controller.d.ts +15 -0
  46. package/dist/auth/auth.controller.d.ts.map +1 -0
  47. package/dist/auth/auth.controller.js +67 -0
  48. package/dist/auth/auth.controller.js.map +1 -0
  49. package/dist/auth/auth.module.d.ts +3 -0
  50. package/dist/auth/auth.module.d.ts.map +1 -0
  51. package/dist/auth/auth.module.js +46 -0
  52. package/dist/auth/auth.module.js.map +1 -0
  53. package/dist/auth/auth.service.d.ts +62 -0
  54. package/dist/auth/auth.service.d.ts.map +1 -0
  55. package/dist/auth/auth.service.js +307 -0
  56. package/dist/auth/auth.service.js.map +1 -0
  57. package/dist/auth/decorators/allow-totp-setup.decorator.d.ts +3 -0
  58. package/dist/auth/decorators/allow-totp-setup.decorator.d.ts.map +1 -0
  59. package/dist/auth/decorators/allow-totp-setup.decorator.js +8 -0
  60. package/dist/auth/decorators/allow-totp-setup.decorator.js.map +1 -0
  61. package/dist/auth/decorators/project-roles.decorator.d.ts +4 -0
  62. package/dist/auth/decorators/project-roles.decorator.d.ts.map +1 -0
  63. package/dist/auth/decorators/project-roles.decorator.js +8 -0
  64. package/dist/auth/decorators/project-roles.decorator.js.map +1 -0
  65. package/dist/auth/decorators/roles.decorator.d.ts +4 -0
  66. package/dist/auth/decorators/roles.decorator.d.ts.map +1 -0
  67. package/dist/auth/decorators/roles.decorator.js +8 -0
  68. package/dist/auth/decorators/roles.decorator.js.map +1 -0
  69. package/dist/auth/extract-user.middleware.d.ts +21 -0
  70. package/dist/auth/extract-user.middleware.d.ts.map +1 -0
  71. package/dist/auth/extract-user.middleware.js +57 -0
  72. package/dist/auth/extract-user.middleware.js.map +1 -0
  73. package/dist/auth/guards/jwt-auth.guard.d.ts +14 -0
  74. package/dist/auth/guards/jwt-auth.guard.d.ts.map +1 -0
  75. package/dist/auth/guards/jwt-auth.guard.js +139 -0
  76. package/dist/auth/guards/jwt-auth.guard.js.map +1 -0
  77. package/dist/auth/guards/project-role.guard.d.ts +10 -0
  78. package/dist/auth/guards/project-role.guard.d.ts.map +1 -0
  79. package/dist/auth/guards/project-role.guard.js +72 -0
  80. package/dist/auth/guards/project-role.guard.js.map +1 -0
  81. package/dist/auth/guards/roles.guard.d.ts +8 -0
  82. package/dist/auth/guards/roles.guard.d.ts.map +1 -0
  83. package/dist/auth/guards/roles.guard.js +56 -0
  84. package/dist/auth/guards/roles.guard.js.map +1 -0
  85. package/dist/auth/jwt.strategy.d.ts +23 -0
  86. package/dist/auth/jwt.strategy.d.ts.map +1 -0
  87. package/dist/auth/jwt.strategy.js +49 -0
  88. package/dist/auth/jwt.strategy.js.map +1 -0
  89. package/dist/common/crypto.service.d.ts +31 -0
  90. package/dist/common/crypto.service.d.ts.map +1 -0
  91. package/dist/common/crypto.service.js +120 -0
  92. package/dist/common/crypto.service.js.map +1 -0
  93. package/dist/common/error-filter.d.ts +6 -0
  94. package/dist/common/error-filter.d.ts.map +1 -0
  95. package/dist/common/error-filter.js +78 -0
  96. package/dist/common/error-filter.js.map +1 -0
  97. package/dist/common/health.controller.d.ts +13 -0
  98. package/dist/common/health.controller.d.ts.map +1 -0
  99. package/dist/common/health.controller.js +75 -0
  100. package/dist/common/health.controller.js.map +1 -0
  101. package/dist/common/logger.service.d.ts +11 -0
  102. package/dist/common/logger.service.d.ts.map +1 -0
  103. package/dist/common/logger.service.js +48 -0
  104. package/dist/common/logger.service.js.map +1 -0
  105. package/dist/common/pagination.d.ts +18 -0
  106. package/dist/common/pagination.d.ts.map +1 -0
  107. package/dist/common/pagination.js +39 -0
  108. package/dist/common/pagination.js.map +1 -0
  109. package/dist/common/rate-limit.guard.d.ts +48 -0
  110. package/dist/common/rate-limit.guard.d.ts.map +1 -0
  111. package/dist/common/rate-limit.guard.js +129 -0
  112. package/dist/common/rate-limit.guard.js.map +1 -0
  113. package/dist/common/sensitive-filter.d.ts +7 -0
  114. package/dist/common/sensitive-filter.d.ts.map +1 -0
  115. package/dist/common/sensitive-filter.js +20 -0
  116. package/dist/common/sensitive-filter.js.map +1 -0
  117. package/dist/database/database.module.d.ts +3 -0
  118. package/dist/database/database.module.d.ts.map +1 -0
  119. package/dist/database/database.module.js +22 -0
  120. package/dist/database/database.module.js.map +1 -0
  121. package/dist/database/database.service.d.ts +13 -0
  122. package/dist/database/database.service.d.ts.map +1 -0
  123. package/dist/database/database.service.js +107 -0
  124. package/dist/database/database.service.js.map +1 -0
  125. package/dist/database/migration-runner.d.ts +5 -0
  126. package/dist/database/migration-runner.d.ts.map +1 -0
  127. package/dist/database/migration-runner.js +86 -0
  128. package/dist/database/migration-runner.js.map +1 -0
  129. package/dist/database/repositories/audit-log.repository.d.ts +29 -0
  130. package/dist/database/repositories/audit-log.repository.d.ts.map +1 -0
  131. package/dist/database/repositories/audit-log.repository.js +80 -0
  132. package/dist/database/repositories/audit-log.repository.js.map +1 -0
  133. package/dist/database/repositories/bot.repository.d.ts +67 -0
  134. package/dist/database/repositories/bot.repository.d.ts.map +1 -0
  135. package/dist/database/repositories/bot.repository.js +133 -0
  136. package/dist/database/repositories/bot.repository.js.map +1 -0
  137. package/dist/database/repositories/developer-token.repository.d.ts +40 -0
  138. package/dist/database/repositories/developer-token.repository.d.ts.map +1 -0
  139. package/dist/database/repositories/developer-token.repository.js +84 -0
  140. package/dist/database/repositories/developer-token.repository.js.map +1 -0
  141. package/dist/database/repositories/developer.repository.d.ts +25 -0
  142. package/dist/database/repositories/developer.repository.d.ts.map +1 -0
  143. package/dist/database/repositories/developer.repository.js +139 -0
  144. package/dist/database/repositories/developer.repository.js.map +1 -0
  145. package/dist/database/repositories/machine.repository.d.ts +39 -0
  146. package/dist/database/repositories/machine.repository.d.ts.map +1 -0
  147. package/dist/database/repositories/machine.repository.js +176 -0
  148. package/dist/database/repositories/machine.repository.js.map +1 -0
  149. package/dist/database/repositories/notification.repository.d.ts +19 -0
  150. package/dist/database/repositories/notification.repository.d.ts.map +1 -0
  151. package/dist/database/repositories/notification.repository.js +94 -0
  152. package/dist/database/repositories/notification.repository.js.map +1 -0
  153. package/dist/database/repositories/project-member.repository.d.ts +30 -0
  154. package/dist/database/repositories/project-member.repository.d.ts.map +1 -0
  155. package/dist/database/repositories/project-member.repository.js +75 -0
  156. package/dist/database/repositories/project-member.repository.js.map +1 -0
  157. package/dist/database/repositories/project.repository.d.ts +24 -0
  158. package/dist/database/repositories/project.repository.d.ts.map +1 -0
  159. package/dist/database/repositories/project.repository.js +154 -0
  160. package/dist/database/repositories/project.repository.js.map +1 -0
  161. package/dist/database/repositories/session.repository.d.ts +19 -0
  162. package/dist/database/repositories/session.repository.d.ts.map +1 -0
  163. package/dist/database/repositories/session.repository.js +117 -0
  164. package/dist/database/repositories/session.repository.js.map +1 -0
  165. package/dist/database/repositories/task.repository.d.ts +37 -0
  166. package/dist/database/repositories/task.repository.d.ts.map +1 -0
  167. package/dist/database/repositories/task.repository.js +229 -0
  168. package/dist/database/repositories/task.repository.js.map +1 -0
  169. package/dist/database/repositories/worker-token.repository.d.ts +20 -0
  170. package/dist/database/repositories/worker-token.repository.d.ts.map +1 -0
  171. package/dist/database/repositories/worker-token.repository.js +94 -0
  172. package/dist/database/repositories/worker-token.repository.js.map +1 -0
  173. package/dist/database/repositories/workspace.repository.d.ts +19 -0
  174. package/dist/database/repositories/workspace.repository.d.ts.map +1 -0
  175. package/dist/database/repositories/workspace.repository.js +82 -0
  176. package/dist/database/repositories/workspace.repository.js.map +1 -0
  177. package/dist/dispatcher/capability.service.d.ts +50 -0
  178. package/dist/dispatcher/capability.service.d.ts.map +1 -0
  179. package/dist/dispatcher/capability.service.js +159 -0
  180. package/dist/dispatcher/capability.service.js.map +1 -0
  181. package/dist/dispatcher/cleanup.service.d.ts +23 -0
  182. package/dist/dispatcher/cleanup.service.d.ts.map +1 -0
  183. package/dist/dispatcher/cleanup.service.js +107 -0
  184. package/dist/dispatcher/cleanup.service.js.map +1 -0
  185. package/dist/dispatcher/dedup.service.d.ts +48 -0
  186. package/dist/dispatcher/dedup.service.d.ts.map +1 -0
  187. package/dist/dispatcher/dedup.service.js +189 -0
  188. package/dist/dispatcher/dedup.service.js.map +1 -0
  189. package/dist/dispatcher/dispatcher.module.d.ts +3 -0
  190. package/dist/dispatcher/dispatcher.module.d.ts.map +1 -0
  191. package/dist/dispatcher/dispatcher.module.js +76 -0
  192. package/dist/dispatcher/dispatcher.module.js.map +1 -0
  193. package/dist/dispatcher/dispatcher.service.d.ts +134 -0
  194. package/dist/dispatcher/dispatcher.service.d.ts.map +1 -0
  195. package/dist/dispatcher/dispatcher.service.js +1034 -0
  196. package/dist/dispatcher/dispatcher.service.js.map +1 -0
  197. package/dist/dispatcher/heartbeat.service.d.ts +50 -0
  198. package/dist/dispatcher/heartbeat.service.d.ts.map +1 -0
  199. package/dist/dispatcher/heartbeat.service.js +154 -0
  200. package/dist/dispatcher/heartbeat.service.js.map +1 -0
  201. package/dist/dispatcher/machine-selector.d.ts +18 -0
  202. package/dist/dispatcher/machine-selector.d.ts.map +1 -0
  203. package/dist/dispatcher/machine-selector.js +144 -0
  204. package/dist/dispatcher/machine-selector.js.map +1 -0
  205. package/dist/dispatcher/pty-relay.service.d.ts +75 -0
  206. package/dist/dispatcher/pty-relay.service.d.ts.map +1 -0
  207. package/dist/dispatcher/pty-relay.service.js +404 -0
  208. package/dist/dispatcher/pty-relay.service.js.map +1 -0
  209. package/dist/dispatcher/reconciler.d.ts +39 -0
  210. package/dist/dispatcher/reconciler.d.ts.map +1 -0
  211. package/dist/dispatcher/reconciler.js +556 -0
  212. package/dist/dispatcher/reconciler.js.map +1 -0
  213. package/dist/dispatcher/scheduler.service.d.ts +50 -0
  214. package/dist/dispatcher/scheduler.service.d.ts.map +1 -0
  215. package/dist/dispatcher/scheduler.service.js +287 -0
  216. package/dist/dispatcher/scheduler.service.js.map +1 -0
  217. package/dist/dispatcher/state-machine.d.ts +16 -0
  218. package/dist/dispatcher/state-machine.d.ts.map +1 -0
  219. package/dist/dispatcher/state-machine.js +77 -0
  220. package/dist/dispatcher/state-machine.js.map +1 -0
  221. package/dist/dispatcher/task-log-batcher.d.ts +50 -0
  222. package/dist/dispatcher/task-log-batcher.d.ts.map +1 -0
  223. package/dist/dispatcher/task-log-batcher.js +184 -0
  224. package/dist/dispatcher/task-log-batcher.js.map +1 -0
  225. package/dist/dispatcher/worker-connection.manager.d.ts +49 -0
  226. package/dist/dispatcher/worker-connection.manager.d.ts.map +1 -0
  227. package/dist/dispatcher/worker-connection.manager.js +128 -0
  228. package/dist/dispatcher/worker-connection.manager.js.map +1 -0
  229. package/dist/main.d.ts +2 -0
  230. package/dist/main.d.ts.map +1 -0
  231. package/dist/main.js +85 -0
  232. package/dist/main.js.map +1 -0
  233. package/dist/notifier/debouncer.d.ts +39 -0
  234. package/dist/notifier/debouncer.d.ts.map +1 -0
  235. package/dist/notifier/debouncer.js +123 -0
  236. package/dist/notifier/debouncer.js.map +1 -0
  237. package/dist/notifier/notification-consumer.d.ts +88 -0
  238. package/dist/notifier/notification-consumer.d.ts.map +1 -0
  239. package/dist/notifier/notification-consumer.js +186 -0
  240. package/dist/notifier/notification-consumer.js.map +1 -0
  241. package/dist/notifier/notifier.module.d.ts +9 -0
  242. package/dist/notifier/notifier.module.d.ts.map +1 -0
  243. package/dist/notifier/notifier.module.js +58 -0
  244. package/dist/notifier/notifier.module.js.map +1 -0
  245. package/dist/notifier/notifier.service.d.ts +40 -0
  246. package/dist/notifier/notifier.service.d.ts.map +1 -0
  247. package/dist/notifier/notifier.service.js +191 -0
  248. package/dist/notifier/notifier.service.js.map +1 -0
  249. package/dist/notifier/template.service.d.ts +42 -0
  250. package/dist/notifier/template.service.d.ts.map +1 -0
  251. package/dist/notifier/template.service.js +201 -0
  252. package/dist/notifier/template.service.js.map +1 -0
  253. package/dist/redis/redis.module.d.ts +3 -0
  254. package/dist/redis/redis.module.d.ts.map +1 -0
  255. package/dist/redis/redis.module.js +22 -0
  256. package/dist/redis/redis.module.js.map +1 -0
  257. package/dist/redis/redis.service.d.ts +19 -0
  258. package/dist/redis/redis.service.d.ts.map +1 -0
  259. package/dist/redis/redis.service.js +69 -0
  260. package/dist/redis/redis.service.js.map +1 -0
  261. package/dist/web/admin/admin-audit.controller.d.ts +7 -0
  262. package/dist/web/admin/admin-audit.controller.d.ts.map +1 -0
  263. package/dist/web/admin/admin-audit.controller.js +53 -0
  264. package/dist/web/admin/admin-audit.controller.js.map +1 -0
  265. package/dist/web/admin/admin-bot.controller.d.ts +79 -0
  266. package/dist/web/admin/admin-bot.controller.d.ts.map +1 -0
  267. package/dist/web/admin/admin-bot.controller.js +193 -0
  268. package/dist/web/admin/admin-bot.controller.js.map +1 -0
  269. package/dist/web/admin/admin-developer.controller.d.ts +52 -0
  270. package/dist/web/admin/admin-developer.controller.d.ts.map +1 -0
  271. package/dist/web/admin/admin-developer.controller.js +160 -0
  272. package/dist/web/admin/admin-developer.controller.js.map +1 -0
  273. package/dist/web/admin/admin-machine.controller.d.ts +64 -0
  274. package/dist/web/admin/admin-machine.controller.d.ts.map +1 -0
  275. package/dist/web/admin/admin-machine.controller.js +111 -0
  276. package/dist/web/admin/admin-machine.controller.js.map +1 -0
  277. package/dist/web/admin/admin-project.controller.d.ts +45 -0
  278. package/dist/web/admin/admin-project.controller.d.ts.map +1 -0
  279. package/dist/web/admin/admin-project.controller.js +207 -0
  280. package/dist/web/admin/admin-project.controller.js.map +1 -0
  281. package/dist/web/admin/admin-settings.controller.d.ts +18 -0
  282. package/dist/web/admin/admin-settings.controller.d.ts.map +1 -0
  283. package/dist/web/admin/admin-settings.controller.js +93 -0
  284. package/dist/web/admin/admin-settings.controller.js.map +1 -0
  285. package/dist/web/admin/admin-token.controller.d.ts +45 -0
  286. package/dist/web/admin/admin-token.controller.d.ts.map +1 -0
  287. package/dist/web/admin/admin-token.controller.js +182 -0
  288. package/dist/web/admin/admin-token.controller.js.map +1 -0
  289. package/dist/web/dashboard.controller.d.ts +16 -0
  290. package/dist/web/dashboard.controller.d.ts.map +1 -0
  291. package/dist/web/dashboard.controller.js +78 -0
  292. package/dist/web/dashboard.controller.js.map +1 -0
  293. package/dist/web/dashboard.service.d.ts +39 -0
  294. package/dist/web/dashboard.service.d.ts.map +1 -0
  295. package/dist/web/dashboard.service.js +234 -0
  296. package/dist/web/dashboard.service.js.map +1 -0
  297. package/dist/web/interaction.service.d.ts +42 -0
  298. package/dist/web/interaction.service.d.ts.map +1 -0
  299. package/dist/web/interaction.service.js +102 -0
  300. package/dist/web/interaction.service.js.map +1 -0
  301. package/dist/web/machine.controller.d.ts +102 -0
  302. package/dist/web/machine.controller.d.ts.map +1 -0
  303. package/dist/web/machine.controller.js +121 -0
  304. package/dist/web/machine.controller.js.map +1 -0
  305. package/dist/web/notification.controller.d.ts +22 -0
  306. package/dist/web/notification.controller.d.ts.map +1 -0
  307. package/dist/web/notification.controller.js +70 -0
  308. package/dist/web/notification.controller.js.map +1 -0
  309. package/dist/web/profile.controller.d.ts +70 -0
  310. package/dist/web/profile.controller.d.ts.map +1 -0
  311. package/dist/web/profile.controller.js +262 -0
  312. package/dist/web/profile.controller.js.map +1 -0
  313. package/dist/web/project.controller.d.ts +8 -0
  314. package/dist/web/project.controller.d.ts.map +1 -0
  315. package/dist/web/project.controller.js +54 -0
  316. package/dist/web/project.controller.js.map +1 -0
  317. package/dist/web/pty.gateway.d.ts +32 -0
  318. package/dist/web/pty.gateway.d.ts.map +1 -0
  319. package/dist/web/pty.gateway.js +358 -0
  320. package/dist/web/pty.gateway.js.map +1 -0
  321. package/dist/web/search.service.d.ts +34 -0
  322. package/dist/web/search.service.d.ts.map +1 -0
  323. package/dist/web/search.service.js +106 -0
  324. package/dist/web/search.service.js.map +1 -0
  325. package/dist/web/task.controller.d.ts +54 -0
  326. package/dist/web/task.controller.d.ts.map +1 -0
  327. package/dist/web/task.controller.js +266 -0
  328. package/dist/web/task.controller.js.map +1 -0
  329. package/dist/web/web.module.d.ts +3 -0
  330. package/dist/web/web.module.d.ts.map +1 -0
  331. package/dist/web/web.module.js +97 -0
  332. package/dist/web/web.module.js.map +1 -0
  333. package/dist/web/worker-channel.gateway.d.ts +45 -0
  334. package/dist/web/worker-channel.gateway.d.ts.map +1 -0
  335. package/dist/web/worker-channel.gateway.js +283 -0
  336. package/dist/web/worker-channel.gateway.js.map +1 -0
  337. package/dist/web/worker.controller.d.ts +14 -0
  338. package/dist/web/worker.controller.d.ts.map +1 -0
  339. package/dist/web/worker.controller.js +73 -0
  340. package/dist/web/worker.controller.js.map +1 -0
  341. package/dist/web/workspace.controller.d.ts +109 -0
  342. package/dist/web/workspace.controller.d.ts.map +1 -0
  343. package/dist/web/workspace.controller.js +386 -0
  344. package/dist/web/workspace.controller.js.map +1 -0
  345. package/package.json +61 -0
@@ -0,0 +1,50 @@
1
+ /** Failure types with different recovery strategies. */
2
+ export type FailureType = 'binary_missing' | 'auth_failure' | 'rate_limit' | 'unknown';
3
+ interface FailureRecord {
4
+ count: number;
5
+ type: FailureType;
6
+ lastFailure: number;
7
+ }
8
+ export declare class CapabilityService {
9
+ private readonly logger;
10
+ /** machineId -> agentType -> failure record */
11
+ private readonly failureRecords;
12
+ /** machineId -> Set of degraded agent types */
13
+ private readonly degraded;
14
+ /** Timers for auto-recovery, keyed by `${machineId}:${agentType}` */
15
+ private readonly recoveryTimers;
16
+ /**
17
+ * Record a failure for a specific agent type on a machine.
18
+ * After DEGRADATION_THRESHOLD consecutive failures the capability is marked
19
+ * as degraded and the machine will no longer be considered capable for that
20
+ * agent type until it is restored (automatically or manually).
21
+ */
22
+ recordFailure(machineId: string, agentType: string, reason: string, failureType?: FailureType): void;
23
+ /**
24
+ * Record a successful execution of an agent type on a machine.
25
+ * Resets the failure counter and restores the capability if it was degraded.
26
+ */
27
+ recordSuccess(machineId: string, agentType: string): void;
28
+ /**
29
+ * Check whether a machine is capable of running a specific agent type.
30
+ * Returns false if the capability has been degraded due to repeated failures.
31
+ */
32
+ isCapable(machineId: string, agentType: string): boolean;
33
+ /**
34
+ * Get the failure record for a machine + capability, if any.
35
+ */
36
+ getFailureRecord(machineId: string, agentType: string): FailureRecord | undefined;
37
+ /**
38
+ * Manually restore a degraded capability for a machine (admin action).
39
+ * Resets both the failure count and the degraded flag.
40
+ */
41
+ restoreCapability(machineId: string, agentType: string): void;
42
+ /**
43
+ * Schedule automatic recovery for a degraded capability based on its failure type.
44
+ * binary_missing failures are permanent and will not auto-recover.
45
+ */
46
+ private scheduleRecovery;
47
+ private cancelRecoveryTimer;
48
+ }
49
+ export {};
50
+ //# sourceMappingURL=capability.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.service.d.ts","sourceRoot":"","sources":["../../src/dispatcher/capability.service.ts"],"names":[],"mappings":"AAKA,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,cAAc,GAAG,YAAY,GAAG,SAAS,CAAC;AAUvF,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBACa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAE7D,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiD;IAEhF,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IAEpE;;;;;OAKG;IACH,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,WAAuB,GACnC,IAAI;IAoCP;;;OAGG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAuBzD;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAQxD;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIjF;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAwB7D;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,mBAAmB;CAQ5B"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var CapabilityService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CapabilityService = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ /** Number of consecutive failures before a capability is degraded. */
13
+ const DEGRADATION_THRESHOLD = 3;
14
+ /** Recovery delay in ms per failure type. null means permanent (no auto-recovery). */
15
+ const RECOVERY_DELAYS = {
16
+ binary_missing: null, // permanent degradation
17
+ auth_failure: 5 * 60_000, // 5 minutes
18
+ rate_limit: 1 * 60_000, // 1 minute
19
+ unknown: 10 * 60_000, // 10 minutes
20
+ };
21
+ let CapabilityService = CapabilityService_1 = class CapabilityService {
22
+ logger = new common_1.Logger(CapabilityService_1.name);
23
+ /** machineId -> agentType -> failure record */
24
+ failureRecords = new Map();
25
+ /** machineId -> Set of degraded agent types */
26
+ degraded = new Map();
27
+ /** Timers for auto-recovery, keyed by `${machineId}:${agentType}` */
28
+ recoveryTimers = new Map();
29
+ /**
30
+ * Record a failure for a specific agent type on a machine.
31
+ * After DEGRADATION_THRESHOLD consecutive failures the capability is marked
32
+ * as degraded and the machine will no longer be considered capable for that
33
+ * agent type until it is restored (automatically or manually).
34
+ */
35
+ recordFailure(machineId, agentType, reason, failureType = 'unknown') {
36
+ if (!this.failureRecords.has(machineId)) {
37
+ this.failureRecords.set(machineId, new Map());
38
+ }
39
+ const machineFailures = this.failureRecords.get(machineId);
40
+ const existing = machineFailures.get(agentType);
41
+ const newCount = (existing?.count ?? 0) + 1;
42
+ machineFailures.set(agentType, {
43
+ count: newCount,
44
+ type: failureType,
45
+ lastFailure: Date.now(),
46
+ });
47
+ this.logger.warn(`Machine ${machineId} failure #${newCount} for ${agentType} [${failureType}]: ${reason}`);
48
+ if (newCount >= DEGRADATION_THRESHOLD) {
49
+ if (!this.degraded.has(machineId)) {
50
+ this.degraded.set(machineId, new Set());
51
+ }
52
+ const wasAlreadyDegraded = this.degraded.get(machineId).has(agentType);
53
+ this.degraded.get(machineId).add(agentType);
54
+ if (!wasAlreadyDegraded) {
55
+ this.logger.warn(`Machine ${machineId} capability '${agentType}' degraded after ${newCount} consecutive failures [${failureType}]`);
56
+ // Schedule auto-recovery if the failure type supports it
57
+ this.scheduleRecovery(machineId, agentType, failureType);
58
+ }
59
+ }
60
+ }
61
+ /**
62
+ * Record a successful execution of an agent type on a machine.
63
+ * Resets the failure counter and restores the capability if it was degraded.
64
+ */
65
+ recordSuccess(machineId, agentType) {
66
+ const machineFailures = this.failureRecords.get(machineId);
67
+ if (machineFailures) {
68
+ machineFailures.delete(agentType);
69
+ if (machineFailures.size === 0) {
70
+ this.failureRecords.delete(machineId);
71
+ }
72
+ }
73
+ this.cancelRecoveryTimer(machineId, agentType);
74
+ const machineDegraded = this.degraded.get(machineId);
75
+ if (machineDegraded && machineDegraded.has(agentType)) {
76
+ machineDegraded.delete(agentType);
77
+ this.logger.log(`Machine ${machineId} capability '${agentType}' restored after successful execution`);
78
+ if (machineDegraded.size === 0) {
79
+ this.degraded.delete(machineId);
80
+ }
81
+ }
82
+ }
83
+ /**
84
+ * Check whether a machine is capable of running a specific agent type.
85
+ * Returns false if the capability has been degraded due to repeated failures.
86
+ */
87
+ isCapable(machineId, agentType) {
88
+ const machineDegraded = this.degraded.get(machineId);
89
+ if (!machineDegraded) {
90
+ return true;
91
+ }
92
+ return !machineDegraded.has(agentType);
93
+ }
94
+ /**
95
+ * Get the failure record for a machine + capability, if any.
96
+ */
97
+ getFailureRecord(machineId, agentType) {
98
+ return this.failureRecords.get(machineId)?.get(agentType);
99
+ }
100
+ /**
101
+ * Manually restore a degraded capability for a machine (admin action).
102
+ * Resets both the failure count and the degraded flag.
103
+ */
104
+ restoreCapability(machineId, agentType) {
105
+ const machineFailures = this.failureRecords.get(machineId);
106
+ if (machineFailures) {
107
+ machineFailures.delete(agentType);
108
+ if (machineFailures.size === 0) {
109
+ this.failureRecords.delete(machineId);
110
+ }
111
+ }
112
+ this.cancelRecoveryTimer(machineId, agentType);
113
+ const machineDegraded = this.degraded.get(machineId);
114
+ if (machineDegraded) {
115
+ machineDegraded.delete(agentType);
116
+ if (machineDegraded.size === 0) {
117
+ this.degraded.delete(machineId);
118
+ }
119
+ }
120
+ this.logger.log(`Machine ${machineId} capability '${agentType}' manually restored`);
121
+ }
122
+ /**
123
+ * Schedule automatic recovery for a degraded capability based on its failure type.
124
+ * binary_missing failures are permanent and will not auto-recover.
125
+ */
126
+ scheduleRecovery(machineId, agentType, failureType) {
127
+ const delay = RECOVERY_DELAYS[failureType];
128
+ if (delay === null) {
129
+ this.logger.warn(`Machine ${machineId} capability '${agentType}' permanently degraded (${failureType}) — manual restore required`);
130
+ return;
131
+ }
132
+ const timerKey = `${machineId}:${agentType}`;
133
+ // Cancel any existing recovery timer
134
+ this.cancelRecoveryTimer(machineId, agentType);
135
+ const timer = setTimeout(() => {
136
+ this.recoveryTimers.delete(timerKey);
137
+ this.restoreCapability(machineId, agentType);
138
+ this.logger.log(`Machine ${machineId} capability '${agentType}' auto-recovered after ${delay / 1000}s (${failureType})`);
139
+ }, delay);
140
+ // Prevent the timer from keeping the process alive
141
+ if (timer.unref) {
142
+ timer.unref();
143
+ }
144
+ this.recoveryTimers.set(timerKey, timer);
145
+ }
146
+ cancelRecoveryTimer(machineId, agentType) {
147
+ const timerKey = `${machineId}:${agentType}`;
148
+ const existing = this.recoveryTimers.get(timerKey);
149
+ if (existing) {
150
+ clearTimeout(existing);
151
+ this.recoveryTimers.delete(timerKey);
152
+ }
153
+ }
154
+ };
155
+ exports.CapabilityService = CapabilityService;
156
+ exports.CapabilityService = CapabilityService = CapabilityService_1 = __decorate([
157
+ (0, common_1.Injectable)()
158
+ ], CapabilityService);
159
+ //# sourceMappingURL=capability.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.service.js","sourceRoot":"","sources":["../../src/dispatcher/capability.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2
+ import { WorkerConnectionManager } from './worker-connection.manager';
3
+ export declare class CleanupService implements OnModuleInit, OnModuleDestroy {
4
+ private readonly connectionManager;
5
+ private readonly logger;
6
+ private queue;
7
+ private worker;
8
+ constructor(connectionManager: WorkerConnectionManager);
9
+ onModuleInit(): void;
10
+ onModuleDestroy(): Promise<void>;
11
+ /**
12
+ * Schedule a workspace cleanup job, delayed by WORKSPACE_RETENTION_MS (24h).
13
+ * The job will send a cleanup_workspace frame to the worker when it fires.
14
+ */
15
+ scheduleCleanup(taskId: number, machineId: string, workspacePath: string, delay?: number): Promise<void>;
16
+ /**
17
+ * Process a cleanup job: send a cleanup_workspace frame to the worker via
18
+ * WorkerConnectionManager. If the worker is not connected, the job will fail
19
+ * and be retried with exponential backoff.
20
+ */
21
+ private processCleanup;
22
+ }
23
+ //# sourceMappingURL=cleanup.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.service.d.ts","sourceRoot":"","sources":["../../src/dispatcher/cleanup.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAInF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAiBtE,qBACa,cAAe,YAAW,YAAY,EAAE,eAAe;IAMhE,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IALpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,MAAM,CAA0B;gBAGrB,iBAAiB,EAAE,uBAAuB;IAG7D,YAAY,IAAI,IAAI;IAwCd,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC;;;OAGG;IACG,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAgBhB;;;;OAIG;YACW,cAAc;CAmC7B"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var CleanupService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CleanupService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const bullmq_1 = require("bullmq");
16
+ const protocol_1 = require("@overlordai/protocol");
17
+ const worker_connection_manager_1 = require("./worker-connection.manager");
18
+ /** Base delay for exponential backoff retries (10 minutes). */
19
+ const RETRY_BASE_DELAY_MS = 10 * 60 * 1000;
20
+ /** Maximum number of retry attempts. */
21
+ const MAX_RETRIES = 3;
22
+ /** Ack timeout when sending cleanup frame to worker (30 seconds). */
23
+ const CLEANUP_ACK_TIMEOUT_MS = 30_000;
24
+ let CleanupService = CleanupService_1 = class CleanupService {
25
+ connectionManager;
26
+ logger = new common_1.Logger(CleanupService_1.name);
27
+ queue;
28
+ worker;
29
+ constructor(connectionManager) {
30
+ this.connectionManager = connectionManager;
31
+ }
32
+ onModuleInit() {
33
+ const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379';
34
+ this.queue = new bullmq_1.Queue('workspace-cleanup', {
35
+ connection: { url: redisUrl, maxRetriesPerRequest: null },
36
+ defaultJobOptions: {
37
+ attempts: MAX_RETRIES,
38
+ backoff: {
39
+ type: 'exponential',
40
+ delay: RETRY_BASE_DELAY_MS,
41
+ },
42
+ removeOnComplete: true,
43
+ removeOnFail: 50,
44
+ },
45
+ });
46
+ this.worker = new bullmq_1.Worker('workspace-cleanup', async (job) => this.processCleanup(job), {
47
+ connection: { url: redisUrl, maxRetriesPerRequest: null },
48
+ concurrency: 1,
49
+ });
50
+ this.worker.on('failed', (job, err) => {
51
+ this.logger.error(`Cleanup job ${job?.id} failed (attempt ${job?.attemptsMade}/${MAX_RETRIES}): ${err.message}`);
52
+ });
53
+ this.worker.on('completed', (job) => {
54
+ this.logger.log(`Cleanup job ${job.id} completed for task ${job.data.taskId}`);
55
+ });
56
+ this.logger.log('Cleanup service initialized');
57
+ }
58
+ async onModuleDestroy() {
59
+ await this.worker.close();
60
+ await this.queue.close();
61
+ this.logger.log('Cleanup service shut down');
62
+ }
63
+ /**
64
+ * Schedule a workspace cleanup job, delayed by WORKSPACE_RETENTION_MS (24h).
65
+ * The job will send a cleanup_workspace frame to the worker when it fires.
66
+ */
67
+ async scheduleCleanup(taskId, machineId, workspacePath, delay) {
68
+ const effectiveDelay = delay ?? protocol_1.WORKSPACE_RETENTION_MS;
69
+ const jobId = `cleanup-${taskId}`;
70
+ await this.queue.add('cleanup', { taskId, machineId, workspacePath }, {
71
+ jobId,
72
+ delay: effectiveDelay,
73
+ });
74
+ this.logger.log(`Scheduled workspace cleanup for task ${taskId} on machine ${machineId} in ${effectiveDelay / 3600000}h`);
75
+ }
76
+ /**
77
+ * Process a cleanup job: send a cleanup_workspace frame to the worker via
78
+ * WorkerConnectionManager. If the worker is not connected, the job will fail
79
+ * and be retried with exponential backoff.
80
+ */
81
+ async processCleanup(job) {
82
+ const { taskId, machineId, workspacePath } = job.data;
83
+ this.logger.log(`Processing cleanup for task ${taskId} on machine ${machineId}`);
84
+ if (!this.connectionManager.isConnected(machineId)) {
85
+ throw new Error(`Machine ${machineId} is not connected; cannot send cleanup for task ${taskId}`);
86
+ }
87
+ const msgId = this.connectionManager.generateMsgId();
88
+ const frame = {
89
+ type: 'cleanup_workspace',
90
+ msgId,
91
+ taskId,
92
+ workspacePath,
93
+ };
94
+ try {
95
+ await this.connectionManager.sendWithAck(machineId, frame, CLEANUP_ACK_TIMEOUT_MS);
96
+ }
97
+ catch (err) {
98
+ throw new Error(`Cleanup for task ${taskId} on machine ${machineId} failed: ${err instanceof Error ? err.message : String(err)}`);
99
+ }
100
+ }
101
+ };
102
+ exports.CleanupService = CleanupService;
103
+ exports.CleanupService = CleanupService = CleanupService_1 = __decorate([
104
+ (0, common_1.Injectable)(),
105
+ __metadata("design:paramtypes", [worker_connection_manager_1.WorkerConnectionManager])
106
+ ], CleanupService);
107
+ //# sourceMappingURL=cleanup.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.service.js","sourceRoot":"","sources":["../../src/dispatcher/cleanup.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { RedisService } from '../redis/redis.service';
2
+ export declare class DedupService {
3
+ private readonly redis;
4
+ constructor(redis: RedisService);
5
+ /**
6
+ * Check whether an event has already been processed.
7
+ * Uses Redis SET NX with a TTL to achieve at-most-once semantics.
8
+ * Returns true if this is the first occurrence (i.e. the key was newly set).
9
+ */
10
+ checkEventDedup(eventId: string): Promise<boolean>;
11
+ /**
12
+ * Compute a deterministic fingerprint for a task based on project key and description.
13
+ * Returns the first 16 hex characters of the SHA-256 hash.
14
+ */
15
+ computeFingerprint(projectKey: string, description: string): string;
16
+ /**
17
+ * Store a pending confirmation payload in Redis with a TTL.
18
+ * Used for interactive stage confirmations.
19
+ */
20
+ storePendingConfirm(key: string, data: object): Promise<void>;
21
+ /**
22
+ * Retrieve a pending confirmation payload from Redis.
23
+ * Returns null if the key has expired or does not exist.
24
+ */
25
+ getPendingConfirm(key: string): Promise<object | null>;
26
+ /**
27
+ * Find a pending confirmation for a given task by scanning Redis keys
28
+ * matching the pattern confirm:stage:{taskId}:*.
29
+ * Returns the first match found, or null if none exist.
30
+ */
31
+ findPendingConfirmByTask(taskId: number): Promise<object | null>;
32
+ /**
33
+ * Delete a pending confirmation payload from Redis.
34
+ */
35
+ deletePendingConfirm(key: string): Promise<void>;
36
+ /**
37
+ * Handle a confirm command: retrieve pending confirm data, delete the key,
38
+ * and return the parsed action payload.
39
+ */
40
+ handleConfirm(taskId: number, userId: number, msgId?: string): Promise<{
41
+ action: string;
42
+ request?: object;
43
+ createdBy: number;
44
+ source?: object;
45
+ taskId?: number;
46
+ } | null>;
47
+ }
48
+ //# sourceMappingURL=dedup.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.service.d.ts","sourceRoot":"","sources":["../../src/dispatcher/dedup.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,qBACa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY;IAEhD;;;;OAIG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQxD;;;OAGG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAMnE;;;OAGG;IACG,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnE;;;OAGG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS5D;;;;OAIG;IACG,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwCtE;;OAEG;IACG,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD;;;OAGG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC;CA+EV"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DedupService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const node_crypto_1 = require("node:crypto");
15
+ const protocol_1 = require("@overlordai/protocol");
16
+ const redis_service_1 = require("../redis/redis.service");
17
+ let DedupService = class DedupService {
18
+ redis;
19
+ constructor(redis) {
20
+ this.redis = redis;
21
+ }
22
+ /**
23
+ * Check whether an event has already been processed.
24
+ * Uses Redis SET NX with a TTL to achieve at-most-once semantics.
25
+ * Returns true if this is the first occurrence (i.e. the key was newly set).
26
+ */
27
+ async checkEventDedup(eventId) {
28
+ const key = `eventId:${eventId}`;
29
+ const client = this.redis.getClient();
30
+ // SET key "1" EX ttl NX → returns "OK" if the key was set, null if it already existed
31
+ const result = await client.set(key, '1', 'EX', protocol_1.EVENT_DEDUP_TTL_SEC, 'NX');
32
+ return result === 'OK';
33
+ }
34
+ /**
35
+ * Compute a deterministic fingerprint for a task based on project key and description.
36
+ * Returns the first 16 hex characters of the SHA-256 hash.
37
+ */
38
+ computeFingerprint(projectKey, description) {
39
+ const hash = (0, node_crypto_1.createHash)('sha256');
40
+ hash.update(projectKey + '\0' + description);
41
+ return hash.digest('hex').slice(0, 16);
42
+ }
43
+ /**
44
+ * Store a pending confirmation payload in Redis with a TTL.
45
+ * Used for interactive stage confirmations.
46
+ */
47
+ async storePendingConfirm(key, data) {
48
+ const redisKey = `confirm:${key}`;
49
+ await this.redis.setex(redisKey, protocol_1.CONFIRM_PENDING_TTL_SEC, JSON.stringify(data));
50
+ }
51
+ /**
52
+ * Retrieve a pending confirmation payload from Redis.
53
+ * Returns null if the key has expired or does not exist.
54
+ */
55
+ async getPendingConfirm(key) {
56
+ const redisKey = `confirm:${key}`;
57
+ const value = await this.redis.get(redisKey);
58
+ if (value === null) {
59
+ return null;
60
+ }
61
+ return JSON.parse(value);
62
+ }
63
+ /**
64
+ * Find a pending confirmation for a given task by scanning Redis keys
65
+ * matching the pattern confirm:stage:{taskId}:*.
66
+ * Returns the first match found, or null if none exist.
67
+ */
68
+ async findPendingConfirmByTask(taskId) {
69
+ const client = this.redis.getClient();
70
+ const pattern = `confirm:stage:${taskId}:*`;
71
+ const stream = client.scanStream({ match: pattern, count: 100 });
72
+ return new Promise((resolve, reject) => {
73
+ let resolved = false;
74
+ stream.on('data', async (keys) => {
75
+ if (resolved)
76
+ return;
77
+ stream.pause();
78
+ for (const key of keys) {
79
+ if (resolved)
80
+ break;
81
+ const raw = await client.get(key);
82
+ if (!raw)
83
+ continue;
84
+ try {
85
+ const data = JSON.parse(raw);
86
+ resolved = true;
87
+ stream.destroy();
88
+ resolve(data);
89
+ return;
90
+ }
91
+ catch {
92
+ continue;
93
+ }
94
+ }
95
+ stream.resume();
96
+ });
97
+ stream.on('end', () => {
98
+ if (!resolved)
99
+ resolve(null);
100
+ });
101
+ stream.on('error', (err) => {
102
+ if (!resolved)
103
+ reject(err);
104
+ });
105
+ });
106
+ }
107
+ /**
108
+ * Delete a pending confirmation payload from Redis.
109
+ */
110
+ async deletePendingConfirm(key) {
111
+ const redisKey = `confirm:${key}`;
112
+ await this.redis.del(redisKey);
113
+ }
114
+ /**
115
+ * Handle a confirm command: retrieve pending confirm data, delete the key,
116
+ * and return the parsed action payload.
117
+ */
118
+ async handleConfirm(taskId, userId, msgId) {
119
+ // Search for a pending confirm that matches this taskId
120
+ // We check both dedup and retry confirm keys
121
+ for (const prefix of ['pending_confirm:dedup:', 'pending_confirm:retry:']) {
122
+ // In practice the confirmKey is stored in the ConflictException response
123
+ // and the adapter passes it back. For simplicity, we scan known patterns.
124
+ // The actual flow is: adapter sends confirmKey from the original error response.
125
+ }
126
+ // Try to find by scanning — in the real flow, the confirmKey is passed directly
127
+ // This is a simplified implementation; the adapter layer should pass the confirmKey
128
+ // Uses SCAN instead of KEYS to avoid blocking the Redis event loop in production.
129
+ const client = this.redis.getClient();
130
+ const stream = client.scanStream({
131
+ match: 'pending_confirm:*',
132
+ count: 100,
133
+ });
134
+ const result = await new Promise((resolve, reject) => {
135
+ let resolved = false;
136
+ stream.on('data', async (keys) => {
137
+ if (resolved)
138
+ return;
139
+ // Pause the stream while we process this batch to avoid concurrent writes
140
+ stream.pause();
141
+ for (const key of keys) {
142
+ if (resolved)
143
+ break;
144
+ const raw = await this.redis.get(key);
145
+ if (!raw)
146
+ continue;
147
+ try {
148
+ const data = JSON.parse(raw);
149
+ if ((data['taskId'] === taskId || data['existingTaskId'] === taskId) &&
150
+ data['action']) {
151
+ await this.redis.del(key);
152
+ resolved = true;
153
+ stream.destroy();
154
+ resolve({
155
+ action: data['action'],
156
+ request: data['request'],
157
+ createdBy: data['createdBy'] ?? userId,
158
+ source: data['source'],
159
+ taskId: data['taskId'],
160
+ });
161
+ return;
162
+ }
163
+ }
164
+ catch {
165
+ continue;
166
+ }
167
+ }
168
+ stream.resume();
169
+ });
170
+ stream.on('end', () => {
171
+ if (!resolved) {
172
+ resolve(null);
173
+ }
174
+ });
175
+ stream.on('error', (err) => {
176
+ if (!resolved) {
177
+ reject(err);
178
+ }
179
+ });
180
+ });
181
+ return result;
182
+ }
183
+ };
184
+ exports.DedupService = DedupService;
185
+ exports.DedupService = DedupService = __decorate([
186
+ (0, common_1.Injectable)(),
187
+ __metadata("design:paramtypes", [redis_service_1.RedisService])
188
+ ], DedupService);
189
+ //# sourceMappingURL=dedup.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.service.js","sourceRoot":"","sources":["../../src/dispatcher/dedup.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare class DispatcherModule {
2
+ }
3
+ //# sourceMappingURL=dispatcher.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.module.d.ts","sourceRoot":"","sources":["../../src/dispatcher/dispatcher.module.ts"],"names":[],"mappings":"AAyBA,qBAqCa,gBAAgB;CAAG"}