chore: trim automation ui cleanup

This commit is contained in:
chengyongru
2026-06-16 15:10:51 +08:00
parent 3357dcc05f
commit 0263dbd1c3
15 changed files with 19 additions and 197 deletions
+1 -14
View File
@@ -846,19 +846,6 @@ class WebSocketChannel(BaseChannel):
self.logger.exception("send failed{}", label)
raise
def _all_subscribed_connections(self) -> list[Any]:
"""Return every live WebUI connection that is subscribed to at least one chat."""
seen: set[int] = set()
conns: list[Any] = []
for subscribers in self._subs.values():
for connection in subscribers:
marker = id(connection)
if marker in seen:
continue
seen.add(marker)
conns.append(connection)
return conns
async def send(self, msg: OutboundMessage) -> None:
if msg.metadata.get("_runtime_model_updated"):
await self.send_runtime_model_updated(
@@ -1161,7 +1148,7 @@ class WebSocketChannel(BaseChannel):
async def send_session_updated(self, chat_id: str, *, scope: str | None = None) -> None:
"""Notify WebUI clients that a session row should refresh."""
conns = self._all_subscribed_connections()
conns = list(self._conn_chats)
if not conns:
return
body: dict[str, Any] = {"event": "session_updated", "chat_id": chat_id}
+14 -4
View File
@@ -5,7 +5,9 @@ from __future__ import annotations
from collections.abc import Collection
from typing import Any, Protocol
from nanobot.cron.session_turns import CRON_HISTORY_META
from nanobot.cron.types import CronJob
from nanobot.session.manager import _message_preview_text
class _CronServiceLike(Protocol):
@@ -173,13 +175,21 @@ def _origin_payload(
"preview": preview,
}
def _session_preview(messages: Any) -> str:
if not isinstance(messages, list):
return ""
fallback_preview = ""
for message in messages:
if not isinstance(message, dict):
continue
content = message.get("content")
if isinstance(content, str) and content.strip():
return content.strip()
return ""
if message.get(CRON_HISTORY_META) is True:
continue
text = _message_preview_text(message)
if not text:
continue
if message.get("role") == "user":
return text
if not fallback_preview and message.get("role") == "assistant":
fallback_preview = text
return fallback_preview
-2
View File
@@ -92,8 +92,6 @@ if TYPE_CHECKING:
def _decode_api_key(raw_key: str) -> str | None:
from urllib.parse import unquote
key = unquote(raw_key)
_api_key_re = re.compile(r"^[A-Za-z0-9_:.-]{1,128}$")
if _api_key_re.match(key) is None:
-4
View File
@@ -137,10 +137,6 @@ async def test_send_session_updated_broadcasts_to_other_webui_connections(bus) -
channel._attach(other_conn, "chat-b")
assert sorted(channel._subs) == ["chat-a", "chat-b"]
assert sum(len(conns) for conns in channel._subs.values()) == 2
assert {id(conn) for conn in channel._all_subscribed_connections()} == {
id(active_conn),
id(other_conn),
}
await channel.send_session_updated("chat-a", scope="thread")
@@ -3870,8 +3870,10 @@ function AutomationActionGroup({
const tx = (key: string, fallback: string, values?: Record<string, unknown>) =>
t(key, { defaultValue: fallback, ...(values ?? {}) });
const canManage = !job.protected;
const canRun = canManage && job.enabled && !job.state.pending;
const hasLinkedChat = Boolean(job.origin);
const canRun = canManage && hasLinkedChat && job.enabled && !job.state.pending;
const toggleAction: AutomationAction = job.enabled ? "disable" : "enable";
const canToggle = canManage && (job.enabled || hasLinkedChat);
const toggleBusy = actionKey === `${toggleAction}:${job.id}`;
if (!canManage) {
@@ -3906,6 +3908,7 @@ function AutomationActionGroup({
: tx("settings.automations.resume", "Resume")
}
busy={toggleBusy}
disabled={!canToggle}
onClick={() => void onAction(toggleAction, job)}
>
{job.enabled ? (
-19
View File
@@ -472,14 +472,6 @@
"empty": "No apps match this filter."
},
"automations": {
"kicker": "Workspace automations",
"title": "Automations",
"stats": {
"active": "Active",
"paused": "Paused",
"failed": "Needs attention",
"system": "System"
},
"filters": {
"all": "All",
"active": "Active",
@@ -504,7 +496,6 @@
"labels": {
"schedule": "Schedule",
"next": "Next",
"last": "Last",
"origin": "Linked chat",
"created": "Created",
"updated": "Updated"
@@ -516,14 +507,12 @@
"delete": "Delete",
"protected": "Protected",
"editTitle": "Edit automation",
"editDescription": "Update the prompt and schedule. The linked chat stays unchanged.",
"save": "Save",
"deleteTitle": "Delete automation",
"deleteDescription": "This removes {{name}} from the cron store. Past chat messages stay in the session.",
"cancel": "Cancel",
"status": {
"system": "System",
"pending": "Pending",
"running": "Running now",
"paused": "Paused",
"failed": "Failed",
@@ -569,18 +558,10 @@
"pending": "Running now",
"none": "No next run"
},
"last": {
"never": "Never",
"unknown": "unknown"
},
"message": {
"showMore": "Show full message",
"showLess": "Show less"
},
"meta": {
"created": "Created {{time}}",
"updated": "Updated {{time}}"
},
"fields": {
"name": "Name",
"message": "Message",
-19
View File
@@ -472,14 +472,6 @@
"empty": "Ninguna app coincide con este filtro."
},
"automations": {
"kicker": "Automatizaciones del espacio",
"title": "Automatizaciones",
"stats": {
"active": "Activas",
"paused": "Pausadas",
"failed": "Requieren atención",
"system": "Sistema"
},
"filters": {
"all": "Todas",
"active": "Activas",
@@ -504,7 +496,6 @@
"labels": {
"schedule": "Programación",
"next": "Siguiente",
"last": "Última",
"origin": "Chat vinculado",
"created": "Creada",
"updated": "Actualizada"
@@ -516,14 +507,12 @@
"delete": "Eliminar",
"protected": "Protegida",
"editTitle": "Editar automatización",
"editDescription": "Actualiza el prompt y la programación. El chat vinculado no cambia.",
"save": "Guardar",
"deleteTitle": "Eliminar automatización",
"deleteDescription": "Esto elimina {{name}} del almacén cron. Los mensajes de chat anteriores permanecen en la sesión.",
"cancel": "Cancelar",
"status": {
"system": "Sistema",
"pending": "Pendiente",
"running": "Ejecutándose ahora",
"paused": "Pausada",
"failed": "Fallida",
@@ -569,18 +558,10 @@
"pending": "Ejecutándose ahora",
"none": "Sin próxima ejecución"
},
"last": {
"never": "Nunca",
"unknown": "desconocido"
},
"message": {
"showMore": "Mostrar mensaje completo",
"showLess": "Mostrar menos"
},
"meta": {
"created": "Creada {{time}}",
"updated": "Actualizada {{time}}"
},
"fields": {
"name": "Nombre",
"message": "Mensaje",
-19
View File
@@ -472,14 +472,6 @@
"empty": "Aucune app ne correspond."
},
"automations": {
"kicker": "Automatisations de lespace",
"title": "Automatisations",
"stats": {
"active": "Actives",
"paused": "En pause",
"failed": "À traiter",
"system": "Système"
},
"filters": {
"all": "Toutes",
"active": "Actives",
@@ -504,7 +496,6 @@
"labels": {
"schedule": "Planning",
"next": "Prochaine",
"last": "Dernière",
"origin": "Discussion liée",
"created": "Créée",
"updated": "Modifiée"
@@ -516,14 +507,12 @@
"delete": "Supprimer",
"protected": "Protégée",
"editTitle": "Modifier lautomatisation",
"editDescription": "Modifiez le prompt et le planning. La discussion liée ne change pas.",
"save": "Enregistrer",
"deleteTitle": "Supprimer lautomatisation",
"deleteDescription": "Cela supprime {{name}} du stockage cron. Les anciens messages de chat restent dans la session.",
"cancel": "Annuler",
"status": {
"system": "Système",
"pending": "En attente",
"running": "En cours dexécution",
"paused": "En pause",
"failed": "Échouée",
@@ -569,18 +558,10 @@
"pending": "En cours dexécution",
"none": "Aucune prochaine exécution"
},
"last": {
"never": "Jamais",
"unknown": "inconnu"
},
"message": {
"showMore": "Afficher le message complet",
"showLess": "Afficher moins"
},
"meta": {
"created": "Créée {{time}}",
"updated": "Mise à jour {{time}}"
},
"fields": {
"name": "Nom",
"message": "Message",
-19
View File
@@ -472,14 +472,6 @@
"empty": "Tidak ada aplikasi yang cocok."
},
"automations": {
"kicker": "Otomasi ruang kerja",
"title": "Otomasi",
"stats": {
"active": "Aktif",
"paused": "Dijeda",
"failed": "Perlu ditangani",
"system": "Sistem"
},
"filters": {
"all": "Semua",
"active": "Aktif",
@@ -504,7 +496,6 @@
"labels": {
"schedule": "Jadwal",
"next": "Berikutnya",
"last": "Terakhir",
"origin": "Chat tertaut",
"created": "Dibuat",
"updated": "Diperbarui"
@@ -516,14 +507,12 @@
"delete": "Hapus",
"protected": "Terlindungi",
"editTitle": "Edit otomasi",
"editDescription": "Perbarui prompt dan jadwal. Chat tertaut tidak berubah.",
"save": "Simpan",
"deleteTitle": "Hapus otomasi",
"deleteDescription": "Ini menghapus {{name}} dari penyimpanan cron. Pesan chat sebelumnya tetap ada di sesi.",
"cancel": "Batal",
"status": {
"system": "Sistem",
"pending": "Menunggu",
"running": "Sedang berjalan",
"paused": "Dijeda",
"failed": "Gagal",
@@ -569,18 +558,10 @@
"pending": "Sedang berjalan",
"none": "Tidak ada jadwal berikutnya"
},
"last": {
"never": "Belum pernah",
"unknown": "tidak dikenal"
},
"message": {
"showMore": "Tampilkan pesan lengkap",
"showLess": "Tampilkan lebih sedikit"
},
"meta": {
"created": "Dibuat {{time}}",
"updated": "Diperbarui {{time}}"
},
"fields": {
"name": "Nama",
"message": "Pesan",
-19
View File
@@ -472,14 +472,6 @@
"empty": "一致するアプリはありません。"
},
"automations": {
"kicker": "ワークスペースの自動タスク",
"title": "自動タスク",
"stats": {
"active": "実行中",
"paused": "一時停止",
"failed": "要対応",
"system": "システム"
},
"filters": {
"all": "すべて",
"active": "実行中",
@@ -504,7 +496,6 @@
"labels": {
"schedule": "スケジュール",
"next": "次回",
"last": "前回",
"origin": "関連チャット",
"created": "作成",
"updated": "更新"
@@ -516,14 +507,12 @@
"delete": "削除",
"protected": "保護済み",
"editTitle": "自動タスクを編集",
"editDescription": "プロンプトとスケジュールを更新します。関連チャットは変更されません。",
"save": "保存",
"deleteTitle": "自動タスクを削除",
"deleteDescription": "{{name}} を cron ストアから削除します。過去のチャットメッセージはセッションに残ります。",
"cancel": "キャンセル",
"status": {
"system": "システム",
"pending": "待機中",
"running": "実行中",
"paused": "一時停止",
"failed": "失敗",
@@ -569,18 +558,10 @@
"pending": "実行中",
"none": "次回実行なし"
},
"last": {
"never": "未実行",
"unknown": "不明"
},
"message": {
"showMore": "メッセージ全文を表示",
"showLess": "折りたたむ"
},
"meta": {
"created": "{{time}} 作成",
"updated": "{{time}} 更新"
},
"fields": {
"name": "名前",
"message": "メッセージ",
-19
View File
@@ -472,14 +472,6 @@
"empty": "일치하는 앱이 없습니다."
},
"automations": {
"kicker": "작업 공간 자동화",
"title": "자동화",
"stats": {
"active": "활성",
"paused": "일시 중지",
"failed": "확인 필요",
"system": "시스템"
},
"filters": {
"all": "전체",
"active": "활성",
@@ -504,7 +496,6 @@
"labels": {
"schedule": "일정",
"next": "다음",
"last": "마지막",
"origin": "연결된 채팅",
"created": "생성",
"updated": "업데이트"
@@ -516,14 +507,12 @@
"delete": "삭제",
"protected": "보호됨",
"editTitle": "자동화 편집",
"editDescription": "프롬프트와 일정을 업데이트합니다. 연결된 채팅은 변경되지 않습니다.",
"save": "저장",
"deleteTitle": "자동화 삭제",
"deleteDescription": "{{name}}을 cron 저장소에서 삭제합니다. 이전 채팅 메시지는 세션에 남습니다.",
"cancel": "취소",
"status": {
"system": "시스템",
"pending": "대기 중",
"running": "실행 중",
"paused": "일시 중지",
"failed": "실패",
@@ -569,18 +558,10 @@
"pending": "실행 중",
"none": "다음 실행 없음"
},
"last": {
"never": "실행된 적 없음",
"unknown": "알 수 없음"
},
"message": {
"showMore": "전체 메시지 보기",
"showLess": "접기"
},
"meta": {
"created": "{{time}} 생성",
"updated": "{{time}} 업데이트"
},
"fields": {
"name": "이름",
"message": "메시지",
-19
View File
@@ -472,14 +472,6 @@
"empty": "Không có ứng dụng phù hợp."
},
"automations": {
"kicker": "Tự động hóa không gian làm việc",
"title": "Tự động hóa",
"stats": {
"active": "Đang chạy",
"paused": "Đã tạm dừng",
"failed": "Cần xử lý",
"system": "Hệ thống"
},
"filters": {
"all": "Tất cả",
"active": "Đang chạy",
@@ -504,7 +496,6 @@
"labels": {
"schedule": "Lịch",
"next": "Tiếp theo",
"last": "Lần trước",
"origin": "Cuộc trò chuyện liên kết",
"created": "Đã tạo",
"updated": "Đã cập nhật"
@@ -516,14 +507,12 @@
"delete": "Xóa",
"protected": "Được bảo vệ",
"editTitle": "Sửa tự động hóa",
"editDescription": "Cập nhật prompt và lịch. Cuộc trò chuyện liên kết không thay đổi.",
"save": "Lưu",
"deleteTitle": "Xóa tự động hóa",
"deleteDescription": "Thao tác này xóa {{name}} khỏi kho cron. Tin nhắn chat trước đó vẫn ở trong phiên.",
"cancel": "Hủy",
"status": {
"system": "Hệ thống",
"pending": "Đang chờ",
"running": "Đang chạy",
"paused": "Đã tạm dừng",
"failed": "Thất bại",
@@ -569,18 +558,10 @@
"pending": "Đang chạy",
"none": "Không có lần chạy tiếp theo"
},
"last": {
"never": "Chưa từng chạy",
"unknown": "không xác định"
},
"message": {
"showMore": "Hiển thị toàn bộ tin nhắn",
"showLess": "Thu gọn"
},
"meta": {
"created": "Tạo lúc {{time}}",
"updated": "Cập nhật lúc {{time}}"
},
"fields": {
"name": "Tên",
"message": "Tin nhắn",
-19
View File
@@ -472,14 +472,6 @@
"empty": "没有匹配的应用。"
},
"automations": {
"kicker": "工作区自动任务",
"title": "自动任务",
"stats": {
"active": "运行中",
"paused": "已暂停",
"failed": "异常",
"system": "系统"
},
"filters": {
"all": "全部",
"active": "运行中",
@@ -504,7 +496,6 @@
"labels": {
"schedule": "计划",
"next": "下次",
"last": "上次",
"origin": "关联会话",
"created": "创建于",
"updated": "更新于"
@@ -516,14 +507,12 @@
"delete": "删除",
"protected": "受保护",
"editTitle": "编辑自动任务",
"editDescription": "更新提示词和计划;关联会话不会改变。",
"save": "保存",
"deleteTitle": "删除自动任务",
"deleteDescription": "这会从 cron 存储中删除 {{name}},历史聊天消息会保留在会话中。",
"cancel": "取消",
"status": {
"system": "系统",
"pending": "等待中",
"running": "正在运行",
"paused": "已暂停",
"failed": "失败",
@@ -569,18 +558,10 @@
"pending": "正在运行",
"none": "没有下次运行"
},
"last": {
"never": "从未运行",
"unknown": "未知"
},
"message": {
"showMore": "查看完整消息",
"showLess": "收起消息"
},
"meta": {
"created": "创建于 {{time}}",
"updated": "更新于 {{time}}"
},
"fields": {
"name": "名称",
"message": "消息",
-19
View File
@@ -472,14 +472,6 @@
"empty": "沒有符合的應用。"
},
"automations": {
"kicker": "工作區自動任務",
"title": "自動任務",
"stats": {
"active": "執行中",
"paused": "已暫停",
"failed": "異常",
"system": "系統"
},
"filters": {
"all": "全部",
"active": "執行中",
@@ -504,7 +496,6 @@
"labels": {
"schedule": "排程",
"next": "下次",
"last": "上次",
"origin": "關聯會話",
"created": "建立於",
"updated": "更新於"
@@ -516,14 +507,12 @@
"delete": "刪除",
"protected": "受保護",
"editTitle": "編輯自動任務",
"editDescription": "更新提示詞和排程;關聯會話不會改變。",
"save": "儲存",
"deleteTitle": "刪除自動任務",
"deleteDescription": "這會從 cron 儲存中刪除 {{name}},歷史聊天訊息會保留在會話中。",
"cancel": "取消",
"status": {
"system": "系統",
"pending": "等待中",
"running": "正在執行",
"paused": "已暫停",
"failed": "失敗",
@@ -569,18 +558,10 @@
"pending": "正在執行",
"none": "沒有下次執行"
},
"last": {
"never": "從未執行",
"unknown": "未知"
},
"message": {
"showMore": "查看完整訊息",
"showLess": "收起訊息"
},
"meta": {
"created": "建立於 {{time}}",
"updated": "更新於 {{time}}"
},
"fields": {
"name": "名稱",
"message": "訊息",
-1
View File
@@ -48,7 +48,6 @@ const LOCALIZED_SETTINGS_COPY_KEYS = [
"settings.nav.runtime",
"settings.nav.advanced",
"sidebar.automations",
"settings.automations.title",
"settings.automations.filters.active",
"settings.automations.queue",
"settings.automations.empty",