fix(voice): say the attachment limit is 10 KB in total

The attach menu promised up to 10 KB per file, but the attachments share
one 10 KB budget, so two 6 KB files were refused. The hint now says the
limit covers them all, in every locale.
This commit is contained in:
Sameh Khamis committed 2026-11-03 15:54:54 -08:00
1 parent 829db19f60
commit 51b561815c
14 files changed
+26 -15

No files matched your search

+3 -3
View File
@@ -737,9 +737,9 @@ Only one mode runs at a time: the microphone closes chat, and opening chat
stops voice. Enter sends, Shift+Enter adds a line, and Up or Down at the start stops voice. Enter sends, Shift+Enter adds a line, and Up or Down at the start
of the field recall recent messages and restore the draft. Attachments are up of the field recall recent messages and restore the draft. Attachments are up
to four map-layer references or UTF-8 TXT, Markdown, CSV, JSON and GeoJSON to four map-layer references or UTF-8 TXT, Markdown, CSV, JSON and GeoJSON
files, 10 KB each and bounded together, sent only with the message; a layer files, 10 KB in total, sent only with the message; a layer reference names
reference names the layer without exporting its records. The conversation and the layer without exporting its records. The conversation and recent commands
recent commands stay in memory for the page. stay in memory for the page.
The chat routes answer a missing key with `503` and code `API_KEY_MISSING`. The chat routes answer a missing key with `503` and code `API_KEY_MISSING`.
OpenAI chat can only bill `OPENAI_API_KEY`, so while `GEV_PREFER_CODEX_OAUTH` OpenAI chat can only bill `OPENAI_API_KEY`, so while `GEV_PREFER_CODEX_OAUTH`
+1 -1
View File
@@ -3321,7 +3321,7 @@
"Attach a map layer": "إرفاق طبقة خريطة", "Attach a map layer": "إرفاق طبقة خريطة",
"Choose a layer…": "اختر طبقة…", "Choose a layer…": "اختر طبقة…",
"Attach a file": "إرفاق ملف", "Attach a file": "إرفاق ملف",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT أو Markdown أو CSV أو JSON أو GeoJSON · حتى 10 كيلوبايت لكل ملف. تُرسل المرفقات إلى مزوّد الذكاء الاصطناعي مع رسالتك.", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT أو Markdown أو CSV أو JSON أو GeoJSON · حتى 10 كيلوبايت إجمالًا. تُرسل المرفقات إلى مزوّد الذكاء الاصطناعي مع رسالتك.",
"Latest AI response": "أحدث رد من الذكاء الاصطناعي", "Latest AI response": "أحدث رد من الذكاء الاصطناعي",
"Expand conversation": "توسيع المحادثة", "Expand conversation": "توسيع المحادثة",
"Command suggestions": "اقتراحات الأوامر", "Command suggestions": "اقتراحات الأوامر",
+1 -1
View File
@@ -3033,7 +3033,7 @@
"Attach a map layer": "Kartenebene anhängen", "Attach a map layer": "Kartenebene anhängen",
"Choose a layer…": "Ebene wählen…", "Choose a layer…": "Ebene wählen…",
"Attach a file": "Datei anhängen", "Attach a file": "Datei anhängen",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON oder GeoJSON · je bis zu 10 KB. Anhänge werden mit deiner Nachricht an deinen KI-Anbieter gesendet.", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON oder GeoJSON · insgesamt bis zu 10 KB. Anhänge werden mit deiner Nachricht an deinen KI-Anbieter gesendet.",
"Latest AI response": "Neueste KI-Antwort", "Latest AI response": "Neueste KI-Antwort",
"Expand conversation": "Unterhaltung erweitern", "Expand conversation": "Unterhaltung erweitern",
"Command suggestions": "Befehlsvorschläge", "Command suggestions": "Befehlsvorschläge",
+1 -1
View File
@@ -3108,7 +3108,7 @@
"Attach a map layer": "Adjuntar una capa del mapa", "Attach a map layer": "Adjuntar una capa del mapa",
"Choose a layer…": "Elige una capa…", "Choose a layer…": "Elige una capa…",
"Attach a file": "Adjuntar un archivo", "Attach a file": "Adjuntar un archivo",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON o GeoJSON · hasta 10 KB cada uno. Los adjuntos se envían a tu proveedor de IA con el mensaje.", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON o GeoJSON · hasta 10 KB en total. Los adjuntos se envían a tu proveedor de IA con el mensaje.",
"Latest AI response": "Última respuesta de IA", "Latest AI response": "Última respuesta de IA",
"Expand conversation": "Expandir conversación", "Expand conversation": "Expandir conversación",
"Command suggestions": "Sugerencias de comandos", "Command suggestions": "Sugerencias de comandos",
+1 -1
View File
@@ -3108,7 +3108,7 @@
"Attach a map layer": "Joindre une couche de carte", "Attach a map layer": "Joindre une couche de carte",
"Choose a layer…": "Choisir une couche…", "Choose a layer…": "Choisir une couche…",
"Attach a file": "Joindre un fichier", "Attach a file": "Joindre un fichier",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON ou GeoJSON · 10 Ko max. chacun. Les pièces jointes sont envoyées à votre fournisseur d’IA avec votre message.", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON ou GeoJSON · 10 Ko max. au total. Les pièces jointes sont envoyées à votre fournisseur d’IA avec votre message.",
"Latest AI response": "Dernière réponse de l’IA", "Latest AI response": "Dernière réponse de l’IA",
"Expand conversation": "Agrandir la conversation", "Expand conversation": "Agrandir la conversation",
"Command suggestions": "Suggestions de commandes", "Command suggestions": "Suggestions de commandes",
+1 -1
View File
@@ -3108,7 +3108,7 @@
"Attach a map layer": "Allega un livello della mappa", "Attach a map layer": "Allega un livello della mappa",
"Choose a layer…": "Scegli un livello…", "Choose a layer…": "Scegli un livello…",
"Attach a file": "Allega un file", "Attach a file": "Allega un file",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON o GeoJSON · fino a 10 KB ciascuno. Gli allegati vengono inviati al tuo fornitore di IA insieme al messaggio.", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON o GeoJSON · fino a 10 KB in totale. Gli allegati vengono inviati al tuo fornitore di IA insieme al messaggio.",
"Latest AI response": "Ultima risposta dell’IA", "Latest AI response": "Ultima risposta dell’IA",
"Expand conversation": "Espandi conversazione", "Expand conversation": "Espandi conversazione",
"Command suggestions": "Suggerimenti di comandi", "Command suggestions": "Suggerimenti di comandi",
+1 -1
View File
@@ -2958,7 +2958,7 @@
"Attach a map layer": "地図レイヤーを添付", "Attach a map layer": "地図レイヤーを添付",
"Choose a layer…": "レイヤーを選択…", "Choose a layer…": "レイヤーを選択…",
"Attach a file": "ファイルを添付", "Attach a file": "ファイルを添付",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT、Markdown、CSV、JSON、GeoJSON · 各 10 KB まで。添付はメッセージとともに AI プロバイダーへ送信されます。", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT、Markdown、CSV、JSON、GeoJSON · 合計 10 KB まで。添付はメッセージとともに AI プロバイダーへ送信されます。",
"Latest AI response": "最新の AI の応答", "Latest AI response": "最新の AI の応答",
"Expand conversation": "会話を展開", "Expand conversation": "会話を展開",
"Command suggestions": "コマンドの候補", "Command suggestions": "コマンドの候補",
+1 -1
View File
@@ -3108,7 +3108,7 @@
"Attach a map layer": "Anexar uma camada do mapa", "Attach a map layer": "Anexar uma camada do mapa",
"Choose a layer…": "Escolha uma camada…", "Choose a layer…": "Escolha uma camada…",
"Attach a file": "Anexar um arquivo", "Attach a file": "Anexar um arquivo",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON ou GeoJSON · até 10 KB cada. Os anexos são enviados ao seu provedor de IA com a sua mensagem.", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON ou GeoJSON · até 10 KB no total. Os anexos são enviados ao seu provedor de IA com a sua mensagem.",
"Latest AI response": "Última resposta da IA", "Latest AI response": "Última resposta da IA",
"Expand conversation": "Expandir conversa", "Expand conversation": "Expandir conversa",
"Command suggestions": "Sugestões de comandos", "Command suggestions": "Sugestões de comandos",
+1 -1
View File
@@ -3183,7 +3183,7 @@
"Attach a map layer": "Прикрепить слой карты", "Attach a map layer": "Прикрепить слой карты",
"Choose a layer…": "Выберите слой…", "Choose a layer…": "Выберите слой…",
"Attach a file": "Прикрепить файл", "Attach a file": "Прикрепить файл",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON или GeoJSON · до 10 КБ каждый. Вложения отправляются провайдеру ИИ вместе с сообщением.", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON или GeoJSON · до 10 КБ в сумме. Вложения отправляются провайдеру ИИ вместе с сообщением.",
"Latest AI response": "Последний ответ ИИ", "Latest AI response": "Последний ответ ИИ",
"Expand conversation": "Развернуть разговор", "Expand conversation": "Развернуть разговор",
"Command suggestions": "Подсказки команд", "Command suggestions": "Подсказки команд",
+1 -1
View File
@@ -3183,7 +3183,7 @@
"Attach a map layer": "Прикріпити шар мапи", "Attach a map layer": "Прикріпити шар мапи",
"Choose a layer…": "Виберіть шар…", "Choose a layer…": "Виберіть шар…",
"Attach a file": "Прикріпити файл", "Attach a file": "Прикріпити файл",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON або GeoJSON · до 10 КБ кожен. Вкладення надсилаються вашому постачальнику ШІ разом із повідомленням.", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT, Markdown, CSV, JSON або GeoJSON · до 10 КБ загалом. Вкладення надсилаються вашому постачальнику ШІ разом із повідомленням.",
"Latest AI response": "Остання відповідь ШІ", "Latest AI response": "Остання відповідь ШІ",
"Expand conversation": "Розгорнути розмову", "Expand conversation": "Розгорнути розмову",
"Command suggestions": "Підказки команд", "Command suggestions": "Підказки команд",
+1 -1
View File
@@ -2958,7 +2958,7 @@
"Attach a map layer": "附加地图图层", "Attach a map layer": "附加地图图层",
"Choose a layer…": "选择图层…", "Choose a layer…": "选择图层…",
"Attach a file": "附加文件", "Attach a file": "附加文件",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT、Markdown、CSV、JSON 或 GeoJSON · 每个文件最多 10 KB。附件会随消息发送给您的 AI 服务商。", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT、Markdown、CSV、JSON 或 GeoJSON · 总计最多 10 KB。附件会随消息发送给您的 AI 服务商。",
"Latest AI response": "最新 AI 回复", "Latest AI response": "最新 AI 回复",
"Expand conversation": "展开对话", "Expand conversation": "展开对话",
"Command suggestions": "命令建议", "Command suggestions": "命令建议",
+1 -1
View File
@@ -2958,7 +2958,7 @@
"Attach a map layer": "附加地圖圖層", "Attach a map layer": "附加地圖圖層",
"Choose a layer…": "選擇圖層…", "Choose a layer…": "選擇圖層…",
"Attach a file": "附加檔案", "Attach a file": "附加檔案",
"TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.": "TXT、Markdown、CSV、JSON 或 GeoJSON · 每個最多 10 KB。附件會隨訊息傳送給你的 AI 供應商。", "TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.": "TXT、Markdown、CSV、JSON 或 GeoJSON · 總計最多 10 KB。附件會隨訊息傳送給你的 AI 供應商。",
"Latest AI response": "最新 AI 回覆", "Latest AI response": "最新 AI 回覆",
"Expand conversation": "展開對話", "Expand conversation": "展開對話",
"Command suggestions": "指令建議", "Command suggestions": "指令建議",
+1 -1
View File
@@ -95,7 +95,7 @@ const quickPrompts = () => [t('Fly to Tokyo'), t('Show live flights')];
<button id="gev-chat-layer-attach" type="button" :disabled="props.view.chat.locked || !layerChoice" @click="attachLayer()">{{ t('Attach layer') }}</button> <button id="gev-chat-layer-attach" type="button" :disabled="props.view.chat.locked || !layerChoice" @click="attachLayer()">{{ t('Attach layer') }}</button>
</div> </div>
<button id="gev-chat-file-button" type="button" :disabled="props.view.chat.locked" @click="emit('chat-file-button')">{{ t('Attach a file') }}</button> <button id="gev-chat-file-button" type="button" :disabled="props.view.chat.locked" @click="emit('chat-file-button')">{{ t('Attach a file') }}</button>
<p>{{ t('TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB each. Attachments are sent to your AI provider with your message.') }}</p> <p>{{ t('TXT, Markdown, CSV, JSON or GeoJSON · up to 10 KB in total. Attachments are sent to your AI provider with your message.') }}</p>
<input id="gev-chat-file" type="file" accept=".txt,.md,.csv,.json,.geojson" multiple hidden @change="emit('chat-files', $event.target)" /> <input id="gev-chat-file" type="file" accept=".txt,.md,.csv,.json,.geojson" multiple hidden @change="emit('chat-files', $event.target)" />
</div> </div>
<aside id="gev-chat-mini-reply" :hidden="!props.view.chat.miniReply" :aria-label="t('Latest AI response')"> <aside id="gev-chat-mini-reply" :hidden="!props.view.chat.miniReply" :aria-label="t('Latest AI response')">
+11
View File
@@ -108,6 +108,17 @@ test('attachments over 10 KB together are refused', async (t) => {
]); ]);
}); });
test('the attach menu states the 10 KB limit for all attachments together', async (t) => {
const { pinia, settle } = mountVoiceView(t);
const ui = createTestVoiceUi({ panel: true, pinia });
attachments(t, { ui });
ui.update('chat', { open: true });
await settle();
const hint = $('#gev-chat-attach-menu > p').textContent;
assert.match(hint, /up to 10 KB in total\./);
assert.doesNotMatch(hint, /each/);
});
test('Escape closes the attach menu and returns to the Attach button', async (t) => { test('Escape closes the attach menu and returns to the Attach button', async (t) => {
const { pinia, settle } = mountVoiceView(t); const { pinia, settle } = mountVoiceView(t);
const ui = createTestVoiceUi({ panel: true, pinia }); const ui = createTestVoiceUi({ panel: true, pinia });