@sma1lboy/rove 0.9.281-next.31 → 0.9.281

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 (110) hide show
  1. package/dist/cli/chunk-01tghgf3.js +8 -0
  2. package/dist/cli/{chunk-jk4f0xsh.js → chunk-03fv92ya.js} +1 -1
  3. package/dist/cli/{chunk-7aaw17vr.js → chunk-08mb3qss.js} +1 -1
  4. package/dist/cli/{chunk-y7mjhjby.js → chunk-0gbg7bg8.js} +1 -1
  5. package/dist/cli/{chunk-zv0rrhck.js → chunk-0nkk13z9.js} +1 -1
  6. package/dist/cli/{chunk-zp0q931y.js → chunk-14tevt5v.js} +1 -1
  7. package/dist/cli/{chunk-1g6vhgfe.js → chunk-16e6jqq6.js} +1 -1
  8. package/dist/cli/{chunk-3hxm56h6.js → chunk-1a57ejnh.js} +1 -1
  9. package/dist/cli/{chunk-4z1a65bz.js → chunk-32y7f5dr.js} +1 -1
  10. package/dist/cli/{chunk-j54c5a0a.js → chunk-3m0ydze9.js} +1 -1
  11. package/dist/cli/{chunk-12wn9jtf.js → chunk-3pgp6z3k.js} +1 -1
  12. package/dist/cli/{chunk-amq030gb.js → chunk-3qj9yw5c.js} +2 -2
  13. package/dist/cli/chunk-453qpfae.js +2 -0
  14. package/dist/cli/{chunk-gk8efsx0.js → chunk-46qs744w.js} +1 -1
  15. package/dist/cli/{chunk-am5cpb9n.js → chunk-4vkrv4eb.js} +1 -1
  16. package/dist/cli/{chunk-hfvzvj91.js → chunk-4yr1534j.js} +1 -1
  17. package/dist/cli/{chunk-byh32qnx.js → chunk-5swmvt20.js} +1 -1
  18. package/dist/cli/{chunk-j8d9sk5j.js → chunk-6wt08a28.js} +1 -1
  19. package/dist/cli/{chunk-f262ywvg.js → chunk-7911jkq6.js} +1 -1
  20. package/dist/cli/chunk-8ng1756g.js +3 -0
  21. package/dist/cli/{chunk-ebdp0z1d.js → chunk-95kk75wh.js} +1 -1
  22. package/dist/cli/{chunk-6mk6ceb6.js → chunk-9qpea48c.js} +2 -2
  23. package/dist/cli/chunk-9vwb9f7q.js +7 -0
  24. package/dist/cli/{chunk-nqwza8b0.js → chunk-a5xbsvx2.js} +1 -1
  25. package/dist/cli/{chunk-t7dyf50m.js → chunk-ap3fgbbt.js} +1 -1
  26. package/dist/cli/{chunk-5kgq379z.js → chunk-b5fdqynx.js} +1 -1
  27. package/dist/cli/{chunk-x85rcep5.js → chunk-bbq6wc47.js} +1 -1
  28. package/dist/cli/{chunk-np398f2a.js → chunk-bbt217yd.js} +1 -1
  29. package/dist/cli/{chunk-w2tcb3rn.js → chunk-bm6qhcck.js} +1 -1
  30. package/dist/cli/{chunk-txvjg1g9.js → chunk-btxfcc77.js} +3 -3
  31. package/dist/cli/chunk-c9ptxthj.js +2 -0
  32. package/dist/cli/{chunk-zkby63ej.js → chunk-cs410j8b.js} +1 -1
  33. package/dist/cli/{chunk-rvjnafyt.js → chunk-cx78tyg1.js} +1 -1
  34. package/dist/cli/{chunk-4drm07mp.js → chunk-cx8wnz54.js} +1 -1
  35. package/dist/cli/{chunk-t2p22ww7.js → chunk-ejfs22aq.js} +1 -1
  36. package/dist/cli/chunk-f23manyf.js +8 -0
  37. package/dist/cli/{chunk-7nnpp89t.js → chunk-ga82ras9.js} +1 -1
  38. package/dist/cli/{chunk-f7egph8g.js → chunk-gzkes5bw.js} +1 -1
  39. package/dist/cli/{chunk-f0sahrfw.js → chunk-hmy01yg2.js} +16 -14
  40. package/dist/cli/{chunk-3a7x7jg7.js → chunk-hnxs5shy.js} +16 -17
  41. package/dist/cli/{chunk-bw2y7670.js → chunk-j2e7jgh8.js} +1 -1
  42. package/dist/cli/{chunk-qc9sj5wh.js → chunk-j5y7hhc2.js} +1 -1
  43. package/dist/cli/{chunk-qzhfs668.js → chunk-jar50zcp.js} +1 -1
  44. package/dist/cli/{chunk-r98h6b42.js → chunk-k2rmj0v3.js} +2 -2
  45. package/dist/cli/{chunk-bv050ssb.js → chunk-k3h4cpdy.js} +1 -1
  46. package/dist/cli/{chunk-wz307hf6.js → chunk-k9xabf0t.js} +1 -1
  47. package/dist/cli/{chunk-02x0ahxk.js → chunk-kp43j420.js} +1 -1
  48. package/dist/cli/{chunk-6cfs0nqe.js → chunk-kt5ngemc.js} +1 -1
  49. package/dist/cli/chunk-nkgn0bqq.js +2 -0
  50. package/dist/cli/{chunk-fkgemeww.js → chunk-q2nhmaq9.js} +2 -2
  51. package/dist/cli/{chunk-hd1szhba.js → chunk-q6cwy6v5.js} +1 -1
  52. package/dist/cli/{chunk-jkgp816v.js → chunk-q72w3dsx.js} +1 -1
  53. package/dist/cli/{chunk-hmsvt5nj.js → chunk-rqm2kn0c.js} +1 -1
  54. package/dist/cli/{chunk-q6tsx6zc.js → chunk-sm96b61g.js} +1 -1
  55. package/dist/cli/chunk-sqdmngys.js +2 -0
  56. package/dist/cli/{chunk-k2j0tg1h.js → chunk-tgv90744.js} +7 -3
  57. package/dist/cli/{chunk-vbvbwjad.js → chunk-twy9bfps.js} +1 -1
  58. package/dist/cli/{chunk-5g6v6tq5.js → chunk-v3ecphrz.js} +1 -1
  59. package/dist/cli/{chunk-mjzjah9d.js → chunk-vtay379p.js} +1 -1
  60. package/dist/cli/chunk-vx44yxra.js +3 -0
  61. package/dist/cli/{chunk-w003rpr2.js → chunk-w3kvkax7.js} +1 -1
  62. package/dist/cli/{chunk-s1xn6wav.js → chunk-w6ft4djp.js} +1 -1
  63. package/dist/cli/{chunk-8hernv9y.js → chunk-w8dmmnys.js} +1 -1
  64. package/dist/cli/{chunk-9f34p80j.js → chunk-ww0zctb7.js} +1 -1
  65. package/dist/cli/{chunk-qwwt4ch2.js → chunk-x119xqa6.js} +1 -1
  66. package/dist/cli/{chunk-nrx8pf9p.js → chunk-x35dfb1x.js} +1 -1
  67. package/dist/cli/{chunk-ggjmcqpt.js → chunk-x94e0rw4.js} +3 -3
  68. package/dist/cli/chunk-xaam0d8r.js +4 -0
  69. package/dist/cli/{chunk-azt0c2b5.js → chunk-xekk4k54.js} +1 -1
  70. package/dist/cli/{chunk-mqvkd2g1.js → chunk-xqvyzv62.js} +1 -1
  71. package/dist/cli/chunk-xxz3np4w.js +2 -0
  72. package/dist/cli/{chunk-p11emdb2.js → chunk-y07cp9mb.js} +1 -1
  73. package/dist/cli/{chunk-5dq0n3h7.js → chunk-y2v1x23z.js} +1 -1
  74. package/dist/cli/chunk-yn01fet6.js +3 -0
  75. package/dist/cli/{chunk-cakyme4s.js → chunk-z8rvxvx5.js} +1 -1
  76. package/dist/cli/chunk-zr058kbe.js +3 -0
  77. package/dist/cli/index.js +3 -3
  78. package/dist/cli/rove.js +3 -3
  79. package/dist/skills/rove/SKILL.md +4 -2
  80. package/dist/skills/rove/references/api-flags.md +7 -4
  81. package/dist/voice/asr_server.py +318 -0
  82. package/dist/voice/engine.py +174 -0
  83. package/dist/voice/fetch_model.py +30 -0
  84. package/dist/voice/learn.py +184 -0
  85. package/dist/voice/live.py +93 -0
  86. package/dist/voice/phonetic.py +87 -0
  87. package/dist/voice/polish.py +84 -0
  88. package/dist/voice/polish_prompt.md +50 -0
  89. package/dist/voice/pyproject.toml +28 -0
  90. package/dist/voice/uv.lock +815 -0
  91. package/dist/voice/vocab.py +193 -0
  92. package/dist/web/assets/index-Bo92_NP5.css +1 -0
  93. package/dist/web/assets/index-Ct8dDnCc.js +154 -0
  94. package/dist/web/index.html +3 -3
  95. package/dist/web/relay/index.html +5 -5
  96. package/package.json +4 -3
  97. package/dist/cli/chunk-0g1h35mr.js +0 -2
  98. package/dist/cli/chunk-1wwqf6kx.js +0 -3
  99. package/dist/cli/chunk-26ydgwym.js +0 -2
  100. package/dist/cli/chunk-2pfh3zm0.js +0 -33
  101. package/dist/cli/chunk-2wrt80ft.js +0 -3
  102. package/dist/cli/chunk-7fya3y0n.js +0 -2
  103. package/dist/cli/chunk-d2wndk4q.js +0 -2
  104. package/dist/cli/chunk-mey3vksj.js +0 -2
  105. package/dist/cli/chunk-nv8eyjep.js +0 -3
  106. package/dist/cli/chunk-ve76p2mx.js +0 -3
  107. package/dist/cli/chunk-wfgrn8p2.js +0 -4
  108. package/dist/cli/chunk-xmjknfy2.js +0 -7
  109. package/dist/web/assets/index-Dc0Khk0q.js +0 -149
  110. package/dist/web/assets/index-T8cCSdnk.css +0 -1
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{ReleaseNotesBody,bootPaneHost,pageCloseBindings,runShellUpdater,useBindings,useT,useTheme}from"./chunk-t7dyf50m.js";import"./chunk-x85rcep5.js";import{$jsx,$jsxs,useRenderer}from"./chunk-29kvfqeh.js";import{require_react_production}from"./chunk-2wd4744g.js";import"./chunk-j54c5a0a.js";import"./chunk-cpgnm1xr.js";import"./chunk-r3s2t9af.js";import"./chunk-6xr1prk6.js";import"./chunk-764bsyb0.js";import"./chunk-w003rpr2.js";import"./chunk-atn06ncf.js";import"./chunk-f7egph8g.js";import"./chunk-rxqdw6s5.js";import"./chunk-kxp04jnp.js";import"./chunk-mdc7b01e.js";import"./chunk-tn9gtf18.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-0r1jf8m9.js";import"./chunk-t7j8g9f6.js";import"./chunk-dmzg9zdc.js";import"./chunk-40dgv828.js";import"./chunk-6xppe9bj.js";import{BREAKING_VERSIONS,CURRENT_VERSION,breakingVersionsCrossed,fetchReleaseNotes,fetchReleaseSummaries,updateCommandFor}from"./chunk-2wrt80ft.js";import"./chunk-2r1fgng9.js";import"./chunk-2brn8e1y.js";import"./chunk-32j6y5d1.js";import{currentLang}from"./chunk-nqwza8b0.js";import"./chunk-ve76p2mx.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-xy8be792.js";import"./chunk-7ghwdjdc.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import{__toESM}from"./chunk-91sykzqq.js";import{TextAttributes}from"@opentui/core";var import_react2=__toESM(require_react_production(),1);var RELEASE_LIMIT=20;function VersionsPage(props){let{theme}=useTheme(),t=useT(),renderer=useRenderer(),[releases,setReleases]=import_react2.useState(null),[cursor,setCursor]=import_react2.useState(0),[notes,setNotes]=import_react2.useState({}),[status,setStatus]=import_react2.useState(null),selected=releases?.[cursor],crossings=selected?breakingVersionsCrossed(CURRENT_VERSION,selected.version):[],loadSummaries=props.fetchSummaries??fetchReleaseSummaries,loadNotes=props.fetchNotes??fetchReleaseNotes;import_react2.useEffect(()=>{loadSummaries(RELEASE_LIMIT).then((fetched)=>setReleases(fetched))},[loadSummaries]);let selectedVersion=selected?.version;import_react2.useEffect(()=>{if(selectedVersion===void 0||notes[selectedVersion]!==void 0)return;setNotes((cache)=>({...cache,[selectedVersion]:"loading"})),loadNotes(selectedVersion,currentLang()).then((fetched)=>{setNotes((cache)=>({...cache,[selectedVersion]:fetched??"missing"}))})},[selectedVersion,notes,loadNotes]);function move(delta){let count=releases?.length??0;if(count===0)return;setCursor((index)=>(index+delta+count)%count)}async function installSelected(){if(!selected)return;setStatus(t("update.statusRunningUpdater")),await new Promise((resolve)=>setTimeout(resolve,30)),await runShellUpdater({renderer,t,targetLabel:selected.version,command:updateCommandFor(selected.version)})}useBindings(()=>({bindings:[{key:"up",cmd:()=>move(-1)},{key:"down",cmd:()=>move(1)},{key:"k",cmd:()=>move(-1)},{key:"j",cmd:()=>move(1)},{key:"return",cmd:()=>void installSelected()},{key:"u",cmd:()=>void installSelected()},...pageCloseBindings(props.onClose)]}));let selectedNotes=selectedVersion===void 0?void 0:notes[selectedVersion];return $jsxs("box",{flexDirection:"column",flexGrow:1,paddingTop:1,paddingLeft:2,paddingRight:2,children:[$jsxs("box",{flexDirection:"row",justifyContent:"space-between",flexShrink:0,children:[$jsx("text",{fg:theme.text,attributes:TextAttributes.BOLD,wrapMode:"none",children:t("update.versions.pageTitle")}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",onMouseUp:props.onClose,children:t("update.versions.closeHint")})]}),$jsxs("box",{flexDirection:"row",flexGrow:1,paddingTop:1,gap:2,children:[$jsxs("box",{flexDirection:"column",width:26,flexShrink:0,children:[releases===null?$jsx("text",{fg:theme.textMuted,children:t("update.versions.loading")}):null,releases!==null&&releases.length===0?$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t("update.versions.unavailable")}):null,(releases??[]).map((release,index)=>{let active=index===cursor,tags=[release.version===CURRENT_VERSION?t("update.versions.tagCurrent"):"",index===0?t("update.versions.tagLatest"):"",BREAKING_VERSIONS.includes(release.version)?t("update.versions.tagBreaking"):""].filter(Boolean).join(" ");return $jsxs("box",{flexDirection:"row",gap:1,paddingLeft:1,backgroundColor:active?theme.primary:void 0,onMouseUp:()=>setCursor(index),children:[$jsxs("text",{fg:active?theme.selectedListItemText:theme.text,attributes:release.version===CURRENT_VERSION?TextAttributes.BOLD:void 0,wrapMode:"none",children:["v",release.version]}),tags?$jsx("text",{fg:active?theme.selectedListItemText:theme.textMuted,wrapMode:"none",children:tags}):null]},release.version)})]}),$jsxs("box",{flexDirection:"column",flexGrow:1,flexShrink:1,children:[$jsx("scrollbox",{flexGrow:1,flexShrink:1,stickyScroll:!1,verticalScrollbarOptions:{trackOptions:{foregroundColor:"transparent"}},children:$jsxs("box",{flexDirection:"column",paddingRight:1,paddingBottom:1,gap:0,children:[selectedNotes==="loading"?$jsx("text",{fg:theme.textMuted,children:t("update.loadingNotes")}):null,selectedNotes==="missing"?$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t("update.notesUnavailable")}):null,selectedNotes!==void 0&&selectedNotes!=="loading"&&selectedNotes!=="missing"?$jsx(ReleaseNotesBody,{body:selectedNotes.body}):null]})}),crossings.length>0?$jsx("text",{fg:theme.warning,wrapMode:"word",children:t("update.versions.breakingWarning",{versions:crossings.join(", ")})}):null]})]}),status?$jsx("text",{fg:theme.info,wrapMode:"word",children:status}):null,$jsx("box",{flexShrink:0,paddingTop:1,children:$jsx("text",{fg:theme.textMuted,attributes:TextAttributes.DIM,wrapMode:"none",children:t("update.versions.footerHint")})})]})}var INLINE_ROWS=24;async function startVersionsHost(){await bootPaneHost({inlineRows:INLINE_ROWS,setup:()=>({root:()=>$jsx(VersionsPage,{onClose:()=>process.exit(0)})})})}export{startVersionsHost,VersionsPage};
2
+ import{ReleaseNotesBody,bootPaneHost,pageCloseBindings,runShellUpdater,useBindings,useT,useTheme}from"./chunk-ap3fgbbt.js";import"./chunk-bbq6wc47.js";import{$jsx,$jsxs,useRenderer}from"./chunk-29kvfqeh.js";import{require_react_production}from"./chunk-2wd4744g.js";import"./chunk-3m0ydze9.js";import"./chunk-cpgnm1xr.js";import"./chunk-r3s2t9af.js";import"./chunk-6xr1prk6.js";import"./chunk-764bsyb0.js";import"./chunk-w3kvkax7.js";import"./chunk-atn06ncf.js";import"./chunk-gzkes5bw.js";import"./chunk-rxqdw6s5.js";import"./chunk-kxp04jnp.js";import"./chunk-mdc7b01e.js";import"./chunk-tn9gtf18.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-0r1jf8m9.js";import"./chunk-t7j8g9f6.js";import"./chunk-dmzg9zdc.js";import"./chunk-40dgv828.js";import"./chunk-6xppe9bj.js";import{BREAKING_VERSIONS,CURRENT_VERSION,breakingVersionsCrossed,fetchReleaseNotes,fetchReleaseSummaries,updateCommandFor}from"./chunk-yn01fet6.js";import"./chunk-2r1fgng9.js";import"./chunk-2brn8e1y.js";import"./chunk-32j6y5d1.js";import{currentLang}from"./chunk-a5xbsvx2.js";import"./chunk-9vwb9f7q.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-xy8be792.js";import"./chunk-7ghwdjdc.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import{__toESM}from"./chunk-91sykzqq.js";import{TextAttributes}from"@opentui/core";var import_react2=__toESM(require_react_production(),1);var RELEASE_LIMIT=20;function VersionsPage(props){let{theme}=useTheme(),t=useT(),renderer=useRenderer(),[releases,setReleases]=import_react2.useState(null),[cursor,setCursor]=import_react2.useState(0),[notes,setNotes]=import_react2.useState({}),[status,setStatus]=import_react2.useState(null),selected=releases?.[cursor],crossings=selected?breakingVersionsCrossed(CURRENT_VERSION,selected.version):[],loadSummaries=props.fetchSummaries??fetchReleaseSummaries,loadNotes=props.fetchNotes??fetchReleaseNotes;import_react2.useEffect(()=>{loadSummaries(RELEASE_LIMIT).then((fetched)=>setReleases(fetched))},[loadSummaries]);let selectedVersion=selected?.version;import_react2.useEffect(()=>{if(selectedVersion===void 0||notes[selectedVersion]!==void 0)return;setNotes((cache)=>({...cache,[selectedVersion]:"loading"})),loadNotes(selectedVersion,currentLang()).then((fetched)=>{setNotes((cache)=>({...cache,[selectedVersion]:fetched??"missing"}))})},[selectedVersion,notes,loadNotes]);function move(delta){let count=releases?.length??0;if(count===0)return;setCursor((index)=>(index+delta+count)%count)}async function installSelected(){if(!selected)return;setStatus(t("update.statusRunningUpdater")),await new Promise((resolve)=>setTimeout(resolve,30)),await runShellUpdater({renderer,t,targetLabel:selected.version,command:updateCommandFor(selected.version)})}useBindings(()=>({bindings:[{key:"up",cmd:()=>move(-1)},{key:"down",cmd:()=>move(1)},{key:"k",cmd:()=>move(-1)},{key:"j",cmd:()=>move(1)},{key:"return",cmd:()=>void installSelected()},{key:"u",cmd:()=>void installSelected()},...pageCloseBindings(props.onClose)]}));let selectedNotes=selectedVersion===void 0?void 0:notes[selectedVersion];return $jsxs("box",{flexDirection:"column",flexGrow:1,paddingTop:1,paddingLeft:2,paddingRight:2,children:[$jsxs("box",{flexDirection:"row",justifyContent:"space-between",flexShrink:0,children:[$jsx("text",{fg:theme.text,attributes:TextAttributes.BOLD,wrapMode:"none",children:t("update.versions.pageTitle")}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",onMouseUp:props.onClose,children:t("update.versions.closeHint")})]}),$jsxs("box",{flexDirection:"row",flexGrow:1,paddingTop:1,gap:2,children:[$jsxs("box",{flexDirection:"column",width:26,flexShrink:0,children:[releases===null?$jsx("text",{fg:theme.textMuted,children:t("update.versions.loading")}):null,releases!==null&&releases.length===0?$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t("update.versions.unavailable")}):null,(releases??[]).map((release,index)=>{let active=index===cursor,tags=[release.version===CURRENT_VERSION?t("update.versions.tagCurrent"):"",index===0?t("update.versions.tagLatest"):"",BREAKING_VERSIONS.includes(release.version)?t("update.versions.tagBreaking"):""].filter(Boolean).join(" ");return $jsxs("box",{flexDirection:"row",gap:1,paddingLeft:1,backgroundColor:active?theme.primary:void 0,onMouseUp:()=>setCursor(index),children:[$jsxs("text",{fg:active?theme.selectedListItemText:theme.text,attributes:release.version===CURRENT_VERSION?TextAttributes.BOLD:void 0,wrapMode:"none",children:["v",release.version]}),tags?$jsx("text",{fg:active?theme.selectedListItemText:theme.textMuted,wrapMode:"none",children:tags}):null]},release.version)})]}),$jsxs("box",{flexDirection:"column",flexGrow:1,flexShrink:1,children:[$jsx("scrollbox",{flexGrow:1,flexShrink:1,stickyScroll:!1,verticalScrollbarOptions:{trackOptions:{foregroundColor:"transparent"}},children:$jsxs("box",{flexDirection:"column",paddingRight:1,paddingBottom:1,gap:0,children:[selectedNotes==="loading"?$jsx("text",{fg:theme.textMuted,children:t("update.loadingNotes")}):null,selectedNotes==="missing"?$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t("update.notesUnavailable")}):null,selectedNotes!==void 0&&selectedNotes!=="loading"&&selectedNotes!=="missing"?$jsx(ReleaseNotesBody,{body:selectedNotes.body}):null]})}),crossings.length>0?$jsx("text",{fg:theme.warning,wrapMode:"word",children:t("update.versions.breakingWarning",{versions:crossings.join(", ")})}):null]})]}),status?$jsx("text",{fg:theme.info,wrapMode:"word",children:status}):null,$jsx("box",{flexShrink:0,paddingTop:1,children:$jsx("text",{fg:theme.textMuted,attributes:TextAttributes.DIM,wrapMode:"none",children:t("update.versions.footerHint")})})]})}var INLINE_ROWS=24;async function startVersionsHost(){await bootPaneHost({inlineRows:INLINE_ROWS,setup:()=>({root:()=>$jsx(VersionsPage,{onClose:()=>process.exit(0)})})})}export{startVersionsHost,VersionsPage};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{INBOUND_CLASSES,INBOUND_KEY,deniedClasses,inboundClassOf,inboundRefusal,setInbound}from"./chunk-jar50zcp.js";import"./chunk-btxfcc77.js";import"./chunk-tgv90744.js";import"./chunk-kdnk8m5j.js";import"./chunk-qcjkactr.js";import"./chunk-rjfdzjhj.js";import"./chunk-zpxpwgds.js";import"./chunk-agvtzads.js";import"./chunk-pm91e38v.js";import"./chunk-2xsxcdp6.js";import"./chunk-17e2tgyg.js";import"./chunk-1vxtd8rh.js";import"./chunk-q8ffd1pc.js";import"./chunk-4hestsjp.js";import"./chunk-qgrg9a5n.js";import"./chunk-2bgmby1d.js";import"./chunk-n0rdn2fn.js";import"./chunk-5mhvjytn.js";import"./chunk-atn06ncf.js";import"./chunk-01tghgf3.js";import"./chunk-y07cp9mb.js";import"./chunk-vytrhm50.js";import"./chunk-vp29jgbt.js";import"./chunk-gq36nzg8.js";import"./chunk-sq6zj3fb.js";import"./chunk-qkehg2c1.js";import"./chunk-w6ft4djp.js";import"./chunk-vx44yxra.js";import"./chunk-z43e08kw.js";import"./chunk-w77s2df8.js";import"./chunk-mqfvzdpr.js";import"./chunk-gzkes5bw.js";import"./chunk-rxqdw6s5.js";import"./chunk-8ng1756g.js";import"./chunk-kxp04jnp.js";import"./chunk-1a57ejnh.js";import"./chunk-qecygh3f.js";import"./chunk-rjq38twt.js";import"./chunk-r5j8fycq.js";import"./chunk-xfgqae9t.js";import"./chunk-j1z9kgyd.js";import"./chunk-g9ba25q5.js";import"./chunk-ggnq2vvk.js";import"./chunk-hpay0ax8.js";import"./chunk-catrr0z3.js";import"./chunk-mdc7b01e.js";import"./chunk-tn9gtf18.js";import"./chunk-895yqjjz.js";import"./chunk-sak1tphp.js";import"./chunk-y1xnjx8x.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-5rgrde6b.js";import"./chunk-4gjvmfa9.js";import"./chunk-2tfnscxk.js";import"./chunk-hzz020xx.js";import"./chunk-w7zv47mp.js";import"./chunk-etfh8f4z.js";import"./chunk-9rj2fx6v.js";import"./chunk-rfp0ayra.js";import"./chunk-t7j8g9f6.js";import"./chunk-dmzg9zdc.js";import"./chunk-40dgv828.js";import"./chunk-kg9kmwt9.js";import"./chunk-6xppe9bj.js";import"./chunk-yn01fet6.js";import"./chunk-zsfyj36g.js";import"./chunk-2r1fgng9.js";import"./chunk-2brn8e1y.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import"./chunk-a5xbsvx2.js";import"./chunk-9vwb9f7q.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7bakcyes.js";import"./chunk-8qkyd589.js";import"./chunk-7kysxgbq.js";import"./chunk-hz1x3hak.js";import"./chunk-x1jxxmtc.js";import"./chunk-xy8be792.js";import"./chunk-h2m7em1e.js";import"./chunk-7ghwdjdc.js";import"./chunk-8t7qbr1e.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-pxk2c2vj.js";import"./chunk-91sykzqq.js";export{setInbound,inboundRefusal,inboundClassOf,deniedClasses,INBOUND_KEY,INBOUND_CLASSES};
@@ -1,12 +1,16 @@
1
1
  // @bun
