@javierfrancoleal/dsh-supervisor 1.0.20 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dashboard.html +51 -13
  2. package/package.json +1 -1
  3. package/server.js +15 -0
package/dashboard.html CHANGED
@@ -210,6 +210,7 @@ body.wall pre{max-height:40vh}
210
210
  <button class="btn" id="addUserBtn">Add worker</button>
211
211
  </div>
212
212
  <div class="card"><h2 id="ordersTitle">Orders — kitchen & bill</h2><button class="btn small gray" id="exportOrdersBtn" style="margin-bottom:8px">⬇ Export bill</button><div id="ownerOrders"></div><p class="hint" id="billSummary"></p></div>
213
+ <div class="card"><h2 id="regDayTitle">🪙 Day register (counter-audit)</h2><div id="regDay"></div><button class="btn small gray" id="exportRegisterBtn" style="margin-top:6px">⬇ Export Z-report</button></div>
213
214
  <div class="card"><h2 id="usageTitle">Usage & cost</h2><p class="hint" id="usageSub">(per worker, estimated)</p>
214
215
  <p class="hint" id="usageBudget"></p>
215
216
  <table id="usageTable"><thead><tr><th id="thWorker">Worker</th><th id="thSessions">Sessions</th><th id="thTokens">Tokens</th><th id="thCost">Est. cost</th></tr></thead><tbody></tbody></table>
@@ -272,7 +273,19 @@ body.wall pre{max-height:40vh}
272
273
  <input id="tableInput" placeholder="Table #" style="margin:8px 0">
273
274
  <div id="packFields" class="row"></div>
274
275
  <button class="listen" id="startBtn">▶ START</button>
275
- <div class="card"><h2 id="reportTitle">Field report</h2><textarea id="reportText" rows="4" placeholder="What happened on your shift?"></textarea><button class="btn" id="reportBtn">Send report</button></div>
276
+ <div class="card"><h2 id="regTitle">🪙 Virtual register</h2>
277
+ <div id="regClosed"><button class="btn" id="regOpen">Open register</button></div>
278
+ <div id="regOpenState" class="hidden">
279
+ <div id="regItems" class="note" style="margin-bottom:8px"></div>
280
+ <p class="note" id="regTotal"></p>
281
+ <input id="regItem" placeholder="Item"><input id="regPrice" type="number" step="0.01" placeholder="Price">
282
+ <div class="row"><button class="btn small" id="regAdd">Add</button><button class="btn" id="regSale">💳 Record sale</button></div>
283
+ <p class="hint" id="regHint">Record the sale here, then charge the customer with the physical terminal.</p>
284
+ <input id="regDeclared" type="number" step="0.01" placeholder="Terminal total at close">
285
+ <button class="btn gray small" id="regClose">Close register</button>
286
+ </div>
287
+ </div>
288
+ <div class="card"><h2 id="reportTitle">Field report</h2><textarea id="reportText" rows="4" placeholder="What happened on your shift?"></textarea><button class="btn" id="reportBtn">Send report</button></div>
276
289
  <div class="card"><h2 id="fbTitle">Field feedback</h2>
277
290
  <select id="empFbCat"><option value="error">Error</option><option value="improvement">Improvement</option><option value="idea">Idea</option></select>
278
291
  <textarea id="empFbText" rows="3" placeholder="What happened? What should improve?"></textarea><button class="btn" id="empFbBtn">Send feedback</button>
@@ -325,16 +338,16 @@ body.wall pre{max-height:40vh}
325
338
  "use strict";
326
339
  const LANG={es:"ES",en:"EN",fr:"FR",de:"DE",it:"IT",pt:"PT",zh:"中文",ja:"日本語",ko:"한국어",ar:"العربية"};
