feat(web): show routines with quick toggle in project overview sidebar

This commit is contained in:
cynarAI 2026-10-19 17:29:31 +02:00
parent f820c75632
commit ac9fcce0fb
12 changed files with 680 additions and 174 deletions

View File

@ -386,10 +386,6 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr "{toolCount, plural, one {# Tool} other {# Tools}}"
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} arbeitet"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "/Users/you/projects/acme"
@ -549,6 +545,7 @@ msgid "Add Executor"
msgstr "Executor hinzufügen"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/project-overview.tsx
msgid "Add goal"
msgstr "Ziel hinzufügen"
@ -737,6 +734,14 @@ msgstr "Immer erlaubt"
msgid "Analysiert die Aufgabe und führt Tools aus…"
msgstr "Analysiert die Aufgabe und führt Tools aus…"
#: src/pages/Shell.tsx
msgid "Analyze the project and give me a brief overview."
msgstr "Analysiere das Projekt und gib mir einen kurzen Überblick."
#: src/pages/shell/project-overview.tsx
msgid "Analyzing project…"
msgstr "Projekt wird analysiert…"
#: src/components/AskCard.tsx
msgid "Answer"
msgstr "Antwort"
@ -1031,10 +1036,6 @@ msgstr "Zu verknüpfender Bot"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Bots handeln standardmäßig ohne Nachfrage. Füge nur dann eine Ausnahme hinzu, wenn du eine Aktionsart zuerst prüfen möchtest."
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Bots arbeiten"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr "Schleife"
@ -2983,10 +2984,11 @@ msgid "Here's what I see in the logs…"
msgstr "Das sehe ich in den Logs…"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Hi, this is how I'll sound when I read replies out loud."
msgstr "Hallo, so klinge ich, wenn ich Antworten vorlese."
msgid "Hi, this is how I'll sound when we talk."
msgstr "Hallo, so klinge ich, wenn wir miteinander sprechen."
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Hide bots"
msgstr "Bots ausblenden"
@ -3174,6 +3176,10 @@ msgstr "Zur neuesten Nachricht springen"
msgid "Jump to replied message"
msgstr "Zur beantworteten Nachricht springen"
#: src/pages/shell/project-overview.tsx
msgid "Just ask in the chat whenever something should happen regularly."
msgstr "Sag einfach im Chat Bescheid, wenn etwas regelmäßig erledigt werden soll."
#: src/pages/ActivityList.tsx
#: src/pages/ProjectSessionTimeline.tsx
msgid "just now"
@ -3899,6 +3905,7 @@ msgid "No results"
msgstr "Keine Ergebnisse"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "No runs yet"
msgstr "Noch keine Ausführungen"
@ -3957,6 +3964,7 @@ msgid "Notifications"
msgstr "Benachrichtigungen"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Now"
msgstr "Jetzt"
@ -4288,10 +4296,6 @@ msgstr "Privater Arbeitsbereich mit eigenen Bots und Gruppen."
msgid "Project"
msgstr "Projekt"
#: src/pages/Shell.tsx
msgid "Project · sessions & folders"
msgstr "Projekt · Sessions & Ordner"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "Project folder"
@ -4399,6 +4403,10 @@ msgstr "Lese den Stacktrace…"
msgid "Ready"
msgstr "Bereit"
#: src/pages/shell/project-overview.tsx
msgid "Ready"
msgstr "Bereit"
#: src/pages/ModelSettingsOverlay.tsx
msgid "Reasoning effort"
msgstr "Denkaufwand"
@ -4412,6 +4420,7 @@ msgid "Recall only"
msgstr "Nur abrufen"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Recent"
msgstr "Kürzlich"
@ -4700,11 +4709,13 @@ msgstr "Rund"
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/routine-event-line.tsx
msgid "Routine"
msgstr "Routine"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Routines"
msgstr "Routinen"
@ -4718,6 +4729,7 @@ msgid "Run at"
msgstr "Ausführen um"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Run history"
msgstr "Ausführungsverlauf"
@ -5037,6 +5049,7 @@ msgstr "Mehr anzeigen"
msgid "Show password"
msgstr "Passwort anzeigen"
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Einstellungen anzeigen"
@ -5398,6 +5411,7 @@ msgstr "Aufgabe wird angelernt. Beende das Anlernen, bevor du eine neue Nachrich
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/project-overview.tsx
msgid "Team"
msgstr "Team"
@ -5995,6 +6009,7 @@ msgid "Work channel open — go ahead."
msgstr "Arbeitskanal offen — leg los."
#: src/components/stage/OoStage.tsx
#: src/pages/shell/project-overview.tsx
msgid "Working"
msgstr "Arbeitet"
@ -6037,6 +6052,7 @@ msgstr "Gestern"
#: src/components/UserProfileSettings.tsx
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "You"
msgstr "Du"
@ -6077,8 +6093,8 @@ msgid "Your name"
msgstr "Dein Name"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Your Oo reads replies aloud when this is on."
msgstr "Wenn das an ist, liest dein Oo Antworten vor."
msgid "Your Oo talks with you naturally when this is on."
msgstr "Wenn das an ist, spricht dein Oo ganz natürlich mit dir."
#: src/pages/Onboarding.tsx
msgid "Your Oo will communicate in this language. You can change it later."

View File

