From 31944e5424feb613392f8d424015b4e39aacbb2b Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Mon, 6 Jul 2026 12:46:07 +0800 Subject: [PATCH] feat: observer stage 1 --- astrbot/core/db/sqlite.py | 4 + astrbot/dashboard/api/conversations.py | 6 + astrbot/dashboard/api/router.py | 2 + astrbot/dashboard/api/sessions.py | 2 + astrbot/dashboard/api/workspaces.py | 131 ++ .../services/conversation_service.py | 2 + .../services/session_management_service.py | 10 + .../src/api/generated/openapi-v1/sdk.gen.ts | 12 +- .../src/api/generated/openapi-v1/types.gen.ts | 13 + dashboard/src/api/v1.ts | 12 + dashboard/src/i18n/loader.ts | 1 + .../i18n/locales/en-US/core/navigation.json | 1 + .../src/i18n/locales/en-US/features/cron.json | 5 +- .../i18n/locales/en-US/features/observer.json | 76 + .../i18n/locales/ru-RU/core/navigation.json | 7 +- .../src/i18n/locales/ru-RU/features/cron.json | 5 +- .../i18n/locales/ru-RU/features/observer.json | 76 + .../i18n/locales/zh-CN/core/navigation.json | 1 + .../src/i18n/locales/zh-CN/features/cron.json | 5 +- .../i18n/locales/zh-CN/features/observer.json | 76 + dashboard/src/i18n/translations.ts | 12 +- .../full/vertical-sidebar/sidebarItem.ts | 5 + dashboard/src/router/MainRoutes.ts | 5 + dashboard/src/views/CronJobPage.vue | 116 +- dashboard/src/views/ObserverPage.vue | 1617 +++++++++++++++++ dashboard/src/views/SessionManagementPage.vue | 4 + openspec/openapi-v1.yaml | 29 + 27 files changed, 2207 insertions(+), 28 deletions(-) create mode 100644 astrbot/dashboard/api/workspaces.py create mode 100644 dashboard/src/i18n/locales/en-US/features/observer.json create mode 100644 dashboard/src/i18n/locales/ru-RU/features/observer.json create mode 100644 dashboard/src/i18n/locales/zh-CN/features/observer.json create mode 100644 dashboard/src/views/ObserverPage.vue diff --git a/astrbot/core/db/sqlite.py b/astrbot/core/db/sqlite.py index f59f23419..98e1f0dac 100644 --- a/astrbot/core/db/sqlite.py +++ b/astrbot/core/db/sqlite.py @@ -312,6 +312,10 @@ class SQLiteDatabase(BaseDatabase): base_query = base_query.where( col(ConversationV2.platform_id).in_(platform_ids), ) + if kwargs.get("user_id"): + base_query = base_query.where( + col(ConversationV2.user_id) == str(kwargs["user_id"]), + ) if search_query: search_query = search_query.encode("unicode_escape").decode("utf-8") base_query = base_query.where( diff --git a/astrbot/dashboard/api/conversations.py b/astrbot/dashboard/api/conversations.py index 50edc5fc6..3c837505f 100644 --- a/astrbot/dashboard/api/conversations.py +++ b/astrbot/dashboard/api/conversations.py @@ -93,6 +93,7 @@ async def _list_conversations( platforms: str, message_types: str, search: str, + user_id: str, exclude_ids: str, exclude_platforms: str, ): @@ -103,6 +104,7 @@ async def _list_conversations( platforms=platforms, message_types=message_types, search_query=search, + user_id=user_id, exclude_ids=exclude_ids, exclude_platforms=exclude_platforms, ) @@ -116,6 +118,7 @@ async def list_conversations( platforms: str = Query(default=""), message_types: str = Query(default=""), search: str = Query(default=""), + user_id: str = Query(default=""), exclude_ids: str = Query(default=""), exclude_platforms: str = Query(default=""), _auth: AuthContext = Depends(require_data_scope), @@ -128,6 +131,7 @@ async def list_conversations( platforms=platforms, message_types=message_types, search=search, + user_id=user_id, exclude_ids=exclude_ids, exclude_platforms=exclude_platforms, ) @@ -222,6 +226,7 @@ async def list_dashboard_conversations( platforms: str = Query(default=""), message_types: str = Query(default=""), search: str = Query(default=""), + user_id: str = Query(default=""), exclude_ids: str = Query(default=""), exclude_platforms: str = Query(default=""), _username: str = Depends(require_dashboard_user), @@ -234,6 +239,7 @@ async def list_dashboard_conversations( platforms=platforms, message_types=message_types, search=search, + user_id=user_id, exclude_ids=exclude_ids, exclude_platforms=exclude_platforms, ) diff --git a/astrbot/dashboard/api/router.py b/astrbot/dashboard/api/router.py index b59ea6285..e83b36083 100644 --- a/astrbot/dashboard/api/router.py +++ b/astrbot/dashboard/api/router.py @@ -28,6 +28,7 @@ from .subagents import router as subagents_router from .t2i import router as t2i_router from .tools import router as tools_router from .updates import router as updates_router +from .workspaces import router as workspaces_router API_V1_PREFIX = "/api/v1" @@ -58,6 +59,7 @@ def build_api_router() -> APIRouter: router.include_router(t2i_router) router.include_router(personas_router) router.include_router(updates_router) + router.include_router(workspaces_router) router.include_router(open_api_router) router.include_router(live_chat_router) return router diff --git a/astrbot/dashboard/api/sessions.py b/astrbot/dashboard/api/sessions.py index b977d239f..bd47a45a8 100644 --- a/astrbot/dashboard/api/sessions.py +++ b/astrbot/dashboard/api/sessions.py @@ -173,6 +173,7 @@ async def list_session_config_overrides( page: int = Query(1), page_size: int = Query(10), search: str = Query(""), + umo: str = Query(""), _auth: AuthContext = Depends(require_data_scope), service: SessionManagementService = Depends(get_service), ): @@ -182,6 +183,7 @@ async def list_session_config_overrides( page=page, page_size=page_size, search=search.strip(), + umo=umo.strip(), ) ) except SessionManagementServiceError as exc: diff --git a/astrbot/dashboard/api/workspaces.py b/astrbot/dashboard/api/workspaces.py new file mode 100644 index 000000000..be6d9ac55 --- /dev/null +++ b/astrbot/dashboard/api/workspaces.py @@ -0,0 +1,131 @@ +from __future__ import annotations + +from datetime import datetime, timezone +from pathlib import Path + +from fastapi import APIRouter, Depends, Query, Request + +from astrbot.core.utils.datetime_utils import to_utc_isoformat +from astrbot.core.workspace import resolve_workspace_root_for_umo +from astrbot.dashboard.responses import ApiError, ok + +from .auth import AuthContext, require_scope + +router = APIRouter(tags=["Workspaces"]) + + +async def require_data_scope(request: Request) -> AuthContext: + return await require_scope(request, "data") + + +def _format_mtime(path: Path) -> str | None: + """Format a filesystem modified timestamp for API responses. + + Args: + path: File or directory path. + + Returns: + UTC ISO timestamp, or None when the timestamp cannot be read. + """ + try: + return to_utc_isoformat( + datetime.fromtimestamp(path.stat().st_mtime, timezone.utc) + ) + except OSError: + return None + + +@router.get("/workspaces/by-umo") +async def list_umo_workspace_files( + request: Request, + umo: str = Query(..., min_length=1), + path: str | None = Query(default=None), + _auth: AuthContext = Depends(require_data_scope), +): + """List files in the workspace resolved for one UMO. + + Args: + request: FastAPI request with database state. + umo: Unified message origin. + path: Relative directory path under the workspace root. + _auth: Auth context. + + Returns: + Workspace metadata and one directory level of file entries. + + Raises: + ApiError: If the requested path escapes the workspace root. + """ + root = await resolve_workspace_root_for_umo(umo, request.app.state.db) + root = root.expanduser().resolve(strict=False) + raw_path = str(path or "").strip() + requested = root if raw_path in {"", "."} else root / raw_path + current = requested.resolve(strict=False) + + if current != root and not current.is_relative_to(root): + raise ApiError("Path is outside the workspace", status_code=400) + + if not root.exists() or not root.is_dir(): + return ok( + { + "umo": umo, + "absolute_path": str(root), + "relative_path": "", + "exists": False, + "is_directory": False, + "items": [], + } + ) + if not current.exists() or not current.is_dir(): + raise ApiError("Workspace folder not found", status_code=404) + + items = [] + try: + children = sorted( + current.iterdir(), + key=lambda item: ( + not (item.is_dir() and not item.is_symlink()), + item.name.lower(), + ), + ) + except OSError as exc: + raise ApiError(f"Failed to list workspace files: {exc!s}") from exc + + for child in children: + try: + is_symlink = child.is_symlink() + stat_result = child.lstat() if is_symlink else child.stat() + if is_symlink: + item_type = "symlink" + elif child.is_dir(): + item_type = "directory" + elif child.is_file(): + item_type = "file" + else: + item_type = "other" + items.append( + { + "name": child.name, + "type": item_type, + "relative_path": child.relative_to(root).as_posix(), + "size_bytes": 0 + if item_type == "directory" + else stat_result.st_size, + "modified_at": _format_mtime(child), + } + ) + except OSError: + continue + + return ok( + { + "umo": umo, + "absolute_path": str(root), + "relative_path": "" + if current == root + else current.relative_to(root).as_posix(), + "exists": True, + "is_directory": True, + "items": items, + } + ) diff --git a/astrbot/dashboard/services/conversation_service.py b/astrbot/dashboard/services/conversation_service.py index b73b12098..9a3a72297 100644 --- a/astrbot/dashboard/services/conversation_service.py +++ b/astrbot/dashboard/services/conversation_service.py @@ -40,6 +40,7 @@ class ConversationService: platforms: str, message_types: str, search_query: str, + user_id: str, exclude_ids: str, exclude_platforms: str, ) -> dict: @@ -62,6 +63,7 @@ class ConversationService: platforms=platform_list, message_types=message_type_list, search_query=search_query, + user_id=user_id, exclude_ids=exclude_id_list, exclude_platforms=exclude_platform_list, ) diff --git a/astrbot/dashboard/services/session_management_service.py b/astrbot/dashboard/services/session_management_service.py index 7fb59072b..784a3eeb8 100644 --- a/astrbot/dashboard/services/session_management_service.py +++ b/astrbot/dashboard/services/session_management_service.py @@ -110,6 +110,7 @@ class SessionManagementService: page: int = 1, page_size: int = 10, search: str = "", + umo: str = "", ) -> tuple[dict, int]: umo_rules = {} config_mgr = self.core_lifecycle.astrbot_config_mgr @@ -214,6 +215,11 @@ class SessionManagementService: filtered_rules[umo_id] = rules umo_rules = filtered_rules + if umo: + umo_rules = { + umo_id: rules for umo_id, rules in umo_rules.items() if umo_id == umo + } + total = len(umo_rules) all_umo_ids = list(umo_rules.keys()) start_idx = (page - 1) * page_size @@ -229,12 +235,14 @@ class SessionManagementService: page_size: int, search: str, include_available_options: bool = True, + umo: str = "", ) -> dict: page, page_size = self._normalize_page(page, page_size, default_page_size=10) umo_rules, total = await self.get_umo_rules( page=page, page_size=page_size, search=search, + umo=umo, ) alias_map = await self.get_umo_alias_map(list(umo_rules.keys())) @@ -333,6 +341,7 @@ class SessionManagementService: page: int, page_size: int, search: str, + umo: str = "", ) -> dict: """List UMO config overrides without editor option payloads. @@ -348,6 +357,7 @@ class SessionManagementService: page=page, page_size=page_size, search=search, + umo=umo, include_available_options=False, ) diff --git a/dashboard/src/api/generated/openapi-v1/sdk.gen.ts b/dashboard/src/api/generated/openapi-v1/sdk.gen.ts index 983a55887..89639390f 100644 --- a/dashboard/src/api/generated/openapi-v1/sdk.gen.ts +++ b/dashboard/src/api/generated/openapi-v1/sdk.gen.ts @@ -1,7 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts import { createClient, createConfig, type OptionsLegacyParser, formDataBodySerializer } from '@hey-api/client-axios'; -import type { LoginData, LoginError, LoginResponse, LogoutError, LogoutResponse, GetAuthSetupStatusError, GetAuthSetupStatusResponse, SetupAuthData, SetupAuthError, SetupAuthResponse, SetupTotpData, SetupTotpError, SetupTotpResponse, RecoverTotpError, RecoverTotpResponse, UpdateAuthAccountData, UpdateAuthAccountError, UpdateAuthAccountResponse, ListApiKeysError, ListApiKeysResponse, CreateApiKeyData, CreateApiKeyError, CreateApiKeyResponse, RevokeApiKeyData, RevokeApiKeyError, RevokeApiKeyResponse, DeleteApiKeyData, DeleteApiKeyError, DeleteApiKeyResponse, GetSystemConfigSchemaError, GetSystemConfigSchemaResponse, GetSystemConfigError, GetSystemConfigResponse, UpdateSystemConfigData, UpdateSystemConfigError, UpdateSystemConfigResponse, GetSystemConfigRuntimeError, GetSystemConfigRuntimeResponse, GetConfigProfileSchemaError, GetConfigProfileSchemaResponse, ListConfigProfilesError, ListConfigProfilesResponse, CreateConfigProfileData, CreateConfigProfileError, CreateConfigProfileResponse, GetConfigProfileData, GetConfigProfileError, GetConfigProfileResponse, UpdateConfigProfileContentData, UpdateConfigProfileContentError, UpdateConfigProfileContentResponse, RenameConfigProfileData, RenameConfigProfileError, RenameConfigProfileResponse, DeleteConfigProfileData, DeleteConfigProfileError, DeleteConfigProfileResponse, ListConfigRoutesError, ListConfigRoutesResponse, ReplaceConfigRoutesData, ReplaceConfigRoutesError, ReplaceConfigRoutesResponse, UpsertConfigRouteData, UpsertConfigRouteError, UpsertConfigRouteResponse, DeleteConfigRouteData, DeleteConfigRouteError, DeleteConfigRouteResponse, ListBotTypesError, ListBotTypesResponse, RegisterBotTypeData, RegisterBotTypeError, RegisterBotTypeResponse, ListBotsData, ListBotsError, ListBotsResponse, CreateBotData, CreateBotError, CreateBotResponse, ListBotStatsError, ListBotStatsResponse, GetBotByIdData, GetBotByIdError, GetBotByIdResponse, UpdateBotByIdData, UpdateBotByIdError, UpdateBotByIdResponse, DeleteBotByIdData, DeleteBotByIdError, DeleteBotByIdResponse, SetBotEnabledByIdData, SetBotEnabledByIdError, SetBotEnabledByIdResponse, TestBotByIdData, TestBotByIdError, TestBotByIdResponse, GetBotData, GetBotError, GetBotResponse, UpdateBotData, UpdateBotError, UpdateBotResponse, DeleteBotData, DeleteBotError, DeleteBotResponse, SetBotEnabledData, SetBotEnabledError, SetBotEnabledResponse, TestBotData, TestBotError, TestBotResponse, GetProviderSchemaError, GetProviderSchemaResponse, ListProviderSourcesError, ListProviderSourcesResponse, CreateProviderSourceData, CreateProviderSourceError, CreateProviderSourceResponse, GetProviderSourceByIdData, GetProviderSourceByIdError, GetProviderSourceByIdResponse, UpsertProviderSourceByIdData, UpsertProviderSourceByIdError, UpsertProviderSourceByIdResponse, DeleteProviderSourceByIdData, DeleteProviderSourceByIdError, DeleteProviderSourceByIdResponse, ListProviderSourceModelsByIdData, ListProviderSourceModelsByIdError, ListProviderSourceModelsByIdResponse, ListProvidersBySourceIdData, ListProvidersBySourceIdError, ListProvidersBySourceIdResponse, CreateProviderInSourceByIdData, CreateProviderInSourceByIdError, CreateProviderInSourceByIdResponse, GetProviderSourceData, GetProviderSourceError, GetProviderSourceResponse, UpsertProviderSourceData, UpsertProviderSourceError, UpsertProviderSourceResponse, DeleteProviderSourceData, DeleteProviderSourceError, DeleteProviderSourceResponse, ListProviderSourceModelsData, ListProviderSourceModelsError, ListProviderSourceModelsResponse, ListProvidersBySourceData, ListProvidersBySourceError, ListProvidersBySourceResponse, CreateProviderInSourceData, CreateProviderInSourceError, CreateProviderInSourceResponse, ListProvidersData, ListProvidersError, ListProvidersResponse, CreateProviderData, CreateProviderError, CreateProviderResponse, GetProviderByIdData, GetProviderByIdError, GetProviderByIdResponse, UpdateProviderByIdData, UpdateProviderByIdError, UpdateProviderByIdResponse, DeleteProviderByIdData, DeleteProviderByIdError, DeleteProviderByIdResponse, SetProviderEnabledByIdData, SetProviderEnabledByIdError, SetProviderEnabledByIdResponse, TestProviderByIdData, TestProviderByIdError, TestProviderByIdResponse, GetProviderEmbeddingDimensionByIdData, GetProviderEmbeddingDimensionByIdError, GetProviderEmbeddingDimensionByIdResponse, GetProviderData, GetProviderError, GetProviderResponse, UpdateProviderData, UpdateProviderError, UpdateProviderResponse, DeleteProviderData, DeleteProviderError, DeleteProviderResponse, SetProviderEnabledData, SetProviderEnabledError, SetProviderEnabledResponse, TestProviderData, TestProviderError, TestProviderResponse, GetProviderEmbeddingDimensionData, GetProviderEmbeddingDimensionError, GetProviderEmbeddingDimensionResponse, SendChatMessageData, SendChatMessageError, SendChatMessageResponse, OpenChatWebSocketData, OpenLiveChatWebSocketData, OpenUnifiedChatWebSocketData, ListChatSessionsData, ListChatSessionsError, ListChatSessionsResponse, CreateChatSessionData, CreateChatSessionError, CreateChatSessionResponse, BatchDeleteChatSessionsData, BatchDeleteChatSessionsError, BatchDeleteChatSessionsResponse, GetChatSessionData, GetChatSessionError, GetChatSessionResponse, UpdateChatSessionData, UpdateChatSessionError, UpdateChatSessionResponse, DeleteChatSessionData, DeleteChatSessionError, DeleteChatSessionResponse, StopChatSessionData, StopChatSessionError, StopChatSessionResponse, UpdateChatMessageData, UpdateChatMessageError, UpdateChatMessageResponse, RegenerateChatMessageData, RegenerateChatMessageError, RegenerateChatMessageResponse, ListChatConfigsError, ListChatConfigsResponse, CreateChatThreadData, CreateChatThreadError, CreateChatThreadResponse, GetChatThreadData, GetChatThreadError, GetChatThreadResponse, DeleteChatThreadData, DeleteChatThreadError, DeleteChatThreadResponse, SendChatThreadMessageData, SendChatThreadMessageError, SendChatThreadMessageResponse, ListChatProjectsError, ListChatProjectsResponse, CreateChatProjectData, CreateChatProjectError, CreateChatProjectResponse, GetChatProjectData, GetChatProjectError, GetChatProjectResponse, UpdateChatProjectData, UpdateChatProjectError, UpdateChatProjectResponse, DeleteChatProjectData, DeleteChatProjectError, DeleteChatProjectResponse, ListChatProjectSessionsData, ListChatProjectSessionsError, ListChatProjectSessionsResponse, AddChatProjectSessionData, AddChatProjectSessionError, AddChatProjectSessionResponse, RemoveChatProjectSessionData, RemoveChatProjectSessionError, RemoveChatProjectSessionResponse, SendImMessageData, SendImMessageError, SendImMessageResponse, ListImBotsError, ListImBotsResponse, UploadFileData, UploadFileError, UploadFileResponse, UploadOpenApiFileData, UploadOpenApiFileError, UploadOpenApiFileResponse, DownloadOpenApiFileData, DownloadOpenApiFileError, DownloadOpenApiFileResponse, GetFileByNameData, GetFileByNameError, GetFileByNameResponse, GetTokenFileData, GetTokenFileError, GetTokenFileResponse, GetAttachmentData, GetAttachmentError, GetAttachmentResponse, DeleteAttachmentData, DeleteAttachmentError, DeleteAttachmentResponse, DownloadAttachmentData, DownloadAttachmentError, DownloadAttachmentResponse, ListPluginsData, ListPluginsError, ListPluginsResponse, GetPluginByIdData, GetPluginByIdError, GetPluginByIdResponse, UninstallPluginByIdData, UninstallPluginByIdError, UninstallPluginByIdResponse, GetPluginConfigByIdData, GetPluginConfigByIdError, GetPluginConfigByIdResponse, UpdatePluginConfigByIdData, UpdatePluginConfigByIdError, UpdatePluginConfigByIdResponse, GetPluginConfigSchemaByIdData, GetPluginConfigSchemaByIdError, GetPluginConfigSchemaByIdResponse, ListPluginConfigFilesByIdData, ListPluginConfigFilesByIdError, ListPluginConfigFilesByIdResponse, UploadPluginConfigFilesByIdData, UploadPluginConfigFilesByIdError, UploadPluginConfigFilesByIdResponse, DeletePluginConfigFileByIdData, DeletePluginConfigFileByIdError, DeletePluginConfigFileByIdResponse, GetPluginReadmeByIdData, GetPluginReadmeByIdError, GetPluginReadmeByIdResponse, GetPluginChangelogByIdData, GetPluginChangelogByIdError, GetPluginChangelogByIdResponse, ReloadPluginByIdData, ReloadPluginByIdError, ReloadPluginByIdResponse, SetPluginEnabledByIdData, SetPluginEnabledByIdError, SetPluginEnabledByIdResponse, ListPluginPagesByIdData, ListPluginPagesByIdError, ListPluginPagesByIdResponse, GetPluginPageByIdData, GetPluginPageByIdError, GetPluginPageByIdResponse, GetPluginPageAssetByIdData, GetPluginPageAssetByIdError, GetPluginPageAssetByIdResponse, GetPluginData, GetPluginError, GetPluginResponse, UninstallPluginData, UninstallPluginError, UninstallPluginResponse, GetPluginConfigData, GetPluginConfigError, GetPluginConfigResponse, UpdatePluginConfigData, UpdatePluginConfigError, UpdatePluginConfigResponse, GetPluginConfigSchemaData, GetPluginConfigSchemaError, GetPluginConfigSchemaResponse, ListPluginConfigFilesData, ListPluginConfigFilesError, ListPluginConfigFilesResponse, UploadPluginConfigFilesData, UploadPluginConfigFilesError, UploadPluginConfigFilesResponse, DeletePluginConfigFileData, DeletePluginConfigFileError, DeletePluginConfigFileResponse, GetPluginReadmeData, GetPluginReadmeError, GetPluginReadmeResponse, GetPluginChangelogData, GetPluginChangelogError, GetPluginChangelogResponse, ReloadPluginData, ReloadPluginError, ReloadPluginResponse, BindPluginSourceData, BindPluginSourceError, BindPluginSourceResponse, SetPluginEnabledData, SetPluginEnabledError, SetPluginEnabledResponse, UpdatePluginData, UpdatePluginError, UpdatePluginResponse, UpdatePluginsData, UpdatePluginsError, UpdatePluginsResponse, CheckPluginVersionSupportData, CheckPluginVersionSupportError, CheckPluginVersionSupportResponse, ValidatePluginRepoData, ValidatePluginRepoError, ValidatePluginRepoResponse, ListFailedPluginsError, ListFailedPluginsResponse, UninstallFailedPluginData, UninstallFailedPluginError, UninstallFailedPluginResponse, ReloadFailedPluginData, ReloadFailedPluginError, ReloadFailedPluginResponse, InstallPluginFromGithubData, InstallPluginFromGithubError, InstallPluginFromGithubResponse, InstallPluginFromUrlData, InstallPluginFromUrlError, InstallPluginFromUrlResponse, InstallPluginFromUploadData, InstallPluginFromUploadError, InstallPluginFromUploadResponse, ListPluginMarketData, ListPluginMarketError, ListPluginMarketResponse, ListPluginMarketCategoriesError, ListPluginMarketCategoriesResponse, ListPluginSourcesError, ListPluginSourcesResponse, CreatePluginSourceData, CreatePluginSourceError, CreatePluginSourceResponse, ReplacePluginSourcesData, ReplacePluginSourcesError, ReplacePluginSourcesResponse, DeletePluginSourceData, DeletePluginSourceError, DeletePluginSourceResponse, DeletePluginSourceByIdData, DeletePluginSourceByIdError, DeletePluginSourceByIdResponse, ListPluginPagesData, ListPluginPagesError, ListPluginPagesResponse, GetPluginPageData, GetPluginPageError, GetPluginPageResponse, GetPluginPageAssetData, GetPluginPageAssetError, GetPluginPageAssetResponse, GetPluginPageBridgeSdkError, GetPluginPageBridgeSdkResponse, GetPluginExtensionRouteData, GetPluginExtensionRouteError, GetPluginExtensionRouteResponse, PostPluginExtensionRouteData, PostPluginExtensionRouteError, PostPluginExtensionRouteResponse, PutPluginExtensionRouteData, PutPluginExtensionRouteError, PutPluginExtensionRouteResponse, PatchPluginExtensionRouteData, PatchPluginExtensionRouteError, PatchPluginExtensionRouteResponse, DeletePluginExtensionRouteData, DeletePluginExtensionRouteError, DeletePluginExtensionRouteResponse, ListCommandsData, ListCommandsError, ListCommandsResponse, UpdateCommandData, UpdateCommandError, UpdateCommandResponse, ListCommandConflictsError, ListCommandConflictsResponse, ListToolsData, ListToolsError, ListToolsResponse, SetToolEnabledData, SetToolEnabledError, SetToolEnabledResponse, SetToolPermissionData, SetToolPermissionError, SetToolPermissionResponse, ListMcpServersError, ListMcpServersResponse, CreateMcpServerData, CreateMcpServerError, CreateMcpServerResponse, UpdateMcpServerByNameData, UpdateMcpServerByNameError, UpdateMcpServerByNameResponse, DeleteMcpServerByNameData, DeleteMcpServerByNameError, DeleteMcpServerByNameResponse, SetMcpServerEnabledByNameData, SetMcpServerEnabledByNameError, SetMcpServerEnabledByNameResponse, TestMcpServerByNameData, TestMcpServerByNameError, TestMcpServerByNameResponse, UpdateMcpServerData, UpdateMcpServerError, UpdateMcpServerResponse, DeleteMcpServerData, DeleteMcpServerError, DeleteMcpServerResponse, SetMcpServerEnabledData, SetMcpServerEnabledError, SetMcpServerEnabledResponse, TestMcpServerData, TestMcpServerError, TestMcpServerResponse, SyncModelScopeMcpServersData, SyncModelScopeMcpServersError, SyncModelScopeMcpServersResponse, ListSkillsData, ListSkillsError, ListSkillsResponse, UploadSkillData, UploadSkillError, UploadSkillResponse, UploadSkillsBatchData, UploadSkillsBatchError, UploadSkillsBatchResponse, UpdateSkillByNameData, UpdateSkillByNameError, UpdateSkillByNameResponse, DeleteSkillByNameData, DeleteSkillByNameError, DeleteSkillByNameResponse, DownloadSkillByNameData, DownloadSkillByNameError, DownloadSkillByNameResponse, ListSkillFilesByNameData, ListSkillFilesByNameError, ListSkillFilesByNameResponse, GetSkillFileByNameData, GetSkillFileByNameError, GetSkillFileByNameResponse, UpdateSkillFileByNameData, UpdateSkillFileByNameError, UpdateSkillFileByNameResponse, UpdateSkillData, UpdateSkillError, UpdateSkillResponse, DeleteSkillData, DeleteSkillError, DeleteSkillResponse, DownloadSkillData, DownloadSkillError, DownloadSkillResponse, ListSkillFilesData, ListSkillFilesError, ListSkillFilesResponse, GetSkillFileData, GetSkillFileError, GetSkillFileResponse, UpdateSkillFileData, UpdateSkillFileError, UpdateSkillFileResponse, ListNeoSkillCandidatesData, ListNeoSkillCandidatesError, ListNeoSkillCandidatesResponse, ListNeoSkillReleasesData, ListNeoSkillReleasesError, ListNeoSkillReleasesResponse, GetNeoSkillPayloadData, GetNeoSkillPayloadError, GetNeoSkillPayloadResponse, EvaluateNeoSkillCandidateData, EvaluateNeoSkillCandidateError, EvaluateNeoSkillCandidateResponse, PromoteNeoSkillCandidateData, PromoteNeoSkillCandidateError, PromoteNeoSkillCandidateResponse, RollbackNeoSkillReleaseData, RollbackNeoSkillReleaseError, RollbackNeoSkillReleaseResponse, SyncNeoSkillReleaseData, SyncNeoSkillReleaseError, SyncNeoSkillReleaseResponse, DeleteNeoSkillCandidateData, DeleteNeoSkillCandidateError, DeleteNeoSkillCandidateResponse, DeleteNeoSkillReleaseData, DeleteNeoSkillReleaseError, DeleteNeoSkillReleaseResponse, ListKnowledgeBasesData, ListKnowledgeBasesError, ListKnowledgeBasesResponse, CreateKnowledgeBaseData, CreateKnowledgeBaseError, CreateKnowledgeBaseResponse, GetKnowledgeBaseData, GetKnowledgeBaseError, GetKnowledgeBaseResponse, UpdateKnowledgeBaseData, UpdateKnowledgeBaseError, UpdateKnowledgeBaseResponse, DeleteKnowledgeBaseData, DeleteKnowledgeBaseError, DeleteKnowledgeBaseResponse, GetKnowledgeBaseStatsData, GetKnowledgeBaseStatsError, GetKnowledgeBaseStatsResponse, ListKnowledgeDocumentsData, ListKnowledgeDocumentsError, ListKnowledgeDocumentsResponse, UploadKnowledgeDocumentData, UploadKnowledgeDocumentError, UploadKnowledgeDocumentResponse, ImportKnowledgeDocumentsData, ImportKnowledgeDocumentsError, ImportKnowledgeDocumentsResponse, ImportKnowledgeDocumentFromUrlData, ImportKnowledgeDocumentFromUrlError, ImportKnowledgeDocumentFromUrlResponse, GetKnowledgeDocumentData, GetKnowledgeDocumentError, GetKnowledgeDocumentResponse, DeleteKnowledgeDocumentData, DeleteKnowledgeDocumentError, DeleteKnowledgeDocumentResponse, ListKnowledgeChunksData, ListKnowledgeChunksError, ListKnowledgeChunksResponse, DeleteKnowledgeChunkData, DeleteKnowledgeChunkError, DeleteKnowledgeChunkResponse, RetrieveKnowledgeBaseData, RetrieveKnowledgeBaseError, RetrieveKnowledgeBaseResponse, GetKnowledgeTaskData, GetKnowledgeTaskError, GetKnowledgeTaskResponse, GetPersonaTreeError, GetPersonaTreeResponse, ListPersonasData, ListPersonasError, ListPersonasResponse, CreatePersonaData, CreatePersonaError, CreatePersonaResponse, GetPersonaByIdData, GetPersonaByIdError, GetPersonaByIdResponse, UpdatePersonaByIdData, UpdatePersonaByIdError, UpdatePersonaByIdResponse, DeletePersonaByIdData, DeletePersonaByIdError, DeletePersonaByIdResponse, GetPersonaData, GetPersonaError, GetPersonaResponse, UpdatePersonaData, UpdatePersonaError, UpdatePersonaResponse, DeletePersonaData, DeletePersonaError, DeletePersonaResponse, ListPersonaFoldersData, ListPersonaFoldersError, ListPersonaFoldersResponse, CreatePersonaFolderData, CreatePersonaFolderError, CreatePersonaFolderResponse, UpdatePersonaFolderData, UpdatePersonaFolderError, UpdatePersonaFolderResponse, DeletePersonaFolderData, DeletePersonaFolderError, DeletePersonaFolderResponse, MovePersonaItemData, MovePersonaItemError, MovePersonaItemResponse, ReorderPersonaItemsData, ReorderPersonaItemsError, ReorderPersonaItemsResponse, ListSessionsData, ListSessionsError, ListSessionsResponse, ListActiveUmosError, ListActiveUmosResponse, ListSessionRulesData, ListSessionRulesError, ListSessionRulesResponse, UpsertSessionRuleData, UpsertSessionRuleError, UpsertSessionRuleResponse, DeleteSessionRulesData, DeleteSessionRulesError, DeleteSessionRulesResponse, ListSessionConfigOverridesData, ListSessionConfigOverridesError, ListSessionConfigOverridesResponse, UpsertSessionConfigOverrideData, UpsertSessionConfigOverrideError, UpsertSessionConfigOverrideResponse, DeleteSessionConfigOverrideData, DeleteSessionConfigOverrideError, DeleteSessionConfigOverrideResponse, UpsertSessionAliasData, UpsertSessionAliasError, UpsertSessionAliasResponse, BatchUpdateSessionProviderData, BatchUpdateSessionProviderError, BatchUpdateSessionProviderResponse, BatchUpdateSessionServiceData, BatchUpdateSessionServiceError, BatchUpdateSessionServiceResponse, ListSessionGroupsError, ListSessionGroupsResponse, CreateSessionGroupData, CreateSessionGroupError, CreateSessionGroupResponse, UpdateSessionGroupData, UpdateSessionGroupError, UpdateSessionGroupResponse, DeleteSessionGroupData, DeleteSessionGroupError, DeleteSessionGroupResponse, ListConversationsData, ListConversationsError, ListConversationsResponse, BatchDeleteConversationsData, BatchDeleteConversationsError, BatchDeleteConversationsResponse, GetConversationData, GetConversationError, GetConversationResponse, UpdateConversationData, UpdateConversationError, UpdateConversationResponse, DeleteConversationData, DeleteConversationError, DeleteConversationResponse, ReplaceConversationMessagesData, ReplaceConversationMessagesError, ReplaceConversationMessagesResponse, ExportConversationsData, ExportConversationsError, ExportConversationsResponse, GetStatsData, GetStatsError, GetStatsResponse, GetProviderTokenStatsData, GetProviderTokenStatsError, GetProviderTokenStatsResponse, GetVersionError, GetVersionResponse, GetPublicVersionsError, GetPublicVersionsResponse, GetFirstNoticeData, GetFirstNoticeError, GetFirstNoticeResponse, TestGhproxyConnectionData, TestGhproxyConnectionError, TestGhproxyConnectionResponse, ListChangelogVersionsError, ListChangelogVersionsResponse, GetChangelogData, GetChangelogError, GetChangelogResponse, GetStartTimeError, GetStartTimeResponse, GetStorageStatusError, GetStorageStatusResponse, CleanupStorageData, CleanupStorageError, CleanupStorageResponse, RestartCoreError, RestartCoreResponse, ListBackupsData, ListBackupsError, ListBackupsResponse, CreateBackupData, CreateBackupError, CreateBackupResponse, UploadBackupData, UploadBackupError, UploadBackupResponse, InitBackupUploadData, InitBackupUploadError, InitBackupUploadResponse, UploadBackupChunkData, UploadBackupChunkError, UploadBackupChunkResponse, CompleteBackupUploadData, CompleteBackupUploadError, CompleteBackupUploadResponse, AbortBackupUploadData, AbortBackupUploadError, AbortBackupUploadResponse, GetBackupProgressData, GetBackupProgressError, GetBackupProgressResponse, DownloadBackupData, DownloadBackupError, DownloadBackupResponse, RenameBackupData, RenameBackupError, RenameBackupResponse, DeleteBackupData, DeleteBackupError, DeleteBackupResponse, CheckBackupData, CheckBackupError, CheckBackupResponse, ImportBackupData, ImportBackupError, ImportBackupResponse, CheckUpdateError, CheckUpdateResponse, ListReleasesData, ListReleasesError, ListReleasesResponse, UpdateCoreData, UpdateCoreError, UpdateCoreResponse, UpdateDashboardData, UpdateDashboardError, UpdateDashboardResponse, GetUpdateProgressData, GetUpdateProgressError, GetUpdateProgressResponse, InstallPipPackageData, InstallPipPackageError, InstallPipPackageResponse, ListCronJobsData, ListCronJobsError, ListCronJobsResponse, CreateCronJobData, CreateCronJobError, CreateCronJobResponse, UpdateCronJobData, UpdateCronJobError, UpdateCronJobResponse, DeleteCronJobData, DeleteCronJobError, DeleteCronJobResponse, RunCronJobData, RunCronJobError, RunCronJobResponse, StreamLiveLogsError, StreamLiveLogsResponse, GetLogHistoryError, GetLogHistoryResponse, GetTraceSettingsError, GetTraceSettingsResponse, UpdateTraceSettingsData, UpdateTraceSettingsError, UpdateTraceSettingsResponse, ListT2iTemplatesError, ListT2iTemplatesResponse, CreateT2iTemplateData, CreateT2iTemplateError, CreateT2iTemplateResponse, GetActiveT2iTemplateError, GetActiveT2iTemplateResponse, SetActiveT2iTemplateData, SetActiveT2iTemplateError, SetActiveT2iTemplateResponse, ResetDefaultT2iTemplateError, ResetDefaultT2iTemplateResponse, GetT2iTemplateData, GetT2iTemplateError, GetT2iTemplateResponse, UpdateT2iTemplateData, UpdateT2iTemplateError, UpdateT2iTemplateResponse, DeleteT2iTemplateData, DeleteT2iTemplateError, DeleteT2iTemplateResponse, GetSubagentConfigError, GetSubagentConfigResponse, UpdateSubagentConfigData, UpdateSubagentConfigError, UpdateSubagentConfigResponse, ListSubagentAvailableToolsError, ListSubagentAvailableToolsResponse, VerifyPlatformWebhookData, VerifyPlatformWebhookError, VerifyPlatformWebhookResponse, ReceivePlatformWebhookData, ReceivePlatformWebhookError, ReceivePlatformWebhookResponse } from './types.gen'; +import type { LoginData, LoginError, LoginResponse, LogoutError, LogoutResponse, GetAuthSetupStatusError, GetAuthSetupStatusResponse, SetupAuthData, SetupAuthError, SetupAuthResponse, SetupTotpData, SetupTotpError, SetupTotpResponse, RecoverTotpError, RecoverTotpResponse, UpdateAuthAccountData, UpdateAuthAccountError, UpdateAuthAccountResponse, ListApiKeysError, ListApiKeysResponse, CreateApiKeyData, CreateApiKeyError, CreateApiKeyResponse, RevokeApiKeyData, RevokeApiKeyError, RevokeApiKeyResponse, DeleteApiKeyData, DeleteApiKeyError, DeleteApiKeyResponse, GetSystemConfigSchemaError, GetSystemConfigSchemaResponse, GetSystemConfigError, GetSystemConfigResponse, UpdateSystemConfigData, UpdateSystemConfigError, UpdateSystemConfigResponse, GetSystemConfigRuntimeError, GetSystemConfigRuntimeResponse, GetConfigProfileSchemaError, GetConfigProfileSchemaResponse, ListConfigProfilesError, ListConfigProfilesResponse, CreateConfigProfileData, CreateConfigProfileError, CreateConfigProfileResponse, GetConfigProfileData, GetConfigProfileError, GetConfigProfileResponse, UpdateConfigProfileContentData, UpdateConfigProfileContentError, UpdateConfigProfileContentResponse, RenameConfigProfileData, RenameConfigProfileError, RenameConfigProfileResponse, DeleteConfigProfileData, DeleteConfigProfileError, DeleteConfigProfileResponse, ListConfigRoutesError, ListConfigRoutesResponse, ReplaceConfigRoutesData, ReplaceConfigRoutesError, ReplaceConfigRoutesResponse, UpsertConfigRouteData, UpsertConfigRouteError, UpsertConfigRouteResponse, DeleteConfigRouteData, DeleteConfigRouteError, DeleteConfigRouteResponse, ListBotTypesError, ListBotTypesResponse, RegisterBotTypeData, RegisterBotTypeError, RegisterBotTypeResponse, ListBotsData, ListBotsError, ListBotsResponse, CreateBotData, CreateBotError, CreateBotResponse, ListBotStatsError, ListBotStatsResponse, GetBotByIdData, GetBotByIdError, GetBotByIdResponse, UpdateBotByIdData, UpdateBotByIdError, UpdateBotByIdResponse, DeleteBotByIdData, DeleteBotByIdError, DeleteBotByIdResponse, SetBotEnabledByIdData, SetBotEnabledByIdError, SetBotEnabledByIdResponse, TestBotByIdData, TestBotByIdError, TestBotByIdResponse, GetBotData, GetBotError, GetBotResponse, UpdateBotData, UpdateBotError, UpdateBotResponse, DeleteBotData, DeleteBotError, DeleteBotResponse, SetBotEnabledData, SetBotEnabledError, SetBotEnabledResponse, TestBotData, TestBotError, TestBotResponse, GetProviderSchemaError, GetProviderSchemaResponse, ListProviderSourcesError, ListProviderSourcesResponse, CreateProviderSourceData, CreateProviderSourceError, CreateProviderSourceResponse, GetProviderSourceByIdData, GetProviderSourceByIdError, GetProviderSourceByIdResponse, UpsertProviderSourceByIdData, UpsertProviderSourceByIdError, UpsertProviderSourceByIdResponse, DeleteProviderSourceByIdData, DeleteProviderSourceByIdError, DeleteProviderSourceByIdResponse, ListProviderSourceModelsByIdData, ListProviderSourceModelsByIdError, ListProviderSourceModelsByIdResponse, ListProvidersBySourceIdData, ListProvidersBySourceIdError, ListProvidersBySourceIdResponse, CreateProviderInSourceByIdData, CreateProviderInSourceByIdError, CreateProviderInSourceByIdResponse, GetProviderSourceData, GetProviderSourceError, GetProviderSourceResponse, UpsertProviderSourceData, UpsertProviderSourceError, UpsertProviderSourceResponse, DeleteProviderSourceData, DeleteProviderSourceError, DeleteProviderSourceResponse, ListProviderSourceModelsData, ListProviderSourceModelsError, ListProviderSourceModelsResponse, ListProvidersBySourceData, ListProvidersBySourceError, ListProvidersBySourceResponse, CreateProviderInSourceData, CreateProviderInSourceError, CreateProviderInSourceResponse, ListProvidersData, ListProvidersError, ListProvidersResponse, CreateProviderData, CreateProviderError, CreateProviderResponse, GetProviderByIdData, GetProviderByIdError, GetProviderByIdResponse, UpdateProviderByIdData, UpdateProviderByIdError, UpdateProviderByIdResponse, DeleteProviderByIdData, DeleteProviderByIdError, DeleteProviderByIdResponse, SetProviderEnabledByIdData, SetProviderEnabledByIdError, SetProviderEnabledByIdResponse, TestProviderByIdData, TestProviderByIdError, TestProviderByIdResponse, GetProviderEmbeddingDimensionByIdData, GetProviderEmbeddingDimensionByIdError, GetProviderEmbeddingDimensionByIdResponse, GetProviderData, GetProviderError, GetProviderResponse, UpdateProviderData, UpdateProviderError, UpdateProviderResponse, DeleteProviderData, DeleteProviderError, DeleteProviderResponse, SetProviderEnabledData, SetProviderEnabledError, SetProviderEnabledResponse, TestProviderData, TestProviderError, TestProviderResponse, GetProviderEmbeddingDimensionData, GetProviderEmbeddingDimensionError, GetProviderEmbeddingDimensionResponse, SendChatMessageData, SendChatMessageError, SendChatMessageResponse, OpenChatWebSocketData, OpenLiveChatWebSocketData, OpenUnifiedChatWebSocketData, ListChatSessionsData, ListChatSessionsError, ListChatSessionsResponse, CreateChatSessionData, CreateChatSessionError, CreateChatSessionResponse, BatchDeleteChatSessionsData, BatchDeleteChatSessionsError, BatchDeleteChatSessionsResponse, GetChatSessionData, GetChatSessionError, GetChatSessionResponse, UpdateChatSessionData, UpdateChatSessionError, UpdateChatSessionResponse, DeleteChatSessionData, DeleteChatSessionError, DeleteChatSessionResponse, StopChatSessionData, StopChatSessionError, StopChatSessionResponse, UpdateChatMessageData, UpdateChatMessageError, UpdateChatMessageResponse, RegenerateChatMessageData, RegenerateChatMessageError, RegenerateChatMessageResponse, ListChatConfigsError, ListChatConfigsResponse, CreateChatThreadData, CreateChatThreadError, CreateChatThreadResponse, GetChatThreadData, GetChatThreadError, GetChatThreadResponse, DeleteChatThreadData, DeleteChatThreadError, DeleteChatThreadResponse, SendChatThreadMessageData, SendChatThreadMessageError, SendChatThreadMessageResponse, ListChatProjectsError, ListChatProjectsResponse, CreateChatProjectData, CreateChatProjectError, CreateChatProjectResponse, GetChatProjectData, GetChatProjectError, GetChatProjectResponse, UpdateChatProjectData, UpdateChatProjectError, UpdateChatProjectResponse, DeleteChatProjectData, DeleteChatProjectError, DeleteChatProjectResponse, ListChatProjectSessionsData, ListChatProjectSessionsError, ListChatProjectSessionsResponse, AddChatProjectSessionData, AddChatProjectSessionError, AddChatProjectSessionResponse, RemoveChatProjectSessionData, RemoveChatProjectSessionError, RemoveChatProjectSessionResponse, SendImMessageData, SendImMessageError, SendImMessageResponse, ListImBotsError, ListImBotsResponse, UploadFileData, UploadFileError, UploadFileResponse, UploadOpenApiFileData, UploadOpenApiFileError, UploadOpenApiFileResponse, DownloadOpenApiFileData, DownloadOpenApiFileError, DownloadOpenApiFileResponse, GetFileByNameData, GetFileByNameError, GetFileByNameResponse, GetTokenFileData, GetTokenFileError, GetTokenFileResponse, GetAttachmentData, GetAttachmentError, GetAttachmentResponse, DeleteAttachmentData, DeleteAttachmentError, DeleteAttachmentResponse, DownloadAttachmentData, DownloadAttachmentError, DownloadAttachmentResponse, ListPluginsData, ListPluginsError, ListPluginsResponse, GetPluginByIdData, GetPluginByIdError, GetPluginByIdResponse, UninstallPluginByIdData, UninstallPluginByIdError, UninstallPluginByIdResponse, GetPluginConfigByIdData, GetPluginConfigByIdError, GetPluginConfigByIdResponse, UpdatePluginConfigByIdData, UpdatePluginConfigByIdError, UpdatePluginConfigByIdResponse, GetPluginConfigSchemaByIdData, GetPluginConfigSchemaByIdError, GetPluginConfigSchemaByIdResponse, ListPluginConfigFilesByIdData, ListPluginConfigFilesByIdError, ListPluginConfigFilesByIdResponse, UploadPluginConfigFilesByIdData, UploadPluginConfigFilesByIdError, UploadPluginConfigFilesByIdResponse, DeletePluginConfigFileByIdData, DeletePluginConfigFileByIdError, DeletePluginConfigFileByIdResponse, GetPluginReadmeByIdData, GetPluginReadmeByIdError, GetPluginReadmeByIdResponse, GetPluginChangelogByIdData, GetPluginChangelogByIdError, GetPluginChangelogByIdResponse, ReloadPluginByIdData, ReloadPluginByIdError, ReloadPluginByIdResponse, SetPluginEnabledByIdData, SetPluginEnabledByIdError, SetPluginEnabledByIdResponse, ListPluginPagesByIdData, ListPluginPagesByIdError, ListPluginPagesByIdResponse, GetPluginPageByIdData, GetPluginPageByIdError, GetPluginPageByIdResponse, GetPluginPageAssetByIdData, GetPluginPageAssetByIdError, GetPluginPageAssetByIdResponse, GetPluginData, GetPluginError, GetPluginResponse, UninstallPluginData, UninstallPluginError, UninstallPluginResponse, GetPluginConfigData, GetPluginConfigError, GetPluginConfigResponse, UpdatePluginConfigData, UpdatePluginConfigError, UpdatePluginConfigResponse, GetPluginConfigSchemaData, GetPluginConfigSchemaError, GetPluginConfigSchemaResponse, ListPluginConfigFilesData, ListPluginConfigFilesError, ListPluginConfigFilesResponse, UploadPluginConfigFilesData, UploadPluginConfigFilesError, UploadPluginConfigFilesResponse, DeletePluginConfigFileData, DeletePluginConfigFileError, DeletePluginConfigFileResponse, GetPluginReadmeData, GetPluginReadmeError, GetPluginReadmeResponse, GetPluginChangelogData, GetPluginChangelogError, GetPluginChangelogResponse, ReloadPluginData, ReloadPluginError, ReloadPluginResponse, BindPluginSourceData, BindPluginSourceError, BindPluginSourceResponse, SetPluginEnabledData, SetPluginEnabledError, SetPluginEnabledResponse, UpdatePluginData, UpdatePluginError, UpdatePluginResponse, UpdatePluginsData, UpdatePluginsError, UpdatePluginsResponse, CheckPluginVersionSupportData, CheckPluginVersionSupportError, CheckPluginVersionSupportResponse, ValidatePluginRepoData, ValidatePluginRepoError, ValidatePluginRepoResponse, ListFailedPluginsError, ListFailedPluginsResponse, UninstallFailedPluginData, UninstallFailedPluginError, UninstallFailedPluginResponse, ReloadFailedPluginData, ReloadFailedPluginError, ReloadFailedPluginResponse, InstallPluginFromGithubData, InstallPluginFromGithubError, InstallPluginFromGithubResponse, InstallPluginFromUrlData, InstallPluginFromUrlError, InstallPluginFromUrlResponse, InstallPluginFromUploadData, InstallPluginFromUploadError, InstallPluginFromUploadResponse, ListPluginMarketData, ListPluginMarketError, ListPluginMarketResponse, ListPluginMarketCategoriesError, ListPluginMarketCategoriesResponse, ListPluginSourcesError, ListPluginSourcesResponse, CreatePluginSourceData, CreatePluginSourceError, CreatePluginSourceResponse, ReplacePluginSourcesData, ReplacePluginSourcesError, ReplacePluginSourcesResponse, DeletePluginSourceData, DeletePluginSourceError, DeletePluginSourceResponse, DeletePluginSourceByIdData, DeletePluginSourceByIdError, DeletePluginSourceByIdResponse, ListPluginPagesData, ListPluginPagesError, ListPluginPagesResponse, GetPluginPageData, GetPluginPageError, GetPluginPageResponse, GetPluginPageAssetData, GetPluginPageAssetError, GetPluginPageAssetResponse, GetPluginPageBridgeSdkError, GetPluginPageBridgeSdkResponse, GetPluginExtensionRouteData, GetPluginExtensionRouteError, GetPluginExtensionRouteResponse, PostPluginExtensionRouteData, PostPluginExtensionRouteError, PostPluginExtensionRouteResponse, PutPluginExtensionRouteData, PutPluginExtensionRouteError, PutPluginExtensionRouteResponse, PatchPluginExtensionRouteData, PatchPluginExtensionRouteError, PatchPluginExtensionRouteResponse, DeletePluginExtensionRouteData, DeletePluginExtensionRouteError, DeletePluginExtensionRouteResponse, ListCommandsData, ListCommandsError, ListCommandsResponse, UpdateCommandData, UpdateCommandError, UpdateCommandResponse, ListCommandConflictsError, ListCommandConflictsResponse, ListToolsData, ListToolsError, ListToolsResponse, SetToolEnabledData, SetToolEnabledError, SetToolEnabledResponse, SetToolPermissionData, SetToolPermissionError, SetToolPermissionResponse, ListMcpServersError, ListMcpServersResponse, CreateMcpServerData, CreateMcpServerError, CreateMcpServerResponse, UpdateMcpServerByNameData, UpdateMcpServerByNameError, UpdateMcpServerByNameResponse, DeleteMcpServerByNameData, DeleteMcpServerByNameError, DeleteMcpServerByNameResponse, SetMcpServerEnabledByNameData, SetMcpServerEnabledByNameError, SetMcpServerEnabledByNameResponse, TestMcpServerByNameData, TestMcpServerByNameError, TestMcpServerByNameResponse, UpdateMcpServerData, UpdateMcpServerError, UpdateMcpServerResponse, DeleteMcpServerData, DeleteMcpServerError, DeleteMcpServerResponse, SetMcpServerEnabledData, SetMcpServerEnabledError, SetMcpServerEnabledResponse, TestMcpServerData, TestMcpServerError, TestMcpServerResponse, SyncModelScopeMcpServersData, SyncModelScopeMcpServersError, SyncModelScopeMcpServersResponse, ListSkillsData, ListSkillsError, ListSkillsResponse, UploadSkillData, UploadSkillError, UploadSkillResponse, UploadSkillsBatchData, UploadSkillsBatchError, UploadSkillsBatchResponse, UpdateSkillByNameData, UpdateSkillByNameError, UpdateSkillByNameResponse, DeleteSkillByNameData, DeleteSkillByNameError, DeleteSkillByNameResponse, DownloadSkillByNameData, DownloadSkillByNameError, DownloadSkillByNameResponse, ListSkillFilesByNameData, ListSkillFilesByNameError, ListSkillFilesByNameResponse, GetSkillFileByNameData, GetSkillFileByNameError, GetSkillFileByNameResponse, UpdateSkillFileByNameData, UpdateSkillFileByNameError, UpdateSkillFileByNameResponse, UpdateSkillData, UpdateSkillError, UpdateSkillResponse, DeleteSkillData, DeleteSkillError, DeleteSkillResponse, DownloadSkillData, DownloadSkillError, DownloadSkillResponse, ListSkillFilesData, ListSkillFilesError, ListSkillFilesResponse, GetSkillFileData, GetSkillFileError, GetSkillFileResponse, UpdateSkillFileData, UpdateSkillFileError, UpdateSkillFileResponse, ListNeoSkillCandidatesData, ListNeoSkillCandidatesError, ListNeoSkillCandidatesResponse, ListNeoSkillReleasesData, ListNeoSkillReleasesError, ListNeoSkillReleasesResponse, GetNeoSkillPayloadData, GetNeoSkillPayloadError, GetNeoSkillPayloadResponse, EvaluateNeoSkillCandidateData, EvaluateNeoSkillCandidateError, EvaluateNeoSkillCandidateResponse, PromoteNeoSkillCandidateData, PromoteNeoSkillCandidateError, PromoteNeoSkillCandidateResponse, RollbackNeoSkillReleaseData, RollbackNeoSkillReleaseError, RollbackNeoSkillReleaseResponse, SyncNeoSkillReleaseData, SyncNeoSkillReleaseError, SyncNeoSkillReleaseResponse, DeleteNeoSkillCandidateData, DeleteNeoSkillCandidateError, DeleteNeoSkillCandidateResponse, DeleteNeoSkillReleaseData, DeleteNeoSkillReleaseError, DeleteNeoSkillReleaseResponse, ListKnowledgeBasesData, ListKnowledgeBasesError, ListKnowledgeBasesResponse, CreateKnowledgeBaseData, CreateKnowledgeBaseError, CreateKnowledgeBaseResponse, GetKnowledgeBaseData, GetKnowledgeBaseError, GetKnowledgeBaseResponse, UpdateKnowledgeBaseData, UpdateKnowledgeBaseError, UpdateKnowledgeBaseResponse, DeleteKnowledgeBaseData, DeleteKnowledgeBaseError, DeleteKnowledgeBaseResponse, GetKnowledgeBaseStatsData, GetKnowledgeBaseStatsError, GetKnowledgeBaseStatsResponse, ListKnowledgeDocumentsData, ListKnowledgeDocumentsError, ListKnowledgeDocumentsResponse, UploadKnowledgeDocumentData, UploadKnowledgeDocumentError, UploadKnowledgeDocumentResponse, ImportKnowledgeDocumentsData, ImportKnowledgeDocumentsError, ImportKnowledgeDocumentsResponse, ImportKnowledgeDocumentFromUrlData, ImportKnowledgeDocumentFromUrlError, ImportKnowledgeDocumentFromUrlResponse, GetKnowledgeDocumentData, GetKnowledgeDocumentError, GetKnowledgeDocumentResponse, DeleteKnowledgeDocumentData, DeleteKnowledgeDocumentError, DeleteKnowledgeDocumentResponse, ListKnowledgeChunksData, ListKnowledgeChunksError, ListKnowledgeChunksResponse, DeleteKnowledgeChunkData, DeleteKnowledgeChunkError, DeleteKnowledgeChunkResponse, RetrieveKnowledgeBaseData, RetrieveKnowledgeBaseError, RetrieveKnowledgeBaseResponse, GetKnowledgeTaskData, GetKnowledgeTaskError, GetKnowledgeTaskResponse, GetPersonaTreeError, GetPersonaTreeResponse, ListPersonasData, ListPersonasError, ListPersonasResponse, CreatePersonaData, CreatePersonaError, CreatePersonaResponse, GetPersonaByIdData, GetPersonaByIdError, GetPersonaByIdResponse, UpdatePersonaByIdData, UpdatePersonaByIdError, UpdatePersonaByIdResponse, DeletePersonaByIdData, DeletePersonaByIdError, DeletePersonaByIdResponse, GetPersonaData, GetPersonaError, GetPersonaResponse, UpdatePersonaData, UpdatePersonaError, UpdatePersonaResponse, DeletePersonaData, DeletePersonaError, DeletePersonaResponse, ListPersonaFoldersData, ListPersonaFoldersError, ListPersonaFoldersResponse, CreatePersonaFolderData, CreatePersonaFolderError, CreatePersonaFolderResponse, UpdatePersonaFolderData, UpdatePersonaFolderError, UpdatePersonaFolderResponse, DeletePersonaFolderData, DeletePersonaFolderError, DeletePersonaFolderResponse, MovePersonaItemData, MovePersonaItemError, MovePersonaItemResponse, ReorderPersonaItemsData, ReorderPersonaItemsError, ReorderPersonaItemsResponse, ListSessionsData, ListSessionsError, ListSessionsResponse, ListActiveUmosError, ListActiveUmosResponse, ListSessionRulesData, ListSessionRulesError, ListSessionRulesResponse, UpsertSessionRuleData, UpsertSessionRuleError, UpsertSessionRuleResponse, DeleteSessionRulesData, DeleteSessionRulesError, DeleteSessionRulesResponse, ListSessionConfigOverridesData, ListSessionConfigOverridesError, ListSessionConfigOverridesResponse, UpsertSessionConfigOverrideData, UpsertSessionConfigOverrideError, UpsertSessionConfigOverrideResponse, DeleteSessionConfigOverrideData, DeleteSessionConfigOverrideError, DeleteSessionConfigOverrideResponse, UpsertSessionAliasData, UpsertSessionAliasError, UpsertSessionAliasResponse, BatchUpdateSessionProviderData, BatchUpdateSessionProviderError, BatchUpdateSessionProviderResponse, BatchUpdateSessionServiceData, BatchUpdateSessionServiceError, BatchUpdateSessionServiceResponse, ListSessionGroupsError, ListSessionGroupsResponse, CreateSessionGroupData, CreateSessionGroupError, CreateSessionGroupResponse, UpdateSessionGroupData, UpdateSessionGroupError, UpdateSessionGroupResponse, DeleteSessionGroupData, DeleteSessionGroupError, DeleteSessionGroupResponse, ListConversationsData, ListConversationsError, ListConversationsResponse, BatchDeleteConversationsData, BatchDeleteConversationsError, BatchDeleteConversationsResponse, GetConversationData, GetConversationError, GetConversationResponse, UpdateConversationData, UpdateConversationError, UpdateConversationResponse, DeleteConversationData, DeleteConversationError, DeleteConversationResponse, ReplaceConversationMessagesData, ReplaceConversationMessagesError, ReplaceConversationMessagesResponse, ExportConversationsData, ExportConversationsError, ExportConversationsResponse, ListUmoWorkspaceFilesData, ListUmoWorkspaceFilesError, ListUmoWorkspaceFilesResponse, GetStatsData, GetStatsError, GetStatsResponse, GetProviderTokenStatsData, GetProviderTokenStatsError, GetProviderTokenStatsResponse, GetVersionError, GetVersionResponse, GetPublicVersionsError, GetPublicVersionsResponse, GetFirstNoticeData, GetFirstNoticeError, GetFirstNoticeResponse, TestGhproxyConnectionData, TestGhproxyConnectionError, TestGhproxyConnectionResponse, ListChangelogVersionsError, ListChangelogVersionsResponse, GetChangelogData, GetChangelogError, GetChangelogResponse, GetStartTimeError, GetStartTimeResponse, GetStorageStatusError, GetStorageStatusResponse, CleanupStorageData, CleanupStorageError, CleanupStorageResponse, RestartCoreError, RestartCoreResponse, ListBackupsData, ListBackupsError, ListBackupsResponse, CreateBackupData, CreateBackupError, CreateBackupResponse, UploadBackupData, UploadBackupError, UploadBackupResponse, InitBackupUploadData, InitBackupUploadError, InitBackupUploadResponse, UploadBackupChunkData, UploadBackupChunkError, UploadBackupChunkResponse, CompleteBackupUploadData, CompleteBackupUploadError, CompleteBackupUploadResponse, AbortBackupUploadData, AbortBackupUploadError, AbortBackupUploadResponse, GetBackupProgressData, GetBackupProgressError, GetBackupProgressResponse, DownloadBackupData, DownloadBackupError, DownloadBackupResponse, RenameBackupData, RenameBackupError, RenameBackupResponse, DeleteBackupData, DeleteBackupError, DeleteBackupResponse, CheckBackupData, CheckBackupError, CheckBackupResponse, ImportBackupData, ImportBackupError, ImportBackupResponse, CheckUpdateError, CheckUpdateResponse, ListReleasesData, ListReleasesError, ListReleasesResponse, UpdateCoreData, UpdateCoreError, UpdateCoreResponse, UpdateDashboardData, UpdateDashboardError, UpdateDashboardResponse, GetUpdateProgressData, GetUpdateProgressError, GetUpdateProgressResponse, InstallPipPackageData, InstallPipPackageError, InstallPipPackageResponse, ListCronJobsData, ListCronJobsError, ListCronJobsResponse, CreateCronJobData, CreateCronJobError, CreateCronJobResponse, UpdateCronJobData, UpdateCronJobError, UpdateCronJobResponse, DeleteCronJobData, DeleteCronJobError, DeleteCronJobResponse, RunCronJobData, RunCronJobError, RunCronJobResponse, StreamLiveLogsError, StreamLiveLogsResponse, GetLogHistoryError, GetLogHistoryResponse, GetTraceSettingsError, GetTraceSettingsResponse, UpdateTraceSettingsData, UpdateTraceSettingsError, UpdateTraceSettingsResponse, ListT2iTemplatesError, ListT2iTemplatesResponse, CreateT2iTemplateData, CreateT2iTemplateError, CreateT2iTemplateResponse, GetActiveT2iTemplateError, GetActiveT2iTemplateResponse, SetActiveT2iTemplateData, SetActiveT2iTemplateError, SetActiveT2iTemplateResponse, ResetDefaultT2iTemplateError, ResetDefaultT2iTemplateResponse, GetT2iTemplateData, GetT2iTemplateError, GetT2iTemplateResponse, UpdateT2iTemplateData, UpdateT2iTemplateError, UpdateT2iTemplateResponse, DeleteT2iTemplateData, DeleteT2iTemplateError, DeleteT2iTemplateResponse, GetSubagentConfigError, GetSubagentConfigResponse, UpdateSubagentConfigData, UpdateSubagentConfigError, UpdateSubagentConfigResponse, ListSubagentAvailableToolsError, ListSubagentAvailableToolsResponse, VerifyPlatformWebhookData, VerifyPlatformWebhookError, VerifyPlatformWebhookResponse, ReceivePlatformWebhookData, ReceivePlatformWebhookError, ReceivePlatformWebhookResponse } from './types.gen'; export const client = createClient(createConfig()); @@ -2595,6 +2595,16 @@ export const exportConversations = (option }); }; +/** + * List workspace files for one UMO + */ +export const listUmoWorkspaceFiles = (options: OptionsLegacyParser) => { + return (options?.client ?? client).get({ + ...options, + url: '/api/v1/workspaces/by-umo' + }); +}; + /** * Get runtime statistics */ diff --git a/dashboard/src/api/generated/openapi-v1/types.gen.ts b/dashboard/src/api/generated/openapi-v1/types.gen.ts index 92b7536d6..06fb74377 100644 --- a/dashboard/src/api/generated/openapi-v1/types.gen.ts +++ b/dashboard/src/api/generated/openapi-v1/types.gen.ts @@ -2978,6 +2978,7 @@ export type ListSessionRulesData = { page?: number; page_size?: number; search?: string; + umo?: string; }; }; @@ -3006,6 +3007,7 @@ export type ListSessionConfigOverridesData = { page?: number; page_size?: number; search?: string; + umo?: string; }; }; @@ -3186,6 +3188,17 @@ export type ExportConversationsResponse = (unknown); export type ExportConversationsError = unknown; +export type ListUmoWorkspaceFilesData = { + query: { + path?: string; + umo: string; + }; +}; + +export type ListUmoWorkspaceFilesResponse = (SuccessEnvelope); + +export type ListUmoWorkspaceFilesError = unknown; + export type GetStatsData = { query?: { offset_sec?: number; diff --git a/dashboard/src/api/v1.ts b/dashboard/src/api/v1.ts index 10954b23a..dc17fd1c1 100644 --- a/dashboard/src/api/v1.ts +++ b/dashboard/src/api/v1.ts @@ -34,6 +34,7 @@ import { type GhproxyTestRequest, type KnowledgeBaseCreateRequest, type KnowledgeBaseRequest, + type ListUmoWorkspaceFilesData, type LoginRequest, type ListConversationsData, type McpServerConfig, @@ -166,6 +167,7 @@ export interface SessionRuleListParams { page?: number; page_size?: number; search?: string; + umo?: string; } export interface ChatSessionListParams { @@ -1704,6 +1706,16 @@ export const conversationApi = { }, }; +export const workspaceApi = { + byUmo(params: ListUmoWorkspaceFilesData['query']) { + return typed( + openApiV1.listUmoWorkspaceFiles({ + query: params, + }), + ); + }, +}; + export const statsApi = { get(offsetSec?: number) { return typed( diff --git a/dashboard/src/i18n/loader.ts b/dashboard/src/i18n/loader.ts index e5a1998a9..b76a31c82 100644 --- a/dashboard/src/i18n/loader.ts +++ b/dashboard/src/i18n/loader.ts @@ -59,6 +59,7 @@ export class I18nLoader { { name: 'features/alkaid/memory', path: 'features/alkaid/memory.json' }, { name: 'features/persona', path: 'features/persona.json' }, { name: 'features/welcome', path: 'features/welcome.json' }, + { name: 'features/observer', path: 'features/observer.json' }, // 消息模块 { name: 'messages/errors', path: 'messages/errors.json' }, diff --git a/dashboard/src/i18n/locales/en-US/core/navigation.json b/dashboard/src/i18n/locales/en-US/core/navigation.json index e0e39639b..72600be22 100644 --- a/dashboard/src/i18n/locales/en-US/core/navigation.json +++ b/dashboard/src/i18n/locales/en-US/core/navigation.json @@ -19,6 +19,7 @@ "components": "Handlers" }, "conversation": "Conversations", + "observer": "Observer", "sessionManagement": "Custom Rules", "console": "Console", "trace": "Trace", diff --git a/dashboard/src/i18n/locales/en-US/features/cron.json b/dashboard/src/i18n/locales/en-US/features/cron.json index 5b081d69e..155d0ed78 100644 --- a/dashboard/src/i18n/locales/en-US/features/cron.json +++ b/dashboard/src/i18n/locales/en-US/features/cron.json @@ -33,8 +33,9 @@ "onceAt": "One-off · {time}", "runAt": "Run at: {time}", "nextRun": "Next run: {time}", - "dailyAt": "Daily at {time}", - "weeklyAt": "Every {day} at {time}", + "dailyAt": "Daily · {time}", + "weeklyAt": "{day} · {time}", + "weekdaySeparator": ", ", "monthlyAt": "Monthly on day {day} at {time}", "everyMinutes": "Every {count} minutes", "everyHours": "Every {count} hours", diff --git a/dashboard/src/i18n/locales/en-US/features/observer.json b/dashboard/src/i18n/locales/en-US/features/observer.json new file mode 100644 index 000000000..3eeb0df83 --- /dev/null +++ b/dashboard/src/i18n/locales/en-US/features/observer.json @@ -0,0 +1,76 @@ +{ + "title": "Observer", + "searchPlaceholder": "Search UMO, alias, or session ID", + "emptyTitle": "What do you want to inspect?", + "emptySubtitle": "Search a UMO to inspect its conversations, custom rules, workspace, and trace.", + "knownSources": "Message Sources", + "home": { + "recent": "Recent Sources", + "resources": "More Resources", + "noSources": "No message sources yet", + "noMatches": "No matching UMO", + "resourceCards": { + "rules": "Custom Rules", + "rulesHint": "Manage config overrides", + "conversation": "Conversation Viewer", + "conversationHint": "Browse conversation data", + "trace": "Trace", + "traceHint": "Inspect execution trace", + "stats": "Data Dashboard", + "statsHint": "View runtime metrics" + } + }, + "detail": { + "title": "UMO Detail", + "config": "Config Profile", + "route": "Route", + "defaultConfig": "Default Config", + "noRoute": "No dedicated route", + "copy": "Copy UMO", + "openChat": "Open ChatUI", + "openConfig": "View config profile", + "configDrawerTitle": "Config Profile", + "configDrawerIdLabel": "Config ID" + }, + "resources": { + "conversation": "Conversation", + "overrides": "Custom Rules", + "workspace": "Workspace", + "trace": "Trace" + }, + "conversation": { + "title": "Conversation Preview", + "count": "{count} items", + "empty": "No conversation data", + "select": "Select a conversation to preview", + "latest": "Latest Conversation" + }, + "tokens": { + "title": "Token Usage", + "window": "24H", + "unit": "Last 24 hours" + }, + "overrides": { + "title": "Config Overrides", + "count": "{count} overrides", + "empty": "No config overrides for this UMO", + "open": "Manage Custom Rules" + }, + "workspace": { + "title": "Workspace", + "empty": "Workspace is empty", + "missing": "Workspace is unavailable", + "copyPath": "Copy workspace path", + "parent": "Parent folder", + "root": "Root" + }, + "trace": { + "title": "Trace", + "hint": "For now this shows the full trace stream. UMO filtering can be added later." + }, + "actions": { + "refresh": "Refresh", + "open": "Open", + "back": "Back" + } +} diff --git a/dashboard/src/i18n/locales/ru-RU/core/navigation.json b/dashboard/src/i18n/locales/ru-RU/core/navigation.json index 315e386ec..7aab70056 100644 --- a/dashboard/src/i18n/locales/ru-RU/core/navigation.json +++ b/dashboard/src/i18n/locales/ru-RU/core/navigation.json @@ -18,8 +18,9 @@ "config": "Конфигурация", "chat": "Чат", "cron": "Запланированные задачи", - "conversation": "Данные диалогов", - "sessionManagement": "Пользовательские правила", + "conversation": "Данные диалогов", + "observer": "Observer", + "sessionManagement": "Пользовательские правила", "console": "Логи платформы", "trace": "Трассировка", "alkaid": "Alkaid Lab", @@ -47,4 +48,4 @@ "system": "Системная конфигурация" }, "pluginWebui": "Страницы плагинов" -} \ No newline at end of file +} diff --git a/dashboard/src/i18n/locales/ru-RU/features/cron.json b/dashboard/src/i18n/locales/ru-RU/features/cron.json index 104228950..01d4b565d 100644 --- a/dashboard/src/i18n/locales/ru-RU/features/cron.json +++ b/dashboard/src/i18n/locales/ru-RU/features/cron.json @@ -33,8 +33,9 @@ "onceAt": "Один раз · {time}", "runAt": "Время запуска: {time}", "nextRun": "Следующий запуск: {time}", - "dailyAt": "Каждый день в {time}", - "weeklyAt": "Каждый {day} в {time}", + "dailyAt": "Каждый день · {time}", + "weeklyAt": "{day} · {time}", + "weekdaySeparator": ", ", "monthlyAt": "Каждый месяц, день {day}, {time}", "everyMinutes": "Каждые {count} мин.", "everyHours": "Каждые {count} ч.", diff --git a/dashboard/src/i18n/locales/ru-RU/features/observer.json b/dashboard/src/i18n/locales/ru-RU/features/observer.json new file mode 100644 index 000000000..627267718 --- /dev/null +++ b/dashboard/src/i18n/locales/ru-RU/features/observer.json @@ -0,0 +1,76 @@ +{ + "title": "Observer", + "searchPlaceholder": "Поиск UMO, заметки или session ID", + "emptyTitle": "Что проверить?", + "emptySubtitle": "Найдите UMO, чтобы посмотреть диалоги, правила, workspace и trace.", + "knownSources": "Источники", + "home": { + "recent": "Недавние источники", + "resources": "Еще ресурсы", + "noSources": "Источников пока нет", + "noMatches": "UMO не найден", + "resourceCards": { + "rules": "Правила", + "rulesHint": "Настроить overrides", + "conversation": "Диалоги", + "conversationHint": "Смотреть историю", + "trace": "Trace", + "traceHint": "Смотреть выполнение", + "stats": "Дашборд", + "statsHint": "Смотреть метрики" + } + }, + "detail": { + "title": "UMO Detail", + "config": "Профиль конфигурации", + "route": "Маршрут", + "defaultConfig": "Конфигурация по умолчанию", + "noRoute": "Нет отдельного маршрута", + "copy": "Копировать UMO", + "openChat": "Открыть ChatUI", + "openConfig": "Открыть профиль", + "configDrawerTitle": "Профиль конфигурации", + "configDrawerIdLabel": "ID конфигурации" + }, + "resources": { + "conversation": "Диалоги", + "overrides": "Правила", + "workspace": "Workspace", + "trace": "Trace" + }, + "conversation": { + "title": "Предпросмотр диалога", + "count": "{count} шт.", + "empty": "Нет данных диалога", + "select": "Выберите диалог для просмотра", + "latest": "Последний диалог" + }, + "tokens": { + "title": "Расход токенов", + "window": "24H", + "unit": "За последние 24 часа" + }, + "overrides": { + "title": "Overrides конфигурации", + "count": "{count} overrides", + "empty": "Для этого UMO нет overrides", + "open": "Управлять правилами" + }, + "workspace": { + "title": "Workspace", + "empty": "Workspace пуст", + "missing": "Workspace недоступен", + "copyPath": "Скопировать путь workspace", + "parent": "Вверх", + "root": "Корень" + }, + "trace": { + "title": "Trace", + "hint": "Сейчас отображается полный trace stream. Фильтр UMO можно добавить позже." + }, + "actions": { + "refresh": "Обновить", + "open": "Открыть", + "back": "Назад" + } +} diff --git a/dashboard/src/i18n/locales/zh-CN/core/navigation.json b/dashboard/src/i18n/locales/zh-CN/core/navigation.json index 163ab3514..1469ed1b1 100644 --- a/dashboard/src/i18n/locales/zh-CN/core/navigation.json +++ b/dashboard/src/i18n/locales/zh-CN/core/navigation.json @@ -19,6 +19,7 @@ "chat": "聊天", "cron": "未来任务", "conversation": "对话数据", + "observer": "Observer", "sessionManagement": "自定义规则", "console": "平台日志", "trace": "追踪", diff --git a/dashboard/src/i18n/locales/zh-CN/features/cron.json b/dashboard/src/i18n/locales/zh-CN/features/cron.json index 750af66bb..37efca70a 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/cron.json +++ b/dashboard/src/i18n/locales/zh-CN/features/cron.json @@ -33,8 +33,9 @@ "onceAt": "一次性 · {time}", "runAt": "执行时间:{time}", "nextRun": "下次执行:{time}", - "dailyAt": "每天 {time}", - "weeklyAt": "每周{day} {time}", + "dailyAt": "每天 · {time}", + "weeklyAt": "{day} · {time}", + "weekdaySeparator": "、", "monthlyAt": "每月 {day} 日 {time}", "everyMinutes": "每隔 {count} 分钟", "everyHours": "每隔 {count} 小时", diff --git a/dashboard/src/i18n/locales/zh-CN/features/observer.json b/dashboard/src/i18n/locales/zh-CN/features/observer.json new file mode 100644 index 000000000..418b9e829 --- /dev/null +++ b/dashboard/src/i18n/locales/zh-CN/features/observer.json @@ -0,0 +1,76 @@ +{ + "title": "Observer", + "searchPlaceholder": "搜索 UMO、备注或会话 ID", + "emptyTitle": "想查什么?", + "emptySubtitle": "搜索一个 UMO,查看它关联的对话、自定义规则、工作区与追踪。", + "knownSources": "消息来源", + "home": { + "recent": "最近来源", + "resources": "更多资源", + "noSources": "暂无可用消息来源", + "noMatches": "没有匹配的 UMO", + "resourceCards": { + "rules": "自定义规则", + "rulesHint": "管理配置覆盖", + "conversation": "对话数据查看器", + "conversationHint": "查看历史对话", + "trace": "追踪", + "traceHint": "查看执行链路", + "stats": "数据大盘", + "statsHint": "查看运行指标" + } + }, + "detail": { + "title": "UMO Detail", + "config": "配置文件", + "route": "路由", + "defaultConfig": "默认配置", + "noRoute": "未设置专属路由", + "copy": "复制 UMO", + "openChat": "打开 ChatUI", + "openConfig": "查看配置文件", + "configDrawerTitle": "配置文件", + "configDrawerIdLabel": "配置 ID" + }, + "resources": { + "conversation": "对话", + "overrides": "自定义规则", + "workspace": "工作区", + "trace": "追踪" + }, + "conversation": { + "title": "对话预览", + "count": "{count} 条", + "empty": "暂无对话数据", + "select": "选择对话以预览", + "latest": "最近对话" + }, + "tokens": { + "title": "消耗 Token", + "window": "24H", + "unit": "近 24 小时" + }, + "overrides": { + "title": "配置覆盖", + "count": "{count} 项覆盖项", + "empty": "该 UMO 暂无配置覆盖项", + "open": "管理自定义规则" + }, + "workspace": { + "title": "工作区", + "empty": "工作区为空", + "missing": "工作区暂不可用", + "copyPath": "复制工作区路径", + "parent": "上级目录", + "root": "根目录" + }, + "trace": { + "title": "追踪", + "hint": "当前先展示全量追踪流,UMO 过滤后续再接入。" + }, + "actions": { + "refresh": "刷新", + "open": "打开", + "back": "返回" + } +} diff --git a/dashboard/src/i18n/translations.ts b/dashboard/src/i18n/translations.ts index e2a12c2df..ae9206d52 100644 --- a/dashboard/src/i18n/translations.ts +++ b/dashboard/src/i18n/translations.ts @@ -37,6 +37,7 @@ import zhCNPersona from './locales/zh-CN/features/persona.json'; import zhCNCommand from './locales/zh-CN/features/command.json'; import zhCNSubagent from './locales/zh-CN/features/subagent.json'; import zhCNWelcome from './locales/zh-CN/features/welcome.json'; +import zhCNObserver from './locales/zh-CN/features/observer.json'; import zhCNErrors from './locales/zh-CN/messages/errors.json'; import zhCNSuccess from './locales/zh-CN/messages/success.json'; @@ -78,6 +79,7 @@ import enUSPersona from './locales/en-US/features/persona.json'; import enUSCommand from './locales/en-US/features/command.json'; import enUSSubagent from './locales/en-US/features/subagent.json'; import enUSWelcome from './locales/en-US/features/welcome.json'; +import enUSObserver from './locales/en-US/features/observer.json'; import enUSErrors from './locales/en-US/messages/errors.json'; import enUSSuccess from './locales/en-US/messages/success.json'; @@ -119,6 +121,7 @@ import ruRUPersona from './locales/ru-RU/features/persona.json'; import ruRUCommand from './locales/ru-RU/features/command.json'; import ruRUSubagent from './locales/ru-RU/features/subagent.json'; import ruRUWelcome from './locales/ru-RU/features/welcome.json'; +import ruRUObserver from './locales/ru-RU/features/observer.json'; import ruRUErrors from './locales/ru-RU/messages/errors.json'; import ruRUSuccess from './locales/ru-RU/messages/success.json'; @@ -167,7 +170,8 @@ export const translations = { persona: zhCNPersona, command: zhCNCommand, subagent: zhCNSubagent, - welcome: zhCNWelcome + welcome: zhCNWelcome, + observer: zhCNObserver }, messages: { errors: zhCNErrors, @@ -216,7 +220,8 @@ export const translations = { persona: enUSPersona, command: enUSCommand, subagent: enUSSubagent, - welcome: enUSWelcome + welcome: enUSWelcome, + observer: enUSObserver }, messages: { errors: enUSErrors, @@ -265,7 +270,8 @@ export const translations = { persona: ruRUPersona, command: ruRUCommand, subagent: ruRUSubagent, - welcome: ruRUWelcome + welcome: ruRUWelcome, + observer: ruRUObserver }, messages: { errors: ruRUErrors, diff --git a/dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts b/dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts index b5725726c..a382523a3 100644 --- a/dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts +++ b/dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts @@ -87,6 +87,11 @@ const sidebarItem: menu[] = [ title: 'core.navigation.groups.more', icon: 'mdi-dots-horizontal', children: [ + { + title: 'core.navigation.observer', + icon: 'mdi-eye-outline', + to: '/observer' + }, { title: 'core.navigation.conversation', icon: 'mdi-database', diff --git a/dashboard/src/router/MainRoutes.ts b/dashboard/src/router/MainRoutes.ts index 4b399b5b5..4d5a37b2a 100644 --- a/dashboard/src/router/MainRoutes.ts +++ b/dashboard/src/router/MainRoutes.ts @@ -79,6 +79,11 @@ const MainRoutes = { path: '/session-management', component: () => import('@/views/SessionManagementPage.vue') }, + { + name: 'Observer', + path: '/observer', + component: () => import('@/views/ObserverPage.vue') + }, { name: 'Persona', path: '/persona', diff --git a/dashboard/src/views/CronJobPage.vue b/dashboard/src/views/CronJobPage.vue index 597b6109a..2935dcea7 100644 --- a/dashboard/src/views/CronJobPage.vue +++ b/dashboard/src/views/CronJobPage.vue @@ -587,6 +587,23 @@ const weekdayOptions = computed(() => [ { label: tm("form.weekdays.saturday"), value: 6 }, ]); +const CRON_WEEKDAY_ALIASES: Record = { + sun: 0, + sunday: 0, + mon: 1, + monday: 1, + tue: 2, + tuesday: 2, + wed: 3, + wednesday: 3, + thu: 4, + thursday: 4, + fri: 5, + friday: 5, + sat: 6, + saturday: 6, +}; + function toast( message: string, color: "success" | "error" | "warning" = "success", @@ -692,23 +709,17 @@ function scheduleProductLabel(item: any): string { const minuteNumber = Number(minute); const hourNumber = Number(hour); const dayOfMonthNumber = Number(dayOfMonth); - const dayOfWeekNumber = Number(dayOfWeek); if (!isCronTime(minuteNumber, hourNumber)) { return tm("card.customCron", { cron }); } - const time = `${padTimePart(hourNumber)}:${padTimePart(minuteNumber)}`; + const time = formatScheduleTime(hourNumber, minuteNumber); if (dayOfMonth === "*" && month === "*" && dayOfWeek === "*") { return tm("card.dailyAt", { time }); } - if ( - dayOfMonth === "*" && - month === "*" && - Number.isInteger(dayOfWeekNumber) && - dayOfWeekNumber >= 0 && - dayOfWeekNumber <= 6 - ) { + const weekDays = parseCronWeekdayField(dayOfWeek); + if (dayOfMonth === "*" && month === "*" && weekDays?.length) { return tm("card.weeklyAt", { - day: weekdayText(dayOfWeekNumber), + day: weekdayListText(weekDays), time, }); } @@ -1005,6 +1016,83 @@ function isCronTime(minute: number, hour: number): boolean { ); } +function formatScheduleTime(hour: number, minute: number): string { + return `${hour}:${padTimePart(minute)}`; +} + +function parseCronWeekdayValue(value: string): number | null { + const normalized = value.trim().toLowerCase(); + if (normalized in CRON_WEEKDAY_ALIASES) { + return CRON_WEEKDAY_ALIASES[normalized]; + } + if (!/^\d+$/.test(normalized)) { + return null; + } + const day = Number(normalized); + if (!Number.isInteger(day) || day < 0 || day > 7) { + return null; + } + return day === 7 ? 0 : day; +} + +function parseCronWeekdayField(field: string): number[] | null { + const normalized = field.trim().toLowerCase(); + if (!normalized || normalized === "*" || normalized === "?") { + return null; + } + + const days: number[] = []; + for (const token of normalized.split(",")) { + const item = token.trim(); + if (!item || item.includes("/")) { + return null; + } + + const rangeParts = item.split("-"); + if (rangeParts.length > 2) { + return null; + } + if (rangeParts.length === 2) { + const start = parseCronWeekdayValue(rangeParts[0]); + const end = parseCronWeekdayValue(rangeParts[1]); + if (start === null || end === null) { + return null; + } + if (start <= end) { + for (let day = start; day <= end; day += 1) { + days.push(day); + } + } else { + for (let day = start; day <= 6; day += 1) { + days.push(day); + } + for (let day = 0; day <= end; day += 1) { + days.push(day); + } + } + continue; + } + + const day = parseCronWeekdayValue(item); + if (day === null) { + return null; + } + days.push(day); + } + + const uniqueDays: number[] = []; + for (const day of days) { + if (!uniqueDays.includes(day)) { + uniqueDays.push(day); + } + } + return uniqueDays.length ? uniqueDays : null; +} + +function weekdayListText(days: number[]): string { + return days.map((day) => weekdayText(day)).join(tm("card.weekdaySeparator")); +} + function buildCronExpression(): string { const mode = newJob.value.schedule_mode; if (mode === "interval") { @@ -1066,7 +1154,6 @@ function readScheduleFromJob(job: any) { const minuteNumber = Number(minute); const hourNumber = Number(hour); const dayOfMonthNumber = Number(dayOfMonth); - const dayOfWeekNumber = Number(dayOfWeek); const hasCronTime = isCronTime(minuteNumber, hourNumber); const time = hasCronTime ? `${padTimePart(hourNumber)}:${padTimePart(minuteNumber)}` @@ -1128,18 +1215,17 @@ function readScheduleFromJob(job: any) { }; } + const weekDays = parseCronWeekdayField(dayOfWeek); if ( hasCronTime && dayOfMonth === "*" && month === "*" && - Number.isInteger(dayOfWeekNumber) && - dayOfWeekNumber >= 0 && - dayOfWeekNumber <= 6 + weekDays?.length === 1 ) { return { ...fallback, schedule_mode: "weekly" as ScheduleMode, - weekly_day: dayOfWeekNumber, + weekly_day: weekDays[0], weekly_time: time, }; } diff --git a/dashboard/src/views/ObserverPage.vue b/dashboard/src/views/ObserverPage.vue new file mode 100644 index 000000000..6103d9ea5 --- /dev/null +++ b/dashboard/src/views/ObserverPage.vue @@ -0,0 +1,1617 @@ + + + + + diff --git a/dashboard/src/views/SessionManagementPage.vue b/dashboard/src/views/SessionManagementPage.vue index 2f8a23547..a7f97c886 100644 --- a/dashboard/src/views/SessionManagementPage.vue +++ b/dashboard/src/views/SessionManagementPage.vue @@ -1035,6 +1035,10 @@ export default { }, mounted() { + const routeSearch = this.$route?.query?.search + if (typeof routeSearch === 'string' && routeSearch.trim()) { + this.searchQuery = routeSearch.trim() + } this.loadData() this.loadGroups() this.loadBatchProviders() diff --git a/openspec/openapi-v1.yaml b/openspec/openapi-v1.yaml index 08991348e..19fc4bbcd 100644 --- a/openspec/openapi-v1.yaml +++ b/openspec/openapi-v1.yaml @@ -3862,6 +3862,10 @@ paths: in: query schema: type: string + - name: umo + in: query + schema: + type: string responses: "200": $ref: "#/components/responses/Ok" @@ -3909,6 +3913,10 @@ paths: in: query schema: type: string + - name: umo + in: query + schema: + type: string responses: "200": $ref: "#/components/responses/Ok" @@ -4196,6 +4204,27 @@ paths: "200": description: Exported conversation data + /api/v1/workspaces/by-umo: + get: + tags: [Workspaces] + summary: List workspace files for one UMO + operationId: listUmoWorkspaceFiles + x-astrbot-scope: data + parameters: + - name: umo + in: query + required: true + schema: + type: string + minLength: 1 + - name: path + in: query + schema: + type: string + responses: + "200": + $ref: "#/components/responses/Ok" + /api/v1/stats: get: tags: [Stats]