diff --git a/admin/src/components/CcOrchestraPanel.vue b/admin/src/components/CcOrchestraPanel.vue new file mode 100644 index 0000000..fd8709e --- /dev/null +++ b/admin/src/components/CcOrchestraPanel.vue @@ -0,0 +1,171 @@ + + + diff --git a/admin/src/plugins/i18n.ts b/admin/src/plugins/i18n.ts index d3b98ca..59d44a5 100644 --- a/admin/src/plugins/i18n.ts +++ b/admin/src/plugins/i18n.ts @@ -390,6 +390,14 @@ const messages = { attachFiles: "Файлы из чата", workDir: "Рабочая папка", }, + ccPanel: { + orchestras: "Оркестры", + roadmap: "Дорожная карта", + noChat: "Выберите чат", + noOrchestras: "Нет запущенных оркестров", + roadmapPlaceholder: "Дорожная карта (скоро)", + title: "Оркестры Claude Code", + }, }, // Auth auth: { @@ -1747,6 +1755,14 @@ const messages = { attachFiles: "Files from chat", workDir: "Working directory", }, + ccPanel: { + orchestras: "Orchestras", + roadmap: "Roadmap", + noChat: "Select a chat", + noOrchestras: "No orchestras running", + roadmapPlaceholder: "Roadmap (coming soon)", + title: "Claude Code Orchestras", + }, }, // Auth auth: { @@ -3104,6 +3120,14 @@ const messages = { attachFiles: "Чаттан файлдар", workDir: "Жұмыс қалтасы", }, + ccPanel: { + orchestras: "Оркестрлер", + roadmap: "Жол картасы", + noChat: "Чат таңдаңыз", + noOrchestras: "Іске қосылған оркестрлер жоқ", + roadmapPlaceholder: "Жол картасы (жақында)", + title: "Claude Code оркестрлері", + }, }, // Auth auth: { diff --git a/admin/src/views/ChatView.vue b/admin/src/views/ChatView.vue index 2b03308..f4f1e81 100644 --- a/admin/src/views/ChatView.vue +++ b/admin/src/views/ChatView.vue @@ -28,6 +28,7 @@ import { chatApi, ttsApi, llmApi, sttApi, wikiRagApi, type ChatSession, type Cha import BranchTree from '@/components/BranchTree.vue' import ChatShareDialog from '@/components/ChatShareDialog.vue' import ArtifactPanel, { type Artifact } from '@/components/ArtifactPanel.vue' +import CcOrchestraPanel from '@/components/CcOrchestraPanel.vue' import { useConfirmStore } from '@/stores/confirm' import { useToastStore } from '@/stores/toast' import { useAuthStore } from '@/stores/auth' @@ -192,6 +193,7 @@ const { width: sidebarWidth, startResize: startSidebarResize, startTouchResize: const { width: branchTreeWidth, startResize: startBranchResize, startTouchResize: startBranchTouchResize } = useResizablePanel('chat-branch-width', 208, 160, 400, 'left') const { width: settingsWidth, startResize: startSettingsResize, startTouchResize: startSettingsTouchResize } = useResizablePanel('chat-settings-width', 500, 300, 800, 'left') const { width: artifactWidth, startResize: startArtifactResize, startTouchResize: startArtifactTouchResize } = useResizablePanel('chat-artifact-width', 500, 300, 800, 'left') +const { width: ccPanelWidth, startResize: startCcPanelResize, startTouchResize: startCcPanelTouchResize } = useResizablePanel('chat-cc-panel-width', 320, 220, 500, 'left') // Pasted content blocks const pastedBlocks = ref([]) @@ -402,9 +404,13 @@ function renderMarkdown(content: string, messageId?: string): string { // Branch tree toggle const showBranchTree = ref(false) +// CC Orchestra panel toggle +const showCcPanel = ref(false) + // Mutual exclusivity: panel watchers -watch(showBranchTree, (v) => { if (v) closeArtifact() }) -watch(showSettings, (v) => { if (v) closeArtifact() }) +watch(showBranchTree, (v) => { if (v) { closeArtifact(); showCcPanel.value = false } }) +watch(showSettings, (v) => { if (v) { closeArtifact(); showCcPanel.value = false } }) +watch(showCcPanel, (v) => { if (v) { closeArtifact(); showBranchTree.value = false } }) // File attachment state const attachedFiles = ref<{ name: string; content: string }[]>([]) @@ -2305,15 +2311,15 @@ class="w-4 h-4 rounded border flex items-center justify-center shrink-0" - + @@ -2840,15 +2846,15 @@ class="w-4 h-4 rounded border flex items-center justify-center shrink-0" - + @@ -3809,6 +3815,21 @@ class="w-4 h-4 rounded border flex items-center justify-center shrink-0" + + +