@ -386,10 +386,6 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr "{toolCount, plural, one {# tool} other {# tools}}"
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} is working"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "/Users/you/projects/acme"
@ -549,6 +545,7 @@ msgid "Add Executor"
msgstr "Add Executor"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/project-overview.tsx
msgid "Add goal"
msgstr "Add goal"
@ -737,6 +734,14 @@ msgstr "Always allowed"
msgid "Analysiert die Aufgabe und führt Tools aus…"
msgstr "Analysiert die Aufgabe und führt Tools aus…"
#: src/pages/Shell.tsx
msgid "Analyze the project and give me a brief overview."
msgstr "Analyze the project and give me a brief overview."
#: src/pages/shell/project-overview.tsx
msgid "Analyzing project…"
msgstr "Analyzing project…"
#: src/components/AskCard.tsx
msgid "Answer"
msgstr "Answer"
@ -1031,10 +1036,6 @@ msgstr "Bot to link"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Bots act without asking by default. Add an exception only when you want to review a type of action first."
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Bots are working"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr "Bow"
@ -2983,10 +2984,11 @@ msgid "Here's what I see in the logs…"
msgstr "Here's what I see in the logs…"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Hi, this is how I'll sound when I read replies out loud."
msgstr "Hi, this is how I'll sound when I read replies out loud."
msgid "Hi, this is how I'll sound when we talk."
msgstr "Hi, this is how I'll sound when we talk."
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Hide bots"
msgstr "Hide bots"
@ -3174,6 +3176,10 @@ msgstr "Jump to latest"
msgid "Jump to replied message"
msgstr "Jump to replied message"
#: src/pages/shell/project-overview.tsx
msgid "Just ask in the chat whenever something should happen regularly."
msgstr "Just ask in the chat whenever something should happen regularly."
#: src/pages/ActivityList.tsx
#: src/pages/ProjectSessionTimeline.tsx
msgid "just now"
@ -3899,6 +3905,7 @@ msgid "No results"
msgstr "No results"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "No runs yet"
msgstr "No runs yet"
@ -3957,6 +3964,7 @@ msgid "Notifications"
msgstr "Notifications"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Now"
msgstr "Now"
@ -4288,10 +4296,6 @@ msgstr "Private workspace with its own bots and groups."
msgid "Project"
msgstr "Project"
#: src/pages/Shell.tsx
msgid "Project · sessions & folders"
msgstr "Project · sessions & folders"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "Project folder"
@ -4399,6 +4403,10 @@ msgstr "Reading the stack trace…"
msgid "Ready"
msgstr "Ready"
#: src/pages/shell/project-overview.tsx
msgid "Ready"
msgstr "Ready"
#: src/pages/ModelSettingsOverlay.tsx
msgid "Reasoning effort"
msgstr "Reasoning effort"
@ -4412,6 +4420,7 @@ msgid "Recall only"
msgstr "Recall only"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Recent"
msgstr "Recent"
@ -4700,11 +4709,13 @@ msgstr "Round"
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/routine-event-line.tsx
msgid "Routine"
msgstr "Routine"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Routines"
msgstr "Routines"
@ -4718,6 +4729,7 @@ msgid "Run at"
msgstr "Run at"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Run history"
msgstr "Run history"
@ -5037,6 +5049,7 @@ msgstr "Show more"
msgid "Show password"
msgstr "Show password"
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Show settings"
@ -5398,6 +5411,7 @@ msgstr "Teaching in progress. Stop teaching before sending a new message."
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/project-overview.tsx
msgid "Team"
msgstr "Team"
@ -5995,6 +6009,7 @@ msgid "Work channel open — go ahead."
msgstr "Work channel open — go ahead."
#: src/components/stage/OoStage.tsx
#: src/pages/shell/project-overview.tsx
msgid "Working"
msgstr "Working"
@ -6037,6 +6052,7 @@ msgstr "Yesterday"
#: src/components/UserProfileSettings.tsx
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "You"
msgstr "You"
@ -6077,8 +6093,8 @@ msgid "Your name"
msgstr "Your name"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Your Oo reads replies aloud when this is on."
msgstr "Your Oo reads replies aloud when this is on."
msgid "Your Oo talks with you naturally when this is on."
msgstr "Your Oo talks with you naturally when this is on."
#: src/pages/Onboarding.tsx
msgid "Your Oo will communicate in this language. You can change it later."

View File

@ -386,10 +386,6 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} está trabajando"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "/Users/you/projects/acme"
@ -549,6 +545,7 @@ msgid "Add Executor"
msgstr "Agregar Executor"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/project-overview.tsx
msgid "Add goal"
msgstr ""
@ -737,6 +734,14 @@ msgstr "Siempre permitido"
msgid "Analysiert die Aufgabe und führt Tools aus…"
msgstr ""
#: src/pages/Shell.tsx
msgid "Analyze the project and give me a brief overview."
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Analyzing project…"
msgstr ""
#: src/components/AskCard.tsx
msgid "Answer"
msgstr "Responder"
@ -1031,10 +1036,6 @@ msgstr "Bot a vincular"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Los bots actúan sin preguntar de forma predeterminada. Agrega una excepción solo cuando quieras revisar primero un tipo de acción."
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Los bots están trabajando"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
@ -2983,10 +2984,11 @@ msgid "Here's what I see in the logs…"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Hi, this is how I'll sound when I read replies out loud."
msgstr "Hola, así sonaré cuando lea las respuestas en voz alta."
msgid "Hi, this is how I'll sound when we talk."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Hide bots"
msgstr ""
@ -3174,6 +3176,10 @@ msgstr "Ir al más reciente"
msgid "Jump to replied message"
msgstr "Ir al mensaje respondido"
#: src/pages/shell/project-overview.tsx
msgid "Just ask in the chat whenever something should happen regularly."
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/ProjectSessionTimeline.tsx
msgid "just now"
@ -3899,6 +3905,7 @@ msgid "No results"
msgstr "Sin resultados"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "No runs yet"
msgstr "Aún no hay ejecuciones"
@ -3957,6 +3964,7 @@ msgid "Notifications"
msgstr "Notificaciones"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Now"
msgstr "Ahora"
@ -4288,10 +4296,6 @@ msgstr ""
msgid "Project"
msgstr ""
#: src/pages/Shell.tsx
msgid "Project · sessions & folders"
msgstr ""
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "Project folder"
@ -4399,6 +4403,10 @@ msgstr ""
msgid "Ready"
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Ready"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Reasoning effort"
msgstr "Esfuerzo de razonamiento"
@ -4412,6 +4420,7 @@ msgid "Recall only"
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Recent"
msgstr "Recientes"
@ -4700,11 +4709,13 @@ msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/routine-event-line.tsx
msgid "Routine"
msgstr "Rutina"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Routines"
msgstr "Rutinas"
@ -4718,6 +4729,7 @@ msgid "Run at"
msgstr "Ejecutar a las"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Run history"
msgstr "Historial de ejecuciones"
@ -5037,6 +5049,7 @@ msgstr "Mostrar más"
msgid "Show password"
msgstr "Mostrar contraseña"
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Mostrar configuración"
@ -5398,6 +5411,7 @@ msgstr "Enseñanza en curso: detén la enseñanza antes de enviar un nuevo mensa
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/project-overview.tsx
msgid "Team"
msgstr "Equipo"
@ -5995,6 +6009,7 @@ msgid "Work channel open — go ahead."
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/shell/project-overview.tsx
msgid "Working"
msgstr ""
@ -6037,6 +6052,7 @@ msgstr "Ayer"
#: src/components/UserProfileSettings.tsx
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "You"
msgstr "Tú"
@ -6077,7 +6093,7 @@ msgid "Your name"
msgstr "Tu nombre"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Your Oo reads replies aloud when this is on."
msgid "Your Oo talks with you naturally when this is on."
msgstr ""
#: src/pages/Onboarding.tsx

View File

