Merge d2/components: ShellPage JSX components

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
This commit is contained in:
Claude 2026-10-04 10:26:15 +00:00
commit a72adac613
No known key found for this signature in database
21 changed files with 1663 additions and 1297 deletions

View File

@ -63,6 +63,7 @@ describe("window chrome", () => {
it("keeps conversation header controls clickable", () => {
const root = path.join(path.dirname(fileURLToPath(import.meta.url)), "../pages");
const shell = readFileSync(path.join(root, "Shell.tsx"), "utf8");
const toggles = readFileSync(path.join(root, "shell/sidebar-toggle-buttons.tsx"), "utf8");
expect(shell).toContain(
'className="app-drag flex items-center justify-between border-b border-sidebar-border',
);
@ -70,14 +71,16 @@ describe("window chrome", () => {
expect(shell).toContain('className="app-no-drag flex min-w-0 items-center gap-3"');
// Ensure header sidebar toggle controls stay clickable (not part of drag region)
expect(
shell.match(/app-no-drag .* size-control-lg .* place-items-center/g)?.length ?? 0,
toggles.match(/app-no-drag .* size-control-lg .* place-items-center/g)?.length ?? 0,
).toBeGreaterThanOrEqual(2);
});
it("moves window chrome into the conversation header when the bots sidebar is collapsed", () => {
const root = path.join(path.dirname(fileURLToPath(import.meta.url)), "../pages");
const shell = readFileSync(path.join(root, "Shell.tsx"), "utf8");
expect(shell).toContain("{botsSidebarCollapsed && desktopBridge() ? <WindowChrome /> : null}");
const toggles = readFileSync(path.join(root, "shell/sidebar-toggle-buttons.tsx"), "utf8");
expect(shell).toContain("collapsed={botsSidebarCollapsed}");
expect(toggles).toContain("{collapsed && desktopBridge() ? <WindowChrome /> : null}");
});
});

View File

@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: \n"
"X-Generator: @lingui/cli\n"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid " (unread)"
msgstr " (ungelesen)"
@ -126,22 +126,22 @@ msgid "{0}, {label}"
msgstr "{0}, {label}"
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, 1:1 conversation"
msgstr "{0}, 1:1-Unterhaltung"
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, group conversation"
msgstr "{0}, Gruppenunterhaltung"
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, main conversation"
msgstr "{0}, Hauptunterhaltung"
#. placeholder {0}: active.name
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "{0}'s screen"
msgstr "{0}s Bildschirm"
@ -339,6 +339,7 @@ msgstr "Aktionsbestätigungen"
#. placeholder {0}: sectionMenu.section.name
#: src/pages/BotContextMenu.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Actions for {0}"
msgstr "Aktionen für {0}"
@ -354,7 +355,7 @@ msgstr "Aktiv"
msgid "Active model"
msgstr "Aktives Modell"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Activity"
msgstr "Aktivität"
@ -647,7 +648,7 @@ msgstr "Archivieren"
msgid "archived"
msgstr "archiviert"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Archived"
msgstr "Archiviert"
@ -812,11 +813,11 @@ msgstr "Bot"
msgid "Bot"
msgstr "Bot"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Bot screen"
msgstr "Bot-Bildschirm"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Bot screen preview"
msgstr "Bot-Bildschirmvorschau"
@ -1088,7 +1089,7 @@ msgstr "Schließen"
msgid "Close chart"
msgstr "Diagramm schließen"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Close computer"
msgstr "Computer schließen"
@ -1128,7 +1129,7 @@ msgstr "Navigation schließen"
#: src/components/ArtifactPane.tsx
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Close panel"
msgstr "Panel schließen"
@ -1159,7 +1160,7 @@ msgid "Coder"
msgstr "Coder"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Collapse {0}"
msgstr "{0} einklappen"
@ -1201,7 +1202,7 @@ msgstr "Computer"
msgid "Computer failed to boot"
msgstr "Computer konnte nicht gestartet werden"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Computer is asleep"
msgstr "Computer ist im Ruhezustand"
@ -1743,9 +1744,9 @@ msgstr "Avatare konnten nicht aktualisiert werden"
msgid "Couldn't update messaging settings"
msgstr "Messaging-Einstellungen konnten nicht aktualisiert werden"
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Create"
msgstr "Erstellen"
@ -1902,14 +1903,14 @@ msgstr "Standardbereich"
#: src/pages/KnowledgeSection.tsx
#: src/pages/McpServersOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
#: src/pages/shell/dialogs.tsx
msgid "Delete"
msgstr "Löschen"
#. placeholder {0}: bot.name
#. placeholder {0}: group.name
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Delete {0}"
msgstr "{0} löschen"
@ -2218,7 +2219,7 @@ msgid "Expand"
msgstr "Erweitern"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Expand {0}"
msgstr "{0} ausklappen"
@ -2400,6 +2401,7 @@ msgstr "Ziele für dieses Projekt, unabhängig von Chat-Nachrichten. Unterhaltun
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Group"
msgstr "Gruppe"
@ -2791,7 +2793,7 @@ msgstr "Lokales Docker"
msgid "Local Server Settings"
msgstr "Einstellungen des lokalen Servers"
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Log out"
msgstr "Abmelden"
@ -2974,7 +2976,7 @@ msgstr "Minimal"
msgid "Minimize"
msgstr "Minimieren"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Minimize bots"
msgstr "Bots minimieren"
@ -3097,7 +3099,7 @@ msgstr "Braucht dich"
#: src/components/MainInbox.tsx
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr "Braucht dich"
@ -3391,12 +3393,12 @@ msgid "Only file and folder names are read."
msgstr "Gelesen werden nur Datei- und Ordnernamen."
#: src/pages/ScratchpadSection.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open"
msgstr "Öffnen"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Open {0}"
msgstr "{0} öffnen"
@ -3412,11 +3414,11 @@ msgstr "Unterhaltung öffnen"
msgid "Open in browser"
msgstr "Im Browser öffnen"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open in full window"
msgstr "In vollständigem Fenster öffnen"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Open navigation"
msgstr "Navigation öffnen"
@ -3931,7 +3933,7 @@ msgstr "Wird zurückgesetzt…"
msgid "Restart to update"
msgstr "Zum Aktualisieren neu starten"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Restore"
msgstr "Wiederherstellen"
@ -4136,7 +4138,7 @@ msgid "Searching…"
msgstr "Suche…"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Select {0}"
msgstr "{0} auswählen"
@ -4201,7 +4203,8 @@ msgstr "Stimme einrichten"
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
#: src/pages/shell/user-menu.tsx
msgid "Settings"
msgstr "Einstellungen"
@ -4253,10 +4256,11 @@ msgid "Show all {0}"
msgstr "Alle {0} anzeigen"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Show bots"
msgstr "Bots anzeigen"
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show computer"
msgstr "Computer anzeigen"
@ -4272,7 +4276,7 @@ msgstr "Mehr anzeigen"
msgid "Show password"
msgstr "Passwort anzeigen"
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Einstellungen anzeigen"
@ -4460,8 +4464,8 @@ msgid "Steps"
msgstr "Schritte"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Stoppen"
@ -4832,7 +4836,7 @@ msgstr "Hochladen"
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Usage"
msgstr "Nutzung"
@ -5088,7 +5092,7 @@ msgstr "Du kannst diesen Tab schließen, wenn du nicht automatisch weitergeleite
msgid "You can close this window."
msgstr "Du kannst dieses Fenster schließen."
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "You have control"
msgstr "Du hast die Kontrolle"

View File

@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: \n"
"X-Generator: @lingui/cli\n"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid " (unread)"
msgstr " (unread)"
@ -126,22 +126,22 @@ msgid "{0}, {label}"
msgstr "{0}, {label}"
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, 1:1 conversation"
msgstr "{0}, 1:1 conversation"
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, group conversation"
msgstr "{0}, group conversation"
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, main conversation"
msgstr "{0}, main conversation"
#. placeholder {0}: active.name
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "{0}'s screen"
msgstr "{0}'s screen"
@ -339,6 +339,7 @@ msgstr "Action confirmations"
#. placeholder {0}: sectionMenu.section.name
#: src/pages/BotContextMenu.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Actions for {0}"
msgstr "Actions for {0}"
@ -354,7 +355,7 @@ msgstr "Active"
msgid "Active model"
msgstr "Active model"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Activity"
msgstr "Activity"
@ -647,7 +648,7 @@ msgstr "Archive"
msgid "archived"
msgstr "archived"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Archived"
msgstr "Archived"
@ -812,11 +813,11 @@ msgstr "Bot"
msgid "Bot"
msgstr "Bot"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Bot screen"
msgstr "Bot screen"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Bot screen preview"
msgstr "Bot screen preview"
@ -1088,7 +1089,7 @@ msgstr "Close"
msgid "Close chart"
msgstr "Close chart"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Close computer"
msgstr "Close computer"
@ -1128,7 +1129,7 @@ msgstr "Close navigation"
#: src/components/ArtifactPane.tsx
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Close panel"
msgstr "Close panel"
@ -1159,7 +1160,7 @@ msgid "Coder"
msgstr "Coder"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Collapse {0}"
msgstr "Collapse {0}"
@ -1201,7 +1202,7 @@ msgstr "Computer"
msgid "Computer failed to boot"
msgstr "Computer failed to boot"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Computer is asleep"
msgstr "Computer is asleep"
@ -1743,9 +1744,9 @@ msgstr "Couldn't update avatars"
msgid "Couldn't update messaging settings"
msgstr "Couldn't update messaging settings"
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Create"
msgstr "Create"
@ -1902,14 +1903,14 @@ msgstr "Default scope"
#: src/pages/KnowledgeSection.tsx
#: src/pages/McpServersOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
#: src/pages/shell/dialogs.tsx
msgid "Delete"
msgstr "Delete"
#. placeholder {0}: bot.name
#. placeholder {0}: group.name
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Delete {0}"
msgstr "Delete {0}"
@ -2218,7 +2219,7 @@ msgid "Expand"
msgstr "Expand"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Expand {0}"
msgstr "Expand {0}"
@ -2400,6 +2401,7 @@ msgstr "Goals for this project, separate from chat messages. Conversations are b
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Group"
msgstr "Group"
@ -2791,7 +2793,7 @@ msgstr "Local Docker"
msgid "Local Server Settings"
msgstr "Local Server Settings"
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Log out"
msgstr "Log out"
@ -2974,7 +2976,7 @@ msgstr "Minimal"
msgid "Minimize"
msgstr "Minimize"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Minimize bots"
msgstr "Minimize bots"
@ -3097,7 +3099,7 @@ msgstr "Needs you"
#: src/components/MainInbox.tsx
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr "Needs you"
@ -3391,12 +3393,12 @@ msgid "Only file and folder names are read."
msgstr "Only file and folder names are read."
#: src/pages/ScratchpadSection.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open"
msgstr "Open"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Open {0}"
msgstr "Open {0}"
@ -3412,11 +3414,11 @@ msgstr "Open conversation"
msgid "Open in browser"
msgstr "Open in browser"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open in full window"
msgstr "Open in full window"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Open navigation"
msgstr "Open navigation"
@ -3931,7 +3933,7 @@ msgstr "Resetting…"
msgid "Restart to update"
msgstr "Restart to update"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Restore"
msgstr "Restore"
@ -4136,7 +4138,7 @@ msgid "Searching…"
msgstr "Searching…"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Select {0}"
msgstr "Select {0}"
@ -4201,7 +4203,8 @@ msgstr "Set up voice"
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
#: src/pages/shell/user-menu.tsx
msgid "Settings"
msgstr "Settings"
@ -4253,10 +4256,11 @@ msgid "Show all {0}"
msgstr "Show all {0}"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Show bots"
msgstr "Show bots"
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show computer"
msgstr "Show computer"
@ -4272,7 +4276,7 @@ msgstr "Show more"
msgid "Show password"
msgstr "Show password"
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Show settings"
@ -4460,8 +4464,8 @@ msgid "Steps"
msgstr "Steps"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Stop"
@ -4832,7 +4836,7 @@ msgstr "Upload"
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Usage"
msgstr "Usage"
@ -5088,7 +5092,7 @@ msgstr "You can close this tab if it does not redirect automatically."
msgid "You can close this window."
msgstr "You can close this window."
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "You have control"
msgstr "You have control"

View File

@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: @lingui/cli\n"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid " (unread)"
msgstr " (sin leer)"
@ -126,22 +126,22 @@ msgid "{0}, {label}"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, 1:1 conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, group conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, main conversation"
msgstr ""
#. placeholder {0}: active.name
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "{0}'s screen"
msgstr "Pantalla de {0}"
@ -339,6 +339,7 @@ msgstr "Confirmaciones de acción"
#. placeholder {0}: sectionMenu.section.name
#: src/pages/BotContextMenu.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Actions for {0}"
msgstr "Acciones para {0}"
@ -354,7 +355,7 @@ msgstr "Activo"
msgid "Active model"
msgstr "Modelo activo"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Activity"
msgstr "Actividad"
@ -647,7 +648,7 @@ msgstr "Archivar"
msgid "archived"
msgstr "archivado"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Archived"
msgstr "Archivado"
@ -812,11 +813,11 @@ msgstr "Bot"
msgid "Bot"
msgstr "Bot"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Bot screen"
msgstr "Pantalla del bot"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Bot screen preview"
msgstr "Vista previa de la pantalla del bot"
@ -1088,7 +1089,7 @@ msgstr "Cerrar"
msgid "Close chart"
msgstr "Cerrar gráfico"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Close computer"
msgstr "Cerrar computadora"
@ -1128,7 +1129,7 @@ msgstr "Cerrar navegación"
#: src/components/ArtifactPane.tsx
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Close panel"
msgstr "Cerrar panel"
@ -1159,7 +1160,7 @@ msgid "Coder"
msgstr ""
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Collapse {0}"
msgstr "Contraer {0}"
@ -1201,7 +1202,7 @@ msgstr "Computadora"
msgid "Computer failed to boot"
msgstr "La computadora no pudo iniciarse"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Computer is asleep"
msgstr "La computadora está en reposo"
@ -1743,9 +1744,9 @@ msgstr "No se pudieron actualizar los avatares"
msgid "Couldn't update messaging settings"
msgstr "No se pudo actualizar la configuración de mensajería"
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Create"
msgstr "Crear"
@ -1902,14 +1903,14 @@ msgstr "Alcance predeterminado"
#: src/pages/KnowledgeSection.tsx
#: src/pages/McpServersOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
#: src/pages/shell/dialogs.tsx
msgid "Delete"
msgstr "Eliminar"
#. placeholder {0}: bot.name
#. placeholder {0}: group.name
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Delete {0}"
msgstr "Eliminar {0}"
@ -2218,7 +2219,7 @@ msgid "Expand"
msgstr "Expandir"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Expand {0}"
msgstr "Expandir {0}"
@ -2400,6 +2401,7 @@ msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Group"
msgstr "Grupo"
@ -2791,7 +2793,7 @@ msgstr ""
msgid "Local Server Settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Log out"
msgstr "Cerrar sesión"
@ -2974,7 +2976,7 @@ msgstr "Mínimo"
msgid "Minimize"
msgstr "Minimizar"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Minimize bots"
msgstr ""
@ -3097,7 +3099,7 @@ msgstr ""
#: src/components/MainInbox.tsx
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3391,12 +3393,12 @@ msgid "Only file and folder names are read."
msgstr ""
#: src/pages/ScratchpadSection.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open"
msgstr "Abrir"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Open {0}"
msgstr "Abrir {0}"
@ -3412,11 +3414,11 @@ msgstr ""
msgid "Open in browser"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open in full window"
msgstr "Abrir en ventana completa"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Open navigation"
msgstr "Abrir navegación"
@ -3931,7 +3933,7 @@ msgstr "Restableciendo…"
msgid "Restart to update"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Restore"
msgstr "Restaurar"
@ -4136,7 +4138,7 @@ msgid "Searching…"
msgstr "Buscando…"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Select {0}"
msgstr ""
@ -4201,7 +4203,8 @@ msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
#: src/pages/shell/user-menu.tsx
msgid "Settings"
msgstr "Configuración"
@ -4253,10 +4256,11 @@ msgid "Show all {0}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Show bots"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show computer"
msgstr ""
@ -4272,7 +4276,7 @@ msgstr "Mostrar más"
msgid "Show password"
msgstr "Mostrar contraseña"
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Mostrar configuración"
@ -4460,8 +4464,8 @@ msgid "Steps"
msgstr "Pasos"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Detener"
@ -4832,7 +4836,7 @@ msgstr "Subir"
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Usage"
msgstr "Uso"
@ -5088,7 +5092,7 @@ msgstr "Puedes cerrar esta pestaña si no redirige automáticamente."
msgid "You can close this window."
msgstr "Puedes cerrar esta ventana."
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "You have control"
msgstr "Tienes el control"

View File

@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: \n"
"X-Generator: @lingui/cli\n"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid " (unread)"
msgstr " (अपठित)"
@ -126,22 +126,22 @@ msgid "{0}, {label}"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, 1:1 conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, group conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, main conversation"
msgstr ""
#. placeholder {0}: active.name
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "{0}'s screen"
msgstr ""
@ -339,6 +339,7 @@ msgstr "कार्रवाई की पुष्टि"
#. placeholder {0}: sectionMenu.section.name
#: src/pages/BotContextMenu.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Actions for {0}"
msgstr "{0} के लिए कार्रवाइयां"
@ -354,7 +355,7 @@ msgstr ""
msgid "Active model"
msgstr "सक्रिय मॉडल"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Activity"
msgstr "गतिविधि"
@ -647,7 +648,7 @@ msgstr "आर्काइव करें"
msgid "archived"
msgstr "आर्काइव किया गया"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Archived"
msgstr "आर्काइव किया गया"
@ -812,11 +813,11 @@ msgstr "बॉट"
msgid "Bot"
msgstr "बॉट"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Bot screen"
msgstr "बॉट स्क्रीन"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Bot screen preview"
msgstr "बॉट स्क्रीन प्रीव्यू"
@ -1088,7 +1089,7 @@ msgstr "बंद करें"
msgid "Close chart"
msgstr "चार्ट बंद करें"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Close computer"
msgstr "कंप्यूटर बंद करें"
@ -1128,7 +1129,7 @@ msgstr "नेविगेशन बंद करें"
#: src/components/ArtifactPane.tsx
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Close panel"
msgstr "पैनल बंद करें"
@ -1159,7 +1160,7 @@ msgid "Coder"
msgstr ""
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Collapse {0}"
msgstr ""
@ -1201,7 +1202,7 @@ msgstr "कंप्यूटर"
msgid "Computer failed to boot"
msgstr "कंप्यूटर शुरू नहीं हो सका"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Computer is asleep"
msgstr "कंप्यूटर निष्क्रिय है"
@ -1743,9 +1744,9 @@ msgstr ""
msgid "Couldn't update messaging settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Create"
msgstr "बनाएं"
@ -1902,14 +1903,14 @@ msgstr "डिफ़ॉल्ट स्कोप"
#: src/pages/KnowledgeSection.tsx
#: src/pages/McpServersOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
#: src/pages/shell/dialogs.tsx
msgid "Delete"
msgstr "डिलीट करें"
#. placeholder {0}: bot.name
#. placeholder {0}: group.name
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Delete {0}"
msgstr "{0} डिलीट करें"
@ -2218,7 +2219,7 @@ msgid "Expand"
msgstr "विस्तृत करें"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Expand {0}"
msgstr ""
@ -2400,6 +2401,7 @@ msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Group"
msgstr "समूह"
@ -2791,7 +2793,7 @@ msgstr ""
msgid "Local Server Settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Log out"
msgstr "लॉग आउट"
@ -2974,7 +2976,7 @@ msgstr "न्यूनतम"
msgid "Minimize"
msgstr "छोटा करें"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Minimize bots"
msgstr ""
@ -3097,7 +3099,7 @@ msgstr ""
#: src/components/MainInbox.tsx
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3391,12 +3393,12 @@ msgid "Only file and folder names are read."
msgstr ""
#: src/pages/ScratchpadSection.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open"
msgstr "खोलें"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Open {0}"
msgstr ""
@ -3412,11 +3414,11 @@ msgstr ""
msgid "Open in browser"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open in full window"
msgstr "पूरी विंडो में खोलें"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Open navigation"
msgstr "नेविगेशन खोलें"
@ -3931,7 +3933,7 @@ msgstr "रीसेट हो रहा है…"
msgid "Restart to update"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Restore"
msgstr "बहाल करें"
@ -4136,7 +4138,7 @@ msgid "Searching…"
msgstr "खोजा जा रहा है…"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Select {0}"
msgstr ""
@ -4201,7 +4203,8 @@ msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
#: src/pages/shell/user-menu.tsx
msgid "Settings"
msgstr "सेटिंग्स"
@ -4253,10 +4256,11 @@ msgid "Show all {0}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Show bots"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show computer"
msgstr ""
@ -4272,7 +4276,7 @@ msgstr "और दिखाएँ"
msgid "Show password"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "सेटिंग्स दिखाएं"
@ -4460,8 +4464,8 @@ msgid "Steps"
msgstr "चरण"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "रोकें"
@ -4832,7 +4836,7 @@ msgstr "अपलोड"
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Usage"
msgstr "उपयोग"
@ -5088,7 +5092,7 @@ msgstr "अगर यह अपने आप रीडायरेक्ट न
msgid "You can close this window."
msgstr "आप यह विंडो बंद कर सकते हैं।"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "You have control"
msgstr "नियंत्रण आपके पास है"

View File

@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: \n"
"X-Generator: @lingui/cli\n"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid " (unread)"
msgstr " (읽지 않음)"
@ -126,22 +126,22 @@ msgid "{0}, {label}"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, 1:1 conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, group conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, main conversation"
msgstr ""
#. placeholder {0}: active.name
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "{0}'s screen"
msgstr "{0}의 화면"
@ -339,6 +339,7 @@ msgstr "작업 실행 전 확인"
#. placeholder {0}: sectionMenu.section.name
#: src/pages/BotContextMenu.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Actions for {0}"
msgstr "{0} 작업 메뉴"
@ -354,7 +355,7 @@ msgstr "활성"
msgid "Active model"
msgstr "현재 모델"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Activity"
msgstr "활동"
@ -647,7 +648,7 @@ msgstr "보관"
msgid "archived"
msgstr "보관됨"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Archived"
msgstr "보관됨"
@ -812,11 +813,11 @@ msgstr "Bot"
msgid "Bot"
msgstr "봇"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Bot screen"
msgstr "Bot 화면"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Bot screen preview"
msgstr "Bot 화면 미리보기"
@ -1088,7 +1089,7 @@ msgstr "닫기"
msgid "Close chart"
msgstr "차트 닫기"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Close computer"
msgstr "컴퓨터 닫기"
@ -1128,7 +1129,7 @@ msgstr "메뉴 닫기"
#: src/components/ArtifactPane.tsx
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Close panel"
msgstr "패널 닫기"
@ -1159,7 +1160,7 @@ msgid "Coder"
msgstr ""
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Collapse {0}"
msgstr "{0} 접기"
@ -1201,7 +1202,7 @@ msgstr "컴퓨터"
msgid "Computer failed to boot"
msgstr "컴퓨터를 시작하지 못했습니다"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Computer is asleep"
msgstr "컴퓨터가 절전 상태입니다"
@ -1743,9 +1744,9 @@ msgstr "아바타를 업데이트할 수 없습니다"
msgid "Couldn't update messaging settings"
msgstr "메시징 설정을 업데이트할 수 없습니다"
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Create"
msgstr "만들기"
@ -1902,14 +1903,14 @@ msgstr "기본 기억 범위"
#: src/pages/KnowledgeSection.tsx
#: src/pages/McpServersOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
#: src/pages/shell/dialogs.tsx
msgid "Delete"
msgstr "삭제"
#. placeholder {0}: bot.name
#. placeholder {0}: group.name
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Delete {0}"
msgstr "{0} 삭제"
@ -2218,7 +2219,7 @@ msgid "Expand"
msgstr "펼치기"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Expand {0}"
msgstr "{0} 펼치기"
@ -2400,6 +2401,7 @@ msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Group"
msgstr "그룹"
@ -2791,7 +2793,7 @@ msgstr ""
msgid "Local Server Settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Log out"
msgstr "로그아웃"
@ -2974,7 +2976,7 @@ msgstr "최소"
msgid "Minimize"
msgstr "최소화"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Minimize bots"
msgstr ""
@ -3097,7 +3099,7 @@ msgstr ""
#: src/components/MainInbox.tsx
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3391,12 +3393,12 @@ msgid "Only file and folder names are read."
msgstr ""
#: src/pages/ScratchpadSection.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open"
msgstr "열기"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Open {0}"
msgstr "{0} 열기"
@ -3412,11 +3414,11 @@ msgstr ""
msgid "Open in browser"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open in full window"
msgstr "전체 창으로 열기"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Open navigation"
msgstr "메뉴 열기"
@ -3931,7 +3933,7 @@ msgstr "재설정 중…"
msgid "Restart to update"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Restore"
msgstr "복원"
@ -4136,7 +4138,7 @@ msgid "Searching…"
msgstr "검색 중…"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Select {0}"
msgstr ""
@ -4201,7 +4203,8 @@ msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
#: src/pages/shell/user-menu.tsx
msgid "Settings"
msgstr "설정"
@ -4253,10 +4256,11 @@ msgid "Show all {0}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Show bots"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show computer"
msgstr ""
@ -4272,7 +4276,7 @@ msgstr "더 보기"
msgid "Show password"
msgstr "비밀번호 표시"
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "설정 보기"
@ -4460,8 +4464,8 @@ msgid "Steps"
msgstr "실행 단계"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "중지"
@ -4832,7 +4836,7 @@ msgstr "업로드"
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Usage"
msgstr "사용량"
@ -5088,7 +5092,7 @@ msgstr "자동으로 이동하지 않으면 이 탭을 닫아도 됩니다."
msgid "You can close this window."
msgstr "이 창을 닫아도 됩니다."
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "You have control"
msgstr "직접 조작 중"

View File

@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: @lingui/cli\n"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid " (unread)"
msgstr " (não lido)"
@ -126,22 +126,22 @@ msgid "{0}, {label}"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, 1:1 conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, group conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, main conversation"
msgstr ""
#. placeholder {0}: active.name
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "{0}'s screen"
msgstr ""
@ -339,6 +339,7 @@ msgstr "Confirmações de ação"
#. placeholder {0}: sectionMenu.section.name
#: src/pages/BotContextMenu.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Actions for {0}"
msgstr "Ações para {0}"
@ -354,7 +355,7 @@ msgstr ""
msgid "Active model"
msgstr "Modelo ativo"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Activity"
msgstr "Atividade"
@ -647,7 +648,7 @@ msgstr "Arquivar"
msgid "archived"
msgstr "arquivado"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Archived"
msgstr "Arquivado"
@ -812,11 +813,11 @@ msgstr "Bot"
msgid "Bot"
msgstr "Bot"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Bot screen"
msgstr "Tela do bot"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Bot screen preview"
msgstr "Pré-visualização da tela"
@ -1088,7 +1089,7 @@ msgstr "Fechar"
msgid "Close chart"
msgstr "Fechar gráfico"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Close computer"
msgstr "Fechar computador"
@ -1128,7 +1129,7 @@ msgstr "Fechar navegação"
#: src/components/ArtifactPane.tsx
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Close panel"
msgstr "Fechar painel"
@ -1159,7 +1160,7 @@ msgid "Coder"
msgstr ""
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Collapse {0}"
msgstr ""
@ -1201,7 +1202,7 @@ msgstr "Computador"
msgid "Computer failed to boot"
msgstr "Falha ao inicializar o computador"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Computer is asleep"
msgstr "O computador está dormindo"
@ -1743,9 +1744,9 @@ msgstr ""
msgid "Couldn't update messaging settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Create"
msgstr "Criar"
@ -1902,14 +1903,14 @@ msgstr "Escopo padrão"
#: src/pages/KnowledgeSection.tsx
#: src/pages/McpServersOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
#: src/pages/shell/dialogs.tsx
msgid "Delete"
msgstr "Excluir"
#. placeholder {0}: bot.name
#. placeholder {0}: group.name
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Delete {0}"
msgstr "Excluir {0}"
@ -2218,7 +2219,7 @@ msgid "Expand"
msgstr "Expandir"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Expand {0}"
msgstr ""
@ -2400,6 +2401,7 @@ msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Group"
msgstr "Grupo"
@ -2791,7 +2793,7 @@ msgstr ""
msgid "Local Server Settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Log out"
msgstr "Sair"
@ -2974,7 +2976,7 @@ msgstr "Mínimo"
msgid "Minimize"
msgstr "Minimizar"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Minimize bots"
msgstr ""
@ -3097,7 +3099,7 @@ msgstr ""
#: src/components/MainInbox.tsx
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3391,12 +3393,12 @@ msgid "Only file and folder names are read."
msgstr ""
#: src/pages/ScratchpadSection.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open"
msgstr "Abrir"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Open {0}"
msgstr ""
@ -3412,11 +3414,11 @@ msgstr ""
msgid "Open in browser"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open in full window"
msgstr "Abrir em janela cheia"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Open navigation"
msgstr "Abrir a navegação"
@ -3931,7 +3933,7 @@ msgstr "Redefinindo…"
msgid "Restart to update"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Restore"
msgstr "Restaurar"
@ -4136,7 +4138,7 @@ msgid "Searching…"
msgstr "Pesquisando…"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Select {0}"
msgstr ""
@ -4201,7 +4203,8 @@ msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
#: src/pages/shell/user-menu.tsx
msgid "Settings"
msgstr "Configurações"
@ -4253,10 +4256,11 @@ msgid "Show all {0}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Show bots"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show computer"
msgstr ""
@ -4272,7 +4276,7 @@ msgstr "Mostrar mais"
msgid "Show password"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Mostrar configurações"
@ -4460,8 +4464,8 @@ msgid "Steps"
msgstr "Passos"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Parar"
@ -4832,7 +4836,7 @@ msgstr "Enviar"
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Usage"
msgstr "Uso"
@ -5088,7 +5092,7 @@ msgstr "Você pode fechar esta guia se ela não for redirecionada automaticament
msgid "You can close this window."
msgstr "Você pode fechar esta janela."
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "You have control"
msgstr "Você tem o controle"

View File

@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: @lingui/cli\n"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid " (unread)"
msgstr " (непрочитано)"
@ -126,22 +126,22 @@ msgid "{0}, {label}"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, 1:1 conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, group conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, main conversation"
msgstr ""
#. placeholder {0}: active.name
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "{0}'s screen"
msgstr "Экран {0}"
@ -339,6 +339,7 @@ msgstr "Подтверждения действий"
#. placeholder {0}: sectionMenu.section.name
#: src/pages/BotContextMenu.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Actions for {0}"
msgstr "Действия для {0}"
@ -354,7 +355,7 @@ msgstr "Активный"
msgid "Active model"
msgstr "Активная модель"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Activity"
msgstr "Активность"
@ -647,7 +648,7 @@ msgstr "Архивировать"
msgid "archived"
msgstr "в архиве"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Archived"
msgstr "В архиве"
@ -812,11 +813,11 @@ msgstr "Бот"
msgid "Bot"
msgstr "Бот"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Bot screen"
msgstr "Экран бота"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Bot screen preview"
msgstr "Предварительный просмотр экрана бота"
@ -1088,7 +1089,7 @@ msgstr "Закрыть"
msgid "Close chart"
msgstr "Закрыть график"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Close computer"
msgstr "Закрыть компьютер"
@ -1128,7 +1129,7 @@ msgstr "Закрыть навигацию"
#: src/components/ArtifactPane.tsx
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Close panel"
msgstr "Закрыть панель"
@ -1159,7 +1160,7 @@ msgid "Coder"
msgstr ""
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Collapse {0}"
msgstr "Свернуть {0}"
@ -1201,7 +1202,7 @@ msgstr "Компьютер"
msgid "Computer failed to boot"
msgstr "Компьютер не смог загрузиться"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Computer is asleep"
msgstr "Компьютер спит"
@ -1743,9 +1744,9 @@ msgstr "Не удалось обновить аватары"
msgid "Couldn't update messaging settings"
msgstr "Не удалось обновить настройки обмена сообщениями."
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Create"
msgstr "Создать"
@ -1902,14 +1903,14 @@ msgstr "Область действия по умолчанию"
#: src/pages/KnowledgeSection.tsx
#: src/pages/McpServersOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
#: src/pages/shell/dialogs.tsx
msgid "Delete"
msgstr "Удалить"
#. placeholder {0}: bot.name
#. placeholder {0}: group.name
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Delete {0}"
msgstr "Удалить {0}"
@ -2218,7 +2219,7 @@ msgid "Expand"
msgstr "Развернуть"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Expand {0}"
msgstr "Развернуть {0}"
@ -2400,6 +2401,7 @@ msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Group"
msgstr "Группа"
@ -2791,7 +2793,7 @@ msgstr ""
msgid "Local Server Settings"
msgstr "Настройки локального сервера"
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Log out"
msgstr "Выйти"
@ -2974,7 +2976,7 @@ msgstr "Минимальный"
msgid "Minimize"
msgstr "Свернуть"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Minimize bots"
msgstr "Свернуть ботов"
@ -3097,7 +3099,7 @@ msgstr "Требуется ваше участие"
#: src/components/MainInbox.tsx
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr "Требуется ваше участие"
@ -3391,12 +3393,12 @@ msgid "Only file and folder names are read."
msgstr ""
#: src/pages/ScratchpadSection.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open"
msgstr "Открыть"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Open {0}"
msgstr "Открыть {0}"
@ -3412,11 +3414,11 @@ msgstr ""
msgid "Open in browser"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open in full window"
msgstr "Открыть в полном окне"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Open navigation"
msgstr "Открыть навигацию"
@ -3931,7 +3933,7 @@ msgstr "Сброс…"
msgid "Restart to update"
msgstr "Перезапустить для обновления"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Restore"
msgstr "Восстановить"
@ -4136,7 +4138,7 @@ msgid "Searching…"
msgstr "Поиск…"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Select {0}"
msgstr ""
@ -4201,7 +4203,8 @@ msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
#: src/pages/shell/user-menu.tsx
msgid "Settings"
msgstr "Настройки"
@ -4253,10 +4256,11 @@ msgid "Show all {0}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Show bots"
msgstr "Показать ботов"
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show computer"
msgstr ""
@ -4272,7 +4276,7 @@ msgstr "Показать ещё"
msgid "Show password"
msgstr "Показать пароль"
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Показать настройки"
@ -4460,8 +4464,8 @@ msgid "Steps"
msgstr "Шаги"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Остановить"
@ -4832,7 +4836,7 @@ msgstr "Загрузить"
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Usage"
msgstr "Использование"
@ -5088,7 +5092,7 @@ msgstr "Вы можете закрыть эту вкладку, если она
msgid "You can close this window."
msgstr "Вы можете закрыть это окно."
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "You have control"
msgstr "Вы управляете"

View File

@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: \n"
"X-Generator: @lingui/cli\n"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid " (unread)"
msgstr " (okunmadı)"
@ -126,22 +126,22 @@ msgid "{0}, {label}"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, 1:1 conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, group conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, main conversation"
msgstr ""
#. placeholder {0}: active.name
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "{0}'s screen"
msgstr ""
@ -339,6 +339,7 @@ msgstr "İşlem onayları"
#. placeholder {0}: sectionMenu.section.name
#: src/pages/BotContextMenu.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Actions for {0}"
msgstr "{0} için işlemler"
@ -354,7 +355,7 @@ msgstr ""
msgid "Active model"
msgstr "Etkin model"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Activity"
msgstr "Etkinlik"
@ -647,7 +648,7 @@ msgstr "Arşivle"
msgid "archived"
msgstr "arşivlendi"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Archived"
msgstr "Arşivlendi"
@ -812,11 +813,11 @@ msgstr "Bot"
msgid "Bot"
msgstr "Bot"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Bot screen"
msgstr "Bot ekranı"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Bot screen preview"
msgstr "Bot ekranı önizlemesi"
@ -1088,7 +1089,7 @@ msgstr "Kapat"
msgid "Close chart"
msgstr "Grafiği kapat"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Close computer"
msgstr "Bilgisayarı kapat"
@ -1128,7 +1129,7 @@ msgstr "Gezinmeyi kapat"
#: src/components/ArtifactPane.tsx
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Close panel"
msgstr "Paneli kapat"
@ -1159,7 +1160,7 @@ msgid "Coder"
msgstr ""
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Collapse {0}"
msgstr ""
@ -1201,7 +1202,7 @@ msgstr "Bilgisayar"
msgid "Computer failed to boot"
msgstr "Bilgisayar başlatılamadı"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Computer is asleep"
msgstr "Bilgisayar uykuda"
@ -1743,9 +1744,9 @@ msgstr ""
msgid "Couldn't update messaging settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Create"
msgstr "Oluştur"
@ -1902,14 +1903,14 @@ msgstr "Varsayılan kapsam"
#: src/pages/KnowledgeSection.tsx
#: src/pages/McpServersOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
#: src/pages/shell/dialogs.tsx
msgid "Delete"
msgstr "Sil"
#. placeholder {0}: bot.name
#. placeholder {0}: group.name
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Delete {0}"
msgstr "{0} sil"
@ -2218,7 +2219,7 @@ msgid "Expand"
msgstr "Genişlet"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Expand {0}"
msgstr ""
@ -2400,6 +2401,7 @@ msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Group"
msgstr "Grup"
@ -2791,7 +2793,7 @@ msgstr ""
msgid "Local Server Settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Log out"
msgstr "Çıkış yap"
@ -2974,7 +2976,7 @@ msgstr "Minimal"
msgid "Minimize"
msgstr "Küçült"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Minimize bots"
msgstr ""
@ -3097,7 +3099,7 @@ msgstr ""
#: src/components/MainInbox.tsx
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3391,12 +3393,12 @@ msgid "Only file and folder names are read."
msgstr ""
#: src/pages/ScratchpadSection.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open"
msgstr "Aç"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Open {0}"
msgstr ""
@ -3412,11 +3414,11 @@ msgstr ""
msgid "Open in browser"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open in full window"
msgstr "Tam pencerede aç"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Open navigation"
msgstr "Gezinmeyi aç"
@ -3931,7 +3933,7 @@ msgstr ""
msgid "Restart to update"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Restore"
msgstr "Geri yükle"
@ -4136,7 +4138,7 @@ msgid "Searching…"
msgstr "Aranıyor…"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Select {0}"
msgstr ""
@ -4201,7 +4203,8 @@ msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
#: src/pages/shell/user-menu.tsx
msgid "Settings"
msgstr "Ayarlar"
@ -4253,10 +4256,11 @@ msgid "Show all {0}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Show bots"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show computer"
msgstr ""
@ -4272,7 +4276,7 @@ msgstr "Daha fazla göster"
msgid "Show password"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "Ayarları göster"
@ -4460,8 +4464,8 @@ msgid "Steps"
msgstr "Adımlar"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Durdur"
@ -4832,7 +4836,7 @@ msgstr "Yükle"
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Usage"
msgstr "Kullanım"
@ -5088,7 +5092,7 @@ msgstr "Otomatik yönlendirilmezsen bu sekmeyi kapatabilirsin."
msgid "You can close this window."
msgstr "Bu pencereyi kapatabilirsin."
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "You have control"
msgstr "Kontrol sende"

View File

@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: \n"
"X-Generator: @lingui/cli\n"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid " (unread)"
msgstr "(未读)"
@ -126,22 +126,22 @@ msgid "{0}, {label}"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, 1:1 conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, group conversation"
msgstr ""
#. placeholder {0}: item.chat.name
#: src/pages/Shell.tsx
#: src/pages/shell/roster-rows.tsx
msgid "{0}, main conversation"
msgstr ""
#. placeholder {0}: active.name
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "{0}'s screen"
msgstr ""
@ -339,6 +339,7 @@ msgstr "操作确认"
#. placeholder {0}: sectionMenu.section.name
#: src/pages/BotContextMenu.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Actions for {0}"
msgstr "{0} 的操作"
@ -354,7 +355,7 @@ msgstr "启用"
msgid "Active model"
msgstr "当前模型"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Activity"
msgstr "动态"
@ -647,7 +648,7 @@ msgstr "归档"
msgid "archived"
msgstr "已归档"
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Archived"
msgstr "已归档"
@ -812,11 +813,11 @@ msgstr "Bot"
msgid "Bot"
msgstr "Bot"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Bot screen"
msgstr "Bot 屏幕"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Bot screen preview"
msgstr "Bot 屏幕预览"
@ -1088,7 +1089,7 @@ msgstr "关闭"
msgid "Close chart"
msgstr "关闭图表"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Close computer"
msgstr "关闭电脑"
@ -1128,7 +1129,7 @@ msgstr "关闭导航"
#: src/components/ArtifactPane.tsx
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Close panel"
msgstr "关闭面板"
@ -1159,7 +1160,7 @@ msgid "Coder"
msgstr ""
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Collapse {0}"
msgstr "折叠 {0}"
@ -1201,7 +1202,7 @@ msgstr "电脑"
msgid "Computer failed to boot"
msgstr "电脑启动失败"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "Computer is asleep"
msgstr "电脑已休眠"
@ -1743,9 +1744,9 @@ msgstr "无法更新头像"
msgid "Couldn't update messaging settings"
msgstr "无法更新消息设置"
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/dialogs.tsx
#: src/pages/shell/sidebar-header.tsx
msgid "Create"
msgstr "创建"
@ -1902,14 +1903,14 @@ msgstr "默认范围"
#: src/pages/KnowledgeSection.tsx
#: src/pages/McpServersOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
#: src/pages/shell/dialogs.tsx
msgid "Delete"
msgstr "删除"
#. placeholder {0}: bot.name
#. placeholder {0}: group.name
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Delete {0}"
msgstr "删除 {0}"
@ -2218,7 +2219,7 @@ msgid "Expand"
msgstr "展开"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Expand {0}"
msgstr "展开 {0}"
@ -2400,6 +2401,7 @@ msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Group"
msgstr "群组"
@ -2791,7 +2793,7 @@ msgstr ""
msgid "Local Server Settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Log out"
msgstr "退出登录"
@ -2974,7 +2976,7 @@ msgstr "最低"
msgid "Minimize"
msgstr "最小化"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Minimize bots"
msgstr ""
@ -3097,7 +3099,7 @@ msgstr ""
#: src/components/MainInbox.tsx
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3391,12 +3393,12 @@ msgid "Only file and folder names are read."
msgstr ""
#: src/pages/ScratchpadSection.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open"
msgstr "打开"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Open {0}"
msgstr "打开 {0}"
@ -3412,11 +3414,11 @@ msgstr ""
msgid "Open in browser"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-panel-preview.tsx
msgid "Open in full window"
msgstr "在完整窗口中打开"
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Open navigation"
msgstr "打开导航"
@ -3931,7 +3933,7 @@ msgstr "正在重置…"
msgid "Restart to update"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/archived-section.tsx
msgid "Restore"
msgstr "恢复"
@ -4136,7 +4138,7 @@ msgid "Searching…"
msgstr "正在搜索…"
#. placeholder {0}: group.title
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-group-header.tsx
msgid "Select {0}"
msgstr ""
@ -4201,7 +4203,8 @@ msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
#: src/pages/shell/user-menu.tsx
msgid "Settings"
msgstr "设置"
@ -4253,10 +4256,11 @@ msgid "Show all {0}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/sidebar-toggle-buttons.tsx
msgid "Show bots"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show computer"
msgstr ""
@ -4272,7 +4276,7 @@ msgstr "显示更多"
msgid "Show password"
msgstr "显示密码"
#: src/pages/Shell.tsx
#: src/pages/shell/side-panel-header.tsx
msgid "Show settings"
msgstr "显示设置"
@ -4460,8 +4464,8 @@ msgid "Steps"
msgstr "步骤"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "停止"
@ -4832,7 +4836,7 @@ msgstr "上传"
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/user-menu.tsx
msgid "Usage"
msgstr "用量"
@ -5088,7 +5092,7 @@ msgstr "如果没有自动跳转,可以关闭此标签页。"
msgid "You can close this window."
msgstr "可以关闭此窗口。"
#: src/pages/Shell.tsx
#: src/pages/shell/fullscreen-computer-overlay.tsx
msgid "You have control"
msgstr "你已接管"

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,85 @@
import { Trans, useLingui } from "@lingui/react/macro";
import type { Bot, Group } from "@rakazo/contracts";
import { BotAvatar, Button, GroupAvatar } from "@rakazo/ui-web";
/** Collapsible list of archived bots and groups at the foot of the sidebar. */
export function ArchivedSection({
bots,
groups,
open,
onToggle,
onRestoreBot,
onRestoreGroup,
onDeleteBot,
onDeleteGroup,
}: {
bots: Bot[];
groups: Group[];
open: boolean;
onToggle: () => void;
onRestoreBot: (bot: Bot) => void;
onRestoreGroup: (group: Group) => void;
onDeleteBot: (bot: Bot) => void;
onDeleteGroup: (group: Group) => void;
}) {
const { t } = useLingui();
return (
<div className="mt-2 border-t border-border pt-2">
<button
type="button"
aria-expanded={open}
onClick={onToggle}
className="flex w-full items-center justify-between rounded-lg px-2.5 py-2 text-ui-body rk-sidebar-muted hover:bg-sidebar-accent"
>
<span>
<Trans>Archived</Trans>
</span>
<span>{bots.length + groups.length}</span>
</button>
{open ? (
<>
{bots.map((bot) => (
<div key={bot.id} className="flex items-center gap-2 rounded-lg px-2.5 py-2">
<BotAvatar color={bot.color} identity={bot.id} size={28} status={bot.status} />
<span className="min-w-0 flex-1 truncate text-ui-body text-foreground/75" dir="auto">
{bot.name}
</span>
<Button variant="ghost" size="xs" onClick={() => onRestoreBot(bot)}>
<Trans>Restore</Trans>
</Button>
<Button
variant="ghost"
size="xs"
className="text-destructive hover:text-destructive"
aria-label={t`Delete ${bot.name}`}
onClick={() => onDeleteBot(bot)}
>
<Trans>Delete</Trans>
</Button>
</div>
))}
{groups.map((group) => (
<div key={group.id} className="flex items-center gap-2 rounded-lg px-2.5 py-2">
<GroupAvatar members={group.members} size={28} />
<span className="min-w-0 flex-1 truncate text-ui-body text-foreground/75" dir="auto">
{group.name}
</span>
<Button variant="ghost" size="xs" onClick={() => onRestoreGroup(group)}>
<Trans>Restore</Trans>
</Button>
<Button
variant="ghost"
size="xs"
className="text-destructive hover:text-destructive"
aria-label={t`Delete ${group.name}`}
onClick={() => onDeleteGroup(group)}
>
<Trans>Delete</Trans>
</Button>
</div>
))}
</>
) : null}
</div>
);
}

View File

@ -0,0 +1,96 @@
import { Trans, useLingui } from "@lingui/react/macro";
import type { Bot, ComputerStatus } from "@rakazo/contracts";
import { Maximize2 } from "lucide-react";
import type { ReactNode } from "react";
import {
ComputersUnavailableHint,
computersAreUnavailable,
} from "../../components/ComputersUnavailableHint";
import { AgentCursor } from "../../components/computer/AgentCursor";
import {
computerLabel,
computerPlaceholder,
DesktopKindEmptyState,
screenIframeSandbox,
} from "./computer-screen";
/** The bot's screen in the side panel: a live, non-interactive preview that opens full window. */
export function ComputerPanelPreview({
active,
computer,
computerOpen,
booting,
embeddedScreenUrl,
computerScreenError,
sandboxProvider,
onOpen,
}: {
active: Bot;
computer: ComputerStatus | null;
computerOpen: boolean;
booting: boolean;
embeddedScreenUrl: string | null;
computerScreenError: ReactNode;
sandboxProvider: string | undefined;
onOpen: () => void;
}) {
const { t } = useLingui();
return (
<>
<div
data-testid="computer-preview"
className="group relative aspect-[16/10] overflow-hidden rounded-[14px] bg-background"
>
{computerOpen ? (
<div className="grid h-full place-items-center text-sm text-muted-foreground/80">
<Trans>Open in full window</Trans>
</div>
) : computer?.kind === "desktop" ? (
<DesktopKindEmptyState className="grid h-full place-items-center px-6 text-center text-sm text-muted-foreground/80" />
) : computer?.state === "running" && embeddedScreenUrl && !computerScreenError ? (
<>
<iframe
title={t`Bot screen preview`}
src={embeddedScreenUrl}
sandbox={screenIframeSandbox(embeddedScreenUrl)}
className="h-full w-full border-0 bg-black"
allow="clipboard-read; clipboard-write"
style={{ pointerEvents: "none" }}
/>
<AgentCursor botId={active.id} color={active.color} name={active.name} />
</>
) : (
<div className="grid h-full place-items-center px-6 text-center text-sm text-muted-foreground/80">
{computerScreenError ??
(computersAreUnavailable(sandboxProvider) ? (
<ComputersUnavailableHint />
) : (
computerPlaceholder(
computer?.state,
booting,
computerLabel(computer?.mode, active.name),
)
))}
</div>
)}
{!computerScreenError ? (
<button
type="button"
data-testid="computer-preview-open"
className="absolute inset-0 flex cursor-pointer items-center justify-center bg-overlay/40 opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100"
aria-label={t`Open`}
onClick={onOpen}
>
<span className="inline-flex items-center gap-2 rounded-full bg-overlay px-3.5 py-2 text-ui-body text-foreground shadow-md">
<Maximize2 strokeWidth={1.9} aria-hidden className="size-icon-md" />
<Trans>Open</Trans>
</span>
</button>
) : null}
</div>
<p className="mt-2 truncate text-ui-body text-muted-foreground" dir="auto">
{t`${active.name}'s screen`}
</p>
</>
);
}

View File

@ -0,0 +1,196 @@
import { Trans, useLingui } from "@lingui/react/macro";
import type { Bot, ComputerReleaseReason, ComputerStatus, TaughtSkill } from "@rakazo/contracts";
import { BotAvatar, Button } from "@rakazo/ui-web";
import { X } from "lucide-react";
import type { ReactNode } from "react";
import { ComputerMaintenanceActions } from "../../components/ComputerMaintenanceActions";
import { AgentCursor } from "../../components/computer/AgentCursor";
import { TeachCaptureOverlay } from "../../components/teach/TeachCaptureOverlay";
import { TeachComputerOverlayControl } from "../../components/teach/TeachComputerOverlay";
import { TeachRecordingChrome, TeachStopButton } from "../../components/teach/TeachRecordingChrome";
import {
ComputerReleaseActions,
computerLabel,
DesktopKindEmptyState,
screenIframeSandbox,
} from "./computer-screen";
/** The bot's computer in full window, where the user takes control or teaches a skill. */
export function FullscreenComputerOverlay({
active,
computer,
computerViewport,
embeddedScreenUrl,
computerScreenError,
hasControl,
recordingSkill,
teachBusy,
composerRunning,
sending,
sendError,
onStopRun,
onStopTeaching,
onRelease,
onRefreshTeaching,
refreshThread,
onClose,
}: {
active: Bot;
computer: ComputerStatus | null;
computerViewport: { height: number; offsetTop: number } | null;
embeddedScreenUrl: string | null;
computerScreenError: ReactNode;
hasControl: boolean;
recordingSkill: TaughtSkill | null;
teachBusy: boolean;
composerRunning: boolean;
sending: boolean;
sendError: string | null;
onStopRun: () => Promise<void>;
onStopTeaching: () => Promise<void>;
onRelease: (reason?: ComputerReleaseReason) => Promise<void>;
onRefreshTeaching: () => Promise<void>;
refreshThread: (botId: string) => Promise<unknown>;
onClose: () => void;
}) {
const { t } = useLingui();
return (
<div className="fixed inset-0 z-30 bg-background">
<div
data-testid="computer-viewport"
className="fixed inset-x-0 top-0 flex flex-col bg-background"
style={{
height: computerViewport ? `${computerViewport.height}px` : "100dvh",
top: computerViewport ? `${computerViewport.offsetTop}px` : undefined,
}}
>
<div
data-testid="computer-chrome"
className="flex items-center justify-between gap-4 border-b border-sidebar-border px-[18px] py-3.5"
>
<div className="flex min-w-0 flex-1 items-center gap-3">
<BotAvatar color={active.color} identity={active.id} size={28} status={active.status} />
{recordingSkill ? (
<TeachRecordingChrome
recording={recordingSkill}
busy={teachBusy}
onStop={onStopTeaching}
variant="overlay"
/>
) : (
<span className="truncate text-ui-body font-medium text-foreground" dir="auto">
{computerLabel(computer?.mode, active.name)}
</span>
)}
{!recordingSkill && hasControl ? (
computer?.takeoverRequested ? (
<span className="rounded-full bg-warning/15 px-[11px] py-1 text-ui-body-sm text-warning">
<Trans>Needs you</Trans>
</span>
) : (
<span className="rounded-full bg-success/15 px-[11px] py-1 text-ui-body-sm text-success">
<Trans>You have control</Trans>
</span>
)
) : null}
</div>
<div className="flex items-center gap-3">
{composerRunning ? (
<Button
type="button"
variant="outline"
size="sm"
aria-label={t`Stop`}
data-testid="computer-overlay-stop"
onClick={() => void onStopRun()}
disabled={sending}
>
<Trans>Stop</Trans>
</Button>
) : null}
{recordingSkill ? (
<TeachStopButton busy={teachBusy} onStop={onStopTeaching} />
) : hasControl ? (
<ComputerReleaseActions
takeoverRequested={Boolean(computer?.takeoverRequested)}
onRelease={onRelease}
/>
) : null}
{active && !recordingSkill ? (
<TeachComputerOverlayControl
key={active.id}
botId={active.id}
computer={computer}
busy={teachBusy}
onRefresh={onRefreshTeaching}
/>
) : null}
{active && !recordingSkill ? (
<ComputerMaintenanceActions
botId={active.id}
computer={computer}
onChanged={async () => {
await refreshThread(active.id);
}}
/>
) : null}
<Button
variant="ghost"
size="icon-sm"
className="text-muted-foreground"
aria-label={t`Close computer`}
onClick={onClose}
>
<X strokeWidth={1.8} className="size-icon-md" />
</Button>
</div>
</div>
{sendError ? (
<div
role="alert"
className="border-b border-destructive/40 bg-destructive/10 px-[18px] py-2 text-ui-body-sm text-destructive"
>
{sendError}
</div>
) : null}
<div className="relative min-h-0 flex-1 bg-background">
{computer?.kind === "desktop" ? (
<DesktopKindEmptyState className="grid h-full place-items-center px-8 text-center text-sm text-muted-foreground/80" />
) : computer?.state === "running" && embeddedScreenUrl && !computerScreenError ? (
<>
<iframe
title={t`Bot screen`}
src={embeddedScreenUrl}
sandbox={screenIframeSandbox(embeddedScreenUrl)}
className="h-full w-full border-0 bg-black"
allow="clipboard-read; clipboard-write; fullscreen"
style={{
pointerEvents: recordingSkill || !hasControl ? "none" : "auto",
}}
/>
{active && !hasControl ? (
<AgentCursor botId={active.id} color={active.color} name={active.name} />
) : null}
{active ? (
<TeachCaptureOverlay
botId={active.id}
skill={recordingSkill}
enabled={Boolean(recordingSkill)}
screenWidth={computer?.screenWidth}
screenHeight={computer?.screenHeight}
/>
) : null}
</>
) : (
<div className="grid h-full place-items-center text-sm text-muted-foreground/80">
{computerScreenError ??
(computer?.state === "suspended"
? t`Computer is asleep`
: computerLabel(computer?.mode, active.name))}
</div>
)}
</div>
</div>
</div>
);
}

View File

@ -0,0 +1,41 @@
import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from "@rakazo/ui-web";
import type { ReactNode } from "react";
import type { ContextMenuPosition } from "../BotContextMenu";
/** A dropdown menu opened at the pointer, for sidebar context menus. */
export function PointerMenu({
position,
label,
onClose,
children,
}: {
position: ContextMenuPosition;
label: string;
onClose: () => void;
children: ReactNode;
}) {
return (
<DropdownMenu
open
onOpenChange={(open) => {
if (!open) onClose();
}}
>
{/* Invisible anchor at the pointer position, mirroring the bot menu. */}
<DropdownMenuTrigger
render={
<button
type="button"
tabIndex={-1}
aria-hidden
className="fixed size-0 p-0 opacity-0"
style={{ left: position.x, top: position.y }}
/>
}
/>
<DropdownMenuContent aria-label={label} align="start" sideOffset={0} className="w-[220px]">
{children}
</DropdownMenuContent>
</DropdownMenu>
);
}

View File

@ -0,0 +1,250 @@
import { Trans, useLingui } from "@lingui/react/macro";
import type { SpaceBot, SpaceGroup } from "@rakazo/contracts";
import { BotAvatar, GroupAvatar } from "@rakazo/ui-web";
import type { RefObject } from "react";
import {
needsYouChipLabel,
rosterActivitySubtitle,
rosterStatusDot,
} from "../../lib/agent-activity";
import { localizedPreview } from "../../lib/onboarding-copy";
import type { ContextMenuPosition } from "../BotContextMenu";
import { cleanRosterPreview, formatRosterTime } from "./roster-format";
import {
rosterNameClass,
rosterPreviewClass,
rosterRowClass,
rosterTimeClass,
rosterUnreadDotClass,
} from "./roster-row-style";
export type SidebarChatItem = { kind: "bot"; chat: SpaceBot } | { kind: "group"; chat: SpaceGroup };
export type BotMenuRequest = {
kind: "bot" | "group";
id: string;
position: ContextMenuPosition;
};
/** A bot in the conversations section: reorderable by drag or Alt+Arrow within its group. */
export function TeamRosterRow({
item,
groupBotIds,
draggedBotId,
onDraggedBotIdChange,
onReorder,
selected,
onOpen,
activeSpaceId,
menuAnchor,
onMenu,
}: {
item: Extract<SidebarChatItem, { kind: "bot" }>;
groupBotIds: string[];
draggedBotId: string | null;
onDraggedBotIdChange: (botId: string | null) => void;
onReorder: (sourceId: string, targetId: string, groupBotIds: string[]) => void;
selected: boolean;
onOpen: () => void;
activeSpaceId: string | undefined;
menuAnchor: RefObject<HTMLElement | null>;
onMenu: (menu: BotMenuRequest) => void;
}) {
const { t } = useLingui();
return (
<button
type="button"
draggable={item.kind === "bot"}
data-roster-bot-id={item.kind === "bot" ? item.chat.id : undefined}
aria-keyshortcuts={item.kind === "bot" ? "Alt+ArrowUp Alt+ArrowDown" : undefined}
onDragStart={(event) => {
if (item.kind !== "bot") return;
onDraggedBotIdChange(item.chat.id);
event.dataTransfer.effectAllowed = "move";
event.dataTransfer.setData("text/plain", item.chat.id);
}}
onDragOver={(event) => {
if (item.kind === "bot" && draggedBotId && groupBotIds.includes(draggedBotId)) {
event.preventDefault();
event.dataTransfer.dropEffect = "move";
}
}}
onDrop={(event) => {
if (item.kind !== "bot" || !draggedBotId) return;
event.preventDefault();
onReorder(draggedBotId, item.chat.id, groupBotIds);
onDraggedBotIdChange(null);
}}
onDragEnd={() => onDraggedBotIdChange(null)}
onKeyDown={(event) => {
if (
item.kind !== "bot" ||
!event.altKey ||
(event.key !== "ArrowUp" && event.key !== "ArrowDown")
)
return;
const index = groupBotIds.indexOf(item.chat.id);
const target = groupBotIds[index + (event.key === "ArrowUp" ? -1 : 1)];
if (!target) return;
event.preventDefault();
onReorder(item.chat.id, target, groupBotIds);
}}
aria-label={
item.kind === "bot"
? t`${item.chat.name}, 1:1 conversation`
: t`${item.chat.name}, group conversation`
}
onClick={onOpen}
onContextMenu={(event) => {
if (item.chat.spaceId !== activeSpaceId) return;
event.preventDefault();
menuAnchor.current = event.currentTarget;
onMenu({
kind: item.kind,
id: item.chat.id,
position: { x: event.clientX, y: event.clientY },
});
}}
className={`${rosterRowClass(selected)} cursor-grab active:cursor-grabbing`}
style={{
opacity: draggedBotId === item.chat.id ? 0.55 : 1,
}}
>
<div className="relative shrink-0">
<BotAvatar
color={item.chat.color}
identity={item.chat.id}
size={40}
status={item.chat.status}
/>
<span
className={`absolute -bottom-0.5 -right-0.5 size-2.5 rounded-full border-2 border-sidebar ${
rosterStatusDot(item.chat.status) === "idle" ? "bg-success" : "bg-warning animate-pulse"
}`}
/>
</div>
<div className="min-w-0 flex-1">
<div className="flex items-center justify-between gap-1.5">
<div className="flex min-w-0 items-center gap-2 overflow-hidden">
<span
dir="auto"
data-roster-bot-name=""
className={`shrink-0 max-w-[170px] truncate text-ui-body tracking-tight ${rosterNameClass(
item.chat.unread,
)}`}
>
{item.chat.name}
</span>
{needsYouChipLabel(item.chat.status) ? (
<span className="shrink-0 rounded-full border border-warning/30 bg-warning/10 px-2 py-0.5 text-ui-label font-medium text-foreground dark:text-warning">
{needsYouChipLabel(item.chat.status)}
</span>
) : item.chat.title ? (
<span className="min-w-0 truncate rounded-full border border-border bg-muted px-2 py-0.5 text-ui-label font-medium text-muted-foreground">
{item.chat.title}
</span>
) : null}
{item.chat.unread ? (
<span className="sr-only">
<Trans> (unread)</Trans>
</span>
) : null}
</div>
<div className="flex shrink-0 items-center gap-1.5">
<span className={rosterTimeClass}>{formatRosterTime(item.chat.updatedAt)}</span>
{item.chat.unread ? <span aria-hidden="true" className={rosterUnreadDotClass} /> : null}
</div>
</div>
<div
dir="auto"
className={`mt-0.5 truncate text-ui-body leading-snug ${rosterPreviewClass(
item.chat.unread,
)}`}
>
{rosterActivitySubtitle(item.chat.status, cleanRosterPreview(item.chat.preview))}
</div>
</div>
</button>
);
}
/** A conversation in the projects section; a project's main conversation has no chat actions. */
export function ProjectRosterRow({
item,
selected,
onOpen,
activeSpaceId,
menuAnchor,
onMenu,
}: {
item: SidebarChatItem;
selected: boolean;
onOpen: () => void;
activeSpaceId: string | undefined;
menuAnchor: RefObject<HTMLElement | null>;
onMenu: (menu: BotMenuRequest) => void;
}) {
const { t } = useLingui();
return (
<button
type="button"
aria-label={
item.kind === "bot"
? t`${item.chat.name}, 1:1 conversation`
: item.chat.kind === "main"
? t`${item.chat.name}, main conversation`
: t`${item.chat.name}, group conversation`
}
onClick={onOpen}
onContextMenu={(event) => {
// A project's main conversation has no chat actions.
if (item.chat.spaceId !== activeSpaceId || item.chat.kind === "main") return;
event.preventDefault();
menuAnchor.current = event.currentTarget;
onMenu({
kind: item.kind,
id: item.chat.id,
position: { x: event.clientX, y: event.clientY },
});
}}
className={rosterRowClass(selected)}
>
{item.kind === "bot" ? (
<BotAvatar
color={item.chat.color}
identity={item.chat.id}
size={40}
status={item.chat.status}
/>
) : (
<GroupAvatar members={(item.chat as any).members} size={40} />
)}
<div className="min-w-0 flex-1">
<div className="flex items-center justify-between gap-1.5">
<div className="flex min-w-0 items-center gap-2 overflow-hidden">
<span
dir="auto"
className={`shrink-0 max-w-[170px] truncate text-ui-body tracking-tight ${rosterNameClass(
item.chat.unread,
)}`}
>
{item.chat.name}
</span>
</div>
<div className="flex shrink-0 items-center gap-1.5">
<span className={rosterTimeClass}>{formatRosterTime(item.chat.updatedAt)}</span>
{item.chat.unread ? <span aria-hidden="true" className={rosterUnreadDotClass} /> : null}
</div>
</div>
<div
dir="auto"
className={`mt-0.5 truncate text-ui-body leading-snug ${rosterPreviewClass(
item.chat.unread,
)}`}
>
{cleanRosterPreview(localizedPreview(item.chat))}
</div>
</div>
</button>
);
}

View File

@ -0,0 +1,73 @@
import { Trans, useLingui } from "@lingui/react/macro";
import type { Bot, ComputerStatus } from "@rakazo/contracts";
import { Button } from "@rakazo/ui-web";
import { Settings, X } from "lucide-react";
import { ComputerMaintenanceActions } from "../../components/ComputerMaintenanceActions";
import { computerPanelNeedsMaintenance } from "../../lib/thread-events";
/** Title row of the computer and settings side panel, with its switch and close buttons. */
export function SidePanelHeader({
panel,
active,
computer,
computerOpen,
booting,
refreshThread,
onPanelChange,
}: {
panel: "computer" | "settings";
active: Bot | undefined;
computer: ComputerStatus | null;
computerOpen: boolean;
booting: boolean;
refreshThread: (botId: string) => Promise<unknown>;
onPanelChange: (panel: "computer" | "settings" | null) => void;
}) {
const { t } = useLingui();
return (
<div className="mb-4 flex items-center justify-between">
<span className="text-ui-body text-muted-foreground">
{panel === "settings" ? (
<Trans>Settings</Trans>
) : active ? (
(computer?.state ?? active.status)
) : (
<Trans>Group</Trans>
)}
</span>
<div className="flex gap-1">
{active &&
panel === "computer" &&
!computerOpen &&
computerPanelNeedsMaintenance(computer?.state, booting) ? (
<ComputerMaintenanceActions
botId={active.id}
computer={computer}
onChanged={async () => {
await refreshThread(active.id);
}}
/>
) : null}
{active ? (
<Button
variant="ghost"
size="icon-sm"
aria-label={panel === "settings" ? t`Show computer` : t`Show settings`}
onClick={() => onPanelChange(panel === "settings" ? "computer" : "settings")}
className={panel === "settings" ? "text-foreground" : "text-muted-foreground"}
>
<Settings strokeWidth={1.7} className="size-icon-md" />
</Button>
) : null}
<Button
variant="ghost"
size="icon-sm"
aria-label={t`Close panel`}
onClick={() => onPanelChange(null)}
>
<X strokeWidth={1.8} className="size-icon-md" />
</Button>
</div>
</div>
);
}

View File

@ -0,0 +1,161 @@
import { useLingui } from "@lingui/react/macro";
import type { BotSection, Space } from "@rakazo/contracts";
import { Button } from "@rakazo/ui-web";
import { ChevronDown, Folder, GripVertical, Lock, MoreHorizontal } from "lucide-react";
import type { RefObject } from "react";
import { ProjectDragGrip } from "../../components/SortableGroup";
import type { ContextMenuPosition } from "../BotContextMenu";
export type SidebarGroupHeaderGroup = {
key: string;
title: string | null;
sectionId: string | null;
spaceId: string;
spaceName: string;
canDeleteSpace: boolean;
emptySpaceId: string | undefined;
showLock: boolean;
};
export type SpaceMenuRequest = { id: string; position: ContextMenuPosition };
export type SectionMenuRequest = {
section: BotSection;
spaceId: string;
position: ContextMenuPosition;
};
/**
* Collapsible title of a sidebar group. Project groups add a drag grip, show a lock for other
* spaces and select an empty space instead of opening it.
*/
export function SidebarGroupHeader({
variant,
group,
collapsed,
activeSpaceId,
botSections,
spaces,
onOpenEmptySpace,
onToggle,
sectionMenuAnchor,
onSectionMenu,
spaceMenuAnchor,
onSpaceMenu,
}: {
variant: "conversation" | "project";
group: SidebarGroupHeaderGroup;
collapsed: boolean;
activeSpaceId: string | undefined;
botSections: BotSection[];
spaces: Space[];
onOpenEmptySpace: (spaceId: string) => void;
onToggle: (key: string) => void;
sectionMenuAnchor: RefObject<HTMLElement | null>;
onSectionMenu: (menu: SectionMenuRequest) => void;
spaceMenuAnchor: RefObject<HTMLElement | null>;
onSpaceMenu: (menu: SpaceMenuRequest) => void;
}) {
const { t } = useLingui();
const project = variant === "project";
return (
<div
className={
project ? "flex items-center pt-3 pb-0.5 relative" : "flex items-center pt-3 pb-0.5"
}
>
{project ? (
// Drag grip — positioned to the left of the title text
<ProjectDragGrip className="absolute left-1 top-1/2 -translate-y-1/2 w-6 h-6 rounded flex items-center justify-center text-muted-foreground/30 hover:text-muted-foreground/70 active:text-muted-foreground transition-colors cursor-grab active:cursor-grabbing">
<GripVertical className="size-icon-sm" strokeWidth={2} />
</ProjectDragGrip>
) : null}
<button
type="button"
className={`flex min-w-0 flex-1 items-center justify-between gap-2 rounded-lg ${project ? "pl-8" : "px-2.5"} py-1 text-ui-label font-semibold tracking-wider uppercase text-foreground/65 dark:text-muted-foreground/80 hover:text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring`}
onClick={() => {
if (group.emptySpaceId) {
onOpenEmptySpace(group.emptySpaceId);
return;
}
onToggle(group.key);
}}
onContextMenu={
group.sectionId
? (event) => {
event.preventDefault();
// Prefer section rename over delete-space when both apply;
// the dedicated space-actions button still opens the space menu.
const sections =
group.spaceId === activeSpaceId
? botSections
: (spaces.find((space) => space.id === group.spaceId)?.botSections ?? []);
const section = sections.find((item) => item.id === group.sectionId);
if (!section) return;
sectionMenuAnchor.current = event.currentTarget;
onSectionMenu({
section,
spaceId: group.spaceId,
position: { x: event.clientX, y: event.clientY },
});
}
: group.canDeleteSpace
? (event) => {
event.preventDefault();
spaceMenuAnchor.current = event.currentTarget;
onSpaceMenu({
id: group.spaceId,
position: { x: event.clientX, y: event.clientY },
});
}
: undefined
}
aria-expanded={group.emptySpaceId ? undefined : !collapsed}
aria-label={
group.emptySpaceId
? project
? t`Select ${group.title}`
: t`Open ${group.title}`
: collapsed
? t`Expand ${group.title}`
: t`Collapse ${group.title}`
}
>
<span className="flex min-w-0 items-center gap-1.5 truncate">
{project ? (
group.showLock ? (
<Lock strokeWidth={2} aria-hidden="true" className="size-icon-sm" />
) : null
) : (
<Folder strokeWidth={2} aria-hidden="true" className="size-icon-sm" />
)}
<span className="truncate">{group.title}</span>
</span>
{group.emptySpaceId ? null : (
<ChevronDown
strokeWidth={1.8}
className={`size-icon-md ${collapsed ? "-rotate-90 transition-transform" : "transition-transform"}`}
aria-hidden="true"
/>
)}
</button>
{group.canDeleteSpace ? (
<Button
variant="ghost"
size="icon-sm"
aria-label={t`Actions for ${group.spaceName}`}
onClick={(event) => {
const rect = event.currentTarget.getBoundingClientRect();
spaceMenuAnchor.current = event.currentTarget;
onSpaceMenu({
id: group.spaceId,
position: { x: rect.left, y: rect.bottom },
});
}}
>
<MoreHorizontal aria-hidden="true" className="size-icon-md" />
</Button>
) : null}
</div>
);
}

View File

@ -0,0 +1,118 @@
import { useLingui } from "@lingui/react/macro";
import type { Bot } from "@rakazo/contracts";
import { Popover, PopoverContent, PopoverTrigger, Wordmark } from "@rakazo/ui-web";
import { Bell } from "lucide-react";
import { WindowChrome } from "../WindowChrome";
import { BotCreatePicker } from "./bot-picker";
/** Window chrome, wordmark, the activity toggle and the create menu atop the sidebar. */
export function SidebarHeader({
activityMode,
onToggleActivityMode,
createMenuOpen,
onCreateMenuOpenChange,
onCloseMobileSidebar,
bots,
onCreateBot,
onOpenBot,
onCreateGroup,
onCreateSpace,
onShowGroupInfo,
onShowSpaceInfo,
}: {
activityMode: boolean;
onToggleActivityMode: () => void;
createMenuOpen: boolean;
onCreateMenuOpenChange: (open: boolean) => void;
onCloseMobileSidebar: () => void;
bots: Bot[];
onCreateBot: () => void;
onOpenBot: (id: string) => void;
onCreateGroup: () => void;
onCreateSpace: () => void;
onShowGroupInfo: () => void;
onShowSpaceInfo: () => void;
}) {
const { t } = useLingui();
return (
<div className="app-drag flex items-center justify-between px-4 lg:px-6 2xl:px-8 pb-3 pt-4">
<WindowChrome />
<div className="flex-1 px-1">
<Wordmark />
</div>
<div className="relative flex items-center gap-2.5">
<button
type="button"
aria-label={t`Activity`}
aria-pressed={activityMode}
title={t`Activity`}
data-activity-mode={activityMode ? "on" : "off"}
onClick={onToggleActivityMode}
className={`app-no-drag flex size-control-sm items-center justify-center rounded-full ${
activityMode
? "bg-primary text-primary-foreground"
: "rk-sidebar-muted hover:text-foreground/75"
}`}
>
<Bell
strokeWidth={1.8}
fill={activityMode ? "currentColor" : "none"}
aria-hidden="true"
className="size-icon-md"
/>
</button>
<Popover open={createMenuOpen} onOpenChange={onCreateMenuOpenChange}>
<PopoverTrigger
className="app-no-drag text-[21px] rk-sidebar-muted hover:text-foreground/75"
title={t`Create`}
data-testid="create-menu-trigger"
>
+
</PopoverTrigger>
{/* Unmount with the state change so the panel it opens never coexists with the menu. */}
{createMenuOpen ? (
<PopoverContent
align="end"
className="app-no-drag w-auto gap-0 overflow-hidden p-0 data-closed:animate-none"
>
<BotCreatePicker
bots={bots}
onCreateBot={() => {
onCreateMenuOpenChange(false);
onCloseMobileSidebar();
onCreateBot();
}}
onOpenBot={(id) => {
onCreateMenuOpenChange(false);
onCloseMobileSidebar();
onOpenBot(id);
}}
onCreateGroup={() => {
onCreateMenuOpenChange(false);
onCloseMobileSidebar();
onCreateGroup();
}}
onCreateSpace={() => {
onCreateMenuOpenChange(false);
onCloseMobileSidebar();
onCreateSpace();
}}
onShowGroupInfo={() => {
onCreateMenuOpenChange(false);
onCloseMobileSidebar();
onShowGroupInfo();
}}
onShowSpaceInfo={() => {
onCreateMenuOpenChange(false);
onCloseMobileSidebar();
onShowSpaceInfo();
}}
/>
</PopoverContent>
) : null}
</Popover>
</div>
</div>
);
}

View File

@ -0,0 +1,45 @@
import { useLingui } from "@lingui/react/macro";
import { Menu, PanelLeftClose, PanelLeftOpen } from "lucide-react";
import { desktopBridge } from "../../lib/desktop";
import { WindowChrome } from "../WindowChrome";
/** Leading controls of a main header: open the mobile navigation or collapse the bots sidebar. */
export function SidebarToggleButtons({
collapsed,
onCollapsedChange,
onOpenNavigation,
}: {
collapsed: boolean;
onCollapsedChange: (collapsed: boolean) => void;
onOpenNavigation: () => void;
}) {
const { t } = useLingui();
return (
<>
{/* Collapsed bots sidebar: this header is the leading edge for window chrome. */}
{collapsed && desktopBridge() ? <WindowChrome /> : null}
<button
type="button"
aria-label={t`Open navigation`}
onClick={onOpenNavigation}
className="app-no-drag grid size-control-lg shrink-0 place-items-center rounded-lg text-foreground/75 hover:bg-accent md:hidden"
>
<Menu strokeWidth={1.7} className="size-icon-lg" />
</button>
<button
type="button"
data-testid="toggle-bots-sidebar"
aria-label={collapsed ? t`Show bots` : t`Minimize bots`}
title={collapsed ? t`Show bots` : t`Minimize bots`}
onClick={() => onCollapsedChange(!collapsed)}
className="app-no-drag hidden size-control-lg shrink-0 place-items-center rounded-lg text-foreground/75 hover:bg-accent md:grid"
>
{collapsed ? (
<PanelLeftOpen strokeWidth={1.7} aria-hidden="true" className="size-icon-lg" />
) : (
<PanelLeftClose strokeWidth={1.7} aria-hidden="true" className="size-icon-lg" />
)}
</button>
</>
);
}

View File

@ -0,0 +1,73 @@
import { Trans, useLingui } from "@lingui/react/macro";
import { Button, Popover, PopoverContent, PopoverTrigger } from "@rakazo/ui-web";
import { Gauge, LogOut, Settings } from "lucide-react";
/** The account button at the foot of the sidebar and its menu. */
export function UserMenu({
open,
onOpenChange,
initials,
userName,
onOpenSettings,
onOpenUsage,
onLogOut,
}: {
open: boolean;
onOpenChange: (open: boolean) => void;
initials: string;
userName: string;
onOpenSettings: () => void;
onOpenUsage: () => void;
onLogOut: () => void;
}) {
const { t } = useLingui();
return (
<Popover open={open} onOpenChange={onOpenChange}>
<PopoverTrigger
data-testid="user-menu-trigger"
className="flex items-center gap-[11px] px-[18px] py-3.5"
>
<span className="grid size-control-lg place-items-center rounded-full bg-accent text-ui-body-sm text-foreground/75">
{initials}
</span>
<span className="text-[14.5px] text-foreground/90">{userName}</span>
</PopoverTrigger>
{open ? (
<PopoverContent
side="top"
align="start"
className="w-[calc(316px-1.5rem)] max-w-[calc(100vw-3rem)] gap-0 p-1 data-closed:animate-none"
>
<Button
variant="ghost"
className="w-full justify-start font-normal"
aria-label={t`Settings`}
onClick={() => {
onOpenChange(false);
onOpenSettings();
}}
>
<Settings className="text-muted-foreground" strokeWidth={1.75} />
<Trans>Settings</Trans>
</Button>
<Button
variant="ghost"
className="w-full justify-start font-normal"
aria-label={t`Usage`}
onClick={() => {
onOpenChange(false);
onOpenUsage();
}}
>
<Gauge className="text-muted-foreground" strokeWidth={1.75} />
<Trans>Usage</Trans>
</Button>
<Button variant="ghost" className="w-full justify-start font-normal" onClick={onLogOut}>
<LogOut className="text-muted-foreground" strokeWidth={1.75} />
<Trans>Log out</Trans>
</Button>
</PopoverContent>
) : null}
</Popover>
);
}