2
- import{readTabsSnapshot}from"./chunk-3hxm56h6.js";import{engineCanFork,engineDisplayName,getEngineProtocol,protocolEntry,sessionProtocol}from"./chunk-rjq38twt.js";import{execHostForWorktreePath}from"./chunk-895yqjjz.js";import{supportsStructuredHistory}from"./chunk-4gjvmfa9.js";import{getPersistedString,getPersistedValue}from"./chunk-rfp0ayra.js";import{parseNumstatRows}from"./chunk-t7j8g9f6.js";import{parsePorcelainRows,unquoteGitPath}from"./chunk-dmzg9zdc.js";import{recordSpawn}from"./chunk-40dgv828.js";import{readHeadSha,resolveGitDirs}from"./chunk-kg9kmwt9.js";import{READ_ONLY_GIT_ENV}from"./chunk-6xppe9bj.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{t}from"./chunk-nqwza8b0.js";import{rollupPr}from"./chunk-x1jxxmtc.js";import{isObject}from"./chunk-7ghwdjdc.js";import{acquireSync,releaseSync}from"./chunk-bejhca6z.js";import{secretsPath}from"./chunk-z1nj22va.js";import{readFile,stat}from"fs/promises";var PER_SESSION=3,SNIPPET_RADIUS=60,READ_BATCH=8,READ_BUDGET_MS=1500;function snippetOf(text,needle){let flat=text.replace(/\s+/g," "),want=needle.replace(/\s+/g," "),at=flat.toLowerCase().indexOf(want.toLowerCase());if(at<0)return null;let start=Math.max(0,at-SNIPPET_RADIUS),end=Math.min(flat.length,at+want.length+SNIPPET_RADIUS);return`${start>0?"\u2026":""}${flat.slice(start,end).trim()}${end<flat.length?"\u2026":""}`}function matchMessages(messages,needle,max){let out=[];for(let m of messages){if(m.role!=="user"&&m.role!=="assistant")continue;for(let b of m.blocks){if(b.type!=="text")continue;let snippet=snippetOf(b.text,needle);if(snippet===null)continue;out.push({role:m.role,at:m.timestamp,snippet});break}if(out.length>=max)break}return out}function prefilterToken(query){return query.split(/["\\\s]+/).reduce((a,b)=>b.length>a.length?b:a,"")}async function candidatesOf(tasks,skipped){let claimed=new Set,pinned=[],unpinned=[],sharedDirs=new Map;for(let t2 of tasks)if(t2.worktreePath)sharedDirs.set(t2.worktreePath,(sharedDirs.get(t2.worktreePath)??0)+1);for(let task of tasks){if(task.origin){skipped.push({taskId:task.id,reason:"other-machine"});continue}let vendor=task.vendor,tabs=(readTabsSnapshot(task.id)?.tabs??[]).filter((t2)=>t2.kind==="engine"),any=!1;for(let tab of tabs){let tabVendor=tab.vendor??vendor;if(!tabVendor||!supportsStructuredHistory(sessionProtocol(tabVendor))||!tab.sessionId)continue;if(claimed.has(tab.sessionId))continue;claimed.add(tab.sessionId);let reader=protocolEntry(tabVendor).history;pinned.push({task,reader,sessionId:tab.sessionId,tabId:tab.id,path:null,mtimeMs:0}),any=!0}if(any)continue;if(!vendor||!supportsStructuredHistory(sessionProtocol(vendor))){skipped.push({taskId:task.id,reason:"engine-unsupported"});continue}let worktree=task.worktreePath;if(worktree&&(sharedDirs.get(worktree)??0)===1)unpinned.push({task,reader:protocolEntry(vendor).history,worktree})}let listed=await Promise.all(unpinned.map(async({task,reader,worktree})=>(await reader.listSessionIdsForWorktree(worktree)).filter((id)=>!claimed.has(id)).map((sessionId)=>({task,reader,sessionId,path:null,mtimeMs:0})))),all=[...pinned,...listed.flat()];return Promise.all(all.map(async(c)=>{let worktree=c.task.worktreePath||c.task.repo,path=await c.reader.transcriptPath(c.sessionId,worktree).catch(()=>null),mtimeMs=path?await stat(path).then((s)=>s.mtimeMs,()=>0):0;return{...c,path,mtimeMs}}))}async function filesContaining(paths,token){if(paths.length===0||token==="")return new Set(paths);let rg=Bun.which("rg");if(rg){let proc=Bun.spawn([rg,"-l","-i","-F","--no-messages","--",token,...paths],{stdout:"pipe",stderr:"ignore"}),out=await new Response(proc.stdout).text();return await proc.exited,new Set(out.split(`
2
+ import{readTabsSnapshot}from"./chunk-1a57ejnh.js";import{engineCanFork,engineDisplayName,getEngineProtocol,protocolEntry,sessionProtocol}from"./chunk-rjq38twt.js";import{execHostForWorktreePath}from"./chunk-895yqjjz.js";import{supportsStructuredHistory}from"./chunk-4gjvmfa9.js";import{getPersistedString,getPersistedValue}from"./chunk-rfp0ayra.js";import{parseNumstatRows}from"./chunk-t7j8g9f6.js";import{parsePorcelainRows,unquoteGitPath}from"./chunk-dmzg9zdc.js";import{recordSpawn}from"./chunk-40dgv828.js";import{readHeadSha,resolveGitDirs}from"./chunk-kg9kmwt9.js";import{READ_ONLY_GIT_ENV}from"./chunk-6xppe9bj.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{t}from"./chunk-a5xbsvx2.js";import{rollupPr}from"./chunk-x1jxxmtc.js";import{isObject}from"./chunk-7ghwdjdc.js";import{acquireSync,releaseSync}from"./chunk-bejhca6z.js";import{secretsPath}from"./chunk-z1nj22va.js";import{readFile,stat}from"fs/promises";var PER_SESSION=3,SNIPPET_RADIUS=60,READ_BATCH=8,READ_BUDGET_MS=1500;function snippetOf(text,needle){let flat=text.replace(/\s+/g," "),want=needle.replace(/\s+/g," "),at=flat.toLowerCase().indexOf(want.toLowerCase());if(at<0)return null;let start=Math.max(0,at-SNIPPET_RADIUS),end=Math.min(flat.length,at+want.length+SNIPPET_RADIUS);return`${start>0?"\u2026":""}${flat.slice(start,end).trim()}${end<flat.length?"\u2026":""}`}function matchMessages(messages,needle,max){let out=[];for(let m of messages){if(m.role!=="user"&&m.role!=="assistant")continue;for(let b of m.blocks){if(b.type!=="text")continue;let snippet=snippetOf(b.text,needle);if(snippet===null)continue;out.push({role:m.role,at:m.timestamp,snippet});break}if(out.length>=max)break}return out}function prefilterToken(query){return query.split(/["\\\s]+/).reduce((a,b)=>b.length>a.length?b:a,"")}async function candidatesOf(tasks,skipped){let claimed=new Set,pinned=[],unpinned=[],sharedDirs=new Map;for(let t2 of tasks)if(t2.worktreePath)sharedDirs.set(t2.worktreePath,(sharedDirs.get(t2.worktreePath)??0)+1);for(let task of tasks){if(task.origin){skipped.push({taskId:task.id,reason:"other-machine"});continue}let vendor=task.vendor,tabs=(readTabsSnapshot(task.id)?.tabs??[]).filter((t2)=>t2.kind==="engine"),any=!1;for(let tab of tabs){let tabVendor=tab.vendor??vendor;if(!tabVendor||!supportsStructuredHistory(sessionProtocol(tabVendor))||!tab.sessionId)continue;if(claimed.has(tab.sessionId))continue;claimed.add(tab.sessionId);let reader=protocolEntry(tabVendor).history;pinned.push({task,reader,sessionId:tab.sessionId,tabId:tab.id,path:null,mtimeMs:0}),any=!0}if(any)continue;if(!vendor||!supportsStructuredHistory(sessionProtocol(vendor))){skipped.push({taskId:task.id,reason:"engine-unsupported"});continue}let worktree=task.worktreePath;if(worktree&&(sharedDirs.get(worktree)??0)===1)unpinned.push({task,reader:protocolEntry(vendor).history,worktree})}let listed=await Promise.all(unpinned.map(async({task,reader,worktree})=>(await reader.listSessionIdsForWorktree(worktree)).filter((id)=>!claimed.has(id)).map((sessionId)=>({task,reader,sessionId,path:null,mtimeMs:0})))),all=[...pinned,...listed.flat()];return Promise.all(all.map(async(c)=>{let worktree=c.task.worktreePath||c.task.repo,path=await c.reader.transcriptPath(c.sessionId,worktree).catch(()=>null),mtimeMs=path?await stat(path).then((s)=>s.mtimeMs,()=>0):0;return{...c,path,mtimeMs}}))}async function filesContaining(paths,token){if(paths.length===0||token==="")return new Set(paths);let rg=Bun.which("rg");if(rg){let proc=Bun.spawn([rg,"-l","-i","-F","--no-messages","--",token,...paths],{stdout:"pipe",stderr:"ignore"}),out=await new Response(proc.stdout).text();return await proc.exited,new Set(out.split(`
3
3
  `).filter(Boolean))}let needle=token.toLowerCase(),hits=new Set;for(let p of paths)if((await readFile(p,"utf8").catch(()=>"")).toLowerCase().includes(needle))hits.add(p);return hits}async function searchTasks(tasks,query,limit,budgetMs=READ_BUDGET_MS){let started=Date.now(),skipped=[],candidates=await candidatesOf(tasks,skipped),withPath=candidates.filter((c)=>c.path!==null).map((c)=>c.path),hits=await filesContaining(withPath,prefilterToken(query)),toRead=candidates.filter((c)=>c.path===null||hits.has(c.path)).sort((a,b)=>b.mtimeMs-a.mtimeMs),matches=[],scanned=0;while(scanned<toRead.length&&matches.length<limit&&Date.now()-started<budgetMs){let batch=toRead.slice(scanned,scanned+READ_BATCH),read=await Promise.all(batch.map((c)=>c.reader.readHistory(c.sessionId).catch(()=>[])));for(let[i,messages]of read.entries()){let c=batch[i];scanned++;for(let m of matchMessages(messages,query,Math.min(PER_SESSION,limit-matches.length)))matches.push({taskId:c.task.id,title:c.task.title,...c.tabId?{tabId:c.tabId}:{},...m});if(matches.length>=limit)break}}return{query,matches,skipped,truncated:scanned<toRead.length}}async function runWorktreeGit(worktreePath,args,options={}){if(!worktreePath)return{stdout:"",stderr:"worktreePath is required",status:-1};let exec=(options.execForPath??execHostForWorktreePath)(worktreePath),controller=options.timeoutMs&&options.timeoutMs>0?new AbortController:null,timedOut=!1,timer=controller?setTimeout(()=>{timedOut=!0,controller.abort()},options.timeoutMs):null,signal=controller&&options.signal?AbortSignal.any([controller.signal,options.signal]):controller?.signal??options.signal,result;try{recordSpawn("worktree.content",["git",...args],worktreePath),result=await exec.run(["git",...args],{cwd:worktreePath,env:READ_ONLY_GIT_ENV,signal})}catch(err){if(timer)clearTimeout(timer);return{stdout:"",stderr:errorMessage(err),status:-1}}if(timer)clearTimeout(timer);if(timedOut&&result.exitCode===-1&&!result.stderr)return{stdout:result.stdout,stderr:`git ${args.join(" ")} timed out after ${options.timeoutMs}ms`,status:-1};return{stdout:result.stdout,stderr:result.stderr,status:result.exitCode}}function readLocalWorktreeHead(worktreePath,deps={}){if(!worktreePath||(deps.execForPath??execHostForWorktreePath)(worktreePath).isRemote)return null;try{let dirs=resolveGitDirs(worktreePath);return dirs?readHeadSha(dirs):null}catch{return null}}function worktreeFilePath(worktreePath,relPath){if(!worktreePath||!relPath)return null;if(/^[/\\]/.test(relPath)||/^[a-zA-Z]:[/\\]/.test(relPath))return null;if(relPath.split(/[/\\]/).some((part)=>part===".."))return null;let parts=relPath.split("/");return`${worktreePath.replace(/\/+$/,"")}/${parts.filter(Boolean).join("/")}`}async function worktreeFileSize(worktreePath,relPath,deps={}){let path=worktreeFilePath(worktreePath,relPath);if(!path)return null;let exec=(deps.execForPath??execHostForWorktreePath)(worktreePath);try{let res=await exec.run(["wc","-c",path]);if(res.exitCode!==0)return null;let n=Number.parseInt(res.stdout.trim().split(/\s+/)[0]??"",10);return Number.isFinite(n)?n:null}catch{return null}}async function readWorktreeFile(worktreePath,relPath,deps={}){let path=worktreeFilePath(worktreePath,relPath);if(!path)return null;let exec=(deps.execForPath??execHostForWorktreePath)(worktreePath);try{return await exec.readFile(path)}catch{return null}}function filetypeOf(relPath,firstLine){let leaf=relPath.slice(relPath.lastIndexOf("/")+1),dot=leaf.lastIndexOf(".");if(dot<=0)return firstLine===void 0?void 0:shebangFiletype(firstLine);switch(leaf.slice(dot+1).toLowerCase()){case"ts":case"tsx":case"mts":case"cts":return"typescript";case"js":case"jsx":case"mjs":case"cjs":return"javascript";case"md":case"markdown":return"markdown";case"zig":return"zig";default:return}}var SHEBANG_INTERPRETERS=new Map([["node","javascript"],["nodejs","javascript"],["bun","typescript"],["deno","typescript"],["tsx","typescript"],["ts-node","typescript"]]);function shebangFiletype(line){if(!line.startsWith("#!"))return;let words=line.slice(2).trim().split(/\s+/),first=words[0]??"",program=first.slice(first.lastIndexOf("/")+1);if(program==="env"){let i=1;for(;i<words.length;i++){let word=words[i]??"";if(word==="--"){i++;break}if(["-u","--unset","-C","--chdir","-P","-a","--argv0"].includes(word)){i++;continue}if(!word.startsWith("-")&&!word.includes("="))break}let command=words[i]??"";program=command.slice(command.lastIndexOf("/")+1)}return SHEBANG_INTERPRETERS.get(program)}function patchFirstLine(patch){let lines=patch.split(`
4
4
  `),at=lines.findIndex((l)=>/^@@ -\d+(?:,\d+)? \+1(?:,\d+)? @@/.test(l));if(at<0)return;return lines.slice(at+1).find((l)=>l.startsWith(" ")||l.startsWith("+"))?.slice(1)}function contentFirstLine(text){let nl=text.indexOf(`
5
5
  `);return nl<0?text:text.slice(0,nl)}function isCombinedPathspec(relPath){return relPath==="."||relPath.endsWith("/")}function hunklessPatchNote(patch){if(/^@@/m.test(patch))return null;let binary=!1,from,to,renameFrom,renameTo,emptyChange;for(let line of patch.split(`
6
6
  `))if(line.startsWith("old mode "))from=line.slice(9).trim();else if(line.startsWith("new mode "))to=line.slice(9).trim();else if(line.startsWith("rename from "))renameFrom=unquoteGitPath(line.slice(12));else if(line.startsWith("rename to "))renameTo=unquoteGitPath(line.slice(10));else if(line.startsWith("new file mode "))emptyChange="added";else if(line.startsWith("deleted file mode "))emptyChange="deleted";else if(line.startsWith("Binary files ")||line.startsWith("GIT binary patch"))binary=!0;if(binary)return{kind:"binary"};if(renameFrom!=null&&renameTo!=null)return{kind:"rename",from:renameFrom,to:renameTo};if(emptyChange)return{kind:"empty-file",change:emptyChange};if(from!=null&&to!=null)return{kind:"mode",from,to};return null}function sidePath(field){let raw=field.replace(/\t[\s\S]*$/,"");if(raw==="/dev/null")return null;let path=unquoteGitPath(raw);return path.startsWith("a/")||path.startsWith("b/")?path.slice(2):path}function headerPath(header){if(header.startsWith('"'))return sidePath(unquoteGitPath(header))??header;for(let i=header.indexOf(" b/");i>=0;i=header.indexOf(" b/",i+1)){let a=sidePath(header.slice(0,i)),b=sidePath(header.slice(i+1));if(a!=null&&a===b)return b}let last=header.lastIndexOf(" b/");return(last>=0?sidePath(header.slice(last+1)):null)??header}function unifiedDiffFiles(text){let files=[],current=null,push=()=>{if(!current)return;let patch=`${current.lines.join(`
7
7
  `)}
8
8
  `,path=current.plus??current.minus??current.path,note=hunklessPatchNote(patch);files.push({path,text:patch,lines:current.rows,...note?{note}:{}})};for(let line of text.split(`
9
- `)){if(line.startsWith("diff --git ")){push(),current={path:headerPath(line.slice(11)),lines:[line],rows:0};continue}if(!current)continue;if(current.lines.push(line),line.startsWith("rename to "))current.path=unquoteGitPath(line.slice(10));else if(line.startsWith("copy to "))current.path=unquoteGitPath(line.slice(8));else if(line.startsWith("+++ "))current.plus=sidePath(line.slice(4))??void 0;else if(line.startsWith("--- "))current.minus=sidePath(line.slice(4))??void 0;else if(/^[ +-]/.test(line))current.rows+=1}return push(),files}var IMAGE_EXTS=new Set(["png","jpg","jpeg","gif","webp","bmp","ico","tif","tiff","avif","heic"]);function isImagePath(relPath){return IMAGE_EXTS.has(relPath.slice(relPath.lastIndexOf(".")+1).toLowerCase())}function looksBinaryText(text){return text.slice(0,8192).includes("\x00")}async function pairRename(worktree,spec,relPath){let listed=await runWorktreeGit(worktree,["diff",spec,"--name-status","--find-renames","-z"]);if(listed.status!==0)return null;let fields=listed.stdout.split("\x00");for(let i=0;i<fields.length;i+=1){let code=fields[i];if(code==null||!/^[RC]\d*$/.test(code))continue;let orig=fields[i+1],neu=fields[i+2];if(i+=2,orig==null||neu!==relPath)continue;let paired=await runWorktreeGit(worktree,["--literal-pathspecs","diff",spec,"--",relPath,orig]);if(paired.status!==0||paired.stdout.trim().length===0)return null;return{text:paired.stdout,origPath:orig}}return null}var UNTRACKED_DIFF_LIMIT=200;async function untrackedAdditions(worktree,relPath){let listed=await runWorktreeGit(worktree,["--literal-pathspecs","ls-files","--others","--exclude-standard","-z","--",relPath]);if(listed.status!==0)return"";let files=listed.stdout.split("\x00").filter(Boolean).slice(0,UNTRACKED_DIFF_LIMIT),out="";for(let file of files){let added=await runWorktreeGit(worktree,["diff","--no-index","--","/dev/null",file]);if(added.status===0||added.status===1)out+=added.stdout}return out}async function loadPreviewData(worktree,relPath,range,opts={}){if(isImagePath(relPath))return{kind:"binary",image:!0,sizeBytes:await worktreeFileSize(worktree,relPath)};let spec=range?`${range.base}...HEAD`:"HEAD";if(range?.working){let mergeBase=await runWorktreeGit(worktree,["merge-base",range.base,"HEAD"]),sha=mergeBase.status===0?mergeBase.stdout.trim():"";if(!sha)return{kind:"error",message:(mergeBase.stderr??"").trim()||`no merge-base between ${range.base} and HEAD`};spec=sha}let res=await runWorktreeGit(worktree,["--literal-pathspecs","diff",...opts.ignoreWhitespace?["-w"]:[],spec,"--",relPath]);if(res.status!==0&&(range||isCombinedPathspec(relPath)))return{kind:"error",message:(res.stderr??"").trim()||`git diff ${spec} exited with code ${res.status??-1}`};let diff=res.status===0?res.stdout:"";if((!range||range.working)&&isCombinedPathspec(relPath))diff+=await untrackedAdditions(worktree,relPath);let origPath;if(diff.trim().length>0){if(!isCombinedPathspec(relPath)){if(/^new file mode /m.test(diff)){let paired=await pairRename(worktree,spec,relPath);if(paired)diff=paired.text,origPath=paired.origPath}let note=hunklessPatchNote(diff);if(note)return{kind:"patch-note",note,sizeBytes:await worktreeFileSize(worktree,relPath)}}return{kind:"diff",text:diff,...origPath?{origPath}:{}}}if(isCombinedPathspec(relPath))return{kind:"empty"};let text=await readWorktreeFile(worktree,relPath);if(text===null)return{kind:"error",message:t("ops.preview.readFailed",{path:relPath})};if(looksBinaryText(text))return{kind:"binary",image:!1,sizeBytes:await worktreeFileSize(worktree,relPath)};return{kind:"code",text}}async function runGit(args,cwd,signal){if(!cwd)throw Error("git(): cwd is required");let result=await runWorktreeGit(cwd,args,{signal}),exitCode=result.status??-1;if(exitCode!==0){let stderr=(result.stderr??"").trim(),stdout=(result.stdout??"").trim();throw Error(`git ${args.join(" ")} (cwd=${cwd}) exited with code ${exitCode}: ${stderr||stdout||"(no output)"}`)}return result.stdout??""}async function listFiles(worktreePath,signal){let lines=(await runGit(["ls-files","--cached","--others","--exclude-standard","--full-name"],worktreePath,signal)).split(`
9
+ `)){if(line.startsWith("diff --git ")){push(),current={path:headerPath(line.slice(11)),lines:[line],rows:0};continue}if(!current)continue;if(current.lines.push(line),line.startsWith("rename to "))current.path=unquoteGitPath(line.slice(10));else if(line.startsWith("copy to "))current.path=unquoteGitPath(line.slice(8));else if(line.startsWith("+++ "))current.plus=sidePath(line.slice(4))??void 0;else if(line.startsWith("--- "))current.minus=sidePath(line.slice(4))??void 0;else if(/^[ +-]/.test(line))current.rows+=1}return push(),files}var IMAGE_EXTS=new Set(["png","jpg","jpeg","gif","webp","bmp","ico","tif","tiff","avif","heic"]);function isImagePath(relPath){return IMAGE_EXTS.has(relPath.slice(relPath.lastIndexOf(".")+1).toLowerCase())}function looksBinaryText(text){return text.slice(0,8192).includes("\x00")}async function pairRename(worktree,spec,relPath){let listed=await runWorktreeGit(worktree,["diff",spec,"--name-status","--find-renames","-z"]);if(listed.status!==0)return null;let fields=listed.stdout.split("\x00");for(let i=0;i<fields.length;i+=1){let code=fields[i];if(code==null||!/^[RC]\d*$/.test(code))continue;let orig=fields[i+1],neu=fields[i+2];if(i+=2,orig==null||neu!==relPath)continue;let paired=await runWorktreeGit(worktree,["--literal-pathspecs","diff",spec,"--",relPath,orig]);if(paired.status!==0||paired.stdout.trim().length===0)return null;return{text:paired.stdout,origPath:orig}}return null}var UNTRACKED_DIFF_LIMIT=200,UNTRACKED_SPAWNS=8,COMBINED_BIG_FILE=["-c","core.bigFileThreshold=512k"],UNTRACKED_TEXT_BUDGET=1048576;function headerOnly(patch){let out=[];for(let line of patch.split(`
10
+ `)){if(line.startsWith("--- "))continue;if(line.startsWith("+++ "))return`${out.join(`
11
+ `)}
12
+ Binary files /dev/null and ${line.slice(4)} differ
13
+ `;out.push(line)}return patch}async function untrackedAdditions(worktree,relPath){let listed=await runWorktreeGit(worktree,["--literal-pathspecs","ls-files","--others","--exclude-standard","-z","--",relPath]);if(listed.status!==0)return"";let files=listed.stdout.split("\x00").filter(Boolean).slice(0,UNTRACKED_DIFF_LIMIT),patches=Array(files.length).fill(""),next=0,worker=async()=>{while(next<files.length){let i=next++,file=files[i],added=await runWorktreeGit(worktree,[...COMBINED_BIG_FILE,"diff","--no-index","--","/dev/null",file]);if(added.status===0||added.status===1)patches[i]=added.stdout}};await Promise.all(Array.from({length:Math.min(UNTRACKED_SPAWNS,files.length)},worker));let total=0;return patches.map((patch)=>{return total+=patch.length,total>UNTRACKED_TEXT_BUDGET?headerOnly(patch):patch}).join("")}async function loadPreviewData(worktree,relPath,range,opts={}){if(isImagePath(relPath))return{kind:"binary",image:!0,sizeBytes:await worktreeFileSize(worktree,relPath)};let spec=range?`${range.base}...HEAD`:"HEAD";if(range?.working){let mergeBase=await runWorktreeGit(worktree,["merge-base",range.base,"HEAD"]),sha=mergeBase.status===0?mergeBase.stdout.trim():"";if(!sha)return{kind:"error",message:(mergeBase.stderr??"").trim()||`no merge-base between ${range.base} and HEAD`};spec=sha}let res=await runWorktreeGit(worktree,[...isCombinedPathspec(relPath)?COMBINED_BIG_FILE:[],"--literal-pathspecs","diff",...opts.ignoreWhitespace?["-w"]:[],spec,"--",relPath]);if(res.status!==0&&(range||isCombinedPathspec(relPath)))return{kind:"error",message:(res.stderr??"").trim()||`git diff ${spec} exited with code ${res.status??-1}`};let diff=res.status===0?res.stdout:"";if((!range||range.working)&&isCombinedPathspec(relPath))diff+=await untrackedAdditions(worktree,relPath);let origPath;if(diff.trim().length>0){if(!isCombinedPathspec(relPath)){if(/^new file mode /m.test(diff)){let paired=await pairRename(worktree,spec,relPath);if(paired)diff=paired.text,origPath=paired.origPath}let note=hunklessPatchNote(diff);if(note)return{kind:"patch-note",note,sizeBytes:await worktreeFileSize(worktree,relPath)}}return{kind:"diff",text:diff,...origPath?{origPath}:{}}}if(isCombinedPathspec(relPath))return{kind:"empty"};return loadFileContent(worktree,relPath)}async function loadFileContent(worktree,relPath){if(isImagePath(relPath))return{kind:"binary",image:!0,sizeBytes:await worktreeFileSize(worktree,relPath)};let text=await readWorktreeFile(worktree,relPath);if(text===null)return{kind:"error",message:t("ops.preview.readFailed",{path:relPath})};if(looksBinaryText(text))return{kind:"binary",image:!1,sizeBytes:await worktreeFileSize(worktree,relPath)};return{kind:"code",text}}async function runGit(args,cwd,signal){if(!cwd)throw Error("git(): cwd is required");let result=await runWorktreeGit(cwd,args,{signal}),exitCode=result.status??-1;if(exitCode!==0){let stderr=(result.stderr??"").trim(),stdout=(result.stdout??"").trim();throw Error(`git ${args.join(" ")} (cwd=${cwd}) exited with code ${exitCode}: ${stderr||stdout||"(no output)"}`)}return result.stdout??""}async function listFiles(worktreePath,signal){let lines=(await runGit(["ls-files","--cached","--others","--exclude-standard","--full-name"],worktreePath,signal)).split(`
10
14
  `).map((l)=>unquoteGitPath(l.replace(/\r$/,""))),set=new Set;for(let line of lines)if(line.length>0)set.add(line);return Array.from(set).sort()}async function statusFiles(worktreePath,signal){let out=await runGit(["status","--porcelain"],worktreePath,signal),entries=parseStatusEntries(out),stats=new Map;try{let diffOut=await runGit(["diff","--no-color","--numstat","-z","HEAD"],worktreePath,signal);stats=new Map(parseNumstat(diffOut).map((n)=>[n.path,{added:n.added,deleted:n.deleted}]))}catch{try{let cachedOut=await runGit(["diff","--no-color","--numstat","-z","--cached"],worktreePath,signal);stats=new Map(parseNumstat(cachedOut).map((n)=>[n.path,{added:n.added,deleted:n.deleted}]))}catch{stats=new Map}}let merged=entries.map((e)=>{let s=stats.get(e.path);if(s)return{...e,added:s.added,deleted:s.deleted};return e});if(merged.some(isUntrackedDir))try{let others=(await runGit(["ls-files","--others","--exclude-standard","--full-name"],worktreePath,signal)).split(`
11
15
  `).filter((l)=>l.length>0);attachUntrackedChildren(merged,others)}catch{}let untracked=[];for(let e of merged){if(e.status!=="?")continue;if(e.children)untracked.push(...e.children);else if(e.added==null&&!e.path.endsWith("/"))untracked.push(e)}if(untracked.length>0)await Promise.all(untracked.map(async(e)=>{let added=await countAddedLines(worktreePath,e.path,signal);if(added!=null)e.added=added,e.deleted=0}));for(let e of merged){if(!e.children)continue;let sum=0,counted=!1;for(let c of e.children)if(c.added!=null)sum+=c.added,counted=!0;if(counted)e.added=sum,e.deleted=0}return merged}function isUntrackedDir(e){return e.status==="?"&&e.path.endsWith("/")}function attachUntrackedChildren(entries,others){for(let e of entries){if(!isUntrackedDir(e))continue;e.children=others.filter((p)=>p.startsWith(e.path)).map((p)=>({path:p,status:"?"}))}}var BASE_TTL_MS=300000,baseCache=new Map;async function resolveBase(worktreePath,prBaseRef,signal){if(prBaseRef&&prBaseRef.trim().length>0)return prBaseRef.trim();let hit=baseCache.get(worktreePath);if(hit&&Date.now()-hit.at<BASE_TTL_MS){if(hit.head===void 0)return hit.base;if((readLocalWorktreeHead(worktreePath)??await revParse("HEAD",worktreePath,signal))===hit.head)return hit.base}let resolved=await resolveBaseUncached(worktreePath,signal);if(!signal?.aborted)baseCache.set(worktreePath,{...resolved,at:Date.now()});return resolved.base}async function resolveBaseUncached(worktreePath,signal){try{let head2=(await runGit(["symbolic-ref","--short","refs/remotes/origin/HEAD"],worktreePath,signal)).trim();if(head2.length>0)return{base:head2}}catch{}for(let guess of["origin/main","origin/master"])try{return await runGit(["rev-parse","--verify","--quiet",guess],worktreePath,signal),{base:guess}}catch{}let head=await revParse("HEAD",worktreePath,signal);for(let guess of["main","master"]){let sha=await revParse(guess,worktreePath,signal);if(sha!=null&&sha!==head)return{base:guess,head}}return{base:null,head}}async function revParse(ref,worktreePath,signal){try{let out=(await runGit(["rev-parse","--verify","--quiet",ref],worktreePath,signal)).trim();return out.length>0?out:null}catch{return null}}async function statusFilesBranch(worktreePath,base,signal){let range=`${base}...HEAD`,[nameStatusOut,numstatOut]=await Promise.all([runGit(["diff","--no-color","--name-status",range],worktreePath,signal),runGit(["diff","--no-color","--numstat","-z",range],worktreePath,signal)]),counts=new Map(parseNumstat(numstatOut).map((n)=>[n.path,{added:n.added,deleted:n.deleted}])),entries=[];for(let{status,path}of parseNameStatus(nameStatusOut)){let c=counts.get(path);entries.push({path,status,added:c?.added,deleted:c?.deleted})}return entries}function parseNameStatus(raw){let out=[];for(let rawLine of raw.split(`
12
16
  `)){let line=rawLine.replace(/\r$/,"");if(line.length===0)continue;let tab1=line.indexOf("\t");if(tab1<0)continue;let code=line[0],path;if(code==="R"||code==="C"){let tab2=line.indexOf("\t",tab1+1);path=unquoteGitPath(tab2<0?line.slice(tab1+1):line.slice(tab2+1))}else path=unquoteGitPath(line.slice(tab1+1));if(path.length===0||path.endsWith("/"))continue;let status=code==="M"||code==="A"||code==="D"||code==="T"?code:code==="R"?"R":code==="C"?"C":null;if(status)out.push({status,path})}return out}async function countAddedLines(worktreePath,relPath,signal){if(signal?.aborted)return null;let text=await readWorktreeFile(worktreePath,relPath);if(text==null)return null;if(text.includes("\x00"))return null;if(text.length===0)return 0;let count=0;for(let i=0;i<text.length;i++)if(text[i]===`
@@ -25,4 +29,4 @@ import{readTabsSnapshot}from"./chunk-3hxm56h6.js";import{engineCanFork,engineDis
25
29
  - **\u75C7\u72B6\u5E26\u6761\u4EF6\u3001\u4E0D\u7A33\u5B9A\u590D\u73B0\u3001\u6CA1\u6709\u4EFB\u4F55\u731C\u6D4B**\uFF1A\u300C\u6709\u65F6\u5019\u4F1A\u8DD1\u5230\u5C4F\u5E55\u5916\uFF0C\u591A\u5C4F\u60C5\u51B5\u4E0B\u300D\u300C\u611F\u89C9\u5361\u4E00\u4E0B\u300D\u300Cresults feel stale\u300D\u300C\u8D85\u8FC7 200 \u884C\u5C31\u7A7A\u767D\u300D\u2014\u2014\u5148\u8981\u627E\u5230\u89E6\u53D1\u6761\u4EF6\u624D\u6709\u76EE\u6807\u3002`,\u{8fb9}\u{754c}:"\u548C standard \u7684\u5206\u754C\uFF1A\u7528\u6237\u6709\u6CA1\u6709\u8BF4\u8981\u505A\u6210\u4EC0\u4E48\uFF1F\u6CA1\u6709 \u2192 deep\u3002\u4F46 deep \u8BF4\u7684\u662F\u300C\u8981\u5148\u8C03\u67E5\u624D\u77E5\u9053\u505A\u6210\u4EC0\u4E48\u6837\u300D\uFF0C\u4E0D\u662F\u300C\u8FD9\u53E5\u8BDD\u91CC\u6CA1\u6709\u6D3B\u300D\u3002\u4E00\u53E5\u5DF2\u7ECF\u5B8C\u6574\u3001\u53EF\u4EE5\u76F4\u63A5\u56DE\u7B54\u7684\u8BDD\u4E0D\u662F deep\uFF0C\u662F swift\u3002"}},examples:[{task:"\u80FD\u4E0D\u80FD\u8C03\u67E5\u4E00\u4E0B\u4E3A\u4EC0\u4E48\u5BA1\u8BA1\u65E5\u5FD7\u8868\u6700\u8FD1\u6DA8\u5F97\u8FD9\u4E48\u5FEB",tier:"deep"},{task:"\u641C\u7D22\u7ED3\u679C\u70B9\u8FDB\u53BB\u7ECF\u5E38\u662F\u6B7B\u94FE,404,\u9EBB\u70E6\u67E5\u4E00\u4E0B\u662F\u4E0D\u662F\u6784\u5EFA\u7684\u65F6\u5019\u8DEF\u7531\u6CA1\u540C\u6B65",tier:"standard"},{task:"\u6DF1\u8272\u6A21\u5F0F\u4EE3\u7801\u5757\u80CC\u666F\u8272\u8DDF\u6B63\u6587\u80CC\u666F\u4E00\u4E2A\u989C\u8272 \u770B\u4E0D\u51FA\u533A\u522B",tier:"swift"},{task:"Tooltip \u5728 iframe \u91CC\u5B9A\u4F4D\u5B8C\u5168\u662F\u9519\u7684",tier:"swift"},{task:"Table \u7EC4\u4EF6\u8868\u5934\u56FA\u5B9A\u4E4B\u540E\u6A2A\u5411\u6EDA\u52A8\u6761\u6D88\u5931\u4E86",tier:"standard"},{task:"Preferences window doesn't remember size after quit\n\n`PreferencesWindowController.swift` never persists its frame via `setFrameAutosaveName`. Add an autosave name and call it in `windowDidLoad`, so resizing the window sticks across relaunches like the main status window already does.",tier:"swift"},{task:"what would it take to add keyboard-only card creation (no mouse) to the board view?",tier:"deep"},{task:"Add a `--json` flag to the `board list` command\n\nRight now `board list` only prints an ASCII table (src/commands/list.ts). Add a `--json` flag that dumps the same data as JSON to stdout instead, and update the `--help` text in `cli.ts` to document it. Useful for piping into `jq` in scripts.",tier:"swift"},{task:"Scheduled job leaks DB connections\n\n`ReportGenerationJob.java` opens a `Connection` manually in `run()` but never closes it in the catch block when an exception is thrown mid-query. Under load this exhausts the HikariCP pool within a couple hours. Wrap it in try-with-resources and add a test that simulates a query failure and asserts pool size returns to baseline.",tier:"swift"},{task:"\u8DD1\u5927\u8868\u7684\u65F6\u5019\u62A5\u4E86\u4E2A\u5185\u5B58\u9519\u8BEF\n```\nMemoryError: Unable to allocate 3.2 GiB for an array\n```\n\u770B\u770B\u80FD\u4E0D\u80FD\u6D41\u5F0F\u5904\u7406\u4E0D\u8981\u4E00\u6B21\u8BFB\u5168\u90E8",tier:"standard"},{task:`\u89D2\u8272\u6743\u9650\u7F13\u5B58\u6CA1\u6709\u5931\u6548\u673A\u5236
26
30
 
27
31
  PermissionCacheService.java \u7528 Guava Cache \u5B58\u6743\u9650,\u6CA1\u8BBE TTL,\u7BA1\u7406\u5458\u5728\u540E\u53F0\u6539\u4E86\u67D0\u4E2A\u89D2\u8272\u7684\u6743\u9650\u4E4B\u540E,\u5DF2\u7ECF\u767B\u5F55\u7684\u7528\u6237\u90A3\u8FB9\u8FD8\u662F\u8BFB\u5230\u65E7\u7684\u7F13\u5B58\u503C,\u8981\u91CD\u542F\u670D\u52A1\u624D\u4F1A\u5237\u65B0\u3002\u60F3\u52A0\u4E24\u5757:\u4E00\u662F\u7ED9\u7F13\u5B58\u52A0\u4E2A\u5408\u7406\u7684 TTL \u515C\u5E95,\u4E8C\u662F\u5728 RoleController.updateRole \u4FDD\u5B58\u6210\u529F\u4E4B\u540E\u4E3B\u52A8\u8C03\u7528\u4E00\u6B21\u7F13\u5B58\u5931\u6548,\u628A\u6539\u52A8\u7ACB\u523B\u751F\u6548\u3002\u987A\u4FBF\u8865\u4E00\u4E2A\u8986\u76D6\u8FD9\u4E2A\u5931\u6548\u903B\u8F91\u7684\u5355\u6D4B\u3002`,tier:"swift"},{task:"any chance we could speed up the parquet export path? it feels way slower than the csv one for the same row count",tier:"deep"},{task:"could we support opening files in $EDITOR from the file manager instead of always using vi?",tier:"deep"},{task:"\u6253\u602A\u6389\u94B1\u7684\u51E0\u7387\u597D\u50CF\u592A\u9AD8\u4E86,\u80FD\u4E0D\u80FD\u914D\u7F6E\u5316",tier:"standard"},{task:"\u7535\u91CF\u56FE\u6807\u5728\u5145\u6EE1\u7535\u4E4B\u540E\u6CA1\u6709\u53D8\u7EFF,\u770B\u4E0B",tier:"standard"},{task:"any ideas on how to make undo/redo work across card moves, not just edits?",tier:"deep"},{task:"Getting this on startup after bumping api-version in plugin.yml:\n```\njava.lang.NoSuchMethodError: 'void org.bukkit.entity.Player.sendActionBar(net.md_5.bungee.api.chat.BaseComponent)'\n```\nLooks like a Paper API compat issue, please fix.",tier:"standard"},{task:"is there a way to make the Select component support async options loading?",tier:"deep"},{task:"websocket \u4EE3\u7406\u8001\u662F\u65AD\u8FDE,http \u7684\u6CA1\u95EE\u9898,\u662F\u4E0D\u662F upstream \u7684 timeout \u8BBE\u7F6E\u592A\u77ED\u4E86",tier:"standard"},{task:"OrderController \u7684\u5206\u9875\u63A5\u53E3,pageSize \u4F20\u8D85\u8FC7 1000 \u4F1A\u76F4\u63A5 OOM,\u52A0\u4E2A max pageSize \u6821\u9A8C,\u8D85\u8FC7\u5C31 400,\u987A\u4FBF\u628A error message \u91CC\u90A3\u53E5\u82F1\u6587\u6539\u6210\u4E2D\u6587",tier:"swift"},{task:"\u8BBE\u7F6E\u9762\u677F\u91CC\u52A0\u4E00\u4E2A\u300C\u5F00\u673A\u81EA\u542F\u300D\u7684\u5F00\u5173,\u7528 SMAppService \u90A3\u5957\u65B0 API(macOS 13+),\u72B6\u6001\u5B58\u8FDB UserDefaults \u7684 launchAtLogin \u952E,UI \u7167\u6284\u73B0\u5728\u300C\u663E\u793A\u79D2\u6570\u300D\u90A3\u4E2A toggle \u7684\u6837\u5F0F\u5C31\u884C",tier:"swift"},{task:"\u611F\u89C9\u542F\u52A8\u901F\u5EA6\u53EF\u4EE5\u518D\u5FEB\u70B9,\u8C03\u67E5\u4E00\u4E0B\u74F6\u9888\u5728\u54EA",tier:"deep"},{task:"\u6587\u4EF6\u6811\u6EDA\u52A8\u7684\u65F6\u5019\u611F\u89C9\u5361\u4E00\u4E0B \u80FD\u4E0D\u80FD\u67E5\u4E00\u4E0B\u662F\u4E0D\u662F\u91CD\u7ED8\u7684\u95EE\u9898",tier:"deep"},{task:"health check \u7684 interval \u73B0\u5728\u5199\u6B7B 5s,\u80FD\u4E0D\u80FD\u505A\u6210\u6BCF\u4E2A upstream \u53EF\u914D\u7F6E?",tier:"standard"}]};var JEV_ENDPOINT="https://api.typesafe.ai/v1/systemone",PROMPT_LIMIT=1200,DEFAULT_THRESHOLD=0.5,DEFAULT_TIMEOUT_MS=4000,DEFAULT_MODEL="jev-latest",DEFAULT_KEY_ENV="TYPESAFE_API_KEY";function stringAt2(get,key){let raw=get(key);return typeof raw==="string"&&raw.trim()?raw.trim():void 0}function numberAt(get,key,fallback,min,max){let raw=get(key);if(typeof raw==="string"&&!raw.trim())return fallback;let n=typeof raw==="number"?raw:Number(typeof raw==="string"?raw:Number.NaN);if(!Number.isFinite(n)||n<min||n>max)return fallback;return n}function isLoopback(hostname){let host=hostname.replace(/^\[|\]$/g,"").toLowerCase();return host==="localhost"||host.endsWith(".localhost")||host==="::1"||/^127\.\d+\.\d+\.\d+$/.test(host)}function endpointMode(raw){let url;try{url=new URL(raw)}catch{return{kind:"off"}}if(url.protocol==="https:")return{kind:"url",url:raw};if(url.protocol!=="http:")return{kind:"off"};if(isLoopback(url.hostname))return{kind:"url",url:raw};return{kind:"refused",why:`http:// is only accepted for a loopback address; use https:// for ${url.hostname}`}}function readClassifierConfig(get=getPersistedValue){let raw=stringAt2(get,"autoRouting.classifier")??"off",mode=raw==="jev"?{kind:"jev"}:raw==="off"?{kind:"off"}:endpointMode(raw),keyEnv=mode.kind==="jev"?stringAt2(get,"autoRouting.classifierKeyEnv")??DEFAULT_KEY_ENV:stringAt2(get,"autoRouting.classifierCustomKeyEnv");return{mode,threshold:numberAt(get,"autoRouting.classifierThreshold",DEFAULT_THRESHOLD,0,1),timeoutMs:numberAt(get,"autoRouting.classifierTimeoutMs",DEFAULT_TIMEOUT_MS,200,60000),model:stringAt2(get,"autoRouting.classifierModel")??DEFAULT_MODEL,...keyEnv?{keyEnv}:{}}}var declined=(reason,detail)=>({kind:"declined",reason,...detail?{detail}:{}});async function classifyTier(text,config,deps={}){if(config.mode.kind==="off")return declined("off");if(config.mode.kind==="refused")return declined("refused",config.mode.why);let prompt=text.trim().slice(0,PROMPT_LIMIT);if(!prompt)return declined("blank");let env=deps.env??process.env,key=config.keyEnv?(deps.readSecret??resolveSecret)(config.keyEnv,env):void 0;if(config.mode.kind==="jev"&&!key)return declined("no-key",`no ${config.keyEnv} in the environment or ~/.rove/secrets.json`);let doFetch=deps.fetch??globalThis.fetch,controller=new AbortController,timer=setTimeout(()=>controller.abort(),config.timeoutMs);try{let request=config.mode.kind==="jev"?{url:JEV_ENDPOINT,body:jevRequest(prompt,config.model,deps.rubric??DEFAULT_TIER_RUBRIC)}:{url:config.mode.url,body:{text:prompt}},res=await doFetch(request.url,{method:"POST",headers:{"content-type":"application/json",...key?{authorization:`Bearer ${key}`}:{}},body:JSON.stringify(request.body),signal:controller.signal,redirect:"error"});if(!res.ok)return declined("failed",describeHttpFailure(res));let payload=await res.json(),verdict=config.mode.kind==="jev"?readJevAnswer(payload):readPlainAnswer(payload);if(!verdict.ok)return declined("failed",verdict.why);if(verdict.value.confidence<config.threshold)return declined("low-confidence",`${verdict.value.tier} at ${verdict.value.confidence.toFixed(2)}`);return{kind:"picked",verdict:verdict.value}}catch(err){let why=err instanceof Error&&err.name==="AbortError"?`timed out after ${config.timeoutMs}ms`:String(err);return declined("failed",why)}finally{clearTimeout(timer)}}function describeHttpFailure(res){let status=`HTTP ${res.status}`;if(res.status!==429)return status;let after=res.headers?.get?.("retry-after"),when=after?`, retry-after ${after}`:"";return`${status} \u2014 upstream pool rate limit, not necessarily your quota${when}`}function jevRequest(prompt,model,rubric){return{model,state:{task_text:prompt,labelled_examples:rubric.examples.map((e)=>({task:e.task,tier:e.tier}))},questions:{verdict:{type:"choice",criteria:rubric.criteria,instructions:{role:rubric.role,criterion:rubric.criterion}}}}}var TASK_GROUPS=["waiting-on-you","landing","ready-for-review","working","idle","unknown"];function taskGroupRank(group){return TASK_GROUPS.indexOf(group)}var ERROR_SETTLE_MS=20000,DEAD_SETTLE_MS=60000;function actedOn(task){if(task.status==="done"||task.status==="canceled")return!0;let lifecycle=rollupPr(task)?.lifecycle;return lifecycle==="merged"||lifecycle==="closed"}function autoResumes(task,now){let at=task.quotaResume?.resumeAt;if(!at)return!1;let ms=Date.parse(at);return!Number.isNaN(ms)&&ms>now}function deriveTaskGroup(input){let{task,now}=input,activity=input.activity??null,state=activity?.state,age=activity?Math.max(0,now-activity.at):0;if(task.deletion?.phase==="error")return"waiting-on-you";if(state==="permission_needed")return"waiting-on-you";if(state==="rate_limited"&&!autoResumes(task,now))return"waiting-on-you";if(state==="error"&&age>=ERROR_SETTLE_MS)return"waiting-on-you";if(activity&&!task.report&&age>=DEAD_SETTLE_MS&&(state==="dead"||input.tabAlive===!1))return"waiting-on-you";if(state==="running"&&input.tabAlive!==!1)return"working";if(state==="rate_limited")return"working";let pr=rollupPr(task);if((pr?.lifecycle==="open"||pr?.lifecycle==="ready_to_merge")&&(pr.reviewDecision??"").toUpperCase()==="APPROVED")return"landing";if((task.report!==void 0||state==="turn_complete")&&!actedOn(task))return"ready-for-review";return activity?"idle":"unknown"}function taskGroupOf(input){let group=deriveTaskGroup(input);return{group,rank:taskGroupRank(group)}}
28
- export{classifyScreen,screenErrorLine,liveSourceProtocol,planChatContinuation,planWorktreeHandoff,secretStatus,writeSecret,AUTO_ROUTING_TIERS,isAutoRoutingTier,autoRoutingKey,readAutoRoutingTable,tierBlock,describeTierBlock,readClassifierConfig,classifyTier,taskGroupRank,deriveTaskGroup,taskGroupOf,PER_SESSION,searchTasks,runWorktreeGit,worktreeFilePath,filetypeOf,patchFirstLine,contentFirstLine,isCombinedPathspec,unifiedDiffFiles,isImagePath,loadPreviewData,listFiles,statusFiles,resolveBase,statusFilesBranch};
32
+ export{classifyScreen,screenErrorLine,liveSourceProtocol,planChatContinuation,planWorktreeHandoff,secretStatus,writeSecret,AUTO_ROUTING_TIERS,isAutoRoutingTier,autoRoutingKey,readAutoRoutingTable,tierBlock,describeTierBlock,readClassifierConfig,classifyTier,taskGroupRank,deriveTaskGroup,taskGroupOf,PER_SESSION,searchTasks,runWorktreeGit,worktreeFilePath,filetypeOf,patchFirstLine,contentFirstLine,isCombinedPathspec,unifiedDiffFiles,isImagePath,loadPreviewData,loadFileContent,listFiles,statusFiles,resolveBase,statusFilesBranch};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{readOutdatedCache}from"./chunk-c25vea1q.js";import{hookConfigIssues}from"./chunk-p2cbtrzg.js";import{tightenPluginPermissions}from"./chunk-6hcyvg0m.js";import{engineSkillDir,readSkillCopy}from"./chunk-y7mjhjby.js";import{DEFAULT_PREFIX_CONFIGURATION}from"./chunk-x85rcep5.js";import{AUTO_ROUTING_TIERS}from"./chunk-k2j0tg1h.js";import{reloadPluginEngines}from"./chunk-kdnk8m5j.js";import{ENGINE_ACTIVITY_KINDS}from"./chunk-17e2tgyg.js";import{currentPluginPlatform,loadPluginRegistry,parsePluginManifest,pluginManifestPath,qualifiedActionId,readPluginManifest,savePluginRegistry,supportsPlatform}from"./chunk-n0rdn2fn.js";import{THEME_MODE_PREFERENCES,ensureContrast,inkAtHue,oklchCusp,relativeLuminance,toOklch}from"./chunk-f7egph8g.js";import{expandHome}from"./chunk-3hxm56h6.js";import{pluginConfigDir,pluginLogPath}from"./chunk-j1z9kgyd.js";import{readFirstNonEmptyRepoFile}from"./chunk-catrr0z3.js";import{activityHookAdapters,engineEntry}from"./chunk-4gjvmfa9.js";import{maybeStartScheduledRun,spawnCapture}from"./chunk-2tfnscxk.js";import{recordSpawn}from"./chunk-40dgv828.js";import{readOnlyGitProcessEnv}from"./chunk-6xppe9bj.js";import{tildify}from"./chunk-2r1fgng9.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{loadStateFile}from"./chunk-32j6y5d1.js";import{t}from"./chunk-nqwza8b0.js";import{LOCALES}from"./chunk-ve76p2mx.js";import{createStateCell}from"./chunk-cmp64q4j.js";import{ROVE_HOOK_VERSION}from"./chunk-8qkyd589.js";import{rollupPr}from"./chunk-x1jxxmtc.js";import{OWNER_ONLY_DIR_MODE,OWNER_ONLY_FILE_MODE}from"./chunk-yt15y085.js";import{promptAttachmentsDir}from"./chunk-z1nj22va.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import{pathIdentity,pathSyntax}from"./chunk-pn5ygqn6.js";import{readRoveEnv}from"./chunk-nc46gddg.js";var pluginPageErrorState=createStateCell([],"plugin-page-errors");function pluginPageErrors(){return pluginPageErrorState.get()}var WORKING_BORDER_KEY="appearance.workingBorder",WORKING_BORDERS=["flow","still"],DEFAULT_WORKING_BORDER="flow";function normalizeWorkingBorder(raw){return WORKING_BORDERS.includes(raw)?raw:"flow"}var SCROLLBACK_ROWS_KEY="terminal.scrollbackRows",DEFAULT_SCROLLBACK_ROWS=1000,SCROLLBACK_ROWS_MIN=100,SCROLLBACK_ROWS_MAX=1e5;function normalizeScrollbackRows(value){let n=typeof value==="number"?Math.floor(value):typeof value==="string"?Number.parseInt(value.trim(),10):Number.NaN;if(!Number.isFinite(n))return DEFAULT_SCROLLBACK_ROWS;return Math.min(SCROLLBACK_ROWS_MAX,Math.max(SCROLLBACK_ROWS_MIN,n))}function persistedScrollbackRows(){return normalizeScrollbackRows(loadStateFile()[SCROLLBACK_ROWS_KEY])}function relativeBuckets(absMs){let minutes=Math.floor(absMs/60000),hours=Math.floor(minutes/60);return{minutes,hours,days:Math.floor(hours/24)}}function relativeAge(ms,nowMs=Date.now()){let delta=Math.max(0,nowMs-ms),secs=Math.floor(delta/1000);if(secs<60)return`${secs}s`;let{minutes,hours,days}=relativeBuckets(delta);if(minutes<60)return`${minutes}m`;if(hours<24)return`${hours}h`;return`${days}d`}import{randomBytes}from"crypto";import{existsSync,mkdirSync,writeFileSync}from"fs";import{isAbsolute,join}from"path";var ATTACHMENT_EXTENSION_REGEX=/\.(png|jpe?g|gif|webp|pdf)$/i,PDF_EXTENSION_REGEX=/\.pdf$/i;function removeOuterQuotes(text){if(text.startsWith('"')&&text.endsWith('"')||text.startsWith("'")&&text.endsWith("'"))return text.slice(1,-1);return text}function stripBackslashEscapes(path){let placeholder=`__DOUBLE_BACKSLASH_${randomBytes(8).toString("hex")}__`;return path.replace(/\\\\/g,placeholder).replace(/\\(.)/g,"$1").replaceAll(placeholder,"\\")}function asAttachmentPath(text,exists=existsSync){let cleaned=stripBackslashEscapes(removeOuterQuotes(text.trim()));if(!ATTACHMENT_EXTENSION_REGEX.test(cleaned))return null;if(!isAbsolute(cleaned))return null;return exists(cleaned)?cleaned:null}function asAttachmentPaths(pasted,exists=existsSync){let lines=pasted.split(`
2
+ import{readOutdatedCache}from"./chunk-c25vea1q.js";import{hookConfigIssues}from"./chunk-p2cbtrzg.js";import{tightenPluginPermissions}from"./chunk-6hcyvg0m.js";import{engineSkillDir,readSkillCopy}from"./chunk-0gbg7bg8.js";import{DEFAULT_PREFIX_CONFIGURATION}from"./chunk-bbq6wc47.js";import{AUTO_ROUTING_TIERS}from"./chunk-tgv90744.js";import{reloadPluginEngines}from"./chunk-kdnk8m5j.js";import{ENGINE_ACTIVITY_KINDS}from"./chunk-17e2tgyg.js";import{currentPluginPlatform,loadPluginRegistry,parsePluginManifest,pluginManifestPath,qualifiedActionId,readPluginManifest,savePluginRegistry,supportsPlatform}from"./chunk-n0rdn2fn.js";import{THEME_MODE_PREFERENCES,ensureContrast,inkAtHue,oklchCusp,relativeLuminance,toOklch}from"./chunk-gzkes5bw.js";import{expandHome}from"./chunk-1a57ejnh.js";import{pluginConfigDir,pluginLogPath}from"./chunk-j1z9kgyd.js";import{readFirstNonEmptyRepoFile}from"./chunk-catrr0z3.js";import{activityHookAdapters,engineEntry}from"./chunk-4gjvmfa9.js";import{maybeStartScheduledRun,spawnCapture}from"./chunk-2tfnscxk.js";import{recordSpawn}from"./chunk-40dgv828.js";import{readOnlyGitProcessEnv}from"./chunk-6xppe9bj.js";import{tildify}from"./chunk-2r1fgng9.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{loadStateFile}from"./chunk-32j6y5d1.js";import{t}from"./chunk-a5xbsvx2.js";import{LOCALES}from"./chunk-9vwb9f7q.js";import{createStateCell}from"./chunk-cmp64q4j.js";import{ROVE_HOOK_VERSION}from"./chunk-8qkyd589.js";import{rollupPr}from"./chunk-x1jxxmtc.js";import{OWNER_ONLY_DIR_MODE,OWNER_ONLY_FILE_MODE}from"./chunk-yt15y085.js";import{promptAttachmentsDir}from"./chunk-z1nj22va.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import{pathIdentity,pathSyntax}from"./chunk-pn5ygqn6.js";import{readRoveEnv}from"./chunk-nc46gddg.js";var pluginPageErrorState=createStateCell([],"plugin-page-errors");function pluginPageErrors(){return pluginPageErrorState.get()}var WORKING_BORDER_KEY="appearance.workingBorder",WORKING_BORDERS=["flow","still"],DEFAULT_WORKING_BORDER="flow";function normalizeWorkingBorder(raw){return WORKING_BORDERS.includes(raw)?raw:"flow"}var SCROLLBACK_ROWS_KEY="terminal.scrollbackRows",DEFAULT_SCROLLBACK_ROWS=1000,SCROLLBACK_ROWS_MIN=100,SCROLLBACK_ROWS_MAX=1e5;function normalizeScrollbackRows(value){let n=typeof value==="number"?Math.floor(value):typeof value==="string"?Number.parseInt(value.trim(),10):Number.NaN;if(!Number.isFinite(n))return DEFAULT_SCROLLBACK_ROWS;return Math.min(SCROLLBACK_ROWS_MAX,Math.max(SCROLLBACK_ROWS_MIN,n))}function persistedScrollbackRows(){return normalizeScrollbackRows(loadStateFile()[SCROLLBACK_ROWS_KEY])}function relativeBuckets(absMs){let minutes=Math.floor(absMs/60000),hours=Math.floor(minutes/60);return{minutes,hours,days:Math.floor(hours/24)}}function relativeAge(ms,nowMs=Date.now()){let delta=Math.max(0,nowMs-ms),secs=Math.floor(delta/1000);if(secs<60)return`${secs}s`;let{minutes,hours,days}=relativeBuckets(delta);if(minutes<60)return`${minutes}m`;if(hours<24)return`${hours}h`;return`${days}d`}import{randomBytes}from"crypto";import{existsSync,mkdirSync,writeFileSync}from"fs";import{isAbsolute,join}from"path";var ATTACHMENT_EXTENSION_REGEX=/\.(png|jpe?g|gif|webp|pdf)$/i,PDF_EXTENSION_REGEX=/\.pdf$/i;function removeOuterQuotes(text){if(text.startsWith('"')&&text.endsWith('"')||text.startsWith("'")&&text.endsWith("'"))return text.slice(1,-1);return text}function stripBackslashEscapes(path){let placeholder=`__DOUBLE_BACKSLASH_${randomBytes(8).toString("hex")}__`;return path.replace(/\\\\/g,placeholder).replace(/\\(.)/g,"$1").replaceAll(placeholder,"\\")}function asAttachmentPath(text,exists=existsSync){let cleaned=stripBackslashEscapes(removeOuterQuotes(text.trim()));if(!ATTACHMENT_EXTENSION_REGEX.test(cleaned))return null;if(!isAbsolute(cleaned))return null;return exists(cleaned)?cleaned:null}function asAttachmentPaths(pasted,exists=existsSync){let lines=pasted.split(`
3
3
  `).map((l)=>l.trim()).filter((l)=>l.length>0);if(lines.length===0)return null;let paths=[];for(let line of lines){let p=asAttachmentPath(line,exists);if(!p)return null;paths.push(p)}return paths}function attachmentLabel(path,index){return PDF_EXTENSION_REGEX.test(path)?`pdf[${index}]`:`images[${index}]`}function appendAttachmentRefs(prompt,attachments){if(attachments.length===0)return prompt;let refs=attachments.map((p,i)=>`${attachmentLabel(p,i)}: ${p}`).join(`
4
4
  `);return`${prompt}
5
5
 
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{PLUGIN_MANIFEST_FILENAMES,currentPluginPlatform,loadPluginRegistry,parsePluginManifest,pluginManifestPath,savePluginRegistry,supportsPlatform,upsertPluginEntry}from"./chunk-n0rdn2fn.js";import{pluginCheckoutDir,pluginConfigDir,pluginStateDir,pluginsRootDir}from"./chunk-j1z9kgyd.js";import{CURRENT_VERSION,compareSemver}from"./chunk-2wrt80ft.js";import{spawn}from"child_process";import{cpSync,existsSync,mkdirSync,readFileSync,renameSync,rmSync}from"fs";import{mkdtempSync}from"fs";import{basename,join,resolve}from"path";import{createInterface}from"readline/promises";var GITHUB_SPEC_RE=/^([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)(\/.+)?$/;class PluginCliError extends Error{}function fail(message){throw new PluginCliError(message)}function readManifestAt(root){let path=pluginManifestPath(root);if(!path)fail(`no ${PLUGIN_MANIFEST_FILENAMES.join(" or ")} found at ${root}`);let source=readFileSync(path,"utf8");return{...parsePluginManifest(source,basename(path)),manifestPath:path,manifestSource:source}}function checkVersionGate(parsed){let min=parsed.manifest.minRoveVersion;if(compareSemver(CURRENT_VERSION,min)<0)fail(`plugin requires Rove >= ${min} (this is ${CURRENT_VERSION}); update Rove first`)}function commandLines(parsed){let m=parsed.manifest,lines=[];for(let c of m.build)lines.push(`build: ${c.command.join(" ")}`);for(let c of m.startup)lines.push(`startup: ${c.command.join(" ")}`);for(let a of m.actions)lines.push(`action ${a.id}: ${a.command.join(" ")}`);for(let e of m.events)lines.push(`on ${e.on}: ${e.command.join(" ")}`);return lines}var CAPTURE_TAIL_BYTES=4096;function run(cmd,args,opts){return new Promise((resolve2)=>{let child=spawn(cmd,args,{cwd:opts.cwd,stdio:opts.inherit?["ignore","inherit","inherit"]:["ignore","pipe","pipe"]}),output="",collect=(chunk)=>{output=`${output}${String(chunk)}`.slice(-CAPTURE_TAIL_BYTES)};child.stdout?.on("data",collect),child.stderr?.on("data",collect),child.on("error",(err)=>resolve2({code:null,output:`${output}${err.message}`})),child.on("close",(code)=>resolve2({code,output}))})}function outputTail(output){let trimmed=output.trim();return trimmed?`: ${trimmed.split(`
2
+ import{PLUGIN_MANIFEST_FILENAMES,currentPluginPlatform,loadPluginRegistry,parsePluginManifest,pluginManifestPath,savePluginRegistry,supportsPlatform,upsertPluginEntry}from"./chunk-n0rdn2fn.js";import{pluginCheckoutDir,pluginConfigDir,pluginStateDir,pluginsRootDir}from"./chunk-j1z9kgyd.js";import{CURRENT_VERSION,compareSemver}from"./chunk-yn01fet6.js";import{spawn}from"child_process";import{cpSync,existsSync,mkdirSync,readFileSync,renameSync,rmSync}from"fs";import{mkdtempSync}from"fs";import{basename,join,resolve}from"path";import{createInterface}from"readline/promises";var GITHUB_SPEC_RE=/^([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)(\/.+)?$/;class PluginCliError extends Error{}function fail(message){throw new PluginCliError(message)}function readManifestAt(root){let path=pluginManifestPath(root);if(!path)fail(`no ${PLUGIN_MANIFEST_FILENAMES.join(" or ")} found at ${root}`);let source=readFileSync(path,"utf8");return{...parsePluginManifest(source,basename(path)),manifestPath:path,manifestSource:source}}function checkVersionGate(parsed){let min=parsed.manifest.minRoveVersion;if(compareSemver(CURRENT_VERSION,min)<0)fail(`plugin requires Rove >= ${min} (this is ${CURRENT_VERSION}); update Rove first`)}function commandLines(parsed){let m=parsed.manifest,lines=[];for(let c of m.build)lines.push(`build: ${c.command.join(" ")}`);for(let c of m.startup)lines.push(`startup: ${c.command.join(" ")}`);for(let a of m.actions)lines.push(`action ${a.id}: ${a.command.join(" ")}`);for(let e of m.events)lines.push(`on ${e.on}: ${e.command.join(" ")}`);return lines}var CAPTURE_TAIL_BYTES=4096;function run(cmd,args,opts){return new Promise((resolve2)=>{let child=spawn(cmd,args,{cwd:opts.cwd,stdio:opts.inherit?["ignore","inherit","inherit"]:["ignore","pipe","pipe"]}),output="",collect=(chunk)=>{output=`${output}${String(chunk)}`.slice(-CAPTURE_TAIL_BYTES)};child.stdout?.on("data",collect),child.stderr?.on("data",collect),child.on("error",(err)=>resolve2({code:null,output:`${output}${err.message}`})),child.on("close",(code)=>resolve2({code,output}))})}function outputTail(output){let trimmed=output.trim();return trimmed?`: ${trimmed.split(`
3
3
  `).slice(-3).join(" / ")}`:""}async function git(args,opts){let{code,output}=await run("git",args,opts);if(code!==0)fail(`git ${args[0]} failed${outputTail(output)}`)}async function runBuildCommands(parsed,root,opts){let platform=currentPluginPlatform();for(let[i,step]of parsed.manifest.build.entries()){if(!supportsPlatform(step,parsed.manifest,platform))continue;let[cmd,...args]=step.command;if(opts.inherit)console.log(`build[${i}]: ${step.command.join(" ")}`);let{code,output}=await run(cmd,args,{cwd:root,inherit:opts.inherit});if(code!==0)fail(`build[${i}] failed (exit ${code??"spawn error"}); plugin not registered${outputTail(output)}`)}}function makeStagingDir(){let root=pluginsRootDir();return mkdirSync(root,{recursive:!0}),mkdtempSync(join(root,".staging-"))}function movePluginTree(from,to){try{renameSync(from,to)}catch(err){if(err.code!=="EXDEV")throw err;cpSync(from,to,{recursive:!0,verbatimSymlinks:!0}),rmSync(from,{recursive:!0,force:!0})}}function register(entry){savePluginRegistry(upsertPluginEntry(loadPluginRegistry(),entry)),mkdirSync(pluginConfigDir(entry.id),{recursive:!0,mode:448}),mkdirSync(pluginStateDir(entry.id),{recursive:!0,mode:448})}async function preparePluginInstall(spec,opts={}){let match=spec.match(GITHUB_SPEC_RE);if(!match)fail(`install takes GitHub shorthand (owner/repo[/subdir]), got \`${spec}\``);let[,owner,repo,subdirRaw]=match,subdir=subdirRaw?.replace(/^\//,""),inherit=opts.inherit??!1,tmp=makeStagingDir();try{let url=`https://github.com/${owner}/${repo}.git`;if(inherit)console.log(`cloning ${url}${opts.ref?` @ ${opts.ref}`:""}`);if(opts.ref)await git(["clone","--quiet",url,tmp],{inherit}),await git(["checkout","--quiet",opts.ref],{cwd:tmp,inherit});else await git(["clone","--quiet","--depth","1",url,tmp],{inherit});let rootInClone=subdir?join(tmp,subdir):tmp,parsed=readManifestAt(rootInClone);checkVersionGate(parsed);let id=parsed.manifest.id,existing=loadPluginRegistry().plugins.find((p)=>p.id===id);if(existing?.source.kind==="link")fail(`\`${id}\` is locally linked at ${existing.root}; unlink it first`);if(!supportsPlatform({},parsed.manifest,currentPluginPlatform()))fail(`plugin declares platforms [${parsed.manifest.platforms?.join(", ")}]; this machine is unsupported`);return{preview:{id,name:parsed.manifest.name,version:parsed.manifest.version,description:parsed.manifest.description??null,source:`github.com/${owner}/${repo}${subdir?`/${subdir}`:""}`,commands:commandLines(parsed),warnings:parsed.warnings},commit:async()=>{try{await runBuildCommands(parsed,rootInClone,{inherit});let manifestPath=pluginManifestPath(rootInClone);if(!manifestPath)fail("manifest disappeared during build; aborting");if(manifestPath!==parsed.manifestPath)fail("manifest changed during build; aborting");if(readFileSync(manifestPath,"utf8")!==parsed.manifestSource)fail("manifest changed during build; aborting");let checkout=pluginCheckoutDir(id);return rmSync(checkout,{recursive:!0,force:!0}),mkdirSync(join(checkout,".."),{recursive:!0}),movePluginTree(tmp,checkout),register({id,source:{kind:"github",spec},root:subdir?join(checkout,subdir):checkout,enabled:!0,version:parsed.manifest.version,installedAt:Date.now()}),id}finally{rmSync(tmp,{recursive:!0,force:!0})}},discard:()=>rmSync(tmp,{recursive:!0,force:!0})}}catch(err){throw rmSync(tmp,{recursive:!0,force:!0}),err}}function printPreview(preview){console.log(`
4
4
  ${preview.name} (${preview.id}) v${preview.version} \u2014 ${preview.description??"no description"}`),console.log(`source: ${preview.source}`);for(let line of preview.commands)console.log(` ${line}`);for(let w of preview.warnings)console.log(` warning: ${w}`);console.log("")}async function confirmOrBail(yes){if(yes)return;if(!process.stdin.isTTY)fail("refusing to install without confirmation in a non-interactive terminal; pass --yes");let rl=createInterface({input:process.stdin,output:process.stdout}),answer=(await rl.question("Install this plugin and run its build commands? [y/N] ")).trim().toLowerCase();if(rl.close(),answer!=="y"&&answer!=="yes")fail("aborted")}async function installPlugin(spec,opts){let prepared=await preparePluginInstall(spec,{ref:opts.ref,inherit:!0});printPreview(prepared.preview);try{await confirmOrBail(opts.yes)}catch(err){throw prepared.discard(),err}let id=await prepared.commit();return console.log(`installed ${id} v${prepared.preview.version}`),id}function linkPlugin(dir){let root=resolve(dir);if(!existsSync(root))fail(`no such directory: ${root}`);let parsed=readManifestAt(root);checkVersionGate(parsed);let id=parsed.manifest.id;if(loadPluginRegistry().plugins.find((p)=>p.id===id)?.source.kind==="github")fail(`\`${id}\` is installed from GitHub; uninstall it before linking a local copy`);for(let w of parsed.warnings)console.log(`warning: ${w}`);if(!supportsPlatform({},parsed.manifest,currentPluginPlatform()))console.log(`warning: declares platforms [${parsed.manifest.platforms?.join(", ")}]; nothing will run on this machine`);register({id,source:{kind:"link"},root,enabled:!0,version:parsed.manifest.version,installedAt:Date.now()}),console.log(`linked ${id} v${parsed.manifest.version} \u2192 ${root}`)}
5
5
  export{PluginCliError,preparePluginInstall,installPlugin,linkPlugin};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{MachineHub}from"./chunk-rvjnafyt.js";import"./chunk-j54c5a0a.js";import"./chunk-6xr1prk6.js";import"./chunk-atn06ncf.js";import"./chunk-vytrhm50.js";import"./chunk-sq6zj3fb.js";import"./chunk-y1xnjx8x.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-0r1jf8m9.js";import"./chunk-t7j8g9f6.js";import"./chunk-dmzg9zdc.js";import"./chunk-40dgv828.js";import"./chunk-6xppe9bj.js";import"./chunk-2wrt80ft.js";import"./chunk-32j6y5d1.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7kysxgbq.js";import"./chunk-xy8be792.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";var PUBLISH_DEBOUNCE_MS=50;function startDaemonMachineHub(bus){let hub=new MachineHub,timer=null,publish=()=>{timer=null;let live=hub.liveSignal().get(),payload={machines:hub.machinesSignal().get(),tasks:hub.tasksSignal().get().map((task)=>({...task,kind:task.kind??"task",pinned:task.pinned??!1})),live:{activity:Object.fromEntries(live.activity),changes:Object.fromEntries(live.changes),tokens:Object.fromEntries(live.tokens)}};bus.publish("machines",payload)},schedule=()=>{timer??=setTimeout(publish,PUBLISH_DEBOUNCE_MS)},stops=[hub.machinesSignal(),hub.tasksSignal(),hub.liveSignal()].map((signal)=>signal.subscribe(schedule)),lastRegistry=null,offState=bus.onPublish((event)=>{if(event.channel!=="state")return;let state=event.payload.state,text=JSON.stringify(state.machines??null);if(text===lastRegistry)return;lastRegistry=text,hub.sync()});return hub.sync(),publish(),()=>{offState();for(let stop of stops)stop();if(timer)clearTimeout(timer);hub.dispose(),bus.publish("machines",{machines:[],tasks:[],live:{activity:{},changes:{},tokens:{}}})}}export{startDaemonMachineHub};
2
+ import{MachineHub}from"./chunk-cx78tyg1.js";import"./chunk-3m0ydze9.js";import"./chunk-6xr1prk6.js";import"./chunk-atn06ncf.js";import"./chunk-vytrhm50.js";import"./chunk-sq6zj3fb.js";import"./chunk-y1xnjx8x.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-0r1jf8m9.js";import"./chunk-t7j8g9f6.js";import"./chunk-dmzg9zdc.js";import"./chunk-40dgv828.js";import"./chunk-6xppe9bj.js";import"./chunk-yn01fet6.js";import"./chunk-32j6y5d1.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7kysxgbq.js";import"./chunk-xy8be792.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";var PUBLISH_DEBOUNCE_MS=50;function startDaemonMachineHub(bus){let hub=new MachineHub,timer=null,publish=()=>{timer=null;let live=hub.liveSignal().get(),payload={machines:hub.machinesSignal().get(),tasks:hub.tasksSignal().get().map((task)=>({...task,kind:task.kind??"task",pinned:task.pinned??!1})),live:{activity:Object.fromEntries(live.activity),changes:Object.fromEntries(live.changes),tokens:Object.fromEntries(live.tokens)}};bus.publish("machines",payload)},schedule=()=>{timer??=setTimeout(publish,PUBLISH_DEBOUNCE_MS)},stops=[hub.machinesSignal(),hub.tasksSignal(),hub.liveSignal()].map((signal)=>signal.subscribe(schedule)),lastRegistry=null,offState=bus.onPublish((event)=>{if(event.channel!=="state")return;let state=event.payload.state,text=JSON.stringify(state.machines??null);if(text===lastRegistry)return;lastRegistry=text,hub.sync()});return hub.sync(),publish(),()=>{offState();for(let stop of stops)stop();if(timer)clearTimeout(timer);hub.dispose(),bus.publish("machines",{machines:[],tasks:[],live:{activity:{},changes:{},tokens:{}}})}}export{startDaemonMachineHub};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{ensurePtyHostReachable}from"./chunk-z43e08kw.js";import{DEFAULT_TERMINAL_COLORS,parseTerminalDefaultColors}from"./chunk-mqfvzdpr.js";import{BUNDLED_THEMES,DEFAULT_THEME,readPersistedUiPrefs}from"./chunk-gzkes5bw.js";import{resolveThemeSlotHex}from"./chunk-8ng1756g.js";import{loadUserThemes}from"./chunk-kxp04jnp.js";import{ENGINE_EXIT_BANNER,REPO_INIT_TIMEOUT_SECONDS,initMarkerSaysFinished}from"./chunk-qecygh3f.js";import{aliasKey,isUnderKey,unclaimedSessions}from"./chunk-g9ba25q5.js";import{engineProcessIn,foregroundEngineIn,parsePsSnapshot,psSnapshot}from"./chunk-5rgrde6b.js";import{engineEntry}from"./chunk-4gjvmfa9.js";import{terminalRows}from"./chunk-etfh8f4z.js";import{RoveDaemonClient}from"./chunk-qzzmd63x.js";import{BUILTIN_VENDORS}from"./chunk-h2m7em1e.js";import{LockfileError,acquire,release}from"./chunk-bejhca6z.js";import{defaultDeliveryLockDir,defaultPtyHostSocketPath}from"./chunk-eqdbfgq5.js";function terminalDefaultColorsForTheme(theme,mode="dark"){return parseTerminalDefaultColors({foreground:resolveThemeSlotHex(theme,"text",mode),background:resolveThemeSlotHex(theme,"background",mode)})??DEFAULT_TERMINAL_COLORS}function readPersistedTerminalDefaultColors(){let themes={...BUNDLED_THEMES};for(let{name,theme}of loadUserThemes())themes[name]=theme;let prefs=readPersistedUiPrefs(DEFAULT_THEME,(name)=>Boolean(themes[name])),selected=themes[prefs.theme]??themes[DEFAULT_THEME];return selected?terminalDefaultColorsForTheme(selected,prefs.themeMode==="light"?"light":"dark"):DEFAULT_TERMINAL_COLORS}async function enginePresence(pid,extraLaunch,snapshot=psSnapshot){if(!pid)return{kind:"none"};try{let rows=parsePsSnapshot(await snapshot([pid])),engine=foregroundEngineIn(rows,pid);if(engine)return{kind:"engine",vendor:engine.vendor};return engineProcessIn(rows,pid,extraLaunch)?{kind:"engine",vendor:null}:{kind:"none"}}catch{return{kind:"unknown"}}}import{basename}from"path";import path from"path";var DELIVERY_LOCK_TIMEOUT_MS=5000,DELIVERY_LOCK_RETRY_MS=20;function lockFileName(key){return`${key.replace(/[^A-Za-z0-9._-]/g,"_")}.lock`}function deliveryLockPath(key,lockDir=defaultDeliveryLockDir()){return path.join(lockDir,lockFileName(key))}var sleep=(ms)=>new Promise((resolve)=>setTimeout(resolve,ms));async function withDeliveryLock(key,fn,opts={}){let lockPath=deliveryLockPath(key,opts.lockDir??defaultDeliveryLockDir()),deadline=Date.now()+(opts.timeoutMs??DELIVERY_LOCK_TIMEOUT_MS),token=null;for(;;)try{token=await acquire(lockPath);break}catch(err){if(!(err instanceof LockfileError))break;if(Date.now()>=deadline)break;await sleep(DELIVERY_LOCK_RETRY_MS)}try{return await fn()}finally{if(token!==null)await release(lockPath,token).catch(()=>{})}}var PASTE_READY_TIMEOUT_MS=15000,PASTE_READY_POLL_MS=100;function bracketedPasteActive(output){let on=output.lastIndexOf("\x1B[?2004h");if(on===-1)return!1;return on>output.lastIndexOf("\x1B[?2004l")}function encodePaste(prompt,bracketed){return bracketed?`\x1B[200~${prompt}\x1B[201~`:prompt}async function connectHostedSessionClient(socketPath){let client=new RoveDaemonClient(socketPath);try{await client.connect()}catch(error){throw client.close(),error}return{rpc:client,close:()=>client.close()}}async function openHostedSessionHost(){try{return await connectHostedSessionClient(defaultPtyHostSocketPath())}catch{return null}}async function ensureHostedSessionHost(){return connectHostedSessionClient(await ensurePtyHostReachable())}async function listHostedSessionsOrNull(rpc){try{let{sessions}=await rpc.request("pty.list",{});return sessions??[]}catch{return null}}async function listHostedSessions(rpc){return await listHostedSessionsOrNull(rpc)??[]}function isHostedTaskKey(key,taskId){return(key.split("::")[0]??key)===taskId}function hostedTaskKeys(sessions,taskId,scope){return sessions.filter((session)=>isHostedTaskKey(session.key,taskId)&&!scope?.spare.some((base)=>isUnderKey(session.key,base))||(scope?.also.some((base)=>isUnderKey(session.key,base))??!1)).map((session)=>session.key)}async function killHostedSessions(rpc,keys,opts){let payload=opts?.wait===!0?{wait:!0}:{};await Promise.all(keys.map((key)=>rpc.request("pty.kill",{key,...payload}).catch(()=>{})))}function commandHasEngineWord(command,engineBin){for(let part of command)for(let token of part.split(/\s+/)){let bare=token.replace(/^['"]+|['"]+$/g,"");if(bare&&basename(bare)===engineBin)return!0}return!1}function builtinEngineBins(){return BUILTIN_VENDORS.flatMap((vendor)=>{let entry=engineEntry(vendor);return[entry.defaultCommand[0],...entry.processNames??[]]}).filter((bin)=>Boolean(bin))}function sessionArgvNamesEngine(command,engineBin){if(!command||command.length===0)return!1;if(engineBin&&commandHasEngineWord(command,engineBin))return!0;return builtinEngineBins().some((bin)=>commandHasEngineWord(command,bin))}function tabOrder(key){let n=Number(/tab-(\d+)$/.exec(key)?.[1]);return Number.isFinite(n)?n:Number.POSITIVE_INFINITY}function findHostedEngineKey(sessions,taskId,engineBin,scope){if(scope?.alias){let key=aliasKey(scope.alias);if(sessions.some((s)=>s.alive&&s.key===key))return key}let mine=unclaimedSessions(sessions,scope).filter((s)=>s.alive&&isHostedTaskKey(s.key,taskId)).sort((a,b)=>tabOrder(a.key)-tabOrder(b.key)),tab1=mine.find((s)=>s.key===`${taskId}::tab-1`);if(tab1)return tab1.key;if(engineBin){let byCommand=mine.find((s)=>commandHasEngineWord(s.command,engineBin));if(byCommand)return byCommand.key}return mine.find((s)=>sessionArgvNamesEngine(s.command))?.key??null}var SUBMIT_DELAY_MS=150,CONFIRM_TAIL_CHARS=24,CONFIRM_TIMEOUT_MS=2000,CONFIRM_POLL_MS=100;function flatten(text){return text.replace(/\s+/g," ")}async function confirmPromptLanded(rpc,key,prompt,sinceOffset){let tail=flatten(prompt).trim().slice(-CONFIRM_TAIL_CHARS);if(tail.length===0)return!1;let deadline=Date.now()+CONFIRM_TIMEOUT_MS;for(;;){let peek=await rpc.request("pty.peek",{key,sinceOffset});if(!peek.alive)return!1;if(flatten(Buffer.from(peek.data,"base64").toString("utf8")).includes(tail))return!0;if(Date.now()>=deadline)return!1;await new Promise((resolve)=>setTimeout(resolve,CONFIRM_POLL_MS))}}async function writeAndConfirm(rpc,key,prompt,sinceOffset,opts){let ready=await awaitPasteReady(rpc,key,{timeoutMs:opts?.pasteReadyTimeoutMs}),{bytes}=await writeHostedPrompt(rpc,key,prompt,{ready,vendor:opts?.vendor}),confirmed=await confirmPromptLanded(rpc,key,prompt,sinceOffset);return{bytes,ready,confirmed}}async function writeHostedPromptIfLive(rpc,key,prompt,opts){let peek=await rpc.request("pty.peek",{key});if(!peek.alive)return null;return writeAndConfirm(rpc,key,prompt,peek.offset,opts)}async function awaitPasteReady(rpc,key,opts={}){let sleep2=opts.sleep??((ms)=>new Promise((resolve)=>setTimeout(resolve,ms))),deadline=Date.now()+(opts.timeoutMs??PASTE_READY_TIMEOUT_MS);for(;;){let peek=await rpc.request("pty.peek",{key});if(!peek.alive)return!1;if(bracketedPasteActive(Buffer.from(peek.data,"base64").toString("latin1")))return!0;if(Date.now()>=deadline)return!1;await sleep2(PASTE_READY_POLL_MS)}}async function writeHostedPrompt(rpc,key,prompt,opts){let bracketed=opts?.ready??await awaitPasteReady(rpc,key),capabilities=opts?.vendor?engineEntry(opts.vendor).capabilities:void 0,prepared=capabilities?.preparePromptSubmission?.(prompt),data=encodePaste(prepared??prompt,bracketed);return await withDeliveryLock(key,async()=>{await rpc.request("pty.write",{key,data}),await new Promise((resolve)=>setTimeout(resolve,SUBMIT_DELAY_MS)),await rpc.request("pty.write",{key,data:`${capabilities?.beforePromptSubmit??""}\r`})}),{bytes:Buffer.byteLength(data,"utf8")}}var deliverToHostedKey=writeHostedPromptIfLive;async function ensureHostedEngine(rpc,cwd,launch,defaultColors=readPersistedTerminalDefaultColors()){let result=await rpc.request("pty.open",{key:launch.key,cwd,command:launch.command,defaultColors});return await rpc.request("pty.detach",{key:launch.key}).catch(()=>{}),result}var FIRST_MESSAGE_ENGINE_TIMEOUT_MS=20000,FIRST_MESSAGE_POLL_INTERVAL_MS=500,FIRST_MESSAGE_SETTLE_MS=1500;async function awaitEngineProcess(rpc,key,engineBin,opts={}){let sleep2=opts.sleep??((ms)=>new Promise((resolve)=>setTimeout(resolve,ms))),snapshot=opts.snapshot;if(opts.initMarkerPath){let initDeadline=Date.now()+(opts.initTimeoutMs??REPO_INIT_TIMEOUT_SECONDS*1000);while(Date.now()<initDeadline){let{sessions=[]}=await rpc.request("pty.list",{});if(!sessions.find((s)=>s.key===key)?.alive)return null;if(initMarkerSaysFinished(opts.initMarkerPath))break;await sleep2(opts.intervalMs??FIRST_MESSAGE_POLL_INTERVAL_MS)}}let deadline=Date.now()+(opts.timeoutMs??FIRST_MESSAGE_ENGINE_TIMEOUT_MS);while(Date.now()<deadline){let{sessions=[]}=await rpc.request("pty.list",{}),session=sessions.find((s)=>s.key===key);if(!session?.alive)return null;if(session.pid){let presence=await enginePresence(session.pid,engineBin,snapshot);if(presence.kind==="engine")return{pid:session.pid,vendor:presence.vendor}}await sleep2(opts.intervalMs??FIRST_MESSAGE_POLL_INTERVAL_MS)}return null}async function hostedSessionFailureLine(rpc,key,limit=200){try{let peek=await rpc.request("pty.peek",{key}),lines=terminalRows(Buffer.from(peek.data,"base64").toString("utf8")).map((row)=>row.trim()).filter((row)=>row.length>0),line=lines.findLast((row)=>ENGINE_EXIT_BANNER.test(row))??lines.at(-1);return line===void 0?void 0:line.slice(0,limit)}catch{return}}async function pastePromptWhenEngineUp(rpc,key,engineBin,prompt,opts={}){let sleep2=opts.sleep??((ms)=>new Promise((resolve)=>setTimeout(resolve,ms))),engine=await awaitEngineProcess(rpc,key,engineBin,opts);if(engine!==null){if(!await awaitPasteReady(rpc,key,{timeoutMs:opts.pasteReadyTimeoutMs,sleep:sleep2}))await sleep2(opts.settleMs??FIRST_MESSAGE_SETTLE_MS);return await writeHostedPromptIfLive(rpc,key,prompt,{...opts,vendor:engine.vendor})}return null}
3
+ export{readPersistedTerminalDefaultColors,withDeliveryLock,enginePresence,awaitEngineProcess,hostedSessionFailureLine,pastePromptWhenEngineUp,openHostedSessionHost,ensureHostedSessionHost,listHostedSessionsOrNull,listHostedSessions,isHostedTaskKey,hostedTaskKeys,killHostedSessions,sessionArgvNamesEngine,findHostedEngineKey,deliverToHostedKey,ensureHostedEngine};
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{resolveLoginShell}from"./chunk-tn9gtf18.js";import{recommendedGlobalInstallCommand}from"./chunk-2wrt80ft.js";function updaterShell(deps={}){let platform=deps.platform??process.platform;if(platform!=="win32")return"sh";return resolveLoginShell({fallback:"/bin/sh",platform,env:deps.env,exists:deps.exists})}function updaterShellFailureHint(deps={}){if((deps.platform??process.platform)!=="win32")return null;return["The update script is POSIX shell. Rove runs it through Git for Windows'","bash \u2014 the same shell every engine and terminal tab launches through.","Install Git for Windows (https://git-scm.com/download/win), or update","by hand:",` ${recommendedGlobalInstallCommand()}`,""].join(`
2
+ import{resolveLoginShell}from"./chunk-tn9gtf18.js";import{recommendedGlobalInstallCommand}from"./chunk-yn01fet6.js";function updaterShell(deps={}){let platform=deps.platform??process.platform;if(platform!=="win32")return"sh";return resolveLoginShell({fallback:"/bin/sh",platform,env:deps.env,exists:deps.exists})}function updaterShellFailureHint(deps={}){if((deps.platform??process.platform)!=="win32")return null;return["The update script is POSIX shell. Rove runs it through Git for Windows'","bash \u2014 the same shell every engine and terminal tab launches through.","Install Git for Windows (https://git-scm.com/download/win), or update","by hand:",` ${recommendedGlobalInstallCommand()}`,""].join(`
3
3
  `)}
4
4
  export{updaterShell,updaterShellFailureHint};
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{awaitEngineProcess,deliverToHostedKey,enginePresence,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,isHostedTaskKey,killHostedSessions,listHostedSessions,listHostedSessionsOrNull,openHostedSessionHost,pastePromptWhenEngineUp,readPersistedTerminalDefaultColors,sessionArgvNamesEngine}from"./chunk-nv8eyjep.js";import{engineTabArgv,readTabsSnapshot}from"./chunk-3hxm56h6.js";import{buildEngineSessionLaunch,initMarkerSaysFinished}from"./chunk-qecygh3f.js";import{engineLaunchArgv}from"./chunk-rjq38twt.js";import{ApiError}from"./chunk-r5j8fycq.js";import{engineProcessIn,parsePsSnapshot,psSnapshot,vendorFromArgv}from"./chunk-5rgrde6b.js";import{basename}from"path";async function countLiveEngineSessions(sessions,snapshot=psSnapshot){let tabs=sessions.filter((s)=>s.alive&&s.key.split("::").length===2);if(!tabs.length)return 0;let rows;try{if(rows=parsePsSnapshot(await snapshot(tabs.flatMap((s)=>s.pid?[s.pid]:[]))),!rows.length)return tabs.length}catch{return tabs.length}return tabs.filter((s)=>{if(!s.pid)return!0;let root=rows.find((row)=>row.pid===s.pid);if(!root)return!0;if(engineProcessIn(rows,s.pid)||vendorFromArgv(root.args))return!0;let[taskId,tabId]=s.key.split("::"),labelled=readTabsSnapshot(taskId)?.tabs.some((tab)=>tab.id===tabId&&tab.kind==="engine");if(tabId!=="tab-1"&&!labelled&&!sessionArgvNamesEngine(s.command))return!1;let executable=basename(root.args.split(/\s+/)[0]).toLowerCase().replace(/^-/,"").replace(/\.exe$/,"");if(["sh","bash","zsh","fish","dash","ash","ksh","mksh"].includes(executable))return/^\S+\s+-[a-zA-Z]*c\b/.test(root.args);return!0}).length}async function openAdmittedEngine(rpc,spec,opts){let limit=opts.maxLiveEngines;if(limit===void 0)return rpc.request("pty.open",spec);for(let attempt=0;attempt<20;attempt++){let{sessions,admissionToken}=await rpc.request("pty.list",{});if(typeof admissionToken!=="string")throw new ApiError("the PTY host must be updated before enforcing engine.maxLiveSessions","ENGINE_ADMISSION_UNAVAILABLE",{taskId:opts.taskId,hint:"the running PTY host predates atomic admission; update and restart the PTY host before retrying",nextCommandArgs:opts.retryArgs});let live=await countLiveEngineSessions(sessions,opts.snapshot);if(!sessions.some((s)=>s.key===spec.key&&s.alive)&&live>=limit)throw new ApiError(`${live} engine sessions are already running (engine.maxLiveSessions is ${limit})`,"ENGINE_LIMIT",{taskId:opts.taskId,live,limit,hint:"wait for an engine to finish or close a tab, then retry; raise engine.maxLiveSessions in state.json to allow more",nextCommandArgs:opts.retryArgs});let result=await rpc.request("pty.openChecked",{...spec,admissionToken});if(result.kind==="opened")return result.open}throw new ApiError("PTY inventory kept changing during engine admission; retry the send","ENGINE_ADMISSION_BUSY",{taskId:opts.taskId,nextCommandArgs:opts.retryArgs})}function restoredTabsOf(sessions,taskId,exceptKey){let prefix=`${taskId}::`,ids=[];for(let s of sessions){if(s.alive||s.restored!==!0||s.key===exceptKey||!s.key.startsWith(prefix))continue;let tab=s.key.slice(prefix.length);if(tab.includes("::"))continue;if(!ids.includes(tab))ids.push(tab)}let tabs=readTabsSnapshot(taskId)?.tabs??[];return ids.map((tab)=>{let sessionId=tabs.find((t)=>t.id===tab)?.sessionId;return sessionId?{tab,sessionId}:{tab}})}function tabEngineBase(task,tab){return engineLaunchArgv({command:tab.engineCommand??(tab.vendor?void 0:task.command),vendor:tab.vendor??task.vendor,effort:task.modelEffort,model:tab.engineCommand||tab.vendor?void 0:task.model})}function restoredTabLaunch(task,tabId,worktreePath,shell){let tab=readTabsSnapshot(task.id)?.tabs.find((t)=>t.id===tabId&&t.kind==="engine");if(!tab)return null;return buildEngineSessionLaunch({task:{id:task.id,kind:task.kind??"task",vendor:tab.vendor??task.vendor,repo:task.repo,repos:task.repos},worktreePath,shell,argv:engineTabArgv(tab,tabEngineBase(task,tab),!1,task.vendor),promptIntent:{kind:"none"},tabId})}var isTaskKey=isHostedTaskKey,findEngineKey=findHostedEngineKey,taskKeys=hostedTaskKeys,openPtyHost=openHostedSessionHost,ensurePtyHost=ensureHostedSessionHost,listSessions=listHostedSessions,listSessionsOrNull=listHostedSessionsOrNull,deliverToKey=deliverToHostedKey,ENGINE_START_PROBE_MS=3000,ENGINE_START_POLL_MS=150,ENGINE_NOT_OBSERVED_REASON=`no engine process appeared in the session within ${ENGINE_START_PROBE_MS}ms`;function outcomeFields(outcome){if(!outcome)return{engineReady:!1,delivered:!1};return{engineReady:outcome.ready,delivered:!0,bytes:outcome.bytes,promptEcho:outcome.confirmed?"confirmed":"unconfirmed"}}async function deliverHostedPrompt(rpc,target,cwd,prompt,launch,opts){let{sessions=[]}=await rpc.request("pty.list",{}),existingKey=findEngineKey(sessions,target.id,target.engineBin,target.scope);if(existingKey){let pid=sessions.find((s)=>s.key===existingKey)?.pid,presence=await enginePresence(pid,target.engineBin,opts?.snapshot);if(presence.kind==="unknown")throw new ApiError(`could not read the process table, so task ${target.id}'s engine tab (${existingKey}) could not be checked for a live engine`,"ENGINE_PROBE_FAILED",{hint:"the `ps` probe failed or timed out; retry, or check the machine's process table",nextCommandArgs:["api","pty-list"]});if(presence.kind!=="engine")throw new ApiError(`task ${target.id}'s engine tab (${existingKey}) has no live engine process \u2014 its engine exited into a plain shell`,"ENGINE_NOT_RUNNING",{hint:"spawn a fresh engine tab for this prompt with --tab new",nextCommandArgs:["api","send","--task-id",target.id,"--tab","new","--plain","--prompt",prompt]});let outcome=await deliverToKey(rpc,existingKey,prompt,{vendor:presence.vendor});return{session:existingKey,pane:existingKey,started:!1,...outcomeFields(outcome)}}let aliveTabs=sessions.filter((s)=>s.alive&&isTaskKey(s.key,target.id)).map((s)=>s.key);if(aliveTabs.length>0&&!target.firstConversation)throw new ApiError(`task ${target.id} has live tabs (${aliveTabs.join(", ")}) but none resolves as its engine tab \u2014 refusing to spawn a new engine`,"NO_ENGINE_TAB",{hint:"address a live engine tab explicitly with --tab <tab-N> (see pty-list), or start another conversation with --tab new",nextCommandArgs:["api","pty-list"]});let frozen=restoredTabsOf(sessions,target.id,launch.key),disclose=frozen.length>0?{frozenTabs:frozen}:{},staleCanonical=sessions.find((session)=>session.key===launch.key&&!session.alive);if(staleCanonical&&staleCanonical.restored!==!0)await rpc.request("pty.kill",{key:launch.key});let open=await openAdmittedEngine(rpc,{key:launch.key,cwd,command:launch.command,defaultColors:readPersistedTerminalDefaultColors()},{maxLiveEngines:opts?.maxLiveEngines,snapshot:opts?.snapshot,taskId:target.id,retryArgs:opts?.retryArgs??["api","send","--task-id",target.id,"--plain","--prompt",prompt]});try{if(!open.alive)return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,engineReady:!1,delivered:!1,...disclose};if(launch.firstMessage){let outcome=await pastePromptWhenEngineUp(rpc,launch.key,target.engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs});return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,...outcomeFields(outcome),...disclose}}let started=open.created!==!1||open.respawned===!0;if(open.created===!1&&open.respawned!==!0){let outcome=await pastePromptWhenEngineUp(rpc,launch.key,target.engineBin,prompt,{snapshot:opts?.snapshot});return{session:launch.key,pane:launch.key,started,...outcomeFields(outcome),...disclose}}let pendingInit={session:launch.key,pane:launch.key,started,engineReady:!1,delivered:!0,reason:"repo init script is still running; the engine has not started yet",...disclose};if(launch.initMarkerPath&&!initMarkerSaysFinished(launch.initMarkerPath))return pendingInit;if(await awaitEngineProcess(rpc,launch.key,target.engineBin,{timeoutMs:ENGINE_START_PROBE_MS,intervalMs:ENGINE_START_POLL_MS,snapshot:opts?.snapshot})===null){if(launch.initMarkerPath&&!initMarkerSaysFinished(launch.initMarkerPath)&&(await listSessions(rpc)).some((session)=>session.key===launch.key&&session.alive)&&!initMarkerSaysFinished(launch.initMarkerPath))return pendingInit;return{session:launch.key,pane:launch.key,started,engineReady:!1,delivered:!1,reason:await hostedSessionFailureLine(rpc,launch.key)??ENGINE_NOT_OBSERVED_REASON,...disclose}}return{session:launch.key,pane:launch.key,started,engineReady:!0,delivered:!0,...disclose}}finally{await rpc.request("pty.detach",{key:launch.key}).catch(()=>{})}}var killTaskSessions=killHostedSessions;
2
+ import{awaitEngineProcess,deliverToHostedKey,enginePresence,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,isHostedTaskKey,killHostedSessions,listHostedSessions,listHostedSessionsOrNull,openHostedSessionHost,pastePromptWhenEngineUp,readPersistedTerminalDefaultColors,sessionArgvNamesEngine}from"./chunk-vx44yxra.js";import{engineTabArgv,readTabsSnapshot}from"./chunk-1a57ejnh.js";import{buildEngineSessionLaunch,initMarkerSaysFinished}from"./chunk-qecygh3f.js";import{engineLaunchArgv}from"./chunk-rjq38twt.js";import{ApiError}from"./chunk-r5j8fycq.js";import{engineProcessIn,parsePsSnapshot,psSnapshot,vendorFromArgv}from"./chunk-5rgrde6b.js";import{basename}from"path";async function countLiveEngineSessions(sessions,snapshot=psSnapshot){let tabs=sessions.filter((s)=>s.alive&&s.key.split("::").length===2);if(!tabs.length)return 0;let rows;try{if(rows=parsePsSnapshot(await snapshot(tabs.flatMap((s)=>s.pid?[s.pid]:[]))),!rows.length)return tabs.length}catch{return tabs.length}return tabs.filter((s)=>{if(!s.pid)return!0;let root=rows.find((row)=>row.pid===s.pid);if(!root)return!0;if(engineProcessIn(rows,s.pid)||vendorFromArgv(root.args))return!0;let[taskId,tabId]=s.key.split("::"),labelled=readTabsSnapshot(taskId)?.tabs.some((tab)=>tab.id===tabId&&tab.kind==="engine");if(tabId!=="tab-1"&&!labelled&&!sessionArgvNamesEngine(s.command))return!1;let executable=basename(root.args.split(/\s+/)[0]).toLowerCase().replace(/^-/,"").replace(/\.exe$/,"");if(["sh","bash","zsh","fish","dash","ash","ksh","mksh"].includes(executable))return/^\S+\s+-[a-zA-Z]*c\b/.test(root.args);return!0}).length}async function openAdmittedEngine(rpc,spec,opts){let limit=opts.maxLiveEngines;if(limit===void 0)return rpc.request("pty.open",spec);for(let attempt=0;attempt<20;attempt++){let{sessions,admissionToken}=await rpc.request("pty.list",{});if(typeof admissionToken!=="string")throw new ApiError("the PTY host must be updated before enforcing engine.maxLiveSessions","ENGINE_ADMISSION_UNAVAILABLE",{taskId:opts.taskId,hint:"the running PTY host predates atomic admission; update and restart the PTY host before retrying",nextCommandArgs:opts.retryArgs});let live=await countLiveEngineSessions(sessions,opts.snapshot);if(!sessions.some((s)=>s.key===spec.key&&s.alive)&&live>=limit)throw new ApiError(`${live} engine sessions are already running (engine.maxLiveSessions is ${limit})`,"ENGINE_LIMIT",{taskId:opts.taskId,live,limit,hint:"wait for an engine to finish or close a tab, then retry; raise engine.maxLiveSessions in state.json to allow more",nextCommandArgs:opts.retryArgs});let result=await rpc.request("pty.openChecked",{...spec,admissionToken});if(result.kind==="opened")return result.open}throw new ApiError("PTY inventory kept changing during engine admission; retry the send","ENGINE_ADMISSION_BUSY",{taskId:opts.taskId,nextCommandArgs:opts.retryArgs})}function restoredTabsOf(sessions,taskId,exceptKey){let prefix=`${taskId}::`,ids=[];for(let s of sessions){if(s.alive||s.restored!==!0||s.key===exceptKey||!s.key.startsWith(prefix))continue;let tab=s.key.slice(prefix.length);if(tab.includes("::"))continue;if(!ids.includes(tab))ids.push(tab)}let tabs=readTabsSnapshot(taskId)?.tabs??[];return ids.map((tab)=>{let sessionId=tabs.find((t)=>t.id===tab)?.sessionId;return sessionId?{tab,sessionId}:{tab}})}function tabEngineBase(task,tab){return engineLaunchArgv({command:tab.engineCommand??(tab.vendor?void 0:task.command),vendor:tab.vendor??task.vendor,effort:task.modelEffort,model:tab.engineCommand||tab.vendor?void 0:task.model})}function restoredTabLaunch(task,tabId,worktreePath,shell){let tab=readTabsSnapshot(task.id)?.tabs.find((t)=>t.id===tabId&&t.kind==="engine");if(!tab)return null;return buildEngineSessionLaunch({task:{id:task.id,kind:task.kind??"task",vendor:tab.vendor??task.vendor,repo:task.repo,repos:task.repos},worktreePath,shell,argv:engineTabArgv(tab,tabEngineBase(task,tab),!1,task.vendor),promptIntent:{kind:"none"},tabId})}var isTaskKey=isHostedTaskKey,findEngineKey=findHostedEngineKey,taskKeys=hostedTaskKeys,openPtyHost=openHostedSessionHost,ensurePtyHost=ensureHostedSessionHost,listSessions=listHostedSessions,listSessionsOrNull=listHostedSessionsOrNull,deliverToKey=deliverToHostedKey,ENGINE_START_PROBE_MS=3000,ENGINE_START_POLL_MS=150,ENGINE_NOT_OBSERVED_REASON=`no engine process appeared in the session within ${ENGINE_START_PROBE_MS}ms`;function outcomeFields(outcome){if(!outcome)return{engineReady:!1,delivered:!1};return{engineReady:outcome.ready,delivered:!0,bytes:outcome.bytes,promptEcho:outcome.confirmed?"confirmed":"unconfirmed"}}async function deliverHostedPrompt(rpc,target,cwd,prompt,launch,opts){let{sessions=[]}=await rpc.request("pty.list",{}),existingKey=findEngineKey(sessions,target.id,target.engineBin,target.scope);if(existingKey){let pid=sessions.find((s)=>s.key===existingKey)?.pid,presence=await enginePresence(pid,target.engineBin,opts?.snapshot);if(presence.kind==="unknown")throw new ApiError(`could not read the process table, so task ${target.id}'s engine tab (${existingKey}) could not be checked for a live engine`,"ENGINE_PROBE_FAILED",{hint:"the `ps` probe failed or timed out; retry, or check the machine's process table",nextCommandArgs:["api","pty-list"]});if(presence.kind!=="engine")throw new ApiError(`task ${target.id}'s engine tab (${existingKey}) has no live engine process \u2014 its engine exited into a plain shell`,"ENGINE_NOT_RUNNING",{hint:"spawn a fresh engine tab for this prompt with --tab new",nextCommandArgs:["api","send","--task-id",target.id,"--tab","new","--plain","--prompt",prompt]});let outcome=await deliverToKey(rpc,existingKey,prompt,{vendor:presence.vendor});return{session:existingKey,pane:existingKey,started:!1,...outcomeFields(outcome)}}let aliveTabs=sessions.filter((s)=>s.alive&&isTaskKey(s.key,target.id)).map((s)=>s.key);if(aliveTabs.length>0&&!target.firstConversation)throw new ApiError(`task ${target.id} has live tabs (${aliveTabs.join(", ")}) but none resolves as its engine tab \u2014 refusing to spawn a new engine`,"NO_ENGINE_TAB",{hint:"address a live engine tab explicitly with --tab <tab-N> (see pty-list), or start another conversation with --tab new",nextCommandArgs:["api","pty-list"]});let frozen=restoredTabsOf(sessions,target.id,launch.key),disclose=frozen.length>0?{frozenTabs:frozen}:{},staleCanonical=sessions.find((session)=>session.key===launch.key&&!session.alive);if(staleCanonical&&staleCanonical.restored!==!0)await rpc.request("pty.kill",{key:launch.key});let open=await openAdmittedEngine(rpc,{key:launch.key,cwd,command:launch.command,defaultColors:readPersistedTerminalDefaultColors()},{maxLiveEngines:opts?.maxLiveEngines,snapshot:opts?.snapshot,taskId:target.id,retryArgs:opts?.retryArgs??["api","send","--task-id",target.id,"--plain","--prompt",prompt]});try{if(!open.alive)return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,engineReady:!1,delivered:!1,...disclose};if(launch.firstMessage){let outcome=await pastePromptWhenEngineUp(rpc,launch.key,target.engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs});return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,...outcomeFields(outcome),...disclose}}let started=open.created!==!1||open.respawned===!0;if(open.created===!1&&open.respawned!==!0){let outcome=await pastePromptWhenEngineUp(rpc,launch.key,target.engineBin,prompt,{snapshot:opts?.snapshot});return{session:launch.key,pane:launch.key,started,...outcomeFields(outcome),...disclose}}let pendingInit={session:launch.key,pane:launch.key,started,engineReady:!1,delivered:!0,reason:"repo init script is still running; the engine has not started yet",...disclose};if(launch.initMarkerPath&&!initMarkerSaysFinished(launch.initMarkerPath))return pendingInit;if(await awaitEngineProcess(rpc,launch.key,target.engineBin,{timeoutMs:ENGINE_START_PROBE_MS,intervalMs:ENGINE_START_POLL_MS,snapshot:opts?.snapshot})===null){if(launch.initMarkerPath&&!initMarkerSaysFinished(launch.initMarkerPath)&&(await listSessions(rpc)).some((session)=>session.key===launch.key&&session.alive)&&!initMarkerSaysFinished(launch.initMarkerPath))return pendingInit;return{session:launch.key,pane:launch.key,started,engineReady:!1,delivered:!1,reason:await hostedSessionFailureLine(rpc,launch.key)??ENGINE_NOT_OBSERVED_REASON,...disclose}}return{session:launch.key,pane:launch.key,started,engineReady:!0,delivered:!0,...disclose}}finally{await rpc.request("pty.detach",{key:launch.key}).catch(()=>{})}}var killTaskSessions=killHostedSessions;
3
3
  export{openAdmittedEngine,tabEngineBase,restoredTabLaunch,isTaskKey,findEngineKey,taskKeys,openPtyHost,ensurePtyHost,listSessions,listSessionsOrNull,deliverToKey,ENGINE_START_PROBE_MS,ENGINE_START_POLL_MS,ENGINE_NOT_OBSERVED_REASON,outcomeFields,deliverHostedPrompt,killTaskSessions};
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{deriveTitleFromPrompt}from"./chunk-2xsxcdp6.js";import{TaskDeletingError}from"./chunk-1vxtd8rh.js";import{awaitEngineProcess,deliverToHostedKey,enginePresence,ensureHostedEngine,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,killHostedSessions,listHostedSessions,openHostedSessionHost,pastePromptWhenEngineUp}from"./chunk-nv8eyjep.js";import{buildEngineSessionLaunch,launchReposOf,trustEngineWorktree,trustExtraRepos}from"./chunk-qecygh3f.js";import{engineLaunchArgv,protocolEntry}from"./chunk-rjq38twt.js";import{hostedKeyFor}from"./chunk-g9ba25q5.js";import{resolveSessionShell}from"./chunk-tn9gtf18.js";import{taskCwd}from"./chunk-x1jxxmtc.js";import{DEFAULT_TASK_VENDOR}from"./chunk-xy8be792.js";var MAX_SESSIONS_SCANNED=8;function titleFromMessages(messages){let firstUser=messages.find((m)=>m.role==="user");if(!firstUser)return"";let text=firstUser.blocks.filter((b)=>b.type==="text").map((b)=>b.text).join(" "),title=deriveTitleFromPrompt(text);return title.length>0?Buffer.from(title,"utf8").toString("utf8"):title}async function deriveTitleFromSession(worktree,vendor=DEFAULT_TASK_VENDOR){if(!worktree)return"";let{history}=protocolEntry(vendor),ids=await history.listSessionIdsForWorktree(worktree);for(let sessionId of ids.slice(0,MAX_SESSIONS_SCANNED)){let title=titleFromMessages(await history.readHistory(sessionId));if(title)return title}return""}async function deriveTitleFromSessionId(vendor,sessionId){if(!sessionId)return"";try{return titleFromMessages(await protocolEntry(vendor).history.readHistory(sessionId))}catch{return""}}async function getTask(link,taskId){let{task}=await link.request("task.get",{taskId});return task}async function ensureTaskWorktree(link,taskId){let task=await getTask(link,taskId);if(task.deletion)throw new TaskDeletingError(taskId);let hasExtras=Boolean(task.extraRepos?.length);if(task.worktreePath&&!hasExtras){let repos=task.sharesWorkspaceOf?await launchReposOf(link,taskId):void 0;return{task,worktreePath:taskCwd(task),repos}}let{worktreePath}=await link.request("task.ensureWorktree",{taskId});if(!worktreePath)throw Error(`task ${taskId} has no worktree`);return{task,worktreePath:taskCwd({worktreePath,cwdSubpath:task.cwdSubpath}),repos:hasExtras||task.sharesWorkspaceOf?await launchReposOf(link,taskId):void 0}}async function ensureTaskSessionAdapter(link,taskId){let{task,worktreePath,repos}=await ensureTaskWorktree(link,taskId),launch=taskEngineLaunch(task,worktreePath,{kind:"repo-init"},repos),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)throw Error(`failed to start hosted engine session for ${taskId}`);if(launch.firstMessage){let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort,model:task.model})[0];await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs}).catch(()=>!1)}}finally{host.close()}return{session:launch.key,worktreePath}}async function startTaskSessionWithPromptAdapter(link,taskId,prompt){let{task,worktreePath,repos}=await ensureTaskWorktree(link,taskId);await link.request("task.observeLanguage",{taskId,text:prompt}).catch(()=>{});let launch=taskEngineLaunch(task,worktreePath,{kind:"new-task",prompt},repos),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)return{started:!1,error:"hosted session did not open"};let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort,model:task.model})[0],wait={initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs};if(launch.firstMessage){if(await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}if(await awaitEngineProcess(host.rpc,launch.key,engineBin,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}finally{host.close()}}async function startFailureReason(rpc,key){let tail=await hostedSessionFailureLine(rpc,key),base="engine process never started";return tail?`engine process never started; last session output: ${tail}`:"engine process never started"}function taskEngineLaunch(task,worktreePath,promptIntent,repos){return trustEngineWorktree(task.vendor,worktreePath),trustExtraRepos(task.vendor,repos),buildEngineSessionLaunch({task:{id:task.id,kind:task.kind,vendor:task.vendor,repo:task.repo,repos},worktreePath,shell:resolveSessionShell(),argv:engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort,model:task.model}),promptIntent})}async function deliverPromptToLiveEngineAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return!1;try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0],task.scope);if(!key)return!1;let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return!1;return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})!==null}catch{return!1}finally{host.close()}}function tabIdFromHostedKey(key){return key.split("::")[1]??"tab-1"}async function deliverPromptToLiveEngineDetailedAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0],task.scope);if(!key)return{outcome:"no-session"};let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:tabIdFromHostedKey(key)};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:tabIdFromHostedKey(key)}}catch{return{outcome:"no-session"}}finally{host.close()}}async function deliverPromptToLiveEngineTabDetailedAdapter(target,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let key=hostedKeyFor(target.id,target.tabId,target.scope);if(!key)return{outcome:"no-session"};let sessions;try{sessions=await listHostedSessions(host.rpc)}catch{return{outcome:"no-session"}}let session=sessions.find((candidate)=>candidate.alive&&candidate.key===key);if(!session)return{outcome:"no-session"};let engineArgv=engineLaunchArgv({command:target.command,vendor:target.vendor}),presence=await enginePresence(session.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:target.tabId};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:target.tabId}}finally{host.close()}}async function tearDownTaskSessionAdapter(taskId,scope){let host=await openHostedSessionHost();if(!host)return;try{let keys=hostedTaskKeys(await listHostedSessions(host.rpc),taskId,scope);await killHostedSessions(host.rpc,keys,{wait:!0})}catch{}finally{host.close()}}
2
+ import{deriveTitleFromPrompt}from"./chunk-2xsxcdp6.js";import{TaskDeletingError}from"./chunk-1vxtd8rh.js";import{awaitEngineProcess,deliverToHostedKey,enginePresence,ensureHostedEngine,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,killHostedSessions,listHostedSessions,openHostedSessionHost,pastePromptWhenEngineUp}from"./chunk-vx44yxra.js";import{buildEngineSessionLaunch,launchReposOf,trustEngineWorktree,trustExtraRepos}from"./chunk-qecygh3f.js";import{engineLaunchArgv,protocolEntry}from"./chunk-rjq38twt.js";import{hostedKeyFor}from"./chunk-g9ba25q5.js";import{resolveSessionShell}from"./chunk-tn9gtf18.js";import{taskCwd}from"./chunk-x1jxxmtc.js";import{DEFAULT_TASK_VENDOR}from"./chunk-xy8be792.js";var MAX_SESSIONS_SCANNED=8;function titleFromMessages(messages){let firstUser=messages.find((m)=>m.role==="user");if(!firstUser)return"";let text=firstUser.blocks.filter((b)=>b.type==="text").map((b)=>b.text).join(" "),title=deriveTitleFromPrompt(text);return title.length>0?Buffer.from(title,"utf8").toString("utf8"):title}async function deriveTitleFromSession(worktree,vendor=DEFAULT_TASK_VENDOR){if(!worktree)return"";let{history}=protocolEntry(vendor),ids=await history.listSessionIdsForWorktree(worktree);for(let sessionId of ids.slice(0,MAX_SESSIONS_SCANNED)){let title=titleFromMessages(await history.readHistory(sessionId));if(title)return title}return""}async function deriveTitleFromSessionId(vendor,sessionId){if(!sessionId)return"";try{return titleFromMessages(await protocolEntry(vendor).history.readHistory(sessionId))}catch{return""}}async function getTask(link,taskId){let{task}=await link.request("task.get",{taskId});return task}async function ensureTaskWorktree(link,taskId){let task=await getTask(link,taskId);if(task.deletion)throw new TaskDeletingError(taskId);let hasExtras=Boolean(task.extraRepos?.length);if(task.worktreePath&&!hasExtras){let repos=task.sharesWorkspaceOf?await launchReposOf(link,taskId):void 0;return{task,worktreePath:taskCwd(task),repos}}let{worktreePath}=await link.request("task.ensureWorktree",{taskId});if(!worktreePath)throw Error(`task ${taskId} has no worktree`);return{task,worktreePath:taskCwd({worktreePath,cwdSubpath:task.cwdSubpath}),repos:hasExtras||task.sharesWorkspaceOf?await launchReposOf(link,taskId):void 0}}async function ensureTaskSessionAdapter(link,taskId){let{task,worktreePath,repos}=await ensureTaskWorktree(link,taskId),launch=taskEngineLaunch(task,worktreePath,{kind:"repo-init"},repos),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)throw Error(`failed to start hosted engine session for ${taskId}`);if(launch.firstMessage){let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort,model:task.model})[0];await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs}).catch(()=>!1)}}finally{host.close()}return{session:launch.key,worktreePath}}async function startTaskSessionWithPromptAdapter(link,taskId,prompt){let{task,worktreePath,repos}=await ensureTaskWorktree(link,taskId);await link.request("task.observeLanguage",{taskId,text:prompt}).catch(()=>{});let launch=taskEngineLaunch(task,worktreePath,{kind:"new-task",prompt},repos),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)return{started:!1,error:"hosted session did not open"};let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort,model:task.model})[0],wait={initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs};if(launch.firstMessage){if(await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}if(await awaitEngineProcess(host.rpc,launch.key,engineBin,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}finally{host.close()}}async function startFailureReason(rpc,key){let tail=await hostedSessionFailureLine(rpc,key),base="engine process never started";return tail?`engine process never started; last session output: ${tail}`:"engine process never started"}function taskEngineLaunch(task,worktreePath,promptIntent,repos){return trustEngineWorktree(task.vendor,worktreePath),trustExtraRepos(task.vendor,repos),buildEngineSessionLaunch({task:{id:task.id,kind:task.kind,vendor:task.vendor,repo:task.repo,repos},worktreePath,shell:resolveSessionShell(),argv:engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort,model:task.model}),promptIntent})}async function deliverPromptToLiveEngineAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return!1;try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0],task.scope);if(!key)return!1;let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return!1;return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})!==null}catch{return!1}finally{host.close()}}function tabIdFromHostedKey(key){return key.split("::")[1]??"tab-1"}async function deliverPromptToLiveEngineDetailedAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0],task.scope);if(!key)return{outcome:"no-session"};let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:tabIdFromHostedKey(key)};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:tabIdFromHostedKey(key)}}catch{return{outcome:"no-session"}}finally{host.close()}}async function deliverPromptToLiveEngineTabDetailedAdapter(target,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let key=hostedKeyFor(target.id,target.tabId,target.scope);if(!key)return{outcome:"no-session"};let sessions;try{sessions=await listHostedSessions(host.rpc)}catch{return{outcome:"no-session"}}let session=sessions.find((candidate)=>candidate.alive&&candidate.key===key);if(!session)return{outcome:"no-session"};let engineArgv=engineLaunchArgv({command:target.command,vendor:target.vendor}),presence=await enginePresence(session.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:target.tabId};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:target.tabId}}finally{host.close()}}async function tearDownTaskSessionAdapter(taskId,scope){let host=await openHostedSessionHost();if(!host)return;try{let keys=hostedTaskKeys(await listHostedSessions(host.rpc),taskId,scope);await killHostedSessions(host.rpc,keys,{wait:!0})}catch{}finally{host.close()}}
3
3
  export{deriveTitleFromSession,deriveTitleFromSessionId,ensureTaskSessionAdapter,startTaskSessionWithPromptAdapter,deliverPromptToLiveEngineAdapter,deliverPromptToLiveEngineDetailedAdapter,deliverPromptToLiveEngineTabDetailedAdapter,tearDownTaskSessionAdapter};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{AUTO_MACHINE,LOCAL_MACHINE,forwardVerb,invokeRouted,machineDaemonSocket,machinePtySocket,machineTasks,pickMachine,repoHosts,repoWanted,requireMachine,routeTarget}from"./chunk-p11emdb2.js";import"./chunk-vytrhm50.js";import"./chunk-vp29jgbt.js";import"./chunk-gq36nzg8.js";import"./chunk-sq6zj3fb.js";import"./chunk-3hxm56h6.js";import"./chunk-qecygh3f.js";import"./chunk-rjq38twt.js";import"./chunk-r5j8fycq.js";import"./chunk-xfgqae9t.js";import"./chunk-j1z9kgyd.js";import"./chunk-g9ba25q5.js";import"./chunk-ggnq2vvk.js";import"./chunk-hpay0ax8.js";import"./chunk-catrr0z3.js";import"./chunk-mdc7b01e.js";import"./chunk-tn9gtf18.js";import"./chunk-895yqjjz.js";import"./chunk-sak1tphp.js";import"./chunk-y1xnjx8x.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-5rgrde6b.js";import"./chunk-4gjvmfa9.js";import"./chunk-2tfnscxk.js";import"./chunk-hzz020xx.js";import"./chunk-w7zv47mp.js";import"./chunk-rfp0ayra.js";import"./chunk-40dgv828.js";import"./chunk-zsfyj36g.js";import"./chunk-2r1fgng9.js";import"./chunk-2brn8e1y.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import"./chunk-nqwza8b0.js";import"./chunk-ve76p2mx.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7bakcyes.js";import"./chunk-8qkyd589.js";import"./chunk-7kysxgbq.js";import"./chunk-hz1x3hak.js";import"./chunk-x1jxxmtc.js";import"./chunk-xy8be792.js";import"./chunk-h2m7em1e.js";import"./chunk-7ghwdjdc.js";import"./chunk-8t7qbr1e.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-pxk2c2vj.js";import"./chunk-91sykzqq.js";export{routeTarget,requireMachine,repoWanted,repoHosts,pickMachine,machineTasks,machinePtySocket,machineDaemonSocket,invokeRouted,forwardVerb,LOCAL_MACHINE,AUTO_MACHINE};
