wherdr 1.3.2 → 1.3.4

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 (188) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{AgentView.C4YOwvZG.css → AgentView.DzFWBd2A.css} +1 -1
  3. package/.output/public/_nuxt/{Cd8j9O5w.js → BEJHMUrj.js} +1 -1
  4. package/.output/public/_nuxt/BOtcEDnA.js +1 -0
  5. package/.output/public/_nuxt/BUaYhQ2r.js +6 -0
  6. package/.output/public/_nuxt/{yzABg5xl.js → Bpoxvzh6.js} +1 -1
  7. package/.output/public/_nuxt/C25ROUa9.js +3 -0
  8. package/.output/public/_nuxt/CDWjMk9C.js +2 -0
  9. package/.output/public/_nuxt/CJKsMzIp.js +1 -0
  10. package/.output/public/_nuxt/CJNhn9sA.js +36 -0
  11. package/.output/public/_nuxt/COCvtdHN.js +89 -0
  12. package/.output/public/_nuxt/{Ci8N4mWR.js → CXJnLmWv.js} +1 -1
  13. package/.output/public/_nuxt/Cl45J6_Q.js +1 -0
  14. package/.output/public/_nuxt/CndPDbMI.js +2 -0
  15. package/.output/public/_nuxt/Ctbx58Um.js +23 -0
  16. package/.output/public/_nuxt/{8ksjcuDu.js → DMLmW6JM.js} +49 -56
  17. package/.output/public/_nuxt/Dl1PHLOB.js +1 -0
  18. package/.output/public/_nuxt/Nhex3_iH.js +1 -0
  19. package/.output/public/_nuxt/OpWX45i7.js +89 -0
  20. package/.output/public/_nuxt/builds/latest.json +1 -1
  21. package/.output/public/_nuxt/builds/meta/4994f3a4-4126-4f57-a9e5-c7ebb25850bc.json +1 -0
  22. package/.output/public/_nuxt/dTj21DMs.js +1 -0
  23. package/.output/public/_nuxt/entry.BohTWE-n.css +2 -0
  24. package/.output/public/_nuxt/kwSoIiM7.js +1 -0
  25. package/.output/public/_nuxt/mkEwYka4.js +1 -0
  26. package/.output/public/_nuxt/pdf.min.t82Z80JU.mjs +28 -0
  27. package/.output/public/_nuxt/pdf.worker.min.wgc6bjNh.mjs +28 -0
  28. package/.output/public/_nuxt/w7Rm7unj.js +1 -0
  29. package/.output/public/sw.js +1 -1
  30. package/.output/server/chunks/_/branding.mjs +1 -1
  31. package/.output/server/chunks/_/filePaths.mjs +25 -0
  32. package/.output/server/chunks/_/files.mjs +217 -0
  33. package/.output/server/chunks/_/machineOrder.mjs +1 -1
  34. package/.output/server/chunks/_/onboarding.mjs +1 -1
  35. package/.output/server/chunks/_/package.mjs +5 -2
  36. package/.output/server/chunks/_/pluginPolicy.mjs +93 -0
  37. package/.output/server/chunks/_/plugins.mjs +9 -96
  38. package/.output/server/chunks/_/projectBoard.mjs +124 -36
  39. package/.output/server/chunks/_/projectDocs.mjs +106 -0
  40. package/.output/server/chunks/_/projectInbox.mjs +135 -0
  41. package/.output/server/chunks/_/projectThreads.mjs +46 -0
  42. package/.output/server/chunks/_/projectThreads2.mjs +61 -0
  43. package/.output/server/chunks/_/projectsActions.mjs +1 -1
  44. package/.output/server/chunks/_/projectsPlugin.mjs +24 -50
  45. package/.output/server/chunks/_/projectsPlugin2.mjs +57 -0
  46. package/.output/server/chunks/_/restart.mjs +2 -312
  47. package/.output/server/chunks/_/reveal.mjs +2 -24
  48. package/.output/server/chunks/_/selfupdate.mjs +3 -2
  49. package/.output/server/chunks/_/settingstabs.mjs +36 -0
  50. package/.output/server/chunks/_/updates.mjs +51 -10
  51. package/.output/server/chunks/_/worktrees.mjs +1 -1
  52. package/.output/server/chunks/_/ws.mjs +1 -1
  53. package/.output/server/chunks/nitro/nitro.mjs +1718 -417
  54. package/.output/server/chunks/raw/bump-homebrew.mjs +1 -1
  55. package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
  56. package/.output/server/chunks/raw/release-ready.mjs +5 -0
  57. package/.output/server/chunks/routes/api/_..._.mjs +1 -1
  58. package/.output/server/chunks/routes/api/agents.post.mjs +1 -1
  59. package/.output/server/chunks/routes/api/ask-tab.post.mjs +1 -1
  60. package/.output/server/chunks/routes/api/attach.post.mjs +1 -1
  61. package/.output/server/chunks/routes/api/auth/disable.post.mjs +1 -1
  62. package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +1 -1
  63. package/.output/server/chunks/routes/api/auth/lock.post.mjs +1 -1
  64. package/.output/server/chunks/routes/api/auth/login/options.post.mjs +1 -1
  65. package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +1 -1
  66. package/.output/server/chunks/routes/api/auth/max-session.post.mjs +1 -1
  67. package/.output/server/chunks/routes/api/auth/register/options.post.mjs +1 -1
  68. package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +1 -1
  69. package/.output/server/chunks/routes/api/auth/status.get.mjs +1 -1
  70. package/.output/server/chunks/routes/api/board.get.mjs +148 -0
  71. package/.output/server/chunks/routes/api/changes.get.mjs +2 -2
  72. package/.output/server/chunks/routes/api/chat/image.get.mjs +2 -2
  73. package/.output/server/chunks/routes/api/chat.get.mjs +26 -6
  74. package/.output/server/chunks/routes/api/choose.post.mjs +40 -14
  75. package/.output/server/chunks/routes/api/claude-statusline.post.mjs +2 -2
  76. package/.output/server/chunks/routes/api/close/status.get.mjs +2 -2
  77. package/.output/server/chunks/routes/api/close.post.mjs +1 -1
  78. package/.output/server/chunks/routes/api/codex-update.post.mjs +2 -2
  79. package/.output/server/chunks/routes/api/commands.get.mjs +4 -3
  80. package/.output/server/chunks/routes/api/config.get.mjs +3 -2
  81. package/.output/server/chunks/routes/api/dirs.get.mjs +2 -2
  82. package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +43 -0
  83. package/.output/server/chunks/routes/api/dismiss.post.mjs +2 -2
  84. package/.output/server/chunks/routes/api/effort.post.mjs +2 -2
  85. package/.output/server/chunks/routes/api/efforts.get.mjs +2 -2
  86. package/.output/server/chunks/routes/api/file.post.mjs +2 -2
  87. package/.output/server/chunks/routes/api/files/download.get.mjs +60 -0
  88. package/.output/server/chunks/routes/api/files/read.get.mjs +45 -0
  89. package/.output/server/chunks/routes/api/files.get.mjs +44 -0
  90. package/.output/server/chunks/routes/api/gitroot.get.mjs +2 -2
  91. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  92. package/.output/server/chunks/routes/api/index.get.mjs +2 -1
  93. package/.output/server/chunks/routes/api/input.post.mjs +32 -5
  94. package/.output/server/chunks/routes/api/interrupt.post.mjs +2 -2
  95. package/.output/server/chunks/routes/api/isgit.get.mjs +2 -2
  96. package/.output/server/chunks/routes/api/machine/awake.get.mjs +2 -2
  97. package/.output/server/chunks/routes/api/machine/awake.post.mjs +2 -2
  98. package/.output/server/chunks/routes/api/machine/order.get.mjs +1 -1
  99. package/.output/server/chunks/routes/api/machine/order.post.mjs +1 -1
  100. package/.output/server/chunks/routes/api/machine/rename.post.mjs +2 -2
  101. package/.output/server/chunks/routes/api/menu.post.mjs +5 -2
  102. package/.output/server/chunks/routes/api/model.post.mjs +2 -2
  103. package/.output/server/chunks/routes/api/models.get.mjs +2 -2
  104. package/.output/server/chunks/routes/api/nav.post.mjs +36 -22
  105. package/.output/server/chunks/routes/api/onboarding.get.mjs +1 -1
  106. package/.output/server/chunks/routes/api/onboarding.post.mjs +1 -1
  107. package/.output/server/chunks/routes/api/phone.get.mjs +2 -2
  108. package/.output/server/chunks/routes/api/phone.post.mjs +2 -2
  109. package/.output/server/chunks/routes/api/plugins/actions.get.mjs +4 -1
  110. package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +4 -1
  111. package/.output/server/chunks/routes/api/plugins/profiles.get.mjs +4 -1
  112. package/.output/server/chunks/routes/api/plugins/projects.get.mjs +4 -3
  113. package/.output/server/chunks/routes/api/plugins/projects.post.mjs +4 -3
  114. package/.output/server/chunks/routes/api/plugins/thread-limits.get.mjs +2 -2
  115. package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +2 -2
  116. package/.output/server/chunks/routes/api/project/inbox.get.mjs +44 -0
  117. package/.output/server/chunks/routes/api/project/inbox.post.mjs +44 -0
  118. package/.output/server/chunks/routes/api/project/memory.get.mjs +43 -0
  119. package/.output/server/chunks/routes/api/project/report.get.mjs +3 -2
  120. package/.output/server/chunks/routes/api/project/routines.get.mjs +44 -0
  121. package/.output/server/chunks/routes/api/project/settings.get.mjs +42 -0
  122. package/.output/server/chunks/routes/api/project/thread.get.mjs +45 -0
  123. package/.output/server/chunks/routes/api/project/thread.post.mjs +47 -0
  124. package/.output/server/chunks/routes/api/prompt.post.mjs +21 -3
  125. package/.output/server/chunks/routes/api/push/quiet.post.mjs +2 -2
  126. package/.output/server/chunks/routes/api/push/subscribe.post.mjs +2 -2
  127. package/.output/server/chunks/routes/api/push/test.post.mjs +2 -2
  128. package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +2 -2
  129. package/.output/server/chunks/routes/api/quotas.get.mjs +2 -2
  130. package/.output/server/chunks/routes/api/rename.post.mjs +1 -1
  131. package/.output/server/chunks/routes/api/requeue.post.mjs +2 -2
  132. package/.output/server/chunks/routes/api/restart.get.mjs +1 -1
  133. package/.output/server/chunks/routes/api/restart.post.mjs +1 -1
  134. package/.output/server/chunks/routes/api/reveal.post.mjs +2 -1
  135. package/.output/server/chunks/routes/api/screen-key.post.mjs +14 -11
  136. package/.output/server/chunks/routes/api/screen.get.mjs +6 -37
  137. package/.output/server/chunks/routes/api/search.get.mjs +2 -2
  138. package/.output/server/chunks/routes/api/seen.post.mjs +2 -2
  139. package/.output/server/chunks/routes/api/sessions.get.mjs +2 -2
  140. package/.output/server/chunks/routes/api/sessions.post.mjs +2 -2
  141. package/.output/server/chunks/routes/api/settings-tab.post.mjs +89 -0
  142. package/.output/server/chunks/routes/api/space.post.mjs +14 -14
  143. package/.output/server/chunks/routes/api/state.get.mjs +2 -2
  144. package/.output/server/chunks/routes/api/unqueue.post.mjs +2 -2
  145. package/.output/server/chunks/routes/api/update/status.get.mjs +1 -1
  146. package/.output/server/chunks/routes/api/update.get.mjs +2 -2
  147. package/.output/server/chunks/routes/api/update.post.mjs +2 -2
  148. package/.output/server/chunks/routes/api/upload.post.mjs +2 -2
  149. package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +1 -1
  150. package/.output/server/chunks/routes/api/worktrees.get.mjs +1 -1
  151. package/.output/server/chunks/routes/favicon.ico.get.mjs +1 -1
  152. package/.output/server/chunks/routes/icons/_name_.get.mjs +2 -2
  153. package/.output/server/chunks/routes/renderer.mjs +3 -3
  154. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +2 -2
  155. package/.output/server/chunks/routes/ws/_..._.mjs +2 -2
  156. package/.output/server/chunks/routes/ws/events.mjs +2 -2
  157. package/.output/server/chunks/routes/ws/term.mjs +2 -2
  158. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  159. package/.output/server/index.mjs +2 -2
  160. package/.output/server/package.json +1 -1
  161. package/README.md +368 -40
  162. package/bin/install-docker-skill.sh +20 -0
  163. package/bin/lib/commands.mjs +5 -1
  164. package/bin/lib/core.mjs +1 -0
  165. package/bin/lib/install-skill.sh +100 -0
  166. package/bin/lib/skill.mjs +16 -0
  167. package/bin/lib/updater.mjs +65 -12
  168. package/bin/lib/verify-release.mjs +20 -0
  169. package/package.json +5 -2
  170. package/skills/wherdr/SKILL.md +186 -0
  171. package/.output/public/_nuxt/B7QP1TFs.js +0 -23
  172. package/.output/public/_nuxt/BDNMzG2s.js +0 -1
  173. package/.output/public/_nuxt/BOpBIziZ.js +0 -6
  174. package/.output/public/_nuxt/BWXdFfeg.js +0 -17
  175. package/.output/public/_nuxt/COFCNFpG.js +0 -83
  176. package/.output/public/_nuxt/CWwyK2XK.js +0 -2
  177. package/.output/public/_nuxt/CXG-cOdh.js +0 -1
  178. package/.output/public/_nuxt/CkZ8t6uB.js +0 -1
  179. package/.output/public/_nuxt/D4Yz4rat.js +0 -65
  180. package/.output/public/_nuxt/D7sxNXx1.js +0 -1
  181. package/.output/public/_nuxt/DViwOclv.js +0 -1
  182. package/.output/public/_nuxt/DoD7Qb5P.js +0 -30
  183. package/.output/public/_nuxt/DyBZDSCV.js +0 -2
  184. package/.output/public/_nuxt/SiL1FJ5s.js +0 -3
  185. package/.output/public/_nuxt/bLP7Jj-b.js +0 -1
  186. package/.output/public/_nuxt/builds/meta/7afbf062-5369-4002-b20d-7a582ff6e0f1.json +0 -1
  187. package/.output/public/_nuxt/entry.Crt1r4l3.css +0 -2
  188. package/.output/server/chunks/routes/ws/mirror.mjs +0 -161