327
340
  const S={
328
- en:{login:"Log in",user:"User",password:"Password",loginBtn:"Log in",loginHint:"Accounts are managed by the business owner.",loginFailed:"Login failed.",cannotReach:"Cannot reach the supervisor server. Is it running?",workerAdded:"Worker added.",saved:"Saved.",reportSent:"Report sent.",feedbackSent:"Feedback sent.",wallOpen:"Live wallboard",logout:"Log out",overview:"Overview",field:"Field",rules:"Rules",reports:"Reports",week:"This week",feedback:"Feedback",workersActive:"Workers active",reportsTotal:"Reports total",workers:"Workers",thUser:"User",thRole:"Role",addWorker:"Add worker",userName:"User name",addBtn:"Add worker",usage:"Usage & cost",usageSub:"(per worker, estimated)",thWorker:"Worker",thSessions:"Sessions",thTokens:"Tokens",thCost:"Est. cost",panel:"Action Panel",panelNote:"Workers open the panel from their tablet or phone.",openPanel:"Open Action Panel",fieldReports:"Field reports",feedbackQueue:"Feedback queue",feedbackHint:"The agent reads this queue and resolves errors and improvements.",refresh:"Refresh",autoOn:"Auto-refresh: ON",autoOff:"Auto-refresh: OFF",rulesTitle:"Business rules",rulesHint:"These rules train the traffic light.",saveRules:"Save rules",listen:"🎙️ LISTEN",hi:"👋 ",reportTitle:"Field report",reportPh:"What happened on your shift?",sendReport:"Send report",fbTitle:"Field feedback",fbPh:"What happened? What should improve?",sendFeedback:"Send feedback",switchUser:"Switch user",wallHead:"🏭 Le Veilleux — Live",wallPulse:"Field pulse",noActivity:"(no field activity yet)",start:"▶ START",listening:"Listening… speak now",listeningHint:"The conversation is being captured and split by person.",stopListening:"⏹ Stop listening",summaryTitle:"Conversation summary",confirm:"Confirm ✓",confirmed:"Confirmed ✓",sentNote:"Sent to kitchen & central",newConv:"New conversation",ordersTitle:"Orders — kitchen & bill",person:"Person",noSummary:"The summary will appear here as the conversation is detected.",prep:"Preparing",ready:"Ready",delivered:"Delivered",sent:"Sent",back:"Back",sayPh:"Speak or type what each person said…",sendPhrase:"Send phrase",dictate:"🎙️ Dictate",aiHint:"Speech and text go straight to the AI — the summary appears automatically.",micUnsupported:"Dictation not supported in this browser",processing:"The AI is summarizing…",sectorTab:"Sector",sectorPresets:"Sector presets",customSector:"Custom sector",saveSector:"Save sector",sectorSaved:"Sector saved.",aiSuggest:"Suggest with AI (copy prompt)",aiSectorCopied:"AI prompt copied — paste it in DeepSeek Harness.",fillBoth:"Enter your user and password.",loggingIn:"Logging in…",noOrders:"No orders yet — confirm items in the summary.",noUsage:"No usage reported yet.",noReports:"No field reports yet.",lvlEmployee:"Field",lvlLead:"Supervisor",lvlOwner:"Owner",labelPh:"Role label (e.g. Cook)",newOrder:"NEW ORDER",enableNotif:"🔔 Enable notifications",notifHint:"The kitchen tablet beeps and flashes when an order arrives.",tagline:"The AI works. The human watches, decides, reviews.",welcomeTitle:"Welcome to Le Veilleux 👁️",welcomeBody:"Three steps to your first live flow: 1) Add your workers. 2) Choose your sector. 3) Run a real conversation — the AI proposes, you confirm.",wallNote:"Updates every 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Proposal",tierRED:"Ask",export:"⬇ Export reports",exportOrders:"⬇ Export bill",exportDone:"Export downloaded.",deepTitle:"Deep analysis (Reasoner)",deepPh:"Ask a deep question…",deepSend:"Ask deep",deepSent:"Sent to the Reasoner brain.",deepHint:"The Reasoner brain thinks deeply and appends its answer to the reports.",budget:"Today's budget",budgetReached:"Limit reached — raise it in Settings.",paid:"💵 Paid",markPaid:"Mark paid",billSummary:"Collected: X of Y orders"},
329
- es:{login:"Iniciar sesión",user:"Usuario",password:"Contraseña",loginBtn:"Entrar",loginHint:"Las cuentas las gestiona el dueño del negocio.",loginFailed:"Datos incorrectos.",cannotReach:"No se puede contactar el servidor. ¿Está corriendo?",workerAdded:"Trabajador añadido.",saved:"Guardado.",reportSent:"Reporte enviado.",feedbackSent:"Feedback enviado.",wallOpen:"Wallboard en vivo",logout:"Salir",overview:"Resumen",field:"Campo",rules:"Reglas",reports:"Reportes",week:"Esta semana",feedback:"Feedback",workersActive:"Trabajadores activos",reportsTotal:"Reportes totales",workers:"Trabajadores",thUser:"Usuario",thRole:"Rol",addWorker:"Añadir trabajador",userName:"Nombre de usuario",addBtn:"Añadir trabajador",usage:"Uso y coste",usageSub:"(por trabajador, estimado)",thWorker:"Trabajador",thSessions:"Sesiones",thTokens:"Tokens",thCost:"Coste est.",panel:"Panel de Acción",panelNote:"Los trabajadores abren el panel desde su tablet o teléfono.",openPanel:"Abrir Panel de Acción",fieldReports:"Reportes de campo",feedbackQueue:"Cola de feedback",feedbackHint:"El agente lee esta cola y resuelve errores y mejoras.",refresh:"Actualizar",autoOn:"Auto: ON",autoOff:"Auto: OFF",rulesTitle:"Reglas del negocio",rulesHint:"Estas reglas entrenan el semáforo.",saveRules:"Guardar reglas",listen:"🎙️ ESCUCHAR",hi:"👋 ",reportTitle:"Reporte de campo",reportPh:"¿Qué pasó en tu turno?",sendReport:"Enviar reporte",fbTitle:"Feedback de campo",fbPh:"¿Qué pasó? ¿Qué debe mejorar?",sendFeedback:"Enviar feedback",switchUser:"Cambiar de usuario",wallHead:"🏭 Le Veilleux — En vivo",wallPulse:"Pulso del campo",noActivity:"(sin actividad de campo aún)",start:"▶ INICIAR",listening:"Escuchando… habla ahora",listeningHint:"La conversación se captura y divide por persona.",stopListening:"⏹ Detener",summaryTitle:"Resumen de la conversación",confirm:"Confirmar ✓",confirmed:"Confirmado ✓",sentNote:"Enviado a cocina y central",newConv:"Nueva conversación",ordersTitle:"Pedidos — cocina y cuenta",person:"Persona",noSummary:"El resumen aparecerá aquí conforme se detecta la conversación.",prep:"Preparando",ready:"Listo",delivered:"Entregado",sent:"Enviado",back:"Volver",sayPh:"Habla o escribe lo que dijo cada persona…",sendPhrase:"Enviar frase",dictate:"🎙️ Dictar",aiHint:"Voz y texto van directo a la IA — el resumen aparece solo.",micUnsupported:"Dictado no soportado en este navegador",processing:"La IA está resumiendo…",sectorTab:"Sector",sectorPresets:"Sectores predefinidos",customSector:"Sector personalizado",saveSector:"Guardar sector",sectorSaved:"Sector guardado.",aiSuggest:"Sugerir con IA (copiar prompt)",aiSectorCopied:"Prompt de IA copiado — pégalo en DeepSeek Harness.",fillBoth:"Escribe tu usuario y contraseña.",loggingIn:"Entrando…",noOrders:"Aún no hay pedidos — confirma elementos en el resumen.",noUsage:"Aún no hay uso reportado.",noReports:"Aún no hay reportes de campo.",lvlEmployee:"Terreno",lvlLead:"Supervisor",lvlOwner:"Dueño",labelPh:"Etiqueta de rol (ej. Cocinero)",newOrder:"NUEVO PEDIDO",enableNotif:"🔔 Activar notificaciones",notifHint:"La tablet de cocina suena y parpadea cuando llega un pedido.",tagline:"La IA trabaja. El humano vela, decide, revisa.",welcomeTitle:"Bienvenido a Le Veilleux 👁️",welcomeBody:"Tres pasos para tu primer flujo en vivo: 1) Añade a tus trabajadores. 2) Elige tu sector. 3) Corre una conversación real — la IA propone, tú confirmas.",wallNote:"Se actualiza cada 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Propuesta",tierRED:"Preguntar",export:"⬇ Exportar reportes",exportOrders:"⬇ Exportar cuenta",exportDone:"Exportación descargada.",deepTitle:"Análisis profundo (Reasoner)",deepPh:"Haz una pregunta profunda…",deepSend:"Preguntar",deepSent:"Enviada al cerebro Reasoner.",deepHint:"El cerebro Reasoner piensa a fondo y anexa su respuesta a los reportes.",budget:"Presupuesto de hoy",budgetReached:"Límite alcanzado — súbelo en Ajustes.",paid:"💵 Pagado",markPaid:"Marcar pagado",billSummary:"Cobrado: X de Y pedidos"},
330
- fr:{login:"Connexion",user:"Utilisateur",password:"Mot de passe",loginBtn:"Se connecter",loginHint:"Les comptes sont gérés par le propriétaire.",loginFailed:"Échec de connexion.",cannotReach:"Serveur injoignable. Est-il lancé ?",workerAdded:"Employé ajouté.",saved:"Enregistré.",reportSent:"Rapport envoyé.",feedbackSent:"Feedback envoyé.",wallOpen:"Tableau en direct",logout:"Déconnexion",overview:"Vue d'ensemble",field:"Terrain",rules:"Règles",reports:"Rapports",week:"Cette semaine",feedback:"Feedback",workersActive:"Employés actifs",reportsTotal:"Total rapports",workers:"Employés",thUser:"Utilisateur",thRole:"Rôle",addWorker:"Ajouter un employé",userName:"Nom d'utilisateur",addBtn:"Ajouter",usage:"Usage et coût",usageSub:"(par employé, estimé)",thWorker:"Employé",thSessions:"Sessions",thTokens:"Jetons",thCost:"Coût est.",panel:"Panneau d'action",panelNote:"Les employés ouvrent le panneau depuis leur tablette ou téléphone.",openPanel:"Ouvrir le panneau",fieldReports:"Rapports terrain",feedbackQueue:"File de feedback",feedbackHint:"L'agent lit cette file et résout erreurs et améliorations.",refresh:"Actualiser",autoOn:"Auto : ON",autoOff:"Auto : OFF",rulesTitle:"Règles du commerce",rulesHint:"Ces règles entraînent le feu tricolore.",saveRules:"Enregistrer",listen:"🎙️ ÉCOUTER",hi:"👋 ",reportTitle:"Rapport terrain",reportPh:"Que s'est-il passé pendant votre quart ?",sendReport:"Envoyer",fbTitle:"Feedback terrain",fbPh:"Que s'est-il passé ? Que faut-il améliorer ?",sendFeedback:"Envoyer",switchUser:"Changer d'utilisateur",wallHead:"🏭 Le Veilleux — En direct",wallPulse:"Pouls du terrain",noActivity:"(aucune activité)",start:"▶ DÉMARRER",listening:"Écoute… parlez maintenant",listeningHint:"La conversation est captée et répartie par personne.",stopListening:"⏹ Arrêter",summaryTitle:"Résumé de la conversation",confirm:"Confirmer ✓",confirmed:"Confirmé ✓",sentNote:"Envoyé en cuisine et au central",newConv:"Nouvelle conversation",ordersTitle:"Commandes — cuisine et addition",person:"Personne",noSummary:"Le résumé apparaîtra ici au fil de la conversation.",prep:"En préparation",ready:"Prêt",delivered:"Servi",sent:"Envoyé",back:"Retour",sayPh:"Parlez ou écrivez ce que chaque personne a dit…",sendPhrase:"Envoyer",dictate:"🎙️ Dicter",aiHint:"La voix et le texte vont directement à l’IA — le résumé apparaît seul.",micUnsupported:"Dictée non prise en charge",processing:"L’IA résume…",sectorTab:"Secteur",sectorPresets:"Secteurs prédéfinis",customSector:"Secteur personnalisé",saveSector:"Enregistrer le secteur",sectorSaved:"Secteur enregistré.",aiSuggest:"Suggérer avec l’IA (copier l’invite)",aiSectorCopied:"Invite copiée — collez-la dans DeepSeek Harness.",fillBoth:"Saisissez votre utilisateur et votre mot de passe.",loggingIn:"Connexion…",noOrders:"Aucune commande — confirmez des éléments dans le résumé.",noUsage:"Aucun usage signalé.",noReports:"Aucun rapport terrain.",lvlEmployee:"Terrain",lvlLead:"Superviseur",lvlOwner:"Propriétaire",labelPh:"Intitulé du rôle (ex. Cuisinier)",newOrder:"NOUVELLE COMMANDE",enableNotif:"🔔 Activer les notifications",notifHint:"La tablette de cuisine sonne et clignote à l'arrivée d'une commande.",tagline:"L'IA travaille. L'humain veille, décide, revoit.",welcomeTitle:"Bienvenue chez Le Veilleux 👁️",welcomeBody:"Trois étapes vers votre premier flux en direct : 1) Ajoutez vos employés. 2) Choisissez votre secteur. 3) Déroulez une vraie conversation — l'IA propose, vous confirmez.",wallNote:"Mise à jour toutes les 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Proposition",tierRED:"Demander",export:"⬇ Exporter les rapports",exportOrders:"⬇ Exporter l'addition",exportDone:"Exportation téléchargée.",deepTitle:"Analyse approfondie (Reasoner)",deepPh:"Posez une question profonde…",deepSend:"Demander",deepSent:"Envoyée au cerveau Reasoner.",deepHint:"Le cerveau Reasoner réfléchit en profondeur et ajoute sa réponse aux rapports.",budget:"Budget du jour",budgetReached:"Limite atteinte — augmentez-la dans les réglages.",paid:"💵 Payé",markPaid:"Marquer payé",billSummary:"Encaissé : X sur Y commandes"},
331
- de:{login:"Anmelden",user:"Benutzer",password:"Passwort",loginBtn:"Anmelden",loginHint:"Konten verwaltet der Inhaber.",loginFailed:"Anmeldung fehlgeschlagen.",cannotReach:"Server nicht erreichbar. Läuft er?",workerAdded:"Mitarbeiter hinzugefügt.",saved:"Gespeichert.",reportSent:"Bericht gesendet.",feedbackSent:"Feedback gesendet.",wallOpen:"Live-Anzeige",logout:"Abmelden",overview:"Übersicht",field:"Feld",rules:"Regeln",reports:"Berichte",week:"Diese Woche",feedback:"Feedback",workersActive:"Aktive Mitarbeiter",reportsTotal:"Berichte gesamt",workers:"Mitarbeiter",thUser:"Benutzer",thRole:"Rolle",addWorker:"Mitarbeiter hinzufügen",userName:"Benutzername",addBtn:"Hinzufügen",usage:"Nutzung & Kosten",usageSub:"(pro Mitarbeiter, geschätzt)",thWorker:"Mitarbeiter",thSessions:"Sitzungen",thTokens:"Tokens",thCost:"Kosten ca.",panel:"Aktionspanel",panelNote:"Mitarbeiter öffnen das Panel auf Tablet oder Handy.",openPanel:"Panel öffnen",fieldReports:"Feldberichte",feedbackQueue:"Feedback-Warteschlange",feedbackHint:"Der Agent liest diese Warteschlange und behebt Fehler.",refresh:"Aktualisieren",autoOn:"Auto: AN",autoOff:"Auto: AUS",rulesTitle:"Geschäftsregeln",rulesHint:"Diese Regeln trainieren die Ampel.",saveRules:"Regeln speichern",listen:"🎙️ ZUHÖREN",hi:"👋 ",reportTitle:"Feldbericht",reportPh:"Was ist in Ihrer Schicht passiert?",sendReport:"Senden",fbTitle:"Feld-Feedback",fbPh:"Was ist passiert? Was soll besser werden?",sendFeedback:"Senden",switchUser:"Benutzer wechseln",wallHead:"🏭 Le Veilleux — Live",wallPulse:"Puls im Feld",noActivity:"(noch keine Aktivität)",start:"▶ STARTEN",listening:"Höre zu… sprich jetzt",listeningHint:"Das Gespräch wird erfasst und pro Person aufgeteilt.",stopListening:"⏹ Stopp",summaryTitle:"Gesprächsübersicht",confirm:"Bestätigen ✓",confirmed:"Bestätigt ✓",sentNote:"An Küche & Zentrale gesendet",newConv:"Neues Gespräch",ordersTitle:"Bestellungen — Küche & Rechnung",person:"Person",noSummary:"Die Übersicht erscheint hier, sobald das Gespräch erkannt wird.",prep:"In Zubereitung",ready:"Fertig",delivered:"Serviert",sent:"Gesendet",back:"Zurück",sayPh:"Sprechen oder tippen Sie, was jede Person gesagt hat…",sendPhrase:"Senden",dictate:"🎙️ Diktieren",aiHint:"Sprache und Text gehen direkt an die KI — die Übersicht erscheint automatisch.",micUnsupported:"Diktat nicht unterstützt",processing:"Die KI fasst zusammen…",sectorTab:"Branche",sectorPresets:"Branchen-Vorlagen",customSector:"Eigene Branche",saveSector:"Branche speichern",sectorSaved:"Branche gespeichert.",aiSuggest:"Mit KI vorschlagen (Prompt kopieren)",aiSectorCopied:"KI-Prompt kopiert — in DeepSeek Harness einfügen.",fillBoth:"Benutzer und Passwort eingeben.",loggingIn:"Anmeldung…",noOrders:"Noch keine Bestellungen — Elemente in der Übersicht bestätigen.",noUsage:"Noch keine Nutzung gemeldet.",noReports:"Noch keine Feldberichte.",lvlEmployee:"Feld",lvlLead:"Aufsicht",lvlOwner:"Inhaber",labelPh:"Rollenname (z. B. Koch)",newOrder:"NEUE BESTELLUNG",enableNotif:"🔔 Benachrichtigungen aktivieren",notifHint:"Das Küchen-Tablet piept und blinkt bei neuer Bestellung.",tagline:"Die KI arbeitet. Der Mensch wacht, entscheidet, prüft.",welcomeTitle:"Willkommen bei Le Veilleux 👁️",welcomeBody:"Drei Schritte zu Ihrem ersten Live-Ablauf: 1) Mitarbeiter hinzufügen. 2) Branche wählen. 3) Ein echtes Gespräch führen — die KI schlägt vor, Sie bestätigen.",wallNote:"Aktualisiert alle 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Vorschlag",tierRED:"Fragen",export:"⬇ Berichte exportieren",exportOrders:"⬇ Rechnung exportieren",exportDone:"Export heruntergeladen.",deepTitle:"Tiefenanalyse (Reasoner)",deepPh:"Stellen Sie eine tiefe Frage…",deepSend:"Fragen",deepSent:"An das Reasoner-Gehirn gesendet.",deepHint:"Das Reasoner-Gehirn denkt gründlich nach und hängt die Antwort an die Berichte an.",budget:"Tagesbudget",budgetReached:"Limit erreicht — in den Einstellungen erhöhen.",paid:"💵 Bezahlt",markPaid:"Als bezahlt markieren",billSummary:"Kassiert: X von Y Bestellungen"},
332
- it:{login:"Accedi",user:"Utente",password:"Password",loginBtn:"Accedi",loginHint:"Gli account li gestisce il proprietario.",loginFailed:"Accesso fallito.",cannotReach:"Server non raggiungibile. È in esecuzione?",workerAdded:"Lavoratore aggiunto.",saved:"Salvato.",reportSent:"Report inviato.",feedbackSent:"Feedback inviato.",wallOpen:"Schermo live",logout:"Esci",overview:"Panoramica",field:"Campo",rules:"Regole",reports:"Report",week:"Questa settimana",feedback:"Feedback",workersActive:"Lavoratori attivi",reportsTotal:"Report totali",workers:"Lavoratori",thUser:"Utente",thRole:"Ruolo",addWorker:"Aggiungi lavoratore",userName:"Nome utente",addBtn:"Aggiungi",usage:"Uso e costi",usageSub:"(per lavoratore, stimato)",thWorker:"Lavoratore",thSessions:"Sessioni",thTokens:"Token",thCost:"Costo stim.",panel:"Pannello Azioni",panelNote:"I lavoratori aprono il pannello da tablet o telefono.",openPanel:"Apri il pannello",fieldReports:"Report di campo",feedbackQueue:"Coda feedback",feedbackHint:"L'agente legge questa coda e risolve errori e migliorie.",refresh:"Aggiorna",autoOn:"Auto: ON",autoOff:"Auto: OFF",rulesTitle:"Regole del negozio",rulesHint:"Queste regole addestrano il semaforo.",saveRules:"Salva regole",listen:"🎙️ ASCOLTA",hi:"👋 ",reportTitle:"Report di campo",reportPh:"Cosa è successo nel tuo turno?",sendReport:"Invia",fbTitle:"Feedback di campo",fbPh:"Cosa è successo? Cosa va migliorato?",sendFeedback:"Invia",switchUser:"Cambia utente",wallHead:"🏭 Le Veilleux — Live",wallPulse:"Battito del campo",noActivity:"(nessuna attività)",start:"▶ INIZIA",listening:"In ascolto… parla ora",listeningHint:"La conversazione viene catturata e divisa per persona.",stopListening:"⏹ Ferma",summaryTitle:"Riepilogo conversazione",confirm:"Conferma ✓",confirmed:"Confermato ✓",sentNote:"Inviato a cucina e centrale",newConv:"Nuova conversazione",ordersTitle:"Ordini — cucina e conto",person:"Persona",noSummary:"Il riepilogo apparirà qui man mano che la conversazione viene rilevata.",prep:"In preparazione",ready:"Pronto",delivered:"Servito",sent:"Inviato",back:"Indietro",sayPh:"Parla o scrivi cosa ha detto ogni persona…",sendPhrase:"Invia",dictate:"🎙️ Detta",aiHint:"Voce e testo vanno direttamente all’IA — il riepilogo appare da solo.",micUnsupported:"Dettatura non supportata",processing:"L’IA sta riassumendo…",sectorTab:"Settore",sectorPresets:"Settori predefiniti",customSector:"Settore personalizzato",saveSector:"Salva settore",sectorSaved:"Settore salvato.",aiSuggest:"Suggerisci con l’IA (copia prompt)",aiSectorCopied:"Prompt copiato — incollalo in DeepSeek Harness.",fillBoth:"Inserisci utente e password.",loggingIn:"Accesso…",noOrders:"Ancora nessun ordine — conferma elementi nel riepilogo.",noUsage:"Nessun utilizzo segnalato.",noReports:"Nessun report di campo.",lvlEmployee:"Terreno",lvlLead:"Supervisore",lvlOwner:"Proprietario",labelPh:"Etichetta ruolo (es. Cuoco)",newOrder:"NUOVO ORDINE",enableNotif:"🔔 Attiva notifiche",notifHint:"Il tablet di cucina suona e lampeggia all'arrivo di un ordine.",tagline:"L'IA lavora. L'umano veglia, decide, rivede.",welcomeTitle:"Benvenuto in Le Veilleux 👁️",welcomeBody:"Tre passi per il tuo primo flusso dal vivo: 1) Aggiungi i lavoratori. 2) Scegli il settore. 3) Svolgi una conversazione reale — l'IA propone, tu confermi.",wallNote:"Si aggiorna ogni 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Proposta",tierRED:"Chiedere",export:"⬇ Esporta report",exportOrders:"⬇ Esporta conto",exportDone:"Esportazione scaricata.",deepTitle:"Analisi profonda (Reasoner)",deepPh:"Fai una domanda profonda…",deepSend:"Chiedi",deepSent:"Inviata al cervello Reasoner.",deepHint:"Il cervello Reasoner pensa a fondo e aggiunge la risposta ai report.",budget:"Budget di oggi",budgetReached:"Limite raggiunto — alzalo nelle impostazioni.",paid:"💵 Pagato",markPaid:"Segna pagato",billSummary:"Incassato: X di Y ordini"},
333
- pt:{login:"Entrar",user:"Usuário",password:"Senha",loginBtn:"Entrar",loginHint:"As contas são geridas pelo dono.",loginFailed:"Falha no login.",cannotReach:"Servidor inacessível. Está a correr?",workerAdded:"Trabalhador adicionado.",saved:"Guardado.",reportSent:"Relatório enviado.",feedbackSent:"Feedback enviado.",wallOpen:"Painel ao vivo",logout:"Sair",overview:"Visão geral",field:"Campo",rules:"Regras",reports:"Relatórios",week:"Esta semana",feedback:"Feedback",workersActive:"Trabalhadores ativos",reportsTotal:"Total de relatórios",workers:"Trabalhadores",thUser:"Usuário",thRole:"Função",addWorker:"Adicionar trabalhador",userName:"Nome de usuário",addBtn:"Adicionar",usage:"Uso e custo",usageSub:"(por trabalhador, estimado)",thWorker:"Trabalhador",thSessions:"Sessões",thTokens:"Tokens",thCost:"Custo est.",panel:"Painel de Ação",panelNote:"Os trabalhadores abrem o painel no tablet ou telemóvel.",openPanel:"Abrir painel",fieldReports:"Relatórios de campo",feedbackQueue:"Fila de feedback",feedbackHint:"O agente lê esta fila e resolve erros e melhorias.",refresh:"Atualizar",autoOn:"Auto: ON",autoOff:"Auto: OFF",rulesTitle:"Regras do negócio",rulesHint:"Estas regras treinam o semáforo.",saveRules:"Guardar regras",listen:"🎙️ OUVIR",hi:"👋 ",reportTitle:"Relatório de campo",reportPh:"O que aconteceu no seu turno?",sendReport:"Enviar",fbTitle:"Feedback de campo",fbPh:"O que aconteceu? O que deve melhorar?",sendFeedback:"Enviar",switchUser:"Trocar de usuário",wallHead:"🏭 Le Veilleux — Ao vivo",wallPulse:"Pulso do campo",noActivity:"(sem atividade)",start:"▶ INICIAR",listening:"A ouvir… fale agora",listeningHint:"A conversa é captada e dividida por pessoa.",stopListening:"⏹ Parar",summaryTitle:"Resumo da conversa",confirm:"Confirmar ✓",confirmed:"Confirmado ✓",sentNote:"Enviado para cozinha e central",newConv:"Nova conversa",ordersTitle:"Pedidos — cozinha e conta",person:"Pessoa",noSummary:"O resumo aparece aqui conforme a conversa é detetada.",prep:"A preparar",ready:"Pronto",delivered:"Entregue",sent:"Enviado",back:"Voltar",sayPh:"Fale ou escreva o que cada pessoa disse…",sendPhrase:"Enviar",dictate:"🎙️ Ditar",aiHint:"Voz e texto vão direto à IA — o resumo aparece sozinho.",micUnsupported:"Ditado não suportado",processing:"A IA está a resumir…",sectorTab:"Setor",sectorPresets:"Setores predefinidos",customSector:"Sector personalizado",saveSector:"Guardar setor",sectorSaved:"Setor guardado.",aiSuggest:"Sugerir com IA (copiar prompt)",aiSectorCopied:"Prompt copiado — cole no DeepSeek Harness.",fillBoth:"Digite usuário e senha.",loggingIn:"A entrar…",noOrders:"Ainda sem pedidos — confirme itens no resumo.",noUsage:"Ainda sem uso reportado.",noReports:"Ainda sem relatórios de campo.",lvlEmployee:"Terreno",lvlLead:"Supervisor",lvlOwner:"Dono",labelPh:"Função (ex. Cozinheiro)",newOrder:"NOVO PEDIDO",enableNotif:"🔔 Ativar notificações",notifHint:"O tablet da cozinha apita e pisca quando chega um pedido.",tagline:"A IA trabalha. O humano vela, decide, revê.",welcomeTitle:"Bem-vindo ao Le Veilleux 👁️",welcomeBody:"Três passos para o seu primeiro fluxo ao vivo: 1) Adicione os trabalhadores. 2) Escolha o setor. 3) Faça uma conversa real — a IA propõe, você confirma.",wallNote:"Atualiza a cada 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Proposta",tierRED:"Perguntar",export:"⬇ Exportar relatórios",exportOrders:"⬇ Exportar conta",exportDone:"Exportação transferida.",deepTitle:"Análise profunda (Reasoner)",deepPh:"Faça uma pergunta profunda…",deepSend:"Perguntar",deepSent:"Enviada ao cérebro Reasoner.",deepHint:"O cérebro Reasoner pensa a fundo e anexa a resposta aos relatórios.",budget:"Orçamento de hoje",budgetReached:"Limite atingido — aumente nas definições.",paid:"💵 Pago",markPaid:"Marcar pago",billSummary:"Recebido: X de Y pedidos"},
334
- zh:{login:"登录",user:"用户",password:"密码",loginBtn:"登录",loginHint:"账户由企业主管理。",loginFailed:"登录失败。",cannotReach:"无法连接服务器。它是否在运行?",workerAdded:"员工已添加。",saved:"已保存。",reportSent:"报告已发送。",feedbackSent:"反馈已发送。",wallOpen:"实时看板",logout:"退出",overview:"总览",field:"现场",rules:"规则",reports:"报告",week:"本周",feedback:"反馈",workersActive:"活跃员工",reportsTotal:"报告总数",workers:"员工",thUser:"用户",thRole:"角色",addWorker:"添加员工",userName:"用户名",addBtn:"添加",usage:"用量与成本",usageSub:"(每位员工,估算)",thWorker:"员工",thSessions:"会话",thTokens:"Token",thCost:"预估成本",panel:"操作面板",panelNote:"员工在平板或手机上打开面板。",openPanel:"打开面板",fieldReports:"现场报告",feedbackQueue:"反馈队列",feedbackHint:"智能体读取此队列并解决问题。",refresh:"刷新",autoOn:"自动:开",autoOff:"自动:关",rulesTitle:"业务规则",rulesHint:"这些规则训练红绿灯。",saveRules:"保存规则",listen:"🎙️ 聆听",hi:"👋 ",reportTitle:"现场报告",reportPh:"你的班次发生了什么?",sendReport:"发送",fbTitle:"现场反馈",fbPh:"发生了什么?什么需要改进?",sendFeedback:"发送",switchUser:"切换用户",wallHead:"🏭 Le Veilleux — 实时",wallPulse:"现场脉搏",noActivity:"(暂无现场活动)",start:"▶ 开始",listening:"正在聆听…请说话",listeningHint:"对话正在被捕捉并按人员划分。",stopListening:"⏹ 停止",summaryTitle:"对话摘要",confirm:"确认 ✓",confirmed:"已确认 ✓",sentNote:"已发送至厨房与中央系统",newConv:"新对话",ordersTitle:"订单 — 厨房与账单",person:"人员",noSummary:"随着对话被识别,摘要将显示在这里。",prep:"制作中",ready:"完成",delivered:"已送达",sent:"已发送",back:"返回",sayPh:"说出或输入每个人说的话……",sendPhrase:"发送",dictate:"🎙️ 听写",aiHint:"语音和文字直达 AI — 摘要自动出现。",micUnsupported:"此浏览器不支持听写",processing:"AI 正在总结……",sectorTab:"行业",sectorPresets:"预设行业",customSector:"自定义行业",saveSector:"保存行业",sectorSaved:"行业已保存。",aiSuggest:"用 AI 建议(复制提示)",aiSectorCopied:"AI 提示已复制 — 粘贴到 DeepSeek Harness。",fillBoth:"请输入用户名和密码。",loggingIn:"登录中……",noOrders:"暂无订单 — 请在摘要中确认项目。",noUsage:"暂无用量报告。",noReports:"暂无现场报告。",lvlEmployee:"现场",lvlLead:"主管",lvlOwner:"业主",labelPh:"角色标签(如:厨师)",newOrder:"新订单",enableNotif:"🔔 开启通知",notifHint:"新订单到达时厨房平板会响铃并闪烁。",tagline:"AI 工作,人来守护、决定、复核。",welcomeTitle:"欢迎使用 Le Veilleux 👁️",welcomeBody:"三步开始您的第一个实时流程:1) 添加员工。2) 选择行业。3) 进行真实对话 — AI 提议,您确认。",wallNote:"每 30 秒更新",tierGREEN:"自动",tierSEMI:"半自动",tierYELLOW:"提议",tierRED:"询问",export:"⬇ 导出报告",exportOrders:"⬇ 导出账单",exportDone:"导出已下载。",deepTitle:"深度分析(Reasoner)",deepPh:"提出一个深度问题……",deepSend:"提问",deepSent:"已发送至 Reasoner 大脑。",deepHint:"Reasoner 大脑深入思考并将答案附加到报告中。",budget:"今日预算",budgetReached:"已达上限 — 请在设置中提高。",paid:"💵 已付",markPaid:"标记已付",billSummary:"已收:X / Y 单"},
335
- ja:{login:"ログイン",user:"ユーザー",password:"パスワード",loginBtn:"ログイン",loginHint:"アカウントは事業主が管理します。",loginFailed:"ログイン失敗。",cannotReach:"サーバーに接続できません。起動していますか?",workerAdded:"従業員を追加しました。",saved:"保存しました。",reportSent:"報告を送信しました。",feedbackSent:"フィードバックを送信しました。",wallOpen:"ライブ掲示板",logout:"ログアウト",overview:"概要",field:"現場",rules:"ルール",reports:"報告",week:"今週",feedback:"フィードバック",workersActive:"稼働中の従業員",reportsTotal:"報告総数",workers:"従業員",thUser:"ユーザー",thRole:"役割",addWorker:"従業員を追加",userName:"ユーザー名",addBtn:"追加",usage:"利用量とコスト",usageSub:"(従業員ごと、推定)",thWorker:"従業員",thSessions:"セッション",thTokens:"トークン",thCost:"推定コスト",panel:"アクションパネル",panelNote:"従業員はタブレットやスマホでパネルを開きます。",openPanel:"パネルを開く",fieldReports:"現場報告",feedbackQueue:"フィードバック待ち行列",feedbackHint:"エージェントがこの行列を読み、問題を解決します。",refresh:"更新",autoOn:"自動: ON",autoOff:"自動: OFF",rulesTitle:"業務ルール",rulesHint:"これらのルールが信号を訓練します。",saveRules:"ルールを保存",listen:"🎙️ 聞く",hi:"👋 ",reportTitle:"現場報告",reportPh:"シフトで何がありましたか?",sendReport:"送信",fbTitle:"現場フィードバック",fbPh:"何が起きましたか?何を改善すべき?",sendFeedback:"送信",switchUser:"ユーザー切替",wallHead:"🏭 Le Veilleux — ライブ",wallPulse:"現場の鼓動",noActivity:"(まだ現場活動なし)",start:"▶ 開始",listening:"聞いています…どうぞ",listeningHint:"会話を捕捉し、人物ごとに分けています。",stopListening:"⏹ 停止",summaryTitle:"会話のまとめ",confirm:"確認 ✓",confirmed:"確認済み ✓",sentNote:"厨房と中央へ送信済み",newConv:"新しい会話",ordersTitle:"注文 — 厨房と会計",person:"人",noSummary:"会話が検出されるとここにまとめが表示されます。",prep:"調理中",ready:"完成",delivered:"提供済み",sent:"送信済み",back:"戻る",sayPh:"各人が話した内容を話すか入力…",sendPhrase:"送信",dictate:"🎙️ 音声入力",aiHint:"音声とテキストは直接AIへ — まとめは自動で表示されます。",micUnsupported:"音声入力非対応",processing:"AIが要約中…",sectorTab:"セクター",sectorPresets:"セクタープリセット",customSector:"カスタムセクター",saveSector:"セクターを保存",sectorSaved:"セクターを保存しました。",aiSuggest:"AIで提案(プロンプトをコピー)",aiSectorCopied:"AIプロンプトをコピーしました — DeepSeek Harnessに貼り付け。",fillBoth:"ユーザーとパスワードを入力してください。",loggingIn:"ログイン中…",noOrders:"まだ注文がありません — まとめで項目を確認してください。",noUsage:"まだ利用報告がありません。",noReports:"まだ現場報告がありません。",lvlEmployee:"現場",lvlLead:"監督",lvlOwner:"オーナー",labelPh:"役割名(例:調理師)",newOrder:"新規注文",enableNotif:"🔔 通知を有効化",notifHint:"注文が届くと厨房タブレットが音と点滅で知らせます。",tagline:"AIが働き、人間が見守り、決め、見直す。",welcomeTitle:"Le Veilleux へようこそ 👁️",welcomeBody:"最初のライブフローまでの3ステップ:1) 従業員を追加。2) セクターを選択。3) 実際の会話を行う — AIが提案し、あなたが確認します。",wallNote:"30秒ごとに更新",tierGREEN:"自動",tierSEMI:"半自動",tierYELLOW:"提案",tierRED:"確認",export:"⬇ 報告をエクスポート",exportOrders:"⬇ 会計をエクスポート",exportDone:"エクスポートをダウンロードしました。",deepTitle:"深層分析(Reasoner)",deepPh:"深い質問をどうぞ…",deepSend:"質問する",deepSent:"Reasoner脳に送信しました。",deepHint:"Reasoner脳が深く考え、回答を報告に追記します。",budget:"今日の予算",budgetReached:"上限に達しました — 設定で引き上げてください。",paid:"💵 支払済",markPaid:"支払済にする",billSummary:"回収済み:Y件中X件"},
336
- ko:{login:"로그인",user:"사용자",password:"비밀번호",loginBtn:"로그인",loginHint:"계정은 사업주가 관리합니다.",loginFailed:"로그인 실패.",cannotReach:"서버에 연결할 수 없습니다. 실행 중인가요?",workerAdded:"직원이 추가되었습니다.",saved:"저장되었습니다.",reportSent:"보고서를 보냈습니다.",feedbackSent:"피드백을 보냈습니다.",wallOpen:"라이브 보드",logout:"로그아웃",overview:"개요",field:"현장",rules:"규칙",reports:"보고서",week:"이번 주",feedback:"피드백",workersActive:"활성 직원",reportsTotal:"총 보고서",workers:"직원",thUser:"사용자",thRole:"역할",addWorker:"직원 추가",userName:"사용자 이름",addBtn:"추가",usage:"사용량 및 비용",usageSub:"(직원별, 추정)",thWorker:"직원",thSessions:"세션",thTokens:"토큰",thCost:"추정 비용",panel:"액션 패널",panelNote:"직원은 태블릿이나 휴대폰에서 패널을 엽니다.",openPanel:"패널 열기",fieldReports:"현장 보고서",feedbackQueue:"피드백 대기열",feedbackHint:"에이전트가 이 대기열을 읽고 문제를 해결합니다.",refresh:"새로고침",autoOn:"자동: ON",autoOff:"자동: OFF",rulesTitle:"사업 규칙",rulesHint:"이 규칙이 신호등을 훈련합니다.",saveRules:"규칙 저장",listen:"🎙️ 듣기",hi:"👋 ",reportTitle:"현장 보고서",reportPh:"근무 중 무슨 일이 있었나요?",sendReport:"보내기",fbTitle:"현장 피드백",fbPh:"무슨 일이 있었나요? 무엇을 개선할까요?",sendFeedback:"보내기",switchUser:"사용자 전환",wallHead:"🏭 Le Veilleux — 라이브",wallPulse:"현장의 맥박",noActivity:"(현장 활동 없음)",start:"▶ 시작",listening:"듣는 중… 말씀하세요",listeningHint:"대화를 포착하여 사람별로 나누고 있습니다.",stopListening:"⏹ 중지",summaryTitle:"대화 요약",confirm:"확인 ✓",confirmed:"확인됨 ✓",sentNote:"주방 및 중앙으로 전송됨",newConv:"새 대화",ordersTitle:"주문 — 주방 및 계산",person:"사람",noSummary:"대화가 감지되면 요약이 여기에 표시됩니다.",prep:"조리 중",ready:"완료",delivered:"서빙됨",sent:"전송됨",back:"뒤로",sayPh:"각 사람이 말한 내용을 말하거나 입력…",sendPhrase:"보내기",dictate:"🎙️ 받아쓰기",aiHint:"음성과 텍스트가 AI로 바로 전달 — 요약이 자동 표시됩니다.",micUnsupported:"받아쓰기 미지원",processing:"AI가 요약 중…",sectorTab:"업종",sectorPresets:"업종 프리셋",customSector:"사용자 정의 업종",saveSector:"업종 저장",sectorSaved:"업종이 저장되었습니다.",aiSuggest:"AI로 제안(프롬프트 복사)",aiSectorCopied:"AI 프롬프트 복사됨 — DeepSeek Harness에 붙여넣기.",fillBoth:"사용자와 비밀번호를 입력하세요.",loggingIn:"로그인 중…",noOrders:"아직 주문이 없습니다 — 요약에서 항목을 확인하세요.",noUsage:"아직 사용 보고가 없습니다.",noReports:"아직 현장 보고서가 없습니다.",lvlEmployee:"현장",lvlLead:"감독",lvlOwner:"소유주",labelPh:"역할 이름(예: 요리사)",newOrder:"새 주문",enableNotif:"🔔 알림 활성화",notifHint:"주문이 도착하면 주방 태블릿이 소리와 함께 깜박입니다.",tagline:"AI가 일하고 사람이 지키고, 결정하고, 검토합니다.",welcomeTitle:"Le Veilleux에 오신 것을 환영합니다 👁️",welcomeBody:"첫 라이브 흐름까지 3단계: 1) 직원 추가. 2) 업종 선택. 3) 실제 대화 진행 — AI가 제안하고 당신이 확인합니다.",wallNote:"30초마다 업데이트",tierGREEN:"자동",tierSEMI:"반자동",tierYELLOW:"제안",tierRED:"질문",export:"⬇ 보고서 내보내기",exportOrders:"⬇ 계산서 내보내기",exportDone:"내보내기가 다운로드되었습니다.",deepTitle:"심층 분석(Reasoner)",deepPh:"깊은 질문을 하세요…",deepSend:"질문하기",deepSent:"Reasoner 두뇌로 전송됨.",deepHint:"Reasoner 두뇌가 깊이 생각하고 답변을 보고서에 추가합니다.",budget:"오늘의 예산",budgetReached:"한도 도달 — 설정에서 올리세요.",paid:"💵 결제됨",markPaid:"결제 표시",billSummary:"수금: Y건 중 X건"},
337
- ar:{login:"تسجيل الدخول",user:"المستخدم",password:"كلمة المرور",loginBtn:"دخول",loginHint:"الحسابات يديرها صاحب العمل.",loginFailed:"فشل تسجيل الدخول.",cannotReach:"تعذر الوصول إلى الخادم. هل هو قيد التشغيل؟",workerAdded:"تمت إضافة الموظف.",saved:"تم الحفظ.",reportSent:"تم إرسال التقرير.",feedbackSent:"تم إرسال الملاحظات.",wallOpen:"اللوحة المباشرة",logout:"خروج",overview:"نظرة عامة",field:"الميدان",rules:"القواعد",reports:"التقارير",week:"هذا الأسبوع",feedback:"الملاحظات",workersActive:"موظفون نشطون",reportsTotal:"إجمالي التقارير",workers:"الموظفون",thUser:"المستخدم",thRole:"الدور",addWorker:"إضافة موظف",userName:"اسم المستخدم",addBtn:"إضافة",usage:"الاستخدام والتكلفة",usageSub:"(لكل موظف، تقديري)",thWorker:"الموظف",thSessions:"الجلسات",thTokens:"الرموز",thCost:"التكلفة التقديرية",panel:"لوحة الإجراءات",panelNote:"يفتح الموظفون اللوحة من أجهزتهم.",openPanel:"فتح اللوحة",fieldReports:"تقارير الميدان",feedbackQueue:"قائمة الملاحظات",feedbackHint:"يقرأ الوكيل هذه القائمة ويحل المشكلات.",refresh:"تحديث",autoOn:"تلقائي: ON",autoOff:"تلقائي: OFF",rulesTitle:"قواعد العمل",rulesHint:"هذه القواعد تدرّب الإشارة الضوئية.",saveRules:"حفظ القواعد",listen:"🎙️ استمع",hi:"👋 ",reportTitle:"تقرير ميداني",reportPh:"ماذا حدث في نوبتك؟",sendReport:"إرسال",fbTitle:"ملاحظات ميدانية",fbPh:"ماذا حدث؟ ما الذي يجب تحسينه؟",sendFeedback:"إرسال",switchUser:"تبديل المستخدم",wallHead:"🏭 Le Veilleux — مباشر",wallPulse:"نبض الميدان",noActivity:"(لا نشاط بعد)",start:"▶ ابدأ",listening:"أستمع… تفضل بالحديث",listeningHint:"يتم التقاط المحادثة وتقسيمها حسب الأشخاص.",stopListening:"⏹ إيقاف",summaryTitle:"ملخص المحادثة",confirm:"تأكيد ✓",confirmed:"مؤكد ✓",sentNote:"أُرسل إلى المطبخ والنظام المركزي",newConv:"محادثة جديدة",ordersTitle:"الطلبات — المطبخ والحساب",person:"شخص",noSummary:"سيظهر الملخص هنا مع اكتشاف المحادثة.",prep:"قيد التحضير",ready:"جاهز",delivered:"تم التسليم",sent:"أُرسل",back:"رجوع",sayPh:"تحدث أو اكتب ما قاله كل شخص…",sendPhrase:"إرسال",dictate:"🎙️ إملاء",aiHint:"الصوت والنص يصلان مباشرة إلى الذكاء الاصطناعي — يظهر الملخص تلقائيًا.",micUnsupported:"الإملاء غير مدعوم",processing:"الذكاء الاصطناعي يلخّص…",sectorTab:"القطاع",sectorPresets:"القطاعات المحددة مسبقًا",customSector:"قطاع مخصص",saveSector:"حفظ القطاع",sectorSaved:"تم حفظ القطاع.",aiSuggest:"اقترح بالذكاء الاصطناعي (نسخ الموجه)",aiSectorCopied:"تم نسخ الموجه — الصقه في DeepSeek Harness.",fillBoth:"أدخل المستخدم وكلمة المرور.",loggingIn:"جارٍ الدخول…",noOrders:"لا توجد طلبات بعد — أكّد العناصر في الملخص.",noUsage:"لا يوجد استخدام مُبلّغ بعد.",noReports:"لا توجد تقارير ميدانية بعد.",lvlEmployee:"الميدان",lvlLead:"مشرف",lvlOwner:"المالك",labelPh:"مسمى الدور (مثال: طباخ)",newOrder:"طلب جديد",enableNotif:"🔔 تفعيل الإشعارات",notifHint:"يصدر صوت ويومض لوح المطبخ عند وصول طلب جديد.",tagline:"الذكاء الاصطناعي يعمل، والإنسان يراقب ويقرر ويراجع.",welcomeTitle:"مرحبًا بك في Le Veilleux 👁️",welcomeBody:"ثلاث خطوات لأول تدفق مباشر: 1) أضف العاملين. 2) اختر القطاع. 3) أجري محادثة حقيقية — الذكاء الاصطناعي يقترح وأنت تؤكد.",wallNote:"يتحدث كل 30 ثانية",tierGREEN:"تلقائي",tierSEMI:"شبه تلقائي",tierYELLOW:"مقترح",tierRED:"اسأل",export:"⬇ تصدير التقارير",exportOrders:"⬇ تصدير الحساب",exportDone:"تم تنزيل التصدير.",deepTitle:"تحليل عميق (Reasoner)",deepPh:"اطرح سؤالًا عميقًا…",deepSend:"اسأل",deepSent:"أُرسل إلى دماغ Reasoner.",deepHint:"يفكر دماغ Reasoner بعمق ويضيف إجابته إلى التقارير.",budget:"ميزانية اليوم",budgetReached:"تم بلوغ الحد — ارفعه في الإعدادات.",paid:"💵 مدفوع",markPaid:"وضع علامة مدفوع",billSummary:"المُحصَّل: X من Y طلبًا"}
341
+ en:{login:"Log in",user:"User",password:"Password",loginBtn:"Log in",loginHint:"Accounts are managed by the business owner.",loginFailed:"Login failed.",cannotReach:"Cannot reach the supervisor server. Is it running?",workerAdded:"Worker added.",saved:"Saved.",reportSent:"Report sent.",feedbackSent:"Feedback sent.",wallOpen:"Live wallboard",logout:"Log out",overview:"Overview",field:"Field",rules:"Rules",reports:"Reports",week:"This week",feedback:"Feedback",workersActive:"Workers active",reportsTotal:"Reports total",workers:"Workers",thUser:"User",thRole:"Role",addWorker:"Add worker",userName:"User name",addBtn:"Add worker",usage:"Usage & cost",usageSub:"(per worker, estimated)",thWorker:"Worker",thSessions:"Sessions",thTokens:"Tokens",thCost:"Est. cost",panel:"Action Panel",panelNote:"Workers open the panel from their tablet or phone.",openPanel:"Open Action Panel",fieldReports:"Field reports",feedbackQueue:"Feedback queue",feedbackHint:"The agent reads this queue and resolves errors and improvements.",refresh:"Refresh",autoOn:"Auto-refresh: ON",autoOff:"Auto-refresh: OFF",rulesTitle:"Business rules",rulesHint:"These rules train the traffic light.",saveRules:"Save rules",listen:"🎙️ LISTEN",hi:"👋 ",reportTitle:"Field report",reportPh:"What happened on your shift?",sendReport:"Send report",fbTitle:"Field feedback",fbPh:"What happened? What should improve?",sendFeedback:"Send feedback",switchUser:"Switch user",wallHead:"🏭 Le Veilleux — Live",wallPulse:"Field pulse",noActivity:"(no field activity yet)",start:"▶ START",listening:"Listening… speak now",listeningHint:"The conversation is being captured and split by person.",stopListening:"⏹ Stop listening",summaryTitle:"Conversation summary",confirm:"Confirm ✓",confirmed:"Confirmed ✓",sentNote:"Sent to kitchen & central",newConv:"New conversation",ordersTitle:"Orders — kitchen & bill",person:"Person",noSummary:"The summary will appear here as the conversation is detected.",prep:"Preparing",ready:"Ready",delivered:"Delivered",sent:"Sent",back:"Back",sayPh:"Speak or type what each person said…",sendPhrase:"Send phrase",dictate:"🎙️ Dictate",aiHint:"Speech and text go straight to the AI — the summary appears automatically.",micUnsupported:"Dictation not supported in this browser",processing:"The AI is summarizing…",sectorTab:"Sector",sectorPresets:"Sector presets",customSector:"Custom sector",saveSector:"Save sector",sectorSaved:"Sector saved.",aiSuggest:"Suggest with AI (copy prompt)",aiSectorCopied:"AI prompt copied — paste it in DeepSeek Harness.",fillBoth:"Enter your user and password.",loggingIn:"Logging in…",noOrders:"No orders yet — confirm items in the summary.",noUsage:"No usage reported yet.",noReports:"No field reports yet.",lvlEmployee:"Field",lvlLead:"Supervisor",lvlOwner:"Owner",labelPh:"Role label (e.g. Cook)",newOrder:"NEW ORDER",enableNotif:"🔔 Enable notifications",notifHint:"The kitchen tablet beeps and flashes when an order arrives.",tagline:"The AI works. The human watches, decides, reviews.",welcomeTitle:"Welcome to Le Veilleux 👁️",welcomeBody:"Three steps to your first live flow: 1) Add your workers. 2) Choose your sector. 3) Run a real conversation — the AI proposes, you confirm.",wallNote:"Updates every 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Proposal",tierRED:"Ask",export:"⬇ Export reports",exportOrders:"⬇ Export bill",exportDone:"Export downloaded.",deepTitle:"Deep analysis (Reasoner)",deepPh:"Ask a deep question…",deepSend:"Ask deep",deepSent:"Sent to the Reasoner brain.",deepHint:"The Reasoner brain thinks deeply and appends its answer to the reports.",budget:"Today's budget",budgetReached:"Limit reached — raise it in Settings.",paid:"💵 Paid",markPaid:"Mark paid",billSummary:"Collected: X of Y orders",regTitle:"🪙 Virtual register",regOpen:"Open register",regItem:"Item",regPrice:"Price",regAdd:"Add",regTotal:"Total",regSale:"💳 Record sale",regHint:"Record the sale here, then charge the customer with the physical terminal.",regClose:"Close register",regDeclared:"Terminal total at close",regDayTitle:"🪙 Day register (counter-audit)",regRecorded:"Recorded (Le Veilleux)",regDeclared2:"Declared (terminal)",regVariance:"Variance",exportReg:"⬇ Export Z-report"},
342
+ es:{login:"Iniciar sesión",user:"Usuario",password:"Contraseña",loginBtn:"Entrar",loginHint:"Las cuentas las gestiona el dueño del negocio.",loginFailed:"Datos incorrectos.",cannotReach:"No se puede contactar el servidor. ¿Está corriendo?",workerAdded:"Trabajador añadido.",saved:"Guardado.",reportSent:"Reporte enviado.",feedbackSent:"Feedback enviado.",wallOpen:"Wallboard en vivo",logout:"Salir",overview:"Resumen",field:"Campo",rules:"Reglas",reports:"Reportes",week:"Esta semana",feedback:"Feedback",workersActive:"Trabajadores activos",reportsTotal:"Reportes totales",workers:"Trabajadores",thUser:"Usuario",thRole:"Rol",addWorker:"Añadir trabajador",userName:"Nombre de usuario",addBtn:"Añadir trabajador",usage:"Uso y coste",usageSub:"(por trabajador, estimado)",thWorker:"Trabajador",thSessions:"Sesiones",thTokens:"Tokens",thCost:"Coste est.",panel:"Panel de Acción",panelNote:"Los trabajadores abren el panel desde su tablet o teléfono.",openPanel:"Abrir Panel de Acción",fieldReports:"Reportes de campo",feedbackQueue:"Cola de feedback",feedbackHint:"El agente lee esta cola y resuelve errores y mejoras.",refresh:"Actualizar",autoOn:"Auto: ON",autoOff:"Auto: OFF",rulesTitle:"Reglas del negocio",rulesHint:"Estas reglas entrenan el semáforo.",saveRules:"Guardar reglas",listen:"🎙️ ESCUCHAR",hi:"👋 ",reportTitle:"Reporte de campo",reportPh:"¿Qué pasó en tu turno?",sendReport:"Enviar reporte",fbTitle:"Feedback de campo",fbPh:"¿Qué pasó? ¿Qué debe mejorar?",sendFeedback:"Enviar feedback",switchUser:"Cambiar de usuario",wallHead:"🏭 Le Veilleux — En vivo",wallPulse:"Pulso del campo",noActivity:"(sin actividad de campo aún)",start:"▶ INICIAR",listening:"Escuchando… habla ahora",listeningHint:"La conversación se captura y divide por persona.",stopListening:"⏹ Detener",summaryTitle:"Resumen de la conversación",confirm:"Confirmar ✓",confirmed:"Confirmado ✓",sentNote:"Enviado a cocina y central",newConv:"Nueva conversación",ordersTitle:"Pedidos — cocina y cuenta",person:"Persona",noSummary:"El resumen aparecerá aquí conforme se detecta la conversación.",prep:"Preparando",ready:"Listo",delivered:"Entregado",sent:"Enviado",back:"Volver",sayPh:"Habla o escribe lo que dijo cada persona…",sendPhrase:"Enviar frase",dictate:"🎙️ Dictar",aiHint:"Voz y texto van directo a la IA — el resumen aparece solo.",micUnsupported:"Dictado no soportado en este navegador",processing:"La IA está resumiendo…",sectorTab:"Sector",sectorPresets:"Sectores predefinidos",customSector:"Sector personalizado",saveSector:"Guardar sector",sectorSaved:"Sector guardado.",aiSuggest:"Sugerir con IA (copiar prompt)",aiSectorCopied:"Prompt de IA copiado — pégalo en DeepSeek Harness.",fillBoth:"Escribe tu usuario y contraseña.",loggingIn:"Entrando…",noOrders:"Aún no hay pedidos — confirma elementos en el resumen.",noUsage:"Aún no hay uso reportado.",noReports:"Aún no hay reportes de campo.",lvlEmployee:"Terreno",lvlLead:"Supervisor",lvlOwner:"Dueño",labelPh:"Etiqueta de rol (ej. Cocinero)",newOrder:"NUEVO PEDIDO",enableNotif:"🔔 Activar notificaciones",notifHint:"La tablet de cocina suena y parpadea cuando llega un pedido.",tagline:"La IA trabaja. El humano vela, decide, revisa.",welcomeTitle:"Bienvenido a Le Veilleux 👁️",welcomeBody:"Tres pasos para tu primer flujo en vivo: 1) Añade a tus trabajadores. 2) Elige tu sector. 3) Corre una conversación real — la IA propone, tú confirmas.",wallNote:"Se actualiza cada 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Propuesta",tierRED:"Preguntar",export:"⬇ Exportar reportes",exportOrders:"⬇ Exportar cuenta",exportDone:"Exportación descargada.",deepTitle:"Análisis profundo (Reasoner)",deepPh:"Haz una pregunta profunda…",deepSend:"Preguntar",deepSent:"Enviada al cerebro Reasoner.",deepHint:"El cerebro Reasoner piensa a fondo y anexa su respuesta a los reportes.",budget:"Presupuesto de hoy",budgetReached:"Límite alcanzado — súbelo en Ajustes.",paid:"💵 Pagado",markPaid:"Marcar pagado",billSummary:"Cobrado: X de Y pedidos",regTitle:"🪙 Caja virtual",regOpen:"Abrir caja",regItem:"Artículo",regPrice:"Precio",regAdd:"Añadir",regTotal:"Total",regSale:"💳 Registrar venta",regHint:"Registra la venta aquí y cobra con la terminal física.",regClose:"Cerrar caja",regDeclared:"Total de la terminal al cierre",regDayTitle:"🪙 Caja del día (contra-auditoría)",regRecorded:"Registrado (Le Veilleux)",regDeclared2:"Declarado (terminal)",regVariance:"Diferencia",exportReg:"⬇ Exportar reporte Z"},
343
+ fr:{login:"Connexion",user:"Utilisateur",password:"Mot de passe",loginBtn:"Se connecter",loginHint:"Les comptes sont gérés par le propriétaire.",loginFailed:"Échec de connexion.",cannotReach:"Serveur injoignable. Est-il lancé ?",workerAdded:"Employé ajouté.",saved:"Enregistré.",reportSent:"Rapport envoyé.",feedbackSent:"Feedback envoyé.",wallOpen:"Tableau en direct",logout:"Déconnexion",overview:"Vue d'ensemble",field:"Terrain",rules:"Règles",reports:"Rapports",week:"Cette semaine",feedback:"Feedback",workersActive:"Employés actifs",reportsTotal:"Total rapports",workers:"Employés",thUser:"Utilisateur",thRole:"Rôle",addWorker:"Ajouter un employé",userName:"Nom d'utilisateur",addBtn:"Ajouter",usage:"Usage et coût",usageSub:"(par employé, estimé)",thWorker:"Employé",thSessions:"Sessions",thTokens:"Jetons",thCost:"Coût est.",panel:"Panneau d'action",panelNote:"Les employés ouvrent le panneau depuis leur tablette ou téléphone.",openPanel:"Ouvrir le panneau",fieldReports:"Rapports terrain",feedbackQueue:"File de feedback",feedbackHint:"L'agent lit cette file et résout erreurs et améliorations.",refresh:"Actualiser",autoOn:"Auto : ON",autoOff:"Auto : OFF",rulesTitle:"Règles du commerce",rulesHint:"Ces règles entraînent le feu tricolore.",saveRules:"Enregistrer",listen:"🎙️ ÉCOUTER",hi:"👋 ",reportTitle:"Rapport terrain",reportPh:"Que s'est-il passé pendant votre quart ?",sendReport:"Envoyer",fbTitle:"Feedback terrain",fbPh:"Que s'est-il passé ? Que faut-il améliorer ?",sendFeedback:"Envoyer",switchUser:"Changer d'utilisateur",wallHead:"🏭 Le Veilleux — En direct",wallPulse:"Pouls du terrain",noActivity:"(aucune activité)",start:"▶ DÉMARRER",listening:"Écoute… parlez maintenant",listeningHint:"La conversation est captée et répartie par personne.",stopListening:"⏹ Arrêter",summaryTitle:"Résumé de la conversation",confirm:"Confirmer ✓",confirmed:"Confirmé ✓",sentNote:"Envoyé en cuisine et au central",newConv:"Nouvelle conversation",ordersTitle:"Commandes — cuisine et addition",person:"Personne",noSummary:"Le résumé apparaîtra ici au fil de la conversation.",prep:"En préparation",ready:"Prêt",delivered:"Servi",sent:"Envoyé",back:"Retour",sayPh:"Parlez ou écrivez ce que chaque personne a dit…",sendPhrase:"Envoyer",dictate:"🎙️ Dicter",aiHint:"La voix et le texte vont directement à l’IA — le résumé apparaît seul.",micUnsupported:"Dictée non prise en charge",processing:"L’IA résume…",sectorTab:"Secteur",sectorPresets:"Secteurs prédéfinis",customSector:"Secteur personnalisé",saveSector:"Enregistrer le secteur",sectorSaved:"Secteur enregistré.",aiSuggest:"Suggérer avec l’IA (copier l’invite)",aiSectorCopied:"Invite copiée — collez-la dans DeepSeek Harness.",fillBoth:"Saisissez votre utilisateur et votre mot de passe.",loggingIn:"Connexion…",noOrders:"Aucune commande — confirmez des éléments dans le résumé.",noUsage:"Aucun usage signalé.",noReports:"Aucun rapport terrain.",lvlEmployee:"Terrain",lvlLead:"Superviseur",lvlOwner:"Propriétaire",labelPh:"Intitulé du rôle (ex. Cuisinier)",newOrder:"NOUVELLE COMMANDE",enableNotif:"🔔 Activer les notifications",notifHint:"La tablette de cuisine sonne et clignote à l'arrivée d'une commande.",tagline:"L'IA travaille. L'humain veille, décide, revoit.",welcomeTitle:"Bienvenue chez Le Veilleux 👁️",welcomeBody:"Trois étapes vers votre premier flux en direct : 1) Ajoutez vos employés. 2) Choisissez votre secteur. 3) Déroulez une vraie conversation — l'IA propose, vous confirmez.",wallNote:"Mise à jour toutes les 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Proposition",tierRED:"Demander",export:"⬇ Exporter les rapports",exportOrders:"⬇ Exporter l'addition",exportDone:"Exportation téléchargée.",deepTitle:"Analyse approfondie (Reasoner)",deepPh:"Posez une question profonde…",deepSend:"Demander",deepSent:"Envoyée au cerveau Reasoner.",deepHint:"Le cerveau Reasoner réfléchit en profondeur et ajoute sa réponse aux rapports.",budget:"Budget du jour",budgetReached:"Limite atteinte — augmentez-la dans les réglages.",paid:"💵 Payé",markPaid:"Marquer payé",billSummary:"Encaissé : X sur Y commandes",regTitle:"🪙 Caisse virtuelle",regOpen:"Ouvrir la caisse",regItem:"Article",regPrice:"Prix",regAdd:"Ajouter",regTotal:"Total",regSale:"💳 Enregistrer la vente",regHint:"Enregistrez la vente ici, puis encaissez avec le terminal physique.",regClose:"Fermer la caisse",regDeclared:"Total du terminal à la fermeture",regDayTitle:"🪙 Caisse du jour (contre-audit)",regRecorded:"Enregistré (Le Veilleux)",regDeclared2:"Déclaré (terminal)",regVariance:"Écart",exportReg:"⬇ Exporter le rapport Z"},
344
+ de:{login:"Anmelden",user:"Benutzer",password:"Passwort",loginBtn:"Anmelden",loginHint:"Konten verwaltet der Inhaber.",loginFailed:"Anmeldung fehlgeschlagen.",cannotReach:"Server nicht erreichbar. Läuft er?",workerAdded:"Mitarbeiter hinzugefügt.",saved:"Gespeichert.",reportSent:"Bericht gesendet.",feedbackSent:"Feedback gesendet.",wallOpen:"Live-Anzeige",logout:"Abmelden",overview:"Übersicht",field:"Feld",rules:"Regeln",reports:"Berichte",week:"Diese Woche",feedback:"Feedback",workersActive:"Aktive Mitarbeiter",reportsTotal:"Berichte gesamt",workers:"Mitarbeiter",thUser:"Benutzer",thRole:"Rolle",addWorker:"Mitarbeiter hinzufügen",userName:"Benutzername",addBtn:"Hinzufügen",usage:"Nutzung & Kosten",usageSub:"(pro Mitarbeiter, geschätzt)",thWorker:"Mitarbeiter",thSessions:"Sitzungen",thTokens:"Tokens",thCost:"Kosten ca.",panel:"Aktionspanel",panelNote:"Mitarbeiter öffnen das Panel auf Tablet oder Handy.",openPanel:"Panel öffnen",fieldReports:"Feldberichte",feedbackQueue:"Feedback-Warteschlange",feedbackHint:"Der Agent liest diese Warteschlange und behebt Fehler.",refresh:"Aktualisieren",autoOn:"Auto: AN",autoOff:"Auto: AUS",rulesTitle:"Geschäftsregeln",rulesHint:"Diese Regeln trainieren die Ampel.",saveRules:"Regeln speichern",listen:"🎙️ ZUHÖREN",hi:"👋 ",reportTitle:"Feldbericht",reportPh:"Was ist in Ihrer Schicht passiert?",sendReport:"Senden",fbTitle:"Feld-Feedback",fbPh:"Was ist passiert? Was soll besser werden?",sendFeedback:"Senden",switchUser:"Benutzer wechseln",wallHead:"🏭 Le Veilleux — Live",wallPulse:"Puls im Feld",noActivity:"(noch keine Aktivität)",start:"▶ STARTEN",listening:"Höre zu… sprich jetzt",listeningHint:"Das Gespräch wird erfasst und pro Person aufgeteilt.",stopListening:"⏹ Stopp",summaryTitle:"Gesprächsübersicht",confirm:"Bestätigen ✓",confirmed:"Bestätigt ✓",sentNote:"An Küche & Zentrale gesendet",newConv:"Neues Gespräch",ordersTitle:"Bestellungen — Küche & Rechnung",person:"Person",noSummary:"Die Übersicht erscheint hier, sobald das Gespräch erkannt wird.",prep:"In Zubereitung",ready:"Fertig",delivered:"Serviert",sent:"Gesendet",back:"Zurück",sayPh:"Sprechen oder tippen Sie, was jede Person gesagt hat…",sendPhrase:"Senden",dictate:"🎙️ Diktieren",aiHint:"Sprache und Text gehen direkt an die KI — die Übersicht erscheint automatisch.",micUnsupported:"Diktat nicht unterstützt",processing:"Die KI fasst zusammen…",sectorTab:"Branche",sectorPresets:"Branchen-Vorlagen",customSector:"Eigene Branche",saveSector:"Branche speichern",sectorSaved:"Branche gespeichert.",aiSuggest:"Mit KI vorschlagen (Prompt kopieren)",aiSectorCopied:"KI-Prompt kopiert — in DeepSeek Harness einfügen.",fillBoth:"Benutzer und Passwort eingeben.",loggingIn:"Anmeldung…",noOrders:"Noch keine Bestellungen — Elemente in der Übersicht bestätigen.",noUsage:"Noch keine Nutzung gemeldet.",noReports:"Noch keine Feldberichte.",lvlEmployee:"Feld",lvlLead:"Aufsicht",lvlOwner:"Inhaber",labelPh:"Rollenname (z. B. Koch)",newOrder:"NEUE BESTELLUNG",enableNotif:"🔔 Benachrichtigungen aktivieren",notifHint:"Das Küchen-Tablet piept und blinkt bei neuer Bestellung.",tagline:"Die KI arbeitet. Der Mensch wacht, entscheidet, prüft.",welcomeTitle:"Willkommen bei Le Veilleux 👁️",welcomeBody:"Drei Schritte zu Ihrem ersten Live-Ablauf: 1) Mitarbeiter hinzufügen. 2) Branche wählen. 3) Ein echtes Gespräch führen — die KI schlägt vor, Sie bestätigen.",wallNote:"Aktualisiert alle 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Vorschlag",tierRED:"Fragen",export:"⬇ Berichte exportieren",exportOrders:"⬇ Rechnung exportieren",exportDone:"Export heruntergeladen.",deepTitle:"Tiefenanalyse (Reasoner)",deepPh:"Stellen Sie eine tiefe Frage…",deepSend:"Fragen",deepSent:"An das Reasoner-Gehirn gesendet.",deepHint:"Das Reasoner-Gehirn denkt gründlich nach und hängt die Antwort an die Berichte an.",budget:"Tagesbudget",budgetReached:"Limit erreicht — in den Einstellungen erhöhen.",paid:"💵 Bezahlt",markPaid:"Als bezahlt markieren",billSummary:"Kassiert: X von Y Bestellungen",regTitle:"🪙 Virtuelle Kasse",regOpen:"Kasse öffnen",regItem:"Artikel",regPrice:"Preis",regAdd:"Hinzufügen",regTotal:"Summe",regSale:"💳 Verkauf erfassen",regHint:"Erfassen Sie den Verkauf hier und kassieren Sie am physischen Terminal.",regClose:"Kasse schließen",regDeclared:"Terminal-Summe beim Abschluss",regDayTitle:"🪙 Tageskasse (Gegenprüfung)",regRecorded:"Erfasst (Le Veilleux)",regDeclared2:"Gemeldet (Terminal)",regVariance:"Abweichung",exportReg:"⬇ Z-Bericht exportieren"},
345
+ it:{login:"Accedi",user:"Utente",password:"Password",loginBtn:"Accedi",loginHint:"Gli account li gestisce il proprietario.",loginFailed:"Accesso fallito.",cannotReach:"Server non raggiungibile. È in esecuzione?",workerAdded:"Lavoratore aggiunto.",saved:"Salvato.",reportSent:"Report inviato.",feedbackSent:"Feedback inviato.",wallOpen:"Schermo live",logout:"Esci",overview:"Panoramica",field:"Campo",rules:"Regole",reports:"Report",week:"Questa settimana",feedback:"Feedback",workersActive:"Lavoratori attivi",reportsTotal:"Report totali",workers:"Lavoratori",thUser:"Utente",thRole:"Ruolo",addWorker:"Aggiungi lavoratore",userName:"Nome utente",addBtn:"Aggiungi",usage:"Uso e costi",usageSub:"(per lavoratore, stimato)",thWorker:"Lavoratore",thSessions:"Sessioni",thTokens:"Token",thCost:"Costo stim.",panel:"Pannello Azioni",panelNote:"I lavoratori aprono il pannello da tablet o telefono.",openPanel:"Apri il pannello",fieldReports:"Report di campo",feedbackQueue:"Coda feedback",feedbackHint:"L'agente legge questa coda e risolve errori e migliorie.",refresh:"Aggiorna",autoOn:"Auto: ON",autoOff:"Auto: OFF",rulesTitle:"Regole del negozio",rulesHint:"Queste regole addestrano il semaforo.",saveRules:"Salva regole",listen:"🎙️ ASCOLTA",hi:"👋 ",reportTitle:"Report di campo",reportPh:"Cosa è successo nel tuo turno?",sendReport:"Invia",fbTitle:"Feedback di campo",fbPh:"Cosa è successo? Cosa va migliorato?",sendFeedback:"Invia",switchUser:"Cambia utente",wallHead:"🏭 Le Veilleux — Live",wallPulse:"Battito del campo",noActivity:"(nessuna attività)",start:"▶ INIZIA",listening:"In ascolto… parla ora",listeningHint:"La conversazione viene catturata e divisa per persona.",stopListening:"⏹ Ferma",summaryTitle:"Riepilogo conversazione",confirm:"Conferma ✓",confirmed:"Confermato ✓",sentNote:"Inviato a cucina e centrale",newConv:"Nuova conversazione",ordersTitle:"Ordini — cucina e conto",person:"Persona",noSummary:"Il riepilogo apparirà qui man mano che la conversazione viene rilevata.",prep:"In preparazione",ready:"Pronto",delivered:"Servito",sent:"Inviato",back:"Indietro",sayPh:"Parla o scrivi cosa ha detto ogni persona…",sendPhrase:"Invia",dictate:"🎙️ Detta",aiHint:"Voce e testo vanno direttamente all’IA — il riepilogo appare da solo.",micUnsupported:"Dettatura non supportata",processing:"L’IA sta riassumendo…",sectorTab:"Settore",sectorPresets:"Settori predefiniti",customSector:"Settore personalizzato",saveSector:"Salva settore",sectorSaved:"Settore salvato.",aiSuggest:"Suggerisci con l’IA (copia prompt)",aiSectorCopied:"Prompt copiato — incollalo in DeepSeek Harness.",fillBoth:"Inserisci utente e password.",loggingIn:"Accesso…",noOrders:"Ancora nessun ordine — conferma elementi nel riepilogo.",noUsage:"Nessun utilizzo segnalato.",noReports:"Nessun report di campo.",lvlEmployee:"Terreno",lvlLead:"Supervisore",lvlOwner:"Proprietario",labelPh:"Etichetta ruolo (es. Cuoco)",newOrder:"NUOVO ORDINE",enableNotif:"🔔 Attiva notifiche",notifHint:"Il tablet di cucina suona e lampeggia all'arrivo di un ordine.",tagline:"L'IA lavora. L'umano veglia, decide, rivede.",welcomeTitle:"Benvenuto in Le Veilleux 👁️",welcomeBody:"Tre passi per il tuo primo flusso dal vivo: 1) Aggiungi i lavoratori. 2) Scegli il settore. 3) Svolgi una conversazione reale — l'IA propone, tu confermi.",wallNote:"Si aggiorna ogni 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Proposta",tierRED:"Chiedere",export:"⬇ Esporta report",exportOrders:"⬇ Esporta conto",exportDone:"Esportazione scaricata.",deepTitle:"Analisi profonda (Reasoner)",deepPh:"Fai una domanda profonda…",deepSend:"Chiedi",deepSent:"Inviata al cervello Reasoner.",deepHint:"Il cervello Reasoner pensa a fondo e aggiunge la risposta ai report.",budget:"Budget di oggi",budgetReached:"Limite raggiunto — alzalo nelle impostazioni.",paid:"💵 Pagato",markPaid:"Segna pagato",billSummary:"Incassato: X di Y ordini",regTitle:"🪙 Cassa virtuale",regOpen:"Apri cassa",regItem:"Articolo",regPrice:"Prezzo",regAdd:"Aggiungi",regTotal:"Totale",regSale:"💳 Registra vendita",regHint:"Registra la vendita qui, poi incassa con il terminale fisico.",regClose:"Chiudi cassa",regDeclared:"Totale terminale alla chiusura",regDayTitle:"🪙 Cassa del giorno (contro-verifica)",regRecorded:"Registrato (Le Veilleux)",regDeclared2:"Dichiarato (terminale)",regVariance:"Scarto",exportReg:"⬇ Esporta rapporto Z"},
346
+ pt:{login:"Entrar",user:"Usuário",password:"Senha",loginBtn:"Entrar",loginHint:"As contas são geridas pelo dono.",loginFailed:"Falha no login.",cannotReach:"Servidor inacessível. Está a correr?",workerAdded:"Trabalhador adicionado.",saved:"Guardado.",reportSent:"Relatório enviado.",feedbackSent:"Feedback enviado.",wallOpen:"Painel ao vivo",logout:"Sair",overview:"Visão geral",field:"Campo",rules:"Regras",reports:"Relatórios",week:"Esta semana",feedback:"Feedback",workersActive:"Trabalhadores ativos",reportsTotal:"Total de relatórios",workers:"Trabalhadores",thUser:"Usuário",thRole:"Função",addWorker:"Adicionar trabalhador",userName:"Nome de usuário",addBtn:"Adicionar",usage:"Uso e custo",usageSub:"(por trabalhador, estimado)",thWorker:"Trabalhador",thSessions:"Sessões",thTokens:"Tokens",thCost:"Custo est.",panel:"Painel de Ação",panelNote:"Os trabalhadores abrem o painel no tablet ou telemóvel.",openPanel:"Abrir painel",fieldReports:"Relatórios de campo",feedbackQueue:"Fila de feedback",feedbackHint:"O agente lê esta fila e resolve erros e melhorias.",refresh:"Atualizar",autoOn:"Auto: ON",autoOff:"Auto: OFF",rulesTitle:"Regras do negócio",rulesHint:"Estas regras treinam o semáforo.",saveRules:"Guardar regras",listen:"🎙️ OUVIR",hi:"👋 ",reportTitle:"Relatório de campo",reportPh:"O que aconteceu no seu turno?",sendReport:"Enviar",fbTitle:"Feedback de campo",fbPh:"O que aconteceu? O que deve melhorar?",sendFeedback:"Enviar",switchUser:"Trocar de usuário",wallHead:"🏭 Le Veilleux — Ao vivo",wallPulse:"Pulso do campo",noActivity:"(sem atividade)",start:"▶ INICIAR",listening:"A ouvir… fale agora",listeningHint:"A conversa é captada e dividida por pessoa.",stopListening:"⏹ Parar",summaryTitle:"Resumo da conversa",confirm:"Confirmar ✓",confirmed:"Confirmado ✓",sentNote:"Enviado para cozinha e central",newConv:"Nova conversa",ordersTitle:"Pedidos — cozinha e conta",person:"Pessoa",noSummary:"O resumo aparece aqui conforme a conversa é detetada.",prep:"A preparar",ready:"Pronto",delivered:"Entregue",sent:"Enviado",back:"Voltar",sayPh:"Fale ou escreva o que cada pessoa disse…",sendPhrase:"Enviar",dictate:"🎙️ Ditar",aiHint:"Voz e texto vão direto à IA — o resumo aparece sozinho.",micUnsupported:"Ditado não suportado",processing:"A IA está a resumir…",sectorTab:"Setor",sectorPresets:"Setores predefinidos",customSector:"Sector personalizado",saveSector:"Guardar setor",sectorSaved:"Setor guardado.",aiSuggest:"Sugerir com IA (copiar prompt)",aiSectorCopied:"Prompt copiado — cole no DeepSeek Harness.",fillBoth:"Digite usuário e senha.",loggingIn:"A entrar…",noOrders:"Ainda sem pedidos — confirme itens no resumo.",noUsage:"Ainda sem uso reportado.",noReports:"Ainda sem relatórios de campo.",lvlEmployee:"Terreno",lvlLead:"Supervisor",lvlOwner:"Dono",labelPh:"Função (ex. Cozinheiro)",newOrder:"NOVO PEDIDO",enableNotif:"🔔 Ativar notificações",notifHint:"O tablet da cozinha apita e pisca quando chega um pedido.",tagline:"A IA trabalha. O humano vela, decide, revê.",welcomeTitle:"Bem-vindo ao Le Veilleux 👁️",welcomeBody:"Três passos para o seu primeiro fluxo ao vivo: 1) Adicione os trabalhadores. 2) Escolha o setor. 3) Faça uma conversa real — a IA propõe, você confirma.",wallNote:"Atualiza a cada 30 s",tierGREEN:"Auto",tierSEMI:"Semi",tierYELLOW:"Proposta",tierRED:"Perguntar",export:"⬇ Exportar relatórios",exportOrders:"⬇ Exportar conta",exportDone:"Exportação transferida.",deepTitle:"Análise profunda (Reasoner)",deepPh:"Faça uma pergunta profunda…",deepSend:"Perguntar",deepSent:"Enviada ao cérebro Reasoner.",deepHint:"O cérebro Reasoner pensa a fundo e anexa a resposta aos relatórios.",budget:"Orçamento de hoje",budgetReached:"Limite atingido — aumente nas definições.",paid:"💵 Pago",markPaid:"Marcar pago",billSummary:"Recebido: X de Y pedidos",regTitle:"🪙 Caixa virtual",regOpen:"Abrir caixa",regItem:"Artigo",regPrice:"Preço",regAdd:"Adicionar",regTotal:"Total",regSale:"💳 Registar venda",regHint:"Registe a venda aqui e cobre no terminal físico.",regClose:"Fechar caixa",regDeclared:"Total do terminal no fecho",regDayTitle:"🪙 Caixa do dia (contra-auditoria)",regRecorded:"Registado (Le Veilleux)",regDeclared2:"Declarado (terminal)",regVariance:"Diferença",exportReg:"⬇ Exportar relatório Z"},
347
+ zh:{login:"登录",user:"用户",password:"密码",loginBtn:"登录",loginHint:"账户由企业主管理。",loginFailed:"登录失败。",cannotReach:"无法连接服务器。它是否在运行?",workerAdded:"员工已添加。",saved:"已保存。",reportSent:"报告已发送。",feedbackSent:"反馈已发送。",wallOpen:"实时看板",logout:"退出",overview:"总览",field:"现场",rules:"规则",reports:"报告",week:"本周",feedback:"反馈",workersActive:"活跃员工",reportsTotal:"报告总数",workers:"员工",thUser:"用户",thRole:"角色",addWorker:"添加员工",userName:"用户名",addBtn:"添加",usage:"用量与成本",usageSub:"(每位员工,估算)",thWorker:"员工",thSessions:"会话",thTokens:"Token",thCost:"预估成本",panel:"操作面板",panelNote:"员工在平板或手机上打开面板。",openPanel:"打开面板",fieldReports:"现场报告",feedbackQueue:"反馈队列",feedbackHint:"智能体读取此队列并解决问题。",refresh:"刷新",autoOn:"自动:开",autoOff:"自动:关",rulesTitle:"业务规则",rulesHint:"这些规则训练红绿灯。",saveRules:"保存规则",listen:"🎙️ 聆听",hi:"👋 ",reportTitle:"现场报告",reportPh:"你的班次发生了什么?",sendReport:"发送",fbTitle:"现场反馈",fbPh:"发生了什么?什么需要改进?",sendFeedback:"发送",switchUser:"切换用户",wallHead:"🏭 Le Veilleux — 实时",wallPulse:"现场脉搏",noActivity:"(暂无现场活动)",start:"▶ 开始",listening:"正在聆听…请说话",listeningHint:"对话正在被捕捉并按人员划分。",stopListening:"⏹ 停止",summaryTitle:"对话摘要",confirm:"确认 ✓",confirmed:"已确认 ✓",sentNote:"已发送至厨房与中央系统",newConv:"新对话",ordersTitle:"订单 — 厨房与账单",person:"人员",noSummary:"随着对话被识别,摘要将显示在这里。",prep:"制作中",ready:"完成",delivered:"已送达",sent:"已发送",back:"返回",sayPh:"说出或输入每个人说的话……",sendPhrase:"发送",dictate:"🎙️ 听写",aiHint:"语音和文字直达 AI — 摘要自动出现。",micUnsupported:"此浏览器不支持听写",processing:"AI 正在总结……",sectorTab:"行业",sectorPresets:"预设行业",customSector:"自定义行业",saveSector:"保存行业",sectorSaved:"行业已保存。",aiSuggest:"用 AI 建议(复制提示)",aiSectorCopied:"AI 提示已复制 — 粘贴到 DeepSeek Harness。",fillBoth:"请输入用户名和密码。",loggingIn:"登录中……",noOrders:"暂无订单 — 请在摘要中确认项目。",noUsage:"暂无用量报告。",noReports:"暂无现场报告。",lvlEmployee:"现场",lvlLead:"主管",lvlOwner:"业主",labelPh:"角色标签(如:厨师)",newOrder:"新订单",enableNotif:"🔔 开启通知",notifHint:"新订单到达时厨房平板会响铃并闪烁。",tagline:"AI 工作,人来守护、决定、复核。",welcomeTitle:"欢迎使用 Le Veilleux 👁️",welcomeBody:"三步开始您的第一个实时流程:1) 添加员工。2) 选择行业。3) 进行真实对话 — AI 提议,您确认。",wallNote:"每 30 秒更新",tierGREEN:"自动",tierSEMI:"半自动",tierYELLOW:"提议",tierRED:"询问",export:"⬇ 导出报告",exportOrders:"⬇ 导出账单",exportDone:"导出已下载。",deepTitle:"深度分析(Reasoner)",deepPh:"提出一个深度问题……",deepSend:"提问",deepSent:"已发送至 Reasoner 大脑。",deepHint:"Reasoner 大脑深入思考并将答案附加到报告中。",budget:"今日预算",budgetReached:"已达上限 — 请在设置中提高。",paid:"💵 已付",markPaid:"标记已付",billSummary:"已收:X / Y 单",regTitle:"🪙 虚拟收银台",regOpen:"开台",regItem:"商品",regPrice:"价格",regAdd:"添加",regTotal:"合计",regSale:"💳 记录销售",regHint:"在此记录销售,然后用实体终端收款。",regClose:"关台",regDeclared:"关台时终端总额",regDayTitle:"🪙 当日收银(对账审计)",regRecorded:"已记录(Le Veilleux)",regDeclared2:"已申报(终端)",regVariance:"差额",exportReg:"⬇ 导出 Z 报表"},
348
+ ja:{login:"ログイン",user:"ユーザー",password:"パスワード",loginBtn:"ログイン",loginHint:"アカウントは事業主が管理します。",loginFailed:"ログイン失敗。",cannotReach:"サーバーに接続できません。起動していますか?",workerAdded:"従業員を追加しました。",saved:"保存しました。",reportSent:"報告を送信しました。",feedbackSent:"フィードバックを送信しました。",wallOpen:"ライブ掲示板",logout:"ログアウト",overview:"概要",field:"現場",rules:"ルール",reports:"報告",week:"今週",feedback:"フィードバック",workersActive:"稼働中の従業員",reportsTotal:"報告総数",workers:"従業員",thUser:"ユーザー",thRole:"役割",addWorker:"従業員を追加",userName:"ユーザー名",addBtn:"追加",usage:"利用量とコスト",usageSub:"(従業員ごと、推定)",thWorker:"従業員",thSessions:"セッション",thTokens:"トークン",thCost:"推定コスト",panel:"アクションパネル",panelNote:"従業員はタブレットやスマホでパネルを開きます。",openPanel:"パネルを開く",fieldReports:"現場報告",feedbackQueue:"フィードバック待ち行列",feedbackHint:"エージェントがこの行列を読み、問題を解決します。",refresh:"更新",autoOn:"自動: ON",autoOff:"自動: OFF",rulesTitle:"業務ルール",rulesHint:"これらのルールが信号を訓練します。",saveRules:"ルールを保存",listen:"🎙️ 聞く",hi:"👋 ",reportTitle:"現場報告",reportPh:"シフトで何がありましたか?",sendReport:"送信",fbTitle:"現場フィードバック",fbPh:"何が起きましたか?何を改善すべき?",sendFeedback:"送信",switchUser:"ユーザー切替",wallHead:"🏭 Le Veilleux — ライブ",wallPulse:"現場の鼓動",noActivity:"(まだ現場活動なし)",start:"▶ 開始",listening:"聞いています…どうぞ",listeningHint:"会話を捕捉し、人物ごとに分けています。",stopListening:"⏹ 停止",summaryTitle:"会話のまとめ",confirm:"確認 ✓",confirmed:"確認済み ✓",sentNote:"厨房と中央へ送信済み",newConv:"新しい会話",ordersTitle:"注文 — 厨房と会計",person:"人",noSummary:"会話が検出されるとここにまとめが表示されます。",prep:"調理中",ready:"完成",delivered:"提供済み",sent:"送信済み",back:"戻る",sayPh:"各人が話した内容を話すか入力…",sendPhrase:"送信",dictate:"🎙️ 音声入力",aiHint:"音声とテキストは直接AIへ — まとめは自動で表示されます。",micUnsupported:"音声入力非対応",processing:"AIが要約中…",sectorTab:"セクター",sectorPresets:"セクタープリセット",customSector:"カスタムセクター",saveSector:"セクターを保存",sectorSaved:"セクターを保存しました。",aiSuggest:"AIで提案(プロンプトをコピー)",aiSectorCopied:"AIプロンプトをコピーしました — DeepSeek Harnessに貼り付け。",fillBoth:"ユーザーとパスワードを入力してください。",loggingIn:"ログイン中…",noOrders:"まだ注文がありません — まとめで項目を確認してください。",noUsage:"まだ利用報告がありません。",noReports:"まだ現場報告がありません。",lvlEmployee:"現場",lvlLead:"監督",lvlOwner:"オーナー",labelPh:"役割名(例:調理師)",newOrder:"新規注文",enableNotif:"🔔 通知を有効化",notifHint:"注文が届くと厨房タブレットが音と点滅で知らせます。",tagline:"AIが働き、人間が見守り、決め、見直す。",welcomeTitle:"Le Veilleux へようこそ 👁️",welcomeBody:"最初のライブフローまでの3ステップ:1) 従業員を追加。2) セクターを選択。3) 実際の会話を行う — AIが提案し、あなたが確認します。",wallNote:"30秒ごとに更新",tierGREEN:"自動",tierSEMI:"半自動",tierYELLOW:"提案",tierRED:"確認",export:"⬇ 報告をエクスポート",exportOrders:"⬇ 会計をエクスポート",exportDone:"エクスポートをダウンロードしました。",deepTitle:"深層分析(Reasoner)",deepPh:"深い質問をどうぞ…",deepSend:"質問する",deepSent:"Reasoner脳に送信しました。",deepHint:"Reasoner脳が深く考え、回答を報告に追記します。",budget:"今日の予算",budgetReached:"上限に達しました — 設定で引き上げてください。",paid:"💵 支払済",markPaid:"支払済にする",billSummary:"回収済み:Y件中X件",regTitle:"🪙 仮想レジ",regOpen:"レジを開く",regItem:"商品",regPrice:"価格",regAdd:"追加",regTotal:"合計",regSale:"💳 売上を記録",regHint:"ここで売上を記録し、物理端末で決済してください。",regClose:"レジを閉じる",regDeclared:"閉店時の端末合計",regDayTitle:"🪙 日次レジ(対照監査)",regRecorded:"記録(Le Veilleux)",regDeclared2:"申告(端末)",regVariance:"差額",exportReg:"⬇ Zレポートをエクスポート"},
349
+ ko:{login:"로그인",user:"사용자",password:"비밀번호",loginBtn:"로그인",loginHint:"계정은 사업주가 관리합니다.",loginFailed:"로그인 실패.",cannotReach:"서버에 연결할 수 없습니다. 실행 중인가요?",workerAdded:"직원이 추가되었습니다.",saved:"저장되었습니다.",reportSent:"보고서를 보냈습니다.",feedbackSent:"피드백을 보냈습니다.",wallOpen:"라이브 보드",logout:"로그아웃",overview:"개요",field:"현장",rules:"규칙",reports:"보고서",week:"이번 주",feedback:"피드백",workersActive:"활성 직원",reportsTotal:"총 보고서",workers:"직원",thUser:"사용자",thRole:"역할",addWorker:"직원 추가",userName:"사용자 이름",addBtn:"추가",usage:"사용량 및 비용",usageSub:"(직원별, 추정)",thWorker:"직원",thSessions:"세션",thTokens:"토큰",thCost:"추정 비용",panel:"액션 패널",panelNote:"직원은 태블릿이나 휴대폰에서 패널을 엽니다.",openPanel:"패널 열기",fieldReports:"현장 보고서",feedbackQueue:"피드백 대기열",feedbackHint:"에이전트가 이 대기열을 읽고 문제를 해결합니다.",refresh:"새로고침",autoOn:"자동: ON",autoOff:"자동: OFF",rulesTitle:"사업 규칙",rulesHint:"이 규칙이 신호등을 훈련합니다.",saveRules:"규칙 저장",listen:"🎙️ 듣기",hi:"👋 ",reportTitle:"현장 보고서",reportPh:"근무 중 무슨 일이 있었나요?",sendReport:"보내기",fbTitle:"현장 피드백",fbPh:"무슨 일이 있었나요? 무엇을 개선할까요?",sendFeedback:"보내기",switchUser:"사용자 전환",wallHead:"🏭 Le Veilleux — 라이브",wallPulse:"현장의 맥박",noActivity:"(현장 활동 없음)",start:"▶ 시작",listening:"듣는 중… 말씀하세요",listeningHint:"대화를 포착하여 사람별로 나누고 있습니다.",stopListening:"⏹ 중지",summaryTitle:"대화 요약",confirm:"확인 ✓",confirmed:"확인됨 ✓",sentNote:"주방 및 중앙으로 전송됨",newConv:"새 대화",ordersTitle:"주문 — 주방 및 계산",person:"사람",noSummary:"대화가 감지되면 요약이 여기에 표시됩니다.",prep:"조리 중",ready:"완료",delivered:"서빙됨",sent:"전송됨",back:"뒤로",sayPh:"각 사람이 말한 내용을 말하거나 입력…",sendPhrase:"보내기",dictate:"🎙️ 받아쓰기",aiHint:"음성과 텍스트가 AI로 바로 전달 — 요약이 자동 표시됩니다.",micUnsupported:"받아쓰기 미지원",processing:"AI가 요약 중…",sectorTab:"업종",sectorPresets:"업종 프리셋",customSector:"사용자 정의 업종",saveSector:"업종 저장",sectorSaved:"업종이 저장되었습니다.",aiSuggest:"AI로 제안(프롬프트 복사)",aiSectorCopied:"AI 프롬프트 복사됨 — DeepSeek Harness에 붙여넣기.",fillBoth:"사용자와 비밀번호를 입력하세요.",loggingIn:"로그인 중…",noOrders:"아직 주문이 없습니다 — 요약에서 항목을 확인하세요.",noUsage:"아직 사용 보고가 없습니다.",noReports:"아직 현장 보고서가 없습니다.",lvlEmployee:"현장",lvlLead:"감독",lvlOwner:"소유주",labelPh:"역할 이름(예: 요리사)",newOrder:"새 주문",enableNotif:"🔔 알림 활성화",notifHint:"주문이 도착하면 주방 태블릿이 소리와 함께 깜박입니다.",tagline:"AI가 일하고 사람이 지키고, 결정하고, 검토합니다.",welcomeTitle:"Le Veilleux에 오신 것을 환영합니다 👁️",welcomeBody:"첫 라이브 흐름까지 3단계: 1) 직원 추가. 2) 업종 선택. 3) 실제 대화 진행 — AI가 제안하고 당신이 확인합니다.",wallNote:"30초마다 업데이트",tierGREEN:"자동",tierSEMI:"반자동",tierYELLOW:"제안",tierRED:"질문",export:"⬇ 보고서 내보내기",exportOrders:"⬇ 계산서 내보내기",exportDone:"내보내기가 다운로드되었습니다.",deepTitle:"심층 분석(Reasoner)",deepPh:"깊은 질문을 하세요…",deepSend:"질문하기",deepSent:"Reasoner 두뇌로 전송됨.",deepHint:"Reasoner 두뇌가 깊이 생각하고 답변을 보고서에 추가합니다.",budget:"오늘의 예산",budgetReached:"한도 도달 — 설정에서 올리세요.",paid:"💵 결제됨",markPaid:"결제 표시",billSummary:"수금: Y건 중 X건",regTitle:"🪙 가상 금전등록기",regOpen:"시재 열기",regItem:"품목",regPrice:"가격",regAdd:"추가",regTotal:"합계",regSale:"💳 판매 기록",regHint:"여기에 판매를 기록하고 실제 단말기로 결제하세요.",regClose:"시재 마감",regDeclared:"마감 시 단말기 합계",regDayTitle:"🪙 일일 시재(대조 감사)",regRecorded:"기록(Le Veilleux)",regDeclared2:"신고(단말기)",regVariance:"차액",exportReg:"⬇ Z리포트 내보내기"},
350
+ ar:{login:"تسجيل الدخول",user:"المستخدم",password:"كلمة المرور",loginBtn:"دخول",loginHint:"الحسابات يديرها صاحب العمل.",loginFailed:"فشل تسجيل الدخول.",cannotReach:"تعذر الوصول إلى الخادم. هل هو قيد التشغيل؟",workerAdded:"تمت إضافة الموظف.",saved:"تم الحفظ.",reportSent:"تم إرسال التقرير.",feedbackSent:"تم إرسال الملاحظات.",wallOpen:"اللوحة المباشرة",logout:"خروج",overview:"نظرة عامة",field:"الميدان",rules:"القواعد",reports:"التقارير",week:"هذا الأسبوع",feedback:"الملاحظات",workersActive:"موظفون نشطون",reportsTotal:"إجمالي التقارير",workers:"الموظفون",thUser:"المستخدم",thRole:"الدور",addWorker:"إضافة موظف",userName:"اسم المستخدم",addBtn:"إضافة",usage:"الاستخدام والتكلفة",usageSub:"(لكل موظف، تقديري)",thWorker:"الموظف",thSessions:"الجلسات",thTokens:"الرموز",thCost:"التكلفة التقديرية",panel:"لوحة الإجراءات",panelNote:"يفتح الموظفون اللوحة من أجهزتهم.",openPanel:"فتح اللوحة",fieldReports:"تقارير الميدان",feedbackQueue:"قائمة الملاحظات",feedbackHint:"يقرأ الوكيل هذه القائمة ويحل المشكلات.",refresh:"تحديث",autoOn:"تلقائي: ON",autoOff:"تلقائي: OFF",rulesTitle:"قواعد العمل",rulesHint:"هذه القواعد تدرّب الإشارة الضوئية.",saveRules:"حفظ القواعد",listen:"🎙️ استمع",hi:"👋 ",reportTitle:"تقرير ميداني",reportPh:"ماذا حدث في نوبتك؟",sendReport:"إرسال",fbTitle:"ملاحظات ميدانية",fbPh:"ماذا حدث؟ ما الذي يجب تحسينه؟",sendFeedback:"إرسال",switchUser:"تبديل المستخدم",wallHead:"🏭 Le Veilleux — مباشر",wallPulse:"نبض الميدان",noActivity:"(لا نشاط بعد)",start:"▶ ابدأ",listening:"أستمع… تفضل بالحديث",listeningHint:"يتم التقاط المحادثة وتقسيمها حسب الأشخاص.",stopListening:"⏹ إيقاف",summaryTitle:"ملخص المحادثة",confirm:"تأكيد ✓",confirmed:"مؤكد ✓",sentNote:"أُرسل إلى المطبخ والنظام المركزي",newConv:"محادثة جديدة",ordersTitle:"الطلبات — المطبخ والحساب",person:"شخص",noSummary:"سيظهر الملخص هنا مع اكتشاف المحادثة.",prep:"قيد التحضير",ready:"جاهز",delivered:"تم التسليم",sent:"أُرسل",back:"رجوع",sayPh:"تحدث أو اكتب ما قاله كل شخص…",sendPhrase:"إرسال",dictate:"🎙️ إملاء",aiHint:"الصوت والنص يصلان مباشرة إلى الذكاء الاصطناعي — يظهر الملخص تلقائيًا.",micUnsupported:"الإملاء غير مدعوم",processing:"الذكاء الاصطناعي يلخّص…",sectorTab:"القطاع",sectorPresets:"القطاعات المحددة مسبقًا",customSector:"قطاع مخصص",saveSector:"حفظ القطاع",sectorSaved:"تم حفظ القطاع.",aiSuggest:"اقترح بالذكاء الاصطناعي (نسخ الموجه)",aiSectorCopied:"تم نسخ الموجه — الصقه في DeepSeek Harness.",fillBoth:"أدخل المستخدم وكلمة المرور.",loggingIn:"جارٍ الدخول…",noOrders:"لا توجد طلبات بعد — أكّد العناصر في الملخص.",noUsage:"لا يوجد استخدام مُبلّغ بعد.",noReports:"لا توجد تقارير ميدانية بعد.",lvlEmployee:"الميدان",lvlLead:"مشرف",lvlOwner:"المالك",labelPh:"مسمى الدور (مثال: طباخ)",newOrder:"طلب جديد",enableNotif:"🔔 تفعيل الإشعارات",notifHint:"يصدر صوت ويومض لوح المطبخ عند وصول طلب جديد.",tagline:"الذكاء الاصطناعي يعمل، والإنسان يراقب ويقرر ويراجع.",welcomeTitle:"مرحبًا بك في Le Veilleux 👁️",welcomeBody:"ثلاث خطوات لأول تدفق مباشر: 1) أضف العاملين. 2) اختر القطاع. 3) أجري محادثة حقيقية — الذكاء الاصطناعي يقترح وأنت تؤكد.",wallNote:"يتحدث كل 30 ثانية",tierGREEN:"تلقائي",tierSEMI:"شبه تلقائي",tierYELLOW:"مقترح",tierRED:"اسأل",export:"⬇ تصدير التقارير",exportOrders:"⬇ تصدير الحساب",exportDone:"تم تنزيل التصدير.",deepTitle:"تحليل عميق (Reasoner)",deepPh:"اطرح سؤالًا عميقًا…",deepSend:"اسأل",deepSent:"أُرسل إلى دماغ Reasoner.",deepHint:"يفكر دماغ Reasoner بعمق ويضيف إجابته إلى التقارير.",budget:"ميزانية اليوم",budgetReached:"تم بلوغ الحد — ارفعه في الإعدادات.",paid:"💵 مدفوع",markPaid:"وضع علامة مدفوع",billSummary:"المُحصَّل: X من Y طلبًا",regTitle:"🪙 الصندوق الافتراضي",regOpen:"افتح الصندوق",regItem:"الصنف",regPrice:"السعر",regAdd:"إضافة",regTotal:"الإجمالي",regSale:"💳 تسجيل البيع",regHint:"سجّل البيع هنا ثم حصّل المبلغ بالجهاز الفعلي.",regClose:"إغلاق الصندوق",regDeclared:"إجمالي الجهاز عند الإغلاق",regDayTitle:"🪙 صندوق اليوم (تدقيق مقابل)",regRecorded:"المُسجَّل (Le Veilleux)",regDeclared2:"المُعلَن (الجهاز)",regVariance:"الفرق",exportReg:"⬇ تصدير تقرير Z"}
338
351
  };
