@sma1lboy/rove 0.9.103 → 0.9.104

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 (48) hide show
  1. package/dist/cli/index.js +27 -21
  2. package/dist/cli/kobe-run.js +27 -21
  3. package/dist/cli/kobe.js +1 -1
  4. package/dist/cli/rove-run.js +27 -21
  5. package/dist/cli/rove.js +1 -1
  6. package/dist/web-ui/assets/{AppShell-BcGCm5H6.js → AppShell-BGRIs5hW.js} +1 -1
  7. package/dist/web-ui/assets/{Board-C2F4oEsF.js → Board-Bt3cwp25.js} +1 -1
  8. package/dist/web-ui/assets/{BoardPeek-D-ncWCsm.js → BoardPeek-BKR-tpS2.js} +2 -2
  9. package/dist/web-ui/assets/{ChatTerminal-DyarPJ69.js → ChatTerminal-BshL3M8G.js} +1 -1
  10. package/dist/web-ui/assets/{ChatTranscript-CtdnV2Du.js → ChatTranscript-B67_nnd6.js} +1 -1
  11. package/dist/web-ui/assets/{ConfirmDialog-BjevP66y.js → ConfirmDialog-kyA624OF.js} +1 -1
  12. package/dist/web-ui/assets/{IssueIntakePanel-B03-GRAE.js → IssueIntakePanel-BMP8Vc3E.js} +1 -1
  13. package/dist/web-ui/assets/{IssuePeek-DZ4Pdzwu.js → IssuePeek-C7afOYax.js} +1 -1
  14. package/dist/web-ui/assets/{IssuesPage-B8tW73tv.js → IssuesPage-DwRaBB-m.js} +1 -1
  15. package/dist/web-ui/assets/{SettingsPage-CUujnZpM.js → SettingsPage-CC1sDI8j.js} +1 -1
  16. package/dist/web-ui/assets/{SlideOver-CXd5-cMd.js → SlideOver-Dq0ifiEm.js} +1 -1
  17. package/dist/web-ui/assets/{ViewToggle-pNYu_31e.js → ViewToggle-mNsDLJp8.js} +1 -1
  18. package/dist/web-ui/assets/{WorkspaceTabs-eC5_ZxCF.js → WorkspaceTabs-ifAIZ5Fj.js} +3 -3
  19. package/dist/web-ui/assets/active-task-gVYiAkLv.js +1 -0
  20. package/dist/web-ui/assets/arrow-left-CavMh90a.js +1 -0
  21. package/dist/web-ui/assets/board-DoArj55z.js +1 -0
  22. package/dist/web-ui/assets/{chips-LcQRNyMn.js → chips-CS9PLtWy.js} +1 -1
  23. package/dist/web-ui/assets/{createLucideIcon-DzfSOpX_.js → createLucideIcon-CuIQtyYV.js} +1 -1
  24. package/dist/web-ui/assets/{external-link-BF1a5X_p.js → external-link-Du2dMe8S.js} +1 -1
  25. package/dist/web-ui/assets/{external-store-DExSl1xD.js → external-store-BCBJewGi.js} +1 -1
  26. package/dist/web-ui/assets/{harness-IlIVV5QD.js → harness-ClZMF1wx.js} +1 -1
  27. package/dist/web-ui/assets/{index-BzLgyEfV.js → index-B4xJZEqf.js} +3 -3
  28. package/dist/web-ui/assets/{issues-B_xYV45L.js → issues-DwrKXp9c.js} +1 -1
  29. package/dist/web-ui/assets/issues-ISAZBras.js +1 -0
  30. package/dist/web-ui/assets/{lazy-issue-panels-si-BhG11.js → lazy-issue-panels-DvXQJhKy.js} +3 -3
  31. package/dist/web-ui/assets/{rotate-cw-BpWmhSdt.js → rotate-cw-BXdpzm3v.js} +1 -1
  32. package/dist/web-ui/assets/routes-DEEkL5gG.js +1 -0
  33. package/dist/web-ui/assets/{store-DMgnHRko.js → store-BLM6nh6E.js} +2 -2
  34. package/dist/web-ui/assets/{tabs-CRELMxoF.js → tabs-CMZJhcSB.js} +1 -1
  35. package/dist/web-ui/assets/task._taskId-BCIhg4IQ.js +1 -0
  36. package/dist/web-ui/assets/{terminal-B1H9J2fC.js → terminal-DOp1a9g6.js} +1 -1
  37. package/dist/web-ui/assets/{toast-fLh1SAZ0.js → toast-C4yXq6hM.js} +1 -1
  38. package/dist/web-ui/assets/{web-transport-D_ExG8BY.js → web-transport-Beqz2mQ8.js} +1 -1
  39. package/dist/web-ui/assets/{worktrees-CJ_wo1px.js → worktrees-BGvJOG2b.js} +1 -1
  40. package/dist/web-ui/index.html +8 -8
  41. package/dist/web-ui/pty-server.mjs +39 -18
  42. package/package.json +1 -1
  43. package/dist/web-ui/assets/active-task-CKN1iEVj.js +0 -1
  44. package/dist/web-ui/assets/arrow-left-DJr0sPsD.js +0 -1
  45. package/dist/web-ui/assets/board-MP72csFZ.js +0 -1
  46. package/dist/web-ui/assets/issues-z0SBKTL6.js +0 -1
  47. package/dist/web-ui/assets/routes-D6n8cO_S.js +0 -1
  48. package/dist/web-ui/assets/task._taskId-Bw2MDBs5.js +0 -1
