mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 00:32:12 +02:00
feat: Add AIAgentTaskLog model, service, and log entry types for AI agent task logging
This commit is contained in:
315
Common/Models/DatabaseModels/AIAgentTaskLog.ts
Normal file
315
Common/Models/DatabaseModels/AIAgentTaskLog.ts
Normal file
@@ -0,0 +1,315 @@
|
||||
import AIAgentTask from "./AIAgentTask";
|
||||
import Project from "./Project";
|
||||
import User from "./User";
|
||||
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
||||
import Route from "../../Types/API/Route";
|
||||
import { PlanType } from "../../Types/Billing/SubscriptionPlan";
|
||||
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
||||
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
||||
import TableBillingAccessControl from "../../Types/Database/AccessControl/TableBillingAccessControl";
|
||||
import ColumnType from "../../Types/Database/ColumnType";
|
||||
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
||||
import TableColumn from "../../Types/Database/TableColumn";
|
||||
import TableColumnType from "../../Types/Database/TableColumnType";
|
||||
import TableMetadata from "../../Types/Database/TableMetadata";
|
||||
import TenantColumn from "../../Types/Database/TenantColumn";
|
||||
import IconProp from "../../Types/Icon/IconProp";
|
||||
import ObjectID from "../../Types/ObjectID";
|
||||
import Permission from "../../Types/Permission";
|
||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
||||
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
||||
import { AIAgentTaskLogEntries } from "../../Types/AI/AIAgentTaskLog";
|
||||
|
||||
@EnableDocumentation()
|
||||
@TableBillingAccessControl({
|
||||
create: PlanType.Growth,
|
||||
read: PlanType.Growth,
|
||||
update: PlanType.Growth,
|
||||
delete: PlanType.Growth,
|
||||
})
|
||||
@TenantColumn("projectId")
|
||||
@CrudApiEndpoint(new Route("/ai-agent-task-log"))
|
||||
@Entity({
|
||||
name: "AIAgentTaskLog",
|
||||
})
|
||||
@TableMetadata({
|
||||
tableName: "AIAgentTaskLog",
|
||||
singularName: "AI Agent Task Log",
|
||||
pluralName: "AI Agent Task Logs",
|
||||
icon: IconProp.Logs,
|
||||
tableDescription:
|
||||
"Logs generated by AI agents during task execution. Contains detailed log entries with severity, timestamp, and messages.",
|
||||
})
|
||||
@TableAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgentTask,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
],
|
||||
delete: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.DeleteProjectAIAgentTask,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditProjectAIAgentTask,
|
||||
],
|
||||
})
|
||||
export default class AIAgentTaskLog extends BaseModel {
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgentTask,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.Entity,
|
||||
required: true,
|
||||
modelType: Project,
|
||||
manyToOneRelationColumn: "projectId",
|
||||
title: "Project",
|
||||
description: "Project this log belongs to.",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return Project;
|
||||
},
|
||||
{
|
||||
cascade: false,
|
||||
eager: false,
|
||||
nullable: false,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "projectId" })
|
||||
public project?: Project = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgentTask,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "Project ID",
|
||||
description: "ID of the project this log belongs to.",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public projectId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgentTask,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.Entity,
|
||||
required: true,
|
||||
modelType: AIAgentTask,
|
||||
manyToOneRelationColumn: "aiAgentTaskId",
|
||||
title: "AI Agent Task",
|
||||
description: "AI Agent Task this log belongs to.",
|
||||
})
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return AIAgentTask;
|
||||
},
|
||||
{
|
||||
cascade: false,
|
||||
eager: false,
|
||||
nullable: false,
|
||||
onDelete: "CASCADE",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "aiAgentTaskId" })
|
||||
public aiAgentTask?: AIAgentTask = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgentTask,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
],
|
||||
update: [],
|
||||
})
|
||||
@Index()
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
required: true,
|
||||
canReadOnRelationQuery: true,
|
||||
title: "AI Agent Task ID",
|
||||
description: "ID of the AI Agent Task this log belongs to.",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: false,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public aiAgentTaskId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.CreateProjectAIAgentTask,
|
||||
],
|
||||
read: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.ReadProjectAIAgentTask,
|
||||
],
|
||||
update: [
|
||||
Permission.ProjectOwner,
|
||||
Permission.ProjectAdmin,
|
||||
Permission.ProjectMember,
|
||||
Permission.EditProjectAIAgentTask,
|
||||
],
|
||||
})
|
||||
@TableColumn({
|
||||
required: false,
|
||||
type: TableColumnType.JSON,
|
||||
title: "Logs",
|
||||
description:
|
||||
"Array of log entries containing severity, timestamp, and message for each log event.",
|
||||
})
|
||||
@Column({
|
||||
nullable: true,
|
||||
type: ColumnType.JSON,
|
||||
})
|
||||
public logs?: AIAgentTaskLogEntries = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({ type: TableColumnType.Entity, modelType: User })
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
cascade: false,
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "deletedByUserId" })
|
||||
public deletedByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Deleted by User ID",
|
||||
description:
|
||||
"User ID who deleted this object (if this object was deleted by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public deletedByUserId?: ObjectID = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({ type: TableColumnType.Entity, modelType: User })
|
||||
@ManyToOne(
|
||||
() => {
|
||||
return User;
|
||||
},
|
||||
{
|
||||
eager: false,
|
||||
nullable: true,
|
||||
onDelete: "SET NULL",
|
||||
orphanedRowAction: "nullify",
|
||||
},
|
||||
)
|
||||
@JoinColumn({ name: "createdByUserId" })
|
||||
public createdByUser?: User = undefined;
|
||||
|
||||
@ColumnAccessControl({
|
||||
create: [],
|
||||
read: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
||||
update: [],
|
||||
})
|
||||
@TableColumn({
|
||||
type: TableColumnType.ObjectID,
|
||||
title: "Created by User ID",
|
||||
description:
|
||||
"User ID who created this object (if this object was created by a User)",
|
||||
})
|
||||
@Column({
|
||||
type: ColumnType.ObjectID,
|
||||
nullable: true,
|
||||
transformer: ObjectID.getDatabaseTransformer(),
|
||||
})
|
||||
public createdByUserId?: ObjectID = undefined;
|
||||
}
|
||||
@@ -76,6 +76,7 @@ import AIAgent from "./AIAgent";
|
||||
import AIAgentOwnerTeam from "./AIAgentOwnerTeam";
|
||||
import AIAgentOwnerUser from "./AIAgentOwnerUser";
|
||||
import AIAgentTask from "./AIAgentTask";
|
||||
import AIAgentTaskLog from "./AIAgentTaskLog";
|
||||
import AIAgentTaskTelemetryException from "./AIAgentTaskTelemetryException";
|
||||
import LlmProvider from "./LlmProvider";
|
||||
import LlmLog from "./LlmLog";
|
||||
@@ -388,6 +389,7 @@ const AllModelTypes: Array<{
|
||||
AIAgentOwnerTeam,
|
||||
AIAgentOwnerUser,
|
||||
AIAgentTask,
|
||||
AIAgentTaskLog,
|
||||
AIAgentTaskTelemetryException,
|
||||
|
||||
LlmProvider,
|
||||
|
||||
10
Common/Server/Services/AIAgentTaskLogService.ts
Normal file
10
Common/Server/Services/AIAgentTaskLogService.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import DatabaseService from "./DatabaseService";
|
||||
import Model from "../../Models/DatabaseModels/AIAgentTaskLog";
|
||||
|
||||
export class Service extends DatabaseService<Model> {
|
||||
public constructor() {
|
||||
super(Model);
|
||||
}
|
||||
}
|
||||
|
||||
export default new Service();
|
||||
@@ -67,6 +67,7 @@ import ProbeService from "./ProbeService";
|
||||
import AIAgentService from "./AIAgentService";
|
||||
import AIAgentOwnerUserService from "./AIAgentOwnerUserService";
|
||||
import AIAgentOwnerTeamService from "./AIAgentOwnerTeamService";
|
||||
import AIAgentTaskLogService from "./AIAgentTaskLogService";
|
||||
import ProjectCallSMSConfigService from "./ProjectCallSMSConfigService";
|
||||
import ProjectService from "./ProjectService";
|
||||
// Project SMTP Config.
|
||||
@@ -247,6 +248,7 @@ const services: Array<BaseService> = [
|
||||
AIAgentService,
|
||||
AIAgentOwnerUserService,
|
||||
AIAgentOwnerTeamService,
|
||||
AIAgentTaskLogService,
|
||||
ProjectSsoService,
|
||||
|
||||
ScheduledMaintenanceCustomFieldService,
|
||||
|
||||
11
Common/Types/AI/AIAgentTaskLog.ts
Normal file
11
Common/Types/AI/AIAgentTaskLog.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import LogSeverity from "../Log/LogSeverity";
|
||||
|
||||
// Individual log entry for AI Agent Task logs
|
||||
export interface AIAgentTaskLogEntry {
|
||||
severity: LogSeverity;
|
||||
logAt: Date;
|
||||
message: string;
|
||||
}
|
||||
|
||||
// Type for the logs array
|
||||
export type AIAgentTaskLogEntries = Array<AIAgentTaskLogEntry>;
|
||||
Reference in New Issue
Block a user