@@ -0,0 +1 @@
1
+ import{A as e,Hn as t,M as n,Ot as r,U as i}from"./C25ROUa9.js";import{f as a}from"./CXJnLmWv.js";import{t as o}from"./DMLmW6JM.js";var s=i({__name:`[pane]`,setup(i){let s=a(),c=e(()=>String(s.params.pane||``));return(e,i)=>{let a=o;return r(),n(a,{key:t(c),"pane-id":t(c)},null,8,[`pane-id`])}}});export{s as default};
@@ -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/yzABg5xl.js"},{"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/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.Crt1r4l3.css"},{"revision":null,"url":"_nuxt/bLP7Jj-b.js"},{"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/SiL1FJ5s.js"},{"revision":null,"url":"_nuxt/DyBZDSCV.js"},{"revision":null,"url":"_nuxt/DoD7Qb5P.js"},{"revision":null,"url":"_nuxt/DViwOclv.js"},{"revision":null,"url":"_nuxt/D7sxNXx1.js"},{"revision":null,"url":"_nuxt/D4Yz4rat.js"},{"revision":null,"url":"_nuxt/CkZ8t6uB.js"},{"revision":null,"url":"_nuxt/Ci8N4mWR.js"},{"revision":null,"url":"_nuxt/Cd8j9O5w.js"},{"revision":null,"url":"_nuxt/CXG-cOdh.js"},{"revision":null,"url":"_nuxt/CWwyK2XK.js"},{"revision":null,"url":"_nuxt/COFCNFpG.js"},{"revision":null,"url":"_nuxt/Bd17z0YL.js"},{"revision":null,"url":"_nuxt/BWXdFfeg.js"},{"revision":null,"url":"_nuxt/BOpBIziZ.js"},{"revision":null,"url":"_nuxt/BDNMzG2s.js"},{"revision":null,"url":"_nuxt/B7QP1TFs.js"},{"revision":null,"url":"_nuxt/AgentView.C4YOwvZG.css"},{"revision":null,"url":"_nuxt/8ksjcuDu.js"},{"revision":"1292385bc85e7918dcd3f376296d99dc","url":"_nuxt/builds/latest.json"},{"revision":null,"url":"_nuxt/builds/meta/7afbf062-5369-4002-b20d-7a582ff6e0f1.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/w7Rm7unj.js"},{"revision":null,"url":"_nuxt/mkEwYka4.js"},{"revision":null,"url":"_nuxt/kwSoIiM7.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.BohTWE-n.css"},{"revision":null,"url":"_nuxt/dTj21DMs.js"},{"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/OpWX45i7.js"},{"revision":null,"url":"_nuxt/Nhex3_iH.js"},{"revision":null,"url":"_nuxt/Dl1PHLOB.js"},{"revision":null,"url":"_nuxt/DMLmW6JM.js"},{"revision":null,"url":"_nuxt/Ctbx58Um.js"},{"revision":null,"url":"_nuxt/CndPDbMI.js"},{"revision":null,"url":"_nuxt/Cl45J6_Q.js"},{"revision":null,"url":"_nuxt/CXJnLmWv.js"},{"revision":null,"url":"_nuxt/COCvtdHN.js"},{"revision":null,"url":"_nuxt/CJNhn9sA.js"},{"revision":null,"url":"_nuxt/CJKsMzIp.js"},{"revision":null,"url":"_nuxt/CDWjMk9C.js"},{"revision":null,"url":"_nuxt/C25ROUa9.js"},{"revision":null,"url":"_nuxt/Bpoxvzh6.js"},{"revision":null,"url":"_nuxt/Bd17z0YL.js"},{"revision":null,"url":"_nuxt/BUaYhQ2r.js"},{"revision":null,"url":"_nuxt/BOtcEDnA.js"},{"revision":null,"url":"_nuxt/BEJHMUrj.js"},{"revision":null,"url":"_nuxt/AgentView.DzFWBd2A.css"},{"revision":"d1c26c8c001b83b0e7cbd1084ff810f1","url":"_nuxt/builds/latest.json"},{"revision":null,"url":"_nuxt/builds/meta/4994f3a4-4126-4f57-a9e5-c7ebb25850bc.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);
@@ -1,4 +1,4 @@
1
- import { s as sendError, bp as useStorage, bq as setResponseHeader } from '../nitro/nitro.mjs';
1
+ import { s as sendError, bS as useStorage, aH as setResponseHeader } from '../nitro/nitro.mjs';
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
 
