refactor(web): move Shell.tsx module-level code into pages/shell modules

Shell.tsx had grown to about 8,000 lines, roughly 2,200 of them module-level
components and helpers below ShellPage. That made the page hard to navigate
and review and turned every chat change into an edit of one hot file.

This is a move-only refactor: code is moved verbatim and only imports and
exports change. No renames, no JSX or memo boundary changes.

- shell/transcript.tsx: Transcript, QuoteSelectionButton, MessageHoverActions,
  MessageView
- shell/composer.tsx: Composer, slashActionLabel, MentionOptionIcon,
  MentionChipIcon, ATTACHMENT_ACCEPT
- shell/computer-screen.tsx: ComputerReleaseActions, embeddableScreenUrl,
  screenIframeSandbox, DesktopKindEmptyState, computerPlaceholder,
  computerLabel (all used by the computer pane)
- shell/thread-state.ts: threadSnapshotSignal, firstThreadRoute,
  applyThreadEvent, newClientNonce
- shell/roster-format.ts: stripSpaceTitlePrefix, formatRosterTime,
  cleanRosterPreview
- shell/message-preview.ts: previewMessageText (shared by composer and
  transcript)
- shell/collapsed-sidebar-sections.ts: collapsed sidebar storage helpers
- shell/shell-types.ts: PendingAttachment and FALLBACK_BOT_COLOR, shared by
  Shell.tsx, composer and transcript

Types, constants and one-off helpers used only by ShellPage stay in
Shell.tsx. The Lingui catalogs only change their file-reference comments;
message ids and translations are unchanged.

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 09:38:16 +00:00
parent 3f22ef691f
commit a0060b8df7
No known key found for this signature in database
18 changed files with 2970 additions and 2879 deletions

View File

@ -210,7 +210,7 @@ msgstr "{botName} verfolgt den Fehler…"
msgid "{botName} watches the tape…"
msgstr "{botName} beobachtet den Markt…"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "{botName}’s computer"
msgstr "Computer von {botName}"
@ -277,7 +277,7 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr "{toolCount, plural, one {# Tool} other {# Tools}}"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} arbeitet"
@ -643,7 +643,7 @@ msgstr "Genehmige diesen Server, damit dein Agent seine Tools verwenden kann."
msgid "Archive"
msgstr "Archivieren"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "archived"
msgstr "archiviert"
@ -651,7 +651,7 @@ msgstr "archiviert"
msgid "Archived"
msgstr "Archiviert"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Archived. Chat, memory, and files kept."
msgstr "Archiviert. Chat, Erinnerungen und Dateien bleiben erhalten."
@ -711,11 +711,11 @@ msgstr "um {0}"
msgid "at {timeSelect}"
msgstr "um {timeSelect}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Datei anhängen"
#: src/pages/Shell.tsx
#: src/pages/shell/message-preview.ts
msgid "Attachment"
msgstr "Anhang"
@ -788,7 +788,7 @@ msgstr "Bearer-Token"
msgid "Blocked in your browser settings"
msgstr "In deinen Browser-Einstellungen blockiert"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Live-Desktop wird gestartet…"
@ -797,7 +797,7 @@ msgstr "Live-Desktop wird gestartet…"
msgid "Booting up {0}’s computer"
msgstr "Computer von {0} wird gestartet"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "bot"
msgstr "Bot"
@ -828,7 +828,7 @@ msgstr "Zu verknüpfender Bot"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Bots handeln standardmäßig ohne Nachfrage. Füge nur dann eine Ausnahme hinzu, wenn du eine Aktionsart zuerst prüfen möchtest."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Bots arbeiten"
@ -889,7 +889,7 @@ msgstr "Neuen Bot abbrechen"
msgid "Cancel new group"
msgstr "Neue Gruppe abbrechen"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Cancel reply"
msgstr "Antwort abbrechen"
@ -946,7 +946,7 @@ msgstr "Chat-Apps, Gruppenkanäle und Agent-Verbindungen."
msgid "Chat history"
msgstr "Chatverlauf"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Chat Settings"
msgstr "Chat-Einstellungen"
@ -1192,12 +1192,12 @@ msgid "Composing a reply…"
msgstr "Schreibt eine Antwort…"
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/transcript.tsx
msgid "Computer"
msgstr "Computer"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer failed to boot"
msgstr "Computer konnte nicht gestartet werden"
@ -1205,11 +1205,11 @@ msgstr "Computer konnte nicht gestartet werden"
msgid "Computer is asleep"
msgstr "Computer ist im Ruhezustand"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is asleep. Open it to wake."
msgstr "Computer ist im Ruhezustand. Öffne ihn, um ihn aufzuwecken."
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is stopped"
msgstr "Computer ist gestoppt"
@ -1353,7 +1353,7 @@ msgstr "Im Hintergrund fortsetzen"
msgid "Continue with email"
msgstr "Mit E-Mail fortfahren"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Conversation record"
msgstr "Gesprächsverlauf"
@ -1361,11 +1361,11 @@ msgstr "Gesprächsverlauf"
msgid "Conversations"
msgstr "Unterhaltungen"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy"
msgstr "Kopieren"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy reply"
msgstr "Antwort kopieren"
@ -1939,7 +1939,7 @@ msgstr "Mein Konto löschen"
msgid "Delete space"
msgstr "Space löschen"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "deleted"
msgstr "gelöscht"
@ -2009,7 +2009,7 @@ msgstr "Verbindung wird getrennt…"
msgid "Dismiss"
msgstr "Ausblenden"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Dismiss error"
msgstr "Fehler ausblenden"
@ -2107,7 +2107,7 @@ msgstr "Duplizieren"
msgid "e.g. Hivenet Agent, Presales, Timesheets bot"
msgstr "z. B. Hivenet Agent, Presales, Zeiterfassungs-Bot"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Earlier message"
msgstr "Frühere Nachricht"
@ -2524,7 +2524,7 @@ msgstr "Wie soll dein Oo klingen, wenn es Antworten vorliest?"
msgid "How to check"
msgstr "So wird geprüft"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "I’m done"
msgstr "Ich bin fertig"
@ -2627,11 +2627,11 @@ msgstr "Isoliert"
msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
msgstr "Seine Unterhaltung, Dateien und Routinen werden dauerhaft gelöscht. Von ihm erstellte Bots bleiben in deiner Liste."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to latest"
msgstr "Zur neuesten Nachricht springen"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to replied message"
msgstr "Zur beantworteten Nachricht springen"
@ -2718,7 +2718,7 @@ msgstr "Ich höre zu — was ist kaputt oder langsam?"
msgid "Listening — what's the story?"
msgstr "Ich höre zu — was ist die Geschichte?"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Load earlier messages"
msgstr "Frühere Nachrichten laden"
@ -2771,7 +2771,7 @@ msgstr "Stimmen werden geladen…"
#: src/pages/HeuteBrief.tsx
#: src/pages/IntegrationSetup.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Loading…"
msgstr "Wird geladen…"
@ -2918,7 +2918,7 @@ msgstr "Erinnerungen"
msgid "Memory scope"
msgstr "Erinnerungsbereich"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Mentions"
msgstr "Erwähnungen"
@ -2931,11 +2931,12 @@ msgstr "Nur Erwähnungen"
msgid "Message"
msgstr "Nachricht"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-preview.ts
msgid "Message"
msgstr "Nachricht"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message composer"
msgstr "Nachrichteneingabe"
@ -2943,11 +2944,11 @@ msgstr "Nachrichteneingabe"
msgid "Message event"
msgstr "Nachrichtenereignis"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Message from {peer}"
msgstr "Nachricht von {peer}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message…"
msgstr "Nachricht…"
@ -3030,7 +3031,7 @@ msgstr "Modelle vom Server"
msgid "Monthly"
msgstr "Monatlich"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "More"
msgstr "Mehr"
@ -3097,6 +3098,7 @@ msgstr "Braucht dich"
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr "Braucht dich"
@ -3430,7 +3432,7 @@ msgstr "Offene Arbeit"
msgid "OpenAI-compatible server URL"
msgstr "URL eines OpenAI-kompatiblen Servers"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Opened its thread."
msgstr "Thread geöffnet."
@ -3671,19 +3673,19 @@ msgstr "Ende der Ruhezeiten"
msgid "Quiet hours start"
msgstr "Beginn der Ruhezeiten"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Quote"
msgstr "Zitieren"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "React"
msgstr "Reagieren"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reactions"
msgstr "Reaktionen"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Read aloud"
msgstr "Vorlesen"
@ -3788,7 +3790,7 @@ msgstr "Wird aktualisiert…"
msgid "Region"
msgstr "Region"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Release"
msgstr "Freigeben"
@ -3812,7 +3814,7 @@ msgid "Remove"
msgstr "Entfernen"
#. placeholder {0}: attachment.file.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove {0}"
msgstr "{0} entfernen"
@ -3821,7 +3823,7 @@ msgid "Remove Git event"
msgstr "Git-Ereignis entfernen"
#. placeholder {0}: mention.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove mention {0}"
msgstr "Erwähnung von {0} entfernen"
@ -3834,7 +3836,7 @@ msgid "Remove schedule"
msgstr "Zeitplan entfernen"
#. placeholder {0}: selectedSkill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove skill {0}"
msgstr "Skill {0} entfernen"
@ -3842,7 +3844,7 @@ msgstr "Skill {0} entfernen"
msgid "Remove webhook"
msgstr "Webhook entfernen"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Removed with chat, computer, and memory."
msgstr "Zusammen mit Chat, Computer und Erinnerungen entfernt."
@ -3875,15 +3877,15 @@ msgstr "API-Schlüssel ersetzen"
msgid "Replace key"
msgstr "Schlüssel ersetzen"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reply"
msgstr "Antworten"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}"
msgstr "Antwort an {replyName}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}: “{replyQuote}”"
msgstr "Antwort an {replyName}: „{replyQuote}“"
@ -4142,7 +4144,7 @@ msgstr "{0} auswählen"
msgid "Self-hosted (better-auth)"
msgstr "Selbst gehostet (better-auth)"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-cards.tsx
msgid "Send"
msgstr "Senden"
@ -4193,7 +4195,7 @@ msgid "Server URL"
msgstr "Server-URL"
#: src/components/stage/StageVoiceEntry.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Set up voice"
msgstr "Stimme einrichten"
@ -4203,11 +4205,11 @@ msgstr "Stimme einrichten"
msgid "Settings"
msgstr "Einstellungen"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: General"
msgstr "Einstellungen: Allgemein"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: Usage"
msgstr "Einstellungen: Nutzung"
@ -4299,7 +4301,7 @@ msgid "Sketching the blueprint…"
msgstr "Skizziere den Bauplan…"
#. placeholder {0}: skill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Skill {0}"
msgstr "Skill {0}"
@ -4311,7 +4313,7 @@ msgstr "Skills"
#: src/components/onboarding/OnboardingScanStep.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
#: src/lib/onboarding-copy.ts
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Skip"
msgstr "Überspringen"
@ -4365,11 +4367,11 @@ msgstr "Space-Standard"
msgid "Spaces"
msgstr "Spaces"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Vorlesen"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak this reply"
msgstr "Diese Antwort vorlesen"
@ -4423,15 +4425,15 @@ msgstr "Aufnahme starten"
msgid "Start talking"
msgstr "Sprechen starten"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation — {activeName} is on stage above."
msgstr "Starte die Unterhaltung — {activeName} steht oben auf der Bühne."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation."
msgstr "Starte die Unterhaltung."
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Start voice conversation"
msgstr "Sprachunterhaltung starten"
@ -4459,10 +4461,12 @@ msgstr "Schritte"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Stoppen"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop speaking"
msgstr "Vorlesen stoppen"
@ -4492,7 +4496,7 @@ msgstr "Stresstest fürs Portfolio…"
msgid "Stronger together — {0} specialists"
msgstr "Stärker zusammen — {0} Spezialisten"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "Subagent"
@ -4557,7 +4561,7 @@ msgstr "Aufgabe wird angelernt. Beende das Anlernen, bevor du eine neue Nachrich
msgid "Team"
msgstr "Team"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Team Computer"
msgstr "Team-Computer"
@ -4598,7 +4602,7 @@ msgstr "Der ausgewählte Erinnerungsanbieter ist in diesem Build nicht verfügba
msgid "Thinking"
msgstr "Denkmodus"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
msgstr "Dieser Bot wird auf diesem Computer und nicht auf einem Linux-Desktop ausgeführt. Shell und Dateien verwenden deinen persönlichen Ordner."
@ -4705,7 +4709,7 @@ msgid "Transcribe"
msgstr "Transkribieren"
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Transcript"
msgstr "Transkript"
@ -4869,8 +4873,8 @@ msgid "Video workflow"
msgstr "Video-Workflow"
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Voice"
msgstr "Stimme"
@ -5066,7 +5070,7 @@ msgstr "Arbeitet…"
msgid "Working…"
msgstr "Wird verarbeitet…"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-format.ts
msgid "Yesterday"
msgstr "Gestern"

View File

