@next-open-ai/openclawx 0.6.6
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/README.md +523 -0
- package/apps/desktop/README.md +210 -0
- package/apps/desktop/renderer/dist/assets/index-CYkSfhcp.css +10 -0
- package/apps/desktop/renderer/dist/assets/index-FI6O25Ms.js +89 -0
- package/apps/desktop/renderer/dist/index.html +22 -0
- package/dist/cli/cli.d.ts +2 -0
- package/dist/cli/cli.js +198 -0
- package/dist/cli/service.d.ts +13 -0
- package/dist/cli/service.js +243 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +5 -0
- package/dist/core/agent/agent-dir.d.ts +14 -0
- package/dist/core/agent/agent-dir.js +75 -0
- package/dist/core/agent/agent-manager.d.ts +64 -0
- package/dist/core/agent/agent-manager.js +278 -0
- package/dist/core/agent/config-manager.d.ts +25 -0
- package/dist/core/agent/config-manager.js +84 -0
- package/dist/core/agent/run.d.ts +26 -0
- package/dist/core/agent/run.js +65 -0
- package/dist/core/agent/skills.d.ts +20 -0
- package/dist/core/agent/skills.js +86 -0
- package/dist/core/config/desktop-config.d.ts +90 -0
- package/dist/core/config/desktop-config.js +521 -0
- package/dist/core/config/provider-support-default.d.ts +21 -0
- package/dist/core/config/provider-support-default.js +57 -0
- package/dist/core/installer/index.d.ts +1 -0
- package/dist/core/installer/index.js +1 -0
- package/dist/core/installer/skill-installer.d.ts +39 -0
- package/dist/core/installer/skill-installer.js +215 -0
- package/dist/core/mcp/adapter.d.ts +17 -0
- package/dist/core/mcp/adapter.js +49 -0
- package/dist/core/mcp/client.d.ts +24 -0
- package/dist/core/mcp/client.js +70 -0
- package/dist/core/mcp/config.d.ts +22 -0
- package/dist/core/mcp/config.js +69 -0
- package/dist/core/mcp/index.d.ts +18 -0
- package/dist/core/mcp/index.js +20 -0
- package/dist/core/mcp/operator.d.ts +15 -0
- package/dist/core/mcp/operator.js +72 -0
- package/dist/core/mcp/transport/index.d.ts +11 -0
- package/dist/core/mcp/transport/index.js +16 -0
- package/dist/core/mcp/transport/sse.d.ts +20 -0
- package/dist/core/mcp/transport/sse.js +82 -0
- package/dist/core/mcp/transport/stdio.d.ts +32 -0
- package/dist/core/mcp/transport/stdio.js +132 -0
- package/dist/core/mcp/types.d.ts +72 -0
- package/dist/core/mcp/types.js +5 -0
- package/dist/core/memory/build-summary.d.ts +6 -0
- package/dist/core/memory/build-summary.js +27 -0
- package/dist/core/memory/compaction-extension.d.ts +6 -0
- package/dist/core/memory/compaction-extension.js +23 -0
- package/dist/core/memory/embedding.d.ts +4 -0
- package/dist/core/memory/embedding.js +15 -0
- package/dist/core/memory/index.d.ts +29 -0
- package/dist/core/memory/index.js +70 -0
- package/dist/core/memory/remote-embedding.d.ts +10 -0
- package/dist/core/memory/remote-embedding.js +36 -0
- package/dist/core/memory/types.d.ts +16 -0
- package/dist/core/memory/types.js +1 -0
- package/dist/core/memory/vector-store.d.ts +15 -0
- package/dist/core/memory/vector-store.js +65 -0
- package/dist/core/tools/bookmark-tool.d.ts +9 -0
- package/dist/core/tools/bookmark-tool.js +118 -0
- package/dist/core/tools/browser-tool.d.ts +10 -0
- package/dist/core/tools/browser-tool.js +362 -0
- package/dist/core/tools/index.d.ts +4 -0
- package/dist/core/tools/index.js +4 -0
- package/dist/core/tools/install-skill-tool.d.ts +6 -0
- package/dist/core/tools/install-skill-tool.js +53 -0
- package/dist/core/tools/save-experience-tool.d.ts +5 -0
- package/dist/core/tools/save-experience-tool.js +54 -0
- package/dist/gateway/auth-hooks.d.ts +17 -0
- package/dist/gateway/auth-hooks.js +19 -0
- package/dist/gateway/backend-url.d.ts +2 -0
- package/dist/gateway/backend-url.js +11 -0
- package/dist/gateway/channel-handler.d.ts +6 -0
- package/dist/gateway/channel-handler.js +3 -0
- package/dist/gateway/clients.d.ts +5 -0
- package/dist/gateway/clients.js +4 -0
- package/dist/gateway/connection-handler.d.ts +6 -0
- package/dist/gateway/connection-handler.js +48 -0
- package/dist/gateway/index.d.ts +3 -0
- package/dist/gateway/index.js +2 -0
- package/dist/gateway/message-handler.d.ts +5 -0
- package/dist/gateway/message-handler.js +65 -0
- package/dist/gateway/methods/agent-cancel.d.ts +10 -0
- package/dist/gateway/methods/agent-cancel.js +17 -0
- package/dist/gateway/methods/agent-chat.d.ts +8 -0
- package/dist/gateway/methods/agent-chat.js +148 -0
- package/dist/gateway/methods/connect.d.ts +9 -0
- package/dist/gateway/methods/connect.js +18 -0
- package/dist/gateway/methods/install-skill-from-path.d.ts +13 -0
- package/dist/gateway/methods/install-skill-from-path.js +15 -0
- package/dist/gateway/methods/install-skill-from-upload.d.ts +14 -0
- package/dist/gateway/methods/install-skill-from-upload.js +13 -0
- package/dist/gateway/methods/run-scheduled-task.d.ts +15 -0
- package/dist/gateway/methods/run-scheduled-task.js +127 -0
- package/dist/gateway/paths.d.ts +20 -0
- package/dist/gateway/paths.js +19 -0
- package/dist/gateway/server.d.ts +8 -0
- package/dist/gateway/server.js +190 -0
- package/dist/gateway/sse-handler.d.ts +6 -0
- package/dist/gateway/sse-handler.js +3 -0
- package/dist/gateway/types.d.ts +90 -0
- package/dist/gateway/types.js +1 -0
- package/dist/gateway/utils.d.ts +22 -0
- package/dist/gateway/utils.js +67 -0
- package/dist/gateway/voice-handler.d.ts +12 -0
- package/dist/gateway/voice-handler.js +18 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/server/agent-config/agent-config.controller.d.ts +30 -0
- package/dist/server/agent-config/agent-config.controller.js +83 -0
- package/dist/server/agent-config/agent-config.module.d.ts +2 -0
- package/dist/server/agent-config/agent-config.module.js +19 -0
- package/dist/server/agent-config/agent-config.service.d.ts +53 -0
- package/dist/server/agent-config/agent-config.service.js +213 -0
- package/dist/server/agents/agents.controller.d.ts +41 -0
- package/dist/server/agents/agents.controller.js +118 -0
- package/dist/server/agents/agents.gateway.d.ts +21 -0
- package/dist/server/agents/agents.gateway.js +103 -0
- package/dist/server/agents/agents.module.d.ts +2 -0
- package/dist/server/agents/agents.module.js +20 -0
- package/dist/server/agents/agents.service.d.ts +63 -0
- package/dist/server/agents/agents.service.js +169 -0
- package/dist/server/app.module.d.ts +2 -0
- package/dist/server/app.module.js +38 -0
- package/dist/server/auth/auth.controller.d.ts +20 -0
- package/dist/server/auth/auth.controller.js +64 -0
- package/dist/server/auth/auth.module.d.ts +2 -0
- package/dist/server/auth/auth.module.js +19 -0
- package/dist/server/bootstrap.d.ts +15 -0
- package/dist/server/bootstrap.js +38 -0
- package/dist/server/config/config.controller.d.ts +73 -0
- package/dist/server/config/config.controller.js +95 -0
- package/dist/server/config/config.module.d.ts +2 -0
- package/dist/server/config/config.module.js +21 -0
- package/dist/server/config/config.service.d.ts +82 -0
- package/dist/server/config/config.service.js +123 -0
- package/dist/server/database/database.module.d.ts +2 -0
- package/dist/server/database/database.module.js +18 -0
- package/dist/server/database/database.service.d.ts +26 -0
- package/dist/server/database/database.service.js +253 -0
- package/dist/server/main.d.ts +1 -0
- package/dist/server/main.js +9 -0
- package/dist/server/saved-items/saved-items.controller.d.ts +57 -0
- package/dist/server/saved-items/saved-items.controller.js +229 -0
- package/dist/server/saved-items/saved-items.module.d.ts +2 -0
- package/dist/server/saved-items/saved-items.module.js +25 -0
- package/dist/server/saved-items/saved-items.service.d.ts +31 -0
- package/dist/server/saved-items/saved-items.service.js +105 -0
- package/dist/server/saved-items/tags.controller.d.ts +30 -0
- package/dist/server/saved-items/tags.controller.js +85 -0
- package/dist/server/saved-items/tags.service.d.ts +24 -0
- package/dist/server/saved-items/tags.service.js +84 -0
- package/dist/server/skills/skills.controller.d.ts +63 -0
- package/dist/server/skills/skills.controller.js +194 -0
- package/dist/server/skills/skills.module.d.ts +2 -0
- package/dist/server/skills/skills.module.js +22 -0
- package/dist/server/skills/skills.service.d.ts +65 -0
- package/dist/server/skills/skills.service.js +388 -0
- package/dist/server/tasks/tasks.controller.d.ts +52 -0
- package/dist/server/tasks/tasks.controller.js +163 -0
- package/dist/server/tasks/tasks.module.d.ts +2 -0
- package/dist/server/tasks/tasks.module.js +23 -0
- package/dist/server/tasks/tasks.service.d.ts +86 -0
- package/dist/server/tasks/tasks.service.js +327 -0
- package/dist/server/usage/usage.controller.d.ts +12 -0
- package/dist/server/usage/usage.controller.js +46 -0
- package/dist/server/usage/usage.module.d.ts +2 -0
- package/dist/server/usage/usage.module.js +19 -0
- package/dist/server/usage/usage.service.d.ts +21 -0
- package/dist/server/usage/usage.service.js +55 -0
- package/dist/server/users/users.controller.d.ts +35 -0
- package/dist/server/users/users.controller.js +69 -0
- package/dist/server/users/users.module.d.ts +2 -0
- package/dist/server/users/users.module.js +19 -0
- package/dist/server/users/users.service.d.ts +39 -0
- package/dist/server/users/users.service.js +140 -0
- package/dist/server/workspace/workspace.controller.d.ts +24 -0
- package/dist/server/workspace/workspace.controller.js +132 -0
- package/dist/server/workspace/workspace.module.d.ts +2 -0
- package/dist/server/workspace/workspace.module.js +21 -0
- package/dist/server/workspace/workspace.service.d.ts +36 -0
- package/dist/server/workspace/workspace.service.js +142 -0
- package/package.json +90 -0
- package/skills/agent-browser/SKILL.md +207 -0
- package/skills/agent-browser/references/authentication.md +202 -0
- package/skills/agent-browser/references/commands.md +259 -0
- package/skills/agent-browser/references/proxy-support.md +188 -0
- package/skills/agent-browser/references/session-management.md +193 -0
- package/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/skills/agent-browser/references/video-recording.md +173 -0
- package/skills/agent-browser/templates/authenticated-session.sh +97 -0
- package/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/skills/agent-browser/templates/form-automation.sh +62 -0
- package/skills/find-skills/SKILL.md +140 -0
- package/skills/url-bookmark/SKILL.md +36 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import { DatabaseService } from '../database/database.service.js';
|
|
3
|
+
import { AgentsService } from '../agents/agents.service.js';
|
|
4
|
+
import { ConfigService } from '../config/config.service.js';
|
|
5
|
+
import { UsageService } from '../usage/usage.service.js';
|
|
6
|
+
export type ScheduleType = 'once' | 'cron';
|
|
7
|
+
export interface RepeatRule {
|
|
8
|
+
type: 'daily' | 'weekdays' | 'weekends' | 'weekly' | 'monthly';
|
|
9
|
+
time: string;
|
|
10
|
+
days?: number[];
|
|
11
|
+
dayOfMonth?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ScheduledTask {
|
|
14
|
+
id: string;
|
|
15
|
+
workspace: string;
|
|
16
|
+
message: string;
|
|
17
|
+
scheduleType: ScheduleType;
|
|
18
|
+
runAt?: number;
|
|
19
|
+
cronExpr?: string;
|
|
20
|
+
repeatRuleJson?: string;
|
|
21
|
+
enabled: boolean;
|
|
22
|
+
lastRunAt?: number;
|
|
23
|
+
createdAt: number;
|
|
24
|
+
updatedAt: number;
|
|
25
|
+
}
|
|
26
|
+
export type TaskExecutionStatus = 'success' | 'failed';
|
|
27
|
+
export interface TaskExecution {
|
|
28
|
+
id: string;
|
|
29
|
+
taskId: string;
|
|
30
|
+
ranAt: number;
|
|
31
|
+
status: TaskExecutionStatus;
|
|
32
|
+
sessionId?: string;
|
|
33
|
+
userMessage: string;
|
|
34
|
+
assistantContent?: string;
|
|
35
|
+
errorMessage?: string;
|
|
36
|
+
createdAt: number;
|
|
37
|
+
}
|
|
38
|
+
/** 将 repeatRule 转为 cron 表达式 */
|
|
39
|
+
export declare function repeatRuleToCron(rule: RepeatRule): string;
|
|
40
|
+
export declare class TasksService implements OnModuleInit, OnModuleDestroy {
|
|
41
|
+
private readonly db;
|
|
42
|
+
private readonly agentsService;
|
|
43
|
+
private readonly configService;
|
|
44
|
+
private readonly usageService;
|
|
45
|
+
private tickTimer;
|
|
46
|
+
private readonly TICK_MS;
|
|
47
|
+
/** 正在执行中的 task id,避免同一任务在两次 tick 中并发执行 */
|
|
48
|
+
private runningTaskIds;
|
|
49
|
+
constructor(db: DatabaseService, agentsService: AgentsService, configService: ConfigService, usageService: UsageService);
|
|
50
|
+
onModuleInit(): void;
|
|
51
|
+
onModuleDestroy(): void;
|
|
52
|
+
private rowToTask;
|
|
53
|
+
list(): ScheduledTask[];
|
|
54
|
+
get(id: string): ScheduledTask | null;
|
|
55
|
+
private rowToExecution;
|
|
56
|
+
addExecution(params: {
|
|
57
|
+
taskId: string;
|
|
58
|
+
ranAt: number;
|
|
59
|
+
status: TaskExecutionStatus;
|
|
60
|
+
sessionId?: string;
|
|
61
|
+
userMessage: string;
|
|
62
|
+
assistantContent?: string;
|
|
63
|
+
errorMessage?: string;
|
|
64
|
+
}): TaskExecution;
|
|
65
|
+
listExecutions(taskId: string): TaskExecution[];
|
|
66
|
+
getExecution(id: string): TaskExecution | null;
|
|
67
|
+
/** 删除指定任务的全部执行记录,返回删除条数 */
|
|
68
|
+
deleteExecutionsByTaskId(taskId: string): number;
|
|
69
|
+
create(params: {
|
|
70
|
+
workspace: string;
|
|
71
|
+
message: string;
|
|
72
|
+
scheduleType: ScheduleType;
|
|
73
|
+
runAt?: number;
|
|
74
|
+
cronExpr?: string;
|
|
75
|
+
repeatRule?: RepeatRule;
|
|
76
|
+
}): ScheduledTask;
|
|
77
|
+
update(id: string, updates: Partial<Pick<ScheduledTask, 'message' | 'enabled' | 'scheduleType' | 'runAt' | 'cronExpr' | 'repeatRuleJson'>>): ScheduledTask | null;
|
|
78
|
+
delete(id: string): boolean;
|
|
79
|
+
/** 获取当前应执行的任务 */
|
|
80
|
+
getDueTasks(at: Date): ScheduledTask[];
|
|
81
|
+
/** 仅更新 last_run_at,不关单次任务。用于「开始执行」时立即占位,避免下一分钟 tick 重复触发同一任务。 */
|
|
82
|
+
markRunStarted(id: string): void;
|
|
83
|
+
markRan(id: string): void;
|
|
84
|
+
/** 每分钟触发:拉取到点任务,创建会话、写用户消息、请求 Gateway 执行,写执行记录,再 markRan */
|
|
85
|
+
private tick;
|
|
86
|
+
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Injectable } from '@nestjs/common';
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
import { Cron } from 'croner';
|
|
13
|
+
import { DatabaseService } from '../database/database.service.js';
|
|
14
|
+
import { AgentsService } from '../agents/agents.service.js';
|
|
15
|
+
import { ConfigService } from '../config/config.service.js';
|
|
16
|
+
import { UsageService } from '../usage/usage.service.js';
|
|
17
|
+
/** 将 repeatRule 转为 cron 表达式 */
|
|
18
|
+
export function repeatRuleToCron(rule) {
|
|
19
|
+
const [h, m] = rule.time.split(':').map(Number);
|
|
20
|
+
const minute = m ?? 0;
|
|
21
|
+
const hour = h ?? 9;
|
|
22
|
+
const timePart = `${minute} ${hour} * *`;
|
|
23
|
+
switch (rule.type) {
|
|
24
|
+
case 'daily':
|
|
25
|
+
return `${minute} ${hour} * * *`;
|
|
26
|
+
case 'weekdays':
|
|
27
|
+
return `${minute} ${hour} * * 1-5`;
|
|
28
|
+
case 'weekends':
|
|
29
|
+
return `${minute} ${hour} * * 0,6`;
|
|
30
|
+
case 'weekly':
|
|
31
|
+
if (rule.days?.length) {
|
|
32
|
+
return `${minute} ${hour} * * ${rule.days.sort((a, b) => a - b).join(',')}`;
|
|
33
|
+
}
|
|
34
|
+
return `${minute} ${hour} * * *`;
|
|
35
|
+
case 'monthly': {
|
|
36
|
+
const day = Math.min(rule.dayOfMonth ?? 1, 31);
|
|
37
|
+
return `${minute} ${hour} ${day} * *`;
|
|
38
|
+
}
|
|
39
|
+
default:
|
|
40
|
+
return `${minute} ${hour} * * *`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
let TasksService = class TasksService {
|
|
44
|
+
db;
|
|
45
|
+
agentsService;
|
|
46
|
+
configService;
|
|
47
|
+
usageService;
|
|
48
|
+
tickTimer = null;
|
|
49
|
+
TICK_MS = 60 * 1000;
|
|
50
|
+
/** 正在执行中的 task id,避免同一任务在两次 tick 中并发执行 */
|
|
51
|
+
runningTaskIds = new Set();
|
|
52
|
+
constructor(db, agentsService, configService, usageService) {
|
|
53
|
+
this.db = db;
|
|
54
|
+
this.agentsService = agentsService;
|
|
55
|
+
this.configService = configService;
|
|
56
|
+
this.usageService = usageService;
|
|
57
|
+
}
|
|
58
|
+
onModuleInit() {
|
|
59
|
+
this.tickTimer = setInterval(() => this.tick(), this.TICK_MS);
|
|
60
|
+
}
|
|
61
|
+
onModuleDestroy() {
|
|
62
|
+
if (this.tickTimer) {
|
|
63
|
+
clearInterval(this.tickTimer);
|
|
64
|
+
this.tickTimer = null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
rowToTask(r) {
|
|
68
|
+
return {
|
|
69
|
+
id: r.id,
|
|
70
|
+
workspace: r.workspace,
|
|
71
|
+
message: r.message,
|
|
72
|
+
scheduleType: r.schedule_type,
|
|
73
|
+
runAt: r.run_at ?? undefined,
|
|
74
|
+
cronExpr: r.cron_expr ?? undefined,
|
|
75
|
+
repeatRuleJson: r.repeat_rule_json ?? undefined,
|
|
76
|
+
enabled: r.enabled === 1,
|
|
77
|
+
lastRunAt: r.last_run_at ?? undefined,
|
|
78
|
+
createdAt: r.created_at,
|
|
79
|
+
updatedAt: r.updated_at,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
list() {
|
|
83
|
+
const rows = this.db.all('SELECT * FROM scheduled_tasks ORDER BY created_at DESC');
|
|
84
|
+
return rows.map((r) => this.rowToTask(r));
|
|
85
|
+
}
|
|
86
|
+
get(id) {
|
|
87
|
+
const r = this.db.get('SELECT * FROM scheduled_tasks WHERE id = ?', [id]);
|
|
88
|
+
return r ? this.rowToTask(r) : null;
|
|
89
|
+
}
|
|
90
|
+
rowToExecution(r) {
|
|
91
|
+
return {
|
|
92
|
+
id: r.id,
|
|
93
|
+
taskId: r.task_id,
|
|
94
|
+
ranAt: r.ran_at,
|
|
95
|
+
status: r.status,
|
|
96
|
+
sessionId: r.session_id ?? undefined,
|
|
97
|
+
userMessage: r.user_message,
|
|
98
|
+
assistantContent: r.assistant_content ?? undefined,
|
|
99
|
+
errorMessage: r.error_message ?? undefined,
|
|
100
|
+
createdAt: r.created_at,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
addExecution(params) {
|
|
104
|
+
const id = randomUUID();
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
this.db.run(`INSERT INTO scheduled_task_executions (id, task_id, ran_at, status, session_id, user_message, assistant_content, error_message, created_at)
|
|
107
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
108
|
+
id,
|
|
109
|
+
params.taskId,
|
|
110
|
+
params.ranAt,
|
|
111
|
+
params.status,
|
|
112
|
+
params.sessionId ?? null,
|
|
113
|
+
params.userMessage,
|
|
114
|
+
params.assistantContent ?? null,
|
|
115
|
+
params.errorMessage ?? null,
|
|
116
|
+
now,
|
|
117
|
+
]);
|
|
118
|
+
return this.getExecution(id);
|
|
119
|
+
}
|
|
120
|
+
listExecutions(taskId) {
|
|
121
|
+
const rows = this.db.all('SELECT * FROM scheduled_task_executions WHERE task_id = ? ORDER BY ran_at DESC', [taskId]);
|
|
122
|
+
return rows.map((r) => this.rowToExecution(r));
|
|
123
|
+
}
|
|
124
|
+
getExecution(id) {
|
|
125
|
+
const r = this.db.get('SELECT * FROM scheduled_task_executions WHERE id = ?', [id]);
|
|
126
|
+
return r ? this.rowToExecution(r) : null;
|
|
127
|
+
}
|
|
128
|
+
/** 删除指定任务的全部执行记录,返回删除条数 */
|
|
129
|
+
deleteExecutionsByTaskId(taskId) {
|
|
130
|
+
const result = this.db.run('DELETE FROM scheduled_task_executions WHERE task_id = ?', [taskId]);
|
|
131
|
+
return result.changes;
|
|
132
|
+
}
|
|
133
|
+
create(params) {
|
|
134
|
+
const id = randomUUID();
|
|
135
|
+
const now = Date.now();
|
|
136
|
+
let cronExpr = params.cronExpr ?? null;
|
|
137
|
+
let runAt = params.runAt ?? null;
|
|
138
|
+
if (params.scheduleType === 'cron' && params.repeatRule && !cronExpr) {
|
|
139
|
+
cronExpr = repeatRuleToCron(params.repeatRule);
|
|
140
|
+
}
|
|
141
|
+
const repeatRuleJson = params.repeatRule
|
|
142
|
+
? JSON.stringify(params.repeatRule)
|
|
143
|
+
: null;
|
|
144
|
+
this.db.run(`INSERT INTO scheduled_tasks (id, workspace, message, schedule_type, run_at, cron_expr, repeat_rule_json, enabled, last_run_at, created_at, updated_at)
|
|
145
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 1, NULL, ?, ?)`, [
|
|
146
|
+
id,
|
|
147
|
+
params.workspace,
|
|
148
|
+
params.message,
|
|
149
|
+
params.scheduleType,
|
|
150
|
+
runAt,
|
|
151
|
+
cronExpr,
|
|
152
|
+
repeatRuleJson,
|
|
153
|
+
now,
|
|
154
|
+
now,
|
|
155
|
+
]);
|
|
156
|
+
const task = this.get(id);
|
|
157
|
+
return task;
|
|
158
|
+
}
|
|
159
|
+
update(id, updates) {
|
|
160
|
+
const task = this.get(id);
|
|
161
|
+
if (!task)
|
|
162
|
+
return null;
|
|
163
|
+
const now = Date.now();
|
|
164
|
+
const message = updates.message ?? task.message;
|
|
165
|
+
const enabled = updates.enabled !== undefined ? (updates.enabled ? 1 : 0) : (task.enabled ? 1 : 0);
|
|
166
|
+
const scheduleType = (updates.scheduleType ?? task.scheduleType);
|
|
167
|
+
const runAt = scheduleType === 'once'
|
|
168
|
+
? (updates.runAt ?? task.runAt ?? null)
|
|
169
|
+
: null;
|
|
170
|
+
const cronExpr = scheduleType === 'cron'
|
|
171
|
+
? (updates.cronExpr ?? task.cronExpr ?? null)
|
|
172
|
+
: null;
|
|
173
|
+
const repeatRuleJson = scheduleType === 'cron'
|
|
174
|
+
? (updates.repeatRuleJson ?? task.repeatRuleJson ?? null)
|
|
175
|
+
: null;
|
|
176
|
+
this.db.run(`UPDATE scheduled_tasks SET message = ?, enabled = ?, schedule_type = ?, run_at = ?, cron_expr = ?, repeat_rule_json = ?, updated_at = ? WHERE id = ?`, [message, enabled, scheduleType, runAt, cronExpr, repeatRuleJson, now, id]);
|
|
177
|
+
return this.get(id);
|
|
178
|
+
}
|
|
179
|
+
delete(id) {
|
|
180
|
+
const result = this.db.run('DELETE FROM scheduled_tasks WHERE id = ?', [id]);
|
|
181
|
+
return result.changes > 0;
|
|
182
|
+
}
|
|
183
|
+
/** 获取当前应执行的任务 */
|
|
184
|
+
getDueTasks(at) {
|
|
185
|
+
const atMs = at.getTime();
|
|
186
|
+
const rows = this.db.all('SELECT * FROM scheduled_tasks WHERE enabled = 1');
|
|
187
|
+
const due = [];
|
|
188
|
+
for (const r of rows) {
|
|
189
|
+
const task = this.rowToTask(r);
|
|
190
|
+
if (task.scheduleType === 'once') {
|
|
191
|
+
// 单次:到点且尚未执行过(markRunStarted 会设 last_run_at,避免重复触发)
|
|
192
|
+
if (task.runAt != null && task.runAt <= atMs && task.lastRunAt == null) {
|
|
193
|
+
due.push(task);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if (task.cronExpr) {
|
|
197
|
+
try {
|
|
198
|
+
const cron = new Cron(task.cronExpr);
|
|
199
|
+
const ref = new Date(atMs - 2 * this.TICK_MS);
|
|
200
|
+
const next = cron.nextRun(ref);
|
|
201
|
+
const nextMs = next?.getTime();
|
|
202
|
+
// 仅当「本周期」尚未执行过才加入;且要求触发点已到(nextMs <= atMs),避免把下一分钟算进当前
|
|
203
|
+
const notYetRunForThisOccurrence = task.lastRunAt == null || (nextMs != null && task.lastRunAt < nextMs);
|
|
204
|
+
const scheduledTimeHasPassed = nextMs != null && nextMs <= atMs;
|
|
205
|
+
const inCurrentTickWindow = nextMs != null && nextMs >= atMs - this.TICK_MS;
|
|
206
|
+
if (scheduledTimeHasPassed && inCurrentTickWindow && notYetRunForThisOccurrence) {
|
|
207
|
+
due.push(task);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// invalid cron, skip
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return due;
|
|
216
|
+
}
|
|
217
|
+
/** 仅更新 last_run_at,不关单次任务。用于「开始执行」时立即占位,避免下一分钟 tick 重复触发同一任务。 */
|
|
218
|
+
markRunStarted(id) {
|
|
219
|
+
const now = Date.now();
|
|
220
|
+
this.db.run('UPDATE scheduled_tasks SET last_run_at = ?, updated_at = ? WHERE id = ?', [now, now, id]);
|
|
221
|
+
}
|
|
222
|
+
markRan(id) {
|
|
223
|
+
const now = Date.now();
|
|
224
|
+
const task = this.get(id);
|
|
225
|
+
if (!task)
|
|
226
|
+
return;
|
|
227
|
+
if (task.scheduleType === 'once') {
|
|
228
|
+
this.db.run('UPDATE scheduled_tasks SET last_run_at = ?, enabled = 0, updated_at = ? WHERE id = ?', [now, now, id]);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
this.db.run('UPDATE scheduled_tasks SET last_run_at = ?, updated_at = ? WHERE id = ?', [now, now, id]);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/** 每分钟触发:拉取到点任务,创建会话、写用户消息、请求 Gateway 执行,写执行记录,再 markRan */
|
|
235
|
+
async tick() {
|
|
236
|
+
const now = new Date();
|
|
237
|
+
const nowMs = now.getTime();
|
|
238
|
+
const due = this.getDueTasks(now);
|
|
239
|
+
if (due.length === 0)
|
|
240
|
+
return;
|
|
241
|
+
const config = await this.configService.getConfig();
|
|
242
|
+
const gatewayBase = config.gatewayUrl.replace(/^ws:/, 'http:').replace(/^wss:/, 'https:');
|
|
243
|
+
for (const task of due) {
|
|
244
|
+
if (this.runningTaskIds.has(task.id))
|
|
245
|
+
continue;
|
|
246
|
+
this.runningTaskIds.add(task.id);
|
|
247
|
+
const fixedSessionId = `scheduled-${task.id}`;
|
|
248
|
+
// 立即更新 last_run_at,避免执行期间下一分钟 tick 再次把本任务判为 due 导致重复请求
|
|
249
|
+
this.markRunStarted(task.id);
|
|
250
|
+
try {
|
|
251
|
+
const session = await this.agentsService.getOrCreateSession(fixedSessionId, {
|
|
252
|
+
agentId: task.workspace,
|
|
253
|
+
workspace: task.workspace,
|
|
254
|
+
title: `定时: ${task.message.slice(0, 30)}${task.message.length > 30 ? '…' : ''}`,
|
|
255
|
+
type: 'scheduled',
|
|
256
|
+
});
|
|
257
|
+
this.agentsService.appendMessage(session.id, 'user', task.message);
|
|
258
|
+
// Agent 可能执行很久(如浏览器操作),需放宽超时,否则 undici 会报 HeadersTimeoutError
|
|
259
|
+
const runTimeoutMs = 10 * 60 * 1000; // 10 分钟
|
|
260
|
+
const res = await fetch(`${gatewayBase}/run-scheduled-task`, {
|
|
261
|
+
method: 'POST',
|
|
262
|
+
headers: { 'Content-Type': 'application/json' },
|
|
263
|
+
body: JSON.stringify({
|
|
264
|
+
sessionId: fixedSessionId,
|
|
265
|
+
message: task.message,
|
|
266
|
+
agentId: session.agentId ?? task.workspace,
|
|
267
|
+
workspace: task.workspace,
|
|
268
|
+
taskId: task.id,
|
|
269
|
+
backendBaseUrl: `http://localhost:${process.env.PORT || 38081}`,
|
|
270
|
+
}),
|
|
271
|
+
signal: AbortSignal.timeout(runTimeoutMs),
|
|
272
|
+
});
|
|
273
|
+
const body = await res.json().catch(() => ({}));
|
|
274
|
+
const assistantContent = body.assistantContent ?? '';
|
|
275
|
+
const ok = res.ok && body.success !== false;
|
|
276
|
+
if (ok && body.usage && (body.usage.promptTokens > 0 || body.usage.completionTokens > 0)) {
|
|
277
|
+
this.usageService.recordUsage({
|
|
278
|
+
sessionId: fixedSessionId,
|
|
279
|
+
source: 'scheduled_task',
|
|
280
|
+
taskId: task.id,
|
|
281
|
+
promptTokens: body.usage.promptTokens ?? 0,
|
|
282
|
+
completionTokens: body.usage.completionTokens ?? 0,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
const execution = this.addExecution({
|
|
286
|
+
taskId: task.id,
|
|
287
|
+
ranAt: nowMs,
|
|
288
|
+
status: ok ? 'success' : 'failed',
|
|
289
|
+
sessionId: fixedSessionId,
|
|
290
|
+
userMessage: task.message,
|
|
291
|
+
assistantContent: ok ? assistantContent : undefined,
|
|
292
|
+
errorMessage: ok ? undefined : (body.error || `HTTP ${res.status}`),
|
|
293
|
+
});
|
|
294
|
+
if (ok) {
|
|
295
|
+
console.log(`[Tasks] 任务执行完成: ${task.id} (执行记录 ${execution.id})`);
|
|
296
|
+
this.markRan(task.id);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
console.error(`[Tasks] run-scheduled-task failed for ${task.id}: ${body.error || res.status}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch (e) {
|
|
303
|
+
const errMsg = e?.message ?? String(e);
|
|
304
|
+
this.addExecution({
|
|
305
|
+
taskId: task.id,
|
|
306
|
+
ranAt: nowMs,
|
|
307
|
+
status: 'failed',
|
|
308
|
+
sessionId: fixedSessionId,
|
|
309
|
+
userMessage: task.message,
|
|
310
|
+
errorMessage: errMsg,
|
|
311
|
+
});
|
|
312
|
+
console.error(`[Tasks] tick task ${task.id} error:`, e);
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
this.runningTaskIds.delete(task.id);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
TasksService = __decorate([
|
|
321
|
+
Injectable(),
|
|
322
|
+
__metadata("design:paramtypes", [DatabaseService,
|
|
323
|
+
AgentsService,
|
|
324
|
+
ConfigService,
|
|
325
|
+
UsageService])
|
|
326
|
+
], TasksService);
|
|
327
|
+
export { TasksService };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { UsageService, RecordTokenUsageDto, TokenUsageTotal } from './usage.service.js';
|
|
2
|
+
export declare class UsageController {
|
|
3
|
+
private readonly usageService;
|
|
4
|
+
constructor(usageService: UsageService);
|
|
5
|
+
record(dto: RecordTokenUsageDto): {
|
|
6
|
+
success: boolean;
|
|
7
|
+
};
|
|
8
|
+
getTotal(): {
|
|
9
|
+
success: boolean;
|
|
10
|
+
data: TokenUsageTotal;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { Controller, Get, Post, Body } from '@nestjs/common';
|
|
14
|
+
import { UsageService } from './usage.service.js';
|
|
15
|
+
let UsageController = class UsageController {
|
|
16
|
+
usageService;
|
|
17
|
+
constructor(usageService) {
|
|
18
|
+
this.usageService = usageService;
|
|
19
|
+
}
|
|
20
|
+
record(dto) {
|
|
21
|
+
this.usageService.recordUsage(dto);
|
|
22
|
+
return { success: true };
|
|
23
|
+
}
|
|
24
|
+
getTotal() {
|
|
25
|
+
const data = this.usageService.getTotal();
|
|
26
|
+
return { success: true, data };
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
__decorate([
|
|
30
|
+
Post(),
|
|
31
|
+
__param(0, Body()),
|
|
32
|
+
__metadata("design:type", Function),
|
|
33
|
+
__metadata("design:paramtypes", [Object]),
|
|
34
|
+
__metadata("design:returntype", Object)
|
|
35
|
+
], UsageController.prototype, "record", null);
|
|
36
|
+
__decorate([
|
|
37
|
+
Get('total'),
|
|
38
|
+
__metadata("design:type", Function),
|
|
39
|
+
__metadata("design:paramtypes", []),
|
|
40
|
+
__metadata("design:returntype", Object)
|
|
41
|
+
], UsageController.prototype, "getTotal", null);
|
|
42
|
+
UsageController = __decorate([
|
|
43
|
+
Controller('usage'),
|
|
44
|
+
__metadata("design:paramtypes", [UsageService])
|
|
45
|
+
], UsageController);
|
|
46
|
+
export { UsageController };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Module } from '@nestjs/common';
|
|
8
|
+
import { UsageService } from './usage.service.js';
|
|
9
|
+
import { UsageController } from './usage.controller.js';
|
|
10
|
+
let UsageModule = class UsageModule {
|
|
11
|
+
};
|
|
12
|
+
UsageModule = __decorate([
|
|
13
|
+
Module({
|
|
14
|
+
controllers: [UsageController],
|
|
15
|
+
providers: [UsageService],
|
|
16
|
+
exports: [UsageService],
|
|
17
|
+
})
|
|
18
|
+
], UsageModule);
|
|
19
|
+
export { UsageModule };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DatabaseService } from '../database/database.service.js';
|
|
2
|
+
export type TokenUsageSource = 'chat' | 'scheduled_task';
|
|
3
|
+
export interface RecordTokenUsageDto {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
source: TokenUsageSource;
|
|
6
|
+
taskId?: string;
|
|
7
|
+
executionId?: string;
|
|
8
|
+
promptTokens: number;
|
|
9
|
+
completionTokens: number;
|
|
10
|
+
}
|
|
11
|
+
export interface TokenUsageTotal {
|
|
12
|
+
totalPromptTokens: number;
|
|
13
|
+
totalCompletionTokens: number;
|
|
14
|
+
totalTokens: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class UsageService {
|
|
17
|
+
private readonly db;
|
|
18
|
+
constructor(db: DatabaseService);
|
|
19
|
+
recordUsage(dto: RecordTokenUsageDto): void;
|
|
20
|
+
getTotal(): TokenUsageTotal;
|
|
21
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Injectable } from '@nestjs/common';
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
import { DatabaseService } from '../database/database.service.js';
|
|
13
|
+
let UsageService = class UsageService {
|
|
14
|
+
db;
|
|
15
|
+
constructor(db) {
|
|
16
|
+
this.db = db;
|
|
17
|
+
}
|
|
18
|
+
recordUsage(dto) {
|
|
19
|
+
const total = (dto.promptTokens || 0) + (dto.completionTokens || 0);
|
|
20
|
+
if (total <= 0)
|
|
21
|
+
return;
|
|
22
|
+
this.db.run(`INSERT INTO token_usage (id, session_id, source, task_id, execution_id, prompt_tokens, completion_tokens, total_tokens, created_at)
|
|
23
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
24
|
+
randomUUID(),
|
|
25
|
+
dto.sessionId,
|
|
26
|
+
dto.source,
|
|
27
|
+
dto.taskId ?? null,
|
|
28
|
+
dto.executionId ?? null,
|
|
29
|
+
dto.promptTokens ?? 0,
|
|
30
|
+
dto.completionTokens ?? 0,
|
|
31
|
+
total,
|
|
32
|
+
Date.now(),
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
getTotal() {
|
|
36
|
+
const row = this.db.get(`SELECT
|
|
37
|
+
COALESCE(SUM(prompt_tokens), 0) AS total_prompt,
|
|
38
|
+
COALESCE(SUM(completion_tokens), 0) AS total_completion,
|
|
39
|
+
COALESCE(SUM(total_tokens), 0) AS total_tokens
|
|
40
|
+
FROM token_usage`);
|
|
41
|
+
if (!row) {
|
|
42
|
+
return { totalPromptTokens: 0, totalCompletionTokens: 0, totalTokens: 0 };
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
totalPromptTokens: row.total_prompt,
|
|
46
|
+
totalCompletionTokens: row.total_completion,
|
|
47
|
+
totalTokens: row.total_tokens,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
UsageService = __decorate([
|
|
52
|
+
Injectable(),
|
|
53
|
+
__metadata("design:paramtypes", [DatabaseService])
|
|
54
|
+
], UsageService);
|
|
55
|
+
export { UsageService };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { UsersService } from './users.service.js';
|
|
2
|
+
export declare class UsersController {
|
|
3
|
+
private readonly usersService;
|
|
4
|
+
constructor(usersService: UsersService);
|
|
5
|
+
list(): Promise<{
|
|
6
|
+
success: boolean;
|
|
7
|
+
data: {
|
|
8
|
+
id: string;
|
|
9
|
+
username: string;
|
|
10
|
+
}[];
|
|
11
|
+
}>;
|
|
12
|
+
create(body: {
|
|
13
|
+
username: string;
|
|
14
|
+
password: string;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
success: boolean;
|
|
17
|
+
data: {
|
|
18
|
+
id: string;
|
|
19
|
+
username: string;
|
|
20
|
+
};
|
|
21
|
+
}>;
|
|
22
|
+
update(id: string, body: {
|
|
23
|
+
username?: string;
|
|
24
|
+
password?: string;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
success: boolean;
|
|
27
|
+
data: {
|
|
28
|
+
id: string;
|
|
29
|
+
username: string;
|
|
30
|
+
};
|
|
31
|
+
}>;
|
|
32
|
+
delete(id: string): Promise<{
|
|
33
|
+
success: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { Controller, Get, Post, Put, Delete, Body, Param } from '@nestjs/common';
|
|
14
|
+
import { UsersService } from './users.service.js';
|
|
15
|
+
let UsersController = class UsersController {
|
|
16
|
+
usersService;
|
|
17
|
+
constructor(usersService) {
|
|
18
|
+
this.usersService = usersService;
|
|
19
|
+
}
|
|
20
|
+
async list() {
|
|
21
|
+
const users = await this.usersService.list();
|
|
22
|
+
return { success: true, data: users };
|
|
23
|
+
}
|
|
24
|
+
async create(body) {
|
|
25
|
+
const user = await this.usersService.create(body.username ?? '', body.password ?? '');
|
|
26
|
+
return { success: true, data: user };
|
|
27
|
+
}
|
|
28
|
+
async update(id, body) {
|
|
29
|
+
const user = await this.usersService.update(id, body);
|
|
30
|
+
return { success: true, data: user };
|
|
31
|
+
}
|
|
32
|
+
async delete(id) {
|
|
33
|
+
await this.usersService.delete(id);
|
|
34
|
+
return { success: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
__decorate([
|
|
38
|
+
Get(),
|
|
39
|
+
__metadata("design:type", Function),
|
|
40
|
+
__metadata("design:paramtypes", []),
|
|
41
|
+
__metadata("design:returntype", Promise)
|
|
42
|
+
], UsersController.prototype, "list", null);
|
|
43
|
+
__decorate([
|
|
44
|
+
Post(),
|
|
45
|
+
__param(0, Body()),
|
|
46
|
+
__metadata("design:type", Function),
|
|
47
|
+
__metadata("design:paramtypes", [Object]),
|
|
48
|
+
__metadata("design:returntype", Promise)
|
|
49
|
+
], UsersController.prototype, "create", null);
|
|
50
|
+
__decorate([
|
|
51
|
+
Put(':id'),
|
|
52
|
+
__param(0, Param('id')),
|
|
53
|
+
__param(1, Body()),
|
|
54
|
+
__metadata("design:type", Function),
|
|
55
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
56
|
+
__metadata("design:returntype", Promise)
|
|
57
|
+
], UsersController.prototype, "update", null);
|
|
58
|
+
__decorate([
|
|
59
|
+
Delete(':id'),
|
|
60
|
+
__param(0, Param('id')),
|
|
61
|
+
__metadata("design:type", Function),
|
|
62
|
+
__metadata("design:paramtypes", [String]),
|
|
63
|
+
__metadata("design:returntype", Promise)
|
|
64
|
+
], UsersController.prototype, "delete", null);
|
|
65
|
+
UsersController = __decorate([
|
|
66
|
+
Controller('users'),
|
|
67
|
+
__metadata("design:paramtypes", [UsersService])
|
|
68
|
+
], UsersController);
|
|
69
|
+
export { UsersController };
|