@overlordai/server 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/database/migrations/001-init-schema.sql +226 -0
- package/database/migrations/002-add-indexes.sql +17 -0
- package/database/migrations/003-add-settings-table.sql +4 -0
- package/database/migrations/004-add-developer-id-index.sql +5 -0
- package/dist/adapters/adapter.interface.d.ts +41 -0
- package/dist/adapters/adapter.interface.d.ts.map +1 -0
- package/dist/adapters/adapter.interface.js +6 -0
- package/dist/adapters/adapter.interface.js.map +1 -0
- package/dist/adapters/adapter.module.d.ts +3 -0
- package/dist/adapters/adapter.module.d.ts.map +1 -0
- package/dist/adapters/adapter.module.js +54 -0
- package/dist/adapters/adapter.module.js.map +1 -0
- package/dist/adapters/adapter.registry.d.ts +19 -0
- package/dist/adapters/adapter.registry.d.ts.map +1 -0
- package/dist/adapters/adapter.registry.js +51 -0
- package/dist/adapters/adapter.registry.js.map +1 -0
- package/dist/adapters/lark/lark-card.builder.d.ts +48 -0
- package/dist/adapters/lark/lark-card.builder.d.ts.map +1 -0
- package/dist/adapters/lark/lark-card.builder.js +259 -0
- package/dist/adapters/lark/lark-card.builder.js.map +1 -0
- package/dist/adapters/lark/lark-message.parser.d.ts +51 -0
- package/dist/adapters/lark/lark-message.parser.d.ts.map +1 -0
- package/dist/adapters/lark/lark-message.parser.js +189 -0
- package/dist/adapters/lark/lark-message.parser.js.map +1 -0
- package/dist/adapters/lark/lark-signature.d.ts +13 -0
- package/dist/adapters/lark/lark-signature.d.ts.map +1 -0
- package/dist/adapters/lark/lark-signature.js +58 -0
- package/dist/adapters/lark/lark-signature.js.map +1 -0
- package/dist/adapters/lark/lark.adapter.d.ts +65 -0
- package/dist/adapters/lark/lark.adapter.d.ts.map +1 -0
- package/dist/adapters/lark/lark.adapter.js +565 -0
- package/dist/adapters/lark/lark.adapter.js.map +1 -0
- package/dist/adapters/lark/lark.controller.d.ts +21 -0
- package/dist/adapters/lark/lark.controller.d.ts.map +1 -0
- package/dist/adapters/lark/lark.controller.js +120 -0
- package/dist/adapters/lark/lark.controller.js.map +1 -0
- package/dist/adapters/slack/slack.adapter.d.ts +19 -0
- package/dist/adapters/slack/slack.adapter.d.ts.map +1 -0
- package/dist/adapters/slack/slack.adapter.js +42 -0
- package/dist/adapters/slack/slack.adapter.js.map +1 -0
- package/dist/app.module.d.ts +5 -0
- package/dist/app.module.d.ts.map +1 -0
- package/dist/app.module.js +48 -0
- package/dist/app.module.js.map +1 -0
- package/dist/auth/auth.controller.d.ts +15 -0
- package/dist/auth/auth.controller.d.ts.map +1 -0
- package/dist/auth/auth.controller.js +67 -0
- package/dist/auth/auth.controller.js.map +1 -0
- package/dist/auth/auth.module.d.ts +3 -0
- package/dist/auth/auth.module.d.ts.map +1 -0
- package/dist/auth/auth.module.js +46 -0
- package/dist/auth/auth.module.js.map +1 -0
- package/dist/auth/auth.service.d.ts +62 -0
- package/dist/auth/auth.service.d.ts.map +1 -0
- package/dist/auth/auth.service.js +307 -0
- package/dist/auth/auth.service.js.map +1 -0
- package/dist/auth/decorators/allow-totp-setup.decorator.d.ts +3 -0
- package/dist/auth/decorators/allow-totp-setup.decorator.d.ts.map +1 -0
- package/dist/auth/decorators/allow-totp-setup.decorator.js +8 -0
- package/dist/auth/decorators/allow-totp-setup.decorator.js.map +1 -0
- package/dist/auth/decorators/project-roles.decorator.d.ts +4 -0
- package/dist/auth/decorators/project-roles.decorator.d.ts.map +1 -0
- package/dist/auth/decorators/project-roles.decorator.js +8 -0
- package/dist/auth/decorators/project-roles.decorator.js.map +1 -0
- package/dist/auth/decorators/roles.decorator.d.ts +4 -0
- package/dist/auth/decorators/roles.decorator.d.ts.map +1 -0
- package/dist/auth/decorators/roles.decorator.js +8 -0
- package/dist/auth/decorators/roles.decorator.js.map +1 -0
- package/dist/auth/extract-user.middleware.d.ts +21 -0
- package/dist/auth/extract-user.middleware.d.ts.map +1 -0
- package/dist/auth/extract-user.middleware.js +57 -0
- package/dist/auth/extract-user.middleware.js.map +1 -0
- package/dist/auth/guards/jwt-auth.guard.d.ts +14 -0
- package/dist/auth/guards/jwt-auth.guard.d.ts.map +1 -0
- package/dist/auth/guards/jwt-auth.guard.js +139 -0
- package/dist/auth/guards/jwt-auth.guard.js.map +1 -0
- package/dist/auth/guards/project-role.guard.d.ts +10 -0
- package/dist/auth/guards/project-role.guard.d.ts.map +1 -0
- package/dist/auth/guards/project-role.guard.js +72 -0
- package/dist/auth/guards/project-role.guard.js.map +1 -0
- package/dist/auth/guards/roles.guard.d.ts +8 -0
- package/dist/auth/guards/roles.guard.d.ts.map +1 -0
- package/dist/auth/guards/roles.guard.js +56 -0
- package/dist/auth/guards/roles.guard.js.map +1 -0
- package/dist/auth/jwt.strategy.d.ts +23 -0
- package/dist/auth/jwt.strategy.d.ts.map +1 -0
- package/dist/auth/jwt.strategy.js +49 -0
- package/dist/auth/jwt.strategy.js.map +1 -0
- package/dist/common/crypto.service.d.ts +31 -0
- package/dist/common/crypto.service.d.ts.map +1 -0
- package/dist/common/crypto.service.js +120 -0
- package/dist/common/crypto.service.js.map +1 -0
- package/dist/common/error-filter.d.ts +6 -0
- package/dist/common/error-filter.d.ts.map +1 -0
- package/dist/common/error-filter.js +78 -0
- package/dist/common/error-filter.js.map +1 -0
- package/dist/common/health.controller.d.ts +13 -0
- package/dist/common/health.controller.d.ts.map +1 -0
- package/dist/common/health.controller.js +75 -0
- package/dist/common/health.controller.js.map +1 -0
- package/dist/common/logger.service.d.ts +11 -0
- package/dist/common/logger.service.d.ts.map +1 -0
- package/dist/common/logger.service.js +48 -0
- package/dist/common/logger.service.js.map +1 -0
- package/dist/common/pagination.d.ts +18 -0
- package/dist/common/pagination.d.ts.map +1 -0
- package/dist/common/pagination.js +39 -0
- package/dist/common/pagination.js.map +1 -0
- package/dist/common/rate-limit.guard.d.ts +48 -0
- package/dist/common/rate-limit.guard.d.ts.map +1 -0
- package/dist/common/rate-limit.guard.js +129 -0
- package/dist/common/rate-limit.guard.js.map +1 -0
- package/dist/common/sensitive-filter.d.ts +7 -0
- package/dist/common/sensitive-filter.d.ts.map +1 -0
- package/dist/common/sensitive-filter.js +20 -0
- package/dist/common/sensitive-filter.js.map +1 -0
- package/dist/database/database.module.d.ts +3 -0
- package/dist/database/database.module.d.ts.map +1 -0
- package/dist/database/database.module.js +22 -0
- package/dist/database/database.module.js.map +1 -0
- package/dist/database/database.service.d.ts +13 -0
- package/dist/database/database.service.d.ts.map +1 -0
- package/dist/database/database.service.js +107 -0
- package/dist/database/database.service.js.map +1 -0
- package/dist/database/migration-runner.d.ts +5 -0
- package/dist/database/migration-runner.d.ts.map +1 -0
- package/dist/database/migration-runner.js +86 -0
- package/dist/database/migration-runner.js.map +1 -0
- package/dist/database/repositories/audit-log.repository.d.ts +29 -0
- package/dist/database/repositories/audit-log.repository.d.ts.map +1 -0
- package/dist/database/repositories/audit-log.repository.js +80 -0
- package/dist/database/repositories/audit-log.repository.js.map +1 -0
- package/dist/database/repositories/bot.repository.d.ts +67 -0
- package/dist/database/repositories/bot.repository.d.ts.map +1 -0
- package/dist/database/repositories/bot.repository.js +133 -0
- package/dist/database/repositories/bot.repository.js.map +1 -0
- package/dist/database/repositories/developer-token.repository.d.ts +40 -0
- package/dist/database/repositories/developer-token.repository.d.ts.map +1 -0
- package/dist/database/repositories/developer-token.repository.js +84 -0
- package/dist/database/repositories/developer-token.repository.js.map +1 -0
- package/dist/database/repositories/developer.repository.d.ts +25 -0
- package/dist/database/repositories/developer.repository.d.ts.map +1 -0
- package/dist/database/repositories/developer.repository.js +139 -0
- package/dist/database/repositories/developer.repository.js.map +1 -0
- package/dist/database/repositories/machine.repository.d.ts +39 -0
- package/dist/database/repositories/machine.repository.d.ts.map +1 -0
- package/dist/database/repositories/machine.repository.js +176 -0
- package/dist/database/repositories/machine.repository.js.map +1 -0
- package/dist/database/repositories/notification.repository.d.ts +19 -0
- package/dist/database/repositories/notification.repository.d.ts.map +1 -0
- package/dist/database/repositories/notification.repository.js +94 -0
- package/dist/database/repositories/notification.repository.js.map +1 -0
- package/dist/database/repositories/project-member.repository.d.ts +30 -0
- package/dist/database/repositories/project-member.repository.d.ts.map +1 -0
- package/dist/database/repositories/project-member.repository.js +75 -0
- package/dist/database/repositories/project-member.repository.js.map +1 -0
- package/dist/database/repositories/project.repository.d.ts +24 -0
- package/dist/database/repositories/project.repository.d.ts.map +1 -0
- package/dist/database/repositories/project.repository.js +154 -0
- package/dist/database/repositories/project.repository.js.map +1 -0
- package/dist/database/repositories/session.repository.d.ts +19 -0
- package/dist/database/repositories/session.repository.d.ts.map +1 -0
- package/dist/database/repositories/session.repository.js +117 -0
- package/dist/database/repositories/session.repository.js.map +1 -0
- package/dist/database/repositories/task.repository.d.ts +37 -0
- package/dist/database/repositories/task.repository.d.ts.map +1 -0
- package/dist/database/repositories/task.repository.js +229 -0
- package/dist/database/repositories/task.repository.js.map +1 -0
- package/dist/database/repositories/worker-token.repository.d.ts +20 -0
- package/dist/database/repositories/worker-token.repository.d.ts.map +1 -0
- package/dist/database/repositories/worker-token.repository.js +94 -0
- package/dist/database/repositories/worker-token.repository.js.map +1 -0
- package/dist/database/repositories/workspace.repository.d.ts +19 -0
- package/dist/database/repositories/workspace.repository.d.ts.map +1 -0
- package/dist/database/repositories/workspace.repository.js +82 -0
- package/dist/database/repositories/workspace.repository.js.map +1 -0
- package/dist/dispatcher/capability.service.d.ts +50 -0
- package/dist/dispatcher/capability.service.d.ts.map +1 -0
- package/dist/dispatcher/capability.service.js +159 -0
- package/dist/dispatcher/capability.service.js.map +1 -0
- package/dist/dispatcher/cleanup.service.d.ts +23 -0
- package/dist/dispatcher/cleanup.service.d.ts.map +1 -0
- package/dist/dispatcher/cleanup.service.js +107 -0
- package/dist/dispatcher/cleanup.service.js.map +1 -0
- package/dist/dispatcher/dedup.service.d.ts +48 -0
- package/dist/dispatcher/dedup.service.d.ts.map +1 -0
- package/dist/dispatcher/dedup.service.js +189 -0
- package/dist/dispatcher/dedup.service.js.map +1 -0
- package/dist/dispatcher/dispatcher.module.d.ts +3 -0
- package/dist/dispatcher/dispatcher.module.d.ts.map +1 -0
- package/dist/dispatcher/dispatcher.module.js +76 -0
- package/dist/dispatcher/dispatcher.module.js.map +1 -0
- package/dist/dispatcher/dispatcher.service.d.ts +134 -0
- package/dist/dispatcher/dispatcher.service.d.ts.map +1 -0
- package/dist/dispatcher/dispatcher.service.js +1034 -0
- package/dist/dispatcher/dispatcher.service.js.map +1 -0
- package/dist/dispatcher/heartbeat.service.d.ts +50 -0
- package/dist/dispatcher/heartbeat.service.d.ts.map +1 -0
- package/dist/dispatcher/heartbeat.service.js +154 -0
- package/dist/dispatcher/heartbeat.service.js.map +1 -0
- package/dist/dispatcher/machine-selector.d.ts +18 -0
- package/dist/dispatcher/machine-selector.d.ts.map +1 -0
- package/dist/dispatcher/machine-selector.js +144 -0
- package/dist/dispatcher/machine-selector.js.map +1 -0
- package/dist/dispatcher/pty-relay.service.d.ts +75 -0
- package/dist/dispatcher/pty-relay.service.d.ts.map +1 -0
- package/dist/dispatcher/pty-relay.service.js +404 -0
- package/dist/dispatcher/pty-relay.service.js.map +1 -0
- package/dist/dispatcher/reconciler.d.ts +39 -0
- package/dist/dispatcher/reconciler.d.ts.map +1 -0
- package/dist/dispatcher/reconciler.js +556 -0
- package/dist/dispatcher/reconciler.js.map +1 -0
- package/dist/dispatcher/scheduler.service.d.ts +50 -0
- package/dist/dispatcher/scheduler.service.d.ts.map +1 -0
- package/dist/dispatcher/scheduler.service.js +287 -0
- package/dist/dispatcher/scheduler.service.js.map +1 -0
- package/dist/dispatcher/state-machine.d.ts +16 -0
- package/dist/dispatcher/state-machine.d.ts.map +1 -0
- package/dist/dispatcher/state-machine.js +77 -0
- package/dist/dispatcher/state-machine.js.map +1 -0
- package/dist/dispatcher/task-log-batcher.d.ts +50 -0
- package/dist/dispatcher/task-log-batcher.d.ts.map +1 -0
- package/dist/dispatcher/task-log-batcher.js +184 -0
- package/dist/dispatcher/task-log-batcher.js.map +1 -0
- package/dist/dispatcher/worker-connection.manager.d.ts +49 -0
- package/dist/dispatcher/worker-connection.manager.d.ts.map +1 -0
- package/dist/dispatcher/worker-connection.manager.js +128 -0
- package/dist/dispatcher/worker-connection.manager.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +85 -0
- package/dist/main.js.map +1 -0
- package/dist/notifier/debouncer.d.ts +39 -0
- package/dist/notifier/debouncer.d.ts.map +1 -0
- package/dist/notifier/debouncer.js +123 -0
- package/dist/notifier/debouncer.js.map +1 -0
- package/dist/notifier/notification-consumer.d.ts +88 -0
- package/dist/notifier/notification-consumer.d.ts.map +1 -0
- package/dist/notifier/notification-consumer.js +186 -0
- package/dist/notifier/notification-consumer.js.map +1 -0
- package/dist/notifier/notifier.module.d.ts +9 -0
- package/dist/notifier/notifier.module.d.ts.map +1 -0
- package/dist/notifier/notifier.module.js +58 -0
- package/dist/notifier/notifier.module.js.map +1 -0
- package/dist/notifier/notifier.service.d.ts +40 -0
- package/dist/notifier/notifier.service.d.ts.map +1 -0
- package/dist/notifier/notifier.service.js +191 -0
- package/dist/notifier/notifier.service.js.map +1 -0
- package/dist/notifier/template.service.d.ts +42 -0
- package/dist/notifier/template.service.d.ts.map +1 -0
- package/dist/notifier/template.service.js +201 -0
- package/dist/notifier/template.service.js.map +1 -0
- package/dist/redis/redis.module.d.ts +3 -0
- package/dist/redis/redis.module.d.ts.map +1 -0
- package/dist/redis/redis.module.js +22 -0
- package/dist/redis/redis.module.js.map +1 -0
- package/dist/redis/redis.service.d.ts +19 -0
- package/dist/redis/redis.service.d.ts.map +1 -0
- package/dist/redis/redis.service.js +69 -0
- package/dist/redis/redis.service.js.map +1 -0
- package/dist/web/admin/admin-audit.controller.d.ts +7 -0
- package/dist/web/admin/admin-audit.controller.d.ts.map +1 -0
- package/dist/web/admin/admin-audit.controller.js +53 -0
- package/dist/web/admin/admin-audit.controller.js.map +1 -0
- package/dist/web/admin/admin-bot.controller.d.ts +79 -0
- package/dist/web/admin/admin-bot.controller.d.ts.map +1 -0
- package/dist/web/admin/admin-bot.controller.js +193 -0
- package/dist/web/admin/admin-bot.controller.js.map +1 -0
- package/dist/web/admin/admin-developer.controller.d.ts +52 -0
- package/dist/web/admin/admin-developer.controller.d.ts.map +1 -0
- package/dist/web/admin/admin-developer.controller.js +160 -0
- package/dist/web/admin/admin-developer.controller.js.map +1 -0
- package/dist/web/admin/admin-machine.controller.d.ts +64 -0
- package/dist/web/admin/admin-machine.controller.d.ts.map +1 -0
- package/dist/web/admin/admin-machine.controller.js +111 -0
- package/dist/web/admin/admin-machine.controller.js.map +1 -0
- package/dist/web/admin/admin-project.controller.d.ts +45 -0
- package/dist/web/admin/admin-project.controller.d.ts.map +1 -0
- package/dist/web/admin/admin-project.controller.js +207 -0
- package/dist/web/admin/admin-project.controller.js.map +1 -0
- package/dist/web/admin/admin-settings.controller.d.ts +18 -0
- package/dist/web/admin/admin-settings.controller.d.ts.map +1 -0
- package/dist/web/admin/admin-settings.controller.js +93 -0
- package/dist/web/admin/admin-settings.controller.js.map +1 -0
- package/dist/web/admin/admin-token.controller.d.ts +45 -0
- package/dist/web/admin/admin-token.controller.d.ts.map +1 -0
- package/dist/web/admin/admin-token.controller.js +182 -0
- package/dist/web/admin/admin-token.controller.js.map +1 -0
- package/dist/web/dashboard.controller.d.ts +16 -0
- package/dist/web/dashboard.controller.d.ts.map +1 -0
- package/dist/web/dashboard.controller.js +78 -0
- package/dist/web/dashboard.controller.js.map +1 -0
- package/dist/web/dashboard.service.d.ts +39 -0
- package/dist/web/dashboard.service.d.ts.map +1 -0
- package/dist/web/dashboard.service.js +234 -0
- package/dist/web/dashboard.service.js.map +1 -0
- package/dist/web/interaction.service.d.ts +42 -0
- package/dist/web/interaction.service.d.ts.map +1 -0
- package/dist/web/interaction.service.js +102 -0
- package/dist/web/interaction.service.js.map +1 -0
- package/dist/web/machine.controller.d.ts +102 -0
- package/dist/web/machine.controller.d.ts.map +1 -0
- package/dist/web/machine.controller.js +121 -0
- package/dist/web/machine.controller.js.map +1 -0
- package/dist/web/notification.controller.d.ts +22 -0
- package/dist/web/notification.controller.d.ts.map +1 -0
- package/dist/web/notification.controller.js +70 -0
- package/dist/web/notification.controller.js.map +1 -0
- package/dist/web/profile.controller.d.ts +70 -0
- package/dist/web/profile.controller.d.ts.map +1 -0
- package/dist/web/profile.controller.js +262 -0
- package/dist/web/profile.controller.js.map +1 -0
- package/dist/web/project.controller.d.ts +8 -0
- package/dist/web/project.controller.d.ts.map +1 -0
- package/dist/web/project.controller.js +54 -0
- package/dist/web/project.controller.js.map +1 -0
- package/dist/web/pty.gateway.d.ts +32 -0
- package/dist/web/pty.gateway.d.ts.map +1 -0
- package/dist/web/pty.gateway.js +358 -0
- package/dist/web/pty.gateway.js.map +1 -0
- package/dist/web/search.service.d.ts +34 -0
- package/dist/web/search.service.d.ts.map +1 -0
- package/dist/web/search.service.js +106 -0
- package/dist/web/search.service.js.map +1 -0
- package/dist/web/task.controller.d.ts +54 -0
- package/dist/web/task.controller.d.ts.map +1 -0
- package/dist/web/task.controller.js +266 -0
- package/dist/web/task.controller.js.map +1 -0
- package/dist/web/web.module.d.ts +3 -0
- package/dist/web/web.module.d.ts.map +1 -0
- package/dist/web/web.module.js +97 -0
- package/dist/web/web.module.js.map +1 -0
- package/dist/web/worker-channel.gateway.d.ts +45 -0
- package/dist/web/worker-channel.gateway.d.ts.map +1 -0
- package/dist/web/worker-channel.gateway.js +283 -0
- package/dist/web/worker-channel.gateway.js.map +1 -0
- package/dist/web/worker.controller.d.ts +14 -0
- package/dist/web/worker.controller.d.ts.map +1 -0
- package/dist/web/worker.controller.js +73 -0
- package/dist/web/worker.controller.js.map +1 -0
- package/dist/web/workspace.controller.d.ts +109 -0
- package/dist/web/workspace.controller.d.ts.map +1 -0
- package/dist/web/workspace.controller.js +386 -0
- package/dist/web/workspace.controller.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,259 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.LarkCardBuilder = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const protocol_1 = require("@overlordai/protocol");
|
|
12
|
+
/** Status color mapping for Lark card templates. */
|
|
13
|
+
const STATUS_COLORS = {
|
|
14
|
+
[protocol_1.TaskStatus.QUEUED]: 'grey',
|
|
15
|
+
[protocol_1.TaskStatus.ASSIGNED]: 'blue',
|
|
16
|
+
[protocol_1.TaskStatus.RUNNING]: 'blue',
|
|
17
|
+
[protocol_1.TaskStatus.SUSPENDED]: 'orange',
|
|
18
|
+
[protocol_1.TaskStatus.COMPLETED]: 'green',
|
|
19
|
+
[protocol_1.TaskStatus.FAILED]: 'red',
|
|
20
|
+
[protocol_1.TaskStatus.CANCELLED]: 'grey',
|
|
21
|
+
};
|
|
22
|
+
/** Base URL for web detail links (configurable via env). */
|
|
23
|
+
function getWebBaseUrl() {
|
|
24
|
+
return process.env.OVERLORD_WEB_URL || 'http://localhost:3000';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Builds Lark Interactive Message Cards for task notifications.
|
|
28
|
+
*
|
|
29
|
+
* V1 uses hardcoded templates. Card content is returned as AdapterMessage
|
|
30
|
+
* which LarkAdapter converts into Lark-native card JSON.
|
|
31
|
+
*/
|
|
32
|
+
let LarkCardBuilder = class LarkCardBuilder {
|
|
33
|
+
/**
|
|
34
|
+
* Truncate a description to a maximum length.
|
|
35
|
+
*/
|
|
36
|
+
truncate(text, maxLength = 50) {
|
|
37
|
+
if (text.length <= maxLength)
|
|
38
|
+
return text;
|
|
39
|
+
return text.slice(0, maxLength) + '...';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Build a task status notification card.
|
|
43
|
+
*/
|
|
44
|
+
buildTaskCard(task) {
|
|
45
|
+
const color = STATUS_COLORS[task.status] ?? 'grey';
|
|
46
|
+
const webUrl = `${getWebBaseUrl()}/tasks/${task.id}`;
|
|
47
|
+
const fields = [
|
|
48
|
+
{ label: 'Task', value: `#${task.id}` },
|
|
49
|
+
{ label: 'Description', value: this.truncate(task.description) },
|
|
50
|
+
{ label: 'Status', value: `[${color}] ${task.status}` },
|
|
51
|
+
{ label: 'Project', value: task.projectKey },
|
|
52
|
+
];
|
|
53
|
+
if (task.currentStage) {
|
|
54
|
+
fields.push({ label: 'Stage', value: task.currentStage });
|
|
55
|
+
}
|
|
56
|
+
if (task.mrUrl) {
|
|
57
|
+
fields.push({ label: 'MR/PR', value: task.mrUrl });
|
|
58
|
+
}
|
|
59
|
+
if (task.errorMessage) {
|
|
60
|
+
fields.push({ label: 'Error', value: this.truncate(task.errorMessage, 100) });
|
|
61
|
+
}
|
|
62
|
+
const actions = [
|
|
63
|
+
{ label: 'View Details', url: webUrl },
|
|
64
|
+
];
|
|
65
|
+
return {
|
|
66
|
+
type: 'card',
|
|
67
|
+
card: {
|
|
68
|
+
title: `Task #${task.id} — ${task.status}`,
|
|
69
|
+
fields,
|
|
70
|
+
actions,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Build a dedup confirmation card — shown when a similar task already exists.
|
|
76
|
+
*/
|
|
77
|
+
buildDedupConfirmCard(existingTaskId, description, confirmKey) {
|
|
78
|
+
return {
|
|
79
|
+
type: 'card',
|
|
80
|
+
card: {
|
|
81
|
+
title: 'Duplicate Task Detected',
|
|
82
|
+
fields: [
|
|
83
|
+
{ label: 'Existing Task', value: `#${existingTaskId}` },
|
|
84
|
+
{ label: 'Description', value: this.truncate(description) },
|
|
85
|
+
],
|
|
86
|
+
actions: [
|
|
87
|
+
{
|
|
88
|
+
label: 'Create Anyway',
|
|
89
|
+
value: JSON.stringify({ action: 'confirm', confirmKey }),
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
label: 'Cancel',
|
|
93
|
+
value: JSON.stringify({ action: 'cancel', confirmKey }),
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Build an interactive stage card — confirm mode.
|
|
101
|
+
* Displays prompt + "Continue" / "Cancel" buttons.
|
|
102
|
+
*/
|
|
103
|
+
buildConfirmStageCard(taskId, stageIndex, prompt) {
|
|
104
|
+
return {
|
|
105
|
+
type: 'card',
|
|
106
|
+
card: {
|
|
107
|
+
title: `Task #${taskId} — Confirmation Required`,
|
|
108
|
+
fields: [
|
|
109
|
+
{ label: 'Task', value: `#${taskId}` },
|
|
110
|
+
{ label: 'Prompt', value: prompt },
|
|
111
|
+
],
|
|
112
|
+
actions: [
|
|
113
|
+
{
|
|
114
|
+
label: 'Continue',
|
|
115
|
+
value: JSON.stringify({ taskId, stageIndex, result: 'confirm' }),
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
label: 'Cancel',
|
|
119
|
+
value: JSON.stringify({ taskId, stageIndex, result: 'cancel' }),
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
confirmMode: 'confirm',
|
|
123
|
+
prompt,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Build an interactive stage card — choice mode.
|
|
129
|
+
* Displays prompt + one button per choice option.
|
|
130
|
+
*/
|
|
131
|
+
buildChoiceStageCard(taskId, stageIndex, prompt, choices) {
|
|
132
|
+
const actions = choices.map((choice) => ({
|
|
133
|
+
label: choice.label,
|
|
134
|
+
value: JSON.stringify({ taskId, stageIndex, result: choice.value }),
|
|
135
|
+
}));
|
|
136
|
+
return {
|
|
137
|
+
type: 'card',
|
|
138
|
+
card: {
|
|
139
|
+
title: `Task #${taskId} — Choose an Option`,
|
|
140
|
+
fields: [
|
|
141
|
+
{ label: 'Task', value: `#${taskId}` },
|
|
142
|
+
{ label: 'Prompt', value: prompt },
|
|
143
|
+
],
|
|
144
|
+
actions,
|
|
145
|
+
confirmMode: 'choice',
|
|
146
|
+
choices,
|
|
147
|
+
prompt,
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Build an interactive stage card — input mode.
|
|
153
|
+
* Displays prompt + instruction to reply to the message.
|
|
154
|
+
*/
|
|
155
|
+
buildInputStageCard(taskId, stageIndex, prompt) {
|
|
156
|
+
const webUrl = `${getWebBaseUrl()}/tasks/${taskId}`;
|
|
157
|
+
return {
|
|
158
|
+
type: 'card',
|
|
159
|
+
card: {
|
|
160
|
+
title: `Task #${taskId} — Input Required`,
|
|
161
|
+
fields: [
|
|
162
|
+
{ label: 'Task', value: `#${taskId}` },
|
|
163
|
+
{ label: 'Prompt', value: prompt },
|
|
164
|
+
{
|
|
165
|
+
label: 'Instructions',
|
|
166
|
+
value: 'Please reply to this message with your input.',
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
actions: [
|
|
170
|
+
{ label: 'Enter via Web', url: webUrl },
|
|
171
|
+
],
|
|
172
|
+
confirmMode: 'input',
|
|
173
|
+
prompt,
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Build an "already selected" card to replace an interactive card after a
|
|
179
|
+
* button has been clicked (card action callback response).
|
|
180
|
+
*/
|
|
181
|
+
buildSelectedCard(taskId, selectedLabel) {
|
|
182
|
+
return {
|
|
183
|
+
type: 'card',
|
|
184
|
+
card: {
|
|
185
|
+
title: `Task #${taskId} — Selection Confirmed`,
|
|
186
|
+
fields: [
|
|
187
|
+
{ label: 'Task', value: `#${taskId}` },
|
|
188
|
+
{ label: 'Selected', value: selectedLabel },
|
|
189
|
+
],
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
// Lark-native card JSON converters
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
/**
|
|
197
|
+
* Convert an AdapterMessage into a Lark Interactive Message Card JSON
|
|
198
|
+
* (the `content` field for Lark's send message API).
|
|
199
|
+
*/
|
|
200
|
+
toLarkCardJson(msg) {
|
|
201
|
+
if (msg.type === 'text') {
|
|
202
|
+
return JSON.stringify({ text: msg.text ?? '' });
|
|
203
|
+
}
|
|
204
|
+
const card = msg.card;
|
|
205
|
+
if (!card) {
|
|
206
|
+
return JSON.stringify({ text: '' });
|
|
207
|
+
}
|
|
208
|
+
const elements = [];
|
|
209
|
+
// Fields as a div block
|
|
210
|
+
if (card.fields.length > 0) {
|
|
211
|
+
const fieldElements = card.fields.map((f) => ({
|
|
212
|
+
tag: 'div',
|
|
213
|
+
text: {
|
|
214
|
+
tag: 'lark_md',
|
|
215
|
+
content: `**${f.label}**: ${f.value}`,
|
|
216
|
+
},
|
|
217
|
+
}));
|
|
218
|
+
elements.push(...fieldElements);
|
|
219
|
+
}
|
|
220
|
+
// Horizontal rule before actions
|
|
221
|
+
if (card.actions && card.actions.length > 0) {
|
|
222
|
+
elements.push({ tag: 'hr' });
|
|
223
|
+
const actionElements = card.actions.map((a) => {
|
|
224
|
+
if (a.url) {
|
|
225
|
+
return {
|
|
226
|
+
tag: 'button',
|
|
227
|
+
text: { tag: 'plain_text', content: a.label },
|
|
228
|
+
type: 'primary',
|
|
229
|
+
url: a.url,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
tag: 'button',
|
|
234
|
+
text: { tag: 'plain_text', content: a.label },
|
|
235
|
+
type: 'default',
|
|
236
|
+
value: a.value ? JSON.parse(a.value) : {},
|
|
237
|
+
};
|
|
238
|
+
});
|
|
239
|
+
elements.push({
|
|
240
|
+
tag: 'action',
|
|
241
|
+
actions: actionElements,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
const larkCard = {
|
|
245
|
+
config: { wide_screen_mode: true },
|
|
246
|
+
header: {
|
|
247
|
+
title: { tag: 'plain_text', content: card.title },
|
|
248
|
+
template: 'blue',
|
|
249
|
+
},
|
|
250
|
+
elements,
|
|
251
|
+
};
|
|
252
|
+
return JSON.stringify(larkCard);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
exports.LarkCardBuilder = LarkCardBuilder;
|
|
256
|
+
exports.LarkCardBuilder = LarkCardBuilder = __decorate([
|
|
257
|
+
(0, common_1.Injectable)()
|
|
258
|
+
], LarkCardBuilder);
|
|
259
|
+
//# sourceMappingURL=lark-card.builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lark-card.builder.js","sourceRoot":"","sources":["../../../src/adapters/lark/lark-card.builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { CommandType } from '@overlordai/protocol';
|
|
2
|
+
/**
|
|
3
|
+
* Parsed command extracted from a Lark @bot message.
|
|
4
|
+
*/
|
|
5
|
+
export interface ParsedCommand {
|
|
6
|
+
type: CommandType | 'help';
|
|
7
|
+
args: {
|
|
8
|
+
description?: string;
|
|
9
|
+
project?: string;
|
|
10
|
+
machine?: string;
|
|
11
|
+
taskId?: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parses Lark @bot message text into structured commands.
|
|
16
|
+
*
|
|
17
|
+
* Supported formats:
|
|
18
|
+
* @bot develop "description" --project frontend --on ubuntu-01
|
|
19
|
+
* @bot progress [#42]
|
|
20
|
+
* @bot cancel #42
|
|
21
|
+
* @bot retry #42
|
|
22
|
+
* @bot list
|
|
23
|
+
* @bot workspace #42
|
|
24
|
+
* @bot logs #42
|
|
25
|
+
* @bot confirm #42
|
|
26
|
+
* @bot drain machine-name
|
|
27
|
+
* @bot undrain machine-name
|
|
28
|
+
*/
|
|
29
|
+
export declare class LarkMessageParser {
|
|
30
|
+
/**
|
|
31
|
+
* Parse the text portion of a Lark message after stripping the @bot mention.
|
|
32
|
+
* @param text The raw text after the @bot mention has been removed.
|
|
33
|
+
* @returns Parsed command, or a help command if unrecognised.
|
|
34
|
+
*/
|
|
35
|
+
parse(text: string): ParsedCommand;
|
|
36
|
+
private parseDevelop;
|
|
37
|
+
private parseWithOptionalTaskId;
|
|
38
|
+
private parseWithRequiredTaskId;
|
|
39
|
+
private parseList;
|
|
40
|
+
private parseMachineCommand;
|
|
41
|
+
/**
|
|
42
|
+
* Extract a task ID from tokens. Recognises `#42` or bare `42`.
|
|
43
|
+
*/
|
|
44
|
+
private extractTaskId;
|
|
45
|
+
/**
|
|
46
|
+
* Tokenize input text, respecting single and double-quoted strings.
|
|
47
|
+
* Quotes are stripped from the resulting tokens.
|
|
48
|
+
*/
|
|
49
|
+
private tokenize;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=lark-message.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lark-message.parser.d.ts","sourceRoot":"","sources":["../../../src/adapters/lark/lark-message.parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,IAAI,EAAE;QACJ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;;;;;;;;;;;;;GAcG;AACH,qBACa,iBAAiB;IAC5B;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IA0DlC,OAAO,CAAC,YAAY;IA6CpB,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;;OAGG;IACH,OAAO,CAAC,QAAQ;CAejB"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.LarkMessageParser = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const protocol_1 = require("@overlordai/protocol");
|
|
12
|
+
/**
|
|
13
|
+
* Parses Lark @bot message text into structured commands.
|
|
14
|
+
*
|
|
15
|
+
* Supported formats:
|
|
16
|
+
* @bot develop "description" --project frontend --on ubuntu-01
|
|
17
|
+
* @bot progress [#42]
|
|
18
|
+
* @bot cancel #42
|
|
19
|
+
* @bot retry #42
|
|
20
|
+
* @bot list
|
|
21
|
+
* @bot workspace #42
|
|
22
|
+
* @bot logs #42
|
|
23
|
+
* @bot confirm #42
|
|
24
|
+
* @bot drain machine-name
|
|
25
|
+
* @bot undrain machine-name
|
|
26
|
+
*/
|
|
27
|
+
let LarkMessageParser = class LarkMessageParser {
|
|
28
|
+
/**
|
|
29
|
+
* Parse the text portion of a Lark message after stripping the @bot mention.
|
|
30
|
+
* @param text The raw text after the @bot mention has been removed.
|
|
31
|
+
* @returns Parsed command, or a help command if unrecognised.
|
|
32
|
+
*/
|
|
33
|
+
parse(text) {
|
|
34
|
+
const trimmed = text.trim();
|
|
35
|
+
if (!trimmed) {
|
|
36
|
+
return { type: 'help', args: {} };
|
|
37
|
+
}
|
|
38
|
+
// Split into tokens, but respect quoted strings
|
|
39
|
+
const tokens = this.tokenize(trimmed);
|
|
40
|
+
if (tokens.length === 0) {
|
|
41
|
+
return { type: 'help', args: {} };
|
|
42
|
+
}
|
|
43
|
+
const commandName = tokens[0].toLowerCase();
|
|
44
|
+
switch (commandName) {
|
|
45
|
+
case 'develop':
|
|
46
|
+
case 'dev':
|
|
47
|
+
return this.parseDevelop(tokens.slice(1));
|
|
48
|
+
case 'progress':
|
|
49
|
+
return this.parseWithOptionalTaskId(protocol_1.CommandType.PROGRESS, tokens.slice(1));
|
|
50
|
+
case 'cancel':
|
|
51
|
+
return this.parseWithRequiredTaskId(protocol_1.CommandType.CANCEL, tokens.slice(1));
|
|
52
|
+
case 'retry':
|
|
53
|
+
return this.parseWithRequiredTaskId(protocol_1.CommandType.RETRY, tokens.slice(1));
|
|
54
|
+
case 'list':
|
|
55
|
+
case 'ls':
|
|
56
|
+
return this.parseList(tokens.slice(1));
|
|
57
|
+
case 'workspace':
|
|
58
|
+
case 'ws':
|
|
59
|
+
return this.parseWithRequiredTaskId(protocol_1.CommandType.WORKSPACE, tokens.slice(1));
|
|
60
|
+
case 'logs':
|
|
61
|
+
case 'log':
|
|
62
|
+
return this.parseWithRequiredTaskId(protocol_1.CommandType.LOGS, tokens.slice(1));
|
|
63
|
+
case 'confirm':
|
|
64
|
+
return this.parseWithRequiredTaskId(protocol_1.CommandType.CONFIRM, tokens.slice(1));
|
|
65
|
+
case 'drain':
|
|
66
|
+
return this.parseMachineCommand(protocol_1.CommandType.DRAIN, tokens.slice(1));
|
|
67
|
+
case 'undrain':
|
|
68
|
+
return this.parseMachineCommand(protocol_1.CommandType.UNDRAIN, tokens.slice(1));
|
|
69
|
+
default:
|
|
70
|
+
return { type: 'help', args: {} };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Sub-parsers
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
parseDevelop(tokens) {
|
|
77
|
+
let description;
|
|
78
|
+
let project;
|
|
79
|
+
let machine;
|
|
80
|
+
let i = 0;
|
|
81
|
+
while (i < tokens.length) {
|
|
82
|
+
const token = tokens[i];
|
|
83
|
+
if (token === '--project' || token === '-p') {
|
|
84
|
+
i++;
|
|
85
|
+
project = tokens[i];
|
|
86
|
+
i++;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (token === '--on') {
|
|
90
|
+
i++;
|
|
91
|
+
machine = tokens[i];
|
|
92
|
+
i++;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// First non-flag token is the description
|
|
96
|
+
if (description === undefined) {
|
|
97
|
+
description = token;
|
|
98
|
+
}
|
|
99
|
+
i++;
|
|
100
|
+
}
|
|
101
|
+
if (!description) {
|
|
102
|
+
return { type: 'help', args: {} };
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
type: protocol_1.CommandType.DEVELOP,
|
|
106
|
+
args: {
|
|
107
|
+
description: description.trim(),
|
|
108
|
+
...(project ? { project } : {}),
|
|
109
|
+
...(machine ? { machine } : {}),
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
parseWithOptionalTaskId(type, tokens) {
|
|
114
|
+
const taskId = this.extractTaskId(tokens);
|
|
115
|
+
return {
|
|
116
|
+
type,
|
|
117
|
+
args: taskId !== undefined ? { taskId } : {},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
parseWithRequiredTaskId(type, tokens) {
|
|
121
|
+
const taskId = this.extractTaskId(tokens);
|
|
122
|
+
if (taskId === undefined) {
|
|
123
|
+
return { type: 'help', args: {} };
|
|
124
|
+
}
|
|
125
|
+
return { type, args: { taskId } };
|
|
126
|
+
}
|
|
127
|
+
parseList(tokens) {
|
|
128
|
+
let project;
|
|
129
|
+
let i = 0;
|
|
130
|
+
while (i < tokens.length) {
|
|
131
|
+
const token = tokens[i];
|
|
132
|
+
if (token === '--project' || token === '-p') {
|
|
133
|
+
i++;
|
|
134
|
+
project = tokens[i];
|
|
135
|
+
i++;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
i++;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
type: protocol_1.CommandType.LIST,
|
|
142
|
+
args: project ? { project } : {},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
parseMachineCommand(type, tokens) {
|
|
146
|
+
const machineName = tokens[0];
|
|
147
|
+
if (!machineName) {
|
|
148
|
+
return { type: 'help', args: {} };
|
|
149
|
+
}
|
|
150
|
+
return { type, args: { machine: machineName } };
|
|
151
|
+
}
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// Helpers
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
/**
|
|
156
|
+
* Extract a task ID from tokens. Recognises `#42` or bare `42`.
|
|
157
|
+
*/
|
|
158
|
+
extractTaskId(tokens) {
|
|
159
|
+
for (const token of tokens) {
|
|
160
|
+
const match = /^#?(\d+)$/.exec(token);
|
|
161
|
+
if (match) {
|
|
162
|
+
return parseInt(match[1], 10);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Tokenize input text, respecting single and double-quoted strings.
|
|
169
|
+
* Quotes are stripped from the resulting tokens.
|
|
170
|
+
*/
|
|
171
|
+
tokenize(text) {
|
|
172
|
+
const tokens = [];
|
|
173
|
+
const regex = /(?:"([^"]*)")|(?:'([^']*)')|(\S+)/g;
|
|
174
|
+
let match;
|
|
175
|
+
while ((match = regex.exec(text)) !== null) {
|
|
176
|
+
// match[1] = double-quoted content, match[2] = single-quoted, match[3] = unquoted
|
|
177
|
+
const value = match[1] ?? match[2] ?? match[3];
|
|
178
|
+
if (value !== undefined) {
|
|
179
|
+
tokens.push(value);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return tokens;
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
exports.LarkMessageParser = LarkMessageParser;
|
|
186
|
+
exports.LarkMessageParser = LarkMessageParser = __decorate([
|
|
187
|
+
(0, common_1.Injectable)()
|
|
188
|
+
], LarkMessageParser);
|
|
189
|
+
//# sourceMappingURL=lark-message.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lark-message.parser.js","sourceRoot":"","sources":["../../../src/adapters/lark/lark-message.parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verify a Lark webhook signature using SHA-256.
|
|
3
|
+
*
|
|
4
|
+
* Lark sends:
|
|
5
|
+
* X-Lark-Request-Timestamp
|
|
6
|
+
* X-Lark-Request-Nonce
|
|
7
|
+
* X-Lark-Signature
|
|
8
|
+
*
|
|
9
|
+
* Verification:
|
|
10
|
+
* sha256(timestamp + nonce + app_secret + rawBody)
|
|
11
|
+
*/
|
|
12
|
+
export declare function verifyLarkSignature(timestamp: string, nonce: string, body: string, secret: string, signature: string): boolean;
|
|
13
|
+
//# sourceMappingURL=lark-signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lark-signature.d.ts","sourceRoot":"","sources":["../../../src/adapters/lark/lark-signature.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAOT"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.verifyLarkSignature = verifyLarkSignature;
|
|
37
|
+
const crypto = __importStar(require("node:crypto"));
|
|
38
|
+
/**
|
|
39
|
+
* Verify a Lark webhook signature using SHA-256.
|
|
40
|
+
*
|
|
41
|
+
* Lark sends:
|
|
42
|
+
* X-Lark-Request-Timestamp
|
|
43
|
+
* X-Lark-Request-Nonce
|
|
44
|
+
* X-Lark-Signature
|
|
45
|
+
*
|
|
46
|
+
* Verification:
|
|
47
|
+
* sha256(timestamp + nonce + app_secret + rawBody)
|
|
48
|
+
*/
|
|
49
|
+
function verifyLarkSignature(timestamp, nonce, body, secret, signature) {
|
|
50
|
+
const content = timestamp + nonce + secret + body;
|
|
51
|
+
const hash = crypto.createHash('sha256').update(content).digest('hex');
|
|
52
|
+
const hashBuf = Buffer.from(hash, 'utf-8');
|
|
53
|
+
const sigBuf = Buffer.from(signature, 'utf-8');
|
|
54
|
+
if (hashBuf.length !== sigBuf.length)
|
|
55
|
+
return false;
|
|
56
|
+
return crypto.timingSafeEqual(hashBuf, sigBuf);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=lark-signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lark-signature.js","sourceRoot":"","sources":["../../../src/adapters/lark/lark-signature.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,kDAaC;AA1BD,oDAAsC;AAEtC;;;;;;;;;;GAUG;AACH,SAAgB,mBAAmB,CACjC,SAAiB,EACjB,KAAa,EACb,IAAY,EACZ,MAAc,EACd,SAAiB;IAEjB,MAAM,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Request } from 'express';
|
|
2
|
+
import type { Command, DeveloperPublic } from '@overlordai/protocol';
|
|
3
|
+
import { Platform } from '@overlordai/protocol';
|
|
4
|
+
import type { IMessageAdapter, AdapterMessage } from '../adapter.interface';
|
|
5
|
+
import { AdapterRegistry } from '../adapter.registry';
|
|
6
|
+
import { BotRepository } from '../../database/repositories/bot.repository';
|
|
7
|
+
import { DeveloperRepository } from '../../database/repositories/developer.repository';
|
|
8
|
+
import { RedisService } from '../../redis/redis.service';
|
|
9
|
+
import { DispatcherService } from '../../dispatcher/dispatcher.service';
|
|
10
|
+
import { CryptoService } from '../../common/crypto.service';
|
|
11
|
+
import { LarkMessageParser } from './lark-message.parser';
|
|
12
|
+
import { LarkCardBuilder } from './lark-card.builder';
|
|
13
|
+
/**
|
|
14
|
+
* Lark Adapter — handles Lark webhooks, sends/updates messages,
|
|
15
|
+
* resolves users. Supports multiple bots via app_id routing.
|
|
16
|
+
*/
|
|
17
|
+
export declare class LarkAdapter implements IMessageAdapter {
|
|
18
|
+
private readonly botRepo;
|
|
19
|
+
private readonly developerRepo;
|
|
20
|
+
private readonly redis;
|
|
21
|
+
private readonly parser;
|
|
22
|
+
private readonly cardBuilder;
|
|
23
|
+
private readonly dispatcher;
|
|
24
|
+
private readonly registry;
|
|
25
|
+
private readonly cryptoService;
|
|
26
|
+
readonly platform = Platform.LARK;
|
|
27
|
+
private readonly logger;
|
|
28
|
+
/** Cache of Lark API clients by app_id. */
|
|
29
|
+
private readonly clients;
|
|
30
|
+
constructor(botRepo: BotRepository, developerRepo: DeveloperRepository, redis: RedisService, parser: LarkMessageParser, cardBuilder: LarkCardBuilder, dispatcher: DispatcherService, registry: AdapterRegistry, cryptoService: CryptoService);
|
|
31
|
+
handleWebhook(req: Request): Promise<Command | null>;
|
|
32
|
+
private handleMessage;
|
|
33
|
+
private handleCardAction;
|
|
34
|
+
private handleInputReply;
|
|
35
|
+
sendMessage(chatId: string, content: AdapterMessage, stageIndex?: number): Promise<string>;
|
|
36
|
+
updateMessage(msgId: string, content: AdapterMessage, appId?: string): Promise<void>;
|
|
37
|
+
resolveUser(platformUid: string): Promise<DeveloperPublic | null>;
|
|
38
|
+
storeInputMsgMapping(msgId: string, taskId: number, stageIndex: number): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Extract the command text from a message, stripping the @bot mention.
|
|
41
|
+
* Returns null if the message does not contain a @bot mention.
|
|
42
|
+
*/
|
|
43
|
+
private extractCommandText;
|
|
44
|
+
/**
|
|
45
|
+
* Get or create a Lark API client for the given app_id.
|
|
46
|
+
*/
|
|
47
|
+
private getOrCreateClient;
|
|
48
|
+
/**
|
|
49
|
+
* Resolve an app_id from a bot instance ID (for chat binding lookups).
|
|
50
|
+
*/
|
|
51
|
+
private resolveAppIdFromBinding;
|
|
52
|
+
/**
|
|
53
|
+
* Find any available Lark client for operations that don't have a specific app_id context.
|
|
54
|
+
*/
|
|
55
|
+
private findClientForMessage;
|
|
56
|
+
/**
|
|
57
|
+
* Send a plain text message (internal helper).
|
|
58
|
+
*/
|
|
59
|
+
private sendTextMessage;
|
|
60
|
+
/**
|
|
61
|
+
* Send a help message listing available commands.
|
|
62
|
+
*/
|
|
63
|
+
private sendHelpMessage;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=lark.adapter.d.ts.map
|