feat(odin): Phase 2a read-only agentic assistant + tool-trace UI
- agentic chat loop (max 6 round-trips, budget re-checked between iterations) over 10 read-only, permission-delegated tools in src/services/ai-tools.ts - persist assistant tool trace in ai_chat_messages.content_json (+ migration) - consulted-tools chips in OdinThread; header now shows month spend only (budget cap hidden from the UI, server-side 402 guard unchanged) - seed: ai.use permission; Settings exposes the ai permission module - docs: REVIEW consolidation; deployment-guide.md superseded by docs/release.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -117,8 +117,29 @@ const MODULE_LABELS: Record<string, string> = {
|
||||
customers: "Zákazníci",
|
||||
users: "Uživatelé",
|
||||
settings: "Nastavení",
|
||||
ai: "AI asistent",
|
||||
};
|
||||
|
||||
// Display order of the permission-module groups in the role modal. Before
|
||||
// this list the order fell out of DB insertion ids, which differ between dev
|
||||
// (reseeded) and prod (migration order). Reorder by rearranging this array;
|
||||
// modules missing from it (e.g. added by a future migration before this list
|
||||
// is updated) fall to the very end so they stay visible.
|
||||
const MODULE_ORDER = [
|
||||
"ai",
|
||||
"attendance",
|
||||
"trips",
|
||||
"vehicles",
|
||||
"offers",
|
||||
"orders",
|
||||
"projects",
|
||||
"invoices",
|
||||
"warehouse",
|
||||
"customers",
|
||||
"users",
|
||||
"settings",
|
||||
];
|
||||
|
||||
interface Permission {
|
||||
id: number;
|
||||
name: string;
|
||||
@@ -1243,8 +1264,12 @@ export default function Settings() {
|
||||
|
||||
{Object.entries(permissionGroups)
|
||||
.sort(([a, aPerms], [b, bPerms]) => {
|
||||
if (a === "settings") return 1;
|
||||
if (b === "settings") return -1;
|
||||
const ai = MODULE_ORDER.indexOf(a);
|
||||
const bi = MODULE_ORDER.indexOf(b);
|
||||
const aKey = ai === -1 ? MODULE_ORDER.length : ai;
|
||||
const bKey = bi === -1 ? MODULE_ORDER.length : bi;
|
||||
if (aKey !== bKey) return aKey - bKey;
|
||||
// Both unknown: stable fallback by DB insertion order.
|
||||
const aMin = Math.min(...aPerms.map((p) => p.id));
|
||||
const bMin = Math.min(...bPerms.map((p) => p.id));
|
||||
return aMin - bMin;
|
||||
|
||||
Reference in New Issue
Block a user