Give every task a bot: drop shared workspace tasks

A workspace task with no bot was seen by every bot working there. Now a
task can't be saved without a bot, a worker reaches only its own (the
workspace admin and the coordinator still reach all), the workspace page
picks who has a new task, and a bot leaving a workspace or deleted passes
its tasks there to the workspace's admin bot, else the coordinator (also
at boot for rows without a bot).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-28 06:26:44 +01:00
co-authored by Claude Opus 5.5
parent 3e78d51b56
commit 623112fd19
30 changed files with 239 additions and 106 deletions
+2 -3
View File
@@ -6,8 +6,8 @@ import type { APIResponseObject, BunextAPIRouteHandler } from "@moduletrace/bune
/**
* The user's tasks: a bot's own list (`?bot_id=`), a workspace's
* (`?workspace_id=`), one bot's there with the unassigned ones
* (`?workspace_id=&bot_id=`), or every task they reach. `?status=` narrows to one
* (`?workspace_id=`), one bot's there (`?workspace_id=&bot_id=`), or every
* task they reach. `?status=` narrows to one
* status, `?open=1` to the open ones.
*/
export const handler: BunextAPIRouteHandler<APIResponseObject<TaskWithNames>> = async ({ req }) => {
@@ -33,7 +33,6 @@ export const handler: BunextAPIRouteHandler<APIResponseObject<TaskWithNames>> =
payload: await grabTasks({
user_id: user.id,
only_bot_id: bot_id,
with_unassigned: Boolean(bot_id && workspace_id),
only_workspace_id: workspace_id,
own_list: Boolean(bot_id && !workspace_id),
statuses: status ? [status] : undefined,
+2 -2
View File
@@ -11,8 +11,8 @@ import safeErrorMessage from "@/src/utils/safe-error-message";
import type { APIResponseObject, BunextAPIRouteHandler } from "@moduletrace/bunext/types";
/**
* Adds a task to a bot's list (`bot_id`), a workspace (`workspace_id`,
* shared) or a bot in a workspace (both), or changes one (`task_id`). Returns the task with its
* Adds a task to a bot's list (`bot_id`) or a bot's in a workspace (with
* `workspace_id`), or changes one (`task_id`). Returns the task with its
* notes and files.
*/
export const handler: BunextAPIRouteHandler<APIResponseObject<TaskDetail>> = async ({ req, body }) => {