@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,48 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.LoggerService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const pino_1 = __importDefault(require("pino"));
|
|
18
|
+
const sensitive_filter_1 = require("./sensitive-filter");
|
|
19
|
+
let LoggerService = class LoggerService {
|
|
20
|
+
logger;
|
|
21
|
+
constructor() {
|
|
22
|
+
this.logger = (0, pino_1.default)({
|
|
23
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
24
|
+
timestamp: pino_1.default.stdTimeFunctions.isoTime,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
log(message, context) {
|
|
28
|
+
this.logger.info({ context }, (0, sensitive_filter_1.sanitize)(String(message)));
|
|
29
|
+
}
|
|
30
|
+
error(message, trace, context) {
|
|
31
|
+
this.logger.error({ context, trace: trace ? (0, sensitive_filter_1.sanitize)(trace) : undefined }, (0, sensitive_filter_1.sanitize)(String(message)));
|
|
32
|
+
}
|
|
33
|
+
warn(message, context) {
|
|
34
|
+
this.logger.warn({ context }, (0, sensitive_filter_1.sanitize)(String(message)));
|
|
35
|
+
}
|
|
36
|
+
debug(message, context) {
|
|
37
|
+
this.logger.debug({ context }, (0, sensitive_filter_1.sanitize)(String(message)));
|
|
38
|
+
}
|
|
39
|
+
verbose(message, context) {
|
|
40
|
+
this.logger.trace({ context }, (0, sensitive_filter_1.sanitize)(String(message)));
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
exports.LoggerService = LoggerService;
|
|
44
|
+
exports.LoggerService = LoggerService = __decorate([
|
|
45
|
+
(0, common_1.Injectable)(),
|
|
46
|
+
__metadata("design:paramtypes", [])
|
|
47
|
+
], LoggerService);
|
|
48
|
+
//# sourceMappingURL=logger.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../src/common/logger.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAgF;AAChF,gDAAwB;AACxB,yDAA8C;AAGvC,IAAM,aAAa,GAAnB,MAAM,aAAa;IACP,MAAM,CAAc;IAErC;QACE,IAAI,CAAC,MAAM,GAAG,IAAA,cAAI,EAAC;YACjB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;YACtC,SAAS,EAAE,cAAI,CAAC,gBAAgB,CAAC,OAAO;SACzC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,OAAgB,EAAE,OAAgB;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,IAAA,2BAAQ,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAgB,EAAE,KAAc,EAAE,OAAgB;QACtD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAA,2BAAQ,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EACvD,IAAA,2BAAQ,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAC1B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAgB,EAAE,OAAgB;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,IAAA,2BAAQ,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAgB,EAAE,OAAgB;QACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,IAAA,2BAAQ,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,OAAgB,EAAE,OAAgB;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,IAAA,2BAAQ,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF,CAAA;AAhCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;;GACA,aAAa,CAgCzB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PaginatedResult } from '@overlordai/protocol';
|
|
2
|
+
/**
|
|
3
|
+
* Encode an integer id as a base64 cursor string.
|
|
4
|
+
*/
|
|
5
|
+
export declare function encodeCursor(id: number): string;
|
|
6
|
+
/**
|
|
7
|
+
* Decode a base64 cursor string back to an integer id.
|
|
8
|
+
*/
|
|
9
|
+
export declare function decodeCursor(cursor: string): number;
|
|
10
|
+
/**
|
|
11
|
+
* Paginate an array of items using cursor-based pagination.
|
|
12
|
+
*
|
|
13
|
+
* If the number of items exceeds `limit`, the result is sliced to `limit`
|
|
14
|
+
* and `nextCursor` is set from the last included item's id.
|
|
15
|
+
* Otherwise all items are returned with `nextCursor: null`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function paginate<T>(items: T[], limit: number, getId: (item: T) => number): PaginatedResult<T>;
|
|
18
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/common/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GACzB,eAAe,CAAC,CAAC,CAAC,CAapB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.encodeCursor = encodeCursor;
|
|
4
|
+
exports.decodeCursor = decodeCursor;
|
|
5
|
+
exports.paginate = paginate;
|
|
6
|
+
/**
|
|
7
|
+
* Encode an integer id as a base64 cursor string.
|
|
8
|
+
*/
|
|
9
|
+
function encodeCursor(id) {
|
|
10
|
+
return Buffer.from(String(id)).toString('base64');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Decode a base64 cursor string back to an integer id.
|
|
14
|
+
*/
|
|
15
|
+
function decodeCursor(cursor) {
|
|
16
|
+
return parseInt(Buffer.from(cursor, 'base64').toString(), 10);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Paginate an array of items using cursor-based pagination.
|
|
20
|
+
*
|
|
21
|
+
* If the number of items exceeds `limit`, the result is sliced to `limit`
|
|
22
|
+
* and `nextCursor` is set from the last included item's id.
|
|
23
|
+
* Otherwise all items are returned with `nextCursor: null`.
|
|
24
|
+
*/
|
|
25
|
+
function paginate(items, limit, getId) {
|
|
26
|
+
if (items.length > limit) {
|
|
27
|
+
const sliced = items.slice(0, limit);
|
|
28
|
+
const lastItem = sliced[sliced.length - 1];
|
|
29
|
+
return {
|
|
30
|
+
data: sliced,
|
|
31
|
+
nextCursor: encodeCursor(getId(lastItem)),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
data: items,
|
|
36
|
+
nextCursor: null,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/common/pagination.ts"],"names":[],"mappings":";;AAKA,oCAEC;AAKD,oCAEC;AASD,4BAiBC;AAtCD;;GAEG;AACH,SAAgB,YAAY,CAAC,EAAU;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,MAAc;IACzC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,QAAQ,CACtB,KAAU,EACV,KAAa,EACb,KAA0B;IAE1B,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;SAC1C,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
/**
|
|
4
|
+
* Metadata key for rate limit configuration.
|
|
5
|
+
*/
|
|
6
|
+
export declare const RATE_LIMIT_KEY = "rateLimit";
|
|
7
|
+
/**
|
|
8
|
+
* Rate limit configuration for a route or controller.
|
|
9
|
+
*/
|
|
10
|
+
export interface RateLimitConfig {
|
|
11
|
+
/** Maximum number of requests allowed in the window. */
|
|
12
|
+
limit: number;
|
|
13
|
+
/** Window duration in milliseconds. */
|
|
14
|
+
windowMs: number;
|
|
15
|
+
/** If true, rate limit by IP address instead of user ID. */
|
|
16
|
+
byIp?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Decorator to set rate limit configuration on a route or controller.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* @RateLimit({ limit: 5, windowMs: 60_000 })
|
|
23
|
+
* @Post('login')
|
|
24
|
+
* async login() { ... }
|
|
25
|
+
*/
|
|
26
|
+
export declare const RateLimit: (config: RateLimitConfig) => import("@nestjs/common").CustomDecorator<string>;
|
|
27
|
+
/**
|
|
28
|
+
* In-memory sliding-window rate limiter guard.
|
|
29
|
+
*
|
|
30
|
+
* Uses a Map<string, BucketEntry> to track request counts per key.
|
|
31
|
+
* Expired entries are lazily cleaned on access and periodically reaped.
|
|
32
|
+
*
|
|
33
|
+
* Apply to individual routes with @RateLimit({ limit, windowMs }) decorator,
|
|
34
|
+
* or let the default (100/min) apply.
|
|
35
|
+
*/
|
|
36
|
+
export declare class RateLimitGuard implements CanActivate {
|
|
37
|
+
private readonly reflector;
|
|
38
|
+
private readonly buckets;
|
|
39
|
+
private readonly CLEANUP_INTERVAL_MS;
|
|
40
|
+
private cleanupTimer;
|
|
41
|
+
private cleanupCounter;
|
|
42
|
+
constructor(reflector: Reflector);
|
|
43
|
+
canActivate(context: ExecutionContext): boolean;
|
|
44
|
+
private resolveConfig;
|
|
45
|
+
private buildKey;
|
|
46
|
+
private cleanup;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=rate-limit.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.guard.d.ts","sourceRoot":"","sources":["../../src/common/rate-limit.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,gBAAgB,EAIjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;GAEG;AACH,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,QAAQ,eAAe,qDACZ,CAAC;AAatC;;;;;;;;GAQG;AACH,qBACa,cAAe,YAAW,WAAW;IAMpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IALtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAC9C,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,cAAc,CAAK;gBAEE,SAAS,EAAE,SAAS;IASjD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;IAuC/C,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,QAAQ;IA6BhB,OAAO,CAAC,OAAO;CAQhB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
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.RateLimitGuard = exports.RateLimit = exports.RATE_LIMIT_KEY = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const core_1 = require("@nestjs/core");
|
|
15
|
+
/**
|
|
16
|
+
* Metadata key for rate limit configuration.
|
|
17
|
+
*/
|
|
18
|
+
exports.RATE_LIMIT_KEY = 'rateLimit';
|
|
19
|
+
/**
|
|
20
|
+
* Decorator to set rate limit configuration on a route or controller.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* @RateLimit({ limit: 5, windowMs: 60_000 })
|
|
24
|
+
* @Post('login')
|
|
25
|
+
* async login() { ... }
|
|
26
|
+
*/
|
|
27
|
+
const RateLimit = (config) => (0, common_1.SetMetadata)(exports.RATE_LIMIT_KEY, config);
|
|
28
|
+
exports.RateLimit = RateLimit;
|
|
29
|
+
/** Default rate limit: 100 requests per minute. */
|
|
30
|
+
const DEFAULT_RATE_LIMIT = {
|
|
31
|
+
limit: 100,
|
|
32
|
+
windowMs: 60_000,
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* In-memory sliding-window rate limiter guard.
|
|
36
|
+
*
|
|
37
|
+
* Uses a Map<string, BucketEntry> to track request counts per key.
|
|
38
|
+
* Expired entries are lazily cleaned on access and periodically reaped.
|
|
39
|
+
*
|
|
40
|
+
* Apply to individual routes with @RateLimit({ limit, windowMs }) decorator,
|
|
41
|
+
* or let the default (100/min) apply.
|
|
42
|
+
*/
|
|
43
|
+
let RateLimitGuard = class RateLimitGuard {
|
|
44
|
+
reflector;
|
|
45
|
+
buckets = new Map();
|
|
46
|
+
CLEANUP_INTERVAL_MS = 60_000;
|
|
47
|
+
cleanupTimer;
|
|
48
|
+
cleanupCounter = 0;
|
|
49
|
+
constructor(reflector) {
|
|
50
|
+
this.reflector = reflector;
|
|
51
|
+
// Periodic cleanup of expired entries to prevent memory growth
|
|
52
|
+
this.cleanupTimer = setInterval(() => this.cleanup(), this.CLEANUP_INTERVAL_MS);
|
|
53
|
+
// Allow the timer to be unreferenced so it doesn't keep the process alive
|
|
54
|
+
if (this.cleanupTimer.unref) {
|
|
55
|
+
this.cleanupTimer.unref();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
canActivate(context) {
|
|
59
|
+
// Disable rate limiting in test environment
|
|
60
|
+
if (process.env.NODE_ENV === 'test')
|
|
61
|
+
return true;
|
|
62
|
+
const config = this.resolveConfig(context);
|
|
63
|
+
const request = context.switchToHttp().getRequest();
|
|
64
|
+
const key = this.buildKey(context, request, config);
|
|
65
|
+
const now = Date.now();
|
|
66
|
+
const entry = this.buckets.get(key);
|
|
67
|
+
if (!entry || now >= entry.resetAt) {
|
|
68
|
+
// New window
|
|
69
|
+
this.buckets.set(key, { count: 1, resetAt: now + config.windowMs });
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
entry.count++;
|
|
73
|
+
if (entry.count > config.limit) {
|
|
74
|
+
const retryAfterSec = Math.ceil((entry.resetAt - now) / 1000);
|
|
75
|
+
throw new common_1.HttpException({
|
|
76
|
+
statusCode: common_1.HttpStatus.TOO_MANY_REQUESTS,
|
|
77
|
+
message: 'Too many requests',
|
|
78
|
+
retryAfter: retryAfterSec,
|
|
79
|
+
}, common_1.HttpStatus.TOO_MANY_REQUESTS);
|
|
80
|
+
}
|
|
81
|
+
// Periodic inline cleanup to guard against unbounded memory growth
|
|
82
|
+
if (++this.cleanupCounter % 100 === 0) {
|
|
83
|
+
this.cleanup();
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
resolveConfig(context) {
|
|
88
|
+
// Check handler-level first, then class-level, then default
|
|
89
|
+
const handlerConfig = this.reflector.get(exports.RATE_LIMIT_KEY, context.getHandler());
|
|
90
|
+
if (handlerConfig)
|
|
91
|
+
return handlerConfig;
|
|
92
|
+
const classConfig = this.reflector.get(exports.RATE_LIMIT_KEY, context.getClass());
|
|
93
|
+
if (classConfig)
|
|
94
|
+
return classConfig;
|
|
95
|
+
return DEFAULT_RATE_LIMIT;
|
|
96
|
+
}
|
|
97
|
+
buildKey(context, request, config) {
|
|
98
|
+
const route = `${request.method}:${request.route?.path ?? request.path}`;
|
|
99
|
+
if (config.byIp) {
|
|
100
|
+
const ip = request.ip ?? 'unknown';
|
|
101
|
+
return `rl:ip:${ip}:${route}`;
|
|
102
|
+
}
|
|
103
|
+
// Rate limit by authenticated user ID if available, otherwise by IP.
|
|
104
|
+
// NOTE: Since RateLimitGuard runs as APP_GUARD before JwtAuthGuard,
|
|
105
|
+
// request.user is often not yet populated. We intentionally fall back
|
|
106
|
+
// to IP-based limiting rather than attempting to decode an unverified
|
|
107
|
+
// JWT payload, which would be trivially spoofable.
|
|
108
|
+
const user = request.user;
|
|
109
|
+
if (user?.sub) {
|
|
110
|
+
return `rl:user:${user.sub}:${route}`;
|
|
111
|
+
}
|
|
112
|
+
const ip = request.ip ?? 'unknown';
|
|
113
|
+
return `rl:ip:${ip}:${route}`;
|
|
114
|
+
}
|
|
115
|
+
cleanup() {
|
|
116
|
+
const now = Date.now();
|
|
117
|
+
for (const [key, entry] of this.buckets) {
|
|
118
|
+
if (now >= entry.resetAt) {
|
|
119
|
+
this.buckets.delete(key);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
exports.RateLimitGuard = RateLimitGuard;
|
|
125
|
+
exports.RateLimitGuard = RateLimitGuard = __decorate([
|
|
126
|
+
(0, common_1.Injectable)(),
|
|
127
|
+
__metadata("design:paramtypes", [core_1.Reflector])
|
|
128
|
+
], RateLimitGuard);
|
|
129
|
+
//# sourceMappingURL=rate-limit.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.guard.js","sourceRoot":"","sources":["../../src/common/rate-limit.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitize text by replacing all sensitive patterns with a redaction marker.
|
|
3
|
+
* Each pattern from SENSITIVE_PATTERNS is applied in order.
|
|
4
|
+
* Because the patterns use the global flag, we reset lastIndex before each use.
|
|
5
|
+
*/
|
|
6
|
+
export declare function sanitize(text: string): string;
|
|
7
|
+
//# sourceMappingURL=sensitive-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensitive-filter.d.ts","sourceRoot":"","sources":["../../src/common/sensitive-filter.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ7C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sanitize = sanitize;
|
|
4
|
+
const protocol_1 = require("@overlordai/protocol");
|
|
5
|
+
const REDACTED = '***REDACTED***';
|
|
6
|
+
/**
|
|
7
|
+
* Sanitize text by replacing all sensitive patterns with a redaction marker.
|
|
8
|
+
* Each pattern from SENSITIVE_PATTERNS is applied in order.
|
|
9
|
+
* Because the patterns use the global flag, we reset lastIndex before each use.
|
|
10
|
+
*/
|
|
11
|
+
function sanitize(text) {
|
|
12
|
+
let result = text;
|
|
13
|
+
for (const pattern of protocol_1.SENSITIVE_PATTERNS) {
|
|
14
|
+
// Reset lastIndex in case a previous call left it non-zero
|
|
15
|
+
pattern.lastIndex = 0;
|
|
16
|
+
result = result.replace(pattern, REDACTED);
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=sensitive-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensitive-filter.js","sourceRoot":"","sources":["../../src/common/sensitive-filter.ts"],"names":[],"mappings":";;AASA,4BAQC;AAjBD,mDAA0D;AAE1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAElC;;;;GAIG;AACH,SAAgB,QAAQ,CAAC,IAAY;IACnC,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,OAAO,IAAI,6BAAkB,EAAE,CAAC;QACzC,2DAA2D;QAC3D,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.module.d.ts","sourceRoot":"","sources":["../../src/database/database.module.ts"],"names":[],"mappings":"AAGA,qBAKa,cAAc;CAAG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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.DatabaseModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const database_service_1 = require("./database.service");
|
|
12
|
+
let DatabaseModule = class DatabaseModule {
|
|
13
|
+
};
|
|
14
|
+
exports.DatabaseModule = DatabaseModule;
|
|
15
|
+
exports.DatabaseModule = DatabaseModule = __decorate([
|
|
16
|
+
(0, common_1.Global)(),
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
providers: [database_service_1.DatabaseService],
|
|
19
|
+
exports: [database_service_1.DatabaseService],
|
|
20
|
+
})
|
|
21
|
+
], DatabaseModule);
|
|
22
|
+
//# sourceMappingURL=database.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.module.js","sourceRoot":"","sources":["../../src/database/database.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,yDAAqD;AAO9C,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAL1B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,kCAAe,CAAC;QAC5B,OAAO,EAAE,CAAC,kCAAe,CAAC;KAC3B,CAAC;GACW,cAAc,CAAG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import Database from 'better-sqlite3';
|
|
3
|
+
export declare class DatabaseService implements OnModuleInit, OnModuleDestroy {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private db;
|
|
6
|
+
private checkpointInterval;
|
|
7
|
+
onModuleInit(): void;
|
|
8
|
+
getDb(): Database.Database;
|
|
9
|
+
walCheckpoint(): void;
|
|
10
|
+
close(): void;
|
|
11
|
+
onModuleDestroy(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=database.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.service.d.ts","sourceRoot":"","sources":["../../src/database/database.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,eAAe,EACf,YAAY,EACb,MAAM,gBAAgB,CAAC;AAIxB,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,qBACa,eAAgB,YAAW,YAAY,EAAE,eAAe;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,kBAAkB,CAAkC;IAE5D,YAAY,IAAI,IAAI;IA4BpB,KAAK,IAAI,QAAQ,CAAC,QAAQ;IAI1B,aAAa,IAAI,IAAI;IAarB,KAAK,IAAI,IAAI;IAOb,eAAe,IAAI,IAAI;CAKxB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
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;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
var DatabaseService_1;
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.DatabaseService = void 0;
|
|
47
|
+
const common_1 = require("@nestjs/common");
|
|
48
|
+
const fs = __importStar(require("node:fs"));
|
|
49
|
+
const os = __importStar(require("node:os"));
|
|
50
|
+
const path = __importStar(require("node:path"));
|
|
51
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
52
|
+
const migration_runner_1 = require("./migration-runner");
|
|
53
|
+
let DatabaseService = DatabaseService_1 = class DatabaseService {
|
|
54
|
+
logger = new common_1.Logger(DatabaseService_1.name);
|
|
55
|
+
db;
|
|
56
|
+
checkpointInterval;
|
|
57
|
+
onModuleInit() {
|
|
58
|
+
// Default DB path: ~/.overlord/data/overlord.db (works for both monorepo and global install)
|
|
59
|
+
const defaultDbPath = path.join(os.homedir(), '.overlord', 'data', 'overlord.db');
|
|
60
|
+
const dbPath = process.env.DB_PATH || defaultDbPath;
|
|
61
|
+
const dbDir = path.dirname(dbPath);
|
|
62
|
+
if (!fs.existsSync(dbDir)) {
|
|
63
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
this.logger.log(`Opening database at ${dbPath}`);
|
|
66
|
+
this.db = new better_sqlite3_1.default(dbPath);
|
|
67
|
+
this.db.pragma('foreign_keys = ON');
|
|
68
|
+
this.db.pragma('journal_mode = WAL');
|
|
69
|
+
this.db.pragma('busy_timeout = 5000');
|
|
70
|
+
this.db.pragma('synchronous = NORMAL');
|
|
71
|
+
const runner = new migration_runner_1.MigrationRunner();
|
|
72
|
+
runner.run(this.db);
|
|
73
|
+
this.logger.log('Database migrations complete');
|
|
74
|
+
// WAL checkpoint every hour
|
|
75
|
+
this.checkpointInterval = setInterval(() => this.walCheckpoint(), 60 * 60 * 1000);
|
|
76
|
+
}
|
|
77
|
+
getDb() {
|
|
78
|
+
return this.db;
|
|
79
|
+
}
|
|
80
|
+
walCheckpoint() {
|
|
81
|
+
if (!this.db?.open)
|
|
82
|
+
return;
|
|
83
|
+
try {
|
|
84
|
+
this.db.pragma('wal_checkpoint(TRUNCATE)');
|
|
85
|
+
this.logger.log('WAL checkpoint complete');
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
this.logger.error('WAL checkpoint failed', err instanceof Error ? err.stack : String(err));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
close() {
|
|
92
|
+
if (this.db && this.db.open) {
|
|
93
|
+
this.db.close();
|
|
94
|
+
this.logger.log('Database connection closed');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
onModuleDestroy() {
|
|
98
|
+
clearInterval(this.checkpointInterval);
|
|
99
|
+
this.walCheckpoint();
|
|
100
|
+
this.close();
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
exports.DatabaseService = DatabaseService;
|
|
104
|
+
exports.DatabaseService = DatabaseService = DatabaseService_1 = __decorate([
|
|
105
|
+
(0, common_1.Injectable)()
|
|
106
|
+
], DatabaseService);
|
|
107
|
+
//# sourceMappingURL=database.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.service.js","sourceRoot":"","sources":["../../src/database/database.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-runner.d.ts","sourceRoot":"","sources":["../../src/database/migration-runner.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,qBAAa,eAAe;IAC1B,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;CA2DjC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
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.MigrationRunner = void 0;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
class MigrationRunner {
|
|
40
|
+
run(db) {
|
|
41
|
+
db.exec(`
|
|
42
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
43
|
+
version INTEGER PRIMARY KEY,
|
|
44
|
+
filename TEXT NOT NULL,
|
|
45
|
+
applied_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
46
|
+
)
|
|
47
|
+
`);
|
|
48
|
+
// Resolve relative to compiled JS: dist/database/ → ../../database/migrations (package root)
|
|
49
|
+
const migrationsDir = process.env.MIGRATIONS_DIR ||
|
|
50
|
+
path.resolve(__dirname, '..', '..', 'database', 'migrations');
|
|
51
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
52
|
+
throw new Error(`Migrations directory not found: ${migrationsDir}`);
|
|
53
|
+
}
|
|
54
|
+
const files = fs
|
|
55
|
+
.readdirSync(migrationsDir)
|
|
56
|
+
.filter((f) => f.endsWith('.sql'))
|
|
57
|
+
.sort((a, b) => {
|
|
58
|
+
const numA = parseInt(a.split('-')[0], 10);
|
|
59
|
+
const numB = parseInt(b.split('-')[0], 10);
|
|
60
|
+
return numA - numB;
|
|
61
|
+
});
|
|
62
|
+
const applied = new Set(db
|
|
63
|
+
.prepare('SELECT version FROM schema_version')
|
|
64
|
+
.all()
|
|
65
|
+
.map((row) => row.version));
|
|
66
|
+
for (const file of files) {
|
|
67
|
+
const version = parseInt(file.split('-')[0], 10);
|
|
68
|
+
if (applied.has(version)) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const sql = fs.readFileSync(path.join(migrationsDir, file), 'utf-8');
|
|
72
|
+
const runMigration = db.transaction(() => {
|
|
73
|
+
db.exec(sql);
|
|
74
|
+
db.prepare('INSERT INTO schema_version (version, filename) VALUES (?, ?)').run(version, file);
|
|
75
|
+
});
|
|
76
|
+
try {
|
|
77
|
+
runMigration();
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
throw new Error(`Migration ${file} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.MigrationRunner = MigrationRunner;
|
|
86
|
+
//# sourceMappingURL=migration-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-runner.js","sourceRoot":"","sources":["../../src/database/migration-runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4CAA8B;AAC9B,gDAAkC;AAElC,MAAa,eAAe;IAC1B,GAAG,CAAC,EAAqB;QACvB,EAAE,CAAC,IAAI,CAAC;;;;;;KAMP,CAAC,CAAC;QAEH,6FAA6F;QAC7F,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,cAAc;YAC1B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QAEhE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,mCAAmC,aAAa,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,KAAK,GAAG,EAAE;aACb,WAAW,CAAC,aAAa,CAAC;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,OAAO,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC,CAAC;QAEL,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,EAAE;aACC,OAAO,CAAC,oCAAoC,CAAC;aAC7C,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,OAAiB,CAAC,CAC5C,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEjD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAErE,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBACvC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACb,EAAE,CAAC,OAAO,CACR,8DAA8D,CAC/D,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,YAAY,EAAE,CAAC;YACjB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAChF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA5DD,0CA4DC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PaginatedResult } from '@overlordai/protocol';
|
|
2
|
+
import { DatabaseService } from '../database.service';
|
|
3
|
+
export interface AuditLogEntry {
|
|
4
|
+
id: number;
|
|
5
|
+
userId: number | null;
|
|
6
|
+
action: string;
|
|
7
|
+
resource: string;
|
|
8
|
+
detail: string | null;
|
|
9
|
+
ip: string | null;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class AuditLogRepository {
|
|
13
|
+
private readonly database;
|
|
14
|
+
constructor(database: DatabaseService);
|
|
15
|
+
create(data: {
|
|
16
|
+
userId?: number;
|
|
17
|
+
action: string;
|
|
18
|
+
resource: string;
|
|
19
|
+
detail?: string;
|
|
20
|
+
ip?: string;
|
|
21
|
+
}): AuditLogEntry;
|
|
22
|
+
listPaginated(query: {
|
|
23
|
+
limit?: number;
|
|
24
|
+
cursor?: string;
|
|
25
|
+
userId?: number;
|
|
26
|
+
action?: string;
|
|
27
|
+
}): PaginatedResult<AuditLogEntry>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=audit-log.repository.d.ts.map
|