@ -210,7 +210,7 @@ msgstr "{botName} traces the failure…"
msgid "{botName} watches the tape…"
msgstr "{botName} watches the tape…"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "{botName}’s computer"
msgstr "{botName}’s computer"
@ -277,7 +277,7 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr "{toolCount, plural, one {# tool} other {# tools}}"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} is working"
@ -643,7 +643,7 @@ msgstr "Approve this server to let your agent use its tools."
msgid "Archive"
msgstr "Archive"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "archived"
msgstr "archived"
@ -651,7 +651,7 @@ msgstr "archived"
msgid "Archived"
msgstr "Archived"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Archived. Chat, memory, and files kept."
msgstr "Archived. Chat, memory, and files kept."
@ -711,11 +711,11 @@ msgstr "at {0}"
msgid "at {timeSelect}"
msgstr "at {timeSelect}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Attach file"
#: src/pages/Shell.tsx
#: src/pages/shell/message-preview.ts
msgid "Attachment"
msgstr "Attachment"
@ -788,7 +788,7 @@ msgstr "Bearer token"
msgid "Blocked in your browser settings"
msgstr "Blocked in your browser settings"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Booting live desktop…"
@ -797,7 +797,7 @@ msgstr "Booting live desktop…"
msgid "Booting up {0}’s computer"
msgstr "Booting up {0}’s computer"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "bot"
msgstr "bot"
@ -828,7 +828,7 @@ msgstr "Bot to link"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Bots act without asking by default. Add an exception only when you want to review a type of action first."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Bots are working"
@ -889,7 +889,7 @@ msgstr "Cancel new bot"
msgid "Cancel new group"
msgstr "Cancel new group"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Cancel reply"
msgstr "Cancel reply"
@ -946,7 +946,7 @@ msgstr "Chat apps, group channels, and agent connections."
msgid "Chat history"
msgstr "Chat history"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Chat Settings"
msgstr "Chat Settings"
@ -1192,12 +1192,12 @@ msgid "Composing a reply…"
msgstr "Composing a reply…"
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/transcript.tsx
msgid "Computer"
msgstr "Computer"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer failed to boot"
msgstr "Computer failed to boot"
@ -1205,11 +1205,11 @@ msgstr "Computer failed to boot"
msgid "Computer is asleep"
msgstr "Computer is asleep"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is asleep. Open it to wake."
msgstr "Computer is asleep. Open it to wake."
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is stopped"
msgstr "Computer is stopped"
@ -1353,7 +1353,7 @@ msgstr "Continue in Background"
msgid "Continue with email"
msgstr "Continue with email"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Conversation record"
msgstr "Conversation record"
@ -1361,11 +1361,11 @@ msgstr "Conversation record"
msgid "Conversations"
msgstr "Conversations"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy"
msgstr "Copy"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy reply"
msgstr "Copy reply"
@ -1939,7 +1939,7 @@ msgstr "Delete my account"
msgid "Delete space"
msgstr "Delete space"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "deleted"
msgstr "deleted"
@ -2009,7 +2009,7 @@ msgstr "Disconnecting…"
msgid "Dismiss"
msgstr "Dismiss"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Dismiss error"
msgstr "Dismiss error"
@ -2107,7 +2107,7 @@ msgstr "Duplicate"
msgid "e.g. Hivenet Agent, Presales, Timesheets bot"
msgstr "e.g. Hivenet Agent, Presales, Timesheets bot"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Earlier message"
msgstr "Earlier message"
@ -2524,7 +2524,7 @@ msgstr "How should your Oo sound when reading replies aloud?"
msgid "How to check"
msgstr "How to check"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "I’m done"
msgstr "I’m done"
@ -2627,11 +2627,11 @@ msgstr "Isolated"
msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
msgstr "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to latest"
msgstr "Jump to latest"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to replied message"
msgstr "Jump to replied message"
@ -2718,7 +2718,7 @@ msgstr "Listening — what's broken or slow?"
msgid "Listening — what's the story?"
msgstr "Listening — what's the story?"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Load earlier messages"
msgstr "Load earlier messages"
@ -2771,7 +2771,7 @@ msgstr "Loading voices…"
#: src/pages/HeuteBrief.tsx
#: src/pages/IntegrationSetup.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Loading…"
msgstr "Loading…"
@ -2918,7 +2918,7 @@ msgstr "Memory"
msgid "Memory scope"
msgstr "Memory scope"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Mentions"
msgstr "Mentions"
@ -2931,11 +2931,12 @@ msgstr "Mentions only"
msgid "Message"
msgstr "Message"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-preview.ts
msgid "Message"
msgstr "Message"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message composer"
msgstr "Message composer"
@ -2943,11 +2944,11 @@ msgstr "Message composer"
msgid "Message event"
msgstr "Message event"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Message from {peer}"
msgstr "Message from {peer}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message…"
msgstr "Message…"
@ -3030,7 +3031,7 @@ msgstr "Models from server"
msgid "Monthly"
msgstr "Monthly"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "More"
msgstr "More"
@ -3097,6 +3098,7 @@ msgstr "Needs you"
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr "Needs you"
@ -3430,7 +3432,7 @@ msgstr "Open work"
msgid "OpenAI-compatible server URL"
msgstr "OpenAI-compatible server URL"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Opened its thread."
msgstr "Opened its thread."
@ -3671,19 +3673,19 @@ msgstr "Quiet hours end"
msgid "Quiet hours start"
msgstr "Quiet hours start"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Quote"
msgstr "Quote"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "React"
msgstr "React"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reactions"
msgstr "Reactions"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Read aloud"
msgstr "Read aloud"
@ -3788,7 +3790,7 @@ msgstr "Refreshing…"
msgid "Region"
msgstr "Region"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Release"
msgstr "Release"
@ -3812,7 +3814,7 @@ msgid "Remove"
msgstr "Remove"
#. placeholder {0}: attachment.file.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove {0}"
msgstr "Remove {0}"
@ -3821,7 +3823,7 @@ msgid "Remove Git event"
msgstr "Remove Git event"
#. placeholder {0}: mention.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove mention {0}"
msgstr "Remove mention {0}"
@ -3834,7 +3836,7 @@ msgid "Remove schedule"
msgstr "Remove schedule"
#. placeholder {0}: selectedSkill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove skill {0}"
msgstr "Remove skill {0}"
@ -3842,7 +3844,7 @@ msgstr "Remove skill {0}"
msgid "Remove webhook"
msgstr "Remove webhook"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Removed with chat, computer, and memory."
msgstr "Removed with chat, computer, and memory."
@ -3875,15 +3877,15 @@ msgstr "Replace API key"
msgid "Replace key"
msgstr "Replace key"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reply"
msgstr "Reply"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}"
msgstr "Replying to {replyName}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}: “{replyQuote}”"
msgstr "Replying to {replyName}: “{replyQuote}”"
@ -4142,7 +4144,7 @@ msgstr "Select {0}"
msgid "Self-hosted (better-auth)"
msgstr "Self-hosted (better-auth)"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-cards.tsx
msgid "Send"
msgstr "Send"
@ -4193,7 +4195,7 @@ msgid "Server URL"
msgstr "Server URL"
#: src/components/stage/StageVoiceEntry.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Set up voice"
msgstr "Set up voice"
@ -4203,11 +4205,11 @@ msgstr "Set up voice"
msgid "Settings"
msgstr "Settings"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: General"
msgstr "Settings: General"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: Usage"
msgstr "Settings: Usage"
@ -4299,7 +4301,7 @@ msgid "Sketching the blueprint…"
msgstr "Sketching the blueprint…"
#. placeholder {0}: skill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Skill {0}"
msgstr "Skill {0}"
@ -4311,7 +4313,7 @@ msgstr "Skills"
#: src/components/onboarding/OnboardingScanStep.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
#: src/lib/onboarding-copy.ts
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Skip"
msgstr "Skip"
@ -4365,11 +4367,11 @@ msgstr "Space default"
msgid "Spaces"
msgstr "Spaces"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Speak"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak this reply"
msgstr "Speak this reply"
@ -4423,15 +4425,15 @@ msgstr "Start recording"
msgid "Start talking"
msgstr "Start talking"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation — {activeName} is on stage above."
msgstr "Start the conversation — {activeName} is on stage above."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation."
msgstr "Start the conversation."
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Start voice conversation"
msgstr "Start voice conversation"
@ -4459,10 +4461,12 @@ msgstr "Steps"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Stop"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop speaking"
msgstr "Stop speaking"
@ -4492,7 +4496,7 @@ msgstr "Stress-testing the book…"
msgid "Stronger together — {0} specialists"
msgstr "Stronger together — {0} specialists"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "subagent"
@ -4557,7 +4561,7 @@ msgstr "Teaching in progress. Stop teaching before sending a new message."
msgid "Team"
msgstr "Team"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Team Computer"
msgstr "Team Computer"
@ -4598,7 +4602,7 @@ msgstr "The selected memory provider is not available in this build."
msgid "Thinking"
msgstr "Thinking"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
msgstr "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
@ -4705,7 +4709,7 @@ msgid "Transcribe"
msgstr "Transcribe"
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Transcript"
msgstr "Transcript"
@ -4869,8 +4873,8 @@ msgid "Video workflow"
msgstr "Video workflow"
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Voice"
msgstr "Voice"
@ -5066,7 +5070,7 @@ msgstr "Working…"
msgid "Working…"
msgstr "Working…"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-format.ts
msgid "Yesterday"
msgstr "Yesterday"

View File

@ -210,7 +210,7 @@ msgstr ""
msgid "{botName} watches the tape…"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "{botName}’s computer"
msgstr "Computadora de {botName}"
@ -277,7 +277,7 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} está trabajando"
@ -643,7 +643,7 @@ msgstr "Aprueba este servidor para que tu agente use sus herramientas."
msgid "Archive"
msgstr "Archivar"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "archived"
msgstr "archivado"
@ -651,7 +651,7 @@ msgstr "archivado"
msgid "Archived"
msgstr "Archivado"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Archived. Chat, memory, and files kept."
msgstr "Archivado. Se conservan el chat, la memoria y los archivos."
@ -711,11 +711,11 @@ msgstr "a las {0}"
msgid "at {timeSelect}"
msgstr "a las {timeSelect}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Adjuntar archivo"
#: src/pages/Shell.tsx
#: src/pages/shell/message-preview.ts
msgid "Attachment"
msgstr "Archivo adjunto"
@ -788,7 +788,7 @@ msgstr "Token Bearer"
msgid "Blocked in your browser settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Iniciando escritorio en vivo…"
@ -797,7 +797,7 @@ msgstr "Iniciando escritorio en vivo…"
msgid "Booting up {0}’s computer"
msgstr "Iniciando la computadora de {0}"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "bot"
msgstr "bot"
@ -828,7 +828,7 @@ msgstr "Bot a vincular"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Los bots actúan sin preguntar de forma predeterminada. Agrega una excepción solo cuando quieras revisar primero un tipo de acción."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Los bots están trabajando"
@ -889,7 +889,7 @@ msgstr "Cancelar nuevo bot"
msgid "Cancel new group"
msgstr "Cancelar nuevo grupo"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Cancel reply"
msgstr "Cancelar respuesta"
@ -946,7 +946,7 @@ msgstr "Apps de chat, canales de grupo y conexiones de agentes."
msgid "Chat history"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Chat Settings"
msgstr "Configuración del chat"
@ -1192,12 +1192,12 @@ msgid "Composing a reply…"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/transcript.tsx
msgid "Computer"
msgstr "Computadora"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer failed to boot"
msgstr "La computadora no pudo iniciarse"
@ -1205,11 +1205,11 @@ msgstr "La computadora no pudo iniciarse"
msgid "Computer is asleep"
msgstr "La computadora está en reposo"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is asleep. Open it to wake."
msgstr "La computadora está en reposo. Ábrela para despertarla."
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is stopped"
msgstr "La computadora está detenida"
@ -1353,7 +1353,7 @@ msgstr ""
msgid "Continue with email"
msgstr "Continuar con el correo"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Conversation record"
msgstr ""
@ -1361,11 +1361,11 @@ msgstr ""
msgid "Conversations"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy"
msgstr "Copiar"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy reply"
msgstr ""
@ -1939,7 +1939,7 @@ msgstr ""
msgid "Delete space"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "deleted"
msgstr "eliminado"
@ -2009,7 +2009,7 @@ msgstr "Desconectando…"
msgid "Dismiss"
msgstr "Descartar"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Dismiss error"
msgstr "Descartar error"
@ -2107,7 +2107,7 @@ msgstr "Duplicar"
msgid "e.g. Hivenet Agent, Presales, Timesheets bot"
msgstr "p. ej. Hivenet Agent, Presales, bot de hojas de horas"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Earlier message"
msgstr "Mensaje anterior"
@ -2524,7 +2524,7 @@ msgstr ""
msgid "How to check"
msgstr "Cómo comprobar"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "I’m done"
msgstr "Listo"
@ -2627,11 +2627,11 @@ msgstr "Aislado"
msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
msgstr "Su conversación, archivos y rutinas se eliminarán de forma permanente. Los bots que creó permanecerán en tu lista."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to latest"
msgstr "Ir al más reciente"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to replied message"
msgstr "Ir al mensaje respondido"
@ -2718,7 +2718,7 @@ msgstr ""
msgid "Listening — what's the story?"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Load earlier messages"
msgstr "Cargar mensajes anteriores"
@ -2771,7 +2771,7 @@ msgstr ""
#: src/pages/HeuteBrief.tsx
#: src/pages/IntegrationSetup.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Loading…"
msgstr "Cargando…"
@ -2918,7 +2918,7 @@ msgstr "Memoria"
msgid "Memory scope"
msgstr "Alcance de memoria"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Mentions"
msgstr "Menciones"
@ -2931,11 +2931,12 @@ msgstr ""
msgid "Message"
msgstr "Mensaje"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-preview.ts
msgid "Message"
msgstr "Mensaje"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message composer"
msgstr "Redactor de mensajes"
@ -2943,11 +2944,11 @@ msgstr "Redactor de mensajes"
msgid "Message event"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Message from {peer}"
msgstr "Mensaje de {peer}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message…"
msgstr "Mensaje…"
@ -3030,7 +3031,7 @@ msgstr "Modelos del servidor"
msgid "Monthly"
msgstr "Mensual"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "More"
msgstr ""
@ -3097,6 +3098,7 @@ msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3430,7 +3432,7 @@ msgstr "Trabajo abierto"
msgid "OpenAI-compatible server URL"
msgstr "URL de servidor compatible con OpenAI"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Opened its thread."
msgstr "Se abrió su hilo."
@ -3671,19 +3673,19 @@ msgstr ""
msgid "Quiet hours start"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Quote"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "React"
msgstr "Reaccionar"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reactions"
msgstr "Reacciones"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Read aloud"
msgstr ""
@ -3788,7 +3790,7 @@ msgstr "Actualizando…"
msgid "Region"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Release"
msgstr "Liberar"
@ -3812,7 +3814,7 @@ msgid "Remove"
msgstr "Quitar"
#. placeholder {0}: attachment.file.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove {0}"
msgstr "Quitar {0}"
@ -3821,7 +3823,7 @@ msgid "Remove Git event"
msgstr ""
#. placeholder {0}: mention.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove mention {0}"
msgstr "Quitar mención {0}"
@ -3834,7 +3836,7 @@ msgid "Remove schedule"
msgstr "Quitar horario"
#. placeholder {0}: selectedSkill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove skill {0}"
msgstr "Quitar habilidad {0}"
@ -3842,7 +3844,7 @@ msgstr "Quitar habilidad {0}"
msgid "Remove webhook"
msgstr "Quitar webhook"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Removed with chat, computer, and memory."
msgstr "Eliminado junto con el chat, la computadora y la memoria."
@ -3875,15 +3877,15 @@ msgstr "Reemplazar clave de API"
msgid "Replace key"
msgstr "Reemplazar clave"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reply"
msgstr "Responder"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}"
msgstr "Respondiendo a {replyName}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}: “{replyQuote}”"
msgstr ""
@ -4142,7 +4144,7 @@ msgstr ""
msgid "Self-hosted (better-auth)"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-cards.tsx
msgid "Send"
msgstr "Enviar"
@ -4193,7 +4195,7 @@ msgid "Server URL"
msgstr "URL del servidor"
#: src/components/stage/StageVoiceEntry.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Set up voice"
msgstr ""
@ -4203,11 +4205,11 @@ msgstr ""
msgid "Settings"
msgstr "Configuración"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: General"
msgstr "Configuración: General"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: Usage"
msgstr "Configuración: Uso"
@ -4299,7 +4301,7 @@ msgid "Sketching the blueprint…"
msgstr ""
#. placeholder {0}: skill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Skill {0}"
msgstr "Habilidad {0}"
@ -4311,7 +4313,7 @@ msgstr "Habilidades"
#: src/components/onboarding/OnboardingScanStep.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
#: src/lib/onboarding-copy.ts
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Skip"
msgstr "Omitir"
@ -4365,11 +4367,11 @@ msgstr "Predeterminado del Space"
msgid "Spaces"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Hablar"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak this reply"
msgstr "Leer esta respuesta"
@ -4423,15 +4425,15 @@ msgstr "Iniciar grabación"
msgid "Start talking"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation — {activeName} is on stage above."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Start voice conversation"
msgstr ""
@ -4459,10 +4461,12 @@ msgstr "Pasos"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Detener"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop speaking"
msgstr "Dejar de hablar"
@ -4492,7 +4496,7 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "subagente"
@ -4557,7 +4561,7 @@ msgstr "Enseñanza en curso: detén la enseñanza antes de enviar un nuevo mensa
msgid "Team"
msgstr "Equipo"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Team Computer"
msgstr "Team Computer"
@ -4598,7 +4602,7 @@ msgstr "El proveedor de memoria seleccionado no está disponible en esta build."
msgid "Thinking"
msgstr "Pensando"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
msgstr "Este bot se ejecuta en esta computadora, no en un escritorio Linux. El shell y los archivos usan tu carpeta de inicio."
@ -4705,7 +4709,7 @@ msgid "Transcribe"
msgstr ""
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Transcript"
msgstr ""
@ -4869,8 +4873,8 @@ msgid "Video workflow"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Voice"
msgstr "Voz"
@ -5066,7 +5070,7 @@ msgstr "Trabajando…"
msgid "Working…"
msgstr "Trabajando…"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-format.ts
msgid "Yesterday"
msgstr "Ayer"

