Add dedicated bot, workspace and user settings pages

This commit is contained in:
2026-10-19 13:17:17 +01:00
parent 731ea73486
commit 7667f2bc2f
74 changed files with 2183 additions and 358 deletions
@@ -0,0 +1,51 @@
import BunSQLite from "@moduletrace/bun-sqlite";
import type { BUN_SQLITE_COBBLE_BOTS, BUN_SQLITE_COBBLE_WORKSPACE_BOTS } from "@/db/types/db";
import type { BotWorkspace } from "@/src/types";
import grabUserWorkspaces from "./grab-user-workspaces";
type Params = {
user_id: number | string;
bot: Pick<BUN_SQLITE_COBBLE_BOTS, "id" | "kind">;
};
/**
* The workspaces a bot works in, for its settings page. The coordinator
* works in every workspace; a worker only in the ones it was added to.
* Each row carries what the bot has for that workspace alone.
*/
export default async function grabBotWorkspaces({
user_id,
bot,
}: Params): Promise<BotWorkspace[]> {
const workspaces = await grabUserWorkspaces({ user_id });
if (bot.kind == "coordinator") {
return workspaces.map((workspace) => ({
...workspace,
workspace_system_prompt: null,
workspace_memory: null,
}));
}
const rows =
(
await BunSQLite.sql<BUN_SQLITE_COBBLE_WORKSPACE_BOTS>({
sql: `SELECT workspace_id, system_prompt, memory FROM workspace_bots WHERE bot_id = ?`,
values: [Number(bot.id)],
})
).payload || [];
const by_workspace = new Map(rows.map((row) => [Number(row.workspace_id), row]));
return workspaces
.filter((workspace) => by_workspace.has(Number(workspace.id)))
.map((workspace) => {
const row = by_workspace.get(Number(workspace.id));
return {
...workspace,
workspace_system_prompt: row?.system_prompt || null,
workspace_memory: row?.memory || null,
};
});
}
@@ -0,0 +1,19 @@
import fetchApi from "@moduletrace/twui/utils/fetch/fetchApi";
import type { APIResponseObject } from "@moduletrace/bunext/types";
import type { SaveBotHarnessSettingsRequest } from "@/src/schemas/harness-schema";
import type { BotHarnessOverviewPayload } from "@/src/types";
/**
* Saves a worker bot's own model settings and returns the fresh page data.
*/
export default async function saveBotHarnessSettings(
body: SaveBotHarnessSettingsRequest,
) {
return await fetchApi<
SaveBotHarnessSettingsRequest,
APIResponseObject<BotHarnessOverviewPayload>
>(`/api/admin/bots/save-harness-settings`, {
method: "POST",
body,
});
}
@@ -0,0 +1,17 @@
import fetchApi from "@moduletrace/twui/utils/fetch/fetchApi";
import type { APIResponseObject } from "@moduletrace/bunext/types";
import type { SaveWorkspaceHarnessSettingsRequest } from "@/src/schemas/harness-schema";
import type { BotHarnessOverviewPayload } from "@/src/types";
/**
* Saves a workspace's model settings and returns the fresh page data.
*/
export default async function saveWorkspaceHarnessSettings(body: SaveWorkspaceHarnessSettingsRequest) {
return await fetchApi<
SaveWorkspaceHarnessSettingsRequest,
APIResponseObject<BotHarnessOverviewPayload>
>(`/api/admin/workspaces/save-harness-settings`, {
method: "POST",
body,
});
}