@overlordai/server 1.0.113 → 1.0.115

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 (288) hide show
  1. package/database/migrations/003-chat-bindings-project-key-index.sql +1 -0
  2. package/database/migrations/004-drop-agent-command.sql +2 -0
  3. package/database/migrations/005-task-name.sql +1 -0
  4. package/dist/adapters/adapter.interface.d.ts +4 -0
  5. package/dist/adapters/adapter.interface.d.ts.map +1 -1
  6. package/dist/adapters/adapter.interface.js.map +1 -1
  7. package/dist/adapters/command-parser.utils.d.ts +45 -0
  8. package/dist/adapters/command-parser.utils.d.ts.map +1 -0
  9. package/dist/adapters/command-parser.utils.js +144 -0
  10. package/dist/adapters/command-parser.utils.js.map +1 -0
  11. package/dist/adapters/help-text.d.ts +2 -0
  12. package/dist/adapters/help-text.d.ts.map +1 -0
  13. package/dist/adapters/help-text.js +24 -0
  14. package/dist/adapters/help-text.js.map +1 -0
  15. package/dist/adapters/lark/lark-card.builder.d.ts.map +1 -1
  16. package/dist/adapters/lark/lark-card.builder.js +10 -17
  17. package/dist/adapters/lark/lark-card.builder.js.map +1 -1
  18. package/dist/adapters/lark/lark-message.parser.d.ts +2 -35
  19. package/dist/adapters/lark/lark-message.parser.d.ts.map +1 -1
  20. package/dist/adapters/lark/lark-message.parser.js +12 -162
  21. package/dist/adapters/lark/lark-message.parser.js.map +1 -1
  22. package/dist/adapters/lark/lark.adapter.d.ts +18 -0
  23. package/dist/adapters/lark/lark.adapter.d.ts.map +1 -1
  24. package/dist/adapters/lark/lark.adapter.js +152 -23
  25. package/dist/adapters/lark/lark.adapter.js.map +1 -1
  26. package/dist/adapters/lark/lark.controller.d.ts.map +1 -1
  27. package/dist/adapters/lark/lark.controller.js +2 -1
  28. package/dist/adapters/lark/lark.controller.js.map +1 -1
  29. package/dist/adapters/slack/slack-block.builder.d.ts.map +1 -1
  30. package/dist/adapters/slack/slack-block.builder.js +7 -14
  31. package/dist/adapters/slack/slack-block.builder.js.map +1 -1
  32. package/dist/adapters/slack/slack-message.parser.d.ts +2 -11
  33. package/dist/adapters/slack/slack-message.parser.d.ts.map +1 -1
  34. package/dist/adapters/slack/slack-message.parser.js +12 -135
  35. package/dist/adapters/slack/slack-message.parser.js.map +1 -1
  36. package/dist/adapters/slack/slack.adapter.d.ts +5 -0
  37. package/dist/adapters/slack/slack.adapter.d.ts.map +1 -1
  38. package/dist/adapters/slack/slack.adapter.js +101 -25
  39. package/dist/adapters/slack/slack.adapter.js.map +1 -1
  40. package/dist/adapters/slack/slack.controller.d.ts.map +1 -1
  41. package/dist/adapters/slack/slack.controller.js +3 -4
  42. package/dist/adapters/slack/slack.controller.js.map +1 -1
  43. package/dist/common/config.d.ts +15 -0
  44. package/dist/common/config.d.ts.map +1 -1
  45. package/dist/common/config.js +27 -0
  46. package/dist/common/config.js.map +1 -1
  47. package/dist/common/project-validation.d.ts +1 -1
  48. package/dist/common/project-validation.d.ts.map +1 -1
  49. package/dist/common/project-validation.js +1 -9
  50. package/dist/common/project-validation.js.map +1 -1
  51. package/dist/common/status-display.d.ts +10 -0
  52. package/dist/common/status-display.d.ts.map +1 -0
  53. package/dist/common/status-display.js +35 -0
  54. package/dist/common/status-display.js.map +1 -0
  55. package/dist/common/string-utils.d.ts +3 -0
  56. package/dist/common/string-utils.d.ts.map +1 -1
  57. package/dist/common/string-utils.js +5 -0
  58. package/dist/common/string-utils.js.map +1 -1
  59. package/dist/database/repositories/bot.repository.d.ts +4 -0
  60. package/dist/database/repositories/bot.repository.d.ts.map +1 -1
  61. package/dist/database/repositories/bot.repository.js +15 -0
  62. package/dist/database/repositories/bot.repository.js.map +1 -1
  63. package/dist/database/repositories/project.repository.d.ts.map +1 -1
  64. package/dist/database/repositories/project.repository.js +0 -2
  65. package/dist/database/repositories/project.repository.js.map +1 -1
  66. package/dist/database/repositories/task.repository.d.ts +2 -1
  67. package/dist/database/repositories/task.repository.d.ts.map +1 -1
  68. package/dist/database/repositories/task.repository.js +19 -1
  69. package/dist/database/repositories/task.repository.js.map +1 -1
  70. package/dist/dispatcher/cleanup.service.d.ts +5 -0
  71. package/dist/dispatcher/cleanup.service.d.ts.map +1 -1
  72. package/dist/dispatcher/cleanup.service.js +19 -0
  73. package/dist/dispatcher/cleanup.service.js.map +1 -1
  74. package/dist/dispatcher/dispatcher.module.d.ts.map +1 -1
  75. package/dist/dispatcher/dispatcher.module.js +4 -0
  76. package/dist/dispatcher/dispatcher.module.js.map +1 -1
  77. package/dist/dispatcher/dispatcher.service.d.ts +0 -1
  78. package/dist/dispatcher/dispatcher.service.d.ts.map +1 -1
  79. package/dist/dispatcher/dispatcher.service.js +46 -45
  80. package/dist/dispatcher/dispatcher.service.js.map +1 -1
  81. package/dist/dispatcher/dispatcher.types.d.ts +1 -0
  82. package/dist/dispatcher/dispatcher.types.d.ts.map +1 -1
  83. package/dist/dispatcher/scheduler.service.d.ts.map +1 -1
  84. package/dist/dispatcher/scheduler.service.js +14 -3
  85. package/dist/dispatcher/scheduler.service.js.map +1 -1
  86. package/dist/dispatcher/stage-confirm-timeout.service.d.ts +15 -0
  87. package/dist/dispatcher/stage-confirm-timeout.service.d.ts.map +1 -0
  88. package/dist/dispatcher/stage-confirm-timeout.service.js +81 -0
  89. package/dist/dispatcher/stage-confirm-timeout.service.js.map +1 -0
  90. package/dist/dispatcher/task-creation.service.d.ts +3 -1
  91. package/dist/dispatcher/task-creation.service.d.ts.map +1 -1
  92. package/dist/dispatcher/task-creation.service.js +30 -4
  93. package/dist/dispatcher/task-creation.service.js.map +1 -1
  94. package/dist/dispatcher/task-lifecycle.service.d.ts +4 -2
  95. package/dist/dispatcher/task-lifecycle.service.d.ts.map +1 -1
  96. package/dist/dispatcher/task-lifecycle.service.js +78 -8
  97. package/dist/dispatcher/task-lifecycle.service.js.map +1 -1
  98. package/dist/dispatcher/task-name.service.d.ts +14 -0
  99. package/dist/dispatcher/task-name.service.d.ts.map +1 -0
  100. package/dist/dispatcher/task-name.service.js +80 -0
  101. package/dist/dispatcher/task-name.service.js.map +1 -0
  102. package/dist/events/event-types.d.ts +1 -0
  103. package/dist/events/event-types.d.ts.map +1 -1
  104. package/dist/notifier/notification-consumer.d.ts +33 -1
  105. package/dist/notifier/notification-consumer.d.ts.map +1 -1
  106. package/dist/notifier/notification-consumer.js +235 -11
  107. package/dist/notifier/notification-consumer.js.map +1 -1
  108. package/dist/notifier/notifier.service.d.ts +5 -1
  109. package/dist/notifier/notifier.service.d.ts.map +1 -1
  110. package/dist/notifier/notifier.service.js +6 -3
  111. package/dist/notifier/notifier.service.js.map +1 -1
  112. package/dist/notifier/template.service.d.ts +15 -0
  113. package/dist/notifier/template.service.d.ts.map +1 -1
  114. package/dist/notifier/template.service.js +92 -31
  115. package/dist/notifier/template.service.js.map +1 -1
  116. package/dist/web/admin/admin-developer.controller.d.ts +2 -2
  117. package/dist/web/admin/admin-settings.controller.d.ts.map +1 -1
  118. package/dist/web/admin/admin-settings.controller.js +0 -1
  119. package/dist/web/admin/admin-settings.controller.js.map +1 -1
  120. package/dist/web/dashboard.controller.d.ts +1 -1
  121. package/dist/web/dashboard.controller.d.ts.map +1 -1
  122. package/dist/web/dashboard.controller.js +12 -4
  123. package/dist/web/dashboard.controller.js.map +1 -1
  124. package/dist/web/dashboard.service.d.ts +18 -0
  125. package/dist/web/dashboard.service.d.ts.map +1 -1
  126. package/dist/web/dashboard.service.js +81 -11
  127. package/dist/web/dashboard.service.js.map +1 -1
  128. package/dist/web/frame-handlers/index.d.ts +2 -0
  129. package/dist/web/frame-handlers/index.d.ts.map +1 -1
  130. package/dist/web/frame-handlers/index.js +5 -1
  131. package/dist/web/frame-handlers/index.js.map +1 -1
  132. package/dist/web/frame-handlers/progress.handler.d.ts +3 -1
  133. package/dist/web/frame-handlers/progress.handler.d.ts.map +1 -1
  134. package/dist/web/frame-handlers/progress.handler.js +22 -3
  135. package/dist/web/frame-handlers/progress.handler.js.map +1 -1
  136. package/dist/web/frame-handlers/stage-choice.handler.d.ts +15 -0
  137. package/dist/web/frame-handlers/stage-choice.handler.d.ts.map +1 -0
  138. package/dist/web/frame-handlers/stage-choice.handler.js +39 -0
  139. package/dist/web/frame-handlers/stage-choice.handler.js.map +1 -0
  140. package/dist/web/frame-handlers/stage-confirm.handler.d.ts.map +1 -1
  141. package/dist/web/frame-handlers/stage-confirm.handler.js +1 -0
  142. package/dist/web/frame-handlers/stage-confirm.handler.js.map +1 -1
  143. package/dist/web/frame-handlers/stage-input.handler.d.ts +15 -0
  144. package/dist/web/frame-handlers/stage-input.handler.d.ts.map +1 -0
  145. package/dist/web/frame-handlers/stage-input.handler.js +39 -0
  146. package/dist/web/frame-handlers/stage-input.handler.js.map +1 -0
  147. package/dist/web/project.controller.d.ts +2 -4
  148. package/dist/web/project.controller.d.ts.map +1 -1
  149. package/dist/web/search.service.d.ts +1 -0
  150. package/dist/web/search.service.d.ts.map +1 -1
  151. package/dist/web/search.service.js +6 -6
  152. package/dist/web/search.service.js.map +1 -1
  153. package/dist/web/task.controller.d.ts +16 -1
  154. package/dist/web/task.controller.d.ts.map +1 -1
  155. package/dist/web/task.controller.js +57 -5
  156. package/dist/web/task.controller.js.map +1 -1
  157. package/dist/web/web-event.service.d.ts.map +1 -1
  158. package/dist/web/web-event.service.js +1 -0
  159. package/dist/web/web-event.service.js.map +1 -1
  160. package/dist/web/worker-channel.gateway.d.ts.map +1 -1
  161. package/dist/web/worker-channel.gateway.js +3 -1
  162. package/dist/web/worker-channel.gateway.js.map +1 -1
  163. package/package.json +4 -4
  164. package/public/assets/{AccessTokensPage-D_A93EkP.js → AccessTokensPage-Yp8IfrfF.js} +1 -1
  165. package/public/assets/{AdminPage-DnmoRibU.js → AdminPage-CS2HrhOC.js} +1 -1
  166. package/public/assets/ApiReferencePage-DTinm3RG.js +1 -0
  167. package/public/assets/{ArchitecturePage-Co5G-15M.js → ArchitecturePage-BpA3PUuf.js} +1 -1
  168. package/public/assets/{AuditLogPage-DoaVh4un.js → AuditLogPage-B_Qopq3a.js} +2 -2
  169. package/public/assets/{BindPlatformPage-C2bIjAbT.js → BindPlatformPage-BkV-IfaR.js} +1 -1
  170. package/public/assets/BotIntegrationPage-DLuRDIam.js +1 -0
  171. package/public/assets/BotManage-XKHjrA-7.js +6 -0
  172. package/public/assets/BotSetupPage-Cn40afR9.js +33 -0
  173. package/public/assets/{ChangelogPage-CazGvq6Y.js → ChangelogPage-ChiapPDH.js} +1 -1
  174. package/public/assets/{CliReferencePage-tonM0XBs.js → CliReferencePage-3eHb6kRq.js} +1 -1
  175. package/public/assets/{DeploymentPage-DwifcnIe.js → DeploymentPage-CvT9Pcow.js} +1 -1
  176. package/public/assets/{DevWorkflowPage-DJddffhm.js → DevWorkflowPage-BLEIbUu1.js} +1 -1
  177. package/public/assets/{DeveloperManage-DwaEFuLo.js → DeveloperManage-DAJBvmdv.js} +2 -2
  178. package/public/assets/{DeveloperSetupPage-DA4BHPuG.js → DeveloperSetupPage-BhE83ouS.js} +1 -1
  179. package/public/assets/{DocsIndexPage-C-FZbN8Z.js → DocsIndexPage-BE_tyO2Q.js} +1 -1
  180. package/public/assets/{DocsLayout-HdiVoWKl.js → DocsLayout-D1S4KUeB.js} +1 -1
  181. package/public/assets/{DocsPrimitives-DU41lKXb.js → DocsPrimitives-BQXfZXxZ.js} +1 -1
  182. package/public/assets/EditProjectPage-BjgRi6kG.js +2 -0
  183. package/public/assets/{EmptyState-i9jXL5NQ.js → EmptyState-Dlt6FhVC.js} +1 -1
  184. package/public/assets/EnvVariablesPage-CvcP4GZM.js +24 -0
  185. package/public/assets/HomePage-uEE3mJNM.js +1 -0
  186. package/public/assets/{InfoRow-kU23cpPE.js → InfoRow-Db2nisGq.js} +1 -1
  187. package/public/assets/{InstallationPage-JxXYftV0.js → InstallationPage-kt-du5Rr.js} +2 -2
  188. package/public/assets/{LandingPage-7--4I0lt.js → LandingPage-2irRMduO.js} +1 -1
  189. package/public/assets/{LocalDevelopmentPage-B0C1C5Rs.js → LocalDevelopmentPage-7JvSDwD1.js} +1 -1
  190. package/public/assets/{LoginPage-2Io9O_Q7.js → LoginPage-DDk_X1sv.js} +1 -1
  191. package/public/assets/{MetricBar-BSwVCFMX.js → MetricBar-BhjbfPOa.js} +1 -1
  192. package/public/assets/{NotFoundPage-DbO52kqL.js → NotFoundPage-ByRykDvA.js} +1 -1
  193. package/public/assets/{OnboardingGuide-BeP-StZq.js → OnboardingGuide-CinJRqx5.js} +1 -1
  194. package/public/assets/{PermissionsPage-BMM-SA8k.js → PermissionsPage-C5RXlztC.js} +1 -1
  195. package/public/assets/PipelineConfigPage-BSkSRngC.js +22 -0
  196. package/public/assets/{PipelineEditorPage-CpW1dBVH.js → PipelineEditorPage-BoZ_MVNO.js} +2 -2
  197. package/public/assets/{ProfilePage-BaDJoNI7.js → ProfilePage-CePUfQDH.js} +1 -1
  198. package/public/assets/ProjectDetailPage-_DswTp8-.js +7 -0
  199. package/public/assets/ProjectListPage-fVbDom8_.js +6 -0
  200. package/public/assets/{PtyTerminal-CEkY7dvk.js → PtyTerminal-Dpk4L7LN.js} +1 -1
  201. package/public/assets/{QuickAuth-9InsfbSA.js → QuickAuth-BAmZCI4O.js} +1 -1
  202. package/public/assets/{RemoveMemberConfirmDialog-Do5LW-9Q.js → RemoveMemberConfirmDialog-DYi6BAz2.js} +2 -2
  203. package/public/assets/{Select-8IQBiBBw.js → Select-DnIOEVCT.js} +1 -1
  204. package/public/assets/SettingsPage-CwV-t8vo.js +6 -0
  205. package/public/assets/{Skeleton-B3ZvE5gP.js → Skeleton--qglldqs.js} +1 -1
  206. package/public/assets/{SkillPage-BhiRgb-S.js → SkillPage-CsXXruJZ.js} +1 -1
  207. package/public/assets/TaskDetailPage-gOUWMfkb.js +21 -0
  208. package/public/assets/TaskListPage-vF17zpt2.js +1 -0
  209. package/public/assets/{TaskStatusBadge-B6mxAWy2.js → TaskStatusBadge-CCh-nmLz.js} +1 -1
  210. package/public/assets/TerminalHomePage-DXFg88Q9.js +11 -0
  211. package/public/assets/{TokenManage-CenYPcRv.js → TokenManage-P98_TYIe.js} +1 -1
  212. package/public/assets/Tooltip-DGoJgM_K.js +1 -0
  213. package/public/assets/{TotpSetupPage-DQyx573Y.js → TotpSetupPage-D5GUedMd.js} +1 -1
  214. package/public/assets/WorkerDetailPage-CkI1feoH.js +1 -0
  215. package/public/assets/{WorkerListPage-_bt8SJDK.js → WorkerListPage-C90v6nLx.js} +2 -2
  216. package/public/assets/{WorkerOperationsPage-CDat2rGV.js → WorkerOperationsPage-OxH0Ky0Y.js} +1 -1
  217. package/public/assets/{WorkerSetupGuidePage-CN7fSwA-.js → WorkerSetupGuidePage-DGlgYS82.js} +1 -1
  218. package/public/assets/{WorkerSetupPage--spDks6s.js → WorkerSetupPage-DJ359PwT.js} +1 -1
  219. package/public/assets/{arrow-left-CQ-bmyEx.js → arrow-left-BPgCxdEG.js} +1 -1
  220. package/public/assets/{arrow-right-BOWA0FvU.js → arrow-right-Z-hFp5rr.js} +1 -1
  221. package/public/assets/{bot-BpTfNKBP.js → bot-B7Bl9J0r.js} +1 -1
  222. package/public/assets/{chevron-right-D-xhzuZQ.js → chevron-right-D_hyYdgn.js} +1 -1
  223. package/public/assets/{copy-DXSXnWX4.js → copy-SJf3OFPQ.js} +1 -1
  224. package/public/assets/{download-FbsyL-QU.js → download-D7rCJJks.js} +1 -1
  225. package/public/assets/{external-link-CPRFmfE1.js → external-link-BrXLoqUZ.js} +1 -1
  226. package/public/assets/index-BiItJ2NI.css +1 -0
  227. package/public/assets/{index-D205WYza.js → index-DPCzKHL-.js} +23 -23
  228. package/public/assets/{key-Diuh2Udi.js → key-CCF8A0TZ.js} +1 -1
  229. package/public/assets/{loader-circle-CsopNBbX.js → loader-circle-BO0HYeDT.js} +1 -1
  230. package/public/assets/{pencil-n52F1Vop.js → pencil-BhxWbYup.js} +1 -1
  231. package/public/assets/{plus-BHkYD1iG.js → plus-BnJSQWb4.js} +1 -1
  232. package/public/assets/{rotate-ccw-Bl22woOU.js → rotate-ccw-CioNXT1z.js} +1 -1
  233. package/public/assets/{scroll-text-DbVWAYzk.js → scroll-text-DpFjChL8.js} +1 -1
  234. package/public/assets/{settings-0li6vYCf.js → settings-Bklbsj12.js} +1 -1
  235. package/public/assets/{status-colors-C6o-wKJJ.js → status-colors-BkxgT8vX.js} +1 -1
  236. package/public/assets/{task-constants-a8NftfbJ.js → task-constants-Ctac6aky.js} +1 -1
  237. package/public/assets/task-display-J_FNKBLK.js +1 -0
  238. package/public/assets/{trash-2-LoxvLZVm.js → trash-2-_3SD7t1j.js} +1 -1
  239. package/public/assets/{useFetch-DIPC8gCD.js → useFetch-D8w38eG7.js} +1 -1
  240. package/public/assets/{users-BgBBs7IT.js → users-BBjD2TJy.js} +1 -1
  241. package/public/assets/{wifi-CF0XZj9i.js → wifi-KyET3jRD.js} +1 -1
  242. package/public/assets/{workflow-DBOppGKP.js → workflow-EN1ACj2x.js} +1 -1
  243. package/public/index.html +2 -2
  244. package/public/sw.js +1 -1
  245. package/dist/common/command-parser.d.ts +0 -29
  246. package/dist/common/command-parser.d.ts.map +0 -1
  247. package/dist/common/command-parser.js +0 -133
  248. package/dist/common/command-parser.js.map +0 -1
  249. package/dist/common/machine-utils.d.ts +0 -32
  250. package/dist/common/machine-utils.d.ts.map +0 -1
  251. package/dist/common/machine-utils.js +0 -12
  252. package/dist/common/machine-utils.js.map +0 -1
  253. package/dist/common/worker-utils.d.ts +0 -31
  254. package/dist/common/worker-utils.d.ts.map +0 -1
  255. package/dist/common/worker-utils.js +0 -12
  256. package/dist/common/worker-utils.js.map +0 -1
  257. package/dist/database/repositories/machine.repository.d.ts +0 -46
  258. package/dist/database/repositories/machine.repository.d.ts.map +0 -1
  259. package/dist/database/repositories/machine.repository.js +0 -200
  260. package/dist/database/repositories/machine.repository.js.map +0 -1
  261. package/dist/dispatcher/machine-selector.d.ts +0 -18
  262. package/dist/dispatcher/machine-selector.d.ts.map +0 -1
  263. package/dist/dispatcher/machine-selector.js +0 -148
  264. package/dist/dispatcher/machine-selector.js.map +0 -1
  265. package/dist/web/admin/admin-machine.controller.d.ts +0 -72
  266. package/dist/web/admin/admin-machine.controller.d.ts.map +0 -1
  267. package/dist/web/admin/admin-machine.controller.js +0 -176
  268. package/dist/web/admin/admin-machine.controller.js.map +0 -1
  269. package/dist/web/machine.controller.d.ts +0 -115
  270. package/dist/web/machine.controller.d.ts.map +0 -1
  271. package/dist/web/machine.controller.js +0 -125
  272. package/dist/web/machine.controller.js.map +0 -1
  273. package/public/assets/ApiReferencePage-8Fvke3MS.js +0 -1
  274. package/public/assets/BotIntegrationPage-BgK7NXyQ.js +0 -1
  275. package/public/assets/BotManage-BlWUAERC.js +0 -6
  276. package/public/assets/BotSetupPage-BhNhgobr.js +0 -33
  277. package/public/assets/EditProjectPage-0HfKfeFS.js +0 -2
  278. package/public/assets/EnvVariablesPage-DofRDtyz.js +0 -1
  279. package/public/assets/HomePage-Ct5rkEIu.js +0 -1
  280. package/public/assets/PipelineConfigPage-6KxS3scE.js +0 -28
  281. package/public/assets/ProjectDetailPage-QjUSwxfS.js +0 -7
  282. package/public/assets/ProjectListPage-Bs0GPEJb.js +0 -6
  283. package/public/assets/SettingsPage-DRWkl-_N.js +0 -6
  284. package/public/assets/TaskDetailPage-vwqcnwqe.js +0 -21
  285. package/public/assets/TaskListPage-DRiTh03Z.js +0 -1
  286. package/public/assets/TerminalHomePage-sK-nSIOn.js +0 -11
  287. package/public/assets/WorkerDetailPage-BV7YTrMb.js +0 -1
  288. package/public/assets/index-DrlMKbMb.css +0 -1
