| 1 | from __future__ import annotations |
| 2 | |
| 3 | from agent import AgentContext |
| 4 | from helpers.api import ApiHandler, Input, Output, Request, Response |
| 5 | from helpers.persist_chat import save_tmp_chat |
| 6 | from helpers.state_monitor_integration import mark_dirty_all |
| 7 | from helpers.task_scheduler import TaskScheduler |
| 8 | from plugins._chat_naming.helpers import naming |
| 9 | |
| 10 | |
| 11 | class ChatName(ApiHandler): |
| 12 | async def process(self, input: Input, request: Request) -> Output: |
| 13 | del request |
| 14 | action = str(input.get("action", "get") or "get").strip().lower() |
| 15 | kind = str(input.get("kind", "chat") or "chat").strip().lower() |
| 16 | item_id = str(input.get("item_id", "") or "").strip() |
| 17 | if kind not in {"chat", "task"}: |
| 18 | return Response("Invalid row kind.", 400) |
| 19 | if not item_id: |
| 20 | return Response("Missing chat or task ID.", 400) |
| 21 | |
| 22 | context = AgentContext.get(item_id) |
| 23 | if not context: |
| 24 | return Response("Chat context not found.", 404) |
| 25 | |
| 26 | try: |
| 27 | if action == "get": |
| 28 | current_name = await self._current_name(kind, item_id, context.name or "") |
| 29 | return {"ok": True, "name": current_name} |
| 30 | if action == "generate": |
| 31 | current_name = await self._current_name(kind, item_id, context.name or "") |
| 32 | name = await naming.generate_name( |
| 33 | context.agent0, |
| 34 | current_name=current_name, |
| 35 | ) |
| 36 | return {"ok": True, "name": name} |
| 37 | if action == "save": |
| 38 | name = naming.normalize_manual_name(input.get("name", "")) |
| 39 | if kind == "task": |
| 40 | await self._save_task_name(item_id, name) |
| 41 | context.name = name |
| 42 | save_tmp_chat(context) |
| 43 | mark_dirty_all(reason="plugins._chat_naming.save_task_name") |
| 44 | else: |
| 45 | naming.save_context_name(context.agent0, name) |
| 46 | return {"ok": True, "name": name} |
| 47 | return Response(f"Unknown action: {action}", 400) |
| 48 | except ValueError as error: |
| 49 | return Response(str(error), 400) |
| 50 | except Exception as error: |
| 51 | return Response(str(error), 500) |
| 52 | |
| 53 | async def _current_name(self, kind: str, item_id: str, fallback: str) -> str: |
| 54 | if kind != "task": |
| 55 | return fallback |
| 56 | scheduler = TaskScheduler.get() |
| 57 | await scheduler.reload() |
| 58 | task = scheduler.get_task_by_uuid(item_id) |
| 59 | if not task: |
| 60 | raise ValueError("Scheduled task not found.") |
| 61 | return str(task.name or fallback) |
| 62 | |
| 63 | async def _save_task_name(self, item_id: str, name: str) -> None: |
| 64 | scheduler = TaskScheduler.get() |
| 65 | await scheduler.reload() |
| 66 | task = await scheduler.update_task(item_id, name=name) |
| 67 | if not task: |
| 68 | raise ValueError("Scheduled task not found.") |