Bots and workspaces each keep a list of work tracked until it's done, and the bots move it along themselves as they work. - tasks (one collection per bot or per workspace), task_notes (the progress log) and task_media (a deliverable or a reference file, its bytes a private media row served at /media/private/<id>) - statuses todo/doing/blocked/done/cancelled, with blocked_reason while only the user can unblock it - visibility as SQL in src/utils/task-access: a user's own bots and workspaces, a run's own list plus its workspaces, everything for the coordinator; every tool and endpoint resolves through it - list_tasks, create_task and update_task on every run, so a chat reply, a task and a routine all read the list, log progress and file what they produced - TasksNote on every run and TaskReminderNote in chat, so a greeting or a proposed next step brings pending work up in one measured line - tasks group on the workspace dashboard and a tasks modal in the conversation header, sharing one form, row and detail panel - a bot's or workspace's own chat uploads are read before the delete so none are stranded; bot files keep their folder Also corrects the README's RAM guidance and table alignment.
33 lines
1.4 KiB
TypeScript
33 lines
1.4 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import type { BUN_SQLITE_COBBLE_TASKS } from "@/db/types/db";
|
|
import findDuplicateTask from "./find-duplicate-task";
|
|
|
|
function task(fields: Partial<BUN_SQLITE_COBBLE_TASKS>): BUN_SQLITE_COBBLE_TASKS {
|
|
return { id: 1, title: "Check the invoices", status: "todo", ...fields };
|
|
}
|
|
|
|
describe("findDuplicateTask", () => {
|
|
test("finds the open task with the same title in the same bot's list", () => {
|
|
const tasks = [task({ id: 3, bot_id: 2, title: " check the INVOICES " })];
|
|
|
|
expect(findDuplicateTask({ tasks, title: "Check the invoices", bot_id: 2 })?.id).toBe(3);
|
|
});
|
|
|
|
test("a finished or cancelled task is never a duplicate", () => {
|
|
const tasks = [
|
|
task({ id: 1, bot_id: 2, status: "done" }),
|
|
task({ id: 2, bot_id: 2, status: "cancelled" }),
|
|
];
|
|
|
|
expect(findDuplicateTask({ tasks, title: "Check the invoices", bot_id: 2 })).toBeNull();
|
|
});
|
|
|
|
test("keeps bot lists and workspace lists apart", () => {
|
|
const tasks = [task({ id: 5, bot_id: 2 }), task({ id: 6, workspace_id: 9 })];
|
|
|
|
expect(findDuplicateTask({ tasks, title: "Check the invoices", workspace_id: 9 })?.id).toBe(6);
|
|
expect(findDuplicateTask({ tasks, title: "Check the invoices", bot_id: 2 })?.id).toBe(5);
|
|
expect(findDuplicateTask({ tasks, title: "Check the invoices", bot_id: 7 })).toBeNull();
|
|
});
|
|
});
|