339
352
  function haptic(){try{if(navigator.vibrate)navigator.vibrate(25);}catch(e){}if(soundOn){try{const C=window.AudioContext||window.webkitAudioContext;if(!window.__ac)window.__ac=new C();const c=window.__ac;const o=c.createOscillator(),g=c.createGain();o.frequency.value=880;o.connect(g);g.connect(c.destination);g.gain.setValueAtTime(.12,c.currentTime);g.gain.exponentialRampToValueAtTime(.001,c.currentTime+.12);o.start();o.stop(c.currentTime+.12);}catch(e){}}}
340
353
  const $=id=>document.getElementById(id);
@@ -386,6 +399,30 @@ async function doExport(type){
386
399
  toast(t("exportDone"));
387
400
  }catch(e){toast(t("cannotReach"));}
388
401
  }
402
+ async function loadRegister(){
403
+ const r=await api("/api/register");
404
+ if(!r||r.error)return;
405
+ const open=r.status==="open";
406
+ $("regClosed").classList.toggle("hidden",open);
407
+ $("regOpenState").classList.toggle("hidden",!open);
408
+ if(open){
409
+ $("regItems").textContent=(r.items||[]).map(x=>x.name+" — $"+x.price).join(" · ");
410
+ const cur=Math.round((r.items||[]).reduce((a,x)=>a+x.price,0)*100)/100;
411
+ $("regTotal").textContent=t("regTotal")+": $"+cur;
412
+ }
413
+ if(me&&me.role==="owner"){
414
+ if(r.status==="closed"){
415
+ $("regDay").innerHTML='<p class="note">'+t("regRecorded")+": $"+r.recorded+" · "+t("regDeclared2")+": $"+(r.declared==null?"—":r.declared)+'</p><p class="note" style="'+(r.variance!==null&&Math.abs(r.variance)>0.01?"color:#b45309;font-weight:700":"")+'">'+t("regVariance")+": $"+(r.variance==null?"—":r.variance)+'</p>';
416
+ } else {
417
+ $("regDay").innerHTML='<p class="hint">—</p>';
418
+ }
419
+ }
420
+ }
421
+ $("regOpen").onclick=async()=>{await api("/api/register/open",{worker:me?me.name:"worker"});loadRegister();};
422
+ $("regAdd").onclick=async()=>{const n=$("regItem").value.trim();const p=$("regPrice").value;if(!n||!p)return;await api("/api/register/add",{name:n,price:Number(p)});$("regItem").value="";$("regPrice").value="";loadRegister();};
423
+ $("regSale").onclick=async()=>{await api("/api/register/charge",{});loadRegister();toast(t("regSale"));};
424
+ $("regClose").onclick=async()=>{await api("/api/register/close",{declared:Number($("regDeclared").value)||0});loadRegister();};
425
+ $("exportRegisterBtn").onclick=()=>doExport("register");
389
426
  $("deepSend").onclick=async()=>{const v=$("deepText").value.trim();if(!v)return;const r=await api("/api/deep",{worker:me?me.name:"owner",text:v});if(r.error){toast(String(r.error).indexOf("budget")>=0?t("budgetReached"):"Error");return;}$("deepText").value="";toast(t("deepSent"));};