@ -386,10 +386,6 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} काम कर रहा है"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "/Users/you/projects/acme"
@ -549,6 +545,7 @@ msgid "Add Executor"
msgstr "Executor जोड़ें"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/project-overview.tsx
msgid "Add goal"
msgstr ""
@ -737,6 +734,14 @@ msgstr "हमेशा अनुमत"
msgid "Analysiert die Aufgabe und führt Tools aus…"
msgstr ""
#: src/pages/Shell.tsx
msgid "Analyze the project and give me a brief overview."
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Analyzing project…"
msgstr ""
#: src/components/AskCard.tsx
msgid "Answer"
msgstr "उत्तर"
@ -1031,10 +1036,6 @@ msgstr ""
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "बॉट डिफ़ॉल्ट रूप से बिना पूछे कार्रवाई करते हैं। अपवाद तभी जोड़ें जब आप किसी प्रकार की कार्रवाई की पहले समीक्षा करना चाहते हों।"
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "बॉट काम कर रहे हैं"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
@ -2983,10 +2984,11 @@ msgid "Here's what I see in the logs…"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Hi, this is how I'll sound when I read replies out loud."
msgstr "नमस्ते, उत्तर पढ़कर सुनाते समय मेरी आवाज़ ऐसी होगी।"
msgid "Hi, this is how I'll sound when we talk."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Hide bots"
msgstr ""
@ -3174,6 +3176,10 @@ msgstr "नवीनतम संदेश पर जाएँ"
msgid "Jump to replied message"
msgstr "जिस संदेश का उत्तर दिया गया उस पर जाएं"
#: src/pages/shell/project-overview.tsx
msgid "Just ask in the chat whenever something should happen regularly."
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/ProjectSessionTimeline.tsx
msgid "just now"
@ -3899,6 +3905,7 @@ msgid "No results"
msgstr "कोई परिणाम नहीं"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "No runs yet"
msgstr ""
@ -3957,6 +3964,7 @@ msgid "Notifications"
msgstr "सूचनाएं"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Now"
msgstr "अभी"
@ -4288,10 +4296,6 @@ msgstr ""
msgid "Project"
msgstr ""
#: src/pages/Shell.tsx
msgid "Project · sessions & folders"
msgstr ""
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "Project folder"
@ -4399,6 +4403,10 @@ msgstr ""
msgid "Ready"
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Ready"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Reasoning effort"
msgstr "रीज़निंग प्रयास"
@ -4412,6 +4420,7 @@ msgid "Recall only"
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Recent"
msgstr "हाल के"
@ -4700,11 +4709,13 @@ msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/routine-event-line.tsx
msgid "Routine"
msgstr "रूटीन"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Routines"
msgstr "रूटीन्स"
@ -4718,6 +4729,7 @@ msgid "Run at"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Run history"
msgstr ""
@ -5037,6 +5049,7 @@ msgstr "और दिखाएँ"
msgid "Show password"
msgstr ""
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "सेटिंग्स दिखाएं"
@ -5398,6 +5411,7 @@ msgstr "सिखाना जारी है। नया संदेश भ
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/project-overview.tsx
msgid "Team"
msgstr "टीम"
@ -5995,6 +6009,7 @@ msgid "Work channel open — go ahead."
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/shell/project-overview.tsx
msgid "Working"
msgstr ""
@ -6037,6 +6052,7 @@ msgstr "कल"
#: src/components/UserProfileSettings.tsx
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "You"
msgstr "आप"
@ -6077,7 +6093,7 @@ msgid "Your name"
msgstr "आपका नाम"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Your Oo reads replies aloud when this is on."
msgid "Your Oo talks with you naturally when this is on."
msgstr ""
#: src/pages/Onboarding.tsx

View File

@ -386,10 +386,6 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} 작업 중"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "/Users/you/projects/acme"
@ -549,6 +545,7 @@ msgid "Add Executor"
msgstr "Executor 추가"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/project-overview.tsx
msgid "Add goal"
msgstr ""
@ -737,6 +734,14 @@ msgstr "항상 허용됨"
msgid "Analysiert die Aufgabe und führt Tools aus…"
msgstr ""
#: src/pages/Shell.tsx
msgid "Analyze the project and give me a brief overview."
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Analyzing project…"
msgstr ""
#: src/components/AskCard.tsx
msgid "Answer"
msgstr "답변"
@ -1031,10 +1036,6 @@ msgstr "연결할 Bot"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Bot은 기본적으로 묻지 않고 작업합니다. 먼저 확인하고 싶은 작업만 예외로 추가하세요."
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "봇 작업 중"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
@ -2983,10 +2984,11 @@ msgid "Here's what I see in the logs…"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Hi, this is how I'll sound when I read replies out loud."
msgstr "안녕하세요. 답변을 소리 내어 읽을 때 이런 목소리로 들립니다."
msgid "Hi, this is how I'll sound when we talk."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Hide bots"
msgstr ""
@ -3174,6 +3176,10 @@ msgstr "최신 메시지로 이동"
msgid "Jump to replied message"
msgstr "답장한 메시지로 이동"
#: src/pages/shell/project-overview.tsx
msgid "Just ask in the chat whenever something should happen regularly."
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/ProjectSessionTimeline.tsx
msgid "just now"
@ -3899,6 +3905,7 @@ msgid "No results"
msgstr "검색 결과가 없습니다"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "No runs yet"
msgstr "아직 실행 기록이 없습니다"
@ -3957,6 +3964,7 @@ msgid "Notifications"
msgstr "알림"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Now"
msgstr "지금"
@ -4288,10 +4296,6 @@ msgstr ""
msgid "Project"
msgstr ""
#: src/pages/Shell.tsx
msgid "Project · sessions & folders"
msgstr ""
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "Project folder"
@ -4399,6 +4403,10 @@ msgstr ""
msgid "Ready"
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Ready"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Reasoning effort"
msgstr "추론 강도"
@ -4412,6 +4420,7 @@ msgid "Recall only"
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Recent"
msgstr "최근"
@ -4700,11 +4709,13 @@ msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/routine-event-line.tsx
msgid "Routine"
msgstr "자동 실행"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Routines"
msgstr "자동 실행"
@ -4718,6 +4729,7 @@ msgid "Run at"
msgstr "실행 시간"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Run history"
msgstr "실행 기록"
@ -5037,6 +5049,7 @@ msgstr "더 보기"
msgid "Show password"
msgstr "비밀번호 표시"
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "설정 보기"
@ -5398,6 +5411,7 @@ msgstr "작업을 가르치는 중입니다. 새 메시지를 보내려면 먼
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/project-overview.tsx
msgid "Team"
msgstr "팀 공용"
@ -5995,6 +6009,7 @@ msgid "Work channel open — go ahead."
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/shell/project-overview.tsx
msgid "Working"
msgstr ""
@ -6037,6 +6052,7 @@ msgstr "어제"
#: src/components/UserProfileSettings.tsx
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "You"
msgstr "나"
@ -6077,7 +6093,7 @@ msgid "Your name"
msgstr "이름"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Your Oo reads replies aloud when this is on."
msgid "Your Oo talks with you naturally when this is on."
msgstr ""
#: src/pages/Onboarding.tsx

View File

