feat: ask ai (#936)

* feat: ask ai in ssh terminal
Fixes #934

* new(ask_ai): settings

* fix: app hot reload

* new: l10n

* chore: deps.

* opt.
This commit is contained in:
lollipopkit🏳️‍⚧️
2025-10-18 01:15:43 +08:00
committed by GitHub
parent 860c11d4a8
commit 729b76177e
40 changed files with 2050 additions and 108 deletions

View File

@@ -1747,6 +1747,102 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'After connecting to the server, a script will be written to `~/.config/server_box` \n | `/tmp/server_box` to monitor the system status. You can review the script content.'**
String get writeScriptTip;
/// No description provided for @askAi.
///
/// In en, this message translates to:
/// **'Ask AI'**
String get askAi;
/// No description provided for @askAiUsageHint.
///
/// In en, this message translates to:
/// **'Used in SSH Terminal'**
String get askAiUsageHint;
/// No description provided for @askAiBaseUrl.
///
/// In en, this message translates to:
/// **'Base URL'**
String get askAiBaseUrl;
/// No description provided for @askAiModel.
///
/// In en, this message translates to:
/// **'Model'**
String get askAiModel;
/// No description provided for @askAiApiKey.
///
/// In en, this message translates to:
/// **'API Key'**
String get askAiApiKey;
/// No description provided for @askAiConfigMissing.
///
/// In en, this message translates to:
/// **'Please configure {fields} in Settings.'**
String askAiConfigMissing(String fields);
/// No description provided for @askAiConfirmExecute.
///
/// In en, this message translates to:
/// **'Confirm before executing'**
String get askAiConfirmExecute;
/// No description provided for @askAiCommandInserted.
///
/// In en, this message translates to:
/// **'Command inserted into terminal'**
String get askAiCommandInserted;
/// No description provided for @askAiAwaitingResponse.
///
/// In en, this message translates to:
/// **'Waiting for AI response...'**
String get askAiAwaitingResponse;
/// No description provided for @askAiNoResponse.
///
/// In en, this message translates to:
/// **'No response'**
String get askAiNoResponse;
/// No description provided for @askAiRecommendedCommand.
///
/// In en, this message translates to:
/// **'AI suggested command'**
String get askAiRecommendedCommand;
/// No description provided for @askAiInsertTerminal.
///
/// In en, this message translates to:
/// **'Insert into terminal'**
String get askAiInsertTerminal;
/// No description provided for @askAiSelectedContent.
///
/// In en, this message translates to:
/// **'Selected content'**
String get askAiSelectedContent;
/// No description provided for @askAiConversation.
///
/// In en, this message translates to:
/// **'AI conversation'**
String get askAiConversation;
/// No description provided for @askAiFollowUpHint.
///
/// In en, this message translates to:
/// **'Ask a follow-up...'**
String get askAiFollowUpHint;
/// No description provided for @askAiSend.
///
/// In en, this message translates to:
/// **'Send'**
String get askAiSend;
}
class _AppLocalizationsDelegate

View File

@@ -923,4 +923,54 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get writeScriptTip =>
'Nach der Verbindung mit dem Server wird ein Skript in `~/.config/server_box` \n | `/tmp/server_box` geschrieben, um den Systemstatus zu überwachen. Sie können den Skriptinhalt überprüfen.';
@override
String get askAi => 'KI fragen';
@override
String get askAiUsageHint => 'Verwendet im SSH-Terminal';
@override
String get askAiBaseUrl => 'Basis-URL';
@override
String get askAiModel => 'Modell';
@override
String get askAiApiKey => 'API-Schlüssel';
@override
String askAiConfigMissing(String fields) {
return 'Bitte konfigurieren Sie $fields in den Einstellungen.';
}
@override
String get askAiConfirmExecute => 'Vor Ausführung bestätigen';
@override
String get askAiCommandInserted => 'Befehl ins Terminal eingefügt';
@override
String get askAiAwaitingResponse => 'Warte auf KI-Antwort...';
@override
String get askAiNoResponse => 'Keine Antwort';
@override
String get askAiRecommendedCommand => 'KI-empfohlener Befehl';
@override
String get askAiInsertTerminal => 'In Terminal einfügen';
@override
String get askAiSelectedContent => 'Ausgewählter Inhalt';
@override
String get askAiConversation => 'KI-Unterhaltung';
@override
String get askAiFollowUpHint => 'Weitere Frage stellen...';
@override
String get askAiSend => 'Senden';
}