@@ -0,0 +1,25 @@
1
+ function posixResolve(base, p) {
2
+ const out = [];
3
+ for (const seg of (p.startsWith("/") ? p : `${base}/${p}`).split("/")) {
4
+ if (seg === "" || seg === ".") continue;
5
+ if (seg === "..") out.pop();
6
+ else out.push(seg);
7
+ }
8
+ return "/" + out.join("/");
9
+ }
10
+ const POSITION = /:\d+(?::\d+)?$/;
11
+ const stripPosition = (s) => s.replace(POSITION, "");
12
+ function resolveAgentPath(written, cwd, home) {
13
+ const p = stripPosition(String(written || "").trim());
14
+ if (!p || !home.startsWith("/") || /[\0\n\r]/.test(p)) return null;
15
+ const root = posixResolve("/", home);
16
+ const inside = (r2) => r2 === root || r2.startsWith(root === "/" ? "/" : root + "/");
17
+ const base = cwd && cwd.startsWith("/") && inside(posixResolve("/", cwd)) ? posixResolve("/", cwd) : root;
18
+ const r = posixResolve(base, p.replace(/^~(?=$|\/)/, root));
19
+ return inside(r) ? r : null;
20
+ }
21
+ const RUNNABLE = /\.(app|command|tool|terminal|pkg|mpkg|workflow|action|scpt|scptd|applescript|jar|sh|bash|zsh|csh|fish|py|rb|pl|webloc|inetloc|fileloc|prefpane|qlgenerator|saver|kext|osax|dmg)\/?$/i;
22
+ const runnablePath = (p) => RUNNABLE.test(p);
23
+
24
+ export { runnablePath as a, posixResolve as p, resolveAgentPath as r };
25
+ //# sourceMappingURL=filePaths.mjs.map
@@ -0,0 +1,217 @@
1
+ import { execFile } from 'node:child_process';
2
+ import path from 'node:path';
3
+ import { r as resolveAgentPath, p as posixResolve } from './filePaths.mjs';
4
+ import { g as gitToplevel } from './changes.mjs';
5
+ import { H as HerdrError } from '../nitro/nitro.mjs';
6
+
7
+ const MAX_ENTRIES = 2e3;
8
+ const TEXT_BYTES = 256 * 1024;
9
+ const IMAGE_BYTES = 2 * 1024 * 1024;
10
+ const DOWNLOAD_BYTES = 50 * 1024 * 1024;
11
+ const IMAGE_TYPES = {
12
+ png: "image/png",
13
+ jpg: "image/jpeg",
14
+ jpeg: "image/jpeg",
15
+ gif: "image/gif",
16
+ webp: "image/webp",
17
+ avif: "image/avif",
18
+ bmp: "image/bmp",
19
+ ico: "image/x-icon",
20
+ svg: "image/svg+xml"
21
+ };
22
+ const PDF_HEAD = 1024;
23
+ const isPdf = (name, head) => path.posix.extname(name).toLowerCase() === ".pdf" && head.subarray(0, PDF_HEAD).includes("%PDF-");
24
+ const RESOLVE = `root=$(cd "$1" 2>/dev/null && pwd -P) || { echo "folder not found" >&2; exit 3; }
25
+ under() { case "$1/" in "\${root%/}/"*) return 0 ;; esac; return 1; }`;
26
+ const LIST_SCRIPT = `${RESOLVE}
27
+ if [ -n "$4" ]; then
28
+ dir=$(cd "$4" 2>/dev/null && pwd -P) && under "$dir" || dir=$root
29
+ else
30
+ dir=$(cd "$root" && cd -- "./$2" 2>/dev/null && pwd -P) || { echo "not found" >&2; exit 4; }
31
+ under "$dir" || { echo "outside" >&2; exit 5; }
32
+ fi
33
+ cd "$dir" || exit 4
34
+ e=$(LC_ALL=C ls -A 2>&1 >/dev/null) || {
35
+ case "$e" in *"not permitted"*) [ "$(uname -s)" = Darwin ] && exit 8 ;; esac
36
+ echo "permission denied" >&2; exit 7
37
+ }
38
+ printf '%s\\0%s\\0' "$root" "$dir"
39
+ max=$3; n=0
40
+ set --
41
+ for pass in d o; do
42
+ for f in * .[!.]* ..?*; do
43
+ [ -e "$f" ] || [ -L "$f" ] || continue
44
+ if [ -d "$f" ]; then t=d; elif [ -f "$f" ]; then t=f; else t=o; fi
45
+ if [ "$pass" = d ]; then [ "$t" = d ] || continue; else [ "$t" != d ] || continue; fi
46
+ n=$((n + 1)); [ "$n" -gt "$max" ] && { printf '+\\0'; break 2; }
47
+ if [ -L "$f" ]; then l=l; else l=' '; [ "$t" = f ] && set -- "$@" "$f"; fi
48
+ printf '%s%s %s\\0' "$t" "$l" "$f"
49
+ done
50
+ done
51
+ printf '=\\0'
52
+ [ "$#" -gt 0 ] || exit 0
53
+ if stat -f %z / >/dev/null 2>&1; then stat -f %z -- "$@"; else stat -c %s -- "$@"; fi 2>/dev/null
54
+ exit 0`;
55
+ const READ_SCRIPT = `${RESOLVE}
56
+ case "$2" in */*) d=\${2%/*} ;; *) d=. ;; esac
57
+ b=\${2##*/}
58
+ dir=$(cd "$root" && cd -- "./$d" 2>/dev/null && pwd -P) || { echo "not found" >&2; exit 4; }
59
+ f="$dir/$b"; i=0
60
+ while [ -L "$f" ]; do
61
+ i=$((i + 1)); [ "$i" -gt 40 ] && { echo "not found" >&2; exit 4; }
62
+ t=$(readlink -- "$f") || exit 4
63
+ case "$t" in /*) f=$t ;; *) f="\${f%/*}/$t" ;; esac
64
+ p=\${f%/*}
65
+ dir=$(cd -P -- "\${p:-/}" 2>/dev/null && pwd -P) || { echo "not found" >&2; exit 4; }
66
+ f="\${dir%/}/\${f##*/}"
67
+ done
68
+ [ -e "$f" ] || { echo "not found" >&2; exit 4; }
69
+ under "$f" || { echo "outside" >&2; exit 5; }
70
+ [ -f "$f" ] || { echo "not a file" >&2; exit 6; }
71
+ [ -r "$f" ] || { echo "permission denied" >&2; exit 7; }
72
+ s=$(wc -c < "$f") || exit 4
73
+ echo $s
74
+ [ -n "$4" ] && [ $(($s)) -ge "$3" ] && exit 0
75
+ head -c "$3" < "$f"`;
76
+ 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.";
77
+ 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.";
78
+ function executor(m, { timeoutMs = 15e3, maxBytes = IMAGE_BYTES } = {}) {
79
+ const remote = m.exec;
80
+ if (remote) return (script, args) => remote(script, args, { timeoutMs });
81
+ return (script, args) => new Promise((resolve) => {
82
+ execFile("sh", ["-c", script, "sh", ...args], { timeout: timeoutMs, encoding: "buffer", maxBuffer: maxBytes + 64 * 1024 }, (err, out, stderr) => {
83
+ const e = err;
84
+ const code = !e ? 0 : e.killed ? 124 : typeof e.code === "number" ? e.code : 1;
85
+ resolve({ code, stdout: out, stderr: String(stderr || "") });
86
+ });
87
+ });
88
+ }
89
+ async function run(m, script, args, opts) {
90
+ const r = await executor(m, opts)(script, args);
91
+ if (r.code === 0) return r.stdout;
92
+ if (r.code === 3) throw new HerdrError("bad_cwd", "This agent\u2019s folder is unknown");
93
+ if (r.code === 4) throw new HerdrError("not_found", "File not found");
94
+ if (r.code === 5) throw new HerdrError("outside", "Outside the project folder");
95
+ if (r.code === 6) throw new HerdrError("not_file", "Not a file");
96
+ if (r.code === 7) throw new HerdrError("denied", "Permission denied");
97
+ if (r.code === 8) throw new HerdrError("denied", m.exec ? MACOS_SSH_DENIED : MACOS_LOCAL_DENIED);
98
+ if (r.code === 124) throw new HerdrError("timeout", "The folder took too long to read");
99
+ if (r.code === 255 || r.code === null) throw new HerdrError("unreachable", "Machine unreachable");
100
+ throw new HerdrError("remote", r.stderr.trim().split("\n").pop() || `code ${r.code}`);
101
+ }
102
+ function cleanRelative(p) {
103
+ const raw = String(p != null ? p : "").replace(/\\/g, "/");
104
+ if (raw.startsWith("/") || raw.includes("\0")) throw new HerdrError("outside", "Outside the project folder");
105
+ const n = path.posix.normalize(raw || ".").replace(/\/+$/, "");
106
+ if (n === ".." || n.startsWith("../")) throw new HerdrError("outside", "Outside the project folder");
107
+ return n === "." ? "" : n;
108
+ }
109
+ function parseListing(raw) {
110
+ const parts = raw.toString("utf8").split("\0");
111
+ const root = parts[0] || "";
112
+ const dir = parts[1] || "";
113
+ const entries = [];
114
+ const plain = [];
115
+ let truncated = false;
116
+ let i = 2;
117
+ for (; i < parts.length; i++) {
118
+ const p = parts[i];
119
+ if (p === "=") break;
120
+ if (p === "+") {
121
+ truncated = true;
122
+ continue;
123
+ }
124
+ const m = /^([dfo])([l ]) (.+)$/s.exec(p);
125
+ if (!m) continue;
126
+ const e = { name: m[3], kind: m[1] === "d" ? "dir" : m[1] === "f" ? "file" : "other", size: null, link: m[2] === "l" };
127
+ entries.push(e);
128
+ if (e.kind === "file" && !e.link) plain.push(e);
129
+ }
130
+ const sizes = parts.slice(i + 1).join("").split("\n").filter((l) => /^\d+$/.test(l)).map(Number);
131
+ if (sizes.length === plain.length) plain.forEach((e, k) => {
132
+ e.size = sizes[k];
133
+ });
134
+ entries.sort((a, b) => Number(b.kind === "dir") - Number(a.kind === "dir") || a.name.localeCompare(b.name, void 0, { numeric: true, sensitivity: "base" }));
135
+ return { root, dir, entries, truncated };
136
+ }
137
+ async function rootOf(m, cwd) {
138
+ return await gitToplevel(m, cwd) || cwd;
139
+ }
140
+ async function listFiles(m, cwd, rel, opts = {}) {
141
+ var _a, _b;
142
+ const root = await rootOf(m, cwd);
143
+ const args = rel === null ? [root, "", String((_a = opts.max) != null ? _a : MAX_ENTRIES), cwd] : [root, cleanRelative(rel), String((_b = opts.max) != null ? _b : MAX_ENTRIES)];
144
+ const out = parseListing(await run(m, LIST_SCRIPT, args));
145
+ const rp = path.posix.relative(out.root, out.dir);
146
+ return { root: out.root, path: rp.startsWith("..") ? "" : rp, entries: out.entries, truncated: out.truncated };
147
+ }
148
+ const isText = (b) => !b.subarray(0, 8192).includes(0);
149
+ function cutAt(b, max) {
150
+ const nl = b.lastIndexOf(10, max - 1);
151
+ if (nl >= 0) return nl + 1;
152
+ let i = max;
153
+ while (i > 0 && (b[i] & 192) === 128) i--;
154
+ return i;
155
+ }
156
+ function writtenTarget(m, cwd, written) {
157
+ const w = String(written != null ? written : "");
158
+ const abs = w.length > 1024 ? null : resolveAgentPath(w, cwd, m.home);
159
+ if (!abs) throw new HerdrError("outside_home", "Only files in your home folder can be shown");
160
+ const root = posixResolve("/", m.home);
161
+ const rel = path.posix.relative(root, abs);
162
+ if (!rel) throw new HerdrError("not_file", "Not a file");
163
+ return { root, rel, abs };
164
+ }
165
+ async function readHead(m, root, rel, max, opts) {
166
+ const out = await run(m, READ_SCRIPT, [root, rel, String(max), ...(opts == null ? void 0 : opts.whole) ? ["1"] : []], opts);
167
+ const nl = out.indexOf(10);
168
+ return { size: Number(out.subarray(0, nl).toString("utf8")) || 0, body: out.subarray(nl + 1) };
169
+ }
170
+ async function previewAt(m, root, rel, shown) {
171
+ const ext = path.posix.extname(rel).slice(1).toLowerCase();
172
+ const mime = IMAGE_TYPES[ext];
173
+ const { size, body } = await readHead(m, root, rel, mime ? IMAGE_BYTES + 1 : ext === "pdf" ? PDF_HEAD : TEXT_BYTES + 1);
174
+ if (ext === "pdf") {
175
+ if (!isPdf(rel, body)) return { path: shown, size, kind: "binary", truncated: false };
176
+ return { path: shown, size, kind: size > DOWNLOAD_BYTES ? "large" : "pdf", truncated: false };
177
+ }
178
+ if (mime) {
179
+ if (size > IMAGE_BYTES) return { path: shown, size, kind: "large", truncated: true };
180
+ return { path: shown, size, kind: "image", dataUrl: `data:${mime};base64,${body.toString("base64")}`, truncated: false };
181
+ }
182
+ if (!isText(body)) return { path: shown, size, kind: "binary", truncated: false };
183
+ const truncated = body.length > TEXT_BYTES;
184
+ const text = (truncated ? body.subarray(0, cutAt(body, TEXT_BYTES)) : body).toString("utf8");
185
+ return { path: shown, size, kind: "text", text, truncated };
186
+ }
187
+ async function readFilePreview(m, cwd, rel) {
188
+ const p = cleanRelative(rel);
189
+ if (!p) throw new HerdrError("not_file", "Not a file");
190
+ return previewAt(m, await rootOf(m, cwd), p, p);
191
+ }
192
+ async function readWrittenPreview(m, cwd, written) {
193
+ const t = writtenTarget(m, cwd, written);
194
+ return previewAt(m, t.root, t.rel, t.abs);
195
+ }
196
+ async function bytesAt(m, root, rel) {
197
+ const { size, body } = await readHead(m, root, rel, DOWNLOAD_BYTES + 1, { timeoutMs: 12e4, maxBytes: DOWNLOAD_BYTES + 1, whole: true });
198
+ if (size > DOWNLOAD_BYTES || body.length > DOWNLOAD_BYTES) throw new HerdrError("too_large", "File too large to download (50 MB max)");
199
+ return { name: path.posix.basename(rel), body };
200
+ }
201
+ async function readFileBytes(m, cwd, rel) {
202
+ const p = cleanRelative(rel);
203
+ if (!p) throw new HerdrError("not_file", "Not a file");
204
+ return bytesAt(m, await rootOf(m, cwd), p);
205
+ }
206
+ async function readWrittenBytes(m, cwd, written) {
207
+ const t = writtenTarget(m, cwd, written);
208
+ return bytesAt(m, t.root, t.rel);
209
+ }
210
+ function attachmentHeader(name, type = "attachment") {
211
+ const ascii = name.replace(/[^\x20-\x7e]|["\\]/g, "_") || "download";
212
+ const utf8 = encodeURIComponent(name).replace(/['()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
213
+ return `${type}; filename="${ascii}"; filename*=UTF-8''${utf8}`;
214
+ }
215
+
216
+ export { readFileBytes as a, attachmentHeader as b, readWrittenPreview as c, readFilePreview as d, isPdf as i, listFiles as l, readWrittenBytes as r };
217
+ //# sourceMappingURL=files.mjs.map
@@ -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 { al as baseMachines, am as DATA_DIR } from '../nitro/nitro.mjs';
4
+ import { aQ as baseMachines, aR 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 { aw as HOST_LABEL, am as DATA_DIR } from '../nitro/nitro.mjs';
3
+ import { b1 as HOST_LABEL, aR 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 = "1.3.2";
2
+ var version = "1.3.4";
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";
@@ -24,7 +24,8 @@ var bin = {
24
24
  var files = [
25
25
  ".output",
26
26
  "!.output/**/*.map",
27
- "bin"
27
+ "bin",
28
+ "skills/wherdr"
28
29
  ];
29
30
  var engines = {
30
31
  node: ">=22"
@@ -58,6 +59,7 @@ var devDependencies = {
58
59
  "@types/node": "^22.0.0",
59
60
  "@types/web-push": "^3.6.4",
60
61
  "@vite-pwa/nuxt": "^1.1.1",
62
+ "@vue/reactivity": "^3.5.43",
61
63
  "@vue/test-utils": "^2.5.1",
62
64
  "@xterm/addon-fit": "^0.10.0",
63
65
  "@xterm/addon-webgl": "^0.18.0",
@@ -66,6 +68,7 @@ var devDependencies = {
66
68
  "happy-dom": "^20.14.5",
67
69
  marked: "^15.0.12",
68
70
  nuxt: "^4.5.2",
71
+ "pdfjs-dist": "5.4.624",
69
72
  tailwindcss: "^4.3.3",
70
73
  typescript: "~5.9.3",
71
74
  vitest: "^4.1.11",
@@ -0,0 +1,93 @@
1
+ const PLUGIN_ID_RE = /^[A-Za-z0-9.:_-]{1,100}$/;
2
+ const ACTION_ID_RE = /^[A-Za-z0-9:_-]{1,100}$/;
3
+ const REMOTE_PROJECTS_SCRIPT = 'export HERDR_BIN_PATH="$1"; shift; bin="$1"; shift; exec "$bin" "$@"';
4
+ function actionContext(pane, workspaces = []) {
5
+ const context = { invocation_source: "wherdr" };
6
+ if (!pane) return context;
7
+ const local = (id) => id.includes("~") ? id.slice(id.indexOf("~") + 1) : id;
8
+ const workspace = workspaces.find((w) => w.id === pane.workspace);
9
+ return {
10
+ ...context,
11
+ focused_pane_id: local(pane.id),
12
+ tab_id: local(pane.tab),
13
+ workspace_id: local(pane.workspace),
14
+ workspace_label: (workspace == null ? void 0 : workspace.label) || "",
15
+ workspace_cwd: pane.cwd || "",
16
+ focused_pane_cwd: pane.cwd || ""
17
+ };
18
+ }
19
+ const AGENT_CONTEXTS = ["workspace", "tab", "pane"];
20
+ const READ_ONLY = /\b(list|lists|show|status|view|info|doctor|check|help|preview|inspect|lister|liste|voir|afficher|état|etat|vérifier|verifier|aide)\b/i;
21
+ function needsConfirm(a) {
22
+ return !(READ_ONLY.test(a.id.replace(/[_:]/g, "-")) || READ_ONLY.test(a.title));
23
+ }
24
+ function shortLabel(title, pluginName) {
25
+ const esc = pluginName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
26
+ const rest = title.replace(new RegExp(`^${esc}\\s*[:\xB7\u2014\u2013-]\\s*`, "i"), "").trim();
27
+ return rest ? rest[0].toUpperCase() + rest.slice(1) : title;
28
+ }
29
+ const isOwnPlugin = (id) => id === "wherdr" || id.endsWith(".wherdr");
30
+ function opensInHerdr(a) {
31
+ if (a.placement === "popup" || a.placement === "overlay") return true;
32
+ const cmd = Array.isArray(a.command) ? a.command.map(String).join(" ") : "";
33
+ if (/\bplugin\s+pane\s+open\b/.test(cmd)) return true;
34
+ return /(^|[-_:])popup($|[-_:])/i.test(String(a.action_id || ""));
35
+ }
36
+ function normalizeActions(actions, plugins = []) {
37
+ const byId = new Map(plugins.filter((p) => p && p.plugin_id).map((p) => [p.plugin_id, p]));
38
+ const out = [];
39
+ for (const a of actions || []) {
40
+ const plugin = String((a == null ? void 0 : a.plugin_id) || "");
41
+ const id = String((a == null ? void 0 : a.action_id) || "");
42
+ if (!PLUGIN_ID_RE.test(plugin) || !ACTION_ID_RE.test(id) || isOwnPlugin(plugin)) continue;
43
+ const p = byId.get(plugin);
44
+ if (p && p.enabled === false) continue;
45
+ const ctx = (Array.isArray(a.contexts) ? a.contexts : []).map(String);
46
+ const agent = ctx.some((c) => AGENT_CONTEXTS.includes(c));
47
+ const machine = !ctx.length || ctx.includes("global");
48
+ if (!agent && !machine) continue;
49
+ const title = String(a.title || id).replace(/\s+/g, " ").trim().slice(0, 120) || id;
50
+ const description = a.description ? String(a.description).replace(/\s+/g, " ").trim().slice(0, 240) || null : null;
51
+ const pluginName = String((p == null ? void 0 : p.name) || plugin).trim() || plugin;
52
+ out.push({
53
+ plugin,
54
+ pluginName,
55
+ id,
56
+ title,
57
+ label: shortLabel(title, pluginName),
58
+ description,
59
+ agent,
60
+ machine,
61
+ confirm: needsConfirm({ id, title }),
62
+ inHerdr: opensInHerdr(a)
63
+ });
64
+ }
65
+ return out.sort((x, y) => x.pluginName.localeCompare(y.pluginName) || x.label.localeCompare(y.label));
66
+ }
67
+ const ANSI = /\x1B(?:\[[0-?]*[ -/]*[@-~]|\][^\x07\x1B]*(?:\x07|\x1B\\)|[@-Z\\-_])/g;
68
+ function stripAnsi(text) {
69
+ return String(text || "").replace(ANSI, "").replace(/[\x00-\x08\x0B-\x1F\x7F]/g, "");
70
+ }
71
+ function outputTail(text, max = 300) {
72
+ const lines = stripAnsi(text).split("\n").map((l) => l.trim()).filter(Boolean);
73
+ let out = "";
74
+ for (let i = lines.length - 1; i >= 0; i--) {
75
+ const next = out ? `${lines[i]}
76
+ ${out}` : lines[i];
77
+ if (next.length > max) {
78
+ if (!out) out = "\u2026" + lines[i].slice(-(max - 1));
79
+ break;
80
+ }
81
+ out = next;
82
+ }
83
+ return out;
84
+ }
85
+ function logResult(log2) {
86
+ const status = (log2 == null ? void 0 : log2.status) === "succeeded" || (log2 == null ? void 0 : log2.status) === "failed" ? log2.status : "running";
87
+ const exitCode = typeof (log2 == null ? void 0 : log2.exit_code) === "number" ? log2.exit_code : null;
88
+ const output = status === "failed" ? outputTail(log2 == null ? void 0 : log2.stderr) || outputTail(log2 == null ? void 0 : log2.error) || outputTail(log2 == null ? void 0 : log2.stdout) : outputTail(log2 == null ? void 0 : log2.stdout) || outputTail(log2 == null ? void 0 : log2.stderr);
89
+ return { status, exitCode, output };
90
+ }
91
+
92
+ export { ACTION_ID_RE as A, PLUGIN_ID_RE as P, REMOTE_PROJECTS_SCRIPT as R, actionContext as a, logResult as l, normalizeActions as n, outputTail as o, stripAnsi as s };
93
+ //# sourceMappingURL=pluginPolicy.mjs.map
@@ -1,98 +1,9 @@
1
- import { m as machineFor, aA as herdrOn, H as HerdrError, f as findPane, a5 as splitId, Q as log, ad as underHome, aj as isGitRepo, o as fmt, aB as getState, F as sleep, aC as HERDR_CHILD_ENV, V as HOME, a1 as IN_DOCKER, aD as HERDR_BIN } from '../nitro/nitro.mjs';
1
+ import { v as machineFor, x as herdrOn, H as HerdrError, f as findPane, ay as splitId, ag as log, aI as underHome, aO as isGitRepo, G as fmt, m as getState, a4 as sleep, au as IN_DOCKER, y as HERDR_CHILD_ENV, am as HOME, z as HERDR_BIN } from '../nitro/nitro.mjs';
2
2
  import { execFile } from 'node:child_process';
3
3
  import { b as binaryOn } from './projectBoard.mjs';
4
- import { c as cleanProjectInput, r as repoArgument, a as projectCommandArgs, b as parseProfileList, s as setupHeader, t as tickerRunning, P as PROJECT_INPUTS, d as readOnlyMessage } from './projectsActions.mjs';
5
-
6
- const PLUGIN_ID_RE = /^[A-Za-z0-9.:_-]{1,100}$/;
7
- const ACTION_ID_RE = /^[A-Za-z0-9:_-]{1,100}$/;
8
- const REMOTE_PROJECTS_SCRIPT = 'export HERDR_BIN_PATH="$1"; shift; bin="$1"; shift; exec "$bin" "$@"';
9
- function actionContext(pane, workspaces = []) {
10
- const context = { invocation_source: "wherdr" };
11
- if (!pane) return context;
12
- const local = (id) => id.includes("~") ? id.slice(id.indexOf("~") + 1) : id;
13
- const workspace = workspaces.find((w) => w.id === pane.workspace);
14
- return {
15
- ...context,
16
- focused_pane_id: local(pane.id),
17
- tab_id: local(pane.tab),
18
- workspace_id: local(pane.workspace),
19
- workspace_label: (workspace == null ? void 0 : workspace.label) || "",
20
- workspace_cwd: pane.cwd || "",
21
- focused_pane_cwd: pane.cwd || ""
22
- };
23
- }
24
- const AGENT_CONTEXTS = ["workspace", "tab", "pane"];
25
- const READ_ONLY = /\b(list|lists|show|status|view|info|doctor|check|help|preview|inspect|lister|liste|voir|afficher|état|etat|vérifier|verifier|aide)\b/i;
26
- function needsConfirm(a) {
27
- return !(READ_ONLY.test(a.id.replace(/[_:]/g, "-")) || READ_ONLY.test(a.title));
28
- }
29
- function shortLabel(title, pluginName) {
30
- const esc = pluginName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
31
- const rest = title.replace(new RegExp(`^${esc}\\s*[:\xB7\u2014\u2013-]\\s*`, "i"), "").trim();
32
- return rest ? rest[0].toUpperCase() + rest.slice(1) : title;
33
- }
34
- const isOwnPlugin = (id) => id === "wherdr" || id.endsWith(".wherdr");
35
- function opensInHerdr(a) {
36
- if (a.placement === "popup" || a.placement === "overlay") return true;
37
- const cmd = Array.isArray(a.command) ? a.command.map(String).join(" ") : "";
38
- if (/\bplugin\s+pane\s+open\b/.test(cmd)) return true;
39
- return /(^|[-_:])popup($|[-_:])/i.test(String(a.action_id || ""));
40
- }
41
- function normalizeActions(actions, plugins = []) {
42
- const byId = new Map(plugins.filter((p) => p && p.plugin_id).map((p) => [p.plugin_id, p]));
43
- const out = [];
44
- for (const a of actions || []) {
45
- const plugin = String((a == null ? void 0 : a.plugin_id) || "");
46
- const id = String((a == null ? void 0 : a.action_id) || "");
47
- if (!PLUGIN_ID_RE.test(plugin) || !ACTION_ID_RE.test(id) || isOwnPlugin(plugin)) continue;
48
- const p = byId.get(plugin);
49
- if (p && p.enabled === false) continue;
50
- const ctx = (Array.isArray(a.contexts) ? a.contexts : []).map(String);
51
- const agent = ctx.some((c) => AGENT_CONTEXTS.includes(c));
52
- const machine = !ctx.length || ctx.includes("global");
53
- if (!agent && !machine) continue;
54
- const title = String(a.title || id).replace(/\s+/g, " ").trim().slice(0, 120) || id;
55
- const description = a.description ? String(a.description).replace(/\s+/g, " ").trim().slice(0, 240) || null : null;
56
- const pluginName = String((p == null ? void 0 : p.name) || plugin).trim() || plugin;
57
- out.push({
58
- plugin,
59
- pluginName,
60
- id,
61
- title,
62
- label: shortLabel(title, pluginName),
63
- description,
64
- agent,
65
- machine,
66
- confirm: needsConfirm({ id, title }),
67
- inHerdr: opensInHerdr(a)
68
- });
69
- }
70
- return out.sort((x, y) => x.pluginName.localeCompare(y.pluginName) || x.label.localeCompare(y.label));
71
- }
72
- const ANSI = /\x1B(?:\[[0-?]*[ -/]*[@-~]|\][^\x07\x1B]*(?:\x07|\x1B\\)|[@-Z\\-_])/g;
73
- function stripAnsi(text) {
74
- return String(text || "").replace(ANSI, "").replace(/[\x00-\x08\x0B-\x1F\x7F]/g, "");
75
- }
76
- function outputTail(text, max = 300) {
77
- const lines = stripAnsi(text).split("\n").map((l) => l.trim()).filter(Boolean);
78
- let out = "";
79
- for (let i = lines.length - 1; i >= 0; i--) {
80
- const next = out ? `${lines[i]}
81
- ${out}` : lines[i];
82
- if (next.length > max) {
83
- if (!out) out = "\u2026" + lines[i].slice(-(max - 1));
84
- break;
85
- }
86
- out = next;
87
- }
88
- return out;
89
- }
90
- function logResult(log2) {
91
- const status = (log2 == null ? void 0 : log2.status) === "succeeded" || (log2 == null ? void 0 : log2.status) === "failed" ? log2.status : "running";
92
- const exitCode = typeof (log2 == null ? void 0 : log2.exit_code) === "number" ? log2.exit_code : null;
93
- const output = status === "failed" ? outputTail(log2 == null ? void 0 : log2.stderr) || outputTail(log2 == null ? void 0 : log2.error) || outputTail(log2 == null ? void 0 : log2.stdout) : outputTail(log2 == null ? void 0 : log2.stdout) || outputTail(log2 == null ? void 0 : log2.stderr);
94
- return { status, exitCode, output };
95
- }
4
+ import { p as projectsPluginState } from './projectsPlugin2.mjs';
5
+ import { n as normalizeActions, P as PLUGIN_ID_RE, A as ACTION_ID_RE, a as actionContext, l as logResult, s as stripAnsi, o as outputTail, R as REMOTE_PROJECTS_SCRIPT } from './pluginPolicy.mjs';
6
+ import { c as cleanProjectInput, r as repoArgument, a as projectCommandArgs, b as parseProfileList, t as tickerRunning, s as setupHeader, P as PROJECT_INPUTS, d as readOnlyMessage } from './projectsActions.mjs';
96
7
 
97
8
  const CACHE_MS = 1e4;
98
9
  const cache = /* @__PURE__ */ new Map();
@@ -130,9 +41,11 @@ async function runProjects(m, bin, args, timeoutMs = 6e4) {
130
41
  })));
131
42
  }
132
43
  async function projectsBin(m) {
44
+ var _a;
133
45
  const bin = await binaryOn(m);
134
- if (!bin) throw new HerdrError("plugin_unavailable", "Projects binary not found");
135
- return bin;
46
+ if (bin) return bin;
47
+ if ((_a = await projectsPluginState(m).catch(() => null)) == null ? void 0 : _a.unsupported) throw new HerdrError("plugin_unsupported", "herdr-projects 1.x is not supported by wherdr yet: install the 0.2 line (Settings \u203A Plugins \u203A herdr-projects)");
48
+ throw new HerdrError("plugin_unavailable", "Projects binary not found");
136
49
  }
137
50
  async function projectsCommand(m, args, lang = "en") {
138
51
  const r = await runProjects(m, await projectsBin(m), args);
@@ -252,5 +165,5 @@ ${e.message}`) };
252
165
  return res;
253
166
  }
254
167
 
255
- export { invokePluginAction as i, listPluginActions as l, projectProfiles as p };
168
+ export { invokePluginAction as i, listPluginActions as l, projectProfiles as p, withoutContainerTicker as w };
256
169
  //# sourceMappingURL=plugins.mjs.map