@@ -1,200 +0,0 @@
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.MachineRepository = void 0;
13
- const common_1 = require("@nestjs/common");
14
- const protocol_1 = require("@overlordai/protocol");
15
- const database_service_1 = require("../database.service");
16
- function mapRow(row) {
17
- return {
18
- id: row.id,
19
- name: row.name,
20
- host: row.host,
21
- port: row.port,
22
- tokenId: row.token_id,
23
- os: row.os ?? null,
24
- cpuModel: row.cpu_model ?? null,
25
- cpuCores: row.cpu_cores ?? null,
26
- memoryGb: row.memory_gb ?? null,
27
- maxSlots: row.max_slots,
28
- activeSlots: row.active_slots,
29
- cpuUsage: row.cpu_usage,
30
- memoryUsage: row.memory_usage,
31
- diskUsage: row.disk_usage,
32
- loadThreshold: row.load_threshold,
33
- tags: JSON.parse(row.tags || '[]'),
34
- capabilities: JSON.parse(row.capabilities || '[]'),
35
- recoverySecretHash: row.recovery_secret_hash ?? null,
36
- protocolVersion: row.protocol_version,
37
- workerVersion: row.worker_version ?? null,
38
- lastHeartbeat: row.last_heartbeat ?? null,
39
- status: row.status,
40
- sshUrl: row.ssh_url ?? null,
41
- decommissionedAt: row.decommissioned_at ?? null,
42
- decommissionedBy: row.decommissioned_by ?? null,
43
- };
44
- }
45
- let MachineRepository = class MachineRepository {
46
- db;
47
- constructor(db) {
48
- this.db = db;
49
- }
50
- findById(id) {
51
- const row = this.db
52
- .getDb()
53
- .prepare('SELECT * FROM machines WHERE id = ?')
54
- .get(id);
55
- return row ? mapRow(row) : null;
56
- }
57
- findByTokenId(tokenId) {
58
- const row = this.db
59
- .getDb()
60
- .prepare('SELECT * FROM machines WHERE token_id = ?')
61
- .get(tokenId);
62
- return row ? mapRow(row) : null;
63
- }
64
- findByName(name) {
65
- const row = this.db
66
- .getDb()
67
- .prepare('SELECT * FROM machines WHERE name = ?')
68
- .get(name);
69
- return row ? mapRow(row) : null;
70
- }
71
- updateName(id, name) {
72
- this.db
73
- .getDb()
74
- .prepare('UPDATE machines SET name = ? WHERE id = ?')
75
- .run(name, id);
76
- }
77
- findAll(includeDecommissioned = false) {
78
- const sql = includeDecommissioned
79
- ? 'SELECT * FROM machines ORDER BY name'
80
- : 'SELECT * FROM machines WHERE status != ? ORDER BY name';
81
- const rows = includeDecommissioned
82
- ? this.db.getDb().prepare(sql).all()
83
- : this.db.getDb().prepare(sql).all(protocol_1.MachineStatus.DECOMMISSIONED);
84
- return rows.map(mapRow);
85
- }
86
- findOnline() {
87
- const rows = this.db
88
- .getDb()
89
- .prepare('SELECT * FROM machines WHERE status = ? ORDER BY name')
90
- .all(protocol_1.MachineStatus.ONLINE);
91
- return rows.map(mapRow);
92
- }
93
- create(data) {
94
- const stmt = this.db.getDb().prepare(`
95
- INSERT INTO machines (
96
- id, name, host, port, token_id, os, cpu_model, cpu_cores, memory_gb,
97
- capabilities, tags, protocol_version
98
- ) VALUES (
99
- @id, @name, @host, @port, @tokenId, @os, @cpuModel, @cpuCores, @memoryGb,
100
- @capabilities, @tags, @protocolVersion
101
- )
102
- `);
103
- stmt.run({
104
- id: data.id,
105
- name: data.name,
106
- host: data.host,
107
- port: data.port,
108
- tokenId: data.tokenId,
109
- os: data.os ?? null,
110
- cpuModel: data.cpuModel ?? null,
111
- cpuCores: data.cpuCores ?? null,
112
- memoryGb: data.memoryGb ?? null,
113
- capabilities: JSON.stringify(data.capabilities ?? []),
114
- tags: JSON.stringify(data.tags ?? []),
115
- protocolVersion: data.protocolVersion,
116
- });
117
- return this.findById(data.id);
118
- }
119
- updateStatus(id, status) {
120
- const result = this.db
121
- .getDb()
122
- .prepare('UPDATE machines SET status = ? WHERE id = ?')
123
- .run(status, id);
124
- return result.changes > 0;
125
- }
126
- updateHeartbeatBatch(updates) {
127
- const stmt = this.db.getDb().prepare(`
128
- UPDATE machines
129
- SET cpu_usage = @cpuUsage,
130
- memory_usage = @memoryUsage,
131
- disk_usage = @diskUsage,
132
- active_slots = @activeSlots,
133
- max_slots = COALESCE(@maxSlots, max_slots),
134
- capabilities = @capabilities,
135
- worker_version = @workerVersion,
136
- cpu_model = @cpuModel,
137
- last_heartbeat = @lastHeartbeat
138
- WHERE id = @id
139
- `);
140
- const runBatch = this.db.getDb().transaction(() => {
141
- for (const update of updates) {
142
- stmt.run({
143
- id: update.id,
144
- cpuUsage: update.cpuUsage,
145
- memoryUsage: update.memoryUsage,
146
- diskUsage: update.diskUsage,
147
- activeSlots: update.activeSlots,
148
- maxSlots: update.maxSlots,
149
- capabilities: JSON.stringify(update.capabilities),
150
- workerVersion: update.workerVersion,
151
- cpuModel: update.cpuModel,
152
- lastHeartbeat: update.lastHeartbeat,
153
- });
154
- }
155
- });
156
- runBatch();
157
- }
158
- updateTokenId(id, tokenId) {
159
- const result = this.db
160
- .getDb()
161
- .prepare('UPDATE machines SET token_id = ? WHERE id = ?')
162
- .run(tokenId, id);
163
- return result.changes > 0;
164
- }
165
- updateRecoverySecretHash(id, hash) {
166
- const result = this.db
167
- .getDb()
168
- .prepare('UPDATE machines SET recovery_secret_hash = ? WHERE id = ?')
169
- .run(hash, id);
170
- return result.changes > 0;
171
- }
172
- updateActiveSlots(id, activeSlots) {
173
- const result = this.db
174
- .getDb()
175
- .prepare('UPDATE machines SET active_slots = ? WHERE id = ?')
176
- .run(activeSlots, id);
177
- return result.changes > 0;
178
- }
179
- countActiveSlots(id) {
180
- const placeholders = protocol_1.SLOT_STATUSES.map(() => '?').join(',');
181
- const row = this.db
182
- .getDb()
183
- .prepare(`SELECT COUNT(*) AS cnt FROM tasks WHERE machine_id = ? AND status IN (${placeholders})`)
184
- .get(id, ...protocol_1.SLOT_STATUSES);
185
- return row.cnt;
186
- }
187
- decommission(id, decommissionedBy) {
188
- const result = this.db
189
- .getDb()
190
- .prepare('UPDATE machines SET status = ?, decommissioned_at = ?, decommissioned_by = ? WHERE id = ?')
191
- .run(protocol_1.MachineStatus.DECOMMISSIONED, new Date().toISOString(), decommissionedBy, id);
192
- return result.changes > 0;
193
- }
194
- };
195
- exports.MachineRepository = MachineRepository;
196
- exports.MachineRepository = MachineRepository = __decorate([
197
- (0, common_1.Injectable)(),
198
- __metadata("design:paramtypes", [database_service_1.DatabaseService])
199
- ], MachineRepository);
200
- //# sourceMappingURL=machine.repository.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"machine.repository.js","sourceRoot":"","sources":["../../../src/database/repositories/machine.repository.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import type { Machine } from '@overlordai/protocol';
2
- import { MachineRepository } from '../database/repositories/machine.repository';
3
- import { TaskRepository } from '../database/repositories/task.repository';
4
- import { CapabilityService } from './capability.service';
5
- export declare class MachineSelector {
6
- private readonly machineRepo;
7
- private readonly taskRepo;
8
- private readonly capabilityService;
9
- private readonly logger;
10
- constructor(machineRepo: MachineRepository, taskRepo: TaskRepository, capabilityService: CapabilityService);
11
- /**
12
- * 9-step machine selection algorithm.
13
- *
14
- * Returns the best available machine for a task, or null if none qualifies.
15
- */
16
- select(agentType: string, tags?: string[], preferredMachineId?: string, projectKey?: string): Machine | null;
17
- }
18
- //# sourceMappingURL=machine-selector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"machine-selector.d.ts","sourceRoot":"","sources":["../../src/dispatcher/machine-selector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBACa,eAAe;IAIxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IALpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAGxC,WAAW,EAAE,iBAAiB,EAC9B,QAAQ,EAAE,cAAc,EACxB,iBAAiB,EAAE,iBAAiB;IAGvD;;;;OAIG;IACH,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,kBAAkB,CAAC,EAAE,MAAM,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,GAAG,IAAI;CA8JlB"}
@@ -1,148 +0,0 @@
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 MachineSelector_1;
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.MachineSelector = void 0;
14
- const common_1 = require("@nestjs/common");
15
- const protocol_1 = require("@overlordai/protocol");
16
- const machine_repository_1 = require("../database/repositories/machine.repository");
17
- const task_repository_1 = require("../database/repositories/task.repository");
18
- const capability_service_1 = require("./capability.service");
19
- let MachineSelector = MachineSelector_1 = class MachineSelector {
20
- machineRepo;
21
- taskRepo;
22
- capabilityService;
23
- logger = new common_1.Logger(MachineSelector_1.name);
24
- constructor(machineRepo, taskRepo, capabilityService) {
25
- this.machineRepo = machineRepo;
26
- this.taskRepo = taskRepo;
27
- this.capabilityService = capabilityService;
28
- }
29
- /**
30
- * 9-step machine selection algorithm.
31
- *
32
- * Returns the best available machine for a task, or null if none qualifies.
33
- */
34
- select(agentType, tags, preferredMachineId, projectKey) {
35
- // Step 1: If a specific machine is requested (--on), use it directly
36
- if (preferredMachineId) {
37
- const preferred = this.machineRepo.findById(preferredMachineId);
38
- if (!preferred) {
39
- this.logger.warn(`Preferred machine ${preferredMachineId} not found`);
40
- return null;
41
- }
42
- if (preferred.status === protocol_1.MachineStatus.DECOMMISSIONED) {
43
- this.logger.warn(`Preferred machine ${preferred.name} is decommissioned`);
44
- return null;
45
- }
46
- // Check that the preferred machine is ONLINE (not DRAINING or OFFLINE)
47
- if (preferred.status !== protocol_1.MachineStatus.ONLINE) {
48
- this.logger.warn(`Preferred machine ${preferred.name} (${preferred.id}) is not online: status=${preferred.status}`);
49
- return null;
50
- }
51
- // Check that the preferred machine has available slots
52
- const activeSlots = this.taskRepo.countActiveByMachine(preferred.id);
53
- if (activeSlots >= preferred.maxSlots) {
54
- this.logger.warn(`Preferred machine ${preferred.name} (${preferred.id}) has no available slots: ` +
55
- `${activeSlots}/${preferred.maxSlots}`);
56
- return null;
57
- }
58
- // Warn if the machine is under high load but still return it
59
- if (preferred.cpuUsage > preferred.loadThreshold ||
60
- preferred.memoryUsage > preferred.loadThreshold) {
61
- this.logger.warn(`Preferred machine ${preferred.name} (${preferred.id}) is under high load: ` +
62
- `cpu=${preferred.cpuUsage}, mem=${preferred.memoryUsage}, threshold=${preferred.loadThreshold}`);
63
- }
64
- return preferred;
65
- }
66
- // Start with all machines
67
- let candidates = this.machineRepo.findAll();
68
- // Step 2: Exclude offline and draining machines
69
- candidates = candidates.filter((m) => m.status === protocol_1.MachineStatus.ONLINE);
70
- if (candidates.length === 0) {
71
- this.logger.debug('No online machines available');
72
- return null;
73
- }
74
- // Step 3: Filter by capabilities match (agentType must be in capabilities)
75
- // Also exclude machines with degraded capability for this agent type
76
- candidates = candidates.filter((m) => m.capabilities.includes(agentType) &&
77
- this.capabilityService.isCapable(m.id, agentType));
78
- if (candidates.length === 0) {
79
- this.logger.debug(`No machines with capability "${agentType}" available (or all degraded)`);
80
- return null;
81
- }
82
- // Step 4: Filter by tags match (all requested tags must be present on the machine)
83
- if (tags && tags.length > 0) {
84
- candidates = candidates.filter((m) => tags.every((tag) => m.tags.includes(tag)));
85
- if (candidates.length === 0) {
86
- this.logger.debug(`No machines matching tags [${tags.join(', ')}] available`);
87
- return null;
88
- }
89
- }
90
- // Step 5: Exclude machines with high load (cpu or memory > loadThreshold)
91
- candidates = candidates.filter((m) => m.cpuUsage <= m.loadThreshold &&
92
- m.memoryUsage <= m.loadThreshold);
93
- if (candidates.length === 0) {
94
- this.logger.debug('All candidate machines are under high load');
95
- return null;
96
- }
97
- // Step 6: Exclude machines with full slots (activeSlots >= maxSlots)
98
- // Use live count from the tasks table for accuracy
99
- candidates = candidates.filter((m) => {
100
- const activeSlots = this.taskRepo.countActiveByMachine(m.id);
101
- return activeSlots < m.maxSlots;
102
- });
103
- if (candidates.length === 0) {
104
- this.logger.debug('All candidate machines have full task slots');
105
- return null;
106
- }
107
- // Step 7: Prefer a machine that already has a workspace for this project
108
- // (check if the machine has existing workspaces for the project via task history)
109
- if (projectKey) {
110
- const withExisting = candidates.filter((m) => {
111
- const machineTasks = this.taskRepo.findByMachineId(m.id);
112
- return machineTasks.some((t) => t.projectKey === projectKey);
113
- });
114
- if (withExisting.length > 0) {
115
- candidates = withExisting;
116
- }
117
- }
118
- // Step 8: Composite score — lowest wins
119
- // score = 0.5 * (activeSlots / maxSlots) + 0.3 * cpuUsage + 0.2 * memoryUsage
120
- const scored = candidates.map((m) => {
121
- const activeSlots = this.taskRepo.countActiveByMachine(m.id);
122
- const slotRatio = m.maxSlots > 0 ? activeSlots / m.maxSlots : 1;
123
- const score = 0.5 * slotRatio + 0.3 * m.cpuUsage + 0.2 * m.memoryUsage;
124
- return { machine: m, score, activeSlots };
125
- });
126
- scored.sort((a, b) => {
127
- // Primary: lowest composite score
128
- if (a.score !== b.score) {
129
- return a.score - b.score;
130
- }
131
- // Step 9: Tie-break — highest raw capacity (cpuCores * memoryGb)
132
- const capacityA = (a.machine.cpuCores ?? 0) * (a.machine.memoryGb ?? 0);
133
- const capacityB = (b.machine.cpuCores ?? 0) * (b.machine.memoryGb ?? 0);
134
- return capacityB - capacityA;
135
- });
136
- const selected = scored[0].machine;
137
- this.logger.debug(`Selected machine ${selected.name} (${selected.id}) with score ${scored[0].score.toFixed(3)}`);
138
- return selected;
139
- }
140
- };
141
- exports.MachineSelector = MachineSelector;
142
- exports.MachineSelector = MachineSelector = MachineSelector_1 = __decorate([
143
- (0, common_1.Injectable)(),
144
- __metadata("design:paramtypes", [machine_repository_1.MachineRepository,
145
- task_repository_1.TaskRepository,
146
- capability_service_1.CapabilityService])
147
- ], MachineSelector);
148
- //# sourceMappingURL=machine-selector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"machine-selector.js","sourceRoot":"","sources":["../../src/dispatcher/machine-selector.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AAEpD,mDAAiE;AACjE,oFAAgF;AAChF,8EAA0E;AAC1E,6DAAyD;AAGlD,IAAM,eAAe,uBAArB,MAAM,eAAe;IAIP;IACA;IACA;IALF,MAAM,GAAG,IAAI,eAAM,CAAC,iBAAe,CAAC,IAAI,CAAC,CAAC;IAE3D,YACmB,WAA8B,EAC9B,QAAwB,EACxB,iBAAoC;QAFpC,gBAAW,GAAX,WAAW,CAAmB;QAC9B,aAAQ,GAAR,QAAQ,CAAgB;QACxB,sBAAiB,GAAjB,iBAAiB,CAAmB;IACpD,CAAC;IAEJ;;;;OAIG;IACH,MAAM,CACJ,SAAiB,EACjB,IAAe,EACf,kBAA2B,EAC3B,UAAmB;QAEnB,qEAAqE;QACrE,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAChE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,qBAAqB,kBAAkB,YAAY,CACpD,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,SAAS,CAAC,MAAM,KAAK,wBAAa,CAAC,cAAc,EAAE,CAAC;gBACtD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,SAAS,CAAC,IAAI,oBAAoB,CAAC,CAAC;gBAC1E,OAAO,IAAI,CAAC;YACd,CAAC;YAED,uEAAuE;YACvE,IAAI,SAAS,CAAC,MAAM,KAAK,wBAAa,CAAC,MAAM,EAAE,CAAC;gBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,qBAAqB,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,2BAA2B,SAAS,CAAC,MAAM,EAAE,CAClG,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC;YAED,uDAAuD;YACvD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrE,IAAI,WAAW,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,qBAAqB,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,4BAA4B;oBAC9E,GAAG,WAAW,IAAI,SAAS,CAAC,QAAQ,EAAE,CACzC,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC;YAED,6DAA6D;YAC7D,IACE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,aAAa;gBAC5C,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,aAAa,EAC/C,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,qBAAqB,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,wBAAwB;oBAC1E,OAAO,SAAS,CAAC,QAAQ,SAAS,SAAS,CAAC,WAAW,eAAe,SAAS,CAAC,aAAa,EAAE,CAClG,CAAC;YACJ,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,0BAA0B;QAC1B,IAAI,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAE5C,gDAAgD;QAChD,UAAU,GAAG,UAAU,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,wBAAa,CAAC,MAAM,CACzC,CAAC;QAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2EAA2E;QAC3E,qEAAqE;QACrE,UAAU,GAAG,UAAU,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;YAClC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CACpD,CAAC;QAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,gCAAgC,SAAS,+BAA+B,CACzE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mFAAmF;QACnF,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACnC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAC1C,CAAC;YAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8BAA8B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAC3D,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,UAAU,GAAG,UAAU,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,aAAa;YAC7B,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,aAAa,CACnC,CAAC;QAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qEAAqE;QACrE,mDAAmD;QACnD,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7D,OAAO,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yEAAyE;QACzE,kFAAkF;QAClF,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzD,OAAO,YAAY,CAAC,IAAI,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CACnC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,UAAU,GAAG,YAAY,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,8EAA8E;QAC9E,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAClC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,KAAK,GACT,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACnB,kCAAkC;YAClC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YAC3B,CAAC;YAED,iEAAiE;YACjE,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YACxE,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YACxE,OAAO,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,oBAAoB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,gBAAgB,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAC9F,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAA;AAjLY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAKqB,sCAAiB;QACpB,gCAAc;QACL,sCAAiB;GAN5C,eAAe,CAiL3B"}
@@ -1,72 +0,0 @@
1
- import { MachineStatus } from '@overlordai/protocol';
2
- import { MachineRepository } from '../../database/repositories/machine.repository';
3
- import { TaskRepository } from '../../database/repositories/task.repository';
4
- import { AuditLogRepository } from '../../database/repositories/audit-log.repository';
5
- import { WorkerConnectionManager } from '../../dispatcher/worker-connection.manager';
6
- import type { AuthenticatedRequest } from '../../auth/authenticated-request';
7
- export declare class AdminMachineController {
8
- private readonly machineRepo;
9
- private readonly taskRepo;
10
- private readonly auditLogRepo;
11
- private readonly connectionManager;
12
- private readonly logger;
13
- constructor(machineRepo: MachineRepository, taskRepo: TaskRepository, auditLogRepo: AuditLogRepository, connectionManager: WorkerConnectionManager);
14
- listMachines(): {
15
- id: string;
16
- name: string;
17
- host: string;
18
- port: number;
19
- tokenId: number;
20
- os: string | null;
21
- cpuModel: string | null;
22
- cpuCores: number | null;
23
- memoryGb: number | null;
24
- maxSlots: number;
25
- activeSlots: number;
26
- cpuUsage: number;
27
- memoryUsage: number;
28
- diskUsage: number;
29
- loadThreshold: number;
30
- tags: string[];
31
- capabilities: string[];
32
- protocolVersion: string;
33
- workerVersion: string | null;
34
- lastHeartbeat: string | null;
35
- sshUrl: string | null;
36
- status: MachineStatus;
37
- decommissionedAt: string | null;
38
- decommissionedBy: number | null;
39
- }[];
40
- updateMachine(id: string, body: {
41
- status?: MachineStatus;
42
- }, req: AuthenticatedRequest): {
43
- id: string;
44
- name: string;
45
- host: string;
46
- port: number;
47
- tokenId: number;
48
- os: string | null;
49
- cpuModel: string | null;
50
- cpuCores: number | null;
51
- memoryGb: number | null;
52
- maxSlots: number;
53
- activeSlots: number;
54
- cpuUsage: number;
55
- memoryUsage: number;
56
- diskUsage: number;
57
- loadThreshold: number;
58
- tags: string[];
59
- capabilities: string[];
60
- protocolVersion: string;
61
- workerVersion: string | null;
62
- lastHeartbeat: string | null;
63
- sshUrl: string | null;
64
- status: MachineStatus;
65
- decommissionedAt: string | null;
66
- decommissionedBy: number | null;
67
- };
68
- decommissionMachine(id: string, req: AuthenticatedRequest): {
69
- success: boolean;
70
- };
71
- }
72
- //# sourceMappingURL=admin-machine.controller.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-machine.controller.d.ts","sourceRoot":"","sources":["../../../src/web/admin/admin-machine.controller.ts"],"names":[],"mappings":"AAaA,OAAO,EAAiB,aAAa,EAAc,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,qBAGa,sBAAsB;IAI/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IANpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAG/C,WAAW,EAAE,iBAAiB,EAC9B,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,kBAAkB,EAChC,iBAAiB,EAAE,uBAAuB;IAI7D,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;IAKZ,aAAa,CACE,EAAE,EAAE,MAAM,EACf,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,aAAa,CAAA;KAAE,EACjC,GAAG,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;IA2DlC,mBAAmB,CACJ,EAAE,EAAE,MAAM,EAChB,GAAG,EAAE,oBAAoB;;;CAgEnC"}
@@ -1,176 +0,0 @@
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 __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- var AdminMachineController_1;
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.AdminMachineController = void 0;
17
- const common_1 = require("@nestjs/common");
18
- const protocol_1 = require("@overlordai/protocol");
19
- const jwt_auth_guard_1 = require("../../auth/guards/jwt-auth.guard");
20
- const roles_guard_1 = require("../../auth/guards/roles.guard");
21
- const roles_decorator_1 = require("../../auth/decorators/roles.decorator");
22
- const machine_repository_1 = require("../../database/repositories/machine.repository");
23
- const task_repository_1 = require("../../database/repositories/task.repository");
24
- const audit_log_repository_1 = require("../../database/repositories/audit-log.repository");
25
- const worker_connection_manager_1 = require("../../dispatcher/worker-connection.manager");
26
- const machine_utils_1 = require("../../common/machine-utils");
27
- let AdminMachineController = AdminMachineController_1 = class AdminMachineController {
28
- machineRepo;
29
- taskRepo;
30
- auditLogRepo;
31
- connectionManager;
32
- logger = new common_1.Logger(AdminMachineController_1.name);
33
- constructor(machineRepo, taskRepo, auditLogRepo, connectionManager) {
34
- this.machineRepo = machineRepo;
35
- this.taskRepo = taskRepo;
36
- this.auditLogRepo = auditLogRepo;
37
- this.connectionManager = connectionManager;
38
- }
39
- listMachines() {
40
- return this.machineRepo.findAll(true).map(machine_utils_1.stripMachineSecrets);
41
- }
42
- updateMachine(id, body, req) {
43
- const machine = this.machineRepo.findById(id);
44
- if (!machine) {
45
- throw new common_1.NotFoundException(`Machine '${id}' not found`);
46
- }
47
- if (machine.status === protocol_1.MachineStatus.DECOMMISSIONED) {
48
- throw new common_1.BadRequestException('Cannot update a decommissioned machine');
49
- }
50
- const validStatuses = ['online', 'offline', 'draining'];
51
- if (body.status && !validStatuses.includes(body.status)) {
52
- throw new common_1.BadRequestException(`Invalid status. Must be one of: ${validStatuses.join(', ')}`);
53
- }
54
- if (body.status) {
55
- this.machineRepo.updateStatus(id, body.status);
56
- // When forcing a machine offline, reconcile its active tasks
57
- if (body.status === 'offline') {
58
- const activeTasks = this.taskRepo.findByMachineId(id, [
59
- protocol_1.TaskStatus.ASSIGNED,
60
- protocol_1.TaskStatus.RUNNING,
61
- ]);
62
- for (const task of activeTasks) {
63
- if (task.status === protocol_1.TaskStatus.ASSIGNED) {
64
- // ASSIGNED tasks can be re-queued for another machine
65
- this.taskRepo.updateStatus(task.id, protocol_1.TaskStatus.QUEUED, task.revision, {
66
- machineId: null,
67
- });
68
- this.logger.warn(`Task #${task.id} re-queued: machine '${machine.name}' forced offline`);
69
- }
70
- else if (task.status === protocol_1.TaskStatus.RUNNING) {
71
- // RUNNING tasks must be failed — their state is indeterminate
72
- this.taskRepo.updateStatus(task.id, protocol_1.TaskStatus.FAILED, task.revision, {
73
- errorMessage: `Machine '${machine.name}' forced offline by administrator`,
74
- completedAt: new Date().toISOString(),
75
- });
76
- this.logger.warn(`Task #${task.id} marked FAILED: machine '${machine.name}' forced offline`);
77
- }
78
- }
79
- }
80
- }
81
- this.auditLogRepo.create({
82
- userId: req.user.sub,
83
- action: 'machine_update',
84
- resource: `machine:${id}`,
85
- detail: `Updated machine '${machine.name}'`,
86
- });
87
- return (0, machine_utils_1.stripMachineSecrets)(this.machineRepo.findById(id));
88
- }
89
- decommissionMachine(id, req) {
90
- const machine = this.machineRepo.findById(id);
91
- if (!machine) {
92
- throw new common_1.NotFoundException(`Machine '${id}' not found`);
93
- }
94
- if (machine.status === protocol_1.MachineStatus.DECOMMISSIONED) {
95
- throw new common_1.BadRequestException('Machine is already decommissioned');
96
- }
97
- // Mark as decommissioned first to prevent dispatcher from re-assigning tasks
98
- this.machineRepo.decommission(id, req.user.sub);
99
- // Disconnect the worker if online
100
- const ws = this.connectionManager.getConnection(id);
101
- if (ws) {
102
- ws.close(4010, 'Machine decommissioned');
103
- this.connectionManager.unregister(id);
104
- }
105
- // Reconcile active tasks (including suspended — they are machine-bound)
106
- const activeTasks = this.taskRepo.findByMachineId(id, [
107
- protocol_1.TaskStatus.ASSIGNED,
108
- protocol_1.TaskStatus.RUNNING,
109
- protocol_1.TaskStatus.SUSPENDED,
110
- ]);
111
- for (const task of activeTasks) {
112
- if (task.status === protocol_1.TaskStatus.ASSIGNED) {
113
- this.taskRepo.updateStatus(task.id, protocol_1.TaskStatus.QUEUED, task.revision, {
114
- machineId: null,
115
- assignedAt: null,
116
- });
117
- this.logger.warn(`Task #${task.id} re-queued: machine '${machine.name}' decommissioned`);
118
- }
119
- else if (task.status === protocol_1.TaskStatus.SUSPENDED) {
120
- this.taskRepo.updateStatus(task.id, protocol_1.TaskStatus.FAILED, task.revision, {
121
- errorMessage: `Machine '${machine.name}' decommissioned by administrator (execution context irrecoverable)`,
122
- completedAt: new Date().toISOString(),
123
- });
124
- this.logger.warn(`Task #${task.id} marked FAILED: machine '${machine.name}' decommissioned (suspended, context irrecoverable)`);
125
- }
126
- else if (task.status === protocol_1.TaskStatus.RUNNING) {
127
- this.taskRepo.updateStatus(task.id, protocol_1.TaskStatus.FAILED, task.revision, {
128
- errorMessage: `Machine '${machine.name}' decommissioned by administrator`,
129
- completedAt: new Date().toISOString(),
130
- });
131
- this.logger.warn(`Task #${task.id} marked FAILED: machine '${machine.name}' decommissioned`);
132
- }
133
- }
134
- this.auditLogRepo.create({
135
- userId: req.user.sub,
136
- action: 'machine_decommission',
137
- resource: `machine:${id}`,
138
- detail: `Machine '${machine.name}' decommissioned`,
139
- });
140
- return { success: true };
141
- }
142
- };
143
- exports.AdminMachineController = AdminMachineController;
144
- __decorate([
145
- (0, common_1.Get)(),
146
- __metadata("design:type", Function),
147
- __metadata("design:paramtypes", []),
148
- __metadata("design:returntype", void 0)
149
- ], AdminMachineController.prototype, "listMachines", null);
150
- __decorate([
151
- (0, common_1.Put)(':id'),
152
- __param(0, (0, common_1.Param)('id')),
153
- __param(1, (0, common_1.Body)()),
154
- __param(2, (0, common_1.Req)()),
155
- __metadata("design:type", Function),
156
- __metadata("design:paramtypes", [String, Object, Object]),
157
- __metadata("design:returntype", void 0)
158
- ], AdminMachineController.prototype, "updateMachine", null);
159
- __decorate([
160
- (0, common_1.Delete)(':id'),
161
- __param(0, (0, common_1.Param)('id')),
162
- __param(1, (0, common_1.Req)()),
163
- __metadata("design:type", Function),
164
- __metadata("design:paramtypes", [String, Object]),
165
- __metadata("design:returntype", void 0)
166
- ], AdminMachineController.prototype, "decommissionMachine", null);
167
- exports.AdminMachineController = AdminMachineController = AdminMachineController_1 = __decorate([
168
- (0, common_1.Controller)('api/admin/machines'),
169
- (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard, roles_guard_1.RolesGuard),
170
- (0, roles_decorator_1.Roles)(protocol_1.DeveloperRole.ADMIN),
171
- __metadata("design:paramtypes", [machine_repository_1.MachineRepository,
172
- task_repository_1.TaskRepository,
173
- audit_log_repository_1.AuditLogRepository,
174
- worker_connection_manager_1.WorkerConnectionManager])
175
- ], AdminMachineController);
176
- //# sourceMappingURL=admin-machine.controller.js.map