View File

@ -210,7 +210,7 @@ msgstr ""
msgid "{botName} watches the tape…"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "{botName}’s computer"
msgstr "{botName} का कंप्यूटर"
@ -277,7 +277,7 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} काम कर रहा है"
@ -643,7 +643,7 @@ msgstr "अपने एजेंट को इसके टूल उपयो
msgid "Archive"
msgstr "आर्काइव करें"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "archived"
msgstr "आर्काइव किया गया"
@ -651,7 +651,7 @@ msgstr "आर्काइव किया गया"
msgid "Archived"
msgstr "आर्काइव किया गया"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Archived. Chat, memory, and files kept."
msgstr "आर्काइव किया गया। चैट, मेमोरी और फ़ाइलें सुरक्षित रखी गईं।"
@ -711,11 +711,11 @@ msgstr "{0} बजे"
msgid "at {timeSelect}"
msgstr "{timeSelect} बजे"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "फ़ाइल संलग्न करें"
#: src/pages/Shell.tsx
#: src/pages/shell/message-preview.ts
msgid "Attachment"
msgstr "अटैचमेंट"
@ -788,7 +788,7 @@ msgstr "बियरर टोकन"
msgid "Blocked in your browser settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "लाइव डेस्कटॉप शुरू हो रहा है…"
@ -797,7 +797,7 @@ msgstr "लाइव डेस्कटॉप शुरू हो रहा ह
msgid "Booting up {0}’s computer"
msgstr "{0} का कंप्यूटर शुरू हो रहा है"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "bot"
msgstr "बॉट"
@ -828,7 +828,7 @@ msgstr ""
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "बॉट डिफ़ॉल्ट रूप से बिना पूछे कार्रवाई करते हैं। अपवाद तभी जोड़ें जब आप किसी प्रकार की कार्रवाई की पहले समीक्षा करना चाहते हों।"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "बॉट काम कर रहे हैं"
@ -889,7 +889,7 @@ msgstr "नया बॉट रद्द करें"
msgid "Cancel new group"
msgstr "नया समूह रद्द करें"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Cancel reply"
msgstr "उत्तर रद्द करें"
@ -946,7 +946,7 @@ msgstr ""
msgid "Chat history"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Chat Settings"
msgstr "चैट सेटिंग्स"
@ -1192,12 +1192,12 @@ msgid "Composing a reply…"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/transcript.tsx
msgid "Computer"
msgstr "कंप्यूटर"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer failed to boot"
msgstr "कंप्यूटर शुरू नहीं हो सका"
@ -1205,11 +1205,11 @@ msgstr "कंप्यूटर शुरू नहीं हो सका"
msgid "Computer is asleep"
msgstr "कंप्यूटर निष्क्रिय है"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is asleep. Open it to wake."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is stopped"
msgstr "कंप्यूटर रुका हुआ है"
@ -1353,7 +1353,7 @@ msgstr ""
msgid "Continue with email"
msgstr "ईमेल से जारी रखें"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Conversation record"
msgstr ""
@ -1361,11 +1361,11 @@ msgstr ""
msgid "Conversations"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy"
msgstr "कॉपी करें"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy reply"
msgstr ""
@ -1939,7 +1939,7 @@ msgstr ""
msgid "Delete space"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "deleted"
msgstr "डिलीट किया गया"
@ -2009,7 +2009,7 @@ msgstr "डिस्कनेक्ट हो रहा है…"
msgid "Dismiss"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Dismiss error"
msgstr ""
@ -2107,7 +2107,7 @@ msgstr "डुप्लिकेट"
msgid "e.g. Hivenet Agent, Presales, Timesheets bot"
msgstr "उदा. Hivenet Agent, Presales, टाइमशीट बॉट"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Earlier message"
msgstr "पुराना संदेश"
@ -2524,7 +2524,7 @@ msgstr ""
msgid "How to check"
msgstr "जांच कैसे करें"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "I’m done"
msgstr "मेरा काम हो गया"
@ -2627,11 +2627,11 @@ msgstr "पृथक"
msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
msgstr "इसकी बातचीत, फ़ाइलें और रूटीन स्थायी रूप से डिलीट कर दिए जाएंगे। इसके बनाए बॉट आपकी सूची में बने रहेंगे।"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to latest"
msgstr "नवीनतम संदेश पर जाएँ"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to replied message"
msgstr "जिस संदेश का उत्तर दिया गया उस पर जाएं"
@ -2718,7 +2718,7 @@ msgstr ""
msgid "Listening — what's the story?"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Load earlier messages"
msgstr "पुराने संदेश लोड करें"
@ -2771,7 +2771,7 @@ msgstr ""
#: src/pages/HeuteBrief.tsx
#: src/pages/IntegrationSetup.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Loading…"
msgstr "लोड हो रहा है…"
@ -2918,7 +2918,7 @@ msgstr "मेमोरी"
msgid "Memory scope"
msgstr "मेमोरी स्कोप"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Mentions"
msgstr ""
@ -2931,11 +2931,12 @@ msgstr ""
msgid "Message"
msgstr "संदेश"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-preview.ts
msgid "Message"
msgstr "संदेश"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message composer"
msgstr ""
@ -2943,11 +2944,11 @@ msgstr ""
msgid "Message event"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Message from {peer}"
msgstr "{peer} का संदेश"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message…"
msgstr "संदेश…"
@ -3030,7 +3031,7 @@ msgstr "सर्वर से मॉडल"
msgid "Monthly"
msgstr "मासिक"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "More"
msgstr ""
@ -3097,6 +3098,7 @@ msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3430,7 +3432,7 @@ msgstr "खुला कार्य"
msgid "OpenAI-compatible server URL"
msgstr "OpenAI-संगत सर्वर URL"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Opened its thread."
msgstr "इसका थ्रेड खोला।"
@ -3671,19 +3673,19 @@ msgstr ""
msgid "Quiet hours start"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Quote"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "React"
msgstr "प्रतिक्रिया दें"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reactions"
msgstr "प्रतिक्रियाएँ"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Read aloud"
msgstr ""
@ -3788,7 +3790,7 @@ msgstr ""
msgid "Region"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Release"
msgstr "नियंत्रण छोड़ें"
@ -3812,7 +3814,7 @@ msgid "Remove"
msgstr "हटाएं"
#. placeholder {0}: attachment.file.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove {0}"
msgstr "{0} हटाएं"
@ -3821,7 +3823,7 @@ msgid "Remove Git event"
msgstr ""
#. placeholder {0}: mention.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove mention {0}"
msgstr "उल्लेख {0} हटाएं"
@ -3834,7 +3836,7 @@ msgid "Remove schedule"
msgstr ""
#. placeholder {0}: selectedSkill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove skill {0}"
msgstr "स्किल {0} हटाएं"
@ -3842,7 +3844,7 @@ msgstr "स्किल {0} हटाएं"
msgid "Remove webhook"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Removed with chat, computer, and memory."
msgstr "चैट, कंप्यूटर और मेमोरी सहित हटाया गया।"
@ -3875,15 +3877,15 @@ msgstr "API कुंजी बदलें"
msgid "Replace key"
msgstr "कुंजी बदलें"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reply"
msgstr "उत्तर दें"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}"
msgstr "{replyName} को उत्तर दे रहे हैं"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}: “{replyQuote}”"
msgstr ""
@ -4142,7 +4144,7 @@ msgstr ""
msgid "Self-hosted (better-auth)"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-cards.tsx
msgid "Send"
msgstr "भेजें"
@ -4193,7 +4195,7 @@ msgid "Server URL"
msgstr "सर्वर URL"
#: src/components/stage/StageVoiceEntry.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Set up voice"
msgstr ""
@ -4203,11 +4205,11 @@ msgstr ""
msgid "Settings"
msgstr "सेटिंग्स"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: General"
msgstr "सेटिंग्स: सामान्य"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: Usage"
msgstr "सेटिंग्स: उपयोग"
@ -4299,7 +4301,7 @@ msgid "Sketching the blueprint…"
msgstr ""
#. placeholder {0}: skill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Skill {0}"
msgstr "स्किल {0}"
@ -4311,7 +4313,7 @@ msgstr "स्किल्स"
#: src/components/onboarding/OnboardingScanStep.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
#: src/lib/onboarding-copy.ts
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Skip"
msgstr "छोड़ें"
@ -4365,11 +4367,11 @@ msgstr "स्पेस डिफ़ॉल्ट"
msgid "Spaces"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "बोलें"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak this reply"
msgstr "यह उत्तर बोलकर सुनाएं"
@ -4423,15 +4425,15 @@ msgstr "रिकॉर्डिंग शुरू करें"
msgid "Start talking"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation — {activeName} is on stage above."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Start voice conversation"
msgstr ""
@ -4459,10 +4461,12 @@ msgstr "चरण"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "रोकें"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop speaking"
msgstr "बोलना रोकें"
@ -4492,7 +4496,7 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "सबएजेंट"
@ -4557,7 +4561,7 @@ msgstr "सिखाना जारी है। नया संदेश भ
msgid "Team"
msgstr "टीम"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Team Computer"
msgstr "टीम कंप्यूटर"
@ -4598,7 +4602,7 @@ msgstr "चयनित मेमोरी प्रोवाइडर इस
msgid "Thinking"
msgstr "सोच रहा है"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
msgstr "यह बॉट इसी कंप्यूटर पर चलता है, किसी Linux डेस्कटॉप पर नहीं। शेल और फ़ाइलें आपके होम फ़ोल्डर का उपयोग करती हैं।"
@ -4705,7 +4709,7 @@ msgid "Transcribe"
msgstr ""
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Transcript"
msgstr ""
@ -4869,8 +4873,8 @@ msgid "Video workflow"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Voice"
msgstr "आवाज़"
@ -5066,7 +5070,7 @@ msgstr "काम चल रहा है…"
msgid "Working…"
msgstr "काम चल रहा है…"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-format.ts
msgid "Yesterday"
msgstr "कल"

View File

