wherdr 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{BB3uOVbO.js → 8ksjcuDu.js} +51 -41
  3. package/.output/public/_nuxt/{AgentView.DE2GDt4O.css → AgentView.C4YOwvZG.css} +1 -1
  4. package/.output/public/_nuxt/B7QP1TFs.js +23 -0
  5. package/.output/public/_nuxt/{Bta8at9w.js → BOpBIziZ.js} +2 -2
  6. package/.output/public/_nuxt/BWXdFfeg.js +17 -0
  7. package/.output/public/_nuxt/COFCNFpG.js +83 -0
  8. package/.output/public/_nuxt/{C3BWhslt.js → Cd8j9O5w.js} +1 -1
  9. package/.output/public/_nuxt/CkZ8t6uB.js +1 -0
  10. package/.output/public/_nuxt/{OAXEskzA.js → D4Yz4rat.js} +4 -4
  11. package/.output/public/_nuxt/{C3P2P5Mv.js → D7sxNXx1.js} +1 -1
  12. package/.output/public/_nuxt/DViwOclv.js +1 -0
  13. package/.output/public/_nuxt/DoD7Qb5P.js +30 -0
  14. package/.output/public/_nuxt/DyBZDSCV.js +2 -0
  15. package/.output/public/_nuxt/builds/latest.json +1 -1
  16. package/.output/public/_nuxt/builds/meta/7afbf062-5369-4002-b20d-7a582ff6e0f1.json +1 -0
  17. package/.output/public/_nuxt/{entry.SHBiCXBL.css → entry.Crt1r4l3.css} +1 -1
  18. package/.output/public/_nuxt/hePW80VL.js +1 -0
  19. package/.output/public/sw.js +1 -1
  20. package/.output/server/chunks/_/branding.mjs +1 -1
  21. package/.output/server/chunks/_/package.mjs +96 -0
  22. package/.output/server/chunks/_/plugins.mjs +11 -3
  23. package/.output/server/chunks/_/projectBoard.mjs +1 -1
  24. package/.output/server/chunks/_/projectsPlugin.mjs +1 -1
  25. package/.output/server/chunks/_/selfupdate.mjs +82 -0
  26. package/.output/server/chunks/_/updates.mjs +50 -0
  27. package/.output/server/chunks/_/worktrees.mjs +1 -1
  28. package/.output/server/chunks/_/ws.mjs +1 -1
  29. package/.output/server/chunks/nitro/nitro.mjs +1728 -917
  30. package/.output/server/chunks/raw/bump-homebrew.mjs +7 -0
  31. package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
  32. package/.output/server/chunks/routes/api/_..._.mjs +5 -1
  33. package/.output/server/chunks/routes/api/agents.post.mjs +5 -1
  34. package/.output/server/chunks/routes/api/ask-tab.post.mjs +5 -1
  35. package/.output/server/chunks/routes/api/attach.post.mjs +5 -1
  36. package/.output/server/chunks/routes/api/auth/disable.post.mjs +5 -1
  37. package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +5 -1
  38. package/.output/server/chunks/routes/api/auth/lock.post.mjs +5 -1
  39. package/.output/server/chunks/routes/api/auth/login/options.post.mjs +5 -1
  40. package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +5 -1
  41. package/.output/server/chunks/routes/api/auth/max-session.post.mjs +5 -1
  42. package/.output/server/chunks/routes/api/auth/register/options.post.mjs +5 -1
  43. package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +5 -1
  44. package/.output/server/chunks/routes/api/auth/status.get.mjs +5 -1
  45. package/.output/server/chunks/routes/api/changes.get.mjs +5 -1
  46. package/.output/server/chunks/routes/api/chat/image.get.mjs +5 -1
  47. package/.output/server/chunks/routes/api/chat.get.mjs +5 -1
  48. package/.output/server/chunks/routes/api/choose.post.mjs +5 -1
  49. package/.output/server/chunks/routes/api/claude-statusline.post.mjs +5 -1
  50. package/.output/server/chunks/routes/api/close/status.get.mjs +5 -1
  51. package/.output/server/chunks/routes/api/close.post.mjs +5 -1
  52. package/.output/server/chunks/routes/api/codex-update.post.mjs +5 -1
  53. package/.output/server/chunks/routes/api/commands.get.mjs +5 -1
  54. package/.output/server/chunks/routes/api/config.get.mjs +5 -1
  55. package/.output/server/chunks/routes/api/dirs.get.mjs +5 -1
  56. package/.output/server/chunks/routes/api/dismiss.post.mjs +5 -1
  57. package/.output/server/chunks/routes/api/effort.post.mjs +5 -1
  58. package/.output/server/chunks/routes/api/efforts.get.mjs +5 -1
  59. package/.output/server/chunks/routes/api/file.post.mjs +5 -1
  60. package/.output/server/chunks/routes/api/gitroot.get.mjs +5 -1
  61. package/.output/server/chunks/routes/api/health.get.mjs +36 -0
  62. package/.output/server/chunks/routes/api/index.get.mjs +5 -1
  63. package/.output/server/chunks/routes/api/input.post.mjs +5 -1
  64. package/.output/server/chunks/routes/api/interrupt.post.mjs +5 -1
  65. package/.output/server/chunks/routes/api/isgit.get.mjs +5 -1
  66. package/.output/server/chunks/routes/api/machine/awake.get.mjs +5 -1
  67. package/.output/server/chunks/routes/api/machine/awake.post.mjs +5 -1
  68. package/.output/server/chunks/routes/api/machine/order.get.mjs +5 -1
  69. package/.output/server/chunks/routes/api/machine/order.post.mjs +5 -1
  70. package/.output/server/chunks/routes/api/machine/rename.post.mjs +5 -1
  71. package/.output/server/chunks/routes/api/menu.post.mjs +5 -1
  72. package/.output/server/chunks/routes/api/model.post.mjs +5 -1
  73. package/.output/server/chunks/routes/api/models.get.mjs +5 -1
  74. package/.output/server/chunks/routes/api/nav.post.mjs +5 -1
  75. package/.output/server/chunks/routes/api/onboarding.get.mjs +5 -1
  76. package/.output/server/chunks/routes/api/onboarding.post.mjs +5 -1
  77. package/.output/server/chunks/routes/api/phone.get.mjs +5 -6
  78. package/.output/server/chunks/routes/api/phone.post.mjs +5 -6
  79. package/.output/server/chunks/routes/api/plugins/actions.get.mjs +5 -1
  80. package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +5 -1
  81. package/.output/server/chunks/routes/api/plugins/profiles.get.mjs +5 -1
  82. package/.output/server/chunks/routes/api/plugins/projects.get.mjs +5 -1
  83. package/.output/server/chunks/routes/api/plugins/projects.post.mjs +5 -1
  84. package/.output/server/chunks/routes/api/plugins/thread-limits.get.mjs +6 -2
  85. package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +6 -2
  86. package/.output/server/chunks/routes/api/project/report.get.mjs +5 -1
  87. package/.output/server/chunks/routes/api/prompt.post.mjs +6 -2
  88. package/.output/server/chunks/routes/api/push/quiet.post.mjs +6 -2
  89. package/.output/server/chunks/routes/api/push/subscribe.post.mjs +6 -2
  90. package/.output/server/chunks/routes/api/push/test.post.mjs +6 -2
  91. package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +6 -2
  92. package/.output/server/chunks/routes/api/quotas.get.mjs +6 -2
  93. package/.output/server/chunks/routes/api/rename.post.mjs +5 -1
  94. package/.output/server/chunks/routes/api/requeue.post.mjs +6 -2
  95. package/.output/server/chunks/routes/api/restart.get.mjs +5 -1
  96. package/.output/server/chunks/routes/api/restart.post.mjs +5 -1
  97. package/.output/server/chunks/routes/api/reveal.post.mjs +5 -1
  98. package/.output/server/chunks/routes/api/screen-key.post.mjs +6 -2
  99. package/.output/server/chunks/routes/api/screen.get.mjs +12 -6
  100. package/.output/server/chunks/routes/api/search.get.mjs +6 -2
  101. package/.output/server/chunks/routes/api/seen.post.mjs +6 -2
  102. package/.output/server/chunks/routes/api/sessions.get.mjs +6 -2
  103. package/.output/server/chunks/routes/api/sessions.post.mjs +6 -2
  104. package/.output/server/chunks/routes/api/space.post.mjs +6 -2
  105. package/.output/server/chunks/routes/api/state.get.mjs +6 -2
  106. package/.output/server/chunks/routes/api/unqueue.post.mjs +6 -2
  107. package/.output/server/chunks/routes/api/update/status.get.mjs +38 -0
  108. package/.output/server/chunks/routes/api/update.get.mjs +11 -50
  109. package/.output/server/chunks/routes/api/update.post.mjs +41 -0
  110. package/.output/server/chunks/routes/api/upload.post.mjs +5 -1
  111. package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +5 -1
  112. package/.output/server/chunks/routes/api/worktrees.get.mjs +5 -1
  113. package/.output/server/chunks/routes/favicon.ico.get.mjs +5 -1
  114. package/.output/server/chunks/routes/icons/_name_.get.mjs +6 -2
  115. package/.output/server/chunks/routes/renderer.mjs +7 -3
  116. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +6 -2
  117. package/.output/server/chunks/routes/ws/_..._.mjs +6 -2
  118. package/.output/server/chunks/routes/ws/events.mjs +6 -2
  119. package/.output/server/chunks/routes/ws/mirror.mjs +6 -2
  120. package/.output/server/chunks/routes/ws/term.mjs +8 -4
  121. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  122. package/.output/server/index.mjs +6 -2
  123. package/.output/server/package.json +1 -1
  124. package/README.md +216 -45
  125. package/bin/lib/brew.mjs +86 -0
  126. package/bin/lib/commands.mjs +74 -16
  127. package/bin/lib/core.mjs +23 -3
  128. package/bin/lib/tailnet.d.mts +12 -3
  129. package/bin/lib/tailnet.mjs +103 -25
  130. package/bin/lib/updater.mjs +267 -0
  131. package/package.json +2 -1
  132. package/.output/public/_nuxt/01adBkx4.js +0 -1
  133. package/.output/public/_nuxt/BJsf0WRn.js +0 -2
  134. package/.output/public/_nuxt/BpQH8Ho1.js +0 -1
  135. package/.output/public/_nuxt/Cc2bsOcu.js +0 -83
  136. package/.output/public/_nuxt/DKmoLFfn.js +0 -30
  137. package/.output/public/_nuxt/DLLQgP0d.js +0 -1
  138. package/.output/public/_nuxt/DcCZr0Ya.js +0 -17
  139. package/.output/public/_nuxt/DsD2R-37.js +0 -23
  140. package/.output/public/_nuxt/builds/meta/ff11fc8b-1e70-4261-a76e-a52155efb196.json +0 -1
  141. package/.output/server/chunks/_/phone.mjs +0 -343
