wherdr 2.5.0 → 2.6.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 (262) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{CXbAL3Yu.js → 2fsYF-LK.js} +41 -42
  3. package/.output/public/_nuxt/2fsYF-LK.js.br +0 -0
  4. package/.output/public/_nuxt/2fsYF-LK.js.gz +0 -0
  5. package/.output/public/_nuxt/{qODuBH5E.js → 3bE7s96N.js} +1 -1
  6. package/.output/public/_nuxt/6YTlf8ot.js +1 -0
  7. package/.output/public/_nuxt/6YTlf8ot.js.br +0 -0
  8. package/.output/public/_nuxt/6YTlf8ot.js.gz +0 -0
  9. package/.output/public/_nuxt/{BYZVrreW.js → 7KozZy5Y.js} +1 -1
  10. package/.output/public/_nuxt/{AgentView.B6zltno1.css → AgentView.BwyQIUef.css} +1 -1
  11. package/.output/public/_nuxt/AgentView.BwyQIUef.css.br +0 -0
  12. package/.output/public/_nuxt/AgentView.BwyQIUef.css.gz +0 -0
  13. package/.output/public/_nuxt/{BdJIc1Xf.js → B40shTLf.js} +1 -1
  14. package/.output/public/_nuxt/{BdJIc1Xf.js.br → B40shTLf.js.br} +0 -0
  15. package/.output/public/_nuxt/B40shTLf.js.gz +0 -0
  16. package/.output/public/_nuxt/B5cSia3P.js +62 -0
  17. package/.output/public/_nuxt/B5cSia3P.js.br +0 -0
  18. package/.output/public/_nuxt/B5cSia3P.js.gz +0 -0
  19. package/.output/public/_nuxt/BK1_9FXg.js +1 -0
  20. package/.output/public/_nuxt/BK1_9FXg.js.br +0 -0
  21. package/.output/public/_nuxt/BK1_9FXg.js.gz +0 -0
  22. package/.output/public/_nuxt/{CgUSTIM1.js → Bqz3nVVB.js} +1 -1
  23. package/.output/public/_nuxt/{CgUSTIM1.js.br → Bqz3nVVB.js.br} +0 -0
  24. package/.output/public/_nuxt/Bqz3nVVB.js.gz +0 -0
  25. package/.output/public/_nuxt/{DOVT2Tt8.js → ByLPJEo6.js} +1 -1
  26. package/.output/public/_nuxt/ByLPJEo6.js.br +0 -0
  27. package/.output/public/_nuxt/ByLPJEo6.js.gz +0 -0
  28. package/.output/public/_nuxt/C8tHIeGN.js +3 -0
  29. package/.output/public/_nuxt/C8tHIeGN.js.br +0 -0
  30. package/.output/public/_nuxt/C8tHIeGN.js.gz +0 -0
  31. package/.output/public/_nuxt/CAkH_IfS.js +9 -0
  32. package/.output/public/_nuxt/CAkH_IfS.js.br +0 -0
  33. package/.output/public/_nuxt/CAkH_IfS.js.gz +0 -0
  34. package/.output/public/_nuxt/COWXF9OU.js +123 -0
  35. package/.output/public/_nuxt/COWXF9OU.js.br +0 -0
  36. package/.output/public/_nuxt/COWXF9OU.js.gz +0 -0
  37. package/.output/public/_nuxt/{DMzjoyW_.js → CiG2Lovu.js} +1 -1
  38. package/.output/public/_nuxt/CiG2Lovu.js.br +0 -0
  39. package/.output/public/_nuxt/CiG2Lovu.js.gz +0 -0
  40. package/.output/public/_nuxt/CnjxEm0H.js +27 -0
  41. package/.output/public/_nuxt/CnjxEm0H.js.br +0 -0
  42. package/.output/public/_nuxt/CnjxEm0H.js.gz +0 -0
  43. package/.output/public/_nuxt/{PjGJWal8.js → DNs2cMBZ.js} +15 -15
  44. package/.output/public/_nuxt/DNs2cMBZ.js.br +0 -0
  45. package/.output/public/_nuxt/DNs2cMBZ.js.gz +0 -0
  46. package/.output/public/_nuxt/D_x7Rysx.js +31 -0
  47. package/.output/public/_nuxt/D_x7Rysx.js.br +0 -0
  48. package/.output/public/_nuxt/D_x7Rysx.js.gz +0 -0
  49. package/.output/public/_nuxt/{Bd0Z2zzq.js → T-qXNaMY.js} +1 -1
  50. package/.output/public/_nuxt/builds/latest.json +1 -1
  51. package/.output/public/_nuxt/builds/meta/e2ee8d99-6a6a-4754-934f-8b7dbecfcdcb.json +1 -0
  52. package/.output/public/_nuxt/entry.C_hImCpq.css +2 -0
  53. package/.output/public/_nuxt/entry.C_hImCpq.css.br +0 -0
  54. package/.output/public/_nuxt/entry.C_hImCpq.css.gz +0 -0
  55. package/.output/public/_nuxt/useViewport.D9mmYA6A.css +1 -0
  56. package/.output/public/_nuxt/useWorktrees.BWpb3OO0.css +1 -0
  57. package/.output/public/_nuxt/useWorktrees.BWpb3OO0.css.br +0 -0
  58. package/.output/public/_nuxt/useWorktrees.BWpb3OO0.css.gz +0 -0
  59. package/.output/public/sw.js +6 -2
  60. package/.output/server/chunks/_/branding.mjs +1 -1
  61. package/.output/server/chunks/_/fileDownload.mjs +1 -1
  62. package/.output/server/chunks/_/files.mjs +26 -3
  63. package/.output/server/chunks/_/machineOrder.mjs +1 -1
  64. package/.output/server/chunks/_/onboarding.mjs +1 -1
  65. package/.output/server/chunks/_/package.mjs +1 -1
  66. package/.output/server/chunks/_/plugins.mjs +1 -1
  67. package/.output/server/chunks/_/restart.mjs +1 -1
  68. package/.output/server/chunks/_/revoke.mjs +22 -0
  69. package/.output/server/chunks/_/selfupdate.mjs +2 -1
  70. package/.output/server/chunks/_/splitShell.mjs +1 -1
  71. package/.output/server/chunks/_/updates.mjs +18 -4
  72. package/.output/server/chunks/_/uploadHashes.mjs +46 -0
  73. package/.output/server/chunks/_/worktrees.mjs +1 -1
  74. package/.output/server/chunks/_/ws.mjs +3 -3
  75. package/.output/server/chunks/nitro/nitro.mjs +15525 -15000
  76. package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
  77. package/.output/server/chunks/routes/api/_..._.mjs +2 -2
  78. package/.output/server/chunks/routes/api/agents.post.mjs +2 -2
  79. package/.output/server/chunks/routes/api/ask-tab.post.mjs +2 -2
  80. package/.output/server/chunks/routes/api/attach.post.mjs +2 -2
  81. package/.output/server/chunks/routes/api/auth/disable.post.mjs +11 -4
  82. package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +9 -3
  83. package/.output/server/chunks/routes/api/auth/lock.post.mjs +2 -2
  84. package/.output/server/chunks/routes/api/auth/login/options.post.mjs +4 -4
  85. package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +2 -2
  86. package/.output/server/chunks/routes/api/auth/max-session.post.mjs +2 -2
  87. package/.output/server/chunks/routes/api/auth/register/options.post.mjs +2 -2
  88. package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +2 -2
  89. package/.output/server/chunks/routes/api/auth/status.get.mjs +7 -7
  90. package/.output/server/chunks/routes/api/changes.get.mjs +3 -3
  91. package/.output/server/chunks/routes/api/chat/image.get.mjs +3 -3
  92. package/.output/server/chunks/routes/api/chat.get.mjs +17 -46
  93. package/.output/server/chunks/routes/api/choose.post.mjs +3 -3
  94. package/.output/server/chunks/routes/api/claude-setup.post.mjs +3 -3
  95. package/.output/server/chunks/routes/api/claude-statusline.post.mjs +3 -3
  96. package/.output/server/chunks/routes/api/clear-queued-input.post.mjs +3 -3
  97. package/.output/server/chunks/routes/api/close/status.get.mjs +3 -3
  98. package/.output/server/chunks/routes/api/close-preview.get.mjs +2 -2
  99. package/.output/server/chunks/routes/api/close.post.mjs +2 -2
  100. package/.output/server/chunks/routes/api/codex-update.post.mjs +3 -3
  101. package/.output/server/chunks/routes/api/commands.get.mjs +3 -3
  102. package/.output/server/chunks/routes/api/config.get.mjs +3 -3
  103. package/.output/server/chunks/routes/api/dirs.get.mjs +3 -3
  104. package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +3 -3
  105. package/.output/server/chunks/routes/api/dismiss.post.mjs +3 -3
  106. package/.output/server/chunks/routes/api/effort.post.mjs +3 -3
  107. package/.output/server/chunks/routes/api/efforts.get.mjs +3 -3
  108. package/.output/server/chunks/routes/api/file.post.mjs +3 -3
  109. package/.output/server/chunks/routes/api/files/download.get.mjs +2 -2
  110. package/.output/server/chunks/routes/api/files/download.head.mjs +2 -2
  111. package/.output/server/chunks/routes/api/files/read.get.mjs +3 -3
  112. package/.output/server/chunks/routes/api/files.get.mjs +3 -3
  113. package/.output/server/chunks/routes/api/health.get.mjs +2 -2
  114. package/.output/server/chunks/routes/api/input.post.mjs +3 -3
  115. package/.output/server/chunks/routes/api/interrupt.post.mjs +3 -3
  116. package/.output/server/chunks/routes/api/isgit.get.mjs +3 -3
  117. package/.output/server/chunks/routes/api/machine/awake.get.mjs +3 -3
  118. package/.output/server/chunks/routes/api/machine/awake.post.mjs +3 -3
  119. package/.output/server/chunks/routes/api/machine/order.get.mjs +2 -2
  120. package/.output/server/chunks/routes/api/machine/order.post.mjs +2 -2
  121. package/.output/server/chunks/routes/api/machine/reconnect.post.mjs +3 -3
  122. package/.output/server/chunks/routes/api/machine/rename.post.mjs +3 -3
  123. package/.output/server/chunks/routes/api/machine/status.post.mjs +3 -3
  124. package/.output/server/chunks/routes/api/menu-left.post.mjs +3 -3
  125. package/.output/server/chunks/routes/api/menu.post.mjs +3 -3
  126. package/.output/server/chunks/routes/api/model.post.mjs +3 -3
  127. package/.output/server/chunks/routes/api/models.get.mjs +3 -3
  128. package/.output/server/chunks/routes/api/nav.post.mjs +3 -3
  129. package/.output/server/chunks/routes/api/onboarding.get.mjs +2 -2
  130. package/.output/server/chunks/routes/api/onboarding.post.mjs +2 -2
  131. package/.output/server/chunks/routes/api/phone.get.mjs +3 -3
  132. package/.output/server/chunks/routes/api/phone.post.mjs +3 -3
  133. package/.output/server/chunks/routes/api/plugins/actions.get.mjs +2 -2
  134. package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +2 -2
  135. package/.output/server/chunks/routes/api/plugins/projects.get.mjs +3 -3
  136. package/.output/server/chunks/routes/api/plugins/projects.post.mjs +3 -3
  137. package/.output/server/chunks/routes/api/prompt.post.mjs +3 -3
  138. package/.output/server/chunks/routes/api/push/devices.post.mjs +3 -3
  139. package/.output/server/chunks/routes/api/push/quiet.post.mjs +3 -3
  140. package/.output/server/chunks/routes/api/push/subscribe.post.mjs +5 -4
  141. package/.output/server/chunks/routes/api/push/test.post.mjs +3 -3
  142. package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +3 -3
  143. package/.output/server/chunks/routes/api/quotas.get.mjs +3 -3
  144. package/.output/server/chunks/routes/api/rename.post.mjs +2 -2
  145. package/.output/server/chunks/routes/api/requeue.post.mjs +3 -3
  146. package/.output/server/chunks/routes/api/restart.get.mjs +2 -2
  147. package/.output/server/chunks/routes/api/restart.post.mjs +2 -2
  148. package/.output/server/chunks/routes/api/reveal.post.mjs +3 -3
  149. package/.output/server/chunks/routes/api/screen-key.post.mjs +3 -3
  150. package/.output/server/chunks/routes/api/screen.get.mjs +3 -3
  151. package/.output/server/chunks/routes/api/search.get.mjs +3 -3
  152. package/.output/server/chunks/routes/api/seen.post.mjs +3 -3
  153. package/.output/server/chunks/routes/api/send-now.post.mjs +3 -3
  154. package/.output/server/chunks/routes/api/sessions.get.mjs +3 -3
  155. package/.output/server/chunks/routes/api/sessions.post.mjs +3 -3
  156. package/.output/server/chunks/routes/api/settings-tab.post.mjs +3 -3
  157. package/.output/server/chunks/routes/api/settings.get.mjs +3 -3
  158. package/.output/server/chunks/routes/api/settings.post.mjs +3 -3
  159. package/.output/server/chunks/routes/api/space.post.mjs +3 -3
  160. package/.output/server/chunks/routes/api/split-command.post.mjs +3 -3
  161. package/.output/server/chunks/routes/api/state.get.mjs +3 -3
  162. package/.output/server/chunks/routes/api/tasks/action.post.mjs +3 -3
  163. package/.output/server/chunks/routes/api/tasks/add.post.mjs +3 -3
  164. package/.output/server/chunks/routes/api/tasks/after.post.mjs +3 -3
  165. package/.output/server/chunks/routes/api/tasks/approve.post.mjs +3 -3
  166. package/.output/server/chunks/routes/api/tasks/archive-done.post.mjs +3 -3
  167. package/.output/server/chunks/routes/api/tasks/archived.get.mjs +3 -3
  168. package/.output/server/chunks/routes/api/tasks/autopilot.get.mjs +3 -3
  169. package/.output/server/chunks/routes/api/tasks/autopilot.post.mjs +3 -3
  170. package/.output/server/chunks/routes/api/tasks/board-settings.get.mjs +3 -3
  171. package/.output/server/chunks/routes/api/tasks/board-settings.post.mjs +3 -3
  172. package/.output/server/chunks/routes/api/tasks/coordinator.get.mjs +3 -3
  173. package/.output/server/chunks/routes/api/tasks/coordinator.post.mjs +3 -3
  174. package/.output/server/chunks/routes/api/tasks/describe.post.mjs +3 -3
  175. package/.output/server/chunks/routes/api/tasks/details.get.mjs +3 -3
  176. package/.output/server/chunks/routes/api/tasks/limit.post.mjs +3 -3
  177. package/.output/server/chunks/routes/api/tasks/links.get.mjs +4 -4
  178. package/.output/server/chunks/routes/api/tasks/models.get.mjs +3 -3
  179. package/.output/server/chunks/routes/api/tasks/pick.post.mjs +3 -3
  180. package/.output/server/chunks/routes/api/tasks/project.get.mjs +3 -3
  181. package/.output/server/chunks/routes/api/tasks/project.post.mjs +3 -3
  182. package/.output/server/chunks/routes/api/tasks/question.post.mjs +3 -3
  183. package/.output/server/chunks/routes/api/tasks/scheduled.get.mjs +3 -3
  184. package/.output/server/chunks/routes/api/tasks/settings.get.mjs +3 -3
  185. package/.output/server/chunks/routes/api/tasks/start.get.mjs +3 -3
  186. package/.output/server/chunks/routes/api/tasks/tell.post.mjs +3 -3
  187. package/.output/server/chunks/routes/api/tasks/transcript-image.get.mjs +47 -0
  188. package/.output/server/chunks/routes/api/tasks/transcript.get.mjs +48 -0
  189. package/.output/server/chunks/routes/api/tasks.get.mjs +3 -3
  190. package/.output/server/chunks/routes/api/unqueue.post.mjs +3 -3
  191. package/.output/server/chunks/routes/api/update/status.get.mjs +2 -2
  192. package/.output/server/chunks/routes/api/update.get.mjs +2 -2
  193. package/.output/server/chunks/routes/api/update.post.mjs +2 -2
  194. package/.output/server/chunks/routes/api/upload.post.mjs +3 -3
  195. package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +2 -2
  196. package/.output/server/chunks/routes/api/worktrees.get.mjs +2 -2
  197. package/.output/server/chunks/routes/favicon.ico.get.mjs +2 -2
  198. package/.output/server/chunks/routes/icons/_name_.get.mjs +3 -3
  199. package/.output/server/chunks/routes/renderer.mjs +4 -4
  200. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +3 -3
  201. package/.output/server/chunks/routes/ws/_..._.mjs +3 -3
  202. package/.output/server/chunks/routes/ws/events.mjs +3 -3
  203. package/.output/server/chunks/routes/ws/term.mjs +3 -3
  204. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  205. package/.output/server/index.mjs +3 -3
  206. package/.output/server/package.json +1 -1
  207. package/README.md +1 -1
  208. package/bin/lib/tailnet.d.mts +7 -4
  209. package/bin/lib/tailnet.mjs +76 -18
  210. package/bin/lib/updater.mjs +6 -0
  211. package/docs/README.md +2 -0
  212. package/docs/conversation.md +9 -0
  213. package/docs/home.md +29 -0
  214. package/docs/installation.md +14 -5
  215. package/docs/networks.md +9 -4
  216. package/docs/plugins.md +1 -1
  217. package/docs/quick-start.md +7 -6
  218. package/docs/quotas.md +6 -3
  219. package/docs/release-notes-2.6.0.md +29 -0
  220. package/docs/security.md +54 -11
  221. package/docs/troubleshooting.md +4 -0
  222. package/package.json +1 -1
  223. package/.output/public/_nuxt/1gzTzt3j.js +0 -9
  224. package/.output/public/_nuxt/1gzTzt3j.js.br +0 -0
  225. package/.output/public/_nuxt/1gzTzt3j.js.gz +0 -0
  226. package/.output/public/_nuxt/AgentView.B6zltno1.css.br +0 -0
  227. package/.output/public/_nuxt/AgentView.B6zltno1.css.gz +0 -0
  228. package/.output/public/_nuxt/BdJIc1Xf.js.gz +0 -0
  229. package/.output/public/_nuxt/BrxmYJEM.js +0 -1
  230. package/.output/public/_nuxt/BrxmYJEM.js.br +0 -0
  231. package/.output/public/_nuxt/BrxmYJEM.js.gz +0 -0
  232. package/.output/public/_nuxt/C6fXOTRV.js +0 -3
  233. package/.output/public/_nuxt/C6fXOTRV.js.br +0 -0
  234. package/.output/public/_nuxt/C6fXOTRV.js.gz +0 -0
  235. package/.output/public/_nuxt/CXbAL3Yu.js.br +0 -0
  236. package/.output/public/_nuxt/CXbAL3Yu.js.gz +0 -0
  237. package/.output/public/_nuxt/Cf1C5Vkb.js +0 -27
  238. package/.output/public/_nuxt/Cf1C5Vkb.js.br +0 -0
  239. package/.output/public/_nuxt/Cf1C5Vkb.js.gz +0 -0
  240. package/.output/public/_nuxt/CgUSTIM1.js.gz +0 -0
  241. package/.output/public/_nuxt/CmTpxyM2.js +0 -62
  242. package/.output/public/_nuxt/CmTpxyM2.js.br +0 -0
  243. package/.output/public/_nuxt/CmTpxyM2.js.gz +0 -0
  244. package/.output/public/_nuxt/DMzjoyW_.js.br +0 -0
  245. package/.output/public/_nuxt/DMzjoyW_.js.gz +0 -0
  246. package/.output/public/_nuxt/DOVT2Tt8.js.br +0 -0
  247. package/.output/public/_nuxt/DOVT2Tt8.js.gz +0 -0
  248. package/.output/public/_nuxt/PjGJWal8.js.br +0 -0
  249. package/.output/public/_nuxt/PjGJWal8.js.gz +0 -0
  250. package/.output/public/_nuxt/WPcHpWhL.js +0 -31
  251. package/.output/public/_nuxt/WPcHpWhL.js.br +0 -0
  252. package/.output/public/_nuxt/WPcHpWhL.js.gz +0 -0
  253. package/.output/public/_nuxt/builds/meta/d4aab09d-c1c4-4743-b8aa-35541006e853.json +0 -1
  254. package/.output/public/_nuxt/entry.DosS87kQ.css +0 -2
  255. package/.output/public/_nuxt/entry.DosS87kQ.css.br +0 -0
  256. package/.output/public/_nuxt/entry.DosS87kQ.css.gz +0 -0
  257. package/.output/public/_nuxt/nfsDZG4P.js +0 -123
  258. package/.output/public/_nuxt/nfsDZG4P.js.br +0 -0
  259. package/.output/public/_nuxt/nfsDZG4P.js.gz +0 -0
  260. package/.output/public/_nuxt/tYQOxjM1.js +0 -1
  261. package/.output/public/_nuxt/tYQOxjM1.js.br +0 -0
  262. package/.output/public/_nuxt/tYQOxjM1.js.gz +0 -0