390
427
  $("exportBtn").onclick=()=>doExport("reports");
391
428
  $("exportOrdersBtn").onclick=()=>doExport("orders");
@@ -406,6 +443,7 @@ function applyLang(){
406
443
  $("thWorker").textContent=t("thWorker");$("thSessions").textContent=t("thSessions");$("thTokens").textContent=t("thTokens");$("thCost").textContent=t("thCost");
407
444
  $("panelTitle").textContent=t("panel");$("panelNote").textContent=t("panelNote");$("openPanel").textContent=t("openPanel");
408
445
  $("fieldReportsTitle").textContent=t("fieldReports");$("feedbackTitle").textContent=t("feedbackQueue");$("feedbackHint").textContent=t("feedbackHint");
446
+ $("regTitle").textContent=t("regTitle");$("regOpen").textContent=t("regOpen");$("regItem").placeholder=t("regItem");$("regPrice").placeholder=t("regPrice");$("regAdd").textContent=t("regAdd");$("regSale").textContent=t("regSale");$("regHint").textContent=t("regHint");$("regClose").textContent=t("regClose");$("regDeclared").placeholder=t("regDeclared");$("regDayTitle").textContent=t("regDayTitle");$("exportRegisterBtn").textContent=t("exportReg");
409
447
  $("deepTitle").textContent=t("deepTitle");$("deepText").placeholder=t("deepPh");$("deepSend").textContent=t("deepSend");$("deepHint").textContent=t("deepHint");
410
448
  $("refreshReports").textContent=t("refresh");$("exportBtn").textContent=t("export");$("exportOrdersBtn").textContent=t("exportOrders");if(!auto)$("autoRefresh").textContent=t("autoOff");
411
449
  $("rulesTitle").textContent=t("rulesTitle");$("rulesHint").textContent=t("rulesHint");$("saveDecisions").textContent=t("saveRules");
@@ -524,9 +562,9 @@ $("toHomeBtn").onclick=async()=>{await api("/api/live/close",{});workerFlow();};
524
562
  async function enter(){
525
563
  if(!PACK){PACK=await api("/api/sector");applyPack();}
526
564
  setWho();
527
- if(me.role==="owner"){show("ownerView");try{if(!localStorage.getItem("lv-welcome"))$("welcomeCard").style.display="block";}catch(e){}loadMetrics($("ownerMetrics"));loadUsers();loadField();loadRules();loadUsage();renderOrders();loadPresets();}
565
+ if(me.role==="owner"){show("ownerView");try{if(!localStorage.getItem("lv-welcome"))$("welcomeCard").style.display="block";}catch(e){}loadRegister();loadMetrics($("ownerMetrics"));loadUsers();loadField();loadRules();loadUsage();renderOrders();loadPresets();}
528
566
  else if(me.role==="lead"){show("leadView");loadMetrics($("leadMetrics"));loadLead();renderOrders();if(kitchenPoll)clearInterval(kitchenPoll);kitchenPoll=setInterval(kitchenWatch,4000);}
529
- else{show("employeeView");$("workerHi").textContent=t("hi")+(me.label||me.name);workerFlow();if(livePoll)clearInterval(livePoll);livePoll=setInterval(()=>{if(me&&me.role==="employee")workerFlow();},3000);}
567
+ else{show("employeeView");$("workerHi").textContent=t("hi")+(me.label||me.name);loadRegister();workerFlow();if(livePoll)clearInterval(livePoll);livePoll=setInterval(()=>{if(me&&me.role==="employee")workerFlow();},3000);}
530
568
  }
531
569
  let pwVisible=false;
532
570
  $("eyeBtn").onclick=()=>{pwVisible=!pwVisible;$("loginPass").type=pwVisible?"text":"password";$("eyeOn").classList.toggle("hidden",pwVisible);$("eyeOff").classList.toggle("hidden",!pwVisible);};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@javierfrancoleal/dsh-supervisor",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
4
4
  "description": "The Veilleux central control plane of the J.Franco agentic workflow suite: user accounts, the live conversation flow (listen → per-person summary → confirm → orders), telemetry, and the universal sector dashboard with 10 languages. Created by J.Franco.",
5
5
  "author": "J.Franco",
6
6
  "license": "MIT",
package/server.js CHANGED
@@ -42,6 +42,7 @@ const DB_FILE = path.join(DATA_DIR, "supervisor.db");
42
42
  const USAGE_FILE = path.join(DATA_DIR, "usage.md");
43
43
  const LIVE_FILE = path.join(DATA_DIR, "live.json");
44
44
  const SECTOR_FILE = path.join(DATA_DIR, "sector.json");
45
+ const REG_FILE = path.join(DATA_DIR, "register.json");
45
46
  const PRICE_PER_MILLION = Number(process.env.DSH_PRICE_PER_MILLION || 0.28);
46
47
  // Homeostasis: the daily token budget (metabolic limit). The brain rests
47
48
  // when the budget is spent — no runaway costs.
@@ -196,6 +197,9 @@ function usageRows() {
196
197
  function readTail(f, n = 200) { try { const t = fs.readFileSync(f, "utf8"); return t.split("\n").slice(-n).join("\n"); } catch { return ""; } }
197
198
  function liveRead() { try { const s = JSON.parse(fs.readFileSync(LIVE_FILE, "utf8")); s.inbox = s.inbox || []; s.deep = s.deep || []; return s; } catch { return { status: "idle", worker: null, startedAt: null, speakers: [], orders: [], inbox: [], deep: [] }; } }
198
199
  function liveWrite(s) { fs.mkdirSync(DATA_DIR, { recursive: true }); fs.writeFileSync(LIVE_FILE, JSON.stringify(s, null, 2)); }
200
+ function regRead() { try { return JSON.parse(fs.readFileSync(REG_FILE, "utf8")); } catch { return { status: "closed", openedAt: null, items: [], sales: [], declared: null }; } }
201
+ function regWrite(r) { fs.mkdirSync(DATA_DIR, { recursive: true }); fs.writeFileSync(REG_FILE, JSON.stringify(r, null, 2)); }
202
+ function regView() { const r = regRead(); const recorded = Math.round((r.sales || []).reduce((a, x) => a + (x.total || 0), 0) * 100) / 100; return { ...r, recorded, variance: r.declared == null ? null : Math.round((r.declared - recorded) * 100) / 100 }; }
199
203
  function metrics() {
200
204
  if (db) {
201
205
  const q = (sql) => db.prepare(sql).get().n;
@@ -329,6 +333,12 @@ async function api(req, res, pathname) {
329
333
  (lv.orders || []).map((o) => "- " + (o.table ? "Table " + o.table + " · " : "") + o.person + ": " + o.request + " (" + o.status + (o.paid ? ", paid" : ", pending") + ")").join("\n") +
330
334
  "\n\nTotal items: " + (lv.orders || []).length + "\n";
331
335
  name = "le-veilleux-orders.md";
336
+ } else if (type === "register") {
337
+ const r = regView();
338
+ body = "# Le Veilleux — Z-report (counter-register)\n\n" + ts() + "\n\n" +
339
+ (r.sales || []).map((x, i) => "| " + (i + 1) + " | " + x.ts.slice(11, 16) + " | " + x.items.map((it) => it.name + " ($" + it.price + ")").join(", ") + " | $" + x.total + " |").join("\n") +
340
+ "\n\nRecorded (Le Veilleux): $" + r.recorded + "\nDeclared (terminal): $" + (r.declared == null ? "—" : r.declared) + "\nVariance: $" + (r.variance == null ? "—" : r.variance) + "\n";
341
+ name = "le-veilleux-zreport.md";
332
342
  } else if (type === "usage") {
333
343
  body = "# Le Veilleux — usage & cost\n\n" + ts() + "\n\n| Worker | Sessions | Tokens | Est. cost |\n|---|---|---|---|\n" +
334
344
  usageRows().map((r) => "| " + r.worker + " | " + r.sessions + " | " + r.tokens + " | $" + r.cost.toFixed(2) + " |").join("\n") + "\n";
@@ -351,6 +361,11 @@ async function api(req, res, pathname) {
351
361
  return send(res, 200, liveRead());
352
362
  }
353
363
  // The active sector pack: one dashboard skeleton, many business skins.
364
+ if (pathname === "/api/register" && req.method === "GET") { if (!auth(req)) return send(res, 401, { error: "unauthorized" }); return send(res, 200, regView()); }
365
+ if (pathname === "/api/register/open" && req.method === "POST") { if (!auth(req)) return send(res, 401, { error: "unauthorized" }); const b = await json(req); regWrite({ status: "open", openedAt: ts(), worker: b.worker || "worker", items: [], sales: [], declared: null }); return send(res, 200, { ok: true }); }
366
+ if (pathname === "/api/register/add" && req.method === "POST") { if (!auth(req)) return send(res, 401, { error: "unauthorized" }); const b = await json(req); const r = regRead(); r.items.push({ name: String(b.name || ""), price: Number(b.price) || 0 }); regWrite(r); return send(res, 200, { ok: true }); }
367
+ if (pathname === "/api/register/charge" && req.method === "POST") { if (!auth(req)) return send(res, 401, { error: "unauthorized" }); const r = regRead(); if (!r.items.length) return send(res, 400, { error: "no items" }); const total = Math.round(r.items.reduce((a, x) => a + x.price, 0) * 100) / 100; r.sales.push({ ts: ts(), items: r.items, total }); r.items = []; regWrite(r); return send(res, 200, { ok: true, total }); }
368
+ if (pathname === "/api/register/close" && req.method === "POST") { if (!auth(req)) return send(res, 401, { error: "unauthorized" }); const b = await json(req); const r = regRead(); if (!r.items.length || true) { const leftover = r.items.length ? Math.round(r.items.reduce((a, x) => a + x.price, 0) * 100) / 100 : 0; if (leftover) r.sales.push({ ts: ts(), items: r.items, total: leftover }); r.items = []; } r.status = "closed"; r.closedAt = ts(); r.declared = Number(b.declared) || 0; regWrite(r); return send(res, 200, regView()); }
354
369
  if (pathname === "/api/health" && req.method === "GET") {
355
370
  const m = metrics();
356
371
  return send(res, 200, { ok: true, uptime: Math.round(process.uptime()), workers: m.workers, reports: m.reports, budgetUsd: DAILY_BUDGET_USD, spentTodayUsd: todayCostUsd(), budgetPct: DAILY_BUDGET_USD > 0 ? Math.round((todayCostUsd() / DAILY_BUDGET_USD) * 100) : 0 }, true);