View File

@@ -914,4 +914,54 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get writeScriptTip =>
'After connecting to the server, a script will be written to `~/.config/server_box` \n | `/tmp/server_box` to monitor the system status. You can review the script content.';
@override
String get askAi => 'Ask AI';
@override
String get askAiUsageHint => 'Used in SSH Terminal';
@override
String get askAiBaseUrl => 'Base URL';
@override
String get askAiModel => 'Model';
@override
String get askAiApiKey => 'API Key';
@override
String askAiConfigMissing(String fields) {
return 'Please configure $fields in Settings.';
}
@override
String get askAiConfirmExecute => 'Confirm before executing';
@override
String get askAiCommandInserted => 'Command inserted into terminal';
@override
String get askAiAwaitingResponse => 'Waiting for AI response...';
@override
String get askAiNoResponse => 'No response';
@override
String get askAiRecommendedCommand => 'AI suggested command';
@override
String get askAiInsertTerminal => 'Insert into terminal';
@override
String get askAiSelectedContent => 'Selected content';
@override
String get askAiConversation => 'AI conversation';
@override
String get askAiFollowUpHint => 'Ask a follow-up...';
@override
String get askAiSend => 'Send';
}

View File

@@ -925,4 +925,54 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get writeScriptTip =>
'Después de conectarse al servidor, se escribirá un script en `~/.config/server_box` \n | `/tmp/server_box` para monitorear el estado del sistema. Puedes revisar el contenido del script.';
@override
String get askAi => 'Preguntar a la IA';
@override
String get askAiUsageHint => 'Usado en el terminal SSH';
@override
String get askAiBaseUrl => 'URL base';
@override
String get askAiModel => 'Modelo';
@override
String get askAiApiKey => 'Clave API';
@override
String askAiConfigMissing(String fields) {
return 'Configura $fields en Ajustes.';
}
@override
String get askAiConfirmExecute => 'Confirmar antes de ejecutar';
@override
String get askAiCommandInserted => 'Comando insertado en el terminal';
@override
String get askAiAwaitingResponse => 'Esperando la respuesta de la IA...';
@override
String get askAiNoResponse => 'Sin respuesta';
@override
String get askAiRecommendedCommand => 'Comando sugerido por la IA';
@override
String get askAiInsertTerminal => 'Insertar en el terminal';
@override
String get askAiSelectedContent => 'Contenido seleccionado';
@override
String get askAiConversation => 'Conversación con la IA';
@override
String get askAiFollowUpHint => 'Haz una pregunta adicional...';
@override
String get askAiSend => 'Enviar';
}

View File

@@ -928,4 +928,54 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get writeScriptTip =>
'Après la connexion au serveur, un script sera écrit dans `~/.config/server_box` \n | `/tmp/server_box` pour surveiller l\'état du système. Vous pouvez examiner le contenu du script.';
@override
String get askAi => 'Demander à l\'IA';
@override
String get askAiUsageHint => 'Utilisé dans le terminal SSH';
@override
String get askAiBaseUrl => 'URL de base';
@override
String get askAiModel => 'Modèle';
@override
String get askAiApiKey => 'Clé API';
@override
String askAiConfigMissing(String fields) {
return 'Veuillez configurer $fields dans les paramètres.';
}
@override
String get askAiConfirmExecute => 'Confirmer avant d\'exécuter';
@override
String get askAiCommandInserted => 'Commande insérée dans le terminal';
@override
String get askAiAwaitingResponse => 'En attente de la réponse de l\'IA...';
@override
String get askAiNoResponse => 'Aucune réponse';
@override
String get askAiRecommendedCommand => 'Commande suggérée par l\'IA';
@override
String get askAiInsertTerminal => 'Insérer dans le terminal';
@override
String get askAiSelectedContent => 'Contenu sélectionné';
@override
String get askAiConversation => 'Conversation avec l\'IA';
@override
String get askAiFollowUpHint => 'Poser une question supplémentaire...';
@override
String get askAiSend => 'Envoyer';
}

