@overlordai/server 1.0.114 → 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 (238) hide show
  1. package/database/migrations/005-task-name.sql +1 -0
  2. package/dist/adapters/adapter.interface.d.ts +4 -0
  3. package/dist/adapters/adapter.interface.d.ts.map +1 -1
  4. package/dist/adapters/adapter.interface.js.map +1 -1
  5. package/dist/adapters/help-text.js +5 -5
  6. package/dist/adapters/help-text.js.map +1 -1
  7. package/dist/adapters/lark/lark-card.builder.d.ts.map +1 -1
  8. package/dist/adapters/lark/lark-card.builder.js +10 -17
  9. package/dist/adapters/lark/lark-card.builder.js.map +1 -1
  10. package/dist/adapters/lark/lark-message.parser.js +3 -3
  11. package/dist/adapters/lark/lark-message.parser.js.map +1 -1
  12. package/dist/adapters/lark/lark.adapter.d.ts +6 -0
  13. package/dist/adapters/lark/lark.adapter.d.ts.map +1 -1
  14. package/dist/adapters/lark/lark.adapter.js +69 -1
  15. package/dist/adapters/lark/lark.adapter.js.map +1 -1
  16. package/dist/adapters/lark/lark.controller.d.ts.map +1 -1
  17. package/dist/adapters/lark/lark.controller.js +2 -1
  18. package/dist/adapters/lark/lark.controller.js.map +1 -1
  19. package/dist/adapters/slack/slack-block.builder.d.ts.map +1 -1
  20. package/dist/adapters/slack/slack-block.builder.js +7 -14
  21. package/dist/adapters/slack/slack-block.builder.js.map +1 -1
  22. package/dist/adapters/slack/slack-message.parser.js +3 -3
  23. package/dist/adapters/slack/slack-message.parser.js.map +1 -1
  24. package/dist/adapters/slack/slack.adapter.d.ts +1 -0
  25. package/dist/adapters/slack/slack.adapter.d.ts.map +1 -1
  26. package/dist/adapters/slack/slack.adapter.js +23 -0
  27. package/dist/adapters/slack/slack.adapter.js.map +1 -1
  28. package/dist/adapters/slack/slack.controller.d.ts.map +1 -1
  29. package/dist/adapters/slack/slack.controller.js +3 -2
  30. package/dist/adapters/slack/slack.controller.js.map +1 -1
  31. package/dist/common/config.d.ts +15 -0
  32. package/dist/common/config.d.ts.map +1 -1
  33. package/dist/common/config.js +27 -0
  34. package/dist/common/config.js.map +1 -1
  35. package/dist/common/status-display.d.ts +10 -0
  36. package/dist/common/status-display.d.ts.map +1 -0
  37. package/dist/common/status-display.js +35 -0
  38. package/dist/common/status-display.js.map +1 -0
  39. package/dist/common/string-utils.d.ts +3 -0
  40. package/dist/common/string-utils.d.ts.map +1 -1
  41. package/dist/common/string-utils.js +5 -0
  42. package/dist/common/string-utils.js.map +1 -1
  43. package/dist/database/repositories/task.repository.d.ts +1 -0
  44. package/dist/database/repositories/task.repository.d.ts.map +1 -1
  45. package/dist/database/repositories/task.repository.js +15 -0
  46. package/dist/database/repositories/task.repository.js.map +1 -1
  47. package/dist/dispatcher/dispatcher.module.d.ts.map +1 -1
  48. package/dist/dispatcher/dispatcher.module.js +4 -0
  49. package/dist/dispatcher/dispatcher.module.js.map +1 -1
  50. package/dist/dispatcher/dispatcher.service.d.ts +0 -1
  51. package/dist/dispatcher/dispatcher.service.d.ts.map +1 -1
  52. package/dist/dispatcher/dispatcher.service.js +21 -41
  53. package/dist/dispatcher/dispatcher.service.js.map +1 -1
  54. package/dist/dispatcher/scheduler.service.js +1 -1
  55. package/dist/dispatcher/scheduler.service.js.map +1 -1
  56. package/dist/dispatcher/stage-confirm-timeout.service.d.ts +15 -0
  57. package/dist/dispatcher/stage-confirm-timeout.service.d.ts.map +1 -0
  58. package/dist/dispatcher/stage-confirm-timeout.service.js +81 -0
  59. package/dist/dispatcher/stage-confirm-timeout.service.js.map +1 -0
  60. package/dist/dispatcher/task-creation.service.d.ts +3 -1
  61. package/dist/dispatcher/task-creation.service.d.ts.map +1 -1
  62. package/dist/dispatcher/task-creation.service.js +14 -3
  63. package/dist/dispatcher/task-creation.service.js.map +1 -1
  64. package/dist/dispatcher/task-lifecycle.service.d.ts +2 -0
  65. package/dist/dispatcher/task-lifecycle.service.d.ts.map +1 -1
  66. package/dist/dispatcher/task-lifecycle.service.js +62 -0
  67. package/dist/dispatcher/task-lifecycle.service.js.map +1 -1
  68. package/dist/dispatcher/task-name.service.d.ts +14 -0
  69. package/dist/dispatcher/task-name.service.d.ts.map +1 -0
  70. package/dist/dispatcher/task-name.service.js +80 -0
  71. package/dist/dispatcher/task-name.service.js.map +1 -0
  72. package/dist/notifier/notification-consumer.d.ts +16 -1
  73. package/dist/notifier/notification-consumer.d.ts.map +1 -1
  74. package/dist/notifier/notification-consumer.js +150 -13
  75. package/dist/notifier/notification-consumer.js.map +1 -1
  76. package/dist/notifier/notifier.service.d.ts +5 -1
  77. package/dist/notifier/notifier.service.d.ts.map +1 -1
  78. package/dist/notifier/notifier.service.js +6 -3
  79. package/dist/notifier/notifier.service.js.map +1 -1
  80. package/dist/notifier/template.service.d.ts +13 -0
  81. package/dist/notifier/template.service.d.ts.map +1 -1
  82. package/dist/notifier/template.service.js +72 -31
  83. package/dist/notifier/template.service.js.map +1 -1
  84. package/dist/web/admin/admin-developer.controller.d.ts +2 -2
  85. package/dist/web/admin/admin-settings.controller.d.ts.map +1 -1
  86. package/dist/web/admin/admin-settings.controller.js +0 -1
  87. package/dist/web/admin/admin-settings.controller.js.map +1 -1
  88. package/dist/web/dashboard.service.d.ts.map +1 -1
  89. package/dist/web/dashboard.service.js +3 -3
  90. package/dist/web/dashboard.service.js.map +1 -1
  91. package/dist/web/frame-handlers/index.d.ts +2 -0
  92. package/dist/web/frame-handlers/index.d.ts.map +1 -1
  93. package/dist/web/frame-handlers/index.js +5 -1
  94. package/dist/web/frame-handlers/index.js.map +1 -1
  95. package/dist/web/frame-handlers/stage-choice.handler.d.ts +15 -0
  96. package/dist/web/frame-handlers/stage-choice.handler.d.ts.map +1 -0
  97. package/dist/web/frame-handlers/stage-choice.handler.js +39 -0
  98. package/dist/web/frame-handlers/stage-choice.handler.js.map +1 -0
  99. package/dist/web/frame-handlers/stage-confirm.handler.d.ts.map +1 -1
  100. package/dist/web/frame-handlers/stage-confirm.handler.js +1 -0
  101. package/dist/web/frame-handlers/stage-confirm.handler.js.map +1 -1
  102. package/dist/web/frame-handlers/stage-input.handler.d.ts +15 -0
  103. package/dist/web/frame-handlers/stage-input.handler.d.ts.map +1 -0
  104. package/dist/web/frame-handlers/stage-input.handler.js +39 -0
  105. package/dist/web/frame-handlers/stage-input.handler.js.map +1 -0
  106. package/dist/web/project.controller.d.ts +2 -2
  107. package/dist/web/search.service.d.ts +1 -0
  108. package/dist/web/search.service.d.ts.map +1 -1
  109. package/dist/web/search.service.js +6 -6
  110. package/dist/web/search.service.js.map +1 -1
  111. package/dist/web/task.controller.d.ts +13 -0
  112. package/dist/web/task.controller.d.ts.map +1 -1
  113. package/dist/web/task.controller.js +50 -0
  114. package/dist/web/task.controller.js.map +1 -1
  115. package/dist/web/worker-channel.gateway.d.ts.map +1 -1
  116. package/dist/web/worker-channel.gateway.js +2 -0
  117. package/dist/web/worker-channel.gateway.js.map +1 -1
  118. package/package.json +4 -4
  119. package/public/assets/{AccessTokensPage-B2zkZtaB.js → AccessTokensPage-Yp8IfrfF.js} +1 -1
  120. package/public/assets/{AdminPage-B-n-9yUY.js → AdminPage-CS2HrhOC.js} +1 -1
  121. package/public/assets/ApiReferencePage-DTinm3RG.js +1 -0
  122. package/public/assets/{ArchitecturePage-CDgB6NL0.js → ArchitecturePage-BpA3PUuf.js} +1 -1
  123. package/public/assets/{AuditLogPage-CmxGpu8q.js → AuditLogPage-B_Qopq3a.js} +2 -2
  124. package/public/assets/{BindPlatformPage-D-7wxMjF.js → BindPlatformPage-BkV-IfaR.js} +1 -1
  125. package/public/assets/BotIntegrationPage-DLuRDIam.js +1 -0
  126. package/public/assets/{BotManage-DSe8d-gZ.js → BotManage-XKHjrA-7.js} +1 -1
  127. package/public/assets/BotSetupPage-Cn40afR9.js +33 -0
  128. package/public/assets/{ChangelogPage-BUAm5LN6.js → ChangelogPage-ChiapPDH.js} +1 -1
  129. package/public/assets/{CliReferencePage-B6-2m7YU.js → CliReferencePage-3eHb6kRq.js} +1 -1
  130. package/public/assets/{DeploymentPage-cW2JDGd0.js → DeploymentPage-CvT9Pcow.js} +1 -1
  131. package/public/assets/{DevWorkflowPage-BbNK1Bmy.js → DevWorkflowPage-BLEIbUu1.js} +1 -1
  132. package/public/assets/{DeveloperManage-BVkSw-WE.js → DeveloperManage-DAJBvmdv.js} +1 -1
  133. package/public/assets/{DeveloperSetupPage-Cf8ehfWm.js → DeveloperSetupPage-BhE83ouS.js} +1 -1
  134. package/public/assets/{DocsIndexPage-BEMGBIkx.js → DocsIndexPage-BE_tyO2Q.js} +1 -1
  135. package/public/assets/{DocsLayout-BLcuuadd.js → DocsLayout-D1S4KUeB.js} +1 -1
  136. package/public/assets/{DocsPrimitives-BEIQH4P7.js → DocsPrimitives-BQXfZXxZ.js} +1 -1
  137. package/public/assets/{EditProjectPage-RsYg77Bf.js → EditProjectPage-BjgRi6kG.js} +2 -2
  138. package/public/assets/{EmptyState-D8UwaoPs.js → EmptyState-Dlt6FhVC.js} +1 -1
  139. package/public/assets/EnvVariablesPage-CvcP4GZM.js +24 -0
  140. package/public/assets/HomePage-uEE3mJNM.js +1 -0
  141. package/public/assets/{InfoRow-BbQYGWPd.js → InfoRow-Db2nisGq.js} +1 -1
  142. package/public/assets/{InstallationPage-blIErVXZ.js → InstallationPage-kt-du5Rr.js} +2 -2
  143. package/public/assets/{LandingPage-CL2eVc3w.js → LandingPage-2irRMduO.js} +1 -1
  144. package/public/assets/{LocalDevelopmentPage-CNfZtynN.js → LocalDevelopmentPage-7JvSDwD1.js} +1 -1
  145. package/public/assets/{LoginPage-C_jpU4-N.js → LoginPage-DDk_X1sv.js} +1 -1
  146. package/public/assets/{MetricBar-CCL5kOaE.js → MetricBar-BhjbfPOa.js} +1 -1
  147. package/public/assets/{NotFoundPage-DiQ3T_pE.js → NotFoundPage-ByRykDvA.js} +1 -1
  148. package/public/assets/{OnboardingGuide-xVUtEvVm.js → OnboardingGuide-CinJRqx5.js} +1 -1
  149. package/public/assets/{PermissionsPage-CE5Yc52w.js → PermissionsPage-C5RXlztC.js} +1 -1
  150. package/public/assets/PipelineConfigPage-BSkSRngC.js +22 -0
  151. package/public/assets/{PipelineEditorPage-BR9ozDOr.js → PipelineEditorPage-BoZ_MVNO.js} +2 -2
  152. package/public/assets/{ProfilePage-kUKBviJg.js → ProfilePage-CePUfQDH.js} +1 -1
  153. package/public/assets/ProjectDetailPage-_DswTp8-.js +7 -0
  154. package/public/assets/{ProjectListPage-DZoCY4RY.js → ProjectListPage-fVbDom8_.js} +1 -1
  155. package/public/assets/{PtyTerminal-DY7uY9Y-.js → PtyTerminal-Dpk4L7LN.js} +1 -1
  156. package/public/assets/{QuickAuth-DbURb8Mn.js → QuickAuth-BAmZCI4O.js} +1 -1
  157. package/public/assets/{RemoveMemberConfirmDialog-WvwPPSjT.js → RemoveMemberConfirmDialog-DYi6BAz2.js} +2 -2
  158. package/public/assets/{Select-B_UE_NDL.js → Select-DnIOEVCT.js} +1 -1
  159. package/public/assets/SettingsPage-CwV-t8vo.js +6 -0
  160. package/public/assets/{Skeleton-CqLLWdXS.js → Skeleton--qglldqs.js} +1 -1
  161. package/public/assets/{SkillPage-D5a41yA5.js → SkillPage-CsXXruJZ.js} +1 -1
  162. package/public/assets/TaskDetailPage-gOUWMfkb.js +21 -0
  163. package/public/assets/TaskListPage-vF17zpt2.js +1 -0
  164. package/public/assets/{TaskStatusBadge-DzeMf5Ey.js → TaskStatusBadge-CCh-nmLz.js} +1 -1
  165. package/public/assets/TerminalHomePage-DXFg88Q9.js +11 -0
  166. package/public/assets/{TokenManage-BCVRHkhz.js → TokenManage-P98_TYIe.js} +1 -1
  167. package/public/assets/{Tooltip-BWRiD768.js → Tooltip-DGoJgM_K.js} +1 -1
  168. package/public/assets/{TotpSetupPage-D4T0gS9_.js → TotpSetupPage-D5GUedMd.js} +1 -1
  169. package/public/assets/WorkerDetailPage-CkI1feoH.js +1 -0
  170. package/public/assets/{WorkerListPage-4qQGHwbV.js → WorkerListPage-C90v6nLx.js} +2 -2
  171. package/public/assets/{WorkerOperationsPage-DKPUYRDJ.js → WorkerOperationsPage-OxH0Ky0Y.js} +1 -1
  172. package/public/assets/{WorkerSetupGuidePage-B4B-DkyO.js → WorkerSetupGuidePage-DGlgYS82.js} +1 -1
  173. package/public/assets/{WorkerSetupPage-frqVW4Ll.js → WorkerSetupPage-DJ359PwT.js} +1 -1
  174. package/public/assets/{arrow-left-DEORM5c1.js → arrow-left-BPgCxdEG.js} +1 -1
  175. package/public/assets/{arrow-right-B0qrrCV_.js → arrow-right-Z-hFp5rr.js} +1 -1
  176. package/public/assets/{bot-B_Wtzq9W.js → bot-B7Bl9J0r.js} +1 -1
  177. package/public/assets/{chevron-right-CURI3LO_.js → chevron-right-D_hyYdgn.js} +1 -1
  178. package/public/assets/{copy-4UTzTyXv.js → copy-SJf3OFPQ.js} +1 -1
  179. package/public/assets/{download-Dq5jLFci.js → download-D7rCJJks.js} +1 -1
  180. package/public/assets/{external-link-Cj283ZgT.js → external-link-BrXLoqUZ.js} +1 -1
  181. package/public/assets/{index-C5MJg1oC.js → index-DPCzKHL-.js} +42 -42
  182. package/public/assets/{key-BKBK0Uc2.js → key-CCF8A0TZ.js} +1 -1
  183. package/public/assets/{loader-circle-B71q4Dz7.js → loader-circle-BO0HYeDT.js} +1 -1
  184. package/public/assets/{pencil-DG3Q-41a.js → pencil-BhxWbYup.js} +1 -1
  185. package/public/assets/{plus-CQjC8fgx.js → plus-BnJSQWb4.js} +1 -1
  186. package/public/assets/{rotate-ccw-CQh0kfDP.js → rotate-ccw-CioNXT1z.js} +1 -1
  187. package/public/assets/{scroll-text-DF3DMVZk.js → scroll-text-DpFjChL8.js} +1 -1
  188. package/public/assets/{settings-C_K0CJNU.js → settings-Bklbsj12.js} +1 -1
  189. package/public/assets/{status-colors-BnNRsWp0.js → status-colors-BkxgT8vX.js} +1 -1
  190. package/public/assets/{task-constants-D_2_U6qL.js → task-constants-Ctac6aky.js} +1 -1
  191. package/public/assets/task-display-J_FNKBLK.js +1 -0
  192. package/public/assets/{trash-2-DsQUbmfY.js → trash-2-_3SD7t1j.js} +1 -1
  193. package/public/assets/{useFetch-C8LjfJUm.js → useFetch-D8w38eG7.js} +1 -1
  194. package/public/assets/{users-BWaNs7Vz.js → users-BBjD2TJy.js} +1 -1
  195. package/public/assets/{wifi-0ZLwtMKj.js → wifi-KyET3jRD.js} +1 -1
  196. package/public/assets/{workflow-B0yaOIwg.js → workflow-EN1ACj2x.js} +1 -1
  197. package/public/index.html +1 -1
  198. package/public/sw.js +1 -1
  199. package/dist/common/command-parser.d.ts +0 -29
  200. package/dist/common/command-parser.d.ts.map +0 -1
  201. package/dist/common/command-parser.js +0 -133
  202. package/dist/common/command-parser.js.map +0 -1
  203. package/dist/common/machine-utils.d.ts +0 -32
  204. package/dist/common/machine-utils.d.ts.map +0 -1
  205. package/dist/common/machine-utils.js +0 -12
  206. package/dist/common/machine-utils.js.map +0 -1
  207. package/dist/common/worker-utils.d.ts +0 -31
  208. package/dist/common/worker-utils.d.ts.map +0 -1
  209. package/dist/common/worker-utils.js +0 -12
  210. package/dist/common/worker-utils.js.map +0 -1
  211. package/dist/database/repositories/machine.repository.d.ts +0 -46
  212. package/dist/database/repositories/machine.repository.d.ts.map +0 -1
  213. package/dist/database/repositories/machine.repository.js +0 -200
  214. package/dist/database/repositories/machine.repository.js.map +0 -1
  215. package/dist/dispatcher/machine-selector.d.ts +0 -18
  216. package/dist/dispatcher/machine-selector.d.ts.map +0 -1
  217. package/dist/dispatcher/machine-selector.js +0 -148
  218. package/dist/dispatcher/machine-selector.js.map +0 -1
  219. package/dist/web/admin/admin-machine.controller.d.ts +0 -72
  220. package/dist/web/admin/admin-machine.controller.d.ts.map +0 -1
  221. package/dist/web/admin/admin-machine.controller.js +0 -176
  222. package/dist/web/admin/admin-machine.controller.js.map +0 -1
  223. package/dist/web/machine.controller.d.ts +0 -115
  224. package/dist/web/machine.controller.d.ts.map +0 -1
  225. package/dist/web/machine.controller.js +0 -125
  226. package/dist/web/machine.controller.js.map +0 -1
  227. package/public/assets/ApiReferencePage-Dcik4fBN.js +0 -1
  228. package/public/assets/BotIntegrationPage-DoD5KbmU.js +0 -1
  229. package/public/assets/BotSetupPage-BkNF3ug4.js +0 -33
  230. package/public/assets/EnvVariablesPage-krKQsNzw.js +0 -1
  231. package/public/assets/HomePage-vhKQtyLw.js +0 -1
  232. package/public/assets/PipelineConfigPage-BG_LWoNZ.js +0 -28
  233. package/public/assets/ProjectDetailPage-VE0081wk.js +0 -7
  234. package/public/assets/SettingsPage-DpJ00PdY.js +0 -6
  235. package/public/assets/TaskDetailPage-Dt3Hj-nd.js +0 -21
  236. package/public/assets/TaskListPage-CbmW-VAl.js +0 -1
  237. package/public/assets/TerminalHomePage-D7aNN02N.js +0 -11
  238. package/public/assets/WorkerDetailPage-D9ZTWwot.js +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":"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"}
@@ -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