wherdr 1.3.3 → 2.0.0

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 (252) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/BDNMzG2s.js +1 -0
  3. package/.output/public/_nuxt/BETID3_E.js +1 -0
  4. package/.output/public/_nuxt/BHenDMeH.js +1 -0
  5. package/.output/public/_nuxt/BYZVrreW.js +1 -0
  6. package/.output/public/_nuxt/BhgehRdJ.js +1 -0
  7. package/.output/public/_nuxt/{yzABg5xl.js → Bpoxvzh6.js} +1 -1
  8. package/.output/public/_nuxt/BtH82ZuZ.js +9 -0
  9. package/.output/public/_nuxt/C25ROUa9.js +3 -0
  10. package/.output/public/_nuxt/C3Bkn4ac.js +62 -0
  11. package/.output/public/_nuxt/CDWjMk9C.js +2 -0
  12. package/.output/public/_nuxt/{Ci8N4mWR.js → CXJnLmWv.js} +1 -1
  13. package/.output/public/_nuxt/CuUQ4mEf.js +1 -0
  14. package/.output/public/_nuxt/DFGEl0v2.js +23 -0
  15. package/.output/public/_nuxt/{CKhgznq4.js → DFmgQVme.js} +42 -39
  16. package/.output/public/_nuxt/DZGKxROq.js +6 -0
  17. package/.output/public/_nuxt/DmkWvmnE.js +2 -0
  18. package/.output/public/_nuxt/DrKKeFFE.js +31 -0
  19. package/.output/public/_nuxt/DyfFwwGq.js +1 -0
  20. package/.output/public/_nuxt/FaNto0ga.js +105 -0
  21. package/.output/public/_nuxt/NIF0VwHk.js +25 -0
  22. package/.output/public/_nuxt/R0Y4VoeX.js +1 -0
  23. package/.output/public/_nuxt/board.CEEcFc6M.css +1 -0
  24. package/.output/public/_nuxt/builds/latest.json +1 -1
  25. package/.output/public/_nuxt/builds/meta/0b28b3e9-664e-4347-a35b-afb0a711d5c5.json +1 -0
  26. package/.output/public/_nuxt/entry.CKoXcwRa.css +2 -0
  27. package/.output/public/_nuxt/pdf.min.t82Z80JU.mjs +28 -0
  28. package/.output/public/_nuxt/pdf.worker.min.wgc6bjNh.mjs +28 -0
  29. package/.output/public/_nuxt/settings.Cdb21nNw.css +1 -0
  30. package/.output/public/sw.js +1 -1
  31. package/.output/server/chunks/_/branding.mjs +1 -1
  32. package/.output/server/chunks/_/changes.mjs +4 -4
  33. package/.output/server/chunks/_/fileDownload.mjs +278 -0
  34. package/.output/server/chunks/_/files.mjs +60 -20
  35. package/.output/server/chunks/_/machineOrder.mjs +1 -1
  36. package/.output/server/chunks/_/onboarding.mjs +1 -1
  37. package/.output/server/chunks/_/package.mjs +11 -3
  38. package/.output/server/chunks/_/plugins.mjs +92 -122
  39. package/.output/server/chunks/_/restart.mjs +1 -1
  40. package/.output/server/chunks/_/selfupdate.mjs +1 -1
  41. package/.output/server/chunks/_/settingstabs.mjs +36 -0
  42. package/.output/server/chunks/_/updates.mjs +1 -1
  43. package/.output/server/chunks/_/worktrees.mjs +1 -1
  44. package/.output/server/chunks/_/ws.mjs +43 -6
  45. package/.output/server/chunks/nitro/nitro.mjs +14126 -10238
  46. package/.output/server/chunks/raw/check-doc-links.mjs +5 -0
  47. package/.output/server/chunks/raw/check-leaks.mjs +1 -1
  48. package/.output/server/chunks/raw/check-release-notes.mjs +5 -0
  49. package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
  50. package/.output/server/chunks/raw/install-claude-statusline.mjs +1 -1
  51. package/.output/server/chunks/raw/prerelease-summary.mjs +5 -0
  52. package/.output/server/chunks/raw/prerelease.mjs +7 -0
  53. package/.output/server/chunks/raw/reveal.mjs +1 -1
  54. package/.output/server/chunks/raw/test-affected.mjs +5 -0
  55. package/.output/server/chunks/routes/api/_..._.mjs +6 -5
  56. package/.output/server/chunks/routes/api/agents.post.mjs +6 -5
  57. package/.output/server/chunks/routes/api/ask-tab.post.mjs +6 -5
  58. package/.output/server/chunks/routes/api/attach.post.mjs +6 -5
  59. package/.output/server/chunks/routes/api/auth/disable.post.mjs +6 -5
  60. package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +6 -5
  61. package/.output/server/chunks/routes/api/auth/lock.post.mjs +6 -5
  62. package/.output/server/chunks/routes/api/auth/login/options.post.mjs +6 -5
  63. package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +6 -5
  64. package/.output/server/chunks/routes/api/auth/max-session.post.mjs +6 -5
  65. package/.output/server/chunks/routes/api/auth/register/options.post.mjs +6 -5
  66. package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +6 -5
  67. package/.output/server/chunks/routes/api/auth/status.get.mjs +6 -5
  68. package/.output/server/chunks/routes/api/changes.get.mjs +7 -6
  69. package/.output/server/chunks/routes/api/chat/image.get.mjs +7 -6
  70. package/.output/server/chunks/routes/api/chat.get.mjs +44 -11
  71. package/.output/server/chunks/routes/api/choose.post.mjs +44 -30
  72. package/.output/server/chunks/routes/api/claude-setup.post.mjs +42 -0
  73. package/.output/server/chunks/routes/api/claude-statusline.post.mjs +7 -6
  74. package/.output/server/chunks/routes/api/clear-queued-input.post.mjs +42 -0
  75. package/.output/server/chunks/routes/api/close/status.get.mjs +7 -6
  76. package/.output/server/chunks/routes/api/close.post.mjs +6 -5
  77. package/.output/server/chunks/routes/api/codex-update.post.mjs +7 -6
  78. package/.output/server/chunks/routes/api/commands.get.mjs +9 -7
  79. package/.output/server/chunks/routes/api/config.get.mjs +10 -13
  80. package/.output/server/chunks/routes/api/dirs.get.mjs +7 -6
  81. package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +7 -6
  82. package/.output/server/chunks/routes/api/dismiss.post.mjs +7 -6
  83. package/.output/server/chunks/routes/api/effort.post.mjs +7 -6
  84. package/.output/server/chunks/routes/api/efforts.get.mjs +7 -6
  85. package/.output/server/chunks/routes/api/file.post.mjs +7 -6
  86. package/.output/server/chunks/routes/api/files/download.get.mjs +12 -24
  87. package/.output/server/chunks/routes/api/files/download.head.mjs +41 -0
  88. package/.output/server/chunks/routes/api/files/read.get.mjs +8 -7
  89. package/.output/server/chunks/routes/api/files.get.mjs +7 -6
  90. package/.output/server/chunks/routes/api/health.get.mjs +6 -5
  91. package/.output/server/chunks/routes/api/input.post.mjs +33 -15
  92. package/.output/server/chunks/routes/api/interrupt.post.mjs +24 -21
  93. package/.output/server/chunks/routes/api/isgit.get.mjs +8 -8
  94. package/.output/server/chunks/routes/api/machine/awake.get.mjs +7 -6
  95. package/.output/server/chunks/routes/api/machine/awake.post.mjs +7 -6
  96. package/.output/server/chunks/routes/api/machine/order.get.mjs +6 -5
  97. package/.output/server/chunks/routes/api/machine/order.post.mjs +6 -5
  98. package/.output/server/chunks/routes/api/machine/reconnect.post.mjs +40 -0
  99. package/.output/server/chunks/routes/api/machine/rename.post.mjs +7 -6
  100. package/.output/server/chunks/routes/api/machine/status.post.mjs +39 -0
  101. package/.output/server/chunks/routes/api/menu-left.post.mjs +40 -0
  102. package/.output/server/chunks/routes/api/menu.post.mjs +10 -6
  103. package/.output/server/chunks/routes/api/model.post.mjs +7 -6
  104. package/.output/server/chunks/routes/api/models.get.mjs +7 -6
  105. package/.output/server/chunks/routes/api/nav.post.mjs +40 -26
  106. package/.output/server/chunks/routes/api/onboarding.get.mjs +6 -5
  107. package/.output/server/chunks/routes/api/onboarding.post.mjs +6 -5
  108. package/.output/server/chunks/routes/api/phone.get.mjs +8 -10
  109. package/.output/server/chunks/routes/api/phone.post.mjs +8 -10
  110. package/.output/server/chunks/routes/api/plugins/actions.get.mjs +6 -8
  111. package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +6 -8
  112. package/.output/server/chunks/routes/api/plugins/projects.get.mjs +10 -8
  113. package/.output/server/chunks/routes/api/plugins/projects.post.mjs +11 -7
  114. package/.output/server/chunks/routes/api/prompt.post.mjs +22 -13
  115. package/.output/server/chunks/routes/api/push/quiet.post.mjs +7 -6
  116. package/.output/server/chunks/routes/api/push/subscribe.post.mjs +7 -7
  117. package/.output/server/chunks/routes/api/push/test.post.mjs +7 -6
  118. package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +7 -6
  119. package/.output/server/chunks/routes/api/quotas.get.mjs +7 -6
  120. package/.output/server/chunks/routes/api/rename.post.mjs +6 -5
  121. package/.output/server/chunks/routes/api/requeue.post.mjs +7 -6
  122. package/.output/server/chunks/routes/api/restart.get.mjs +6 -5
  123. package/.output/server/chunks/routes/api/restart.post.mjs +6 -5
  124. package/.output/server/chunks/routes/api/reveal.post.mjs +91 -8
  125. package/.output/server/chunks/routes/api/screen-key.post.mjs +19 -15
  126. package/.output/server/chunks/routes/api/screen.get.mjs +8 -40
  127. package/.output/server/chunks/routes/api/search.get.mjs +7 -6
  128. package/.output/server/chunks/routes/api/seen.post.mjs +7 -6
  129. package/.output/server/chunks/routes/api/sessions.get.mjs +7 -6
  130. package/.output/server/chunks/routes/api/sessions.post.mjs +7 -6
  131. package/.output/server/chunks/routes/api/settings-tab.post.mjs +90 -0
  132. package/.output/server/chunks/routes/api/{plugins/thread-limits.get.mjs → settings.get.mjs} +10 -9
  133. package/.output/server/chunks/routes/api/settings.post.mjs +40 -0
  134. package/.output/server/chunks/routes/api/space.post.mjs +34 -18
  135. package/.output/server/chunks/routes/api/state.get.mjs +7 -6
  136. package/.output/server/chunks/routes/api/tasks/action.post.mjs +39 -0
  137. package/.output/server/chunks/routes/api/{plugins/profiles.get.mjs → tasks/add.post.mjs} +12 -14
  138. package/.output/server/chunks/routes/api/tasks/after.post.mjs +39 -0
  139. package/.output/server/chunks/routes/api/tasks/approve.post.mjs +39 -0
  140. package/.output/server/chunks/routes/api/{project/report.get.mjs → tasks/archived.get.mjs} +12 -13
  141. package/.output/server/chunks/routes/api/{gitroot.get.mjs → tasks/autopilot.get.mjs} +13 -14
  142. package/.output/server/chunks/routes/api/tasks/autopilot.post.mjs +39 -0
  143. package/.output/server/chunks/routes/api/{index.get.mjs → tasks/board-settings.get.mjs} +12 -13
  144. package/.output/server/chunks/routes/api/tasks/board-settings.post.mjs +39 -0
  145. package/.output/server/chunks/routes/api/tasks/coordinator.get.mjs +40 -0
  146. package/.output/server/chunks/routes/api/tasks/coordinator.post.mjs +39 -0
  147. package/.output/server/chunks/routes/api/tasks/details.get.mjs +40 -0
  148. package/.output/server/chunks/routes/api/tasks/limit.post.mjs +39 -0
  149. package/.output/server/chunks/routes/api/tasks/links.get.mjs +39 -0
  150. package/.output/server/chunks/routes/api/tasks/models.get.mjs +40 -0
  151. package/.output/server/chunks/routes/api/tasks/pick.post.mjs +39 -0
  152. package/.output/server/chunks/routes/api/tasks/question.post.mjs +39 -0
  153. package/.output/server/chunks/routes/api/tasks/scheduled.get.mjs +40 -0
  154. package/.output/server/chunks/routes/api/{project → tasks}/settings.get.mjs +10 -11
  155. package/.output/server/chunks/routes/api/tasks/start.get.mjs +40 -0
  156. package/.output/server/chunks/routes/api/tasks/tell.post.mjs +39 -0
  157. package/.output/server/chunks/routes/api/tasks.get.mjs +39 -0
  158. package/.output/server/chunks/routes/api/unqueue.post.mjs +7 -6
  159. package/.output/server/chunks/routes/api/update/status.get.mjs +6 -5
  160. package/.output/server/chunks/routes/api/update.get.mjs +8 -10
  161. package/.output/server/chunks/routes/api/update.post.mjs +8 -10
  162. package/.output/server/chunks/routes/api/upload.post.mjs +7 -6
  163. package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +6 -5
  164. package/.output/server/chunks/routes/api/worktrees.get.mjs +6 -5
  165. package/.output/server/chunks/routes/favicon.ico.get.mjs +6 -5
  166. package/.output/server/chunks/routes/icons/_name_.get.mjs +7 -6
  167. package/.output/server/chunks/routes/renderer.mjs +8 -7
  168. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +7 -6
  169. package/.output/server/chunks/routes/ws/_..._.mjs +7 -6
  170. package/.output/server/chunks/routes/ws/events.mjs +9 -7
  171. package/.output/server/chunks/routes/ws/term.mjs +7 -6
  172. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  173. package/.output/server/index.mjs +7 -6
  174. package/.output/server/package.json +1 -1
  175. package/README.md +44 -1424
  176. package/bin/lib/commands.mjs +44 -9
  177. package/bin/lib/panel.mjs +3 -11
  178. package/bin/lib/service.mjs +41 -2
  179. package/bin/lib/skill.mjs +1 -1
  180. package/bin/lib/tailnet.d.mts +6 -3
  181. package/bin/lib/tailnet.mjs +70 -32
  182. package/bin/lib/userpath.d.mts +14 -0
  183. package/bin/lib/userpath.mjs +142 -0
  184. package/docs/README.md +58 -0
  185. package/docs/RELEASING.md +174 -0
  186. package/docs/board.md +164 -0
  187. package/docs/command.md +58 -0
  188. package/docs/configuration.md +39 -0
  189. package/docs/conversation.md +132 -0
  190. package/docs/development.md +38 -0
  191. package/docs/devices.md +58 -0
  192. package/docs/files.md +29 -0
  193. package/docs/herdr-projects-1x.md +278 -0
  194. package/docs/home.md +52 -0
  195. package/docs/installation.md +174 -0
  196. package/docs/machines.md +69 -0
  197. package/docs/migrate-from-1.x-docker.md +160 -0
  198. package/docs/networks.md +154 -0
  199. package/docs/notifications.md +83 -0
  200. package/docs/overview.md +71 -0
  201. package/docs/phone.md +26 -0
  202. package/docs/plugins.md +109 -0
  203. package/docs/quick-start.md +89 -0
  204. package/docs/quotas.md +65 -0
  205. package/docs/release-notes-2.0.0.md +84 -0
  206. package/docs/security.md +117 -0
  207. package/docs/terminal.md +15 -0
  208. package/docs/troubleshooting.md +45 -0
  209. package/package.json +11 -3
  210. package/skills/wherdr/SKILL.md +24 -167
  211. package/.output/public/_nuxt/B4Yk2tB1.js +0 -23
  212. package/.output/public/_nuxt/BBw_0a4M.js +0 -6
  213. package/.output/public/_nuxt/BSy6OCIY.js +0 -1
  214. package/.output/public/_nuxt/BX5PM2JQ.js +0 -1
  215. package/.output/public/_nuxt/BgPDnf2S.js +0 -1
  216. package/.output/public/_nuxt/BkOxQzbS.js +0 -2
  217. package/.output/public/_nuxt/CP8o925U.js +0 -1
  218. package/.output/public/_nuxt/CWwyK2XK.js +0 -2
  219. package/.output/public/_nuxt/CkbmecwS.js +0 -1
  220. package/.output/public/_nuxt/Cr3SrGky.js +0 -1
  221. package/.output/public/_nuxt/DAg9fiVh.js +0 -89
  222. package/.output/public/_nuxt/DT8qZ0Wv.js +0 -1
  223. package/.output/public/_nuxt/DaaJIRB3.js +0 -1
  224. package/.output/public/_nuxt/DcJi16XA.js +0 -1
  225. package/.output/public/_nuxt/SiL1FJ5s.js +0 -3
  226. package/.output/public/_nuxt/VpjCgSXu.js +0 -36
  227. package/.output/public/_nuxt/builds/meta/c735b6c0-1bd0-47d7-a208-d310f0a06287.json +0 -1
  228. package/.output/public/_nuxt/dPxB2L94.js +0 -89
  229. package/.output/public/_nuxt/entry.CGWKmYU3.css +0 -2
  230. package/.output/public/_nuxt/xYX85SPI.js +0 -1
  231. package/.output/server/chunks/_/pluginPolicy.mjs +0 -93
  232. package/.output/server/chunks/_/projectBoard.mjs +0 -366
  233. package/.output/server/chunks/_/projectDocs.mjs +0 -106
  234. package/.output/server/chunks/_/projectInbox.mjs +0 -135
  235. package/.output/server/chunks/_/projectThreads.mjs +0 -46
  236. package/.output/server/chunks/_/projectThreads2.mjs +0 -61
  237. package/.output/server/chunks/_/projectsActions.mjs +0 -143
  238. package/.output/server/chunks/_/projectsPlugin.mjs +0 -56
  239. package/.output/server/chunks/_/reveal.mjs +0 -115
  240. package/.output/server/chunks/raw/dev.wherdr.open.mjs +0 -7
  241. package/.output/server/chunks/raw/docker-entrypoint.mjs +0 -7
  242. package/.output/server/chunks/raw/install-host-open.mjs +0 -7
  243. package/.output/server/chunks/raw/wherdr-open.mjs +0 -7
  244. package/.output/server/chunks/routes/api/board.get.mjs +0 -147
  245. package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +0 -45
  246. package/.output/server/chunks/routes/api/project/inbox.get.mjs +0 -43
  247. package/.output/server/chunks/routes/api/project/inbox.post.mjs +0 -43
  248. package/.output/server/chunks/routes/api/project/memory.get.mjs +0 -42
  249. package/.output/server/chunks/routes/api/project/routines.get.mjs +0 -43
  250. package/.output/server/chunks/routes/api/project/thread.get.mjs +0 -44
  251. package/.output/server/chunks/routes/api/project/thread.post.mjs +0 -45
  252. package/bin/install-docker-skill.sh +0 -20
