wherdr 1.2.0 → 1.3.1
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.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{AgentView.DE2GDt4O.css → AgentView.C4YOwvZG.css} +1 -1
- package/.output/public/_nuxt/{BIA9pZvC.js → B6qBWHWB.js} +1 -1
- package/.output/public/_nuxt/BMIe8p_3.js +2 -0
- package/.output/public/_nuxt/BrAeJIZR.js +30 -0
- package/.output/public/_nuxt/C12eXl5z.js +1 -0
- package/.output/public/_nuxt/{DxO1TBoK.js → C2T9fQ4f.js} +1 -1
- package/.output/public/_nuxt/CYxHnMNH.js +83 -0
- package/.output/public/_nuxt/{D903WmCE.js → CctS2Xn6.js} +1 -1
- package/.output/public/_nuxt/{Bta8at9w.js → CiYar6hg.js} +1 -1
- package/.output/public/_nuxt/{CjKICX3g.js → Dwh-l2rQ.js} +11 -11
- package/.output/public/_nuxt/{e5N4AqCN.js → WLQjK8uJ.js} +41 -41
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/6466b0ab-7935-460c-abdf-2ea632dae6d0.json +1 -0
- package/.output/public/_nuxt/{entry.SHBiCXBL.css → entry.cKR16VqG.css} +1 -1
- package/.output/public/_nuxt/whFLy_Ne.js +23 -0
- package/.output/public/sw.js +1 -1
- package/.output/server/chunks/_/branding.mjs +1 -1
- package/.output/server/chunks/_/plugins.mjs +10 -2
- package/.output/server/chunks/_/worktrees.mjs +1 -1
- package/.output/server/chunks/_/ws.mjs +1 -1
- package/.output/server/chunks/nitro/nitro.mjs +626 -436
- package/.output/server/chunks/raw/bump-homebrew.mjs +7 -0
- package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
- package/.output/server/chunks/routes/api/_..._.mjs +1 -0
- package/.output/server/chunks/routes/api/agents.post.mjs +1 -0
- package/.output/server/chunks/routes/api/ask-tab.post.mjs +1 -0
- package/.output/server/chunks/routes/api/attach.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/disable.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/lock.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/login/options.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/max-session.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/register/options.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/status.get.mjs +1 -0
- package/.output/server/chunks/routes/api/changes.get.mjs +1 -0
- package/.output/server/chunks/routes/api/chat/image.get.mjs +1 -0
- package/.output/server/chunks/routes/api/chat.get.mjs +1 -0
- package/.output/server/chunks/routes/api/choose.post.mjs +1 -0
- package/.output/server/chunks/routes/api/claude-statusline.post.mjs +1 -0
- package/.output/server/chunks/routes/api/close/status.get.mjs +1 -0
- package/.output/server/chunks/routes/api/close.post.mjs +1 -0
- package/.output/server/chunks/routes/api/codex-update.post.mjs +1 -0
- package/.output/server/chunks/routes/api/commands.get.mjs +1 -0
- package/.output/server/chunks/routes/api/config.get.mjs +1 -0
- package/.output/server/chunks/routes/api/dirs.get.mjs +1 -0
- package/.output/server/chunks/routes/api/dismiss.post.mjs +1 -0
- package/.output/server/chunks/routes/api/effort.post.mjs +1 -0
- package/.output/server/chunks/routes/api/efforts.get.mjs +1 -0
- package/.output/server/chunks/routes/api/file.post.mjs +1 -0
- package/.output/server/chunks/routes/api/gitroot.get.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/input.post.mjs +1 -0
- package/.output/server/chunks/routes/api/interrupt.post.mjs +1 -0
- package/.output/server/chunks/routes/api/isgit.get.mjs +1 -0
- package/.output/server/chunks/routes/api/machine/awake.get.mjs +1 -0
- package/.output/server/chunks/routes/api/machine/awake.post.mjs +1 -0
- package/.output/server/chunks/routes/api/machine/order.get.mjs +1 -0
- package/.output/server/chunks/routes/api/machine/order.post.mjs +1 -0
- package/.output/server/chunks/routes/api/machine/rename.post.mjs +1 -0
- package/.output/server/chunks/routes/api/menu.post.mjs +1 -0
- package/.output/server/chunks/routes/api/model.post.mjs +1 -0
- package/.output/server/chunks/routes/api/models.get.mjs +1 -0
- package/.output/server/chunks/routes/api/nav.post.mjs +1 -0
- package/.output/server/chunks/routes/api/onboarding.get.mjs +1 -0
- package/.output/server/chunks/routes/api/onboarding.post.mjs +1 -0
- package/.output/server/chunks/routes/api/phone.get.mjs +1 -0
- package/.output/server/chunks/routes/api/phone.post.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/actions.get.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/profiles.get.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/projects.get.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/projects.post.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/thread-limits.get.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +1 -0
- package/.output/server/chunks/routes/api/project/report.get.mjs +1 -0
- package/.output/server/chunks/routes/api/prompt.post.mjs +1 -0
- package/.output/server/chunks/routes/api/push/quiet.post.mjs +1 -0
- package/.output/server/chunks/routes/api/push/subscribe.post.mjs +1 -0
- package/.output/server/chunks/routes/api/push/test.post.mjs +1 -0
- package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +1 -0
- package/.output/server/chunks/routes/api/quotas.get.mjs +1 -0
- package/.output/server/chunks/routes/api/rename.post.mjs +1 -0
- package/.output/server/chunks/routes/api/requeue.post.mjs +1 -0
- package/.output/server/chunks/routes/api/restart.get.mjs +1 -0
- package/.output/server/chunks/routes/api/restart.post.mjs +1 -0
- package/.output/server/chunks/routes/api/reveal.post.mjs +1 -0
- package/.output/server/chunks/routes/api/screen-key.post.mjs +1 -0
- package/.output/server/chunks/routes/api/screen.get.mjs +8 -5
- package/.output/server/chunks/routes/api/search.get.mjs +2 -1
- package/.output/server/chunks/routes/api/seen.post.mjs +2 -1
- package/.output/server/chunks/routes/api/sessions.get.mjs +2 -1
- package/.output/server/chunks/routes/api/sessions.post.mjs +2 -1
- package/.output/server/chunks/routes/api/space.post.mjs +2 -1
- package/.output/server/chunks/routes/api/state.get.mjs +1 -0
- package/.output/server/chunks/routes/api/unqueue.post.mjs +2 -1
- package/.output/server/chunks/routes/api/update.get.mjs +3 -2
- package/.output/server/chunks/routes/api/upload.post.mjs +1 -0
- package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +1 -0
- package/.output/server/chunks/routes/api/worktrees.get.mjs +1 -0
- package/.output/server/chunks/routes/favicon.ico.get.mjs +1 -0
- package/.output/server/chunks/routes/icons/_name_.get.mjs +2 -1
- package/.output/server/chunks/routes/renderer.mjs +3 -2
- package/.output/server/chunks/routes/uploads/_...name_.get.mjs +2 -1
- package/.output/server/chunks/routes/ws/_..._.mjs +2 -1
- package/.output/server/chunks/routes/ws/events.mjs +2 -1
- package/.output/server/chunks/routes/ws/mirror.mjs +1 -1
- package/.output/server/chunks/routes/ws/term.mjs +2 -96
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/index.mjs +2 -1
- package/.output/server/package.json +1 -1
- package/README.md +107 -23
- package/bin/lib/brew.mjs +86 -0
- package/bin/lib/commands.mjs +32 -8
- package/bin/lib/core.mjs +7 -2
- package/package.json +1 -1
- package/.output/public/_nuxt/BDI8xNSb.js +0 -2
- package/.output/public/_nuxt/BevNMnQ2.js +0 -83
- package/.output/public/_nuxt/CA9mI3eg.js +0 -23
- package/.output/public/_nuxt/DBu2-cEy.js +0 -30
- package/.output/public/_nuxt/DJE_XMLO.js +0 -1
- package/.output/public/_nuxt/builds/meta/211609c0-be04-46c5-a6b0-566bc0c4a3dd.json +0 -1
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import{A as e,An as t,Fn as n,Mn as r,nn as i,o as a}from"./SiL1FJ5s.js";import"./Ci8N4mWR.js";var o=globalThis.setInterval,s=`wherdr:chunk-reload`;function c(e,t){if(!e||!t||typeof t!=`object`)return!1;let n=t.id;return typeof n==`string`&&n!==``&&n!==e}function l(e){let t=e instanceof Error?e.message:typeof e==`string`?e:``;return/Failed to fetch dynamically imported module|Importing a module script failed|error loading dynamically imported module|Unable to preload CSS/i.test(t)}function u(e,t){if(!e)return!1;try{let n=Number(e.getItem(s)||0);return n&&t-n<3e4?!1:(e.setItem(s,String(t)),!0)}catch{return!1}}var ee=r(!1),te=r(!1),d=null,ne=!1;function re(){ee.value=!0}function ie(){`serviceWorker`in navigator&&navigator.serviceWorker.register(`/sw.js`).then(e=>{d=e,e.waiting?.postMessage({type:`skip-waiting`}),e.addEventListener(`updatefound`,()=>{let t=e.installing;t?.addEventListener(`statechange`,()=>{t.state===`installed`&&navigator.serviceWorker.controller&&re()})})}).catch(()=>{})}async function ae(){if(!ee.value){try{let e=await fetch(`/_nuxt/builds/latest.json?${Date.now()}`,{cache:`no-store`});e.ok&&c(a().app.buildId,await e.json())&&re()}catch{}try{await d?.update()}catch{}}}async function oe(e){if(ne)return;ne=!0;let t=d?.installing;t&&await new Promise(e=>{let n=setTimeout(e,5e3);t.addEventListener(`statechange`,()=>{t.state!==`installing`&&(clearTimeout(n),e())})});let n=d?.waiting;n&&`serviceWorker`in navigator&&await new Promise(e=>{let t=setTimeout(e,3e3);navigator.serviceWorker.addEventListener(`controllerchange`,()=>{clearTimeout(t),e()},{once:!0}),n.postMessage({type:`skip-waiting`})}),e!==void 0&&location.hash!==e&&location.replace(location.pathname+location.search+e),location.reload()}var f={"Move up":`Monter`,"Move down":`Descendre`,"Reset order":`Réinitialiser l’ordre`,"Drag to reorder":`Glisser pour réordonner`,"Keep awake":`Garder éveillé`,"Extend by one hour":`Prolonger d’une heure`,"Sleep control is not available on this machine":`Contrôle de veille indisponible sur cette machine`,"Closed lid is only available on a Mac":`Capot fermé disponible uniquement sur Mac`,"Invalid keep-awake option":`option de veille invalide`,"Keep-awake command failed":`Commande de veille impossible`,"Nothing to extend: the machine is not being kept awake":`Aucun éveil en cours à prolonger`,"It is already past 8 pm on this machine: pick a duration":`Il est déjà plus de 20 h sur cette machine : choisis une durée`,"It is already past 8 pm on this machine":`Il est déjà plus de 20 h sur cette machine`,"Keep awake did not start; the previous state is kept":`Le maintien éveillé n’a pas démarré ; l’état précédent est conservé`,"Closed lid requires the power adapter":`Le capot fermé nécessite le secteur`,Update:`Mettre à jour`,"Codex update failed":`Échec de la mise à jour de Codex`,"Show Codex’s usage breakdown":`Voir le détail de l’utilisation Codex`,"Codex update already in progress":`Mise à jour de Codex déjà en cours`,"Codex is working or waiting for an answer: update it once it is done":`Codex travaille ou attend une réponse : mets-le à jour quand il a fini`,"Codex is not running in this pane":`Codex ne tourne pas dans ce panneau`,"Codex was not started from a shell: quitting it would close the pane":`Codex n’a pas été lancé depuis un shell : le quitter fermerait le panneau`,"Codex is showing a menu: answer it first":`Codex affiche un menu : réponds-y d’abord`,"The update did not finish in 10 minutes: see the terminal":`La mise à jour n’a pas fini en 10 minutes : regarde le terminal`,"No Codex update to install":`Aucune mise à jour de Codex à installer`,"This update cannot be run from wherdr: copy the command":`Cette mise à jour ne peut pas être lancée depuis wherdr : copie la commande`,"Restart agent":`Redémarrer l’agent`,Restart:`Redémarrer`,"Restart anyway":`Redémarrer quand même`,"Restart to update":`Redémarrer pour mettre à jour`,Restarting:`Redémarrage`,"Restart failed":`Redémarrage échoué`,"the agent did not stop":`l’agent ne s’est pas arrêté`,"the agent did not restart":`l’agent n’a pas redémarré`,"restart already in progress":`redémarrage déjà en cours`,"agent not supported":`agent non pris en charge`,"agent not found":`agent introuvable`,"timed out waiting for agent startup":`délai dépassé en attendant le démarrage de l’agent`,Collapse:`Réduire`,"Too long: only the beginning is shown. The terminal shows the rest.":`Trop long : seul le début est affiché. Le terminal montre la suite.`,"What prevents sleep":`Ce qui empêche la veille`,"Normal sleep":`Veille normale`,"Power adapter":`Secteur`,Battery:`Batterie`,"Closed lid (power adapter only)":`Capot fermé (sur secteur uniquement)`,"1 hour":`1 heure`,"4 hours":`4 heures`,"Until tonight (8 pm)":`Jusqu’à ce soir (20 h)`,"Until turned off":`Jusqu’à désactivation`,"No app is preventing sleep.":`Aucune app ne bloque la veille.`,"wherdr · Keep awake":`wherdr · Garder éveillé`,Security:`Sécurité`,"wherdr is locked":`wherdr est verrouillé`,"Unlock with your passkey (Face ID, Touch ID, Windows Hello…) to reach your agents.":`Déverrouille avec ta clé d’accès (Face ID, Touch ID, Windows Hello…) pour accéder à tes agents.`,Unlock:`Déverrouiller`,"Unlock cancelled":`Déverrouillage annulé`,Device:`Appareil`,"Lock enabled on this device ✓":`Verrouillage activé sur cet appareil ✓`,"Registration cancelled":`Enregistrement annulé`,"This device is already registered":`Cet appareil est déjà enregistré`,"Without a lock, anyone who can reach this server can control your agents. Passkey: Face ID, Touch ID, Windows Hello…":`Sans verrouillage, toute personne qui peut joindre ce serveur peut piloter tes agents. Clé d’accès : Face ID, Touch ID, Windows Hello…`,"This browser does not support passkeys.":`Ce navigateur ne gère pas les clés d’accès.`,"Registered keys:":`Clés enregistrées :`,"Turn off lock":`Désactiver le verrouillage`,"Turn off the lock? The app will be open again to anyone who can reach this server.":`Désactiver le verrouillage ? L’app redeviendra accessible à toute personne qui peut joindre ce serveur.`,"Lock turned off":`Verrouillage désactivé`,"Separate worktree":`Worktree séparé`,"new branch, leaves the original folder untouched":`nouvelle branche, sans toucher au dossier d’origine`,Branch:`Branche`,"(optional)":`(optionnel)`,"Reveal in Finder":`Afficher dans le Finder`,Open:`Ouvrir`,"Copy path":`Copier le chemin`,"Not found on {machine}: {path}":`Introuvable sur {machine} : {path}`,"Only files in your home folder can be shown":`Seuls les fichiers de ton dossier personnel peuvent être affichés`,"{machine} is not a Mac":`{machine} n’est pas un Mac`,"Open in editor":`Ouvrir dans l’éditeur`,"Apps and scripts are not opened from wherdr: use Reveal in Finder":`wherdr n’ouvre pas les apps ni les scripts : utilise Afficher dans le Finder`,"Could not open on {machine}: {reason}":`Ouverture impossible sur {machine} : {reason}`,Reset:`Réinitialiser`,Save:`Enregistrer`,"Rename pane":`Renommer le pane`,"Pane name (empty = automatic name)":`Nom du pane (vide = nom automatique)`,Renamed:`Renommé`,"Automatic name restored":`Nom automatique rétabli`,Search:`Rechercher`,"Search the conversation":`Rechercher dans la conversation`,"Enter at least two characters.":`Saisis au moins deux caractères.`,"Searching…":`Recherche en cours…`,"Search unavailable":`Recherche indisponible`,"No results":`Aucun résultat`,"Results limited. Refine your search.":`Résultats limités. Affine ta recherche.`,"Clear search":`Effacer la recherche`,Esc:`Échap`,Results:`Résultats`,You:`Toi`,yesterday:`hier`,navigate:`naviguer`,open:`ouvrir`,close:`fermer`,"loading…":`chargement…`,"no results":`aucun résultat`,Today:`Aujourd’hui`,Yesterday:`Hier`,action:`action`,"Stop the agent":`Arrêter l’agent`,Send:`Envoyer`,"Stopping…":`Interruption…`,"Agent stopped":`Agent arrêté`,"The agent is still working.":`L’agent travaille encore.`,"Last known state":`Dernier état connu`,"Offline reading":`Lecture hors ligne`,"Image unavailable offline":`Image non disponible hors ligne`,Image:`Image`,"Previous image":`Image précédente`,"Next image":`Image suivante`,"Zoom in":`Zoomer`,"Zoom out":`Dézoomer`,"Fit to screen":`Ajuster à l’écran`,"Actual size":`Taille réelle`,"Terminal unavailable offline":`Terminal indisponible hors ligne`,"Sending unavailable offline":`Envoi indisponible hors ligne`,"Changes unavailable offline":`Modification indisponible hors ligne`,"Draft saved — sending unavailable offline":`Brouillon conservé — envoi indisponible hors ligne`,"connecting…":`connexion…`,"offline — reconnecting…":`hors ligne — reconnexion…`,"Herdr unavailable":`Herdr injoignable`,"The agent isn’t ready in this pane (stopped or still starting).":`L’agent n’est pas prêt dans ce pane (arrêté ou en cours de démarrage).`,"Your turn":`À toi`,Done:`Terminé`,Working:`Au travail`,Ready:`Prêt`,Unknown:`Inconnu`,Starting:`Démarrage`,Closed:`Fermé`,"your turn":`à toi`,working:`au travail`,ready:`prêts`,coordinator:`coordinateur`,"In progress":`En cours`,Hide:`Masquer`,"Show terminals":`Afficher les terminaux`,"Compact list":`Liste compacte`,"One line per agent or space: no preview, folder or model. Computer and phone. Saved on this device.":`Une ligne par agent ou space : sans aperçu, dossier ni modèle. Ordinateur et téléphone. Enregistré sur cet appareil.`,"The Herdr server is not responding":`Le serveur Herdr ne répond pas`,"This pane has been closed.":`Ce pane a été fermé.`,Back:`Retour`,"Type a reply…":`Réponse libre…`,"Command…":`Commande…`,"This terminal is already open elsewhere.":`Ce terminal est déjà ouvert ailleurs.`,"Take control":`Prendre la main`,"Another client took control.":`Un autre client a pris la main.`,"Take back control":`Reprendre`,"Terminal unavailable":`Terminal indisponible`,Retry:`Réessayer`,"No conversation for this agent yet.":`Pas encore de conversation pour cet agent.`,"Conversation unavailable for this agent.":`Conversation indisponible pour cet agent.`,"Conversation not up to date — reconnecting…":`Conversation non à jour — reconnexion…`,"View terminal":`Voir le terminal`,"Interactive menu":`Menu interactif`,"Search…":`Rechercher…`,"Search the menu":`Rechercher dans le menu`,"Menu open":`Menu ouvert`,"Load earlier messages":`Charger plus haut`,"Start of conversation":`Début de la conversation`,"No messages yet.":`Conversation vide pour l’instant.`,Command:`Commande`,Write:`Écriture`,Edit:`Modif`,Files:`Fichiers`,"Web search":`Recherche web`,Subagent:`Sous-agent`,Tasks:`Tâches`,Tool:`Outil`,actions:`actions`,Advisor:`Conseiller`,"Background job done":`Tâche de fond terminée`,"Agent message":`Message d’un agent`,Process:`Processus`,"Background task":`Tâche en arrière-plan`,"Show all":`Tout afficher`,"Show list":`Afficher la liste`,"Collapse list":`Réduire la liste`,Continue:`Continuer`,"Sort ready":`Trier les prêts`,"Herdr order":`Ordre de Herdr`,"Recent activity":`Activité récente`,"Queued · ":`En attente · `,"Sent · read by the agent":`Envoyé · lu par l’agent`,Running:`En cours d’exécution`,"No output yet":`Pas encore de sortie`,"Removed from the queue":`Message retiré de la file`,"Already read by the agent":`Message déjà lu par l’agent`,"The agent’s input field is not empty":`Le champ de saisie de l’agent n’est pas vide`,"Agent input field not found":`Champ de saisie de l’agent introuvable`,"Agent input not cleared: check its terminal":`Champ de l’agent pas vidé : vérifie son terminal`,"This agent can’t cancel queued messages":`Annulation impossible pour cet agent`,"Already cancelling":`Annulation déjà en cours`,"will be read at the agent’s next step":`sera lu à la prochaine étape de l’agent`,"after you answer the question":`après ta réponse à la question`,"sending…":`envoi…`,"Photo is uploading…":`Photo en cours d’envoi…`,Remove:`Retirer`,"Photo upload failed":`Photo non envoyée`,"Drop to attach":`Déposer pour joindre`,"The file path is sent to the terminal":`Le chemin du fichier part dans le terminal`,"Images, PDFs, text and code files":`Images, PDF, fichiers texte et code`,"Images, text and code files":`Images, fichiers texte et code`,"Attach a file…":`Joindre un fichier…`,"File upload failed":`Fichier non envoyé`,"File is uploading…":`Fichier en cours d’envoi…`,"File (PDF, text, code)":`Fichier (PDF, texte, code)`,"File (text, code)":`Fichier (texte, code)`,"Archives cannot be read by the agent: extract the files first":`L’agent ne lit pas les archives : décompresse d’abord`,"Videos cannot be read by the agent":`L’agent ne lit pas les vidéos`,"Audio files cannot be read by the agent":`L’agent ne lit pas les fichiers audio`,"Office documents cannot be read by the agent: export to PDF or text first":`L’agent ne lit pas les documents Office : exporte d’abord en PDF ou en texte`,"Programs and binary files cannot be read by the agent":`L’agent ne lit pas les programmes ni les fichiers binaires`,"Binary files cannot be read by the agent":`L’agent ne lit pas les fichiers binaires`,"This agent cannot read PDFs: only Claude Code can":`Cet agent ne lit pas les PDF : seul Claude Code les lit`,"File too large for the agent":`Fichier trop gros pour l’agent`,"File too large (30 MB max)":`Fichier trop gros (30 Mo max)`,"Images go through the photo upload":`Les images passent par l’envoi de photos`,"Invalid file name":`Nom de fichier invalide`,"Clipboard unavailable here — paste into the message field.":`Presse-papiers inaccessible ici — colle dans le champ de message.`,"No image in the clipboard":`Pas d’image dans le presse-papiers`,"Paste denied":`Collage refusé`,"Paste failed":`Collage impossible`,"Terminal not connected — image not pasted":`Terminal non connecté — image non collée`,"Summarize context":`Résumer le contexte`,"New conversation":`Nouvelle conversation`,"Plan mode":`Mode plan`,"Priority service tier":`Niveau de service prioritaire`,"Context usage":`Occupation du contexte`,"Plan usage":`Consommation du forfait`,"Change model":`Changer de modèle`,"Code review":`Revue de code`,"Session status":`État de la session`,"View diff":`Voir le diff`,"Interrupt agent":`Interrompre l’agent`,"Commands that open a menu (model…) can then be controlled in the Terminal tab.":`Les commandes qui ouvrent un menu (modèle…) se pilotent ensuite dans l’onglet Terminal.`,"Nothing displayed — check the Terminal tab.":`Rien d’affiché — regarde l’onglet Terminal.`,Settings:`Réglages`,"You are notified when an agent needs your input or finishes.":`Tu es prévenu quand un agent attend ta réponse ou a terminé.`,"Notify for":`Notifier pour`,"Project coordinators and agents outside projects":`Coordinateurs et agents hors projet`,"All agents":`Tous les agents`,"Project threads remain visible and their unread messages are kept.":`Les threads de projet restent visibles et leurs messages non lus sont conservés.`,"On iPhone, add the app to your Home Screen (Share → Add to Home Screen) to receive notifications.":`Sur iPhone, ajoute d’abord l’app à l’écran d’accueil (Partager → Sur l’écran d’accueil) pour recevoir les notifications.`,"Enable notifications to know when an agent needs your input.":`Active les notifications pour être prévenu quand un agent attend ta réponse.`,"Close this terminal":`Fermer ce terminal`,"Pane closed":`Pane fermé`,"New terminal":`Nouveau terminal`,"New agent":`Nouvel agent`,Terminal:`Terminal`,"Command to run":`Commande à lancer`,"First message":`Premier message`,"E.g. npm run dev":`Ex. : npm run dev`,"E.g. Summarize the project TODOs":`Ex. : Fais le point sur les TODO du projet`,Launch:`Lancer`,"Starting…":`Démarrage…`,"No subfolders.":`Aucun sous-dossier.`,"Add the app to your Home Screen (Share → Add to Home Screen), then open it from the icon.":`Ajoute d’abord l’app à l’écran d’accueil (Partager → Sur l’écran d’accueil), puis ouvre-la depuis l’icône.`,"Notifications are unavailable in this browser.":`Notifications non disponibles dans ce navigateur.`,"Notifications denied — enable them in system settings.":`Notifications refusées — réactive-les dans Réglages.`,"Web Push is not configured on the server":`Web Push non configuré sur le serveur`,"Notifications enabled ✓":`Notifications activées ✓`,Failed:`Échec`,"Notification sent":`Notification envoyée`,"No device accepted the notification":`Aucun appareil n’a accepté la notification`,Agents:`Agents`,Menu:`Menu`,"No agents yet.":`Aucun agent pour l’instant.`,"Start one here, or from":`Lance-en un ici, ou depuis`,"in a terminal.":`dans un terminal.`,New:`Nouveau`,Options:`Options`,Conversation:`Conversation`,Keys:`Touches`,"Type in terminal":`Taper dans le terminal`,"Photo, file, paste, commands":`Photo, fichier, collage, commandes`,"Message to agent…":`Message à l’agent…`,"Choose an agent from the list":`Choisis un agent dans la liste`,"or start a new one.":`ou lances-en un nouveau.`,Close:`Fermer`,Type:`Type`,Folder:`Dossier`,"Resume the last conversation":`Reprendre la dernière conversation`,"for this agent in this folder":`de cet agent dans ce dossier`,Name:`Nom`,Cancel:`Annuler`,"Choose this folder":`Choisir ce dossier`,Language:`Langue`,English:`English`,"The interface language is saved on this device.":`La langue de l’interface est enregistrée sur cet appareil.`,"Types shown in New agent. Terminal is always available.":`Types proposés dans Nouvel agent. Le terminal reste toujours disponible.`,"No agents installed on online machines.":`Aucun agent installé sur les machines en ligne.`,"Choices saved on this device.":`Choix enregistrés sur cet appareil.`,Notifications:`Notifications`,Application:`Application`,Phone:`Téléphone`,"Show terminal spaces in the list, filed under Ready.":`Montrer les spaces de terminal dans la liste, rangés dans Prêts.`,"Show counters":`Afficher les compteurs`,"Show agent counters on the home screen.":`Afficher les compteurs d’agents sur l’accueil.`,"Show quotas":`Afficher les quotas`,"Show Claude and Codex quotas on the home screen.":`Afficher les quotas Claude et Codex sur l’accueil.`,"Terminal text size":`Taille du texte du terminal`,"Terminal rendering":`Rendu du terminal`,"Rendering is saved on this device.":`Le rendu est enregistré sur cet appareil.`,Typewriter:`Machine à écrire`,Desktop:`Ordinateur`,Normal:`Normale`,Wide:`Large`,"Full width":`Pleine largeur`,"Content width":`Largeur du contenu`,Appearance:`Apparence`,"Home screen":`Accueil`,"Reorder automatically":`Réorganiser automatiquement`,Unread:`Non lus`,Read:`Lus`,"In Ready, show unread agents before read ones. Saved on this device.":`Dans Prêts, placer les non lus avant les lus. Réglage propre à cet appareil.`,Text:`Texte`,Passkey:`Clé d’accès`,Remaining:`Restant`,Used:`Utilisé`,Quotas:`Quotas`,"Used quotas":`Quotas utilisés`,"Loading…":`Chargement…`,"What is left in each window, like Codex.":`Ce qu’il reste de chaque fenêtre, comme Codex.`,"What has been used, like Claude.":`Ce qui est consommé, comme Claude.`,"The color always flags a nearly exhausted quota. Saved on this device.":`La couleur signale toujours un quota presque épuisé. Réglage propre à cet appareil.`,"Command copied: paste it into a terminal on the server, in the wherdr folder.":`Commande copiée : colle-la dans un terminal du serveur, dans le dossier de wherdr.`,"Then restart wherdr.":`Puis relance wherdr.`,"Release notes":`Notes`,"Stop wherdr first, then run this command.":`Arrête d’abord wherdr, puis lance cette commande.`,"Hide until the next version":`Masquer jusqu’à la version suivante`,"This is the latest version.":`C’est la dernière version.`,About:`À propos`,"Settings sections":`Sections des réglages`,"Conversation, terminal, settings and other content. Saved on this device.":`Conversation, terminal, réglages et autres contenus. Réglage propre à cet appareil.`,"760 px column · terminal fitted to width.":`Colonne de 760 px · terminal ajusté.`,"Up to 1100 px · terminal fitted to width.":`Jusqu’à 1100 px · terminal ajusté.`,"The whole width, terminal included.":`Toute la largeur, terminal compris.`,"Default pane view":`Vue par défaut du volet`,"What an agent pane opens on. A pane you switched to Terminal stays there. Saved on this device.":`Ce sur quoi s’ouvre le volet d’un agent. Un volet passé au Terminal y reste. Réglage propre à cet appareil.`,"Read the transcript first.":`Lire la transcription d’abord.`,"Type straight into the pane.":`Écrire directement dans le volet.`,"Encrypted text":`Texte chiffré`,"Writing advances in glyphs, then the text decrypts behind it.":`L’écriture avance en glyphes, puis le texte se déchiffre derrière.`,Off:`Désactivée`,Fast:`Rapide`,Medium:`Moyenne`,Slow:`Lente`,"Original speed · 0.5 to 2 s.":`Vitesse d’origine · 0,5 à 2 s.`,"Twice as slow · 1 to 4 s.":`Deux fois plus lente · 1 à 4 s.`,"Three times as slow · 1.5 to 6 s.":`Trois fois plus lente · 1,5 à 6 s.`,"The reply appears at once.":`La réponse s’affiche d’un coup.`,"Only new replies are animated; history appears at once. Tap a reply while it types to show it in full. Saved on this device only.":`Seules les nouvelles réponses s’écrivent ainsi ; l’historique s’affiche d’un coup. Touche une réponse en cours pour l’afficher entièrement. Réglage propre à cet appareil.`,"Off: the system asks for reduced motion.":`Désactivée : le système demande de réduire les animations.`,"Active rendering: WebGL":`Rendu actif : WebGL`,"Active rendering: HTML":`Rendu actif : HTML`,"Active rendering: HTML (WebGL unavailable)":`Rendu actif : HTML (WebGL indisponible)`,"Decrease text size":`Réduire le texte`,"Increase text size":`Agrandir le texte`,"Herdr connection closed without a response":`connexion Herdr fermée sans réponse`,"Image too large (20 MB max)":`image trop lourde (20 Mo max)`,"Empty message":`message vide`,"Invalid pane":`pane invalide`,"Pane not found":`pane introuvable`,"The question has changed — check the current screen.":`La question a changé entre-temps — regarde l’écran à jour.`,"The screen has changed — check the current screen.":`L’écran a changé entre-temps — regarde l’écran à jour.`,"Write your answer before sending it.":`Écris ta réponse avant de l’envoyer.`,"An answer is already being sent.":`Une réponse est déjà en cours d’envoi.`,"omp’s answer field did not open — check the current screen.":`Le champ de réponse d’omp ne s’est pas ouvert — regarde l’écran à jour.`,"omp’s answer field could not be cleared — check the current screen.":`Le champ de réponse d’omp ne se vide pas — regarde l’écran à jour.`,"omp’s answer field closed — answer not submitted, check the current screen.":`Le champ de réponse d’omp s’est refermé — réponse non validée, regarde l’écran à jour.`,"Claude’s answer field could not be reached — check the current screen.":`Impossible d’atteindre le champ de réponse de Claude — regarde l’écran à jour.`,"Claude’s answer field could not be cleared — check the current screen.":`Le champ de réponse de Claude ne se vide pas — regarde l’écran à jour.`,"Claude’s answer field closed — answer not submitted, check the current screen.":`Le champ de réponse de Claude s’est refermé — réponse non validée, regarde l’écran à jour.`,"Your answer…":`Ta réponse…`,Questions:`Questions`,"Web Push is not configured":`Web Push non configuré`,"Invalid subscription":`abonnement invalide`,Rename:`Renommer`,"Take control of this terminal":`Prendre la main sur ce terminal`,Reconnect:`Reconnecter`,"Photo or screenshot":`Photo ou capture d’écran`,Changes:`Changements`,"View changes":`Voir les changements`,"Refresh changes":`Rafraîchir les changements`,Refresh:`Rafraîchir`,"Reading changes…":`Lecture des changements…`,"This folder is not a Git repository.":`Ce dossier n’est pas un dépôt Git.`,"Working tree":`Dossier de travail`,"No working tree changes.":`Aucun changement dans le dossier de travail.`,"File list or diff limited to keep this view responsive.":`Liste ou diff limité pour garder la vue rapide.`,"Also show unpushed commits":`Voir aussi les commits non poussés`,Commits:`Commits`,"No committed changes to show.":`Aucun changement commité à afficher.`,"No upstream or base branch available for comparison.":`Aucun amont ou branche de base disponible pour comparer.`,Untracked:`Non suivi`,Commit:`Commit`,Added:`Ajouté`,Modified:`Modifié`,Deleted:`Supprimé`,From:`Depuis`,"Binary file":`Fichier binaire`,Binary:`Binaire`,"Diff truncated":`Diff tronqué`,"Diff not loaded (size limit)":`Diff non chargé (limite de taille)`,"Generated file or dependency lockfile":`Fichier généré ou verrouillage de dépendances`,"Paste copied image":`Coller l’image copiée`,"Send a test notification":`Envoyer une notification de test`,"Enable notifications":`Activer les notifications`,"Reload app":`Recharger l’app`,"Enable passkey lock":`Activer le verrouillage par clé d’accès`,"Add this device":`Ajouter cet appareil`,"Lock now":`Verrouiller maintenant`,"Lock all devices":`Verrouiller tous les appareils`,"Lock all":`Tout verrouiller`,"Lock every device? Each one, this one included, will need its passkey again. The keys are kept.":`Verrouiller tous les appareils ? Chacun, celui-ci compris, devra repasser par sa clé d’accès. Les clés sont conservées.`,"Ask for the passkey again after":`Redemander la clé d’accès après`,"1 day":`1 jour`,"1 year":`1 an`,"Invalid duration":`Durée invalide`,"Counted from the last passkey unlock, for every device. Never in the middle of use: at the next opening of the app.":`Compté depuis le dernier déverrouillage par clé d’accès, pour tous les appareils. Jamais en pleine utilisation : à la prochaine ouverture de l’app.`,"The passkey will be asked again the next time the app opens.":`La clé d’accès sera redemandée à la prochaine ouverture de l’app.`,Parent:`Parent`,Confirm:`Confirmer`,"Close pane":`Fermer le pane`,"Turn off":`Désactiver`,Worktrees:`Worktrees`,"Worktree not found":`Worktree introuvable`,"No worktrees.":`Aucun worktree.`,"folder missing":`dossier disparu`,closed:`fermé`,Delete:`Supprimer`,"Force delete":`Forcer la suppression`,"Delete this worktree":`Supprimer ce worktree`,"Deleting a worktree removes its folder; the Git branch is kept.":`Supprimer un worktree efface son dossier ; la branche Git est gardée.`,Preview:`Aperçu`,Replay:`Rejouer`,"Mark as read":`Marquer comme lu`,"Mark as unread":`Marquer comme non lu`,Commands:`Commandes`,Resets:`Réinitialisation`,left:`restant`,Week:`Semaine`,reset:`réinitialisé`,"new window":`fenêtre neuve`,"just now":`à l’instant`,"Remaining quotas":`Quotas restants`,Install:`Installer`,"Copy command":`Copier la commande`,"this machine":`cette machine`,"They will show after the next exchange with a Claude.":`Ils apparaîtront après le prochain échange avec un Claude.`,updated:`mis à jour`,used:`utilisé`,Agent:`Agent`,Previous:`Précédent`,Next:`Suivant`,"Conversation compacted":`Conversation compactée`,"Conversation cleared":`Conversation effacée`,Interrupted:`Interrompu`,"App is locked":`app verrouillée`,"Origin refused":`origine refusée`,"Not found":`introuvable`,"Waiting for your reply — details in the Terminal tab":`En attente de ta réponse — détail dans l’onglet Terminal`,Copy:`Copier`,Reply:`Répondre`,"Replying to the message":`En réponse au message`,"Reply to this passage":`Répondre à ce passage`,"Cancel reply":`Annuler la réponse`,"Show original message":`Voir le message d’origine`,"Original message not found (further up the conversation?)":`Message d’origine introuvable (plus haut dans la conversation ?)`,"Copy reply":`Copier la réponse`,"No output":`Aucune sortie`,Copied:`Copié`,"Copy pane ID":`Copier l’ID du pane`,"Copy failed":`Copie impossible`,Quoted:`Citée`,"Quoted questions":`Citations`,"Remove quote":`Retirer la citation`,"⌘+click to open":`⌘+clic pour ouvrir`,"Ctrl+click to open":`Ctrl+clic pour ouvrir`,Enter:`Entrée`,send:`envoyer`,suggestion:`suggestion`,"Use suggestion":`Utiliser la suggestion`,"new line":`nouvelle ligne`,"Image not found":`image introuvable`,"Invalid JSON":`JSON invalide`,"Request too large":`requête trop grosse`,Model:`Modèle`,"Unknown model":`Modèle inconnu`,"Unknown effort":`Effort inconnu`,"Reading effort levels…":`Lecture des efforts…`,"Picks the level each turn":`Choisit le niveau à chaque tour`,"Change effort":`Changer d’effort`,"Default (recommended)":`Par défaut (recommandé)`,Effort:`Effort`,"Effort level unavailable for this model":`Niveau d’effort indisponible pour ce modèle`,"Reading models…":`Lecture des modèles…`,"Reload list":`Relire la liste`,"For this session only":`Pour cette session seulement`,"The agent is working — change the model once it’s done.":`L’agent travaille — change de modèle quand il a fini.`,"The agent is waiting for an answer — reply first.":`L’agent attend une réponse — réponds-lui d’abord.`,"Model change already in progress":`Changement de modèle déjà en cours`,"The /model menu did not show up":`Le menu /model ne s’est pas affiché`,"omp’s model selector did not show up":`Le sélecteur de modèles d’omp ne s’est pas affiché`,"Model not found in omp’s selector: {model}":`Modèle introuvable dans le sélecteur d’omp : {model}`,"The model selector did not follow — nothing was changed.":`Le sélecteur de modèles n’a pas suivi — rien n’a été changé.`,"The model selector changed — try again.":`Le sélecteur de modèles a changé — réessaie.`,"The /model menu changed — try again.":`Le menu /model a changé — réessaie.`,"“This session only” option not found — nothing was changed.":`Validation « cette session seulement » introuvable — rien n’a été changé.`,"Unexpected /model menu — nothing was changed.":`Menu /model inattendu — rien n’a été changé.`,"Unexpected effort menu — nothing was changed.":`Choix de l’effort inattendu — rien n’a été changé.`,"Not a Claude, Codex or omp agent":`pas un agent Claude, Codex ou omp`,"View image":`Voir l’image`,"Change theme":`Changer de thème`,"Hide themes":`Masquer les thèmes`,Theme:`Thème`,"Follow Herdr":`Suivre Herdr`,"config.toml not found":`config.toml introuvable`,default:`par défaut`,light:`clair`,"The theme is saved on this device.":`Le thème est enregistré sur cet appareil.`,"Message field border on focus":`Bordure du champ au focus`,"Border only":`Bord seul`,"A second color glides slowly around the border.":`Une seconde couleur glisse lentement autour du bord.`,Background:`Fond`,"Dotted grid with light packets, like wherdr.dev.":`Grille à points parcourue de paquets lumineux, comme wherdr.dev.`,"Flat line grid, like herdr.dev.":`Grille de lignes plates, comme herdr.dev.`,"In the margins of the conversation. Still when the system asks for reduced motion. Saved on this device.":`Dans les marges de la conversation. Immobile quand le système demande moins d’animations. Réglage propre à cet appareil.`,Halo:`Halo`,"The same, with a faint glow around the field.":`Pareil, avec une légère lueur autour du champ.`,None:`Aucune`,"Plain 1 px border, no animation.":`Bord simple de 1 px, sans animation.`,"Also on omp’s running actions (border only). Frozen when the system asks for reduced motion. Saved on this device.":`Aussi sur les actions en cours d’omp (bord seul). Figée si le système demande moins d’animations. Enregistré sur cet appareil.`,"Plugin actions":`Actions des plugins`,Run:`Exécuter`,Machine:`Machine`,"This machine":`Cette machine`,LOCAL:`LOCAL`,online:`en ligne`,"reconnecting…":`reconnexion…`,offline:`hors ligne`,"No agents on this machine.":`Aucun agent sur cette machine.`,"No known agents.":`Aucun agent connu.`,"unknown machine":`machine inconnue`,"Rename machine":`Renommer la machine`,"Machine name":`Nom de la machine`,"Machine renamed":`Machine renommée`,"Herdr sessions":`Sessions Herdr`,"Session shown on this device":`Session affichée sur cet appareil`,running:`en cours`,stopped:`arrêtée`,"No sessions found.":`Aucune session trouvée.`,"Session unavailable: back to the default session":`Session indisponible : retour à la session par défaut`,Tab:`Onglet`,Tabs:`Onglets`,"This tab is unavailable.":`Cet onglet est indisponible.`,"Active pane in Herdr":`Pane actif dans Herdr`,"A pane is zoomed in Herdr":`Un pane est agrandi dans Herdr`,"Tab overview":`Plan de l’onglet`,"Side by side":`Côte à côte`,"Open alone":`Ouvrir seul`,Mirror:`Miroir`,"Live input":`Saisie directe`,"Mirror unavailable · retry":`Miroir indisponible · réessayer`,Space:`Espace`,"New tab":`Nouvel onglet`,"New space":`Nouvel espace`,"in the same space":`dans le même espace`,"This space":`Cet espace`,"Swap with the pane on the left":`Échanger avec le pane de gauche`,"Swap with the pane on the right":`Échanger avec le pane de droite`,"Swap with the pane above":`Échanger avec le pane du dessus`,"Swap with the pane below":`Échanger avec le pane du dessous`,"Split right":`Diviser à droite`,"Split down":`Diviser en bas`,"Move to…":`Déplacer vers…`,"Drag to move the pane":`Glisser pour déplacer le pane`,Swap:`Échanger`,"Place left":`Placer à gauche`,"Place right":`Placer à droite`,"Place above":`Placer au-dessus`,"Place below":`Placer en dessous`,Resize:`Redimensionner`,"Rename tab":`Renommer l’onglet`,"Rename space":`Renommer l’espace`,"Close tab":`Fermer l’onglet`,"Close space":`Fermer l’espace`,"Tab name":`Nom de l’onglet`,"Space name":`Nom de l’espace`,"Tab options":`Options de l’onglet`,"Pane options":`Options du pane`,"Tab created":`Onglet créé`,"Tab closed":`Onglet fermé`,"Space closed":`Espace fermé`,"Pane moved":`Pane déplacé`,"Start in a new pane":`Lancer dans un nouveau pane`,"Start in a new tab":`Lancer dans un nouvel onglet`,"New pane":`Nouveau pane`,Project:`Projet`,"Show the Project panel":`Afficher le panneau Projet`,"Collapse the panel":`Replier le panneau`,"Ready for review":`À relire`,Landing:`Atterrissage`,Idle:`Inactif`,"Nothing yet":`Rien pour l’instant`,"Reading the project…":`Lecture du projet…`,"Confirm: tested, it works":`Confirmer : testé, ça marche`,"Report a problem":`Signaler un problème`,"Ask a question":`Poser une question`,"Project panel width":`Largeur du panneau Projet`,"List width":`Largeur de la liste`,"Drag to resize · double-click: default width":`Glisser pour élargir · double-clic : largeur par défaut`,"Sent to the coordinator":`Envoyé au coordinateur`,Clarify:`Préciser`,"No TASKS.md in this project yet.":`Pas encore de TASKS.md dans ce projet.`,"Threads unavailable":`Threads illisibles`,"View report":`Voir le rapport`,"Open agent":`Ouvrir l’agent`,"Pull request":`Pull request`,"Report truncated (too long).":`Rapport tronqué (trop long).`,"This thread’s agent was not found":`Agent de ce thread introuvable`,"No report for this thread":`Pas de rapport pour ce thread`,"no report for this thread":`pas de rapport pour ce thread`,"invalid thread":`thread invalide`,"project not found":`projet introuvable`,"thread list too long":`liste des threads trop longue`,"{machine} is unreachable: {reason}":`{machine} injoignable : {reason}`,"{machine} is unreachable":`{machine} injoignable`,"Unknown agent: {kind}":`Agent inconnu : {kind}`,"An agent is already running in this pane":`Un agent tourne déjà dans ce pane`,"No worktree in an existing pane":`Pas de worktree dans un pane existant`,"{kind} is not installed on {machine}":`{kind} non installé sur {machine}`,"The folder must be under {home}":`Le dossier doit être sous {home}`,"Folder not found: {path}":`Dossier introuvable : {path}`,"Not a Git repository: {path}":`Pas un dépôt Git : {path}`,"Invalid branch name":`Nom de branche invalide`,"Outside {home}":`Hors de {home}`,"Folder unreadable: {path}":`Dossier illisible : {path}`,"Empty file":`Fichier vide`,"Unknown machine: {machine}":`Machine inconnue : {machine}`,"Machine unreachable":`Machine injoignable`,"Herdr server unreachable ({reason})":`Serveur Herdr injoignable ({reason})`,"Missing model":`Modèle manquant`,"Model not found in /model: {model}":`Modèle introuvable dans /model : {model}`,"Claude’s effort slider could not be read — closed, nothing was changed.":`Curseur d’effort de Claude illisible — refermé, rien n’a été changé.`,"Unexpected effort slider — nothing was changed.":`Curseur d’effort inattendu — rien n’a été changé.`,"The effort slider did not follow — nothing was changed.":`Le curseur d’effort n’a pas suivi — rien n’a été changé.`,"The effort slider stayed open — nothing was changed.":`Le curseur d’effort est resté ouvert — rien n’a été changé.`,"omp’s thinking level is not on screen — nothing was changed.":`Le niveau de réflexion d’omp n’est pas à l’écran — rien n’a été changé.`,"omp did not change its thinking level — nothing was changed.":`omp n’a pas changé son niveau de réflexion — rien n’a été changé.`,"omp’s thinking level stopped following — check it in the terminal.":`Le niveau de réflexion d’omp n’a plus suivi — vérifie-le dans le terminal.`,"herdr not found":`herdr introuvable`,"timed out":`délai dépassé`,"Copy to {machine} failed: {reason}":`Copie sur {machine} impossible : {reason}`,"Herdr server not responding":`Serveur Herdr muet`,"SSH connection closed (code {code})":`Connexion SSH fermée (code {code})`,"SSH connection failed (timed out)":`Connexion SSH impossible (délai dépassé)`,"Probe failed (code {code})":`Sonde échouée (code {code})`,"{reason} on {machine}":`{reason} sur {machine}`,"Herdr server stopped on {machine} (session {session})":`Serveur Herdr arrêté sur {machine} (session {session})`,"Herdr server stopped on {machine}":`Serveur Herdr arrêté sur {machine}`,"Herdr socket forwarding failed: {reason}":`Transfert du socket Herdr impossible : {reason}`,"SSH connection closed":`Connexion SSH fermée`,"profile changed":`profil modifié`,"Session list unavailable":`Liste des sessions indisponible`,"Invalid session":`Session invalide`,"Session missing or stopped":`Session absente ou arrêtée`,"Empty machine name":`Nom de machine vide`,"Rename failed":`Renommage impossible`,"herdr-projects is already installed":`herdr-projects est déjà installé`,"Herdr folder is read-only on {machine}":`Dossier Herdr en lecture seule sur {machine}`,"Install failed (code {code})":`Installation impossible (code {code})`,"Message not found":`Message introuvable`,"starting…":`démarrage…`,"Install script not found":`Script d’installation introuvable`,"Home folder is read-only here: copy the command and paste it into a terminal on {machine}":`Dossier personnel en lecture seule ici : copie la commande et colle-la dans un terminal de {machine}`,"Install failed on {machine}: {reason}":`Installation impossible sur {machine} : {reason}`,"Projects binary not found":`Binaire Projects introuvable`,"Invalid action":`Action invalide`,"Action not found on this machine":`Action introuvable sur cette machine`,"Action not available here":`Action non disponible ici`,"The Projects panel is available in the Herdr client; its inputs are not reachable through the Herdr API.":`Le panneau Projects est disponible dans le client Herdr ; ses saisies ne sont pas accessibles par l’API Herdr.`,"Invalid plugin input":`Saisie du plugin invalide`,"This space needs an agent and its folder":`Un agent et son dossier sont nécessaires dans ce space`,"Repository unusable from {machine}: {path}":`Dépôt inutilisable depuis {machine} : {path}`,"Invalid bootstrap token (see the server logs)":`Jeton d’amorçage invalide (voir les journaux du serveur)`,"Challenge expired, try again":`Défi expiré, recommence`,"Unlock first":`Déverrouille d’abord`,"Key rejected":`Clé refusée`,"Key unknown on this server":`Clé inconnue sur ce serveur`,"Unlock rejected":`Déverrouillage refusé`,"Host not allowed":`Hôte refusé`,"{count} tasks":`{count} tâches`,"The menu changed in the meantime — check the current screen.":`Le menu a changé entre-temps — regarde l’écran à jour.`,"This entry can’t be chosen here — check the terminal.":`Cette entrée ne se choisit pas — regarde le terminal.`,"The cursor doesn’t move — finish in the terminal.":`Le curseur ne bouge pas — termine dans le terminal.`,"Invalid operation":`Opération invalide`,"Invalid key":`Touche invalide`,"Enter doesn’t confirm from here — use the buttons.":`Entrée ne se valide pas d’ici — utilise les boutons.`,"Invalid message":`Message invalide`,"No agent in this pane":`Pas d’agent dans ce pane`,"This agent’s folder is unknown":`Dossier de cet agent inconnu`,"Name: lowercase letters, digits, - and _ (32 max), starting with a letter":`Nom : minuscules, chiffres, - et _ (32 max), commence par une lettre`,"wherdr runs in Docker with your home folder read-only: herdr-projects cannot write to {path}. Mount its projects folder (~/.herdr-projects by default) read-write in docker-compose.yml (see README, “Herdr plugins”), then restart the container.":`wherdr tourne en Docker avec le HOME en lecture seule : herdr-projects ne peut pas écrire dans {path}. Monte son dossier de projets (~/.herdr-projects par défaut) en écriture dans docker-compose.yml (cf. README, « Herdr plugins »), puis relance le conteneur.`,"wherdr runs in Docker with your home folder read-only: herdr-projects cannot write. Mount its projects folder (~/.herdr-projects by default) read-write in docker-compose.yml (see README, “Herdr plugins”), then restart the container.":`wherdr tourne en Docker avec le HOME en lecture seule : herdr-projects ne peut pas écrire. Monte son dossier de projets (~/.herdr-projects par défaut) en écriture dans docker-compose.yml (cf. README, « Herdr plugins »), puis relance le conteneur.`,"herdr-projects cannot write to {path}: read-only file system.":`herdr-projects ne peut pas écrire dans {path} : système de fichiers en lecture seule.`,"herdr-projects cannot write: read-only file system.":`herdr-projects ne peut pas écrire : système de fichiers en lecture seule.`,"Uncommitted changes in this worktree":`Modifications non commitées dans ce worktree`,"This pane’s folder is unknown":`Dossier de ce pane inconnu`,"Invalid machine order":`Ordre des machines invalide`,"Unknown machine":`Machine inconnue`,"Invalid thread limit":`Limite de threads invalide`,"Invalid machine name (40 characters max)":`Nom de machine invalide (40 caractères maximum)`,"Invalid quiet setting":`Réglage de silence invalide`,"Notifications are not enabled on this device":`Notifications non activées sur cet appareil`,"Invalid path":`Chemin invalide`,"done must be true or false":`done doit valoir true ou false`,"empty name":`nom vide`,"invalid direction":`direction invalide`,"invalid destination":`destination invalide`,"tab on another machine":`onglet d’une autre machine`,"pane on another machine":`pane d’une autre machine`,"space on another machine":`espace d’une autre machine`,"invalid split":`split invalide`,"invalid ratio":`ratio invalide`,"no pane on that side":`aucun pane de ce côté`,"a pane is zoomed in this tab":`un pane est agrandi dans cet onglet`,"Not sent":`Non envoyé`,"will be sent when the menu closes":`partira quand le menu sera fermé`,"will be sent when the agent’s input is free":`partira quand le champ de l’agent sera libre`,"Not sent — the agent’s input contains text":`Non envoyé — le champ de l’agent contient du texte`,"Not sent — the agent’s input field was not found on its screen":`Non envoyé — champ de saisie de l’agent introuvable à l’écran`,"The agent’s input contains text":`Le champ de l’agent contient du texte`,"The agent’s input stays in shell mode (!)":`Le champ de l’agent reste en mode shell (!)`,"The message did not show in the agent’s input":`Le message n’est pas apparu dans le champ de l’agent`,"The agent did not take the message":`L’agent n’a pas pris le message`,"Another writer keeps typing into the agent’s input":`Un autre programme écrit sans arrêt dans le champ de l’agent`,"message already being sent":`message déjà en cours d’envoi`,"same pane":`même pane`,"pane in another tab":`pane d’un autre onglet`,"pane and folder required":`pane et dossier nécessaires`},se=`herdrLanguage`;function ce(){try{let e=localStorage.getItem(se);return e===`fr`||e===`en`?e:navigator.languages?.some(e=>e.toLowerCase().startsWith(`fr`))?`fr`:`en`}catch{return`en`}}var p=ce(),le=Object.keys(f).filter(e=>/\{\w+\}/.test(e)).map(e=>{let t=[],n=e.split(/(\{\w+\})/).map(e=>{let n=/^\{(\w+)\}$/.exec(e);return n?(t.push(n[1]),`([\\s\\S]+?)`):e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}).join(``);return{key:e,names:t,re:RegExp(`^${n}$`),fixed:e.replace(/\{\w+\}/g,``).length}}).sort((e,t)=>t.fixed-e.fixed);function ue(e){if(f[e])return f[e];for(let{key:t,names:n,re:r}of le){let i=r.exec(e);if(!i)continue;let a=Object.fromEntries(n.map((e,t)=>[e,ue(i[t+1])??i[t+1]]));return f[t].replace(/\{(\w+)\}/g,(e,t)=>a[t]??e)}}function m(e){return p===`fr`?ue(e)??e:e}function de(e,t){return p===`fr`?t:e}function fe(e){try{localStorage.setItem(se,e)}catch{}}var pe=/^hp-.+-t-\d{4,}(?:-.+)?$/i;function me(e){if(e.hpThread||e.name&&pe.test(e.name))return!0;let t=e.cwd?.replace(/\\/g,`/`).replace(/\/+$/,``)||``;return/\/\.herdr-projects\/[^/]+$/.test(t)?!1:/\/\.herdr\/worktrees\/[^/]+\/hp-[^/]+-t-\d{4,}(?:-[^/]*)?(?:\/|$)/i.test(t)||/\/\.herdr\/worktrees\/[^/]+\/[^/]+\/\.herdr-project(?:\/|$)/.test(t)||/\/\.herdr-projects\/[^/]+\/threads\/[^/]+(?:\/|$)/.test(t)||/\/\.herdr-project\/[^/]+\/threads\/[^/]+(?:\/|$)/.test(t)}var he=e=>(e||``).replace(/^[^\p{L}\p{N}~/]+/u,``).trim(),ge=new Set([`sh`,`bash`,`zsh`,`fish`,`dash`,`ksh`,`tcsh`,`csh`,`nu`,`pwsh`,`login`,`tmux`,`screen`]),_e=new Set([`claude`,`claude code`,`codex`,`gemini`,`gemini cli`,`opencode`,`kimi`,`agent`]),ve=e=>(e||``).replace(/\\/g,`/`).replace(/\/+$/,``).split(`/`).pop()||``;function ye(e){let t=he(e.title).replace(/\s*\|\s*\S+$/,``).trim();if(!t||/^\S+@\S+:/.test(t))return``;let n=t.toLocaleLowerCase(),r=ve(n.split(/\s+/)[0]).replace(/^-/,``);if(ge.has(r)&&!/\s/.test(n)||/^(?:~|\/)/.test(t)&&!/\s/.test(t))return``;let i=ve(e.cwd).toLocaleLowerCase();return i&&(n===i||n===`${i}/`)||e.agent&&_e.has(n)||e.agent&&n===e.agent.toLocaleLowerCase()?``:t}function be(e,t){if(e.label)return e.label;if(e.agent&&me(e)&&t?.trim())return t.trim();let n=e.displayAgent?.trim();return e.agent&&n&&!_e.has(n.toLocaleLowerCase())&&n.toLocaleLowerCase()!==e.agent.toLocaleLowerCase()?n:ye(e)||(e.agent?e.name&&e.name!==e.agent?e.name:xe(e.agent):e.command?e.command:ve(e.cwd)||(e.cwd?`/`:`Shell`))}function xe(e){return e===`claude`?`Claude`:e===`codex`?`Codex`:e===`opencode`?`OpenCode`:e===`gemini`?`Gemini CLI`:e===`kimi`?`Kimi`:e?e[0].toUpperCase()+e.slice(1):`Shell`}var Se=[`claude`,`codex`,`omp`],Ce=e=>Se.includes(e||``),we={claude:`Claude`,codex:`Codex`,gemini:`Gemini CLI`,opencode:`OpenCode`,kimi:`Kimi`,qodercli:`Qoder CLI`,mastracode:`Mastra Code`,copilot:`Copilot`,qwen:`Qwen Code`,pi:`Pi`,omp:`omp`},Te=e=>e&&we[e]||(e?e[0].toUpperCase()+e.slice(1):`Shell`),Ee=e=>(e||``).replace(/^\/(?:home|Users)\/[^/]+/,`~`)||`~`,De=e=>`${e}`,Oe=e=>Ce(e?.agent);function ke(e){return be(e,D.value.workspaces.find(t=>t.id===e.workspace)?.label)}var h=()=>p===`en`?`en-GB`:`fr-FR`;function g(e){return new Date(e).toLocaleTimeString(h(),{hour:`2-digit`,minute:`2-digit`})}function Ae(e){return new Date(e).toLocaleString(h(),{weekday:`long`,day:`numeric`,month:`long`,year:`numeric`,hour:`2-digit`,minute:`2-digit`})}function je(e){let t=new Date(e),n=new Date,r=new Date;return r.setDate(n.getDate()-1),t.toDateString()===n.toDateString()?m(`Today`):t.toDateString()===r.toDateString()?m(`Yesterday`):t.toLocaleDateString(h(),{weekday:`long`,day:`numeric`,month:`long`})}function Me(e,t=Date.now()){let n=new Date(e);if(Number.isNaN(n.getTime()))return``;let r=Math.floor((t-n.getTime())/6e4);if(r>=0&&r<1)return m(`just now`);if(r>=0&&r<60)return de(`${r} min ago`,`il y a ${r} min`);let i=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),a=Math.round((i(new Date(t))-i(n))/864e5);return a===0?g(e):a===1?`${m(`yesterday`)} ${g(e)}`:a>1&&a<7?`${n.toLocaleDateString(h(),{weekday:`short`})} ${g(e)}`:n.toLocaleDateString(h(),{day:`numeric`,month:`short`,...n.getFullYear()===new Date(t).getFullYear()?{}:{year:`numeric`}})}function Ne(e){if(e<60)return`${e} s`;let t=Math.floor(e/60),n=e%60;if(t<60)return n?`${t} min ${n} s`:`${t} min`;let r=Math.floor(t/60),i=t%60;return i?`${r} h ${i} min`:`${r} h`}var Pe=()=>{navigator.vibrate&&navigator.vibrate(8)},Fe=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform===`MacIntel`&&navigator.maxTouchPoints>1,Ie=matchMedia(`(pointer: coarse)`).matches,Le=matchMedia(`(display-mode: standalone)`).matches||navigator.standalone===!0;function Re(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function ze(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function Be(e,t=Date.now()){return!!e&&(e.until===null||t<e.until)}function Ve(e,t=8){let n=new Date(e);return n.setHours(t,0,0,0),n.getTime()<=e.getTime()&&n.setDate(n.getDate()+1),n.getTime()}function He(e,t=new Date){return e===`hour`?t.getTime()+36e5:e===`morning`?Ve(t):null}var Ue=`pushNotifyScope`;function We(){try{return localStorage.getItem(Ue)===`all`?`all`:`project_leads`}catch{return`project_leads`}}var _=r(We());async function Ge(e){_.value=e;try{localStorage.setItem(Ue,e)}catch{}await v()}function Ke(e){return Re((e+`=`.repeat((4-e.length%4)%4)).replace(/-/g,`+`).replace(/_/g,`/`))}async function qe(){try{return!(`serviceWorker`in navigator)||!(`Notification`in window)||Notification.permission!==`granted`?!1:!!await(await navigator.serviceWorker.ready).pushManager.getSubscription()}catch{return!1}}var Je=r(null);async function Ye(){Je.value=await qe()}async function v(e=p){if(!(`serviceWorker`in navigator)||!(`Notification`in window)||Notification.permission!==`granted`)return;let t=await(await navigator.serviceWorker.ready).pushManager.getSubscription();t&&await J(`/api/push/subscribe`,{...t.toJSON(),lang:e,notifyScope:_.value,sessions:k.value})}var Xe=`pushEndpoint`;function Ze(){try{return localStorage.getItem(Xe)||void 0}catch{return}}async function Qe(){if(!(`serviceWorker`in navigator)||!(`PushManager`in window)||!(`Notification`in window))return q(m(Fe&&!Le?`Add the app to your Home Screen (Share → Add to Home Screen), then open it from the icon.`:`Notifications are unavailable in this browser.`),!0);try{if(await Notification.requestPermission()!==`granted`)return q(m(`Notifications denied — enable them in system settings.`),!0);if(await Hi(),!P.value.push||!P.value.push.key)return q(m(`Web Push is not configured on the server`),!0);let e=await navigator.serviceWorker.ready,t=Ke(P.value.push.key),n=await e.pushManager.getSubscription(),r=n?.endpoint||Ze();n&&await n.unsubscribe().catch(()=>{}),n=await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:t}),await J(`/api/push/subscribe`,{...n.toJSON(),previous:r,lang:p,notifyScope:_.value,sessions:k.value});try{localStorage.setItem(Xe,n.endpoint)}catch{}q(m(`Notifications enabled ✓`))}catch(e){q(`${m(`Failed`)} : ${e.message}`,!0)}}async function $e(){try{let e=await J(`/api/push/test`,{});q(m(e.sent?`Notification sent`:`No device accepted the notification`),!e.sent)}catch(e){q(e.message,!0)}}var et=r({global:null,device:null}),y=r(Date.now());o(()=>{y.value=Date.now()},3e4);var tt=e(()=>{let{global:e,device:t}=et.value;return Be(t,y.value)?{scope:`device`,quiet:t}:Be(e,y.value)?{scope:`all`,quiet:e}:null});async function nt(){try{return`serviceWorker`in navigator&&(await(await navigator.serviceWorker.ready).pushManager.getSubscription())?.endpoint||``}catch{return``}}async function rt(){try{et.value=await J(`/api/push/quiet`,{endpoint:await nt()}),y.value=Date.now()}catch{}}async function it(e,t,n=null){et.value=await J(`/api/push/quiet`,{endpoint:await nt(),scope:e,on:t,until:n}),y.value=Date.now()}function at(e){return e&&e.screen&&e.screen.kind!==`other`&&e.status!==`working`?e.screen:null}var ot={enter:[`Entrée`,`Enter`],esc:[`Échap`,`Esc`],tab:[`Tab`,`Tab`],space:[`Espace`,`Space`],left:[`←`,`←`],right:[`→`,`→`]},st={"trust all":[`Tout approuver`,`Trust all`],review:[`Revoir`,`Review`],close:[`Fermer`,`Close`],skip:[`Passer`,`Skip`],continue:[`Continuer`,`Continue`],back:[`Retour`,`Back`],"go back":[`Retour`,`Go back`],confirm:[`Confirmer`,`Confirm`],cancel:[`Annuler`,`Cancel`],save:[`Enregistrer`,`Save`],exit:[`Quitter`,`Exit`],quit:[`Quitter`,`Quit`],select:[`Choisir`,`Select`],apply:[`Appliquer`,`Apply`],dismiss:[`Ignorer`,`Dismiss`],"show all projects":[`Tous les projets`,`All projects`],"only show current branch":[`Branche courante seulement`,`Current branch only`],"only show current repo":[`Projet courant seulement`,`Current project only`],"show all branches":[`Toutes les branches`,`All branches`],"only show current worktree":[`Worktree courant seulement`,`Current worktree only`],"show all worktrees":[`Tous les worktrees`,`All worktrees`],preview:[`Aperçu`,`Preview`],"set as default":[`Définir par défaut`,`Set as default`],"use this session only":[`Cette session seulement`,`This session only`],resume:[`Reprendre`,`Resume`],clear:[`Effacer`,`Clear`],"← switch":[`Onglet précédent`,`Previous tab`],"→ switch":[`Onglet suivant`,`Next tab`]},b=(e,t)=>e[+!!t];function ct(e,t=p===`en`){if(ot[e])return b(ot[e],t);let n=e.match(/^ctrl\+(\w)$/);return n?`Ctrl+${n[1].toUpperCase()}`:e}function lt(e,t=p===`en`){return e.title?`${b([`Menu`,`Menu`],t)} · ${e.title}`:b([`Menu ouvert`,`Menu open`],t)}function ut(e,t=p===`en`){let n=st[e.label.toLowerCase()];return n?b(n,t):e.label[0].toUpperCase()+e.label.slice(1)}function dt(e,t=p===`en`){return`${ut(e,t)} (${ct(e.key,t)})`}function ft(e,t=p===`en`){let n={hooks:[`Hooks à approuver`,`Hooks to review`],trust:[`Confiance du dossier demandée`,`Folder trust requested`],login:[`Connexion demandée`,`Sign-in required`],update:[`Mise à jour proposée`,`Update available`]}[e.kind];return n?b(n,t):e.title}function pt(e,t=p===`en`){let n={hooks:[`Des hooks (commandes lancées automatiquement à certains moments : avant un outil, au démarrage…) sont nouveaux ou ont changé : ils ne tournent qu’une fois approuvés.`,`Hooks (commands run automatically at set moments: before a tool, at startup…) are new or changed: they only run once you trust them.`],trust:[`L’agent demande s’il peut lire, modifier et exécuter les fichiers de ce dossier.`,`The agent asks whether it may read, edit and run the files in this folder.`],login:[`L’agent n’est pas connecté. La connexion s’ouvre sur la machine de l’agent : termine-la dans le terminal.`,`The agent is not signed in. Sign-in opens on the agent’s machine: finish it in the terminal.`],update:[`Une nouvelle version de l’agent est disponible.`,`A new version of the agent is available.`]}[e];return n?b(n,t):null}function x(e){let t=String(e||``),n=t.indexOf(`~`);return n<0?{machine:``,local:t}:{machine:t.slice(0,n),local:t.slice(n+1)}}var S=e=>x(String(e||``)).machine,mt=/^[a-z][a-z0-9_-]{0,31}$/,ht=`Name: lowercase letters, digits, - and _ (32 max), starting with a letter`,gt=()=>({home:null,chats:[]}),_t=e=>JSON.stringify(e).length*2;function vt(e){let t=e.slice(-160);for(;t.length&&_t(t)>225280;)t=t.slice(1);return t}function yt(e,t){let n={home:e.home,chats:e.chats.slice()};if(t?.ok){let e=new Set(t.panes.map(e=>e.id)),r=new Set([``,...(t.machines||[]).filter(e=>e.status===`online`).map(e=>e.key)]);n.chats=n.chats.filter(t=>e.has(t.id)||!r.has(x(t.id).machine))}for(n.chats=n.chats.map(e=>({...e,items:vt(e.items)})).sort((e,t)=>t.used-e.used).slice(0,12);n.chats.length&&_t(n)>4194304;)n.chats.pop();return _t(n)>4194304&&(n.home=null),n}var bt=null;function xt(){return bt||(bt=new Promise((e,t)=>{let n=indexedDB.open(`wherdr-offline`,1),r=setTimeout(()=>t(Error(`IndexedDB indisponible`)),3e3);n.onupgradeneeded=()=>n.result.createObjectStore(`snapshot`),n.onsuccess=()=>{clearTimeout(r),e(n.result)},n.onerror=()=>{clearTimeout(r),t(n.error)},n.onblocked=()=>{clearTimeout(r),t(Error(`IndexedDB bloqué`))}}),bt.catch(e=>{throw bt=null,e}))}async function St(){try{let e=await xt();return await new Promise((t,n)=>{let r=e.transaction(`snapshot`).objectStore(`snapshot`).get(`current`);r.onsuccess=()=>{let e=r.result;if(!e||!Array.isArray(e.chats))return t(gt());t({home:e.home?.state&&Array.isArray(e.home.state.panes)&&Array.isArray(e.home.state.workspaces)?e.home:null,chats:e.chats.filter(e=>typeof e?.id==`string`&&Array.isArray(e.items)&&Number.isFinite(e.at))})},r.onerror=()=>n(r.error)})}catch{return gt()}}async function Ct(e){try{let t=await xt();await new Promise((n,r)=>{let i=t.transaction(`snapshot`,`readwrite`);i.objectStore(`snapshot`).put(e,`current`),i.oncomplete=()=>n(),i.onerror=()=>r(i.error)})}catch{}}var wt=Promise.resolve();function C(e){return wt=wt.then(async()=>Ct(e(await St()))).catch(()=>{}),wt}var Tt=St;function Et(e,t){return C(n=>yt({...n,home:{state:e,quotas:t===void 0?n.home?.quotas||null:t,at:Date.now()}},e))}function Dt(e){return C(t=>t.home?{...t,home:{...t.home,quotas:e}}:t)}function Ot(e,t){return C(n=>yt({...n,chats:[{id:e,items:vt(t),at:Date.now(),used:Date.now()},...n.chats.filter(t=>t.id!==e)]}))}function kt(e){return C(t=>yt({...t,chats:t.chats.map(t=>t.id===e?{...t,used:Date.now()}:t)}))}function At(){return C(()=>gt())}var jt=`wherdr-offline-access`;function Mt(e,t=Date.now()){return!!(e&&(!e.enabled||e.expiresAt>t&&e.expiresAt<=t+432e5&&(e.deadline===void 0||e.deadline>t)))}function Nt(e,t=Date.now()){if(!e.enabled)return{enabled:!1,expiresAt:0};if(!e.expiresAt)return{enabled:!0,expiresAt:0};let n=t-(e.now??t);return{enabled:!0,expiresAt:e.expiresAt+n,...e.deadline?{deadline:e.deadline+n}:{}}}function Pt(){try{let e=JSON.parse(localStorage.getItem(`wherdr-offline-access`)||`null`);return e&&typeof e.enabled==`boolean`&&Number.isFinite(e.expiresAt)?e:null}catch{return null}}function Ft(e){try{e?localStorage.setItem(jt,JSON.stringify(e)):localStorage.removeItem(jt)}catch{}}function It(e){return e===`html`?`html`:`webgl`}function Lt(e,t){return e===`html`?`html`:t?`webgl`:`html-fallback`}function Rt(e,t,n){if(!e||!e.ok)return t;if(t.ready===!1)return null;if(!n||!t.ok)return t;let r=new Set([``,...(t.machines||[]).filter(e=>e.status===`online`).map(e=>e.key)]),i=new Set(t.panes.map(e=>S(e.id))),a=e=>{let t=S(e);return t!==``&&!r.has(t)&&!i.has(t)},o=e.panes.filter(e=>a(e.id));if(!o.length)return t;let s=new Set(o.map(e=>S(e.id))),c=new Set((t.machines||[]).map(e=>e.key)),l=(e.machines||[]).filter(e=>s.has(e.key)&&!c.has(e.key)).map(e=>({...e,status:`connecting`})),u=t.machines?[]:(e.machines||[]).filter(e=>e.key===``);return{...t,workspaces:[...t.workspaces,...e.workspaces.filter(e=>a(e.id))],tabs:[...t.tabs||[],...(e.tabs||[]).filter(e=>a(e.id))],panes:[...t.panes,...o],machines:[...u,...t.machines||[],...l]}}var w=(e,t)=>t>0?Math.round(e/t*1e4)/100:0;function zt(e){let{area:t}=e;return Bt(e).map(({pane:e,rect:n})=>({pane:e,left:w(n.x-t.x,t.width),top:w(n.y-t.y,t.height),width:w(n.width,t.width),height:w(n.height,t.height)}))}function Bt(e){return e.panes}function Vt(e,t,n){let r=Bt(e).map(e=>e.pane),i=r.indexOf(t);return i<0?null:r[i+n]??null}function Ht(e,t){if(e.layout&&e.layout.panes.length)return e.layout;let n=Math.max(1,t.length);return{tab:e.id,workspace:e.workspace,zoomed:!1,focused:t[0]??null,area:{x:0,y:0,width:120,height:40*n},panes:t.map((e,t)=>({pane:e,rect:{x:0,y:t*40,width:120,height:40}}))}}function Ut(e,t,n,r){let i=e.panes.findIndex(e=>e.pane===t);if(i<0)return e;let a=e.panes[i].rect,[o,s]=n===`right`?[{...a,width:Math.ceil(a.width/2)},{...a,x:a.x+Math.ceil(a.width/2),width:Math.floor(a.width/2)}]:[{...a,height:Math.ceil(a.height/2)},{...a,y:a.y+Math.ceil(a.height/2),height:Math.floor(a.height/2)}],c=[...e.panes];return c.splice(i,1,{pane:t,rect:o},{pane:r,rect:s}),{...e,zoomed:!1,panes:c}}var Wt=[`left`,`right`,`up`,`down`];function Gt(e,t,n){let r=e.panes.find(e=>e.pane===t)?.rect;if(!r)return null;let i=(e,t,n,r)=>Math.min(t,r)-Math.max(e,n),a=null;for(let{pane:o,rect:s}of e.panes){if(o===t)continue;let e=n===`left`||n===`right`,c=n===`left`?s.x+s.width===r.x:n===`right`?r.x+r.width===s.x:n===`up`?s.y+s.height===r.y:r.y+r.height===s.y,l=e?i(r.y,r.y+r.height,s.y,s.y+s.height):i(r.x,r.x+r.width,s.x,s.x+s.width);if(!c||l<=0)continue;let u=e?s.y:s.x;(!a||l>a.len||l===a.len&&u<a.at)&&(a={pane:o,len:l,at:u})}return a?.pane??null}function Kt(e,t){return e.zoomed?[]:Wt.filter(n=>Gt(e,t,n))}function qt(e,t,n){let r=e.panes.find(e=>e.pane===t)?.rect,i=e.panes.find(e=>e.pane===n)?.rect;return!r||!i||t===n?e:{...e,panes:e.panes.map(e=>e.pane===t?{pane:n,rect:r}:e.pane===n?{pane:t,rect:i}:e)}}function Jt(e){if(!e.splits)return null;let t=new Map(e.splits.map(e=>[e.path,e])),n=(e,r)=>{let i=t.get(e);if(!i)return r.length===1?{pane:r[0].pane}:null;let a=i.direction===`right`,o=a?i.rect.x+i.rect.width*i.ratio:i.rect.y+i.rect.height*i.ratio,s=e=>a?e.x+e.width/2:e.y+e.height/2,c=n(`${e}0`,r.filter(e=>s(e.rect)<o)),l=n(`${e}1`,r.filter(e=>s(e.rect)>=o));return c&&l?{direction:i.direction,ratio:i.ratio,first:c,second:l}:null};return n(``,e.panes)}function Yt(e,t){let n=[],r=[],i=(e,t,a)=>{if(`pane`in e){n.push({pane:e.pane,rect:t});return}r.push({path:a,direction:e.direction,ratio:e.ratio,rect:t});let o=e.direction===`right`,s=Math.round((o?t.width:t.height)*e.ratio);i(e.first,o?{...t,width:s}:{...t,height:s},`${a}0`),i(e.second,o?{...t,x:t.x+s,width:t.width-s}:{...t,y:t.y+s,height:t.height-s},`${a}1`)};return i(t,e.area,``),{...e,panes:n,splits:r}}var Xt=e=>`pane`in e?e.pane:`${e.direction}(${Xt(e.first)},${Xt(e.second)})`;function Zt(e,t,n,r=.28){if(e.width<=0||e.height<=0)return null;let i=(t-e.left)/e.width,a=(n-e.top)/e.height;if(i<0||i>1||a<0||a>1)return null;let[o,s]=[[`left`,i],[`right`,1-i],[`up`,a],[`down`,1-a]].reduce((e,t)=>t[1]<e[1]?t:e);return s<r?o:`center`}function Qt(e,t,n,r){if(e.zoomed||t===n)return null;let i=e.panes.map(e=>e.pane);if(!i.includes(t)||!i.includes(n))return null;if(r===`center`)return qt(e,t,n);let a=Jt(e);if(!a)return null;let o=e=>{if(`pane`in e)return e.pane===t?null:e;let n=o(e.first),r=o(e.second);return n&&r?{...e,first:n,second:r}:n||r},s=e=>{if(`pane`in e){if(e.pane!==n)return e;let i={pane:t},a=r===`left`||r===`up`;return{direction:r===`left`||r===`right`?`right`:`down`,ratio:.5,first:a?i:e,second:a?e:i}}return{...e,first:s(e.first),second:s(e.second)}},c=o(a);if(!c)return null;let l=s(c);return Xt(l)===Xt(a)?null:Yt(e,l)}function $t(e){if(e.zoomed||!e.splits||!Jt(e))return[];let{area:t}=e;return e.splits.map(e=>{let n=e.direction===`right`,[r,i,a]=n?[e.rect.x-t.x,e.rect.width,t.width]:[e.rect.y-t.y,e.rect.height,t.height],[o,s,c]=n?[e.rect.y-t.y,e.rect.height,t.height]:[e.rect.x-t.x,e.rect.width,t.width];return{path:e.path,direction:e.direction,ratio:e.ratio,at:w(r+Math.round(i*e.ratio),a),from:w(o,c),span:w(s,c),start:w(r,a),size:w(i,a)}})}function en(e,t,n,r=8){let i=t.size/100*(t.direction===`right`?e.area.width:e.area.height),a=Math.min(.45,Math.max(.05,i>0?r/i:.5)),o=t.size>0?(n-t.start)/t.size:t.ratio;return Math.round(Math.min(1-a,Math.max(a,o))*1e3)/1e3}function tn(e,t,n){let r=Jt(e);if(!r)return e;let i=(e,r)=>`pane`in e?e:r===t?{...e,ratio:n}:{...e,first:i(e.first,`${r}0`),second:i(e.second,`${r}1`)};return Yt(e,i(r,``))}var nn=(e,t)=>e.number-t.number;function rn(e){if(e.tabs)return e.tabs;let t=new Map;for(let n of e.panes)t.has(n.tab)||t.set(n.tab,{id:n.tab,...n.machine?{machine:n.machine}:{},workspace:n.workspace,label:n.tabLabel||``,number:t.size+1,layout:null});return[...t.values()]}function an(e,t){let n=t.filter(t=>t.tab===e.id),r=new Set(n.map(e=>e.id)),i=e.layout,a=i&&i.panes.length===r.size&&i.panes.every(e=>r.has(e.pane)),o=Ht({...e,layout:a?i:null},n.map(e=>e.id)),s=new Map(n.map(e=>[e.id,e]));return{tab:e,layout:o,panes:Bt(o).map(e=>s.get(e.pane))}}function on(e,t){let n=e=>t===void 0||(e.machine||``)===t,r=rn(e).filter(n);return e.workspaces.filter(n).sort(nn).map(t=>({workspace:t,tabs:r.filter(e=>e.workspace===t.id).sort(nn).map(t=>an(t,e.panes))})).filter(e=>e.tabs.some(e=>e.panes.length))}function sn(e,t){let n=rn(e).find(e=>e.id===t);return n?an(n,e.panes):null}var cn={blocked:0,working:1,done:2,idle:3,unknown:4},ln=e=>e.agent?cn[e.status||`unknown`]??4:9;function un(e){let t=null;for(let n of e)(!t||ln(n)<ln(t))&&(t=n);return t}function dn(e,t){return on(e,t).map(e=>{let t=e.tabs.filter(e=>e.panes.length),n=t.flatMap(e=>e.panes),r=un(n);if(t.length===1&&n.length===1)return{kind:`pane`,key:r.id,pane:r,lead:r};let i=e=>n.filter(t=>t.agent&&t.status===e).length;return{kind:`space`,key:e.workspace.id,workspace:e.workspace,tabs:t,panes:n,lead:r,leadTab:t.find(e=>e.panes.includes(r)),sum:{blocked:i(`blocked`),working:i(`working`),done:i(`done`),agents:n.filter(e=>e.agent).length}}})}var fn=e=>!e.lead.agent;function pn(e){let t=e.lead;return t.agent&&t.status===`blocked`?`blocked`:t.agent&&t.status===`working`?`working`:`ready`}var mn=/\/\.herdr\/worktrees\/([^/]+)\/[^/]+/,hn=e=>(e||``).replace(/\\/g,`/`).replace(/\/+$/,``);function gn(e,t){let n=new Map(e.workspaces.map(e=>[e.id,e])),r=t=>e.panes.filter(e=>e.workspace===t),i=e.workspaces.flatMap(e=>{let t=r(e.id).map(e=>mn.exec(hn(e.cwd))?.[1]).find(Boolean);return!e.worktree&&!t?[]:[{id:e.id,machine:e.machine||``,repo:e.repo,name:e.repoName||t||``}]}),a=new Map;for(let e of t){if(!fn(e))continue;let t=n.get(e.lead.workspace);if(!t||t.worktree||mn.test(hn(e.lead.cwd)))continue;let r=t.machine||``,o=t.repoName||hn(e.lead.cwd).split(`/`).pop()||``,s=i.filter(e=>e.machine===r&&e.id!==t.id&&(t.repo&&e.repo?e.repo===t.repo:!t.repo&&!!o&&e.name===o));if(!s.length)continue;let c=`${r}\0${s.map(e=>e.id).sort().join(` `)}`,l=a.get(c);(!l||t.number<l.number)&&a.set(c,{number:t.number,root:{row:e,name:o,worktrees:s.map(e=>e.id)}})}return[...a.values()].map(e=>e.root)}function _n(e,t){return e.filter(e=>t.some(t=>e.worktrees.includes(t.workspace)))}function vn(e,t){if(!t)return[e];let n=e.filter(e=>(e.kind===`space`?e.panes:[e.pane]).some(e=>e.agent&&e.status===`done`));return[n,e.filter(e=>!n.includes(e))].filter(e=>e.length)}var yn=[`herdr`,`recent`,`name`];function bn(e,t,n){if(t===`herdr`)return e;let r=e=>Math.max(-1,...(e.kind===`space`?e.panes:[e.pane]).map(e=>e.stateSeq??-1)),i=new Map(e.map(e=>[e,t===`recent`?r(e):n(e)]));return[...e].sort((e,n)=>t===`recent`?i.get(n)-i.get(e):i.get(e).localeCompare(i.get(n),void 0,{sensitivity:`base`,numeric:!0}))}function xn(e,t,n,r){let i=e.filter(e=>e.panes.length),a=t[n];if(a&&i.some(e=>e.tab.id===a))return a;if(r&&i.some(e=>e.tab.id===r))return r;let o=un(i.flatMap(e=>e.panes));return o&&i.find(e=>e.panes.includes(o))?.tab.id||i[0]?.tab.id||null}function Sn(e,t){let n=e.workspaces.find(e=>e.id===t);return n&&on(e,n.machine||``).find(e=>e.workspace.id===t)?.tabs.filter(e=>e.panes.length)||[]}function Cn(e,t){let n=e.panes.find(e=>e.tab===t)?.workspace??e.tabs?.find(e=>e.id===t)?.workspace;if(!n)return null;let r=Sn(e,n),i=r.findIndex(e=>e.tab.id===t);return i<0?null:(r[i-1]??r[i+1])?.tab.id??null}var wn=(e,t)=>t.length===1?{pane:t[0].id}:{tab:e};function Tn(e,t,n){if(!n)return null;let r=`pane`in n?e.panes.find(e=>e.id===n.pane):void 0,i=`tab`in n?n.tab:r?.tab,a=r?.workspace??e.panes.find(e=>e.tab===i)?.workspace;if(`workspace`in t)return a===t.workspace?`home`:null;let o=t=>{let n=Cn(e,t);return n?wn(n,e.panes.filter(e=>e.tab===n)):`home`};if(`tab`in t)return i===t.tab?o(t.tab):null;let s=e.panes.find(e=>e.id===t.pane);if(!s||i!==s.tab||r&&r.id!==s.id)return null;let c=(sn(e,s.tab)?.panes||[]).filter(e=>e.id!==s.id);return c.length?`tab`in n&&c.length>1?null:wn(s.tab,c):o(s.tab)}function En(e,t,n,r){let i={...e,[t]:n};if(!r)return i;let a=new Set(r);return Object.fromEntries(Object.entries(i).filter(([e])=>a.has(e)))}var T={"\r":`enter`,"\n":`enter`,"":`backspace`,"\b":`backspace`," ":`tab`,"\x1B":`esc`,"\x1B[A":`up`,"\x1B[B":`down`,"\x1B[C":`right`,"\x1B[D":`left`,"\x1BOA":`up`,"\x1BOB":`down`,"\x1BOC":`right`,"\x1BOD":`left`,"\x1B[Z":`shift+tab`,"\x1BOP":`f1`,"\x1BOQ":`f2`,"\x1BOR":`f3`,"\x1BOS":`f4`,"\x1B[H":`home`,"\x1BOH":`home`,"\x1B[1~":`home`,"\x1B[7~":`home`,"\x1B[F":`end`,"\x1BOF":`end`,"\x1B[4~":`end`,"\x1B[8~":`end`,"\x1B[3~":`delete`,"\x1B[2~":`insert`,"\x1B[5~":`pageup`,"\x1B[6~":`pagedown`},Dn=`\x1B[200~`,On=`\x1B[201~`,kn=/^\x1b(?:\[[0-9;?]*[ -/]*[@-~]|O[@-~]|[^[O])?/;function An(e){let t=[],n=e=>{let n=t[t.length-1];n&&`keys`in n&&n.keys.length<32?n.keys.push(e):t.push({keys:[e]})},r=e=>{let n=t[t.length-1];n&&`text`in n?n.text+=e:t.push({text:e})};if(e.startsWith(Dn)&&e.endsWith(On)){let t=e.slice(6,-6).replace(/\r\n?/g,`
|
|
2
|
-
`);return t?[{text:t}]:[]}if(e.length>1&&!/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(e)){let t=e.replace(/\r\n?/g,`
|
|
3
|
-
`);if(t.includes(`
|
|
4
|
-
`))return[{text:t}]}let i=0;for(;i<e.length;){let t=e[i];if(t===`\x1B`){let t=kn.exec(e.slice(i))[0];T[t]?n(T[t]):t.length===2&&t[1]>=` `&&t[1]<=`~`&&n(`alt+${t[1].toLowerCase()}`),i+=t.length;continue}T[t]?n(T[t]):t<` `?t!==`\0`&&n(`ctrl+${String.fromCharCode(t.charCodeAt(0)+96)}`):r(t),i++}return t}function jn(e,t,n){let r=e.filter(e=>e!==t),i=n===null?-1:r.indexOf(n);return i<0?[...r,t]:[...r.slice(0,i),t,...r.slice(i)]}function Mn(e,t,n,r){let i=t.indexOf(n);if(i<0||!e.includes(n))return null;let a=t.filter(e=>e!==n),o=Math.max(0,Math.min(a.length,r>i?r-1:r));if(!a.length)return null;let s;if(o<a.length)s=a[o];else{let t=e.filter(e=>e!==n);s=t[t.indexOf(a[a.length-1])+1]??null}return jn(e,n,s).every((t,n)=>t===e[n])?null:{before:s}}function Nn(e,t,n){let r=e.find(e=>e.id===t);if(!r)return e;let i=r.machine||``,a=e.filter(e=>(e.machine||``)===i).sort((e,t)=>e.number-t.number).map(e=>e.id),o=new Map(jn(a,t,n).map((e,t)=>[e,t+1]));return e.map(e=>o.has(e.id)?{...e,number:o.get(e.id)}:e)}var Pn=[1,7,30,90,365];function Fn(e){let t;try{t=JSON.parse(e||`{}`)}catch{return{}}if(!t||typeof t!=`object`||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t))(e===``||/^[0-9a-f]{4,32}$/.test(e))&&typeof r==`string`&&/^[\w.-]{1,64}$/.test(r)&&(n[e]=r);return n}var In=e=>JSON.stringify(e);function Ln(e,t){if(!e.machines)return e;let n=[];for(let r of e.machines.filter(e=>e.baseKey===void 0)){let i=t[r.key];n.push(e.machines.find(e=>e.baseKey===r.key&&e.session===i)||r)}let r=new Set(n.map(e=>e.key)),i=n.find(e=>e.local);return{...e,ok:i?i.status===`online`&&(i.baseKey!==void 0||e.ok):e.ok,version:i?.version||e.version,session:i?.session||e.session,machines:n,workspaces:e.workspaces.filter(e=>r.has(e.machine||``)),tabs:e.tabs?.filter(e=>r.has(e.machine||``)),panes:e.panes.filter(e=>r.has(e.machine||``))}}var Rn=2e3,zn={fast:1,medium:2,slow:3},Bn={fast:20,medium:40,slow:70},Vn={fast:300,medium:450,slow:650};function Hn(e,t=`fast`){return t===`off`?0:Math.round(Math.min(Rn,Math.max(500,400+e*3.5))*zn[t])}function Un(e,t,n){if(n===`off`||e<=0)return{written:e,decrypted:e,done:!0};let r=Hn(e,n),i=Math.min(e,Math.floor(Math.max(0,t)/r*e)),a=Math.min(e,Bn[n]),o=Math.max(0,i-a),s=Math.min(1,Math.max(0,t-r)/Vn[n]);return{written:i,decrypted:Math.min(e,o+Math.floor((e-o)*s)),done:t>=r+Vn[n]}}function Wn(e,t=8){let n=[],r=/\s*\S+\s*/g,i;for(;i=r.exec(e);){let e=i.index+i[0].length;for(let r=i.index+t;r<e-2;r+=t)n.push(r);n.push(e)}return(!n.length||n[n.length-1]!==e.length)&&n.push(e.length),n}function Gn(e,t,n){if(!e.length)return 0;if(t>=n)return e[e.length-1];let r=Math.floor(Math.max(0,t)/n*e.length);return r<=0?0:e[Math.min(r,e.length)-1]}function Kn(e,{atomic:t=()=>!1,keep:n=()=>!1}={}){let r=[],i=[],a=0,o=``,s=e=>{for(let c of Array.from(e.childNodes))if(c.nodeType===3){let e=c.nodeValue||``;if(!e.trim())continue;r.push({node:c,full:e,start:a}),a+=e.length,o+=e}else if(c.nodeType===1){let e={node:c,start:a,text:!1,keep:n(c)};i.push(e),t(c)||s(c),e.text=a>e.start}};return s(e),{texts:r,elems:i,total:a,stops:Wn(o),shown:-1,written:-1}}function qn(e,t,n=!1,r=t){if(t===e.shown&&r===e.written)return;e.shown=t,e.written=r;for(let n of e.texts){let e=n.full.slice(0,Math.max(0,t-n.start));n.node.nodeValue!==e&&(n.node.nodeValue=e)}let i=n&&r<e.total?r+1:r;for(let t of e.elems){let n=!t.keep&&r<e.total&&(t.text?t.start>=i:t.start>r);!!t.node.hidden!==n&&(t.node.hidden=n)}}var Jn=`#%@&$*+=-/\\|<>01{}[]~^:;_!?`;function Yn(e,t,n,r){return{speed:e===`off`||e===`fast`||e===`medium`||e===`slow`?e:n===`off`||r===`0`?`off`:n===`plain`||n===`terminal`?`fast`:`medium`,encrypted:t===`0`?!1:t===`1`||n!==`plain`}}var Xn=(e,t)=>t?`off`:e,Zn=(e,t,n)=>Xn(e,n)!==`off`&&t;function Qn(e,t,n){if(n<=t)return[];let r=[];for(let i of e.texts){if(i.start>=n)break;let e=Math.max(0,t-i.start),a=Math.min(i.full.length,n-i.start);a>e&&r.push({node:i.node,text:i.full.slice(e,a)})}return r}function $n(e,t=Math.random){return Array.from(e,e=>/\s/.test(e)?e:Jn[Math.floor(t()*27)])}function er(e){qn(e,e.total)}var tr=e=>`${e.ts||``}|${e.text.length}|${e.text.slice(0,64)}`;function nr(e,t,n){let r=null;for(let n of t)e.has(n)||(e.add(n),r=n);return n?r:null}function rr(e){try{let t=JSON.parse(e||`[]`);return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`string`&&e!==`shell`))]:[]}catch{return[]}}function ir(e,t){let n=new Set(t);return[...new Set(e.filter(e=>e!==`shell`&&!n.has(e))),`shell`]}function ar(e,t,n=``){return t.includes(e)?e:!e&&t.includes(n)?n:t[0]||`shell`}var or=[`normal`,`wide`,`full`];function sr(e){return or.includes(e)?e:`normal`}function cr(e,t){return sr(e??t)}var lr=`#!/bin/sh
|
|
5
|
-
# wherdr: installs Claude Code's invisible status line (quotas + account
|
|
6
|
-
# fingerprint) for the current user. Self-contained (the status line is included
|
|
7
|
-
# below): wherdr runs it as is on a machine ("Install" button) or
|
|
8
|
-
# hands it out to paste ("Copy command"). Safe to run again:
|
|
9
|
-
# - writes the status line to ~/.claude/wherdr-statusline.sh (update);
|
|
10
|
-
# - no \`statusLine\` in ~/.claude/settings.json: adds ours;
|
|
11
|
-
# - another \`statusLine\` (command): chains it behind ours, its
|
|
12
|
-
# output stays the same; backup copy settings.json.bak-wherdr.
|
|
13
|
-
# Quotas show up after the next exchange with a Claude.
|
|
14
|
-
set -e
|
|
15
|
-
dir="\${CLAUDE_CONFIG_DIR:-$HOME/.claude}"
|
|
16
|
-
mkdir -p "$dir"
|
|
17
|
-
# ---- status line (prints nothing) ----
|
|
18
|
-
cat > "$dir/wherdr-statusline.sh.tmp" <<'WHERDR_STATUSLINE'
|
|
19
|
-
#!/bin/sh
|
|
20
|
-
# wherdr: Claude Code's invisible status line (prints nothing). It only keeps
|
|
21
|
-
# the account quotas (rate_limits, which Claude Code passes to its
|
|
22
|
-
# status line after each exchange) for the wherdr home screen, and an account
|
|
23
|
-
# fingerprint (truncated hash of its ID, never the ID or the email)
|
|
24
|
-
# to tell apart machines that do not use the same account.
|
|
25
|
-
# Installed by install-claude-statusline.sh (wherdr repository, README, "Quotas
|
|
26
|
-
# on the home screen"). Existing status line: passed as an argument, it receives the
|
|
27
|
-
# same data and its output is kept (sh wherdr-statusline.sh 'cmd').
|
|
28
|
-
d=$(cat)
|
|
29
|
-
case "$d" in
|
|
30
|
-
*'"rate_limits"'*)
|
|
31
|
-
dir="$HOME/.cache/herdr-web"
|
|
32
|
-
f="$dir/claude-status.json"
|
|
33
|
-
mkdir -p "$dir" && printf '%s' "$d" > "$f.tmp" && mv "$f.tmp" "$f"
|
|
34
|
-
# Fingerprint: recomputed at most every 10 min (account change).
|
|
35
|
-
a="$dir/claude-account"
|
|
36
|
-
if [ -z "$(find "$a" -mmin -10 2>/dev/null)" ]; then
|
|
37
|
-
c="\${CLAUDE_CONFIG_DIR:-$HOME}/.claude.json"
|
|
38
|
-
id=$([ -r "$c" ] && tr -d '\\n' < "$c" \\
|
|
39
|
-
| grep -o '"oauthAccount": *{[^}]*' | grep -o '"accountUuid": *"[^"]*"' | head -n 1 | sed 's/.*"\\([^"]*\\)"$/\\1/')
|
|
40
|
-
if command -v sha256sum >/dev/null 2>&1; then sum=sha256sum; else sum='shasum -a 256'; fi
|
|
41
|
-
if [ -n "$id" ]; then
|
|
42
|
-
printf 'wherdr:%s' "$id" | $sum | cut -c1-16 > "$a.tmp" && mv "$a.tmp" "$a"
|
|
43
|
-
else
|
|
44
|
-
rm -f "$a"
|
|
45
|
-
fi
|
|
46
|
-
fi ;;
|
|
47
|
-
esac
|
|
48
|
-
if [ -n "$1" ]; then printf '%s' "$d" | sh -c "$1"; exit $?; fi
|
|
49
|
-
exit 0
|
|
50
|
-
WHERDR_STATUSLINE
|
|
51
|
-
chmod 755 "$dir/wherdr-statusline.sh.tmp"
|
|
52
|
-
mv "$dir/wherdr-statusline.sh.tmp" "$dir/wherdr-statusline.sh"
|
|
53
|
-
echo "status line written: $dir/wherdr-statusline.sh"
|
|
54
|
-
# ---- settings.json ----
|
|
55
|
-
[ -f "$dir/settings.json" ] || echo '{}' > "$dir/settings.json"
|
|
56
|
-
cp "$dir/settings.json" "$dir/settings.json.bak-wherdr"
|
|
57
|
-
python3 - "$dir/settings.json" "$dir/wherdr-statusline.sh" <<'WHERDR_PY'
|
|
58
|
-
import json, shlex, sys
|
|
59
|
-
path, script = sys.argv[1], sys.argv[2]
|
|
60
|
-
d = json.load(open(path))
|
|
61
|
-
ours = 'sh ' + shlex.quote(script)
|
|
62
|
-
cur = d.get('statusLine')
|
|
63
|
-
if isinstance(cur, dict) and 'wherdr-statusline.sh' in str(cur.get('command', '')):
|
|
64
|
-
print('already installed:', cur['command'])
|
|
65
|
-
sys.exit(0)
|
|
66
|
-
if cur is None:
|
|
67
|
-
d['statusLine'] = {'type': 'command', 'command': ours}
|
|
68
|
-
print('status line added:', ours)
|
|
69
|
-
elif isinstance(cur, dict) and cur.get('type') == 'command' and cur.get('command'):
|
|
70
|
-
d['statusLine'] = {**cur, 'command': ours + ' ' + shlex.quote(cur['command'])}
|
|
71
|
-
print('existing status line chained:', d['statusLine']['command'])
|
|
72
|
-
else:
|
|
73
|
-
print('unknown statusLine, nothing changed:', json.dumps(cur), file=sys.stderr)
|
|
74
|
-
sys.exit(1)
|
|
75
|
-
with open(path, 'w') as f:
|
|
76
|
-
json.dump(d, f, indent=2, ensure_ascii=False)
|
|
77
|
-
f.write('\\n')
|
|
78
|
-
WHERDR_PY
|
|
79
|
-
`;function ur(e,t=[]){if(!e)return[];let n=[];return e.claude&&!t.includes(`claude`)&&!((e.claudeAccounts?.length||0)>1)&&n.push({key:`claude`,agent:`claude`,q:e.claude}),e.codex&&!t.includes(`codex`)&&!((e.codexAccounts?.length||0)>1)&&n.push({key:`codex`,agent:`codex`,q:e.codex}),n}function dr(e,t,n=[]){if(!e)return[];let r=[];for(let i of[`claude`,`codex`]){let a=i===`claude`?e.claudeAccounts:e.codexAccounts;if(n.includes(i)||(a?.length||0)<2)continue;let o=a.find(e=>e.machines.some(e=>e.key===t));if(!o)continue;let{machines:s,...c}=o;r.push({key:`${i}:${t}`,agent:i,q:c})}return r}function fr(e,t,n,r=[]){return!n||r.includes(`claude`)?null:e?.claudeSetup?.find(e=>e.key===t)||null}var pr=`sh <<'WHERDR_INSTALL'\n${lr.trimEnd()}\nWHERDR_INSTALL\n`;function mr(e,t){return e.resetsAt&&e.resetsAt<=t?100:Math.round(100-e.used)}function hr(e){return e===`used`?`used`:`left`}function gr(e,t,n){let r=mr(e,t);return n===`used`?100-r:r}var _r=(e,t)=>{let n=mr(e,t);return n<=15?`hi`:n<=40?`mid`:`lo`},vr=36e5;function yr(e,t,n){if(!e.resetsAt)return``;if(e.resetsAt<=t)return null;let r=new Date(e.resetsAt),i=r.toLocaleTimeString(n,{hour:`2-digit`,minute:`2-digit`});return e.resetsAt-t<864e5?i:`${r.toLocaleDateString(n,{weekday:`short`})} ${i}`}function br(e){return e!==`0`}function xr(e,t,n=!0){return{menu:e&&n,selected:e&&n&&t}}function Sr(e){return e===1?`1 thread`:`${e} threads`}function Cr(e){let t=e.chat&&(e.live||e.desk&&e.cell);return{selector:t&&e.desk?e.cell?`cell`:`header`:null,term:t&&!e.desk,project:t&&!e.desk&&e.project}}function wr(e){return(e.live||!!(e.desk&&e.cell))&&(!e.desk||e.mode!==`term`&&e.mode!==`mirror`)}function Tr(e){return e.chat&&e.viewMode!==`term`?`chat`:`mirror`}function Er(e){return e.desk?e.defaultMode:`chat`}function Dr(e){return e.desk&&e.live&&e.available&&(e.mode===`term`||e.mode===`mirror`)}function Or(e){return{row:e>1,headerAdd:e===1}}function kr(e,t){return e===t?`chat`:t}function Ar(e){return!e.altKey||!(e.ctrlKey||e.metaKey)||e.shiftKey?0:{ArrowLeft:-1,ArrowUp:-1,ArrowRight:1,ArrowDown:1}[e.key]??0}function jr(e){return!e.desk||e.coarse}var Mr=[`lines`,`native`,`rich`];function Nr(e,t){return Mr.includes(e)?e:t===`1`?`rich`:`lines`}function Pr(e){let t=[];for(let n of String(e??``).split(`
|
|
80
|
-
`)){let e=/^>\s?(.*)$/.exec(n),r=t.at(-1);e&&r?.kind===`token`?r.text+=`\n${e[1]}`:e?t.push({kind:`token`,text:e[1]}):t.push({kind:`line`,text:n})}return t}var Fr=/^(DIV|P|LI|UL|OL|BLOCKQUOTE|PRE|H[1-6])$/;function Ir(e,t){let n=[],r=null,i=()=>{r!==null&&n.push(r),r=null},a=(e,o,s)=>{if(e.nodeType===3){let t=(e.data||``).split(`
|
|
81
|
-
`);r=(r??``)+t[0];for(let e of t.slice(1))n.push(r),r=e;return}if(e.nodeType!==1)return;let c=t(e);if(c!==null){i();for(let e of c.split(`
|
|
82
|
-
`))n.push(`> ${e}`);return}if(e.nodeName===`BR`){o&&s===o.childNodes.length-1?r??=``:(n.push(r??``),r=``);return}let l=Fr.test(e.nodeName);l&&(i(),e.childNodes.length||n.push(``));for(let t=0;t<e.childNodes.length;t++)a(e.childNodes[t],e,t);l&&i()};for(let t=0;t<e.childNodes.length;t++)a(e.childNodes[t],e,t);return i(),n.join(`
|
|
83
|
-
`)}function Lr(e,t){return e.key===`Enter`?t&&!e.shiftKey&&!e.isComposing?`send`:`newline`:null}var E={get(e){try{return localStorage.getItem(e)}catch{return null}},set(e,t){try{localStorage.setItem(e,t)}catch{}}},D=n({ok:!1,workspaces:[],panes:[]}),O=D.value;function Rr(){return Fn(E.get(`machineSessions`))}var k=r(Rr());function zr(e){k.value=e,E.set(`machineSessions`,In(e)),D.value=Ln(O,e)}async function Br(e){return(await J(`/api/sessions?machine=${encodeURIComponent(e)}`)).sessions}async function Vr(e,t){let n=await J(`/api/sessions`,{machine:e,name:t});zr({...k.value,[e]:t}),G.value=n.session.key,v().catch(()=>{}),await Hi()}var Hr=new Map;async function Ur(){for(let[e,t]of Object.entries(k.value)){if(!t||O.machines?.some(n=>n.key===e&&n.session===t)||O.machines?.some(n=>n.baseKey===e&&n.session===t))continue;let n=Date.now();n-(Hr.get(e)||0)<1e4||(Hr.set(e,n),J(`/api/sessions`,{machine:e,name:t}).catch(()=>{}))}}async function Wr(){for(let[e,t]of Object.entries(k.value))if(t&&!O.machines?.some(n=>n.key===e&&n.session===t))try{if(!(await Br(e)).some(e=>e.name===t&&e.running)){let t={...k.value};delete t[e],zr(t),v().catch(()=>{}),G.value&&!O.machines?.some(e=>e.key===G.value&&!e.baseKey)&&(G.value=e),q(m(`Session unavailable: back to the default session`))}}catch{}}var A=r(!1),j=r(!1),M=r(null),Gr=e(()=>M.value!==null),N=r(!1),P=r({kinds:[`claude`,`codex`],home:``,dirs:[],push:{enabled:!1,key:null,devices:0}}),Kr=r(``),qr=e(()=>`wherdr`),F=r(null),Jr=r(!0),Yr=r(br(E.get(`showShells`)));i(Yr,e=>E.set(`showShells`,e?`1`:`0`));var Xr=r(E.get(`showCounters`)!==`0`);i(Xr,e=>E.set(`showCounters`,e?`1`:`0`));var Zr=r(E.get(`showQuotas`)!==`0`);i(Zr,e=>E.set(`showQuotas`,e?`1`:`0`));var Qr=r(E.get(`compactList`)===`1`);i(Qr,e=>E.set(`compactList`,e?`1`:`0`));var $r=r(E.get(`autoReorderReady`)!==`0`);i($r,e=>E.set(`autoReorderReady`,e?`1`:`0`));var ei=r(yn.includes(E.get(`readySort`)||``)?E.get(`readySort`):`herdr`);i(ei,e=>E.set(`readySort`,e));var ti=r(E.get(`projectHideEmpty`)===`1`);i(ti,e=>E.set(`projectHideEmpty`,e?`1`:`0`));var ni=r(hr(E.get(`quotaDisplay`)));i(ni,e=>E.set(`quotaDisplay`,e));var ri=r(rr(E.get(`hiddenAgents`)));i(ri,e=>E.set(`hiddenAgents`,JSON.stringify(e)));var ii=r(cr(E.get(`contentWidth`),E.get(`chatWidth`)));i(ii,e=>{E.set(`contentWidth`,e);try{localStorage.removeItem(`chatWidth`)}catch{}document.documentElement.dataset.contentWidth=e},{immediate:!0});var I=Yn(E.get(`typewriterSpeed`),E.get(`encryptedText`),E.get(`typewriterMode`),E.get(`typewriter`));E.set(`typewriterSpeed`,I.speed),E.set(`encryptedText`,I.encrypted?`1`:`0`);var L=r(I.speed),ai=r(I.encrypted);i(L,e=>E.set(`typewriterSpeed`,e)),i(ai,e=>E.set(`encryptedText`,e?`1`:`0`));var R=r(!1);{let e=matchMedia(`(prefers-reduced-motion: reduce)`);R.value=e.matches,e.addEventListener(`change`,e=>{R.value=e.matches})}var oi=e(()=>Xn(L.value,R.value)),si=e(()=>oi.value!==`off`),ci=e(()=>Zn(L.value,ai.value,R.value)),li=r(Nr(E.get(`quoteModeComputer`),E.get(`quoteTokensComputer`)));i(li,e=>E.set(`quoteModeComputer`,e));var ui=r(Nr(E.get(`quoteModePhone`),E.get(`quoteTokensPhone`)));i(ui,e=>E.set(`quoteModePhone`,e));var di=e(()=>Ci.value?ui.value:li.value),fi=r(null),pi=r(Number(E.get(`fontSize`))||12);i(pi,e=>E.set(`fontSize`,String(e)));var z=r(It(E.get(`terminalRenderer`)));i(z,e=>E.set(`terminalRenderer`,e));var mi=r(null),B=r(null);function hi(e){mi.value=e,e!==`html`&&(B.value=e===`webgl`)}function gi(){if(z.value===`html`){mi.value=`html`;return}if(B.value===null)try{let e=document.createElement(`canvas`).getContext(`webgl2`);B.value=!!e,e?.getExtension(`WEBGL_lose_context`)?.loseContext()}catch{B.value=!1}mi.value=Lt(z.value,B.value===!0)}window.addEventListener(`storage`,e=>{e.key===`terminalRenderer`&&(z.value=It(e.newValue),gi())});function _i(){try{let e=JSON.parse(E.get(`viewModes`)||`{}`);return e&&typeof e==`object`?e:{}}catch{return{}}}var V=t(_i()),vi=r(E.get(`defaultViewMode`)===`term`?`term`:`chat`);i(vi,e=>E.set(`defaultViewMode`,e));var yi=e=>V[e]===`term`||V[e]===`project`||V[e]===`chat`?V[e]:Er({desk:H.value,defaultMode:vi.value});function bi(e,t){V[e]=t,E.set(`viewModes`,JSON.stringify(V))}function xi(e){if(!e.ok)return;let t=new Set(O.panes.map(e=>e.id)),n=new Set([``,...(O.machines||[]).filter(e=>e.status===`online`).map(e=>e.key)]),r=!1;for(let e of Object.keys(V))!t.has(e)&&n.has(x(e).machine)&&(delete V[e],r=!0);r&&E.set(`viewModes`,JSON.stringify(V))}i(D,xi);var Si=r(E.get(`lastKind`)||``);i(Si,e=>E.set(`lastKind`,e));var H=r(!1);{let e=matchMedia(`(min-width: 900px)`);H.value=e.matches,e.addEventListener(`change`,()=>{H.value=e.matches})}var Ci=r(!1);{let e=matchMedia(`(pointer: coarse)`);Ci.value=e.matches,e.addEventListener(`change`,()=>{Ci.value=e.matches})}var wi=e(()=>jr({desk:H.value,coarse:Ci.value})),Ti=e(()=>D.value.panes.find(e=>e.id===F.value)),U=e(()=>D.value.machines||[]),Ei=e(()=>U.value.length>1||!!U.value[0]?.baseKey),W=e=>U.value.find(t=>t.key===(e||``)),Di=e=>W(e)?.os||(e?void 0:P.value.os),Oi=e=>!e||!e.cwd?!1:Di(e.machine)===`Darwin`||!((e.machine||``).trim()||!P.value.hostOpen),ki=e(()=>Ei.value?(P.value.machines||[]).filter(e=>U.value.some(t=>t.key===e.key)):null),Ai=e=>e.local||W(e.key)?.status===`online`&&!!e.home,ji=e=>e.local?`online`:W(e.key)?.status||`offline`,Mi=e=>{let t=W(e);return t?t.label||m(`This machine`):``},Ni=e=>{let t=e?W(e.machine):void 0;return!!(t&&t.status!==`online`)};function Pi(e){try{let t=JSON.parse(E.get(e)||`[]`);return Array.isArray(t)?t.map(String):[]}catch{return[]}}var Fi=r(Pi(`collapsedMachines`));i(Fi,e=>E.set(`collapsedMachines`,JSON.stringify(e)));var Ii=r(Pi(`collapsedProjects`));i(Ii,e=>E.set(`collapsedProjects`,JSON.stringify(e)));var Li=r(Pi(`collapsedRepos`));i(Li,e=>E.set(`collapsedRepos`,JSON.stringify(e)));var G=r(E.get(`lastMachine`)||``);i(G,e=>E.set(`lastMachine`,e));var K=null;function Ri(e){K=e}function zi(){K?.clear()}function q(e,t=!1,n){K&&(K.clear(),K.add({title:e,description:n||void 0,color:t?`error`:`neutral`,class:t?`hw-toast-error`:void 0,icon:t?`i-lucide-circle-alert`:void 0,duration:(t?4200:2600)+(n?2400:0),close:!1}))}var Bi=class extends Error{code;status;constructor(e,t,n){super(e),this.status=t,this.code=n}};async function J(e,t,n){let r=t===void 0?{signal:n}:{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t),signal:n},i=await fetch(e,r),a=await i.json().catch(()=>(n?.throwIfAborted(),{}));i.status===401&&a.code===`locked`&&!e.startsWith(`/api/auth/`)&&$i();let o=a.code===`agent_not_ready`?`The agent isn’t ready in this pane (stopped or still starting).`:null;if(!i.ok)throw new Bi(m(o||a.error||`HTTP ${i.status}`),i.status,a.code);return a}async function Vi(e){try{let t=await J(`/api/reveal`,{pane_id:e.id,path:e.cwd,mode:`open`});q(de(`Opened in the editor on ${t.machine}`,`Ouvert dans l’éditeur sur ${t.machine}`))}catch(e){q(e.message,!0)}}async function Hi(){try{P.value=await J(`/api/config`),P.value.hostLabel!==void 0&&(Kr.value=P.value.hostLabel)}catch{}}var Y=null,Ui=0,Wi=!1,Gi=0,Ki=3e4,X=null,Z,Q,qi=()=>`${location.protocol===`https:`?`wss`:`ws`}://${location.host}`;function Ji(e){if(!e){clearTimeout(Q),Q=void 0,j.value=!1;return}j.value||Q||(Q=setTimeout(()=>{Q=void 0,j.value=!0},2500))}function Yi(e){for(let t of e.panes)(t.prompt&&t.prompt.options||at(t))&&t.status!==`working`&&(t.status=`blocked`);return e}function Xi(){if(clearTimeout(Z),N.value||Y&&Y.readyState<=1)return;let e=new WebSocket(`${qi()}/ws/events`);Y=e,e.onopen=()=>{Ui=0,A.value=!0,Wi&&(Gi=Date.now()+Ki,ae()),Wi=!0,Qi(),Ur()},e.onmessage=e=>{try{let t=Yi(JSON.parse(e.data)),n=Rt(X?O:null,t,Date.now()<Gi);if(!n)return;if(Ji(!1),!n.ok&&D.value.ok&&X){M.value=X;return}O=n,D.value=Ln(n,k.value),Ur(),X=Date.now(),M.value=null,n.ok&&Mt(Pt())&&Et(D.value)}catch{}},e.onclose=()=>{Y===e&&(Y=null,A.value=!1,D.value.ok&&X&&(M.value=X),$i(),!N.value&&(Ji(!0),Z=setTimeout(Xi,Math.min(8e3,500*2**Ui++))))}}function Zi(){Ui=0,clearTimeout(Z),Xi()}function Qi(){Y&&Y.readyState===1&&Y.send(JSON.stringify({type:`viewing`,pane:F.value,visible:Jr.value}))}i(F,Qi),i(D,e=>{let t=e.panes.filter(e=>e.status===`blocked`||e.status===`done`).length,n=navigator;try{t&&n.setAppBadge?n.setAppBadge(t).catch(()=>{}):n.clearAppBadge&&n.clearAppBadge().catch(()=>{})}catch{}});async function $i({resume:e=!1}={}){try{let t=await J(e?`/api/auth/status?resume=1`:`/api/auth/status`);if(t.enabled&&!t.unlocked)return $();let n=Nt(t);Ft(n),e&&ta(n)}catch{}}var ea=!1;function ta(e){ea||!e.deadline||e.deadline-Date.now()>216e5||(ea=!0,q(m(`The passkey will be asked again the next time the app opens.`)))}var na=!1,ra;function ia(){na||(na=!0,N.value=!1,Xi(),ra||=o(Wr,3e4),Hi(),v().catch(()=>{}))}function $(){N.value=!0,D.value={ok:!1,workspaces:[],panes:[]},O=D.value,M.value=null,Ft(null),At();let e=Y;if(Y=null,e){e.onclose=null;try{e.close()}catch{}}A.value=!1,clearTimeout(Z),Ji(!1),na=!1}var aa=3e3;async function oa({resume:e=!1}={}){let t=Pt();try{let n=e?await J(`/api/auth/status?resume=1`,void 0,AbortSignal.timeout(aa)):await J(`/api/auth/status`);if(n.hostLabel!==void 0&&(Kr.value=n.hostLabel),n.enabled&&!n.unlocked)return $();t=Nt(n),Ft(t),e&&ta(t)}catch{if(t?.enabled&&!Mt(t)&&!A.value)return $()}if(Mt(t)){let e=await Tt();e.home&&!A.value&&(O=e.home.state,D.value=Ln(O,k.value),M.value=e.home.at)}ia()}export{R as $,it as $n,An as $t,G as A,Ot as An,l as Ar,vr as At,Ei as B,ut as Bn,qn as Bt,A as C,Ut as Cn,m as Cr,wr as Ct,fi as D,Pt as Dn,te as Dr,Cr as Dt,ri as E,Mt as En,ae as Er,kr as Et,W as F,S as Fn,ur as Ft,Ni as G,_ as Gn,tr as Gt,Gr as H,pt as Hn,er as Ht,Mi as I,x as In,gr as It,ni as J,tt as Jn,Hn as Jt,yi as K,Je as Kn,Gn as Kt,Ai as L,at as Ln,yr as Lt,Hi as M,kt as Mn,o as Mr,fr as Mt,N,ht as Nn,dr as Nt,Kr as O,At as On,ee as Or,xr as Ot,ki as P,mt as Pn,_r as Pt,ei as Q,Ge as Qn,un as Qt,ji as R,lt as Rn,ar as Rt,ai as S,tn as Sn,fe as Sr,Tr as St,D as T,qt as Tn,oe as Tr,Dr as Tt,Vi as U,ft as Un,nr as Ut,j as V,ct as Vn,Qn as Vt,Jr as W,Qe as Wn,Kn as Wt,li as X,Ye as Xn,Pn as Xt,di as Y,y as Yn,Un as Yt,ui as Z,rt as Zn,Tn as Zt,F as _,Zt as _n,Ie as _r,oi as _t,qr as a,Nn as an,Ae as ar,Ri as at,H as b,zt as bn,be as br,Ir as bt,Vr as c,bn as cn,Me as cr,$ as ct,Ii as d,ln as dn,Fe as dr,oa as dt,Cn as en,$e as er,gi as et,Li as f,sn as fn,Te as fr,mi as ft,ii as g,Qt as gn,Le as gr,L as gt,Xi as h,$t as hn,Ee as hr,si as ht,$r as i,Mn as in,je as ir,bi as it,Br as j,Dt as jn,u as jr,pr as jt,Si as k,Tt as kn,ie as kr,Sr as kt,zi as l,dn as ln,Pe as lr,Zr as lt,$i as m,Gt as mn,ke as mr,q as mt,J as n,vn as nn,Re as nr,Zi as nt,M as o,gn as on,Ne as or,wi as ot,Qr as p,on as pn,De as pr,z as pt,ti as q,qe as qn,$n as qt,P as r,En as rn,ze as rr,Qi as rt,Oi as s,pn as sn,g as sr,Xr as st,Bi as t,_n as tn,He as tr,hi as tt,Fi as u,xn as un,Oe as ur,Yr as ut,Ti as v,Jt as vn,he as vr,Lr as vt,pi as w,Kt as wn,de as wr,Or as wt,ci as x,en as xn,p as xr,Ar as xt,vi as y,Vt as yn,me as yr,Pr as yt,U as z,dt as zn,ir as zt};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import{A as e,B as t,Ft as n,Hn as r,Jt as i,M as a,Mn as o,N as s,Ot as c,P as l,Pt as u,Rt as d,St as f,U as p,V as m,Zt as h,b as g,dr as _,hr as v,ht as y,j as b,ln as x,mr as S,mt as C,nn as w,sn as T,wn as E,zn as D}from"./SiL1FJ5s.js";import{_t as O,gt as k,vt as A}from"./CWwyK2XK.js";import{Ar as ee,In as j,Ln as M,Qt as te,Un as N,Vn as P,Zn as F,Zt as I,_r as L,an as ne,br as R,c as z,cn as re,fn as ie,hr as B,jr as ae,kr as oe,lr as se,mn as V,pn as ce,q as le,rr as ue,sn as de,t as fe,tn as pe,vr as me,wr as H,xn as he,xr as ge}from"./CjKICX3g.js";import{f as _e,p as ve,u as ye}from"./Ci8N4mWR.js";import{c as be,r as xe}from"./Bta8at9w.js";import{$ as Se,$n as Ce,Cr as U,E as we,F as Te,Gn as Ee,J as De,Jn as Oe,Kn as ke,M as Ae,O as je,Qn as Me,S as Ne,Sr as Pe,T as W,Tr as Fe,X as Ie,Xn as Le,Xt as Re,Y as ze,Yn as Be,Z as Ve,Zn as He,_ as Ue,_t as We,b as G,et as Ge,fr as Ke,ft as qe,g as Je,gt as Ye,hr as Xe,ht as Ze,i as Qe,lr as $e,lt as et,m as tt,mt as K,n as nt,p as rt,pt as it,q as at,r as ot,st,tr as ct,ut as lt,w as ut,wr as q,x as dt,xr as J,y as ft}from"./BevNMnQ2.js";import{O as pt,T as mt,a as ht,b as gt,c as _t,i as Y,k as vt,n as yt,r as bt,t as xt}from"./D903WmCE.js";import{_ as St,a as Ct,c as wt,d as Tt,f as Et,g as Dt,h as Ot,i as kt,n as At,o as jt,r as Mt,s as Nt,t as Pt,u as Ft,v as It}from"#entry";var X=`radio.select`;function Lt(e,t,n){B(X,n,{originalEvent:e,value:t})}var Rt=p({inheritAttrs:!1,__name:`Radio`,props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},checked:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:[`update:checked`,`select`],setup(t,{emit:i}){let o=t,u=i,d=ue(o,`checked`,u,{passive:o.checked===void 0}),{value:f}=D(o),{forwardRef:p,currentElement:h}=P(),_=It(h),v=St(),y=e(()=>o.id&&h.value?document.querySelector(`[for="${o.id}"]`)?.innerText:void 0);function b(e){o.disabled||Lt(e,o.value,e=>{u(`select`,e),!e?.defaultPrevented&&(d.value=!0,_.value&&e.stopPropagation())})}return(e,t)=>(c(),l(g,null,[m(r(j),C({id:e.id,ref:r(p),role:`radio`,type:e.as===`button`?`button`:void 0,as:e.as,"aria-checked":r(d)??!1,"aria-label":y.value,"as-child":e.asChild,disabled:e.disabled?``:void 0,"data-state":r(d)?`checked`:`unchecked`,"data-disabled":e.disabled?``:void 0,value:r(f),required:e.required,name:e.name},{...r(v),...e.$attrs},{onClick:A(b,[`stop`])}),{default:T(()=>[n(e.$slots,`default`,{checked:r(d)})]),_:3},16,[`id`,`type`,`as`,`aria-checked`,`aria-label`,`as-child`,`disabled`,`data-state`,`data-disabled`,`value`,`required`,`name`]),r(_)&&e.name?(c(),a(r(Dt),C({key:0,type:`radio`,tabindex:`-1`,value:r(f),checked:!!r(d),name:e.name,disabled:e.disabled,required:e.required},r(v)),null,16,[`value`,`checked`,`name`,`disabled`,`required`])):s(`v-if`,!0)],64))}}),[zt,Bt]=L(`RadioGroupRoot`),Z=p({__name:`RadioGroupRoot`,props:{modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},orientation:{type:String,required:!1,default:void 0},dir:{type:String,required:!1},loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1,default:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let i=e,o=t,{forwardRef:l,currentElement:u}=P(),d=ue(i,`modelValue`,o,{defaultValue:i.defaultValue,passive:i.modelValue===void 0}),{disabled:f,loop:p,orientation:h,name:g,required:_,dir:v}=D(i),y=N(v),b=It(u);return Bt({modelValue:d,changeModelValue:e=>{d.value=e},disabled:f,loop:p,orientation:h,name:g?.value,required:_}),(e,t)=>(c(),a(r(he),{"as-child":``,orientation:r(h),dir:r(y),loop:r(p)},{default:T(()=>[m(r(j),{ref:r(l),role:`radiogroup`,"data-disabled":r(f)?``:void 0,"as-child":e.asChild,as:e.as,"aria-orientation":r(h),"aria-required":r(_),dir:r(y)},{default:T(()=>[n(e.$slots,`default`,{modelValue:r(d)}),r(b)&&r(g)?(c(),a(r(Dt),{key:0,required:r(_),disabled:r(f),value:r(d),name:r(g)},null,8,[`required`,`disabled`,`value`,`name`])):s(`v-if`,!0)]),_:3},8,[`data-disabled`,`as-child`,`as`,`aria-orientation`,`aria-required`,`dir`])]),_:3},8,[`orientation`,`dir`,`loop`]))}}),[Vt,Ht]=L(`RadioGroupItem`),Ut=p({inheritAttrs:!1,__name:`RadioGroupItem`,props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:[`select`],setup(t,{emit:i}){let s=t,l=i,{forwardRef:u,currentElement:d}=P(),f=zt(),p=e(()=>f.disabled.value||s.disabled),h=e(()=>f.required.value||s.required),g=e(()=>xe(f.modelValue?.value,s.value));Ht({disabled:p,checked:g});let _=o(!1),v=[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`];F(`keydown`,e=>{v.includes(e.key)&&(_.value=!0)}),F(`keyup`,()=>{_.value=!1});function y(){setTimeout(()=>{_.value&&d.value?.click()},0)}let b=St();return(e,t)=>(c(),a(r(vt),{checked:g.value,disabled:p.value,"as-child":``,focusable:!p.value,active:g.value},{default:T(()=>[m(Rt,C({...r(b),...e.$attrs,...s},{ref:r(u),checked:g.value,required:h.value,disabled:p.value,"onUpdate:checked":t[0]||=t=>r(f).changeModelValue(e.value),onSelect:t[1]||=e=>l(`select`,e),onKeydown:t[2]||=O(A(()=>{},[`prevent`]),[`enter`]),onFocus:y}),{default:T(()=>[n(e.$slots,`default`,{checked:g.value,required:h.value,disabled:p.value})]),_:3},16,[`checked`,`required`,`disabled`])]),_:3},8,[`checked`,`disabled`,`focusable`,`active`]))}}),Wt=p({__name:`RadioGroupIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){let{forwardRef:t}=P(),i=Vt();return(e,o)=>(c(),a(r(M),{present:e.forceMount||r(i).checked.value},{default:T(()=>[m(r(j),C({ref:r(t),"data-state":r(i).checked.value?`checked`:`unchecked`,"data-disabled":r(i).disabled.value?``:void 0,"as-child":e.asChild,as:e.as},e.$attrs),{default:T(()=>[n(e.$slots,`default`)]),_:3},16,[`data-state`,`data-disabled`,`as-child`,`as`])]),_:3},8,[`present`]))}}),Gt={slots:{root:`relative`,fieldset:`flex gap-x-2`,legend:`mb-1 block font-medium text-default`,item:`flex items-start`,container:`flex items-center`,base:`rounded-full ring ring-inset ring-accented overflow-hidden focus-visible:outline-none`,indicator:`flex items-center justify-center size-full after:bg-default after:rounded-full`,wrapper:`w-full`,label:`block font-medium text-default`,icon:`shrink-0`,description:`text-muted`},variants:{color:{primary:{indicator:`bg-primary`},neutral:{indicator:`bg-inverted`},success:{indicator:`bg-success`},warning:{indicator:`bg-warning`},error:{indicator:`bg-error`},info:{indicator:`bg-info`}},variant:{list:{fieldset:`flex-wrap`,item:``},card:{fieldset:`flex-wrap`,item:[`border border-default rounded-lg hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:bg-elevated/50`,`transition-colors`]},table:{item:[`border border-default hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:bg-elevated/50`,`transition-colors`]}},orientation:{horizontal:{fieldset:`flex-row`},vertical:{fieldset:`flex-col`}},indicator:{start:{item:`flex-row`,wrapper:`ms-2`},end:{item:`flex-row-reverse`,wrapper:`me-2`},hidden:{base:`sr-only`,wrapper:`flex flex-col items-center gap-1 text-center`}},size:{xs:{fieldset:`gap-y-0.5`,legend:`text-xs`,base:`size-3`,item:`text-xs`,container:`h-4`,indicator:`after:size-1`},sm:{fieldset:`gap-y-0.5`,legend:`text-xs`,base:`size-3.5`,item:`text-xs`,container:`h-4`,indicator:`after:size-1`},md:{fieldset:`gap-y-1`,legend:`text-sm`,base:`size-4`,item:`text-sm`,container:`h-5`,indicator:`after:size-1.5`},lg:{fieldset:`gap-y-1`,legend:`text-sm`,base:`size-4.5`,item:`text-sm`,container:`h-5`,indicator:`after:size-1.5`},xl:{fieldset:`gap-y-1.5`,legend:`text-base`,base:`size-5`,item:`text-base`,container:`h-6`,indicator:`after:size-2`}},highlight:{true:``,false:``},disabled:{true:{item:`opacity-75`,base:`cursor-not-allowed`,label:`cursor-not-allowed`,description:`cursor-not-allowed`}},required:{true:{legend:`after:content-['*'] after:ms-0.5 after:text-error`}}},compoundVariants:[{indicator:`hidden`,class:{container:`h-auto`}},{variant:[`card`,`table`],highlight:!1,class:{item:`hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:border-accented`}},{size:`xs`,indicator:`hidden`,class:{icon:`size-3`}},{size:`sm`,indicator:`hidden`,class:{icon:`size-3.5`}},{size:`md`,indicator:`hidden`,class:{icon:`size-4`}},{size:`lg`,indicator:`hidden`,class:{icon:`size-4.5`}},{size:`xl`,indicator:`hidden`,class:{icon:`size-5`}},{size:`xs`,variant:[`card`,`table`],class:{item:`p-2.5`}},{size:`sm`,variant:[`card`,`table`],class:{item:`p-3`}},{size:`md`,variant:[`card`,`table`],class:{item:`p-3.5`}},{size:`lg`,variant:[`card`,`table`],class:{item:`p-4`}},{size:`xl`,variant:[`card`,`table`],class:{item:`p-4.5`}},{orientation:`horizontal`,variant:`table`,class:{item:`first-of-type:rounded-s-lg last-of-type:rounded-e-lg`,fieldset:`gap-0 -space-x-px`}},{orientation:`vertical`,variant:`table`,class:{item:`first-of-type:rounded-t-lg last-of-type:rounded-b-lg`,fieldset:`gap-0 -space-y-px`}},{color:`primary`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-primary/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-primary`}},{color:`neutral`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-neutral/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-neutral`}},{color:`success`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-success/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-success`}},{color:`warning`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-warning/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-warning`}},{color:`error`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-error/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-error`}},{color:`info`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-info/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-info`}},{color:`neutral`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-inverted/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-inverted`}},{color:`primary`,variant:[`card`,`table`],class:{item:`outline-primary/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-primary has-focus-visible:z-[1]`}},{color:`neutral`,variant:[`card`,`table`],class:{item:`outline-neutral/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-neutral has-focus-visible:z-[1]`}},{color:`success`,variant:[`card`,`table`],class:{item:`outline-success/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-success has-focus-visible:z-[1]`}},{color:`warning`,variant:[`card`,`table`],class:{item:`outline-warning/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-warning has-focus-visible:z-[1]`}},{color:`error`,variant:[`card`,`table`],class:{item:`outline-error/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-error has-focus-visible:z-[1]`}},{color:`info`,variant:[`card`,`table`],class:{item:`outline-info/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-info has-focus-visible:z-[1]`}},{color:`neutral`,variant:[`card`,`table`],class:{item:`outline-inverted/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-inverted has-focus-visible:z-[1]`}},{color:`primary`,variant:`list`,indicator:`hidden`,class:{item:`outline-primary/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-primary has-focus-visible:z-[1]`}},{color:`neutral`,variant:`list`,indicator:`hidden`,class:{item:`outline-neutral/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-neutral has-focus-visible:z-[1]`}},{color:`success`,variant:`list`,indicator:`hidden`,class:{item:`outline-success/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-success has-focus-visible:z-[1]`}},{color:`warning`,variant:`list`,indicator:`hidden`,class:{item:`outline-warning/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-warning has-focus-visible:z-[1]`}},{color:`error`,variant:`list`,indicator:`hidden`,class:{item:`outline-error/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-error has-focus-visible:z-[1]`}},{color:`info`,variant:`list`,indicator:`hidden`,class:{item:`outline-info/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-info has-focus-visible:z-[1]`}},{color:`neutral`,variant:`list`,indicator:`hidden`,class:{item:`outline-inverted/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-inverted has-focus-visible:z-[1]`}},{color:`primary`,variant:`card`,class:{item:`has-data-[state=checked]:border-primary/50 has-data-[state=checked]:bg-primary/10`}},{color:`neutral`,variant:`card`,class:{item:`has-data-[state=checked]:border-neutral/50 has-data-[state=checked]:bg-neutral/10`}},{color:`success`,variant:`card`,class:{item:`has-data-[state=checked]:border-success/50 has-data-[state=checked]:bg-success/10`}},{color:`warning`,variant:`card`,class:{item:`has-data-[state=checked]:border-warning/50 has-data-[state=checked]:bg-warning/10`}},{color:`error`,variant:`card`,class:{item:`has-data-[state=checked]:border-error/50 has-data-[state=checked]:bg-error/10`}},{color:`info`,variant:`card`,class:{item:`has-data-[state=checked]:border-info/50 has-data-[state=checked]:bg-info/10`}},{color:`neutral`,variant:`card`,class:{item:`has-data-[state=checked]:border-inverted/50 has-data-[state=checked]:bg-elevated`}},{color:`primary`,variant:`table`,class:{item:`has-data-[state=checked]:bg-primary/10 has-data-[state=checked]:border-primary/50 has-data-[state=checked]:z-[1]`}},{color:`neutral`,variant:`table`,class:{item:`has-data-[state=checked]:bg-neutral/10 has-data-[state=checked]:border-neutral/50 has-data-[state=checked]:z-[1]`}},{color:`success`,variant:`table`,class:{item:`has-data-[state=checked]:bg-success/10 has-data-[state=checked]:border-success/50 has-data-[state=checked]:z-[1]`}},{color:`warning`,variant:`table`,class:{item:`has-data-[state=checked]:bg-warning/10 has-data-[state=checked]:border-warning/50 has-data-[state=checked]:z-[1]`}},{color:`error`,variant:`table`,class:{item:`has-data-[state=checked]:bg-error/10 has-data-[state=checked]:border-error/50 has-data-[state=checked]:z-[1]`}},{color:`info`,variant:`table`,class:{item:`has-data-[state=checked]:bg-info/10 has-data-[state=checked]:border-info/50 has-data-[state=checked]:z-[1]`}},{color:`neutral`,variant:`table`,class:{item:`has-data-[state=checked]:bg-elevated has-data-[state=checked]:border-inverted/50 has-data-[state=checked]:z-[1]`}},{variant:[`card`,`table`],disabled:!0,class:{item:`cursor-not-allowed`}},{color:`primary`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-primary not-has-disabled:has-data-[state=checked]:border-primary`}},{color:`neutral`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-neutral not-has-disabled:has-data-[state=checked]:border-neutral`}},{color:`success`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-success not-has-disabled:has-data-[state=checked]:border-success`}},{color:`warning`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-warning not-has-disabled:has-data-[state=checked]:border-warning`}},{color:`error`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-error not-has-disabled:has-data-[state=checked]:border-error`}},{color:`info`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-info not-has-disabled:has-data-[state=checked]:border-info`}},{color:`neutral`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-inverted not-has-disabled:has-data-[state=checked]:border-inverted`}},{color:`primary`,highlight:!0,class:{base:`ring-primary`}},{color:`neutral`,highlight:!0,class:{base:`ring-neutral`}},{color:`success`,highlight:!0,class:{base:`ring-success`}},{color:`warning`,highlight:!0,class:{base:`ring-warning`}},{color:`error`,highlight:!0,class:{base:`ring-error`}},{color:`info`,highlight:!0,class:{base:`ring-info`}},{color:`neutral`,highlight:!0,class:{base:`ring-inverted`}}],defaultVariants:{highlight:!1,size:`md`,color:`primary`,variant:`list`,indicator:`start`}},Kt={__name:`URadioGroup`,props:{as:{type:null,required:!1},legend:{type:String,required:!1},valueKey:{type:null,required:!1,default:`value`},labelKey:{type:null,required:!1,default:`label`},descriptionKey:{type:null,required:!1,default:`description`},items:{type:null,required:!1},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},size:{type:null,required:!1},variant:{type:null,required:!1},color:{type:null,required:!1},highlight:{type:Boolean,required:!1},orientation:{type:null,required:!1,default:`vertical`},indicator:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},disabled:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:[`change`,`update:modelValue`],setup(o,{emit:f}){let p=o,y=f,x=h(),S=ce(`radioGroup`,p),w=be(),E=ie(se(S,`as`,`loop`,`required`),y),{emitFormChange:D,emitFormInput:O,color:k,name:A,size:ee,highlight:j,id:M,disabled:te,ariaAttrs:N}=re(p,{bind:!1}),P=M.value??i(),F=e(()=>k.value??S.color),I=e(()=>j.value??S.highlight),L=e(()=>ee.value??S.size),R=e(()=>te.value??S.disabled),z=e(()=>de({extend:Gt,...w.ui?.radioGroup||{}})({size:L.value,color:F.value,highlight:I.value,disabled:R.value,required:S.required,orientation:S.orientation,variant:S.variant,indicator:S.indicator}));function B(e){if(e===null)return{id:`${P}:null`,value:void 0,label:void 0};if(typeof e==`string`||typeof e==`number`||typeof e==`bigint`)return{id:`${P}:${e}`,value:String(e),label:String(e)};let t=V(e,S.valueKey),n=V(e,S.labelKey),r=V(e,S.descriptionKey);return{...e,value:t,label:n,description:r,id:`${P}:${t}`}}let ae=e(()=>S.items?S.items.map(B):[]);function oe(e){return S.indicator===`hidden`?e.icon:void 0}function le(e){let t=new Event(`change`,{target:{value:e}});y(`change`,t),D(),O()}return(e,i)=>(c(),a(r(Z),C({id:r(P)},r(E),{"model-value":r(S).modelValue,"default-value":r(S).defaultValue,orientation:r(S).orientation,name:r(A),disabled:R.value,"data-slot":`root`,class:z.value.root({class:[r(S).ui?.root,r(S).class]}),"onUpdate:modelValue":le}),{default:T(()=>[b(`fieldset`,C({"data-slot":`fieldset`,class:z.value.fieldset({class:r(S).ui?.fieldset})},r(N)),[r(S).legend||x.legend?(c(),l(`legend`,{key:0,"data-slot":`legend`,class:_(z.value.legend({class:r(S).ui?.legend}))},[n(e.$slots,`legend`,{},()=>[t(v(r(S).legend),1)])],2)):s(``,!0),(c(!0),l(g,null,u(ae.value,i=>(c(),a(d(!r(S).variant||r(S).variant===`list`?`div`:r(Ot)),{key:i.value,"data-slot":`item`,class:_(z.value.item({class:[r(S).ui?.item,i.ui?.item,i.class],disabled:i.disabled||R.value}))},{default:T(()=>[b(`div`,{"data-slot":`container`,class:_(z.value.container({class:[r(S).ui?.container,i.ui?.container]}))},[m(r(Ut),{id:i.id,value:i.value,disabled:i.disabled||R.value,"data-slot":`base`,class:_(z.value.base({class:[r(S).ui?.base,i.ui?.base],disabled:i.disabled||R.value}))},{default:T(()=>[m(r(Wt),{"data-slot":`indicator`,class:_(z.value.indicator({class:[r(S).ui?.indicator,i.ui?.indicator]}))},null,8,[`class`])]),_:2},1032,[`id`,`value`,`disabled`,`class`])],2),oe(i)||i.label||x.label||i.description||x.description?(c(),l(`div`,{key:0,"data-slot":`wrapper`,class:_(z.value.wrapper({class:[r(S).ui?.wrapper,i.ui?.wrapper]}))},[oe(i)?(c(),a(ne,{key:0,name:oe(i),"data-slot":`icon`,class:_(z.value.icon({class:[r(S).ui?.icon,i.ui?.icon]}))},null,8,[`name`,`class`])):s(``,!0),i.label||x.label?(c(),a(d(!r(S).variant||r(S).variant===`list`?r(Ot):`p`),{key:1,for:i.id,"data-slot":`label`,class:_(z.value.label({class:[r(S).ui?.label,i.ui?.label],disabled:i.disabled||R.value}))},{default:T(()=>[n(e.$slots,`label`,{item:i,modelValue:r(S).modelValue},()=>[t(v(i.label),1)])]),_:2},1032,[`for`,`class`])):s(``,!0),i.description||x.description?(c(),l(`p`,{key:2,"data-slot":`description`,class:_(z.value.description({class:[r(S).ui?.description,i.ui?.description],disabled:i.disabled||R.value}))},[n(e.$slots,`description`,{item:i,modelValue:r(S).modelValue},()=>[t(v(i.description),1)])],2)):s(``,!0)],2)):s(``,!0)]),_:2},1032,[`class`]))),128))],16)]),_:3},16,[`id`,`model-value`,`default-value`,`orientation`,`name`,`disabled`,`class`]))}},Q=`J’ai trouvé la cause : le cache n’était jamais invalidé après une mise à jour. Le correctif tient en trois points :
|
|
2
|
-
|
|
3
|
-
- vider l’entrée à chaque écriture ;
|
|
4
|
-
- ajouter un test de régression ;
|
|
5
|
-
- garder la durée de vie à 5 minutes.
|
|
6
|
-
|
|
7
|
-
\`\`\`ts
|
|
8
|
-
cache.delete(key)
|
|
9
|
-
await save(item)
|
|
10
|
-
\`\`\`
|
|
11
|
-
|
|
12
|
-
Tous les tests passent.`,$=`Found the cause: the cache was never invalidated after an update. The fix has three parts:
|
|
13
|
-
|
|
14
|
-
- clear the entry on every write;
|
|
15
|
-
- add a regression test;
|
|
16
|
-
- keep the time to live at 5 minutes.
|
|
17
|
-
|
|
18
|
-
\`\`\`ts
|
|
19
|
-
cache.delete(key)
|
|
20
|
-
await save(item)
|
|
21
|
-
\`\`\`
|
|
22
|
-
|
|
23
|
-
All tests pass.`,qt=e=>e===`fr`?Q:$,Jt=(e,t)=>e===`off`?null:t,Yt={class:`typing-preview`},Xt=[`aria-label`,`disabled`],Zt=Object.assign(p({__name:`TypingPreview`,setup(e){let t=mt(qt(J)),n=o(null),i=o(null),a=o(``),s=()=>{n.value=Jt(We.value,Date.now())};return f(()=>{i.value&&(a.value=`${i.value.offsetHeight}px`),s()}),w([We,dt],s),(e,o)=>{let u=ne,d=I,f=pt;return c(),l(`figure`,Yt,[b(`figcaption`,null,[b(`span`,null,v((`t`in e?e.t:r(U))(`Preview`)),1),m(d,{text:(`t`in e?e.t:r(U))(`Replay`)},{default:T(()=>[b(`button`,{type:`button`,class:`typing-replay`,"aria-label":(`t`in e?e.t:r(U))(`Replay`),disabled:!(`typewriterActive`in e?e.typewriterActive:r(Ze)),onClick:s},[m(u,{name:`i-lucide-rotate-ccw`})],8,Xt)]),_:1},8,[`text`])]),b(`div`,{ref_key:`box`,ref:i,class:`typing-sample md`,style:S({minHeight:r(a)})},[m(f,{html:r(t),typing:r(n),onDone:o[0]||=e=>n.value=null},null,8,[`html`,`typing`])],4)])}}}),{__name:`TypingPreview`}),Qt=[`data-mode`],$t={class:`qt-stage`},en={class:`qt-conv`},tn={class:`qt-agent`},nn={class:`qt-tag one`},rn={class:`qt-tag two`},an={class:`qt-sent`},on={class:`qt-sent-q`},sn={class:`qt-sent-q`},cn={key:0,class:`qt-chips`},ln={class:`qt-chip one`},un={class:`qt-chip two`},dn={class:`qt-field`},fn={class:`qt-ph`},pn={class:`qt-tok one`},mn={key:0},hn={class:`qt-ans one`},gn={class:`qt-tok two`},_n={key:0},vn=Object.assign(p({__name:`QuoteTokensPreview`,props:{mode:{}},setup(e){return(n,i)=>(c(),l(`figure`,{class:`qt-preview`,"data-mode":e.mode,"aria-hidden":`true`},[b(`figcaption`,null,v((`t`in n?n.t:r(U))(`Preview`)),1),b(`div`,$t,[b(`div`,en,[b(`div`,tn,[b(`p`,null,[t(v((`tl`in n?n.tl:r(q))(`Tea or coffee?`,`Thé ou café ?`))+` `,1),b(`span`,nn,`↳ `+v((`t`in n?n.t:r(U))(`Reply`)),1)]),b(`p`,null,[t(v((`tl`in n?n.tl:r(q))(`And your favorite series?`,`Et ta série préférée ?`))+` `,1),b(`span`,rn,`↳ `+v((`t`in n?n.t:r(U))(`Reply`)),1)])]),b(`div`,an,[b(`span`,on,v((`tl`in n?n.tl:r(q))(`Tea or coffee?`,`Thé ou café ?`)),1),b(`span`,null,v((`tl`in n?n.tl:r(q))(`Coffee.`,`Café.`)),1),b(`span`,sn,v((`tl`in n?n.tl:r(q))(`And your favorite series?`,`Et ta série préférée ?`)),1),i[0]||=b(`span`,null,`Lost !`,-1)])]),e.mode===`lines`?(c(),l(`div`,cn,[b(`span`,ln,[t(v((`tl`in n?n.tl:r(q))(`Tea or coffee?`,`Thé ou café ?`)),1),i[1]||=b(`i`,null,`✕`,-1)]),b(`span`,un,[t(v((`tl`in n?n.tl:r(q))(`And your favorite series?`,`Et ta série préférée ?`)),1),i[2]||=b(`i`,null,`✕`,-1)])])):s(``,!0),b(`div`,dn,[b(`span`,fn,v((`tl`in n?n.tl:r(q))(`Message to Claude…`,`Message à Claude…`)),1),b(`span`,pn,[b(`b`,null,v(e.mode===`lines`?`>`:`↳`),1),t(v((`tl`in n?n.tl:r(q))(`Tea or coffee?`,`Thé ou café ?`)),1),e.mode===`rich`?(c(),l(`i`,mn,`✕`)):s(``,!0)]),b(`span`,hn,v((`tl`in n?n.tl:r(q))(`Coffee.`,`Café.`)),1),b(`span`,gn,[b(`b`,null,v(e.mode===`lines`?`>`:`↳`),1),t(v((`tl`in n?n.tl:r(q))(`And your favorite series?`,`Et ta série préférée ?`)),1),e.mode===`rich`?(c(),l(`i`,_n,`✕`)):s(``,!0)]),i[3]||=b(`span`,{class:`qt-ans two`},`Lost !`,-1),i[4]||=b(`span`,{class:`qt-send`},`↑`,-1)])])],8,Qt))}}),{__name:`QuoteTokensPreview`}),yn={class:`settings-group`},bn={class:`settings-card wt-card`},xn={key:0,class:`muted`},Sn={key:1,class:`muted`},Cn={key:2,class:`wt-list`},wn={class:`wt-main`},Tn={class:`wt-meta`},En={class:`wt-path`},Dn=[`disabled`,`aria-label`,`onClick`],On={key:0,class:`spinner`},kn={class:`muted`},An=Object.assign(p({__name:`WorktreesSection`,setup(n){f(xt);let i=e(()=>!!(W.value.machines&&W.value.machines.length>1)),d=e=>(W.value.machines||[]).find(t=>t.key===e)?.label||je.value;function p(e){return e.prunable?U(`folder missing`):e.workspace?e.agents?q(`open · ${e.agents} agent${e.agents>1?`s`:``}`,`ouvert · ${e.agents} agent${e.agents>1?`s`:``}`):q(`open`,`ouvert`):U(`closed`)}let h=o(null);async function y(e){h.value=e.path,await yt(e),h.value=null}return(e,n)=>{let o=ne;return c(),l(`div`,yn,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Worktrees`)),1),b(`div`,bn,[(`worktrees`in e?e.worktrees:r(Y))===null?(c(),l(`p`,xn,[...n[0]||=[b(`span`,{class:`spinner`},null,-1)]])):(`worktrees`in e?e.worktrees:r(Y)).length?(c(),l(`ul`,Cn,[(c(!0),l(g,null,u(`worktrees`in e?e.worktrees:r(Y),u=>(c(),l(`li`,{key:`${u.machine}|${u.path}`,class:_({open:u.workspace,gone:u.prunable})},[b(`div`,wn,[b(`b`,null,[m(o,{name:`i-lucide-git-branch`}),t(v((`worktreeName`in e?e.worktreeName:r(bt))(u)),1)]),b(`span`,Tn,[t(v(u.repo),1),r(i)?(c(),l(g,{key:0},[t(` · `+v(d(u.machine)),1)],64)):s(``,!0),n[1]||=t(` · `,-1),b(`i`,null,v(p(u)),1)]),b(`span`,En,v((`shortPath`in e?e.shortPath:r(Xe))(u.path)),1)]),b(`button`,{type:`button`,class:`wt-del`,disabled:r(h)===u.path,"aria-label":(`t`in e?e.t:r(U))(`Delete`),onClick:e=>y(u)},[r(h)===u.path?(c(),l(`span`,On)):(c(),a(o,{key:1,name:`i-lucide-trash-2`}))],8,Dn)],2))),128))])):(c(),l(`p`,Sn,v((`t`in e?e.t:r(U))(`No worktrees.`)),1)),b(`p`,kn,v((`t`in e?e.t:r(U))(`Deleting a worktree removes its folder; the Git branch is kept.`)),1)])])}}}),{__name:`WorktreesSection`}),jn=`herdr ${[`plugin`,`install`,`eliasstravik/herdr-projects`,`--yes`].join(` `)}`,Mn={class:`settings-group projects-plugin`},Nn={class:`projects-plugin-intro`},Pn={class:`projects-plugin-link`,href:`https://github.com/eliasstravik/herdr-projects`,target:`_blank`,rel:`noopener noreferrer`},Fn={class:`projects-plugin-head`},In={key:0},Ln={key:1},Rn={key:2},zn={key:3,class:`installed`},Bn={key:4},Vn={key:0,class:`projects-plugin-note`},Hn={class:`projects-plugin-actions`},Un={key:0,class:`projects-plugin-note`},Wn={key:2,class:`plugin-input-note reload projects-plugin-reload`},Gn={key:3,class:`projects-plugin-note`},Kn={class:`settings-group projects-plugin-settings`},qn={id:`project-board`,class:`projects-board-title`},Jn={class:`projects-plugin-intro`},Yn={class:`projects-board-lists`},Xn={class:`also`},Zn={class:`projects-plugin-note`},Qn={class:`projects-board-example`},$n={class:`projects-plugin-note`},er={class:`projects-plugin-note`},tr={class:`settings-toggle`},nr={id:`thread-limits`,class:`projects-board-title spaced`},rr={class:`projects-plugin-intro`},ir={class:`thread-limits`},ar=[`aria-label`,`disabled`,`onClick`],or=[`aria-label`,`disabled`,`onClick`],sr={key:0,class:`projects-plugin-note`},cr={class:`projects-plugin-note`},lr={class:`projects-plugin-actions`},ur=Object.assign(p({__name:`ProjectsPluginSettings`,props:{machines:{}},setup(n){let i=n,d=o({}),f=o({}),p=o({}),h=o({}),y=o({});async function x(e){if(e.online){p.value={...p.value,[e.key]:!0};try{let t=await nt(`/api/plugins/projects?machine=${encodeURIComponent(e.key)}`);d.value={...d.value,[e.key]:t},f.value={...f.value,[e.key]:``}}catch(t){f.value={...f.value,[e.key]:t.message}}finally{p.value={...p.value,[e.key]:!1}}}}w(()=>i.machines.map(e=>`${e.key}:${e.online}`).join(`|`),()=>{for(let e of i.machines)x(e)},{immediate:!0});async function S(e){if($e(),await z(q(`Install herdr-projects on ${e.label}? Herdr will download the plugin from GitHub and run its installer on this machine.`,`Installer herdr-projects sur ${e.label} ? Herdr téléchargera le plugin depuis GitHub et exécutera son installation sur cette machine.`),U(`Install`),`primary`)){h.value={...h.value,[e.key]:!0};try{await nt(`/api/plugins/projects`,{machine:e.key}),K(q(`herdr-projects installed on ${e.label}.`,`herdr-projects installé sur ${e.label}.`)),y.value={...y.value,[e.key]:!0},await x(e)}catch(e){K(e.message,!0)}finally{h.value={...h.value,[e.key]:!1}}}}async function C(e){$e();try{await navigator.clipboard.writeText(jn),K(q(`Command copied: paste it into a terminal on ${e.label}.`,`Commande copiée : colle-la dans un terminal de ${e.label}.`))}catch{K(U(`Copy failed`),!0)}}let D=e(()=>[{icon:`i-lucide-flask-conical`,name:q(`To test`,`À tester`),also:`To test, Testing, À vérifier`,what:q(`What you must check: Confirm, Problem, Question.`,`Ce que tu dois vérifier : Confirmer, Problème, Question.`)},{icon:`i-lucide-signpost`,name:q(`To decide`,`À décider`),also:`To decide, Décisions, Questions`,what:q(`Questions only you can unblock: Question, Answer.`,`Questions que toi seul peux trancher : Question, Répondre.`)},{icon:`i-lucide-git-pull-request`,name:q(`To review`,`À relire`),also:`To review, Relire, Relecture, Review(s), PR(s), Pull requests, À valider`,what:q(`Pull requests for you to review: Reviewed sends “✓ Reviewed: …”, Comment drafts feedback.`,`PR que tu dois relire : Relu envoie « ✓ Relu : … », Commenter prépare un retour.`)},{icon:`i-lucide-activity`,name:q(`In progress`,`En cours`),also:`In progress, Doing, WIP`,what:q(`What threads are really doing: open threads, live.`,`Ce que les threads font vraiment : threads ouverts, en direct.`)},{icon:`i-lucide-list-ordered`,name:q(`In queue`,`En file`),also:`In queue, Queue, Queued, Up next, File d’attente`,what:q(`Decided: the coordinator launches the first task as soon as a thread slot frees, in list order. Move up / down, Launch now, Clarify, Remove from queue (back to To do); the header shows the thread slots in use.`,`Décidé : le coordinateur lance la première tâche dès qu’une place de thread se libère, dans l’ordre de la liste. Monter / Descendre, Lancer maintenant, Préciser, Retirer de la file (retour en À faire) ; l’en-tête montre les places de thread occupées.`)},{icon:`i-lucide-octagon-alert`,name:q(`Blocked`,`Bloqué`),also:`Bloque, Bloquée(s), Blocked, On hold, En attente, Waiting, Stuck`,what:q(`Waiting for someone or something external: optional “— blocked by: …” reason; Unblock sends a request, Clarify prepares a message.`,`Attente de quelqu’un ou de quelque chose d’extérieur : raison facultative « — bloqué par : … » ; Débloquer envoie une demande, Préciser prépare un message.`)},{icon:`i-lucide-list-todo`,name:q(`To do`,`À faire`),also:`To do, Todo, Next, Soon, Prochainement`,what:q(`To do soon, in your priority order; never launched automatically. Move up / down, Queue it, Launch now (a thread if a slot is free, otherwise first in the queue), Clarify, Back to backlog.`,`À faire bientôt, dans ton ordre de priorité ; jamais lancé automatiquement. Monter / Descendre, Mettre en file, Lancer maintenant (un thread si une place est libre, sinon en tête de file), Préciser, Remettre au backlog.`)},{icon:`i-lucide-archive`,name:`Backlog`,also:`Later, Plus tard, Idées, Ideas, Someday`,what:q(`Everything else. Launch sends the task to the coordinator; Clarify prepares a message.`,`Tout le reste. Lancer envoie la tâche au coordinateur ; Préciser prépare un message.`)},{icon:`i-lucide-circle-check`,name:q(`Done`,`Fait`),also:`Done, Terminé, Finished`,what:q(`Filled by resolved threads.`,`Remplie par les threads clôturés.`)}]);async function O(e,t){$e();try{await navigator.clipboard.writeText(e),K(t)}catch{K(U(`Copy failed`),!0)}}let k=()=>J===`en`?`en`:`fr`,A=at,ee=()=>O(gt(k()),q(`Template copied: paste it into the project’s TASKS.md.`,`Modèle copié : colle-le dans TASKS.md du projet.`)),j=o({}),M=o(``),te=new Map;function N(e){j.value=Object.fromEntries(e.map(e=>[e.key,e]))}async function P(){try{N((await nt(`/api/plugins/thread-limits`)).machines),M.value=``}catch(e){M.value=e.message}}P();function F(e,t){$e();let n=j.value[e.key],r=n?.max??null,i=r===null?t>0?Math.max(1,n?.open||0):null:r+t<1?null:Math.min(99,r+t);if(i===r)return;let a=n?.open||0;j.value={...j.value,[e.key]:{key:e.key,label:e.label,open:a,threads:n?.threads||[],max:i,free:i===null?null:Math.max(0,i-a)}},clearTimeout(te.get(e.key)),te.set(e.key,setTimeout(async()=>{te.delete(e.key);try{N((await nt(`/api/plugins/thread-limits`,{machine:e.key,max:i})).machines)}catch(e){K(e.message,!0),P()}},450))}let I=e=>q(`${e} open thread${e===1?``:`s`} · all projects`,`${e} thread${e>1?`s`:``} ouvert${e>1?`s`:``} · tous projets`),L=()=>O(_t(k()),q(`Rules copied: paste them to the coordinator.`,`Règles copiées : colle-les au coordinateur.`));return(e,i)=>{let o=ne,x=pe,w=wt;return c(),l(g,null,[b(`div`,Mn,[i[6]||=b(`h3`,null,`herdr-projects`,-1),b(`p`,Nn,v((`tl`in e?e.tl:r(q))(`herdr-projects groups coordinators and their threads by project, adding the Project panel and worktree repositories in wherdr. The plugin is optional: agents and other wherdr features still work without it.`,`herdr-projects regroupe les coordinateurs et leurs threads par projet, avec un panneau Projet et les dépôts de worktrees dans wherdr. Le plugin est facultatif : les agents et les autres fonctions de wherdr restent utilisables sans lui.`)),1),b(`a`,Pn,[t(v((`tl`in e?e.tl:r(q))(`View plugin repository`,`Voir le dépôt du plugin`))+` `,1),m(o,{name:`i-lucide-external-link`})]),(c(!0),l(g,null,u(n.machines,n=>(c(),l(`div`,{key:n.key,class:`projects-plugin-machine`},[b(`div`,Fn,[b(`strong`,null,v(n.label),1),n.online?r(p)[n.key]&&!r(d)[n.key]?(c(),l(`span`,Ln,v((`tl`in e?e.tl:r(q))(`Checking…`,`Vérification…`)),1)):r(f)[n.key]?(c(),l(`span`,Rn,v((`tl`in e?e.tl:r(q))(`Status unavailable`,`État indisponible`)),1)):r(d)[n.key]?.installed?(c(),l(`span`,zn,v((`tl`in e?e.tl:r(q))(`Installed`,`Installé`))+v(r(d)[n.key]?.version?` · v${r(d)[n.key]?.version}`:``),1)):(c(),l(`span`,Bn,v((`tl`in e?e.tl:r(q))(`Not installed`,`Non installé`)),1)):(c(),l(`span`,In,v((`tl`in e?e.tl:r(q))(`Offline`,`Hors ligne`)),1))]),n.online&&r(f)[n.key]?(c(),l(`p`,Vn,v(r(f)[n.key]),1)):s(``,!0),n.online&&r(d)[n.key]&&!r(d)[n.key]?.installed&&!r(f)[n.key]?(c(),l(g,{key:1},[b(`div`,Hn,[r(d)[n.key]?.installable?(c(),a(x,{key:0,size:`sm`,color:`primary`,icon:`i-lucide-download`,loading:r(h)[n.key],onClick:e=>S(n)},{default:T(()=>[t(v((`t`in e?e.t:r(U))(`Install`)),1)]),_:1},8,[`loading`,`onClick`])):s(``,!0),m(x,{size:`sm`,color:`neutral`,variant:`outline`,icon:`i-lucide-copy`,onClick:e=>C(n)},{default:T(()=>[t(v((`t`in e?e.t:r(U))(`Copy command`)),1)]),_:1},8,[`onClick`])]),r(d)[n.key]?.installable?s(``,!0):(c(),l(`p`,Un,v((`tl`in e?e.tl:r(q))(`Direct installation is unavailable here: run the command on this machine.`,`Installation directe indisponible ici : lance la commande sur cette machine.`)),1))],64)):s(``,!0),r(y)[n.key]?(c(),l(`div`,Wn,[m(o,{name:`i-lucide-refresh-cw`}),b(`div`,null,[b(`strong`,null,v((`tl`in e?e.tl:r(q))(`Reload the Herdr client config`,`Recharge la config du client Herdr`)),1),b(`p`,null,[t(v((`tl`in e?e.tl:r(q))(`In the Herdr terminal: `,`Dans le terminal Herdr : `)),1),i[1]||=b(`kbd`,null,`prefix`,-1),i[2]||=t(` + `,-1),i[3]||=b(`kbd`,null,`Shift`,-1),i[4]||=t(` + `,-1),i[5]||=b(`kbd`,null,`R`,-1),t(`. `+v((`tl`in e?e.tl:r(q))(`Then run “Set up the sidebar…” from an agent’s menu to install the sidebar and the hooks.`,`Puis lance « Set up the sidebar… » depuis le menu d’un agent pour installer la barre latérale et les hooks.`)),1)])])])):s(``,!0),r(d)[n.key]?.installed&&!r(d)[n.key]?.enabled?(c(),l(`p`,Gn,v((`tl`in e?e.tl:r(q))(`The plugin is disabled in Herdr.`,`Le plugin est désactivé dans Herdr.`)),1)):s(``,!0)]))),128))]),b(`div`,Kn,[b(`h3`,null,v((`tl`in e?e.tl:r(q))(`herdr-projects settings`,`Réglages herdr-projects`)),1),b(`h4`,qn,v((`tl`in e?e.tl:r(q))(`Project board`,`Tableau du projet`)),1),b(`p`,Jn,v((`tl`in e?e.tl:r(q))(`The Project panel reads TASKS.md: one list per ## heading, one task per line “- [ ] title (owner)”, the owner being read but not shown. Every list is optional: each project uses the ones chosen with its coordinator (a small project may only need Backlog, In progress and Done). The panel shows the lists present, always in the order below, each with its own buttons; every button sends a message to the coordinator, which edits TASKS.md.`,`Le panneau Projet lit TASKS.md : une liste par titre ##, une tâche par ligne « - [ ] titre (responsable) », le responsable étant lu mais pas affiché. Toutes les listes sont facultatives : chaque projet utilise celles choisies avec son coordinateur (un petit projet peut se contenter de Backlog, En cours et Fait). Le panneau affiche les listes présentes, toujours dans l’ordre ci-dessous, chacune avec ses boutons ; chaque bouton envoie un message au coordinateur, qui modifie TASKS.md.`)),1),b(`ul`,Yn,[(c(!0),l(g,null,u(r(D),t=>(c(),l(`li`,{key:t.name},[m(o,{name:t.icon},null,8,[`name`]),b(`div`,null,[b(`strong`,null,v(t.name),1),b(`span`,Xn,v((`tl`in e?e.tl:r(q))(`also`,`aussi`))+` : `+v(t.also),1),b(`p`,null,v(t.what),1)])]))),128))]),b(`p`,Zn,v((`tl`in e?e.tl:r(q))(`The only task decoration: badges the coordinator chooses, anywhere in the line. “[b:color(text)]”, or “[b:color(text)](target)” for a clickable ↗ badge: target = an https:// link (new tab) or a thread ID t-0140 (opens its tab). Color: red, orange, amber, green, teal, blue, violet, pink, gray (theme-aware), a #rgb / #rrggbb hex, or nothing (neutral); at most 24 characters shown. A URL in the text becomes a plain link. The coordinator rules below tell it to use them on its own when useful.`,`Seule décoration des tâches : les badges que le coordinateur choisit, n’importe où dans la ligne. « [b:couleur(texte)] », ou « [b:couleur(texte)](cible) » pour un badge cliquable ↗ : cible = lien https:// (nouvel onglet) ou ID de thread t-0140 (ouvre son onglet). Couleur : red, orange, amber, green, teal, blue, violet, pink, gray (suivent le thème), un hex #rgb / #rrggbb, ou rien (neutre) ; 24 caractères affichés au plus. Une URL dans le texte devient un lien simple. Les règles du coordinateur ci-dessous lui disent d’en user de lui-même quand c’est utile.`)),1),b(`pre`,Qn,[b(`code`,null,`- [ ] `+v((`tl`in e?e.tl:r(q))(`Stop button on iPhone`,`Bouton Stop sur iPhone`))+` [b:red(bug)] [b:gray(t-0140)](t-0140) [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me)`,1)]),b(`p`,$n,v((`tl`in e?e.tl:r(q))(`Any other ## list is shown too, in a neutral style, after Backlog.`,`Toute autre liste ## s’affiche aussi, en style neutre, après Backlog.`)),1),b(`p`,er,v((`tl`in e?e.tl:r(q))(`The lists in TASKS.md are the active lists: to add or remove one, ask the coordinator (there is no setting in wherdr).`,`Les listes présentes dans TASKS.md sont les listes actives : pour en ajouter ou en retirer une, demande-le au coordinateur (pas de réglage dans wherdr).`)),1),b(`label`,tr,[b(`span`,null,[b(`b`,null,v((`tl`in e?e.tl:r(q))(`Hide empty lists`,`Masquer les listes vides`)),1),b(`small`,null,v((`tl`in e?e.tl:r(q))(`Show a Project panel list only when it has items (In progress and Done included). Setting specific to this device.`,`Afficher une liste du panneau Projet seulement si elle a des éléments (En cours et Fait compris). Réglage propre à cet appareil.`)),1)]),m(w,{modelValue:r(A),"onUpdate:modelValue":i[0]||=e=>E(A)?A.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`h4`,nr,v((`tl`in e?e.tl:r(q))(`Max threads per machine`,`Threads max par machine`)),1),b(`p`,rr,v((`tl`in e?e.tl:r(q))(`herdr-projects limits threads per project (max_parallel_threads in PROJECT.md). This limit counts the open threads of every project on a machine. — = no global limit.`,`herdr-projects limite les threads par projet (max_parallel_threads dans PROJECT.md). Cette limite compte les threads ouverts de tous les projets d’une machine. — = pas de limite globale.`)),1),b(`div`,ir,[(c(!0),l(g,null,u(n.machines,t=>(c(),l(`div`,{key:t.key,class:`settings-stepper thread-limit`},[b(`span`,null,[b(`b`,null,v(t.label),1),b(`small`,null,v(I(r(j)[t.key]?.open||0)),1)]),b(`div`,null,[b(`button`,{type:`button`,"aria-label":(`tl`in e?e.tl:r(q))(`Lower the limit of ${t.label}`,`Baisser la limite de ${t.label}`),disabled:r(j)[t.key]?.max==null,onClick:e=>F(t,-1)},`−`,8,ar),b(`output`,{class:_({full:r(j)[t.key]?.max!=null&&(r(j)[t.key]?.free??1)===0})},v(r(j)[t.key]?.max??`—`),3),b(`button`,{type:`button`,"aria-label":(`tl`in e?e.tl:r(q))(`Raise the limit of ${t.label}`,`Monter la limite de ${t.label}`),disabled:(r(j)[t.key]?.max??0)>=r(99),onClick:e=>F(t,1)},`+`,8,or)])]))),128))]),r(M)?(c(),l(`p`,sr,v(r(M)),1)):s(``,!0),b(`p`,cr,v((`tl`in e?e.tl:r(q))(`wherdr writes ${r(ht)} in each herdr-projects folder where a coordinator runs, refreshed on every change: the coordinator rules below tell it to check the machine before starting a thread (fallback: herdr-projects overview).`,`wherdr écrit ${r(ht)} dans chaque dossier herdr-projects où tourne un coordinateur, à chaque changement : les règles du coordinateur ci-dessous lui disent de vérifier la machine avant de lancer un thread (sinon : herdr-projects overview).`)),1),b(`div`,lr,[m(x,{size:`sm`,color:`neutral`,variant:`outline`,icon:`i-lucide-file-text`,onClick:ee},{default:T(()=>[t(v((`tl`in e?e.tl:r(q))(`Copy TASKS.md template`,`Copier le modèle TASKS.md`)),1)]),_:1}),m(x,{size:`sm`,color:`neutral`,variant:`outline`,icon:`i-lucide-clipboard-list`,onClick:L},{default:T(()=>[t(v((`tl`in e?e.tl:r(q))(`Copy rules for the coordinator`,`Copier les règles pour le coordinateur`)),1)]),_:1})])])],64)}}}),{__name:`ProjectsPluginSettings`}),dr=[`appearance`,`conversation`,`terminal`,`agents`,`plugins`,`phone`,`notifications`,`security`,`desktop`,`about`];function fr(e){let t=e.historyBack;return!e.desk&&e.section?t===`/settings`?`history`:`list`:typeof t==`string`&&t.startsWith(`/`)&&!t.startsWith(`/settings`)?`history`:`home`}var pr={id:`settings`,class:`view settings-view`},mr={class:`top bar settings-top`},hr=[`aria-label`],gr=[`aria-current`,`onClick`],_r={class:`settings-section-title`},vr={class:`settings-section`},yr={class:`settings-group`},br=[`aria-expanded`],xr={class:`theme-sw`},Sr={class:`theme-name`},Cr=[`aria-label`],wr=[`aria-checked`],Tr={class:`theme-sw`},Er={class:`theme-name`},Dr=[`aria-checked`,`onClick`],Or={class:`theme-sw`},kr={class:`theme-name`},Ar={key:0},jr={key:1},Mr={class:`muted settings-hint`},Nr={class:`settings-group`},Pr={class:`muted settings-hint`},Fr={class:`settings-group`},Ir={class:`muted settings-hint`},Lr={class:`settings-group`},Rr={class:`settings-toggle`},zr={class:`settings-toggle`},Br={class:`settings-toggle`},Vr={class:`settings-toggle`},Hr={class:`settings-toggle`},Ur={class:`settings-group`},Wr={class:`muted settings-hint`},Gr={class:`eyebrow settings-subhead`},Kr={class:`settings-group`},qr={class:`muted settings-hint`},Jr={class:`settings-group settings-width`},Yr={class:`muted settings-hint`},Xr={class:`settings-section`},Zr={class:`settings-group settings-typing`},Qr={class:`muted settings-hint`},$r={class:`settings-group`},ei={class:`muted settings-lead`},ti={class:`qt-device`},ni={key:0,class:`exp-tag`},ri={class:`qt-device`},ii={key:0,class:`exp-tag`},ai={class:`muted settings-hint`},oi={class:`settings-section`},si={class:`settings-group`},ci={class:`settings-toggle`},li={class:`settings-group`},ui={class:`settings-stepper`},di=[`aria-label`],fi=[`aria-label`],pi={class:`settings-group settings-renderer`},mi={class:`muted settings-hint`},hi={class:`settings-renderer-status`,role:`status`},gi={class:`settings-section`},_i={class:`settings-group`},vi={class:`muted agent-pref-intro`},yi={key:0,class:`agent-pref-list`},bi={key:0},xi=[`checked`,`onChange`],Si={key:1,class:`muted agent-pref-intro`},Ci={class:`muted agent-pref-note`},wi={class:`settings-section`},Ti={class:`settings-group`},Ei={class:`settings-toggle quiet-toggle`},Di={class:`notify-caption`},Oi={key:0,class:`muted notify-hint`},ki={class:`notify-caption`},Ai={class:`settings-group`},ji={class:`notify-caption`},Mi={class:`muted notify-hint`},Ni={class:`settings-section`},Pi={class:`settings-section`},Fi={class:`settings-section`},Ii={class:`settings-group`},Li={key:0,class:`settings-group`},Ri={class:`muted settings-hint`},zi={key:0,class:`muted settings-hint`},Bi={key:0,class:`settings-section`},Vi={class:`settings-group`},Hi={class:`muted settings-hint`},Ui={class:`settings-group`},Wi={class:`settings-action-keys`},Gi={class:`settings-section`},Ki={class:`settings-group`},qi={class:`settings-version`},Ji={key:1,class:`muted settings-hint`};function Yi(){Fe()}var Xi=Object.assign(p({__name:`SettingsView`,setup(n){let i=Nt.version,d=ve(),p=fe,h=_e(),C=e(()=>dr.includes(String(h.query.section))?h.query.section:null),D={appearance:`i-lucide-palette`,conversation:`i-lucide-message-square`,terminal:`i-lucide-square-terminal`,agents:`i-lucide-bot`,plugins:`i-lucide-puzzle`,phone:`i-lucide-smartphone`,notifications:`i-lucide-bell`,security:`i-lucide-lock`,desktop:`i-lucide-monitor`,about:`i-lucide-info`},O={appearance:`Appearance`,conversation:`Conversation`,terminal:`Terminal`,agents:`Agents`,plugins:`Plugins`,phone:`Phone`,notifications:`Notifications`,security:`Security`,desktop:`Desktop`,about:`About`},A=e(()=>dr.filter(e=>e!==`desktop`||G.value).map(e=>({id:e,label:U(O[e]),icon:D[e]}))),j=e(()=>C.value&&A.value.some(e=>e.id===C.value)?C.value:G.value?`appearance`:null),M=e(()=>A.value.find(e=>e.id===j.value)?.label||U(`Settings`)),N=o(null);w(C,()=>y(()=>{N.value&&(N.value.scrollTop=0)}));function P(e){if(e===C.value)return;let t={path:`/settings`,query:{section:e}};G.value?d.replace(t):d.push(t)}function F(){let e=fr({desk:G.value,section:C.value,historyBack:history.state?.back});e===`list`?d.replace(`/settings`):e===`history`?d.back():ye(`/`,{replace:!0})}f(async()=>{if(G.value||typeof history.state?.back==`string`)return;let e=h.fullPath;await d.replace(`/`),await d.push(e)});let I=o(J);w(I,e=>{e!==J&&(Pe(e),location.reload())});let L=lt,z=st,re=et,ie=rt,B=Qe,se=Ne,V=Ie,ce=Ve,ue=o(ze.value);w(V,e=>{ue.value=e}),w(ce,e=>{ue.value=e});let de=e(()=>[{label:q(`“>” lines`,`Lignes « > »`),description:q(`Plain text: each quote stays “> ” lines, a chip above the field removes it. Default.`,`Texte simple : chaque citation reste en lignes « > », une puce au-dessus du champ la retire. Par défaut.`),value:`lines`,exp:!1},{label:q(`Tokens, native field`,`Jetons, champ natif`),description:q(`The same plain field, each “> ” line drawn as a token. Typing, dictation and autocorrect unchanged.`,`Le même champ simple, chaque ligne « > » dessinée en jeton. Saisie, dictée et correction auto inchangées.`),value:`native`,exp:!0},{label:q(`Tokens, rich field`,`Jetons, champ riche`),description:q(`A rich field, each quote one compact token with ✕. On iOS, moving the caret around the tokens is unreliable.`,`Un champ riche, chaque citation un jeton compact avec ✕. Sur iOS, déplacer le curseur autour des jetons est peu fiable.`),value:`rich`,exp:!0}]),he=e({get:()=>We.value,set:e=>{Ye.value=e}}),be=e(()=>[{label:U(`Off`),description:U(`The reply appears at once.`),value:`off`},{label:U(`Fast`),description:U(`Original speed · 0.5 to 2 s.`),value:`fast`},{label:U(`Medium`),description:U(`Twice as slow · 1 to 4 s.`),value:`medium`},{label:U(`Slow`),description:U(`Three times as slow · 1.5 to 6 s.`),value:`slow`}]),xe=it,W=Je,Fe=e(()=>[{label:U(`Normal`),description:U(`760 px column · terminal fitted to width.`),value:`normal`},{label:U(`Wide`),description:U(`Up to 1100 px · terminal fitted to width.`),value:`wide`},{label:U(`Full width`),description:U(`The whole width, terminal included.`),value:`full`}]),Ue=ft,Xe=[{label:U(`Conversation`),description:U(`Read the transcript first.`),value:`chat`},{label:U(`Terminal`),description:U(`Type straight into the pane.`),value:`term`}],at=De,dt=e(()=>[{label:U(`Remaining`),description:U(`What is left in each window, like Codex.`),value:`left`},{label:U(`Used`),description:U(`What has been used, like Claude.`),value:`used`}]),pt=ge,mt=e(()=>[{label:U(`Border only`),description:U(`A second color glides slowly around the border.`),value:`border`},{label:U(`Halo`),description:U(`The same, with a faint glow around the field.`),value:`halo`},{label:U(`None`),description:U(`Plain 1 px border, no animation.`),value:`off`}]),ht=R,gt=e(()=>[{label:`wherdr grid`,description:U(`Dotted grid with light packets, like wherdr.dev.`),value:`wherdr`},{label:`herdr grid`,description:U(`Flat line grid, like herdr.dev.`),value:`herdr`}]),_t=[{label:`English`,value:`en`},{label:`Français`,value:`fr`}],Y=e(()=>ot.value.machines?.filter(e=>e.local||!!e.home&&(Te(e.key)?.status===`online`||!Te(e.key)&&e.online))||[{key:``,label:je.value||U(`This machine`),kinds:ot.value.kinds}]),vt=e(()=>[...new Set(Y.value.flatMap(e=>e.kinds||[]))]);function yt(e){return!we.value.includes(e)}function bt(e,t){we.value=t?we.value.filter(t=>t!==e):[...we.value,e]}function xt(e){let t=Y.value.filter(t=>t.kinds.includes(e));return t.length===Y.value.length?``:t.map(e=>e.label||U(`This machine`)).join(`, `)}let St=ke,Dt=[{label:U(`Project coordinators and agents outside projects`),value:`project_leads`},{label:U(`All agents`),value:`all`}],Ot=e({get:()=>Ee.value,set:e=>{Me(e).catch(e=>K(e.message,!0))}}),It=Le,X=o(`all`),Lt=o(`manual`),Rt=e(()=>[{label:q(`This device`,`Cet appareil`),value:`device`,disabled:!St.value},{label:q(`All devices`,`Tous les appareils`),value:`all`}]),zt=[{label:q(`1 hour`,`1 heure`),value:`hour`},{label:q(`Until tomorrow morning (8 am)`,`Jusqu’à demain matin (8 h)`),value:`morning`},{label:q(`Until turned back on`,`Jusqu’à réactivation`),value:`manual`}];w(Oe,e=>{if(!e)return;X.value=e.scope;let t=e.quiet.until===null?null:e.quiet.until-Date.now();Lt.value=t===null?`manual`:t<=36e5?`hour`:`morning`},{immediate:!0});async function Bt(e){try{let t=Oe.value?.scope;e&&await Ce(X.value,!0,ct(Lt.value)),t&&(!e||t!==X.value)&&await Ce(t,!1)}catch(e){K(e.message,!0)}}let Z=e({get:()=>!!Oe.value,set:e=>{Bt(e)}});function Vt(e){X.value=e,Z.value&&Bt(!0)}function Ht(e){Lt.value=e,Z.value&&Bt(!0)}let Ut=e(()=>{let e=Oe.value;if(!e)return``;let t=e.scope===`all`?q(`all devices`,`tous les appareils`):q(`this device`,`cet appareil`);if(e.quiet.until===null)return q(`Silenced on ${t} until turned back on.`,`Silence sur ${t} jusqu’à réactivation.`);let n=new Date(e.quiet.until),r=n.toLocaleTimeString(J,{hour:`2-digit`,minute:`2-digit`});return n.toDateString()===new Date(Be.value).toDateString()?q(`Silenced on ${t} until ${r}.`,`Silence sur ${t} jusqu’à ${r}.`):q(`Silenced on ${t} until tomorrow ${r}.`,`Silence sur ${t} jusqu’à demain ${r}.`)}),Wt=e=>[e.c.bg,e.c.surface,e.c.line,e.c.text,e.c.accent,e.c.blue,e.c.rose,e.c.teal],Gt=e(()=>{let e=ot.value.herdrTheme;return e?e.autoSwitch?`${e.darkName||`catppuccin`} / ${e.lightName||`catppuccin-latte`}`:e.name||`catppuccin`:null}),Q=e(()=>ae(ee(ot.value.herdrTheme,!1).id)),$=o(!1),qt=e(()=>H.value===`follow`?Q.value:ae(H.value)),Jt=e(()=>H.value===`follow`?`${U(`Follow Herdr`)}${Q.value?` · ${Q.value.label}`:``}`:qt.value?qt.value.label:H.value);function Yt(e){H.value=e,$e()}let Xt=e=>{ut.value=Math.max(8,Math.min(20,ut.value+e))},Qt=[{label:`WebGL`,value:`webgl`},{label:`HTML`,value:`html`}],$t=e(()=>qe.value===`html-fallback`?U(`Active rendering: HTML (WebGL unavailable)`):qe.value===`html`?U(`Active rendering: HTML`):U(`Active rendering: WebGL`));w(xe,Ge);let en=kt,tn=Ct,nn=e(()=>Re.map(e=>({label:e===1?U(`1 day`):e===365?U(`1 year`):q(`${e} days`,`${e} jours`),value:e}))),rn=e({get:()=>en.value?.maxSessionDays??7,set:async e=>{try{await nt(`/api/auth/max-session`,{days:e}),await tt()}catch(e){K(e.message,!0)}tn()}}),an=e(()=>{let e=en.value;if(!e?.deadline)return``;let t=new Date(e.deadline+Date.now()-(e.now??Date.now())).toLocaleString(J===`fr`?`fr-FR`:`en-GB`,{weekday:`short`,day:`numeric`,month:`short`,hour:`2-digit`,minute:`2-digit`});return q(`This device asks for the passkey again at the first opening after ${t}.`,`Cet appareil redemandera la clé d’accès à la première ouverture après le ${t}.`)});return f(Tt),f(()=>{Ge(),Ae(),It().then(He),tn()}),(e,n)=>{let o=pe,d=ne,f=Kt,h=wt,y=Zt,C=vn,w=An,D=At,O=ur,ee=jt,R=Mt,ae=te,fe=Ft;return c(),l(`section`,pr,[b(`header`,mr,[m(o,{icon:`i-lucide-chevron-left`,color:`neutral`,variant:`ghost`,size:`lg`,class:`icon-btn`,"aria-label":(`t`in e?e.t:r(U))(`Back`),onClick:F},null,8,[`aria-label`]),b(`h2`,null,v((`desk`in e?e.desk:r(G))?(`t`in e?e.t:r(U))(`Settings`):r(M)),1)]),b(`div`,{class:_([`settings-layout`,{"section-open":r(j)}])},[b(`nav`,{class:`settings-nav`,"aria-label":(`t`in e?e.t:r(U))(`Settings sections`)},[(c(!0),l(g,null,u(r(A),e=>(c(),l(`button`,{key:e.id,type:`button`,class:_([`settings-nav-item`,{selected:r(j)===e.id}]),"aria-current":r(j)===e.id?`page`:void 0,onClick:t=>P(e.id)},[m(d,{name:e.icon},null,8,[`name`]),b(`span`,null,v(e.label),1),m(d,{name:`i-lucide-chevron-right`,class:`settings-nav-arrow`})],10,gr))),128))],8,hr),x(b(`div`,{ref_key:`body`,ref:N,class:`settings-body`},[b(`h2`,_r,v(r(M)),1),x(b(`div`,vr,[b(`div`,yr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Theme`)),1),b(`button`,{type:`button`,class:`theme-opt theme-current`,"aria-expanded":r($),onClick:n[0]||=e=>$.value=!r($)},[b(`span`,xr,[(c(!0),l(g,null,u(r(qt)?Wt(r(qt)):[],(e,t)=>(c(),l(`i`,{key:t,style:S({background:e})},null,4))),128))]),b(`span`,Sr,[t(v(r(Jt)),1),b(`small`,null,v((`t`in e?e.t:r(U))(r($)?`Hide themes`:`Change theme`)),1)]),m(d,{name:r($)?`i-lucide-chevron-up`:`i-lucide-chevron-down`,class:`theme-check`},null,8,[`name`])],8,br),x(b(`div`,{class:`theme-list`,role:`radiogroup`,"aria-label":(`t`in e?e.t:r(U))(`Theme`)},[b(`button`,{type:`button`,role:`radio`,class:_([`theme-opt`,{on:(`themeChoice`in e?e.themeChoice:r(H))===(`FOLLOW_HERDR`in e?e.FOLLOW_HERDR:r(me))}]),"aria-checked":(`themeChoice`in e?e.themeChoice:r(H))===(`FOLLOW_HERDR`in e?e.FOLLOW_HERDR:r(me)),onClick:n[1]||=t=>Yt(`FOLLOW_HERDR`in e?e.FOLLOW_HERDR:r(`follow`))},[b(`span`,Tr,[(c(!0),l(g,null,u(r(Q)?Wt(r(Q)):[],(e,t)=>(c(),l(`i`,{key:t,style:S({background:e})},null,4))),128))]),b(`span`,Er,[t(v((`t`in e?e.t:r(U))(`Follow Herdr`)),1),b(`small`,null,v(r(Gt)?`config.toml · ${r(Gt)}`:(`t`in e?e.t:r(U))(`config.toml not found`)),1)]),(`themeChoice`in e?e.themeChoice:r(H))===(`FOLLOW_HERDR`in e?e.FOLLOW_HERDR:r(`follow`))?(c(),a(d,{key:0,name:`i-lucide-check`,class:`theme-check`})):s(``,!0)],10,wr),(c(!0),l(g,null,u(`THEMES`in e?e.THEMES:r(oe),n=>(c(),l(`button`,{key:n.id,type:`button`,role:`radio`,class:_([`theme-opt`,{on:(`themeChoice`in e?e.themeChoice:r(H))===n.id}]),"aria-checked":(`themeChoice`in e?e.themeChoice:r(H))===n.id,onClick:e=>Yt(n.id)},[b(`span`,Or,[(c(!0),l(g,null,u(Wt(n),(e,t)=>(c(),l(`i`,{key:t,style:S({background:e})},null,4))),128))]),b(`span`,kr,[t(v(n.label),1),n.id===(`DEFAULT_THEME`in e?e.DEFAULT_THEME:r(`wherdr-titanium`))?(c(),l(`small`,Ar,v((`t`in e?e.t:r(U))(`default`)),1)):n.light?(c(),l(`small`,jr,v((`t`in e?e.t:r(U))(`light`)),1)):s(``,!0)]),(`themeChoice`in e?e.themeChoice:r(H))===n.id?(c(),a(d,{key:0,name:`i-lucide-check`,class:`theme-check`})):s(``,!0)],10,Dr))),128))],8,Cr),[[k,r($)]])]),b(`p`,Mr,v((`t`in e?e.t:r(U))(`The theme is saved on this device.`)),1),b(`div`,Nr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Message field border on focus`)),1),m(f,{modelValue:r(pt),"onUpdate:modelValue":n[2]||=e=>E(pt)?pt.value=e:null,items:r(mt),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),b(`p`,Pr,v((`t`in e?e.t:r(U))(`Also on omp’s running actions (border only). Frozen when the system asks for reduced motion. Saved on this device.`)),1)]),b(`div`,Fr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Language`)),1),m(f,{modelValue:r(I),"onUpdate:modelValue":n[3]||=e=>E(I)?I.value=e:null,items:_t,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`])]),b(`p`,Ir,v((`t`in e?e.t:r(U))(`The interface language is saved on this device.`)),1),b(`div`,Lr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Home screen`)),1),b(`label`,Rr,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Compact list`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`One line per agent or space: no preview, folder or model. Computer and phone. Saved on this device.`)),1)]),m(h,{modelValue:r(ie),"onUpdate:modelValue":n[4]||=e=>E(ie)?ie.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`label`,zr,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Reorder automatically`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`In Ready, show unread agents before read ones. Saved on this device.`)),1)]),m(h,{modelValue:r(B),"onUpdate:modelValue":n[5]||=e=>E(B)?B.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`label`,Br,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Show terminals`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Show terminal spaces in the list, filed under Ready.`)),1)]),m(h,{modelValue:r(L),"onUpdate:modelValue":n[6]||=e=>E(L)?L.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`label`,Vr,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Show counters`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Show agent counters on the home screen.`)),1)]),m(h,{modelValue:r(z),"onUpdate:modelValue":n[7]||=e=>E(z)?z.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`label`,Hr,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Show quotas`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Show Claude and Codex quotas on the home screen.`)),1)]),m(h,{modelValue:r(re),"onUpdate:modelValue":n[8]||=e=>E(re)?re.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])])]),b(`div`,Ur,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Quotas`)),1),m(f,{modelValue:r(at),"onUpdate:modelValue":n[9]||=e=>E(at)?at.value=e:null,items:r(dt),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),b(`p`,Wr,v((`t`in e?e.t:r(U))(`The color always flags a nearly exhausted quota. Saved on this device.`)),1)]),(`desk`in e?e.desk:r(G))?(c(),l(g,{key:0},[b(`div`,Gr,[b(`span`,null,v((`t`in e?e.t:r(U))(`Desktop`)),1)]),b(`div`,Kr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Background`)),1),m(f,{modelValue:r(ht),"onUpdate:modelValue":n[10]||=e=>E(ht)?ht.value=e:null,items:r(gt),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),b(`p`,qr,v((`t`in e?e.t:r(U))(`In the margins of the conversation. Still when the system asks for reduced motion. Saved on this device.`)),1)]),b(`div`,Jr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Content width`)),1),m(f,{modelValue:r(W),"onUpdate:modelValue":n[11]||=e=>E(W)?W.value=e:null,items:r(Fe),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),b(`p`,Yr,v((`t`in e?e.t:r(U))(`Conversation, terminal, settings and other content. Saved on this device.`)),1)])],64)):s(``,!0)],512),[[k,r(j)===`appearance`]]),x(b(`div`,Xr,[b(`div`,Zr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Typewriter`)),1),m(f,{modelValue:r(he),"onUpdate:modelValue":n[12]||=e=>E(he)?he.value=e:null,items:r(be),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`,disabled:`reducedMotion`in e?e.reducedMotion:r(Se)},null,8,[`modelValue`,`items`,`disabled`]),b(`p`,Qr,v((`t`in e?e.t:r(U))((`reducedMotion`in e?e.reducedMotion:r(Se))?`Off: the system asks for reduced motion.`:`Only new replies are animated; history appears at once. Tap a reply while it types to show it in full. Saved on this device only.`)),1),b(`label`,{class:_([`settings-toggle encrypted-toggle`,{"is-disabled":!(`typewriterActive`in e?e.typewriterActive:r(Ze))}])},[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Encrypted text`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Writing advances in glyphs, then the text decrypts behind it.`)),1)]),m(h,{modelValue:r(se),"onUpdate:modelValue":n[13]||=e=>E(se)?se.value=e:null,disabled:!(`typewriterActive`in e?e.typewriterActive:r(Ze)),color:`success`,size:`xl`},null,8,[`modelValue`,`disabled`])],2),r(j)===`conversation`?(c(),a(y,{key:0})):s(``,!0)]),b(`div`,$r,[b(`h3`,null,v((`tl`in e?e.tl:r(q))(`Quoted replies`,`Réponses citées`)),1),b(`p`,ei,v((`tl`in e?e.tl:r(q))(`Answer several questions or passages of an agent in one message: ↳ Reply quotes each in the field, above its answer. Choose how the field shows the quotes; the message sent is the same.`,`Réponds à plusieurs questions ou passages d’un agent dans un seul message : ↳ Répondre cite chacun dans le champ, au-dessus de sa réponse. Choisis comment le champ affiche les citations ; le message envoyé est le même.`)),1),r(j)===`conversation`?(c(),a(C,{key:0,mode:r(ue)},null,8,[`mode`])):s(``,!0),b(`h4`,ti,v((`tl`in e?e.tl:r(q))(`On a computer`,`Sur ordinateur`)),1),m(f,{modelValue:r(V),"onUpdate:modelValue":n[14]||=e=>E(V)?V.value=e:null,items:r(de),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},{label:T(({item:n})=>[t(v(n.label),1),n.exp?(c(),l(`span`,ni,v((`tl`in e?e.tl:r(q))(`Experimental`,`Expérimental`)),1)):s(``,!0)]),_:1},8,[`modelValue`,`items`]),b(`h4`,ri,v((`tl`in e?e.tl:r(q))(`On a phone`,`Sur téléphone`)),1),m(f,{modelValue:r(ce),"onUpdate:modelValue":n[15]||=e=>E(ce)?ce.value=e:null,items:r(de),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},{label:T(({item:n})=>[t(v(n.label),1),n.exp?(c(),l(`span`,ii,v((`tl`in e?e.tl:r(q))(`Experimental`,`Expérimental`)),1)):s(``,!0)]),_:1},8,[`modelValue`,`items`]),b(`p`,ai,v((`tl`in e?e.tl:r(q))(`Saved on this device.`,`Enregistré sur cet appareil.`)),1)])],512),[[k,r(j)===`conversation`]]),x(b(`div`,oi,[b(`div`,si,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Home screen`)),1),b(`label`,ci,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Show terminals`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Show terminal spaces in the list, filed under Ready.`)),1)]),m(h,{modelValue:r(L),"onUpdate:modelValue":n[16]||=e=>E(L)?L.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])])]),b(`div`,li,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Text`)),1),b(`div`,ui,[b(`span`,null,v((`t`in e?e.t:r(U))(`Terminal text size`)),1),b(`div`,null,[b(`button`,{type:`button`,"aria-label":(`t`in e?e.t:r(U))(`Decrease text size`),onClick:n[17]||=e=>Xt(-1)},`A−`,8,di),b(`output`,null,v(`fontSize`in e?e.fontSize:r(ut)),1),b(`button`,{type:`button`,"aria-label":(`t`in e?e.t:r(U))(`Increase text size`),onClick:n[18]||=e=>Xt(1)},`A+`,8,fi)])])]),b(`div`,pi,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Terminal rendering`)),1),m(f,{modelValue:r(xe),"onUpdate:modelValue":n[19]||=e=>E(xe)?xe.value=e:null,items:Qt,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`]),b(`p`,mi,v((`t`in e?e.t:r(U))(`Rendering is saved on this device.`)),1),b(`p`,hi,v(r($t)),1)])],512),[[k,r(j)===`terminal`]]),x(b(`div`,gi,[b(`div`,_i,[b(`h3`,null,v((`t`in e?e.t:r(U))(`New agent`)),1),b(`p`,vi,v((`t`in e?e.t:r(U))(`Types shown in New agent. Terminal is always available.`)),1),r(vt).length?(c(),l(`div`,yi,[(c(!0),l(g,null,u(r(vt),t=>(c(),l(`label`,{key:t,class:`settings-toggle`},[b(`span`,null,[b(`b`,null,v((`kindLabel`in e?e.kindLabel:r(Ke))(t)),1),xt(t)?(c(),l(`small`,bi,v(xt(t)),1)):s(``,!0)]),b(`input`,{class:`agent-pref-check`,type:`checkbox`,checked:yt(t),onChange:e=>bt(t,e.target.checked)},null,40,xi)]))),128))])):(c(),l(`p`,Si,v((`t`in e?e.t:r(U))(`No agents installed on online machines.`)),1)),b(`p`,Ci,v((`t`in e?e.t:r(U))(`Choices saved on this device.`)),1)]),m(w)],512),[[k,r(j)===`agents`]]),x(b(`div`,wi,[b(`div`,Ti,[b(`label`,Ei,[b(`span`,null,[b(`b`,null,[m(d,{name:r(Z)?`i-lucide-bell-off`:`i-lucide-bell`},null,8,[`name`]),t(v((`tl`in e?e.tl:r(q))(`Do not disturb`,`Silence`)),1)]),b(`small`,null,v((`tl`in e?e.tl:r(q))(`No push notifications while it is on.`,`Aucune notification push tant qu’il est actif.`)),1)]),m(h,{modelValue:r(Z),"onUpdate:modelValue":n[20]||=e=>E(Z)?Z.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`p`,Di,v((`tl`in e?e.tl:r(q))(`Silence on`,`Couper pour`)),1),m(f,{"model-value":r(X),items:r(Rt),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`,"onUpdate:modelValue":n[21]||=e=>Vt(e)},null,8,[`model-value`,`items`]),r(St)?s(``,!0):(c(),l(`p`,Oi,v((`tl`in e?e.tl:r(q))(`“This device” needs notifications turned on below.`,`« Cet appareil » demande d’activer les notifications ci-dessous.`)),1)),b(`p`,ki,v((`tl`in e?e.tl:r(q))(`Duration`,`Durée`)),1),m(f,{"model-value":r(Lt),items:zt,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`,"onUpdate:modelValue":n[22]||=e=>Ht(e)},null,8,[`model-value`]),b(`p`,{class:_([`muted notify-hint`,{"quiet-end":r(Z)}])},v(r(Ut)||(`tl`in e?e.tl:r(q))(`Notifications come back on by themselves at the end.`,`Retour automatique à la normale à la fin de la durée choisie.`)),3)]),b(`div`,Ai,[m(D),b(`p`,ji,v((`t`in e?e.t:r(U))(`Notify for`)),1),m(f,{modelValue:r(Ot),"onUpdate:modelValue":n[23]||=e=>E(Ot)?Ot.value=e:null,items:Dt,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`]),b(`p`,Mi,v((`t`in e?e.t:r(U))(`Project threads remain visible and their unread messages are kept.`)),1)])],512),[[k,r(j)===`notifications`]]),x(b(`div`,Ni,[m(O,{machines:(`appConfig`in e?e.appConfig:r(ot)).machines||[{key:``,label:(`hostLabel`in e?e.hostLabel:r(je))||(`t`in e?e.t:r(U))(`This machine`),local:!0,home:``,dirs:[],online:!0,kinds:[]}]},null,8,[`machines`])],512),[[k,r(j)===`plugins`]]),x(b(`div`,Pi,[m(ee,{active:r(j)===`phone`},null,8,[`active`])],512),[[k,r(j)===`phone`]]),x(b(`div`,Fi,[b(`div`,Ii,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Passkey`)),1),m(R)]),r(en)?.enabled?(c(),l(`div`,Li,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Ask for the passkey again after`)),1),m(f,{modelValue:r(rn),"onUpdate:modelValue":n[24]||=e=>E(rn)?rn.value=e:null,items:r(nn),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),b(`p`,Ri,v((`t`in e?e.t:r(U))(`Counted from the last passkey unlock, for every device. Never in the middle of use: at the next opening of the app.`)),1),r(an)?(c(),l(`p`,zi,v(r(an)),1)):s(``,!0)])):s(``,!0)],512),[[k,r(j)===`security`]]),(`desk`in e?e.desk:r(G))?x((c(),l(`div`,Bi,[b(`div`,Vi,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Default pane view`)),1),m(f,{modelValue:r(Ue),"onUpdate:modelValue":n[25]||=e=>E(Ue)?Ue.value=e:null,items:Xe,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`]),b(`p`,Hi,v((`t`in e?e.t:r(U))(`What an agent pane opens on. A pane you switched to Terminal stays there. Saved on this device.`)),1)]),b(`div`,Ui,[b(`h3`,null,v((`tl`in e?e.tl:r(q))(`Keyboard shortcuts`,`Raccourcis clavier`)),1),b(`button`,{type:`button`,class:`settings-action solo`,onClick:n[26]||=e=>p.value=!0},[m(d,{name:`i-lucide-keyboard`}),t(v((`tl`in e?e.tl:r(q))(`Show keyboard shortcuts`,`Voir les raccourcis clavier`))+` `,1),b(`span`,Wi,[(c(!0),l(g,null,u((`shortcutKbds`in e?e.shortcutKbds:r(le))(`help`),e=>(c(),a(ae,{key:e,value:e},null,8,[`value`]))),128))])])])],512)),[[k,r(j)===`desktop`]]):s(``,!0),x(b(`div`,Gi,[b(`div`,Ki,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Application`)),1),b(`p`,qi,`wherdr · v`+v(r(i)),1),(`updateInfo`in e?e.updateInfo:r(Et))?.latest?(c(),a(fe,{key:0,info:`updateInfo`in e?e.updateInfo:r(Et)},null,8,[`info`])):(`updateInfo`in e?e.updateInfo:r(Et))?.checked?(c(),l(`p`,Ji,v((`t`in e?e.t:r(U))(`This is the latest version.`)),1)):s(``,!0),b(`button`,{type:`button`,class:`settings-action solo`,onClick:Yi},[m(d,{name:`i-lucide-refresh-cw`}),t(v((`t`in e?e.t:r(U))(`Reload app`)),1)]),b(`button`,{type:`button`,class:`settings-action solo`,onClick:n[27]||=(...t)=>(`openOnboarding`in e?e.openOnboarding:r(Pt))&&(`openOnboarding`in e?e.openOnboarding:r(Pt))(...t)},[m(d,{name:`i-lucide-compass`}),t(v((`tl`in e?e.tl:r(q))(`Setup guide`,`Guide de démarrage`)),1)])])],512),[[k,r(j)===`about`]])],512),[[k,r(j)]])],2)])}}}),{__name:`SettingsView`}),Zi=p({__name:`settings`,setup(e){return f(()=>{Ue.value=null}),(e,t)=>{let n=Xi;return c(),a(n)}}});export{Zi as default};
|