@@ -0,0 +1 @@
1
+ .omp-context-progress[data-v-e967b731]{pointer-events:none;background:var(--green);height:2px;position:absolute;bottom:0;left:0}.omp-context-progress.mid[data-v-e967b731]{background:var(--ochre)}.omp-context-progress.hi[data-v-e967b731]{background:var(--rose)}.omp-context-progress.last-known[data-v-e967b731]{opacity:.5}.omp-context[data-v-e967b731]{white-space:nowrap;font-variant-numeric:tabular-nums;cursor:pointer;position:relative}.omp-context[data-v-e967b731]:after{content:"";position:absolute;inset:-6px 0}.omp-context-detail[data-v-e967b731]{width:min(300px,80vw);color:var(--text);white-space:normal;overflow-wrap:anywhere;padding:10px;font-size:12px}.omp-context-status[data-v-e967b731]{color:var(--muted);font-family:var(--mono);margin-top:8px}
@@ -0,0 +1 @@
1
+ .md-body[data-v-8ea9a8a3] .svg-block{background:0 0}.md-body[data-v-8ea9a8a3] img.svg-preview{-o-object-fit:contain;object-fit:contain;cursor:zoom-in;background:0 0;border:0;width:100%;max-width:100%;max-height:65dvh;margin:0;padding:12px;display:block}.md-body[data-v-8ea9a8a3] .svg-source[hidden],.md-body[data-v-8ea9a8a3] img.svg-preview[hidden]{display:none}.md-body[data-v-8ea9a8a3] .svg-toggle:focus-visible,.md-body[data-v-8ea9a8a3] img.svg-preview:focus-visible{outline:1px solid var(--accent);outline-offset:-2px}.md-body[data-v-8ea9a8a3] .svg-toggle{min-width:64px;min-height:44px;color:var(--muted);font:500 10px/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;padding:6px 8px}.md-body[data-v-8ea9a8a3] .svg-toggle:hover{color:var(--text);background:var(--surface-2)}.md-body[data-v-8ea9a8a3] .svg-note{color:var(--muted);margin:0;padding:12px 14px;font-size:13px}.md-body[data-v-8ea9a8a3] .svg-block .code-head{height:auto;min-height:44px}.md-body[data-v-8ea9a8a3] .svg-block .code-copy{min-width:44px;min-height:44px}
@@ -15,7 +15,7 @@
15
15
  var sw = self;