@@ -1,180 +1,37 @@
1
1
  ---
2
2
  name: wherdr
3
- description: Conventions for coordinating a herdr-projects project whose TASKS.md is shown and driven by wherdr's Project panel and Board. Use when you coordinate a herdr-projects project (you edit TASKS.md, launch and merge threads), and whenever a message starts with "✓ Tested:", "✓ Testé :", "↳ Problem:", "↳ Problème :", "↳ Question:", "↳ Question :", "✗ Problem:", "✗ Problème :", "? Question:", "? Question :", "↳ Decision:", "↳ Décision :", "↳ Launch", "↳ Lancer", "↳ Move up", "↳ Monter", "↳ Move down", "↳ Descendre", "↳ Queue:", "↳ Mettre en file", "↳ Remove from queue", "↳ Retirer de la file", "↳ Back to backlog", "↳ Remettre au backlog", "↳ Mark blocked", "↳ Marquer bloqué", "↳ Move to To do", "↳ Passer en À faire", "↳ Mark done", "↳ Marquer fait", "↳ Unblock", "↳ Débloquer", "↳ Detail on", "↳ Précision sur", "✓ Reviewed:", "✓ Relu :", "↳ Feedback on", "↳ Retour sur", "↳ Info for", "↳ Info pour" or "↳ Quote".
3
+ description: Handle messages from wherdr 2.0's Board for herdr-projects 1.x. Use as the Coordinator or a task's agent when a message may come from the Board.
4
4
  ---
5
5
 
6
- # wherdr Project panel conventions
6
+ # wherdr and herdr-projects
7
7
 
8
- wherdr shows the project's `TASKS.md` as a board on the user's phone and computer, with
9
- buttons on each task. Each button sends a short message to you, the coordinator. You own
10
- `TASKS.md`: the panel never edits it, it only reads it and asks you to. wherdr's **Board**
11
- (every project, thread and agent in Blocked / To do / Ongoing / Finished columns) sends the
12
- same messages when the user moves a task card to another column, plus the three moves of
13
- its own listed below.
8
+ wherdr shows the user's Herdr agents on their phone and computer. Its **Board** shows the
9
+ herdr-projects work board (1.2.1 or later) of every machine, in the board's own five groups:
10
+ needs you, ready to approve, working, to do, done (Done is hidden until the user shows it, so
11
+ the user may not see a finished task there). wherdr reads the board through the
12
+ herdr-projects command line (`list --json`, `details <id> --json`); it never edits the
13
+ board's files.
14
14
 
15
- Follow the project's own instructions (`PROJECT.md`) first; this skill fills in what the
16
- panel expects. Write task lines and badges in the user's language.
15
+ ## What reaches you from the Board
17
16
 
18
- ## TASKS.md format
17
+ wherdr adds no message format of its own. What the user does on the Board goes through the
18
+ ordinary herdr-projects commands, as if typed on the machine:
19
19
 