@@ -1,4 +1,4 @@
1
- import{l as e,o as t,r as n}from"./terminal-B1H9J2fC.js";import{c as r,n as i}from"./tabs-CRELMxoF.js";import{p as a}from"./createLucideIcon-DzfSOpX_.js";import{t as o}from"./store-DMgnHRko.js";import{t as s}from"./active-task-CKN1iEVj.js";import{l as c}from"./index-BzLgyEfV.js";import{t as l}from"./text-match-DW3sD-Rt.js";var u=[{key:`backlog`,title:`Backlog`,accent:`text-subtle`,alwaysVisible:!0},{key:`in_progress`,title:`In progress`,accent:`text-kobe-orange`,alwaysVisible:!0},{key:`done`,title:`Done`,accent:`text-kobe-green`,alwaysVisible:!0}],d=new Set([`done`]);function f(e){return e.status===`done`?`done`:e.taskId!==void 0&&e.taskId!==``?`in_progress`:`backlog`}function p(e){return e.taskId!==void 0&&e.taskId!==``}function m(e,t){return e.issue.created===t.issue.created?t.issue.id-e.issue.id:e.issue.created<t.issue.created?1:-1}function h(e){let t=new Map,n=(e,n)=>{let r=t.get(e);r?r.push(n):t.set(e,[n])};for(let t of e)n(f(t.issue),t);for(let e of t.values())e.sort(m);let r=(e,t)=>!d.has(e)||t.length<=30?{cards:t,hiddenCount:0}:{cards:t.slice(0,30),hiddenCount:t.length-30};return u.map(e=>({...e,...r(e.key,t.get(e.key)??[])})).filter(e=>e.alwaysVisible||e.cards.length+e.hiddenCount>0)}function g(e){return e.reduce((e,t)=>e+t.cards.length,0)}function _(e){let t=new Map;for(let n of e){let e=n.repo,r=t.get(e);r?r.push(n):t.set(e,[n])}let n=[...t.keys()];return n.map(e=>({repo:e,label:y(e,n),columns:h(t.get(e)??[])})).sort((e,t)=>e.label.localeCompare(t.label))}function v(e){let t=e.replace(/\/+$/,``);return t.split(`/`).pop()||t}function y(e,t){let n=v(e);return t.some(t=>t!==e&&v(t)===n)?e.replace(/\/+$/,``).split(`/`).slice(-2).join(`/`):n}function b(e,t,n){let r=[];for(let i of t){let t=e[i];if(!(!t||!t.exists))for(let e of t.issues){let t=n.get(`${i}:${e.id}`);r.push(t&&!e.taskId?{repo:i,issue:{...e,taskId:t.taskId}}:{repo:i,issue:e})}}return r}function x(e){let t=new Map;for(let{repo:n}of e)t.set(n,(t.get(n)??0)+1);let n=[...t.keys()];return n.map(e=>({repo:e,label:y(e,n),count:t.get(e)??0})).sort((e,t)=>e.label.localeCompare(t.label))}function S(e,t,n){return e.filter(({repo:e,issue:r})=>n&&e!==n?!1:l(`#${r.id} ${r.title} ${r.body}`,t))}function C(e){let t=b(e.issueData,e.issueRepos,e.pendingLinks),n=x(t),r=_(S(t,e.query,e.repoFilter));return e.repoFilter&&r.length===0&&e.issueRepos.includes(e.repoFilter)&&r.push({repo:e.repoFilter,label:y(e.repoFilter,e.issueRepos),columns:h([])}),{allIssues:t,repoChips:n,projectBoards:r,shownCount:r.reduce((e,t)=>e+g(t.columns),0),hasAnyCard:t.length>0}}function w(e){let t=[`Work on user story #${e.id}: ${e.title}`,``],n=e.body.trim();return n&&t.push(n,``),t}function T(e,t,n){return[...w(e),`Treat this as the story's dedicated ${n} task session: work only in this task worktree, and preserve any repo init instructions already delivered to the session.`,`Before finishing, verify the acceptance criteria implied by the story and summarize what changed plus any verification still needed.`,`Then merge the task branch back into the current project's main branch after the worktree is clean and checks pass.`,`When the work lands, run: ${t} issue-set-status --repo . --id ${e.id} --status done`].join(`
1
+ import{l as e,o as t,r as n}from"./terminal-DOp1a9g6.js";import{c as r,n as i}from"./tabs-CMZJhcSB.js";import{p as a}from"./createLucideIcon-CuIQtyYV.js";import{t as o}from"./store-BLM6nh6E.js";import{t as s}from"./active-task-gVYiAkLv.js";import{l as c}from"./index-B4xJZEqf.js";import{t as l}from"./text-match-DW3sD-Rt.js";var u=[{key:`backlog`,title:`Backlog`,accent:`text-subtle`,alwaysVisible:!0},{key:`in_progress`,title:`In progress`,accent:`text-kobe-orange`,alwaysVisible:!0},{key:`done`,title:`Done`,accent:`text-kobe-green`,alwaysVisible:!0}],d=new Set([`done`]);function f(e){return e.status===`done`?`done`:e.taskId!==void 0&&e.taskId!==``?`in_progress`:`backlog`}function p(e){return e.taskId!==void 0&&e.taskId!==``}function m(e,t){return e.issue.created===t.issue.created?t.issue.id-e.issue.id:e.issue.created<t.issue.created?1:-1}function h(e){let t=new Map,n=(e,n)=>{let r=t.get(e);r?r.push(n):t.set(e,[n])};for(let t of e)n(f(t.issue),t);for(let e of t.values())e.sort(m);let r=(e,t)=>!d.has(e)||t.length<=30?{cards:t,hiddenCount:0}:{cards:t.slice(0,30),hiddenCount:t.length-30};return u.map(e=>({...e,...r(e.key,t.get(e.key)??[])})).filter(e=>e.alwaysVisible||e.cards.length+e.hiddenCount>0)}function g(e){return e.reduce((e,t)=>e+t.cards.length,0)}function _(e){let t=new Map;for(let n of e){let e=n.repo,r=t.get(e);r?r.push(n):t.set(e,[n])}let n=[...t.keys()];return n.map(e=>({repo:e,label:y(e,n),columns:h(t.get(e)??[])})).sort((e,t)=>e.label.localeCompare(t.label))}function v(e){let t=e.replace(/\/+$/,``);return t.split(`/`).pop()||t}function y(e,t){let n=v(e);return t.some(t=>t!==e&&v(t)===n)?e.replace(/\/+$/,``).split(`/`).slice(-2).join(`/`):n}function b(e,t,n){let r=[];for(let i of t){let t=e[i];if(!(!t||!t.exists))for(let e of t.issues){let t=n.get(`${i}:${e.id}`);r.push(t&&!e.taskId?{repo:i,issue:{...e,taskId:t.taskId}}:{repo:i,issue:e})}}return r}function x(e){let t=new Map;for(let{repo:n}of e)t.set(n,(t.get(n)??0)+1);let n=[...t.keys()];return n.map(e=>({repo:e,label:y(e,n),count:t.get(e)??0})).sort((e,t)=>e.label.localeCompare(t.label))}function S(e,t,n){return e.filter(({repo:e,issue:r})=>n&&e!==n?!1:l(`#${r.id} ${r.title} ${r.body}`,t))}function C(e){let t=b(e.issueData,e.issueRepos,e.pendingLinks),n=x(t),r=_(S(t,e.query,e.repoFilter));return e.repoFilter&&r.length===0&&e.issueRepos.includes(e.repoFilter)&&r.push({repo:e.repoFilter,label:y(e.repoFilter,e.issueRepos),columns:h([])}),{allIssues:t,repoChips:n,projectBoards:r,shownCount:r.reduce((e,t)=>e+g(t.columns),0),hasAnyCard:t.length>0}}function w(e){let t=[`Work on user story #${e.id}: ${e.title}`,``],n=e.body.trim();return n&&t.push(n,``),t}function T(e,t,n){return[...w(e),`Treat this as the story's dedicated ${n} task session: work only in this task worktree, and preserve any repo init instructions already delivered to the session.`,`Before finishing, verify the acceptance criteria implied by the story and summarize what changed plus any verification still needed.`,`Then merge the task branch back into the current project's main branch after the worktree is clean and checks pass.`,`When the work lands, run: ${t} issue-set-status --repo . --id ${e.id} --status done`].join(`
2
2
  `)}function E(e,t){return[...w(e),`You are working directly in the project checkout — no dedicated worktree or branch was created. Keep changes reviewable and do not switch branches unless asked.`,`Before finishing, verify the acceptance criteria implied by the story and summarize what changed plus any verification still needed.`,`When the work lands, run: ${t} issue-set-status --repo . --id ${e.id} --status done`].join(`
3
3
  `)}function D(e,t){return[`Finish user story #${e.id}: ${e.title}`,``,`Verify the acceptance criteria implied by the story, then summarize what changed and any verification still needed.`,`Then merge this task branch back into the current project's main branch after the worktree is clean and checks pass. Resolve conflicts if needed.`,`When the work lands, run: ${t} issue-set-status --repo . --id ${e.id} --status done`].join(`
4
4
  `)}var O=`${e} api`;async function k(){let e=await t.getOr(`/api/cli-invocation`,{},{label:`load CLI invocation`});return typeof e.api==`string`&&e.api.trim().length>0?e.api:O}async function A(){let e=await t.get(`/api/projects`,{label:`load projects`});return Array.isArray(e.projects)?e.projects.filter(e=>typeof e==`string`):[]}async function j(e){return t.get(`/api/issues`,{query:{repoRoot:e},label:`load issues`})}async function M(e,n){return t.post(`/api/issues`,{repoRoot:e,op:n},{label:`update issues`})}async function N(e,t){return M(e,{type:`create`,...t})}async function P(e,t,n){return M(e,{type:`setStatus`,id:t,status:n})}async function F(e,t,n){return M(e,{type:`update`,id:t,...n})}async function I(e,t,n){return M(e,{type:`link`,id:t,taskId:n})}async function L(e,t){return M(e,{type:`delete`,id:t})}var R=[`open`,`doing`,`hold`,`done`],z={open:{title:`Backlog`,accent:`text-kobe-blue`},doing:{title:`In session`,accent:`text-kobe-orange`},hold:{title:`Blocked`,accent:`text-kobe-yellow`},done:{title:`Done`,accent:`text-kobe-green`}};function B(e){return e!==`done`}function V(e,t){let n=(t.query??``).trim().toLowerCase(),r=t.statuses&&t.statuses.length>0?t.statuses:null;return e.filter(e=>r&&!r.includes(e.status)?!1:!n||`#${e.id} ${e.title} ${e.body}`.toLowerCase().includes(n))}function H(e){let t={open:[],doing:[],hold:[],done:[]};for(let n of e)t[n.status]?.push(n);let n=(e,t)=>e.created===t.created?t.id-e.id:e.created<t.created?1:-1;return t.open.sort(n),t.doing.sort(n),t.hold.sort(n),t.done.sort((e,t)=>t.id-e.id),t}function U(e,t=[]){let n=new Map;for(let e of t)e.trim().length>0&&n.set(e,0);let r=new Set(e.filter(e=>e.kind===`main`&&e.repo).map(e=>e.repo));for(let e of r)n.set(e,n.get(e)??0);let i=new Set(n.keys());for(let t of e)t.repo&&(i.size>0&&!i.has(t.repo)||n.set(t.repo,(n.get(t.repo)??0)+1));let a=[...n.keys()];return a.map(e=>({repo:e,label:y(e,a),count:n.get(e)??0})).sort((e,t)=>e.label.localeCompare(t.label))}function W(e,t){return e.length===0?null:t&&e.some(e=>e.repo===t)?t:e[0]?.repo??null}async function G(e,t,i,o){let c=await K(e,t,i,o);s(c);let l=await k().catch(()=>O),u=r(c);return await n(u,c,T(t,l,a())),{taskId:c}}async function K(e,t,n,r){let i=n?.trim()||await c(),{taskId:a}=await o(`task.create`,{repo:e,title:`#${t.id} ${t.title}`,...i?{vendor:i}:{},...r?.trim()?{effort:r.trim()}:{}});return await I(e,t.id,a).catch(()=>{}),a}async function q(e,t,r={}){let c=r.placement??`task`;if(c===`task`){let{taskId:n}=await G(e,t,r.vendor,r.effort);return{taskId:n,workspaceTaskId:n}}let l=await k().catch(()=>O),{task:u}=await o(`task.ensureMain`,{repo:e}),d=u.id;if(c===`projectWorktree`){let o=await K(e,t,r.vendor,r.effort);s(d);let c=i(d,o);return await n(c,o,T(t,l,a())),{taskId:o,workspaceTaskId:d}}let f=r.vendor?.trim();f&&await o(`task.setVendor`,{taskId:d,vendor:f}),s(d),await P(e,t.id,`doing`).catch(()=>{});let p=i(d);return await n(p,d,E(t,l)),{taskId:d,workspaceTaskId:d}}async function J(e,t){let i=await k().catch(()=>O),a=r(e);await n(a,e,D(t,i))}export{p as _,L as a,V as c,J as d,G as f,C as g,F as h,N as i,H as l,q as m,z as n,j as o,W as p,B as r,A as s,R as t,U as u};
@@ -0,0 +1 @@
1
+ import{IssuesPage as e}from"./IssuesPage-DwRaBB-m.js";var t=e;export{t as component};
@@ -1,6 +1,6 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/IssueIntakePanel-B03-GRAE.js","assets/terminal-B1H9J2fC.js","assets/tabs-CRELMxoF.js","assets/createLucideIcon-DzfSOpX_.js","assets/issues-B_xYV45L.js","assets/store-DMgnHRko.js","assets/active-task-CKN1iEVj.js","assets/index-BzLgyEfV.js","assets/toast-fLh1SAZ0.js","assets/external-store-DExSl1xD.js","assets/index-BnjD9Q-3.css","assets/text-match-DW3sD-Rt.js","assets/SlideOver-CXd5-cMd.js","assets/SlideOver-B4sEOPyN.css","assets/IssuePeek-DZ4Pdzwu.js","assets/external-link-BF1a5X_p.js"])))=>i.map(i=>d[i]);
2
- import{f as e}from"./terminal-B1H9J2fC.js";import{y as t}from"./tabs-CRELMxoF.js";import{m as n,t as r}from"./createLucideIcon-DzfSOpX_.js";import{i,n as a,r as o}from"./store-DMgnHRko.js";import{i as s}from"./chips-LcQRNyMn.js";import{o as c}from"./issues-B_xYV45L.js";var l=r(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),u=r(`trash-2`,[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]]),d=e(t(),1);function f(e){let{issueSnapshots:t}=a(),[n,r]=(0,d.useState)({}),[i,s]=(0,d.useState)({}),[l,u]=(0,d.useState)(!1),f=(0,d.useRef)(new Map),p=(0,d.useRef)(new Map),m=(0,d.useRef)(new Map),h=(0,d.useRef)(new Map),g=(0,d.useCallback)(e=>{let t=(f.current.get(e)??0)+1;return f.current.set(e,t),t},[]),_=(0,d.useCallback)((e,t,n=e.repoRoot)=>{t<(p.current.get(n)??0)||(p.current.set(n,t),e.repoRoot&&e.repoRoot!==n&&h.current.set(n,e.repoRoot),r(t=>({...t,[n]:{...e,repoRoot:n}})),s(e=>{if(!(n in e))return e;let{[n]:t,...r}=e;return r}))},[]),v=(0,d.useCallback)(e=>{e.length!==0&&(u(!0),Promise.all(e.map(async e=>{let t=g(e);try{_(await c(e),t,e)}catch(t){s(n=>({...n,[e]:t instanceof Error?t.message:String(t)}))}})).finally(()=>u(!1)))},[g,_]),y=(0,d.useMemo)(()=>[...e].join(`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/IssueIntakePanel-BMP8Vc3E.js","assets/terminal-DOp1a9g6.js","assets/tabs-CMZJhcSB.js","assets/createLucideIcon-CuIQtyYV.js","assets/issues-DwrKXp9c.js","assets/store-BLM6nh6E.js","assets/active-task-gVYiAkLv.js","assets/index-B4xJZEqf.js","assets/toast-C4yXq6hM.js","assets/external-store-BCBJewGi.js","assets/index-BnjD9Q-3.css","assets/text-match-DW3sD-Rt.js","assets/SlideOver-Dq0ifiEm.js","assets/SlideOver-B4sEOPyN.css","assets/IssuePeek-C7afOYax.js","assets/external-link-Du2dMe8S.js"])))=>i.map(i=>d[i]);
2
+ import{f as e}from"./terminal-DOp1a9g6.js";import{y as t}from"./tabs-CMZJhcSB.js";import{m as n,t as r}from"./createLucideIcon-CuIQtyYV.js";import{i,n as a,r as o}from"./store-BLM6nh6E.js";import{i as s}from"./chips-CS9PLtWy.js";import{o as c}from"./issues-DwrKXp9c.js";var l=r(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),u=r(`trash-2`,[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]]),d=e(t(),1);function f(e){let{issueSnapshots:t}=a(),[n,r]=(0,d.useState)({}),[i,s]=(0,d.useState)({}),[l,u]=(0,d.useState)(!1),f=(0,d.useRef)(new Map),p=(0,d.useRef)(new Map),m=(0,d.useRef)(new Map),h=(0,d.useRef)(new Map),g=(0,d.useCallback)(e=>{let t=(f.current.get(e)??0)+1;return f.current.set(e,t),t},[]),_=(0,d.useCallback)((e,t,n=e.repoRoot)=>{t<(p.current.get(n)??0)||(p.current.set(n,t),e.repoRoot&&e.repoRoot!==n&&h.current.set(n,e.repoRoot),r(t=>({...t,[n]:{...e,repoRoot:n}})),s(e=>{if(!(n in e))return e;let{[n]:t,...r}=e;return r}))},[]),v=(0,d.useCallback)(e=>{e.length!==0&&(u(!0),Promise.all(e.map(async e=>{let t=g(e);try{_(await c(e),t,e)}catch(t){s(n=>({...n,[e]:t instanceof Error?t.message:String(t)}))}})).finally(()=>u(!1)))},[g,_]),y=(0,d.useMemo)(()=>[...e].join(`
3
3
  `),[e]);return(0,d.useEffect)(()=>{v(y?y.split(`
4
4
  `):[])},[y]),(0,d.useEffect)(()=>{let e=new Map(Object.values(t).map(e=>[o(e.repoRoot),e]));for(let t of y?y.split(`
5
5
  `):[]){let n=h.current.get(t),r=e.get(o(t))??(n?e.get(o(n)):void 0);if(!r||m.current.get(t)===r)continue;m.current.set(t,r);let i=g(t);_(r,i,t)}},[t,y,g,_]),{data:n,failed:i,loading:l,pending:(0,d.useMemo)(()=>(y?y.split(`
6
- `):[]).some(e=>!(e in n)&&!(e in i)),[y,n,i]),refresh:v}}var p=n();function m({issue:e,selected:t=!1,onOpen:n,onDelete:r}){return(0,p.jsxs)(`div`,{className:`group/card relative`,"data-issue-card":e.id,children:[(0,p.jsxs)(`button`,{type:`button`,onClick:n,className:`flex w-full cursor-pointer flex-col gap-1.5 border p-3 text-left transition-colors ${t?`border-primary bg-inset`:`border-line bg-surface hover:border-primary hover:bg-inset`}`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,p.jsxs)(`span`,{className:`shrink-0 font-mono text-[10px] text-subtle`,children:[`#`,e.id]}),(0,p.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-[13px] text-fg`,children:e.title})]}),(0,p.jsx)(`div`,{className:`flex items-center gap-2 text-[11px] text-subtle`,children:(0,p.jsx)(`span`,{className:`font-mono`,children:e.created})})]}),(0,p.jsxs)(`div`,{className:`absolute right-2 top-2 flex gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover/card:opacity-100`,children:[(0,p.jsx)(`button`,{type:`button`,onClick:n,"aria-label":`Open issue #${e.id}`,"data-tip":`Open issue detail`,className:`relative flex h-5 w-5 items-center justify-center border border-line bg-surface text-subtle hover:border-primary hover:text-fg ${s}`,children:(0,p.jsx)(l,{size:11,strokeWidth:1.8})}),(0,p.jsx)(`button`,{type:`button`,onClick:r,"aria-label":`Delete issue #${e.id}`,"data-tip":`Delete issue`,className:`relative flex h-5 w-5 items-center justify-center border border-line bg-surface text-subtle hover:border-kobe-red/50 hover:text-kobe-red ${s}`,children:(0,p.jsx)(u,{size:11,strokeWidth:1.8})})]})]})}var h=(0,d.lazy)(()=>i(()=>import(`./IssueIntakePanel-B03-GRAE.js`).then(e=>({default:e.IssueIntakePanel})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13]))),g=(0,d.lazy)(()=>i(()=>import(`./IssuePeek-DZ4Pdzwu.js`).then(e=>({default:e.IssuePeek})),__vite__mapDeps([14,1,2,3,15,4,5,6,7,8,9,10,11,12,13])));function _({children:e}){return(0,p.jsx)(d.Suspense,{fallback:(0,p.jsx)(`div`,{className:`fixed inset-0 z-40 flex justify-end`,children:(0,p.jsx)(`div`,{className:`relative flex h-full w-[640px] max-w-[92vw] items-center justify-center border-l border-line bg-bg text-[12px] text-subtle shadow-2xl`,children:`Loading…`})}),children:e})}export{f as a,m as i,h as n,g as r,_ as t};
6
+ `):[]).some(e=>!(e in n)&&!(e in i)),[y,n,i]),refresh:v}}var p=n();function m({issue:e,selected:t=!1,onOpen:n,onDelete:r}){return(0,p.jsxs)(`div`,{className:`group/card relative`,"data-issue-card":e.id,children:[(0,p.jsxs)(`button`,{type:`button`,onClick:n,className:`flex w-full cursor-pointer flex-col gap-1.5 border p-3 text-left transition-colors ${t?`border-primary bg-inset`:`border-line bg-surface hover:border-primary hover:bg-inset`}`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,p.jsxs)(`span`,{className:`shrink-0 font-mono text-[10px] text-subtle`,children:[`#`,e.id]}),(0,p.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-[13px] text-fg`,children:e.title})]}),(0,p.jsx)(`div`,{className:`flex items-center gap-2 text-[11px] text-subtle`,children:(0,p.jsx)(`span`,{className:`font-mono`,children:e.created})})]}),(0,p.jsxs)(`div`,{className:`absolute right-2 top-2 flex gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover/card:opacity-100`,children:[(0,p.jsx)(`button`,{type:`button`,onClick:n,"aria-label":`Open issue #${e.id}`,"data-tip":`Open issue detail`,className:`relative flex h-5 w-5 items-center justify-center border border-line bg-surface text-subtle hover:border-primary hover:text-fg ${s}`,children:(0,p.jsx)(l,{size:11,strokeWidth:1.8})}),(0,p.jsx)(`button`,{type:`button`,onClick:r,"aria-label":`Delete issue #${e.id}`,"data-tip":`Delete issue`,className:`relative flex h-5 w-5 items-center justify-center border border-line bg-surface text-subtle hover:border-kobe-red/50 hover:text-kobe-red ${s}`,children:(0,p.jsx)(u,{size:11,strokeWidth:1.8})})]})]})}var h=(0,d.lazy)(()=>i(()=>import(`./IssueIntakePanel-BMP8Vc3E.js`).then(e=>({default:e.IssueIntakePanel})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13]))),g=(0,d.lazy)(()=>i(()=>import(`./IssuePeek-C7afOYax.js`).then(e=>({default:e.IssuePeek})),__vite__mapDeps([14,1,2,3,15,4,5,6,7,8,9,10,11,12,13])));function _({children:e}){return(0,p.jsx)(d.Suspense,{fallback:(0,p.jsx)(`div`,{className:`fixed inset-0 z-40 flex justify-end`,children:(0,p.jsx)(`div`,{className:`relative flex h-full w-[640px] max-w-[92vw] items-center justify-center border-l border-line bg-bg text-[12px] text-subtle shadow-2xl`,children:`Loading…`})}),children:e})}export{f as a,m as i,h as n,g as r,_ as t};
@@ -1 +1 @@
1
- import{t as e}from"./createLucideIcon-DzfSOpX_.js";var t=e(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]);export{t};
1
+ import{t as e}from"./createLucideIcon-CuIQtyYV.js";var t=e(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]);export{t};
@@ -0,0 +1 @@
1
+ import{AppShell as e}from"./AppShell-BGRIs5hW.js";var t=e;export{t as component};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/tabs-CRELMxoF.js","assets/terminal-B1H9J2fC.js"])))=>i.map(i=>d[i]);
2
- import{c as e,f as t,o as n}from"./terminal-B1H9J2fC.js";import{u as r,y as i}from"./tabs-CRELMxoF.js";import{n as a,s as o}from"./createLucideIcon-DzfSOpX_.js";var s=t(i(),1),c=`modulepreload`,l=function(e){return`/`+e},u={},d=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=l(t,n),t=s(t),t in u)return;u[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:c,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},f=`kobe.dispatch.deliveredAt.`;function p(e){try{let t=localStorage.getItem(f+e),n=t?Number.parseInt(t,10):0;return Number.isFinite(n)?n:0}catch{return 0}}function m(e,t){try{localStorage.setItem(f+e,String(t))}catch{}}function h(e,t){return e.at>t}async function g(e,t){if(!h(e,p(e.taskId)))return!1;m(e.taskId,e.at);let n=t?.ensureTab,r=t?.send;if(!n||!r){let e=await d(()=>import(`./tabs-CRELMxoF.js`).then(e=>e.g),__vite__mapDeps([0,1])),t=await d(()=>import(`./terminal-B1H9J2fC.js`).then(e=>e.i),[]);n??=e.ensureEngineTab,r??=t.sendPtyText}try{let t=e.tabId??n(e.taskId);return await r(t,e.taskId,e.text),!0}catch(t){return m(e.taskId,e.at-1),console.warn(`[dispatch-delivery] failed to deliver into session`,e.taskId,t),!1}}function _(e){return e.length>1?e.replace(/\/+$/,``):e}function v(e,t){let n=_(t),r=new Set([t]);for(let t of e){let e=_(t.repo),i=_(t.worktreePath);(e===n||i===n)&&(t.repo&&r.add(t.repo),t.worktreePath&&r.add(t.worktreePath))}return[...r]}function y(e,t){let n=new Set;for(let e of t)e.repo&&n.add(_(e.repo)),e.worktreePath&&n.add(_(e.worktreePath));let r=Object.entries(e).filter(([e])=>n.has(_(e)));return r.length===Object.keys(e).length?e:Object.fromEntries(r)}function b(e={}){let t=e.path??`/api/rpc`,r=e.post??n.post.bind(n);return{async request(e,n){return(await r(t,{name:e,payload:n},{label:`rpc ${e}`})).result}}}var x=b(),S={tasks:[],activeTaskId:null,engineStates:{},update:null,jobs:{},worktreeChanges:{},issueSnapshots:{},deliver:null,uiPrefs:null,hydrated:!1,daemonConnected:!1,streamConnected:!1},C=new Set;function w(e){S={...S,...e};for(let e of C)e()}function T(e,t){let n=Object.entries(e).filter(([e])=>t.has(e));return n.length===Object.keys(e).length?e:Object.fromEntries(n)}function E(e,t){return!e&&t===`idle`}function D(e,t){if(t.phase===`running`)return{...e,[t.taskId]:t};let{[t.taskId]:n,...r}=e;return r}function O(e,t,n){let r={...e};for(let e of v(t,n.repoRoot))r[e]={...n,repoRoot:e};return r}function k(e){let t=new Set(e.map(e=>e.id));w({tasks:e,engineStates:T(S.engineStates,t),jobs:T(S.jobs,t),issueSnapshots:y(S.issueSnapshots,e)}),r(t)}function A(e){switch(e.channel){case`task.snapshot`:k(e.payload.tasks);break;case`active-task`:w({activeTaskId:e.payload.taskId});break;case`engine-state`:{let t=S.engineStates[e.payload.taskId]?.state,n=S.tasks.find(t=>t.id===e.payload.taskId);if(E(n,e.payload.state))break;o(e.payload.taskId,n?.title||n?.branch||e.payload.taskId,t,e.payload.state),w({engineStates:{...S.engineStates,[e.payload.taskId]:e.payload}});break}case`update`:w({update:e.payload.info});break;case`task.jobs`:w({jobs:D(S.jobs,e.payload)});break;case`worktree.changes`:w({worktreeChanges:e.payload.changes});break;case`issue.snapshot`:w({issueSnapshots:O(S.issueSnapshots,S.tasks,e.payload)});break;case`session.deliver`:w({deliver:e.payload}),g(e.payload);break;case`ui-prefs`:w({uiPrefs:e.payload}),a(e.payload.theme)}}function j(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function M(e){if(!j(e)||!Array.isArray(e.tasks)||typeof e.activeTaskId!=`string`&&e.activeTaskId!==null||!j(e.engineStates)||typeof e.connected!=`boolean`)return null;for(let t of[`jobs`,`worktreeChanges`,`issueSnapshots`])if(e[t]!==void 0&&!j(e[t]))return null;return e.uiPrefs!==void 0&&e.uiPrefs!==null&&!j(e.uiPrefs)?null:e}function N(e){return Math.min(1e4,500*2**Math.max(0,e))}var P=null,F=0,I=null;function L(e){return e!==null&&e.readyState!==EventSource.CLOSED}function R(e){if(F=0,w({tasks:e.tasks,activeTaskId:e.activeTaskId,engineStates:e.engineStates,update:e.update,jobs:e.jobs??{},worktreeChanges:e.worktreeChanges??{},issueSnapshots:e.issueSnapshots??{},deliver:e.deliver??null,uiPrefs:e.uiPrefs??null,hydrated:!0,daemonConnected:e.connected,streamConnected:!0}),e.uiPrefs&&a(e.uiPrefs.theme),e.connected&&e.deliver&&g(e.deliver),e.connected){let t=new Set(e.tasks.map(e=>e.id));r(t)}}function z(){if(I!==null)return;let e=N(F);F+=1,I=setTimeout(()=>{I=null,C.size>0&&B()},e)}function B(){L(P)||(P=new EventSource(e(`/events`)),P.addEventListener(`open`,()=>{F=0,w({streamConnected:!0})}),P.addEventListener(`snapshot`,e=>{let t;try{t=JSON.parse(e.data)}catch{console.warn(`[store] dropped unparseable snapshot frame`);return}let n=M(t);if(!n){console.warn(`[store] dropped malformed snapshot frame`);return}R(n)}),P.addEventListener(`channel`,e=>{let t;try{t=JSON.parse(e.data)}catch{console.warn(`[store] dropped unparseable channel frame`);return}if(!j(t)||typeof t.channel!=`string`){console.warn(`[store] dropped malformed channel frame`);return}A(t),S.daemonConnected||w({daemonConnected:!0})}),P.addEventListener(`error`,()=>{w({streamConnected:!1}),P&&P.readyState===EventSource.CLOSED&&(P.close(),P=null,z())}))}function V(e){return B(),C.add(e),()=>{C.delete(e)}}function H(){return S}function U(){return(0,s.useSyncExternalStore)(V,H,H)}async function W(e,t){return x.request(e,t)}export{d as i,U as n,_ as r,W as t};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/tabs-CMZJhcSB.js","assets/terminal-DOp1a9g6.js"])))=>i.map(i=>d[i]);
2
+ import{c as e,f as t,o as n}from"./terminal-DOp1a9g6.js";import{u as r,y as i}from"./tabs-CMZJhcSB.js";import{n as a,s as o}from"./createLucideIcon-CuIQtyYV.js";var s=t(i(),1),c=`modulepreload`,l=function(e){return`/`+e},u={},d=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=l(t,n),t=s(t),t in u)return;u[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:c,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},f=`kobe.dispatch.deliveredAt.`;function p(e){try{let t=localStorage.getItem(f+e),n=t?Number.parseInt(t,10):0;return Number.isFinite(n)?n:0}catch{return 0}}function m(e,t){try{localStorage.setItem(f+e,String(t))}catch{}}function h(e,t){return e.at>t}async function g(e,t){if(!h(e,p(e.taskId)))return!1;m(e.taskId,e.at);let n=t?.ensureTab,r=t?.send;if(!n||!r){let e=await d(()=>import(`./tabs-CMZJhcSB.js`).then(e=>e.g),__vite__mapDeps([0,1])),t=await d(()=>import(`./terminal-DOp1a9g6.js`).then(e=>e.i),[]);n??=e.ensureEngineTab,r??=t.sendPtyText}try{let t=e.tabId??n(e.taskId);return await r(t,e.taskId,e.text),!0}catch(t){return m(e.taskId,e.at-1),console.warn(`[dispatch-delivery] failed to deliver into session`,e.taskId,t),!1}}function _(e){return e.length>1?e.replace(/\/+$/,``):e}function v(e,t){let n=_(t),r=new Set([t]);for(let t of e){let e=_(t.repo),i=_(t.worktreePath);(e===n||i===n)&&(t.repo&&r.add(t.repo),t.worktreePath&&r.add(t.worktreePath))}return[...r]}function y(e,t){let n=new Set;for(let e of t)e.repo&&n.add(_(e.repo)),e.worktreePath&&n.add(_(e.worktreePath));let r=Object.entries(e).filter(([e])=>n.has(_(e)));return r.length===Object.keys(e).length?e:Object.fromEntries(r)}function b(e={}){let t=e.path??`/api/rpc`,r=e.post??n.post.bind(n);return{async request(e,n){return(await r(t,{name:e,payload:n},{label:`rpc ${e}`})).result}}}var x=b(),S={tasks:[],activeTaskId:null,engineStates:{},update:null,jobs:{},worktreeChanges:{},issueSnapshots:{},deliver:null,uiPrefs:null,hydrated:!1,daemonConnected:!1,streamConnected:!1},C=new Set;function w(e){S={...S,...e};for(let e of C)e()}function T(e,t){let n=Object.entries(e).filter(([e])=>t.has(e));return n.length===Object.keys(e).length?e:Object.fromEntries(n)}function E(e,t){return!e&&t===`idle`}function D(e,t){if(t.phase===`running`)return{...e,[t.taskId]:t};let{[t.taskId]:n,...r}=e;return r}function O(e,t,n){let r={...e};for(let e of v(t,n.repoRoot))r[e]={...n,repoRoot:e};return r}function k(e){let t=new Set(e.map(e=>e.id));w({tasks:e,engineStates:T(S.engineStates,t),jobs:T(S.jobs,t),issueSnapshots:y(S.issueSnapshots,e)}),r(t)}function A(e){switch(e.channel){case`task.snapshot`:k(e.payload.tasks);break;case`active-task`:w({activeTaskId:e.payload.taskId});break;case`engine-state`:{let t=S.engineStates[e.payload.taskId]?.state,n=S.tasks.find(t=>t.id===e.payload.taskId);if(E(n,e.payload.state))break;o(e.payload.taskId,n?.title||n?.branch||e.payload.taskId,t,e.payload.state),w({engineStates:{...S.engineStates,[e.payload.taskId]:e.payload}});break}case`update`:w({update:e.payload.info});break;case`task.jobs`:w({jobs:D(S.jobs,e.payload)});break;case`worktree.changes`:w({worktreeChanges:e.payload.changes});break;case`issue.snapshot`:w({issueSnapshots:O(S.issueSnapshots,S.tasks,e.payload)});break;case`session.deliver`:w({deliver:e.payload}),g(e.payload);break;case`ui-prefs`:w({uiPrefs:e.payload}),a(e.payload.theme)}}function j(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function M(e){if(!j(e)||!Array.isArray(e.tasks)||typeof e.activeTaskId!=`string`&&e.activeTaskId!==null||!j(e.engineStates)||typeof e.connected!=`boolean`)return null;for(let t of[`jobs`,`worktreeChanges`,`issueSnapshots`])if(e[t]!==void 0&&!j(e[t]))return null;return e.uiPrefs!==void 0&&e.uiPrefs!==null&&!j(e.uiPrefs)?null:e}function N(e){return Math.min(1e4,500*2**Math.max(0,e))}var P=null,F=0,I=null;function L(e){return e!==null&&e.readyState!==EventSource.CLOSED}function R(e){if(F=0,w({tasks:e.tasks,activeTaskId:e.activeTaskId,engineStates:e.engineStates,update:e.update,jobs:e.jobs??{},worktreeChanges:e.worktreeChanges??{},issueSnapshots:e.issueSnapshots??{},deliver:e.deliver??null,uiPrefs:e.uiPrefs??null,hydrated:!0,daemonConnected:e.connected,streamConnected:!0}),e.uiPrefs&&a(e.uiPrefs.theme),e.connected&&e.deliver&&g(e.deliver),e.connected){let t=new Set(e.tasks.map(e=>e.id));r(t)}}function z(){if(I!==null)return;let e=N(F);F+=1,I=setTimeout(()=>{I=null,C.size>0&&B()},e)}function B(){L(P)||(P=new EventSource(e(`/events`)),P.addEventListener(`open`,()=>{F=0,w({streamConnected:!0})}),P.addEventListener(`snapshot`,e=>{let t;try{t=JSON.parse(e.data)}catch{console.warn(`[store] dropped unparseable snapshot frame`);return}let n=M(t);if(!n){console.warn(`[store] dropped malformed snapshot frame`);return}R(n)}),P.addEventListener(`channel`,e=>{let t;try{t=JSON.parse(e.data)}catch{console.warn(`[store] dropped unparseable channel frame`);return}if(!j(t)||typeof t.channel!=`string`){console.warn(`[store] dropped malformed channel frame`);return}A(t),S.daemonConnected||w({daemonConnected:!0})}),P.addEventListener(`error`,()=>{w({streamConnected:!1}),P&&P.readyState===EventSource.CLOSED&&(P.close(),P=null,z())}))}function V(e){return B(),C.add(e),()=>{C.delete(e)}}function H(){return S}function U(){return(0,s.useSyncExternalStore)(V,H,H)}async function W(e,t){return x.request(e,t)}export{d as i,U as n,_ as r,W as t};
@@ -1 +1 @@
1
- import{d as e,f as t,t as n,u as r}from"./terminal-B1H9J2fC.js";var i=r((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var A=/\/+/g;function j(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function M(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function N(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,N(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+j(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(A,`$&/`)+`/`),N(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(A,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u<e.length;u++)a=e[u],s=l+j(a,u),c+=N(a,r,i,s,o);else if(u=m(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+j(a,u++),c+=N(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return N(M(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function P(e,t,n){if(e==null)return e;var r=[],i=0;return N(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function F(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t)},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var I=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)},L={map:P,forEach:function(e,t,n){P(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return P(e,function(){t++}),t},toArray:function(e){return P(e,function(e){return e})||[]},only:function(e){if(!O(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=L,e.Component=v,e.Fragment=r,e.Profiler=a,e.PureComponent=b,e.StrictMode=i,e.Suspense=l,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=w,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return w.H.useMemoCache(e)}},e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=g({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!T.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return E(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)T.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return E(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=O,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:F}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=function(e){var t=w.T,n={};w.T=n;try{var r=e(),i=w.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(C,I)}catch(e){I(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),w.T=t}},e.unstable_useCacheRefresh=function(){return w.H.useCacheRefresh()},e.use=function(e){return w.H.use(e)},e.useActionState=function(e,t,n){return w.H.useActionState(e,t,n)},e.useCallback=function(e,t){return w.H.useCallback(e,t)},e.useContext=function(e){return w.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return w.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return w.H.useEffect(e,t)},e.useEffectEvent=function(e){return w.H.useEffectEvent(e)},e.useId=function(){return w.H.useId()},e.useImperativeHandle=function(e,t,n){return w.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return w.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return w.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return w.H.useMemo(e,t)},e.useOptimistic=function(e,t){return w.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return w.H.useReducer(e,t,n)},e.useRef=function(e){return w.H.useRef(e)},e.useState=function(e){return w.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return w.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return w.H.useTransition()},e.version=`19.2.8`})),a=r(((e,t)=>{t.exports=i()})),o=t(a(),1),s={empty:{hasPty:!1,titleMode:`static`,label:`New tab`},vendor:{hasPty:!0,titleMode:`count`,label:`Vendor`},terminal:{hasPty:!0,titleMode:`count`,label:`Terminal`},transcript:{hasPty:!1,titleMode:`static`,label:`Chat`},file:{hasPty:!1,titleMode:`static`,label:`File`}};function c(e){return s[e].hasPty}function l(e,t){let n=s[e];if(n.titleMode===`count`){let r=t.filter(t=>t.kind===e).length+1;return`${n.label} ${r}`}return n.label}var u=e({addEmptyTab:()=>j,addTab:()=>k,clearSelectedTask:()=>O,clearSplitTab:()=>L,closeTab:()=>P,configureTab:()=>M,consumePendingPrompt:()=>T,ensureEngineTab:()=>A,migrateStoredTab:()=>h,openFilePreviewTab:()=>N,pruneMissingTasks:()=>D,resetLayout:()=>E,selectTask:()=>S,setActiveTab:()=>F,setPendingPrompt:()=>w,setSplitTab:()=>I,useTabsState:()=>R,withTaskTab:()=>m}),d=`kobe-web.tabs`,f={selectedTaskId:null,tabsByTask:{},activeByTask:{},splitByTask:{}};function p(){return{id:x(),kind:`empty`,title:l(`empty`,[])}}function m(e,t){let n=e.tabsByTask[t]??[],r=e.activeByTask[t],i=e.splitByTask[t],a=e;if(i&&(!n.some(e=>e.id===i)||i===r)){let{[t]:n,...r}=e.splitByTask;a={...e,splitByTask:r}}if(n.length>0)return r&&n.some(e=>e.id===r)?a:{...a,activeByTask:{...e.activeByTask,[t]:n[0].id}};let o=p();return{...a,tabsByTask:{...e.tabsByTask,[t]:[o]},activeByTask:{...e.activeByTask,[t]:o.id}}}function h(e){let t=e,n=typeof e?.kind==`string`?e.kind:void 0;if(n===`notes`)return p();let r=n===`chat`?`vendor`:n??`vendor`,i=r in s?r:`vendor`;return i===`file`&&typeof t.path!=`string`?p():{...t,kind:i}}function g(){try{let e=localStorage.getItem(d);if(e){let t=JSON.parse(e),n=Object.fromEntries(Object.entries(t.tabsByTask??{}).map(([e,t])=>[e,t.map(h)])),r={selectedTaskId:t.selectedTaskId??null,tabsByTask:n,activeByTask:t.activeByTask??{},splitByTask:t.splitByTask??{}};return r.selectedTaskId?m(r,r.selectedTaskId):r}}catch{}return f}var _=typeof localStorage>`u`?f:g(),v=new Set;function y(e){_=e;try{localStorage.setItem(d,JSON.stringify(_))}catch{}for(let e of v)e()}var b=0;function x(){try{return crypto.randomUUID()}catch{return b+=1,`tab-${Date.now().toString(36)}-${b}`}}function S(e){y(m({..._,selectedTaskId:e},e))}var C=new Map;function w(e,t){C.set(e,t)}function T(e){let t=C.get(e);return t===void 0?null:(C.delete(e),t)}function E(){for(let e of Object.values(_.tabsByTask))for(let t of e)c(t.kind)&&n(t.id);y({...f})}function D(e){let t=t=>t.kind===`vendor`&&!!t.taskId&&!e.has(t.taskId),r=Object.keys(_.tabsByTask).filter(t=>!e.has(t)),i=Object.entries(_.tabsByTask).filter(([n,r])=>e.has(n)&&r.some(t)),a=_.selectedTaskId!==null&&!e.has(_.selectedTaskId);if(r.length===0&&i.length===0&&!a)return;for(let e of r)for(let t of _.tabsByTask[e]??[])c(t.kind)&&n(t.id);let o={..._.tabsByTask},s={..._.activeByTask},l={..._.splitByTask};for(let e of r)delete o[e],delete s[e],delete l[e];for(let[e,r]of i){for(let e of r)t(e)&&n(e.id);o[e]=r.filter(e=>!t(e))}let u={selectedTaskId:a?null:_.selectedTaskId,tabsByTask:o,activeByTask:s,splitByTask:l};for(let[e]of i)u=m(u,e);y(u)}function O(){y({..._,selectedTaskId:null})}function k(e,t){let n=_.tabsByTask[e]??[],r=x(),i={id:r,kind:`vendor`,title:l(`vendor`,n),...t&&t!==e?{taskId:t}:{}};return y({..._,tabsByTask:{..._.tabsByTask,[e]:[...n,i]},activeByTask:{..._.activeByTask,[e]:r},splitByTask:_.splitByTask}),r}function A(e){let t=_.tabsByTask[e]??[],n=t.find(e=>e.kind===`vendor`&&!e.taskId);if(n)return n.id;let r=x(),i={id:r,kind:`vendor`,title:l(`vendor`,t)};return y({..._,tabsByTask:{..._.tabsByTask,[e]:[...t,i]}}),r}function j(e){let t=_.tabsByTask[e]??[],n=p();return y({..._,tabsByTask:{..._.tabsByTask,[e]:[...t,n]},activeByTask:{..._.activeByTask,[e]:n.id},splitByTask:_.splitByTask}),n.id}function M(e,t,n){let r=_.tabsByTask[e]??[],i=r.map(e=>e.id===t?n===`vendor`?{id:t,kind:n,title:l(`vendor`,r)}:n===`transcript`?{id:t,kind:n,title:l(`transcript`,r)}:{id:t,kind:n,title:l(`terminal`,r)}:e);y({..._,tabsByTask:{..._.tabsByTask,[e]:i},activeByTask:{..._.activeByTask,[e]:t},splitByTask:_.splitByTask})}function N(e,t){let n=_.tabsByTask[e]??[],r=n.find(e=>e.kind===`file`&&e.path===t);if(r)return F(e,r.id),r.id;let i=x(),a={id:i,kind:`file`,title:t.split(`/`).at(-1)??t,path:t};return y({..._,tabsByTask:{..._.tabsByTask,[e]:[...n,a]},activeByTask:{..._.activeByTask,[e]:i},splitByTask:_.splitByTask}),i}function P(e,t){let n=_.tabsByTask[e]??[],r=n.findIndex(e=>e.id===t),i=n.filter(e=>e.id!==t);i.length===0&&(i=[p()]);let a=_.activeByTask[e]===t,o={..._.activeByTask},s={..._.splitByTask};if(a){let t=Math.max(0,Math.min(r,i.length-1));o[e]=i[t].id}(s[e]===t||s[e]===o[e])&&delete s[e],y({..._,tabsByTask:{..._.tabsByTask,[e]:i},activeByTask:o,splitByTask:s})}function F(e,t){let n={..._.splitByTask},r={..._.activeByTask},i=r[e];n[e]===t&&i&&i!==t?n[e]=i:n[e]===t&&delete n[e],r[e]=t,y({..._,activeByTask:r,splitByTask:n})}function I(e,t){let n=_.tabsByTask[e]??[];if(!n.some(e=>e.id===t))return;let r=_.activeByTask[e],i={..._.activeByTask};if(r===t){let r=n.find(e=>e.id!==t);if(!r)return;i[e]=r.id}y({..._,activeByTask:i,splitByTask:{..._.splitByTask,[e]:t}})}function L(e){let{[e]:t,...n}=_.splitByTask;y({..._,splitByTask:n})}function R(){return(0,o.useSyncExternalStore)(e=>(v.add(e),()=>v.delete(e)),()=>_,()=>_)}export{R as _,P as a,A as c,E as d,S as f,u as g,I as h,L as i,N as l,w as m,k as n,M as o,F as p,O as r,T as s,j as t,D as u,c as v,a as y};
1
+ import{d as e,f as t,t as n,u as r}from"./terminal-DOp1a9g6.js";var i=r((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var A=/\/+/g;function j(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function M(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function N(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,N(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+j(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(A,`$&/`)+`/`),N(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(A,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u<e.length;u++)a=e[u],s=l+j(a,u),c+=N(a,r,i,s,o);else if(u=m(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+j(a,u++),c+=N(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return N(M(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function P(e,t,n){if(e==null)return e;var r=[],i=0;return N(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function F(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t)},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var I=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)},L={map:P,forEach:function(e,t,n){P(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return P(e,function(){t++}),t},toArray:function(e){return P(e,function(e){return e})||[]},only:function(e){if(!O(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=L,e.Component=v,e.Fragment=r,e.Profiler=a,e.PureComponent=b,e.StrictMode=i,e.Suspense=l,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=w,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return w.H.useMemoCache(e)}},e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=g({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!T.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return E(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)T.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return E(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=O,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:F}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=function(e){var t=w.T,n={};w.T=n;try{var r=e(),i=w.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(C,I)}catch(e){I(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),w.T=t}},e.unstable_useCacheRefresh=function(){return w.H.useCacheRefresh()},e.use=function(e){return w.H.use(e)},e.useActionState=function(e,t,n){return w.H.useActionState(e,t,n)},e.useCallback=function(e,t){return w.H.useCallback(e,t)},e.useContext=function(e){return w.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return w.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return w.H.useEffect(e,t)},e.useEffectEvent=function(e){return w.H.useEffectEvent(e)},e.useId=function(){return w.H.useId()},e.useImperativeHandle=function(e,t,n){return w.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return w.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return w.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return w.H.useMemo(e,t)},e.useOptimistic=function(e,t){return w.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return w.H.useReducer(e,t,n)},e.useRef=function(e){return w.H.useRef(e)},e.useState=function(e){return w.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return w.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return w.H.useTransition()},e.version=`19.2.8`})),a=r(((e,t)=>{t.exports=i()})),o=t(a(),1),s={empty:{hasPty:!1,titleMode:`static`,label:`New tab`},vendor:{hasPty:!0,titleMode:`count`,label:`Vendor`},terminal:{hasPty:!0,titleMode:`count`,label:`Terminal`},transcript:{hasPty:!1,titleMode:`static`,label:`Chat`},file:{hasPty:!1,titleMode:`static`,label:`File`}};function c(e){return s[e].hasPty}function l(e,t){let n=s[e];if(n.titleMode===`count`){let r=t.filter(t=>t.kind===e).length+1;return`${n.label} ${r}`}return n.label}var u=e({addEmptyTab:()=>j,addTab:()=>k,clearSelectedTask:()=>O,clearSplitTab:()=>L,closeTab:()=>P,configureTab:()=>M,consumePendingPrompt:()=>T,ensureEngineTab:()=>A,migrateStoredTab:()=>h,openFilePreviewTab:()=>N,pruneMissingTasks:()=>D,resetLayout:()=>E,selectTask:()=>S,setActiveTab:()=>F,setPendingPrompt:()=>w,setSplitTab:()=>I,useTabsState:()=>R,withTaskTab:()=>m}),d=`kobe-web.tabs`,f={selectedTaskId:null,tabsByTask:{},activeByTask:{},splitByTask:{}};function p(){return{id:x(),kind:`empty`,title:l(`empty`,[])}}function m(e,t){let n=e.tabsByTask[t]??[],r=e.activeByTask[t],i=e.splitByTask[t],a=e;if(i&&(!n.some(e=>e.id===i)||i===r)){let{[t]:n,...r}=e.splitByTask;a={...e,splitByTask:r}}if(n.length>0)return r&&n.some(e=>e.id===r)?a:{...a,activeByTask:{...e.activeByTask,[t]:n[0].id}};let o=p();return{...a,tabsByTask:{...e.tabsByTask,[t]:[o]},activeByTask:{...e.activeByTask,[t]:o.id}}}function h(e){let t=e,n=typeof e?.kind==`string`?e.kind:void 0;if(n===`notes`)return p();let r=n===`chat`?`vendor`:n??`vendor`,i=r in s?r:`vendor`;return i===`file`&&typeof t.path!=`string`?p():{...t,kind:i}}function g(){try{let e=localStorage.getItem(d);if(e){let t=JSON.parse(e),n=Object.fromEntries(Object.entries(t.tabsByTask??{}).map(([e,t])=>[e,t.map(h)])),r={selectedTaskId:t.selectedTaskId??null,tabsByTask:n,activeByTask:t.activeByTask??{},splitByTask:t.splitByTask??{}};return r.selectedTaskId?m(r,r.selectedTaskId):r}}catch{}return f}var _=typeof localStorage>`u`?f:g(),v=new Set;function y(e){_=e;try{localStorage.setItem(d,JSON.stringify(_))}catch{}for(let e of v)e()}var b=0;function x(){try{return crypto.randomUUID()}catch{return b+=1,`tab-${Date.now().toString(36)}-${b}`}}function S(e){y(m({..._,selectedTaskId:e},e))}var C=new Map;function w(e,t){C.set(e,t)}function T(e){let t=C.get(e);return t===void 0?null:(C.delete(e),t)}function E(){for(let e of Object.values(_.tabsByTask))for(let t of e)c(t.kind)&&n(t.id);y({...f})}function D(e){let t=t=>t.kind===`vendor`&&!!t.taskId&&!e.has(t.taskId),r=Object.keys(_.tabsByTask).filter(t=>!e.has(t)),i=Object.entries(_.tabsByTask).filter(([n,r])=>e.has(n)&&r.some(t)),a=_.selectedTaskId!==null&&!e.has(_.selectedTaskId);if(r.length===0&&i.length===0&&!a)return;for(let e of r)for(let t of _.tabsByTask[e]??[])c(t.kind)&&n(t.id);let o={..._.tabsByTask},s={..._.activeByTask},l={..._.splitByTask};for(let e of r)delete o[e],delete s[e],delete l[e];for(let[e,r]of i){for(let e of r)t(e)&&n(e.id);o[e]=r.filter(e=>!t(e))}let u={selectedTaskId:a?null:_.selectedTaskId,tabsByTask:o,activeByTask:s,splitByTask:l};for(let[e]of i)u=m(u,e);y(u)}function O(){y({..._,selectedTaskId:null})}function k(e,t){let n=_.tabsByTask[e]??[],r=x(),i={id:r,kind:`vendor`,title:l(`vendor`,n),...t&&t!==e?{taskId:t}:{}};return y({..._,tabsByTask:{..._.tabsByTask,[e]:[...n,i]},activeByTask:{..._.activeByTask,[e]:r},splitByTask:_.splitByTask}),r}function A(e){let t=_.tabsByTask[e]??[],n=t.find(e=>e.kind===`vendor`&&!e.taskId);if(n)return n.id;let r=x(),i={id:r,kind:`vendor`,title:l(`vendor`,t)};return y({..._,tabsByTask:{..._.tabsByTask,[e]:[...t,i]}}),r}function j(e){let t=_.tabsByTask[e]??[],n=p();return y({..._,tabsByTask:{..._.tabsByTask,[e]:[...t,n]},activeByTask:{..._.activeByTask,[e]:n.id},splitByTask:_.splitByTask}),n.id}function M(e,t,n){let r=_.tabsByTask[e]??[],i=r.map(e=>e.id===t?n===`vendor`?{id:t,kind:n,title:l(`vendor`,r)}:n===`transcript`?{id:t,kind:n,title:l(`transcript`,r)}:{id:t,kind:n,title:l(`terminal`,r)}:e);y({..._,tabsByTask:{..._.tabsByTask,[e]:i},activeByTask:{..._.activeByTask,[e]:t},splitByTask:_.splitByTask})}function N(e,t){let n=_.tabsByTask[e]??[],r=n.find(e=>e.kind===`file`&&e.path===t);if(r)return F(e,r.id),r.id;let i=x(),a={id:i,kind:`file`,title:t.split(`/`).at(-1)??t,path:t};return y({..._,tabsByTask:{..._.tabsByTask,[e]:[...n,a]},activeByTask:{..._.activeByTask,[e]:i},splitByTask:_.splitByTask}),i}function P(e,t){let n=_.tabsByTask[e]??[],r=n.findIndex(e=>e.id===t),i=n.filter(e=>e.id!==t);i.length===0&&(i=[p()]);let a=_.activeByTask[e]===t,o={..._.activeByTask},s={..._.splitByTask};if(a){let t=Math.max(0,Math.min(r,i.length-1));o[e]=i[t].id}(s[e]===t||s[e]===o[e])&&delete s[e],y({..._,tabsByTask:{..._.tabsByTask,[e]:i},activeByTask:o,splitByTask:s})}function F(e,t){let n={..._.splitByTask},r={..._.activeByTask},i=r[e];n[e]===t&&i&&i!==t?n[e]=i:n[e]===t&&delete n[e],r[e]=t,y({..._,activeByTask:r,splitByTask:n})}function I(e,t){let n=_.tabsByTask[e]??[];if(!n.some(e=>e.id===t))return;let r=_.activeByTask[e],i={..._.activeByTask};if(r===t){let r=n.find(e=>e.id!==t);if(!r)return;i[e]=r.id}y({..._,activeByTask:i,splitByTask:{..._.splitByTask,[e]:t}})}function L(e){let{[e]:t,...n}=_.splitByTask;y({..._,splitByTask:n})}function R(){return(0,o.useSyncExternalStore)(e=>(v.add(e),()=>v.delete(e)),()=>_,()=>_)}export{R as _,P as a,A as c,E as d,S as f,u as g,I as h,L as i,N as l,w as m,k as n,M as o,F as p,O as r,T as s,j as t,D as u,c as v,a as y};
@@ -0,0 +1 @@
1
+ import{f as e}from"./terminal-DOp1a9g6.js";import{_ as t,f as n,y as r}from"./tabs-CMZJhcSB.js";import{m as i}from"./createLucideIcon-CuIQtyYV.js";import{t as a}from"./active-task-gVYiAkLv.js";import{t as o}from"./index-B4xJZEqf.js";import{AppShell as s}from"./AppShell-BGRIs5hW.js";var c=e(r()),l=i();function u(){let{taskId:e}=o.useParams(),{selectedTaskId:r}=t();return(0,c.useEffect)(()=>{!e||e===r||(n(e),a(e))},[e,r]),(0,l.jsx)(s,{})}export{u as component};
@@ -1 +1 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,o)=>(o=n==null?{}:e(i(n)),c(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n)),u=`rove`,d=`rove-web-token`;function f(){try{return sessionStorage.getItem(d)?.trim()??``}catch{return``}}function p(e){try{sessionStorage.setItem(d,e)}catch{}}function m(){if(typeof document<`u`){let e=document.querySelector(`meta[name="rove-web-token"]`)?.getAttribute(`content`)?.trim();if(e)return p(e),e;let t=f();if(t)return t}return``}var h=null;function g(){return h===null&&(h=m()),h}function _(e){let t=g();return t?{...e,headers:{...e.headers,authorization:`Bearer ${t}`}}:e}function v(e){let t=g();return t?`${e}${e.includes(`?`)?`&`:`?`}token=${encodeURIComponent(t)}`:e}var y=class extends Error{status;url;detail;body;constructor(e){super(`${e.label} failed (${e.status})${e.detail?`: ${e.detail}`:``}`),this.name=e.name||`ApiError`,this.status=e.status,this.url=e.url,this.detail=e.detail??``,this.body=e.body}};function b(e,t){let n=[];for(let[e,r]of Object.entries(t??{})){let t=Array.isArray(r)?r:[r];for(let r of t)r!=null&&n.push(`${encodeURIComponent(e)}=${encodeURIComponent(String(r))}`)}return n.length===0?e:`${e}${e.includes(`?`)?`&`:`?`}${n.join(`&`)}`}async function x(e){let t=await e.text().catch(()=>``);if(!t)return{text:t};try{return{text:t,json:JSON.parse(t)}}catch{return{text:t}}}function S(e){let t=e.json;if(t&&typeof t==`object`&&!Array.isArray(t)){let e=t,n=typeof e.error==`string`?e.error:``,r=typeof e.name==`string`?e.name:void 0;if(n)return{detail:n,name:r}}return{detail:e.text.trim()}}async function C(e,t,n={}){let r=b(e,n.query),i=await fetch(r,_(t)),a=await x(i),o=a.json,s=o&&typeof o==`object`&&!Array.isArray(o)&&typeof o.error==`string`&&o.error.length>0;if(!i.ok||s){let{detail:e,name:t}=S(a);throw new y({url:r,status:i.status,label:n.label??r,detail:e,body:o,name:t})}return o??{}}function w(e,t){return{method:e,headers:{"content-type":`application/json`},...t===void 0?{}:{body:JSON.stringify(t)}}}var T={get(e,t){return C(e,{method:`GET`},t)},post(e,t,n){return C(e,w(`POST`,t),n)},put(e,t,n){return C(e,w(`PUT`,t),n)},patch(e,t,n){return C(e,w(`PATCH`,t),n)},delete(e,t,n){return C(e,w(`DELETE`,t),n)},form(e,t,n){return C(e,{method:`POST`,body:t},n)},async getOr(e,t,n){try{return await C(e,{method:`GET`},n)}catch{return t}}},E=s({closePtyTab:()=>k,ptyUrl:()=>O,sendPtyText:()=>A});function D(e){let t=location.protocol===`https:`,n=e===`ws`?t?`wss`:`ws`:t?`https`:`http`,r=location.hostname||`localhost`,i=Number.parseInt(location.port||`5173`,10);return`${n}://${r}:${Number.isFinite(i)?i+2:5175}`}function O(e,t,n,r,i){let a=new URLSearchParams({tab:e,taskId:t,mode:n,cols:String(r),rows:String(i)});return`${D(`ws`)}/pty?${a.toString()}`}async function k(e){try{await T.post(`${D(`http`)}/pty/close`,{tab:e},{label:`close PTY tab`})}catch{}}async function A(e,t,n){try{let r=await T.post(`${D(`http`)}/pty/send`,{tab:e,taskId:t,text:n},{label:`send PTY text`});if(!r.sent)throw Error(`send failed`);return{spawned:r.spawned===!0}}catch(e){throw e instanceof y&&e.status===404&&!e.detail?Error(`the PTY server doesn't know /pty/send — restart \`${u} web\` (the sidecar doesn't hot-reload)`):e}}export{y as a,v as c,s as d,l as f,E as i,u as l,O as n,T as o,A as r,_ as s,k as t,o as u};
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,o)=>(o=n==null?{}:e(i(n)),c(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n)),u=`rove`,d=`rove-web-token`;function f(){try{return sessionStorage.getItem(d)?.trim()??``}catch{return``}}function p(e){try{sessionStorage.setItem(d,e)}catch{}}function m(){if(typeof document<`u`){let e=document.querySelector(`meta[name="rove-web-token"]`)?.getAttribute(`content`)?.trim();if(e)return p(e),e;let t=f();if(t)return t}return``}var h=null;function g(){return h===null&&(h=m()),h}function _(e){let t=g();return t?{...e,headers:{...e.headers,authorization:`Bearer ${t}`}}:e}function v(e){let t=g();return t?`${e}${e.includes(`?`)?`&`:`?`}token=${encodeURIComponent(t)}`:e}var y=class extends Error{status;url;detail;body;constructor(e){super(`${e.label} failed (${e.status})${e.detail?`: ${e.detail}`:``}`),this.name=e.name||`ApiError`,this.status=e.status,this.url=e.url,this.detail=e.detail??``,this.body=e.body}};function b(e,t){let n=[];for(let[e,r]of Object.entries(t??{})){let t=Array.isArray(r)?r:[r];for(let r of t)r!=null&&n.push(`${encodeURIComponent(e)}=${encodeURIComponent(String(r))}`)}return n.length===0?e:`${e}${e.includes(`?`)?`&`:`?`}${n.join(`&`)}`}async function x(e){let t=await e.text().catch(()=>``);if(!t)return{text:t};try{return{text:t,json:JSON.parse(t)}}catch{return{text:t}}}function S(e){let t=e.json;if(t&&typeof t==`object`&&!Array.isArray(t)){let e=t,n=typeof e.error==`string`?e.error:``,r=typeof e.name==`string`?e.name:void 0;if(n)return{detail:n,name:r}}return{detail:e.text.trim()}}async function C(e,t,n={}){let r=b(e,n.query),i=await fetch(r,_(t)),a=await x(i),o=a.json,s=o&&typeof o==`object`&&!Array.isArray(o)&&typeof o.error==`string`&&o.error.length>0;if(!i.ok||s){let{detail:e,name:t}=S(a);throw new y({url:r,status:i.status,label:n.label??r,detail:e,body:o,name:t})}return o??{}}function w(e,t){return{method:e,headers:{"content-type":`application/json`},...t===void 0?{}:{body:JSON.stringify(t)}}}var T={get(e,t){return C(e,{method:`GET`},t)},post(e,t,n){return C(e,w(`POST`,t),n)},put(e,t,n){return C(e,w(`PUT`,t),n)},patch(e,t,n){return C(e,w(`PATCH`,t),n)},delete(e,t,n){return C(e,w(`DELETE`,t),n)},form(e,t,n){return C(e,{method:`POST`,body:t},n)},async getOr(e,t,n){try{return await C(e,{method:`GET`},n)}catch{return t}}},E=s({closePtyTab:()=>k,ptyUrl:()=>O,sendPtyText:()=>A});function D(e){let t=location.protocol===`https:`,n=e===`ws`?t?`wss`:`ws`:t?`https`:`http`,r=location.hostname||`localhost`,i=Number.parseInt(location.port||`5173`,10);return`${n}://${r}:${Number.isFinite(i)?i+2:5175}`}function O(e,t,n,r,i){let a=new URLSearchParams({tab:e,taskId:t,mode:n,cols:String(r),rows:String(i)});return v(`${D(`ws`)}/pty?${a.toString()}`)}async function k(e){try{await T.post(`${D(`http`)}/pty/close`,{tab:e},{label:`close PTY tab`})}catch{}}async function A(e,t,n){try{let r=await T.post(`${D(`http`)}/pty/send`,{tab:e,taskId:t,text:n},{label:`send PTY text`});if(!r.sent)throw Error(`send failed`);return{spawned:r.spawned===!0}}catch(e){throw e instanceof y&&e.status===404&&!e.detail?Error(`the PTY server doesn't know /pty/send — restart \`${u} web\` (the sidecar doesn't hot-reload)`):e}}export{y as a,v as c,s as d,l as f,E as i,u as l,O as n,T as o,A as r,_ as s,k as t,o as u};
@@ -1 +1 @@
1
- import{f as e}from"./terminal-B1H9J2fC.js";import{y as t}from"./tabs-CRELMxoF.js";import{t as n}from"./external-store-DExSl1xD.js";var r=e(t(),1),i=r.createContext(null);function a(e){return r.useContext(i)}function o(e){let t=a();return r.useCallback(n=>t.navigate({...n,from:n.from??e?.from}),[e?.from,t])}var s=5e3,c=n([]),l=0;function u(e,t){l+=1;let n={id:l,kind:e,message:t};c.update(e=>[...e.slice(-3),n]),window.setTimeout(()=>d(n.id),s)}function d(e){let t=c.getSnapshot();t.some(t=>t.id===e)&&c.replace(t.filter(t=>t.id!==e))}function f(e,t){if(t instanceof Error)return`${e}: ${t.message}`;let n=String(t);if(n!==`[object Object]`)return`${e}: ${n}`;try{return`${e}: ${JSON.stringify(t)??n}`}catch{return`${e}: ${n}`}}function p(e,t){u(`error`,f(e,t))}function m(){return c.useSnapshot()}export{o as a,m as i,u as n,a as o,p as r,i as s,d as t};
1
+ import{f as e}from"./terminal-DOp1a9g6.js";import{y as t}from"./tabs-CMZJhcSB.js";import{t as n}from"./external-store-BCBJewGi.js";var r=e(t(),1),i=r.createContext(null);function a(e){return r.useContext(i)}function o(e){let t=a();return r.useCallback(n=>t.navigate({...n,from:n.from??e?.from}),[e?.from,t])}var s=5e3,c=n([]),l=0;function u(e,t){l+=1;let n={id:l,kind:e,message:t};c.update(e=>[...e.slice(-3),n]),window.setTimeout(()=>d(n.id),s)}function d(e){let t=c.getSnapshot();t.some(t=>t.id===e)&&c.replace(t.filter(t=>t.id!==e))}function f(e,t){if(t instanceof Error)return`${e}: ${t.message}`;let n=String(t);if(n!==`[object Object]`)return`${e}: ${n}`;try{return`${e}: ${JSON.stringify(t)??n}`}catch{return`${e}: ${n}`}}function p(e,t){u(`error`,f(e,t))}function m(){return c.useSnapshot()}export{o as a,m as i,u as n,a as o,p as r,i as s,d as t};
@@ -1 +1 @@
1
- import{l as e}from"./terminal-B1H9J2fC.js";function t({daemonConnected:e,streamConnected:t}){return t?e?`connected`:`daemon-offline`:`event-stream-disconnected`}function n(e){return t(e)===`connected`}function r(e){return!n(e)}function i(e){return!!e.hydrated&&t(e)===`daemon-offline`}function a(n){let r=t(n);return r===`connected`?{ok:!0,label:`daemon connected`}:r===`daemon-offline`?{ok:!1,label:`no daemon`,title:`Daemon offline — if it doesn't recover, run \`${e} doctor\` or \`${e} reset\` in a terminal.`}:{ok:!1,label:`connecting…`}}export{i as n,a as r,r as t};
1
+ import{l as e}from"./terminal-DOp1a9g6.js";function t({daemonConnected:e,streamConnected:t}){return t?e?`connected`:`daemon-offline`:`event-stream-disconnected`}function n(e){return t(e)===`connected`}function r(e){return!n(e)}function i(e){return!!e.hydrated&&t(e)===`daemon-offline`}function a(n){let r=t(n);return r===`connected`?{ok:!0,label:`daemon connected`}:r===`daemon-offline`?{ok:!1,label:`no daemon`,title:`Daemon offline — if it doesn't recover, run \`${e} doctor\` or \`${e} reset\` in a terminal.`}:{ok:!1,label:`connecting…`}}export{i as n,a as r,r as t};
@@ -1 +1 @@
1
- import{a as e,f as t,o as n}from"./terminal-B1H9J2fC.js";import{y as r}from"./tabs-CRELMxoF.js";import{m as i,p as a,t as o}from"./createLucideIcon-DzfSOpX_.js";import{a as s,n as c,r as l}from"./toast-fLh1SAZ0.js";import{n as u}from"./store-DMgnHRko.js";import{t as d}from"./arrow-left-DJr0sPsD.js";import{n as f}from"./time-kviT26Tm.js";import{n as p,t as m}from"./ConfirmDialog-BjevP66y.js";var h=o(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),g=t(r(),1),_=class extends Error{};async function v(){let e=await n.get(`/api/worktrees`,{label:`load worktrees`});return Array.isArray(e.projects)?e.projects:[]}async function y(t,r){try{return(await n.delete(`/api/worktrees`,{path:t,force:r},{label:`delete worktree`})).residue??null}catch(t){throw t instanceof e&&/refusing to remove dirty worktree/.test(t.detail)?new _(t.detail):t}}var b=i();function x(e){return e===!0?(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-kobe-green`,children:`on remote`}):e===!1?(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-kobe-yellow`,children:`not pushed`}):(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-subtle`,children:`remote unknown`})}function S({row:e,linkedTaskTitle:t,onDelete:n}){return(0,b.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-line-subtle px-3 py-2 last:border-b-0`,children:[(0,b.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`truncate font-mono text-[12px] text-fg`,children:e.branch||`(detached)`}),e.kobeManaged&&(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-subtle`,children:`rove`}),e.dirty&&(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-kobe-yellow`,children:`dirty`}),x(e.branchOnRemote),t&&(0,b.jsxs)(`span`,{className:`shrink-0 truncate text-[10px] text-subtle`,children:[`task: `,t]})]}),(0,b.jsxs)(`div`,{className:`mt-0.5 flex items-center gap-2 text-[10px] text-subtle`,children:[(0,b.jsx)(`span`,{className:`truncate font-mono`,children:e.path}),e.createdAtMs>0&&(0,b.jsxs)(`span`,{className:`ml-auto shrink-0`,children:[`created `,f(e.createdAtMs)]})]})]}),(0,b.jsx)(`button`,{type:`button`,onClick:n,className:`shrink-0 border border-line bg-bg px-2 py-1 text-[11px] text-muted transition-colors hover:border-kobe-red hover:text-kobe-red`,children:`Delete`})]})}function C(){let e=s(),{tasks:t}=u(),[n,r]=(0,g.useState)(null),[i,o]=(0,g.useState)(!1),[f,x]=(0,g.useState)(null),[C,w]=(0,g.useState)(null),[T,E]=(0,g.useState)([]),D=(0,g.useMemo)(()=>{let e=new Map;for(let n of t)n.worktreePath&&e.set(n.worktreePath,n.title||n.branch);return e},[t]),O=()=>{o(!0),v().then(r).catch(e=>l(`load worktrees`,e)).finally(()=>o(!1))};(0,g.useEffect)(O,[]);let k=(n??[]).map(e=>({...e,worktrees:e.worktrees.filter(e=>!T.includes(e.path))})),A=e=>{r(t=>t?.map(t=>({...t,worktrees:t.worktrees.filter(t=>t.path!==e)}))??t)},j=(e,t)=>{E(t=>[...t,e.path]),y(e.path,t).then(t=>{t&&c(`info`,`Git deregistered the worktree, but couldn't delete ${t.path} (${t.reason}). Retrying won't help; delete the directory by hand if you want the space.`),A(e.path),E(t=>t.filter(t=>t!==e.path))}).catch(n=>{E(t=>t.filter(t=>t!==e.path)),!t&&n instanceof _?w(e):l(t?`force delete worktree`:`delete worktree`,n)})};return(0,b.jsxs)(`div`,{className:`flex h-screen flex-col overflow-hidden bg-bg text-fg`,children:[(0,b.jsxs)(`header`,{"data-kobe-topbar":!0,className:`flex h-10 shrink-0 items-center gap-3 border-b border-line bg-surface px-3`,children:[(0,b.jsx)(p,{}),(0,b.jsxs)(`button`,{type:`button`,onClick:()=>e({to:`/`}),className:`flex items-center gap-1.5 text-muted transition-colors hover:text-fg`,title:`Back to workspace`,children:[(0,b.jsx)(d,{size:15,strokeWidth:1.8}),(0,b.jsx)(`span`,{className:`text-[12px]`,children:`Workspace`})]}),(0,b.jsx)(`span`,{className:`text-[10px] font-bold uppercase tracking-[0.12em] text-fg`,children:`Worktrees`}),(0,b.jsx)(`button`,{type:`button`,onClick:O,disabled:i,className:`ml-auto flex items-center gap-1.5 text-muted transition-colors hover:text-fg disabled:opacity-40`,title:`Refresh`,children:(0,b.jsx)(h,{size:13,strokeWidth:1.8,className:i?`animate-spin`:``})})]}),(0,b.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:n===null?(0,b.jsx)(`p`,{className:`px-3 py-6 text-center text-[12px] text-subtle`,children:`Loading worktrees…`}):k.length===0?(0,b.jsxs)(`p`,{className:`px-3 py-6 text-center text-[12px] text-subtle`,children:[`No local projects known to `,a(),` yet.`]}):k.map(e=>(0,b.jsxs)(`div`,{className:`border-b border-line`,children:[(0,b.jsx)(`div`,{className:`border-b border-line-subtle bg-surface px-3 py-1.5 font-mono text-[11px] text-subtle`,children:e.repo}),e.worktrees.length===0?(0,b.jsx)(`p`,{className:`px-3 py-3 text-[12px] text-subtle`,children:`No worktrees.`}):e.worktrees.map(e=>(0,b.jsx)(S,{row:e,linkedTaskTitle:D.get(e.path)??null,onDelete:()=>x(e)},e.path))]},e.repo))}),f&&(0,b.jsx)(m,{title:`Delete worktree`,body:`Delete the worktree for "${f.branch||f.path}"? This removes the working directory; the branch itself is kept.`,confirmLabel:`Delete`,danger:!0,onConfirm:()=>{if(!f)return;let e=f;x(null),j(e,!1)},onCancel:()=>x(null)}),C&&(0,b.jsx)(m,{title:`Force delete worktree`,body:`"${C.branch||C.path}" has uncommitted or untracked changes that will be PERMANENTLY LOST. Force delete anyway?`,confirmLabel:`Force delete`,danger:!0,onConfirm:()=>{if(!C)return;let e=C;w(null),j(e,!0)},onCancel:()=>w(null)})]})}var w=C;export{w as component};
1
+ import{a as e,f as t,o as n}from"./terminal-DOp1a9g6.js";import{y as r}from"./tabs-CMZJhcSB.js";import{m as i,p as a,t as o}from"./createLucideIcon-CuIQtyYV.js";import{a as s,n as c,r as l}from"./toast-C4yXq6hM.js";import{n as u}from"./store-BLM6nh6E.js";import{t as d}from"./arrow-left-CavMh90a.js";import{n as f}from"./time-kviT26Tm.js";import{n as p,t as m}from"./ConfirmDialog-kyA624OF.js";var h=o(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),g=t(r(),1),_=class extends Error{};async function v(){let e=await n.get(`/api/worktrees`,{label:`load worktrees`});return Array.isArray(e.projects)?e.projects:[]}async function y(t,r){try{return(await n.delete(`/api/worktrees`,{path:t,force:r},{label:`delete worktree`})).residue??null}catch(t){throw t instanceof e&&/refusing to remove dirty worktree/.test(t.detail)?new _(t.detail):t}}var b=i();function x(e){return e===!0?(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-kobe-green`,children:`on remote`}):e===!1?(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-kobe-yellow`,children:`not pushed`}):(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-subtle`,children:`remote unknown`})}function S({row:e,linkedTaskTitle:t,onDelete:n}){return(0,b.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-line-subtle px-3 py-2 last:border-b-0`,children:[(0,b.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`truncate font-mono text-[12px] text-fg`,children:e.branch||`(detached)`}),e.kobeManaged&&(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-subtle`,children:`rove`}),e.dirty&&(0,b.jsx)(`span`,{className:`shrink-0 text-[10px] text-kobe-yellow`,children:`dirty`}),x(e.branchOnRemote),t&&(0,b.jsxs)(`span`,{className:`shrink-0 truncate text-[10px] text-subtle`,children:[`task: `,t]})]}),(0,b.jsxs)(`div`,{className:`mt-0.5 flex items-center gap-2 text-[10px] text-subtle`,children:[(0,b.jsx)(`span`,{className:`truncate font-mono`,children:e.path}),e.createdAtMs>0&&(0,b.jsxs)(`span`,{className:`ml-auto shrink-0`,children:[`created `,f(e.createdAtMs)]})]})]}),(0,b.jsx)(`button`,{type:`button`,onClick:n,className:`shrink-0 border border-line bg-bg px-2 py-1 text-[11px] text-muted transition-colors hover:border-kobe-red hover:text-kobe-red`,children:`Delete`})]})}function C(){let e=s(),{tasks:t}=u(),[n,r]=(0,g.useState)(null),[i,o]=(0,g.useState)(!1),[f,x]=(0,g.useState)(null),[C,w]=(0,g.useState)(null),[T,E]=(0,g.useState)([]),D=(0,g.useMemo)(()=>{let e=new Map;for(let n of t)n.worktreePath&&e.set(n.worktreePath,n.title||n.branch);return e},[t]),O=()=>{o(!0),v().then(r).catch(e=>l(`load worktrees`,e)).finally(()=>o(!1))};(0,g.useEffect)(O,[]);let k=(n??[]).map(e=>({...e,worktrees:e.worktrees.filter(e=>!T.includes(e.path))})),A=e=>{r(t=>t?.map(t=>({...t,worktrees:t.worktrees.filter(t=>t.path!==e)}))??t)},j=(e,t)=>{E(t=>[...t,e.path]),y(e.path,t).then(t=>{t&&c(`info`,`Git deregistered the worktree, but couldn't delete ${t.path} (${t.reason}). Retrying won't help; delete the directory by hand if you want the space.`),A(e.path),E(t=>t.filter(t=>t!==e.path))}).catch(n=>{E(t=>t.filter(t=>t!==e.path)),!t&&n instanceof _?w(e):l(t?`force delete worktree`:`delete worktree`,n)})};return(0,b.jsxs)(`div`,{className:`flex h-screen flex-col overflow-hidden bg-bg text-fg`,children:[(0,b.jsxs)(`header`,{"data-kobe-topbar":!0,className:`flex h-10 shrink-0 items-center gap-3 border-b border-line bg-surface px-3`,children:[(0,b.jsx)(p,{}),(0,b.jsxs)(`button`,{type:`button`,onClick:()=>e({to:`/`}),className:`flex items-center gap-1.5 text-muted transition-colors hover:text-fg`,title:`Back to workspace`,children:[(0,b.jsx)(d,{size:15,strokeWidth:1.8}),(0,b.jsx)(`span`,{className:`text-[12px]`,children:`Workspace`})]}),(0,b.jsx)(`span`,{className:`text-[10px] font-bold uppercase tracking-[0.12em] text-fg`,children:`Worktrees`}),(0,b.jsx)(`button`,{type:`button`,onClick:O,disabled:i,className:`ml-auto flex items-center gap-1.5 text-muted transition-colors hover:text-fg disabled:opacity-40`,title:`Refresh`,children:(0,b.jsx)(h,{size:13,strokeWidth:1.8,className:i?`animate-spin`:``})})]}),(0,b.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:n===null?(0,b.jsx)(`p`,{className:`px-3 py-6 text-center text-[12px] text-subtle`,children:`Loading worktrees…`}):k.length===0?(0,b.jsxs)(`p`,{className:`px-3 py-6 text-center text-[12px] text-subtle`,children:[`No local projects known to `,a(),` yet.`]}):k.map(e=>(0,b.jsxs)(`div`,{className:`border-b border-line`,children:[(0,b.jsx)(`div`,{className:`border-b border-line-subtle bg-surface px-3 py-1.5 font-mono text-[11px] text-subtle`,children:e.repo}),e.worktrees.length===0?(0,b.jsx)(`p`,{className:`px-3 py-3 text-[12px] text-subtle`,children:`No worktrees.`}):e.worktrees.map(e=>(0,b.jsx)(S,{row:e,linkedTaskTitle:D.get(e.path)??null,onDelete:()=>x(e)},e.path))]},e.repo))}),f&&(0,b.jsx)(m,{title:`Delete worktree`,body:`Delete the worktree for "${f.branch||f.path}"? This removes the working directory; the branch itself is kept.`,confirmLabel:`Delete`,danger:!0,onConfirm:()=>{if(!f)return;let e=f;x(null),j(e,!1)},onCancel:()=>x(null)}),C&&(0,b.jsx)(m,{title:`Force delete worktree`,body:`"${C.branch||C.path}" has uncommitted or untracked changes that will be PERMANENTLY LOST. Force delete anyway?`,confirmLabel:`Force delete`,danger:!0,onConfirm:()=>{if(!C)return;let e=C;w(null),j(e,!0)},onCancel:()=>w(null)})]})}var w=C;export{w as component};
@@ -5,14 +5,14 @@
5
5
  <meta charset="UTF-8" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Rove</title>
8
- <script type="module" crossorigin src="/assets/index-BzLgyEfV.js"></script>
9
- <link rel="modulepreload" crossorigin href="/assets/terminal-B1H9J2fC.js">
10
- <link rel="modulepreload" crossorigin href="/assets/tabs-CRELMxoF.js">
11
- <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-DzfSOpX_.js">
12
- <link rel="modulepreload" crossorigin href="/assets/external-store-DExSl1xD.js">
13
- <link rel="modulepreload" crossorigin href="/assets/toast-fLh1SAZ0.js">
14
- <link rel="modulepreload" crossorigin href="/assets/store-DMgnHRko.js">
15
- <link rel="modulepreload" crossorigin href="/assets/active-task-CKN1iEVj.js">
8
+ <script type="module" crossorigin src="/assets/index-B4xJZEqf.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/assets/terminal-DOp1a9g6.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/tabs-CMZJhcSB.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-CuIQtyYV.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/external-store-BCBJewGi.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/toast-C4yXq6hM.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/store-BLM6nh6E.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/active-task-gVYiAkLv.js">
16
16
  <link rel="stylesheet" crossorigin href="/assets/index-BnjD9Q-3.css">
17
17
  </head>
18
18
  <body>
@@ -17,6 +17,7 @@ import { createServer } from "node:http"
17
17
  import { spawn } from "node-pty"
18
18
  import { WebSocketServer } from "ws"
19
19
  import { allowedHostForBindHost, originAllowed } from "./origin-policy.mjs"
20
+ import { expectedPtyToken, ptyRequestAuthorized } from "./pty-auth.mjs"
20
21
  import { ptyEnv } from "./pty-env.mjs"
21
22
  import { createScrollback } from "./pty-scrollback.mjs"
22
23
  import { createPtySessionManager } from "./pty-session-lifecycle.mjs"
@@ -40,7 +41,13 @@ async function fetchSpec(taskId, mode) {
40
41
  }
41
42
  }
42
43
  const path = mode === "shell" ? "/api/terminal-spec" : "/api/engine-spec"
43
- const res = await fetch(`http://localhost:${DAEMON_WEB_PORT}${path}?taskId=${encodeURIComponent(taskId)}`)
44
+ // `/api/*` on the daemon requires the bearer token like every other caller
45
+ // does; without it a real tab dies at "unauthorized: this request carried no
46
+ // valid web token" before any PTY is spawned.
47
+ const token = expectedPtyToken()
48
+ const res = await fetch(`http://localhost:${DAEMON_WEB_PORT}${path}?taskId=${encodeURIComponent(taskId)}`, {
49
+ headers: token ? { authorization: `Bearer ${token}` } : {},
50
+ })
44
51
  const json = await res.json()
45
52
  if (!res.ok || json.error) throw new Error(json.error ?? `engine-spec failed (${res.status})`)
46
53
  return json // { cwd, command: string[], firstMessage?: string }
@@ -54,6 +61,17 @@ const ptySessions = createPtySessionManager({
54
61
  env: ptyEnv,
55
62
  })
56
63
 
64
+ /**
65
+ * The gate every PTY route shares. Origin says which page is asking, the token
66
+ * says whether the caller is entitled at all — and the token is the one that
67
+ * stops a non-browser process, which sends no Origin. Returns the status to
68
+ * refuse with, or null to proceed.
69
+ */
70
+ function ptyRouteDenial(req, url) {
71
+ if (!originAllowed(req.headers.origin, { allowedHost: ALLOWED_HOST })) return 403
72
+ return ptyRequestAuthorized(req.headers, url) ? null : 401
73
+ }
74
+
57
75
  const server = createServer((req, res) => {
58
76
  const url = new URL(req.url ?? "/", "http://localhost")
59
77
  if (url.pathname === HEALTH_PATH) {
@@ -71,11 +89,11 @@ const server = createServer((req, res) => {
71
89
  return
72
90
  }
73
91
  if (req.method === "POST" && url.pathname === "/pty/send") {
74
- // Sending text DRIVES the engine like a keyboard, so unlike /pty/close
75
- // (best-effort kill) this holds the same origin policy as the WS attach:
76
- // localhost pages or non-browser clients only.
77
- if (!originAllowed(req.headers.origin, { allowedHost: ALLOWED_HOST })) {
78
- res.writeHead(403)
92
+ // Sending text DRIVES the engine like a keyboard, so this holds the same
93
+ // gate as the WS attach — the bearer token, plus the origin check.
94
+ const denial = ptyRouteDenial(req, url)
95
+ if (denial) {
96
+ res.writeHead(denial)
79
97
  res.end()
80
98
  return
81
99
  }
@@ -125,12 +143,12 @@ const server = createServer((req, res) => {
125
143
  return
126
144
  }
127
145
  if (req.method === "POST" && url.pathname === "/pty/close") {
128
- // Killing a tab is a side effect a cross-origin local page could abuse to
129
- // DoS the session (tab ids are client-generated/observable), so hold the
130
- // same origin policy as /pty/send and the WS attach: localhost pages or
131
- // non-browser clients (no Origin) only.
132
- if (!originAllowed(req.headers.origin, { allowedHost: ALLOWED_HOST })) {
133
- res.writeHead(403)
146
+ // Killing a tab is a side effect any caller that reached this port could
147
+ // abuse to DoS the session (tab ids are client-generated/observable), so
148
+ // hold the same gate as /pty/send and the WS attach.
149
+ const denial = ptyRouteDenial(req, url)
150
+ if (denial) {
151
+ res.writeHead(denial)
134
152
  res.end()
135
153
  return
136
154
  }
@@ -158,15 +176,18 @@ const server = createServer((req, res) => {
158
176
  res.end()
159
177
  })
160
178
 
161
- // A PTY WS is arbitrary command exec in the worktree, so reject cross-origin
162
- // upgrades: a browser sends an Origin header, and only loopback pages (or the
163
- // deliberately configured LAN host) may attach. This defends a malicious local
164
- // page / DNS-rebinding even on the loopback bind. Non-browser clients (no
165
- // Origin) are allowed there's no browser to forge their request.
179
+ // A PTY WS is arbitrary command exec in the worktree, so it takes both checks.
180
+ // The origin check rejects cross-origin upgrades, which defends a malicious
181
+ // local page / DNS-rebinding even on the loopback bind; it cannot defend
182
+ // anything against a client that simply sends no Origin, which is why the
183
+ // bearer tokenthe same one every REST and SSE caller presents — decides.
184
+ // `ws` refuses a false verifyClient with HTTP 401.
166
185
  const wss = new WebSocketServer({
167
186
  server,
168
187
  path: "/pty",
169
- verifyClient: ({ origin }) => originAllowed(origin, { allowedHost: ALLOWED_HOST }),
188
+ verifyClient: ({ origin, req }) =>
189
+ originAllowed(origin, { allowedHost: ALLOWED_HOST }) &&
190
+ ptyRequestAuthorized(req.headers, new URL(req.url ?? "/", "http://localhost")),
170
191
  })
171
192
 
172
193
  wss.on("connection", (ws, req) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@sma1lboy/rove",
4
- "version": "0.9.103",
4
+ "version": "0.9.104",
5
5
  "description": "Rove — the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",
6
6
  "keywords": [
7
7
  "terminal",
@@ -1 +0,0 @@
1
- import{t as e}from"./store-DMgnHRko.js";function t(t){return e(`task.setActive`,{taskId:t})}function n(e,n){t(e).catch(e=>{n?.(e)})}export{n as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./createLucideIcon-DzfSOpX_.js";var t=e(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]);export{t};
@@ -1 +0,0 @@
1
- import{Board as e}from"./Board-C2F4oEsF.js";var t=e;export{t as component};
@@ -1 +0,0 @@
1
- import{IssuesPage as e}from"./IssuesPage-B8tW73tv.js";var t=e;export{t as component};
@@ -1 +0,0 @@
1
- import{AppShell as e}from"./AppShell-BcGCm5H6.js";var t=e;export{t as component};
@@ -1 +0,0 @@
1
- import{f as e}from"./terminal-B1H9J2fC.js";import{_ as t,f as n,y as r}from"./tabs-CRELMxoF.js";import{m as i}from"./createLucideIcon-DzfSOpX_.js";import{t as a}from"./active-task-CKN1iEVj.js";import{t as o}from"./index-BzLgyEfV.js";import{AppShell as s}from"./AppShell-BcGCm5H6.js";var c=e(r()),l=i();function u(){let{taskId:e}=o.useParams(),{selectedTaskId:r}=t();return(0,c.useEffect)(()=>{!e||e===r||(n(e),a(e))},[e,r]),(0,l.jsx)(s,{})}export{u as component};