wherdr 1.3.2 → 1.3.3

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 (174) 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/B4Yk2tB1.js +23 -0
  4. package/.output/public/_nuxt/BBw_0a4M.js +6 -0
  5. package/.output/public/_nuxt/{D7sxNXx1.js → BSy6OCIY.js} +1 -1
  6. package/.output/public/_nuxt/BX5PM2JQ.js +1 -0
  7. package/.output/public/_nuxt/BgPDnf2S.js +1 -0
  8. package/.output/public/_nuxt/BkOxQzbS.js +2 -0
  9. package/.output/public/_nuxt/{8ksjcuDu.js → CKhgznq4.js} +45 -56
  10. package/.output/public/_nuxt/{Cd8j9O5w.js → CP8o925U.js} +1 -1
  11. package/.output/public/_nuxt/CkbmecwS.js +1 -0
  12. package/.output/public/_nuxt/Cr3SrGky.js +1 -0
  13. package/.output/public/_nuxt/DAg9fiVh.js +89 -0
  14. package/.output/public/_nuxt/DT8qZ0Wv.js +1 -0
  15. package/.output/public/_nuxt/DaaJIRB3.js +1 -0
  16. package/.output/public/_nuxt/{DViwOclv.js → DcJi16XA.js} +1 -1
  17. package/.output/public/_nuxt/VpjCgSXu.js +36 -0
  18. package/.output/public/_nuxt/builds/latest.json +1 -1
  19. package/.output/public/_nuxt/builds/meta/c735b6c0-1bd0-47d7-a208-d310f0a06287.json +1 -0
  20. package/.output/public/_nuxt/dPxB2L94.js +89 -0
  21. package/.output/public/_nuxt/{entry.Crt1r4l3.css → entry.CGWKmYU3.css} +1 -1
  22. package/.output/public/_nuxt/xYX85SPI.js +1 -0
  23. package/.output/public/sw.js +1 -1
  24. package/.output/server/chunks/_/branding.mjs +1 -1
  25. package/.output/server/chunks/_/filePaths.mjs +25 -0
  26. package/.output/server/chunks/_/files.mjs +204 -0
  27. package/.output/server/chunks/_/machineOrder.mjs +1 -1
  28. package/.output/server/chunks/_/onboarding.mjs +1 -1
  29. package/.output/server/chunks/_/package.mjs +3 -2
  30. package/.output/server/chunks/_/pluginPolicy.mjs +93 -0
  31. package/.output/server/chunks/_/plugins.mjs +4 -94
  32. package/.output/server/chunks/_/projectBoard.mjs +120 -29
  33. package/.output/server/chunks/_/projectDocs.mjs +106 -0
  34. package/.output/server/chunks/_/projectInbox.mjs +135 -0
  35. package/.output/server/chunks/_/projectThreads.mjs +46 -0
  36. package/.output/server/chunks/_/projectThreads2.mjs +61 -0
  37. package/.output/server/chunks/_/projectsActions.mjs +1 -1
  38. package/.output/server/chunks/_/projectsPlugin.mjs +1 -1
  39. package/.output/server/chunks/_/restart.mjs +2 -312
  40. package/.output/server/chunks/_/reveal.mjs +2 -24
  41. package/.output/server/chunks/_/selfupdate.mjs +3 -2
  42. package/.output/server/chunks/_/updates.mjs +51 -10
  43. package/.output/server/chunks/_/worktrees.mjs +1 -1
  44. package/.output/server/chunks/_/ws.mjs +1 -1
  45. package/.output/server/chunks/nitro/nitro.mjs +1096 -268
  46. package/.output/server/chunks/raw/bump-homebrew.mjs +1 -1
  47. package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
  48. package/.output/server/chunks/raw/release-ready.mjs +5 -0
  49. package/.output/server/chunks/routes/api/_..._.mjs +1 -1
  50. package/.output/server/chunks/routes/api/agents.post.mjs +1 -1
  51. package/.output/server/chunks/routes/api/ask-tab.post.mjs +1 -1
  52. package/.output/server/chunks/routes/api/attach.post.mjs +1 -1
  53. package/.output/server/chunks/routes/api/auth/disable.post.mjs +1 -1
  54. package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +1 -1
  55. package/.output/server/chunks/routes/api/auth/lock.post.mjs +1 -1
  56. package/.output/server/chunks/routes/api/auth/login/options.post.mjs +1 -1
  57. package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +1 -1
  58. package/.output/server/chunks/routes/api/auth/max-session.post.mjs +1 -1
  59. package/.output/server/chunks/routes/api/auth/register/options.post.mjs +1 -1
  60. package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +1 -1
  61. package/.output/server/chunks/routes/api/auth/status.get.mjs +1 -1
  62. package/.output/server/chunks/routes/api/board.get.mjs +147 -0
  63. package/.output/server/chunks/routes/api/changes.get.mjs +2 -2
  64. package/.output/server/chunks/routes/api/chat/image.get.mjs +2 -2
  65. package/.output/server/chunks/routes/api/chat.get.mjs +2 -2
  66. package/.output/server/chunks/routes/api/choose.post.mjs +29 -3
  67. package/.output/server/chunks/routes/api/claude-statusline.post.mjs +2 -2
  68. package/.output/server/chunks/routes/api/close/status.get.mjs +2 -2
  69. package/.output/server/chunks/routes/api/close.post.mjs +1 -1
  70. package/.output/server/chunks/routes/api/codex-update.post.mjs +2 -2
  71. package/.output/server/chunks/routes/api/commands.get.mjs +2 -2
  72. package/.output/server/chunks/routes/api/config.get.mjs +3 -2
  73. package/.output/server/chunks/routes/api/dirs.get.mjs +2 -2
  74. package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +43 -0
  75. package/.output/server/chunks/routes/api/dismiss.post.mjs +2 -2
  76. package/.output/server/chunks/routes/api/effort.post.mjs +2 -2
  77. package/.output/server/chunks/routes/api/efforts.get.mjs +2 -2
  78. package/.output/server/chunks/routes/api/file.post.mjs +2 -2
  79. package/.output/server/chunks/routes/api/files/download.get.mjs +53 -0
  80. package/.output/server/chunks/routes/api/files/read.get.mjs +45 -0
  81. package/.output/server/chunks/routes/api/files.get.mjs +44 -0
  82. package/.output/server/chunks/routes/api/gitroot.get.mjs +2 -2
  83. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  84. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  85. package/.output/server/chunks/routes/api/input.post.mjs +13 -3
  86. package/.output/server/chunks/routes/api/interrupt.post.mjs +2 -2
  87. package/.output/server/chunks/routes/api/isgit.get.mjs +2 -2
  88. package/.output/server/chunks/routes/api/machine/awake.get.mjs +2 -2
  89. package/.output/server/chunks/routes/api/machine/awake.post.mjs +2 -2
  90. package/.output/server/chunks/routes/api/machine/order.get.mjs +1 -1
  91. package/.output/server/chunks/routes/api/machine/order.post.mjs +1 -1
  92. package/.output/server/chunks/routes/api/machine/rename.post.mjs +2 -2
  93. package/.output/server/chunks/routes/api/menu.post.mjs +2 -2
  94. package/.output/server/chunks/routes/api/model.post.mjs +2 -2
  95. package/.output/server/chunks/routes/api/models.get.mjs +2 -2
  96. package/.output/server/chunks/routes/api/nav.post.mjs +5 -4
  97. package/.output/server/chunks/routes/api/onboarding.get.mjs +1 -1
  98. package/.output/server/chunks/routes/api/onboarding.post.mjs +1 -1
  99. package/.output/server/chunks/routes/api/phone.get.mjs +2 -2
  100. package/.output/server/chunks/routes/api/phone.post.mjs +2 -2
  101. package/.output/server/chunks/routes/api/plugins/actions.get.mjs +2 -1
  102. package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +2 -1
  103. package/.output/server/chunks/routes/api/plugins/profiles.get.mjs +2 -1
  104. package/.output/server/chunks/routes/api/plugins/projects.get.mjs +2 -2
  105. package/.output/server/chunks/routes/api/plugins/projects.post.mjs +2 -2
  106. package/.output/server/chunks/routes/api/plugins/thread-limits.get.mjs +2 -2
  107. package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +2 -2
  108. package/.output/server/chunks/routes/api/project/inbox.get.mjs +43 -0
  109. package/.output/server/chunks/routes/api/project/inbox.post.mjs +43 -0
  110. package/.output/server/chunks/routes/api/project/memory.get.mjs +42 -0
  111. package/.output/server/chunks/routes/api/project/report.get.mjs +2 -2
  112. package/.output/server/chunks/routes/api/project/routines.get.mjs +43 -0
  113. package/.output/server/chunks/routes/api/project/settings.get.mjs +41 -0
  114. package/.output/server/chunks/routes/api/project/thread.get.mjs +44 -0
  115. package/.output/server/chunks/routes/api/project/thread.post.mjs +45 -0
  116. package/.output/server/chunks/routes/api/prompt.post.mjs +21 -3
  117. package/.output/server/chunks/routes/api/push/quiet.post.mjs +2 -2
  118. package/.output/server/chunks/routes/api/push/subscribe.post.mjs +2 -2
  119. package/.output/server/chunks/routes/api/push/test.post.mjs +2 -2
  120. package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +2 -2
  121. package/.output/server/chunks/routes/api/quotas.get.mjs +2 -2
  122. package/.output/server/chunks/routes/api/rename.post.mjs +1 -1
  123. package/.output/server/chunks/routes/api/requeue.post.mjs +2 -2
  124. package/.output/server/chunks/routes/api/restart.get.mjs +1 -1
  125. package/.output/server/chunks/routes/api/restart.post.mjs +1 -1
  126. package/.output/server/chunks/routes/api/reveal.post.mjs +2 -1
  127. package/.output/server/chunks/routes/api/screen-key.post.mjs +2 -2
  128. package/.output/server/chunks/routes/api/screen.get.mjs +5 -3
  129. package/.output/server/chunks/routes/api/search.get.mjs +2 -2
  130. package/.output/server/chunks/routes/api/seen.post.mjs +2 -2
  131. package/.output/server/chunks/routes/api/sessions.get.mjs +2 -2
  132. package/.output/server/chunks/routes/api/sessions.post.mjs +2 -2
  133. package/.output/server/chunks/routes/api/space.post.mjs +14 -14
  134. package/.output/server/chunks/routes/api/state.get.mjs +2 -2
  135. package/.output/server/chunks/routes/api/unqueue.post.mjs +2 -2
  136. package/.output/server/chunks/routes/api/update/status.get.mjs +1 -1
  137. package/.output/server/chunks/routes/api/update.get.mjs +2 -2
  138. package/.output/server/chunks/routes/api/update.post.mjs +2 -2
  139. package/.output/server/chunks/routes/api/upload.post.mjs +2 -2
  140. package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +1 -1
  141. package/.output/server/chunks/routes/api/worktrees.get.mjs +1 -1
  142. package/.output/server/chunks/routes/favicon.ico.get.mjs +1 -1
  143. package/.output/server/chunks/routes/icons/_name_.get.mjs +2 -2
  144. package/.output/server/chunks/routes/renderer.mjs +3 -3
  145. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +2 -2
  146. package/.output/server/chunks/routes/ws/_..._.mjs +2 -2
  147. package/.output/server/chunks/routes/ws/events.mjs +2 -2
  148. package/.output/server/chunks/routes/ws/term.mjs +2 -2
  149. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  150. package/.output/server/index.mjs +2 -2
  151. package/.output/server/package.json +1 -1
  152. package/README.md +332 -25
  153. package/bin/install-docker-skill.sh +20 -0
  154. package/bin/lib/commands.mjs +5 -1
  155. package/bin/lib/core.mjs +1 -0
  156. package/bin/lib/install-skill.sh +100 -0
  157. package/bin/lib/skill.mjs +16 -0
  158. package/bin/lib/updater.mjs +65 -12
  159. package/bin/lib/verify-release.mjs +20 -0
  160. package/package.json +3 -2
  161. package/skills/wherdr/SKILL.md +180 -0
  162. package/.output/public/_nuxt/B7QP1TFs.js +0 -23
  163. package/.output/public/_nuxt/BDNMzG2s.js +0 -1
  164. package/.output/public/_nuxt/BOpBIziZ.js +0 -6
  165. package/.output/public/_nuxt/BWXdFfeg.js +0 -17
  166. package/.output/public/_nuxt/COFCNFpG.js +0 -83
  167. package/.output/public/_nuxt/CXG-cOdh.js +0 -1
  168. package/.output/public/_nuxt/CkZ8t6uB.js +0 -1
  169. package/.output/public/_nuxt/D4Yz4rat.js +0 -65
  170. package/.output/public/_nuxt/DoD7Qb5P.js +0 -30
  171. package/.output/public/_nuxt/DyBZDSCV.js +0 -2
  172. package/.output/public/_nuxt/bLP7Jj-b.js +0 -1
  173. package/.output/public/_nuxt/builds/meta/7afbf062-5369-4002-b20d-7a582ff6e0f1.json +0 -1
  174. package/.output/server/chunks/routes/ws/mirror.mjs +0 -161