20
- ```markdown
21
- ## To test
22
- - [ ] Swipe between panes on the phone [b:green(ready to test)] [b:gray(t-0042)](t-0042)
23
-
24
- ## In progress
25
- - [ ] Fix the quota shown for Codex [b:red(bug)] (agent → t-0043)
26
-
27
- ## In queue
28
- - [ ] Dark mode for the settings
29
-
30
- ## Backlog
31
- - [ ] Export a conversation as Markdown
32
- ```
33
-
34
- - Each `## Title` is a list; each `- [ ] text` (or `- text`) line under it is a task.
35
- `- [x]` marks it done. `#` headings, `###` subheadings, indented lines (task details) and
36
- fenced code blocks are ignored.
37
- - The last `(…)` of a line is the owner (`me`, `agent`, a name, `agent → t-NNNN`): read,
38
- never shown.
39
- - Lists are shown in a fixed order (the order below), whatever their order in the file.
40
- Unknown titles are shown after Backlog, without buttons. Only lists present in the file
41
- are shown (plus In progress when threads are open, and Done). Add or remove a list only
42
- when the user asks.
43
-
44
- ## Lists the panel recognizes
45
-
46
- Titles are matched case- and accent-insensitively; any of these names works.
47
-
48
- | List | Accepted titles | Meaning | Buttons |
49
- |---|---|---|---|
50
- | To test | À tester, To test, Testing, To verify, À vérifier, Test | Deployed, ready for the user to check. | Confirm, Problem, Question |
51
- | To decide | À décider, To decide, Decision(s), Decide, Question(s) | Questions only the user can settle. | Question, Answer |
52
- | To review | À relire, Relire, Relecture, To review, Review(s), Code review, PR(s), Pull request(s), À valider, To validate | Pull requests for the user to review; put the PR link in a badge or in the text. | Reviewed, Comment |
53
- | In progress | En cours, In progress, Doing, Ongoing, WIP, Active | Only what a thread is really doing now. Open threads are shown here live. | Add info (on a thread) |
54
- | In queue | En file, En file d'attente, File d'attente, File, In queue, Queue, Queued, Up next | Decided work: launch the first task as soon as a thread slot frees, in list order. | Up, Down, Launch now, Clarify, Remove from queue |
55
- | Blocked | Bloqué(e)(s), Blocked, On hold, En attente, Waiting, Stuck | Waiting for something external. Optional reason: `— blocked by: <reason>` (`— bloqué par : …`). | Unblock, Clarify |
56
- | To do | À faire, Todo, To do, To dos, Todos, Next, Prochainement, Soon | Soon, in the user's priority order. Never launched without a request. | Up, Down, Queue, Launch now, Clarify, Back to backlog |
57
- | Backlog | Backlog, Later, Plus tard, Idées, Ideas, Someday, Un jour | Everything else. Never launched without a request. | Launch, Clarify |
58
- | Done | Fait(s), Done, Terminé(e)(s), Finished, Complete(d) | Filled by the panel with resolved threads; you may leave it out. | — |
59
-
60
- Rules:
61
-
62
- - **To test** holds only what is deployed and ready. Work being fixed goes back to In
63
- progress; waiting work goes to In queue.
64
- - **No duplicates across lists.** When the user asks for a change to a feature that is in
65
- To test, remove its To test line; one line comes back to To test once the change is
66
- deployed (feature and change tested together).
67
- - **In queue** contract: whenever a thread slot frees (a thread is resolved), launch the
68
- first In queue task and move it to In progress, as long as the project and the machine
69
- have a free slot. The In queue header shows the thread slots in use
70
- (`max_parallel_threads` of `PROJECT.md`).
71
-
72
- ## Global thread limit per machine
73
-
74
- The user can set a maximum of threads per machine, across all projects, in wherdr
75
- (Settings › Plugins › herdr-projects). wherdr then writes `.wherdr-limits.json` in the
76
- herdr-projects folder (the parent of the project folder):
77
-
78
- ```json
79
- { "updated": "…", "this": "Server", "machines": { "Server": { "max": 2, "open": 2, "free": 0, "threads": ["shop/t-0012"] } } }
80
- ```
81
-
82
- Before starting a thread, read `machines[this].free` (or `machines["<machine>"]` for a
83
- thread on another machine; `max: null` means no global limit). When `free` is `0`, wait,
84
- even if the project still has slots. File missing or out of date: count the open threads of
85
- every project with `herdr-projects overview`. Go beyond a limit only when the user says so.
86
-
87
- ## `(agent → t-NNNN)`
88
-
89
- Write an In progress task handled by an open thread with the owner `(agent → t-NNNN)`
90
- (the arrow may also be `->`). The panel hides that line while the thread's own live card is
91
- shown, so the task does not appear twice. Write the thread ID exactly (`t-` and at least
92
- four digits).
93
-
94
- ## Badges
95
-
96
- The only decoration the panel draws. Anywhere on a task line:
97
-
98
- - `[b:color(text)]`: a badge. `[b:(text)]` is neutral.
99
- - `[b:color(text)](target)`: a clickable badge. Target: an `https://` (or `http://`) URL, or
100
- a thread ID (`t-0042`, opens that thread's tab). Anything else is not clickable.
101
- - Colors: `red`, `orange`, `amber`, `green`, `teal`, `blue`, `violet`, `pink`, `gray`
102
- (`grey`), a hex color (`#e5484d`, `#fff`), or nothing (neutral).
103
- - Text: short, at most 24 characters. It is removed from the task text (the text the
104
- panel sends back to you).
105
-
106
- Use them sparingly, when they help the user: two or three per line at most. Defaults
107
- unless the user prefers otherwise:
108
-
109
- - `[b:gray(t-0042)](t-0042)`: the thread a line comes from.
110
- - `[b:green(ready to test)]`: every To test line.
111
- - `[b:amber(fixing)]` (with the thread badge) on In progress work being fixed;
112
- `[b:gray(queued)]` on waiting work.
113
- - `[b:red(bug)]`: a fix. `[b:blue(iPhone)]`: to test on the phone.
114
- - A PR: `[b:violet(PR #12)](https://github.com/<owner>/<repo>/pull/12)`.
115
-
116
- A bare `http://` or `https://` URL in the task text also becomes a plain clickable
117
- link (for example `Review https://github.com/example/project/pull/12`). Use this
118
- when the URL should remain visible; use a linked badge for a compact label.
119
-
120
- ## Messages from the panel
121
-
122
- `<task>` is the task text as the panel shows it: the line without its checkbox, badges and
123
- owner. Find the line in `TASKS.md` by that text. The English or French form depends on the
124
- app language; treat them the same.
125
-
126
- Messages marked *sent* arrive as is. Messages marked *draft* are put in the user's input
127
- field, completed by the user, then sent. A draft starts with `↳` and ends with ` —`: it is a
128
- **reference**, the task on one line, the user's text on the lines below it, up to the next
129
- reference. (Earlier versions wrote a problem and a question on one line, `✗ Problem: <task> —
130
- <details>` and `? Question: <task> — <question>`: treat them the same.)
131
-
132
- The user quotes your own messages with the same kind of line, by the time shown on the message:
133
- `↳ Quote message 11:37 : <start of the message> —` (the whole message),
134
- `↳ Quote point 11:37 : <question, point or passage> —`,
135
- `↳ Quote decision 11:37 #3 : <question of row 3> —` (a row of a table of numbered decisions) and
136
- `↳ Quote decisions 11:37 #1-4 : <questions> —` (the whole table, usually followed by `OK to all`;
137
- `#1,4` when the rows are not consecutive).
138
- Read the lines under each one as the answer to that message and that row, even when you have
139
- written other messages since. Long excerpts are cut with `…`. A short code may follow the time
140
- or the row, as in `11:37 #3 ~k3f`: wherdr uses it to tell apart two of your messages written in
141
- the same minute, or two tables of one message. You have nothing to do with it.
142
- `↳ Info for` names a thread (`t-NNNN`) instead of a task; its text may span several lines.
143
-
144
- | Message (EN / FR) | From | What to do |
20
+ | On the Board | Command wherdr runs | Who gets it |
145
21
  |---|---|---|
146
- | `✓ Tested: <task>` / `✓ Testé : <task>` (sent) | To test › Confirm | The user validated it: remove the line from To test. |
147
- | `↳ Problem: <task> —` / `↳ Problème : <task> —`, then the details below (draft) | To test › Problem | A bug report: remove the line from To test, fix it (or launch a thread) and track it in In progress; it comes back to To test once the fix is deployed. |
148
- | `↳ Question: <task> —` / `↳ Question : <task> —`, then the question below (draft) | To test, To decide › Question | Answer in detail: what to test and how (where to tap, expected result), from the thread's report. Do not change `TASKS.md`. |
149
- | `↳ Decision: <task> —` / `↳ Décision : <task> —`, then the answer below (draft) | To decide › Answer | Apply the decision, remove the line from To decide, and record it where the project keeps durable decisions. |
150
- | `✓ Reviewed: <task>` / `✓ Relu : <task>` (sent) | To review › Reviewed | The user reviewed the PR: carry on (merge, deploy as the project says) and remove the line from To review. |
151
- | `↳ Feedback on <task> —` / `↳ Retour sur <task> —`, then the comments below (draft) | To review › Comment | Review feedback on that PR: apply it or send it to the thread. |
152
- | `↳ Move up: <task>` / `↳ Monter : <task>` (sent) | To do, In queue | Move the line one place up in its list. May arrive several times in a row. |
153
- | `↳ Move down: <task>` / `↳ Descendre : <task>` (sent) | To do, In queue | Move the line one place down in its list. |
154
- | `↳ Queue: <task>` / `↳ Mettre en file : <task>` (sent) | To do › Queue | Move the line from To do to the end of In queue; launch it if a slot is free and it is first. |
155
- | `↳ Launch now: <task>` / `↳ Lancer maintenant : <task>` (sent) | To do, In queue › Launch now | Launch a thread now if the project and the machine have a free slot (beyond the limits only if the user says so); otherwise put the line first in In queue. |
156
- | `↳ Remove from queue: <task>` / `↳ Retirer de la file : <task>` (sent) | In queue | Move the line back to the top of To do. |
157
- | `↳ Back to backlog: <task>` / `↳ Remettre au backlog : <task>` (sent) | To do | Move the line to Backlog. |
158
- | `↳ Launch: <task>` / `↳ Lancer : <task>` (sent) | Backlog › Launch | Start the task: a thread if a slot is free, otherwise first in In queue. |
159
- | `↳ Unblock: <task>` / `↳ Débloquer : <task>` (sent) | Blocked › Unblock | Relaunch the task, or ask the user exactly what is still missing. |
160
- | `↳ Mark blocked: <task>` / `↳ Marquer bloqué : <task>` (sent) | Board: a task moved to Blocked | Move the line to Blocked (add that list if it is missing); ask the user what it waits for if you do not know. |
161
- | `↳ Move to To do: <task>` / `↳ Passer en À faire : <task>` (sent) | Board: a task moved to To do (from Blocked, In progress or Done) | Move the line to the end of To do (add that list if it is missing), unchecked. Do not launch it. |
162
- | `↳ Mark done: <task>` / `↳ Marquer fait : <task>` (sent) | Board: a task moved to Finished | The task is finished or no longer needed: move the line, checked, to Done when the project has that list, otherwise remove it. |
163
- | `↳ Detail on <task> —` / `↳ Précision sur <task> —`, then the details below (draft) | Clarify (Backlog, To do, In queue, Blocked) | Add the details to the task (indented lines under it, or the thread's brief) and confirm. Do not launch it. |
164
- | `↳ Info for t-NNNN: <text>` / `↳ Info pour t-NNNN : <text>` (sent) | In progress › Add info (a thread's card, or the task of a thread) | Pass `<text>` on to that thread as is, every line of it, without rewording (`herdr-projects thread prompt <project> t-NNNN --text-file <file>`, `-` reads standard input), then confirm to the user in one line. Do not change `TASKS.md`. If the thread is resolved or unknown, say so instead. |
165
-
166
- Never launch a task from To do or Backlog without one of these requests.
167
-
168
- ## After a deployment
22
+ | The Coordinator box | `herdr-projects coordinator tell <text>` | the Coordinator |
23
+ | Reply, on a task | `herdr-projects tell <id> <text>` | that task's agent (on a plan that waits: the plan goes back with the text) |
24
+ | Approve, on a task | `herdr-projects approve <id>` | the board: it merges, or says yes to the plan |
169
25
 
170
- For each change the user can now see, add one To test line written from the user's point
171
- of view: what to open and what should happen, not the technical cause ("Swipe between
172
- panes on the phone", not "Fix pointer events in PaneSwiper"). Add
173
- `[b:green(ready to test)]` and the thread badge. Remove the matching In progress line.
26
+ (`herdr-projects` stands for the launcher the board hands you by its full path,
27
+ `~/.herdr-projects/data/bin/herdr-projects`: 1.x puts nothing on the PATH.)
174
28
 
175
- Name threads and tasks the same way: what the user sees.
29
+ So a message from the Board is the user's own words: answer and act on it as on any message
30
+ from them. Report your progress with `herdr-projects report` as usual: the Board shows the
31
+ state, the message and the progress you report, the pull request and the review.
176
32
 
177
- ## Questions left unanswered
33
+ ## What the Board does not do
178
34
 
179
- A question you asked the user that is still open goes to To decide, so the user can answer
180
- it from the panel. Remove the line as soon as it is answered.
35
+ No task is added, delegated, stopped, archived or cleared from wherdr: the user asks the
36
+ Coordinator for that, in the Coordinator box. Settings and automations stay in the board's own
37
+ screens in Herdr.
@@ -1,23 +0,0 @@
1
- import{A as e,B as t,Ft as n,Hn as r,Jt as i,M as a,Mn as o,N as s,Ot as c,P as l,Pt as u,Rt as d,St as f,U as p,V as m,Zt as h,b as g,dr as _,hr as v,ht as y,j as b,ln as x,mr as S,mt as C,nn as w,sn as T,wn as E,zn as ee}from"./SiL1FJ5s.js";import{_t as D,gt as O,vt as k}from"./CWwyK2XK.js";import{B as te,F as A,Ft as j,Gt as M,M as N,O as ne,Ot as P,P as F,St as I,T as re,Ut as L,V as ie,ct as ae,ft as R,hn as z,mt as B,nr as V,o as oe,q as se,st as H,t as ce,y as le,z as ue}from"./dPxB2L94.js";import{f as de,p as fe,u as pe}from"./Ci8N4mWR.js";import{c as me,r as he}from"./BBw_0a4M.js";import{$ as ge,Br as U,E as _e,Er as ve,F as ye,J as be,M as xe,Mr as Se,O as Ce,Q as we,Rr as W,S as Te,T as G,Vr as K,Y as Ee,Z as De,_ as Oe,_t as ke,b as q,cr as Ae,dr as je,ei as Me,fr as Ne,ft as Pe,g as Fe,gr as Ie,gt as Le,hr as Re,ht as ze,i as Be,kr as Ve,lr as He,lt as Ue,m as We,mr as Ge,mt as J,n as Ke,p as qe,pn as Je,pr as Ye,pt as Xe,q as Ze,r as Qe,st as $e,ut as et,vr as tt,w as nt,x as rt,y as it,zr as at}from"./DAg9fiVh.js";import{C as ot,S as st,d as ct,f as lt,g as Y,l as ut,n as dt,o as ft,p as pt,t as mt,x as ht}from"./BkOxQzbS.js";import{a as gt,i as X,n as _t,r as vt,s as yt,t as bt}from"./DaaJIRB3.js";import{B as xt,C as St,G as Ct,K as wt,V as Tt,W as Et,d as Dt,f as Ot,h as kt,m as At,p as jt,q as Mt,u as Nt,x as Pt,z as Ft}from"#entry";var Z=`radio.select`;function It(e,t,n){L(Z,n,{originalEvent:e,value:t})}var Lt=p({inheritAttrs:!1,__name:`Radio`,props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},checked:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:[`update:checked`,`select`],setup(t,{emit:i}){let o=t,u=i,d=P(o,`checked`,u,{passive:o.checked===void 0}),{value:f}=ee(o),{forwardRef:p,currentElement:h}=R(),_=Mt(h),v=wt(),y=e(()=>o.id&&h.value?document.querySelector(`[for="${o.id}"]`)?.innerText:void 0);function b(e){o.disabled||It(e,o.value,e=>{u(`select`,e),!e?.defaultPrevented&&(d.value=!0,_.value&&e.stopPropagation())})}return(e,t)=>(c(),l(g,null,[m(r(H),C({id:e.id,ref:r(p),role:`radio`,type:e.as===`button`?`button`:void 0,as:e.as,"aria-checked":r(d)??!1,"aria-label":y.value,"as-child":e.asChild,disabled:e.disabled?``:void 0,"data-state":r(d)?`checked`:`unchecked`,"data-disabled":e.disabled?``:void 0,value:r(f),required:e.required,name:e.name},{...r(v),...e.$attrs},{onClick:k(b,[`stop`])}),{default:T(()=>[n(e.$slots,`default`,{checked:r(d)})]),_:3},16,[`id`,`type`,`as`,`aria-checked`,`aria-label`,`as-child`,`disabled`,`data-state`,`data-disabled`,`value`,`required`,`name`]),r(_)&&e.name?(c(),a(r(Ct),C({key:0,type:`radio`,tabindex:`-1`,value:r(f),checked:!!r(d),name:e.name,disabled:e.disabled,required:e.required},r(v)),null,16,[`value`,`checked`,`name`,`disabled`,`required`])):s(`v-if`,!0)],64))}}),[Rt,zt]=M(`RadioGroupRoot`),Q=p({__name:`RadioGroupRoot`,props:{modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},orientation:{type:String,required:!1,default:void 0},dir:{type:String,required:!1},loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1,default:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let i=e,o=t,{forwardRef:l,currentElement:u}=R(),d=P(i,`modelValue`,o,{defaultValue:i.defaultValue,passive:i.modelValue===void 0}),{disabled:f,loop:p,orientation:h,name:g,required:_,dir:v}=ee(i),y=B(v),b=Mt(u);return zt({modelValue:d,changeModelValue:e=>{d.value=e},disabled:f,loop:p,orientation:h,name:g?.value,required:_}),(e,t)=>(c(),a(r(se),{"as-child":``,orientation:r(h),dir:r(y),loop:r(p)},{default:T(()=>[m(r(H),{ref:r(l),role:`radiogroup`,"data-disabled":r(f)?``:void 0,"as-child":e.asChild,as:e.as,"aria-orientation":r(h),"aria-required":r(_),dir:r(y)},{default:T(()=>[n(e.$slots,`default`,{modelValue:r(d)}),r(b)&&r(g)?(c(),a(r(Ct),{key:0,required:r(_),disabled:r(f),value:r(d),name:r(g)},null,8,[`required`,`disabled`,`value`,`name`])):s(`v-if`,!0)]),_:3},8,[`data-disabled`,`as-child`,`as`,`aria-orientation`,`aria-required`,`dir`])]),_:3},8,[`orientation`,`dir`,`loop`]))}}),[Bt,Vt]=M(`RadioGroupItem`),Ht=p({inheritAttrs:!1,__name:`RadioGroupItem`,props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:[`select`],setup(t,{emit:i}){let s=t,l=i,{forwardRef:u,currentElement:d}=R(),f=Rt(),p=e(()=>f.disabled.value||s.disabled),h=e(()=>f.required.value||s.required),g=e(()=>he(f.modelValue?.value,s.value));Vt({disabled:p,checked:g});let _=o(!1),v=[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`];I(`keydown`,e=>{v.includes(e.key)&&(_.value=!0)}),I(`keyup`,()=>{_.value=!1});function y(){setTimeout(()=>{_.value&&d.value?.click()},0)}let b=wt();return(e,t)=>(c(),a(r(yt),{checked:g.value,disabled:p.value,"as-child":``,focusable:!p.value,active:g.value},{default:T(()=>[m(Lt,C({...r(b),...e.$attrs,...s},{ref:r(u),checked:g.value,required:h.value,disabled:p.value,"onUpdate:checked":t[0]||=t=>r(f).changeModelValue(e.value),onSelect:t[1]||=e=>l(`select`,e),onKeydown:t[2]||=D(k(()=>{},[`prevent`]),[`enter`]),onFocus:y}),{default:T(()=>[n(e.$slots,`default`,{checked:g.value,required:h.value,disabled:p.value})]),_:3},16,[`checked`,`required`,`disabled`])]),_:3},8,[`checked`,`disabled`,`focusable`,`active`]))}}),Ut=p({__name:`RadioGroupIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){let{forwardRef:t}=R(),i=Bt();return(e,o)=>(c(),a(r(ae),{present:e.forceMount||r(i).checked.value},{default:T(()=>[m(r(H),C({ref:r(t),"data-state":r(i).checked.value?`checked`:`unchecked`,"data-disabled":r(i).disabled.value?``:void 0,"as-child":e.asChild,as:e.as},e.$attrs),{default:T(()=>[n(e.$slots,`default`)]),_:3},16,[`data-state`,`data-disabled`,`as-child`,`as`])]),_:3},8,[`present`]))}}),Wt={slots:{root:`relative`,fieldset:`flex gap-x-2`,legend:`mb-1 block font-medium text-default`,item:`flex items-start`,container:`flex items-center`,base:`rounded-full ring ring-inset ring-accented overflow-hidden focus-visible:outline-none`,indicator:`flex items-center justify-center size-full after:bg-default after:rounded-full`,wrapper:`w-full`,label:`block font-medium text-default`,icon:`shrink-0`,description:`text-muted`},variants:{color:{primary:{indicator:`bg-primary`},neutral:{indicator:`bg-inverted`},success:{indicator:`bg-success`},warning:{indicator:`bg-warning`},error:{indicator:`bg-error`},info:{indicator:`bg-info`}},variant:{list:{fieldset:`flex-wrap`,item:``},card:{fieldset:`flex-wrap`,item:[`border border-default rounded-lg hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:bg-elevated/50`,`transition-colors`]},table:{item:[`border border-default hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:bg-elevated/50`,`transition-colors`]}},orientation:{horizontal:{fieldset:`flex-row`},vertical:{fieldset:`flex-col`}},indicator:{start:{item:`flex-row`,wrapper:`ms-2`},end:{item:`flex-row-reverse`,wrapper:`me-2`},hidden:{base:`sr-only`,wrapper:`flex flex-col items-center gap-1 text-center`}},size:{xs:{fieldset:`gap-y-0.5`,legend:`text-xs`,base:`size-3`,item:`text-xs`,container:`h-4`,indicator:`after:size-1`},sm:{fieldset:`gap-y-0.5`,legend:`text-xs`,base:`size-3.5`,item:`text-xs`,container:`h-4`,indicator:`after:size-1`},md:{fieldset:`gap-y-1`,legend:`text-sm`,base:`size-4`,item:`text-sm`,container:`h-5`,indicator:`after:size-1.5`},lg:{fieldset:`gap-y-1`,legend:`text-sm`,base:`size-4.5`,item:`text-sm`,container:`h-5`,indicator:`after:size-1.5`},xl:{fieldset:`gap-y-1.5`,legend:`text-base`,base:`size-5`,item:`text-base`,container:`h-6`,indicator:`after:size-2`}},highlight:{true:``,false:``},disabled:{true:{item:`opacity-75`,base:`cursor-not-allowed`,label:`cursor-not-allowed`,description:`cursor-not-allowed`}},required:{true:{legend:`after:content-['*'] after:ms-0.5 after:text-error`}}},compoundVariants:[{indicator:`hidden`,class:{container:`h-auto`}},{variant:[`card`,`table`],highlight:!1,class:{item:`hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:border-accented`}},{size:`xs`,indicator:`hidden`,class:{icon:`size-3`}},{size:`sm`,indicator:`hidden`,class:{icon:`size-3.5`}},{size:`md`,indicator:`hidden`,class:{icon:`size-4`}},{size:`lg`,indicator:`hidden`,class:{icon:`size-4.5`}},{size:`xl`,indicator:`hidden`,class:{icon:`size-5`}},{size:`xs`,variant:[`card`,`table`],class:{item:`p-2.5`}},{size:`sm`,variant:[`card`,`table`],class:{item:`p-3`}},{size:`md`,variant:[`card`,`table`],class:{item:`p-3.5`}},{size:`lg`,variant:[`card`,`table`],class:{item:`p-4`}},{size:`xl`,variant:[`card`,`table`],class:{item:`p-4.5`}},{orientation:`horizontal`,variant:`table`,class:{item:`first-of-type:rounded-s-lg last-of-type:rounded-e-lg`,fieldset:`gap-0 -space-x-px`}},{orientation:`vertical`,variant:`table`,class:{item:`first-of-type:rounded-t-lg last-of-type:rounded-b-lg`,fieldset:`gap-0 -space-y-px`}},{color:`primary`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-primary/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-primary`}},{color:`neutral`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-neutral/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-neutral`}},{color:`success`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-success/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-success`}},{color:`warning`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-warning/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-warning`}},{color:`error`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-error/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-error`}},{color:`info`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-info/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-info`}},{color:`neutral`,variant:`list`,indicator:[`start`,`end`],class:{base:`outline-inverted/25 focus-visible:outline-solid focus-visible:outline-3 focus-visible:ring-inverted`}},{color:`primary`,variant:[`card`,`table`],class:{item:`outline-primary/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-primary has-focus-visible:z-[1]`}},{color:`neutral`,variant:[`card`,`table`],class:{item:`outline-neutral/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-neutral has-focus-visible:z-[1]`}},{color:`success`,variant:[`card`,`table`],class:{item:`outline-success/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-success has-focus-visible:z-[1]`}},{color:`warning`,variant:[`card`,`table`],class:{item:`outline-warning/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-warning has-focus-visible:z-[1]`}},{color:`error`,variant:[`card`,`table`],class:{item:`outline-error/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-error has-focus-visible:z-[1]`}},{color:`info`,variant:[`card`,`table`],class:{item:`outline-info/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-info has-focus-visible:z-[1]`}},{color:`neutral`,variant:[`card`,`table`],class:{item:`outline-inverted/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-inverted has-focus-visible:z-[1]`}},{color:`primary`,variant:`list`,indicator:`hidden`,class:{item:`outline-primary/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-primary has-focus-visible:z-[1]`}},{color:`neutral`,variant:`list`,indicator:`hidden`,class:{item:`outline-neutral/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-neutral has-focus-visible:z-[1]`}},{color:`success`,variant:`list`,indicator:`hidden`,class:{item:`outline-success/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-success has-focus-visible:z-[1]`}},{color:`warning`,variant:`list`,indicator:`hidden`,class:{item:`outline-warning/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-warning has-focus-visible:z-[1]`}},{color:`error`,variant:`list`,indicator:`hidden`,class:{item:`outline-error/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-error has-focus-visible:z-[1]`}},{color:`info`,variant:`list`,indicator:`hidden`,class:{item:`outline-info/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-info has-focus-visible:z-[1]`}},{color:`neutral`,variant:`list`,indicator:`hidden`,class:{item:`outline-inverted/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-inverted has-focus-visible:z-[1]`}},{color:`primary`,variant:`card`,class:{item:`has-data-[state=checked]:border-primary/50 has-data-[state=checked]:bg-primary/10`}},{color:`neutral`,variant:`card`,class:{item:`has-data-[state=checked]:border-neutral/50 has-data-[state=checked]:bg-neutral/10`}},{color:`success`,variant:`card`,class:{item:`has-data-[state=checked]:border-success/50 has-data-[state=checked]:bg-success/10`}},{color:`warning`,variant:`card`,class:{item:`has-data-[state=checked]:border-warning/50 has-data-[state=checked]:bg-warning/10`}},{color:`error`,variant:`card`,class:{item:`has-data-[state=checked]:border-error/50 has-data-[state=checked]:bg-error/10`}},{color:`info`,variant:`card`,class:{item:`has-data-[state=checked]:border-info/50 has-data-[state=checked]:bg-info/10`}},{color:`neutral`,variant:`card`,class:{item:`has-data-[state=checked]:border-inverted/50 has-data-[state=checked]:bg-elevated`}},{color:`primary`,variant:`table`,class:{item:`has-data-[state=checked]:bg-primary/10 has-data-[state=checked]:border-primary/50 has-data-[state=checked]:z-[1]`}},{color:`neutral`,variant:`table`,class:{item:`has-data-[state=checked]:bg-neutral/10 has-data-[state=checked]:border-neutral/50 has-data-[state=checked]:z-[1]`}},{color:`success`,variant:`table`,class:{item:`has-data-[state=checked]:bg-success/10 has-data-[state=checked]:border-success/50 has-data-[state=checked]:z-[1]`}},{color:`warning`,variant:`table`,class:{item:`has-data-[state=checked]:bg-warning/10 has-data-[state=checked]:border-warning/50 has-data-[state=checked]:z-[1]`}},{color:`error`,variant:`table`,class:{item:`has-data-[state=checked]:bg-error/10 has-data-[state=checked]:border-error/50 has-data-[state=checked]:z-[1]`}},{color:`info`,variant:`table`,class:{item:`has-data-[state=checked]:bg-info/10 has-data-[state=checked]:border-info/50 has-data-[state=checked]:z-[1]`}},{color:`neutral`,variant:`table`,class:{item:`has-data-[state=checked]:bg-elevated has-data-[state=checked]:border-inverted/50 has-data-[state=checked]:z-[1]`}},{variant:[`card`,`table`],disabled:!0,class:{item:`cursor-not-allowed`}},{color:`primary`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-primary not-has-disabled:has-data-[state=checked]:border-primary`}},{color:`neutral`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-neutral not-has-disabled:has-data-[state=checked]:border-neutral`}},{color:`success`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-success not-has-disabled:has-data-[state=checked]:border-success`}},{color:`warning`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-warning not-has-disabled:has-data-[state=checked]:border-warning`}},{color:`error`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-error not-has-disabled:has-data-[state=checked]:border-error`}},{color:`info`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-info not-has-disabled:has-data-[state=checked]:border-info`}},{color:`neutral`,indicator:`hidden`,highlight:!0,class:{item:`not-has-disabled:border-inverted not-has-disabled:has-data-[state=checked]:border-inverted`}},{color:`primary`,highlight:!0,class:{base:`ring-primary`}},{color:`neutral`,highlight:!0,class:{base:`ring-neutral`}},{color:`success`,highlight:!0,class:{base:`ring-success`}},{color:`warning`,highlight:!0,class:{base:`ring-warning`}},{color:`error`,highlight:!0,class:{base:`ring-error`}},{color:`info`,highlight:!0,class:{base:`ring-info`}},{color:`neutral`,highlight:!0,class:{base:`ring-inverted`}}],defaultVariants:{highlight:!1,size:`md`,color:`primary`,variant:`list`,indicator:`start`}},Gt={__name:`URadioGroup`,props:{as:{type:null,required:!1},legend:{type:String,required:!1},valueKey:{type:null,required:!1,default:`value`},labelKey:{type:null,required:!1,default:`label`},descriptionKey:{type:null,required:!1,default:`description`},items:{type:null,required:!1},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},size:{type:null,required:!1},variant:{type:null,required:!1},color:{type:null,required:!1},highlight:{type:Boolean,required:!1},orientation:{type:null,required:!1,default:`vertical`},indicator:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},disabled:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:[`change`,`update:modelValue`],setup(o,{emit:f}){let p=o,y=f,x=h(),S=te(`radioGroup`,p),w=me(),E=ue(j(S,`as`,`loop`,`required`),y),{emitFormChange:ee,emitFormInput:D,color:O,name:k,size:M,highlight:ne,id:P,disabled:I,ariaAttrs:re}=A(p,{bind:!1}),L=P.value??i(),ae=e(()=>O.value??S.color),R=e(()=>ne.value??S.highlight),z=e(()=>M.value??S.size),B=e(()=>I.value??S.disabled),V=e(()=>F({extend:Wt,...w.ui?.radioGroup||{}})({size:z.value,color:ae.value,highlight:R.value,disabled:B.value,required:S.required,orientation:S.orientation,variant:S.variant,indicator:S.indicator}));function oe(e){if(e===null)return{id:`${L}:null`,value:void 0,label:void 0};if(typeof e==`string`||typeof e==`number`||typeof e==`bigint`)return{id:`${L}:${e}`,value:String(e),label:String(e)};let t=ie(e,S.valueKey),n=ie(e,S.labelKey),r=ie(e,S.descriptionKey);return{...e,value:t,label:n,description:r,id:`${L}:${t}`}}let se=e(()=>S.items?S.items.map(oe):[]);function H(e){return S.indicator===`hidden`?e.icon:void 0}function ce(e){let t=new Event(`change`,{target:{value:e}});y(`change`,t),ee(),D()}return(e,i)=>(c(),a(r(Q),C({id:r(L)},r(E),{"model-value":r(S).modelValue,"default-value":r(S).defaultValue,orientation:r(S).orientation,name:r(k),disabled:B.value,"data-slot":`root`,class:V.value.root({class:[r(S).ui?.root,r(S).class]}),"onUpdate:modelValue":ce}),{default:T(()=>[b(`fieldset`,C({"data-slot":`fieldset`,class:V.value.fieldset({class:r(S).ui?.fieldset})},r(re)),[r(S).legend||x.legend?(c(),l(`legend`,{key:0,"data-slot":`legend`,class:_(V.value.legend({class:r(S).ui?.legend}))},[n(e.$slots,`legend`,{},()=>[t(v(r(S).legend),1)])],2)):s(``,!0),(c(!0),l(g,null,u(se.value,i=>(c(),a(d(!r(S).variant||r(S).variant===`list`?`div`:r(Et)),{key:i.value,"data-slot":`item`,class:_(V.value.item({class:[r(S).ui?.item,i.ui?.item,i.class],disabled:i.disabled||B.value}))},{default:T(()=>[b(`div`,{"data-slot":`container`,class:_(V.value.container({class:[r(S).ui?.container,i.ui?.container]}))},[m(r(Ht),{id:i.id,value:i.value,disabled:i.disabled||B.value,"data-slot":`base`,class:_(V.value.base({class:[r(S).ui?.base,i.ui?.base],disabled:i.disabled||B.value}))},{default:T(()=>[m(r(Ut),{"data-slot":`indicator`,class:_(V.value.indicator({class:[r(S).ui?.indicator,i.ui?.indicator]}))},null,8,[`class`])]),_:2},1032,[`id`,`value`,`disabled`,`class`])],2),H(i)||i.label||x.label||i.description||x.description?(c(),l(`div`,{key:0,"data-slot":`wrapper`,class:_(V.value.wrapper({class:[r(S).ui?.wrapper,i.ui?.wrapper]}))},[H(i)?(c(),a(N,{key:0,name:H(i),"data-slot":`icon`,class:_(V.value.icon({class:[r(S).ui?.icon,i.ui?.icon]}))},null,8,[`name`,`class`])):s(``,!0),i.label||x.label?(c(),a(d(!r(S).variant||r(S).variant===`list`?r(Et):`p`),{key:1,for:i.id,"data-slot":`label`,class:_(V.value.label({class:[r(S).ui?.label,i.ui?.label],disabled:i.disabled||B.value}))},{default:T(()=>[n(e.$slots,`label`,{item:i,modelValue:r(S).modelValue},()=>[t(v(i.label),1)])]),_:2},1032,[`for`,`class`])):s(``,!0),i.description||x.description?(c(),l(`p`,{key:2,"data-slot":`description`,class:_(V.value.description({class:[r(S).ui?.description,i.ui?.description],disabled:i.disabled||B.value}))},[n(e.$slots,`description`,{item:i,modelValue:r(S).modelValue},()=>[t(v(i.description),1)])],2)):s(``,!0)],2)):s(``,!0)]),_:2},1032,[`class`]))),128))],16)]),_:3},16,[`id`,`model-value`,`default-value`,`orientation`,`name`,`disabled`,`class`]))}},Kt=`J’ai trouvé la cause : le cache n’était jamais invalidé après une mise à jour. Le correctif tient en trois points :
2
-
3
- - vider l’entrée à chaque écriture ;
4
- - ajouter un test de régression ;
5
- - garder la durée de vie à 5 minutes.
6
-
7
- \`\`\`ts
8
- cache.delete(key)
9
- await save(item)
10
- \`\`\`
11
-
12
- Tous les tests passent.`,qt=`Found the cause: the cache was never invalidated after an update. The fix has three parts:
13
-
14
- - clear the entry on every write;
15
- - add a regression test;
16
- - keep the time to live at 5 minutes.
17
-
18
- \`\`\`ts
19
- cache.delete(key)
20
- await save(item)
21
- \`\`\`
22
-
23
- All tests pass.`,$=e=>e===`fr`?Kt:qt,Jt=(e,t)=>e===`off`?null:t,Yt={class:`typing-preview`},Xt=[`aria-label`,`disabled`],Zt=Object.assign(p({__name:`TypingPreview`,setup(e){let t=ce($(W)),n=o(null),i=o(null),a=o(``),s=()=>{n.value=Jt(ke.value,Date.now())};return f(()=>{i.value&&(a.value=`${i.value.offsetHeight}px`),s()}),w([ke,rt],s),(e,o)=>{let u=N,d=ft,f=mt;return c(),l(`figure`,Yt,[b(`figcaption`,null,[b(`span`,null,v((`t`in e?e.t:r(U))(`Preview`)),1),m(d,{text:(`t`in e?e.t:r(U))(`Replay`)},{default:T(()=>[b(`button`,{type:`button`,class:`typing-replay`,"aria-label":(`t`in e?e.t:r(U))(`Replay`),disabled:!(`typewriterActive`in e?e.typewriterActive:r(ze)),onClick:s},[m(u,{name:`i-lucide-rotate-ccw`})],8,Xt)]),_:1},8,[`text`])]),b(`div`,{ref_key:`box`,ref:i,class:`typing-sample md`,style:S({minHeight:r(a)})},[m(f,{html:r(t),typing:r(n),onDone:o[0]||=e=>n.value=null},null,8,[`html`,`typing`])],4)])}}}),{__name:`TypingPreview`}),Qt=[`data-mode`,`data-playing`],$t=[`aria-label`,`disabled`],en={class:`qt-conv`},tn={class:`qt-agent`},nn={class:`qt-tag one`},rn={class:`qt-tag two`},an={class:`qt-sent`},on={class:`qt-sent-q`},sn={class:`qt-sent-q`},cn={class:`qt-chips`},ln={class:`qt-chip one`},un={class:`qt-chip two`},dn={class:`qt-field`},fn={class:`qt-ph`},pn={class:`qt-tok one`},mn={class:`qt-ans one`},hn={class:`qt-tok two`},gn=Object.assign(p({__name:`QuoteTokensPreview`,props:{mode:{}},setup(e){let n=e,i=o(0),a=o(!1),s=()=>{De.value||(i.value++,a.value=!0)};return f(s),w(()=>n.mode,s),(n,o)=>{let u=N,d=ft;return c(),l(`figure`,{class:`qt-preview`,"data-mode":e.mode,"data-playing":r(a)},[b(`figcaption`,null,[b(`span`,null,v((`t`in n?n.t:r(U))(`Preview`)),1),m(d,{text:(`t`in n?n.t:r(U))(`Replay`)},{default:T(()=>[b(`button`,{type:`button`,class:`typing-replay`,"aria-label":(`t`in n?n.t:r(U))(`Replay`),disabled:`reducedMotion`in n?n.reducedMotion:r(De),onClick:s},[m(u,{name:`i-lucide-rotate-ccw`})],8,$t)]),_:1},8,[`text`])]),(c(),l(`div`,{key:r(i),class:`qt-stage`,"aria-hidden":`true`,onAnimationend:o[0]||=e=>a.value=!1},[b(`div`,en,[b(`div`,tn,[b(`p`,null,[t(v((`tl`in n?n.tl:r(K))(`Tea or coffee?`,`Thé ou café ?`))+` `,1),b(`span`,nn,`↳ `+v((`t`in n?n.t:r(U))(`Reply`)),1)]),b(`p`,null,[t(v((`tl`in n?n.tl:r(K))(`And your favorite series?`,`Et ta série préférée ?`))+` `,1),b(`span`,rn,`↳ `+v((`t`in n?n.t:r(U))(`Reply`)),1)])]),b(`div`,an,[b(`span`,on,[o[1]||=b(`b`,null,`↳ 09:12`,-1),t(v((`tl`in n?n.tl:r(K))(`Tea or coffee?`,`Thé ou café ?`)),1)]),b(`span`,null,v((`tl`in n?n.tl:r(K))(`Coffee.`,`Café.`)),1),b(`span`,sn,[o[2]||=b(`b`,null,`↳ 09:12`,-1),t(v((`tl`in n?n.tl:r(K))(`And your favorite series?`,`Et ta série préférée ?`)),1)]),o[3]||=b(`span`,null,`Lost !`,-1)])]),b(`div`,cn,[b(`span`,ln,[t(v((`tl`in n?n.tl:r(K))(`Tea or coffee?`,`Thé ou café ?`)),1),o[4]||=b(`i`,null,`✕`,-1)]),b(`span`,un,[t(v((`tl`in n?n.tl:r(K))(`And your favorite series?`,`Et ta série préférée ?`)),1),o[5]||=b(`i`,null,`✕`,-1)])]),b(`div`,dn,[b(`span`,fn,v((`tl`in n?n.tl:r(K))(`Message to Claude…`,`Message à Claude…`)),1),b(`span`,pn,[o[6]||=b(`b`,null,`↳`,-1),o[7]||=b(`em`,null,`Quote point 09:12 :`,-1),b(`span`,null,v((`tl`in n?n.tl:r(K))(`Tea or coffee?`,`Thé ou café ?`)),1),o[8]||=b(`em`,null,`—`,-1)]),b(`span`,mn,v((`tl`in n?n.tl:r(K))(`Coffee.`,`Café.`)),1),b(`span`,hn,[o[9]||=b(`b`,null,`↳`,-1),o[10]||=b(`em`,null,`Quote point 09:12 :`,-1),b(`span`,null,v((`tl`in n?n.tl:r(K))(`And your favorite series?`,`Et ta série préférée ?`)),1),o[11]||=b(`em`,null,`—`,-1)]),o[12]||=b(`span`,{class:`qt-ans two`},`Lost !`,-1),o[13]||=b(`span`,{class:`qt-send`},`↑`,-1)])],32))],8,Qt)}}}),{__name:`QuoteTokensPreview`}),_n={class:`settings-group`},vn={class:`settings-card wt-card`},yn={key:0,class:`muted`},bn={key:1,class:`muted`},xn={key:2,class:`wt-list`},Sn={class:`wt-main`},Cn={class:`wt-meta`},wn={class:`wt-path`},Tn=[`disabled`,`aria-label`,`onClick`],En={key:0,class:`spinner`},Dn={class:`muted`},On=Object.assign(p({__name:`WorktreesSection`,setup(n){f(bt);let i=e(()=>!!(G.value.machines&&G.value.machines.length>1)),d=e=>(G.value.machines||[]).find(t=>t.key===e)?.label||Ce.value;function p(e){return e.prunable?U(`folder missing`):e.workspace?e.agents?K(`open · ${e.agents} agent${e.agents>1?`s`:``}`,`ouvert · ${e.agents} agent${e.agents>1?`s`:``}`):K(`open`,`ouvert`):U(`closed`)}let h=o(null);async function y(e){h.value=e.path,await _t(e),h.value=null}return(e,n)=>{let o=N;return c(),l(`div`,_n,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Worktrees`)),1),b(`div`,vn,[(`worktrees`in e?e.worktrees:r(X))===null?(c(),l(`p`,yn,[...n[0]||=[b(`span`,{class:`spinner`},null,-1)]])):(`worktrees`in e?e.worktrees:r(X)).length?(c(),l(`ul`,xn,[(c(!0),l(g,null,u(`worktrees`in e?e.worktrees:r(X),u=>(c(),l(`li`,{key:`${u.machine}|${u.path}`,class:_({open:u.workspace,gone:u.prunable})},[b(`div`,Sn,[b(`b`,null,[m(o,{name:`i-lucide-git-branch`}),t(v((`worktreeName`in e?e.worktreeName:r(vt))(u)),1)]),b(`span`,Cn,[t(v(u.repo),1),r(i)?(c(),l(g,{key:0},[t(` · `+v(d(u.machine)),1)],64)):s(``,!0),n[1]||=t(` · `,-1),b(`i`,null,v(p(u)),1)]),b(`span`,wn,v((`shortPath`in e?e.shortPath:r(Se))(u.path)),1)]),b(`button`,{type:`button`,class:`wt-del`,disabled:r(h)===u.path,"aria-label":(`t`in e?e.t:r(U))(`Delete`),onClick:e=>y(u)},[r(h)===u.path?(c(),l(`span`,En)):(c(),a(o,{key:1,name:`i-lucide-trash-2`}))],8,Tn)],2))),128))])):(c(),l(`p`,bn,v((`t`in e?e.t:r(U))(`No worktrees.`)),1)),b(`p`,Dn,v((`t`in e?e.t:r(U))(`Deleting a worktree removes its folder; the Git branch is kept.`)),1)])])}}}),{__name:`WorktreesSection`}),kn=`herdr ${[`plugin`,`install`,`eliasstravik/herdr-projects`,`--yes`].join(` `)}`,An={class:`settings-group projects-plugin`},jn={class:`projects-plugin-intro`},Mn={class:`projects-plugin-link`,href:`https://github.com/eliasstravik/herdr-projects`,target:`_blank`,rel:`noopener noreferrer`},Nn={class:`projects-plugin-head`},Pn={key:0},Fn={key:1},In={key:2},Ln={key:3,class:`installed`},Rn={key:4},zn={key:0,class:`projects-plugin-note`},Bn={class:`projects-plugin-actions`},Vn={key:0,class:`projects-plugin-note`},Hn={key:2,class:`plugin-input-note reload projects-plugin-reload`},Un={key:3,class:`projects-plugin-note`},Wn={class:`settings-group projects-plugin-settings`},Gn={id:`project-board`,class:`projects-board-title`},Kn={class:`projects-plugin-intro`},qn={class:`projects-board-lists`},Jn={class:`also`},Yn={class:`projects-plugin-note`},Xn={class:`projects-board-example`},Zn={class:`projects-plugin-note`},Qn={class:`projects-plugin-note`},$n={class:`settings-toggle`},er={id:`thread-limits`,class:`projects-board-title spaced`},tr={class:`projects-plugin-intro`},nr={class:`thread-limits`},rr=[`aria-label`,`disabled`,`onClick`],ir=[`aria-label`,`disabled`,`onClick`],ar={key:0,class:`projects-plugin-note`},or={class:`projects-plugin-note`},sr={class:`projects-plugin-actions`},cr=Object.assign(p({__name:`ProjectsPluginSettings`,props:{machines:{}},setup(n){let i=n,d=o({}),f=o({}),p=o({}),h=o({}),y=o({});async function x(e){if(e.online){p.value={...p.value,[e.key]:!0};try{let t=await Ke(`/api/plugins/projects?machine=${encodeURIComponent(e.key)}`);d.value={...d.value,[e.key]:t},f.value={...f.value,[e.key]:``}}catch(t){f.value={...f.value,[e.key]:t.message}}finally{p.value={...p.value,[e.key]:!1}}}}w(()=>i.machines.map(e=>`${e.key}:${e.online}`).join(`|`),()=>{for(let e of i.machines)x(e)},{immediate:!0});async function S(e){if(ve(),await z(K(`Install herdr-projects on ${e.label}? Herdr will download the plugin from GitHub and run its installer on this machine.`,`Installer herdr-projects sur ${e.label} ? Herdr téléchargera le plugin depuis GitHub et exécutera son installation sur cette machine.`),U(`Install`),`primary`)){h.value={...h.value,[e.key]:!0};try{await Ke(`/api/plugins/projects`,{machine:e.key}),J(K(`herdr-projects installed on ${e.label}.`,`herdr-projects installé sur ${e.label}.`)),y.value={...y.value,[e.key]:!0},await x(e)}catch(e){J(e.message,!0)}finally{h.value={...h.value,[e.key]:!1}}}}async function C(e){ve();try{await navigator.clipboard.writeText(kn),J(K(`Command copied: paste it into a terminal on ${e.label}.`,`Commande copiée : colle-la dans un terminal de ${e.label}.`))}catch{J(U(`Copy failed`),!0)}}let ee=e(()=>[{icon:`i-lucide-flask-conical`,name:K(`To test`,`À tester`),also:`To test, Testing, À vérifier`,what:K(`What you must check: Confirm, Problem, Question.`,`Ce que tu dois vérifier : Confirmer, Problème, Question.`)},{icon:`i-lucide-signpost`,name:K(`To decide`,`À décider`),also:`To decide, Décisions, Questions`,what:K(`Questions only you can unblock: Question, Answer.`,`Questions que toi seul peux trancher : Question, Répondre.`)},{icon:`i-lucide-git-pull-request`,name:K(`To review`,`À relire`),also:`To review, Relire, Relecture, Review(s), PR(s), Pull requests, À valider`,what:K(`Pull requests for you to review: Reviewed sends “✓ Reviewed: …”, Comment drafts feedback.`,`PR que tu dois relire : Relu envoie « ✓ Relu : … », Commenter prépare un retour.`)},{icon:`i-lucide-activity`,name:K(`In progress`,`En cours`),also:`In progress, Doing, WIP`,what:K(`What threads are really doing: open threads, live.`,`Ce que les threads font vraiment : threads ouverts, en direct.`)},{icon:`i-lucide-list-ordered`,name:K(`In queue`,`En file`),also:`In queue, Queue, Queued, Up next, File d’attente`,what:K(`Decided: the coordinator launches the first task as soon as a thread slot frees, in list order. Move up / down, Launch now, Clarify, Remove from queue (back to To do); the header shows the thread slots in use.`,`Décidé : le coordinateur lance la première tâche dès qu’une place de thread se libère, dans l’ordre de la liste. Monter / Descendre, Lancer maintenant, Préciser, Retirer de la file (retour en À faire) ; l’en-tête montre les places de thread occupées.`)},{icon:`i-lucide-octagon-alert`,name:K(`Blocked`,`Bloqué`),also:`Bloque, Bloquée(s), Blocked, On hold, En attente, Waiting, Stuck`,what:K(`Waiting for someone or something external: optional “— blocked by: …” reason; Unblock sends a request, Clarify prepares a message.`,`Attente de quelqu’un ou de quelque chose d’extérieur : raison facultative « — bloqué par : … » ; Débloquer envoie une demande, Préciser prépare un message.`)},{icon:`i-lucide-list-todo`,name:K(`To do`,`À faire`),also:`To do, Todo, Next, Soon, Prochainement`,what:K(`To do soon, in your priority order; never launched automatically. Move up / down, Queue it, Launch now (a thread if a slot is free, otherwise first in the queue), Clarify, Back to backlog.`,`À faire bientôt, dans ton ordre de priorité ; jamais lancé automatiquement. Monter / Descendre, Mettre en file, Lancer maintenant (un thread si une place est libre, sinon en tête de file), Préciser, Remettre au backlog.`)},{icon:`i-lucide-archive`,name:`Backlog`,also:`Later, Plus tard, Idées, Ideas, Someday`,what:K(`Everything else. Launch sends the task to the coordinator; Clarify prepares a message.`,`Tout le reste. Lancer envoie la tâche au coordinateur ; Préciser prépare un message.`)},{icon:`i-lucide-circle-check`,name:K(`Done`,`Fait`),also:`Done, Terminé, Finished`,what:K(`Filled by resolved threads.`,`Remplie par les threads clôturés.`)}]);async function D(e,t){ve();try{await navigator.clipboard.writeText(e),J(t)}catch{J(U(`Copy failed`),!0)}}let O=()=>W===`en`?`en`:`fr`,k=Ze,te=()=>D(le(O()),K(`Template copied: paste it into the project’s TASKS.md.`,`Modèle copié : colle-le dans TASKS.md du projet.`)),A=o({}),j=o(``),M=new Map;function P(e){A.value=Object.fromEntries(e.map(e=>[e.key,e]))}async function F(){try{P((await Ke(`/api/plugins/thread-limits`)).machines),j.value=``}catch(e){j.value=e.message}}F();function I(e,t){ve();let n=A.value[e.key],r=n?.max??null,i=r===null?t>0?Math.max(1,n?.open||0):null:r+t<1?null:Math.min(99,r+t);if(i===r)return;let a=n?.open||0;A.value={...A.value,[e.key]:{key:e.key,label:e.label,open:a,threads:n?.threads||[],max:i,free:i===null?null:Math.max(0,i-a)}},clearTimeout(M.get(e.key)),M.set(e.key,setTimeout(async()=>{M.delete(e.key);try{P((await Ke(`/api/plugins/thread-limits`,{machine:e.key,max:i})).machines)}catch(e){J(e.message,!0),F()}},450))}let re=e=>K(`${e} open thread${e===1?``:`s`} · all projects`,`${e} thread${e>1?`s`:``} ouvert${e>1?`s`:``} · tous projets`),L=()=>D(oe(O()),K(`Rules copied: paste them to the coordinator.`,`Règles copiées : colle-les au coordinateur.`));return(e,i)=>{let o=N,x=ne,w=Pt;return c(),l(g,null,[b(`div`,An,[i[6]||=b(`h3`,null,`herdr-projects`,-1),b(`p`,jn,v((`tl`in e?e.tl:r(K))(`herdr-projects groups coordinators and their threads by project, adding the Project panel and worktree repositories in wherdr. The plugin is optional: agents and other wherdr features still work without it.`,`herdr-projects regroupe les coordinateurs et leurs threads par projet, avec un panneau Projet et les dépôts de worktrees dans wherdr. Le plugin est facultatif : les agents et les autres fonctions de wherdr restent utilisables sans lui.`)),1),b(`a`,Mn,[t(v((`tl`in e?e.tl:r(K))(`View plugin repository`,`Voir le dépôt du plugin`))+` `,1),m(o,{name:`i-lucide-external-link`})]),(c(!0),l(g,null,u(n.machines,n=>(c(),l(`div`,{key:n.key,class:`projects-plugin-machine`},[b(`div`,Nn,[b(`strong`,null,v(n.label),1),n.online?r(p)[n.key]&&!r(d)[n.key]?(c(),l(`span`,Fn,v((`tl`in e?e.tl:r(K))(`Checking…`,`Vérification…`)),1)):r(f)[n.key]?(c(),l(`span`,In,v((`tl`in e?e.tl:r(K))(`Status unavailable`,`État indisponible`)),1)):r(d)[n.key]?.installed?(c(),l(`span`,Ln,v((`tl`in e?e.tl:r(K))(`Installed`,`Installé`))+v(r(d)[n.key]?.version?` · v${r(d)[n.key]?.version}`:``),1)):(c(),l(`span`,Rn,v((`tl`in e?e.tl:r(K))(`Not installed`,`Non installé`)),1)):(c(),l(`span`,Pn,v((`tl`in e?e.tl:r(K))(`Offline`,`Hors ligne`)),1))]),n.online&&r(f)[n.key]?(c(),l(`p`,zn,v(r(f)[n.key]),1)):s(``,!0),n.online&&r(d)[n.key]&&!r(d)[n.key]?.installed&&!r(f)[n.key]?(c(),l(g,{key:1},[b(`div`,Bn,[r(d)[n.key]?.installable?(c(),a(x,{key:0,size:`sm`,color:`primary`,icon:`i-lucide-download`,loading:r(h)[n.key],onClick:e=>S(n)},{default:T(()=>[t(v((`tl`in e?e.tl:r(K))(`Install herdr-projects`,`Installer herdr-projects`)),1)]),_:1},8,[`loading`,`onClick`])):s(``,!0),m(x,{size:`sm`,color:`neutral`,variant:`outline`,icon:`i-lucide-copy`,onClick:e=>C(n)},{default:T(()=>[t(v((`t`in e?e.t:r(U))(`Copy command`)),1)]),_:1},8,[`onClick`])]),r(d)[n.key]?.installable?s(``,!0):(c(),l(`p`,Vn,v((`tl`in e?e.tl:r(K))(`Direct installation is unavailable here: run the command on this machine.`,`Installation directe indisponible ici : lance la commande sur cette machine.`)),1))],64)):s(``,!0),r(y)[n.key]?(c(),l(`div`,Hn,[m(o,{name:`i-lucide-refresh-cw`}),b(`div`,null,[b(`strong`,null,v((`tl`in e?e.tl:r(K))(`Reload the Herdr client config`,`Recharge la config du client Herdr`)),1),b(`p`,null,[t(v((`tl`in e?e.tl:r(K))(`In the Herdr terminal: `,`Dans le terminal Herdr : `)),1),i[1]||=b(`kbd`,null,`prefix`,-1),i[2]||=t(` + `,-1),i[3]||=b(`kbd`,null,`Shift`,-1),i[4]||=t(` + `,-1),i[5]||=b(`kbd`,null,`R`,-1),t(`. `+v((`tl`in e?e.tl:r(K))(`Then run “Set up the sidebar…” from an agent’s menu to install the sidebar and the hooks.`,`Puis lance « Set up the sidebar… » depuis le menu d’un agent pour installer la barre latérale et les hooks.`)),1)])])])):s(``,!0),r(d)[n.key]?.installed&&!r(d)[n.key]?.enabled?(c(),l(`p`,Un,v((`tl`in e?e.tl:r(K))(`The plugin is disabled in Herdr.`,`Le plugin est désactivé dans Herdr.`)),1)):s(``,!0)]))),128))]),b(`div`,Wn,[b(`h3`,null,v((`tl`in e?e.tl:r(K))(`herdr-projects settings`,`Réglages herdr-projects`)),1),b(`h4`,Gn,v((`tl`in e?e.tl:r(K))(`Project board`,`Tableau du projet`)),1),b(`p`,Kn,v((`tl`in e?e.tl:r(K))(`The Project panel reads TASKS.md: one list per ## heading, one task per line “- [ ] title (owner)”, the owner being read but not shown. Every list is optional: each project uses the ones chosen with its coordinator (a small project may only need Backlog, In progress and Done). The panel shows the lists present, always in the order below, each with its own buttons; every button sends a message to the coordinator, which edits TASKS.md.`,`Le panneau Projet lit TASKS.md : une liste par titre ##, une tâche par ligne « - [ ] titre (responsable) », le responsable étant lu mais pas affiché. Toutes les listes sont facultatives : chaque projet utilise celles choisies avec son coordinateur (un petit projet peut se contenter de Backlog, En cours et Fait). Le panneau affiche les listes présentes, toujours dans l’ordre ci-dessous, chacune avec ses boutons ; chaque bouton envoie un message au coordinateur, qui modifie TASKS.md.`)),1),b(`ul`,qn,[(c(!0),l(g,null,u(r(ee),t=>(c(),l(`li`,{key:t.name},[m(o,{name:t.icon},null,8,[`name`]),b(`div`,null,[b(`strong`,null,v(t.name),1),b(`span`,Jn,v((`tl`in e?e.tl:r(K))(`also`,`aussi`))+` : `+v(t.also),1),b(`p`,null,v(t.what),1)])]))),128))]),b(`p`,Yn,v((`tl`in e?e.tl:r(K))(`The only task decoration: badges the coordinator chooses, anywhere in the line. “[b:color(text)]”, or “[b:color(text)](target)” for a clickable ↗ badge: target = an https:// link (new tab) or a thread ID t-0140 (opens its tab). Color: red, orange, amber, green, teal, blue, violet, pink, gray (theme-aware), a #rgb / #rrggbb hex, or nothing (neutral); at most 24 characters shown. A URL in the text becomes a plain link. The coordinator rules below tell it to use them on its own when useful.`,`Seule décoration des tâches : les badges que le coordinateur choisit, n’importe où dans la ligne. « [b:couleur(texte)] », ou « [b:couleur(texte)](cible) » pour un badge cliquable ↗ : cible = lien https:// (nouvel onglet) ou ID de thread t-0140 (ouvre son onglet). Couleur : red, orange, amber, green, teal, blue, violet, pink, gray (suivent le thème), un hex #rgb / #rrggbb, ou rien (neutre) ; 24 caractères affichés au plus. Une URL dans le texte devient un lien simple. Les règles du coordinateur ci-dessous lui disent d’en user de lui-même quand c’est utile.`)),1),b(`pre`,Xn,[b(`code`,null,`- [ ] `+v((`tl`in e?e.tl:r(K))(`Stop button on iPhone`,`Bouton Stop sur iPhone`))+` [b:red(bug)] [b:gray(t-0140)](t-0140) [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me)`,1)]),b(`p`,Zn,v((`tl`in e?e.tl:r(K))(`Any other ## list is shown too, in a neutral style, after Backlog.`,`Toute autre liste ## s’affiche aussi, en style neutre, après Backlog.`)),1),b(`p`,Qn,v((`tl`in e?e.tl:r(K))(`The lists in TASKS.md are the active lists: to add or remove one, ask the coordinator (there is no setting in wherdr).`,`Les listes présentes dans TASKS.md sont les listes actives : pour en ajouter ou en retirer une, demande-le au coordinateur (pas de réglage dans wherdr).`)),1),b(`label`,$n,[b(`span`,null,[b(`b`,null,v((`tl`in e?e.tl:r(K))(`Hide empty lists`,`Masquer les listes vides`)),1),b(`small`,null,v((`tl`in e?e.tl:r(K))(`Show a Project panel list only when it has items (In progress and Done included). Setting specific to this device.`,`Afficher une liste du panneau Projet seulement si elle a des éléments (En cours et Fait compris). Réglage propre à cet appareil.`)),1)]),m(w,{modelValue:r(k),"onUpdate:modelValue":i[0]||=e=>E(k)?k.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`h4`,er,v((`tl`in e?e.tl:r(K))(`Max threads per machine`,`Threads max par machine`)),1),b(`p`,tr,v((`tl`in e?e.tl:r(K))(`herdr-projects limits threads per project (max_parallel_threads in PROJECT.md). This limit counts the open threads of every project on a machine. — = no global limit.`,`herdr-projects limite les threads par projet (max_parallel_threads dans PROJECT.md). Cette limite compte les threads ouverts de tous les projets d’une machine. — = pas de limite globale.`)),1),b(`div`,nr,[(c(!0),l(g,null,u(n.machines,t=>(c(),l(`div`,{key:t.key,class:`settings-stepper thread-limit`},[b(`span`,null,[b(`b`,null,v(t.label),1),b(`small`,null,v(re(r(A)[t.key]?.open||0)),1)]),b(`div`,null,[b(`button`,{type:`button`,"aria-label":(`tl`in e?e.tl:r(K))(`Lower the limit of ${t.label}`,`Baisser la limite de ${t.label}`),disabled:r(A)[t.key]?.max==null,onClick:e=>I(t,-1)},`−`,8,rr),b(`output`,{class:_({full:r(A)[t.key]?.max!=null&&(r(A)[t.key]?.free??1)===0})},v(r(A)[t.key]?.max??`—`),3),b(`button`,{type:`button`,"aria-label":(`tl`in e?e.tl:r(K))(`Raise the limit of ${t.label}`,`Monter la limite de ${t.label}`),disabled:(r(A)[t.key]?.max??0)>=r(99),onClick:e=>I(t,1)},`+`,8,ir)])]))),128))]),r(j)?(c(),l(`p`,ar,v(r(j)),1)):s(``,!0),b(`p`,or,v((`tl`in e?e.tl:r(K))(`wherdr writes ${r(gt)} in each herdr-projects folder where a coordinator runs, refreshed on every change: the coordinator rules below tell it to check the machine before starting a thread (fallback: herdr-projects overview).`,`wherdr écrit ${r(gt)} dans chaque dossier herdr-projects où tourne un coordinateur, à chaque changement : les règles du coordinateur ci-dessous lui disent de vérifier la machine avant de lancer un thread (sinon : herdr-projects overview).`)),1),b(`div`,sr,[m(x,{size:`sm`,color:`neutral`,variant:`outline`,icon:`i-lucide-file-text`,onClick:te},{default:T(()=>[t(v((`tl`in e?e.tl:r(K))(`Copy TASKS.md template`,`Copier le modèle TASKS.md`)),1)]),_:1}),m(x,{size:`sm`,color:`neutral`,variant:`outline`,icon:`i-lucide-clipboard-list`,onClick:L},{default:T(()=>[t(v((`tl`in e?e.tl:r(K))(`Copy rules for the coordinator`,`Copier les règles pour le coordinateur`)),1)]),_:1})])])],64)}}}),{__name:`ProjectsPluginSettings`}),lr=[`appearance`,`conversation`,`terminal`,`agents`,`plugins`,`phone`,`notifications`,`security`,`desktop`,`about`];function ur(e){let t=e.historyBack;return!e.desk&&e.section?t===`/settings`?`history`:`list`:typeof t==`string`&&t.startsWith(`/`)&&!t.startsWith(`/settings`)?`history`:`home`}var dr={id:`settings`,class:`view settings-view`},fr={class:`top bar settings-top`},pr=[`aria-label`],mr=[`aria-current`,`onClick`],hr={class:`settings-section-title`},gr={class:`settings-section`},_r={class:`settings-group`},vr=[`aria-expanded`],yr={class:`theme-sw`},br={class:`theme-name`},xr=[`aria-label`],Sr=[`aria-label`],Cr={class:`theme-section-title`},wr={class:`theme-grid`},Tr=[`aria-checked`],Er={class:`theme-sw`},Dr={class:`theme-name`},Or=[`aria-checked`,`onClick`],kr={class:`theme-sw`},Ar={class:`theme-name`},jr={key:0},Mr={key:1},Nr={class:`muted settings-hint`},Pr={class:`settings-group`},Fr={class:`muted settings-hint`},Ir={class:`settings-group`},Lr={class:`muted settings-hint`},Rr={class:`settings-group`},zr={class:`settings-toggle`},Br={class:`settings-toggle`},Vr={class:`settings-toggle`},Hr={class:`settings-toggle`},Ur={class:`settings-toggle`},Wr={class:`settings-group`},Gr={class:`muted settings-hint`},Kr={class:`eyebrow settings-subhead`},qr={class:`settings-group`},Jr={key:0,class:`settings-toggle`},Yr={class:`muted settings-hint`},Xr={class:`settings-group settings-width`},Zr={class:`muted settings-hint`},Qr={class:`settings-section`},$r={class:`settings-group settings-typing`},ei={class:`muted settings-hint`},ti={class:`settings-group`},ni={class:`muted settings-lead`},ri={class:`muted settings-hint`},ii={class:`settings-group`},ai={class:`muted settings-lead`},oi={class:`muted settings-hint`},si={class:`settings-section`},ci={class:`settings-group`},li={class:`settings-toggle`},ui={class:`settings-group`},di={class:`settings-stepper`},fi=[`aria-label`],pi=[`aria-label`],mi={class:`settings-group settings-renderer`},hi={class:`muted settings-hint`},gi={class:`settings-renderer-status`,role:`status`},_i={class:`settings-section`},vi={class:`settings-group`},yi={class:`muted agent-pref-intro`},bi={key:0,class:`agent-pref-list`},xi={key:0},Si=[`checked`,`onChange`],Ci={key:1,class:`muted agent-pref-intro`},wi={class:`muted agent-pref-note`},Ti={class:`settings-section`},Ei={class:`settings-group`},Di={class:`settings-toggle quiet-toggle`},Oi={class:`notify-caption`},ki={key:0,class:`muted notify-hint`},Ai={class:`notify-caption`},ji={class:`settings-group`},Mi={class:`notify-caption`},Ni={class:`muted notify-hint`},Pi={class:`settings-section`},Fi={class:`settings-section`},Ii={class:`settings-section`},Li={class:`settings-group`},Ri={key:0,class:`settings-group`},zi={class:`muted settings-hint`},Bi={key:0,class:`muted settings-hint`},Vi={key:0,class:`settings-section`},Hi={class:`settings-group`},Ui={class:`muted settings-hint`},Wi={class:`settings-group`},Gi={class:`settings-action-keys`},Ki={class:`settings-section`},qi={class:`settings-group`},Ji={class:`settings-version`},Yi={key:1,class:`muted settings-hint`};function Xi(){Me()}var Zi=Object.assign(p({__name:`SettingsView`,setup(n){let i=St.version,d=fe(),p=dt,h=de(),C=e(()=>lr.includes(String(h.query.section))?h.query.section:null),T={appearance:`i-lucide-palette`,conversation:`i-lucide-message-square`,terminal:`i-lucide-square-terminal`,agents:`i-lucide-bot`,plugins:`i-lucide-puzzle`,phone:`i-lucide-smartphone`,notifications:`i-lucide-bell`,security:`i-lucide-lock`,desktop:`i-lucide-monitor`,about:`i-lucide-info`},ee={appearance:`Appearance`,conversation:`Conversation`,terminal:`Terminal`,agents:`Agents`,plugins:`Plugins`,phone:`Phone`,notifications:`Notifications`,security:`Security`,desktop:`Desktop`,about:`About`},D=e(()=>lr.filter(e=>e!==`desktop`||q.value).map(e=>({id:e,label:U(ee[e]),icon:T[e]}))),k=e(()=>C.value&&D.value.some(e=>e.id===C.value)?C.value:q.value?`appearance`:null),te=e(()=>D.value.find(e=>e.id===k.value)?.label||U(`Settings`)),A=o(null);w(C,()=>y(()=>{A.value&&(A.value.scrollTop=0)}));function j(e){if(e===C.value)return;let t={path:`/settings`,query:{section:e}};q.value?d.replace(t):d.push(t)}function M(){let e=ur({desk:q.value,section:C.value,historyBack:history.state?.back});e===`list`?d.replace(`/settings`):e===`history`?d.back():pe(`/`,{replace:!0})}f(async()=>{if(q.value||typeof history.state?.back==`string`)return;let e=h.fullPath;await d.replace(`/`),await d.push(e)});let P=o(W);w(P,e=>{e!==W&&(at(e),location.reload())});let F=et,I=$e,L=Ue,ie=qe,ae=Be,R=Te,z=Ee,B=e(()=>[{label:K(`Tokens, native field`,`Jetons, champ natif`),description:K(`Each “↳ … —” line is drawn as a token in the usual field. Typing, dictation and autocorrect unchanged. Default.`,`Chaque ligne « ↳ … — » est dessinée en jeton dans le champ habituel. Saisie, dictée et correction auto inchangées. Par défaut.`),value:`native`},{label:K(`Plain text`,`Texte simple`),description:K(`The same “↳ … —” lines, shown as plain text. A fallback if the tokens misbehave.`,`Les mêmes lignes « ↳ … — », affichées en texte simple. Un secours si les jetons se comportent mal.`),value:`lines`}]),oe=ge,se=e(()=>[{label:K(`Icon`,`Icône`),description:K(`A small ↳ after each question, and a grey one after each point (on hover on a computer). Default.`,`Un petit ↳ après chaque question, et un gris après chaque point (au survol sur ordinateur). Par défaut.`),value:`icon`},{label:K(`Tap the text`,`Toucher le texte`),description:K(`No button: a question is underlined, tap it. A point: click it on a computer; on a phone, tap it, then “↳ Discuss”.`,`Aucun bouton : une question est soulignée, touche-la. Un point : clique-le sur ordinateur ; sur téléphone, touche-le, puis « ↳ Discuter ».`),value:`text`},{label:K(`List under the message`,`Liste sous le message`),description:K(`A number after each question and the questions listed under the message; “+ Quote a point”, then the point.`,`Un numéro après chaque question et les questions listées sous le message ; « + Citer un point », puis le point.`),value:`list`}]),H=e({get:()=>ke.value,set:e=>{Le.value=e}}),ce=e(()=>[{label:U(`Off`),description:U(`The reply appears at once.`),value:`off`},{label:U(`Fast`),description:U(`Original speed · 0.5 to 2 s.`),value:`fast`},{label:U(`Medium`),description:U(`Twice as slow · 1 to 4 s.`),value:`medium`},{label:U(`Slow`),description:U(`Three times as slow · 1.5 to 6 s.`),value:`slow`}]),le=Xe,ue=Fe,me=e(()=>[{label:U(`Normal`),description:U(`760 px column · terminal fitted to width.`),value:`normal`},{label:U(`Wide`),description:U(`Up to 1100 px · terminal fitted to width.`),value:`wide`},{label:U(`Full width`),description:U(`The whole width, terminal included.`),value:`full`}]),he=it,Se=[{label:U(`Conversation`),description:U(`Read the transcript first.`),value:`chat`},{label:U(`Terminal`),description:U(`Type straight into the pane.`),value:`term`}],G=be,Oe=e(()=>[{label:U(`Remaining`),description:U(`What is left in each window, like Codex.`),value:`left`},{label:U(`Used`),description:U(`What has been used, like Claude.`),value:`used`}]),Me=pt,Ze=e(()=>[{label:U(`Border only`),description:U(`A second color glides slowly around the border.`),value:`border`},{label:U(`Halo`),description:U(`The same, with a faint glow around the field.`),value:`halo`},{label:U(`None`),description:U(`Plain 1 px border, no animation.`),value:`off`}]),rt=ct,ft=lt,mt=e(()=>[{label:`wherdr grid`,description:U(`Dotted grid with light packets, like wherdr.dev.`),value:`wherdr`},{label:`herdr grid`,description:U(`Flat line grid, like herdr.dev.`),value:`herdr`}]),gt=[{label:`English`,value:`en`},{label:`Français`,value:`fr`}],X=e(()=>Qe.value.machines?.filter(e=>e.local||!!e.home&&(ye(e.key)?.status===`online`||!ye(e.key)&&e.online))||[{key:``,label:Ce.value||U(`This machine`),kinds:Qe.value.kinds}]),_t=e(()=>[...new Set(X.value.flatMap(e=>e.kinds||[]))]);function vt(e){return!_e.value.includes(e)}function yt(e,t){_e.value=t?_e.value.filter(t=>t!==e):[..._e.value,e]}function bt(e){let t=X.value.filter(t=>t.kinds.includes(e));return t.length===X.value.length?``:t.map(e=>e.label||U(`This machine`)).join(`, `)}let Ct=He,wt=[{label:U(`Project coordinators and agents outside projects`),value:`project_leads`},{label:U(`All agents`),value:`all`}],Et=e({get:()=>Ae.value,set:e=>{Re(e).catch(e=>J(e.message,!0))}}),Mt=Ye,Z=o(`all`),It=o(`manual`),Lt=e(()=>[{label:K(`This device`,`Cet appareil`),value:`device`,disabled:!Ct.value},{label:K(`All devices`,`Tous les appareils`),value:`all`}]),Rt=[{label:K(`1 hour`,`1 heure`),value:`hour`},{label:K(`Until tomorrow morning (8 am)`,`Jusqu’à demain matin (8 h)`),value:`morning`},{label:K(`Until turned back on`,`Jusqu’à réactivation`),value:`manual`}];w(je,e=>{if(!e)return;Z.value=e.scope;let t=e.quiet.until===null?null:e.quiet.until-Date.now();It.value=t===null?`manual`:t<=36e5?`hour`:`morning`},{immediate:!0});async function zt(e){try{let t=je.value?.scope;e&&await Ie(Z.value,!0,tt(It.value)),t&&(!e||t!==Z.value)&&await Ie(t,!1)}catch(e){J(e.message,!0)}}let Q=e({get:()=>!!je.value,set:e=>{zt(e)}});function Bt(e){Z.value=e,Q.value&&zt(!0)}function Vt(e){It.value=e,Q.value&&zt(!0)}let Ht=e(()=>{let e=je.value;if(!e)return``;let t=e.scope===`all`?K(`all devices`,`tous les appareils`):K(`this device`,`cet appareil`);if(e.quiet.until===null)return K(`Silenced on ${t} until turned back on.`,`Silence sur ${t} jusqu’à réactivation.`);let n=new Date(e.quiet.until),r=n.toLocaleTimeString(W,{hour:`2-digit`,minute:`2-digit`});return n.toDateString()===new Date(Ne.value).toDateString()?K(`Silenced on ${t} until ${r}.`,`Silence sur ${t} jusqu’à ${r}.`):K(`Silenced on ${t} until tomorrow ${r}.`,`Silence sur ${t} jusqu’à demain ${r}.`)}),Ut=e=>e===`agents`?K(`Agents`,`Agents`):e===`herdr`?`Herdr`:`wherdr`,Wt=e=>[e.c.bg,e.c.surface,e.c.line,e.c.text,e.c.accent,e.c.blue,e.c.rose,e.c.teal],Kt=e(()=>{let e=Qe.value.herdrTheme;return e?e.autoSwitch?`${e.darkName||`catppuccin`} / ${e.lightName||`catppuccin-latte`}`:e.name||`catppuccin`:null}),qt=e(()=>st(ht(Qe.value.herdrTheme,!1).id)),$=o(!1),Jt=e(()=>Y.value===`follow`?qt.value:st(Y.value)),Yt=e(()=>Y.value===`follow`?`${U(`Follow Herdr`)}${qt.value?` · ${qt.value.label}`:``}`:Jt.value?Jt.value.label:Y.value);function Xt(e){Y.value=e,ve()}let Qt=e=>{nt.value=Math.max(8,Math.min(20,nt.value+e))},$t=[{label:`WebGL`,value:`webgl`},{label:`HTML`,value:`html`}],en=e(()=>Pe.value===`html-fallback`?U(`Active rendering: HTML (WebGL unavailable)`):Pe.value===`html`?U(`Active rendering: HTML`):U(`Active rendering: WebGL`));w(le,we);let tn=jt,nn=At,rn=e(()=>Je.map(e=>({label:e===1?U(`1 day`):e===365?U(`1 year`):K(`${e} days`,`${e} jours`),value:e}))),an=e({get:()=>tn.value?.maxSessionDays??7,set:async e=>{try{await Ke(`/api/auth/max-session`,{days:e}),await We()}catch(e){J(e.message,!0)}nn()}}),on=e(()=>{let e=tn.value;if(!e?.deadline)return``;let t=new Date(e.deadline+Date.now()-(e.now??Date.now())).toLocaleString(W===`fr`?`fr-FR`:`en-GB`,{weekday:`short`,day:`numeric`,month:`short`,hour:`2-digit`,minute:`2-digit`});return K(`This device asks for the passkey again at the first opening after ${t}.`,`Cet appareil redemandera la clé d’accès à la première ouverture après le ${t}.`)});return f(xt),f(()=>{we(),xe(),Mt().then(Ge),nn()}),(e,n)=>{let o=ne,d=N,f=Gt,h=Pt,y=Zt,C=gn,w=On,T=Dt,ee=cr,de=kt,fe=Ot,pe=re,ge=Ft;return c(),l(`section`,dr,[b(`header`,fr,[m(o,{icon:`i-lucide-chevron-left`,color:`neutral`,variant:`ghost`,size:`lg`,class:`icon-btn`,"aria-label":(`t`in e?e.t:r(U))(`Back`),onClick:M},null,8,[`aria-label`]),b(`h2`,null,v((`desk`in e?e.desk:r(q))?(`t`in e?e.t:r(U))(`Settings`):r(te)),1)]),b(`div`,{class:_([`settings-layout`,{"section-open":r(k)}])},[b(`nav`,{class:`settings-nav`,"aria-label":(`t`in e?e.t:r(U))(`Settings sections`)},[(c(!0),l(g,null,u(r(D),e=>(c(),l(`button`,{key:e.id,type:`button`,class:_([`settings-nav-item`,{selected:r(k)===e.id}]),"aria-current":r(k)===e.id?`page`:void 0,onClick:t=>j(e.id)},[m(d,{name:e.icon},null,8,[`name`]),b(`span`,null,v(e.label),1),m(d,{name:`i-lucide-chevron-right`,class:`settings-nav-arrow`})],10,mr))),128))],8,pr),x(b(`div`,{ref_key:`body`,ref:A,class:`settings-body`},[b(`h2`,hr,v(r(te)),1),x(b(`div`,gr,[b(`div`,_r,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Theme`)),1),b(`button`,{type:`button`,class:`theme-opt theme-current`,"aria-expanded":r($),onClick:n[0]||=e=>$.value=!r($)},[b(`span`,yr,[(c(!0),l(g,null,u(r(Jt)?Wt(r(Jt)):[],(e,t)=>(c(),l(`i`,{key:t,style:S({background:e})},null,4))),128))]),b(`span`,br,[t(v(r(Yt)),1),b(`small`,null,v((`t`in e?e.t:r(U))(r($)?`Hide themes`:`Change theme`)),1)]),m(d,{name:r($)?`i-lucide-chevron-up`:`i-lucide-chevron-down`,class:`theme-check`},null,8,[`name`])],8,vr),x(b(`div`,{class:`theme-list`,role:`radiogroup`,"aria-label":(`t`in e?e.t:r(U))(`Theme`)},[(c(!0),l(g,null,u((`themeSections`in e?e.themeSections:r(ot))(),i=>(c(),l(`section`,{key:i.group,class:`theme-section`,"aria-label":Ut(i.group)},[b(`h4`,Cr,v(Ut(i.group)),1),b(`div`,wr,[i.group===`herdr`?(c(),l(`button`,{key:0,type:`button`,role:`radio`,class:_([`theme-opt`,{on:(`themeChoice`in e?e.themeChoice:r(Y))===(`FOLLOW_HERDR`in e?e.FOLLOW_HERDR:r(ut))}]),"aria-checked":(`themeChoice`in e?e.themeChoice:r(Y))===(`FOLLOW_HERDR`in e?e.FOLLOW_HERDR:r(ut)),onClick:n[1]||=t=>Xt(`FOLLOW_HERDR`in e?e.FOLLOW_HERDR:r(`follow`))},[b(`span`,Er,[(c(!0),l(g,null,u(r(qt)?Wt(r(qt)):[],(e,t)=>(c(),l(`i`,{key:t,style:S({background:e})},null,4))),128))]),b(`span`,Dr,[t(v((`t`in e?e.t:r(U))(`Follow Herdr`)),1),b(`small`,null,v(r(Kt)?`config.toml · ${r(Kt)}`:(`t`in e?e.t:r(U))(`config.toml not found`)),1)]),(`themeChoice`in e?e.themeChoice:r(Y))===(`FOLLOW_HERDR`in e?e.FOLLOW_HERDR:r(`follow`))?(c(),a(d,{key:0,name:`i-lucide-check`,class:`theme-check`})):s(``,!0)],10,Tr)):s(``,!0),(c(!0),l(g,null,u(i.themes,n=>(c(),l(`button`,{key:n.id,type:`button`,role:`radio`,class:_([`theme-opt`,{on:(`themeChoice`in e?e.themeChoice:r(Y))===n.id}]),"aria-checked":(`themeChoice`in e?e.themeChoice:r(Y))===n.id,onClick:e=>Xt(n.id)},[b(`span`,kr,[(c(!0),l(g,null,u(Wt(n),(e,t)=>(c(),l(`i`,{key:t,style:S({background:e})},null,4))),128))]),b(`span`,Ar,[t(v(n.label),1),n.id===(`DEFAULT_THEME`in e?e.DEFAULT_THEME:r(`wherdr-titanium`))?(c(),l(`small`,jr,v((`t`in e?e.t:r(U))(`default`)),1)):n.light?(c(),l(`small`,Mr,v((`t`in e?e.t:r(U))(`light`)),1)):s(``,!0)]),(`themeChoice`in e?e.themeChoice:r(Y))===n.id?(c(),a(d,{key:0,name:`i-lucide-check`,class:`theme-check`})):s(``,!0)],10,Or))),128))])],8,Sr))),128))],8,xr),[[O,r($)]])]),b(`p`,Nr,v((`t`in e?e.t:r(U))(`The theme is saved on this device.`)),1),b(`div`,Pr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Message field border on focus`)),1),m(f,{modelValue:r(Me),"onUpdate:modelValue":n[2]||=e=>E(Me)?Me.value=e:null,items:r(Ze),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),b(`p`,Fr,v((`t`in e?e.t:r(U))(`Also on omp’s running actions (border only). Frozen when the system asks for reduced motion. Saved on this device.`)),1)]),b(`div`,Ir,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Language`)),1),m(f,{modelValue:r(P),"onUpdate:modelValue":n[3]||=e=>E(P)?P.value=e:null,items:gt,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`])]),b(`p`,Lr,v((`t`in e?e.t:r(U))(`The interface language is saved on this device.`)),1),b(`div`,Rr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Home screen`)),1),b(`label`,zr,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Compact list`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`One line per agent or space: no preview, folder or model; an agent waiting for an answer shows its question and answers. Computer and phone. Saved on this device.`)),1)]),m(h,{modelValue:r(ie),"onUpdate:modelValue":n[4]||=e=>E(ie)?ie.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`label`,Br,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Reorder automatically`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`In Ready, show unread agents before read ones. Saved on this device.`)),1)]),m(h,{modelValue:r(ae),"onUpdate:modelValue":n[5]||=e=>E(ae)?ae.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`label`,Vr,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Show terminals`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Show terminal spaces in the list, filed under Ready.`)),1)]),m(h,{modelValue:r(F),"onUpdate:modelValue":n[6]||=e=>E(F)?F.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`label`,Hr,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Show counters`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Show agent counters on the home screen.`)),1)]),m(h,{modelValue:r(I),"onUpdate:modelValue":n[7]||=e=>E(I)?I.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`label`,Ur,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Show quotas`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Show Claude and Codex quotas on the home screen.`)),1)]),m(h,{modelValue:r(L),"onUpdate:modelValue":n[8]||=e=>E(L)?L.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])])]),b(`div`,Wr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Quotas`)),1),m(f,{modelValue:r(G),"onUpdate:modelValue":n[9]||=e=>E(G)?G.value=e:null,items:r(Oe),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),b(`p`,Gr,v((`t`in e?e.t:r(U))(`The color always flags a nearly exhausted quota. Saved on this device.`)),1)]),(`desk`in e?e.desk:r(q))?(c(),l(g,{key:0},[b(`div`,Kr,[b(`span`,null,v((`t`in e?e.t:r(U))(`Desktop`)),1)]),b(`div`,qr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Background`)),1),m(f,{modelValue:r(rt),"onUpdate:modelValue":n[10]||=e=>E(rt)?rt.value=e:null,items:r(mt),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),r(rt)===`wherdr`?(c(),l(`label`,Jr,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Animated packets`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Small glowing squares running along the wherdr grid.`)),1)]),m(h,{modelValue:r(ft),"onUpdate:modelValue":n[11]||=e=>E(ft)?ft.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])])):s(``,!0),b(`p`,Yr,v((`t`in e?e.t:r(U))(`In the margins of the conversation. Still when the system asks for reduced motion. Saved on this device.`)),1)]),b(`div`,Xr,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Content width`)),1),m(f,{modelValue:r(ue),"onUpdate:modelValue":n[12]||=e=>E(ue)?ue.value=e:null,items:r(me),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),b(`p`,Zr,v((`t`in e?e.t:r(U))(`Conversation, terminal, settings and other content. Saved on this device.`)),1)])],64)):s(``,!0)],512),[[O,r(k)===`appearance`]]),x(b(`div`,Qr,[b(`div`,$r,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Typewriter`)),1),m(f,{modelValue:r(H),"onUpdate:modelValue":n[13]||=e=>E(H)?H.value=e:null,items:r(ce),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`,disabled:`reducedMotion`in e?e.reducedMotion:r(De)},null,8,[`modelValue`,`items`,`disabled`]),b(`p`,ei,v((`t`in e?e.t:r(U))((`reducedMotion`in e?e.reducedMotion:r(De))?`Off: the system asks for reduced motion.`:`Only new replies are animated; history appears at once. Tap a reply while it types to show it in full. Saved on this device only.`)),1),b(`label`,{class:_([`settings-toggle encrypted-toggle`,{"is-disabled":!(`typewriterActive`in e?e.typewriterActive:r(ze))}])},[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Encrypted text`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Writing advances in glyphs, then the text decrypts behind it.`)),1)]),m(h,{modelValue:r(R),"onUpdate:modelValue":n[14]||=e=>E(R)?R.value=e:null,disabled:!(`typewriterActive`in e?e.typewriterActive:r(ze)),color:`success`,size:`xl`},null,8,[`modelValue`,`disabled`])],2),r(k)===`conversation`?(c(),a(y,{key:0})):s(``,!0)]),b(`div`,ti,[b(`h3`,null,v((`tl`in e?e.tl:r(K))(`Reply style`,`Style de réponse`)),1),b(`p`,ni,v((`tl`in e?e.tl:r(K))(`Each question an agent asks, and each point it lists, can be quoted in the field to answer them one by one. Choose how they offer it.`,`Chaque question d’un agent, et chaque point qu’il liste, peut être cité dans le champ pour y répondre un par un. Choisis comment ils le proposent.`)),1),m(f,{modelValue:r(oe),"onUpdate:modelValue":n[15]||=e=>E(oe)?oe.value=e:null,items:r(se),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio reply-style-radio`},null,8,[`modelValue`,`items`]),b(`p`,ri,v((`tl`in e?e.tl:r(K))(`Saved on this device.`,`Enregistré sur cet appareil.`)),1)]),b(`div`,ii,[b(`h3`,null,v((`tl`in e?e.tl:r(K))(`Quoted replies`,`Réponses citées`)),1),b(`p`,ai,v((`tl`in e?e.tl:r(K))(`Answer several questions, passages or decisions of an agent in one message: each one goes into the field as a “↳ … —” line that names the message and quotes it, your answer below. Choose how the field shows these lines; the message sent is the same.`,`Réponds à plusieurs questions, passages ou décisions d’un agent dans un seul message : chacun entre dans le champ sous la forme d’une ligne « ↳ … — » qui nomme le message et le cite, ta réponse en dessous. Choisis comment le champ affiche ces lignes ; le message envoyé est le même.`)),1),r(k)===`conversation`?(c(),a(C,{key:0,mode:r(z)},null,8,[`mode`])):s(``,!0),m(f,{modelValue:r(z),"onUpdate:modelValue":n[16]||=e=>E(z)?z.value=e:null,items:r(B),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio quote-mode-radio`},null,8,[`modelValue`,`items`]),b(`p`,oi,v((`tl`in e?e.tl:r(K))(`Saved on this device.`,`Enregistré sur cet appareil.`)),1)])],512),[[O,r(k)===`conversation`]]),x(b(`div`,si,[b(`div`,ci,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Home screen`)),1),b(`label`,li,[b(`span`,null,[b(`b`,null,v((`t`in e?e.t:r(U))(`Show terminals`)),1),b(`small`,null,v((`t`in e?e.t:r(U))(`Show terminal spaces in the list, filed under Ready.`)),1)]),m(h,{modelValue:r(F),"onUpdate:modelValue":n[17]||=e=>E(F)?F.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])])]),b(`div`,ui,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Text`)),1),b(`div`,di,[b(`span`,null,v((`t`in e?e.t:r(U))(`Terminal text size`)),1),b(`div`,null,[b(`button`,{type:`button`,"aria-label":(`t`in e?e.t:r(U))(`Decrease text size`),onClick:n[18]||=e=>Qt(-1)},`A−`,8,fi),b(`output`,null,v(`fontSize`in e?e.fontSize:r(nt)),1),b(`button`,{type:`button`,"aria-label":(`t`in e?e.t:r(U))(`Increase text size`),onClick:n[19]||=e=>Qt(1)},`A+`,8,pi)])])]),b(`div`,mi,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Terminal rendering`)),1),m(f,{modelValue:r(le),"onUpdate:modelValue":n[20]||=e=>E(le)?le.value=e:null,items:$t,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`]),b(`p`,hi,v((`t`in e?e.t:r(U))(`Rendering is saved on this device.`)),1),b(`p`,gi,v(r(en)),1)])],512),[[O,r(k)===`terminal`]]),x(b(`div`,_i,[b(`div`,vi,[b(`h3`,null,v((`t`in e?e.t:r(U))(`New agent`)),1),b(`p`,yi,v((`t`in e?e.t:r(U))(`Types shown in New agent. Terminal is always available.`)),1),r(_t).length?(c(),l(`div`,bi,[(c(!0),l(g,null,u(r(_t),t=>(c(),l(`label`,{key:t,class:`settings-toggle`},[b(`span`,null,[b(`b`,null,v((`kindLabel`in e?e.kindLabel:r(Ve))(t)),1),bt(t)?(c(),l(`small`,xi,v(bt(t)),1)):s(``,!0)]),b(`input`,{class:`agent-pref-check`,type:`checkbox`,checked:vt(t),onChange:e=>yt(t,e.target.checked)},null,40,Si)]))),128))])):(c(),l(`p`,Ci,v((`t`in e?e.t:r(U))(`No agents installed on online machines.`)),1)),b(`p`,wi,v((`t`in e?e.t:r(U))(`Choices saved on this device.`)),1)]),m(w)],512),[[O,r(k)===`agents`]]),x(b(`div`,Ti,[b(`div`,Ei,[b(`label`,Di,[b(`span`,null,[b(`b`,null,[m(d,{name:r(Q)?`i-lucide-bell-off`:`i-lucide-bell`},null,8,[`name`]),t(v((`tl`in e?e.tl:r(K))(`Do not disturb`,`Silence`)),1)]),b(`small`,null,v((`tl`in e?e.tl:r(K))(`No push notifications while it is on.`,`Aucune notification push tant qu’il est actif.`)),1)]),m(h,{modelValue:r(Q),"onUpdate:modelValue":n[21]||=e=>E(Q)?Q.value=e:null,color:`success`,size:`xl`},null,8,[`modelValue`])]),b(`p`,Oi,v((`tl`in e?e.tl:r(K))(`Silence on`,`Couper pour`)),1),m(f,{"model-value":r(Z),items:r(Lt),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`,"onUpdate:modelValue":n[22]||=e=>Bt(e)},null,8,[`model-value`,`items`]),r(Ct)?s(``,!0):(c(),l(`p`,ki,v((`tl`in e?e.tl:r(K))(`“This device” needs notifications turned on below.`,`« Cet appareil » demande d’activer les notifications ci-dessous.`)),1)),b(`p`,Ai,v((`tl`in e?e.tl:r(K))(`Duration`,`Durée`)),1),m(f,{"model-value":r(It),items:Rt,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`,"onUpdate:modelValue":n[23]||=e=>Vt(e)},null,8,[`model-value`]),b(`p`,{class:_([`muted notify-hint`,{"quiet-end":r(Q)}])},v(r(Ht)||(`tl`in e?e.tl:r(K))(`Notifications come back on by themselves at the end.`,`Retour automatique à la normale à la fin de la durée choisie.`)),3)]),b(`div`,ji,[m(T),b(`p`,Mi,v((`t`in e?e.t:r(U))(`Notify for`)),1),m(f,{modelValue:r(Et),"onUpdate:modelValue":n[24]||=e=>E(Et)?Et.value=e:null,items:wt,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`]),b(`p`,Ni,v((`t`in e?e.t:r(U))(`Project threads remain visible and their unread messages are kept.`)),1)])],512),[[O,r(k)===`notifications`]]),x(b(`div`,Pi,[m(ee,{machines:(`appConfig`in e?e.appConfig:r(Qe)).machines||[{key:``,label:(`hostLabel`in e?e.hostLabel:r(Ce))||(`t`in e?e.t:r(U))(`This machine`),local:!0,home:``,dirs:[],online:!0,kinds:[]}]},null,8,[`machines`])],512),[[O,r(k)===`plugins`]]),x(b(`div`,Fi,[m(de,{active:r(k)===`phone`},null,8,[`active`])],512),[[O,r(k)===`phone`]]),x(b(`div`,Ii,[b(`div`,Li,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Passkey`)),1),m(fe)]),r(tn)?.enabled?(c(),l(`div`,Ri,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Ask for the passkey again after`)),1),m(f,{modelValue:r(an),"onUpdate:modelValue":n[25]||=e=>E(an)?an.value=e:null,items:r(rn),variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`,`items`]),b(`p`,zi,v((`t`in e?e.t:r(U))(`Counted from the last passkey unlock, for every device. Never in the middle of use: at the next opening of the app.`)),1),r(on)?(c(),l(`p`,Bi,v(r(on)),1)):s(``,!0)])):s(``,!0)],512),[[O,r(k)===`security`]]),(`desk`in e?e.desk:r(q))?x((c(),l(`div`,Vi,[b(`div`,Hi,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Default pane view`)),1),m(f,{modelValue:r(he),"onUpdate:modelValue":n[26]||=e=>E(he)?he.value=e:null,items:Se,variant:`table`,indicator:`end`,color:`primary`,size:`lg`,class:`settings-radio`},null,8,[`modelValue`]),b(`p`,Ui,v((`t`in e?e.t:r(U))(`What an agent pane opens on. A pane you switched to Terminal stays there. Saved on this device.`)),1)]),b(`div`,Wi,[b(`h3`,null,v((`tl`in e?e.tl:r(K))(`Keyboard shortcuts`,`Raccourcis clavier`)),1),b(`button`,{type:`button`,class:`settings-action solo`,onClick:n[27]||=e=>p.value=!0},[m(d,{name:`i-lucide-keyboard`}),t(v((`tl`in e?e.tl:r(K))(`Show keyboard shortcuts`,`Voir les raccourcis clavier`))+` `,1),b(`span`,Gi,[(c(!0),l(g,null,u((`shortcutKbds`in e?e.shortcutKbds:r(V))(`help`),e=>(c(),a(pe,{key:e,value:e},null,8,[`value`]))),128))])])])],512)),[[O,r(k)===`desktop`]]):s(``,!0),x(b(`div`,Ki,[b(`div`,qi,[b(`h3`,null,v((`t`in e?e.t:r(U))(`Application`)),1),b(`p`,Ji,`wherdr · v`+v(r(i)),1),(`updateInfo`in e?e.updateInfo:r(Tt))?.latest?(c(),a(ge,{key:0,info:`updateInfo`in e?e.updateInfo:r(Tt)},null,8,[`info`])):(`updateInfo`in e?e.updateInfo:r(Tt))?.checked?(c(),l(`p`,Yi,v((`t`in e?e.t:r(U))(`This is the latest version.`)),1)):s(``,!0),b(`button`,{type:`button`,class:`settings-action solo`,onClick:Xi},[m(d,{name:`i-lucide-refresh-cw`}),t(v((`t`in e?e.t:r(U))(`Reload app`)),1)]),b(`button`,{type:`button`,class:`settings-action solo`,onClick:n[28]||=(...t)=>(`openOnboarding`in e?e.openOnboarding:r(Nt))&&(`openOnboarding`in e?e.openOnboarding:r(Nt))(...t)},[m(d,{name:`i-lucide-compass`}),t(v((`tl`in e?e.tl:r(K))(`Setup guide`,`Guide de démarrage`)),1)])])],512),[[O,r(k)===`about`]])],512),[[O,r(k)]])],2)])}}}),{__name:`SettingsView`}),Qi=p({__name:`settings`,setup(e){return f(()=>{Oe.value=null}),(e,t)=>{let n=Zi;return c(),a(n)}}});export{Qi as default};