@ -210,7 +210,7 @@ msgstr ""
msgid "{botName} watches the tape…"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "{botName}’s computer"
msgstr "{botName}의 컴퓨터"
@ -277,7 +277,7 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} 작업 중"
@ -643,7 +643,7 @@ msgstr "이 서버를 승인하면 Bot이 제공되는 도구를 사용할 수
msgid "Archive"
msgstr "보관"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "archived"
msgstr "보관됨"
@ -651,7 +651,7 @@ msgstr "보관됨"
msgid "Archived"
msgstr "보관됨"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Archived. Chat, memory, and files kept."
msgstr "보관되었습니다. 대화, 기억, 파일은 유지됩니다."
@ -711,11 +711,11 @@ msgstr "{0}에"
msgid "at {timeSelect}"
msgstr "{timeSelect}에"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "파일 첨부"
#: src/pages/Shell.tsx
#: src/pages/shell/message-preview.ts
msgid "Attachment"
msgstr "첨부 파일"
@ -788,7 +788,7 @@ msgstr "Bearer 토큰"
msgid "Blocked in your browser settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "라이브 데스크톱 시작 중…"
@ -797,7 +797,7 @@ msgstr "라이브 데스크톱 시작 중…"
msgid "Booting up {0}’s computer"
msgstr "{0}의 컴퓨터를 켜는 중"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "bot"
msgstr "Bot"
@ -828,7 +828,7 @@ msgstr "연결할 Bot"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Bot은 기본적으로 묻지 않고 작업합니다. 먼저 확인하고 싶은 작업만 예외로 추가하세요."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "봇 작업 중"
@ -889,7 +889,7 @@ msgstr "새 Bot 만들기 취소"
msgid "Cancel new group"
msgstr "새 그룹 만들기 취소"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Cancel reply"
msgstr "답장 취소"
@ -946,7 +946,7 @@ msgstr "채팅 앱, 그룹 채널 및 Agent 연결을 관리합니다."
msgid "Chat history"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Chat Settings"
msgstr "채팅 설정"
@ -1192,12 +1192,12 @@ msgid "Composing a reply…"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/transcript.tsx
msgid "Computer"
msgstr "컴퓨터"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer failed to boot"
msgstr "컴퓨터를 시작하지 못했습니다"
@ -1205,11 +1205,11 @@ msgstr "컴퓨터를 시작하지 못했습니다"
msgid "Computer is asleep"
msgstr "컴퓨터가 절전 상태입니다"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is asleep. Open it to wake."
msgstr "컴퓨터가 절전 상태입니다. 열어 깨우세요."
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is stopped"
msgstr "컴퓨터가 중지됨"
@ -1353,7 +1353,7 @@ msgstr ""
msgid "Continue with email"
msgstr "이메일로 계속하기"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Conversation record"
msgstr ""
@ -1361,11 +1361,11 @@ msgstr ""
msgid "Conversations"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy"
msgstr "복사"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy reply"
msgstr ""
@ -1939,7 +1939,7 @@ msgstr ""
msgid "Delete space"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "deleted"
msgstr "삭제됨"
@ -2009,7 +2009,7 @@ msgstr "연결 해제 중…"
msgid "Dismiss"
msgstr "닫기"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Dismiss error"
msgstr "오류 닫기"
@ -2107,7 +2107,7 @@ msgstr "복제"
msgid "e.g. Hivenet Agent, Presales, Timesheets bot"
msgstr "예: Hivenet Agent, Presales, 근무표 봇"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Earlier message"
msgstr "이전 메시지"
@ -2524,7 +2524,7 @@ msgstr ""
msgid "How to check"
msgstr "완료 확인 방법"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "I’m done"
msgstr "조작 끝내기"
@ -2627,11 +2627,11 @@ msgstr "이 Bot만 사용"
msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
msgstr "대화, 파일, 자동 실행이 영구 삭제됩니다. 이 Bot이 만든 다른 Bot은 목록에 남습니다."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to latest"
msgstr "최신 메시지로 이동"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to replied message"
msgstr "답장한 메시지로 이동"
@ -2718,7 +2718,7 @@ msgstr ""
msgid "Listening — what's the story?"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Load earlier messages"
msgstr "이전 메시지 불러오기"
@ -2771,7 +2771,7 @@ msgstr ""
#: src/pages/HeuteBrief.tsx
#: src/pages/IntegrationSetup.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Loading…"
msgstr "불러오는 중…"
@ -2918,7 +2918,7 @@ msgstr "기억"
msgid "Memory scope"
msgstr "기억 사용 범위"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Mentions"
msgstr "멘션"
@ -2931,11 +2931,12 @@ msgstr ""
msgid "Message"
msgstr "메시지"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-preview.ts
msgid "Message"
msgstr "메시지"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message composer"
msgstr "메시지 작성기"
@ -2943,11 +2944,11 @@ msgstr "메시지 작성기"
msgid "Message event"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Message from {peer}"
msgstr "{peer}의 메시지"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message…"
msgstr "메시지를 입력하세요"
@ -3030,7 +3031,7 @@ msgstr "서버에서 찾은 모델"
msgid "Monthly"
msgstr "매월"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "More"
msgstr ""
@ -3097,6 +3098,7 @@ msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3430,7 +3432,7 @@ msgstr "진행 중인 작업"
msgid "OpenAI-compatible server URL"
msgstr "OpenAI 호환 서버 주소"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Opened its thread."
msgstr "대화가 만들어졌습니다."
@ -3671,19 +3673,19 @@ msgstr ""
msgid "Quiet hours start"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Quote"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "React"
msgstr "반응하기"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reactions"
msgstr "반응"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Read aloud"
msgstr ""
@ -3788,7 +3790,7 @@ msgstr "새로고침 중…"
msgid "Region"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Release"
msgstr "제어권 돌려주기"
@ -3812,7 +3814,7 @@ msgid "Remove"
msgstr "삭제"
#. placeholder {0}: attachment.file.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove {0}"
msgstr "{0} 삭제"
@ -3821,7 +3823,7 @@ msgid "Remove Git event"
msgstr ""
#. placeholder {0}: mention.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove mention {0}"
msgstr "{0} 멘션 삭제"
@ -3834,7 +3836,7 @@ msgid "Remove schedule"
msgstr "일정 제거"
#. placeholder {0}: selectedSkill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove skill {0}"
msgstr "작업 기술 {0} 삭제"
@ -3842,7 +3844,7 @@ msgstr "작업 기술 {0} 삭제"
msgid "Remove webhook"
msgstr "웹훅 제거"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Removed with chat, computer, and memory."
msgstr "대화, 컴퓨터, 기억과 함께 삭제되었습니다."
@ -3875,15 +3877,15 @@ msgstr "API 키 교체"
msgid "Replace key"
msgstr "키 교체"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reply"
msgstr "답장"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}"
msgstr "{replyName}에게 답장"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}: “{replyQuote}”"
msgstr ""
@ -4142,7 +4144,7 @@ msgstr ""
msgid "Self-hosted (better-auth)"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-cards.tsx
msgid "Send"
msgstr "보내기"
@ -4193,7 +4195,7 @@ msgid "Server URL"
msgstr "서버 URL"
#: src/components/stage/StageVoiceEntry.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Set up voice"
msgstr ""
@ -4203,11 +4205,11 @@ msgstr ""
msgid "Settings"
msgstr "설정"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: General"
msgstr "설정: 일반"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: Usage"
msgstr "설정: 사용량"
@ -4299,7 +4301,7 @@ msgid "Sketching the blueprint…"
msgstr ""
#. placeholder {0}: skill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Skill {0}"
msgstr "작업 기술 {0}"
@ -4311,7 +4313,7 @@ msgstr "스킬"
#: src/components/onboarding/OnboardingScanStep.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
#: src/lib/onboarding-copy.ts
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Skip"
msgstr "건너뛰기"
@ -4365,11 +4367,11 @@ msgstr "스페이스 기본값"
msgid "Spaces"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "읽기"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak this reply"
msgstr "이 답변 읽기"
@ -4423,15 +4425,15 @@ msgstr "작업 녹화 시작"
msgid "Start talking"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation — {activeName} is on stage above."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Start voice conversation"
msgstr ""
@ -4459,10 +4461,12 @@ msgstr "실행 단계"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "중지"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop speaking"
msgstr "읽기 중지"
@ -4492,7 +4496,7 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "보조 에이전트"
@ -4557,7 +4561,7 @@ msgstr "작업을 가르치는 중입니다. 새 메시지를 보내려면 먼
msgid "Team"
msgstr "팀 공용"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Team Computer"
msgstr "팀 컴퓨터"
@ -4598,7 +4602,7 @@ msgstr "선택한 기억 서비스는 현재 빌드에서 사용할 수 없습
msgid "Thinking"
msgstr "생각 깊이"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
msgstr "이 Bot은 별도 Linux 화면이 아니라 현재 컴퓨터에서 실행됩니다. 터미널과 파일 작업은 홈 폴더를 사용합니다."
@ -4705,7 +4709,7 @@ msgid "Transcribe"
msgstr ""
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Transcript"
msgstr ""
@ -4869,8 +4873,8 @@ msgid "Video workflow"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Voice"
msgstr "음성"
@ -5066,7 +5070,7 @@ msgstr "처리 중…"
msgid "Working…"
msgstr "처리 중…"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-format.ts
msgid "Yesterday"
msgstr "어제"

View File

@ -210,7 +210,7 @@ msgstr ""
msgid "{botName} watches the tape…"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "{botName}’s computer"
msgstr "Computador do {botName}"
@ -277,7 +277,7 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} está trabalhando"
@ -643,7 +643,7 @@ msgstr "Aprove este servidor para permitir que seu agente use suas ferramentas."
msgid "Archive"
msgstr "Arquivar"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "archived"
msgstr "arquivado"
@ -651,7 +651,7 @@ msgstr "arquivado"
msgid "Archived"
msgstr "Arquivado"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Archived. Chat, memory, and files kept."
msgstr "Arquivado. Chat, memória e arquivos mantidos."
@ -711,11 +711,11 @@ msgstr "em {0}"
msgid "at {timeSelect}"
msgstr "em {timeSelect}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Escolher arquivo"
#: src/pages/Shell.tsx
#: src/pages/shell/message-preview.ts
msgid "Attachment"
msgstr "Anexo"
@ -788,7 +788,7 @@ msgstr "Token portador"
msgid "Blocked in your browser settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Iniciando a área de trabalho ao vivo..."
@ -797,7 +797,7 @@ msgstr "Iniciando a área de trabalho ao vivo..."
msgid "Booting up {0}’s computer"
msgstr "Inicializando o computador do {0}"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "bot"
msgstr "bot"
@ -828,7 +828,7 @@ msgstr ""
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Os bots agem sem perguntar por padrão. Adicione uma exceção apenas quando quiser analisar um tipo de ação primeiro."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Bots estão trabalhando"
@ -889,7 +889,7 @@ msgstr "Cancelar novo bot"
msgid "Cancel new group"
msgstr "Cancelar novo grupo"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Cancel reply"
msgstr "cancelar resposta"
@ -946,7 +946,7 @@ msgstr ""
msgid "Chat history"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Chat Settings"
msgstr "Configurações do chat"
@ -1192,12 +1192,12 @@ msgid "Composing a reply…"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/transcript.tsx
msgid "Computer"
msgstr "Computador"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer failed to boot"
msgstr "Falha ao inicializar o computador"
@ -1205,11 +1205,11 @@ msgstr "Falha ao inicializar o computador"
msgid "Computer is asleep"
msgstr "O computador está dormindo"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is asleep. Open it to wake."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is stopped"
msgstr "O computador está parado"
@ -1353,7 +1353,7 @@ msgstr ""
msgid "Continue with email"
msgstr "Continuar com e-mail"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Conversation record"
msgstr ""
@ -1361,11 +1361,11 @@ msgstr ""
msgid "Conversations"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy"
msgstr "Copiar"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy reply"
msgstr ""
@ -1939,7 +1939,7 @@ msgstr ""
msgid "Delete space"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "deleted"
msgstr "excluído"
@ -2009,7 +2009,7 @@ msgstr "Desconectando…"
msgid "Dismiss"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Dismiss error"
msgstr ""
@ -2107,7 +2107,7 @@ msgstr "Duplicar"
msgid "e.g. Hivenet Agent, Presales, Timesheets bot"
msgstr "ex.: Hivenet Agent, Presales, bot de planilhas"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Earlier message"
msgstr ""
@ -2524,7 +2524,7 @@ msgstr ""
msgid "How to check"
msgstr "Como verificar"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "I’m done"
msgstr "Eu terminei."
@ -2627,11 +2627,11 @@ msgstr "Isolado"
msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
msgstr "Suas conversas, arquivos e rotinas serão excluídos permanentemente. Os bots criados ficam na sua lista."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to latest"
msgstr "Ir para a mensagem mais recente"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to replied message"
msgstr "Ir para a mensagem respondida"
@ -2718,7 +2718,7 @@ msgstr ""
msgid "Listening — what's the story?"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Load earlier messages"
msgstr "Carregar mensagens anteriores..."
@ -2771,7 +2771,7 @@ msgstr ""
#: src/pages/HeuteBrief.tsx
#: src/pages/IntegrationSetup.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Loading…"
msgstr "Carregando..."
@ -2918,7 +2918,7 @@ msgstr "Memória"
msgid "Memory scope"
msgstr "Escopo de memória"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Mentions"
msgstr ""
@ -2931,11 +2931,12 @@ msgstr ""
msgid "Message"
msgstr "Mensagem"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-preview.ts
msgid "Message"
msgstr "Mensagem"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message composer"
msgstr ""
@ -2943,11 +2944,11 @@ msgstr ""
msgid "Message event"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Message from {peer}"
msgstr "Mensagem de {peer}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message…"
msgstr "Mensagem…"
@ -3030,7 +3031,7 @@ msgstr "Modelos do servidor"
msgid "Monthly"
msgstr "Mensalmente"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "More"
msgstr ""
@ -3097,6 +3098,7 @@ msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3430,7 +3432,7 @@ msgstr "Trabalho aberto"
msgid "OpenAI-compatible server URL"
msgstr "URL do servidor compatível com OpenAI"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Opened its thread."
msgstr "Abriu a conversa."
@ -3671,19 +3673,19 @@ msgstr ""
msgid "Quiet hours start"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Quote"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "React"
msgstr "Reagir"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reactions"
msgstr "Reações"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Read aloud"
msgstr ""
@ -3788,7 +3790,7 @@ msgstr ""
msgid "Region"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Release"
msgstr "Libere"
@ -3812,7 +3814,7 @@ msgid "Remove"
msgstr "Remover"
#. placeholder {0}: attachment.file.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove {0}"
msgstr "Remover {0}"
@ -3821,7 +3823,7 @@ msgid "Remove Git event"
msgstr ""
#. placeholder {0}: mention.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove mention {0}"
msgstr "Remover menção {0}"
@ -3834,7 +3836,7 @@ msgid "Remove schedule"
msgstr ""
#. placeholder {0}: selectedSkill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove skill {0}"
msgstr "Remover habilidade {0}"
@ -3842,7 +3844,7 @@ msgstr "Remover habilidade {0}"
msgid "Remove webhook"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Removed with chat, computer, and memory."
msgstr "Removido com chat, computador e memória."
@ -3875,15 +3877,15 @@ msgstr "Substituir chave de API"
msgid "Replace key"
msgstr "Substituir chave"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reply"
msgstr "Responder"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}"
msgstr "Respondendo a {replyName}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}: “{replyQuote}”"
msgstr ""
@ -4142,7 +4144,7 @@ msgstr ""
msgid "Self-hosted (better-auth)"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-cards.tsx
msgid "Send"
msgstr "Enviar"
@ -4193,7 +4195,7 @@ msgid "Server URL"
msgstr "URL do servidor"
#: src/components/stage/StageVoiceEntry.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Set up voice"
msgstr ""
@ -4203,11 +4205,11 @@ msgstr ""
msgid "Settings"
msgstr "Configurações"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: General"
msgstr "Opções > Geral"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: Usage"
msgstr "Configurações: Uso"
@ -4299,7 +4301,7 @@ msgid "Sketching the blueprint…"
msgstr ""
#. placeholder {0}: skill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Skill {0}"
msgstr "Habilidade {0}"
@ -4311,7 +4313,7 @@ msgstr "Habilidades"
#: src/components/onboarding/OnboardingScanStep.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
#: src/lib/onboarding-copy.ts
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Skip"
msgstr "Pular"
@ -4365,11 +4367,11 @@ msgstr "Padrão do espaço"
msgid "Spaces"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Falar"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak this reply"
msgstr "Fale esta resposta"
@ -4423,15 +4425,15 @@ msgstr "Começar a gravar"
msgid "Start talking"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation — {activeName} is on stage above."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Start voice conversation"
msgstr ""
@ -4459,10 +4461,12 @@ msgstr "Passos"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Parar"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop speaking"
msgstr "Pare de Falar"
@ -4492,7 +4496,7 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "subagente"
@ -4557,7 +4561,7 @@ msgstr "Ensino em andamento. Pare de ensinar antes de enviar uma nova mensagem."
msgid "Team"
msgstr "Equipe"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Team Computer"
msgstr "Computador da equipe"
@ -4598,7 +4602,7 @@ msgstr "O provedor de memória selecionado não está disponível nesta compila
msgid "Thinking"
msgstr "Pensando"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
msgstr "Este bot é executado neste computador, não em um desktop Linux. Shell e arquivos usam sua pasta inicial."
@ -4705,7 +4709,7 @@ msgid "Transcribe"
msgstr ""
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Transcript"
msgstr ""
@ -4869,8 +4873,8 @@ msgid "Video workflow"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Voice"
msgstr "Voz"
@ -5066,7 +5070,7 @@ msgstr "Funcionando"
msgid "Working…"
msgstr "Funcionando"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-format.ts
msgid "Yesterday"
msgstr "Ontem"

View File

