feat(plan): frontend startPlanning API + store action + task_kind type

This commit is contained in:
2026-05-28 10:41:24 -04:00
parent b250141e15
commit 1d5f49fe3b
3 changed files with 32 additions and 1 deletions
+16 -1
View File
@@ -2,7 +2,7 @@ import { ref } from "vue";
import { defineStore } from "pinia";
import { apiGet, apiPost, apiPut, apiPatch, apiDelete } from "@/api/client";
import { useToastStore } from "@/stores/toast";
import type { Task, TaskListResponse, TaskStatus, TaskPriority } from "@/types/task";
import type { Task, TaskListResponse, TaskStatus, TaskPriority, StartPlanningResult } from "@/types/task";
export const useTasksStore = defineStore("tasks", () => {
const tasks = ref<Task[]>([]);
@@ -129,6 +129,21 @@ export const useTasksStore = defineStore("tasks", () => {
}
}
async function startPlanning(
projectId: number,
title: string
): Promise<StartPlanningResult> {
try {
return await apiPost<StartPlanningResult>("/api/tasks/planning", {
project_id: projectId,
title,
});
} catch (e) {
useToastStore().show("Failed to start planning", "error");
throw e;
}
}
function setStatusFilter(statuses: TaskStatus[]) {
statusFilter.value = statuses;
offset.value = 0;
+1
View File
@@ -22,6 +22,7 @@ export interface Note {
recurrence_next_spawn_at: string | null;
is_task: boolean;
note_type: NoteType;
task_kind?: "work" | "plan";
metadata: Record<string, string>;
created_at: string;
updated_at: string;
+15
View File
@@ -5,6 +5,21 @@ export interface TaskListResponse {
total: number;
}
export interface StartPlanningResult {
task: import("./note").Note;
applicable_rules: {
id: number;
title: string;
statement: string;
topic_title: string;
rulebook_title: string;
}[];
subscribed_rulebooks: { id: number; title: string }[];
applicable_rules_truncated: boolean;
project_goal: string;
open_task_count: number;
}
export interface TaskLog {
id: number;
task_id: number;