Scheduled runs are pre-approved: they carry out their brief instead of drafting for confirmation. A run that can't do its brief calls report_run_failed and is retried 5 and 10 minutes later; only then does the user get one "failed after N tries" message, and the routine keeps why in last_error. Every reply and task now gets ActionCheckNote: look for an existing record before creating one, and verify an action took effect before saying it's done. Memory and instructions saves are read back, and create_bot, create_schedule, start_task and delegate_task refuse duplicates. Co-Authored-By: Claude Opus 5.5 <[email protected]>
25 lines
805 B
TypeScript
25 lines
805 B
TypeScript
import BunSQLite from "@moduletrace/bun-sqlite";
|
|
|
|
type Params = {
|
|
bot_id: number | string;
|
|
session_id: number | string;
|
|
title: string;
|
|
};
|
|
|
|
/**
|
|
* The bot's task in this session with this title that's still queued or
|
|
* working, if any, so the same work isn't started twice.
|
|
*/
|
|
export default async function grabOpenBotTask({ bot_id, session_id, title }: Params) {
|
|
const res = await BunSQLite.sql<{ id: number; status: string }>({
|
|
sql: `SELECT id, status FROM bots_queue
|
|
WHERE bot_id = ? AND session_id = ? AND kind = 'task'
|
|
AND status IN ('pending', 'processing')
|
|
AND lower(trim(title)) = lower(trim(?))
|
|
ORDER BY id DESC LIMIT 1`,
|
|
values: [bot_id, session_id, title],
|
|
});
|
|
|
|
return res.payload?.[0] || null;
|
|
}
|