@ -210,7 +210,7 @@ msgstr ""
msgid "{botName} watches the tape…"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "{botName}’s computer"
msgstr "Компьютер {botName}"
@ -277,7 +277,7 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr "{toolCount, plural, one {# инструмент} few {# инструмента} many {# инструментов} other {# инструмента}}"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} работает"
@ -643,7 +643,7 @@ msgstr "Одобрите этот сервер, чтобы ваш агент м
msgid "Archive"
msgstr "Архивировать"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "archived"
msgstr "в архиве"
@ -651,7 +651,7 @@ msgstr "в архиве"
msgid "Archived"
msgstr "В архиве"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Archived. Chat, memory, and files kept."
msgstr "В архиве. Чат, память и файлы сохраняются."
@ -711,11 +711,11 @@ msgstr "в {0}"
msgid "at {timeSelect}"
msgstr "в {timeSelect}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Прикрепить файл"
#: src/pages/Shell.tsx
#: src/pages/shell/message-preview.ts
msgid "Attachment"
msgstr "Вложение"
@ -788,7 +788,7 @@ msgstr "Bearer-токен"
msgid "Blocked in your browser settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Загрузка рабочего стола…"
@ -797,7 +797,7 @@ msgstr "Загрузка рабочего стола…"
msgid "Booting up {0}’s computer"
msgstr "Загрузка компьютера {0}"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "bot"
msgstr "бот"
@ -828,7 +828,7 @@ msgstr "Бот для ссылки"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "По умолчанию боты действуют, не спрашивая. Добавляйте исключение только в том случае, если вы хотите сначала просмотреть тип действия."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Боты работают"
@ -889,7 +889,7 @@ msgstr "Отменить создание бота"
msgid "Cancel new group"
msgstr "Отменить создание группы"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Cancel reply"
msgstr "Отменить ответ"
@ -946,7 +946,7 @@ msgstr "Приложения чата, групповые каналы и под
msgid "Chat history"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Chat Settings"
msgstr "Настройки чата"
@ -1192,12 +1192,12 @@ msgid "Composing a reply…"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/transcript.tsx
msgid "Computer"
msgstr "Компьютер"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer failed to boot"
msgstr "Компьютер не смог загрузиться"
@ -1205,11 +1205,11 @@ msgstr "Компьютер не смог загрузиться"
msgid "Computer is asleep"
msgstr "Компьютер спит"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is asleep. Open it to wake."
msgstr "Компьютер спит. Откройте его, чтобы разбудить."
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is stopped"
msgstr "Компьютер остановлен"
@ -1353,7 +1353,7 @@ msgstr "Продолжить в фоне"
msgid "Continue with email"
msgstr "Продолжить по электронной почте"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Conversation record"
msgstr ""
@ -1361,11 +1361,11 @@ msgstr ""
msgid "Conversations"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy"
msgstr "Копировать"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy reply"
msgstr ""
@ -1939,7 +1939,7 @@ msgstr ""
msgid "Delete space"
msgstr "Удалить пространство"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "deleted"
msgstr "удалено"
@ -2009,7 +2009,7 @@ msgstr "Отключение…"
msgid "Dismiss"
msgstr "Закрыть"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Dismiss error"
msgstr "Закрыть ошибку"
@ -2107,7 +2107,7 @@ msgstr "Дублировать"
msgid "e.g. Hivenet Agent, Presales, Timesheets bot"
msgstr "напр. Hivenet Agent, Presales, бот табелей"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Earlier message"
msgstr "Предыдущее сообщение"
@ -2524,7 +2524,7 @@ msgstr ""
msgid "How to check"
msgstr "Как проверить"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "I’m done"
msgstr "Готово"
@ -2627,11 +2627,11 @@ msgstr "изолированный"
msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
msgstr "Его диалог, файлы и задачи будут безвозвратно удалены. Созданные им боты останутся в вашем списке."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to latest"
msgstr "Перейти к последнему"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to replied message"
msgstr "Перейти к ответному сообщению"
@ -2718,7 +2718,7 @@ msgstr ""
msgid "Listening — what's the story?"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Load earlier messages"
msgstr "Загрузить более ранние сообщения"
@ -2771,7 +2771,7 @@ msgstr ""
#: src/pages/HeuteBrief.tsx
#: src/pages/IntegrationSetup.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Loading…"
msgstr "Загрузка…"
@ -2918,7 +2918,7 @@ msgstr "Память"
msgid "Memory scope"
msgstr "Область памяти"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Mentions"
msgstr "Упоминания"
@ -2931,11 +2931,12 @@ msgstr "Только упоминания"
msgid "Message"
msgstr "Сообщение"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-preview.ts
msgid "Message"
msgstr "Сообщение"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message composer"
msgstr "Поле сообщения"
@ -2943,11 +2944,11 @@ msgstr "Поле сообщения"
msgid "Message event"
msgstr "Событие сообщения"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Message from {peer}"
msgstr "Сообщение от {peer}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message…"
msgstr "Сообщение…"
@ -3030,7 +3031,7 @@ msgstr "Модели с сервера"
msgid "Monthly"
msgstr "Ежемесячно"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "More"
msgstr "Ещё"
@ -3097,6 +3098,7 @@ msgstr "Требуется ваше участие"
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr "Требуется ваше участие"
@ -3430,7 +3432,7 @@ msgstr "Открытые задачи"
msgid "OpenAI-compatible server URL"
msgstr "URL-адрес сервера, совместимого с OpenAI"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Opened its thread."
msgstr "Диалог открыт."
@ -3671,19 +3673,19 @@ msgstr ""
msgid "Quiet hours start"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Quote"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "React"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reactions"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Read aloud"
msgstr ""
@ -3788,7 +3790,7 @@ msgstr "Обновление…"
msgid "Region"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Release"
msgstr "Освободить управление"
@ -3812,7 +3814,7 @@ msgid "Remove"
msgstr "Удалить"
#. placeholder {0}: attachment.file.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove {0}"
msgstr "Удалить {0}"
@ -3821,7 +3823,7 @@ msgid "Remove Git event"
msgstr "Удалить событие Git"
#. placeholder {0}: mention.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove mention {0}"
msgstr "Удалить упоминание {0}"
@ -3834,7 +3836,7 @@ msgid "Remove schedule"
msgstr "Удалить расписание"
#. placeholder {0}: selectedSkill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove skill {0}"
msgstr "Удалить навык {0}"
@ -3842,7 +3844,7 @@ msgstr "Удалить навык {0}"
msgid "Remove webhook"
msgstr "Удалить вебхук"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Removed with chat, computer, and memory."
msgstr "Удалено вместе с чатом, компьютером и памятью."
@ -3875,15 +3877,15 @@ msgstr "Заменить ключ API"
msgid "Replace key"
msgstr "Заменить ключ"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reply"
msgstr "Ответить"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}"
msgstr "Ответ на {replyName}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}: “{replyQuote}”"
msgstr ""
@ -4142,7 +4144,7 @@ msgstr ""
msgid "Self-hosted (better-auth)"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-cards.tsx
msgid "Send"
msgstr "Отправить"
@ -4193,7 +4195,7 @@ msgid "Server URL"
msgstr "URL-адрес сервера"
#: src/components/stage/StageVoiceEntry.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Set up voice"
msgstr ""
@ -4203,11 +4205,11 @@ msgstr ""
msgid "Settings"
msgstr "Настройки"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: General"
msgstr "Настройки: Общие"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: Usage"
msgstr "Настройки: Использование"
@ -4299,7 +4301,7 @@ msgid "Sketching the blueprint…"
msgstr ""
#. placeholder {0}: skill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Skill {0}"
msgstr "Навык {0}"
@ -4311,7 +4313,7 @@ msgstr "Навыки"
#: src/components/onboarding/OnboardingScanStep.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
#: src/lib/onboarding-copy.ts
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Skip"
msgstr "Пропустить"
@ -4365,11 +4367,11 @@ msgstr "Пространство по умолчанию"
msgid "Spaces"
msgstr "Пространства"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Озвучить"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak this reply"
msgstr "Озвучить этот ответ"
@ -4423,15 +4425,15 @@ msgstr "Начать запись"
msgid "Start talking"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation — {activeName} is on stage above."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Start voice conversation"
msgstr ""
@ -4459,10 +4461,12 @@ msgstr "Шаги"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Остановить"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop speaking"
msgstr "Остановить озвучивание"
@ -4492,7 +4496,7 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "субагент"
@ -4557,7 +4561,7 @@ msgstr "Обучение в процессе. Прекратите обучен
msgid "Team"
msgstr "Команда"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Team Computer"
msgstr "Командный компьютер"
@ -4598,7 +4602,7 @@ msgstr "Выбранный поставщик памяти недоступен
msgid "Thinking"
msgstr "рассуждение"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
msgstr "Этот бот работает на этом компьютере, а не на рабочем столе Linux. Оболочка и файлы используют вашу домашнюю папку."
@ -4705,7 +4709,7 @@ msgid "Transcribe"
msgstr ""
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Transcript"
msgstr ""
@ -4869,8 +4873,8 @@ msgid "Video workflow"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Voice"
msgstr "Голос"
@ -5066,7 +5070,7 @@ msgstr "Выполняется…"
msgid "Working…"
msgstr "Выполняется…"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-format.ts
msgid "Yesterday"
msgstr "Вчера"

View File

@ -210,7 +210,7 @@ msgstr ""
msgid "{botName} watches the tape…"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "{botName}’s computer"
msgstr "{botName} adlı botun bilgisayarı"
@ -277,7 +277,7 @@ msgstr "{title}, {label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} çalışıyor"
@ -643,7 +643,7 @@ msgstr "Agent'ının bu sunucunun araçlarını kullanabilmesi için sunucuyu on
msgid "Archive"
msgstr "Arşivle"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "archived"
msgstr "arşivlendi"
@ -651,7 +651,7 @@ msgstr "arşivlendi"
msgid "Archived"
msgstr "Arşivlendi"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Archived. Chat, memory, and files kept."
msgstr "Arşivlendi. Sohbet, hafıza ve dosyalar korundu."
@ -711,11 +711,11 @@ msgstr "saat {0}"
msgid "at {timeSelect}"
msgstr "saat {timeSelect}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Dosya ekle"
#: src/pages/Shell.tsx
#: src/pages/shell/message-preview.ts
msgid "Attachment"
msgstr "Ek"
@ -788,7 +788,7 @@ msgstr "Bearer token"
msgid "Blocked in your browser settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Canlı masaüstü başlatılıyor…"
@ -797,7 +797,7 @@ msgstr "Canlı masaüstü başlatılıyor…"
msgid "Booting up {0}’s computer"
msgstr "{0} adlı botun bilgisayarı başlatılıyor"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "bot"
msgstr "bot"
@ -828,7 +828,7 @@ msgstr ""
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "Botlar varsayılan olarak sormadan hareket eder. Yalnızca belirli bir işlem türünü önce incelemek istediğinde istisna ekle."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Botlar çalışıyor"
@ -889,7 +889,7 @@ msgstr "Yeni botu iptal et"
msgid "Cancel new group"
msgstr "Yeni grubu iptal et"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Cancel reply"
msgstr "Yanıtı iptal et"
@ -946,7 +946,7 @@ msgstr ""
msgid "Chat history"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Chat Settings"
msgstr "Sohbet Ayarları"
@ -1192,12 +1192,12 @@ msgid "Composing a reply…"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/transcript.tsx
msgid "Computer"
msgstr "Bilgisayar"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer failed to boot"
msgstr "Bilgisayar başlatılamadı"
@ -1205,11 +1205,11 @@ msgstr "Bilgisayar başlatılamadı"
msgid "Computer is asleep"
msgstr "Bilgisayar uykuda"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is asleep. Open it to wake."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is stopped"
msgstr "Bilgisayar durduruldu"
@ -1353,7 +1353,7 @@ msgstr ""
msgid "Continue with email"
msgstr "E-posta ile devam et"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Conversation record"
msgstr ""
@ -1361,11 +1361,11 @@ msgstr ""
msgid "Conversations"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy"
msgstr "Kopyala"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy reply"
msgstr ""
@ -1939,7 +1939,7 @@ msgstr ""
msgid "Delete space"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "deleted"
msgstr "silindi"
@ -2009,7 +2009,7 @@ msgstr "Bağlantı kesiliyor…"
msgid "Dismiss"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Dismiss error"
msgstr ""
@ -2107,7 +2107,7 @@ msgstr "Çoğalt"
msgid "e.g. Hivenet Agent, Presales, Timesheets bot"
msgstr "örn. Hivenet Agent, Presales, puantaj botu"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Earlier message"
msgstr ""
@ -2524,7 +2524,7 @@ msgstr ""
msgid "How to check"
msgstr "Nasıl kontrol edilir"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "I’m done"
msgstr "Bitirdim"
@ -2627,11 +2627,11 @@ msgstr "Yalıtılmış"
msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
msgstr "Sohbeti, dosyaları ve rutinleri kalıcı olarak silinecek. Oluşturduğu botlar listende kalır."
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to latest"
msgstr "En son mesaja git"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to replied message"
msgstr "Yanıtlanan mesaja git"
@ -2718,7 +2718,7 @@ msgstr ""
msgid "Listening — what's the story?"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Load earlier messages"
msgstr "Önceki mesajları yükle"
@ -2771,7 +2771,7 @@ msgstr ""
#: src/pages/HeuteBrief.tsx
#: src/pages/IntegrationSetup.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Loading…"
msgstr "Yükleniyor…"
@ -2918,7 +2918,7 @@ msgstr "Hafıza"
msgid "Memory scope"
msgstr "Hafıza kapsamı"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Mentions"
msgstr ""
@ -2931,11 +2931,12 @@ msgstr ""
msgid "Message"
msgstr "Mesaj"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-preview.ts
msgid "Message"
msgstr "Mesaj"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message composer"
msgstr ""
@ -2943,11 +2944,11 @@ msgstr ""
msgid "Message event"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Message from {peer}"
msgstr "{peer} botundan mesaj"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message…"
msgstr "Mesaj…"
@ -3030,7 +3031,7 @@ msgstr "Sunucudan gelen modeller"
msgid "Monthly"
msgstr "Aylık"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "More"
msgstr ""
@ -3097,6 +3098,7 @@ msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3430,7 +3432,7 @@ msgstr "Açık işler"
msgid "OpenAI-compatible server URL"
msgstr "OpenAI uyumlu sunucu URL'si"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Opened its thread."
msgstr "Sohbeti açıldı."
@ -3671,19 +3673,19 @@ msgstr ""
msgid "Quiet hours start"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Quote"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "React"
msgstr "Tepki ver"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reactions"
msgstr "Tepkiler"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Read aloud"
msgstr ""
@ -3788,7 +3790,7 @@ msgstr ""
msgid "Region"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Release"
msgstr "Bırak"
@ -3812,7 +3814,7 @@ msgid "Remove"
msgstr "Kaldır"
#. placeholder {0}: attachment.file.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove {0}"
msgstr "{0} kaldır"
@ -3821,7 +3823,7 @@ msgid "Remove Git event"
msgstr ""
#. placeholder {0}: mention.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove mention {0}"
msgstr "{0} bahsini kaldır"
@ -3834,7 +3836,7 @@ msgid "Remove schedule"
msgstr ""
#. placeholder {0}: selectedSkill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove skill {0}"
msgstr "{0} becerisini kaldır"
@ -3842,7 +3844,7 @@ msgstr "{0} becerisini kaldır"
msgid "Remove webhook"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Removed with chat, computer, and memory."
msgstr "Sohbeti, bilgisayarı ve hafızasıyla birlikte kaldırıldı."
@ -3875,15 +3877,15 @@ msgstr "API anahtarını değiştir"
msgid "Replace key"
msgstr "Anahtarı değiştir"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reply"
msgstr "Yanıtla"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}"
msgstr "{replyName} yanıtlanıyor"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}: “{replyQuote}”"
msgstr ""
@ -4142,7 +4144,7 @@ msgstr ""
msgid "Self-hosted (better-auth)"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-cards.tsx
msgid "Send"
msgstr "Gönder"
@ -4193,7 +4195,7 @@ msgid "Server URL"
msgstr "Sunucu URL'si"
#: src/components/stage/StageVoiceEntry.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Set up voice"
msgstr ""
@ -4203,11 +4205,11 @@ msgstr ""
msgid "Settings"
msgstr "Ayarlar"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: General"
msgstr "Ayarlar: Genel"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: Usage"
msgstr "Ayarlar: Kullanım"
@ -4299,7 +4301,7 @@ msgid "Sketching the blueprint…"
msgstr ""
#. placeholder {0}: skill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Skill {0}"
msgstr "Beceri: {0}"
@ -4311,7 +4313,7 @@ msgstr "Beceriler"
#: src/components/onboarding/OnboardingScanStep.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
#: src/lib/onboarding-copy.ts
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Skip"
msgstr "Atla"
@ -4365,11 +4367,11 @@ msgstr "Alan varsayılanı"
msgid "Spaces"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Seslendir"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak this reply"
msgstr "Bu yanıtı seslendir"
@ -4423,15 +4425,15 @@ msgstr "Kaydı başlat"
msgid "Start talking"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation — {activeName} is on stage above."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Start voice conversation"
msgstr ""
@ -4459,10 +4461,12 @@ msgstr "Adımlar"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "Durdur"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop speaking"
msgstr "Seslendirmeyi durdur"
@ -4492,7 +4496,7 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "alt ajan"
@ -4557,7 +4561,7 @@ msgstr "Öğretme sürüyor. Yeni mesaj göndermeden önce öğretmeyi durdur."
msgid "Team"
msgstr "Takım"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Team Computer"
msgstr "Takım Bilgisayarı"
@ -4598,7 +4602,7 @@ msgstr "Seçilen hafıza sağlayıcısı bu sürümde kullanılamıyor."
msgid "Thinking"
msgstr "Düşünüyor"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
msgstr "Bu bot bir Linux masaüstünde değil, bu bilgisayarda çalışır. Kabuk ve dosyalar senin kullanıcı klasörünü kullanır."
@ -4705,7 +4709,7 @@ msgid "Transcribe"
msgstr ""
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Transcript"
msgstr ""
@ -4869,8 +4873,8 @@ msgid "Video workflow"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Voice"
msgstr "Ses"
@ -5066,7 +5070,7 @@ msgstr "Çalışıyor…"
msgid "Working…"
msgstr "Çalışıyor…"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-format.ts
msgid "Yesterday"
msgstr "Dün"