@ -386,10 +386,6 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} está trabalhando"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "/Users/you/projects/acme"
@ -549,6 +545,7 @@ msgid "Add Executor"
msgstr "Adicionar Executor"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/project-overview.tsx
msgid "Add goal"
msgstr ""
@ -737,6 +734,14 @@ msgstr "Sempre permitido"
msgid "Analysiert die Aufgabe und führt Tools aus…"
msgstr ""
#: src/pages/Shell.tsx
msgid "Analyze the project and give me a brief overview."
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Analyzing project…"
msgstr ""
#: src/components/AskCard.tsx
msgid "Answer"
msgstr "Resposta"
@ -1031,10 +1036,6 @@ msgstr ""
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Os bots agem sem perguntar por padrão. Adicione uma exceção apenas quando quiser analisar um tipo de ação primeiro."
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Bots estão trabalhando"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
@ -2983,10 +2984,11 @@ msgid "Here's what I see in the logs…"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Hi, this is how I'll sound when I read replies out loud."
msgstr "Olá, é assim que vou soar quando ler as respostas em voz alta."
msgid "Hi, this is how I'll sound when we talk."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Hide bots"
msgstr ""
@ -3174,6 +3176,10 @@ msgstr "Ir para a mensagem mais recente"
msgid "Jump to replied message"
msgstr "Ir para a mensagem respondida"
#: src/pages/shell/project-overview.tsx
msgid "Just ask in the chat whenever something should happen regularly."
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/ProjectSessionTimeline.tsx
msgid "just now"
@ -3899,6 +3905,7 @@ msgid "No results"
msgstr "Nenhum resultado"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "No runs yet"
msgstr ""
@ -3957,6 +3964,7 @@ msgid "Notifications"
msgstr "Notificações"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Now"
msgstr "Agora"
@ -4288,10 +4296,6 @@ msgstr ""
msgid "Project"
msgstr ""
#: src/pages/Shell.tsx
msgid "Project · sessions & folders"
msgstr ""
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "Project folder"
@ -4399,6 +4403,10 @@ msgstr ""
msgid "Ready"
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Ready"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Reasoning effort"
msgstr "Esforço de raciocínio"
@ -4412,6 +4420,7 @@ msgid "Recall only"
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Recent"
msgstr "Recente"
@ -4700,11 +4709,13 @@ msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/routine-event-line.tsx
msgid "Routine"
msgstr "Rotina"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Routines"
msgstr "Rotinas"
@ -4718,6 +4729,7 @@ msgid "Run at"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Run history"
msgstr ""
@ -5037,6 +5049,7 @@ msgstr "Mostrar mais"
msgid "Show password"
msgstr ""
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Mostrar configurações"
@ -5398,6 +5411,7 @@ msgstr "Ensino em andamento. Pare de ensinar antes de enviar uma nova mensagem."
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/project-overview.tsx
msgid "Team"
msgstr "Equipe"
@ -5995,6 +6009,7 @@ msgid "Work channel open — go ahead."
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/shell/project-overview.tsx
msgid "Working"
msgstr ""
@ -6037,6 +6052,7 @@ msgstr "Ontem"
#: src/components/UserProfileSettings.tsx
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "You"
msgstr "Você"
@ -6077,7 +6093,7 @@ msgid "Your name"
msgstr "O seu nome"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Your Oo reads replies aloud when this is on."
msgid "Your Oo talks with you naturally when this is on."
msgstr ""
#: src/pages/Onboarding.tsx

View File

@ -386,10 +386,6 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr "{toolCount, plural, one {# инструмент} few {# инструмента} many {# инструментов} other {# инструмента}}"
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} работает"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "/Users/you/projects/acme"
@ -549,6 +545,7 @@ msgid "Add Executor"
msgstr "Добавить Executor"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/project-overview.tsx
msgid "Add goal"
msgstr ""
@ -737,6 +734,14 @@ msgstr "Всегда разрешено"
msgid "Analysiert die Aufgabe und führt Tools aus…"
msgstr ""
#: src/pages/Shell.tsx
msgid "Analyze the project and give me a brief overview."
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Analyzing project…"
msgstr ""
#: src/components/AskCard.tsx
msgid "Answer"
msgstr "Ответ"
@ -1031,10 +1036,6 @@ msgstr "Бот для ссылки"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "По умолчанию боты действуют, не спрашивая. Добавляйте исключение только в том случае, если вы хотите сначала просмотреть тип действия."
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Боты работают"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
@ -2983,10 +2984,11 @@ msgid "Here's what I see in the logs…"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Hi, this is how I'll sound when I read replies out loud."
msgstr "Привет, вот как я буду звучать, когда буду читать ответы вслух."
msgid "Hi, this is how I'll sound when we talk."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Hide bots"
msgstr "Скрыть ботов"
@ -3174,6 +3176,10 @@ msgstr "Перейти к последнему"
msgid "Jump to replied message"
msgstr "Перейти к ответному сообщению"
#: src/pages/shell/project-overview.tsx
msgid "Just ask in the chat whenever something should happen regularly."
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/ProjectSessionTimeline.tsx
msgid "just now"
@ -3899,6 +3905,7 @@ msgid "No results"
msgstr "Нет результатов"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "No runs yet"
msgstr "Запусков пока нет"
@ -3957,6 +3964,7 @@ msgid "Notifications"
msgstr "Уведомления"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Now"
msgstr "Сейчас"
@ -4288,10 +4296,6 @@ msgstr "Приватное пространство со своими ботам
msgid "Project"
msgstr ""
#: src/pages/Shell.tsx
msgid "Project · sessions & folders"
msgstr ""
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "Project folder"
@ -4399,6 +4403,10 @@ msgstr ""
msgid "Ready"
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Ready"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Reasoning effort"
msgstr ""
@ -4412,6 +4420,7 @@ msgid "Recall only"
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Recent"
msgstr "Недавние"
@ -4700,11 +4709,13 @@ msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/routine-event-line.tsx
msgid "Routine"
msgstr "Задача"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Routines"
msgstr "Задачи"
@ -4718,6 +4729,7 @@ msgid "Run at"
msgstr "Запустить в"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Run history"
msgstr "История запуска"
@ -5037,6 +5049,7 @@ msgstr "Показать ещё"
msgid "Show password"
msgstr "Показать пароль"
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Показать настройки"
@ -5398,6 +5411,7 @@ msgstr "Обучение в процессе. Прекратите обучен
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/project-overview.tsx
msgid "Team"
msgstr "Команда"
@ -5995,6 +6009,7 @@ msgid "Work channel open — go ahead."
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/shell/project-overview.tsx
msgid "Working"
msgstr ""
@ -6037,6 +6052,7 @@ msgstr "Вчера"
#: src/components/UserProfileSettings.tsx
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "You"
msgstr "Вы"
@ -6077,7 +6093,7 @@ msgid "Your name"
msgstr "Ваше имя"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Your Oo reads replies aloud when this is on."
msgid "Your Oo talks with you naturally when this is on."
msgstr ""
#: src/pages/Onboarding.tsx

View File