@@ -0,0 +1 @@
1
+ import{A as e,B as t,Et as n,Hn as r,M as i,Mn as a,N as o,Ot as s,P as c,Pt as l,St as u,U as d,V as f,b as p,dr as m,hr as h,j as g,mr as _,nn as v,sn as y,w as ee}from"./SiL1FJ5s.js";import{_t as b,vt as x}from"./CWwyK2XK.js";import{$r as S,Br as C,En as w,Gr as te,Ir as T,Jt as ne,M as re,O as ie,Pr as ae,Ur as oe,Yr as se,ii as ce,jr as le,rn as E,ti as ue,wn as de}from"./dPxB2L94.js";import{f as fe,p as pe,u as me}from"./Ci8N4mWR.js";import{B as he,Br as D,C as ge,Er as _e,F as ve,G as O,H as k,I as ye,In as be,Ln as xe,Lt as Se,Mn as Ce,Mr as A,Nn as we,Pn as Te,Pt as Ee,Rn as De,T as j,V as Oe,_ as ke,b as M,er as N,jr as P,o as Ae,or as F,zn as je}from"./DAg9fiVh.js";import{f as I,m as Me}from"./BgPDnf2S.js";import{i as Ne,n as Pe,r as Fe,t as Ie}from"./CKhgznq4.js";import{H as L,I as R,M as Le,N as z,U as Re,k as ze}from"#entry";var B=[`data-pane`],V={class:`plan-cell-head`},H={class:`plan-cell-title`},Be=[`title`],Ve={key:0,class:`plan-cell-detail`},U={key:1,class:`plan-cell-line`},W={key:2,class:`plan-cell-choices`},He=[`disabled`,`onClick`],G={class:`n`},Ue={class:`l`},We=Object.assign(d({__name:`PlanCell`,props:{pane:{},focused:{type:Boolean},fresh:{type:Boolean}},emits:[`open`],setup(t,{emit:n}){let i=t,u=n,d=a(!1),_=e(()=>i.pane.status===`blocked`&&i.pane.prompt?.options?.length?i.pane.prompt:null),ee=e(()=>R(_.value,3)),S=e(()=>N(i.pane)),C=e(()=>S.value&&F(S.value)||(_.value?_.value.question:i.pane.preview)||(i.pane.agent?``:A(i.pane.cwd)));async function w(e,t){d.value=!0,await ne(i.pane.id,e,t)||(d.value=!1)}return v(()=>i.pane.prompt,()=>{d.value=!1}),(e,n)=>{let i=L,a=Re,v=Pe,S=I;return s(),c(`div`,{class:m([`plan-cell`,[(`statusKey`in e?e.statusKey:r(E))(t.pane),{stale:(`paneStale`in e?e.paneStale:r(O))(t.pane),fresh:t.fresh}]]),role:`button`,tabindex:`0`,"data-pane":t.pane.id,onClick:n[0]||=e=>u(`open`),onKeydown:n[1]||=b(x(e=>u(`open`),[`self`]),[`enter`])},[f(v,{items:()=>(`paneItems`in e?e.paneItems:r(T))(t.pane),title:(`paneTitle`in e?e.paneTitle:r(P))(t.pane),"manual-press":``},{default:y(()=>[g(`div`,V,[f(i,{agent:t.pane.agent},null,8,[`agent`]),g(`span`,H,h((`paneTitle`in e?e.paneTitle:r(P))(t.pane)),1),t.focused?(s(),c(`span`,{key:0,class:`plan-cell-focus`,title:(`t`in e?e.t:r(D))(`Active pane in Herdr`)},null,8,Be)):o(``,!0),f(a,{items:()=>(`paneItems`in e?e.paneItems:r(T))(t.pane),title:(`paneTitle`in e?e.paneTitle:r(P))(t.pane),size:`sm`,label:(`t`in e?e.t:r(D))(`Pane options`)},null,8,[`items`,`title`,`label`])])]),_:1},8,[`items`,`title`]),f(S,{pane:t.pane,model:``},null,8,[`pane`]),r(_)?.detail?(s(),c(`code`,Ve,h((`detailLine`in e?e.detailLine:r(z))(r(_).detail)),1)):o(``,!0),r(C)?(s(),c(`p`,U,h(r(C)),1)):o(``,!0),r(ee).length?(s(),c(`div`,W,[(s(!0),c(p,null,l(r(ee),n=>(s(),c(`button`,{key:n.i,type:`button`,disabled:r(d)||!(`eventsOpen`in e?e.eventsOpen:r(ge))||(`offlineView`in e?e.offlineView:r(k))||(`paneStale`in e?e.paneStale:r(O))(t.pane),onClick:x(e=>w(n.i,n.label),[`stop`])},[g(`span`,G,h(n.i+1),1),g(`span`,Ue,h(n.label),1)],8,He))),128))])):o(``,!0)],42,B)}}}),{__name:`PlanCell`});function Ge(e,t,n,r,i){return e?`open`:t&&n&&(i||r)?`unavailable`:`loading`}var Ke={id:`tabview`,class:`view`},qe={class:`top bar tab-top`},Je={class:`tab-head`},Ye={class:`tab-title`},Xe={class:`tab-meta`},Ze={class:`tab-meta-tab`},Qe={key:0},$e=[`title`],et={class:`machine-inline-name`},tt={key:2,class:`chat-empty`},nt={key:3,class:`chat-empty`},rt=[`onPointerdown`],it=[`aria-orientation`,`aria-label`,`aria-valuenow`,`onPointerdown`,`onKeydown`],at={key:5,class:`plan-wrap`},ot=[`onPointerdown`],st=[`aria-orientation`,`aria-label`,`onPointerdown`],ct=Object.assign(d({__name:`TabView`,props:{tabId:{}},setup(d){let b=d,x=fe(),ne=pe();u(()=>{M.value||(ke.value=null)});let E=e(()=>ce(b.tabId)),ge=e(()=>E.value&&Se(ue(E.value.tab.workspace).length).headerAdd),O=e(()=>E.value?j.value.workspaces.find(e=>e.id===E.value.tab.workspace):void 0),A=e(()=>new Map((E.value?.panes||[]).map(e=>[e.id,e]))),N=a(null),F=e(()=>N.value||E.value?.layout||null),I=e(()=>F.value?xe(F.value).filter(e=>A.value.has(e.pane)):[]),L=e(()=>!k.value&&oe(b.tabId)),R=e(()=>L.value&&F.value?Ce(F.value):[]),z=e(()=>he.value&&E.value?ve(E.value.tab.machine):void 0),B=(e,t)=>e||String(t),V=a(!!E.value),H=a(!1),Be=setTimeout(()=>{H.value=!0},4e3);n(()=>clearTimeout(Be)),v(E,e=>{e&&(V.value=!0)});let Ve=e(()=>Ge(!!E.value,j.value.ok,j.value.ready!==!1,H.value,V.value)===`unavailable`&&!se(b.tabId)),U=a(null),W=e(()=>String(x.query.pane||``));v([E,W],([e,t],n)=>{if(!e)return;let r=e.panes.map(e=>e.id);if(t&&r.includes(t)&&(t!==n?.[1]||!n?.[0]?.panes.some(e=>e.id===t))){U.value=t;return}U.value&&r.includes(U.value)||(U.value=r.includes(t)?t:e.layout.focused&&r.includes(e.layout.focused)?e.layout.focused:r[0]||null)},{immediate:!0});function He(e){U.value!==e&&(U.value=e,ne.replace({query:{pane:e}}))}function G(e){let t=M.value&&E.value&&U.value?Ee(e):0;if(!t)return;e.preventDefault(),e.stopPropagation();let n=be(E.value.layout,U.value,t);n&&He(n)}u(()=>window.addEventListener(`keydown`,G,!0)),n(()=>window.removeEventListener(`keydown`,G,!0));let Ue=()=>[...te(b.tabId),...w()],ct=e(()=>E.value?`${D(`Tab`)} ${B(E.value.tab.label,E.value.tab.number)}`:void 0),K=a(null),q=a(null),lt={center:`Swap`,left:`Place left`,right:`Place right`,up:`Place above`,down:`Place below`};function ut(e,t){let n=K.value?.getBoundingClientRect();return n&&n.width>0&&n.height>0?{px:(e-n.left)/n.width*100,py:(t-n.top)/n.height*100}:null}function dt(e,t,n){L.value&&(q.value={pane:e,pointer:t.pointerId,touch:t.pointerType!==`mouse`,x0:t.clientX,y0:t.clientY,x:t.clientX,y:t.clientY,started:n,over:null,side:null},window.addEventListener(`pointermove`,ft),window.addEventListener(`pointerup`,pt),window.addEventListener(`pointercancel`,mt),window.addEventListener(`keydown`,ht,!0))}function ft(e){let t=q.value;if(!t||e.pointerId!==t.pointer||(t.x=e.clientX,t.y=e.clientY,!t.started&&Math.hypot(t.x-t.x0,t.y-t.y0)>5&&(t.started=!0),!t.started))return;e.preventDefault();let n=ut(t.x,t.y),r=n&&I.value.find(e=>e.pane!==t.pane&&n.px>=e.left&&n.px<=e.left+e.width&&n.py>=e.top&&n.py<=e.top+e.height),i=r&&n?Te(r,n.px,n.py):null,a=r&&i&&E.value&&we(E.value.layout,t.pane,r.pane,i);((a?r.pane:null)!==t.over||(a?i:null)!==t.side)&&(t.over=a?r.pane:null,t.side=a?i:null)}function J(){q.value=null,window.removeEventListener(`pointermove`,ft),window.removeEventListener(`pointerup`,pt),window.removeEventListener(`pointercancel`,mt),window.removeEventListener(`keydown`,ht,!0)}function pt(e){let t=q.value;if(!t||e.pointerId!==t.pointer)return;let n=A.value.get(t.pane);if(t.touch&&X.suppressClick(),J(),t.touch&&bt&&Math.hypot(t.x-t.x0,t.y-t.y0)<=5)return xt(t.pane);t.started&&n&&t.over&&t.side&&le(n,t.over,t.side)}function mt(e){q.value&&e.pointerId===q.value.pointer&&(q.value.touch&&X.suppressClick(),J())}function ht(e){e.key===`Escape`&&(e.preventDefault(),J())}n(()=>{J(),$()});let Y=e(()=>{let e=q.value,t=e?.started&&e.over&&e.side?I.value.find(t=>t.pane===e.over):null;if(!t||!e?.side)return null;let{left:n,top:r,width:i,height:a}=t,o={left:{width:i/2},right:{left:n+i/2,width:i/2},up:{height:a/2},down:{top:r+a/2,height:a/2},center:{}}[e.side];return{side:e.side,label:D(lt[e.side]),style:Object.fromEntries(Object.entries({left:n,top:r,width:i,height:a,...o}).map(([e,t])=>[e,`${t}%`]))}}),gt=e(()=>{let e=q.value,t=e?.started?A.value.get(e.pane):null;if(!t||!e)return null;let n=Math.max(4,Math.min(e.touch?e.x-20:e.x+12,window.innerWidth-250)),r=Math.max(4,e.touch?e.y-56:e.y+14);return{title:P(t),style:{transform:`translate(${n}px, ${r}px)`}}});function _t(e,t){t.button===0&&t.target?.closest?.(`.cell-grip`)&&(t.preventDefault(),dt(e,t,!1))}let vt=null,yt=``,bt=!1;function xt(e){let t=A.value.get(e);t&&(_e(),de(T(t),P(t)))}let X=Le({onPress:()=>{if(vt){if(!L.value)return bt?xt(yt):void 0;_e(),dt(yt,vt,!0)}}});function St(e,t){vt=t,yt=e,bt=!!t.target?.closest?.(`.plan-cell-head`)&&!Fe(t.target),X.down(t)}function Ct(e){X.move(e)}let Z=null,Q=a(null);function wt(e,t){if(t.button!==0||!E.value)return;t.preventDefault(),t.stopPropagation();let n=t.currentTarget;n.setPointerCapture?.(t.pointerId),Z={d:e,pointer:t.pointerId,ratio:e.ratio,el:n},Q.value=e.path,n.addEventListener(`pointermove`,Tt),n.addEventListener(`pointerup`,Et),n.addEventListener(`pointercancel`,$)}function Tt(e){let t=Z,n=ut(e.clientX,e.clientY);t&&e.pointerId===t.pointer&&n&&E.value&&(t.ratio=De(E.value.layout,t.d,t.d.direction===`right`?n.px:n.py),N.value=je(E.value.layout,t.d.path,t.ratio))}function Et(e){let t=Z;t&&e.pointerId===t.pointer&&($(),Math.abs(t.ratio-t.d.ratio)>=.005&&C(b.tabId,t.d.path,t.ratio))}function $(){let e=Z;Z=null,Q.value=null,N.value=null,e&&(e.el.removeEventListener(`pointermove`,Tt),e.el.removeEventListener(`pointerup`,Et),e.el.removeEventListener(`pointercancel`,$))}function Dt(e,t){let n={ArrowLeft:-1,ArrowUp:-1,ArrowRight:1,ArrowDown:1}[t.key];if(!n||!E.value||e.direction===`right`!=(t.key===`ArrowLeft`||t.key===`ArrowRight`))return;t.preventDefault();let r=De(E.value.layout,e,e.start+e.size*(e.ratio+n*.05));r!==e.ratio&&C(b.tabId,e.path,r)}let Ot=e=>e.direction===`right`?{left:`${e.at}%`,top:`${e.from}%`,height:`${e.span}%`}:{top:`${e.at}%`,left:`${e.from}%`,width:`${e.span}%`};function kt(e){X.swallowClick()||(_e(),me(S(e)))}return(e,n)=>{let a=Ne,u=ie,v=re,b=ze,x=Re,S=Pe,C=Me,w=Ie,te=We;return s(),c(`section`,Ke,[r(E)?(s(),i(a,{key:0,workspace:r(E).tab.workspace,current:d.tabId},null,8,[`workspace`,`current`])):o(``,!0),f(S,{items:Ue,title:r(ct),disabled:!r(E)},{default:y(()=>[g(`header`,qe,[f(u,{icon:`i-lucide-chevron-left`,color:`neutral`,variant:`ghost`,size:`lg`,class:`icon-btn back tab-back`,"aria-label":(`t`in e?e.t:r(D))(`Back`),to:`/`},null,8,[`aria-label`]),g(`div`,Je,[g(`div`,Ye,[r(O)?.worktree?(s(),i(v,{key:0,name:`i-lucide-git-branch`,class:`tab-title-branch`})):o(``,!0),t(h(r(O)?.label||`—`),1)]),g(`div`,Xe,[g(`span`,Ze,h((`t`in e?e.t:r(D))(`Tab`))+` `+h(r(E)?B(r(E).tab.label,r(E).tab.number):``),1),r(E)?(s(),c(`span`,Qe,h(`${r(E).panes.length} pane${r(E).panes.length>1?`s`:``}`),1)):o(``,!0),r(E)?.layout.zoomed?(s(),c(`span`,{key:1,class:`tab-meta-zoom`,title:(`t`in e?e.t:r(D))(`A pane is zoomed in Herdr`)},`zoom`,8,$e)):o(``,!0),r(z)?(s(),c(`span`,{key:2,class:m([`tab-meta-machine`,r(z).status])},[f(v,{name:r(z).local?`i-lucide-server`:`i-lucide-laptop`},null,8,[`name`]),g(`span`,et,h((`machineName`in e?e.machineName:r(ye))(r(z).key)),1),r(z).local?(s(),i(b,{key:0})):o(``,!0)],2)):o(``,!0)])]),r(ge)&&r(E)?(s(),i(u,{key:0,icon:`i-lucide-plus`,color:`neutral`,variant:`ghost`,size:`lg`,class:`icon-btn`,"aria-label":(`t`in e?e.t:r(D))(`New tab`),title:(`t`in e?e.t:r(D))(`New tab`),disabled:`offlineView`in e?e.offlineView:r(k),onClick:n[0]||=t=>(`newTab`in e?e.newTab:r(ae))(r(E).tab.workspace)},null,8,[`aria-label`,`title`,`disabled`])):o(``,!0),r(E)?(s(),i(x,{key:1,items:Ue,size:`lg`,title:r(ct),label:(`t`in e?e.t:r(D))(`Tab options`)},null,8,[`title`,`label`])):o(``,!0)])]),_:1},8,[`title`,`disabled`]),!(`desk`in e?e.desk:r(M))&&((`netDown`in e?e.netDown:r(Oe))||(`offlineView`in e?e.offlineView:r(k)))?(s(),i(C,{key:1,label:(`offlineView`in e?e.offlineView:r(k))?(`t`in e?e.t:r(D))(`Last known state`):void 0,at:`cachedAt`in e?e.cachedAt:r(Ae)},null,8,[`label`,`at`])):o(``,!0),r(Ve)?(s(),c(`div`,tt,[f(v,{name:`i-lucide-layout-panel-left`,class:`chat-empty-icon`}),g(`p`,null,h((`t`in e?e.t:r(D))(`This tab is unavailable.`)),1),f(u,{color:`neutral`,variant:`outline`,to:`/`},{default:y(()=>[t(h((`t`in e?e.t:r(D))(`Back`)),1)]),_:1})])):r(E)?r(E)&&(`desk`in e?e.desk:r(M))?(s(),c(`div`,{key:4,ref_key:`area`,ref:K,class:m([`split`,{dragging:r(q)?.started,resizing:r(Q)!=null}])},[(s(!0),c(p,null,l(r(I),e=>(s(),c(`div`,{key:e.pane,class:m([`split-box`,{"drag-src":r(q)?.started&&r(q).pane===e.pane}]),style:_({left:`${e.left}%`,top:`${e.top}%`,width:`${e.width}%`,height:`${e.height}%`}),onPointerdown:t=>_t(e.pane,t)},[f(w,{cell:``,grip:r(L),"pane-id":e.pane,active:e.pane===r(U),onActivate:t=>He(e.pane)},null,8,[`grip`,`pane-id`,`active`,`onActivate`])],46,rt))),128)),r(Y)?(s(),c(`div`,{key:0,class:m([`drop-zone`,r(Y).side]),style:_(r(Y).style)},[g(`span`,null,h(r(Y).label),1)],6)):o(``,!0),(s(!0),c(p,null,l(r(R),t=>(s(),c(`div`,{key:t.path,class:m([`divider`,[t.direction,{on:r(Q)===t.path}]]),style:_(Ot(t)),role:`separator`,tabindex:`0`,"aria-orientation":t.direction===`right`?`vertical`:`horizontal`,"aria-label":(`t`in e?e.t:r(D))(`Resize`),"aria-valuenow":Math.round(t.ratio*100),"aria-valuemin":`5`,"aria-valuemax":`95`,onPointerdown:e=>wt(t,e),onKeydown:e=>Dt(t,e)},null,46,it))),128))],2)):r(E)?(s(),c(`div`,at,[g(`div`,{ref_key:`area`,ref:K,class:m([`plan`,{dragging:r(q)?.started,resizing:r(Q)!=null,movable:r(L)}])},[(s(!0),c(p,null,l(r(I),e=>(s(),c(`div`,{key:e.pane,class:m([`plan-box`,{"drag-src":r(q)?.started&&r(q).pane===e.pane}]),style:_({left:`${e.left}%`,top:`${e.top}%`,width:`${e.width}%`,height:`${e.height}%`}),onPointerdown:t=>St(e.pane,t),onPointermove:Ct,onPointerup:n[1]||=(...e)=>r(X).cancel&&r(X).cancel(...e),onPointercancel:n[2]||=(...e)=>r(X).cancel&&r(X).cancel(...e)},[f(te,{pane:r(A).get(e.pane),focused:r(E).layout.focused===e.pane&&r(I).length>1,fresh:r(W)===e.pane,onOpen:t=>kt(e.pane)},null,8,[`pane`,`focused`,`fresh`,`onOpen`])],46,ot))),128)),r(Y)?(s(),c(`div`,{key:0,class:m([`drop-zone`,r(Y).side]),style:_(r(Y).style)},[g(`span`,null,h(r(Y).label),1)],6)):o(``,!0),(s(!0),c(p,null,l(r(R),t=>(s(),c(`div`,{key:t.path,class:m([`divider`,[t.direction,{on:r(Q)===t.path}]]),style:_(Ot(t)),role:`separator`,"aria-orientation":t.direction===`right`?`vertical`:`horizontal`,"aria-label":(`t`in e?e.t:r(D))(`Resize`),onPointerdown:e=>wt(t,e)},null,46,st))),128))],2)])):o(``,!0):(s(),c(`div`,nt,h((`t`in e?e.t:r(D))(`Loading…`)),1)),(s(),i(ee,{to:`body`},[r(gt)?(s(),c(`div`,{key:0,class:`drag-ghost`,style:_(r(gt).style)},h(r(gt).title),5)):o(``,!0)]))])}}}),{__name:`TabView`}),K=d({__name:`[tab]`,setup(t){let n=fe(),a=e(()=>String(n.params.tab||``));return(e,t)=>{let n=ct;return s(),i(n,{key:r(a),"tab-id":r(a)},null,8,[`tab-id`])}}});export{K as default};
@@ -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/yzABg5xl.js"},{"revision":null,"url":"_nuxt/xYX85SPI.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.CGWKmYU3.css"},{"revision":null,"url":"_nuxt/dPxB2L94.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/VpjCgSXu.js"},{"revision":null,"url":"_nuxt/SiL1FJ5s.js"},{"revision":null,"url":"_nuxt/DcJi16XA.js"},{"revision":null,"url":"_nuxt/DaaJIRB3.js"},{"revision":null,"url":"_nuxt/DT8qZ0Wv.js"},{"revision":null,"url":"_nuxt/DAg9fiVh.js"},{"revision":null,"url":"_nuxt/Cr3SrGky.js"},{"revision":null,"url":"_nuxt/CkbmecwS.js"},{"revision":null,"url":"_nuxt/Ci8N4mWR.js"},{"revision":null,"url":"_nuxt/CWwyK2XK.js"},{"revision":null,"url":"_nuxt/CP8o925U.js"},{"revision":null,"url":"_nuxt/CKhgznq4.js"},{"revision":null,"url":"_nuxt/BkOxQzbS.js"},{"revision":null,"url":"_nuxt/BgPDnf2S.js"},{"revision":null,"url":"_nuxt/Bd17z0YL.js"},{"revision":null,"url":"_nuxt/BX5PM2JQ.js"},{"revision":null,"url":"_nuxt/BSy6OCIY.js"},{"revision":null,"url":"_nuxt/BBw_0a4M.js"},{"revision":null,"url":"_nuxt/B4Yk2tB1.js"},{"revision":null,"url":"_nuxt/AgentView.DzFWBd2A.css"},{"revision":"f0fc32f393fea2b75a91e3f10a5be779","url":"_nuxt/builds/latest.json"},{"revision":null,"url":"_nuxt/builds/meta/c735b6c0-1bd0-47d7-a208-d310f0a06287.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, bJ as useStorage, aC 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,204 @@
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 RESOLVE = `root=$(cd "$1" 2>/dev/null && pwd -P) || { echo "folder not found" >&2; exit 3; }
23
+ under() { case "$1/" in "\${root%/}/"*) return 0 ;; esac; return 1; }`;
24
+ const LIST_SCRIPT = `${RESOLVE}
25
+ if [ -n "$4" ]; then
26
+ dir=$(cd "$4" 2>/dev/null && pwd -P) && under "$dir" || dir=$root
27
+ else
28
+ dir=$(cd "$root" && cd -- "./$2" 2>/dev/null && pwd -P) || { echo "not found" >&2; exit 4; }
29
+ under "$dir" || { echo "outside" >&2; exit 5; }
30
+ fi
31
+ cd "$dir" || exit 4
32
+ [ -r . ] || { echo "permission denied" >&2; exit 7; }
33
+ printf '%s\\0%s\\0' "$root" "$dir"
34
+ max=$3; n=0
35
+ set --
36
+ for pass in d o; do
37
+ for f in * .[!.]* ..?*; do
38
+ [ -e "$f" ] || [ -L "$f" ] || continue
39
+ if [ -d "$f" ]; then t=d; elif [ -f "$f" ]; then t=f; else t=o; fi
40
+ if [ "$pass" = d ]; then [ "$t" = d ] || continue; else [ "$t" != d ] || continue; fi
41
+ n=$((n + 1)); [ "$n" -gt "$max" ] && { printf '+\\0'; break 2; }
42
+ if [ -L "$f" ]; then l=l; else l=' '; [ "$t" = f ] && set -- "$@" "$f"; fi
43
+ printf '%s%s %s\\0' "$t" "$l" "$f"
44
+ done
45
+ done
46
+ printf '=\\0'
47
+ [ "$#" -gt 0 ] || exit 0
48
+ if stat -f %z / >/dev/null 2>&1; then stat -f %z -- "$@"; else stat -c %s -- "$@"; fi 2>/dev/null
49
+ exit 0`;
50
+ const READ_SCRIPT = `${RESOLVE}
51
+ case "$2" in */*) d=\${2%/*} ;; *) d=. ;; esac
52
+ b=\${2##*/}
53
+ dir=$(cd "$root" && cd -- "./$d" 2>/dev/null && pwd -P) || { echo "not found" >&2; exit 4; }
54
+ f="$dir/$b"; i=0
55
+ while [ -L "$f" ]; do
56
+ i=$((i + 1)); [ "$i" -gt 40 ] && { echo "not found" >&2; exit 4; }
57
+ t=$(readlink -- "$f") || exit 4
58
+ case "$t" in /*) f=$t ;; *) f="\${f%/*}/$t" ;; esac
59
+ p=\${f%/*}
60
+ dir=$(cd -P -- "\${p:-/}" 2>/dev/null && pwd -P) || { echo "not found" >&2; exit 4; }
61
+ f="\${dir%/}/\${f##*/}"
62
+ done
63
+ [ -e "$f" ] || { echo "not found" >&2; exit 4; }
64
+ under "$f" || { echo "outside" >&2; exit 5; }
65
+ [ -f "$f" ] || { echo "not a file" >&2; exit 6; }
66
+ [ -r "$f" ] || { echo "permission denied" >&2; exit 7; }
67
+ s=$(wc -c < "$f") || exit 4
68
+ echo $s
69
+ [ -n "$4" ] && [ $(($s)) -ge "$3" ] && exit 0
70
+ head -c "$3" < "$f"`;
71
+ function executor(m, { timeoutMs = 15e3, maxBytes = IMAGE_BYTES } = {}) {
72
+ const remote = m.exec;
73
+ if (remote) return (script, args) => remote(script, args, { timeoutMs });
74
+ return (script, args) => new Promise((resolve) => {
75
+ execFile("sh", ["-c", script, "sh", ...args], { timeout: timeoutMs, encoding: "buffer", maxBuffer: maxBytes + 64 * 1024 }, (err, out, stderr) => {
76
+ const e = err;
77
+ const code = !e ? 0 : e.killed ? 124 : typeof e.code === "number" ? e.code : 1;
78
+ resolve({ code, stdout: out, stderr: String(stderr || "") });
79
+ });
80
+ });
81
+ }
82
+ async function run(m, script, args, opts) {
83
+ const r = await executor(m, opts)(script, args);
84
+ if (r.code === 0) return r.stdout;
85
+ if (r.code === 3) throw new HerdrError("bad_cwd", "This agent\u2019s folder is unknown");
86
+ if (r.code === 4) throw new HerdrError("not_found", "File not found");
87
+ if (r.code === 5) throw new HerdrError("outside", "Outside the project folder");
88
+ if (r.code === 6) throw new HerdrError("not_file", "Not a file");
89
+ if (r.code === 7) throw new HerdrError("denied", "Permission denied");
90
+ if (r.code === 124) throw new HerdrError("timeout", "The folder took too long to read");
91
+ if (r.code === 255 || r.code === null) throw new HerdrError("unreachable", "Machine unreachable");
92
+ throw new HerdrError("remote", r.stderr.trim().split("\n").pop() || `code ${r.code}`);
93
+ }
94
+ function cleanRelative(p) {
95
+ const raw = String(p != null ? p : "").replace(/\\/g, "/");
96
+ if (raw.startsWith("/") || raw.includes("\0")) throw new HerdrError("outside", "Outside the project folder");
97
+ const n = path.posix.normalize(raw || ".").replace(/\/+$/, "");
98
+ if (n === ".." || n.startsWith("../")) throw new HerdrError("outside", "Outside the project folder");
99
+ return n === "." ? "" : n;
100
+ }
101
+ function parseListing(raw) {
102
+ const parts = raw.toString("utf8").split("\0");
103
+ const root = parts[0] || "";
104
+ const dir = parts[1] || "";
105
+ const entries = [];
106
+ const plain = [];
107
+ let truncated = false;
108
+ let i = 2;
109
+ for (; i < parts.length; i++) {
110
+ const p = parts[i];
111
+ if (p === "=") break;
112
+ if (p === "+") {
113
+ truncated = true;
114
+ continue;
115
+ }
116
+ const m = /^([dfo])([l ]) (.+)$/s.exec(p);
117
+ if (!m) continue;
118
+ const e = { name: m[3], kind: m[1] === "d" ? "dir" : m[1] === "f" ? "file" : "other", size: null, link: m[2] === "l" };
119
+ entries.push(e);
120
+ if (e.kind === "file" && !e.link) plain.push(e);
121
+ }
122
+ const sizes = parts.slice(i + 1).join("").split("\n").filter((l) => /^\d+$/.test(l)).map(Number);
123
+ if (sizes.length === plain.length) plain.forEach((e, k) => {
124
+ e.size = sizes[k];
125
+ });
126
+ entries.sort((a, b) => Number(b.kind === "dir") - Number(a.kind === "dir") || a.name.localeCompare(b.name, void 0, { numeric: true, sensitivity: "base" }));
127
+ return { root, dir, entries, truncated };
128
+ }
129
+ async function rootOf(m, cwd) {
130
+ return await gitToplevel(m, cwd) || cwd;
131
+ }
132
+ async function listFiles(m, cwd, rel, opts = {}) {
133
+ var _a, _b;
134
+ const root = await rootOf(m, cwd);
135
+ 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)];
136
+ const out = parseListing(await run(m, LIST_SCRIPT, args));
137
+ const rp = path.posix.relative(out.root, out.dir);
138
+ return { root: out.root, path: rp.startsWith("..") ? "" : rp, entries: out.entries, truncated: out.truncated };
139
+ }
140
+ const isText = (b) => !b.subarray(0, 8192).includes(0);
141
+ function cutAt(b, max) {
142
+ const nl = b.lastIndexOf(10, max - 1);
143
+ if (nl >= 0) return nl + 1;
144
+ let i = max;
145
+ while (i > 0 && (b[i] & 192) === 128) i--;
146
+ return i;
147
+ }
148
+ function writtenTarget(m, cwd, written) {
149
+ const w = String(written != null ? written : "");
150
+ const abs = w.length > 1024 ? null : resolveAgentPath(w, cwd, m.home);
151
+ if (!abs) throw new HerdrError("outside_home", "Only files in your home folder can be shown");
152
+ const root = posixResolve("/", m.home);
153
+ const rel = path.posix.relative(root, abs);
154
+ if (!rel) throw new HerdrError("not_file", "Not a file");
155
+ return { root, rel, abs };
156
+ }
157
+ async function readHead(m, root, rel, max, opts) {
158
+ const out = await run(m, READ_SCRIPT, [root, rel, String(max), ...(opts == null ? void 0 : opts.whole) ? ["1"] : []], opts);
159
+ const nl = out.indexOf(10);
160
+ return { size: Number(out.subarray(0, nl).toString("utf8")) || 0, body: out.subarray(nl + 1) };
161
+ }
162
+ async function previewAt(m, root, rel, shown) {
163
+ const mime = IMAGE_TYPES[path.posix.extname(rel).slice(1).toLowerCase()];
164
+ const { size, body } = await readHead(m, root, rel, mime ? IMAGE_BYTES + 1 : TEXT_BYTES + 1);
165
+ if (mime) {
166
+ if (size > IMAGE_BYTES) return { path: shown, size, kind: "large", truncated: true };
167
+ return { path: shown, size, kind: "image", dataUrl: `data:${mime};base64,${body.toString("base64")}`, truncated: false };
168
+ }
169
+ if (!isText(body)) return { path: shown, size, kind: "binary", truncated: false };
170
+ const truncated = body.length > TEXT_BYTES;
171
+ const text = (truncated ? body.subarray(0, cutAt(body, TEXT_BYTES)) : body).toString("utf8");
172
+ return { path: shown, size, kind: "text", text, truncated };
173
+ }
174
+ async function readFilePreview(m, cwd, rel) {
175
+ const p = cleanRelative(rel);
176
+ if (!p) throw new HerdrError("not_file", "Not a file");
177
+ return previewAt(m, await rootOf(m, cwd), p, p);
178
+ }
179
+ async function readWrittenPreview(m, cwd, written) {
180
+ const t = writtenTarget(m, cwd, written);
181
+ return previewAt(m, t.root, t.rel, t.abs);
182
+ }
183
+ async function bytesAt(m, root, rel) {
184
+ const { size, body } = await readHead(m, root, rel, DOWNLOAD_BYTES + 1, { timeoutMs: 12e4, maxBytes: DOWNLOAD_BYTES + 1, whole: true });
185
+ if (size > DOWNLOAD_BYTES || body.length > DOWNLOAD_BYTES) throw new HerdrError("too_large", "File too large to download (50 MB max)");
186
+ return { name: path.posix.basename(rel), body };
187
+ }
188
+ async function readFileBytes(m, cwd, rel) {
189
+ const p = cleanRelative(rel);
190
+ if (!p) throw new HerdrError("not_file", "Not a file");
191
+ return bytesAt(m, await rootOf(m, cwd), p);
192
+ }
193
+ async function readWrittenBytes(m, cwd, written) {
194
+ const t = writtenTarget(m, cwd, written);
195
+ return bytesAt(m, t.root, t.rel);
196
+ }
197
+ function attachmentHeader(name) {
198
+ const ascii = name.replace(/[^\x20-\x7e]|["\\]/g, "_") || "download";
199
+ const utf8 = encodeURIComponent(name).replace(/['()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
200
+ return `attachment; filename="${ascii}"; filename*=UTF-8''${utf8}`;
201
+ }
202
+
203
+ export { readFileBytes as a, attachmentHeader as b, readWrittenPreview as c, readFilePreview as d, listFiles as l, readWrittenBytes as r };
204
+ //# 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 { aL as baseMachines, aM 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 { aW as HOST_LABEL, aM 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.3";
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"
@@ -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,8 @@
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, at as splitId, ab as log, aD as underHome, aJ as isGitRepo, E as fmt, m as getState, $ as sleep, ap as IN_DOCKER, y as HERDR_CHILD_ENV, ah 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 { 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';
5
+ 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
6
 
97
7
  const CACHE_MS = 1e4;
98
8
  const cache = /* @__PURE__ */ new Map();
@@ -252,5 +162,5 @@ ${e.message}`) };
252
162
  return res;
253
163
  }
254
164
 
255
- export { invokePluginAction as i, listPluginActions as l, projectProfiles as p };
165
+ export { invokePluginAction as i, listPluginActions as l, projectProfiles as p, withoutContainerTicker as w };
256
166
  //# sourceMappingURL=plugins.mjs.map