View File

@@ -915,4 +915,54 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get writeScriptTip =>
'Setelah terhubung ke server, sebuah skrip akan ditulis ke `~/.config/server_box` \n | `/tmp/server_box` untuk memantau status sistem. Anda dapat meninjau konten skrip tersebut.';
@override
String get askAi => 'Tanya AI';
@override
String get askAiUsageHint => 'Digunakan di Terminal SSH';
@override
String get askAiBaseUrl => 'URL dasar';
@override
String get askAiModel => 'Model';
@override
String get askAiApiKey => 'Kunci API';
@override
String askAiConfigMissing(String fields) {
return 'Harap konfigurasikan $fields di Pengaturan.';
}
@override
String get askAiConfirmExecute => 'Konfirmasi sebelum menjalankan';
@override
String get askAiCommandInserted => 'Perintah dimasukkan ke terminal';
@override
String get askAiAwaitingResponse => 'Menunggu respons AI...';
@override
String get askAiNoResponse => 'Tidak ada respons';
@override
String get askAiRecommendedCommand => 'Perintah yang disarankan AI';
@override
String get askAiInsertTerminal => 'Masukkan ke terminal';
@override
String get askAiSelectedContent => 'Konten yang dipilih';
@override
String get askAiConversation => 'Percakapan AI';
@override
String get askAiFollowUpHint => 'Ajukan pertanyaan lanjutan...';
@override
String get askAiSend => 'Kirim';
}

View File

@@ -885,4 +885,54 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get writeScriptTip =>
'サーバーに接続すると、システムの状態を監視するためのスクリプトが `~/.config/server_box` \n | `/tmp/server_box` に書き込まれます。スクリプトの内容を確認できます。';
@override
String get askAi => 'AI に質問';
@override
String get askAiUsageHint => 'SSH ターミナルで使用';
@override
String get askAiBaseUrl => 'ベース URL';
@override
String get askAiModel => 'モデル';
@override
String get askAiApiKey => 'API キー';
@override
String askAiConfigMissing(String fields) {
return '設定で $fields を構成してください。';
}
@override
String get askAiConfirmExecute => '実行前に確認';
@override
String get askAiCommandInserted => 'コマンドをターミナルに挿入しました';
@override
String get askAiAwaitingResponse => 'AI の応答を待機中...';
@override
String get askAiNoResponse => '応答なし';
@override
String get askAiRecommendedCommand => 'AI 推奨コマンド';
@override
String get askAiInsertTerminal => 'ターミナルに挿入';
@override
String get askAiSelectedContent => '選択した内容';
@override
String get askAiConversation => 'AI 会話';
@override
String get askAiFollowUpHint => '追質問をする...';
@override
String get askAiSend => '送信';
}

View File

@@ -922,4 +922,54 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get writeScriptTip =>
'Na het verbinden met de server wordt een script geschreven naar `~/.config/server_box` \n | `/tmp/server_box` om de systeemstatus te monitoren. U kunt de inhoud van het script controleren.';
@override
String get askAi => 'AI vragen';
@override
String get askAiUsageHint => 'Gebruikt in de SSH-terminal';
@override
String get askAiBaseUrl => 'Basis-URL';
@override
String get askAiModel => 'Model';
@override
String get askAiApiKey => 'API-sleutel';
@override
String askAiConfigMissing(String fields) {
return 'Configureer $fields in de instellingen.';
}
@override
String get askAiConfirmExecute => 'Bevestigen voor uitvoeren';
@override
String get askAiCommandInserted => 'Commando in terminal ingevoegd';
@override
String get askAiAwaitingResponse => 'Wachten op AI-reactie...';
@override
String get askAiNoResponse => 'Geen reactie';
@override
String get askAiRecommendedCommand => 'Door AI voorgestelde opdracht';
@override
String get askAiInsertTerminal => 'In terminal invoegen';
@override
String get askAiSelectedContent => 'Geselecteerde inhoud';
@override
String get askAiConversation => 'AI-gesprek';
@override
String get askAiFollowUpHint => 'Stel een vervolgvraag...';
@override
String get askAiSend => 'Verzenden';
}

