feat: implement AI checkpoint and task suggestion UI with approval flow

This commit is contained in:
Roberto Musso
2026-02-24 22:29:09 +01:00
parent 77b94e2b27
commit 5445bb0eec
11 changed files with 278 additions and 26 deletions

View File

@@ -221,6 +221,8 @@ const tasksRouter = router({
priority: tasks.priority,
assignee: tasks.assignee,
dueDate: tasks.dueDate,
isAiSuggested: tasks.isAiSuggested,
isApproved: tasks.isApproved,
createdAt: tasks.createdAt,
projectName: projects.name,
clientName: sql<string | null>`CASE WHEN ${clients.parentId} IS NOT NULL THEN ${parentClients.name} ELSE ${clients.name} END`,
@@ -268,6 +270,8 @@ const tasksRouter = router({
assignees: z.array(z.string()).optional(),
dueDate: z.number().optional(),
projectId: z.string().optional(),
isAiSuggested: z.number().optional(),
isApproved: z.number().optional(),
}))
.mutation(({ input }) => {
const id = crypto.randomUUID();
@@ -281,6 +285,8 @@ const tasksRouter = router({
assignee: input.assignees?.length ? JSON.stringify(input.assignees) : null,
dueDate: input.dueDate ?? null,
projectId: input.projectId ?? null,
isAiSuggested: input.isAiSuggested ?? 0,
isApproved: input.isApproved ?? 1,
createdAt: now,
}).run();
return { id };
@@ -296,6 +302,7 @@ const tasksRouter = router({
assignees: z.array(z.string()).optional(),
dueDate: z.number().optional(),
projectId: z.string().optional(),
isApproved: z.number().optional(),
}))
.mutation(({ input }) => {
const set: Partial<{
@@ -306,6 +313,7 @@ const tasksRouter = router({
assignee: string | null;
dueDate: number | null;
projectId: string | null;
isApproved: number;
}> = {};
if (input.title !== undefined) set.title = input.title;
if (input.description !== undefined) set.description = input.description;
@@ -313,6 +321,7 @@ const tasksRouter = router({
if (input.priority !== undefined) set.priority = input.priority;
if (input.assignees !== undefined) set.assignee = input.assignees.length ? JSON.stringify(input.assignees) : null;
if (input.dueDate !== undefined) set.dueDate = input.dueDate;
if (input.isApproved !== undefined) set.isApproved = input.isApproved;
if (input.projectId !== undefined) set.projectId = input.projectId;
if (Object.keys(set).length > 0) {
getDb().update(tasks).set(set).where(eq(tasks.id, input.id)).run();