@ -386,10 +386,6 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} çalışıyor"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "/Users/you/projects/acme"
@ -549,6 +545,7 @@ msgid "Add Executor"
msgstr "Executor ekle"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/project-overview.tsx
msgid "Add goal"
msgstr ""
@ -737,6 +734,14 @@ msgstr "Her zaman izinli"
msgid "Analysiert die Aufgabe und führt Tools aus…"
msgstr ""
#: src/pages/Shell.tsx
msgid "Analyze the project and give me a brief overview."
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Analyzing project…"
msgstr ""
#: src/components/AskCard.tsx
msgid "Answer"
msgstr "Yanıtla"
@ -1031,10 +1036,6 @@ msgstr ""
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Botlar varsayılan olarak sormadan hareket eder. Yalnızca belirli bir işlem türünü önce incelemek istediğinde istisna ekle."
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Botlar çalışıyor"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
@ -2983,10 +2984,11 @@ msgid "Here's what I see in the logs…"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Hi, this is how I'll sound when I read replies out loud."
msgstr "Merhaba, yanıtları sesli okuduğumda böyle duyulacağım."
msgid "Hi, this is how I'll sound when we talk."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Hide bots"
msgstr ""
@ -3174,6 +3176,10 @@ msgstr "En son mesaja git"
msgid "Jump to replied message"
msgstr "Yanıtlanan mesaja git"
#: src/pages/shell/project-overview.tsx
msgid "Just ask in the chat whenever something should happen regularly."
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/ProjectSessionTimeline.tsx
msgid "just now"
@ -3899,6 +3905,7 @@ msgid "No results"
msgstr "Sonuç yok"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "No runs yet"
msgstr ""
@ -3957,6 +3964,7 @@ msgid "Notifications"
msgstr "Bildirimler"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Now"
msgstr "Şimdi"
@ -4288,10 +4296,6 @@ msgstr ""
msgid "Project"
msgstr ""
#: src/pages/Shell.tsx
msgid "Project · sessions & folders"
msgstr ""
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "Project folder"
@ -4399,6 +4403,10 @@ msgstr ""
msgid "Ready"
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Ready"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Reasoning effort"
msgstr "Akıl yürütme düzeyi"
@ -4412,6 +4420,7 @@ msgid "Recall only"
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Recent"
msgstr "Son"
@ -4700,11 +4709,13 @@ msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/routine-event-line.tsx
msgid "Routine"
msgstr "Rutin"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Routines"
msgstr "Rutinler"
@ -4718,6 +4729,7 @@ msgid "Run at"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Run history"
msgstr ""
@ -5037,6 +5049,7 @@ msgstr "Daha fazla göster"
msgid "Show password"
msgstr ""
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Ayarları göster"
@ -5398,6 +5411,7 @@ msgstr "Öğretme sürüyor. Yeni mesaj göndermeden önce öğretmeyi durdur."
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/project-overview.tsx
msgid "Team"
msgstr "Takım"
@ -5995,6 +6009,7 @@ msgid "Work channel open — go ahead."
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/shell/project-overview.tsx
msgid "Working"
msgstr ""
@ -6037,6 +6052,7 @@ msgstr "Dün"
#: src/components/UserProfileSettings.tsx
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "You"
msgstr "Sen"
@ -6077,7 +6093,7 @@ msgid "Your name"
msgstr "Adın"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Your Oo reads replies aloud when this is on."
msgid "Your Oo talks with you naturally when this is on."
msgstr ""
#: src/pages/Onboarding.tsx

View File

@ -386,10 +386,6 @@ msgstr "{title},{label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} 正在工作"
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "/Users/you/projects/acme"
@ -549,6 +545,7 @@ msgid "Add Executor"
msgstr "添加 Executor"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/project-overview.tsx
msgid "Add goal"
msgstr ""
@ -737,6 +734,14 @@ msgstr "始终允许"
msgid "Analysiert die Aufgabe und führt Tools aus…"
msgstr ""
#: src/pages/Shell.tsx
msgid "Analyze the project and give me a brief overview."
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Analyzing project…"
msgstr ""
#: src/components/AskCard.tsx
msgid "Answer"
msgstr "回答"
@ -1031,10 +1036,6 @@ msgstr "要关联的 Bot"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "默认情况下 Bot 会直接执行。只有当你想先审核某类操作时,才添加例外。"
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Bot 正在工作"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
@ -2983,10 +2984,11 @@ msgid "Here's what I see in the logs…"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Hi, this is how I'll sound when I read replies out loud."
msgstr "你好,这是我朗读回复时的声音。"
msgid "Hi, this is how I'll sound when we talk."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Hide bots"
msgstr ""
@ -3174,6 +3176,10 @@ msgstr "跳到最新"
msgid "Jump to replied message"
msgstr "跳到被回复的消息"
#: src/pages/shell/project-overview.tsx
msgid "Just ask in the chat whenever something should happen regularly."
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/ProjectSessionTimeline.tsx
msgid "just now"
@ -3899,6 +3905,7 @@ msgid "No results"
msgstr "无结果"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "No runs yet"
msgstr "还没有运行记录"
@ -3957,6 +3964,7 @@ msgid "Notifications"
msgstr "通知"
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Now"
msgstr "现在"
@ -4288,10 +4296,6 @@ msgstr ""
msgid "Project"
msgstr ""
#: src/pages/Shell.tsx
msgid "Project · sessions & folders"
msgstr ""
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/project-look-dialog.tsx
msgid "Project folder"
@ -4399,6 +4403,10 @@ msgstr ""
msgid "Ready"
msgstr ""
#: src/pages/shell/project-overview.tsx
msgid "Ready"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Reasoning effort"
msgstr "推理强度"
@ -4412,6 +4420,7 @@ msgid "Recall only"
msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/shell/project-overview.tsx
msgid "Recent"
msgstr "最近"
@ -4700,11 +4709,13 @@ msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/routine-event-line.tsx
msgid "Routine"
msgstr "例行任务"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Routines"
msgstr "例行任务"
@ -4718,6 +4729,7 @@ msgid "Run at"
msgstr "运行时间"
#: src/pages/RoutineEditor.tsx
#: src/pages/shell/project-overview.tsx
msgid "Run history"
msgstr "运行记录"
@ -5037,6 +5049,7 @@ msgstr "显示更多"
msgid "Show password"
msgstr "显示密码"
#: src/pages/shell/project-overview.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "显示设置"
@ -5398,6 +5411,7 @@ msgstr "正在示范,发送新消息前请先停止示范。"
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/project-overview.tsx
msgid "Team"
msgstr "团队"
@ -5995,6 +6009,7 @@ msgid "Work channel open — go ahead."
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/shell/project-overview.tsx
msgid "Working"
msgstr ""
@ -6037,6 +6052,7 @@ msgstr "昨天"
#: src/components/UserProfileSettings.tsx
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "You"
msgstr "你"
@ -6077,7 +6093,7 @@ msgid "Your name"
msgstr "你的名字"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Your Oo reads replies aloud when this is on."
msgid "Your Oo talks with you naturally when this is on."
msgstr ""
#: src/pages/Onboarding.tsx

View File