View File

@ -210,7 +210,7 @@ msgstr ""
msgid "{botName} watches the tape…"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "{botName}’s computer"
msgstr "{botName} 的电脑"
@ -277,7 +277,7 @@ msgstr "{title},{label}"
msgid "{toolCount, plural, one {# tool} other {# tools}}"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "{workingBotName} is working"
msgstr "{workingBotName} 正在工作"
@ -643,7 +643,7 @@ msgstr "批准此服务器后,Agent 才能使用它的工具。"
msgid "Archive"
msgstr "归档"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "archived"
msgstr "已归档"
@ -651,7 +651,7 @@ msgstr "已归档"
msgid "Archived"
msgstr "已归档"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Archived. Chat, memory, and files kept."
msgstr "已归档。对话、记忆和文件保留。"
@ -711,11 +711,11 @@ msgstr "{0}"
msgid "at {timeSelect}"
msgstr "{timeSelect}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "附加文件"
#: src/pages/Shell.tsx
#: src/pages/shell/message-preview.ts
msgid "Attachment"
msgstr "附件"
@ -788,7 +788,7 @@ msgstr "Bearer token"
msgid "Blocked in your browser settings"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "正在启动实时桌面…"
@ -797,7 +797,7 @@ msgstr "正在启动实时桌面…"
msgid "Booting up {0}’s computer"
msgstr "正在启动 {0} 的电脑"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "bot"
msgstr "Bot"
@ -828,7 +828,7 @@ msgstr "要关联的 Bot"
msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first."
msgstr "默认情况下 Bot 会直接执行。只有当你想先审核某类操作时,才添加例外。"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Bots are working"
msgstr "Bot 正在工作"
@ -889,7 +889,7 @@ msgstr "取消新建 Bot"
msgid "Cancel new group"
msgstr "取消新建群组"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Cancel reply"
msgstr "取消回复"
@ -946,7 +946,7 @@ msgstr "聊天应用、群组频道和 Agent 连接。"
msgid "Chat history"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Chat Settings"
msgstr "聊天设置"
@ -1192,12 +1192,12 @@ msgid "Composing a reply…"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/transcript.tsx
msgid "Computer"
msgstr "电脑"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer failed to boot"
msgstr "电脑启动失败"
@ -1205,11 +1205,11 @@ msgstr "电脑启动失败"
msgid "Computer is asleep"
msgstr "电脑已休眠"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is asleep. Open it to wake."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Computer is stopped"
msgstr "电脑已停止"
@ -1353,7 +1353,7 @@ msgstr ""
msgid "Continue with email"
msgstr "使用邮箱继续"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Conversation record"
msgstr ""
@ -1361,11 +1361,11 @@ msgstr ""
msgid "Conversations"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy"
msgstr "复制"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Copy reply"
msgstr ""
@ -1939,7 +1939,7 @@ msgstr ""
msgid "Delete space"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "deleted"
msgstr "已删除"
@ -2009,7 +2009,7 @@ msgstr "正在断开…"
msgid "Dismiss"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Dismiss error"
msgstr "关闭错误"
@ -2107,7 +2107,7 @@ msgstr "复制"
msgid "e.g. Hivenet Agent, Presales, Timesheets bot"
msgstr "例如 Hivenet Agent、Presales、工时表机器人"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Earlier message"
msgstr "更早的消息"
@ -2524,7 +2524,7 @@ msgstr ""
msgid "How to check"
msgstr "如何检查"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "I’m done"
msgstr "我做完了"
@ -2627,11 +2627,11 @@ msgstr "隔离"
msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list."
msgstr "它的对话、文件和例行任务将被永久删除。它创建的 Bot 仍留在列表中。"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to latest"
msgstr "跳到最新"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Jump to replied message"
msgstr "跳到被回复的消息"
@ -2718,7 +2718,7 @@ msgstr ""
msgid "Listening — what's the story?"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Load earlier messages"
msgstr "加载更早的消息"
@ -2771,7 +2771,7 @@ msgstr ""
#: src/pages/HeuteBrief.tsx
#: src/pages/IntegrationSetup.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Loading…"
msgstr "加载中…"
@ -2918,7 +2918,7 @@ msgstr "记忆"
msgid "Memory scope"
msgstr "记忆范围"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Mentions"
msgstr "提及"
@ -2931,11 +2931,12 @@ msgstr ""
msgid "Message"
msgstr "消息"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-preview.ts
msgid "Message"
msgstr "消息"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message composer"
msgstr "消息输入框"
@ -2943,11 +2944,11 @@ msgstr "消息输入框"
msgid "Message event"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Message from {peer}"
msgstr "来自 {peer} 的消息"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Message…"
msgstr "消息…"
@ -3030,7 +3031,7 @@ msgstr "来自服务器的模型"
msgid "Monthly"
msgstr "每月"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "More"
msgstr ""
@ -3097,6 +3098,7 @@ msgstr ""
#: src/pages/ActivityList.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Needs you"
msgstr ""
@ -3430,7 +3432,7 @@ msgstr "待办"
msgid "OpenAI-compatible server URL"
msgstr "OpenAI 兼容服务器 URL"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Opened its thread."
msgstr "已打开其对话。"
@ -3671,19 +3673,19 @@ msgstr ""
msgid "Quiet hours start"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Quote"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "React"
msgstr "回应"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reactions"
msgstr "表情回应"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Read aloud"
msgstr ""
@ -3788,7 +3790,7 @@ msgstr ""
msgid "Region"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Release"
msgstr "释放"
@ -3812,7 +3814,7 @@ msgid "Remove"
msgstr "移除"
#. placeholder {0}: attachment.file.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove {0}"
msgstr "移除 {0}"
@ -3821,7 +3823,7 @@ msgid "Remove Git event"
msgstr ""
#. placeholder {0}: mention.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove mention {0}"
msgstr "移除提及 {0}"
@ -3834,7 +3836,7 @@ msgid "Remove schedule"
msgstr "移除计划"
#. placeholder {0}: selectedSkill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Remove skill {0}"
msgstr "移除技能 {0}"
@ -3842,7 +3844,7 @@ msgstr "移除技能 {0}"
msgid "Remove webhook"
msgstr "移除 Webhook"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Removed with chat, computer, and memory."
msgstr "已连同对话、电脑和记忆一起移除。"
@ -3875,15 +3877,15 @@ msgstr "替换 API 密钥"
msgid "Replace key"
msgstr "替换密钥"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Reply"
msgstr "回复"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}"
msgstr "正在回复 {replyName}"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Replying to {replyName}: “{replyQuote}”"
msgstr ""
@ -4142,7 +4144,7 @@ msgstr ""
msgid "Self-hosted (better-auth)"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/message-cards.tsx
msgid "Send"
msgstr "发送"
@ -4193,7 +4195,7 @@ msgid "Server URL"
msgstr "服务器 URL"
#: src/components/stage/StageVoiceEntry.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Set up voice"
msgstr ""
@ -4203,11 +4205,11 @@ msgstr ""
msgid "Settings"
msgstr "设置"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: General"
msgstr "设置:通用"
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Settings: Usage"
msgstr "设置:用量"
@ -4299,7 +4301,7 @@ msgid "Sketching the blueprint…"
msgstr ""
#. placeholder {0}: skill.name
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Skill {0}"
msgstr "技能 {0}"
@ -4311,7 +4313,7 @@ msgstr "技能"
#: src/components/onboarding/OnboardingScanStep.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
#: src/lib/onboarding-copy.ts
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Skip"
msgstr "跳过"
@ -4365,11 +4367,11 @@ msgstr "工作区默认"
msgid "Spaces"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "朗读"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Speak this reply"
msgstr "朗读这条回复"
@ -4423,15 +4425,15 @@ msgstr "开始录制"
msgid "Start talking"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation — {activeName} is on stage above."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Start the conversation."
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
msgid "Start voice conversation"
msgstr ""
@ -4459,10 +4461,12 @@ msgstr "步骤"
#: src/components/browser/InAppBrowser.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/composer.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop"
msgstr "停止"
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Stop speaking"
msgstr "停止朗读"
@ -4492,7 +4496,7 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "子 Agent"
@ -4557,7 +4561,7 @@ msgstr "正在示范,发送新消息前请先停止示范。"
msgid "Team"
msgstr "团队"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "Team Computer"
msgstr "团队电脑"
@ -4598,7 +4602,7 @@ msgstr "所选记忆提供方在此构建中不可用。"
msgid "Thinking"
msgstr "思考"
#: src/pages/Shell.tsx
#: src/pages/shell/computer-screen.tsx
msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder."
msgstr "此 Bot 运行在这台电脑上,而不是 Linux 桌面。Shell 和文件使用你的主目录。"
@ -4705,7 +4709,7 @@ msgid "Transcribe"
msgstr ""
#: src/components/voice/VoiceStage.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/transcript.tsx
msgid "Transcript"
msgstr ""
@ -4869,8 +4873,8 @@ msgid "Video workflow"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Voice"
msgstr "语音"
@ -5066,7 +5070,7 @@ msgstr "处理中…"
msgid "Working…"
msgstr "处理中…"
#: src/pages/Shell.tsx
#: src/pages/shell/roster-format.ts
msgid "Yesterday"
msgstr "昨天"

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,20 @@
export function collapsedSidebarSectionsStorageKey(
userId: string | null | undefined,
): string | null {
if (!userId) return null;
return `rakazo:collapsed-sidebar-sections:${userId}`;
}
export function readCollapsedSidebarSections(userId: string | null | undefined): Set<string> {
const storageKey = collapsedSidebarSectionsStorageKey(userId);
if (!storageKey) return new Set();
try {
const value = window.localStorage.getItem(storageKey);
const keys: unknown = value ? JSON.parse(value) : [];
return new Set(
Array.isArray(keys) ? keys.filter((key): key is string => typeof key === "string") : [],
);
} catch {
return new Set();
}
}

View File