View File

@@ -917,4 +917,54 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get writeScriptTip =>
'Após conectar ao servidor, um script será escrito em `~/.config/server_box` \n | `/tmp/server_box` para monitorar o status do sistema. Você pode revisar o conteúdo do script.';
@override
String get askAi => 'Perguntar à IA';
@override
String get askAiUsageHint => 'Usado no terminal SSH';
@override
String get askAiBaseUrl => 'URL base';
@override
String get askAiModel => 'Modelo';
@override
String get askAiApiKey => 'Chave de API';
@override
String askAiConfigMissing(String fields) {
return 'Configure $fields nas configurações.';
}
@override
String get askAiConfirmExecute => 'Confirmar antes de executar';
@override
String get askAiCommandInserted => 'Comando inserido no terminal';
@override
String get askAiAwaitingResponse => 'Aguardando resposta da IA...';
@override
String get askAiNoResponse => 'Sem resposta';
@override
String get askAiRecommendedCommand => 'Comando sugerido pela IA';
@override
String get askAiInsertTerminal => 'Inserir no terminal';
@override
String get askAiSelectedContent => 'Conteúdo selecionado';
@override
String get askAiConversation => 'Conversa com a IA';
@override
String get askAiFollowUpHint => 'Faça uma pergunta adicional...';
@override
String get askAiSend => 'Enviar';
}

View File

@@ -920,4 +920,54 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get writeScriptTip =>
'После подключения к серверу скрипт будет записан в `~/.config/server_box` \n | `/tmp/server_box` для мониторинга состояния системы. Вы можете проверить содержимое скрипта.';
@override
String get askAi => 'Спросить ИИ';
@override
String get askAiUsageHint => 'Используется в SSH-терминале';
@override
String get askAiBaseUrl => 'Базовый URL';
@override
String get askAiModel => 'Модель';
@override
String get askAiApiKey => 'Ключ API';
@override
String askAiConfigMissing(String fields) {
return 'Настройте $fields в настройках.';
}
@override
String get askAiConfirmExecute => 'Подтвердите перед выполнением';
@override
String get askAiCommandInserted => 'Команда вставлена в терминал';
@override
String get askAiAwaitingResponse => 'Ожидание ответа ИИ...';
@override
String get askAiNoResponse => 'Нет ответа';
@override
String get askAiRecommendedCommand => 'Команда, предложенная ИИ';
@override
String get askAiInsertTerminal => 'Вставить в терминал';
@override
String get askAiSelectedContent => 'Выбранное содержимое';
@override
String get askAiConversation => 'Разговор с ИИ';
@override
String get askAiFollowUpHint => 'Задайте дополнительный вопрос...';
@override
String get askAiSend => 'Отправить';
}

View File

@@ -915,4 +915,54 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get writeScriptTip =>
'Sunucuya bağlandıktan sonra, sistem durumunu izlemek için `~/.config/server_box` \n | `/tmp/server_box` dizinine bir betik yazılacak. Betik içeriğini inceleyebilirsiniz.';
@override
String get askAi => 'Yapay zekaya sor';
@override
String get askAiUsageHint => 'SSH Terminalinde kullanılır';
@override
String get askAiBaseUrl => 'Temel URL';
@override
String get askAiModel => 'Model';
@override
String get askAiApiKey => 'API anahtarı';
@override
String askAiConfigMissing(String fields) {
return 'Lütfen Ayarlar\'da $fields öğesini yapılandırın.';
}
@override
String get askAiConfirmExecute => 'Çalıştırmadan önce onayla';
@override
String get askAiCommandInserted => 'Komut terminale eklendi';
@override
String get askAiAwaitingResponse => 'Yapay zekâ yanıtı bekleniyor...';
@override
String get askAiNoResponse => 'Yanıt yok';
@override
String get askAiRecommendedCommand => 'YZ önerilen komut';
@override
String get askAiInsertTerminal => 'Terminale ekle';
@override
String get askAiSelectedContent => 'Seçilen içerik';
@override
String get askAiConversation => 'YZ sohbeti';
@override
String get askAiFollowUpHint => 'Yeni bir soru sor...';
@override
String get askAiSend => 'Gönder';
}