2
+ import{AUTO_MACHINE,LOCAL_MACHINE,forwardVerb,invokeRouted,machineDaemonSocket,machinePtySocket,machineTasks,pickMachine,repoHosts,repoWanted,requireMachine,routeTarget}from"./chunk-y07cp9mb.js";import"./chunk-vytrhm50.js";import"./chunk-vp29jgbt.js";import"./chunk-gq36nzg8.js";import"./chunk-sq6zj3fb.js";import"./chunk-1a57ejnh.js";import"./chunk-qecygh3f.js";import"./chunk-rjq38twt.js";import"./chunk-r5j8fycq.js";import"./chunk-xfgqae9t.js";import"./chunk-j1z9kgyd.js";import"./chunk-g9ba25q5.js";import"./chunk-ggnq2vvk.js";import"./chunk-hpay0ax8.js";import"./chunk-catrr0z3.js";import"./chunk-mdc7b01e.js";import"./chunk-tn9gtf18.js";import"./chunk-895yqjjz.js";import"./chunk-sak1tphp.js";import"./chunk-y1xnjx8x.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-5rgrde6b.js";import"./chunk-4gjvmfa9.js";import"./chunk-2tfnscxk.js";import"./chunk-hzz020xx.js";import"./chunk-w7zv47mp.js";import"./chunk-rfp0ayra.js";import"./chunk-40dgv828.js";import"./chunk-zsfyj36g.js";import"./chunk-2r1fgng9.js";import"./chunk-2brn8e1y.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import"./chunk-a5xbsvx2.js";import"./chunk-9vwb9f7q.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7bakcyes.js";import"./chunk-8qkyd589.js";import"./chunk-7kysxgbq.js";import"./chunk-hz1x3hak.js";import"./chunk-x1jxxmtc.js";import"./chunk-xy8be792.js";import"./chunk-h2m7em1e.js";import"./chunk-7ghwdjdc.js";import"./chunk-8t7qbr1e.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-pxk2c2vj.js";import"./chunk-91sykzqq.js";export{routeTarget,requireMachine,repoWanted,repoHosts,pickMachine,machineTasks,machinePtySocket,machineDaemonSocket,invokeRouted,forwardVerb,LOCAL_MACHINE,AUTO_MACHINE};
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{failureHint}from"./chunk-t2p22ww7.js";import{errorMessage}from"./chunk-2brn8e1y.js";import"./chunk-nqwza8b0.js";import"./chunk-ve76p2mx.js";import"./chunk-cmp64q4j.js";import"./chunk-91sykzqq.js";function debugEnabled(env){return env.ROVE_DEBUG==="1"||env.ROVE_DEBUG==="1"}function failureSubject(cliName,argv){let verb=argv[2];return verb&&!verb.startsWith("-")&&!verb.includes("/")?`${cliName} ${verb}`:cliName}function summarizeCliGitError(message,cwd){if(!/not a git repository/i.test(message))return null;return`${cwd} is not a git repository \u2014 run this inside one, or pass a repo path.`}function formatCliFailure(err,opts){let subject=failureSubject(opts.cliName,opts.argv);if(debugEnabled(opts.env))return`${subject}: ${String(err instanceof Error?err.stack??err:err)}
2
+ import{failureHint}from"./chunk-ejfs22aq.js";import{errorMessage}from"./chunk-2brn8e1y.js";import"./chunk-a5xbsvx2.js";import"./chunk-9vwb9f7q.js";import"./chunk-cmp64q4j.js";import"./chunk-91sykzqq.js";function debugEnabled(env){return env.ROVE_DEBUG==="1"||env.ROVE_DEBUG==="1"}function failureSubject(cliName,argv){let verb=argv[2];return verb&&!verb.startsWith("-")&&!verb.includes("/")?`${cliName} ${verb}`:cliName}function summarizeCliGitError(message,cwd){if(!/not a git repository/i.test(message))return null;return`${cwd} is not a git repository \u2014 run this inside one, or pass a repo path.`}function formatCliFailure(err,opts){let subject=failureSubject(opts.cliName,opts.argv);if(debugEnabled(opts.env))return`${subject}: ${String(err instanceof Error?err.stack??err:err)}
3
3
  ${failureHint(err,opts.cliName)}`;let raw=errorMessage(err),git=summarizeCliGitError(raw,opts.cwd);return`${subject}: ${git??`${raw}
4
4
  ${failureHint(err,opts.cliName)}`}`}export{summarizeCliGitError,formatCliFailure,failureSubject};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{PR_VIEW_TIMEOUT_MS,checkFrame,failingCheckTargets,ghText,isLoopbackHost,makeGhPrUrlRunner,makeGhPrViewRunner,readFailingChecks}from"./chunk-1g6vhgfe.js";import{countCronBetween,isValidCron,latestCronAtOrBefore,nextCronAfter}from"./chunk-a4hsqj1b.js";import{activityPriority,sameTaskStatus,tabStatus,taskStatus,tightenInstalledPluginPermissions}from"./chunk-6hcyvg0m.js";import{ClientWriter,LineReceiver,objectPayload,optionalActivityDetail,optionalBoolean,optionalNumber,optionalString,optionalVendor,requireNumber,requireString,statusActivity}from"./chunk-tq0h3vy6.js";import{DEFAULT_STATE_DEBOUNCE_MS,startStateWatcher}from"./chunk-cpgnm1xr.js";import{startFileWatchTrigger}from"./chunk-r3s2t9af.js";import{parseDaemonStopReason}from"./chunk-6xr1prk6.js";import{canonicalEngineTab,ownEngineTabs}from"./chunk-q8ffd1pc.js";import{IssuesStore,defaultIssuesStorePath,resolveRepoRoot}from"./chunk-4hestsjp.js";import{buildPluginEnv}from"./chunk-qgrg9a5n.js";import{STICKY_STATES,activityStillWorking,reduceActivity,resolveEngineStateTtlMs}from"./chunk-2bgmby1d.js";import{currentPluginPlatform,loadPluginRegistry,pluginManifestPath,readPluginManifest,supportsPlatform}from"./chunk-n0rdn2fn.js";import{serialized,writeJsonAtomic,writeTextAtomic}from"./chunk-5mhvjytn.js";import{RowTokenStore,isRowTokenTone}from"./chunk-atn06ncf.js";import{DISPATCH_PROMPT_HEAD_CHARS,DispatchLedger,findAdoptableWorktree,matchTaskByCwd,repoIdOf,resolvePtyOwner,tasksAtWorktreePath}from"./chunk-vp29jgbt.js";import{hasFrozenPtySessions,listPtyHostSessions,ptyHostHasLiveSessions,sweepPtyHostSessions}from"./chunk-z43e08kw.js";import{logDaemonError,logDaemonInfo}from"./chunk-rxqdw6s5.js";import{applyTabOps,releaseOrdinals,reserveOrdinals}from"./chunk-rjq38twt.js";import{isBuiltinModInstalled,requireBuiltinMod}from"./chunk-xfgqae9t.js";import{pluginConfigDir,pluginLogPath,pluginRegistryPath,pluginStateDir}from"./chunk-j1z9kgyd.js";import{aliasKey,aliasedKeys,ptyScopeFor,teardownScope}from"./chunk-g9ba25q5.js";import{resolveLoginShell}from"./chunk-tn9gtf18.js";import{probeDaemonSocket}from"./chunk-e58kj4gm.js";import{detachOptions}from"./chunk-bcyex84w.js";import{maybeStartScheduledRun}from"./chunk-2tfnscxk.js";import{ENGINE_EXIT_BANNER,engineExitCodeFromTail,plainTail,readPtyExitRecords,readPtyExitStore,recordEngineExit,wrapperBannerCodeFromTail}from"./chunk-2w228s7t.js";import{parsePorcelainRows}from"./chunk-dmzg9zdc.js";import{worktreeFingerprint}from"./chunk-kg9kmwt9.js";import{CHANNEL_NAMES,DAEMON_PROTOCOL_VERSION,DELIVERY_EVIDENCE_MAX_CHARS,DELIVERY_EVIDENCE_MAX_ITEMS,DELIVERY_NEXT_MAX_CHARS,DELIVERY_OUTCOMES,DELIVERY_PROMPT_HEAD_CHARS,DELIVERY_STALL_MS,DELIVERY_SUMMARY_MAX_CHARS,GATE_CONTEXT_MAX,GATE_OPTIONS_MAX,GATE_QUESTION_MAX,MAX_DELIVERIES_PER_TASK,MIN_COMPATIBLE_PROTOCOL_VERSION,ROUTINE_RESPONSE_MAX_CHARS,RoveDaemonClient,attentionInboxItemKey,automationRunNeedsAttention,deliveryFooter,frameToLine,isAttentionInboxState,isProtocolCompatible,isRoutineInboxState,normalizeChannelFilter,parseSkipVerdict}from"./chunk-qzzmd63x.js";import{MOD_INPUT_MAX,MOD_PANE_ID_PATTERN,MOD_TITLE_MAX,ROVE_API_VERSION,validateModTree}from"./chunk-96kvwzj8.js";import{AUTO_FIX_MAX,autoFixDecision}from"./chunk-hz1x3hak.js";import{TodoRefusedError,canonicalPrUrl,lineageRootId,parseTodoOps,pickRepos,subtreeIds,taskCwd,workspaceCapabilities,workspaceOwnerId}from"./chunk-x1jxxmtc.js";import{createSocketOwnershipGuard,isProcessAlive,listenOnUnixSocket}from"./chunk-br8r72bf.js";import{OWNER_ONLY_DIR_MODE,OWNER_ONLY_FILE_MODE,ensureOwnerOnlyStateDir}from"./chunk-yt15y085.js";import{defaultKeybindingsPath,defaultUiPrefsStatePath,resolveProductHomeDir}from"./chunk-z1nj22va.js";import{rotateLogIfNeeded}from"./chunk-0g4wc808.js";import{samePath}from"./chunk-pn5ygqn6.js";import{defaultDaemonPidPath,defaultDaemonSocketPath,defaultDeliveriesPath,defaultPtyExitsPath,defaultPtyHostSocketPath,endpointPathFor,resolveDaemonHomeDir}from"./chunk-eqdbfgq5.js";import{ROVE_STATE_DIR_BASENAME,readRoveEnv,readRoveHomeDirEnv}from"./chunk-nc46gddg.js";import{__require}from"./chunk-91sykzqq.js";import{mkdir as mkdir2,unlink as unlink2}from"fs/promises";import{createServer}from"net";import{dirname as dirname2}from"path";import{statSync}from"fs";var WATCHED_FIELDS=["title","branch","worktreePath","status","pinned","vendor","command","modelEffort","model","tier","linkedWorkItem","scratch"];function same(a,b){if(a===b)return!0;if(a==null||b==null)return a==null&&b==null;if(typeof a==="object"||typeof b==="object")return JSON.stringify(a)===JSON.stringify(b);return!1}function samePr(a,b){let strip=(v)=>{if(v==null||typeof v!=="object"||Array.isArray(v))return v;let{lastCheckedAt:_a,lastError:_b,...rest}=v;return rest};return same(strip(a),strip(b))}function diffTask(prev,next){let fields=[],from={},to={};for(let field of WATCHED_FIELDS){let a=prev[field],b=next[field];if(same(a,b))continue;if(fields.push(field),a!==void 0)from[field]=a;if(b!==void 0)to[field]=b}let prChanged=!samePr(prev.prStatus,next.prStatus);if(fields.length===0&&!prChanged)return null;return{fields,from,to,prChanged,worktreeCreated:next.kind==="task"&&!prev.worktreePath&&!!next.worktreePath}}function bornWithWorktree(task){return task.kind==="task"&&!!task.worktreePath}function lifecycleEventFor(kind,detail){switch(kind){case"session-start":return"session.start";case"session-end":return"session.end";case"turn-start":return"turn.prompt";case"turn-complete":return"turn.complete";case"turn-failed":return"turn.failed";case"turn-interrupted":return"turn.interrupted";case"awaiting-input":return detail?.waiting==="input"?"attention.question":"attention.permission";case"tool-pre":return"tool.pre";case"tool-post":return"tool.post";case"tool-failed":return"tool.failed";case"pre-compact":return"context.pre-compact";case"post-compact":return"context.post-compact";case"subagent-start":return"subagent.start";case"subagent-stop":return"subagent.stop";default:return}}var AGENT_EVENT_BY_STATE={turn_complete:"agent.turn-complete",permission_needed:"agent.permission-needed",rate_limited:"agent.rate-limited",error:"agent.error",running:"agent.running",idle:"agent.idle"};function taskContext(task){if(!task)return;let{id,title,repo,branch,worktreePath,vendor,status}=task;return{id,title,repo,branch,worktreePath,vendor,status}}class PluginEventReducer{tasks;agentState=new Map;limitedSince=new Map;tabbed=new Set;now;constructor(now=Date.now){this.now=now}contextFor(taskId){return taskContext(this.tasks?.get(taskId))}reduce(event){switch(event.channel){case"task.snapshot":return this.reduceTasks(event.payload.tasks);case"engine-state":return this.reduceEngine(event.payload);default:return[]}}reduceTasks(tasks){let next=new Map(tasks.map((t)=>[t.id,t])),prev=this.tasks;if(this.tasks=next,!prev)return[];let at=this.now(),out=[];for(let[id,task]of next){let before=prev.get(id);if(!before){if(out.push({event:"task.created",taskId:id,task:taskContext(task),at}),bornWithWorktree(task))out.push({event:"worktree.created",taskId:id,task:taskContext(task),at});continue}let diff=diffTask(before,task);if(!diff)continue;let ctx=taskContext(task);if(diff.fields.length>0)out.push({event:"task.changed",taskId:id,task:ctx,detail:{fields:diff.fields,from:diff.from,to:diff.to},at});if(diff.prChanged)out.push({event:"task.pr-changed",taskId:id,task:ctx,detail:{...before.prStatus!==void 0?{from:before.prStatus}:{},...task.prStatus!==void 0?{to:task.prStatus}:{}},at});if(diff.worktreeCreated)out.push({event:"worktree.created",taskId:id,task:ctx,at})}for(let[id,task]of prev)if(!next.has(id))out.push({event:"task.deleted",taskId:id,task:taskContext(task),at});return out}reduceEngine(payload){let key=`${payload.taskId}\x00${payload.tabId??""}`,prev=this.agentState.get(key);if(this.agentState.set(key,payload.state),prev===payload.state)return[];let event=AGENT_EVENT_BY_STATE[payload.state];if(!event)return[];let at=this.now(),base={taskId:payload.taskId,task:taskContext(this.tasks?.get(payload.taskId)),...payload.tabId?{tabId:payload.tabId}:{},at},out=[{event,...base}],recovered=this.trackRateLimit(key,payload,at);if(recovered!==void 0)out.push({event:"agent.rate-limit-recovered",...base,detail:{limitedAt:new Date(recovered).toISOString(),limitedForMs:at-recovered}});return out}trackRateLimit(key,payload,at){if(payload.tabId)this.tabbed.add(payload.taskId);else if(this.tabbed.has(payload.taskId))return;if(payload.state==="rate_limited"){if(!this.limitedSince.has(key))this.limitedSince.set(key,at);return}if(payload.state!=="turn_complete")return;let since=this.limitedSince.get(key);if(since===void 0)return;return this.limitedSince.delete(key),since}}import{execFile,spawn}from"child_process";import{appendFileSync,mkdirSync}from"fs";var OUTPUT_CAP=8192,PLUGIN_LOG_CAP_BYTES=4194304,SHUTDOWN_GRACE_MS=3000,HOOK_TIMEOUT_MS=30000,HOOK_SLOW_MS=2000;function hookTimeoutMs(spec,kind){return spec.timeoutMs??(kind==="shutdown"?SHUTDOWN_GRACE_MS:HOOK_TIMEOUT_MS)}function appendPluginLogRecord(pluginId,homeDir,record){try{let logPath=pluginLogPath(pluginId,homeDir);rotateLogIfNeeded(logPath,PLUGIN_LOG_CAP_BYTES),appendFileSync(logPath,`${JSON.stringify(record)}
2
+ import{PR_VIEW_TIMEOUT_MS,checkFrame,failingCheckTargets,ghText,isLoopbackHost,makeGhPrUrlRunner,makeGhPrViewRunner,readFailingChecks}from"./chunk-16e6jqq6.js";import{countCronBetween,isValidCron,latestCronAtOrBefore,nextCronAfter}from"./chunk-a4hsqj1b.js";import{activityPriority,sameTaskStatus,tabStatus,taskStatus,tightenInstalledPluginPermissions}from"./chunk-6hcyvg0m.js";import{ClientWriter,LineReceiver,objectPayload,optionalActivityDetail,optionalBoolean,optionalNumber,optionalString,optionalVendor,requireNumber,requireString,statusActivity}from"./chunk-tq0h3vy6.js";import{DEFAULT_STATE_DEBOUNCE_MS,startStateWatcher}from"./chunk-cpgnm1xr.js";import{startFileWatchTrigger}from"./chunk-r3s2t9af.js";import{parseDaemonStopReason}from"./chunk-6xr1prk6.js";import{canonicalEngineTab,ownEngineTabs}from"./chunk-q8ffd1pc.js";import{IssuesStore,defaultIssuesStorePath,resolveRepoRoot}from"./chunk-4hestsjp.js";import{buildPluginEnv}from"./chunk-qgrg9a5n.js";import{STICKY_STATES,activityStillWorking,reduceActivity,resolveEngineStateTtlMs}from"./chunk-2bgmby1d.js";import{currentPluginPlatform,loadPluginRegistry,pluginManifestPath,readPluginManifest,supportsPlatform}from"./chunk-n0rdn2fn.js";import{serialized,writeJsonAtomic,writeTextAtomic}from"./chunk-5mhvjytn.js";import{RowTokenStore,isRowTokenTone}from"./chunk-atn06ncf.js";import{DISPATCH_PROMPT_HEAD_CHARS,DispatchLedger,findAdoptableWorktree,matchTaskByCwd,repoIdOf,resolvePtyOwner,tasksAtWorktreePath}from"./chunk-vp29jgbt.js";import{hasFrozenPtySessions,listPtyHostSessions,ptyHostHasLiveSessions,sweepPtyHostSessions}from"./chunk-z43e08kw.js";import{logDaemonError,logDaemonInfo}from"./chunk-rxqdw6s5.js";import{applyTabOps,releaseOrdinals,reserveOrdinals}from"./chunk-rjq38twt.js";import{isBuiltinModInstalled,requireBuiltinMod}from"./chunk-xfgqae9t.js";import{pluginConfigDir,pluginLogPath,pluginRegistryPath,pluginStateDir}from"./chunk-j1z9kgyd.js";import{aliasKey,aliasedKeys,ptyScopeFor,teardownScope}from"./chunk-g9ba25q5.js";import{resolveLoginShell}from"./chunk-tn9gtf18.js";import{probeDaemonSocket}from"./chunk-e58kj4gm.js";import{detachOptions}from"./chunk-bcyex84w.js";import{maybeStartScheduledRun}from"./chunk-2tfnscxk.js";import{ENGINE_EXIT_BANNER,engineExitCodeFromTail,plainTail,readPtyExitRecords,readPtyExitStore,recordEngineExit,wrapperBannerCodeFromTail}from"./chunk-2w228s7t.js";import{parsePorcelainRows}from"./chunk-dmzg9zdc.js";import{worktreeFingerprint}from"./chunk-kg9kmwt9.js";import{CHANNEL_NAMES,DAEMON_PROTOCOL_VERSION,DELIVERY_EVIDENCE_MAX_CHARS,DELIVERY_EVIDENCE_MAX_ITEMS,DELIVERY_NEXT_MAX_CHARS,DELIVERY_OUTCOMES,DELIVERY_PROMPT_HEAD_CHARS,DELIVERY_STALL_MS,DELIVERY_SUMMARY_MAX_CHARS,GATE_CONTEXT_MAX,GATE_OPTIONS_MAX,GATE_QUESTION_MAX,MAX_DELIVERIES_PER_TASK,MIN_COMPATIBLE_PROTOCOL_VERSION,ROUTINE_RESPONSE_MAX_CHARS,RoveDaemonClient,attentionInboxItemKey,automationRunNeedsAttention,deliveryFooter,frameToLine,isAttentionInboxState,isProtocolCompatible,isRoutineInboxState,normalizeChannelFilter,parseSkipVerdict}from"./chunk-qzzmd63x.js";import{MOD_INPUT_MAX,MOD_PANE_ID_PATTERN,MOD_TITLE_MAX,ROVE_API_VERSION,validateModTree}from"./chunk-96kvwzj8.js";import{AUTO_FIX_MAX,autoFixDecision}from"./chunk-hz1x3hak.js";import{TodoRefusedError,canonicalPrUrl,lineageRootId,parseTodoOps,pickRepos,subtreeIds,taskCwd,workspaceCapabilities,workspaceOwnerId}from"./chunk-x1jxxmtc.js";import{createSocketOwnershipGuard,isProcessAlive,listenOnUnixSocket}from"./chunk-br8r72bf.js";import{OWNER_ONLY_DIR_MODE,OWNER_ONLY_FILE_MODE,ensureOwnerOnlyStateDir}from"./chunk-yt15y085.js";import{defaultKeybindingsPath,defaultUiPrefsStatePath,resolveProductHomeDir}from"./chunk-z1nj22va.js";import{rotateLogIfNeeded}from"./chunk-0g4wc808.js";import{samePath}from"./chunk-pn5ygqn6.js";import{defaultDaemonPidPath,defaultDaemonSocketPath,defaultDeliveriesPath,defaultPtyExitsPath,defaultPtyHostSocketPath,endpointPathFor,resolveDaemonHomeDir}from"./chunk-eqdbfgq5.js";import{ROVE_STATE_DIR_BASENAME,readRoveEnv,readRoveHomeDirEnv}from"./chunk-nc46gddg.js";import{__require}from"./chunk-91sykzqq.js";import{mkdir as mkdir2,unlink as unlink2}from"fs/promises";import{createServer}from"net";import{dirname as dirname2}from"path";import{statSync}from"fs";var WATCHED_FIELDS=["title","branch","worktreePath","status","pinned","vendor","command","modelEffort","model","tier","linkedWorkItem","scratch"];function same(a,b){if(a===b)return!0;if(a==null||b==null)return a==null&&b==null;if(typeof a==="object"||typeof b==="object")return JSON.stringify(a)===JSON.stringify(b);return!1}function samePr(a,b){let strip=(v)=>{if(v==null||typeof v!=="object"||Array.isArray(v))return v;let{lastCheckedAt:_a,lastError:_b,...rest}=v;return rest};return same(strip(a),strip(b))}function diffTask(prev,next){let fields=[],from={},to={};for(let field of WATCHED_FIELDS){let a=prev[field],b=next[field];if(same(a,b))continue;if(fields.push(field),a!==void 0)from[field]=a;if(b!==void 0)to[field]=b}let prChanged=!samePr(prev.prStatus,next.prStatus);if(fields.length===0&&!prChanged)return null;return{fields,from,to,prChanged,worktreeCreated:next.kind==="task"&&!prev.worktreePath&&!!next.worktreePath}}function bornWithWorktree(task){return task.kind==="task"&&!!task.worktreePath}function lifecycleEventFor(kind,detail){switch(kind){case"session-start":return"session.start";case"session-end":return"session.end";case"turn-start":return"turn.prompt";case"turn-complete":return"turn.complete";case"turn-failed":return"turn.failed";case"turn-interrupted":return"turn.interrupted";case"awaiting-input":return detail?.waiting==="input"?"attention.question":"attention.permission";case"tool-pre":return"tool.pre";case"tool-post":return"tool.post";case"tool-failed":return"tool.failed";case"pre-compact":return"context.pre-compact";case"post-compact":return"context.post-compact";case"subagent-start":return"subagent.start";case"subagent-stop":return"subagent.stop";default:return}}var AGENT_EVENT_BY_STATE={turn_complete:"agent.turn-complete",permission_needed:"agent.permission-needed",rate_limited:"agent.rate-limited",error:"agent.error",running:"agent.running",idle:"agent.idle"};function taskContext(task){if(!task)return;let{id,title,repo,branch,worktreePath,vendor,status}=task;return{id,title,repo,branch,worktreePath,vendor,status}}class PluginEventReducer{tasks;agentState=new Map;limitedSince=new Map;tabbed=new Set;now;constructor(now=Date.now){this.now=now}contextFor(taskId){return taskContext(this.tasks?.get(taskId))}reduce(event){switch(event.channel){case"task.snapshot":return this.reduceTasks(event.payload.tasks);case"engine-state":return this.reduceEngine(event.payload);default:return[]}}reduceTasks(tasks){let next=new Map(tasks.map((t)=>[t.id,t])),prev=this.tasks;if(this.tasks=next,!prev)return[];let at=this.now(),out=[];for(let[id,task]of next){let before=prev.get(id);if(!before){if(out.push({event:"task.created",taskId:id,task:taskContext(task),at}),bornWithWorktree(task))out.push({event:"worktree.created",taskId:id,task:taskContext(task),at});continue}let diff=diffTask(before,task);if(!diff)continue;let ctx=taskContext(task);if(diff.fields.length>0)out.push({event:"task.changed",taskId:id,task:ctx,detail:{fields:diff.fields,from:diff.from,to:diff.to},at});if(diff.prChanged)out.push({event:"task.pr-changed",taskId:id,task:ctx,detail:{...before.prStatus!==void 0?{from:before.prStatus}:{},...task.prStatus!==void 0?{to:task.prStatus}:{}},at});if(diff.worktreeCreated)out.push({event:"worktree.created",taskId:id,task:ctx,at})}for(let[id,task]of prev)if(!next.has(id))out.push({event:"task.deleted",taskId:id,task:taskContext(task),at});return out}reduceEngine(payload){let key=`${payload.taskId}\x00${payload.tabId??""}`,prev=this.agentState.get(key);if(this.agentState.set(key,payload.state),prev===payload.state)return[];let event=AGENT_EVENT_BY_STATE[payload.state];if(!event)return[];let at=this.now(),base={taskId:payload.taskId,task:taskContext(this.tasks?.get(payload.taskId)),...payload.tabId?{tabId:payload.tabId}:{},at},out=[{event,...base}],recovered=this.trackRateLimit(key,payload,at);if(recovered!==void 0)out.push({event:"agent.rate-limit-recovered",...base,detail:{limitedAt:new Date(recovered).toISOString(),limitedForMs:at-recovered}});return out}trackRateLimit(key,payload,at){if(payload.tabId)this.tabbed.add(payload.taskId);else if(this.tabbed.has(payload.taskId))return;if(payload.state==="rate_limited"){if(!this.limitedSince.has(key))this.limitedSince.set(key,at);return}if(payload.state!=="turn_complete")return;let since=this.limitedSince.get(key);if(since===void 0)return;return this.limitedSince.delete(key),since}}import{execFile,spawn}from"child_process";import{appendFileSync,mkdirSync}from"fs";var OUTPUT_CAP=8192,PLUGIN_LOG_CAP_BYTES=4194304,SHUTDOWN_GRACE_MS=3000,HOOK_TIMEOUT_MS=30000,HOOK_SLOW_MS=2000;function hookTimeoutMs(spec,kind){return spec.timeoutMs??(kind==="shutdown"?SHUTDOWN_GRACE_MS:HOOK_TIMEOUT_MS)}function appendPluginLogRecord(pluginId,homeDir,record){try{let logPath=pluginLogPath(pluginId,homeDir);rotateLogIfNeeded(logPath,PLUGIN_LOG_CAP_BYTES),appendFileSync(logPath,`${JSON.stringify(record)}
3
3
  `,{mode:OWNER_ONLY_FILE_MODE})}catch{}}async function runPluginHook(opts){let{pluginId,spec,kind,label,homeDir}=opts,timeoutMs=hookTimeoutMs(spec,kind),startedAt=Date.now();try{mkdirSync(pluginConfigDir(pluginId,homeDir),{recursive:!0,mode:OWNER_ONLY_DIR_MODE}),mkdirSync(pluginStateDir(pluginId,homeDir),{recursive:!0,mode:OWNER_ONLY_DIR_MODE})}catch(err){appendPluginLogRecord(pluginId,homeDir,{at:startedAt,kind,label,command:spec.command,exitCode:null,durationMs:Date.now()-startedAt,spawnError:String(err)}),opts.log?.(`plugin ${pluginId} ${label}: ${String(err)}`);return}let exitCode=null,stdout="",stderr="",spawnError,timedOut=!1;if(await new Promise((resolve)=>{let[cmd,...args]=spec.command,child=spawn(cmd,args,{cwd:opts.pluginRoot,env:buildPluginEnv({homeDir,socketPath:opts.socketPath,binPath:opts.binPath,pluginId,pluginRoot:opts.pluginRoot,extra:opts.extraEnv}),stdio:["ignore","pipe","pipe"],...detachOptions(opts.platform)}),kill=()=>{try{if(child.pid&&(opts.platform??process.platform)==="win32")execFile("taskkill",["/pid",String(child.pid),"/T","/F"],{windowsHide:!0},(err)=>{if(err)child.kill("SIGKILL")});else if(child.pid)process.kill(-child.pid,"SIGKILL");else child.kill("SIGKILL")}catch{child.kill("SIGKILL")}},deadline=setTimeout(()=>{timedOut=!0,kill()},timeoutMs);deadline.unref?.();let slow=setTimeout(()=>{appendPluginLogRecord(pluginId,homeDir,{at:startedAt,kind,label,command:spec.command,phase:"running",runningMs:Date.now()-startedAt,timeoutMs})},Math.min(HOOK_SLOW_MS,Math.floor(timeoutMs/2)));slow.unref?.(),opts.inFlight?.add(kill);let finish=()=>{clearTimeout(deadline),clearTimeout(slow),opts.inFlight?.delete(kill),resolve()};child.stdout.on("data",(chunk)=>{if(stdout.length<OUTPUT_CAP)stdout+=chunk.toString().slice(0,OUTPUT_CAP-stdout.length)}),child.stderr.on("data",(chunk)=>{if(stderr.length<OUTPUT_CAP)stderr+=chunk.toString().slice(0,OUTPUT_CAP-stderr.length)}),child.on("error",(err)=>{spawnError=String(err),finish()}),child.on("close",(code)=>{exitCode=code,finish()})}),appendPluginLogRecord(pluginId,homeDir,{at:startedAt,kind,label,command:spec.command,exitCode,durationMs:Date.now()-startedAt,...timedOut?{timedOut:!0,timeoutMs}:{},...stdout?{stdout}:{},...stderr?{stderr}:{},...spawnError?{spawnError}:{}}),timedOut)opts.log?.(`plugin ${pluginId} ${label}: killed after ${timeoutMs}ms (hook did not exit)`);else if(spawnError||exitCode!==null&&exitCode!==0)opts.log?.(`plugin ${pluginId} ${label}: ${spawnError??`exit ${exitCode}`}`)}import{execFile as execFile2,spawn as spawn2}from"child_process";import{mkdirSync as mkdirSync2}from"fs";var MOD_MAX_PANES=8,MAX_LINE_BYTES=524288,RESTART_MIN_MS=1000,RESTART_MAX_MS=30000,HEALTHY_RUN_MS=60000;function treeHasControl(node,type,key){if(node.type===type)return node.key===key;if(node.type==="box")return node.children.some((child)=>treeHasControl(child,type,key));return!1}class ModHost{opts;mods=new Map;stopped=!1;constructor(opts){this.opts=opts}sync(specs){if(this.stopped)return;let next=new Map(specs.map((s)=>[s.pluginId,s]));for(let[id,running]of this.mods){let spec=next.get(id);if(!spec||spec.root!==running.spec.root||!sameCommand(spec.mod,running.spec.mod))this.retire(id)}for(let spec of specs)if(!this.mods.has(spec.pluginId))this.launch(spec);this.publish()}press(pluginId,paneId,key){return this.forward(pluginId,paneId,"button",key,{type:"press",pane:paneId,key})}submit(pluginId,paneId,key,value){if(value.length>MOD_INPUT_MAX)return"too-long";return this.forward(pluginId,paneId,"input",key,{type:"submit",pane:paneId,key,value})}deliver(pluginIds,event){for(let running of this.mods.values()){if(!pluginIds.has(running.spec.pluginId)||!running.events.has(event.event))continue;if(running.child?.stdin?.writable)running.child.stdin.write(`${JSON.stringify({type:"event",event})}
4
4
  `)}}forward(pluginId,paneId,type,key,msg){let running=this.mods.get(pluginId);if(!running?.child?.stdin?.writable)return"no-mod";let pane=running.panes.get(paneId);if(!pane)return"no-pane";if(!treeHasControl(pane.tree,type,key))return"no-key";return running.child.stdin.write(`${JSON.stringify(msg)}
5
5
  `),"sent"}panes(){return[...this.mods.values()].flatMap((m)=>[...m.panes.values()])}stop(){if(this.stopped)return;this.stopped=!0;for(let id of[...this.mods.keys()])this.retire(id)}publish(){this.opts.publish(this.panes())}retire(pluginId){let running=this.mods.get(pluginId);if(!running)return;if(this.mods.delete(pluginId),running.restartTimer)clearTimeout(running.restartTimer);if(running.child)killGroup(running.child,this.opts.platform);running.child=null}launch(spec){let running={spec,child:null,startedAt:0,backoffMs:RESTART_MIN_MS,restartTimer:void 0,panes:new Map,events:new Set};this.mods.set(spec.pluginId,running),this.spawnChild(running)}record(running,record){appendPluginLogRecord(running.spec.pluginId,this.opts.homeDir,{at:Date.now(),kind:"mod",...record})}spawnChild(running){let{pluginId,root,mod}=running.spec,[cmd,...args]=mod.command,child;try{mkdirSync2(pluginConfigDir(pluginId,this.opts.homeDir),{recursive:!0,mode:OWNER_ONLY_DIR_MODE}),mkdirSync2(pluginStateDir(pluginId,this.opts.homeDir),{recursive:!0,mode:OWNER_ONLY_DIR_MODE}),child=spawn2(cmd,args,{cwd:root,env:buildPluginEnv({homeDir:this.opts.homeDir,socketPath:this.opts.socketPath,binPath:this.opts.binPath,pluginId,pluginRoot:root,extra:{ROVE_PLUGIN_EVENT:"mod"}}),stdio:["pipe","pipe","pipe"],...detachOptions(this.opts.platform)})}catch(err){this.record(running,{spawnError:String(err)}),this.scheduleRestart(running);return}running.child=child,running.events=new Set,running.startedAt=Date.now(),this.record(running,{phase:"started",command:mod.command}),child.stdin?.on("error",()=>{}),readLines(child,"stdout",(line)=>this.onLine(running,child,line)),readLines(child,"stderr",(line)=>this.record(running,{stderr:line.slice(0,2048)})),child.on("error",(err)=>this.record(running,{spawnError:String(err)})),child.on("close",(code,signal)=>{if(running.child!==child)return;if(running.child=null,this.record(running,{phase:"exited",exitCode:code,...signal?{signal}:{}}),this.opts.log?.(`mod ${pluginId} exited (${signal??`exit ${code}`})`),running.panes.size>0)running.panes.clear(),this.publish();if(Date.now()-running.startedAt>=HEALTHY_RUN_MS)running.backoffMs=RESTART_MIN_MS;this.scheduleRestart(running)})}scheduleRestart(running){if(this.stopped||this.mods.get(running.spec.pluginId)!==running)return;let delay=running.backoffMs;running.backoffMs=Math.min(running.backoffMs*2,RESTART_MAX_MS),running.restartTimer=setTimeout(()=>{if(running.restartTimer=void 0,this.stopped||this.mods.get(running.spec.pluginId)!==running)return;this.spawnChild(running)},delay),running.restartTimer.unref?.()}onLine(running,child,line){if(running.child!==child||line.trim()==="")return;let msg;try{msg=JSON.parse(line)}catch{this.record(running,{refused:"stdout line is not JSON",line:line.slice(0,200)});return}let refused=this.apply(running,msg);if(refused)this.record(running,{refused})}apply(running,msg){if(msg.type==="subscribe"){if(!Array.isArray(msg.events)||!msg.events.every((e)=>typeof e==="string"))return"subscribe needs events: string[]";return running.events=new Set(msg.events),null}if(typeof msg.id!=="string"||!MOD_PANE_ID_PATTERN.test(msg.id))return"bad pane id";if(msg.type==="close"){if(running.panes.delete(msg.id))this.publish();return null}if(msg.type!=="pane")return`unknown message type ${JSON.stringify(msg.type)}`;if(typeof msg.title!=="string"||msg.title.length===0||msg.title.length>MOD_TITLE_MAX)return`pane ${msg.id}: title must be 1-${MOD_TITLE_MAX} chars`;if(!running.panes.has(msg.id)&&running.panes.size>=MOD_MAX_PANES)return`pane ${msg.id}: more than ${MOD_MAX_PANES} panes`;let tree=validateModTree(msg.tree);if(!tree.ok)return`pane ${msg.id}: ${tree.error}`;return running.panes.set(msg.id,{plugin:running.spec.pluginId,id:msg.id,title:msg.title,tree:tree.tree}),this.publish(),null}}function sameCommand(a,b){return a.command.length===b.command.length&&a.command.every((part,i)=>part===b.command[i])}function killGroup(child,platform=process.platform){try{if(child.pid&&platform==="win32")execFile2("taskkill",["/pid",String(child.pid),"/T","/F"],{windowsHide:!0},(err)=>{if(err)child.kill("SIGTERM")});else if(child.pid)process.kill(-child.pid,"SIGTERM");else child.kill("SIGTERM")}catch{child.kill("SIGTERM")}}function readLines(child,stream,onLine){let buf="";child[stream]?.on("data",(chunk)=>{buf+=chunk.toString();let nl=buf.indexOf(`
@@ -1,11 +1,11 @@
1
1
  // @bun
2
- import{ThemeInstallError,isThemeName,parseTheme,writeUserTheme}from"./chunk-wfgrn8p2.js";import{BUNDLED_THEME_JSONS,userThemesDir}from"./chunk-kxp04jnp.js";import{expandTilde}from"./chunk-2r1fgng9.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{SUBCOMMAND_VERBS}from"./chunk-qqr4tfhk.js";import"./chunk-7ghwdjdc.js";import"./chunk-z1nj22va.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-pn5ygqn6.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";import{existsSync,readFileSync,readdirSync,unlinkSync}from"fs";import{basename,join,resolve}from"path";var CLI_NAME=ROVE_PRODUCT_NAME,THEME_VERB_ALIASES={ls:"list",rm:"remove"},BUNDLED_NAMES=Object.keys(BUNDLED_THEME_JSONS);function fail(message){process.stderr.write(`${CLI_NAME} theme: ${message}
2
+ import{ThemeInstallError,isThemeName,parseThemeSource,writeUserTheme}from"./chunk-xaam0d8r.js";import"./chunk-8ng1756g.js";import{BUNDLED_THEME_JSONS,userThemesDir}from"./chunk-kxp04jnp.js";import{expandTilde}from"./chunk-2r1fgng9.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{SUBCOMMAND_VERBS}from"./chunk-qqr4tfhk.js";import"./chunk-7ghwdjdc.js";import"./chunk-z1nj22va.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-pn5ygqn6.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";import{existsSync,readFileSync,readdirSync,unlinkSync}from"fs";import{basename,join,resolve}from"path";var CLI_NAME=ROVE_PRODUCT_NAME,THEME_VERB_ALIASES={ls:"list",rm:"remove"},BUNDLED_NAMES=Object.keys(BUNDLED_THEME_JSONS);function fail(message){process.stderr.write(`${CLI_NAME} theme: ${message}
3
3
  Run ${CLI_NAME} theme --help for valid names and options.
4
4
  `),process.exit(1)}function failUsage(message){process.stderr.write(`${CLI_NAME} theme: ${message}
5
5
 
6
6
  `),printUsage(),process.exit(2)}function listThemes(){let lines=[];lines.push("bundled:");for(let name of[...BUNDLED_NAMES].sort())lines.push(` ${name} [built-in]`);let dir=userThemesDir(),userFiles=[];try{userFiles=readdirSync(dir).filter((f)=>f.endsWith(".json")).sort()}catch{}if(lines.push(""),lines.push(`user (${dir}):`),userFiles.length===0)lines.push(" (none)");else for(let f of userFiles){let name=f.slice(0,-5),path=join(dir,f),overridesBundled=BUNDLED_NAMES.includes(name)?" (overrides built-in)":"";lines.push(` ${name}${overridesBundled} ${path}`)}process.stdout.write(`${lines.join(`
7
7
  `)}
8
- `)}async function readSource(source){if(/^https?:\/\//i.test(source)){let res;try{res=await fetch(source)}catch(err){fail(`failed to fetch ${source}: ${errorMessage(err)}`)}if(!res.ok)fail(`failed to fetch ${source}: HTTP ${res.status} ${res.statusText}`);let text2=await res.text(),cleanPath=source.split(/[?#]/)[0]??source,file2=basename(cleanPath)||"theme.json",defaultName2=file2.endsWith(".json")?file2.slice(0,-5):file2;return{text:text2,defaultName:defaultName2}}let abs=resolve(process.cwd(),expandTilde(source)),text;try{text=readFileSync(abs,"utf8")}catch(err){fail(`failed to read ${abs}: ${errorMessage(err)}`)}let file=basename(abs),defaultName=file.endsWith(".json")?file.slice(0,-5):file;return{text,defaultName}}function parseAddArgs(args){let source=null,name,force=!1;for(let i=0;i<args.length;i+=1){let a=args[i];if(a==="--force"||a==="-f"){force=!0;continue}if(a==="--name"||a==="-n"){let next=args[i+1];if(next===void 0)failUsage("--name requires a value");name=next,i+=1;continue}if(a.startsWith("--name=")){name=a.slice(7);continue}if(a.startsWith("--"))failUsage(`unknown flag: ${a}`);if(source===null){source=a;continue}failUsage(`unexpected positional argument: ${a}`)}if(source===null)failUsage("missing <source> (URL or path to theme JSON)");return{source,opts:{name,force}}}async function addTheme(args){let{source,opts}=parseAddArgs(args),{text,defaultName}=await readSource(source);try{let dest=writeUserTheme(opts.name??defaultName,parseTheme(text),opts.force);process.stdout.write(`installed theme "${opts.name??defaultName}" -> ${dest}
8
+ `)}async function readSource(source){if(/^https?:\/\//i.test(source)){let res;try{res=await fetch(source)}catch(err){fail(`failed to fetch ${source}: ${errorMessage(err)}`)}if(!res.ok)fail(`failed to fetch ${source}: HTTP ${res.status} ${res.statusText}`);let text2=await res.text(),cleanPath=source.split(/[?#]/)[0]??source,file2=basename(cleanPath)||"theme.json",defaultName2=file2.endsWith(".json")?file2.slice(0,-5):file2;return{text:text2,defaultName:defaultName2}}let abs=resolve(process.cwd(),expandTilde(source)),text;try{text=readFileSync(abs,"utf8")}catch(err){fail(`failed to read ${abs}: ${errorMessage(err)}`)}let file=basename(abs),defaultName=file.endsWith(".json")?file.slice(0,-5):file;return{text,defaultName}}function parseAddArgs(args){let source=null,name,force=!1;for(let i=0;i<args.length;i+=1){let a=args[i];if(a==="--force"||a==="-f"){force=!0;continue}if(a==="--name"||a==="-n"){let next=args[i+1];if(next===void 0)failUsage("--name requires a value");name=next,i+=1;continue}if(a.startsWith("--name=")){name=a.slice(7);continue}if(a.startsWith("--"))failUsage(`unknown flag: ${a}`);if(source===null){source=a;continue}failUsage(`unexpected positional argument: ${a}`)}if(source===null)failUsage("missing <source> (URL or path to theme JSON)");return{source,opts:{name,force}}}async function addTheme(args){let{source,opts}=parseAddArgs(args),{text,defaultName}=await readSource(source);try{let{theme,fromScheme}=parseThemeSource(text),name=opts.name??(fromScheme?defaultName.replace(/(.)\.[^.]+$/,"$1"):defaultName),dest=writeUserTheme(name,theme,opts.force);process.stdout.write(`installed theme "${name}"${fromScheme?" from a terminal color scheme":""} -> ${dest}
9
9
  `)}catch(err){if(err instanceof ThemeInstallError)fail(err.message);throw err}}function requireThemeName(name){if(!isThemeName(name))fail(`invalid theme name "${name}" (use letters, digits, '.', '_', '-')`);return name}function removeTheme(args){if(!args[0])failUsage("missing <name>");if(args.length>1)failUsage(`unexpected extra arguments after "${args[0]}"`);let name=requireThemeName(args[0]);if(BUNDLED_NAMES.includes(name))fail(`"${name}" is a built-in theme and cannot be removed`);let dest=join(userThemesDir(),`${name}.json`);if(!existsSync(dest))fail(`no user theme named "${name}" (looked for ${dest})`);unlinkSync(dest),process.stdout.write(`removed theme "${name}" (${dest})
10
- `)}function printUsage(out=process.stderr){out.write([`Usage: ${CLI_NAME} theme <command> [args]`,"","Commands:"," list List bundled and user-installed themes"," add <source> [--name <name>] Install a theme from a URL or local path"," Pass --force to overwrite an existing user theme"," remove <name> Remove a user-installed theme","",`User themes live under: ${userThemesDir()}`,"Schema: https://raw.githubusercontent.com/sma1lboy/rove/main/packages/rove/src/tui/context/theme/theme.schema.json",""].join(`
10
+ `)}function printUsage(out=process.stderr){out.write([`Usage: ${CLI_NAME} theme <command> [args]`,"","Commands:"," list List bundled and user-installed themes"," add <source> [--name <name>] Install a theme from a URL or local path: a theme JSON,"," or a terminal color scheme file (background, foreground, ANSI palette)"," Pass --force to overwrite an existing user theme"," remove <name> Remove a user-installed theme","",`User themes live under: ${userThemesDir()}`,"Schema: https://raw.githubusercontent.com/sma1lboy/rove/main/packages/rove/src/tui/context/theme/theme.schema.json",""].join(`
11
11
  `))}async function runThemeSubcommand(args){let[action,...rest]=args;if(!action||action==="--help"||action==="-h"||action==="help"){if(printUsage(action?process.stdout:process.stderr),!action)process.exit(2);return}let verb=THEME_VERB_ALIASES[action]??action;if(!SUBCOMMAND_VERBS.theme.includes(verb))failUsage(`unknown action "${action}" (try ${SUBCOMMAND_VERBS.theme.map((v)=>`"${v}"`).join(", ")})`);if(verb==="list"){if(rest.length>0)failUsage(`"${action}" takes no arguments`);listThemes();return}if(verb==="add"){await addTheme(rest);return}if(verb==="remove"){removeTheme(rest);return}failUsage(`unknown action "${action}"`)}export{runThemeSubcommand};
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import{normalizeHex}from"./chunk-8ng1756g.js";import{userThemesDir,validateTheme}from"./chunk-kxp04jnp.js";import{existsSync,mkdirSync,writeFileSync}from"fs";import{join}from"path";var ANSI_NAMES=["black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite"];function color(raw){let value=(raw.trim().split(/\s+/)[0]??"").replace(/^["']|["']$/g,"");return normalizeHex(value.startsWith("#")?value:`#${value}`)}function normalizeKey(raw){return raw.trim().replace(/^.*[.*]/,"").replace(/[-_]/g,"").toLowerCase()}function splitLine(line){let trimmed=line.trim();if(trimmed===""||trimmed.startsWith("#")||trimmed.startsWith("!")||trimmed.startsWith(";"))return null;let m=/^([^\s=:]+)\s*(?:[=:]\s*|\s+)(.+)$/.exec(trimmed);return m?[m[1],m[2].trim()]:null}function parseTerminalScheme(text){let background=null,foreground=null,ansi=Array(16).fill(void 0);for(let line of text.split(/\r?\n/)){let pair=splitLine(line);if(!pair)continue;let key=normalizeKey(pair[0]),value=pair[1];if(key==="palette"){let m=/^(\d{1,2})\s*[=:]\s*(\S+)/.exec(value),index=m?Number(m[1]):-1,hex2=m?color(m[2]):null;if(hex2&&index>=0&&index<16)ansi[index]=hex2;continue}let indexed=/^color(\d{1,2})$/.exec(key);if(indexed){let index=Number(indexed[1]),hex2=color(value);if(hex2&&index<16)ansi[index]=hex2;continue}if(key!=="background"&&key!=="foreground")continue;let hex=color(value);if(!hex)continue;if(key==="background")background=hex;else foreground=hex}if(!background||!foreground)return null;return{background,foreground,ansi}}function mix(from,to,amount){let channel=(hex,i)=>Number.parseInt(hex.slice(1+i*2,3+i*2),16),out="#";for(let i=0;i<3;i++){let value=Math.round(channel(from,i)+(channel(to,i)-channel(from,i))*amount);out+=value.toString(16).padStart(2,"0")}return out}function themeFromTerminalScheme(scheme){let defs={background:scheme.background,foreground:scheme.foreground};scheme.ansi.forEach((hex,i)=>{if(hex)defs[ANSI_NAMES[i]]=hex});let{background:bg,foreground:fg}=scheme;defs.panel=mix(bg,fg,0.04),defs.element=mix(bg,fg,0.08),defs.menu=mix(bg,fg,0.12),defs.borderSubtle=mix(bg,fg,0.14),defs.border=mix(bg,fg,0.24),defs.borderActive=mix(bg,fg,0.5),defs.muted=mix(fg,bg,0.35),defs.subtle=mix(fg,bg,0.55);let theme={text:"foreground",textMuted:"muted",background:"background",backgroundPanel:"panel",backgroundElement:"element",backgroundMenu:"menu",backgroundDialog:"panel",border:"border",borderActive:"borderActive",borderSubtle:"borderSubtle",diffContext:"muted",diffHunkHeader:"muted",markdownText:"foreground",markdownBlockQuote:"muted",markdownHorizontalRule:"muted",markdownCodeBlock:"foreground",syntaxComment:"subtle",syntaxVariable:"foreground",syntaxPunctuation:"foreground",selectedListItemText:"background"},hues=[["primary","blue","brightBlue"],["secondary","magenta","brightMagenta"],["accent","cyan","brightCyan"],["error","red","brightRed"],["warning","yellow","brightYellow"],["success","green","brightGreen"],["info","cyan","brightCyan"],["diffAdded","green","brightGreen"],["diffRemoved","red","brightRed"],["markdownHeading","blue","brightBlue"],["markdownLink","cyan","brightCyan"],["markdownLinkText","blue","brightBlue"],["markdownCode","green","brightGreen"],["markdownEmph","yellow","brightYellow"],["markdownStrong","magenta","brightMagenta"],["markdownListItem","cyan","brightCyan"],["syntaxKeyword","magenta","brightMagenta"],["syntaxFunction","blue","brightBlue"],["syntaxString","green","brightGreen"],["syntaxNumber","yellow","brightYellow"],["syntaxType","cyan","brightCyan"],["syntaxOperator","cyan","brightCyan"]];for(let[slot,...names]of hues){let name=names.find((n)=>defs[n]);if(name)theme[slot]=name}if(defs.green)defs.addedBg=mix(bg,defs.green,0.16);if(defs.red)defs.removedBg=mix(bg,defs.red,0.16);if(defs.addedBg)theme.diffAddedBg="addedBg";if(defs.removedBg)theme.diffRemovedBg="removedBg";let ref=(name)=>`scheme.${name}`;return{defs:Object.fromEntries(Object.entries(defs).map(([name,hex])=>[ref(name),hex])),theme:Object.fromEntries(Object.entries(theme).map(([slot,name])=>[slot,ref(name)]))}}var HOSTED_THEMES=["catppuccin","dracula","everforest","gruvbox","kanagawa","nord","opencode","osaka-jade","rose-pine","solarized"],hostedThemeUrl=(name)=>`https://rove.run/themes/${name}.json`;class ThemeInstallError extends Error{}function parseTheme(text){let parsed;try{parsed=JSON.parse(text)}catch(err){throw new ThemeInstallError(`source is not valid JSON: ${err instanceof Error?err.message:String(err)}`)}let result=validateTheme(parsed);if(!result.ok)throw new ThemeInstallError(`source is not a valid Rove theme: ${result.reason}`);return result.theme}function parseThemeSource(text){if(text.trimStart().startsWith("{"))return{theme:parseTheme(text),fromScheme:!1};let scheme=parseTerminalScheme(text);if(!scheme)throw new ThemeInstallError("source is neither a Rove theme JSON nor a terminal color scheme (no `background` and `foreground` colors)");return{theme:parseTheme(JSON.stringify(themeFromTerminalScheme(scheme))),fromScheme:!0}}function isThemeName(name){return!!name&&/^[a-zA-Z0-9._-]+$/.test(name)&&name!=="."&&name!==".."}function writeUserTheme(name,theme,force){if(!isThemeName(name))throw new ThemeInstallError(`invalid theme name "${name}" (use letters, digits, '.', '_', '-')`);let dir=userThemesDir();mkdirSync(dir,{recursive:!0});let dest=join(dir,`${name}.json`);if(existsSync(dest)&&!force)throw new ThemeInstallError(`${dest} already exists (pass --force to overwrite)`);return writeFileSync(dest,`${JSON.stringify(theme,null,2)}
3
+ `,"utf8"),dest}
4
+ export{HOSTED_THEMES,hostedThemeUrl,ThemeInstallError,parseTheme,parseThemeSource,isThemeName,writeUserTheme};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{launchTui,trackWelcomeWrite}from"./chunk-zp0q931y.js";import"./chunk-91sykzqq.js";export{trackWelcomeWrite,launchTui};
2
+ import{launchTui,trackWelcomeWrite}from"./chunk-14tevt5v.js";import"./chunk-91sykzqq.js";export{trackWelcomeWrite,launchTui};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{connectIfRunning}from"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import{__require}from"./chunk-91sykzqq.js";async function openLocalOrchestrator(){let{TaskIndexStore}=await import("./chunk-pfagrkt6.js"),{GitWorktreeManager}=await import("./chunk-4w4tpsqx.js"),{Orchestrator}=await import("./chunk-cakyme4s.js"),store=new TaskIndexStore;return await store.load(),new Orchestrator({store,worktrees:new GitWorktreeManager})}async function withDaemonOrLocal(bridge){let client=await connectIfRunning();if(client)try{return await bridge.daemon(client)}finally{client.close()}let orch=await openLocalOrchestrator();return bridge.local(orch)}export{withDaemonOrLocal,openLocalOrchestrator};
2
+ import{connectIfRunning}from"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import{__require}from"./chunk-91sykzqq.js";async function openLocalOrchestrator(){let{TaskIndexStore}=await import("./chunk-pfagrkt6.js"),{GitWorktreeManager}=await import("./chunk-4w4tpsqx.js"),{Orchestrator}=await import("./chunk-z8rvxvx5.js"),store=new TaskIndexStore;return await store.load(),new Orchestrator({store,worktrees:new GitWorktreeManager})}async function withDaemonOrLocal(bridge){let client=await connectIfRunning();if(client)try{return await bridge.daemon(client)}finally{client.close()}let orch=await openLocalOrchestrator();return bridge.local(orch)}export{withDaemonOrLocal,openLocalOrchestrator};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{argvToParams,booleanFlagsOf,callVerb,errorBody,errorEnvelope,executeVerb,paramsToFlags,repeatableFlagsOf,runVerb,successEnvelope,toApiError}from"./chunk-cs410j8b.js";import"./chunk-btxfcc77.js";import"./chunk-tgv90744.js";import"./chunk-kdnk8m5j.js";import"./chunk-qcjkactr.js";import"./chunk-rjfdzjhj.js";import"./chunk-zpxpwgds.js";import"./chunk-agvtzads.js";import"./chunk-pm91e38v.js";import"./chunk-2xsxcdp6.js";import"./chunk-17e2tgyg.js";import"./chunk-1vxtd8rh.js";import"./chunk-q8ffd1pc.js";import"./chunk-4hestsjp.js";import"./chunk-qgrg9a5n.js";import"./chunk-2bgmby1d.js";import"./chunk-n0rdn2fn.js";import"./chunk-5mhvjytn.js";import"./chunk-atn06ncf.js";import"./chunk-01tghgf3.js";import"./chunk-y07cp9mb.js";import"./chunk-vytrhm50.js";import"./chunk-vp29jgbt.js";import"./chunk-gq36nzg8.js";import"./chunk-sq6zj3fb.js";import"./chunk-qkehg2c1.js";import"./chunk-w6ft4djp.js";import"./chunk-vx44yxra.js";import"./chunk-z43e08kw.js";import"./chunk-w77s2df8.js";import"./chunk-mqfvzdpr.js";import"./chunk-gzkes5bw.js";import"./chunk-rxqdw6s5.js";import"./chunk-8ng1756g.js";import"./chunk-kxp04jnp.js";import"./chunk-1a57ejnh.js";import"./chunk-qecygh3f.js";import"./chunk-rjq38twt.js";import"./chunk-r5j8fycq.js";import"./chunk-xfgqae9t.js";import"./chunk-j1z9kgyd.js";import"./chunk-g9ba25q5.js";import"./chunk-ggnq2vvk.js";import"./chunk-hpay0ax8.js";import"./chunk-catrr0z3.js";import"./chunk-mdc7b01e.js";import"./chunk-tn9gtf18.js";import"./chunk-895yqjjz.js";import"./chunk-sak1tphp.js";import"./chunk-y1xnjx8x.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-5rgrde6b.js";import"./chunk-4gjvmfa9.js";import"./chunk-2tfnscxk.js";import"./chunk-hzz020xx.js";import"./chunk-w7zv47mp.js";import"./chunk-etfh8f4z.js";import"./chunk-9rj2fx6v.js";import"./chunk-rfp0ayra.js";import"./chunk-t7j8g9f6.js";import"./chunk-dmzg9zdc.js";import"./chunk-40dgv828.js";import"./chunk-kg9kmwt9.js";import"./chunk-6xppe9bj.js";import"./chunk-yn01fet6.js";import"./chunk-zsfyj36g.js";import"./chunk-2r1fgng9.js";import"./chunk-2brn8e1y.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import"./chunk-a5xbsvx2.js";import"./chunk-9vwb9f7q.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7bakcyes.js";import"./chunk-8qkyd589.js";import"./chunk-7kysxgbq.js";import"./chunk-hz1x3hak.js";import"./chunk-x1jxxmtc.js";import"./chunk-xy8be792.js";import"./chunk-h2m7em1e.js";import"./chunk-7ghwdjdc.js";import"./chunk-8t7qbr1e.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-pxk2c2vj.js";import"./chunk-91sykzqq.js";export{toApiError,successEnvelope,runVerb,repeatableFlagsOf,paramsToFlags,executeVerb,errorEnvelope,errorBody,callVerb,booleanFlagsOf,argvToParams};