16
16
  var CACHE = "wherdr-v1";
17
17
  var NETWORK_WAIT_MS = 3e3;
18
- var PRECACHE = ["/", ...[{"revision":"e6a852ba6e2a724d2255af526cb04083","url":"manifest.webmanifest"},{"revision":"b1a14fab8c06784649bf26c636747a86","url":"manifest-en.webmanifest"},{"revision":null,"url":"_nuxt/wherdr-symbols.C1LsPKmg.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-powerline.B_kAMxXr.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-octicons.Hl4VEx8m.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-4.CO_PudDR.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-3.8xz7iX-Y.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-2.C_flbBWO.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-1.BdvqkCqW.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-extension.Dai_ky39.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-devicons.ZMSFX1sW.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-codicons.CtEsfSAf.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-awesome.DQ3_iAfa.woff2"},{"revision":null,"url":"_nuxt/tYQOxjM1.js"},{"revision":null,"url":"_nuxt/settings.ycbeituV.css"},{"revision":null,"url":"_nuxt/qODuBH5E.js"},{"revision":null,"url":"_nuxt/nfsDZG4P.js"},{"revision":null,"url":"_nuxt/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2"},{"revision":null,"url":"_nuxt/inter-vietnamese-wght-normal.CBcvBZtf.woff2"},{"revision":null,"url":"_nuxt/inter-latin-wght-normal.Dx4kXJAl.woff2"},{"revision":null,"url":"_nuxt/inter-latin-ext-wght-normal.DO1Apj_S.woff2"},{"revision":null,"url":"_nuxt/inter-greek-wght-normal.CkhJZR-_.woff2"},{"revision":null,"url":"_nuxt/inter-greek-ext-wght-normal.DlzME5K_.woff2"},{"revision":null,"url":"_nuxt/inter-cyrillic-wght-normal.DqGufNeO.woff2"},{"revision":null,"url":"_nuxt/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2"},{"revision":null,"url":"_nuxt/hePW80VL.js"},{"revision":null,"url":"_nuxt/error-500.Bwd7zAaE.css"},{"revision":null,"url":"_nuxt/error-404.Bb87HomL.css"},{"revision":null,"url":"_nuxt/entry.DosS87kQ.css"},{"revision":null,"url":"_nuxt/board.CpFnG_Ho.css"},{"revision":null,"url":"_nuxt/archivo-vietnamese-wght-normal.XAtsl5Q_.woff2"},{"revision":null,"url":"_nuxt/archivo-latin-wght-normal.E0tuGl4L.woff2"},{"revision":null,"url":"_nuxt/archivo-latin-ext-wght-normal.C4zznr8T.woff2"},{"revision":null,"url":"_nuxt/WPcHpWhL.js"},{"revision":null,"url":"_nuxt/PjGJWal8.js"},{"revision":null,"url":"_nuxt/DOVT2Tt8.js"},{"revision":null,"url":"_nuxt/DMzjoyW_.js"},{"revision":null,"url":"_nuxt/CmTpxyM2.js"},{"revision":null,"url":"_nuxt/CgUSTIM1.js"},{"revision":null,"url":"_nuxt/Cf1C5Vkb.js"},{"revision":null,"url":"_nuxt/CXbAL3Yu.js"},{"revision":null,"url":"_nuxt/CXJnLmWv.js"},{"revision":null,"url":"_nuxt/CDWjMk9C.js"},{"revision":null,"url":"_nuxt/C6fXOTRV.js"},{"revision":null,"url":"_nuxt/C25ROUa9.js"},{"revision":null,"url":"_nuxt/BrxmYJEM.js"},{"revision":null,"url":"_nuxt/Bpoxvzh6.js"},{"revision":null,"url":"_nuxt/BdJIc1Xf.js"},{"revision":null,"url":"_nuxt/Bd17z0YL.js"},{"revision":null,"url":"_nuxt/Bd0Z2zzq.js"},{"revision":null,"url":"_nuxt/BYZVrreW.js"},{"revision":null,"url":"_nuxt/BDNMzG2s.js"},{"revision":null,"url":"_nuxt/AgentView.B6zltno1.css"},{"revision":null,"url":"_nuxt/1gzTzt3j.js"},{"revision":"ae99db4ed857c6a2203d69dd0df6c849","url":"_nuxt/builds/latest.json"},{"revision":null,"url":"_nuxt/builds/meta/d4aab09d-c1c4-4743-b8aa-35541006e853.json"}].map((e) => "/" + (typeof e === "string" ? e : e.url).replace(/^\//, ""))];
18
+ var PRECACHE = ["/", ...[{"revision":"e6a852ba6e2a724d2255af526cb04083","url":"manifest.webmanifest"},{"revision":"b1a14fab8c06784649bf26c636747a86","url":"manifest-en.webmanifest"},{"revision":null,"url":"_nuxt/wherdr-symbols.C1LsPKmg.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-powerline.B_kAMxXr.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-octicons.Hl4VEx8m.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-4.CO_PudDR.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-3.8xz7iX-Y.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-2.C_flbBWO.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-1.BdvqkCqW.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-extension.Dai_ky39.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-devicons.ZMSFX1sW.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-codicons.CtEsfSAf.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-awesome.DQ3_iAfa.woff2"},{"revision":null,"url":"_nuxt/useWorktrees.BWpb3OO0.css"},{"revision":null,"url":"_nuxt/useViewport.D9mmYA6A.css"},{"revision":null,"url":"_nuxt/settings.ycbeituV.css"},{"revision":null,"url":"_nuxt/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2"},{"revision":null,"url":"_nuxt/inter-vietnamese-wght-normal.CBcvBZtf.woff2"},{"revision":null,"url":"_nuxt/inter-latin-wght-normal.Dx4kXJAl.woff2"},{"revision":null,"url":"_nuxt/inter-latin-ext-wght-normal.DO1Apj_S.woff2"},{"revision":null,"url":"_nuxt/inter-greek-wght-normal.CkhJZR-_.woff2"},{"revision":null,"url":"_nuxt/inter-greek-ext-wght-normal.DlzME5K_.woff2"},{"revision":null,"url":"_nuxt/inter-cyrillic-wght-normal.DqGufNeO.woff2"},{"revision":null,"url":"_nuxt/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2"},{"revision":null,"url":"_nuxt/hePW80VL.js"},{"revision":null,"url":"_nuxt/error-500.Bwd7zAaE.css"},{"revision":null,"url":"_nuxt/error-404.Bb87HomL.css"},{"revision":null,"url":"_nuxt/entry.C_hImCpq.css"},{"revision":null,"url":"_nuxt/board.CpFnG_Ho.css"},{"revision":null,"url":"_nuxt/archivo-vietnamese-wght-normal.XAtsl5Q_.woff2"},{"revision":null,"url":"_nuxt/archivo-latin-wght-normal.E0tuGl4L.woff2"},{"revision":null,"url":"_nuxt/archivo-latin-ext-wght-normal.C4zznr8T.woff2"},{"revision":null,"url":"_nuxt/T-qXNaMY.js"},{"revision":null,"url":"_nuxt/D_x7Rysx.js"},{"revision":null,"url":"_nuxt/DNs2cMBZ.js"},{"revision":null,"url":"_nuxt/CnjxEm0H.js"},{"revision":null,"url":"_nuxt/CiG2Lovu.js"},{"revision":null,"url":"_nuxt/CXJnLmWv.js"},{"revision":null,"url":"_nuxt/COWXF9OU.js"},{"revision":null,"url":"_nuxt/CDWjMk9C.js"},{"revision":null,"url":"_nuxt/CAkH_IfS.js"},{"revision":null,"url":"_nuxt/C8tHIeGN.js"},{"revision":null,"url":"_nuxt/C25ROUa9.js"},{"revision":null,"url":"_nuxt/ByLPJEo6.js"},{"revision":null,"url":"_nuxt/Bqz3nVVB.js"},{"revision":null,"url":"_nuxt/Bpoxvzh6.js"},{"revision":null,"url":"_nuxt/Bd17z0YL.js"},{"revision":null,"url":"_nuxt/BK1_9FXg.js"},{"revision":null,"url":"_nuxt/BDNMzG2s.js"},{"revision":null,"url":"_nuxt/B5cSia3P.js"},{"revision":null,"url":"_nuxt/B40shTLf.js"},{"revision":null,"url":"_nuxt/AgentView.BwyQIUef.css"},{"revision":null,"url":"_nuxt/7KozZy5Y.js"},{"revision":null,"url":"_nuxt/6YTlf8ot.js"},{"revision":null,"url":"_nuxt/3bE7s96N.js"},{"revision":null,"url":"_nuxt/2fsYF-LK.js"},{"revision":"49e0b22686896464e4fa37a1e1160a8f","url":"_nuxt/builds/latest.json"},{"revision":null,"url":"_nuxt/builds/meta/e2ee8d99-6a6a-4754-934f-8b7dbecfcdcb.json"}].map((e) => "/" + (typeof e === "string" ? e : e.url).replace(/^\//, ""))];
19
19
  sw.addEventListener("install", (e) => {
20
20
  e.waitUntil((async () => {
21
21
  const c = await caches.open(CACHE);
@@ -49,7 +49,11 @@
49
49
  }
50
50
  const network = fetch(req, { cache: "no-cache" });
51
51
  e.waitUntil(network.then((res) => keep(req, res)).catch(() => {}));
52
- const fromCache = async () => await caches.match(req) || (req.mode === "navigate" ? caches.match("/") : void 0);
52
+ if (req.mode === "navigate") {
53
+ e.respondWith(caches.match("/").then((hit) => hit || network));
54
+ return;
55
+ }
56
+ const fromCache = async () => await caches.match(req) || void 0;
53
57
  e.respondWith(networkFirst(network, fromCache, NETWORK_WAIT_MS));
54
58
  });
55
59
  sw.addEventListener("push", (e) => {
@@ -1,4 +1,4 @@
1
- import { s as sendError, cx as useStorage, az as setResponseHeader } from '../nitro/nitro.mjs';
1
+ import { s as sendError, cN as useStorage, aK as setResponseHeader } from '../nitro/nitro.mjs';
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
 
@@ -1,4 +1,4 @@
1
- import { H as HerdrError, a as defineApi, i as getQuery, f as findPane, m as machineFor, az as setResponseHeader, aA as getRequestHeader, aB as setResponseStatus } from '../nitro/nitro.mjs';
1
+ import { H as HerdrError, a as defineApi, i as getQuery, f as findPane, B as machineFor, aK as setResponseHeader, aL as getRequestHeader, aM as setResponseStatus } from '../nitro/nitro.mjs';
2
2
  import { w as writtenTarget, c as cleanRelative, r as rootOf, i as isVideo, O as OPEN_FILE, V as VIDEO_HEAD, s as shellError, v as videoType, a as readWrittenBytes, b as readFileBytes, d as isPdf, e as attachmentHeader } from './files.mjs';
3
3
  import { spawn } from 'node:child_process';
4
4
  import crypto from 'node:crypto';
@@ -1,8 +1,8 @@
1
1
  import { execFile } from 'node:child_process';
2
2
  import path from 'node:path';
3
+ import { H as HerdrError, ac as DATA_DIR, aJ as shq } from '../nitro/nitro.mjs';
3
4
  import { r as resolveAgentPath, p as posixResolve } from './filePaths.mjs';
4
5
  import { g as gitToplevel } from './changes.mjs';
5
- import { H as HerdrError } from '../nitro/nitro.mjs';
6
6
 
7
7
  const MAX_ENTRIES = 2e3;
8
8
  const TEXT_BYTES = 256 * 1024;
@@ -62,7 +62,17 @@ printf '=\\0'
62
62
  [ "$#" -gt 0 ] || exit 0
63
63
  if stat -f %z / >/dev/null 2>&1; then stat -f %z -- "$@"; else stat -c %s -- "$@"; fi 2>/dev/null
64
64
  exit 0`;
65
+ const PROTECTED_HOME = [".ssh", ".config/herdr"];
66
+ const protectedDirs = (home) => [...home ? PROTECTED_HOME.map((d) => path.posix.join(posixResolve("/", home), d)) : [], path.resolve(DATA_DIR)];
67
+ const PROTECTED = `protected_path() {
68
+ for pp in ${PROTECTED_HOME.map((d) => `"$HOME/${d}"`).join(" ")} ${shq(path.resolve(DATA_DIR))}; do
69
+ pd=$(cd "$pp" 2>/dev/null && pwd -P) || continue
70
+ case "$1/" in "\${pd%/}/"*) return 0 ;; esac
71
+ done
72
+ return 1
73
+ }`;
65
74
  const OPEN_FILE = `${RESOLVE}
75
+ ${PROTECTED}
66
76
  case "$2" in */*) d=\${2%/*} ;; *) d=. ;; esac
67
77
  b=\${2##*/}
68
78
  dir=$(cd "$root" && cd -- "./$d" 2>/dev/null && pwd -P) || { echo "not found" >&2; exit 4; }
@@ -77,6 +87,7 @@ while [ -L "$f" ]; do
77
87
  done
78
88
  [ -e "$f" ] || { echo "not found" >&2; exit 4; }
79
89
  under "$f" || { echo "outside" >&2; exit 5; }
90
+ protected_path "$f" && { echo "protected" >&2; exit 9; }
80
91
  [ -f "$f" ] || { echo "not a file" >&2; exit 6; }
81
92
  [ -r "$f" ] || { echo "permission denied" >&2; exit 7; }
82
93
  command exec 3< "$f" || { echo "permission denied" >&2; exit 7; }
@@ -94,6 +105,7 @@ s=\${m#* }; s=$((\${s%% *}))
94
105
  echo $s
95
106
  [ -n "$4" ] && [ "$s" -ge "$3" ] && exit 0
96
107
  head -c "$3" <&3`;
108
+ const PROTECTED_MESSAGE = "This file is protected: wherdr never shows its own data, ~/.ssh or ~/.config/herdr";
97
109
  const MACOS_SSH_DENIED = "macOS blocks access to this folder. On the Mac: System Settings \u203A General \u203A Sharing \u203A Remote Login \u24D8 \u203A \u201CAllow full disk access for remote users\u201D.";
98
110
  const MACOS_LOCAL_DENIED = "macOS blocks access to this folder. Allow the app that runs wherdr in System Settings \u203A Privacy & Security \u203A Full Disk Access.";
99
111
  function executor(m, { timeoutMs = 15e3, maxBytes = IMAGE_BYTES } = {}) {
@@ -120,6 +132,7 @@ function shellError(m, code, stderr) {
120
132
  if (r.code === 6) return new HerdrError("not_file", "Not a file");
121
133
  if (r.code === 7) return new HerdrError("denied", "Permission denied");
122
134
  if (r.code === 8) return new HerdrError("denied", m.exec ? MACOS_SSH_DENIED : MACOS_LOCAL_DENIED);
135
+ if (r.code === 9) return new HerdrError("protected", PROTECTED_MESSAGE);
123
136
  if (r.code === 124) return new HerdrError("timeout", "The folder took too long to read");
124
137
  if (r.code === 255 || r.code === null) return new HerdrError("unreachable", "Machine unreachable");
125
138
  return new HerdrError("remote", r.stderr.trim().split("\n").pop() || `code ${r.code}`);
@@ -185,8 +198,14 @@ function writtenTarget(m, cwd, written) {
185
198
  const root = posixResolve("/", m.home);
186
199
  const rel = path.posix.relative(root, abs);
187
200
  if (!rel) throw new HerdrError("not_file", "Not a file");
201
+ refuseProtected(m, abs);
188
202
  return { root, rel, abs };
189
203
  }
204
+ function refuseProtected(m, abs) {
205
+ for (const d of protectedDirs(m.home)) {
206
+ if (abs === d || abs.startsWith(d.replace(/\/+$/, "") + "/")) throw new HerdrError("protected", PROTECTED_MESSAGE);
207
+ }
208
+ }
190
209
  async function readHead(m, root, rel, max, opts) {
191
210
  const out = await run(m, READ_SCRIPT, [root, rel, String(max), ...(opts == null ? void 0 : opts.whole) ? ["1"] : []], opts);
192
211
  const nl = out.indexOf(10);
@@ -214,7 +233,9 @@ async function previewAt(m, root, rel, shown) {
214
233
  async function readFilePreview(m, cwd, rel) {
215
234
  const p = cleanRelative(rel);
216
235
  if (!p) throw new HerdrError("not_file", "Not a file");
217
- return previewAt(m, await rootOf(m, cwd), p, p);
236
+ const root = await rootOf(m, cwd);
237
+ refuseProtected(m, path.posix.join(root, p));
238
+ return previewAt(m, root, p, p);
218
239
  }
219
240
  async function readWrittenPreview(m, cwd, written) {
220
241
  const t = writtenTarget(m, cwd, written);
@@ -228,7 +249,9 @@ async function bytesAt(m, root, rel) {
228
249
  async function readFileBytes(m, cwd, rel) {
229
250
  const p = cleanRelative(rel);
230
251
  if (!p) throw new HerdrError("not_file", "Not a file");
231
- return bytesAt(m, await rootOf(m, cwd), p);
252
+ const root = await rootOf(m, cwd);
253
+ refuseProtected(m, path.posix.join(root, p));
254
+ return bytesAt(m, root, p);
232
255
  }
233
256
  async function readWrittenBytes(m, cwd, written) {
234
257
  const t = writtenTarget(m, cwd, written);
@@ -1,7 +1,7 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { randomUUID } from 'node:crypto';
4
- import { aJ as baseMachines, a2 as DATA_DIR } from '../nitro/nitro.mjs';
4
+ import { aU as baseMachines, ac as DATA_DIR } from '../nitro/nitro.mjs';
5
5
 
6
6
  function cleanMachineOrder(value, known) {
7
7
  if (!Array.isArray(value)) return [];
@@ -1,6 +1,6 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { aY as HOST_LABEL, a2 as DATA_DIR } from '../nitro/nitro.mjs';
3
+ import { b7 as HOST_LABEL, ac as DATA_DIR } from '../nitro/nitro.mjs';
4
4
 
5
5
  const ONBOARDING_FILE = path.join(DATA_DIR, "onboarding.json");
6
6
  function readOnboarding(file = ONBOARDING_FILE, host = HOST_LABEL) {
@@ -1,5 +1,5 @@
1
1
  var name = "wherdr";
2
- var version = "2.5.0";
2
+ var version = "2.6.0";
3
3
  var license = "MIT";
4
4
  var type = "module";
5
5
  var description = "Unofficial mobile web client (PWA) to drive the coding agents running in Herdr";
@@ -1,4 +1,4 @@
1
- import { m as machineFor, a$ as herdrOn, H as HerdrError, f as findPane, b0 as splitId, b1 as getState, ad as log, X as sleep } from '../nitro/nitro.mjs';
1
+ import { B as machineFor, ba as herdrOn, H as HerdrError, f as findPane, bb as splitId, bc as getState, an as log, a5 as sleep } from '../nitro/nitro.mjs';
2
2
 
3
3
  const PLUGIN_ID_RE = /^[A-Za-z0-9.:_-]{1,100}$/;
4
4
  const ACTION_ID_RE = /^[A-Za-z0-9:_-]{1,100}$/;
@@ -1,4 +1,4 @@
1
- import { H as HerdrError, a6 as paneForeground, a7 as codexMenuOpen, a8 as stopAgent, a9 as terminalUpdateLine, aa as waitFor, ab as terminalUpdateDone, ac as startAgent, X as sleep, f as findPane, T as restarts, ad as log, M as withPaneLock, ae as RESTARTABLE, y as transcripts, af as claudeFooterMode, ag as planRestart, h as herdr, p as poll } from '../nitro/nitro.mjs';
1
+ import { H as HerdrError, ag as paneForeground, ah as codexMenuOpen, ai as stopAgent, aj as terminalUpdateLine, ak as waitFor, al as terminalUpdateDone, am as startAgent, a5 as sleep, f as findPane, a2 as restarts, an as log, Y as withPaneLock, ao as RESTARTABLE, J as transcripts, ap as claudeFooterMode, aq as planRestart, h as herdr, p as poll } from '../nitro/nitro.mjs';
2
2
  import crypto from 'node:crypto';
3
3
 
4
4
  const TERM_UPDATE_MS = 10 * 6e4;
@@ -0,0 +1,22 @@
1
+ import { m as dropAllSubs } from '../nitro/nitro.mjs';
2
+ import { r as revalidatePeers } from './ws.mjs';
3
+
4
+ async function revokeEverywhere(peers) {
5
+ await dropAllSubs();
6
+ return peers ? revalidatePeers(peers) : revalidatePeers();
7
+ }
8
+ const PUSH_RESUBSCRIBE = JSON.stringify({ type: "push-resubscribe" });
9
+ function askPushResubscribe(clients) {
10
+ let asked = 0;
11
+ for (const c of clients) {
12
+ try {
13
+ c.send(PUSH_RESUBSCRIBE);
14
+ asked++;
15
+ } catch {
16
+ }
17
+ }
18
+ return asked;
19
+ }
20
+
21
+ export { askPushResubscribe as a, revokeEverywhere as r };
22
+ //# sourceMappingURL=revoke.mjs.map
@@ -3,7 +3,7 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { p as pkg } from './package.mjs';
6
- import { cr as installMode, H as HerdrError, ad as log, cs as oneTapMode, cv as updateRunning } from '../nitro/nitro.mjs';
6
+ import { cE as installMode, H as HerdrError, an as log, cH as oneTapMode, cL as updateRunning, cJ as majorOf } from '../nitro/nitro.mjs';
7
7
  import { c as checkUpdate, R as REPO } from './updates.mjs';
8
8
 
9
9
  function wherdrDir(env = process.env) {
@@ -23,6 +23,7 @@ function buildPlan(o) {
23
23
  if (!oneTapMode(o.mode)) throw new HerdrError("update_manual", "This installation cannot update itself: run the update command");
24
24
  if (updateRunning(o.job, o.now)) throw new HerdrError("update_running", "An update is already in progress");
25
25
  if (!o.latest || o.to !== o.latest) throw new HerdrError("update_version", "No newer version to install");
26
+ if (majorOf(o.latest) !== majorOf(o.current)) throw new HerdrError("update_major", `wherdr ${o.latest} is a new major version: it installs beside this one, see its migration guide`);
26
27
  return {
27
28
  kind: o.mode,
28
29
  from: o.current,
@@ -1,6 +1,6 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- import { $ as getMachine, H as HerdrError, a2 as DATA_DIR, a3 as RemoteMachine, a4 as HERDR_BIN } from '../nitro/nitro.mjs';
3
+ import { a9 as getMachine, H as HerdrError, ac as DATA_DIR, ad as RemoteMachine, ae as HERDR_BIN } from '../nitro/nitro.mjs';
4
4
 
5
5
  const SPLIT_TERMINAL_TOKEN = "wherdr_split_terminal";
6
6
  const SPLIT_PROMPT_TOKEN = "wherdr_split_prompt";
@@ -1,5 +1,5 @@
1
1
  import { p as pkg } from './package.mjs';
2
- import { cr as installMode, cs as oneTapMode, ct as updateCommand, cu as compareVersions } from '../nitro/nitro.mjs';
2
+ import { cE as installMode, cF as updateCommand, cG as releaseBranch, cH as oneTapMode, cI as compareVersions, cJ as majorOf, cK as majorMove } from '../nitro/nitro.mjs';
3
3
 
4
4
  const REPO = "afloury/wherdr";
5
5
  const RELEASES_URL = `https://api.github.com/repos/${REPO}/releases?per_page=100`;
@@ -9,6 +9,7 @@ function createUpdateChecker(opts) {
9
9
  var _a;
10
10
  const now = (_a = opts.now) != null ? _a : Date.now;
11
11
  let cached = null;
12
+ let nextMajor = null;
12
13
  let nextAt = 0;
13
14
  let pending = null;
14
15
  async function refresh() {
@@ -17,9 +18,21 @@ function createUpdateChecker(opts) {
17
18
  const res = await opts.fetch(RELEASES_URL);
18
19
  if (!res.ok) throw new Error("http");
19
20
  const releases = await res.json();
20
- const stable = releases.filter((r) => !r.draft && !r.prerelease && /^v\d+\.\d+\.\d+$/.test(String(r.tag_name))).sort((a, b) => compareVersions(String(b.tag_name), String(a.tag_name)));
21
+ const all = releases.filter((r) => !r.draft && !r.prerelease && /^v\d+\.\d+\.\d+$/.test(String(r.tag_name))).sort((a, b) => compareVersions(String(b.tag_name), String(a.tag_name)));
22
+ const major = majorOf(opts.current);
23
+ const next = all.find((r) => {
24
+ var _a3;
25
+ return ((_a3 = majorOf(String(r.tag_name))) != null ? _a3 : 0) > (major != null ? major : Infinity);
26
+ });
27
+ nextMajor = next ? majorMove(REPO, String(next.tag_name).replace(/^v/, ""), typeof next.html_url === "string" ? next.html_url : "") : null;
28
+ const stable = all.filter((r) => majorOf(String(r.tag_name)) === major);
21
29
  const body = stable[0];
22
- if (!body || typeof body.tag_name !== "string") throw new Error("tag");
30
+ if (!body) {
31
+ cached != null ? cached : cached = { version: opts.current, url: "", missed: [], truncated: false };
32
+ nextAt = now() + DAY_MS;
33
+ return;
34
+ }
35
+ if (typeof body.tag_name !== "string") throw new Error("tag");
23
36
  const missed = [...new Set(stable.map((r) => String(r.tag_name).replace(/^v/, "")))].filter((version) => compareVersions(version, opts.current) > 0);
24
37
  const candidate = {
25
38
  version: body.tag_name.replace(/^v/, ""),
@@ -66,7 +79,7 @@ function createUpdateChecker(opts) {
66
79
  }
67
80
  return async function check() {
68
81
  const mode = installMode(opts.env.WHERDR_INSTALL);
69
- const base = { current: opts.current, mode, command: updateCommand(mode, REPO), oneTap: oneTapMode(mode), behind: 0, missed: [], behindAtLeast: false };
82
+ const base = { current: opts.current, mode, command: updateCommand(mode, REPO, releaseBranch(opts.current)), oneTap: oneTapMode(mode), behind: 0, missed: [], behindAtLeast: false };
70
83
  if (String(opts.env.WHERDR_UPDATE_CHECK || "").toLowerCase() === "off") return { ...base, latest: null, url: null, checked: false };
71
84
  if (now() >= nextAt) {
72
85
  pending != null ? pending : pending = refresh().finally(() => {
@@ -80,6 +93,7 @@ function createUpdateChecker(opts) {
80
93
  latest: newer ? cached.version : null,
81
94
  url: newer ? cached.url || null : null,
82
95
  checked: !!cached,
96
+ nextMajor,
83
97
  ...newer ? { behind: cached.missed.length, missed: cached.missed.slice(0, 5), behindAtLeast: cached.truncated } : {}
84
98
  };
85
99
  };
@@ -0,0 +1,46 @@
1
+ import { createHash } from 'node:crypto';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { U as UPLOAD_DIR, S as uploadNames } from '../nitro/nitro.mjs';
5
+
6
+ const UPLOAD_PATH = /\.cache\/herdr-web\/uploads\/([\w-]+\.[a-z]+)/g;
7
+ const CACHE_MAX = 500;
8
+ const cache = /* @__PURE__ */ new Map();
9
+ async function uploadHash(dir, name) {
10
+ const key = `${dir}
11
+ ${name}`;
12
+ if (cache.has(key)) return cache.get(key);
13
+ let hash = null;
14
+ try {
15
+ hash = createHash("sha256").update(await fs.readFile(path.join(dir, path.basename(name)))).digest("hex");
16
+ } catch {
17
+ hash = null;
18
+ }
19
+ if (cache.size >= CACHE_MAX) cache.delete(cache.keys().next().value);
20
+ cache.set(key, hash);
21
+ return hash;
22
+ }
23
+ async function addUploadHashes(items, dir = UPLOAD_DIR) {
24
+ var _a;
25
+ for (const it of items) {
26
+ if (it.role === "user") {
27
+ const names = uploadNames(it.text);
28
+ if (!names.length) continue;
29
+ const own = (await Promise.all(names.map((n) => uploadHash(dir, n)))).filter((h) => !!h);
30
+ const hashes = [...it.hashes || [], ...own.filter((h) => {
31
+ var _a2;
32
+ return !((_a2 = it.hashes) == null ? void 0 : _a2.includes(h));
33
+ })];
34
+ if (hashes.length) it.hashes = hashes;
35
+ } else if (it.images === 1) {
36
+ const names = [...new Set([...`${it.text}
37
+ ${((_a = it.omp) == null ? void 0 : _a.target) || ""}`.matchAll(UPLOAD_PATH)].map((m) => m[1]))];
38
+ if (names.length !== 1) continue;
39
+ const h = await uploadHash(dir, names[0]);
40
+ if (h) it.hashes = [h];
41
+ }
42
+ }
43
+ }
44
+
45
+ export { addUploadHashes as a };
46
+ //# sourceMappingURL=uploadHashes.mjs.map
@@ -1,4 +1,4 @@
1
- import { cw as allMachines, $ as getMachine, H as HerdrError, b0 as splitId, a$ as herdrOn, p as poll, aq as recentDirs, b_ as joinId, b1 as getState } from '../nitro/nitro.mjs';
1
+ import { cM as allMachines, a9 as getMachine, H as HerdrError, bb as splitId, ba as herdrOn, p as poll, aA as recentDirs, c9 as joinId, bc as getState } from '../nitro/nitro.mjs';
2
2
 
3
3
  const opts = { trust_repository: true };
4
4
  async function machineWorktrees(m) {
@@ -1,4 +1,4 @@
1
- import { cE as networkReady, cF as ensureFresh, cG as gateDecision, cH as sameOrigin, cI as hostAllowed, k as auth, cJ as checkRequestClient, cK as onNetworkReading } from '../nitro/nitro.mjs';
1
+ import { n as networkReady, o as ensureFresh, q as gateDecision, t as sameOrigin, u as hostAllowed, k as auth, v as checkRequestClient, x as onNetworkReading } from '../nitro/nitro.mjs';
2
2
 
3
3
  var _a, _b;
4
4
  const WS_MAX = 256 * 1024;
@@ -11,7 +11,7 @@ function headersOf(h) {
11
11
  }
12
12
  function upgradeVerdict(headers, remoteAddress) {
13
13
  return gateDecision({
14
- check: checkRequestClient(remoteAddress, headers),
14
+ check: checkRequestClient(remoteAddress, headers, auth.isEnabled()),
15
15
  unlocked: auth.isUnlocked({ headers }),
16
16
  hostOk: hostAllowed(headers.host),
17
17
  crossSite: !sameOrigin(headers),
@@ -90,5 +90,5 @@ function messageText(message) {
90
90
  return t.length > WS_MAX ? null : t;
91
91
  }
92
92
 
93
- export { checkUpgrade as c, isOpen as i, messageText as m, unwatchPeer as u, watchPeer as w };
93
+ export { checkUpgrade as c, isOpen as i, messageText as m, revalidatePeers as r, unwatchPeer as u, watchPeer as w };
94
94
  //# sourceMappingURL=ws.mjs.map