View File

@@ -921,4 +921,54 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get writeScriptTip =>
'Після підключення до сервера скрипт буде записано у `~/.config/server_box` \n | `/tmp/server_box` для моніторингу стану системи. Ви можете переглянути вміст скрипта.';
@override
String get askAi => 'Запитати ШІ';
@override
String get askAiUsageHint => 'Використовується в SSH-терміналі';
@override
String get askAiBaseUrl => 'Базова URL';
@override
String get askAiModel => 'Модель';
@override
String get askAiApiKey => 'Ключ API';
@override
String askAiConfigMissing(String fields) {
return 'Налаштуйте $fields у налаштуваннях.';
}
@override
String get askAiConfirmExecute => 'Підтвердити перед виконанням';
@override
String get askAiCommandInserted => 'Команду вставлено в термінал';
@override
String get askAiAwaitingResponse => 'Очікування відповіді ШІ...';
@override
String get askAiNoResponse => 'Відповідь відсутня';
@override
String get askAiRecommendedCommand => 'Команда, запропонована ШІ';
@override
String get askAiInsertTerminal => 'Вставити в термінал';
@override
String get askAiSelectedContent => 'Вибраний вміст';
@override
String get askAiConversation => 'Розмова з ШІ';
@override
String get askAiFollowUpHint => 'Поставте додаткове запитання...';
@override
String get askAiSend => 'Надіслати';
}

View File

@@ -870,6 +870,56 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get writeScriptTip =>
'在连接服务器后,会向 `~/.config/server_box` \n | `/tmp/server_box` 写入脚本来监测系统状态,你可以审查脚本内容。';
@override
String get askAi => '问 AI';
@override
String get askAiUsageHint => '用于 SSH 终端';
@override
String get askAiBaseUrl => '基础 URL';
@override
String get askAiModel => '模型';
@override
String get askAiApiKey => 'API 密钥';
@override
String askAiConfigMissing(String fields) {
return '请前往设置配置 $fields';
}
@override
String get askAiConfirmExecute => '执行前确认';
@override
String get askAiCommandInserted => '命令已插入终端';
@override
String get askAiAwaitingResponse => '等待 AI 响应...';
@override
String get askAiNoResponse => '无回复内容';
@override
String get askAiRecommendedCommand => 'AI 推荐命令';
@override
String get askAiInsertTerminal => '插入终端';
@override
String get askAiSelectedContent => '选中的内容';
@override
String get askAiConversation => 'AI 对话';
@override
String get askAiFollowUpHint => '继续提问...';
@override
String get askAiSend => '发送';
}
/// The translations for Chinese, as used in Taiwan (`zh_TW`).
@@ -1738,4 +1788,54 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override
String get writeScriptTip =>
'連線到伺服器後,將會在 `~/.config/server_box` \n | `/tmp/server_box` 中寫入一個腳本來監測系統狀態。你可以審查腳本內容。';
@override
String get askAi => '詢問 AI';
@override
String get askAiUsageHint => '於 SSH 終端機中使用';
@override
String get askAiBaseUrl => '基礎 URL';
@override
String get askAiModel => '模型';
@override
String get askAiApiKey => 'API 金鑰';
@override
String askAiConfigMissing(String fields) {
return '請前往設定配置 $fields';
}
@override
String get askAiConfirmExecute => '執行前確認';
@override
String get askAiCommandInserted => '指令已插入終端機';
@override
String get askAiAwaitingResponse => '等待 AI 回應...';
@override
String get askAiNoResponse => '無回覆內容';
@override
String get askAiRecommendedCommand => 'AI 推薦指令';
@override
String get askAiInsertTerminal => '插入終端機';
@override
String get askAiSelectedContent => '選取的內容';
@override
String get askAiConversation => 'AI 對話';
@override
String get askAiFollowUpHint => '繼續提問...';
@override
String get askAiSend => '傳送';
}