Add tasks: the crew's shared to-do list
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.
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
import type { BUN_SQLITE_COBBLE_TASKS } from "@/db/types/db";
|
||||
|
||||
type Params = {
|
||||
tasks: BUN_SQLITE_COBBLE_TASKS[];
|
||||
title: string;
|
||||
/**
|
||||
* Same collection: a bot's own list, or a workspace's.
|
||||
*/
|
||||
bot_id?: number | null;
|
||||
workspace_id?: number | null;
|
||||
};
|
||||
|
||||
/**
|
||||
* A task in the same collection with the same title that's still open, so
|
||||
* `ActionCheckNote` gets real behaviour: a bot updates the existing task
|
||||
* instead of adding a second one for the same work.
|
||||
*/
|
||||
export default function findDuplicateTask({ tasks, title, bot_id, workspace_id }: Params) {
|
||||
const wanted = title.trim().toLowerCase();
|
||||
|
||||
return (
|
||||
tasks.find((task) => {
|
||||
if (task.status == "done" || task.status == "cancelled") return false;
|
||||
if (workspace_id) {
|
||||
if (Number(task.workspace_id || 0) != Number(workspace_id)) return false;
|
||||
} else if (Number(task.bot_id || 0) != Number(bot_id || 0)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (task.title || "").trim().toLowerCase() == wanted;
|
||||
}) || null
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user