@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.
- package/database/migrations/003-chat-bindings-project-key-index.sql +1 -0
- package/database/migrations/004-drop-agent-command.sql +2 -0
- package/database/migrations/005-task-name.sql +1 -0
- package/dist/adapters/adapter.interface.d.ts +4 -0
- package/dist/adapters/adapter.interface.d.ts.map +1 -1
- package/dist/adapters/adapter.interface.js.map +1 -1
- package/dist/adapters/command-parser.utils.d.ts +45 -0
- package/dist/adapters/command-parser.utils.d.ts.map +1 -0
- package/dist/adapters/command-parser.utils.js +144 -0
- package/dist/adapters/command-parser.utils.js.map +1 -0
- package/dist/adapters/help-text.d.ts +2 -0
- package/dist/adapters/help-text.d.ts.map +1 -0
- package/dist/adapters/help-text.js +24 -0
- package/dist/adapters/help-text.js.map +1 -0
- package/dist/adapters/lark/lark-card.builder.d.ts.map +1 -1
- package/dist/adapters/lark/lark-card.builder.js +10 -17
- package/dist/adapters/lark/lark-card.builder.js.map +1 -1
- package/dist/adapters/lark/lark-message.parser.d.ts +2 -35
- package/dist/adapters/lark/lark-message.parser.d.ts.map +1 -1
- package/dist/adapters/lark/lark-message.parser.js +12 -162
- package/dist/adapters/lark/lark-message.parser.js.map +1 -1
- package/dist/adapters/lark/lark.adapter.d.ts +18 -0
- package/dist/adapters/lark/lark.adapter.d.ts.map +1 -1
- package/dist/adapters/lark/lark.adapter.js +152 -23
- package/dist/adapters/lark/lark.adapter.js.map +1 -1
- package/dist/adapters/lark/lark.controller.d.ts.map +1 -1
- package/dist/adapters/lark/lark.controller.js +2 -1
- package/dist/adapters/lark/lark.controller.js.map +1 -1
- package/dist/adapters/slack/slack-block.builder.d.ts.map +1 -1
- package/dist/adapters/slack/slack-block.builder.js +7 -14
- package/dist/adapters/slack/slack-block.builder.js.map +1 -1
- package/dist/adapters/slack/slack-message.parser.d.ts +2 -11
- package/dist/adapters/slack/slack-message.parser.d.ts.map +1 -1
- package/dist/adapters/slack/slack-message.parser.js +12 -135
- package/dist/adapters/slack/slack-message.parser.js.map +1 -1
- package/dist/adapters/slack/slack.adapter.d.ts +5 -0
- package/dist/adapters/slack/slack.adapter.d.ts.map +1 -1
- package/dist/adapters/slack/slack.adapter.js +101 -25
- package/dist/adapters/slack/slack.adapter.js.map +1 -1
- package/dist/adapters/slack/slack.controller.d.ts.map +1 -1
- package/dist/adapters/slack/slack.controller.js +3 -4
- package/dist/adapters/slack/slack.controller.js.map +1 -1
- package/dist/common/config.d.ts +15 -0
- package/dist/common/config.d.ts.map +1 -1
- package/dist/common/config.js +27 -0
- package/dist/common/config.js.map +1 -1
- package/dist/common/project-validation.d.ts +1 -1
- package/dist/common/project-validation.d.ts.map +1 -1
- package/dist/common/project-validation.js +1 -9
- package/dist/common/project-validation.js.map +1 -1
- package/dist/common/status-display.d.ts +10 -0
- package/dist/common/status-display.d.ts.map +1 -0
- package/dist/common/status-display.js +35 -0
- package/dist/common/status-display.js.map +1 -0
- package/dist/common/string-utils.d.ts +3 -0
- package/dist/common/string-utils.d.ts.map +1 -1
- package/dist/common/string-utils.js +5 -0
- package/dist/common/string-utils.js.map +1 -1
- package/dist/database/repositories/bot.repository.d.ts +4 -0
- package/dist/database/repositories/bot.repository.d.ts.map +1 -1
- package/dist/database/repositories/bot.repository.js +15 -0
- package/dist/database/repositories/bot.repository.js.map +1 -1
- package/dist/database/repositories/project.repository.d.ts.map +1 -1
- package/dist/database/repositories/project.repository.js +0 -2
- package/dist/database/repositories/project.repository.js.map +1 -1
- package/dist/database/repositories/task.repository.d.ts +2 -1
- package/dist/database/repositories/task.repository.d.ts.map +1 -1
- package/dist/database/repositories/task.repository.js +19 -1
- package/dist/database/repositories/task.repository.js.map +1 -1
- package/dist/dispatcher/cleanup.service.d.ts +5 -0
- package/dist/dispatcher/cleanup.service.d.ts.map +1 -1
- package/dist/dispatcher/cleanup.service.js +19 -0
- package/dist/dispatcher/cleanup.service.js.map +1 -1
- package/dist/dispatcher/dispatcher.module.d.ts.map +1 -1
- package/dist/dispatcher/dispatcher.module.js +4 -0
- package/dist/dispatcher/dispatcher.module.js.map +1 -1
- package/dist/dispatcher/dispatcher.service.d.ts +0 -1
- package/dist/dispatcher/dispatcher.service.d.ts.map +1 -1
- package/dist/dispatcher/dispatcher.service.js +46 -45
- package/dist/dispatcher/dispatcher.service.js.map +1 -1
- package/dist/dispatcher/dispatcher.types.d.ts +1 -0
- package/dist/dispatcher/dispatcher.types.d.ts.map +1 -1
- package/dist/dispatcher/scheduler.service.d.ts.map +1 -1
- package/dist/dispatcher/scheduler.service.js +14 -3
- package/dist/dispatcher/scheduler.service.js.map +1 -1
- package/dist/dispatcher/stage-confirm-timeout.service.d.ts +15 -0
- package/dist/dispatcher/stage-confirm-timeout.service.d.ts.map +1 -0
- package/dist/dispatcher/stage-confirm-timeout.service.js +81 -0
- package/dist/dispatcher/stage-confirm-timeout.service.js.map +1 -0
- package/dist/dispatcher/task-creation.service.d.ts +3 -1
- package/dist/dispatcher/task-creation.service.d.ts.map +1 -1
- package/dist/dispatcher/task-creation.service.js +30 -4
- package/dist/dispatcher/task-creation.service.js.map +1 -1
- package/dist/dispatcher/task-lifecycle.service.d.ts +4 -2
- package/dist/dispatcher/task-lifecycle.service.d.ts.map +1 -1
- package/dist/dispatcher/task-lifecycle.service.js +78 -8
- package/dist/dispatcher/task-lifecycle.service.js.map +1 -1
- package/dist/dispatcher/task-name.service.d.ts +14 -0
- package/dist/dispatcher/task-name.service.d.ts.map +1 -0
- package/dist/dispatcher/task-name.service.js +80 -0
- package/dist/dispatcher/task-name.service.js.map +1 -0
- package/dist/events/event-types.d.ts +1 -0
- package/dist/events/event-types.d.ts.map +1 -1
- package/dist/notifier/notification-consumer.d.ts +33 -1
- package/dist/notifier/notification-consumer.d.ts.map +1 -1
- package/dist/notifier/notification-consumer.js +235 -11
- package/dist/notifier/notification-consumer.js.map +1 -1
- package/dist/notifier/notifier.service.d.ts +5 -1
- package/dist/notifier/notifier.service.d.ts.map +1 -1
- package/dist/notifier/notifier.service.js +6 -3
- package/dist/notifier/notifier.service.js.map +1 -1
- package/dist/notifier/template.service.d.ts +15 -0
- package/dist/notifier/template.service.d.ts.map +1 -1
- package/dist/notifier/template.service.js +92 -31
- package/dist/notifier/template.service.js.map +1 -1
- package/dist/web/admin/admin-developer.controller.d.ts +2 -2
- package/dist/web/admin/admin-settings.controller.d.ts.map +1 -1
- package/dist/web/admin/admin-settings.controller.js +0 -1
- package/dist/web/admin/admin-settings.controller.js.map +1 -1
- package/dist/web/dashboard.controller.d.ts +1 -1
- package/dist/web/dashboard.controller.d.ts.map +1 -1
- package/dist/web/dashboard.controller.js +12 -4
- package/dist/web/dashboard.controller.js.map +1 -1
- package/dist/web/dashboard.service.d.ts +18 -0
- package/dist/web/dashboard.service.d.ts.map +1 -1
- package/dist/web/dashboard.service.js +81 -11
- package/dist/web/dashboard.service.js.map +1 -1
- package/dist/web/frame-handlers/index.d.ts +2 -0
- package/dist/web/frame-handlers/index.d.ts.map +1 -1
- package/dist/web/frame-handlers/index.js +5 -1
- package/dist/web/frame-handlers/index.js.map +1 -1
- package/dist/web/frame-handlers/progress.handler.d.ts +3 -1
- package/dist/web/frame-handlers/progress.handler.d.ts.map +1 -1
- package/dist/web/frame-handlers/progress.handler.js +22 -3
- package/dist/web/frame-handlers/progress.handler.js.map +1 -1
- package/dist/web/frame-handlers/stage-choice.handler.d.ts +15 -0
- package/dist/web/frame-handlers/stage-choice.handler.d.ts.map +1 -0
- package/dist/web/frame-handlers/stage-choice.handler.js +39 -0
- package/dist/web/frame-handlers/stage-choice.handler.js.map +1 -0
- package/dist/web/frame-handlers/stage-confirm.handler.d.ts.map +1 -1
- package/dist/web/frame-handlers/stage-confirm.handler.js +1 -0
- package/dist/web/frame-handlers/stage-confirm.handler.js.map +1 -1
- package/dist/web/frame-handlers/stage-input.handler.d.ts +15 -0
- package/dist/web/frame-handlers/stage-input.handler.d.ts.map +1 -0
- package/dist/web/frame-handlers/stage-input.handler.js +39 -0
- package/dist/web/frame-handlers/stage-input.handler.js.map +1 -0
- package/dist/web/project.controller.d.ts +2 -4
- package/dist/web/project.controller.d.ts.map +1 -1
- package/dist/web/search.service.d.ts +1 -0
- package/dist/web/search.service.d.ts.map +1 -1
- package/dist/web/search.service.js +6 -6
- package/dist/web/search.service.js.map +1 -1
- package/dist/web/task.controller.d.ts +16 -1
- package/dist/web/task.controller.d.ts.map +1 -1
- package/dist/web/task.controller.js +57 -5
- package/dist/web/task.controller.js.map +1 -1
- package/dist/web/web-event.service.d.ts.map +1 -1
- package/dist/web/web-event.service.js +1 -0
- package/dist/web/web-event.service.js.map +1 -1
- package/dist/web/worker-channel.gateway.d.ts.map +1 -1
- package/dist/web/worker-channel.gateway.js +3 -1
- package/dist/web/worker-channel.gateway.js.map +1 -1
- package/package.json +4 -4
- package/public/assets/{AccessTokensPage-D_A93EkP.js → AccessTokensPage-Yp8IfrfF.js} +1 -1
- package/public/assets/{AdminPage-DnmoRibU.js → AdminPage-CS2HrhOC.js} +1 -1
- package/public/assets/ApiReferencePage-DTinm3RG.js +1 -0
- package/public/assets/{ArchitecturePage-Co5G-15M.js → ArchitecturePage-BpA3PUuf.js} +1 -1
- package/public/assets/{AuditLogPage-DoaVh4un.js → AuditLogPage-B_Qopq3a.js} +2 -2
- package/public/assets/{BindPlatformPage-C2bIjAbT.js → BindPlatformPage-BkV-IfaR.js} +1 -1
- package/public/assets/BotIntegrationPage-DLuRDIam.js +1 -0
- package/public/assets/BotManage-XKHjrA-7.js +6 -0
- package/public/assets/BotSetupPage-Cn40afR9.js +33 -0
- package/public/assets/{ChangelogPage-CazGvq6Y.js → ChangelogPage-ChiapPDH.js} +1 -1
- package/public/assets/{CliReferencePage-tonM0XBs.js → CliReferencePage-3eHb6kRq.js} +1 -1
- package/public/assets/{DeploymentPage-DwifcnIe.js → DeploymentPage-CvT9Pcow.js} +1 -1
- package/public/assets/{DevWorkflowPage-DJddffhm.js → DevWorkflowPage-BLEIbUu1.js} +1 -1
- package/public/assets/{DeveloperManage-DwaEFuLo.js → DeveloperManage-DAJBvmdv.js} +2 -2
- package/public/assets/{DeveloperSetupPage-DA4BHPuG.js → DeveloperSetupPage-BhE83ouS.js} +1 -1
- package/public/assets/{DocsIndexPage-C-FZbN8Z.js → DocsIndexPage-BE_tyO2Q.js} +1 -1
- package/public/assets/{DocsLayout-HdiVoWKl.js → DocsLayout-D1S4KUeB.js} +1 -1
- package/public/assets/{DocsPrimitives-DU41lKXb.js → DocsPrimitives-BQXfZXxZ.js} +1 -1
- package/public/assets/EditProjectPage-BjgRi6kG.js +2 -0
- package/public/assets/{EmptyState-i9jXL5NQ.js → EmptyState-Dlt6FhVC.js} +1 -1
- package/public/assets/EnvVariablesPage-CvcP4GZM.js +24 -0
- package/public/assets/HomePage-uEE3mJNM.js +1 -0
- package/public/assets/{InfoRow-kU23cpPE.js → InfoRow-Db2nisGq.js} +1 -1
- package/public/assets/{InstallationPage-JxXYftV0.js → InstallationPage-kt-du5Rr.js} +2 -2
- package/public/assets/{LandingPage-7--4I0lt.js → LandingPage-2irRMduO.js} +1 -1
- package/public/assets/{LocalDevelopmentPage-B0C1C5Rs.js → LocalDevelopmentPage-7JvSDwD1.js} +1 -1
- package/public/assets/{LoginPage-2Io9O_Q7.js → LoginPage-DDk_X1sv.js} +1 -1
- package/public/assets/{MetricBar-BSwVCFMX.js → MetricBar-BhjbfPOa.js} +1 -1
- package/public/assets/{NotFoundPage-DbO52kqL.js → NotFoundPage-ByRykDvA.js} +1 -1
- package/public/assets/{OnboardingGuide-BeP-StZq.js → OnboardingGuide-CinJRqx5.js} +1 -1
- package/public/assets/{PermissionsPage-BMM-SA8k.js → PermissionsPage-C5RXlztC.js} +1 -1
- package/public/assets/PipelineConfigPage-BSkSRngC.js +22 -0
- package/public/assets/{PipelineEditorPage-CpW1dBVH.js → PipelineEditorPage-BoZ_MVNO.js} +2 -2
- package/public/assets/{ProfilePage-BaDJoNI7.js → ProfilePage-CePUfQDH.js} +1 -1
- package/public/assets/ProjectDetailPage-_DswTp8-.js +7 -0
- package/public/assets/ProjectListPage-fVbDom8_.js +6 -0
- package/public/assets/{PtyTerminal-CEkY7dvk.js → PtyTerminal-Dpk4L7LN.js} +1 -1
- package/public/assets/{QuickAuth-9InsfbSA.js → QuickAuth-BAmZCI4O.js} +1 -1
- package/public/assets/{RemoveMemberConfirmDialog-Do5LW-9Q.js → RemoveMemberConfirmDialog-DYi6BAz2.js} +2 -2
- package/public/assets/{Select-8IQBiBBw.js → Select-DnIOEVCT.js} +1 -1
- package/public/assets/SettingsPage-CwV-t8vo.js +6 -0
- package/public/assets/{Skeleton-B3ZvE5gP.js → Skeleton--qglldqs.js} +1 -1
- package/public/assets/{SkillPage-BhiRgb-S.js → SkillPage-CsXXruJZ.js} +1 -1
- package/public/assets/TaskDetailPage-gOUWMfkb.js +21 -0
- package/public/assets/TaskListPage-vF17zpt2.js +1 -0
- package/public/assets/{TaskStatusBadge-B6mxAWy2.js → TaskStatusBadge-CCh-nmLz.js} +1 -1
- package/public/assets/TerminalHomePage-DXFg88Q9.js +11 -0
- package/public/assets/{TokenManage-CenYPcRv.js → TokenManage-P98_TYIe.js} +1 -1
- package/public/assets/Tooltip-DGoJgM_K.js +1 -0
- package/public/assets/{TotpSetupPage-DQyx573Y.js → TotpSetupPage-D5GUedMd.js} +1 -1
- package/public/assets/WorkerDetailPage-CkI1feoH.js +1 -0
- package/public/assets/{WorkerListPage-_bt8SJDK.js → WorkerListPage-C90v6nLx.js} +2 -2
- package/public/assets/{WorkerOperationsPage-CDat2rGV.js → WorkerOperationsPage-OxH0Ky0Y.js} +1 -1
- package/public/assets/{WorkerSetupGuidePage-CN7fSwA-.js → WorkerSetupGuidePage-DGlgYS82.js} +1 -1
- package/public/assets/{WorkerSetupPage--spDks6s.js → WorkerSetupPage-DJ359PwT.js} +1 -1
- package/public/assets/{arrow-left-CQ-bmyEx.js → arrow-left-BPgCxdEG.js} +1 -1
- package/public/assets/{arrow-right-BOWA0FvU.js → arrow-right-Z-hFp5rr.js} +1 -1
- package/public/assets/{bot-BpTfNKBP.js → bot-B7Bl9J0r.js} +1 -1
- package/public/assets/{chevron-right-D-xhzuZQ.js → chevron-right-D_hyYdgn.js} +1 -1
- package/public/assets/{copy-DXSXnWX4.js → copy-SJf3OFPQ.js} +1 -1
- package/public/assets/{download-FbsyL-QU.js → download-D7rCJJks.js} +1 -1
- package/public/assets/{external-link-CPRFmfE1.js → external-link-BrXLoqUZ.js} +1 -1
- package/public/assets/index-BiItJ2NI.css +1 -0
- package/public/assets/{index-D205WYza.js → index-DPCzKHL-.js} +23 -23
- package/public/assets/{key-Diuh2Udi.js → key-CCF8A0TZ.js} +1 -1
- package/public/assets/{loader-circle-CsopNBbX.js → loader-circle-BO0HYeDT.js} +1 -1
- package/public/assets/{pencil-n52F1Vop.js → pencil-BhxWbYup.js} +1 -1
- package/public/assets/{plus-BHkYD1iG.js → plus-BnJSQWb4.js} +1 -1
- package/public/assets/{rotate-ccw-Bl22woOU.js → rotate-ccw-CioNXT1z.js} +1 -1
- package/public/assets/{scroll-text-DbVWAYzk.js → scroll-text-DpFjChL8.js} +1 -1
- package/public/assets/{settings-0li6vYCf.js → settings-Bklbsj12.js} +1 -1
- package/public/assets/{status-colors-C6o-wKJJ.js → status-colors-BkxgT8vX.js} +1 -1
- package/public/assets/{task-constants-a8NftfbJ.js → task-constants-Ctac6aky.js} +1 -1
- package/public/assets/task-display-J_FNKBLK.js +1 -0
- package/public/assets/{trash-2-LoxvLZVm.js → trash-2-_3SD7t1j.js} +1 -1
- package/public/assets/{useFetch-DIPC8gCD.js → useFetch-D8w38eG7.js} +1 -1
- package/public/assets/{users-BgBBs7IT.js → users-BBjD2TJy.js} +1 -1
- package/public/assets/{wifi-CF0XZj9i.js → wifi-KyET3jRD.js} +1 -1
- package/public/assets/{workflow-DBOppGKP.js → workflow-EN1ACj2x.js} +1 -1
- package/public/index.html +2 -2
- package/public/sw.js +1 -1
- package/dist/common/command-parser.d.ts +0 -29
- package/dist/common/command-parser.d.ts.map +0 -1
- package/dist/common/command-parser.js +0 -133
- package/dist/common/command-parser.js.map +0 -1
- package/dist/common/machine-utils.d.ts +0 -32
- package/dist/common/machine-utils.d.ts.map +0 -1
- package/dist/common/machine-utils.js +0 -12
- package/dist/common/machine-utils.js.map +0 -1
- package/dist/common/worker-utils.d.ts +0 -31
- package/dist/common/worker-utils.d.ts.map +0 -1
- package/dist/common/worker-utils.js +0 -12
- package/dist/common/worker-utils.js.map +0 -1
- package/dist/database/repositories/machine.repository.d.ts +0 -46
- package/dist/database/repositories/machine.repository.d.ts.map +0 -1
- package/dist/database/repositories/machine.repository.js +0 -200
- package/dist/database/repositories/machine.repository.js.map +0 -1
- package/dist/dispatcher/machine-selector.d.ts +0 -18
- package/dist/dispatcher/machine-selector.d.ts.map +0 -1
- package/dist/dispatcher/machine-selector.js +0 -148
- package/dist/dispatcher/machine-selector.js.map +0 -1
- package/dist/web/admin/admin-machine.controller.d.ts +0 -72
- package/dist/web/admin/admin-machine.controller.d.ts.map +0 -1
- package/dist/web/admin/admin-machine.controller.js +0 -176
- package/dist/web/admin/admin-machine.controller.js.map +0 -1
- package/dist/web/machine.controller.d.ts +0 -115
- package/dist/web/machine.controller.d.ts.map +0 -1
- package/dist/web/machine.controller.js +0 -125
- package/dist/web/machine.controller.js.map +0 -1
- package/public/assets/ApiReferencePage-8Fvke3MS.js +0 -1
- package/public/assets/BotIntegrationPage-BgK7NXyQ.js +0 -1
- package/public/assets/BotManage-BlWUAERC.js +0 -6
- package/public/assets/BotSetupPage-BhNhgobr.js +0 -33
- package/public/assets/EditProjectPage-0HfKfeFS.js +0 -2
- package/public/assets/EnvVariablesPage-DofRDtyz.js +0 -1
- package/public/assets/HomePage-Ct5rkEIu.js +0 -1
- package/public/assets/PipelineConfigPage-6KxS3scE.js +0 -28
- package/public/assets/ProjectDetailPage-QjUSwxfS.js +0 -7
- package/public/assets/ProjectListPage-Bs0GPEJb.js +0 -6
- package/public/assets/SettingsPage-DRWkl-_N.js +0 -6
- package/public/assets/TaskDetailPage-vwqcnwqe.js +0 -21
- package/public/assets/TaskListPage-DRiTh03Z.js +0 -1
- package/public/assets/TerminalHomePage-sK-nSIOn.js +0 -11
- package/public/assets/WorkerDetailPage-BV7YTrMb.js +0 -1
- 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":"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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
|