@ -435,6 +435,9 @@ export function ShellPage() {
} | null>(null);
const [routines, setRoutines] = useState<Routine[]>([]);
const [routinesBotId, setRoutinesBotId] = useState<string | null>(null);
const [projectRoutines, setProjectRoutines] = useState<Routine[]>([]);
const [projectRoutinesSpaceId, setProjectRoutinesSpaceId] = useState<string | null>(null);
const projectRoutinesRequest = useRef(0);
const [routineActiveToggleId, setRoutineActiveToggleId] = useState<string | null>(null);
const routineActiveToggleRequest = useRef(0);
const [taughtSkills, setTaughtSkills] = useState<TaughtSkill[]>([]);
@ -718,6 +721,61 @@ export function ShellPage() {
[active?.id, groupId, inGroup, pendingAttachments],
);
const activeRoutines = !inGroup && routinesBotId === active?.id ? routines : [];
const projectBotIds = useMemo(() => {
if (!inProject || !activeSpace) return [];
const ids = new Set<string>();
if (coordinatorBot) ids.add(coordinatorBot.id);
for (const member of activeSpace.bots ?? []) ids.add(member.id);
for (const bot of bots) {
if (bot.spaceId === activeSpace.id) ids.add(bot.id);
}
return [...ids];
}, [inProject, activeSpace, coordinatorBot, bots]);
const projectBotIdsRef = useRef<string[]>([]);
projectBotIdsRef.current = projectBotIds;
const activeProjectSpaceIdRef = useRef<string | null>(
inProject && activeSpace ? activeSpace.id : null,
);
activeProjectSpaceIdRef.current = inProject && activeSpace ? activeSpace.id : null;
const refreshProjectRoutines = useCallback(async (extraBotIds?: readonly string[]) => {
const spaceId = activeProjectSpaceIdRef.current;
if (!spaceId) return;
const botIds = [...new Set([...projectBotIdsRef.current, ...(extraBotIds ?? [])])];
if (botIds.length === 0) {
setProjectRoutines([]);
setProjectRoutinesSpaceId(spaceId);
return;
}
const request = ++projectRoutinesRequest.current;
const lists = await Promise.all(
botIds.map((id) => rpc.routines.list({ botId: id }).catch(() => null)),
);
if (request !== projectRoutinesRequest.current || activeProjectSpaceIdRef.current !== spaceId) {
return;
}
const seen = new Set<string>();
const merged: Routine[] = [];
for (const list of lists) {
if (!list) continue;
for (const item of list) {
if (!seen.has(item.id)) {
seen.add(item.id);
merged.push(item);
}
}
}
setProjectRoutines(merged);
setProjectRoutinesSpaceId(spaceId);
}, []);
const projectBotIdsKey = projectBotIds.join(",");
useEffect(() => {
if (!inProject || !activeSpace) {
setProjectRoutines([]);
setProjectRoutinesSpaceId(null);
return;
}
void refreshProjectRoutines();
}, [inProject, activeSpace?.id, projectBotIdsKey, refreshProjectRoutines]);
const activeTaughtSkills = taughtSkillsBotId === active?.id ? taughtSkills : [];
const recordingSkill = activeTaughtSkills.find((skill) => skill.status === "recording") ?? null;
const routeBotId = useRef<string | undefined>(botId);
@ -903,6 +961,11 @@ export function ShellPage() {
commitComputer(null);
setRoutines([]);
setRoutinesBotId(null);
void refreshProjectRoutines(
[snap.leadBotId, ...(snap.members?.map((member) => member.botId) ?? [])].filter(
(botId): botId is string => Boolean(botId),
),
);
// Keep the search-jump viewport; expandedHistoryThread merge still accepts live messages.
if (
stickToEnd &&
@ -962,6 +1025,7 @@ export function ShellPage() {
if (routines) {
setRoutines(routines);
setRoutinesBotId(id);
void refreshProjectRoutines([id]);
}
if (skills) {
setTaughtSkills(skills);
@ -1409,6 +1473,16 @@ export function ShellPage() {
if (blocks.some((block) => block.kind === "project_created")) {
void refreshBots().catch(() => undefined);
}
if (blocks.some((block) => block.kind === "event")) {
void refreshProjectRoutines();
}
}
if (
event.type === "thread.message.updated" ||
event.type === "routine.created" ||
event.type === "routine.updated"
) {
void refreshProjectRoutines();
}
if (event.type === "run.waiting_input" || event.type === "computer.takeover.requested") {
ooSound.play("need-you");
@ -2689,7 +2763,10 @@ export function ShellPage() {
const setRoutineActive = useCallback(
async (routine: Routine, active: boolean) => {
const botId = activeBotId.current;
if (!botId || routine.botId !== botId) return;
const inCurrentProject =
Boolean(activeProjectSpaceIdRef.current) &&
projectBotIdsRef.current.includes(routine.botId);
if ((!botId || routine.botId !== botId) && !inCurrentProject) return;
const request = ++routineActiveToggleRequest.current;
const previousActive = routine.active;
setRoutineActiveToggleId(routine.id);
@ -2698,16 +2775,32 @@ export function ShellPage() {
? current.map((item) => (item.id === routine.id ? { ...item, active } : item))
: current,
);
setProjectRoutines((current) =>
current.map((item) => (item.id === routine.id ? { ...item, active } : item)),
);
try {
const saved = await rpc.routines.update({ routineId: routine.id, active });
if (routineActiveToggleRequest.current !== request || activeBotId.current !== botId) return;
if (
routineActiveToggleRequest.current !== request ||
(activeBotId.current !== botId && !activeProjectSpaceIdRef.current)
) {
return;
}
setRoutines((current) =>
routinesBotId === botId
? current.map((item) => (item.id === saved.id ? saved : item))
: current,
);
setProjectRoutines((current) =>
current.map((item) => (item.id === saved.id ? saved : item)),
);
} catch {
if (routineActiveToggleRequest.current !== request || activeBotId.current !== botId) return;
if (
routineActiveToggleRequest.current !== request ||
(activeBotId.current !== botId && !activeProjectSpaceIdRef.current)
) {
return;
}
setRoutines((current) =>
routinesBotId === botId
? current.map((item) =>
@ -2715,6 +2808,11 @@ export function ShellPage() {
)
: current,
);
setProjectRoutines((current) =>
current.map((item) =>
item.id === routine.id ? { ...item, active: previousActive } : item,
),
);
} finally {
if (routineActiveToggleRequest.current === request) {
setRoutineActiveToggleId((current) => (current === routine.id ? null : current));
@ -4127,6 +4225,16 @@ export function ShellPage() {
: inProject && !panel && canvasTab === "sandbox"
? "overview"
: canvasTab;
const isOverlayPanel =
panel === "settings" ||
panel === "routine" ||
panel === "create" ||
panel === "create-group" ||
panel === "group-settings";
const routineTargetBot =
(editingRoutine ? bots.find((b) => b.id === editingRoutine.botId) : undefined) ??
active ??
coordinatorBot;
const canvasElement = (
<aside
@ -4198,7 +4306,7 @@ export function ShellPage() {
/>
) : null}
{inProject && panel !== "settings" && effectiveTab === "overview" && activeSpace ? (
{inProject && !isOverlayPanel && effectiveTab === "overview" && activeSpace ? (
<div className="rk-scroll h-full w-full overflow-y-auto px-4 py-4">
<ProjectOverview
spaceId={activeSpace.id}
@ -4211,6 +4319,24 @@ export function ShellPage() {
}
: undefined
}
routines={projectRoutinesSpaceId === activeSpace.id ? projectRoutines : []}
runningRoutineId={
activeSnapshot?.run && isActive(activeSnapshot.run.status)
? (activeSnapshot.run.routineId ?? null)
: null
}
togglingRoutineId={routineActiveToggleId}
onToggleRoutineActive={(routine, next) =>
void setRoutineActive(routine, next)
}
onOpenRoutine={(routine) => {
setRoutineDraft(draftFromRoutine(routine));
setRoutineWebhookSecret(null);
setEditingRoutine(routine);
setRoutineError(null);
setPanel("routine");
}}
onStopRun={() => void stopRun()}
onOpenRun={(run) =>
openSpaceChat(
run.spaceId,
@ -4225,7 +4351,7 @@ export function ShellPage() {
/>
</div>
) : !inProject &&
panel !== "settings" &&
!isOverlayPanel &&
effectiveTab === "overview" &&
(active ?? coordinatorBot) ? (
<div className="rk-scroll h-full w-full overflow-y-auto px-4 py-4">
@ -4270,7 +4396,7 @@ export function ShellPage() {
onOpenSettings={() => setPanel("settings")}
/>
</div>
) : panel === "browser" || (effectiveTab === "browser" && panel !== "settings") ? (
) : panel === "browser" || (effectiveTab === "browser" && !isOverlayPanel) ? (
<div className="flex-1 min-h-0 flex flex-col">
<InAppBrowser
onClose={() => {
@ -4297,7 +4423,7 @@ export function ShellPage() {
}}
/>
</div>
) : effectiveTab === "files" && panel !== "settings" ? (
) : effectiveTab === "files" && !isOverlayPanel ? (
<div className="rk-scroll h-full w-full overflow-y-auto px-5 lg:px-7 2xl:px-9 py-[17px]">
{(active ?? coordinatorBot) ? (
<WorkspaceFilesView botId={(active ?? coordinatorBot)!.id} className="mt-0" />
@ -4431,7 +4557,7 @@ export function ShellPage() {
}
/>
) : null}
{panel === "routine" && active ? (
{panel === "routine" && routineTargetBot ? (
<RoutineEditor
draft={routineDraft}
onChange={setRoutineDraft}
@ -4440,28 +4566,29 @@ export function ShellPage() {
webhook={{
path:
typeof window !== "undefined"
? `${window.location.origin}/api/v1/bots/${active.id}/webhook`
: `/api/v1/bots/${active.id}/webhook`,
? `${window.location.origin}/api/v1/bots/${routineTargetBot.id}/webhook`
: `/api/v1/bots/${routineTargetBot.id}/webhook`,
secret: routineWebhookSecret,
configured: active.webhookConfigured || Boolean(routineWebhookSecret),
configured:
routineTargetBot.webhookConfigured || Boolean(routineWebhookSecret),
}}
githubPath={
typeof window !== "undefined"
? `${window.location.origin}/api/v1/bots/${active.id}/github`
: `/api/v1/bots/${active.id}/github`
? `${window.location.origin}/api/v1/bots/${routineTargetBot.id}/github`
: `/api/v1/bots/${routineTargetBot.id}/github`
}
messageProviders={messagingProviders}
saving={savingRoutine}
running={runningRoutine}
error={routineError}
onBack={() => setPanel("computer")}
onBack={() => setPanel(inProject ? null : "computer")}
onClose={() => setPanel(null)}
onEnsureWebhook={async () => {
await ensureWebhookSecret(active.id);
await ensureWebhookSecret(routineTargetBot.id);
}}
onSave={async () => {
if (routineSavePending.current) return;
const targetBotId = active.id;
const targetBotId = routineTargetBot.id;
const targetRoutine = editingRoutine;
if (targetRoutine && targetRoutine.botId !== targetBotId) return;
if (
@ -4480,7 +4607,7 @@ export function ShellPage() {
try {
if (
(routineDraft.webhookEnabled || routineDraft.githubEnabled) &&
!active.webhookConfigured &&
!routineTargetBot.webhookConfigured &&
!routineWebhookSecret
) {
await ensureWebhookSecret(targetBotId);
@ -4533,10 +4660,12 @@ export function ShellPage() {
}
if (
routineSaveRequest.current === saveRequest &&
activeBotId.current === targetBotId
(activeBotId.current === targetBotId ||
Boolean(activeProjectSpaceIdRef.current))
) {
setEditingRoutine(saved);
setRoutineDraft(draftFromRoutine(saved));
if (activeBotId.current === targetBotId) {
setRoutines((current) =>
routinesBotId === targetBotId || routinesBotId === null
? current.some((item) => item.id === saved.id)
@ -4546,10 +4675,19 @@ export function ShellPage() {
);
setRoutinesBotId(targetBotId);
}
if (activeProjectSpaceIdRef.current) {
setProjectRoutines((current) =>
current.some((item) => item.id === saved.id)
? current.map((item) => (item.id === saved.id ? saved : item))
: [...current, saved],
);
}
}
} catch (error) {
if (
routineSaveRequest.current !== saveRequest ||
activeBotId.current !== targetBotId
(activeBotId.current !== targetBotId &&
!activeProjectSpaceIdRef.current)
) {
return;
}
@ -4563,15 +4701,20 @@ export function ShellPage() {
}
if (
routineSaveRequest.current !== saveRequest ||
activeBotId.current !== targetBotId
(activeBotId.current !== targetBotId &&
!activeProjectSpaceIdRef.current)
) {
return;
}
if (activeBotId.current === targetBotId) {
await refreshThread(targetBotId).catch(() => undefined);
} else {
await refreshProjectRoutines([targetBotId]).catch(() => undefined);
}
}}
onTestRun={async () => {
if (routineRunPending.current) return;
const targetBotId = active.id;
const targetBotId = routineTargetBot.id;
const targetRoutine = editingRoutine;
if (!targetRoutine) return;
routineRunPending.current = true;
@ -4579,9 +4722,16 @@ export function ShellPage() {
setRoutineError(null);
try {
await rpc.routines.testRun({ routineId: targetRoutine.id });
await refreshThread(targetBotId);
} catch (error) {
if (activeBotId.current === targetBotId) {
await refreshThread(targetBotId);
} else if (activeGroupId.current) {
await refreshGroupThread(activeGroupId.current);
}
} catch (error) {
if (
activeBotId.current === targetBotId ||
activeProjectSpaceIdRef.current
) {
setRoutineError(
error instanceof Error ? error.message : t`Could not run routine`,
);
@ -4596,7 +4746,7 @@ export function ShellPage() {
setDeleteRoutineTarget(editingRoutine);
return;
}
setPanel("computer");
setPanel(inProject ? null : "computer");
}}
/>
) : null}
@ -4952,10 +5102,15 @@ export function ShellPage() {
if (newSpaceDialogVariant === "project") {
try {
const main = await rpc.spaces.ensureMain({ spaceId: space.id });
if (input.goal?.trim()) {
const kickoff =
input.goal?.trim() ||
(input.workspacePath?.trim() || input.gitRemoteUrl?.trim()
? t`Analyze the project and give me a brief overview.`
: "");
if (kickoff) {
await rpc.threads.send({
groupId: main.groupId,
text: input.goal.trim(),
text: kickoff,
});
}
window.location.assign(`/app/g/${main.groupId}`);
@ -5027,6 +5182,11 @@ export function ShellPage() {
await rpc.routines.remove({ routineId: target.id });
setDeleteRoutineTarget(null);
setEditingRoutine((current) => (current?.id === target.id ? null : current));
setProjectRoutines((current) => current.filter((item) => item.id !== target.id));
if (activeProjectSpaceIdRef.current && activeBotId.current !== target.botId) {
setPanel(null);
return;
}
if (activeBotId.current !== target.botId) return;
await refreshThread(target.botId);
if (activeBotId.current === target.botId) setPanel("computer");

View File

@ -0,0 +1,142 @@
// @vitest-environment jsdom
import type { Routine, Space } from "@rakazo/contracts";
import { act } from "react";
import type { Root } from "react-dom/client";
import { createRoot } from "react-dom/client";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
(globalThis as Record<string, unknown>).IS_REACT_ACT_ENVIRONMENT = true;
vi.mock("@lingui/core/macro", () => ({
t: (parts: TemplateStringsArray, ...values: unknown[]) =>
parts.reduce(
(text, part, index) => text + part + (index < values.length ? values[index] : ""),
"",
),
}));
vi.mock("@lingui/react/macro", () => {
const t = (parts: TemplateStringsArray, ...values: unknown[]) =>
parts.reduce(
(text, part, index) => text + part + (index < values.length ? values[index] : ""),
"",
);
return {
useLingui: () => ({ t }),
Trans: ({ children }: { children: React.ReactNode }) => children,
};
});
import { ProjectOverview } from "./project-overview";
const sampleSpace: Space = {
id: "space-project-1",
name: "Garten",
isDefault: false,
canEdit: true,
canDelete: true,
hasContent: true,
bots: [],
groups: [],
externalConversations: [],
botSections: [],
};
const sampleRoutine: Routine = {
id: "routine-1",
botId: "bot-1",
name: "Morning check-in",
prompt: "Summarize project status",
crons: ["0 9 * * *"],
timezone: "Europe/Berlin",
active: true,
notify: true,
webhookEnabled: false,
githubEnabled: false,
messageProvider: null,
lastRunAt: null,
nextRunAt: "2026-10-20T07:00:00.000Z",
createdAt: "2026-10-19T07:00:00.000Z",
coachKey: null,
};
describe("ProjectOverview routines section", () => {
let container: HTMLDivElement;
let root: Root;
beforeEach(() => {
container = document.createElement("div");
document.body.appendChild(container);
root = createRoot(container);
});
afterEach(() => {
act(() => {
root.unmount();
});
container.remove();
});
it("shows a customer-friendly hint to create routines via chat when no routines exist", () => {
act(() => {
root.render(
<ProjectOverview
spaceId={sampleSpace.id}
space={sampleSpace}
routines={[]}
onOpenRun={() => undefined}
/>,
);
});
const overview = container.querySelector('[data-testid="project-overview"]');
expect(overview).not.toBeNull();
expect(overview?.textContent).toContain("Routines");
expect(overview?.textContent).toContain(
"Just ask in the chat whenever something should happen regularly.",
);
expect(container.querySelector('[data-testid="routine-list-row"]')).toBeNull();
});
it("renders existing routines with a toggle to quickly turn them on and off", () => {
const onToggleRoutineActive = vi.fn();
const onOpenRoutine = vi.fn();
act(() => {
root.render(
<ProjectOverview
spaceId={sampleSpace.id}
space={sampleSpace}
routines={[sampleRoutine]}
onToggleRoutineActive={onToggleRoutineActive}
onOpenRoutine={onOpenRoutine}
onOpenRun={() => undefined}
/>,
);
});
const row = container.querySelector('[data-testid="routine-list-row"]');
expect(row).not.toBeNull();
expect(row?.textContent).toContain("Morning check-in");
const toggle = container.querySelector(
'[data-testid="routine-list-active-toggle"]',
) as HTMLElement | null;
expect(toggle).not.toBeNull();
expect(toggle?.getAttribute("aria-checked")).toBe("true");
act(() => {
toggle?.click();
});
expect(onToggleRoutineActive).toHaveBeenCalledTimes(1);
expect(onToggleRoutineActive).toHaveBeenCalledWith(sampleRoutine, false);
const openButton = row?.querySelector("button") as HTMLButtonElement | null;
act(() => {
openButton?.click();
});
expect(onOpenRoutine).toHaveBeenCalledTimes(1);
expect(onOpenRoutine).toHaveBeenCalledWith(sampleRoutine);
});
});

View File

@ -22,6 +22,12 @@ export function ProjectOverview({
spaceId,
space,
coordinator,
routines = [],
runningRoutineId,
togglingRoutineId,
onToggleRoutineActive,
onOpenRoutine,
onStopRun,
onOpenRun,
onOpenBot,
onOpenNewInquiry,
@ -30,6 +36,12 @@ export function ProjectOverview({
spaceId: string;
space?: Space;
coordinator?: { threadId: string; botId?: string };
routines?: readonly Routine[];
runningRoutineId?: string | null;
togglingRoutineId?: string | null;
onToggleRoutineActive?: (routine: Routine, active: boolean) => void;
onOpenRoutine?: (routine: Routine) => void;
onStopRun?: () => void;
onOpenRun: (run: RunActivityRow) => void;
onOpenBot?: (botId: string) => void;
onOpenNewInquiry?: () => void;
@ -71,6 +83,14 @@ export function ProjectOverview({
const gitRemote = space?.workspace?.git?.remoteUrl;
const goal = space?.goal;
const projectBots = space?.bots ?? [];
const coordinatorWorking =
projectBots.some(
(member) =>
member.status &&
member.status !== "idle" &&
member.status !== "ready" &&
member.status !== "done",
) || activity.active.some((row) => row.spaceId === spaceId);
return (
<div
@ -237,9 +257,49 @@ export function ProjectOverview({
) : null}
</div>
) : isProjectSpace ? (
coordinatorWorking ? (
<div className="flex items-center gap-2 rounded-xl border border-border/60 bg-card/30 px-3.5 py-3 text-ui-body-sm text-foreground">
<span aria-hidden="true" className="size-2 rounded-full bg-warning animate-pulse" />
<Trans>Analyzing project…</Trans>
</div>
) : (
<div className="rounded-xl border border-border/60 bg-card/30 px-3.5 py-3 text-ui-body-sm text-muted-foreground">
<Trans>No runs yet</Trans>
</div>
)
) : null}
{isProjectSpace ? (
<div className="space-y-2">
<div className="flex items-center justify-between px-1">
<span className="text-ui-label font-semibold uppercase tracking-wider text-muted-foreground">
<Trans>Routines</Trans>
</span>
</div>
{routines.length > 0 ? (
<div className="rounded-xl border border-border/60 bg-card/30 p-1.5 space-y-0.5">
{routines.map((routine) => (
<RoutineListRow
key={routine.id}
routine={routine}
running={runningRoutineId === routine.id}
togglingActive={togglingRoutineId === routine.id}
onActiveChange={(next) => onToggleRoutineActive?.(routine, next)}
onOpen={() => onOpenRoutine?.(routine)}
onStop={() => onStopRun?.()}
/>
))}
</div>
) : (
<div className="flex items-center gap-2 rounded-xl border border-border/60 bg-card/30 px-3.5 py-2.5 text-ui-body-sm text-muted-foreground">
<Clock size={14} className="shrink-0" />
<span>
<Trans>Just ask in the chat whenever something should happen regularly.</Trans>
</span>
</div>
)}
</div>
) : null}
</div>
);
@ -430,7 +490,7 @@ export function AgentOverview({
<div className="flex items-center gap-2 rounded-xl border border-border/60 bg-card/30 px-3.5 py-2.5 text-ui-body-sm text-muted-foreground">
<Clock size={14} className="shrink-0" />
<span>
<Trans>On a schedule</Trans>
<Trans>Just ask in the chat whenever something should happen regularly.</Trans>
</span>
</div>
)}