@ -0,0 +1,805 @@
import { t } from "@lingui/core/macro";
import { Trans, useLingui } from "@lingui/react/macro";
import type { AgentSkillCatalogEntry, ThreadMessage } from "@rakazo/contracts";
import { ATTACHMENT_ALLOWED_MIME_TYPES } from "@rakazo/contracts";
import type { ComposerMention, SlashActionId } from "@rakazo/core";
import {
clampMentionHighlightIndex,
mentionChipKey,
resolveMentionPickerKey,
SLASH_ACTIONS,
serializeComposerPrompt,
truncateSlashDescription,
} from "@rakazo/core";
import { BotAvatar, Button } from "@rakazo/ui-web";
import {
ArrowUp,
Box,
Clock,
Mic,
Paperclip,
Plus,
Puzzle,
Settings,
Square,
X,
} from "lucide-react";
import type { ClipboardEvent, DragEvent, RefObject } from "react";
import { memo, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
import { VoiceAuroraRim } from "../../components/voice/VoiceAurora";
import { isFileDrag, isFilePaste } from "../../lib/pending-attachments";
import { previewMessageText } from "./message-preview";
import type { PendingAttachment } from "./shell-types";
import { FALLBACK_BOT_COLOR } from "./shell-types";
const ATTACHMENT_ACCEPT = ATTACHMENT_ALLOWED_MIME_TYPES.join(",");
export const Composer = memo(function Composer({
running,
disabled,
pendingAttachments,
attachmentNotice,
sendError,
runError,
runErrorId,
onRunErrorPresented,
onDismissError,
sending,
fileInputRef,
onAttachmentPick,
onRemoveAttachment,
onSend,
onStop,
onVoice,
voiceReady = false,
voiceColor,
replyTarget,
replyQuote,
replyTargetName,
onClearReply,
mentionTargets,
agentSkills,
onSlashOpen,
onSlashAction,
}: {
running: boolean;
disabled?: boolean;
pendingAttachments: PendingAttachment[];
attachmentNotice: string | null;
sendError: string | null;
runError: string | null;
runErrorId: string | null;
onRunErrorPresented: (runId: string) => void;
onDismissError: () => void;
sending: boolean;
fileInputRef: RefObject<HTMLInputElement | null>;
onAttachmentPick: (files: FileList | null) => void | Promise<void>;
onRemoveAttachment: (attachment: PendingAttachment) => void;
onSend: (text: string, mentions?: ComposerMention[]) => Promise<void>;
onStop: () => Promise<void>;
onVoice?: () => void;
voiceReady?: boolean;
voiceColor?: string;
replyTarget?: ThreadMessage | null;
replyQuote?: string | null;
replyTargetName?: string;
onClearReply?: () => void;
mentionTargets?: ComposerMention[];
agentSkills?: AgentSkillCatalogEntry[];
onSlashOpen?: () => void;
onSlashAction?: (action: SlashActionId) => void;
}) {
const { t } = useLingui();
const [draft, setDraft] = useState("");
const [mentionQuery, setMentionQuery] = useState<string | null>(null);
const [mentionHighlightIndex, setMentionHighlightIndex] = useState(0);
const [slashQuery, setSlashQuery] = useState<string | null>(null);
const [selectedSkill, setSelectedSkill] = useState<AgentSkillCatalogEntry | null>(null);
const [selectedMentions, setSelectedMentions] = useState<ComposerMention[]>([]);
const textareaRef = useRef<HTMLTextAreaElement>(null);
const runErrorRef = useRef<HTMLDivElement>(null);
const submitFingerprint = useRef<string | null>(null);
useEffect(() => {
if (!sendError && !runError) return;
const timer = setTimeout(() => {
onDismissError();
}, 8000);
return () => clearTimeout(timer);
}, [sendError, runError, onDismissError]);
const presentedRunErrorIdRef = useRef<string | null>(null);
const mentionListboxId = useId();
const dragDepth = useRef(0);
const [draggingFiles, setDraggingFiles] = useState(false);
const canSend =
draft.trim().length > 0 ||
selectedSkill !== null ||
selectedMentions.length > 0 ||
pendingAttachments.length > 0;
useEffect(() => {
if (!runError || !runErrorId) return;
const currentRunErrorId = runErrorId;
let frame = 0;
function recordIfPresented() {
cancelAnimationFrame(frame);
frame = requestAnimationFrame(() => {
const element = runErrorRef.current;
if (!element || document.visibilityState !== "visible") return;
const rect = element.getBoundingClientRect();
const topElement = document.elementFromPoint(
rect.left + rect.width / 2,
rect.top + rect.height / 2,
);
if (topElement && (topElement === element || element.contains(topElement))) {
if (presentedRunErrorIdRef.current === currentRunErrorId) return;
presentedRunErrorIdRef.current = currentRunErrorId;
onRunErrorPresented(currentRunErrorId);
}
});
}
recordIfPresented();
const observer = new MutationObserver(recordIfPresented);
observer.observe(document.body, { childList: true, subtree: true });
document.addEventListener("transitionend", recordIfPresented);
document.addEventListener("visibilitychange", recordIfPresented);
return () => {
cancelAnimationFrame(frame);
observer.disconnect();
document.removeEventListener("transitionend", recordIfPresented);
document.removeEventListener("visibilitychange", recordIfPresented);
};
}, [onRunErrorPresented, runError, runErrorId]);
useLayoutEffect(() => {
const el = textareaRef.current;
if (!el) return;
function syncHeight() {
const textarea = textareaRef.current;
if (!textarea) return;
textarea.style.height = "0px";
textarea.style.height = `${textarea.scrollHeight}px`;
}
syncHeight();
let lastWidth = el.getBoundingClientRect().width;
const observer = new ResizeObserver(() => {
const textarea = textareaRef.current;
if (!textarea) return;
const width = textarea.getBoundingClientRect().width;
if (width === lastWidth) return;
lastWidth = width;
syncHeight();
});
observer.observe(el);
return () => observer.disconnect();
}, [draft]);
function updateDraft(value: string) {
submitFingerprint.current = null;
setDraft(value);
const mentionMatch = /(?:^|\s)@([\w-]*)$/.exec(value);
setMentionQuery(mentionMatch ? (mentionMatch[1] ?? "") : null);
// `/` only at the start of the draft so forced skills expand (`Use skill:` / `/Name` prefix).
const slashMatch = selectedSkill === null ? /^\/([^\n]*)$/.exec(value) : null;
const nextSlash = slashMatch ? (slashMatch[1] ?? "") : null;
if (nextSlash !== null && slashQuery === null) onSlashOpen?.();
setSlashQuery(nextSlash);
}
function focusComposer() {
textareaRef.current?.focus();
}
function insertMention(mention: ComposerMention) {
setDraft((current) => current.replace(/@([\w-]*)$/, ""));
setMentionQuery(null);
setMentionHighlightIndex(0);
setSelectedMentions((current) =>
current.some((selected) => mentionChipKey(selected) === mentionChipKey(mention))
? current
: [...current, mention],
);
focusComposer();
}
function insertSkill(skill: AgentSkillCatalogEntry) {
setSelectedSkill(skill);
setDraft("");
setSlashQuery(null);
}
function runSlashAction(action: SlashActionId) {
setDraft("");
setSlashQuery(null);
onSlashAction?.(action);
}
function removeLastChip() {
if (selectedMentions.length > 0) {
setSelectedMentions((current) => current.slice(0, -1));
return;
}
if (selectedSkill) setSelectedSkill(null);
}
const mentionOptions = useMemo(() => {
if (mentionQuery === null || !mentionTargets?.length) return [];
const query = mentionQuery.trim().toLowerCase();
return mentionTargets
.filter((target) => !query || target.name.toLowerCase().startsWith(query))
.slice(0, 10);
}, [mentionQuery, mentionTargets]);
useEffect(() => {
setMentionHighlightIndex(0);
}, [mentionQuery]);
const activeMentionIndex = clampMentionHighlightIndex(
mentionHighlightIndex,
mentionOptions.length,
);
const mentionPickerOpen = mentionOptions.length > 0;
const activeMentionOptionId = mentionPickerOpen
? `${mentionListboxId}-option-${activeMentionIndex}`
: undefined;
const slashSkillOptions = useMemo(() => {
if (slashQuery === null) return [];
const query = slashQuery.trim().toLowerCase();
const skills = agentSkills ?? [];
return skills
.filter((skill) => {
if (!query) return true;
return (
skill.name.toLowerCase().includes(query) ||
skill.description.toLowerCase().includes(query)
);
})
.slice(0, 8);
}, [agentSkills, slashQuery]);
const slashActionOptions = useMemo(() => {
if (slashQuery === null) return [];
const query = slashQuery.trim().toLowerCase();
return SLASH_ACTIONS.filter((action) => !query || action.label.toLowerCase().includes(query));
}, [slashQuery]);
const showSlashPicker =
slashQuery !== null &&
mentionQuery === null &&
(slashSkillOptions.length > 0 || slashActionOptions.length > 0);
function send() {
if (!canSend || disabled) return;
const text = serializeComposerPrompt(draft, selectedSkill, selectedMentions);
const fingerprint = [text, ...selectedMentions.map((mention) => mentionChipKey(mention))].join(
"\n",
);
if (submitFingerprint.current === fingerprint) return;
submitFingerprint.current = fingerprint;
setDraft("");
setMentionQuery(null);
setMentionHighlightIndex(0);
setSlashQuery(null);
setSelectedSkill(null);
const mentions = selectedMentions;
setSelectedMentions([]);
void onSend(text, mentions);
}
function handleDragEnter(event: DragEvent<HTMLFieldSetElement>) {
const dataTransfer = event.dataTransfer;
if (!isFileDrag(dataTransfer)) return;
event.preventDefault();
if (disabled) {
dragDepth.current = 0;
setDraggingFiles(false);
return;
}
dragDepth.current += 1;
setDraggingFiles(true);
}
function handleDragOver(event: DragEvent<HTMLFieldSetElement>) {
const dataTransfer = event.dataTransfer;
if (!isFileDrag(dataTransfer)) return;
event.preventDefault();
dataTransfer.dropEffect = disabled ? "none" : "copy";
if (disabled) {
dragDepth.current = 0;
setDraggingFiles(false);
return;
}
setDraggingFiles(true);
}
function handleDragLeave(event: DragEvent<HTMLFieldSetElement>) {
if (!isFileDrag(event.dataTransfer)) return;
if (disabled) {
dragDepth.current = 0;
setDraggingFiles(false);
return;
}
dragDepth.current = Math.max(0, dragDepth.current - 1);
if (dragDepth.current === 0) setDraggingFiles(false);
}
function handleDrop(event: DragEvent<HTMLFieldSetElement>) {
const dataTransfer = event.dataTransfer;
if (!isFileDrag(dataTransfer)) return;
event.preventDefault();
dragDepth.current = 0;
setDraggingFiles(false);
if (!disabled) void onAttachmentPick(dataTransfer.files);
}
function handlePaste(event: ClipboardEvent<HTMLTextAreaElement>) {
const clipboardData = event.clipboardData;
// Only intercept real FileList pastes; leave text-only / empty-files native.
if (disabled || !clipboardData || !isFilePaste(clipboardData)) return;
event.preventDefault();
void onAttachmentPick(clipboardData.files);
const text = clipboardData.getData("text/plain");
if (!text) return;
const textarea = event.currentTarget;
const start = textarea.selectionStart;
const end = textarea.selectionEnd;
updateDraft(`${draft.slice(0, start)}${text}${draft.slice(end)}`);
const caret = start + text.length;
window.requestAnimationFrame(() => {
textareaRef.current?.setSelectionRange(caret, caret);
});
}
const showComposerPlaceholder =
draft.length === 0 && selectedSkill === null && selectedMentions.length === 0;
const replyName = replyTarget ? (replyTargetName ?? previewMessageText(replyTarget)) : "";
return (
<fieldset
aria-label={t`Message composer`}
data-dragging={draggingFiles ? "files" : undefined}
onDragEnter={handleDragEnter}
onDragOver={handleDragOver}
onDragLeave={handleDragLeave}
onDrop={handleDrop}
className={`relative z-30 m-0 min-w-0 border-0 px-3 pb-4 pt-3 md:px-6 md:pb-6 ${
draggingFiles ? "rounded-[14px] ring-2 ring-inset ring-ring" : ""
}`}
>
<div className="mx-auto w-full max-w-4xl">
{sendError || runError ? (
<div
ref={runErrorRef}
role="alert"
data-testid="composer-error"
className="mb-3 flex items-center gap-2 rounded-[14px] border border-destructive/40 bg-destructive/10 px-4 py-2 text-ui-body-sm text-destructive"
>
<span className="min-w-0 flex-1">{sendError ?? runError}</span>
<button
type="button"
aria-label={t`Dismiss error`}
data-testid="composer-error-dismiss"
onClick={() => {
onDismissError();
window.requestAnimationFrame(() => textareaRef.current?.focus());
}}
className="shrink-0 text-destructive hover:text-foreground"
>
<X strokeWidth={2} className="size-icon-sm" />
</button>
</div>
) : null}
{replyTarget ? (
<div
data-testid="reply-chip"
className="mb-2 flex items-center gap-2 rounded-full border border-border bg-muted px-3 py-1.5 text-ui-body-sm text-foreground/75"
>
<span className="min-w-0 flex-1 truncate text-muted-foreground">
{replyQuote
? t`Replying to ${replyName}: “${replyQuote}”`
: t`Replying to ${replyName}`}
</span>
<button
type="button"
aria-label={t`Cancel reply`}
onClick={onClearReply}
className="shrink-0 text-muted-foreground hover:text-foreground"
>
<X strokeWidth={2} className="size-icon-sm" />
</button>
</div>
) : null}
{attachmentNotice ? (
<div className="mb-3 rounded-[14px] border border-warning/40 bg-warning/10 px-4 py-2 text-ui-body-sm text-warning">
{attachmentNotice}
</div>
) : null}
{pendingAttachments.length ? (
<div className="mb-3 flex flex-wrap gap-2">
{pendingAttachments.map((attachment) => (
<div
key={attachment.id}
className="flex items-center gap-2 rounded-full border border-border bg-muted px-3 py-1.5 text-ui-body-sm text-foreground/75"
>
{attachment.previewUrl ? (
<img
src={attachment.previewUrl}
alt={attachment.file.name}
className="size-control-md rounded object-cover"
/>
) : (
<Paperclip strokeWidth={1.8} className="size-icon-md" />
)}
<span className="max-w-[180px] truncate" dir="auto">
{attachment.file.name}
</span>
<button
type="button"
aria-label={t`Remove ${attachment.file.name}`}
onClick={() => onRemoveAttachment(attachment)}
className="text-muted-foreground hover:text-foreground"
>
<X strokeWidth={2} className="size-icon-sm" />
</button>
</div>
))}
</div>
) : null}
{mentionPickerOpen ? (
<div
id={mentionListboxId}
role="listbox"
aria-label={t`Mentions`}
data-testid="mention-picker"
className="mb-2 max-h-64 overflow-y-auto rounded-[14px] border border-border bg-muted"
>
{mentionOptions.map((mention, index) => {
const optionId = `${mentionListboxId}-option-${index}`;
const highlighted = index === activeMentionIndex;
return (
<button
id={optionId}
key={mentionChipKey(mention)}
type="button"
role="option"
aria-selected={highlighted}
aria-label={`@${mention.name}`}
data-mention-name={mention.name}
onMouseDown={(event) => event.preventDefault()}
onClick={() => insertMention(mention)}
onMouseEnter={() => setMentionHighlightIndex(index)}
className={`flex w-full items-start gap-3 px-4 py-2.5 text-start hover:bg-accent ${
highlighted ? "bg-accent" : ""
}`}
>
<span aria-hidden="true">
<MentionOptionIcon mention={mention} />
</span>
<span className="min-w-0">
<span dir="auto" className="block text-ui-body text-foreground">
@{mention.name}
</span>
{mention.subtitle ? (
<span
dir="auto"
aria-hidden="true"
className="block truncate text-ui-body-sm text-muted-foreground"
>
{mention.subtitle}
</span>
) : null}
</span>
</button>
);
})}
</div>
) : null}
{showSlashPicker ? (
<div
data-testid="slash-picker"
className="mb-2 overflow-hidden rounded-[14px] border border-border bg-muted"
>
{slashSkillOptions.map((skill) => (
<button
key={skill.id}
type="button"
aria-label={t`Skill ${skill.name}`}
onClick={() => insertSkill(skill)}
className="flex w-full items-start gap-3 px-4 py-2.5 text-start hover:bg-accent"
>
<Box
strokeWidth={1.7}
className="mt-0.5 shrink-0 text-muted-foreground size-icon-md"
/>
<span className="min-w-0">
<span dir="auto" className="block text-ui-body text-foreground">
{skill.name}
</span>
<span dir="auto" className="block truncate text-ui-body-sm text-muted-foreground">
{truncateSlashDescription(skill.description)}
</span>
</span>
</button>
))}
{slashActionOptions.map((action) => {
const label = slashActionLabel(action.id);
return (
<button
key={action.id}
type="button"
aria-label={label}
onClick={() => runSlashAction(action.id)}
className="flex w-full items-center gap-3 px-4 py-2.5 text-start hover:bg-accent"
>
<Settings
strokeWidth={1.7}
className="shrink-0 text-muted-foreground size-icon-md"
/>
<span className="text-ui-body text-foreground">{label}</span>
</button>
);
})}
</div>
) : null}
<div
data-testid="composer-bar"
className="apple-island relative flex items-center gap-3.5 rounded-[30px] py-3 pe-3.5 ps-4 transition-all duration-200"
>
<input
ref={fileInputRef}
type="file"
multiple
accept={ATTACHMENT_ACCEPT}
className="hidden"
onChange={(event) => void onAttachmentPick(event.target.files)}
/>
<Button
variant="ghost"
size="icon"
aria-label={t`Attach file`}
disabled={disabled}
onClick={() => fileInputRef.current?.click()}
className="tactile-press size-10 shrink-0 rounded-full border border-border bg-foreground/5 text-foreground/80 transition-all hover:bg-foreground/10 hover:text-foreground flex items-center justify-center cursor-pointer"
>
<Plus strokeWidth={2.2} className="size-icon-lg" />
</Button>
<div className="flex min-w-0 flex-1 flex-wrap items-end gap-1.5">
{selectedSkill ? (
<span
data-testid="skill-chip"
className="inline-flex max-w-full items-center gap-1.5 rounded-full border border-border bg-foreground/[0.08] px-3 py-1 text-ui-body font-medium text-foreground backdrop-blur-md"
>
<Box strokeWidth={1.8} className="shrink-0 text-muted-foreground size-icon-md" />
<span dir="auto" className="truncate">
{selectedSkill.name}
</span>
<button
type="button"
aria-label={t`Remove skill ${selectedSkill.name}`}
onClick={() => setSelectedSkill(null)}
className="text-muted-foreground hover:text-foreground transition-colors"
>
<X strokeWidth={2} className="size-icon-sm" />
</button>
</span>
) : null}
{selectedMentions.map((mention) => (
<span
key={mentionChipKey(mention)}
data-testid="mention-chip"
data-mention-kind={mention.kind}
className="inline-flex max-w-full items-center gap-1.5 rounded-full border border-border bg-foreground/[0.08] px-3 py-1 text-ui-body font-medium text-foreground backdrop-blur-md"
>
<MentionChipIcon mention={mention} />
<span dir="auto" className="truncate">
{mention.name}
</span>
<button
type="button"
aria-label={t`Remove mention ${mention.name}`}
onClick={() =>
setSelectedMentions((current) =>
current.filter(
(selected) => mentionChipKey(selected) !== mentionChipKey(mention),
),
)
}
className="text-muted-foreground hover:text-foreground transition-colors"
>
<X strokeWidth={2} className="size-icon-sm" />
</button>
</span>
))}
<textarea
ref={textareaRef}
value={draft}
onChange={(event) => updateDraft(event.target.value)}
onPaste={handlePaste}
onKeyDown={(event) => {
if (
event.key === "Backspace" &&
draft.length === 0 &&
(selectedSkill !== null || selectedMentions.length > 0)
) {
event.preventDefault();
removeLastChip();
return;
}
const action = resolveMentionPickerKey({
key: event.key,
shiftKey: event.shiftKey,
isComposing: event.nativeEvent.isComposing || event.keyCode === 229,
optionCount: mentionOptions.length,
highlightedIndex: activeMentionIndex,
});
if (action.type === "complete") {
const mention = mentionOptions[action.index];
if (!mention) return;
event.preventDefault();
insertMention(mention);
return;
}
if (action.type === "move") {
event.preventDefault();
setMentionHighlightIndex(action.index);
return;
}
if (action.type === "dismiss") {
event.preventDefault();
setMentionQuery(null);
setMentionHighlightIndex(0);
return;
}
if (action.type === "send") {
event.preventDefault();
send();
}
}}
disabled={disabled}
placeholder={showComposerPlaceholder ? t`Message…` : undefined}
aria-label={t`Message`}
role="combobox"
aria-autocomplete="list"
aria-haspopup="listbox"
aria-expanded={mentionPickerOpen ? "true" : "false"}
aria-controls={mentionPickerOpen ? mentionListboxId : undefined}
aria-activedescendant={activeMentionOptionId}
name="chat-message"
autoComplete="off"
dir="auto"
rows={1}
className="max-h-36 min-h-[28px] min-w-[8rem] flex-1 resize-none overflow-y-auto bg-transparent py-1 text-[16.5px] leading-[1.55] text-foreground outline-none placeholder:text-muted-foreground/75 disabled:opacity-40 font-normal"
/>
</div>
{onVoice ? (
<Button
variant="outline"
aria-label={t`Voice`}
title={voiceReady ? t`Start voice conversation` : t`Set up voice`}
disabled={disabled}
onClick={onVoice}
data-testid="composer-voice-primary"
className={`tactile-press h-control-lg shrink-0 gap-2 rounded-full px-4 sm:px-5 flex items-center justify-center cursor-pointer transition-all ${
voiceReady
? "relative overflow-hidden border-border bg-foreground/5 text-foreground hover:bg-foreground/10"
: "border-border bg-foreground/5 text-foreground/80 hover:bg-foreground/10"
}`}
>
{voiceReady ? (
<VoiceAuroraRim botColor={voiceColor} className="inset-x-[14%] h-0.5 blur-[3px]" />
) : null}
<Mic strokeWidth={1.9} className="size-icon-lg shrink-0" />
<span className="hidden text-ui-body font-semibold sm:inline">
<Trans>Voice</Trans>
</span>
</Button>
) : null}
{running ? (
<div className="flex items-center gap-2 shrink-0">
<Button
size="icon"
aria-label={t`Send`}
disabled={!canSend || disabled}
onClick={send}
className="tactile-press size-10 rounded-full transition-transform active:scale-90 flex items-center justify-center cursor-pointer"
>
<ArrowUp strokeWidth={2.6} className="size-icon-lg" />
</Button>
<Button
variant="outline"
size="icon"
aria-label={t`Stop`}
disabled={sending}
onClick={() => void onStop()}
className="tactile-press size-10 rounded-full border border-border bg-foreground/[0.08] text-foreground/90 shadow-sm transition-colors hover:bg-foreground/15 hover:text-foreground flex items-center justify-center cursor-pointer"
>
<Square strokeWidth={0} fill="currentColor" className="size-icon-sm" />
</Button>
</div>
) : (
<Button
size="icon"
aria-label={t`Send`}
disabled={!canSend || disabled}
onClick={send}
className="tactile-press size-10 shrink-0 rounded-full transition-all active:scale-90 disabled:bg-foreground/[0.08] disabled:text-foreground/20 flex items-center justify-center cursor-pointer"
>
<ArrowUp strokeWidth={2.6} className="size-icon-lg" />
</Button>
)}
</div>
</div>
</fieldset>
);
});
function slashActionLabel(id: SlashActionId) {
switch (id) {
case "chat-settings":
return t`Chat Settings`;
case "settings-general":
return t`Settings: General`;
case "settings-usage":
return t`Settings: Usage`;
}
}
function MentionOptionIcon({ mention }: { mention: ComposerMention }) {
if (mention.kind === "routine") {
return (
<Clock strokeWidth={1.7} className="mt-0.5 shrink-0 text-muted-foreground size-icon-md" />
);
}
if (mention.kind === "connector") {
return (
<Puzzle strokeWidth={1.7} className="mt-0.5 shrink-0 text-muted-foreground size-icon-md" />
);
}
if (mention.kind === "group") {
return (
<span className="mt-0.5 grid h-4 w-4 shrink-0 place-items-center rounded-full bg-accent text-ui-caption text-foreground/75">
G
</span>
);
}
if (mention.kind === "everyone") {
return (
<span className="mt-0.5 grid h-4 w-4 shrink-0 place-items-center rounded-full bg-accent text-ui-caption text-foreground/75">
@
</span>
);
}
return (
<BotAvatar
color={mention.color ?? FALLBACK_BOT_COLOR}
identity={mention.id}
className="size-icon-md"
/>
);
}
function MentionChipIcon({ mention }: { mention: ComposerMention }) {
if (mention.kind === "routine") {
return <Clock strokeWidth={1.7} className="shrink-0 text-muted-foreground/70 size-icon-sm" />;
}
if (mention.kind === "connector") {
return <Puzzle strokeWidth={1.7} className="shrink-0 text-muted-foreground/70 size-icon-sm" />;
}
if (mention.kind === "group" || mention.kind === "everyone") {
return (
<span className="grid h-4 w-4 shrink-0 place-items-center rounded-full bg-accent text-ui-caption text-foreground/75">
{mention.kind === "group" ? "G" : "@"}
</span>
);
}
return (
<BotAvatar
color={mention.color ?? FALLBACK_BOT_COLOR}
identity={mention.id}
className="size-icon-md"
/>
);
}

View File

@ -0,0 +1,83 @@
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import type { ComputerReleaseReason, ComputerStatus } from "@rakazo/contracts";
import { Button } from "@rakazo/ui-web";
export function ComputerReleaseActions({
takeoverRequested,
onRelease,
}: {
takeoverRequested: boolean;
onRelease: (reason?: ComputerReleaseReason) => Promise<void>;
}) {
if (!takeoverRequested) {
return (
<Button type="button" variant="outline" size="sm" onClick={() => void onRelease()}>
<Trans>Release</Trans>
</Button>
);
}
return (
<div className="flex items-center gap-2">
<Button type="button" variant="outline" size="sm" onClick={() => void onRelease("skipped")}>
<Trans>Skip</Trans>
</Button>
<Button type="button" size="sm" onClick={() => void onRelease("done")}>
<Trans>I’m done</Trans>
</Button>
</div>
);
}
export function embeddableScreenUrl(url: string | null): string | null {
if (!url) return null;
try {
const parsed = new URL(url, window.location.href);
const page = new URL(window.location.href);
const local = parsed.hostname === "127.0.0.1" || parsed.hostname === "localhost";
const pagePort = page.port || (page.protocol === "https:" ? "443" : "80");
if (local && parsed.port && parsed.port !== pagePort) {
return null;
}
return parsed.toString();
} catch {
return url;
}
}
export function screenIframeSandbox(url: string | null) {
if (!url) return undefined;
try {
return new URL(url, window.location.href).pathname.startsWith("/novnc/")
? "allow-scripts allow-pointer-lock"
: undefined;
} catch {
return undefined;
}
}
export function DesktopKindEmptyState({ className }: { className?: string }) {
return (
<div className={className}>
<Trans>
This bot runs on this computer, not a Linux desktop. Shell and files use your home folder.
</Trans>
</div>
);
}
export function computerPlaceholder(
state: ComputerStatus["state"] | undefined,
booting: boolean,
label: string,
) {
if (state === "booting" || booting) return t`Booting live desktop…`;
if (state === "running") return label;
if (state === "suspended") return t`Computer is asleep. Open it to wake.`;
if (state === "error") return t`Computer failed to boot`;
return t`Computer is stopped`;
}
export function computerLabel(mode: ComputerStatus["mode"] | undefined, botName: string) {
return mode === "dedicated" ? t`${botName}’s computer` : t`Team Computer`;
}

View File

@ -0,0 +1,17 @@
import { t } from "@lingui/core/macro";
import type { ThreadMessage } from "@rakazo/contracts";
const ATTACHMENT_BLOCK_KINDS = new Set(["image", "file", "video", "audio", "media"]);
export function previewMessageText(message: ThreadMessage): string {
const text = message.blocks
.map((block) => (block.kind === "text" || block.kind === "channel_message" ? block.text : ""))
.filter(Boolean)
.join(" ")
.trim();
if (text) return text;
if (message.blocks.some((block) => ATTACHMENT_BLOCK_KINDS.has(block.kind))) {
return t`Attachment`;
}
return t`Message`;
}

View File

@ -0,0 +1,57 @@
import { i18n } from "@lingui/core";
import { t } from "@lingui/core/macro";
export function stripSpaceTitlePrefix(title: string | null, spaceName: string): string | null {
if (!title) return null;
const prefix = `${spaceName} · `;
if (title.startsWith(prefix)) return title.slice(prefix.length);
if (title === spaceName) return null;
return title;
}
export function formatRosterTime(isoDate?: string | null): string {
if (!isoDate) return "";
try {
const d = new Date(isoDate);
if (Number.isNaN(d.getTime())) return "";
const locale = i18n.locale || "en";
const now = new Date();
const isToday =
d.getDate() === now.getDate() &&
d.getMonth() === now.getMonth() &&
d.getFullYear() === now.getFullYear();
if (isToday) {
return d.toLocaleTimeString(locale, { hour: "numeric", minute: "2-digit" });
}
const yesterday = new Date(now);
yesterday.setDate(now.getDate() - 1);
const isYesterday =
d.getDate() === yesterday.getDate() &&
d.getMonth() === yesterday.getMonth() &&
d.getFullYear() === yesterday.getFullYear();
if (isYesterday) return t`Yesterday`;
const diffDays = Math.floor((now.getTime() - d.getTime()) / (1000 * 60 * 60 * 24));
if (diffDays < 7) {
return d.toLocaleDateString(locale, { weekday: "short" });
}
return d.toLocaleDateString(locale, { month: "short", day: "numeric" });
} catch {
return "";
}
}
export function cleanRosterPreview(raw?: string | null): string {
if (!raw) return "";
let text = raw;
// Strip markdown headings
text = text.replace(/^#{1,6}\s+/gm, "");
// Strip routing tokens [to ...] and system protocols [RECOVERY PROTOCOL], [PO ...]
text = text.replace(/\[(?:to|RECOVERY PROTOCOL|PO)[^\]]*\]/gi, "");
// Strip bold/italic/code markers
text = text.replace(/[*_`#]/g, "");
// Strip escape backslashes
text = text.replace(/\\/g, "");
// Collapse whitespace
text = text.replace(/\s+/g, " ").trim();
return text;
}

View File

@ -0,0 +1,9 @@
export type PendingAttachment = {
id: string;
threadKey: string;
file: File;
previewUrl?: string;
};
/** Identity colour for bots the roster no longer knows about. */
export const FALLBACK_BOT_COLOR = "#85858A";

View File

@ -0,0 +1,52 @@
import type { Bot, ComputerStatus, Group, ProductEvent, ThreadSnapshot } from "@rakazo/contracts";
import type { MutableRefObject } from "react";
import {
isComputerStatusEvent,
isThreadSnapshotEvent,
reduceComputerStatus,
reduceThreadSnapshot,
} from "../../lib/thread-events";
const THREAD_SNAPSHOT_TIMEOUT_MS = 2_000;
export function threadSnapshotSignal(parent: AbortSignal): AbortSignal {
return AbortSignal.any([parent, AbortSignal.timeout(THREAD_SNAPSHOT_TIMEOUT_MS)]);
}
export function firstThreadRoute(
bots: readonly Pick<Bot, "id">[],
groups: readonly Pick<Group, "id" | "kind">[],
/** In a project the user lands in its main conversation. */
inProject = false,
): string {
const main = inProject ? groups.find((group) => group.kind === "main") : undefined;
if (main) return `/app/g/${main.id}`;
if (bots[0]) return `/app/${bots[0].id}`;
if (groups[0]) return `/app/g/${groups[0].id}`;
return "/app";
}
export function applyThreadEvent(
event: ProductEvent,
commitSnapshot: (next: ThreadSnapshot | null) => void,
commitComputer: (next: ComputerStatus | null) => void,
snapshotRef: MutableRefObject<ThreadSnapshot | null>,
computerRef: MutableRefObject<ComputerStatus | null>,
) {
if (isThreadSnapshotEvent(event)) {
const next = reduceThreadSnapshot(snapshotRef.current, event);
commitSnapshot(next);
}
if (isComputerStatusEvent(event)) {
const next = reduceComputerStatus(computerRef.current, event);
commitComputer(next);
}
}
export function newClientNonce(): string {
const webCrypto = globalThis.crypto;
if (webCrypto && typeof webCrypto.randomUUID === "function") {
return webCrypto.randomUUID();
}
return `m-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
}

File diff suppressed because it is too large Load Diff