@@ -0,0 +1,83 @@
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,t){return e?t?`activate`:`banner`:`none`}function ee(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 te(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 ne=r(!1),re=r(!1),u=null,ie=!1,ae=!0;function oe(){ne.value=!0}function se(e,t){e?.addEventListener(`statechange`,()=>{if(e.state!==`installed`)return;let n=l(!!navigator.serviceWorker.controller,t);n===`activate`?e.postMessage({type:`skip-waiting`}):n===`banner`&&oe()})}function ce(){`serviceWorker`in navigator&&navigator.serviceWorker.register(`/sw.js`).then(e=>{u=e,e.waiting?.postMessage({type:`skip-waiting`}),se(e.installing,!0),e.addEventListener(`updatefound`,()=>se(e.installing,ae)),le()}).catch(()=>{})}async function le(){try{let e=await fetch(`/_nuxt/builds/latest.json?${Date.now()}`,{cache:`no-store`});if(!e.ok||!c(a().app.buildId,await e.json()))return;let t=null;try{t=sessionStorage}catch{}te(t,Date.now())?de():oe()}catch{}}async function ue(){if(!ne.value){try{let e=await fetch(`/_nuxt/builds/latest.json?${Date.now()}`,{cache:`no-store`});e.ok&&c(a().app.buildId,await e.json())&&oe()}catch{}ae=!1;try{await u?.update()}catch{}}}async function de(e){if(ie)return;ie=!0;let t=u?.installing;t&&await new Promise(e=>{let n=setTimeout(e,5e3);t.addEventListener(`statechange`,()=>{t.state!==`installing`&&(clearTimeout(n),e())})});let n=u?.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 d={"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.`,"wherdr update":`Mise à jour de wherdr`,"Updating…":`Mise à jour…`,"Reloading…":`Rechargement…`,"Update failed":`Échec de la mise à jour`,"Going back to the previous version…":`Retour à la version précédente…`,"Restarting wherdr":`Redémarrage de wherdr`,"Checking the new version":`Vérification de la nouvelle version`,"The app reloads by itself on the new version. Agents keep running.":`L’app se recharge d’elle-même sur la nouvelle version. Les agents continuent de tourner.`,"wherdr did not come back in 5 minutes. See ~/wherdr/update.log on the server.":`wherdr n’est pas revenu en 5 minutes. Regarde ~/wherdr/update.log sur le serveur.`,"This installation cannot update itself: run the update command":`Cette installation ne peut pas se mettre à jour seule : lance la commande de mise à jour`,"An update is already in progress":`Une mise à jour est déjà en cours`,"No newer version to install":`Aucune version plus récente à installer`,"The updater is missing from this installation: run the update command":`Le programme de mise à jour manque dans cette installation : lance la commande de mise à jour`,"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é`,"The terminal is too narrow for omp’s model selector — close wherdr’s terminal or widen the pane, then try again.":`Le terminal est trop étroit pour le sélecteur de modèles d’omp — ferme le terminal de wherdr ou élargis le panneau, puis réessaie.`,"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.`,"Animated packets":`Paquets animés`,"Small glowing squares running along the wherdr grid.":`Petits carrés lumineux qui parcourent la grille wherdr.`,"Opens in Herdr":`S’ouvre dans Herdr`,"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`},fe=`herdrLanguage`;function pe(){try{let e=localStorage.getItem(fe);if(e===`fr`||e===`en`)return e;for(let e of navigator.languages??[navigator.language]){let t=e?.toLowerCase().slice(0,2);if(t===`fr`||t===`en`)return t}return`en`}catch{return`en`}}var f=pe(),me=Object.keys(d).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 he(e){if(d[e])return d[e];for(let{key:t,names:n,re:r}of me){let i=r.exec(e);if(!i)continue;let a=Object.fromEntries(n.map((e,t)=>[e,he(i[t+1])??i[t+1]]));return d[t].replace(/\{(\w+)\}/g,(e,t)=>a[t]??e)}}function p(e){return f===`fr`?he(e)??e:e}function ge(e,t){return f===`fr`?t:e}function _e(e){try{localStorage.setItem(fe,e)}catch{}}var ve=/^hp-.+-t-\d{4,}(?:-.+)?$/i;function ye(e){if(e.hpThread||e.name&&ve.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 be=e=>(e||``).replace(/^[^\p{L}\p{N}~/]+/u,``).trim(),xe=new Set([`sh`,`bash`,`zsh`,`fish`,`dash`,`ksh`,`tcsh`,`csh`,`nu`,`pwsh`,`login`,`tmux`,`screen`]),Se=new Set([`claude`,`claude code`,`codex`,`gemini`,`gemini cli`,`opencode`,`kimi`,`agent`]),Ce=e=>(e||``).replace(/\\/g,`/`).replace(/\/+$/,``).split(`/`).pop()||``;function we(e){let t=be(e.title).replace(/\s*\|\s*\S+$/,``).trim();if(!t||/^\S+@\S+:/.test(t))return``;let n=t.toLocaleLowerCase(),r=Ce(n.split(/\s+/)[0]).replace(/^-/,``);if(xe.has(r)&&!/\s/.test(n)||/^(?:~|\/)/.test(t)&&!/\s/.test(t))return``;let i=Ce(e.cwd).toLocaleLowerCase();return i&&(n===i||n===`${i}/`)||e.agent&&Se.has(n)||e.agent&&n===e.agent.toLocaleLowerCase()?``:t}function Te(e,t){if(e.label)return e.label;if(e.agent&&ye(e)&&t?.trim())return t.trim();let n=e.displayAgent?.trim();return e.agent&&n&&!Se.has(n.toLocaleLowerCase())&&n.toLocaleLowerCase()!==e.agent.toLocaleLowerCase()?n:we(e)||(e.agent?e.name&&e.name!==e.agent?e.name:Ee(e.agent):e.command?e.command:Ce(e.cwd)||(e.cwd?`/`:`Shell`))}function Ee(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 De=[`claude`,`codex`,`omp`],Oe=e=>De.includes(e||``),ke={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`},Ae=e=>e&&ke[e]||(e?e[0].toUpperCase()+e.slice(1):`Shell`),je=e=>(e||``).replace(/^\/(?:home|Users)\/[^/]+/,`~`)||`~`,Me=e=>`‎${e}‎`,Ne=e=>Oe(e?.agent);function Pe(e){return Te(e,O.value.workspaces.find(t=>t.id===e.workspace)?.label)}var m=()=>f===`en`?`en-GB`:`fr-FR`;function Fe(e){return new Date(e).toLocaleTimeString(m(),{hour:`2-digit`,minute:`2-digit`})}function Ie(e){return new Date(e).toLocaleString(m(),{weekday:`long`,day:`numeric`,month:`long`,year:`numeric`,hour:`2-digit`,minute:`2-digit`})}function Le(e){let t=new Date(e),n=new Date,r=new Date;return r.setDate(n.getDate()-1),t.toDateString()===n.toDateString()?p(`Today`):t.toDateString()===r.toDateString()?p(`Yesterday`):t.toLocaleDateString(m(),{weekday:`long`,day:`numeric`,month:`long`})}function Re(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 p(`just now`);if(r>=0&&r<60)return ge(`${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?Fe(e):a===1?`${p(`yesterday`)} ${Fe(e)}`:a>1&&a<7?`${n.toLocaleDateString(m(),{weekday:`short`})} ${Fe(e)}`:n.toLocaleDateString(m(),{day:`numeric`,month:`short`,...n.getFullYear()===new Date(t).getFullYear()?{}:{year:`numeric`}})}function ze(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 Be=()=>{navigator.vibrate&&navigator.vibrate(8)},Ve=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform===`MacIntel`&&navigator.maxTouchPoints>1,He=matchMedia(`(pointer: coarse)`).matches,Ue=matchMedia(`(display-mode: standalone)`).matches||navigator.standalone===!0;function We(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 Ge(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function Ke(e,t=Date.now()){return!!e&&(e.until===null||t<e.until)}function qe(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 Je(e,t=new Date){return e===`hour`?t.getTime()+36e5:e===`morning`?qe(t):null}var Ye=`pushNotifyScope`;function Xe(){try{return localStorage.getItem(Ye)===`all`?`all`:`project_leads`}catch{return`project_leads`}}var Ze=r(Xe());async function Qe(e){Ze.value=e;try{localStorage.setItem(Ye,e)}catch{}await h()}function $e(e){return We((e+`=`.repeat((4-e.length%4)%4)).replace(/-/g,`+`).replace(/_/g,`/`))}async function et(){try{return!(`serviceWorker`in navigator)||!(`Notification`in window)||Notification.permission!==`granted`?!1:!!await(await navigator.serviceWorker.ready).pushManager.getSubscription()}catch{return!1}}var tt=r(null);async function nt(){tt.value=await et()}async function h(e=f){if(!(`serviceWorker`in navigator)||!(`Notification`in window)||Notification.permission!==`granted`)return;let t=await(await navigator.serviceWorker.ready).pushManager.getSubscription();t&&await q(`/api/push/subscribe`,{...t.toJSON(),lang:e,notifyScope:Ze.value,sessions:A.value})}var rt=`pushEndpoint`;function it(){try{return localStorage.getItem(rt)||void 0}catch{return}}async function at(){if(!(`serviceWorker`in navigator)||!(`PushManager`in window)||!(`Notification`in window))return K(p(Ve&&!Ue?`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 K(p(`Notifications denied — enable them in system settings.`),!0);if(await qi(),!F.value.push||!F.value.push.key)return K(p(`Web Push is not configured on the server`),!0);let e=await navigator.serviceWorker.ready,t=$e(F.value.push.key),n=await e.pushManager.getSubscription(),r=n?.endpoint||it();n&&await n.unsubscribe().catch(()=>{}),n=await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:t}),await q(`/api/push/subscribe`,{...n.toJSON(),previous:r,lang:f,notifyScope:Ze.value,sessions:A.value});try{localStorage.setItem(rt,n.endpoint)}catch{}K(p(`Notifications enabled ✓`))}catch(e){K(`${p(`Failed`)} : ${e.message}`,!0)}}async function ot(){try{let e=await q(`/api/push/test`,{});K(p(e.sent?`Notification sent`:`No device accepted the notification`),!e.sent)}catch(e){K(e.message,!0)}}var st=r({global:null,device:null}),g=r(Date.now());o(()=>{g.value=Date.now()},3e4);var ct=e(()=>{let{global:e,device:t}=st.value;return Ke(t,g.value)?{scope:`device`,quiet:t}:Ke(e,g.value)?{scope:`all`,quiet:e}:null});async function lt(){try{return`serviceWorker`in navigator&&(await(await navigator.serviceWorker.ready).pushManager.getSubscription())?.endpoint||``}catch{return``}}async function ut(){try{st.value=await q(`/api/push/quiet`,{endpoint:await lt()}),g.value=Date.now()}catch{}}async function dt(e,t,n=null){st.value=await q(`/api/push/quiet`,{endpoint:await lt(),scope:e,on:t,until:n}),g.value=Date.now()}function ft(e){return e&&e.screen&&e.screen.kind!==`other`&&e.status!==`working`?e.screen:null}var pt={enter:[`Entrée`,`Enter`],esc:[`Échap`,`Esc`],tab:[`Tab`,`Tab`],space:[`Espace`,`Space`],left:[`←`,`←`],right:[`→`,`→`]},mt={"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`]},_=(e,t)=>e[+!!t];function ht(e,t=f===`en`){if(pt[e])return _(pt[e],t);let n=e.match(/^ctrl\+(\w)$/);return n?`Ctrl+${n[1].toUpperCase()}`:e}function gt(e,t=f===`en`){return e.title?`${_([`Menu`,`Menu`],t)} · ${e.title}`:_([`Menu ouvert`,`Menu open`],t)}function _t(e,t=f===`en`){let n=mt[e.label.toLowerCase()];return n?_(n,t):e.label[0].toUpperCase()+e.label.slice(1)}function vt(e,t=f===`en`){return`${_t(e,t)} (${ht(e.key,t)})`}function yt(e,t=f===`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?_(n,t):e.title}function bt(e,t=f===`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?_(n,t):null}function v(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 y=e=>v(String(e||``)).machine,xt=/^[a-z][a-z0-9_-]{0,31}$/,St=`Name: lowercase letters, digits, - and _ (32 max), starting with a letter`,Ct=()=>({home:null,chats:[]}),wt=e=>JSON.stringify(e).length*2;function Tt(e){let t=e.slice(-160);for(;t.length&&wt(t)>225280;)t=t.slice(1);return t}function Et(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(v(t.id).machine))}for(n.chats=n.chats.map(e=>({...e,items:Tt(e.items)})).sort((e,t)=>t.used-e.used).slice(0,12);n.chats.length&&wt(n)>4194304;)n.chats.pop();return wt(n)>4194304&&(n.home=null),n}var b=null;function Dt(){return b||(b=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é`))}}),b.catch(e=>{throw b=null,e}))}async function Ot(){try{let e=await Dt();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(Ct());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 Ct()}}async function kt(e){try{let t=await Dt();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 At=Promise.resolve();function x(e){return At=At.then(async()=>kt(e(await Ot()))).catch(()=>{}),At}var jt=Ot;function Mt(e,t){return x(n=>Et({...n,home:{state:e,quotas:t===void 0?n.home?.quotas||null:t,at:Date.now()}},e))}function Nt(e){return x(t=>t.home?{...t,home:{...t.home,quotas:e}}:t)}function Pt(e,t){return x(n=>Et({...n,chats:[{id:e,items:Tt(t),at:Date.now(),used:Date.now()},...n.chats.filter(t=>t.id!==e)]}))}function Ft(e){return x(t=>Et({...t,chats:t.chats.map(t=>t.id===e?{...t,used:Date.now()}:t)}))}function It(){return x(()=>Ct())}var Lt=`wherdr-offline-access`;function S(e,t=Date.now()){return!!(e&&(!e.enabled||e.expiresAt>t&&e.expiresAt<=t+432e5&&(e.deadline===void 0||e.deadline>t)))}function Rt(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 zt(){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 Bt(e){try{e?localStorage.setItem(Lt,JSON.stringify(e)):localStorage.removeItem(Lt)}catch{}}function Vt(e){return e===`html`?`html`:`webgl`}function Ht(e,t){return e===`html`?`html`:t?`webgl`:`html-fallback`}function Ut(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=>y(e.id))),a=e=>{let t=y(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=>y(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`})),ee=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:[...ee,...t.machines||[],...l]}}var C=(e,t)=>t>0?Math.round(e/t*1e4)/100:0;function Wt(e){let{area:t}=e;return Gt(e).map(({pane:e,rect:n})=>({pane:e,left:C(n.x-t.x,t.width),top:C(n.y-t.y,t.height),width:C(n.width,t.width),height:C(n.height,t.height)}))}function Gt(e){return e.panes}function Kt(e,t,n){let r=Gt(e).map(e=>e.pane),i=r.indexOf(t);return i<0?null:r[i+n]??null}function qt(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 Jt(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 Yt=[`left`,`right`,`up`,`down`];function Xt(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 ee=e?s.y:s.x;(!a||l>a.len||l===a.len&&ee<a.at)&&(a={pane:o,len:l,at:ee})}return a?.pane??null}function Zt(e,t){return e.zoomed?[]:Yt.filter(n=>Xt(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 w(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 $t(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 T=e=>`pane`in e?e.pane:`${e.direction}(${T(e.first)},${T(e.second)})`;function en(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 tn(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=w(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 T(l)===T(a)?null:$t(e,l)}function nn(e){if(e.zoomed||!e.splits||!w(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:C(r+Math.round(i*e.ratio),a),from:C(o,c),span:C(s,c),start:C(r,a),size:C(i,a)}})}function rn(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 an(e,t,n){let r=w(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 $t(e,i(r,``))}var on=(e,t)=>e.number-t.number;function sn(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 cn(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=qt({...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:Gt(o).map(e=>s.get(e.pane))}}function ln(e,t){let n=e=>t===void 0||(e.machine||``)===t,r=sn(e).filter(n);return e.workspaces.filter(n).sort(on).map(t=>({workspace:t,tabs:r.filter(e=>e.workspace===t.id).sort(on).map(t=>cn(t,e.panes))})).filter(e=>e.tabs.some(e=>e.panes.length))}function un(e,t){let n=sn(e).find(e=>e.id===t);return n?cn(n,e.panes):null}var dn={blocked:0,working:1,done:2,idle:3,unknown:4},fn=e=>e.agent?dn[e.status||`unknown`]??4:9;function pn(e){let t=null;for(let n of e)(!t||fn(n)<fn(t))&&(t=n);return t}function mn(e,t){return ln(e,t).map(e=>{let t=e.tabs.filter(e=>e.panes.length),n=t.flatMap(e=>e.panes),r=pn(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 hn=e=>!e.lead.agent;function gn(e){let t=e.lead;return t.agent&&t.status===`blocked`?`blocked`:t.agent&&t.status===`working`?`working`:`ready`}var _n=/\/\.herdr\/worktrees\/([^/]+)\/[^/]+/,vn=e=>(e||``).replace(/\\/g,`/`).replace(/\/+$/,``);function yn(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=>_n.exec(vn(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(!hn(e))continue;let t=n.get(e.lead.workspace);if(!t||t.worktree||_n.test(vn(e.lead.cwd)))continue;let r=t.machine||``,o=t.repoName||vn(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 bn(e,t){return e.filter(e=>t.some(t=>e.worktrees.includes(t.workspace)))}function xn(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 Sn=[`herdr`,`recent`,`name`];function Cn(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 wn(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=pn(i.flatMap(e=>e.panes));return o&&i.find(e=>e.panes.includes(o))?.tab.id||i[0]?.tab.id||null}function Tn(e,t){let n=e.workspaces.find(e=>e.id===t);return n&&ln(e,n.machine||``).find(e=>e.workspace.id===t)?.tabs.filter(e=>e.panes.length)||[]}function En(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=Tn(e,n),i=r.findIndex(e=>e.tab.id===t);return i<0?null:(r[i-1]??r[i+1])?.tab.id??null}var Dn=(e,t)=>t.length===1?{pane:t[0].id}:{tab:e};function On(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=En(e,t);return n?Dn(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=(un(e,s.tab)?.panes||[]).filter(e=>e.id!==s.id);return c.length?`tab`in n&&c.length>1?null:Dn(s.tab,c):o(s.tab)}function kn(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 E={"\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`},An=`\x1B[200~`,jn=`\x1B[201~`,Mn=/^\x1b(?:\[[0-9;?]*[ -/]*[@-~]|O[@-~]|[^[O])?/;function Nn(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(An)&&e.endsWith(jn)){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=Mn.exec(e.slice(i))[0];E[t]?n(E[t]):t.length===2&&t[1]>=` `&&t[1]<=`~`&&n(`alt+${t[1].toLowerCase()}`),i+=t.length;continue}E[t]?n(E[t]):t<` `?t!==`\0`&&n(`ctrl+${String.fromCharCode(t.charCodeAt(0)+96)}`):r(t),i++}return t}function Pn(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 Fn(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 Pn(e,n,s).every((t,n)=>t===e[n])?null:{before:s}}function In(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(Pn(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 Ln=[1,7,30,90,365];function Rn(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 zn=e=>JSON.stringify(e);function Bn(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 Vn=2e3,Hn={fast:1,medium:2,slow:3},Un={fast:20,medium:40,slow:70},Wn={fast:300,medium:450,slow:650};function Gn(e,t=`fast`){return t===`off`?0:Math.round(Math.min(Vn,Math.max(500,400+e*3.5))*Hn[t])}function Kn(e,t,n){if(n===`off`||e<=0)return{written:e,decrypted:e,done:!0};let r=Gn(e,n),i=Math.min(e,Math.floor(Math.max(0,t)/r*e)),a=Math.min(e,Un[n]),o=Math.max(0,i-a),s=Math.min(1,Math.max(0,t-r)/Wn[n]);return{written:i,decrypted:Math.min(e,o+Math.floor((e-o)*s)),done:t>=r+Wn[n]}}function qn(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 Jn(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 Yn(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:qn(o),shown:-1,written:-1}}function Xn(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 Zn=`#%@&$*+=-/\\|<>01{}[]~^:;_!?`;function Qn(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 $n=(e,t)=>t?`off`:e,er=(e,t,n)=>$n(e,n)!==`off`&&t;function tr(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 nr(e,t=Math.random){return Array.from(e,e=>/\s/.test(e)?e:Zn[Math.floor(t()*27)])}function rr(e){Xn(e,e.total)}var ir=e=>`${e.ts||``}|${e.text.length}|${e.text.slice(0,64)}`;function ar(e,t,n){let r=null;for(let n of t)e.has(n)||(e.add(n),r=n);return n?r:null}function or(e){try{let t=JSON.parse(e||`[]`);return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`string`&&e!==`shell`))]:[]}catch{return[]}}function sr(e,t){let n=new Set(t);return[...new Set(e.filter(e=>e!==`shell`&&!n.has(e))),`shell`]}function cr(e,t,n=``){return t.includes(e)?e:!e&&t.includes(n)?n:t[0]||`shell`}var lr=[`normal`,`wide`,`full`];function ur(e){return lr.includes(e)?e:`normal`}function dr(e,t){return ur(e??t)}var fr=`#!/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 pr(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 mr(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 hr(e,t,n,r=[]){return!n||r.includes(`claude`)?null:e?.claudeSetup?.find(e=>e.key===t)||null}var gr=`sh <<'WHERDR_INSTALL'\n${fr.trimEnd()}\nWHERDR_INSTALL\n`;function _r(e,t){return e.resetsAt&&e.resetsAt<=t?100:Math.round(100-e.used)}function vr(e){return e===`used`?`used`:`left`}function yr(e,t,n){let r=_r(e,t);return n===`used`?100-r:r}var br=(e,t)=>{let n=_r(e,t);return n<=15?`hi`:n<=40?`mid`:`lo`},xr=36e5;function Sr(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 Cr(e){return e!==`0`}function wr(e,t,n=!0){return{menu:e&&n,selected:e&&n&&t}}function Tr(e){return e===1?`1 thread`:`${e} threads`}function Er(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 Dr(e){return(e.live||!!(e.desk&&e.cell))&&(!e.desk||e.mode!==`term`&&e.mode!==`mirror`)}function Or(e){return e.chat&&e.viewMode!==`term`?`chat`:`mirror`}function kr(e){return e.desk?e.defaultMode:`chat`}function Ar(e){return e.desk&&e.live&&e.available&&(e.mode===`term`||e.mode===`mirror`)}function jr(e){return{row:e>1,headerAdd:e===1}}function Mr(e,t){return e===t?`chat`:t}function Nr(e){return!e.altKey||!(e.ctrlKey||e.metaKey)||e.shiftKey?0:{ArrowLeft:-1,ArrowUp:-1,ArrowRight:1,ArrowDown:1}[e.key]??0}function Pr(e){return!e.desk||e.coarse}var Fr=[`lines`,`native`,`rich`];function Ir(e,t){return Fr.includes(e)?e:t===`1`?`rich`:`lines`}function Lr(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 Rr=/^(DIV|P|LI|UL|OL|BLOCKQUOTE|PRE|H[1-6])$/;function zr(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=Rr.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 Br(e,t){return e.key===`Enter`?t&&!e.shiftKey&&!e.isComposing?`send`:`newline`:null}var D={get(e){try{return localStorage.getItem(e)}catch{return null}},set(e,t){try{localStorage.setItem(e,t)}catch{}}},O=n({ok:!1,workspaces:[],panes:[]}),k=O.value;function Vr(){return Rn(D.get(`machineSessions`))}var A=r(Vr());function Hr(e){A.value=e,D.set(`machineSessions`,zn(e)),O.value=Bn(k,e)}async function Ur(e){return(await q(`/api/sessions?machine=${encodeURIComponent(e)}`)).sessions}async function Wr(e,t){let n=await q(`/api/sessions`,{machine:e,name:t});Hr({...A.value,[e]:t}),W.value=n.session.key,h().catch(()=>{}),await qi()}var Gr=new Map;async function Kr(){for(let[e,t]of Object.entries(A.value)){if(!t||k.machines?.some(n=>n.key===e&&n.session===t)||k.machines?.some(n=>n.baseKey===e&&n.session===t))continue;let n=Date.now();n-(Gr.get(e)||0)<1e4||(Gr.set(e,n),q(`/api/sessions`,{machine:e,name:t}).catch(()=>{}))}}async function qr(){for(let[e,t]of Object.entries(A.value))if(t&&!k.machines?.some(n=>n.key===e&&n.session===t))try{if(!(await Ur(e)).some(e=>e.name===t&&e.running)){let t={...A.value};delete t[e],Hr(t),h().catch(()=>{}),W.value&&!k.machines?.some(e=>e.key===W.value&&!e.baseKey)&&(W.value=e),K(p(`Session unavailable: back to the default session`))}}catch{}}var j=r(!1),M=r(!1),N=r(null),Jr=e(()=>N.value!==null),P=r(!1),F=r({kinds:[`claude`,`codex`],home:``,dirs:[],push:{enabled:!1,key:null,devices:0}}),Yr=r(``),Xr=e(()=>`wherdr`),I=r(null),Zr=r(!0),Qr=r(Cr(D.get(`showShells`)));i(Qr,e=>D.set(`showShells`,e?`1`:`0`));var $r=r(D.get(`showCounters`)!==`0`);i($r,e=>D.set(`showCounters`,e?`1`:`0`));var ei=r(D.get(`showQuotas`)!==`0`);i(ei,e=>D.set(`showQuotas`,e?`1`:`0`));var ti=r(D.get(`compactList`)===`1`);i(ti,e=>D.set(`compactList`,e?`1`:`0`));var ni=r(D.get(`autoReorderReady`)!==`0`);i(ni,e=>D.set(`autoReorderReady`,e?`1`:`0`));var ri=r(Sn.includes(D.get(`readySort`)||``)?D.get(`readySort`):`herdr`);i(ri,e=>D.set(`readySort`,e));var ii=r(D.get(`projectHideEmpty`)===`1`);i(ii,e=>D.set(`projectHideEmpty`,e?`1`:`0`));var ai=r(vr(D.get(`quotaDisplay`)));i(ai,e=>D.set(`quotaDisplay`,e));var oi=r(or(D.get(`hiddenAgents`)));i(oi,e=>D.set(`hiddenAgents`,JSON.stringify(e)));var si=r(dr(D.get(`contentWidth`),D.get(`chatWidth`)));i(si,e=>{D.set(`contentWidth`,e);try{localStorage.removeItem(`chatWidth`)}catch{}document.documentElement.dataset.contentWidth=e},{immediate:!0});var ci=Qn(D.get(`typewriterSpeed`),D.get(`encryptedText`),D.get(`typewriterMode`),D.get(`typewriter`));D.set(`typewriterSpeed`,ci.speed),D.set(`encryptedText`,ci.encrypted?`1`:`0`);var li=r(ci.speed),ui=r(ci.encrypted);i(li,e=>D.set(`typewriterSpeed`,e)),i(ui,e=>D.set(`encryptedText`,e?`1`:`0`));var L=r(!1);{let e=matchMedia(`(prefers-reduced-motion: reduce)`);L.value=e.matches,e.addEventListener(`change`,e=>{L.value=e.matches})}var di=e(()=>$n(li.value,L.value)),fi=e(()=>di.value!==`off`),pi=e(()=>er(li.value,ui.value,L.value)),mi=r(Ir(D.get(`quoteModeComputer`),D.get(`quoteTokensComputer`)));i(mi,e=>D.set(`quoteModeComputer`,e));var hi=r(Ir(D.get(`quoteModePhone`),D.get(`quoteTokensPhone`)));i(hi,e=>D.set(`quoteModePhone`,e));var gi=e(()=>Oi.value?hi.value:mi.value),_i=r(null),vi=r(Number(D.get(`fontSize`))||12);i(vi,e=>D.set(`fontSize`,String(e)));var R=r(Vt(D.get(`terminalRenderer`)));i(R,e=>D.set(`terminalRenderer`,e));var yi=r(null),z=r(null);function bi(e){yi.value=e,e!==`html`&&(z.value=e===`webgl`)}function xi(){if(R.value===`html`){yi.value=`html`;return}if(z.value===null)try{let e=document.createElement(`canvas`).getContext(`webgl2`);z.value=!!e,e?.getExtension(`WEBGL_lose_context`)?.loseContext()}catch{z.value=!1}yi.value=Ht(R.value,z.value===!0)}window.addEventListener(`storage`,e=>{e.key===`terminalRenderer`&&(R.value=Vt(e.newValue),xi())});function Si(){try{let e=JSON.parse(D.get(`viewModes`)||`{}`);return e&&typeof e==`object`?e:{}}catch{return{}}}var B=t(Si()),Ci=r(D.get(`defaultViewMode`)===`term`?`term`:`chat`);i(Ci,e=>D.set(`defaultViewMode`,e));var wi=e=>B[e]===`term`||B[e]===`project`||B[e]===`chat`?B[e]:kr({desk:V.value,defaultMode:Ci.value});function Ti(e,t){B[e]=t,D.set(`viewModes`,JSON.stringify(B))}function Ei(e){if(!e.ok)return;let t=new Set(k.panes.map(e=>e.id)),n=new Set([``,...(k.machines||[]).filter(e=>e.status===`online`).map(e=>e.key)]),r=!1;for(let e of Object.keys(B))!t.has(e)&&n.has(v(e).machine)&&(delete B[e],r=!0);r&&D.set(`viewModes`,JSON.stringify(B))}i(O,Ei);var Di=r(D.get(`lastKind`)||``);i(Di,e=>D.set(`lastKind`,e));var V=r(!1);{let e=matchMedia(`(min-width: 900px)`);V.value=e.matches,e.addEventListener(`change`,()=>{V.value=e.matches})}var Oi=r(!1);{let e=matchMedia(`(pointer: coarse)`);Oi.value=e.matches,e.addEventListener(`change`,()=>{Oi.value=e.matches})}var ki=e(()=>Pr({desk:V.value,coarse:Oi.value})),Ai=e(()=>O.value.panes.find(e=>e.id===I.value)),H=e(()=>O.value.machines||[]),ji=e(()=>H.value.length>1||!!H.value[0]?.baseKey),U=e=>H.value.find(t=>t.key===(e||``)),Mi=e=>U(e)?.os||(e?void 0:F.value.os),Ni=e=>!e||!e.cwd?!1:Mi(e.machine)===`Darwin`||!((e.machine||``).trim()||!F.value.hostOpen),Pi=e(()=>ji.value?(F.value.machines||[]).filter(e=>H.value.some(t=>t.key===e.key)):null),Fi=e=>e.local||U(e.key)?.status===`online`&&!!e.home,Ii=e=>e.local?`online`:U(e.key)?.status||`offline`,Li=e=>{let t=U(e);return t?t.label||p(`This machine`):``},Ri=e=>{let t=e?U(e.machine):void 0;return!!(t&&t.status!==`online`)};function zi(e){try{let t=JSON.parse(D.get(e)||`[]`);return Array.isArray(t)?t.map(String):[]}catch{return[]}}var Bi=r(zi(`collapsedMachines`));i(Bi,e=>D.set(`collapsedMachines`,JSON.stringify(e)));var Vi=r(zi(`collapsedProjects`));i(Vi,e=>D.set(`collapsedProjects`,JSON.stringify(e)));var Hi=r(zi(`collapsedRepos`));i(Hi,e=>D.set(`collapsedRepos`,JSON.stringify(e)));var W=r(D.get(`lastMachine`)||``);i(W,e=>D.set(`lastMachine`,e));var G=null;function Ui(e){G=e}function Wi(){G?.clear()}function K(e,t=!1,n){G&&(G.clear(),G.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 Gi=class extends Error{code;status;constructor(e,t,n){super(e),this.status=t,this.code=n}};async function q(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/`)&&ra();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 Gi(p(o||a.error||`HTTP ${i.status}`),i.status,a.code);return a}async function Ki(e){try{let t=await q(`/api/reveal`,{pane_id:e.id,path:e.cwd,mode:`open`});K(ge(`Opened in the editor on ${t.machine}`,`Ouvert dans l’éditeur sur ${t.machine}`))}catch(e){K(e.message,!0)}}async function qi(){try{F.value=await q(`/api/config`),F.value.hostLabel!==void 0&&(Yr.value=F.value.hostLabel)}catch{}}var J=null,Ji=0,Yi=!1,Xi=0,Zi=3e4,Y=null,X,Z,Qi=()=>`${location.protocol===`https:`?`wss`:`ws`}://${location.host}`;function $i(e){if(!e){clearTimeout(Z),Z=void 0,M.value=!1;return}M.value||Z||(Z=setTimeout(()=>{Z=void 0,M.value=!0},2500))}function ea(e){for(let t of e.panes)(t.prompt&&t.prompt.options||ft(t))&&t.status!==`working`&&(t.status=`blocked`);return e}function Q(){if(clearTimeout(X),P.value||J&&J.readyState<=1)return;let e=new WebSocket(`${Qi()}/ws/events`);J=e,e.onopen=()=>{Ji=0,j.value=!0,Yi&&(Xi=Date.now()+Zi,ue()),Yi=!0,na(),Kr()},e.onmessage=e=>{try{let t=ea(JSON.parse(e.data)),n=Ut(Y?k:null,t,Date.now()<Xi);if(!n)return;if($i(!1),!n.ok&&O.value.ok&&Y){N.value=Y;return}k=n,O.value=Bn(n,A.value),Kr(),Y=Date.now(),N.value=null,n.ok&&S(zt())&&Mt(O.value)}catch{}},e.onclose=()=>{J===e&&(J=null,j.value=!1,O.value.ok&&Y&&(N.value=Y),ra(),!P.value&&($i(!0),X=setTimeout(Q,Math.min(8e3,500*2**Ji++))))}}function ta(){Ji=0,clearTimeout(X),Q()}function na(){J&&J.readyState===1&&J.send(JSON.stringify({type:`viewing`,pane:I.value,visible:Zr.value}))}i(I,na),i(O,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 ra({resume:e=!1}={}){try{let t=await q(e?`/api/auth/status?resume=1`:`/api/auth/status`);if(t.enabled&&!t.unlocked)return $();let n=Rt(t);Bt(n),e&&aa(n)}catch{}}var ia=!1;function aa(e){ia||!e.deadline||e.deadline-Date.now()>216e5||(ia=!0,K(p(`The passkey will be asked again the next time the app opens.`)))}var oa=!1,sa;function ca(){oa||(oa=!0,P.value=!1,Q(),sa||=o(qr,3e4),qi(),h().catch(()=>{}))}function $(){P.value=!0,O.value={ok:!1,workspaces:[],panes:[]},k=O.value,N.value=null,Bt(null),It();let e=J;if(J=null,e){e.onclose=null;try{e.close()}catch{}}j.value=!1,clearTimeout(X),$i(!1),oa=!1}var la=3e3;async function ua({resume:e=!1}={}){let t=zt();try{let n=e?await q(`/api/auth/status?resume=1`,void 0,AbortSignal.timeout(la)):await q(`/api/auth/status`);if(n.hostLabel!==void 0&&(Yr.value=n.hostLabel),n.enabled&&!n.unlocked)return $();t=Rt(n),Bt(t),e&&aa(t)}catch{if(t?.enabled&&!S(t)&&!j.value)return $()}if(S(t)){let e=await jt();e.home&&!j.value&&(k=e.home.state,O.value=Bn(k,A.value),N.value=e.home.at)}ca()}export{L as $,dt as $n,Nn as $t,W as A,Pt as An,ee as Ar,xr as At,ji as B,_t as Bn,Xn as Bt,j as C,Jt as Cn,p as Cr,Dr as Ct,_i as D,zt as Dn,re as Dr,Er as Dt,oi as E,S as En,ue as Er,Mr as Et,U as F,y as Fn,pr as Ft,Ri as G,Ze as Gn,ir as Gt,Jr as H,bt as Hn,rr as Ht,Li as I,v as In,yr as It,ai as J,ct as Jn,Gn as Jt,wi as K,tt as Kn,Jn as Kt,Fi as L,ft as Ln,Sr as Lt,qi as M,Ft as Mn,o as Mr,hr as Mt,P as N,St as Nn,mr as Nt,Yr as O,It as On,ne as Or,wr as Ot,Pi as P,xt as Pn,br as Pt,ri as Q,Qe as Qn,pn as Qt,Ii as R,gt as Rn,cr as Rt,ui as S,an as Sn,_e as Sr,Or as St,O as T,Qt as Tn,de as Tr,Ar as Tt,Ki as U,yt as Un,ar as Ut,M as V,ht as Vn,tr as Vt,Zr as W,at as Wn,Yn as Wt,mi as X,nt as Xn,Ln as Xt,gi as Y,g as Yn,Kn as Yt,hi as Z,ut as Zn,On as Zt,I as _,en as _n,He as _r,di as _t,Xr as a,In as an,Ie as ar,Ui as at,V as b,Wt as bn,Te as br,zr as bt,Wr as c,Cn as cn,Re as cr,$ as ct,Vi as d,fn as dn,Ve as dr,ua as dt,En as en,ot as er,xi as et,Hi as f,un as fn,Ae as fr,yi as ft,si as g,tn as gn,Ue as gr,li as gt,Q as h,nn as hn,je as hr,fi as ht,ni as i,Fn as in,Le as ir,Ti as it,Ur as j,Nt as jn,te as jr,gr as jt,Di as k,jt as kn,ce as kr,Tr as kt,Wi as l,mn as ln,Be as lr,ei as lt,ra as m,Xt as mn,Pe as mr,K as mt,q as n,xn as nn,We as nr,ta as nt,N as o,yn as on,ze as or,ki as ot,ti as p,ln as pn,Me as pr,R as pt,ii as q,et as qn,nr as qt,F as r,kn as rn,Ge as rr,na as rt,Ni as s,gn as sn,Fe as sr,$r as st,Gi as t,bn as tn,Je as tr,bi as tt,Bi as u,wn as un,Ne as ur,Qr as ut,Ai as v,w as vn,be as vr,Br as vt,vi as w,Zt as wn,ge as wr,jr as wt,pi as x,rn as xn,f as xr,Nr as xt,Ci as y,Kt as yn,ye as yr,Lr as yt,H as z,vt as zn,sr as zt};
@@ -1 +1 @@
1
- import{Hn as e,N as t,Ot as n,P as r,St as i,U as a,hr as o,j as s}from"./SiL1FJ5s.js";import{Cr as c,_ as l,b as u}from"./Cc2bsOcu.js";var d={key:0,id:`placeholder`,class:`view placeholder hw-grid`},f={class:`empty-box`},p={class:`muted`},m=a({__name:`index`,setup(a){return i(()=>{l.value=null}),(i,a)=>(`desk`in i?i.desk:e(u))?(n(),r(`section`,d,[s(`div`,f,[a[0]||=s(`div`,{class:`empty-art`},`>_`,-1),s(`p`,null,o((`t`in i?i.t:e(c))(`Choose an agent from the list`)),1),s(`p`,p,o((`t`in i?i.t:e(c))(`or start a new one.`)),1)])])):t(``,!0)}});export{m as default};
1
+ import{Hn as e,N as t,Ot as n,P as r,St as i,U as a,hr as o,j as s}from"./SiL1FJ5s.js";import{Cr as c,_ as l,b as u}from"./COFCNFpG.js";var d={key:0,id:`placeholder`,class:`view placeholder hw-grid`},f={class:`empty-box`},p={class:`muted`},m=a({__name:`index`,setup(a){return i(()=>{l.value=null}),(i,a)=>(`desk`in i?i.desk:e(u))?(n(),r(`section`,d,[s(`div`,f,[a[0]||=s(`div`,{class:`empty-art`},`>_`,-1),s(`p`,null,o((`t`in i?i.t:e(c))(`Choose an agent from the list`)),1),s(`p`,p,o((`t`in i?i.t:e(c))(`or start a new one.`)),1)])])):t(``,!0)}});export{m as default};
@@ -0,0 +1 @@
1
+ import{A as e,B as t,Et as n,Hn as r,M as i,Mn as a,N as o,Ot as s,P as c,Pt as l,St as u,U as d,V as f,b as p,dr as m,hr as h,j as g,mr as _,nn as v,sn as y,w as ee}from"./SiL1FJ5s.js";import{_t as b,vt as x}from"./CWwyK2XK.js";import{Et as S,Ht as C,Pt as w,Rt as T,Wt as te,_t as ne,ct as re,dt as ie,en as ae,g as oe,in as se,pt as E,qt as ce,v as le,xt as ue,yt as de}from"./BWXdFfeg.js";import{f as fe,p as pe,u as me}from"./Ci8N4mWR.js";import{B as he,C as ge,Cr as D,F as _e,G as O,H as k,I as ve,Ln as A,Sn as ye,T as j,Un as M,V as be,_ as xe,_n as Se,b as N,bn as Ce,gn as we,hn as Te,hr as P,lr as F,mr as I,o as Ee,wt as De,xn as Oe,xt as ke,yn as Ae}from"./COFCNFpG.js";import{L,M as je,N as Me,P as R,V as Ne}from"./DyBZDSCV.js";import{i as Pe,n as Fe,r as Ie,t as Le}from"./8ksjcuDu.js";import{l as z,m as Re,p as B}from"#entry";var V=[`data-pane`],H={class:`plan-cell-head`},U={class:`plan-cell-title`},ze=[`title`],Be={key:0,class:`plan-cell-detail`},W={key:1,class:`plan-cell-line`},G={key:2,class:`plan-cell-choices`},Ve=[`disabled`,`onClick`],He={class:`n`},Ue={class:`l`},We=Object.assign(d({__name:`PlanCell`,props:{pane:{},focused:{type:Boolean},fresh:{type:Boolean}},emits:[`open`],setup(t,{emit:n}){let i=t,u=n,d=a(!1),_=e(()=>i.pane.status===`blocked`&&i.pane.prompt?.options?.length?i.pane.prompt:null),ee=e(()=>z(_.value,3)),C=e(()=>A(i.pane)),T=e(()=>C.value&&M(C.value)||(_.value?_.value.question:i.pane.preview)||(i.pane.agent?``:P(i.pane.cwd)));async function te(e,t){d.value=!0,await S(i.pane.id,e,t)||(d.value=!1)}return v(()=>i.pane.prompt,()=>{d.value=!1}),(e,n)=>{let i=B,a=Re,v=Fe,S=L;return s(),c(`div`,{class:m([`plan-cell`,[(`statusKey`in e?e.statusKey:r(w))(t.pane),{stale:(`paneStale`in e?e.paneStale:r(O))(t.pane),fresh:t.fresh}]]),role:`button`,tabindex:`0`,"data-pane":t.pane.id,onClick:n[0]||=e=>u(`open`),onKeydown:n[1]||=b(x(e=>u(`open`),[`self`]),[`enter`])},[f(v,{items:()=>(`paneItems`in e?e.paneItems:r(E))(t.pane),title:(`paneTitle`in e?e.paneTitle:r(I))(t.pane),"manual-press":``},{default:y(()=>[g(`div`,H,[f(i,{agent:t.pane.agent},null,8,[`agent`]),g(`span`,U,h((`paneTitle`in e?e.paneTitle:r(I))(t.pane)),1),t.focused?(s(),c(`span`,{key:0,class:`plan-cell-focus`,title:(`t`in e?e.t:r(D))(`Active pane in Herdr`)},null,8,ze)):o(``,!0),f(a,{items:()=>(`paneItems`in e?e.paneItems:r(E))(t.pane),title:(`paneTitle`in e?e.paneTitle:r(I))(t.pane),size:`sm`,label:(`t`in e?e.t:r(D))(`Pane options`)},null,8,[`items`,`title`,`label`])])]),_:1},8,[`items`,`title`]),f(S,{pane:t.pane,model:``},null,8,[`pane`]),r(_)?.detail?(s(),c(`code`,Be,h((`detailLine`in e?e.detailLine:r(R))(r(_).detail)),1)):o(``,!0),r(T)?(s(),c(`p`,W,h(r(T)),1)):o(``,!0),r(ee).length?(s(),c(`div`,G,[(s(!0),c(p,null,l(r(ee),n=>(s(),c(`button`,{key:n.i,type:`button`,disabled:r(d)||!(`eventsOpen`in e?e.eventsOpen:r(ge))||(`offlineView`in e?e.offlineView:r(k))||(`paneStale`in e?e.paneStale:r(O))(t.pane),onClick:x(e=>te(n.i,n.label),[`stop`])},[g(`span`,He,h(n.i+1),1),g(`span`,Ue,h(n.label),1)],8,Ve))),128))])):o(``,!0)],42,V)}}}),{__name:`PlanCell`});function Ge(e,t,n,r,i){return e?`open`:t&&n&&(i||r)?`unavailable`:`loading`}var Ke={id:`tabview`,class:`view`},qe={class:`top bar tab-top`},Je={class:`tab-head`},Ye={class:`tab-title`},Xe={class:`tab-meta`},Ze={class:`tab-meta-tab`},Qe={key:0},$e=[`title`],et={class:`machine-inline-name`},tt={key:2,class:`chat-empty`},nt={key:3,class:`chat-empty`},rt=[`onPointerdown`],it=[`aria-orientation`,`aria-label`,`aria-valuenow`,`onPointerdown`,`onKeydown`],at={key:5,class:`plan-wrap`},ot=[`onPointerdown`],st=[`aria-orientation`,`aria-label`,`onPointerdown`],ct=Object.assign(d({__name:`TabView`,props:{tabId:{}},setup(d){let b=d,x=fe(),S=pe();u(()=>{N.value||(xe.value=null)});let w=e(()=>ce(b.tabId)),ge=e(()=>w.value&&De(te(w.value.tab.workspace).length).headerAdd),O=e(()=>w.value?j.value.workspaces.find(e=>e.id===w.value.tab.workspace):void 0),A=e(()=>new Map((w.value?.panes||[]).map(e=>[e.id,e]))),M=a(null),P=e(()=>M.value||w.value?.layout||null),L=e(()=>P.value?Ce(P.value).filter(e=>A.value.has(e.pane)):[]),R=e(()=>!k.value&&de(b.tabId)),z=e(()=>R.value&&P.value?Te(P.value):[]),B=e(()=>he.value&&w.value?_e(w.value.tab.machine):void 0),V=(e,t)=>e||String(t),H=a(!!w.value),U=a(!1),ze=setTimeout(()=>{U.value=!0},4e3);n(()=>clearTimeout(ze)),v(w,e=>{e&&(H.value=!0)});let Be=e(()=>Ge(!!w.value,j.value.ok,j.value.ready!==!1,U.value,H.value)===`unavailable`&&!T(b.tabId)),W=a(null),G=e(()=>String(x.query.pane||``));v([w,G],([e,t],n)=>{if(!e)return;let r=e.panes.map(e=>e.id);if(t&&r.includes(t)&&(t!==n?.[1]||!n?.[0]?.panes.some(e=>e.id===t))){W.value=t;return}W.value&&r.includes(W.value)||(W.value=r.includes(t)?t:e.layout.focused&&r.includes(e.layout.focused)?e.layout.focused:r[0]||null)},{immediate:!0});function Ve(e){W.value!==e&&(W.value=e,S.replace({query:{pane:e}}))}function He(e){let t=N.value&&w.value&&W.value?ke(e):0,n=t?Ae(w.value.layout,W.value,t):null;n&&(e.preventDefault(),e.stopPropagation(),Ve(n))}u(()=>window.addEventListener(`keydown`,He,!0)),n(()=>window.removeEventListener(`keydown`,He,!0));let Ue=()=>[...ue(b.tabId),...le()],ct=e(()=>w.value?`${D(`Tab`)} ${V(w.value.tab.label,w.value.tab.number)}`:void 0),K=a(null),q=a(null),lt={center:`Swap`,left:`Place left`,right:`Place right`,up:`Place above`,down:`Place below`};function ut(e,t){let n=K.value?.getBoundingClientRect();return n&&n.width>0&&n.height>0?{px:(e-n.left)/n.width*100,py:(t-n.top)/n.height*100}:null}function dt(e,t,n){R.value&&(q.value={pane:e,pointer:t.pointerId,touch:t.pointerType!==`mouse`,x0:t.clientX,y0:t.clientY,x:t.clientX,y:t.clientY,started:n,over:null,side:null},window.addEventListener(`pointermove`,ft),window.addEventListener(`pointerup`,pt),window.addEventListener(`pointercancel`,mt),window.addEventListener(`keydown`,ht,!0))}function ft(e){let t=q.value;if(!t||e.pointerId!==t.pointer||(t.x=e.clientX,t.y=e.clientY,!t.started&&Math.hypot(t.x-t.x0,t.y-t.y0)>5&&(t.started=!0),!t.started))return;e.preventDefault();let n=ut(t.x,t.y),r=n&&L.value.find(e=>e.pane!==t.pane&&n.px>=e.left&&n.px<=e.left+e.width&&n.py>=e.top&&n.py<=e.top+e.height),i=r&&n?Se(r,n.px,n.py):null,a=r&&i&&w.value&&we(w.value.layout,t.pane,r.pane,i);((a?r.pane:null)!==t.over||(a?i:null)!==t.side)&&(t.over=a?r.pane:null,t.side=a?i:null)}function J(){q.value=null,window.removeEventListener(`pointermove`,ft),window.removeEventListener(`pointerup`,pt),window.removeEventListener(`pointercancel`,mt),window.removeEventListener(`keydown`,ht,!0)}function pt(e){let t=q.value;if(!t||e.pointerId!==t.pointer)return;let n=A.value.get(t.pane);if(t.touch&&X.suppressClick(),J(),t.touch&&bt&&Math.hypot(t.x-t.x0,t.y-t.y0)<=5)return xt(t.pane);t.started&&n&&t.over&&t.side&&re(n,t.over,t.side)}function mt(e){q.value&&e.pointerId===q.value.pointer&&(q.value.touch&&X.suppressClick(),J())}function ht(e){e.key===`Escape`&&(e.preventDefault(),J())}n(()=>{J(),$()});let Y=e(()=>{let e=q.value,t=e?.started&&e.over&&e.side?L.value.find(t=>t.pane===e.over):null;if(!t||!e?.side)return null;let{left:n,top:r,width:i,height:a}=t,o={left:{width:i/2},right:{left:n+i/2,width:i/2},up:{height:a/2},down:{top:r+a/2,height:a/2},center:{}}[e.side];return{side:e.side,label:D(lt[e.side]),style:Object.fromEntries(Object.entries({left:n,top:r,width:i,height:a,...o}).map(([e,t])=>[e,`${t}%`]))}}),gt=e(()=>{let e=q.value,t=e?.started?A.value.get(e.pane):null;if(!t||!e)return null;let n=Math.max(4,Math.min(e.touch?e.x-20:e.x+12,window.innerWidth-250)),r=Math.max(4,e.touch?e.y-56:e.y+14);return{title:I(t),style:{transform:`translate(${n}px, ${r}px)`}}});function _t(e,t){t.button===0&&t.target?.closest?.(`.cell-grip`)&&(t.preventDefault(),dt(e,t,!1))}let vt=null,yt=``,bt=!1;function xt(e){let t=A.value.get(e);t&&(F(),oe(E(t),I(t)))}let X=Me({onPress:()=>{if(vt){if(!R.value)return bt?xt(yt):void 0;F(),dt(yt,vt,!0)}}});function St(e,t){vt=t,yt=e,bt=!!t.target?.closest?.(`.plan-cell-head`)&&!Ie(t.target),X.down(t)}function Ct(e){X.move(e)}let Z=null,Q=a(null);function wt(e,t){if(t.button!==0||!w.value)return;t.preventDefault(),t.stopPropagation();let n=t.currentTarget;n.setPointerCapture?.(t.pointerId),Z={d:e,pointer:t.pointerId,ratio:e.ratio,el:n},Q.value=e.path,n.addEventListener(`pointermove`,Tt),n.addEventListener(`pointerup`,Et),n.addEventListener(`pointercancel`,$)}function Tt(e){let t=Z,n=ut(e.clientX,e.clientY);t&&e.pointerId===t.pointer&&n&&w.value&&(t.ratio=Oe(w.value.layout,t.d,t.d.direction===`right`?n.px:n.py),M.value=ye(w.value.layout,t.d.path,t.ratio))}function Et(e){let t=Z;t&&e.pointerId===t.pointer&&($(),Math.abs(t.ratio-t.d.ratio)>=.005&&ne(b.tabId,t.d.path,t.ratio))}function $(){let e=Z;Z=null,Q.value=null,M.value=null,e&&(e.el.removeEventListener(`pointermove`,Tt),e.el.removeEventListener(`pointerup`,Et),e.el.removeEventListener(`pointercancel`,$))}function Dt(e,t){let n={ArrowLeft:-1,ArrowUp:-1,ArrowRight:1,ArrowDown:1}[t.key];if(!n||!w.value||e.direction===`right`!=(t.key===`ArrowLeft`||t.key===`ArrowRight`))return;t.preventDefault();let r=Oe(w.value.layout,e,e.start+e.size*(e.ratio+n*.05));r!==e.ratio&&ne(b.tabId,e.path,r)}let Ot=e=>e.direction===`right`?{left:`${e.at}%`,top:`${e.from}%`,height:`${e.span}%`}:{top:`${e.at}%`,left:`${e.from}%`,width:`${e.span}%`};function kt(e){X.swallowClick()||(F(),me(C(e)))}return(e,n)=>{let a=Pe,u=ae,v=se,b=je,x=Re,S=Fe,C=Ne,T=Le,te=We;return s(),c(`section`,Ke,[r(w)?(s(),i(a,{key:0,workspace:r(w).tab.workspace,current:d.tabId},null,8,[`workspace`,`current`])):o(``,!0),f(S,{items:Ue,title:r(ct),disabled:!r(w)},{default:y(()=>[g(`header`,qe,[f(u,{icon:`i-lucide-chevron-left`,color:`neutral`,variant:`ghost`,size:`lg`,class:`icon-btn back tab-back`,"aria-label":(`t`in e?e.t:r(D))(`Back`),to:`/`},null,8,[`aria-label`]),g(`div`,Je,[g(`div`,Ye,[r(O)?.worktree?(s(),i(v,{key:0,name:`i-lucide-git-branch`,class:`tab-title-branch`})):o(``,!0),t(h(r(O)?.label||`—`),1)]),g(`div`,Xe,[g(`span`,Ze,h((`t`in e?e.t:r(D))(`Tab`))+` `+h(r(w)?V(r(w).tab.label,r(w).tab.number):``),1),r(w)?(s(),c(`span`,Qe,h(`${r(w).panes.length} pane${r(w).panes.length>1?`s`:``}`),1)):o(``,!0),r(w)?.layout.zoomed?(s(),c(`span`,{key:1,class:`tab-meta-zoom`,title:(`t`in e?e.t:r(D))(`A pane is zoomed in Herdr`)},`zoom`,8,$e)):o(``,!0),r(B)?(s(),c(`span`,{key:2,class:m([`tab-meta-machine`,r(B).status])},[f(v,{name:r(B).local?`i-lucide-server`:`i-lucide-laptop`},null,8,[`name`]),g(`span`,et,h((`machineName`in e?e.machineName:r(ve))(r(B).key)),1),r(B).local?(s(),i(b,{key:0})):o(``,!0)],2)):o(``,!0)])]),r(ge)&&r(w)?(s(),i(u,{key:0,icon:`i-lucide-plus`,color:`neutral`,variant:`ghost`,size:`lg`,class:`icon-btn`,"aria-label":(`t`in e?e.t:r(D))(`New tab`),title:(`t`in e?e.t:r(D))(`New tab`),disabled:`offlineView`in e?e.offlineView:r(k),onClick:n[0]||=t=>(`newTab`in e?e.newTab:r(ie))(r(w).tab.workspace)},null,8,[`aria-label`,`title`,`disabled`])):o(``,!0),r(w)?(s(),i(x,{key:1,items:Ue,size:`lg`,title:r(ct),label:(`t`in e?e.t:r(D))(`Tab options`)},null,8,[`title`,`label`])):o(``,!0)])]),_:1},8,[`title`,`disabled`]),!(`desk`in e?e.desk:r(N))&&((`netDown`in e?e.netDown:r(be))||(`offlineView`in e?e.offlineView:r(k)))?(s(),i(C,{key:1,label:(`offlineView`in e?e.offlineView:r(k))?(`t`in e?e.t:r(D))(`Last known state`):void 0,at:`cachedAt`in e?e.cachedAt:r(Ee)},null,8,[`label`,`at`])):o(``,!0),r(Be)?(s(),c(`div`,tt,[f(v,{name:`i-lucide-layout-panel-left`,class:`chat-empty-icon`}),g(`p`,null,h((`t`in e?e.t:r(D))(`This tab is unavailable.`)),1),f(u,{color:`neutral`,variant:`outline`,to:`/`},{default:y(()=>[t(h((`t`in e?e.t:r(D))(`Back`)),1)]),_:1})])):r(w)?r(w)&&(`desk`in e?e.desk:r(N))?(s(),c(`div`,{key:4,ref_key:`area`,ref:K,class:m([`split`,{dragging:r(q)?.started,resizing:r(Q)!=null}])},[(s(!0),c(p,null,l(r(L),e=>(s(),c(`div`,{key:e.pane,class:m([`split-box`,{"drag-src":r(q)?.started&&r(q).pane===e.pane}]),style:_({left:`${e.left}%`,top:`${e.top}%`,width:`${e.width}%`,height:`${e.height}%`}),onPointerdown:t=>_t(e.pane,t)},[f(T,{cell:``,grip:r(R),"pane-id":e.pane,active:e.pane===r(W),onActivate:t=>Ve(e.pane)},null,8,[`grip`,`pane-id`,`active`,`onActivate`])],46,rt))),128)),r(Y)?(s(),c(`div`,{key:0,class:m([`drop-zone`,r(Y).side]),style:_(r(Y).style)},[g(`span`,null,h(r(Y).label),1)],6)):o(``,!0),(s(!0),c(p,null,l(r(z),t=>(s(),c(`div`,{key:t.path,class:m([`divider`,[t.direction,{on:r(Q)===t.path}]]),style:_(Ot(t)),role:`separator`,tabindex:`0`,"aria-orientation":t.direction===`right`?`vertical`:`horizontal`,"aria-label":(`t`in e?e.t:r(D))(`Resize`),"aria-valuenow":Math.round(t.ratio*100),"aria-valuemin":`5`,"aria-valuemax":`95`,onPointerdown:e=>wt(t,e),onKeydown:e=>Dt(t,e)},null,46,it))),128))],2)):r(w)?(s(),c(`div`,at,[g(`div`,{ref_key:`area`,ref:K,class:m([`plan`,{dragging:r(q)?.started,resizing:r(Q)!=null,movable:r(R)}])},[(s(!0),c(p,null,l(r(L),e=>(s(),c(`div`,{key:e.pane,class:m([`plan-box`,{"drag-src":r(q)?.started&&r(q).pane===e.pane}]),style:_({left:`${e.left}%`,top:`${e.top}%`,width:`${e.width}%`,height:`${e.height}%`}),onPointerdown:t=>St(e.pane,t),onPointermove:Ct,onPointerup:n[1]||=(...e)=>r(X).cancel&&r(X).cancel(...e),onPointercancel:n[2]||=(...e)=>r(X).cancel&&r(X).cancel(...e)},[f(te,{pane:r(A).get(e.pane),focused:r(w).layout.focused===e.pane&&r(L).length>1,fresh:r(G)===e.pane,onOpen:t=>kt(e.pane)},null,8,[`pane`,`focused`,`fresh`,`onOpen`])],46,ot))),128)),r(Y)?(s(),c(`div`,{key:0,class:m([`drop-zone`,r(Y).side]),style:_(r(Y).style)},[g(`span`,null,h(r(Y).label),1)],6)):o(``,!0),(s(!0),c(p,null,l(r(z),t=>(s(),c(`div`,{key:t.path,class:m([`divider`,[t.direction,{on:r(Q)===t.path}]]),style:_(Ot(t)),role:`separator`,"aria-orientation":t.direction===`right`?`vertical`:`horizontal`,"aria-label":(`t`in e?e.t:r(D))(`Resize`),onPointerdown:e=>wt(t,e)},null,46,st))),128))],2)])):o(``,!0):(s(),c(`div`,nt,h((`t`in e?e.t:r(D))(`Loading…`)),1)),(s(),i(ee,{to:`body`},[r(gt)?(s(),c(`div`,{key:0,class:`drag-ghost`,style:_(r(gt).style)},h(r(gt).title),5)):o(``,!0)]))])}}}),{__name:`TabView`}),K=d({__name:`[tab]`,setup(t){let n=fe(),a=e(()=>String(n.params.tab||``));return(e,t)=>{let n=ct;return s(),i(n,{key:r(a),"tab-id":r(a)},null,8,[`tab-id`])}}});export{K as default};
@@ -1,4 +1,4 @@
1
- import{A as e,Et as t,Ft as n,Hn as r,M as i,Mn as a,Ot as o,P as s,St as c,U as l,V as u,dr as d,ht as f,nn as p,sn as ee,vt as te}from"./SiL1FJ5s.js";import{An as m,In as h,Mn as ne,On as re,Rn as g,Sn as _,c as v,kn as ie}from"./DcCZr0Ya.js";import{Bt as ae,Cr as y,Ht as b,Jt as oe,Kt as se,Vt as ce,Wt as le,Yt as ue,_t as de,mt as fe,n as pe,qt as me,t as he,wr as ge,x as _e}from"./Cc2bsOcu.js";var ve=l({__name:`RovingFocusItem`,props:{tabStopId:{type:String,required:!1},focusable:{type:Boolean,required:!1,default:!0},active:{type:Boolean,required:!1},allowShiftKey:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(a){let s=a,l=_(),d=g(),te=e(()=>s.tabStopId||d),v=e(()=>l.currentTabStopId.value===te.value),{getItems:ae,CollectionItem:y}=ne();c(()=>{s.focusable&&l.onFocusableItemAdd()}),t(()=>{s.focusable&&l.onFocusableItemRemove()}),p(()=>s.focusable,(e,t)=>{e!==t&&(e?l.onFocusableItemAdd():l.onFocusableItemRemove())});function b(e){if(e.key===`Tab`&&e.shiftKey){l.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=ie(e,l.orientation.value,l.dir.value);if(t!==void 0){if(e.metaKey||e.ctrlKey||e.altKey||!s.allowShiftKey&&e.shiftKey)return;e.preventDefault();let n=[...ae().map(e=>e.ref).filter(e=>e.dataset.disabled!==``)];if(t===`last`)n.reverse();else if(t===`prev`||t===`next`){t===`prev`&&n.reverse();let r=n.indexOf(e.currentTarget);n=l.loop.value?m(n,r+1):n.slice(r+1)}f(()=>re(n))}}return(e,t)=>(o(),i(r(y),null,{default:ee(()=>[u(r(h),{tabindex:v.value?0:-1,"data-orientation":r(l).orientation.value,"data-active":e.active?``:void 0,"data-disabled":e.focusable?void 0:``,as:e.as,"as-child":e.asChild,onMousedown:t[0]||=t=>{e.focusable?r(l).onItemFocus(te.value):t.preventDefault()},onFocus:t[1]||=e=>r(l).onItemFocus(te.value),onKeydown:b},{default:ee(()=>[n(e.$slots,`default`)]),_:3},8,[`tabindex`,`data-orientation`,`data-active`,`data-disabled`,`as`,`as-child`])]),_:3}))}}),x=[`innerHTML`],ye=Object.assign(l({__name:`ChatMarkdown`,props:{html:{},typing:{},speed:{default:void 0},cipher:{type:Boolean,default:void 0}},emits:[`done`],setup(e,{emit:t}){let n=e,r=t,i=a(null),l=null,u=0,f=e=>e.classList?.contains(`code-head`),ee=e=>/^T[DH]$/.test(e.tagName||``),m=[],h=``,ne=0;function re(){for(let e of m)e.box.remove();m=[],h=``}function g(e,t,n,r){let i=`${t}:${n}`;if(i!==h){re(),h=i;for(let r of ce(e,t,n)){let e=r.node;if(!e.parentNode)continue;let t=document.createElement(`span`);t.className=`tw-trail`,t.setAttribute(`aria-hidden`,`true`);let n=[],i=me(r.text);Array.from(r.text).forEach((e,r)=>{if(/\s/.test(e))return t.append(e);let a=document.createElement(`span`);a.textContent=e,a.setAttribute(`data-g`,i[r]),n.push(a),t.append(a)}),e.parentNode.insertBefore(t,e.nextSibling),m.push({box:t,cells:n})}m.at(-1)?.cells.at(-1)?.classList.add(`tw-front`),ne=r}else if(r-ne>=60){ne=r;for(let e of m){let t=me(e.cells.map(e=>e.textContent||``).join(``));e.cells.forEach((e,n)=>e.setAttribute(`data-g`,t[n]))}}}function _(){cancelAnimationFrame(u),u=0,re(),l&&b(l),l=null}function v(e){if(_(),!i.value)return;l=le(i.value,{atomic:f,keep:ee});let t=l,a=n.speed??de.value,o=oe(t.total,a),s=n.cipher??_e.value,c=()=>{if(l!==t)return;let n=Date.now()-e,i=s?ue(t.total,n,a):null,d=i?.written??se(t.stops,n,o),f=i?.decrypted??d;ae(t,f,s,d),s&&g(t,f,d,performance.now()),i?.done||!s&&n>=o?(_(),r(`done`)):u=requestAnimationFrame(c)};c()}function ie(){l&&(_(),r(`done`))}return c(()=>{n.typing!==null&&v(n.typing)}),p(()=>n.typing,e=>{e===null?_():v(e)}),p(()=>n.html,()=>{l&&(cancelAnimationFrame(u),re(),l=null,r(`done`))},{flush:`pre`}),te(()=>{cancelAnimationFrame(u),re(),l=null}),(t,n)=>(o(),s(`div`,{ref_key:`el`,ref:i,class:d([`md-body`,{typing:e.typing!==null}]),onClickCapture:ie,innerHTML:e.html},null,42,x))}}),{__name:`ChatMarkdown`}),be=new Set(`ts.tsx.js.jsx.mjs.cjs.vue.svelte.json.jsonl.md.mdx.txt.html.htm.css.scss.less.py.rb.rs.go.java.kt.swift.c.h.cpp.hpp.cs.php.sh.bash.zsh.fish.yml.yaml.toml.ini.conf.cfg.lock.xml.svg.csv.tsv.sql.pdf.png.jpg.jpeg.gif.webp.mp4.mov.zip.gz.tgz.docx.xlsx.pptx.ipynb.dockerfile.patch.diff`.split(`.`)),xe=new Set([`Dockerfile`,`Makefile`,`LICENSE`,`Gemfile`,`Procfile`,`Justfile`,`.env`,`.gitignore`]),Se=/[\0\n\r\t`"<>|*?$;&{}[\]()\\]|:\/\//,Ce=/:\d+(?::\d+)?$/,we=/^[\w@+~.,=%#-]+$/,Te=e=>e.replace(Ce,``);function Ee(e){let t=String(e||``).trim();if(t.length<2||t.length>1024||Se.test(t))return null;let n=Te(t);if(n.length<2||n.startsWith(`-`))return null;let r=n.startsWith(`/`)||n.startsWith(`~/`);if(/\s/.test(n)&&!r||/\s{2,}|^\S+\s+-/.test(n))return null;let i=n.replace(/^~\//,``).replace(/^\/+/,``).split(`/`),a=i.filter((e,t)=>e!==``||t!==i.length-1);if(!a.length||a.some(e=>e===``||!we.test(e.replace(/ /g,`_`))))return null;if(r)return n.startsWith(`/`)&&a.length===1&&!/\.\w+$/.test(a[0])?null:n;if(n.startsWith(`./`)||n.startsWith(`../`))return n;let o=a[a.length-1],s=/\.([A-Za-z0-9]{1,10})$/.exec(o)?.[1]?.toLowerCase(),c=xe.has(o)||!!(s&&be.has(s));return a.length===1?c&&!/^\d/.test(o)?n:null:(c||n.endsWith(`/`)||a.length>=3)&&a.every(e=>/[A-Za-z_]/.test(e))?n:null}var De=new Set(`git.gh.npm.npx.pnpm.yarn.bun.node.deno.python.python3.pip.uv.cargo.go.make.docker.kubectl.cd.ls.cat.grep.rg.find.sed.awk.curl.wget.ssh.scp.rsync.tar.chmod.chown.mkdir.rm.mv.cp.echo.export.sudo.brew.apt.apk.systemctl.journalctl.flock.tmux.herdr.claude.codex.omp.vitest.jest.tsc.eslint.prettier.nuxt.vite.swift.xcodebuild.open.kill.ps.top.du.df.free.uptime.touch.head.tail.jq.env.source.bash.sh.zsh`.split(`.`)),S=`ctrl|control|cmd|command|alt|option|opt|shift|meta|super|fn`,Oe=RegExp(`^(?:${S})(?:[+-](?:${S}|esc|escape|enter|return|tab|space|backspace|delete|del|home|end|pgup|pgdn|up|down|left|right|f\\d{1,2}|.))+$|^[⌘⌃⌥⇧]+\\S{0,2}$|^[↵⏎⇥⌫⎋↑↓←→]$`,`i`),C=/^(?:Esc|Escape|Enter|Return|Tab|Space|Backspace|Delete|Home|End|PgUp|PgDn|F\d{1,2}|ESC|ENTER|TAB)$/,ke=`ms|µs|ns|s|sec|min|h|d|%|x|×|k|m|kb|ko|mb|mo|gb|go|tb|b|px|em|rem|lines|tests|files`,w=RegExp(`^[~≈<>+−-]?\\d[\\d_.,]*\\s?(?:${ke})?(?:\\s\\d[\\d.,]*\\s?(?:${ke}))*$`,`i`);function T(e){let t=String(e||``).trim();if(!t||t.length>400)return null;if(/^(?:exit|code|status)\s+0$|^(?:ok|pass(?:ed)?|✓)$/i.test(t))return`ok`;if(/^(?:exit|code|status)\s+[1-9]\d*$|^(?:fail(?:ed)?|error|✗)$/i.test(t)||/^(?:E[A-Z]{3,}|SIG[A-Z]+)$/.test(t))return`err`;if(Oe.test(t)||C.test(t))return`key`;if(/^t-\d{3,}$|^[A-Z][A-Z0-9]+-\d+$|^(?=[0-9a-f]*[a-f])(?=[0-9a-f]*\d)[0-9a-f]{7,40}$/.test(t))return`id`;if(w.test(t))return`num`;if(Ee(t))return`path`;if(/^[$!❯]\s|^\/[a-z][\w-]*(?:\s|$)/.test(t))return`cmd`;let n=t.split(/\s+/)[0];return De.has(n)&&/\s/.test(t)||/\s--?[a-z]/.test(t)&&/^[a-z][\w.-]*\s/.test(t)?`cmd`:null}var Ae={bash:!0,sh:!0,zsh:!0,shell:!0,console:!0,shellsession:!0},E=/^\s*(?:!(?=\s*[^\s=])\s*|\$\s+|❯\s+)/;function je(e){let t=e.some(e=>E.test(e)),n=[],r=!1;for(let i of e){if(!t||r)n.push(i);else if(E.test(i))n.push(i.replace(E,``));else continue;r=t&&/\\\s*$/.test(i)}let i=n.join(`
1
+ import{A as e,Et as t,Ft as n,Hn as r,M as i,Mn as a,Ot as o,P as s,St as c,U as l,V as u,dr as d,ht as f,nn as p,sn as ee,vt as te}from"./SiL1FJ5s.js";import{Dn as m,Fn as h,Ln as ne,On as re,jn as g,kn as _,s as v,xn as ie}from"./BWXdFfeg.js";import{Bt as ae,Cr as y,Ht as b,Jt as oe,Kt as se,Vt as ce,Wt as le,Yt as ue,_t as de,mt as fe,n as pe,qt as me,t as he,wr as ge,x as _e}from"./COFCNFpG.js";var ve=l({__name:`RovingFocusItem`,props:{tabStopId:{type:String,required:!1},focusable:{type:Boolean,required:!1,default:!0},active:{type:Boolean,required:!1},allowShiftKey:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(a){let s=a,l=ie(),d=ne(),te=e(()=>s.tabStopId||d),v=e(()=>l.currentTabStopId.value===te.value),{getItems:ae,CollectionItem:y}=g();c(()=>{s.focusable&&l.onFocusableItemAdd()}),t(()=>{s.focusable&&l.onFocusableItemRemove()}),p(()=>s.focusable,(e,t)=>{e!==t&&(e?l.onFocusableItemAdd():l.onFocusableItemRemove())});function b(e){if(e.key===`Tab`&&e.shiftKey){l.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=re(e,l.orientation.value,l.dir.value);if(t!==void 0){if(e.metaKey||e.ctrlKey||e.altKey||!s.allowShiftKey&&e.shiftKey)return;e.preventDefault();let n=[...ae().map(e=>e.ref).filter(e=>e.dataset.disabled!==``)];if(t===`last`)n.reverse();else if(t===`prev`||t===`next`){t===`prev`&&n.reverse();let r=n.indexOf(e.currentTarget);n=l.loop.value?_(n,r+1):n.slice(r+1)}f(()=>m(n))}}return(e,t)=>(o(),i(r(y),null,{default:ee(()=>[u(r(h),{tabindex:v.value?0:-1,"data-orientation":r(l).orientation.value,"data-active":e.active?``:void 0,"data-disabled":e.focusable?void 0:``,as:e.as,"as-child":e.asChild,onMousedown:t[0]||=t=>{e.focusable?r(l).onItemFocus(te.value):t.preventDefault()},onFocus:t[1]||=e=>r(l).onItemFocus(te.value),onKeydown:b},{default:ee(()=>[n(e.$slots,`default`)]),_:3},8,[`tabindex`,`data-orientation`,`data-active`,`data-disabled`,`as`,`as-child`])]),_:3}))}}),x=[`innerHTML`],ye=Object.assign(l({__name:`ChatMarkdown`,props:{html:{},typing:{},speed:{default:void 0},cipher:{type:Boolean,default:void 0}},emits:[`done`],setup(e,{emit:t}){let n=e,r=t,i=a(null),l=null,u=0,f=e=>e.classList?.contains(`code-head`),ee=e=>/^T[DH]$/.test(e.tagName||``),m=[],h=``,ne=0;function re(){for(let e of m)e.box.remove();m=[],h=``}function g(e,t,n,r){let i=`${t}:${n}`;if(i!==h){re(),h=i;for(let r of ce(e,t,n)){let e=r.node;if(!e.parentNode)continue;let t=document.createElement(`span`);t.className=`tw-trail`,t.setAttribute(`aria-hidden`,`true`);let n=[],i=me(r.text);Array.from(r.text).forEach((e,r)=>{if(/\s/.test(e))return t.append(e);let a=document.createElement(`span`);a.textContent=e,a.setAttribute(`data-g`,i[r]),n.push(a),t.append(a)}),e.parentNode.insertBefore(t,e.nextSibling),m.push({box:t,cells:n})}m.at(-1)?.cells.at(-1)?.classList.add(`tw-front`),ne=r}else if(r-ne>=60){ne=r;for(let e of m){let t=me(e.cells.map(e=>e.textContent||``).join(``));e.cells.forEach((e,n)=>e.setAttribute(`data-g`,t[n]))}}}function _(){cancelAnimationFrame(u),u=0,re(),l&&b(l),l=null}function v(e){if(_(),!i.value)return;l=le(i.value,{atomic:f,keep:ee});let t=l,a=n.speed??de.value,o=oe(t.total,a),s=n.cipher??_e.value,c=()=>{if(l!==t)return;let n=Date.now()-e,i=s?ue(t.total,n,a):null,d=i?.written??se(t.stops,n,o),f=i?.decrypted??d;ae(t,f,s,d),s&&g(t,f,d,performance.now()),i?.done||!s&&n>=o?(_(),r(`done`)):u=requestAnimationFrame(c)};c()}function ie(){l&&(_(),r(`done`))}return c(()=>{n.typing!==null&&v(n.typing)}),p(()=>n.typing,e=>{e===null?_():v(e)}),p(()=>n.html,()=>{l&&(cancelAnimationFrame(u),re(),l=null,r(`done`))},{flush:`pre`}),te(()=>{cancelAnimationFrame(u),re(),l=null}),(t,n)=>(o(),s(`div`,{ref_key:`el`,ref:i,class:d([`md-body`,{typing:e.typing!==null}]),onClickCapture:ie,innerHTML:e.html},null,42,x))}}),{__name:`ChatMarkdown`}),be=new Set(`ts.tsx.js.jsx.mjs.cjs.vue.svelte.json.jsonl.md.mdx.txt.html.htm.css.scss.less.py.rb.rs.go.java.kt.swift.c.h.cpp.hpp.cs.php.sh.bash.zsh.fish.yml.yaml.toml.ini.conf.cfg.lock.xml.svg.csv.tsv.sql.pdf.png.jpg.jpeg.gif.webp.mp4.mov.zip.gz.tgz.docx.xlsx.pptx.ipynb.dockerfile.patch.diff`.split(`.`)),xe=new Set([`Dockerfile`,`Makefile`,`LICENSE`,`Gemfile`,`Procfile`,`Justfile`,`.env`,`.gitignore`]),Se=/[\0\n\r\t`"<>|*?$;&{}[\]()\\]|:\/\//,Ce=/:\d+(?::\d+)?$/,we=/^[\w@+~.,=%#-]+$/,Te=e=>e.replace(Ce,``);function Ee(e){let t=String(e||``).trim();if(t.length<2||t.length>1024||Se.test(t))return null;let n=Te(t);if(n.length<2||n.startsWith(`-`))return null;let r=n.startsWith(`/`)||n.startsWith(`~/`);if(/\s/.test(n)&&!r||/\s{2,}|^\S+\s+-/.test(n))return null;let i=n.replace(/^~\//,``).replace(/^\/+/,``).split(`/`),a=i.filter((e,t)=>e!==``||t!==i.length-1);if(!a.length||a.some(e=>e===``||!we.test(e.replace(/ /g,`_`))))return null;if(r)return n.startsWith(`/`)&&a.length===1&&!/\.\w+$/.test(a[0])?null:n;if(n.startsWith(`./`)||n.startsWith(`../`))return n;let o=a[a.length-1],s=/\.([A-Za-z0-9]{1,10})$/.exec(o)?.[1]?.toLowerCase(),c=xe.has(o)||!!(s&&be.has(s));return a.length===1?c&&!/^\d/.test(o)?n:null:(c||n.endsWith(`/`)||a.length>=3)&&a.every(e=>/[A-Za-z_]/.test(e))?n:null}var De=new Set(`git.gh.npm.npx.pnpm.yarn.bun.node.deno.python.python3.pip.uv.cargo.go.make.docker.kubectl.cd.ls.cat.grep.rg.find.sed.awk.curl.wget.ssh.scp.rsync.tar.chmod.chown.mkdir.rm.mv.cp.echo.export.sudo.brew.apt.apk.systemctl.journalctl.flock.tmux.herdr.claude.codex.omp.vitest.jest.tsc.eslint.prettier.nuxt.vite.swift.xcodebuild.open.kill.ps.top.du.df.free.uptime.touch.head.tail.jq.env.source.bash.sh.zsh`.split(`.`)),S=`ctrl|control|cmd|command|alt|option|opt|shift|meta|super|fn`,Oe=RegExp(`^(?:${S})(?:[+-](?:${S}|esc|escape|enter|return|tab|space|backspace|delete|del|home|end|pgup|pgdn|up|down|left|right|f\\d{1,2}|.))+$|^[⌘⌃⌥⇧]+\\S{0,2}$|^[↵⏎⇥⌫⎋↑↓←→]$`,`i`),C=/^(?:Esc|Escape|Enter|Return|Tab|Space|Backspace|Delete|Home|End|PgUp|PgDn|F\d{1,2}|ESC|ENTER|TAB)$/,ke=`ms|µs|ns|s|sec|min|h|d|%|x|×|k|m|kb|ko|mb|mo|gb|go|tb|b|px|em|rem|lines|tests|files`,w=RegExp(`^[~≈<>+−-]?\\d[\\d_.,]*\\s?(?:${ke})?(?:\\s\\d[\\d.,]*\\s?(?:${ke}))*$`,`i`);function T(e){let t=String(e||``).trim();if(!t||t.length>400)return null;if(/^(?:exit|code|status)\s+0$|^(?:ok|pass(?:ed)?|✓)$/i.test(t))return`ok`;if(/^(?:exit|code|status)\s+[1-9]\d*$|^(?:fail(?:ed)?|error|✗)$/i.test(t)||/^(?:E[A-Z]{3,}|SIG[A-Z]+)$/.test(t))return`err`;if(Oe.test(t)||C.test(t))return`key`;if(/^t-\d{3,}$|^[A-Z][A-Z0-9]+-\d+$|^(?=[0-9a-f]*[a-f])(?=[0-9a-f]*\d)[0-9a-f]{7,40}$/.test(t))return`id`;if(w.test(t))return`num`;if(Ee(t))return`path`;if(/^[$!❯]\s|^\/[a-z][\w-]*(?:\s|$)/.test(t))return`cmd`;let n=t.split(/\s+/)[0];return De.has(n)&&/\s/.test(t)||/\s--?[a-z]/.test(t)&&/^[a-z][\w.-]*\s/.test(t)?`cmd`:null}var Ae={bash:!0,sh:!0,zsh:!0,shell:!0,console:!0,shellsession:!0},E=/^\s*(?:!(?=\s*[^\s=])\s*|\$\s+|❯\s+)/;function je(e){let t=e.some(e=>E.test(e)),n=[],r=!1;for(let i of e){if(!t||r)n.push(i);else if(E.test(i))n.push(i.replace(E,``));else continue;r=t&&/\\\s*$/.test(i)}let i=n.join(`
2
2
  `).replace(/^\s*\n|\s+$/g,``);return i.trim()?i:null}function Me(e,t){let n=String(t||``).trim().split(/\s/)[0].toLowerCase(),r=String(e||``).split(`
3
3
  `);if(Ae[n])return je(r);if(n)return null;let i=je(r);if(!i)return null;if(r.some(e=>E.test(e)))return i;let a=i.replace(/\\\s*\n/g,` `).split(`
4
4
  `).map(e=>e.trim()).filter(e=>e&&!e.startsWith(`#`));return a.length&&a.every(e=>T(e)===`cmd`&&!e.startsWith(`/`))?i:null}function Ne(e){let t=String(e||``).trim();if(!t||t.includes(`
@@ -59,7 +59,7 @@ ${e}</tr>
59
59
  `+this.renderer.text(i);n+=t?this.renderer.paragraph({type:`paragraph`,raw:o,text:o,tokens:[{type:`text`,raw:o,text:o,escaped:!0}]}):o;continue}default:{let e=`Token with "`+a.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return n}parseInline(e,t=this.renderer){let n=``;for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let e=this.options.extensions.renderers[i.type].call({parser:this},i);if(e!==!1||![`escape`,`html`,`link`,`image`,`strong`,`em`,`codespan`,`br`,`del`,`text`].includes(i.type)){n+=e||``;continue}}let a=i;switch(a.type){case`escape`:n+=t.text(a);break;case`html`:n+=t.html(a);break;case`link`:n+=t.link(a);break;case`image`:n+=t.image(a);break;case`strong`:n+=t.strong(a);break;case`em`:n+=t.em(a);break;case`codespan`:n+=t.codespan(a);break;case`br`:n+=t.br(a);break;case`del`:n+=t.del(a);break;case`text`:n+=t.text(a);break;default:{let e=`Token with "`+a.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return n}},Ut=class{options;block;constructor(e){this.options=e||k}static passThroughHooks=new Set([`preprocess`,`postprocess`,`processAllTokens`]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}provideLexer(){return this.block?B.lex:B.lexInline}provideParser(){return this.block?V.parse:V.parseInline}},Wt=new class{defaults=O();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=V;Renderer=Vt;TextRenderer=Ht;Lexer=B;Tokenizer=Bt;Hooks=Ut;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case`table`:{let e=r;for(let r of e.header)n=n.concat(this.walkTokens(r.tokens,t));for(let r of e.rows)for(let e of r)n=n.concat(this.walkTokens(e.tokens,t));break}case`list`:{let e=r;n=n.concat(this.walkTokens(e.items,t));break}default:{let e=r;this.defaults.extensions?.childTokens?.[e.type]?this.defaults.extensions.childTokens[e.type].forEach(r=>{let i=e[r].flat(1/0);n=n.concat(this.walkTokens(i,t))}):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach(e=>{if(!e.name)throw Error(`extension name required`);if(`renderer`in e){let n=t.renderers[e.name];n?t.renderers[e.name]=function(...t){let r=e.renderer.apply(this,t);return r===!1&&(r=n.apply(this,t)),r}:t.renderers[e.name]=e.renderer}if(`tokenizer`in e){if(!e.level||e.level!==`block`&&e.level!==`inline`)throw Error(`extension level must be 'block' or 'inline'`);let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&(e.level===`block`?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:e.level===`inline`&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}`childTokens`in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)}),n.extensions=t),e.renderer){let t=this.defaults.renderer||new Vt(this.defaults);for(let n in e.renderer){if(!(n in t))throw Error(`renderer '${n}' does not exist`);if([`options`,`parser`].includes(n))continue;let r=n,i=e.renderer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n||``}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new Bt(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw Error(`tokenizer '${n}' does not exist`);if([`options`,`rules`,`lexer`].includes(n))continue;let r=n,i=e.tokenizer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new Ut;for(let n in e.hooks){if(!(n in t))throw Error(`hook '${n}' does not exist`);if([`options`,`block`].includes(n))continue;let r=n,i=e.hooks[r],a=t[r];t[r]=Ut.passThroughHooks.has(n)?e=>{if(this.defaults.async)return Promise.resolve(i.call(t,e)).then(e=>a.call(t,e));let n=i.call(t,e);return a.call(t,n)}:(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return B.lex(e,t??this.defaults)}parser(e,t){return V.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},i={...this.defaults,...r},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return a(Error(`marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.`));if(t==null)return a(Error(`marked(): input parameter is undefined or null`));if(typeof t!=`string`)return a(Error(`marked(): input parameter is of type `+Object.prototype.toString.call(t)+`, string expected`));i.hooks&&(i.hooks.options=i,i.hooks.block=e);let o=i.hooks?i.hooks.provideLexer():e?B.lex:B.lexInline,s=i.hooks?i.hooks.provideParser():e?V.parse:V.parseInline;if(i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(t):t).then(e=>o(e,i)).then(e=>i.hooks?i.hooks.processAllTokens(e):e).then(e=>i.walkTokens?Promise.all(this.walkTokens(e,i.walkTokens)).then(()=>e):e).then(e=>s(e,i)).then(e=>i.hooks?i.hooks.postprocess(e):e).catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let e=o(t,i);i.hooks&&(e=i.hooks.processAllTokens(e)),i.walkTokens&&this.walkTokens(e,i.walkTokens);let n=s(e,i);return i.hooks&&(n=i.hooks.postprocess(n)),n}catch(e){return a(e)}}}onError(e,t){return n=>{if(n.message+=`
60
60
  Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+z(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function H(e,t){return Wt.parse(e,t)}H.options=H.setOptions=function(e){return Wt.setOptions(e),H.defaults=Wt.defaults,Ie(H.defaults),H},H.getDefaults=O,H.defaults=k,H.use=function(...e){return Wt.use(...e),H.defaults=Wt.defaults,Ie(H.defaults),H},H.walkTokens=function(e,t){return Wt.walkTokens(e,t)},H.parseInline=Wt.parseInline,H.Parser=V,H.parser=V.parse,H.Renderer=Vt,H.TextRenderer=Ht,H.Lexer=B,H.lexer=B.lex,H.Tokenizer=Bt,H.Hooks=Ut,H.parse=H,H.options,H.setOptions,H.use,H.walkTokens,H.parseInline,V.parse,B.lex;function Gt(e,t){this.v=e,this.k=t}function Kt(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function qt(e){if(Array.isArray(e))return e}function Jt(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function Yt(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
61
61
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Xt(e,t){return qt(e)||Jt(e,t)||Zt(e,t)||Yt()}function Zt(e,t){if(e){if(typeof e==`string`)return Kt(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Kt(e,t):void 0}}function Qt(e){var t,n;function r(t,n){try{var a=e[t](n),o=a.value,s=o instanceof Gt;Promise.resolve(s?o.v:o).then(function(n){if(s){var c=t===`return`&&o.k?t:`next`;if(!o.k||n.done)return r(c,n);n=e[c](n).value}i(!!a.done,n)},function(e){r(`throw`,e)})}catch(e){i(2,e)}}function i(e,i){e===2?t.reject(i):t.resolve({value:i,done:e}),(t=t.next)?r(t.key,t.arg):n=null}this._invoke=function(e,i){return new Promise(function(a,o){var s={key:e,arg:i,resolve:a,reject:o,next:null};n?n=n.next=s:(t=n=s,r(e,i))})},typeof e.return!=`function`&&(this.return=void 0)}Qt.prototype[typeof Symbol==`function`&&Symbol.asyncIterator||`@@asyncIterator`]=function(){return this},Qt.prototype.next=function(e){return this._invoke(`next`,e)},Qt.prototype.throw=function(e){return this._invoke(`throw`,e)},Qt.prototype.return=function(e){return this._invoke(`return`,e)};var $t=Object.entries,en=Object.setPrototypeOf,tn=Object.isFrozen,nn=Object.getPrototypeOf,rn=Object.getOwnPropertyDescriptor,U=Object.freeze,W=Object.seal,an=Object.create,on=typeof Reflect<`u`&&Reflect,sn=on.apply,cn=on.construct;U||=function(e){return e},W||=function(e){return e},sn||=function(e,t){var n=[...arguments].slice(2);return e.apply(t,n)},cn||=function(e){return new e(...[...arguments].slice(1))};var ln=J(Array.prototype.forEach);Array.prototype.indexOf;var un=J(Array.prototype.lastIndexOf),dn=J(Array.prototype.pop),fn=J(Array.prototype.push);Array.prototype.slice;var pn=J(Array.prototype.splice),mn=Array.isArray,hn=J(String.prototype.toLowerCase),gn=J(String.prototype.toString),_n=J(String.prototype.match),vn=J(String.prototype.replace),yn=J(String.prototype.indexOf),bn=J(String.prototype.trim),xn=J(Number.prototype.toString),Sn=J(Boolean.prototype.toString),Cn=typeof BigInt>`u`?null:J(BigInt.prototype.toString),wn=typeof Symbol>`u`?null:J(Symbol.prototype.toString),G=J(Object.prototype.hasOwnProperty),Tn=J(Object.prototype.toString),K=J(RegExp.prototype.test),q=En(TypeError);function J(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return sn(e,t,n)}}function En(e){return function(){return cn(e,[...arguments])}}function Y(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:hn;if(en&&en(e,null),!mn(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(tn(t)||(t[r]=e),i=e)}e[i]=!0}return e}function Dn(e){for(let t=0;t<e.length;t++)G(e,t)||(e[t]=null);return e}function X(e){let t=an(null);for(let r of $t(e)){var n=Xt(r,2);let i=n[0],a=n[1];G(e,i)&&(t[i]=mn(a)?Dn(a):a&&typeof a==`object`&&a.constructor===Object?X(a):a)}return t}function On(e){switch(typeof e){case`string`:return e;case`number`:return xn(e);case`boolean`:return Sn(e);case`bigint`:return Cn?Cn(e):`0`;case`symbol`:return wn?wn(e):`Symbol()`;case`undefined`:return Tn(e);case`function`:case`object`:{if(e===null)return Tn(e);let t=e,n=Z(t,`toString`);if(typeof n==`function`){let e=n(t);return typeof e==`string`?e:Tn(e)}return Tn(e)}default:return Tn(e)}}function Z(e,t){for(;e!==null;){let n=rn(e,t);if(n){if(n.get)return J(n.get);if(typeof n.value==`function`)return J(n.value)}e=nn(e)}function n(){return null}return n}function kn(e){try{return K(e,``),!0}catch{return!1}}var An=U(`a.abbr.acronym.address.area.article.aside.audio.b.bdi.bdo.big.blink.blockquote.body.br.button.canvas.caption.center.cite.code.col.colgroup.content.data.datalist.dd.decorator.del.details.dfn.dialog.dir.div.dl.dt.element.em.fieldset.figcaption.figure.font.footer.form.h1.h2.h3.h4.h5.h6.head.header.hgroup.hr.html.i.img.input.ins.kbd.label.legend.li.main.map.mark.marquee.menu.menuitem.meter.nav.nobr.ol.optgroup.option.output.p.picture.pre.progress.q.rp.rt.ruby.s.samp.search.section.select.shadow.slot.small.source.spacer.span.strike.strong.style.sub.summary.sup.table.tbody.td.template.textarea.tfoot.th.thead.time.tr.track.tt.u.ul.var.video.wbr`.split(`.`)),jn=U(`svg.a.altglyph.altglyphdef.altglyphitem.animatecolor.animatemotion.animatetransform.circle.clippath.defs.desc.ellipse.enterkeyhint.exportparts.filter.font.g.glyph.glyphref.hkern.image.inputmode.line.lineargradient.marker.mask.metadata.mpath.part.path.pattern.polygon.polyline.radialgradient.rect.stop.style.switch.symbol.text.textpath.title.tref.tspan.view.vkern`.split(`.`)),Mn=U([`feBlend`,`feColorMatrix`,`feComponentTransfer`,`feComposite`,`feConvolveMatrix`,`feDiffuseLighting`,`feDisplacementMap`,`feDistantLight`,`feDropShadow`,`feFlood`,`feFuncA`,`feFuncB`,`feFuncG`,`feFuncR`,`feGaussianBlur`,`feImage`,`feMerge`,`feMergeNode`,`feMorphology`,`feOffset`,`fePointLight`,`feSpecularLighting`,`feSpotLight`,`feTile`,`feTurbulence`]),Nn=U([`animate`,`color-profile`,`cursor`,`discard`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`foreignobject`,`hatch`,`hatchpath`,`mesh`,`meshgradient`,`meshpatch`,`meshrow`,`missing-glyph`,`script`,`set`,`solidcolor`,`unknown`,`use`]),Pn=U(`math.menclose.merror.mfenced.mfrac.mglyph.mi.mlabeledtr.mmultiscripts.mn.mo.mover.mpadded.mphantom.mroot.mrow.ms.mspace.msqrt.mstyle.msub.msup.msubsup.mtable.mtd.mtext.mtr.munder.munderover.mprescripts`.split(`.`)),Fn=U([`maction`,`maligngroup`,`malignmark`,`mlongdiv`,`mscarries`,`mscarry`,`msgroup`,`mstack`,`msline`,`msrow`,`semantics`,`annotation`,`annotation-xml`,`mprescripts`,`none`]),In=U([`#text`]),Ln=U(`accept.action.align.alt.autocapitalize.autocomplete.autopictureinpicture.autoplay.background.bgcolor.border.capture.cellpadding.cellspacing.checked.cite.class.clear.color.cols.colspan.command.commandfor.controls.controlslist.coords.crossorigin.datetime.decoding.default.dir.disabled.disablepictureinpicture.disableremoteplayback.download.draggable.enctype.enterkeyhint.exportparts.face.for.headers.height.hidden.high.href.hreflang.id.inert.inputmode.integrity.ismap.kind.label.lang.list.loading.loop.low.max.maxlength.media.method.min.minlength.multiple.muted.name.nonce.noshade.novalidate.nowrap.open.optimum.part.pattern.placeholder.playsinline.popover.popovertarget.popovertargetaction.poster.preload.pubdate.radiogroup.readonly.rel.required.rev.reversed.role.rows.rowspan.spellcheck.scope.selected.shape.size.sizes.slot.span.srclang.start.src.srcset.step.style.summary.tabindex.title.translate.type.usemap.valign.value.width.wrap.xmlns`.split(`.`)),Rn=U(`accent-height.accumulate.additive.alignment-baseline.amplitude.ascent.attributename.attributetype.azimuth.basefrequency.baseline-shift.begin.bias.by.class.clip.clippathunits.clip-path.clip-rule.color.color-interpolation.color-interpolation-filters.color-profile.color-rendering.cx.cy.d.dx.dy.diffuseconstant.direction.display.divisor.dominant-baseline.dur.edgemode.elevation.end.exponent.fill.fill-opacity.fill-rule.filter.filterunits.flood-color.flood-opacity.font-family.font-size.font-size-adjust.font-stretch.font-style.font-variant.font-weight.fx.fy.g1.g2.glyph-name.glyphref.gradientunits.gradienttransform.height.href.id.image-rendering.in.in2.intercept.k.k1.k2.k3.k4.kerning.keypoints.keysplines.keytimes.lang.lengthadjust.letter-spacing.kernelmatrix.kernelunitlength.lighting-color.local.marker-end.marker-mid.marker-start.markerheight.markerunits.markerwidth.maskcontentunits.maskunits.max.mask.mask-type.media.method.mode.min.name.numoctaves.offset.operator.opacity.order.orient.orientation.origin.overflow.paint-order.path.pathlength.patterncontentunits.patterntransform.patternunits.pointer-events.points.preservealpha.preserveaspectratio.primitiveunits.r.rx.ry.radius.refx.refy.repeatcount.repeatdur.restart.result.rotate.scale.seed.shape-rendering.slope.specularconstant.specularexponent.spreadmethod.startoffset.stddeviation.stitchtiles.stop-color.stop-opacity.stroke-dasharray.stroke-dashoffset.stroke-linecap.stroke-linejoin.stroke-miterlimit.stroke-opacity.stroke.stroke-width.style.surfacescale.systemlanguage.tabindex.tablevalues.targetx.targety.transform.transform-origin.text-anchor.text-decoration.text-orientation.text-rendering.textlength.type.u1.u2.unicode.values.vector-effect.viewbox.visibility.version.vert-adv-y.vert-origin-x.vert-origin-y.width.word-spacing.wrap.writing-mode.xchannelselector.ychannelselector.x.x1.x2.xmlns.y.y1.y2.z.zoomandpan`.split(`.`)),zn=U(`accent.accentunder.align.bevelled.close.columnalign.columnlines.columnspacing.columnspan.denomalign.depth.dir.display.displaystyle.encoding.fence.frame.height.href.id.largeop.length.linethickness.lquote.lspace.mathbackground.mathcolor.mathsize.mathvariant.maxsize.minsize.movablelimits.notation.numalign.open.rowalign.rowlines.rowspacing.rowspan.rspace.rquote.scriptlevel.scriptminsize.scriptsizemultiplier.selection.separator.separators.stretchy.subscriptshift.supscriptshift.symmetric.voffset.width.xmlns`.split(`.`)),Bn=U([`xlink:href`,`xml:id`,`xlink:title`,`xml:space`,`xmlns:xlink`]),Vn=W(/{{[\w\W]*|^[\w\W]*}}/g),Hn=W(/<%[\w\W]*|^[\w\W]*%>/g),Un=W(/\${[\w\W]*/g),Wn=W(/^data-[\-\w.\u00B7-\uFFFF]+$/),Gn=W(/^aria-[\-\w]+$/),Kn=W(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),qn=W(/^(?:\w+script|data):/i),Jn=W(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Yn=W(/^html$/i),Xn=W(/^[a-z][.\w]*(-[.\w]+)+$/i),Zn=W(/<[/\w!]/g),Qn=W(/<[/\w]/g),$n=W(/<\/no(script|embed|frames)/i),er=W(/\/>/i),Q={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},tr=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`],nr=U(Y({},tr)),rr=function(){let e={};return ln(tr,t=>{e[t]=W(RegExp(`</`+t+`(?=[\\t\\n\\f\\r />])`,`i`))}),U(e)}(),ir=function(){return typeof window>`u`?null:window},ar=function(e,t){if(typeof e!=`object`||typeof e.createPolicy!=`function`)return null;let n=null,r=`data-tt-policy-suffix`;t&&t.hasAttribute(r)&&(n=t.getAttribute(r));let i=`dompurify`+(n?`#`+n:``);try{return e.createPolicy(i,{createHTML(e){return e},createScriptURL(e){return e}})}catch{return console.warn(`TrustedTypes policy `+i+` could not be created.`),null}},or=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},sr=function(e,t,n,r){return G(e,t)&&mn(e[t])?Y(r.base?X(r.base):{},e[t],r.transform):n},cr=function(e,t,n){let r=G(e,t)?e[t]:void 0;return r&&typeof r==`object`?X(r):n()};function lr(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:ir(),t=e=>lr(e);if(t.version=`3.4.16`,t.removed=[],!e||!e.document||e.document.nodeType!==Q.document||!e.Element)return t.isSupported=!1,t;let n=e.document,r=n,i=r.currentScript;e.DocumentFragment;let a=e.HTMLTemplateElement,o=e.Node,s=e.Element,c=e.NodeFilter;e.NamedNodeMap===void 0&&(e.NamedNodeMap||e.MozNamedAttrMap),e.HTMLFormElement;let l=e.DOMParser,u=e.trustedTypes,d=s.prototype,f=Z(d,`cloneNode`),p=Z(d,`remove`),ee=Z(d,`removeAttributeNode`),te=Z(d,`nextSibling`),m=Z(d,`childNodes`),h=Z(d,`parentNode`),ne=Z(d,`shadowRoot`),re=Z(d,`attributes`),g=o&&o.prototype?Z(o.prototype,`nodeType`):null,_=o&&o.prototype?Z(o.prototype,`nodeName`):null,v=o&&o.prototype?Z(o.prototype,`ownerDocument`):null,ie=function(e){return g?g(e):e.nodeType},ae=function(e){return _?_(e):e.nodeName};if(typeof a==`function`){let e=n.createElement(`template`);e.content&&e.content.ownerDocument&&(n=e.content.ownerDocument)}let y,b=``,oe,se=!1,ce=0,le=function(){if(ce>0)throw q(`A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.`)},ue=function(e){le(),ce++;try{return y.createHTML(e)}finally{ce--}},de=function(e){le(),ce++;try{return y.createScriptURL(e)}finally{ce--}},fe=function(){return se||=(oe=ar(u,i),!0),oe},pe=n,me=pe.implementation,he=pe.createNodeIterator,ge=pe.createDocumentFragment,_e=pe.getElementsByTagName,ve=r.importNode,x=or();t.isSupported=typeof $t==`function`&&typeof h==`function`&&me&&me.createHTMLDocument!==void 0;let ye=Vn,be=Hn,xe=Un,Se=Wn,Ce=Gn,we=qn,Te=Jn,Ee=Xn,De=Kn,S=null,Oe=Y({},[...An,...jn,...Mn,...Pn,...In]),C=null,ke=Y({},[...Ln,...Rn,...zn,...Bn]),w=Object.seal(an(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),T=null,Ae=null,E=Object.seal(an(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),je=!0,Me=!0,Ne=!1,Pe=!0,D=!1,Fe=!0,O=!1,k=!1,Ie=null,A=null,j=!1,M=!1,Le=!1,Re=!1,ze=!0,Be=!1,Ve=`user-content-`,He=!0,Ue=!1,We={},Ge=null,Ke=Y({},`annotation-xml.audio.colgroup.desc.foreignobject.head.iframe.math.mi.mn.mo.ms.mtext.noembed.noframes.noscript.plaintext.script.selectedcontent.style.svg.template.thead.title.video.xmp`.split(`.`)),qe=null,Je=Y({},[`audio`,`video`,`img`,`source`,`image`,`track`]),Ye=null,Xe=Y({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]),N=`http://www.w3.org/1998/Math/MathML`,Ze=`http://www.w3.org/2000/svg`,P=`http://www.w3.org/1999/xhtml`,Qe=P,$e=!1,et=null,tt=Y({},[N,Ze,P],gn),nt=U([`mi`,`mo`,`mn`,`ms`,`mtext`]),rt=Y({},nt),it=U([`annotation-xml`]),at=Y({},it),ot=Y({},[`title`,`style`,`font`,`a`,`script`]),F=null,st=[`application/xhtml+xml`,`text/html`],I=null,ct=null,lt=n.createElement(`form`),ut=function(e){return e instanceof RegExp||e instanceof Function},dt=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(ct&&ct===e)return;(!e||typeof e!=`object`)&&(e={}),e=X(e),F=st.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,I=F===`application/xhtml+xml`?gn:hn,S=sr(e,`ALLOWED_TAGS`,Oe,{transform:I}),C=sr(e,`ALLOWED_ATTR`,ke,{transform:I}),et=sr(e,`ALLOWED_NAMESPACES`,tt,{transform:gn}),Ye=sr(e,`ADD_URI_SAFE_ATTR`,Xe,{transform:I,base:Xe}),qe=sr(e,`ADD_DATA_URI_TAGS`,Je,{transform:I,base:Je}),Ge=sr(e,`FORBID_CONTENTS`,Ke,{transform:I}),T=sr(e,`FORBID_TAGS`,X({}),{transform:I}),Ae=sr(e,`FORBID_ATTR`,X({}),{transform:I}),We=G(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?X(e.USE_PROFILES):e.USE_PROFILES:!1,je=e.ALLOW_ARIA_ATTR!==!1,Me=e.ALLOW_DATA_ATTR!==!1,Ne=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Pe=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,D=e.SAFE_FOR_TEMPLATES||!1,Fe=e.SAFE_FOR_XML!==!1,O=e.WHOLE_DOCUMENT||!1,M=e.RETURN_DOM||!1,Le=e.RETURN_DOM_FRAGMENT||!1,Re=e.RETURN_TRUSTED_TYPE||!1,j=e.FORCE_BODY||!1,ze=e.SANITIZE_DOM!==!1,Be=e.SANITIZE_NAMED_PROPS||!1,He=e.KEEP_CONTENT!==!1,Ue=e.IN_PLACE||!1,De=kn(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:Kn,Qe=typeof e.NAMESPACE==`string`?e.NAMESPACE:P,rt=cr(e,`MATHML_TEXT_INTEGRATION_POINTS`,()=>Y({},nt)),at=cr(e,`HTML_INTEGRATION_POINTS`,()=>Y({},it));let t=cr(e,`CUSTOM_ELEMENT_HANDLING`,()=>an(null));if(w=an(null),G(t,`tagNameCheck`)&&ut(t.tagNameCheck)&&(w.tagNameCheck=t.tagNameCheck),G(t,`attributeNameCheck`)&&ut(t.attributeNameCheck)&&(w.attributeNameCheck=t.attributeNameCheck),G(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(w.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),W(w),D&&(Me=!1),Le&&(M=!0),We&&(S=Y({},In),C=an(null),We.html===!0&&(Y(S,An),Y(C,Ln)),We.svg===!0&&(Y(S,jn),Y(C,Rn),Y(C,Bn)),We.svgFilters===!0&&(Y(S,Mn),Y(C,Rn),Y(C,Bn)),We.mathMl===!0&&(Y(S,Pn),Y(C,zn),Y(C,Bn))),E.tagCheck=null,E.attributeCheck=null,G(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?E.tagCheck=e.ADD_TAGS:mn(e.ADD_TAGS)&&(S===Oe&&(S=X(S)),Y(S,e.ADD_TAGS,I))),G(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?E.attributeCheck=e.ADD_ATTR:mn(e.ADD_ATTR)&&(C===ke&&(C=X(C)),Y(C,e.ADD_ATTR,I))),G(e,`ADD_FORBID_CONTENTS`)&&mn(e.ADD_FORBID_CONTENTS)&&(Ge===Ke&&(Ge=X(Ge)),Y(Ge,e.ADD_FORBID_CONTENTS,I)),He&&(S[`#text`]=!0),O&&Y(S,[`html`,`head`,`body`]),S.table&&(Y(S,[`tbody`]),delete T.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!=`function`)throw q(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw q(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=y;y=e.TRUSTED_TYPES_POLICY;try{b=ue(``)}catch(e){throw y=t,e}}else e.TRUSTED_TYPES_POLICY===null?(y=void 0,b=``):(y===void 0&&(y=fe()),y&&typeof b==`string`&&(b=ue(``)));U&&U(e),ct=e},ft=Y({},[...jn,...Mn,...Nn]),pt=Y({},[...Pn,...Fn]),mt=function(e,t,n){return t.namespaceURI===P?e===`svg`:t.namespaceURI===N?e===`svg`&&(n===`annotation-xml`||rt[n]):!!ft[e]},ht=function(e,t,n){return t.namespaceURI===P?e===`math`:t.namespaceURI===Ze?e===`math`&&at[n]:!!pt[e]},gt=function(e,t,n){return t.namespaceURI===Ze&&!at[n]||t.namespaceURI===N&&!rt[n]?!1:!pt[e]&&(ot[e]||!ft[e])},_t=function(e){let t=h(e);(!t||!t.tagName)&&(t={namespaceURI:Qe,tagName:`template`});let n=hn(e.tagName),r=hn(t.tagName);return et[e.namespaceURI]?e.namespaceURI===Ze?mt(n,t,r):e.namespaceURI===N?ht(n,t,r):e.namespaceURI===P?gt(n,t,r):!!(F===`application/xhtml+xml`&&et[e.namespaceURI]):!1},vt=function(e){fn(t.removed,{element:e});try{h(e).removeChild(e)}catch{if(p(e),!h(e))throw q(`a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place`)}},yt=function(e,t,n){try{ee(e,t)}catch{try{e.removeAttribute(n)}catch{}}},bt=function(e){Ct(e);let t=m(e);if(t){let e=[];ln(t,t=>{fn(e,t)}),ln(e,e=>{try{p(e)}catch{}})}let n=re(e);if(n)for(let t=n.length-1;t>=0;--t){let r=n[t],i=r&&r.name;typeof i==`string`&&yt(e,r,i)}},xt=function(e,n,r){if(!r)try{r=n.getAttributeNode(e)}catch{r=null}fn(t.removed,{attribute:r||null,from:n});try{r?ee(n,r):n.removeAttribute(e)}catch{try{n.removeAttribute(e)}catch{}}if(e===`is`){if(M||Le)try{vt(n)}catch{}else try{n.setAttribute(e,``)}catch{}}},St=function(e){let t=re(e);if(t)for(let n=t.length-1;n>=0;--n){let r=t[n],i=r&&r.name;typeof i!=`string`||C[I(i)]||yt(e,r,i)}},Ct=function(e){let t=[e];for(;t.length>0;){let e=t.pop();ie(e)===Q.element&&St(e);let n=m(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}},wt=function(e,t){return Fe?e===`patchsrc`||e===`for`&&t!==`label`&&t!==`output`:!1},Tt=function(e){if(!Fe)return;let t=[e];for(;t.length>0;){let e=t.pop(),n=ie(e);if(n===Q.processingInstruction||n===Q.comment&&K(Qn,e.data)){try{p(e)}catch{}continue}if(n===Q.element){let t=e,n=I(ae(e));try{t.hasAttribute&&t.hasAttribute(`patchsrc`)&&t.removeAttribute(`patchsrc`),t.hasAttribute&&t.hasAttribute(`for`)&&wt(`for`,n)&&t.removeAttribute(`for`)}catch{}}let r=m(e);if(r)for(let e=r.length-1;e>=0;--e)t.push(r[e])}},Et=function(e){let t=null,r=null;if(j)e=`<remove></remove>`+e;else{let t=_n(e,/^[\r\n\t ]+/);r=t&&t[0]}F===`application/xhtml+xml`&&Qe===P&&(e=`<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>`+e+`</body></html>`);let i=y?ue(e):e;if(Qe===P)try{t=new l().parseFromString(i,F)}catch{}if(!t||!t.documentElement){t=me.createDocument(Qe,`template`,null);try{t.documentElement.innerHTML=$e?b:i}catch{}}let a=t.body||t.documentElement;return e&&r&&a.insertBefore(n.createTextNode(r),a.childNodes[0]||null),Qe===P?_e.call(t,O?`html`:`body`)[0]:O?t.documentElement:a},Dt=function(e){let t=v?v(e):e.ownerDocument;return he.call(t||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},Ot=function(e){return e=vn(e,ye,` `),e=vn(e,be,` `),e=vn(e,xe,` `),e},kt=function(e){e.normalize();let t=v?v(e):e.ownerDocument,n=he.call(t||e,e,c.SHOW_TEXT|c.SHOW_COMMENT|c.SHOW_CDATA_SECTION|c.SHOW_PROCESSING_INSTRUCTION,null),r=n.nextNode();for(;r;)r.data=Ot(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&ln(i,e=>{jt(e.content)&&kt(e.content)})},At=function(e){let t=_?_(e):null;return typeof t!=`string`||I(t)!==`form`?!1:typeof e.nodeName!=`string`||typeof e.textContent!=`string`||typeof e.removeChild!=`function`||e.attributes!==re(e)||typeof e.removeAttribute!=`function`||typeof e.removeAttributeNode!=`function`||typeof e.getAttributeNode!=`function`||typeof e.setAttribute!=`function`||typeof e.namespaceURI!=`string`||typeof e.insertBefore!=`function`||typeof e.hasChildNodes!=`function`||e.nodeType!==g(e)||e.childNodes!==m(e)},jt=function(e){if(!g||typeof e!=`object`||!e)return!1;try{return g(e)===Q.documentFragment}catch{return!1}},L=function(e){if(!g||typeof e!=`object`||!e)return!1;try{return typeof g(e)==`number`}catch{return!1}};function R(e,n,r){e.length!==0&&ln(e,e=>{e.call(t,n,r,ct)})}let Mt=function(e,t){return!!(Fe&&e.hasChildNodes()&&!L(e.firstElementChild)&&K(Zn,e.textContent)&&K(Zn,e.innerHTML)||Fe&&e.namespaceURI===P&&nr[t]&&(L(e.firstElementChild)||typeof e.textContent==`string`&&K(rr[t],e.textContent))||e.nodeType===Q.processingInstruction||Fe&&e.nodeType===Q.comment&&K(Qn,e.data))},Nt=function(e,t){return e instanceof RegExp?K(e,t):e instanceof Function&&!!e(t,...[...arguments].slice(2))},z=function(e,t,n){if(!T[t]&&zt(t)&&Nt(w.tagNameCheck,t))return!1;if(He&&!Ge[t]){let t=h(e),r=m(e);if(r&&t){let i=r.length;for(let a=i-1;a>=0;--a){let i=e===n?f(r[a],!0):r[a];t.insertBefore(i,te(e))}}}return vt(e),!0},Pt=function(e,t,n,r){return e.length===0?t:t===n||t===r?X(t):t},Ft=function(e,t){return e===t||h(e)!==null?!1:(Ue&&Ct(e),!0)},It=function(e,n){if(R(x.beforeSanitizeElements,e,null),Ft(e,n))return!0;if(At(e))return vt(e),!0;let r=I(ae(e));if(S=Pt(x.uponSanitizeElement,S,Oe,Ie),R(x.uponSanitizeElement,e,{tagName:r,allowedTags:S}),Ft(e,n))return!0;if(Mt(e,r))return vt(e),!0;if(T[r]||!(E.tagCheck instanceof Function&&E.tagCheck(r))&&!S[r]){let t=z(e,r,n);return t===!1&&(R(x.afterSanitizeElements,e,null),Ft(e,n))?!0:t}if(ie(e)===Q.element&&!_t(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&K($n,e.innerHTML))return vt(e),!0;if(D&&e.nodeType===Q.text){let n=Ot(e.textContent);e.textContent!==n&&(fn(t.removed,{element:e.cloneNode()}),e.textContent=n)}return R(x.afterSanitizeElements,e,null),Ft(e,n)},Lt=function(e,t,r){if(Ae[t]||wt(t,e)||ze&&(t===`id`||t===`name`)&&(r in n||r in lt))return!1;let i=C[t]||E.attributeCheck instanceof Function&&E.attributeCheck(t,e);return Me&&K(Se,t)||je&&K(Ce,t)?!0:i?Ye[t]||K(De,vn(r,Te,``))||(t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&yn(r,`data:`)===0&&qe[e]||Ne&&!K(we,vn(r,Te,``))?!0:!r:zt(e)&&Nt(w.tagNameCheck,e)&&Nt(w.attributeNameCheck,t,e)||t===`is`&&w.allowCustomizedBuiltInElements&&Nt(w.tagNameCheck,r)},Rt=Y({},[`annotation-xml`,`color-profile`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`missing-glyph`]),zt=function(e){return!Rt[hn(e)]&&K(Ee,e)},Bt=function(e,t,n,r){if(y&&typeof u==`object`&&typeof u.getAttributeType==`function`&&!n)switch(u.getAttributeType(e,t)){case`TrustedHTML`:return ue(r);case`TrustedScriptURL`:return de(r)}return r},B=function(e,t,n,r){try{return n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),!At(e)||(vt(e),!1)}catch{return xt(t,e),!1}},Vt=function(e,n){if(R(x.beforeSanitizeAttributes,e,null),Ft(e,n))return;let r=e.attributes;if(!r||At(e))return;C=Pt(x.uponSanitizeAttribute,C,ke,A);let i={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:C,forceKeepAttr:void 0},a=r.length,o=I(e.nodeName);for(;a--;){let n=r[a],s=n.name,c=n.namespaceURI,l=n.value,u=I(s),d=l,f=s===`value`?d:bn(d),p=!1;if(i.attrName=u,i.attrValue=f,i.keepAttr=!0,i.forceKeepAttr=void 0,R(x.uponSanitizeAttribute,e,i),f=i.attrValue,Be&&(u===`id`||u===`name`)&&yn(f,Ve)!==0&&(xt(s,e,n),f=Ve+f,p=!0),Fe&&K(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){xt(s,e,n);continue}if(u===`attributename`&&_n(f,`href`)){xt(s,e,n);continue}if(!i.forceKeepAttr){if(!i.keepAttr){xt(s,e,n);continue}if(!Pe&&K(er,f)){xt(s,e,n);continue}if(D&&(f=Ot(f)),!Lt(o,u,f)){xt(s,e,n);continue}f=Bt(o,u,c,f),f!==d&&B(e,s,c,f)&&p&&dn(t.removed)}}R(x.afterSanitizeAttributes,e,null),Ft(e,n)},Ht=function(e){let t=null,n=Dt(e);for(R(x.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(R(x.uponSanitizeShadowNode,t,null),It(t,e),Vt(t,e),jt(t.content)&&Ht(t.content),ie(t)===Q.element){let e=ne(t);jt(e)&&(V(e),Ht(e))}R(x.afterSanitizeShadowDOM,e,null)},V=function(e){let t=[{node:e,shadow:null}];for(;t.length>0;){let e=t.pop();if(e.shadow){Ht(e.shadow);continue}let n=e.node,r=ie(n)===Q.element,i=m(n);if(i)for(let e=i.length-1;e>=0;--e)t.push({node:i[e],shadow:null});if(r){let e=_?_(n):null;if(typeof e==`string`&&I(e)===`template`){let e=n.content;jt(e)&&t.push({node:e,shadow:null})}}if(r){let e=ne(n);jt(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return t.sanitize=function(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=null,a=null,o=null,s=null;if($e=!e,$e&&(e=`<!-->`),typeof e!=`string`&&!L(e)&&(e=On(e),typeof e!=`string`))throw q(`dirty is not a string, aborting`);if(!t.isSupported)return e;k?(S=Ie,C=A):dt(n),(x.uponSanitizeElement.length>0||x.uponSanitizeAttribute.length>0)&&(S=X(S)),x.uponSanitizeAttribute.length>0&&(C=X(C)),t.removed=[];let c=Ue&&typeof e!=`string`&&L(e);if(c){Tt(e);let t=ae(e);if(typeof t==`string`){let n=I(t);if(!S[n]||T[n])throw bt(e),q(`root node is forbidden and cannot be sanitized in-place`)}if(At(e))throw bt(e),q(`root node is clobbered and cannot be sanitized in-place`);try{V(e)}catch(t){throw bt(e),t}}else if(L(e))i=Et(`<!---->`),a=i.ownerDocument.importNode(e,!0),a.nodeType===Q.element&&a.nodeName===`BODY`||a.nodeName===`HTML`?i=a:i.appendChild(a),V(i);else{if(!M&&!D&&!O&&e.indexOf(`<`)===-1)return y&&Re?ue(e):e;if(i=Et(e),!i)return M?null:Re?b:``}i&&j&&vt(i.firstChild);let l=c?e:i;try{let e=Dt(l);for(;o=e.nextNode();)It(o,l),Vt(o,l),jt(o.content)&&Ht(o.content)}catch(n){throw c&&(bt(e),ln(t.removed,e=>{e.element&&Ct(e.element)})),n}if(c){let n=!1;if(ln(t.removed,t=>{t.element&&(t.element===e&&(n=!0),Ct(t.element))}),n)throw q(`a node selected for removal could not be safely returned; refusing to sanitize in place`);return D&&kt(e),e}if(M){if(D&&kt(i),Le)for(s=ge.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return(C.shadowroot||C.shadowrootmode)&&(s=ve.call(r,s,!0)),s}let u=O?i.outerHTML:i.innerHTML;return O&&S[`!doctype`]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&K(Yn,i.ownerDocument.doctype.name)&&(u=`<!DOCTYPE `+i.ownerDocument.doctype.name+`>
62
- `+u),D&&(u=Ot(u)),y&&Re?ue(u):u},t.setConfig=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};dt(e),k=!0,Ie=S,A=C},t.clearConfig=function(){ct=null,k=!1,Ie=null,A=null,y=oe,b=``},t.isValidAttribute=function(e,t,n){ct||dt({});let r=I(e),i=I(t);return Lt(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&G(x,e)&&fn(x[e],t)},t.removeHook=function(e,t){if(G(x,e)){if(t!==void 0){let n=un(x[e],t);return n===-1?void 0:pn(x[e],n,1)[0]}return dn(x[e])}},t.removeHooks=function(e){G(x,e)&&(x[e]=[])},t.removeAllHooks=function(){x=or()},t}var ur=lr(),dr=!1,fr=new Map,pr=e=>e.replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`})[e]);function mr(e){let t=fr.get(e);if(t!==void 0)return t;dr||(dr=!0,H.use({renderer:{code({text:e,lang:t}){let n=pr((t||``).split(/\s/)[0]||``),r=Me(e,t),i=r===null?``:`<button type="button" class="code-run">${pr(ge(`Run`,`Lancer`))}</button>`;return`<div class="code-block"${r===null?``:` data-cmd="${pr(r)}"`}><div class="code-head"><span>${n||`code`}</span><span class="code-tools">${i}<button type="button" class="code-copy">${pr(y(`Copy`))}</button></span></div><pre><code${n?` class="language-${n}"`:``}>${pr(e)}</code></pre></div>`},codespan({text:e}){let t=pr(e);if(Ee(e))return`<code class="md-path" data-k="path" role="button" tabindex="0">${t}</code>`;let n=Ne(e);if(n!==null)return`<code class="md-cmd" data-k="cmd" data-cmd="${pr(n)}" role="button" tabindex="0">${t}</code>`;let r=T(e);return`<code${r?` data-k="${r}"`:``}>${t}</code>`}}}),ur.addHook(`afterSanitizeAttributes`,e=>{e.tagName===`A`&&(e.setAttribute(`target`,`_blank`),e.setAttribute(`rel`,`noopener noreferrer`))}));let n;try{n=ur.sanitize(H.parse(e,{breaks:!0,gfm:!0,async:!1}))}catch{n=`<p>${pr(e)}</p>`}return fr.set(e,n),fr.size>5e3&&fr.delete(fr.keys().next().value),n}function hr(e){let t=(e||``).trim();if(/^t-\d{4,}$/i.test(t))return{thread:t.toLowerCase()};if(!/^https?:\/\//i.test(t))return null;try{let e=new URL(t);return e.protocol===`https:`||e.protocol===`http:`?{href:e.href}:null}catch{return null}}var gr=/\[([^\]]+)\]\((https?:\/\/[^\s()]+)\)|<?(https?:\/\/[^\s<>]+?)>?(?=[\s,;]|[.)!?]*(?:\s|$))/gi;function _r(e){let t=[],n=0,r=(e,n)=>{if(!e)return;let r=t[t.length-1];!n&&r&&!r.href?r.text+=e:t.push(n?{text:e,href:n}:{text:e})};for(let t of e.matchAll(gr)){let i=t[2]||t[3],a=hr(i);r(e.slice(n,t.index)),a&&`href`in a?r(t[1]||i,a.href):r(t[0]),n=t.index+t[0].length}return r(e.slice(n)),t}var vr=[`test`,`decide`,`review`,`doing`,`queue`,`blocked`,`todo`,`backlog`,`done`],yr=e=>e===null?vr.indexOf(`backlog`)+.5:vr.indexOf(e);function br(e,t){let n=new Set(e.open.map(e=>e.id)),r=e.lists.map((e,t)=>({key:`l${t}`,title:e.title,kind:e.kind,tasks:e.kind===`doing`?e.tasks.filter(e=>!(e.thread&&n.has(e.thread))):e.tasks,threads:[]})),i=r.find(e=>e.kind===`doing`);!i&&e.open.length&&(i={key:`doing`,title:t.doing,kind:`doing`,tasks:[],threads:[]},r.push(i)),i&&(i.threads=e.open);let a=r.find(e=>e.kind===`done`);return a||(a={key:`done`,title:t.done,kind:`done`,tasks:[],threads:[]},r.push(a)),a.threads=e.resolved,r.sort((e,t)=>yr(e.kind)-yr(t.kind))}function xr(e,t,n=`fr`){if(!e||!(e.max>0))return null;let r=n===`en`?`${e.used} of ${e.max} thread slot${e.max===1?``:`s`} in use`:`${e.used} place${e.used>1?`s`:``} de thread sur ${e.max} occupée${e.used>1?`s`:``}`,i=t?.trim();return i?n===`en`?`${r} · next: ${i}`:`${r} · ensuite : ${i}`:r}function Sr(e,t){return t?e.filter(e=>e.tasks.length>0||e.threads.length>0):e}function Cr(e,t=`fr`){return`${t===`en`?`✓ Tested: `:`✓ Testé : `}${e.trim()}`}function wr(e,t=`fr`){return`${t===`en`?`✗ Problem: `:`✗ Problème : `}${e.trim()} — `}function Tr(e,t=`fr`){return`${t===`en`?`? Question: `:`? Question : `}${e.trim()} — `}function Er(e,t=`fr`){return`${t===`en`?`↳ Decision: `:`↳ Décision : `}${e.trim()} — `}function Dr(e,t){let n=e.replace(/\s+$/,``);return n?n.endsWith(t.trimEnd())?`${n} `:`${n}\n${t}`:t}function Or(e,t=`fr`){return`${t===`en`?`↳ Launch: `:`↳ Lancer : `}${e.trim()}`}function kr(e,t=`fr`){return`${t===`en`?`↳ Detail on `:`↳ Précision sur `}${e.trim()} — `}function Ar(e,t=`fr`){return`${t===`en`?`✓ Reviewed: `:`✓ Relu : `}${e.trim()}`}function jr(e,t=`fr`){return`${t===`en`?`↳ Feedback on `:`↳ Retour sur `}${e.trim()}${t===`en`?`: `:` : `}`}function Mr(e,t=`fr`){return`${t===`en`?`↳ Unblock: `:`↳ Débloquer : `}${e.trim()}`}var Nr={up:[`↳ Move up: `,`↳ Monter : `],down:[`↳ Move down: `,`↳ Descendre : `],queue:[`↳ Queue: `,`↳ Mettre en file : `],now:[`↳ Launch now: `,`↳ Lancer maintenant : `],unqueue:[`↳ Remove from queue: `,`↳ Retirer de la file : `],backlog:[`↳ Back to backlog: `,`↳ Remettre au backlog : `]};function $(e,t,n=`fr`){return`${Nr[e][n===`en`?0:1]}${t.trim()}`}var Pr=[{kind:`test`,fr:`À tester`,en:`To test`},{kind:`decide`,fr:`À décider`,en:`To decide`},{kind:`review`,fr:`À relire`,en:`To review`},{kind:`doing`,fr:`En cours`,en:`In progress`},{kind:`queue`,fr:`En file`,en:`In queue`},{kind:`blocked`,fr:`Bloqué`,en:`Blocked`},{kind:`todo`,fr:`À faire`,en:`To do`},{kind:`backlog`,fr:`Backlog`,en:`Backlog`}];function Fr(e=`fr`){let t=e===`en`?{test:`- [ ] Check the new settings page (me)`,decide:`- [ ] Keep the old layout? (me)`,review:`- [ ] Offline banner [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me)`,blocked:`- [ ] Publish the guide — blocked by: review (agent)`,doing:`- [ ] Fix the offline banner [b:gray(t-0001)](t-0001) (agent → t-0001)`,queue:`- [ ] Export to CSV (agent)`,todo:`- [ ] Keyboard shortcuts help (agent)`,backlog:`- [ ] Dark mode for charts (agent)`}:{test:`- [ ] Vérifier la nouvelle page Réglages (me)`,decide:`- [ ] Garder l’ancienne disposition ? (me)`,review:`- [ ] Bandeau hors ligne [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me)`,blocked:`- [ ] Publier le guide — bloqué par : relecture (agent)`,doing:`- [ ] Corriger le bandeau hors ligne [b:gray(t-0001)](t-0001) (agent → t-0001)`,queue:`- [ ] Export CSV (agent)`,todo:`- [ ] Aide des raccourcis clavier (agent)`,backlog:`- [ ] Mode sombre des graphiques (agent)`};return`# Tasks\n\n${Pr.map(n=>`## ${e===`en`?n.en:n.fr}\n\n${t[n.kind]}`).join(`
62
+ `+u),D&&(u=Ot(u)),y&&Re?ue(u):u},t.setConfig=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};dt(e),k=!0,Ie=S,A=C},t.clearConfig=function(){ct=null,k=!1,Ie=null,A=null,y=oe,b=``},t.isValidAttribute=function(e,t,n){ct||dt({});let r=I(e),i=I(t);return Lt(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&G(x,e)&&fn(x[e],t)},t.removeHook=function(e,t){if(G(x,e)){if(t!==void 0){let n=un(x[e],t);return n===-1?void 0:pn(x[e],n,1)[0]}return dn(x[e])}},t.removeHooks=function(e){G(x,e)&&(x[e]=[])},t.removeAllHooks=function(){x=or()},t}var ur=lr(),dr=!1,fr=new Map,pr=e=>e.replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`})[e]);function mr(e){let t=fr.get(e);if(t!==void 0)return t;dr||(dr=!0,H.use({renderer:{code({text:e,lang:t}){let n=pr((t||``).split(/\s/)[0]||``),r=Me(e,t),i=r===null?``:`<button type="button" class="code-run">${pr(ge(`Run`,`Lancer`))}</button>`;return`<div class="code-block"${r===null?``:` data-cmd="${pr(r)}"`}><div class="code-head"><span>${n||`code`}</span><span class="code-tools">${i}<button type="button" class="code-copy">${pr(y(`Copy`))}</button></span></div><pre><code${n?` class="language-${n}"`:``}>${pr(e)}</code></pre></div>`},codespan({text:e}){let t=pr(e);if(Ee(e))return`<code class="md-path" data-k="path" role="button" tabindex="0">${t}</code>`;let n=Ne(e);if(n!==null)return`<code class="md-cmd" data-k="cmd" data-cmd="${pr(n)}" role="button" tabindex="0">${t}</code>`;let r=T(e);return`<code${r?` data-k="${r}"`:``}>${t}</code>`}}}),ur.addHook(`afterSanitizeAttributes`,e=>{e.tagName===`A`&&(e.setAttribute(`target`,`_blank`),e.setAttribute(`rel`,`noopener noreferrer`))}));let n;try{n=ur.sanitize(H.parse(e,{breaks:!0,gfm:!0,async:!1}))}catch{n=`<p>${pr(e)}</p>`}return fr.set(e,n),fr.size>5e3&&fr.delete(fr.keys().next().value),n}function hr(e){let t=(e||``).trim();if(/^t-\d{4,}$/i.test(t))return{thread:t.toLowerCase()};if(!/^https?:\/\//i.test(t))return null;try{let e=new URL(t);return e.protocol===`https:`||e.protocol===`http:`?{href:e.href}:null}catch{return null}}var gr=/\[([^\]]+)\]\((https?:\/\/[^\s()]+)\)|<?(https?:\/\/[^\s<>]+?)>?(?=[\s,;]|[.)!?]*(?:\s|$))/gi;function _r(e){let t=[],n=0,r=(e,n)=>{if(!e)return;let r=t[t.length-1];!n&&r&&!r.href?r.text+=e:t.push(n?{text:e,href:n}:{text:e})};for(let t of e.matchAll(gr)){let i=t[2]||t[3],a=hr(i);r(e.slice(n,t.index)),a&&`href`in a?r(t[1]||i,a.href):r(t[0]),n=t.index+t[0].length}return r(e.slice(n)),t}var vr=[`test`,`decide`,`review`,`doing`,`queue`,`blocked`,`todo`,`backlog`,`done`],yr=e=>e===null?vr.indexOf(`backlog`)+.5:vr.indexOf(e);function br(e,t){let n=new Set(e.open.map(e=>e.id)),r=e.lists.map((e,t)=>({key:`l${t}`,title:e.title,kind:e.kind,tasks:e.kind===`doing`?e.tasks.filter(e=>!(e.thread&&n.has(e.thread))):e.tasks,threads:[]})),i=r.find(e=>e.kind===`doing`);!i&&e.open.length&&(i={key:`doing`,title:t.doing,kind:`doing`,tasks:[],threads:[]},r.push(i)),i&&(i.threads=e.open);let a=r.find(e=>e.kind===`done`);return a||(a={key:`done`,title:t.done,kind:`done`,tasks:[],threads:[]},r.push(a)),a.threads=e.resolved,r.sort((e,t)=>yr(e.kind)-yr(t.kind))}function xr(e,t,n=`fr`){if(!e||!(e.max>0))return null;let r=n===`en`?`${e.used} of ${e.max} thread slot${e.max===1?``:`s`} in use`:`${e.used} place${e.used>1?`s`:``} de thread sur ${e.max} occupée${e.used>1?`s`:``}`,i=t?.trim();return i?n===`en`?`${r} · next: ${i}`:`${r} · ensuite : ${i}`:r}function Sr(e,t){return t?e.filter(e=>e.tasks.length>0||e.threads.length>0):e}function Cr(e,t=`fr`){return`${t===`en`?`✓ Tested: `:`✓ Testé : `}${e.trim()}`}function wr(e,t=`fr`){return`${t===`en`?`✗ Problem: `:`✗ Problème : `}${e.trim()} — `}function Tr(e,t=`fr`){return`${t===`en`?`? Question: `:`? Question : `}${e.trim()} — `}function Er(e,t=`fr`){return`${t===`en`?`↳ Decision: `:`↳ Décision : `}${e.trim()} — `}function Dr(e,t){let n=e.replace(/\s+$/,``);return n?n.endsWith(t.trimEnd())?`${n} `:`${n}\n${t}`:t}function Or(e,t=`fr`){return`${t===`en`?`↳ Launch: `:`↳ Lancer : `}${e.trim()}`}function kr(e,t=`fr`){return`${t===`en`?`↳ Detail on `:`↳ Précision sur `}${e.trim()} — `}function Ar(e,t=`fr`){return`${t===`en`?`✓ Reviewed: `:`✓ Relu : `}${e.trim()}`}function jr(e,t=`fr`){return`${t===`en`?`↳ Feedback on `:`↳ Retour sur `}${e.trim()}${t===`en`?`: `:` : `}`}function Mr(e,t=`fr`){return`${t===`en`?`↳ Unblock: `:`↳ Débloquer : `}${e.trim()}`}function Nr(e,t,n=`fr`){return`${n===`en`?`↳ Info for ${e.trim()}: `:`↳ Info pour ${e.trim()} : `}${t.trim()}`}var Pr={up:[`↳ Move up: `,`↳ Monter : `],down:[`↳ Move down: `,`↳ Descendre : `],queue:[`↳ Queue: `,`↳ Mettre en file : `],now:[`↳ Launch now: `,`↳ Lancer maintenant : `],unqueue:[`↳ Remove from queue: `,`↳ Retirer de la file : `],backlog:[`↳ Back to backlog: `,`↳ Remettre au backlog : `]};function $(e,t,n=`fr`){return`${Pr[e][n===`en`?0:1]}${t.trim()}`}var Fr=[{kind:`test`,fr:`À tester`,en:`To test`},{kind:`decide`,fr:`À décider`,en:`To decide`},{kind:`review`,fr:`À relire`,en:`To review`},{kind:`doing`,fr:`En cours`,en:`In progress`},{kind:`queue`,fr:`En file`,en:`In queue`},{kind:`blocked`,fr:`Bloqué`,en:`Blocked`},{kind:`todo`,fr:`À faire`,en:`To do`},{kind:`backlog`,fr:`Backlog`,en:`Backlog`}];function Ir(e=`fr`){let t=e===`en`?{test:`- [ ] Check the new settings page (me)`,decide:`- [ ] Keep the old layout? (me)`,review:`- [ ] Offline banner [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me)`,blocked:`- [ ] Publish the guide — blocked by: review (agent)`,doing:`- [ ] Fix the offline banner [b:gray(t-0001)](t-0001) (agent → t-0001)`,queue:`- [ ] Export to CSV (agent)`,todo:`- [ ] Keyboard shortcuts help (agent)`,backlog:`- [ ] Dark mode for charts (agent)`}:{test:`- [ ] Vérifier la nouvelle page Réglages (me)`,decide:`- [ ] Garder l’ancienne disposition ? (me)`,review:`- [ ] Bandeau hors ligne [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me)`,blocked:`- [ ] Publier le guide — bloqué par : relecture (agent)`,doing:`- [ ] Corriger le bandeau hors ligne [b:gray(t-0001)](t-0001) (agent → t-0001)`,queue:`- [ ] Export CSV (agent)`,todo:`- [ ] Aide des raccourcis clavier (agent)`,backlog:`- [ ] Mode sombre des graphiques (agent)`};return`# Tasks\n\n${Fr.map(n=>`## ${e===`en`?n.en:n.fr}\n\n${t[n.kind]}`).join(`
63
63
 
64
- `)}\n`}function Ir(e){return[`test`,`decide`].filter(t=>!e.some(e=>e.kind===t))}function Lr(e=`fr`){let t=e===`en`,n=t=>`${t(`…`,e)}…`;return`${(t?[`wherdr Project panel: TASKS.md conventions and messages.`,`Lists, all optional: we choose together which ones this project uses (a small project may only need Backlog, In progress and Done). wherdr shows the ## lists present in TASKS.md, in this order: "## To test" (what I must check after a deploy), "## To decide" (questions for me), "## To review" (pull requests for me to review), "## In progress" (what a thread is really doing), "## In queue" (decided: you launch the first one as soon as a thread slot frees, in list order), "## Blocked" (waiting for someone or something external), "## To do" (to do soon, in my priority order; never launched on your own), "## Backlog" (everything else), "## Done".`,`One task per line: "- [ ] title (owner)", owner = me, agent or "agent → t-0140" (not shown); blocked tasks may add "— blocked by: reason" before the owner.`,`Badges (the only decoration wherdr shows): "[b:color(text)]", or "[b:color(text)](target)" for a clickable badge. Color: red, orange, amber, green, teal, blue, violet, pink, gray, #hex, or nothing (neutral). Target: an https:// link (opens a new tab) or a thread ID like t-0140 (opens its tab). Short text (24 characters max). E.g. "- [ ] Stop button [b:red(bug)] [b:gray(t-0140)](t-0140) [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me)".`,`Badges are free-form: use them on your own whenever they help me (status, owner, thread, PR, device, priority…), and follow the badge preferences I give you. Stay sparse: two or three badges per line at most. A bare URL in a task shows as a plain link.`,`"${Cr(`…`,e)}" → remove the line from To test.`,`"${n(wr)}" → treat it as a bug: fix it (new thread).`,`"${n(Tr)}" → answer: explain what to test and how.`,`"${n(Er)}" → apply the decision and remove the line from To decide.`,`"${Ar(`…`,e)}" → remove the line from To review.`,`"${jr(`…`,e)}…" → take the review feedback into account (on the PR or in a thread).`,`"${Mr(`…`,e)}" → restart the task or ask what is missing. Move a task to Blocked when it waits for something external.`,`"${Or(`…`,e)}" → launch a thread for this Backlog task.`,`"${n(kr)}" → add the detail to the task.`,`"${$(`up`,`…`,e)}" / "${$(`down`,`…`,e)}" → move the line one place up or down in its list (To do or In queue).`,`"${$(`queue`,`…`,e)}" → move the line from To do to the end of In queue.`,`"${$(`now`,`…`,e)}" → start a thread now if a slot is free in the project and on the machine (beyond the limits only if I say so), otherwise put it first in In queue.`,`"${$(`unqueue`,`…`,e)}" → move the line from In queue back to the top of To do. "${$(`backlog`,`…`,e)}" → move the line from To do to Backlog.`,`In queue contract: whenever a thread slot frees (a thread is resolved), launch the first In queue task and move it to In progress, as long as the machine has a free slot (next rule). Never launch To do or Backlog tasks without being asked.`,`Global limit per machine (all projects, set in wherdr): before starting a thread, read .wherdr-limits.json in the herdr-projects folder (the parent of this project's folder). machines[this].free = free thread slots on this machine (machines["<machine>"] for a thread started on another machine; max null = no global limit). If free is 0, the machine is full: wait, even if this project still has slots under max_parallel_threads; In queue tasks start when the machine has a free slot. File missing or out of date: count the open threads of every project with "herdr-projects overview".`,`After each deploy, add to To test what I must check. Put in To review each pull request I must review, with its link (link badge).`,`The ## lists in TASKS.md are the active lists: I ask you when one must be added or removed.`]:[`Panneau Projet de wherdr : conventions de TASKS.md et messages.`,`Listes, toutes facultatives : on choisit ensemble celles que ce projet utilise (un petit projet peut se contenter de Backlog, En cours et Fait). wherdr affiche les listes ## présentes dans TASKS.md, dans cet ordre : « ## À tester » (ce que je dois vérifier après un déploiement), « ## À décider » (questions pour moi), « ## À relire » (PR que je dois relire), « ## En cours » (ce qu’un thread fait vraiment), « ## En file » (décidé : tu lances la première dès qu’une place de thread se libère, dans l’ordre de la liste), « ## Bloqué » (attente de quelqu’un ou de quelque chose d’extérieur), « ## À faire » (à faire bientôt, dans mon ordre de priorité ; jamais lancé de toi-même), « ## Backlog » (tout le reste), « ## Fait ».`,`Une tâche par ligne : « - [ ] titre (responsable) », responsable = me, agent ou « agent → t-0140 » (non affiché) ; une tâche bloquée peut ajouter « — bloqué par : raison » avant le responsable.`,`Badges (seule décoration affichée par wherdr) : « [b:couleur(texte)] », ou « [b:couleur(texte)](cible) » pour un badge cliquable. Couleur : red, orange, amber, green, teal, blue, violet, pink, gray, #hex, ou rien (neutre). Cible : un lien https:// (nouvel onglet) ou un ID de thread comme t-0140 (ouvre son onglet). Texte court (24 caractères au plus). Ex. « - [ ] Bouton Stop [b:red(bug)] [b:gray(t-0140)](t-0140) [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me) ».`,`Les badges sont libres : utilise-les de toi-même quand ils me sont utiles (statut, responsable, thread, PR, appareil, priorité…), et suis les préférences de badges que je te donne. Reste sobre : deux ou trois badges par ligne au plus. Une URL brute dans une tâche s’affiche en lien simple.`,`« ${Cr(`…`,e)} » → retirer la ligne d’À tester.`,`« ${n(wr)} » → c’est un bug : le corriger (nouveau thread).`,`« ${n(Tr)} » → répondre : expliquer quoi tester et comment.`,`« ${n(Er)} » → appliquer la décision et retirer la ligne d’À décider.`,`« ${Ar(`…`,e)} » → retirer la ligne d’À relire.`,`« ${jr(`…`,e)}… » → prendre en compte ce retour de relecture (sur la PR ou dans un thread).`,`« ${Mr(`…`,e)} » → relancer la tâche ou demander ce qui manque. Déplacer une tâche en Bloqué quand elle attend quelque chose d’extérieur.`,`« ${Or(`…`,e)} » → lancer un thread pour cette tâche du Backlog.`,`« ${n(kr)} » → compléter la tâche avec cette précision.`,`« ${$(`up`,`…`,e)} » / « ${$(`down`,`…`,e)} » → monter ou descendre la ligne d’un cran dans sa liste (À faire ou En file).`,`« ${$(`queue`,`…`,e)} » → déplacer la ligne d’À faire à la fin d’En file.`,`« ${$(`now`,`…`,e)} » → lancer un thread tout de suite si une place est libre dans le projet et sur la machine (au-delà des limites seulement si je le dis), sinon la mettre en tête d’En file.`,`« ${$(`unqueue`,`…`,e)} » → remettre la ligne d’En file en tête d’À faire. « ${$(`backlog`,`…`,e)} » → déplacer la ligne d’À faire vers Backlog.`,`Contrat d’En file : dès qu’une place de thread se libère (thread clôturé), lancer la première tâche d’En file et la passer dans En cours, si la machine a une place libre (règle suivante). Ne jamais lancer une tâche d’À faire ou du Backlog sans qu’on te le demande.`,`Limite globale par machine (tous projets, réglée dans wherdr) : avant de lancer un thread, lire .wherdr-limits.json dans le dossier herdr-projects (le parent du dossier de ce projet). machines[this].free = places de thread libres sur cette machine (machines["<machine>"] pour un thread lancé sur une autre machine ; max null = pas de limite globale). Si free vaut 0, la machine est pleine : attendre, même si ce projet a encore des places sous max_parallel_threads ; les tâches d’En file partent quand la machine a une place libre. Fichier absent ou périmé : compter les threads ouverts de tous les projets avec « herdr-projects overview ».`,`Après chaque déploiement, ajouter à À tester ce que je dois vérifier. Mettre dans À relire chaque PR que je dois relire, avec son lien (badge-lien).`,`Les listes ## de TASKS.md sont les listes actives : je te demande d’en ajouter ou d’en retirer une.`]).join(`
65
- `)}\n`}var Rr=`.wherdr-limits.json`;function zr(e,t=`fr`){if(!e||!(e.max&&e.max>0))return null;let n=e.open>=e.max;if(t===`en`){let t=`${e.open} of ${e.max} thread slot${e.max===1?``:`s`} in use on ${e.label} (all projects)`;return n?`${t} · full: the queue waits`:t}let r=`${e.open} place${e.open>1?`s`:``} de thread sur ${e.max} occupée${e.open>1?`s`:``} sur ${e.label} (tous projets)`;return n?`${r} · pleine : la file attend`:r}var Br=a(null),Vr=a(!1);async function Hr(){Vr.value=!0;try{Br.value=await pe(`/api/worktrees`)}catch(e){fe(e.message,!0)}finally{Vr.value=!1}}var Ur=e=>e.branch||e.path.split(`/`).pop()||e.path;async function Wr(e){let t=Ur(e),n=e.agents?ge(` ${e.agents>1?`Its ${e.agents} agents will be stopped`:`Its agent will be stopped`}.`,` ${e.agents>1?`Ses ${e.agents} agents seront arrêtés`:`Son agent sera arrêté`}.`):e.panes?ge(` Its terminals will be closed.`,` Ses terminaux seront fermés.`):``,r=e.branch?ge(` Branch ${e.branch} is kept.`,` La branche ${e.branch} est gardée.`):``;if(!await v(ge(`Delete worktree ${t} (${e.path})?${n}${r}`,`Supprimer le worktree ${t} (${e.path}) ?${n}${r}`),y(`Delete`)))return!1;let i=!1;for(;;)try{return await pe(`/api/worktrees/remove`,{machine:e.machine,path:e.path,force:i}),fe(ge(`Worktree ${t} deleted`,`Worktree ${t} supprimé`)),Br.value&&=Br.value.filter(t=>t.machine!==e.machine||t.path!==e.path),!0}catch(e){if(!i&&e instanceof he&&e.code===`dirty`){if(!await v(ge(`${t} has uncommitted changes. Delete them with the worktree?`,`${t} contient des modifications non commitées. Les supprimer avec le worktree ?`),y(`Force delete`)))return!1;i=!0;continue}return fe(e.message,!0),!1}}export{Mr as C,Fe as D,D as E,ye as O,_r as S,mr as T,xr as _,Rr as a,Fr as b,Lr as c,Or as d,Ir as f,Tr as g,wr as h,Br as i,ve as k,Er as l,Dr as m,Wr as n,zr as o,$ as p,Ur as r,br as s,Hr as t,kr as u,jr as v,Sr as w,Cr as x,Ar as y};
64
+ `)}\n`}function Lr(e){return[`test`,`decide`].filter(t=>!e.some(e=>e.kind===t))}function Rr(e=`fr`){let t=e===`en`,n=t=>`${t(`…`,e)}…`;return`${(t?[`wherdr Project panel: TASKS.md conventions and messages.`,`Lists, all optional: we choose together which ones this project uses (a small project may only need Backlog, In progress and Done). wherdr shows the ## lists present in TASKS.md, in this order: "## To test" (what I must check after a deploy), "## To decide" (questions for me), "## To review" (pull requests for me to review), "## In progress" (what a thread is really doing), "## In queue" (decided: you launch the first one as soon as a thread slot frees, in list order), "## Blocked" (waiting for someone or something external), "## To do" (to do soon, in my priority order; never launched on your own), "## Backlog" (everything else), "## Done".`,`One task per line: "- [ ] title (owner)", owner = me, agent or "agent → t-0140" (not shown); blocked tasks may add "— blocked by: reason" before the owner.`,`Badges (the only decoration wherdr shows): "[b:color(text)]", or "[b:color(text)](target)" for a clickable badge. Color: red, orange, amber, green, teal, blue, violet, pink, gray, #hex, or nothing (neutral). Target: an https:// link (opens a new tab) or a thread ID like t-0140 (opens its tab). Short text (24 characters max). E.g. "- [ ] Stop button [b:red(bug)] [b:gray(t-0140)](t-0140) [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me)".`,`Badges are free-form: use them on your own whenever they help me (status, owner, thread, PR, device, priority…), and follow the badge preferences I give you. Stay sparse: two or three badges per line at most. A bare URL in a task shows as a plain link.`,`"${Cr(`…`,e)}" → remove the line from To test.`,`"${n(wr)}" → treat it as a bug: fix it (new thread).`,`"${n(Tr)}" → answer: explain what to test and how.`,`"${n(Er)}" → apply the decision and remove the line from To decide.`,`"${Ar(`…`,e)}" → remove the line from To review.`,`"${jr(`…`,e)}…" → take the review feedback into account (on the PR or in a thread).`,`"${Mr(`…`,e)}" → restart the task or ask what is missing. Move a task to Blocked when it waits for something external.`,`"${Or(`…`,e)}" → launch a thread for this Backlog task.`,`"${n(kr)}" → add the detail to the task.`,`"${Nr(`t-0140`,`…`,e)}" → pass the text on to that thread as is ("herdr-projects thread prompt"), then confirm in one line. Do not change TASKS.md.`,`"${$(`up`,`…`,e)}" / "${$(`down`,`…`,e)}" → move the line one place up or down in its list (To do or In queue).`,`"${$(`queue`,`…`,e)}" → move the line from To do to the end of In queue.`,`"${$(`now`,`…`,e)}" → start a thread now if a slot is free in the project and on the machine (beyond the limits only if I say so), otherwise put it first in In queue.`,`"${$(`unqueue`,`…`,e)}" → move the line from In queue back to the top of To do. "${$(`backlog`,`…`,e)}" → move the line from To do to Backlog.`,`In queue contract: whenever a thread slot frees (a thread is resolved), launch the first In queue task and move it to In progress, as long as the machine has a free slot (next rule). Never launch To do or Backlog tasks without being asked.`,`Global limit per machine (all projects, set in wherdr): before starting a thread, read .wherdr-limits.json in the herdr-projects folder (the parent of this project's folder). machines[this].free = free thread slots on this machine (machines["<machine>"] for a thread started on another machine; max null = no global limit). If free is 0, the machine is full: wait, even if this project still has slots under max_parallel_threads; In queue tasks start when the machine has a free slot. File missing or out of date: count the open threads of every project with "herdr-projects overview".`,`After each deploy, add to To test what I must check. Put in To review each pull request I must review, with its link (link badge).`,`The ## lists in TASKS.md are the active lists: I ask you when one must be added or removed.`]:[`Panneau Projet de wherdr : conventions de TASKS.md et messages.`,`Listes, toutes facultatives : on choisit ensemble celles que ce projet utilise (un petit projet peut se contenter de Backlog, En cours et Fait). wherdr affiche les listes ## présentes dans TASKS.md, dans cet ordre : « ## À tester » (ce que je dois vérifier après un déploiement), « ## À décider » (questions pour moi), « ## À relire » (PR que je dois relire), « ## En cours » (ce qu’un thread fait vraiment), « ## En file » (décidé : tu lances la première dès qu’une place de thread se libère, dans l’ordre de la liste), « ## Bloqué » (attente de quelqu’un ou de quelque chose d’extérieur), « ## À faire » (à faire bientôt, dans mon ordre de priorité ; jamais lancé de toi-même), « ## Backlog » (tout le reste), « ## Fait ».`,`Une tâche par ligne : « - [ ] titre (responsable) », responsable = me, agent ou « agent → t-0140 » (non affiché) ; une tâche bloquée peut ajouter « — bloqué par : raison » avant le responsable.`,`Badges (seule décoration affichée par wherdr) : « [b:couleur(texte)] », ou « [b:couleur(texte)](cible) » pour un badge cliquable. Couleur : red, orange, amber, green, teal, blue, violet, pink, gray, #hex, ou rien (neutre). Cible : un lien https:// (nouvel onglet) ou un ID de thread comme t-0140 (ouvre son onglet). Texte court (24 caractères au plus). Ex. « - [ ] Bouton Stop [b:red(bug)] [b:gray(t-0140)](t-0140) [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me) ».`,`Les badges sont libres : utilise-les de toi-même quand ils me sont utiles (statut, responsable, thread, PR, appareil, priorité…), et suis les préférences de badges que je te donne. Reste sobre : deux ou trois badges par ligne au plus. Une URL brute dans une tâche s’affiche en lien simple.`,`« ${Cr(`…`,e)} » → retirer la ligne d’À tester.`,`« ${n(wr)} » → c’est un bug : le corriger (nouveau thread).`,`« ${n(Tr)} » → répondre : expliquer quoi tester et comment.`,`« ${n(Er)} » → appliquer la décision et retirer la ligne d’À décider.`,`« ${Ar(`…`,e)} » → retirer la ligne d’À relire.`,`« ${jr(`…`,e)}… » → prendre en compte ce retour de relecture (sur la PR ou dans un thread).`,`« ${Mr(`…`,e)} » → relancer la tâche ou demander ce qui manque. Déplacer une tâche en Bloqué quand elle attend quelque chose d’extérieur.`,`« ${Or(`…`,e)} » → lancer un thread pour cette tâche du Backlog.`,`« ${n(kr)} » → compléter la tâche avec cette précision.`,`« ${Nr(`t-0140`,`…`,e)} » → transmettre le texte tel quel à ce thread (« herdr-projects thread prompt »), puis confirmer en une ligne. Ne pas modifier TASKS.md.`,`« ${$(`up`,`…`,e)} » / « ${$(`down`,`…`,e)} » → monter ou descendre la ligne d’un cran dans sa liste (À faire ou En file).`,`« ${$(`queue`,`…`,e)} » → déplacer la ligne d’À faire à la fin d’En file.`,`« ${$(`now`,`…`,e)} » → lancer un thread tout de suite si une place est libre dans le projet et sur la machine (au-delà des limites seulement si je le dis), sinon la mettre en tête d’En file.`,`« ${$(`unqueue`,`…`,e)} » → remettre la ligne d’En file en tête d’À faire. « ${$(`backlog`,`…`,e)} » → déplacer la ligne d’À faire vers Backlog.`,`Contrat d’En file : dès qu’une place de thread se libère (thread clôturé), lancer la première tâche d’En file et la passer dans En cours, si la machine a une place libre (règle suivante). Ne jamais lancer une tâche d’À faire ou du Backlog sans qu’on te le demande.`,`Limite globale par machine (tous projets, réglée dans wherdr) : avant de lancer un thread, lire .wherdr-limits.json dans le dossier herdr-projects (le parent du dossier de ce projet). machines[this].free = places de thread libres sur cette machine (machines["<machine>"] pour un thread lancé sur une autre machine ; max null = pas de limite globale). Si free vaut 0, la machine est pleine : attendre, même si ce projet a encore des places sous max_parallel_threads ; les tâches d’En file partent quand la machine a une place libre. Fichier absent ou périmé : compter les threads ouverts de tous les projets avec « herdr-projects overview ».`,`Après chaque déploiement, ajouter à À tester ce que je dois vérifier. Mettre dans À relire chaque PR que je dois relire, avec son lien (badge-lien).`,`Les listes ## de TASKS.md sont les listes actives : je te demande d’en ajouter ou d’en retirer une.`]).join(`
65
+ `)}\n`}var zr=`.wherdr-limits.json`;function Br(e,t=`fr`){if(!e||!(e.max&&e.max>0))return null;let n=e.open>=e.max;if(t===`en`){let t=`${e.open} of ${e.max} thread slot${e.max===1?``:`s`} in use on ${e.label} (all projects)`;return n?`${t} · full: the queue waits`:t}let r=`${e.open} place${e.open>1?`s`:``} de thread sur ${e.max} occupée${e.open>1?`s`:``} sur ${e.label} (tous projets)`;return n?`${r} · pleine : la file attend`:r}var Vr=a(null),Hr=a(!1);async function Ur(){Hr.value=!0;try{Vr.value=await pe(`/api/worktrees`)}catch(e){fe(e.message,!0)}finally{Hr.value=!1}}var Wr=e=>e.branch||e.path.split(`/`).pop()||e.path;async function Gr(e){let t=Wr(e),n=e.agents?ge(` ${e.agents>1?`Its ${e.agents} agents will be stopped`:`Its agent will be stopped`}.`,` ${e.agents>1?`Ses ${e.agents} agents seront arrêtés`:`Son agent sera arrêté`}.`):e.panes?ge(` Its terminals will be closed.`,` Ses terminaux seront fermés.`):``,r=e.branch?ge(` Branch ${e.branch} is kept.`,` La branche ${e.branch} est gardée.`):``;if(!await v(ge(`Delete worktree ${t} (${e.path})?${n}${r}`,`Supprimer le worktree ${t} (${e.path}) ?${n}${r}`),y(`Delete`)))return!1;let i=!1;for(;;)try{return await pe(`/api/worktrees/remove`,{machine:e.machine,path:e.path,force:i}),fe(ge(`Worktree ${t} deleted`,`Worktree ${t} supprimé`)),Vr.value&&=Vr.value.filter(t=>t.machine!==e.machine||t.path!==e.path),!0}catch(e){if(!i&&e instanceof he&&e.code===`dirty`){if(!await v(ge(`${t} has uncommitted changes. Delete them with the worktree?`,`${t} contient des modifications non commitées. Les supprimer avec le worktree ?`),y(`Force delete`)))return!1;i=!0;continue}return fe(e.message,!0),!1}}export{ve as A,_r as C,D,mr as E,Fe as O,Cr as S,Sr as T,Tr as _,zr as a,Ar as b,Rr as c,Nr as d,Or as f,wr as g,Dr as h,Vr as i,ye as k,Er as l,$ as m,Gr as n,Br as o,Lr as p,Wr as r,br as s,Ur as t,kr as u,xr as v,Mr as w,Ir as x,jr as y};
@@ -1 +1 @@
1
- import{A as e,Hn as t,M as n,Ot as r,U as i}from"./SiL1FJ5s.js";import{f as a}from"./Ci8N4mWR.js";import{t as o}from"./BB3uOVbO.js";var s=i({__name:`[pane]`,setup(i){let s=a(),c=e(()=>String(s.params.pane||``));return(e,i)=>{let a=o;return r(),n(a,{key:t(c),"pane-id":t(c)},null,8,[`pane-id`])}}});export{s as default};
1
+ import{A as e,Hn as t,M as n,Ot as r,U as i}from"./SiL1FJ5s.js";import{f as a}from"./Ci8N4mWR.js";import{t as o}from"./8ksjcuDu.js";var s=i({__name:`[pane]`,setup(i){let s=a(),c=e(()=>String(s.params.pane||``));return(e,i)=>{let a=o;return r(),n(a,{key:t(c),"pane-id":t(c)},null,8,[`pane-id`])}}});export{s as default};
@@ -0,0 +1 @@
1
+ import{Ot as e,P as t,St as n,U as r}from"./SiL1FJ5s.js";import{f as i,u as a}from"./Ci8N4mWR.js";import{t as o}from"#entry";var s=r({__name:`setup`,setup(r){let s=i();return n(()=>{o(s.query.step),a(`/`,{replace:!0})}),(n,r)=>(e(),t(`div`))}});export{s as default};