@bud.sh/app 0.4.0 → 0.4.1

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 (56) hide show
  1. package/dist/client/assets/bud/design.js +1 -1
  2. package/dist/client/assets/{canvas-C8hyPWoT.js → canvas-DIKX_HCJ.js} +1 -1
  3. package/dist/client/assets/difference-worker-CwQNxTJL.js +8 -0
  4. package/dist/client/assets/files-BQ9O3Z8-.js +1 -0
  5. package/dist/client/assets/i18n-CL0jBP7Y.js +1 -0
  6. package/dist/client/assets/{index-Dpxjiok1.js → index-COvyj5zV.js} +2 -2
  7. package/dist/client/assets/{pages-B-_CKvDS.js → pages-BGl2Yuza.js} +1 -1
  8. package/dist/client/assets/{project-branches-DzXdaT9L.js → project-branches-DwKjCwZv.js} +1 -1
  9. package/dist/client/assets/{project-comments-CQkB2jbE.js → project-comments-Cdip2Y10.js} +1 -1
  10. package/dist/client/assets/{project-thread-links-BN7zL0AX.js → project-thread-links-BGIkGQeU.js} +1 -1
  11. package/dist/client/assets/{project-threads-CHGG-6fo.js → project-threads-DeKXNqeP.js} +5 -5
  12. package/dist/client/assets/{project-work-L5fYMSOu.js → project-work-B7PGQtV9.js} +1 -1
  13. package/dist/client/assets/task-design-DJp5yho1.js +23 -0
  14. package/dist/client/assets/{tasks-A2FKo3_h.js → tasks-BHXj727C.js} +1 -1
  15. package/dist/client/assets/{tasks-request-DGigNdyK.js → tasks-request-CsUB5__X.js} +1 -1
  16. package/dist/client/assets/{workspace-CvWmU2RK.js → workspace-CbO7RsI2.js} +2 -2
  17. package/dist/client/index.html +2 -2
  18. package/dist/hosted/assets/{canvas-MWtOwaWm.js → canvas-gWj_ocKK.js} +4 -4
  19. package/dist/hosted/assets/{comment-data-DsgJWq4n.js → comment-data-C-rNCB1n.js} +138 -11
  20. package/dist/hosted/assets/{files-Wvo11G2A.js → files-CAPvbavY.js} +3 -3
  21. package/dist/hosted/assets/{pages-BAmRFVtU.js → pages-DJiOvT-l.js} +3 -3
  22. package/dist/hosted/assets/{project-branches-BNloVosX.js → project-branches-BgrfdvtL.js} +1 -1
  23. package/dist/hosted/assets/{project-thread-links-BmY8HQXt.js → project-thread-links-B7uzThL9.js} +2 -2
  24. package/dist/hosted/assets/{screen-QmqmI2Aq.js → screen-D4D9nh4V.js} +1 -1
  25. package/dist/hosted/assets/{tasks-C8iWPrWg.js → tasks-C7aGLzBw.js} +4 -4
  26. package/dist/hosted/assets/{tasks-request-C89fN1dK.js → tasks-request-CikFdCgP.js} +1 -1
  27. package/dist/hosted/hosted.js +16 -8
  28. package/dist/node/design.js +126 -6
  29. package/dist/node-host/assets/{canvas-D_F8SIlm.js → canvas-kXzp80a5.js} +4 -4
  30. package/dist/node-host/assets/{comment-data-q_8INiZz.js → comment-data-CeuJbJKJ.js} +138 -11
  31. package/dist/node-host/assets/{files-xazOrNCX.js → files-0YIuvKzb.js} +3 -3
  32. package/dist/node-host/assets/{pages-D6VkmdfQ.js → pages-DOF22SyG.js} +3 -3
  33. package/dist/node-host/assets/{project-branches-C26hwmo3.js → project-branches-BeEwMBIw.js} +1 -1
  34. package/dist/node-host/assets/{project-thread-links-BOzjws5W.js → project-thread-links-Bs_MtfBC.js} +2 -2
  35. package/dist/node-host/assets/{screen-Dog-YByu.js → screen-DRTAKkn3.js} +1 -1
  36. package/dist/node-host/assets/{tasks-A1_bpb3_.js → tasks-BA_hcbj5.js} +4 -4
  37. package/dist/node-host/assets/{tasks-request-Bie1PpQP.js → tasks-request-Doc9y_20.js} +1 -1
  38. package/dist/node-host/node-host.js +16 -8
  39. package/dist/server/assets/{canvas-Dn4RYoU2.js → canvas-CiN6jNIZ.js} +4 -4
  40. package/dist/server/assets/{comment-data-B0OLHBGp.js → comment-data-9SqALQjT.js} +138 -11
  41. package/dist/server/assets/{files-C5Vilfe4.js → files-DBVqeLdL.js} +3 -3
  42. package/dist/server/assets/{listener-o1STuLju.js → listener-DGWKUc2o.js} +16 -8
  43. package/dist/server/assets/{pages-BNa0MHEc.js → pages-DJMLr6j9.js} +3 -3
  44. package/dist/server/assets/{project-branches-GtQYyOH5.js → project-branches-DbKEmiQT.js} +1 -1
  45. package/dist/server/assets/{project-thread-links-Nfz9NIny.js → project-thread-links-C0kV_Pcl.js} +2 -2
  46. package/dist/server/assets/{project-work-Cy_BpHwR.js → project-work-C0FN3w5Y.js} +2 -2
  47. package/dist/server/assets/{screen-BtcJmZwj.js → screen-BtvzEiIa.js} +1 -1
  48. package/dist/server/assets/{tasks-B82tHwyQ.js → tasks-DX71x8f9.js} +5 -5
  49. package/dist/server/assets/{tasks-request-BtJBlkxV.js → tasks-request-C3jk9Jyu.js} +1 -1
  50. package/dist/server/runtime.js +1 -1
  51. package/dist/server/server.js +1 -1
  52. package/package.json +1 -1
  53. package/dist/client/assets/difference-worker-BfF4_N3e.js +0 -8
  54. package/dist/client/assets/files-D_Tm7gCK.js +0 -1
  55. package/dist/client/assets/i18n-BtfXum8P.js +0 -1
  56. package/dist/client/assets/task-design-DYqcqq1b.js +0 -23
@@ -1 +1 @@
1
- import{n as e}from"./i18n-BtfXum8P.js";import{t}from"./jsx-B4XNFIzB.js";import{t as n}from"./component-DWct-Tq6.js";import{n as r}from"./on-mixin-iWnqUzq5.js";import{n as i}from"./attrs-mixin-CmlG_FtV.js";import{c as a,l as o}from"./loader-Q6-HPKft.js";import{t as s}from"./screen-Dfvzj6n2.js";import{Cn as c,H as l,J as u,T as d,U as f,_t as p,bt as m,dt as h,ot as g,vn as _,xn as v,yn as y}from"./task-design-DYqcqq1b.js";import{C as b,E as x,S,V as C,b as w,ct as T,dt as E,p as D,q as O,s as k,w as A,x as j}from"./project-threads-CHGG-6fo.js";import{a as ee,o as te,r as M,s as ne,t as N}from"./project-comments-CQkB2jbE.js";import{n as P,t as F}from"./tasks-request-DGigNdyK.js";import{t as I}from"./project-work-L5fYMSOu.js";import{n as L,t as R}from"./project-thread-links-BN7zL0AX.js";function re(s){let c=s.props.conversationId,d=c,p=!!c,m=!1,g=!1,_=[s.props.itemId],v=N({store:k(s.props.project),token:s.props.project.token,signal:s.signal,filter:{itemId:s.props.itemId},initial:s.props.initial,onChange(){s.signal.aborted||s.update()}});v.loaded&&(d??=v.snapshot.threads[0]?.id);let y=i(()=>{v.loaded||v.load().then(()=>{d??=v.snapshot.threads[0]?.id,s.signal.aborted||s.update()})});async function b(e){let t=await v.write(e);return await s.props.onChange?.(),t}function S(e){return{project:s.props.project,thread:e,items:s.props.items,canLink:v.snapshot.capabilities.link,busy:v.busy,onChange:async()=>{await v.load(),v.snapshot.threads.some(t=>t.id===e.id)&&await v.loadThread(e.id,!0),await s.props.onChange?.()}}}function C(n){return t(`div`,{class:`flex items-start justify-between gap-2`,children:[s.props.renderThreadLinks?s.props.renderThreadLinks(n):t(R,{part:n.anchor?`links`:void 0,...S(n)}),!n.anchor&&v.snapshot.capabilities.reply&&v.snapshot.threads.length>1?t(a,{variant:`ghost`,size:`small`,disabled:v.busy,"aria-pressed":!m&&d===n.id,mix:r(`click`,()=>{d=n.id,p=!0,m=!1,s.update()}),children:e(`app.client.taskDiscussion.reply`)}):null]})}function w(n){return t(O,{location:n.anchor?T(n):e(`app.client.taskDiscussion.discussion`),actions:s.props.renderThreadLinks?void 0:t(R,{part:`action`,...S(n)}),status:n.status,busy:v.busy,onStatusChange:v.snapshot.capabilities.status?e=>{b({id:n.id,status:e}).catch(()=>{})}:void 0})}return()=>{c!==s.props.conversationId&&(c=s.props.conversationId,p=!!c,c&&(d=c,m=!1));let{threads:i,capabilities:S}=v.snapshot,T=m?void 0:i.find(e=>e.id===d&&!e.anchor)??(p?void 0:i.find(e=>!e.anchor&&e.status!==`resolved`)??(S.create?void 0:i.find(e=>!e.anchor))),E=!m&&(p&&(!T||!S.reply)||!(!T||T.messagesLoaded));v.ready&&!v.busy&&!v.loading&&s.queueTask(()=>{p&&d&&v.loadThread(d);for(let e of v.snapshot.threads)!e.messagesLoaded&&(!e.anchor||e.id===d)&&v.loadThread(e.id)});let D=i.reduce((e,t)=>e+t.messageCount,0);return t(`section`,{class:`flex min-w-0 flex-col gap-3`,"aria-label":e(`app.client.taskDiscussion.taskDiscussion`),mix:y,children:[t(`div`,{class:`flex items-center gap-2`,children:[t(o,{as:`h3`,variant:`ui`,weight:`medium`,children:e(`app.client.taskDiscussion.discussion`)}),D?t(o,{variant:`ui-caption`,tone:`muted`,children:D}):null,v.ready&&S.create&&i.length?t(a,{variant:`ghost`,size:`small`,class:`ms-auto`,disabled:v.busy||m,mix:r(`click`,()=>{m=!0,s.update()}),children:e(`app.client.taskDiscussion.newDiscussion`)}):null]}),v.error?t(`div`,{class:`flex flex-col items-start gap-2`,children:[t(o,{variant:`ui-caption`,role:`alert`,children:v.error}),t(a,{variant:`secondary`,size:`small`,mix:r(`click`,()=>{v.load().then(()=>d?v.loadThread(d,!0):void 0)}),children:e(`app.client.taskDiscussion.reloadComments`)})]}):null,v.loaded?v.ready?t(n,{children:[i.length?i.map(e=>e.anchor?t(f,{id:e.id,expanded:d===e.id,heading:w(e),messages:e.messages,messageCount:e.messageCount,now:v.now,onExpand:()=>{d=e.id,p=!1,v.loadThread(e.id),s.update()},renderDetail:()=>t(l,{heading:w(e),messages:e.messages,messageCount:e.messageCount,messagesLoaded:e.messagesLoaded,messagesTruncated:e.messagesTruncated,now:v.now,busy:v.busy,links:C(e),onReply:S.reply?(t,n)=>b({id:e.id,body:t,parentId:n}):void 0})},e.id):t(x,{thread:e,links:C(e)},e.id)):t(o,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.noDiscussionYet`)}),S.create||S.reply&&(p||i.some(e=>!e.anchor))?t(`div`,{class:`flex min-w-0 flex-col gap-2`,children:[S.create&&(m||!p&&!i.length)?t(`div`,{class:`flex items-start justify-between gap-2`,"aria-label":e(`app.client.taskDiscussion.newDiscussionTasks`),children:[t(A,{itemIds:_,items:s.props.items??[],href:h,busy:v.busy,onEdit:S.link?()=>{g=!0,s.update()}:void 0}),m?t(a,{variant:`ghost`,size:`small`,disabled:v.busy,mix:r(`click`,()=>{m=!1,s.update()}),children:e(`app.client.taskDiscussion.cancel`)}):null]}):i.length>1?t(o,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.replyingTo`,{name:T?.messages[0]?.author.name??e(`app.client.taskDiscussion.theDiscussion`)})}):null,t(u,{label:e(`app.client.taskDiscussion.addTaskComment`),placeholder:e(`app.client.taskDiscussion.addContextPlaceholder`),busy:v.busy||E,class:`w-full`,onSubmit:async t=>{if(E)throw Error(e(`app.client.taskDiscussion.loadBeforeReplying`));T&&S.reply?await b({id:T.id,body:t}):(d=(await b({anchor:null,itemIds:_,body:t})).thread.id,p=!!d,m=!1,_=[s.props.itemId],s.update())}},`task-composer`)]}):null]}):t(o,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.commentsUnavailable`)}):t(o,{variant:`ui-caption`,tone:`muted`,role:`status`,children:e(`app.client.taskDiscussion.loadingDiscussion`)}),g?t(L,{project:s.props.project,selected:_,required:[s.props.itemId],onSave:async e=>{_=e,s.update()},onClose:()=>{g=!1,s.update()}}):null]})}}function ie(e,t){return e.revision===null?Object.entries(e.values).some(([e,n])=>JSON.stringify(n)!==JSON.stringify(t.values[e])):e.revision!==t.revision}async function z(t,n,r,i,a){let[o,s,c]=await Promise.all([P(w.tasksApi.show.href({id:n}),t,i,e=>e),M(t,n,i,a),r]),l=y(o,c);if(l.item.id!==n)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));return{detail:l,discussion:s}}async function B(t,n,r,i){let a=await k(t),o=D(a),s=o?Promise.resolve(o):I(t).refresh(n),c=r?g(r):null,l=e=>z(t.token,c,e,n,i),u=``,d=c?l(s.then(e=>e.schema)).catch(e=>{if(!o||e instanceof F)throw e;return l(I(t).refresh(n).then(e=>e.schema))}).catch(t=>(u=t instanceof Error?t.message:e(`app.client.projectTasks.couldNotLoadTask`),null)):null;try{await s;let e=await d;return{store:a,stored:!!o,error:``,task:e,taskError:u}}catch(t){return n.throwIfAborted(),{store:a,stored:!1,error:t instanceof Error?t.message:e(`app.client.projectTasks.couldNotLoadTasks`)}}}function V(n){let r=n.props.project,a=n.props.initial.store,o=I(r),s=D(a),l=()=>{let e=s?.snapshot.schemaVersion;s=D(a);let t=x?a.work.get(x.item.id):void 0;(t&&!t.$hasPendingWrites&&ie(j(t),x.item)||!x&&k&&s?.snapshot.schemaVersion!==e)&&Z(),Y()},u=[a.boards.subscribeChanges(l),a.work.subscribeChanges(l)],f=g(n.props.href),p=n.props.initial.task,x=p?.detail.item.id===f?p.detail:null,T=x?p.discussion:void 0,O=!1,k=n.props.initial.task?``:n.props.initial.taskError??``,A=f!==null&&!x&&!k,M=n.props.initial.error,N=null,F=null,L=new Set,R=n.props.href,B,V=!1,H=!1;function ae(e){let t=e?a.work.get(e.item.id):void 0;if(!e||!t?.$hasPendingWrites)return e;let n={...e.item.values,...j(t).values};return{...e,item:{...e.item,values:n}}}function U(){if(!s)throw Error(e(`app.client.projectTasks.refreshBeforeChanges`));return s.schema}async function W(e,t,i){let a=new AbortController;L.add(a);try{return await P(e,r.token,AbortSignal.any([n.signal,a.signal]),i,fetch,{body:t})}finally{L.delete(a)}}async function oe(e){await b(a.work,{upsert:[e]}),x?.item.id===e.id&&(x={...x,item:e}),Y()}async function G(){await X(),f&&await Z()}let K=new Map;async function q(t,r,i,a){let o=a?K.get(a):void 0,s=Promise.withResolvers();a&&K.set(a,s.promise);try{let n=await S(i,async()=>{let n=await o,i=`expectedRevision`in r?r.expectedRevision:void 0,c=await W(t,n&&i===n.from&&n.to?{...r,expectedRevision:n.to}:r,e=>v(e,U()));if(a&&c.item.id!==a)throw Error(e(`app.client.projectTasks.differentTaskRefreshRetry`));return await oe(c.item),s.resolve(i?{from:i,to:c.item.revision}:null),c.item});return f&&await Z(),n}catch(t){throw s.resolve(null),n.signal.aborted||d.error(e(`app.client.projectTasks.undidTaskChange`),{description:t instanceof Error?t.message:e(`app.client.projectTasks.writeNotConfirmed`)}),G(),t}finally{a&&K.get(a)===s.promise&&K.delete(a)}}function J(e,t){return()=>{let n=a.work.get(e);if(!n)return;let{values:r}=t(j(n));a.work.update(e,e=>{e.values=r})}}let se={create:e=>q(w.tasksApi.create.href(),e,()=>{a.work.insert(te(U(),`pending-${crypto.randomUUID()}`,e))}),update:(e,t)=>q(w.tasksApi.update.href({id:e}),t,J(e,e=>ne(e,t)),e),act:(e,t)=>q(w.tasksApi.mutate.href({id:e}),t,J(e,e=>ee(U(),e,t)),e),get:async t=>{let i=await P(w.tasksApi.show.href({id:t}),r.token,n.signal,e=>y(e,U()));if(i.item.id!==t)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));return i.item},section:(e,t,i=n.signal)=>P(w.tasksApi.section.href({id:e,section:t}),r.token,AbortSignal.any([n.signal,i]),e=>_(e,U())),sync:async e=>{try{let t=await W(w.tasksApi.sync.href(),e,c);return await G(),t}catch(e){throw G(),e}}};function Y(){n.signal.aborted||n.update()}async function X(){N?.abort();let t=new AbortController;N=t,O=!0,M=``,Y();try{await o.refresh(AbortSignal.any([n.signal,t.signal]))}catch(r){!t.signal.aborted&&!n.signal.aborted&&(M=r instanceof Error?r.message:e(`app.client.projectTasks.couldNotLoadTasks`))}finally{N===t&&(O=!1,Y())}}async function Z(){if(F?.abort(),!f){x=null,A=!1,k=``,Y();return}let t=f,i=new AbortController;F=i;let a=x?.item.id!==t;a&&(x=null),A=!0,k=``,Y();try{let o=AbortSignal.any([n.signal,i.signal]);if(a){let e=await z(r.token,t,U(),o,n.props.conversationId);if(i.signal.aborted||t!==f)return;x=e.detail,T=e.discussion;return}let s=await P(w.tasksApi.show.href({id:t}),r.token,o,e=>y(e,U()));if(i.signal.aborted||t!==f)return;if(s.item.id!==t)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));x=s}catch(r){!i.signal.aborted&&!n.signal.aborted&&t===f&&(k=r instanceof Error?r.message:e(`app.client.projectTasks.couldNotLoadTask`))}finally{F===i&&(A=!1,Y())}}function Q(e,t=!0){e!==f&&(f=e,t&&$(!1),Z(),Y())}function $(e){let t=h(null);if(!n.props.active||!E(window.location.href)&&window.location.pathname!==t&&!window.location.pathname.startsWith(`${t}/`)){V=!0;return}V=!1;let r=h(f);window.location.pathname+window.location.search+window.location.hash!==r&&(B=new URL(r,window.location.origin).href,window.history[e?`replaceState`:`pushState`]({...window.history.state,budTask:f},``,r))}let ce=i((e,t)=>{H=!0;let r=f;f=g(n.props.href),x?.item.id!==f&&!(k&&r===f)&&Z(),n.props.initial.stored&&X(),t.addEventListener(`abort`,()=>{for(let e of u)e.unsubscribe();N?.abort(),F?.abort();for(let e of L)e.abort()},{once:!0})});return()=>{if(H&&R!==n.props.href){if(R=n.props.href,B!==R){V=!1;let e=g(R);e!==f&&n.queueTask(()=>Q(e,!1))}B=void 0}V&&n.props.active&&n.queueTask(()=>$(!0));let e=s,i=e?.snapshot.items.map(t=>({id:t.id,title:m(t,e.schema,`title`)||void 0}));return t(`div`,{class:`h-full min-h-0`,mix:ce,children:t(C,{projectName:r.name,project:{id:r.id,name:r.name},design:n.props.design,storageKey:`bud:tasks:${r.id}:v1`,snapshot:e?.snapshot??null,schema:e?.schema??null,loading:O,error:M,selectedId:f,detail:ae(x),discussion:x?t(re,{project:r,itemId:x.item.id,initial:T,items:i,conversationId:n.props.conversationId,onChange:G},x.item.id):void 0,detailLoading:A,detailError:k,operations:se,onSelect:Q,onReload:()=>{X()},onReloadDetail:()=>{Z()}})})}}var H=s({routes:p,load:({project:e,signal:t,url:n,conversation:r})=>B(e,t,n.href,r?.id),render:(e,{project:n,url:r,active:i,taskDesign:a,conversation:o})=>t(V,{project:n,initial:e,design:a,href:r.href,active:i,conversationId:o?.id})});export{H as default};
1
+ import{r as e}from"./i18n-CL0jBP7Y.js";import{t}from"./jsx-B4XNFIzB.js";import{t as n}from"./component-DWct-Tq6.js";import{n as r}from"./on-mixin-iWnqUzq5.js";import{n as i}from"./attrs-mixin-CmlG_FtV.js";import{c as a,l as o}from"./loader-Q6-HPKft.js";import{t as s}from"./screen-Dfvzj6n2.js";import{Cn as c,H as l,J as u,T as d,U as f,_t as p,bt as m,dt as h,ot as g,vn as _,xn as v,yn as y}from"./task-design-DJp5yho1.js";import{C as b,E as x,S,V as C,b as w,ct as T,dt as E,p as D,q as O,s as k,w as A,x as j}from"./project-threads-DeKXNqeP.js";import{a as ee,o as te,r as M,s as ne,t as N}from"./project-comments-Cdip2Y10.js";import{n as P,t as F}from"./tasks-request-CsUB5__X.js";import{t as I}from"./project-work-B7PGQtV9.js";import{n as L,t as R}from"./project-thread-links-BGIkGQeU.js";function re(s){let c=s.props.conversationId,d=c,p=!!c,m=!1,g=!1,_=[s.props.itemId],v=N({store:k(s.props.project),token:s.props.project.token,signal:s.signal,filter:{itemId:s.props.itemId},initial:s.props.initial,onChange(){s.signal.aborted||s.update()}});v.loaded&&(d??=v.snapshot.threads[0]?.id);let y=i(()=>{v.loaded||v.load().then(()=>{d??=v.snapshot.threads[0]?.id,s.signal.aborted||s.update()})});async function b(e){let t=await v.write(e);return await s.props.onChange?.(),t}function S(e){return{project:s.props.project,thread:e,items:s.props.items,canLink:v.snapshot.capabilities.link,busy:v.busy,onChange:async()=>{await v.load(),v.snapshot.threads.some(t=>t.id===e.id)&&await v.loadThread(e.id,!0),await s.props.onChange?.()}}}function C(n){return t(`div`,{class:`flex items-start justify-between gap-2`,children:[s.props.renderThreadLinks?s.props.renderThreadLinks(n):t(R,{part:n.anchor?`links`:void 0,...S(n)}),!n.anchor&&v.snapshot.capabilities.reply&&v.snapshot.threads.length>1?t(a,{variant:`ghost`,size:`small`,disabled:v.busy,"aria-pressed":!m&&d===n.id,mix:r(`click`,()=>{d=n.id,p=!0,m=!1,s.update()}),children:e(`app.client.taskDiscussion.reply`)}):null]})}function w(n){return t(O,{location:n.anchor?T(n):e(`app.client.taskDiscussion.discussion`),actions:s.props.renderThreadLinks?void 0:t(R,{part:`action`,...S(n)}),status:n.status,busy:v.busy,onStatusChange:v.snapshot.capabilities.status?e=>{b({id:n.id,status:e}).catch(()=>{})}:void 0})}return()=>{c!==s.props.conversationId&&(c=s.props.conversationId,p=!!c,c&&(d=c,m=!1));let{threads:i,capabilities:S}=v.snapshot,T=m?void 0:i.find(e=>e.id===d&&!e.anchor)??(p?void 0:i.find(e=>!e.anchor&&e.status!==`resolved`)??(S.create?void 0:i.find(e=>!e.anchor))),E=!m&&(p&&(!T||!S.reply)||!(!T||T.messagesLoaded));v.ready&&!v.busy&&!v.loading&&s.queueTask(()=>{p&&d&&v.loadThread(d);for(let e of v.snapshot.threads)!e.messagesLoaded&&(!e.anchor||e.id===d)&&v.loadThread(e.id)});let D=i.reduce((e,t)=>e+t.messageCount,0);return t(`section`,{class:`flex min-w-0 flex-col gap-3`,"aria-label":e(`app.client.taskDiscussion.taskDiscussion`),mix:y,children:[t(`div`,{class:`flex items-center gap-2`,children:[t(o,{as:`h3`,variant:`ui`,weight:`medium`,children:e(`app.client.taskDiscussion.discussion`)}),D?t(o,{variant:`ui-caption`,tone:`muted`,children:D}):null,v.ready&&S.create&&i.length?t(a,{variant:`ghost`,size:`small`,class:`ms-auto`,disabled:v.busy||m,mix:r(`click`,()=>{m=!0,s.update()}),children:e(`app.client.taskDiscussion.newDiscussion`)}):null]}),v.error?t(`div`,{class:`flex flex-col items-start gap-2`,children:[t(o,{variant:`ui-caption`,role:`alert`,children:v.error}),t(a,{variant:`secondary`,size:`small`,mix:r(`click`,()=>{v.load().then(()=>d?v.loadThread(d,!0):void 0)}),children:e(`app.client.taskDiscussion.reloadComments`)})]}):null,v.loaded?v.ready?t(n,{children:[i.length?i.map(e=>e.anchor?t(f,{id:e.id,expanded:d===e.id,heading:w(e),messages:e.messages,messageCount:e.messageCount,now:v.now,onExpand:()=>{d=e.id,p=!1,v.loadThread(e.id),s.update()},renderDetail:()=>t(l,{heading:w(e),messages:e.messages,messageCount:e.messageCount,messagesLoaded:e.messagesLoaded,messagesTruncated:e.messagesTruncated,now:v.now,busy:v.busy,links:C(e),onReply:S.reply?(t,n)=>b({id:e.id,body:t,parentId:n}):void 0})},e.id):t(x,{thread:e,links:C(e)},e.id)):t(o,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.noDiscussionYet`)}),S.create||S.reply&&(p||i.some(e=>!e.anchor))?t(`div`,{class:`flex min-w-0 flex-col gap-2`,children:[S.create&&(m||!p&&!i.length)?t(`div`,{class:`flex items-start justify-between gap-2`,"aria-label":e(`app.client.taskDiscussion.newDiscussionTasks`),children:[t(A,{itemIds:_,items:s.props.items??[],href:h,busy:v.busy,onEdit:S.link?()=>{g=!0,s.update()}:void 0}),m?t(a,{variant:`ghost`,size:`small`,disabled:v.busy,mix:r(`click`,()=>{m=!1,s.update()}),children:e(`app.client.taskDiscussion.cancel`)}):null]}):i.length>1?t(o,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.replyingTo`,{name:T?.messages[0]?.author.name??e(`app.client.taskDiscussion.theDiscussion`)})}):null,t(u,{label:e(`app.client.taskDiscussion.addTaskComment`),placeholder:e(`app.client.taskDiscussion.addContextPlaceholder`),busy:v.busy||E,class:`w-full`,onSubmit:async t=>{if(E)throw Error(e(`app.client.taskDiscussion.loadBeforeReplying`));T&&S.reply?await b({id:T.id,body:t}):(d=(await b({anchor:null,itemIds:_,body:t})).thread.id,p=!!d,m=!1,_=[s.props.itemId],s.update())}},`task-composer`)]}):null]}):t(o,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.commentsUnavailable`)}):t(o,{variant:`ui-caption`,tone:`muted`,role:`status`,children:e(`app.client.taskDiscussion.loadingDiscussion`)}),g?t(L,{project:s.props.project,selected:_,required:[s.props.itemId],onSave:async e=>{_=e,s.update()},onClose:()=>{g=!1,s.update()}}):null]})}}function ie(e,t){return e.revision===null?Object.entries(e.values).some(([e,n])=>JSON.stringify(n)!==JSON.stringify(t.values[e])):e.revision!==t.revision}async function z(t,n,r,i,a){let[o,s,c]=await Promise.all([P(w.tasksApi.show.href({id:n}),t,i,e=>e),M(t,n,i,a),r]),l=y(o,c);if(l.item.id!==n)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));return{detail:l,discussion:s}}async function B(t,n,r,i){let a=await k(t),o=D(a),s=o?Promise.resolve(o):I(t).refresh(n),c=r?g(r):null,l=e=>z(t.token,c,e,n,i),u=``,d=c?l(s.then(e=>e.schema)).catch(e=>{if(!o||e instanceof F)throw e;return l(I(t).refresh(n).then(e=>e.schema))}).catch(t=>(u=t instanceof Error?t.message:e(`app.client.projectTasks.couldNotLoadTask`),null)):null;try{await s;let e=await d;return{store:a,stored:!!o,error:``,task:e,taskError:u}}catch(t){return n.throwIfAborted(),{store:a,stored:!1,error:t instanceof Error?t.message:e(`app.client.projectTasks.couldNotLoadTasks`)}}}function V(n){let r=n.props.project,a=n.props.initial.store,o=I(r),s=D(a),l=()=>{let e=s?.snapshot.schemaVersion;s=D(a);let t=x?a.work.get(x.item.id):void 0;(t&&!t.$hasPendingWrites&&ie(j(t),x.item)||!x&&k&&s?.snapshot.schemaVersion!==e)&&Z(),Y()},u=[a.boards.subscribeChanges(l),a.work.subscribeChanges(l)],f=g(n.props.href),p=n.props.initial.task,x=p?.detail.item.id===f?p.detail:null,T=x?p.discussion:void 0,O=!1,k=n.props.initial.task?``:n.props.initial.taskError??``,A=f!==null&&!x&&!k,M=n.props.initial.error,N=null,F=null,L=new Set,R=n.props.href,B,V=!1,H=!1;function ae(e){let t=e?a.work.get(e.item.id):void 0;if(!e||!t?.$hasPendingWrites)return e;let n={...e.item.values,...j(t).values};return{...e,item:{...e.item,values:n}}}function U(){if(!s)throw Error(e(`app.client.projectTasks.refreshBeforeChanges`));return s.schema}async function W(e,t,i){let a=new AbortController;L.add(a);try{return await P(e,r.token,AbortSignal.any([n.signal,a.signal]),i,fetch,{body:t})}finally{L.delete(a)}}async function oe(e){await b(a.work,{upsert:[e]}),x?.item.id===e.id&&(x={...x,item:e}),Y()}async function G(){await X(),f&&await Z()}let K=new Map;async function q(t,r,i,a){let o=a?K.get(a):void 0,s=Promise.withResolvers();a&&K.set(a,s.promise);try{let n=await S(i,async()=>{let n=await o,i=`expectedRevision`in r?r.expectedRevision:void 0,c=await W(t,n&&i===n.from&&n.to?{...r,expectedRevision:n.to}:r,e=>v(e,U()));if(a&&c.item.id!==a)throw Error(e(`app.client.projectTasks.differentTaskRefreshRetry`));return await oe(c.item),s.resolve(i?{from:i,to:c.item.revision}:null),c.item});return f&&await Z(),n}catch(t){throw s.resolve(null),n.signal.aborted||d.error(e(`app.client.projectTasks.undidTaskChange`),{description:t instanceof Error?t.message:e(`app.client.projectTasks.writeNotConfirmed`)}),G(),t}finally{a&&K.get(a)===s.promise&&K.delete(a)}}function J(e,t){return()=>{let n=a.work.get(e);if(!n)return;let{values:r}=t(j(n));a.work.update(e,e=>{e.values=r})}}let se={create:e=>q(w.tasksApi.create.href(),e,()=>{a.work.insert(te(U(),`pending-${crypto.randomUUID()}`,e))}),update:(e,t)=>q(w.tasksApi.update.href({id:e}),t,J(e,e=>ne(e,t)),e),act:(e,t)=>q(w.tasksApi.mutate.href({id:e}),t,J(e,e=>ee(U(),e,t)),e),get:async t=>{let i=await P(w.tasksApi.show.href({id:t}),r.token,n.signal,e=>y(e,U()));if(i.item.id!==t)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));return i.item},section:(e,t,i=n.signal)=>P(w.tasksApi.section.href({id:e,section:t}),r.token,AbortSignal.any([n.signal,i]),e=>_(e,U())),sync:async e=>{try{let t=await W(w.tasksApi.sync.href(),e,c);return await G(),t}catch(e){throw G(),e}}};function Y(){n.signal.aborted||n.update()}async function X(){N?.abort();let t=new AbortController;N=t,O=!0,M=``,Y();try{await o.refresh(AbortSignal.any([n.signal,t.signal]))}catch(r){!t.signal.aborted&&!n.signal.aborted&&(M=r instanceof Error?r.message:e(`app.client.projectTasks.couldNotLoadTasks`))}finally{N===t&&(O=!1,Y())}}async function Z(){if(F?.abort(),!f){x=null,A=!1,k=``,Y();return}let t=f,i=new AbortController;F=i;let a=x?.item.id!==t;a&&(x=null),A=!0,k=``,Y();try{let o=AbortSignal.any([n.signal,i.signal]);if(a){let e=await z(r.token,t,U(),o,n.props.conversationId);if(i.signal.aborted||t!==f)return;x=e.detail,T=e.discussion;return}let s=await P(w.tasksApi.show.href({id:t}),r.token,o,e=>y(e,U()));if(i.signal.aborted||t!==f)return;if(s.item.id!==t)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));x=s}catch(r){!i.signal.aborted&&!n.signal.aborted&&t===f&&(k=r instanceof Error?r.message:e(`app.client.projectTasks.couldNotLoadTask`))}finally{F===i&&(A=!1,Y())}}function Q(e,t=!0){e!==f&&(f=e,t&&$(!1),Z(),Y())}function $(e){let t=h(null);if(!n.props.active||!E(window.location.href)&&window.location.pathname!==t&&!window.location.pathname.startsWith(`${t}/`)){V=!0;return}V=!1;let r=h(f);window.location.pathname+window.location.search+window.location.hash!==r&&(B=new URL(r,window.location.origin).href,window.history[e?`replaceState`:`pushState`]({...window.history.state,budTask:f},``,r))}let ce=i((e,t)=>{H=!0;let r=f;f=g(n.props.href),x?.item.id!==f&&!(k&&r===f)&&Z(),n.props.initial.stored&&X(),t.addEventListener(`abort`,()=>{for(let e of u)e.unsubscribe();N?.abort(),F?.abort();for(let e of L)e.abort()},{once:!0})});return()=>{if(H&&R!==n.props.href){if(R=n.props.href,B!==R){V=!1;let e=g(R);e!==f&&n.queueTask(()=>Q(e,!1))}B=void 0}V&&n.props.active&&n.queueTask(()=>$(!0));let e=s,i=e?.snapshot.items.map(t=>({id:t.id,title:m(t,e.schema,`title`)||void 0}));return t(`div`,{class:`h-full min-h-0`,mix:ce,children:t(C,{projectName:r.name,project:{id:r.id,name:r.name},design:n.props.design,storageKey:`bud:tasks:${r.id}:v1`,snapshot:e?.snapshot??null,schema:e?.schema??null,loading:O,error:M,selectedId:f,detail:ae(x),discussion:x?t(re,{project:r,itemId:x.item.id,initial:T,items:i,conversationId:n.props.conversationId,onChange:G},x.item.id):void 0,detailLoading:A,detailError:k,operations:se,onSelect:Q,onReload:()=>{X()},onReloadDetail:()=>{Z()}})})}}var H=s({routes:p,load:({project:e,signal:t,url:n,conversation:r})=>B(e,t,n.href,r?.id),render:(e,{project:n,url:r,active:i,taskDesign:a,conversation:o})=>t(V,{project:n,initial:e,design:a,href:r.href,active:i,conversationId:o?.id})});export{H as default};
@@ -1 +1 @@
1
- import{n as e}from"./i18n-BtfXum8P.js";import{Sn as t,bn as n,yt as r}from"./task-design-DYqcqq1b.js";import{b as i}from"./project-threads-CHGG-6fo.js";var a=r(),o=r();for(let[e,t]of Object.entries(i.tasksApi))(t.method===`GET`?a:o).add(t.pattern,e);function s(e,r){if(!e.startsWith(`/`)||e.startsWith(`//`)||e.length>7e3||/[\\#\u0000-\u0020]/.test(e))return!1;try{let i=(r?o:a).match(e,{baseURL:`http://bud.invalid`});if(!i||i.url.pathname!==e.split(`?`)[0])return!1;for(let[e,t]of Object.entries(i.params))(e===`id`||e===`section`)&&n({id:t});if(i.data!==`index`&&i.data!==`workspace`)return!i.url.search;let s={};for(let[e,t]of i.url.searchParams){if(![`search`,`status`,`limit`].includes(e)||Object.hasOwn(s,e))return!1;s[e]=e===`limit`?Number(t):t}return t(s),!0}catch{return!1}}async function c(t,n,r,i,a=fetch,o){if(!s(t,!!o))throw Error(e(`app.client.tasksRequest.invalidEndpoint`));r.throwIfAborted();let c=await a(t,{method:o?`POST`:`GET`,headers:{"X-Bud-Token":n,...o?{"Content-Type":`application/json`}:{}},...o?{body:JSON.stringify(o.body)}:{},credentials:`same-origin`,redirect:`error`,cache:`no-store`,signal:r}),u=c.body?.getReader();if(!u)throw Error(e(`app.client.tasksRequest.emptyResponse`));let d=[],f=0;try{for(;;){r.throwIfAborted();let t=await u.read();if(t.done)break;if(f+=t.value.byteLength,f>4194304)throw Error(e(`app.client.tasksRequest.responseTooLarge`));d.push(t.value)}}catch(e){throw await u.cancel().catch(()=>{}),e}finally{u.releaseLock()}let p=new Uint8Array(f),m=0;for(let e of d)p.set(e,m),m+=e.byteLength;let h;try{h=JSON.parse(new TextDecoder(`utf-8`,{fatal:!0}).decode(p))}catch{throw Error(e(`app.client.tasksRequest.invalidResponse`))}if(!c.ok){let t=h&&typeof h==`object`&&`error`in h&&typeof h.error==`string`?h.error.slice(0,1e3):e(`app.client.tasksRequest.loadFailed`),n=h&&typeof h==`object`&&`code`in h&&typeof h.code==`string`&&/^[a-z][a-z-]{0,63}$/.test(h.code)?h.code:`request`,r;if(h&&typeof h==`object`&&`currentRevision`in h){let t=h.currentRevision;if(t!==null&&(typeof t!=`string`||!t.trim()||t.length>256||t.includes(`\0`)))throw Error(e(`app.client.tasksRequest.invalidConflictResponse`));r=t}throw new l(t,n,r)}return i(h)}var l=class extends Error{code;currentRevision;constructor(e,t,n){super(e),this.name=`TaskRequestError`,this.code=t,this.currentRevision=n}};export{c as n,l as t};
1
+ import{r as e}from"./i18n-CL0jBP7Y.js";import{Sn as t,bn as n,yt as r}from"./task-design-DJp5yho1.js";import{b as i}from"./project-threads-DeKXNqeP.js";var a=r(),o=r();for(let[e,t]of Object.entries(i.tasksApi))(t.method===`GET`?a:o).add(t.pattern,e);function s(e,r){if(!e.startsWith(`/`)||e.startsWith(`//`)||e.length>7e3||/[\\#\u0000-\u0020]/.test(e))return!1;try{let i=(r?o:a).match(e,{baseURL:`http://bud.invalid`});if(!i||i.url.pathname!==e.split(`?`)[0])return!1;for(let[e,t]of Object.entries(i.params))(e===`id`||e===`section`)&&n({id:t});if(i.data!==`index`&&i.data!==`workspace`)return!i.url.search;let s={};for(let[e,t]of i.url.searchParams){if(![`search`,`status`,`limit`].includes(e)||Object.hasOwn(s,e))return!1;s[e]=e===`limit`?Number(t):t}return t(s),!0}catch{return!1}}async function c(t,n,r,i,a=fetch,o){if(!s(t,!!o))throw Error(e(`app.client.tasksRequest.invalidEndpoint`));r.throwIfAborted();let c=await a(t,{method:o?`POST`:`GET`,headers:{"X-Bud-Token":n,...o?{"Content-Type":`application/json`}:{}},...o?{body:JSON.stringify(o.body)}:{},credentials:`same-origin`,redirect:`error`,cache:`no-store`,signal:r}),u=c.body?.getReader();if(!u)throw Error(e(`app.client.tasksRequest.emptyResponse`));let d=[],f=0;try{for(;;){r.throwIfAborted();let t=await u.read();if(t.done)break;if(f+=t.value.byteLength,f>4194304)throw Error(e(`app.client.tasksRequest.responseTooLarge`));d.push(t.value)}}catch(e){throw await u.cancel().catch(()=>{}),e}finally{u.releaseLock()}let p=new Uint8Array(f),m=0;for(let e of d)p.set(e,m),m+=e.byteLength;let h;try{h=JSON.parse(new TextDecoder(`utf-8`,{fatal:!0}).decode(p))}catch{throw Error(e(`app.client.tasksRequest.invalidResponse`))}if(!c.ok){let t=h&&typeof h==`object`&&`error`in h&&typeof h.error==`string`?h.error.slice(0,1e3):e(`app.client.tasksRequest.loadFailed`),n=h&&typeof h==`object`&&`code`in h&&typeof h.code==`string`&&/^[a-z][a-z-]{0,63}$/.test(h.code)?h.code:`request`,r;if(h&&typeof h==`object`&&`currentRevision`in h){let t=h.currentRevision;if(t!==null&&(typeof t!=`string`||!t.trim()||t.length>256||t.includes(`\0`)))throw Error(e(`app.client.tasksRequest.invalidConflictResponse`));r=t}throw new l(t,n,r)}return i(h)}var l=class extends Error{code;currentRevision;constructor(e,t,n){super(e),this.name=`TaskRequestError`,this.code=t,this.currentRevision=n}};export{c as n,l as t};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pages-B-_CKvDS.js","assets/i18n-BtfXum8P.js","assets/jsx-B4XNFIzB.js","assets/component-DWct-Tq6.js","assets/on-mixin-iWnqUzq5.js","assets/children-N0l0v7XI.js","assets/attrs-mixin-CmlG_FtV.js","assets/create-element--E6NJ0nh.js","assets/loader-Q6-HPKft.js","assets/screen-Dfvzj6n2.js","assets/task-design-DYqcqq1b.js","assets/lru-BkhKJhvt.js","assets/method-DybmO5PB.js","assets/project-threads-CHGG-6fo.js","assets/frame-D6XmK4Df.js","assets/preload-helper-BLdHbfdN.js","assets/cloneFileDiffMetadata-CWfw01dG.js","assets/project-comments-CQkB2jbE.js","assets/workspace-tab-Bg2MFdMB.js","assets/project-branches-DzXdaT9L.js","assets/canvas-C8hyPWoT.js","assets/project-thread-links-BN7zL0AX.js","assets/tasks-request-DGigNdyK.js","assets/tasks-A2FKo3_h.js","assets/project-work-L5fYMSOu.js","assets/files-D_Tm7gCK.js"])))=>i.map(i=>d[i]);
2
- import{n as e}from"./i18n-BtfXum8P.js";import{t}from"./jsx-B4XNFIzB.js";import{n}from"./on-mixin-iWnqUzq5.js";import{n as r}from"./run-B2H4brp5.js";import{n as i}from"./attrs-mixin-CmlG_FtV.js";import{t as a}from"./preload-helper-BLdHbfdN.js";import{c as o,i as s,l as c,o as l,r as u,t as ee}from"./loader-Q6-HPKft.js";import{Et as d,Fn as f,Gn as p,Hn as m,In as h,Kn as g,Ln as _,Mn as v,Nn as y,Ot as b,Pn as x,Q as S,Un as C,Vn as w,jn as T,yt as E}from"./task-design-DYqcqq1b.js";import{$ as te,At as ne,Dt as re,J as D,Ot as O,Q as k,X as ie,Y as ae,Z as A,b as j,dt as M,et as N,jt as oe,kt as se,nt as ce,ot as P,rt as le,t as F,tt as ue,v as de,y as fe}from"./project-threads-CHGG-6fo.js";import{d as pe}from"./method-DybmO5PB.js";import{t as me}from"./project-work-L5fYMSOu.js";import{n as he}from"./workspace-tab-Bg2MFdMB.js";function ge(e){let n=`connecting`,r=i((t,r)=>{let{project:i}=e.props;me(i),F(i);let a=fe(i.token);n=a.status;let o=a.watchStatus(t=>{n=t,e.update()});r.addEventListener(`abort`,o,{once:!0}),e.update()});return()=>t(`span`,{class:`contents`,mix:r,children:t(O,{status:n})})}var I=new WeakMap;function L(e,t){let n=p(e,t,{abortEarly:!0});if(n.success)return n.value;let r=n.issues[0];throw I.get(r)??Error(r.message)}function R(e,t){return x((n,r)=>{let i=e[`~run`](n,r);return i.issues?_(t,r.path):i})}function z(e,t){return x((n,r)=>{let i=e[`~run`](n,r);if(i.issues)return i;let a=t(i.value);return a===void 0?i:_(a,r.path)})}function B(e,t){return x((n,r)=>{let i=e[`~run`](n,r);if(i.issues)return i;try{return{value:t(i.value)}}catch(e){if(!(e instanceof Error))throw e;let t=_(e.message,r.path);return I.set(t.issues[0],e),t}})}function _e(e){return x((t,n)=>e(t)[`~run`](t,n))}function V(e,t){return x((n,r)=>n==null?{value:t()}:e[`~run`](n,r))}function H(e,t){let n=m(t);return x((r,i)=>{if(!r||typeof r!=`object`||Array.isArray(r))return _(`${e} must be an object.`,i.path);for(let n of Object.keys(r))if(!Object.hasOwn(t,n))return _(`${e}.${n} is not a supported setting.`,[...i.path,n]);return n[`~run`](r,i)})}function ve(e,t,n=0){let r=v(e);return x((e,i)=>!Array.isArray(e)||e.length<n?_(t,i.path):r[`~run`](e,i))}var ye=f(H(`files`,{edit:V(R(y(),`files.edit must be true or false.`),()=>!0)}),()=>({edit:!0})),U=`flows must be [{ id, title, start, script, steps: [{ id, title }], block? }] with short ids, local paths and unique steps.`,be=e=>typeof e==`string`&&/^[a-z0-9][a-z0-9-]{0,62}$/.test(e),W=e=>typeof e==`string`&&e.trim()!==``&&e.length<=200;function xe(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let{id:t,title:n,start:r,script:i,steps:a,block:o=[]}=e;if(!be(t)||!W(n)||!W(i)||i.includes(`\0`)||typeof r!=`string`||!r.startsWith(`/`)||r.startsWith(`//`)||new URL(r,`http://bud.invalid`).origin!==`http://bud.invalid`||!Array.isArray(a)||!a.length||a.length>50)return null;let s=a.map(e=>{let{id:t,title:n}=e??{};return be(t)&&W(n)?{id:t,title:n.trim()}:null});if(s.some(e=>!e))return null;let c=s.map(e=>e.id);return new Set(c).size!==c.length||!Array.isArray(o)||o.some(e=>!W(e))?null:{id:t,title:n.trim(),start:r,script:i.trim(),steps:s,block:o}}var Se=x((e,t)=>{if(e===void 0)return{value:[]};if(!Array.isArray(e))return _(U,t.path);let n=e.map(xe);if(n.some(e=>!e))return _(U,t.path);let r=n.map(e=>e.id);return new Set(r).size===r.length?{value:n}:_(U,t.path)});function Ce(e,t){return{id:`${e.id}/${t.id}`,path:`${e.start.replace(/#.*$/,``)}#${e.id}-${t.id}`,title:t.title,group:e.title,flow:{id:e.id,step:t.id}}}var we=Object.freeze({".svg":`image/svg+xml`,".png":`image/png`,".webp":`image/webp`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".gif":`image/gif`,".ico":`image/x-icon`}),Te=`logo must be an image path inside the project (.svg, .png, .webp, .jpg, .gif or .ico), or { light, dark }.`;function Ee(e){if(typeof e!=`string`||e.length>1024||e.includes(`\0`))return null;let t=e.trim().replaceAll(`\\`,`/`);if(!t||t.startsWith(`/`)||/^[a-z]:/i.test(t)||t.split(`/`).includes(`..`))return null;let n=t.slice(t.lastIndexOf(`.`)).toLowerCase();return Object.hasOwn(we,n)?t:null}var De=x((e,t)=>{if(e===void 0)return{value:null};let n=Ee(typeof e==`object`&&e?e.light:e),r=typeof e==`object`&&e?e.dark:void 0,i=r===void 0?null:Ee(r),a=typeof e==`object`&&e?Object.keys(e):[];return n&&(r===void 0||i)&&a.every(e=>e===`light`||e===`dark`)?{value:{light:n,dark:i}}:_(Te,t.path)}),Oe=Object.freeze(`background.shell.main.canvas.panel.board.editor.editor-tabs.foreground.muted.primary.primary-hover.primary-foreground.border.tab-divider.hover.selected.control.control-active.control-selected.card.menu.menu-hover.card-frame.card-surface.card-border.card-frame-border.card-badge.overlay-shadow.tooltip.board-control.board-control-hover.board-card.control-elevation.board-elevation.board-card-elevation.card-elevation.board-card-lift.frame-control.modal-elevation.segment-elevation.control-open-elevation.board-segment.scrollbar.focus.scrollbar-hover.tooltip-border.tooltip-shadow`.split(`.`)),ke=`theme must be { light, dark }, each mapping Bud's tokens (${Oe.slice(0,3).join(`, `)}, …) to CSS colors or shadows.`;function Ae(e){if(typeof e!=`string`)return null;let t=e.trim();return!t||t.length>300||!/^[#a-zA-Z0-9(),.%\s/+-]+$/.test(t)||/url\s*\(/i.test(t)?null:t}function je(e){if(e===void 0)return{};if(!e||typeof e!=`object`||Array.isArray(e))return null;let t={};for(let[n,r]of Object.entries(e)){let e=Ae(r);if(!Oe.includes(n)||e===null)return null;t[n]=e}return Object.freeze(t)}var Me=x((e,t)=>{if(e===void 0)return{value:{light:{},dark:{}}};if(!e||typeof e!=`object`||Array.isArray(e))return _(ke,t.path);let{light:n,dark:r,...i}=e,a={light:je(n),dark:je(r)};return Object.keys(i).length||!a.light||!a.dark?_(ke,t.path):{value:{light:a.light,dark:a.dark}}}),G=`branches must be { main?, build?: { install?, build?, serve? } } with a branch name and nonempty shell commands.`;function Ne(e){return typeof e==`string`&&e.length<=255&&/^[A-Za-z0-9._/-]+$/.test(e)&&!e.startsWith(`-`)&&!e.startsWith(`/`)&&!e.endsWith(`/`)&&!e.endsWith(`.lock`)&&!e.includes(`..`)&&!e.includes(`//`)?e:null}function K(e){return typeof e==`string`&&e.trim()&&e.length<=4096&&!e.includes(`\0`)?e.trim():null}var Pe=x((e,t)=>{let n={main:null,install:null,build:null,serve:null};if(e===void 0)return{value:n};if(!e||typeof e!=`object`||Array.isArray(e))return _(G,t.path);let r=e,i=r.build??{};if(!i||typeof i!=`object`||Array.isArray(i)||Object.keys(r).some(e=>e!==`main`&&e!==`build`))return _(G,t.path);let a=i;if(Object.keys(a).some(e=>![`install`,`build`,`serve`].includes(e)))return _(G,t.path);let o={main:r.main===void 0?null:Ne(r.main),install:a.install===void 0?null:K(a.install),build:a.build===void 0?null:K(a.build),serve:a.serve===void 0?null:K(a.serve)};return r.main!==void 0&&!o.main||[`install`,`build`,`serve`].some(e=>a[e]!==void 0&&!o[e])?_(G,t.path):{value:o}});function q(e,t,n){let r=t?/\.server\.ts$/:/\.(?:ts|tsx|js|jsx)$/;return R(g().refine(e=>e.length<=1024&&e.startsWith(`./`)&&!/[\u0000-\u001f\u007f\\?#%]/.test(e)&&r.test(e)&&(t||!/\.server\.[cm]?[jt]sx?$/.test(e))&&!e.slice(2).split(`/`).some(e=>!e||e===`.`||e===`..`||e===`node_modules`)),n??(t?`${e} must be a built-in adapter or a ./ module ending in .server.ts inside the project.`:`${e} must be bud:beads or a ./ browser module ending in .ts, .tsx, .js or .jsx inside the project.`))}var Fe=h([!1,`bud:beads`,`bud:memory`,`bud:git-comments`]);function Ie(e){let t=q(`storage.${e}`,!0);return f(z(_e(e=>e===!1||e===`bud:beads`||e===`bud:memory`||e===`bud:git-comments`?Fe:t),t=>e===`work`&&t===`bud:git-comments`?`storage.work cannot use bud:git-comments; it only stores threads.`:void 0),`bud:beads`)}var Le=f(H(`storage`,{work:Ie(`work`),threads:Ie(`threads`)}),()=>({work:`bud:beads`,threads:`bud:beads`})),Re=f(H(`designs`,{tasks:f(_e(e=>e===`bud:beads`?h([`bud:beads`]):q(`designs.tasks`,!1)),`bud:beads`),pages:f(h([`path`,`title`]),`path`)}),()=>({tasks:`bud:beads`,pages:`path`})),ze=new Set([`bud:dom`,`bud:react`,`bud:react-grab`]),Be=q(`picker`,!1,`picker must be bud:dom, bud:react, bud:react-grab or a ./ browser module ending in .ts, .tsx, .js or .jsx inside the project.`),Ve=x((e,t)=>{if(e===void 0)return{value:{name:`bud:dom`,module:null}};if(typeof e==`string`&&ze.has(e))return{value:{name:e,module:null}};let n=Be[`~run`](e,t);return n.issues?n:{value:{name:n.value,module:n.value}}}),He=`ready must be a CSS selector, { selector } or { expression }.`,J=x((e,t)=>{let n=typeof e==`string`?{selector:e}:e;if(n&&typeof n==`object`&&!Array.isArray(n)){let e=Object.entries(n),[t,r]=e[0]??[];if(e.length===1&&(t===`selector`||t===`expression`)&&typeof r==`string`&&r.trim()&&r.length<=4096)return{value:t===`selector`?{selector:r.trim()}:{expression:r.trim()}}}return _(He,t.path)}),Ue=()=>[`light`,`dark`],We=()=>[{id:`desktop`,name:`Desktop`,width:1440,height:900,mobile:!1}],Y=`previews.viewports must list up to 4 { name, width, height?, mobile? } with distinct names, widths from 240 to 3840 and heights from 240 to 4000.`;function Ge(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,32)}var Ke=x((e,t)=>{if(!Array.isArray(e)||e.length===0||e.length>4)return _(Y,t.path);let n=[];for(let r of e){if(!r||typeof r!=`object`||Array.isArray(r))return _(Y,t.path);let{name:e,width:i,height:a,mobile:o,...s}=r,c=(e,t,n)=>typeof e==`number`&&Number.isInteger(e)&&e>=t&&e<=n;if(Object.keys(s).length||typeof e!=`string`||!e.trim()||e.length>40||!Ge(e)||!c(i,240,3840)||a!==void 0&&!c(a,240,4e3)||o!==void 0&&typeof o!=`boolean`)return _(Y,t.path);let l=o??i<800;n.push({id:Ge(e),name:e.trim(),width:i,height:a??(l?Math.round(i*844/390):900),mobile:l})}return new Set(n.map(e=>e.id)).size===n.length?{value:n}:_(Y,t.path)}),qe=f(H(`previews`,{scale:V(R(w().refine(e=>Number.isInteger(e)&&e>=1&&e<=3),`previews.scale must be 1, 2 or 3.`),()=>2),themes:V(R(v(h([`light`,`dark`])).refine(e=>e.length>0&&new Set(e).size===e.length),`previews.themes must list light, dark or both, once each.`),Ue),viewports:V(Ke,We),ready:V(J,()=>null),readyTimeout:V(R(w().refine(e=>Number.isInteger(e)&&e>=1e3&&e<=6e5),`previews.readyTimeout must be whole milliseconds from 1000 to 600000.`),()=>6e4),css:V(R(g().refine(e=>e.length<=2e4&&!e.includes(`<`)),`previews.css must be CSS text without <, up to 20000 characters.`),()=>``)}),()=>({scale:2,themes:Ue(),viewports:We(),ready:null,readyTimeout:6e4,css:``}));function Je(e,t){let n=[],r=new Set;function i(e,a){if(!e||typeof e!=`object`||Array.isArray(e)||r.has(e))throw Error(`Screen routes must be a Remix route map.`);r.add(e);for(let[r,o]of Object.entries(e)){let e=a?`${a}.${r}`:r;if(!o||typeof o!=`object`)throw Error(`Screen route ${e} must be a Remix route.`);if(!(`pattern`in o)){i(o,e);continue}if(![`GET`,`ANY`].includes(o.method)||typeof o.href!=`function`||typeof o.pattern?.source!=`string`)throw Error(`Screen route ${e} must be a GET route.`);let s=pe.parse(o.pattern.source),c=s.toJSON(),l=`/${c.pathname}`;if(c.protocol||c.hostname||c.port||c.pathname.split(`/`).some(e=>/^\.{1,2}$/.test(decodeURIComponent(e)))||l!==t&&!l.startsWith(`${t}/`)&&!l.startsWith(`${t}(/`))throw Error(`Screen route ${e} must stay under ${t}.`);n.push({name:e,pattern:s.source})}r.delete(e)}if(i(e,``),!n.length)throw Error(`Screen routes must contain at least one route.`);return n}function Ye(){return{id:`pages`,label:`Pages`,icon:`browser`,path:`/pages`,module:`bud:pages`}}function Xe(){return{id:`canvas`,label:`Canvas`,icon:`grid`,path:`/canvas`,module:`bud:canvas`}}function Ze(){return{id:`tasks`,label:`Tasks`,icon:`tasks`,path:`/tasks`,module:`bud:tasks`}}function Qe(){return{id:`files`,label:`Files`,icon:`files`,path:`/files`,module:`bud:files`}}var X=[Ye(),Xe(),Ze(),Qe()],$e=new Map(X.map(e=>[e.module,e])),et=[`/comments`,...X.map(e=>e.path),`/api`,`/health`,`/__bud`,`/assets`,`/app`,`/src`,`/node_modules`,`/agents`,`/brand`,`/fonts`,`/frameworks`,`/licenses`],tt=z(R(T().refine(e=>!!e&&typeof e==`object`),`Each screen must be an object.`),({id:e,label:t,icon:n=`layers`,module:r,path:i})=>{if(typeof e!=`string`||!/^[a-z][a-z0-9-]{0,31}$/.test(e))return`Screen ids are 1-32 lowercase letters, digits and hyphens.`;if(typeof t!=`string`||!t.trim())return`Screen ${e} needs a label.`;if(typeof n!=`string`||!n)return`Screen ${e} needs an icon name.`;if(typeof r!=`string`)return`Screen ${e} needs a module.`;let a=$e.get(r);if(i??=a?.path??`/${e}`,a)return e!==a.id||i!==a.path?`${r} keeps id "${a.id}" and path "${a.path}".`:void 0;if(!/^\.\/[^\0\\]+\.(?:ts|tsx|js|jsx)$/.test(r))return`Screen ${e} must be a ./ module ending in .ts, .tsx, .js or .jsx.`;if(typeof i!=`string`||!/^\/[a-z0-9][a-z0-9-]*$/.test(i))return`Screen ${e} needs one static path segment, such as /${e}.`;if(X.some(t=>t.id===e))return`Screen id "${e}" is reserved for a built-in screen.`;if(et.includes(i))return`Bud reserves the path ${i}.`}),nt=f(B(R(v(T()).refine(e=>e.length>0),`screens must list at least one screen.`),e=>{let t=new Set,n=new Set;return e.map(e=>{let r=L(tt,e),{id:i,label:a,icon:o=`layers`,module:s}=r,c=r.path??$e.get(s)?.path??`/${i}`;if(t.has(i)||n.has(c))throw Error(`Screen ids and paths must be unique.`);return t.add(i),n.add(c),r.routes!==void 0&&Je(r.routes,c),{id:i,label:a,icon:o,path:c,module:s,...r.routes===void 0?{}:{routes:r.routes}}})}),()=>X.map(e=>({...e}))),rt=e=>!!e&&typeof e==`object`;function Z(e,t){let n=m(t);return x((t,r)=>rt(t)?n[`~run`](Array.isArray(t)?{...t}:t,r):_(e,r.path))}var it=z(Z(`Bud config must export an object.`,{routes:R(v(T()).refine(e=>e.length>0),`bud.config must define at least one route.`),name:C(R(g().refine(e=>!!e.trim()),`name must be a nonempty string.`)),target:C(Z(`target must be an object.`,{origin:T(),port:T()})),comments:C(Z(`comments must be an object.`,{remote:T()})),port:T(),screens:T(),storage:T(),designs:T(),previews:T(),files:T(),logo:T(),theme:T(),locale:T(),picker:T(),branches:T(),flows:T()}),({target:e})=>{if(e?.port===0)return`target.port must be a listening port, not zero.`;if(e?.origin!==void 0&&(typeof e.origin!=`string`||!e.origin.trim()))return`target.origin must be an HTTP(S) origin.`}),at=z(T().transform(e=>typeof e==`string`?{path:e,title:e===`/`?`Home`:e}:e),e=>{if(!e||typeof e.path!=`string`||!e.path.startsWith(`/`)||e.path.startsWith(`//`))return`Canvas routes must be local paths beginning with a single /.`;if(new URL(e.path,`http://bud.invalid`).origin!==`http://bud.invalid`||e.path.includes(`\\`))return`Canvas routes must stay on the target origin.`;let t=e.id??Q(e.path);if(typeof t!=`string`||!t.trim())return`Canvas route IDs and paths must be unique.`;if(typeof e.title!=`string`||!e.title.trim())return`Each route needs a title.`;if(e.pattern!==void 0&&(typeof e.pattern!=`string`||!e.pattern.startsWith(`/`)))return`A route pattern must be a path beginning with /.`;if(e.group!==void 0&&(typeof e.group!=`string`||!e.group.trim()||e.group.length>120))return`A route group must be a short name.`;if(e.ready!==void 0&&e.ready!==!1&&!p(J,e.ready).success)return`A route ready must be false, a CSS selector, { selector } or { expression }.`}).transform(e=>{let t=Q(e.path);return{id:e.id??t,path:t,title:e.title,...e.pattern===void 0?{}:{pattern:e.pattern},...e.group===void 0?{}:{group:e.group.trim()},...e.ready===void 0?{}:{ready:e.ready===!1?null:L(J,e.ready)}}});function Q(e){let t=new URL(e,`http://bud.invalid`),n=t.searchParams.toString();return`${t.pathname}${n?`?${n}`:``}${t.hash}`}var ot=z(ve(at,`bud.config must define at least one route.`,1),e=>new Set(e.map(e=>e.id)).size!==e.length||new Set(e.map(e=>e.path)).size!==e.length?`Canvas route IDs and paths must be unique.`:void 0),st=e=>e===void 0||Number.isInteger(e)&&e>=0&&e<=65535,ct=e=>typeof e==`string`&&/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(e);B(z(B(z(z(B(z(B(it,e=>({...e,routes:L(ot,e.routes)})),({port:e,target:t})=>st(e??0)&&st(t?.port)?void 0:`Ports must be integers between 0 and 65535.`),({target:e,...t})=>{let n=e?.origin??(e?.port?`http://127.0.0.1:${e.port}`:void 0);return{...t,targetOrigin:n&&lt(n,`target.origin must be an HTTP(S) origin without a path or credentials.`)}}),({locale:e})=>e===void 0||e===`en`||e===`de`?void 0:`locale must be "en" or "de".`),({comments:e})=>ct(e?.remote??`origin`)?void 0:`comments.remote must be a Git remote name.`),e=>{let t=L(Se,e.flows),n=t.flatMap(e=>e.steps.map(t=>Ce(e,t))),r=e.routes.findIndex(e=>e.path===`/`)+1;return{...e,flows:t,routes:[...e.routes.slice(0,r),...n,...e.routes.slice(r)]}}),({routes:e})=>new Set(e.map(e=>e.id)).size!==e.length||new Set(e.map(e=>e.path)).size!==e.length?`A flow step must not reuse a route’s id or path.`:void 0),e=>({name:e.name??`Your project`,routes:e.routes,flows:e.flows,port:e.port??0,targetOrigin:e.targetOrigin,remote:e.comments?.remote??`origin`,screens:L(nt,e.screens),storage:L(Le,e.storage),designs:L(Re,e.designs),previews:L(qe,e.previews),files:L(ye,e.files),logo:L(De,e.logo),theme:L(Me,e.theme),locale:e.locale===void 0?`en`:e.locale,picker:L(Ve,e.picker),branches:L(Pe,e.branches)}));function lt(e,t){let n=new URL(e);if(![`http:`,`https:`].includes(n.protocol)||n.username||n.password||n.pathname!==`/`||n.search||n.hash)throw Error(t);return n.origin}function $(e,t){let n=E();for(let t of e)n.add(t.pattern,t.name);let r=n.match(t,{baseURL:`http://bud.invalid`});return r?{route:r.data,params:r.params}:null}function ut(e,t){let n=e?$(Je(e,t.path),t.url):{route:null,params:{}};if(!n)throw Error(`No screen route matches ${t.url.pathname}.`);return{...t,...n}}var dt={"bud:pages":()=>a(()=>import(`./pages-B-_CKvDS.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])),"bud:canvas":()=>a(()=>import(`./canvas-C8hyPWoT.js`),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,21,22])),"bud:tasks":()=>a(()=>import(`./tasks-A2FKo3_h.js`),__vite__mapDeps([23,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,22,24,21])),"bud:files":()=>a(()=>import(`./files-D_Tm7gCK.js`),__vite__mapDeps([25,11,1,2,6,4,3,5,7,15,8,9,10,12,16,13,14,17,21,22]))};function ft(e){return Object.hasOwn(dt,e)?dt[e]():a(()=>import(e),[])}async function pt(e,t,n=ft){let r=(await n(e)).default;if(typeof r?.render!=`function`)throw Error(`A screen module must export defineScreen({ render }) as its default.`);let i=await r.load?.(ut(r.routes,t));return t.signal.throwIfAborted(),{screen:r,data:i}}async function mt(e,t,n=e=>a(()=>import(e),[])){if(t.throwIfAborted(),!e)return;if(`error`in e)throw Error(e.error);let r=await n(e.url);return t.throwIfAborted(),S(r.default)}function ht(r){let a,d=``;async function f(){let{module:t,project:n,label:i}=r.props;a=void 0,d=``,r.update();let{location:o}=r.props,s={project:n,signal:r.signal,path:o.path,url:new URL(o.href,window.location.origin),active:r.props.active,conversation:o.conversation,route:null,params:{}};try{if(`error`in t)throw Error(t.error);s.taskDesign=await mt(r.props.taskDesign,r.signal),a={...await pt(t.url,s),context:s}}catch(t){if(r.signal.aborted)return;console.error(t),d=t instanceof Error&&t.message?t.message:e(`app.client.screenHost.couldNotOpen`,{label:i})}r.update()}let p=i(()=>{f()});return()=>{let{label:i,module:m,location:h}=r.props,g=a?.context,_=``;if(a&&g)try{if(h.routes&&!$(h.routes,h.href))throw Error(e(`app.client.screenHost.noRouteMatches`,{href:h.href}));g=ut(a.screen.routes,{...g,active:r.props.active,conversation:h.conversation,url:new URL(h.href,g.url.origin)})}catch(t){_=t instanceof Error?t.message:e(`app.client.screenHost.invalidRoute`)}return t(`div`,{class:`h-full min-h-0`,mix:p,children:_?t(`div`,{class:`p-3 md:p-4`,children:t(c,{role:`alert`,children:_})}):a&&g?a.screen.render(a.data,g):d?t(`div`,{class:`h-full overflow-y-auto p-3 md:p-4`,children:t(u,{class:`max-w-2xl`,role:`alert`,children:[t(l,{title:e(`app.client.screenHost.didntOpen`,{label:i}),subtitle:d}),t(s,{class:`flex-col items-start gap-3`,children:[t(c,{as:`p`,variant:`ui`,tone:`muted`,children:e(`app.client.screenHost.fixAndRetry`)}),t(o,{mix:n(`click`,()=>{`error`in m||r.props.taskDesign&&`error`in r.props.taskDesign?window.location.reload():f()}),children:e(`app.client.screenHost.retry`)})]})]})}):t(ee,{label:e(`app.client.screenHost.loading`,{label:i})})})}}async function gt(t,n,r,i,a=fetch){t=b(t);let o=await de(j.comments.get.href({id:t}),r,i,d,a);if(i.throwIfAborted(),o.id!==t)throw Error(e(`app.client.conversationRoute.anotherDiscussion`));let s=P(o),c=n.find(e=>e.module===s.module);if(!c)throw Error(e(`app.client.conversationRoute.enableOwningScreen`));if(c.routes&&!$(c.routes,s.href))throw Error(e(`app.client.conversationRoute.locationUnavailable`));return{active:c.id,module:{url:c.module},location:{path:c.path,href:s.href,...c.routes?{routes:c.routes}:{},conversation:{id:t,original:s.original}}}}function _t(a){let d=new Map,f=a.props,p=``,m=a.props.conversation,h,g=!!m,_=``,v=!1;function y(){a.signal.aborted||a.update()}async function b(t){if(m!==t)return;h?.abort();let n=new AbortController;h=n;let r=AbortSignal.any([a.signal,n.signal]);g=!0,_=``,y();try{let n=a.props.project;if(!n)throw Error(e(`app.client.workspace.connectProjectToOpenDiscussion`));let i=await gt(t,a.props.conversationTargets??[],n.token,r);!r.aborted&&m===t&&(f=i,x.set(i.active,window.location.pathname))}catch(t){r.aborted||(_=t instanceof Error?t.message:e(`app.client.workspace.couldNotOpenDiscussion`))}finally{h===n&&!r.aborted&&(g=!1,y())}}let x=new Map,S,C,w=()=>`bud:tabs:${a.props.project?.id}:v1`,T=()=>`${window.location.pathname}${window.location.search}${window.location.hash}`;function E(e){S=e,oe(w(),e);let t=a.props.project;t&&(document.cookie=`${ue(t.id)}=${ce(e)}; Path=/; Max-Age=31536000; SameSite=Strict`),y()}function O(){if(!S)return;let e=T();C===e?C=void 0:N(D(S))!==e&&E(le(S,e))}function P(e){let t=N(D(e));E(e),t!==T()&&(C=t,r(t,{history:`replace`,resetScroll:!1}))}function F(t){let{pathname:n}=new URL(t,`http://bud.local`);if(M(t))return{href:t,title:e(`app.client.workspace.discussion`),icon:`message`};let r=a.props.screens.map(e=>({item:e,root:new URL(e.href,`http://bud.local`).pathname})).filter(({root:e})=>e===`/`||n===e||n.startsWith(`${e}/`)).sort((e,t)=>t.root.length-e.root.length)[0],i=r?.item??a.props.screens[0];if(i.id===`pages`&&r&&n.startsWith(`${r.root}/`)){let e=n.slice(r.root.length);return{href:t,title:a.props.project?.routes.find(t=>t.path===e)?.title??e,icon:i.icon}}let o=(r&&r.root!==`/`?n.slice(r.root.length):n).split(`/`).filter(Boolean).at(-1);return{href:t,title:(o&&r?.root!==`/`?decodeURIComponent(o):void 0)??i.label,icon:i.icon}}let de=i((e,t)=>{v=!0,m&&b(m);function n(){let{pathname:e,search:t,hash:n}=window.location,r=`${e}${t}${n}`,i=M(r);if(i)return i!==m&&(m=i,b(i)),f.location.conversation?.id===i&&x.set(f.active,r),!0;let a=d.get(f.active);if(!a)return!1;let o=a.location.path;return e!==o&&(o===`/`||!e.startsWith(`${o}/`))?!1:(h?.abort(),m=void 0,g=!1,_=``,x.set(f.active,r),a.location={...a.location,href:r,conversation:void 0},f={...f,location:a.location},!0)}n(),a.props.project&&E(k(ne(w()),T(),crypto.randomUUID())),a.update(),window.addEventListener(`click`,e=>{if(!S||!(e.metaKey||e.ctrlKey)||e.shiftKey||e.button!==0)return;let t=e.target?.closest?.(`a[href]`);if(!(t instanceof HTMLAnchorElement)||t.target||t.hasAttribute(`download`))return;let n=new URL(t.href);n.origin!==window.location.origin||n.pathname.startsWith(`/api/`)||(e.preventDefault(),e.stopPropagation(),E(A(S,`${n.pathname}${n.search}${n.hash}`,crypto.randomUUID(),!1)))},{capture:!0,signal:t}),window.addEventListener(`popstate`,()=>{!n()&&!window.navigation?.currentEntry?.getState()&&r(window.location.href,{history:`replace`,resetScroll:!1}),window.navigation||O(),a.update()},{signal:t}),window.navigation?.addEventListener(`navigate`,n,{signal:t}),window.navigation?.addEventListener(`currententrychange`,()=>{n(),O(),a.update()},{signal:t}),window.navigation?.addEventListener(`navigatesuccess`,()=>{n(),a.update()},{signal:t})});return()=>{let{screens:i,project:y,taskDesign:w}=a.props,T=JSON.stringify([a.props.active,a.props.location.href,a.props.conversation]);if(p!==T){if(p=T,m=a.props.conversation,h?.abort(),_=``,g=!!m,m){let e=m;v&&a.queueTask(()=>{b(e)})}else f=a.props}let{active:E,module:ne,location:O}=f,k=i.find(e=>e.id===E)??i[0];y&&!g&&!_&&d.set(k.id,{module:ne,location:O,taskDesign:k.id===`tasks`?w:void 0});let M=S??a.props.initialTabs??(y?ie(O.href,`current`):void 0);M&&a.queueTask(()=>he(M.active));let oe=i.map(e=>e.id===k.id?e:{...e,href:x.get(e.id)??e.href});return t(se,{items:oe,activeId:k.id,title:k.label,canvas:!!y,logo:y?.logo?{light:j.logo.href({theme:`light`}),dark:y.logo.dark?j.logo.href({theme:`dark`}):void 0,label:y.name}:void 0,status:y?t(ge,{project:y}):void 0,tabs:y&&M?t(re,{tabs:M.tabs.map(e=>({id:e.id,...F(N(e))})),active:M.active,recent:D(M).recent.filter(e=>e!==N(D(M))).map(F),canBack:D(M).index>0,canForward:D(M).index<D(M).entries.length-1,onSelect:e=>P({...M,active:e}),onClose:e=>P(ae(M,e)),onBack:()=>P(te(M,-1)),onForward:()=>P(te(M,1)),onNew:()=>P(A(M,i[0]?.href??`/`,crypto.randomUUID(),!0)),onOpen:e=>{C=void 0,r(e)}}):void 0,children:y?t(`div`,{class:`h-full min-h-0`,mix:de,children:[g?t(ee,{label:e(`app.client.workspace.openingDiscussion`)}):_?t(`div`,{class:`p-3 md:p-4`,children:t(u,{class:`max-w-2xl`,role:`alert`,children:[t(l,{title:e(`app.client.workspace.discussionDidntOpen`),subtitle:_}),t(s,{children:t(o,{mix:n(`click`,()=>{m&&b(m)}),children:e(`app.client.workspace.retry`)})})]})}):null,[...d].map(([e,{module:n,taskDesign:r,location:a}])=>t(`div`,{class:`h-full min-h-0`,hidden:g||!!_||e!==k.id,children:t(ht,{label:i.find(t=>t.id===e)?.label??e,module:n,taskDesign:r,project:y,location:a,active:!g&&!_&&e===k.id})},`${e}:${y.token}`))]}):t(u,{class:`max-w-2xl`,children:[t(l,{title:e(`app.client.workspace.yourProjectSideBySide`),subtitle:e(`app.client.workspace.openBudBesideLocalProject`)}),t(s,{children:t(c,{as:`p`,variant:`ui`,children:e(`app.client.workspace.startProjectWithBudVitePlugin`)})})]})})}}export{_t as Workspace};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pages-BGl2Yuza.js","assets/i18n-CL0jBP7Y.js","assets/jsx-B4XNFIzB.js","assets/component-DWct-Tq6.js","assets/on-mixin-iWnqUzq5.js","assets/children-N0l0v7XI.js","assets/attrs-mixin-CmlG_FtV.js","assets/create-element--E6NJ0nh.js","assets/loader-Q6-HPKft.js","assets/screen-Dfvzj6n2.js","assets/task-design-DJp5yho1.js","assets/lru-BkhKJhvt.js","assets/method-DybmO5PB.js","assets/project-threads-DeKXNqeP.js","assets/frame-D6XmK4Df.js","assets/preload-helper-BLdHbfdN.js","assets/cloneFileDiffMetadata-CWfw01dG.js","assets/project-comments-Cdip2Y10.js","assets/workspace-tab-Bg2MFdMB.js","assets/project-branches-DwKjCwZv.js","assets/canvas-DIKX_HCJ.js","assets/project-thread-links-BGIkGQeU.js","assets/tasks-request-CsUB5__X.js","assets/tasks-BHXj727C.js","assets/project-work-B7PGQtV9.js","assets/files-BQ9O3Z8-.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./i18n-CL0jBP7Y.js";import{t}from"./jsx-B4XNFIzB.js";import{n}from"./on-mixin-iWnqUzq5.js";import{n as r}from"./run-B2H4brp5.js";import{n as i}from"./attrs-mixin-CmlG_FtV.js";import{t as a}from"./preload-helper-BLdHbfdN.js";import{c as o,i as s,l as c,o as l,r as u,t as ee}from"./loader-Q6-HPKft.js";import{Et as d,Fn as f,Gn as p,Hn as m,In as h,Kn as g,Ln as _,Mn as v,Nn as y,Ot as b,Pn as x,Q as S,Un as C,Vn as w,jn as T,yt as E}from"./task-design-DJp5yho1.js";import{$ as te,At as ne,Dt as re,J as D,Ot as O,Q as k,X as ie,Y as ae,Z as A,b as j,dt as M,et as N,jt as oe,kt as se,nt as ce,ot as P,rt as le,t as F,tt as ue,v as de,y as fe}from"./project-threads-DeKXNqeP.js";import{d as pe}from"./method-DybmO5PB.js";import{t as me}from"./project-work-B7PGQtV9.js";import{n as he}from"./workspace-tab-Bg2MFdMB.js";function ge(e){let n=`connecting`,r=i((t,r)=>{let{project:i}=e.props;me(i),F(i);let a=fe(i.token);n=a.status;let o=a.watchStatus(t=>{n=t,e.update()});r.addEventListener(`abort`,o,{once:!0}),e.update()});return()=>t(`span`,{class:`contents`,mix:r,children:t(O,{status:n})})}var I=new WeakMap;function L(e,t){let n=p(e,t,{abortEarly:!0});if(n.success)return n.value;let r=n.issues[0];throw I.get(r)??Error(r.message)}function R(e,t){return x((n,r)=>{let i=e[`~run`](n,r);return i.issues?_(t,r.path):i})}function z(e,t){return x((n,r)=>{let i=e[`~run`](n,r);if(i.issues)return i;let a=t(i.value);return a===void 0?i:_(a,r.path)})}function B(e,t){return x((n,r)=>{let i=e[`~run`](n,r);if(i.issues)return i;try{return{value:t(i.value)}}catch(e){if(!(e instanceof Error))throw e;let t=_(e.message,r.path);return I.set(t.issues[0],e),t}})}function _e(e){return x((t,n)=>e(t)[`~run`](t,n))}function V(e,t){return x((n,r)=>n==null?{value:t()}:e[`~run`](n,r))}function H(e,t){let n=m(t);return x((r,i)=>{if(!r||typeof r!=`object`||Array.isArray(r))return _(`${e} must be an object.`,i.path);for(let n of Object.keys(r))if(!Object.hasOwn(t,n))return _(`${e}.${n} is not a supported setting.`,[...i.path,n]);return n[`~run`](r,i)})}function ve(e,t,n=0){let r=v(e);return x((e,i)=>!Array.isArray(e)||e.length<n?_(t,i.path):r[`~run`](e,i))}var ye=f(H(`files`,{edit:V(R(y(),`files.edit must be true or false.`),()=>!0)}),()=>({edit:!0})),U=`flows must be [{ id, title, start, script, steps: [{ id, title }], block? }] with short ids, local paths and unique steps.`,be=e=>typeof e==`string`&&/^[a-z0-9][a-z0-9-]{0,62}$/.test(e),W=e=>typeof e==`string`&&e.trim()!==``&&e.length<=200;function xe(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let{id:t,title:n,start:r,script:i,steps:a,block:o=[]}=e;if(!be(t)||!W(n)||!W(i)||i.includes(`\0`)||typeof r!=`string`||!r.startsWith(`/`)||r.startsWith(`//`)||new URL(r,`http://bud.invalid`).origin!==`http://bud.invalid`||!Array.isArray(a)||!a.length||a.length>50)return null;let s=a.map(e=>{let{id:t,title:n}=e??{};return be(t)&&W(n)?{id:t,title:n.trim()}:null});if(s.some(e=>!e))return null;let c=s.map(e=>e.id);return new Set(c).size!==c.length||!Array.isArray(o)||o.some(e=>!W(e))?null:{id:t,title:n.trim(),start:r,script:i.trim(),steps:s,block:o}}var Se=x((e,t)=>{if(e===void 0)return{value:[]};if(!Array.isArray(e))return _(U,t.path);let n=e.map(xe);if(n.some(e=>!e))return _(U,t.path);let r=n.map(e=>e.id);return new Set(r).size===r.length?{value:n}:_(U,t.path)});function Ce(e,t){return{id:`${e.id}/${t.id}`,path:`${e.start.replace(/#.*$/,``)}#${e.id}-${t.id}`,title:t.title,group:e.title,flow:{id:e.id,step:t.id}}}var we=Object.freeze({".svg":`image/svg+xml`,".png":`image/png`,".webp":`image/webp`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".gif":`image/gif`,".ico":`image/x-icon`}),Te=`logo must be an image path inside the project (.svg, .png, .webp, .jpg, .gif or .ico), or { light, dark }.`;function Ee(e){if(typeof e!=`string`||e.length>1024||e.includes(`\0`))return null;let t=e.trim().replaceAll(`\\`,`/`);if(!t||t.startsWith(`/`)||/^[a-z]:/i.test(t)||t.split(`/`).includes(`..`))return null;let n=t.slice(t.lastIndexOf(`.`)).toLowerCase();return Object.hasOwn(we,n)?t:null}var De=x((e,t)=>{if(e===void 0)return{value:null};let n=Ee(typeof e==`object`&&e?e.light:e),r=typeof e==`object`&&e?e.dark:void 0,i=r===void 0?null:Ee(r),a=typeof e==`object`&&e?Object.keys(e):[];return n&&(r===void 0||i)&&a.every(e=>e===`light`||e===`dark`)?{value:{light:n,dark:i}}:_(Te,t.path)}),Oe=Object.freeze(`background.shell.main.canvas.panel.board.editor.editor-tabs.foreground.muted.primary.primary-hover.primary-foreground.border.tab-divider.hover.selected.control.control-active.control-selected.card.menu.menu-hover.card-frame.card-surface.card-border.card-frame-border.card-badge.overlay-shadow.tooltip.board-control.board-control-hover.board-card.control-elevation.board-elevation.board-card-elevation.card-elevation.board-card-lift.frame-control.modal-elevation.segment-elevation.control-open-elevation.board-segment.scrollbar.focus.scrollbar-hover.tooltip-border.tooltip-shadow`.split(`.`)),ke=`theme must be { light, dark }, each mapping Bud's tokens (${Oe.slice(0,3).join(`, `)}, …) to CSS colors or shadows.`;function Ae(e){if(typeof e!=`string`)return null;let t=e.trim();return!t||t.length>300||!/^[#a-zA-Z0-9(),.%\s/+-]+$/.test(t)||/url\s*\(/i.test(t)?null:t}function je(e){if(e===void 0)return{};if(!e||typeof e!=`object`||Array.isArray(e))return null;let t={};for(let[n,r]of Object.entries(e)){let e=Ae(r);if(!Oe.includes(n)||e===null)return null;t[n]=e}return Object.freeze(t)}var Me=x((e,t)=>{if(e===void 0)return{value:{light:{},dark:{}}};if(!e||typeof e!=`object`||Array.isArray(e))return _(ke,t.path);let{light:n,dark:r,...i}=e,a={light:je(n),dark:je(r)};return Object.keys(i).length||!a.light||!a.dark?_(ke,t.path):{value:{light:a.light,dark:a.dark}}}),G=`branches must be { main?, build?: { install?, build?, serve? } } with a branch name and nonempty shell commands.`;function Ne(e){return typeof e==`string`&&e.length<=255&&/^[A-Za-z0-9._/-]+$/.test(e)&&!e.startsWith(`-`)&&!e.startsWith(`/`)&&!e.endsWith(`/`)&&!e.endsWith(`.lock`)&&!e.includes(`..`)&&!e.includes(`//`)?e:null}function K(e){return typeof e==`string`&&e.trim()&&e.length<=4096&&!e.includes(`\0`)?e.trim():null}var Pe=x((e,t)=>{let n={main:null,install:null,build:null,serve:null};if(e===void 0)return{value:n};if(!e||typeof e!=`object`||Array.isArray(e))return _(G,t.path);let r=e,i=r.build??{};if(!i||typeof i!=`object`||Array.isArray(i)||Object.keys(r).some(e=>e!==`main`&&e!==`build`))return _(G,t.path);let a=i;if(Object.keys(a).some(e=>![`install`,`build`,`serve`].includes(e)))return _(G,t.path);let o={main:r.main===void 0?null:Ne(r.main),install:a.install===void 0?null:K(a.install),build:a.build===void 0?null:K(a.build),serve:a.serve===void 0?null:K(a.serve)};return r.main!==void 0&&!o.main||[`install`,`build`,`serve`].some(e=>a[e]!==void 0&&!o[e])?_(G,t.path):{value:o}});function q(e,t,n){let r=t?/\.server\.ts$/:/\.(?:ts|tsx|js|jsx)$/;return R(g().refine(e=>e.length<=1024&&e.startsWith(`./`)&&!/[\u0000-\u001f\u007f\\?#%]/.test(e)&&r.test(e)&&(t||!/\.server\.[cm]?[jt]sx?$/.test(e))&&!e.slice(2).split(`/`).some(e=>!e||e===`.`||e===`..`||e===`node_modules`)),n??(t?`${e} must be a built-in adapter or a ./ module ending in .server.ts inside the project.`:`${e} must be bud:beads or a ./ browser module ending in .ts, .tsx, .js or .jsx inside the project.`))}var Fe=h([!1,`bud:beads`,`bud:memory`,`bud:git-comments`]);function Ie(e){let t=q(`storage.${e}`,!0);return f(z(_e(e=>e===!1||e===`bud:beads`||e===`bud:memory`||e===`bud:git-comments`?Fe:t),t=>e===`work`&&t===`bud:git-comments`?`storage.work cannot use bud:git-comments; it only stores threads.`:void 0),`bud:beads`)}var Le=f(H(`storage`,{work:Ie(`work`),threads:Ie(`threads`)}),()=>({work:`bud:beads`,threads:`bud:beads`})),Re=f(H(`designs`,{tasks:f(_e(e=>e===`bud:beads`?h([`bud:beads`]):q(`designs.tasks`,!1)),`bud:beads`),pages:f(h([`path`,`title`]),`path`)}),()=>({tasks:`bud:beads`,pages:`path`})),ze=new Set([`bud:dom`,`bud:react`,`bud:react-grab`]),Be=q(`picker`,!1,`picker must be bud:dom, bud:react, bud:react-grab or a ./ browser module ending in .ts, .tsx, .js or .jsx inside the project.`),Ve=x((e,t)=>{if(e===void 0)return{value:{name:`bud:dom`,module:null}};if(typeof e==`string`&&ze.has(e))return{value:{name:e,module:null}};let n=Be[`~run`](e,t);return n.issues?n:{value:{name:n.value,module:n.value}}}),He=`ready must be a CSS selector, { selector } or { expression }.`,J=x((e,t)=>{let n=typeof e==`string`?{selector:e}:e;if(n&&typeof n==`object`&&!Array.isArray(n)){let e=Object.entries(n),[t,r]=e[0]??[];if(e.length===1&&(t===`selector`||t===`expression`)&&typeof r==`string`&&r.trim()&&r.length<=4096)return{value:t===`selector`?{selector:r.trim()}:{expression:r.trim()}}}return _(He,t.path)}),Ue=()=>[`light`,`dark`],We=()=>[{id:`desktop`,name:`Desktop`,width:1440,height:900,mobile:!1}],Y=`previews.viewports must list up to 4 { name, width, height?, mobile? } with distinct names, widths from 240 to 3840 and heights from 240 to 4000.`;function Ge(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,32)}var Ke=x((e,t)=>{if(!Array.isArray(e)||e.length===0||e.length>4)return _(Y,t.path);let n=[];for(let r of e){if(!r||typeof r!=`object`||Array.isArray(r))return _(Y,t.path);let{name:e,width:i,height:a,mobile:o,...s}=r,c=(e,t,n)=>typeof e==`number`&&Number.isInteger(e)&&e>=t&&e<=n;if(Object.keys(s).length||typeof e!=`string`||!e.trim()||e.length>40||!Ge(e)||!c(i,240,3840)||a!==void 0&&!c(a,240,4e3)||o!==void 0&&typeof o!=`boolean`)return _(Y,t.path);let l=o??i<800;n.push({id:Ge(e),name:e.trim(),width:i,height:a??(l?Math.round(i*844/390):900),mobile:l})}return new Set(n.map(e=>e.id)).size===n.length?{value:n}:_(Y,t.path)}),qe=f(H(`previews`,{scale:V(R(w().refine(e=>Number.isInteger(e)&&e>=1&&e<=3),`previews.scale must be 1, 2 or 3.`),()=>2),themes:V(R(v(h([`light`,`dark`])).refine(e=>e.length>0&&new Set(e).size===e.length),`previews.themes must list light, dark or both, once each.`),Ue),viewports:V(Ke,We),ready:V(J,()=>null),readyTimeout:V(R(w().refine(e=>Number.isInteger(e)&&e>=1e3&&e<=6e5),`previews.readyTimeout must be whole milliseconds from 1000 to 600000.`),()=>6e4),css:V(R(g().refine(e=>e.length<=2e4&&!e.includes(`<`)),`previews.css must be CSS text without <, up to 20000 characters.`),()=>``)}),()=>({scale:2,themes:Ue(),viewports:We(),ready:null,readyTimeout:6e4,css:``}));function Je(e,t){let n=[],r=new Set;function i(e,a){if(!e||typeof e!=`object`||Array.isArray(e)||r.has(e))throw Error(`Screen routes must be a Remix route map.`);r.add(e);for(let[r,o]of Object.entries(e)){let e=a?`${a}.${r}`:r;if(!o||typeof o!=`object`)throw Error(`Screen route ${e} must be a Remix route.`);if(!(`pattern`in o)){i(o,e);continue}if(![`GET`,`ANY`].includes(o.method)||typeof o.href!=`function`||typeof o.pattern?.source!=`string`)throw Error(`Screen route ${e} must be a GET route.`);let s=pe.parse(o.pattern.source),c=s.toJSON(),l=`/${c.pathname}`;if(c.protocol||c.hostname||c.port||c.pathname.split(`/`).some(e=>/^\.{1,2}$/.test(decodeURIComponent(e)))||l!==t&&!l.startsWith(`${t}/`)&&!l.startsWith(`${t}(/`))throw Error(`Screen route ${e} must stay under ${t}.`);n.push({name:e,pattern:s.source})}r.delete(e)}if(i(e,``),!n.length)throw Error(`Screen routes must contain at least one route.`);return n}function Ye(){return{id:`pages`,label:`Pages`,icon:`browser`,path:`/pages`,module:`bud:pages`}}function Xe(){return{id:`canvas`,label:`Canvas`,icon:`grid`,path:`/canvas`,module:`bud:canvas`}}function Ze(){return{id:`tasks`,label:`Tasks`,icon:`tasks`,path:`/tasks`,module:`bud:tasks`}}function Qe(){return{id:`files`,label:`Files`,icon:`files`,path:`/files`,module:`bud:files`}}var X=[Ye(),Xe(),Ze(),Qe()],$e=new Map(X.map(e=>[e.module,e])),et=[`/comments`,...X.map(e=>e.path),`/api`,`/health`,`/__bud`,`/assets`,`/app`,`/src`,`/node_modules`,`/agents`,`/brand`,`/fonts`,`/frameworks`,`/licenses`],tt=z(R(T().refine(e=>!!e&&typeof e==`object`),`Each screen must be an object.`),({id:e,label:t,icon:n=`layers`,module:r,path:i})=>{if(typeof e!=`string`||!/^[a-z][a-z0-9-]{0,31}$/.test(e))return`Screen ids are 1-32 lowercase letters, digits and hyphens.`;if(typeof t!=`string`||!t.trim())return`Screen ${e} needs a label.`;if(typeof n!=`string`||!n)return`Screen ${e} needs an icon name.`;if(typeof r!=`string`)return`Screen ${e} needs a module.`;let a=$e.get(r);if(i??=a?.path??`/${e}`,a)return e!==a.id||i!==a.path?`${r} keeps id "${a.id}" and path "${a.path}".`:void 0;if(!/^\.\/[^\0\\]+\.(?:ts|tsx|js|jsx)$/.test(r))return`Screen ${e} must be a ./ module ending in .ts, .tsx, .js or .jsx.`;if(typeof i!=`string`||!/^\/[a-z0-9][a-z0-9-]*$/.test(i))return`Screen ${e} needs one static path segment, such as /${e}.`;if(X.some(t=>t.id===e))return`Screen id "${e}" is reserved for a built-in screen.`;if(et.includes(i))return`Bud reserves the path ${i}.`}),nt=f(B(R(v(T()).refine(e=>e.length>0),`screens must list at least one screen.`),e=>{let t=new Set,n=new Set;return e.map(e=>{let r=L(tt,e),{id:i,label:a,icon:o=`layers`,module:s}=r,c=r.path??$e.get(s)?.path??`/${i}`;if(t.has(i)||n.has(c))throw Error(`Screen ids and paths must be unique.`);return t.add(i),n.add(c),r.routes!==void 0&&Je(r.routes,c),{id:i,label:a,icon:o,path:c,module:s,...r.routes===void 0?{}:{routes:r.routes}}})}),()=>X.map(e=>({...e}))),rt=e=>!!e&&typeof e==`object`;function Z(e,t){let n=m(t);return x((t,r)=>rt(t)?n[`~run`](Array.isArray(t)?{...t}:t,r):_(e,r.path))}var it=z(Z(`Bud config must export an object.`,{routes:R(v(T()).refine(e=>e.length>0),`bud.config must define at least one route.`),name:C(R(g().refine(e=>!!e.trim()),`name must be a nonempty string.`)),target:C(Z(`target must be an object.`,{origin:T(),port:T()})),comments:C(Z(`comments must be an object.`,{remote:T()})),port:T(),screens:T(),storage:T(),designs:T(),previews:T(),files:T(),logo:T(),theme:T(),locale:T(),picker:T(),branches:T(),flows:T()}),({target:e})=>{if(e?.port===0)return`target.port must be a listening port, not zero.`;if(e?.origin!==void 0&&(typeof e.origin!=`string`||!e.origin.trim()))return`target.origin must be an HTTP(S) origin.`}),at=z(T().transform(e=>typeof e==`string`?{path:e,title:e===`/`?`Home`:e}:e),e=>{if(!e||typeof e.path!=`string`||!e.path.startsWith(`/`)||e.path.startsWith(`//`))return`Canvas routes must be local paths beginning with a single /.`;if(new URL(e.path,`http://bud.invalid`).origin!==`http://bud.invalid`||e.path.includes(`\\`))return`Canvas routes must stay on the target origin.`;let t=e.id??Q(e.path);if(typeof t!=`string`||!t.trim())return`Canvas route IDs and paths must be unique.`;if(typeof e.title!=`string`||!e.title.trim())return`Each route needs a title.`;if(e.pattern!==void 0&&(typeof e.pattern!=`string`||!e.pattern.startsWith(`/`)))return`A route pattern must be a path beginning with /.`;if(e.group!==void 0&&(typeof e.group!=`string`||!e.group.trim()||e.group.length>120))return`A route group must be a short name.`;if(e.ready!==void 0&&e.ready!==!1&&!p(J,e.ready).success)return`A route ready must be false, a CSS selector, { selector } or { expression }.`}).transform(e=>{let t=Q(e.path);return{id:e.id??t,path:t,title:e.title,...e.pattern===void 0?{}:{pattern:e.pattern},...e.group===void 0?{}:{group:e.group.trim()},...e.ready===void 0?{}:{ready:e.ready===!1?null:L(J,e.ready)}}});function Q(e){let t=new URL(e,`http://bud.invalid`),n=t.searchParams.toString();return`${t.pathname}${n?`?${n}`:``}${t.hash}`}var ot=z(ve(at,`bud.config must define at least one route.`,1),e=>new Set(e.map(e=>e.id)).size!==e.length||new Set(e.map(e=>e.path)).size!==e.length?`Canvas route IDs and paths must be unique.`:void 0),st=e=>e===void 0||Number.isInteger(e)&&e>=0&&e<=65535,ct=e=>typeof e==`string`&&/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(e);B(z(B(z(z(B(z(B(it,e=>({...e,routes:L(ot,e.routes)})),({port:e,target:t})=>st(e??0)&&st(t?.port)?void 0:`Ports must be integers between 0 and 65535.`),({target:e,...t})=>{let n=e?.origin??(e?.port?`http://127.0.0.1:${e.port}`:void 0);return{...t,targetOrigin:n&&lt(n,`target.origin must be an HTTP(S) origin without a path or credentials.`)}}),({locale:e})=>e===void 0||e===`en`||e===`de`?void 0:`locale must be "en" or "de".`),({comments:e})=>ct(e?.remote??`origin`)?void 0:`comments.remote must be a Git remote name.`),e=>{let t=L(Se,e.flows),n=t.flatMap(e=>e.steps.map(t=>Ce(e,t))),r=e.routes.findIndex(e=>e.path===`/`)+1;return{...e,flows:t,routes:[...e.routes.slice(0,r),...n,...e.routes.slice(r)]}}),({routes:e})=>new Set(e.map(e=>e.id)).size!==e.length||new Set(e.map(e=>e.path)).size!==e.length?`A flow step must not reuse a route’s id or path.`:void 0),e=>({name:e.name??`Your project`,routes:e.routes,flows:e.flows,port:e.port??0,targetOrigin:e.targetOrigin,remote:e.comments?.remote??`origin`,screens:L(nt,e.screens),storage:L(Le,e.storage),designs:L(Re,e.designs),previews:L(qe,e.previews),files:L(ye,e.files),logo:L(De,e.logo),theme:L(Me,e.theme),locale:e.locale===void 0?`en`:e.locale,picker:L(Ve,e.picker),branches:L(Pe,e.branches)}));function lt(e,t){let n=new URL(e);if(![`http:`,`https:`].includes(n.protocol)||n.username||n.password||n.pathname!==`/`||n.search||n.hash)throw Error(t);return n.origin}function $(e,t){let n=E();for(let t of e)n.add(t.pattern,t.name);let r=n.match(t,{baseURL:`http://bud.invalid`});return r?{route:r.data,params:r.params}:null}function ut(e,t){let n=e?$(Je(e,t.path),t.url):{route:null,params:{}};if(!n)throw Error(`No screen route matches ${t.url.pathname}.`);return{...t,...n}}var dt={"bud:pages":()=>a(()=>import(`./pages-BGl2Yuza.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])),"bud:canvas":()=>a(()=>import(`./canvas-DIKX_HCJ.js`),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,21,22])),"bud:tasks":()=>a(()=>import(`./tasks-BHXj727C.js`),__vite__mapDeps([23,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,22,24,21])),"bud:files":()=>a(()=>import(`./files-BQ9O3Z8-.js`),__vite__mapDeps([25,11,1,2,6,4,3,5,7,15,8,9,10,12,16,13,14,17,21,22]))};function ft(e){return Object.hasOwn(dt,e)?dt[e]():a(()=>import(e),[])}async function pt(e,t,n=ft){let r=(await n(e)).default;if(typeof r?.render!=`function`)throw Error(`A screen module must export defineScreen({ render }) as its default.`);let i=await r.load?.(ut(r.routes,t));return t.signal.throwIfAborted(),{screen:r,data:i}}async function mt(e,t,n=e=>a(()=>import(e),[])){if(t.throwIfAborted(),!e)return;if(`error`in e)throw Error(e.error);let r=await n(e.url);return t.throwIfAborted(),S(r.default)}function ht(r){let a,d=``;async function f(){let{module:t,project:n,label:i}=r.props;a=void 0,d=``,r.update();let{location:o}=r.props,s={project:n,signal:r.signal,path:o.path,url:new URL(o.href,window.location.origin),active:r.props.active,conversation:o.conversation,route:null,params:{}};try{if(`error`in t)throw Error(t.error);s.taskDesign=await mt(r.props.taskDesign,r.signal),a={...await pt(t.url,s),context:s}}catch(t){if(r.signal.aborted)return;console.error(t),d=t instanceof Error&&t.message?t.message:e(`app.client.screenHost.couldNotOpen`,{label:i})}r.update()}let p=i(()=>{f()});return()=>{let{label:i,module:m,location:h}=r.props,g=a?.context,_=``;if(a&&g)try{if(h.routes&&!$(h.routes,h.href))throw Error(e(`app.client.screenHost.noRouteMatches`,{href:h.href}));g=ut(a.screen.routes,{...g,active:r.props.active,conversation:h.conversation,url:new URL(h.href,g.url.origin)})}catch(t){_=t instanceof Error?t.message:e(`app.client.screenHost.invalidRoute`)}return t(`div`,{class:`h-full min-h-0`,mix:p,children:_?t(`div`,{class:`p-3 md:p-4`,children:t(c,{role:`alert`,children:_})}):a&&g?a.screen.render(a.data,g):d?t(`div`,{class:`h-full overflow-y-auto p-3 md:p-4`,children:t(u,{class:`max-w-2xl`,role:`alert`,children:[t(l,{title:e(`app.client.screenHost.didntOpen`,{label:i}),subtitle:d}),t(s,{class:`flex-col items-start gap-3`,children:[t(c,{as:`p`,variant:`ui`,tone:`muted`,children:e(`app.client.screenHost.fixAndRetry`)}),t(o,{mix:n(`click`,()=>{`error`in m||r.props.taskDesign&&`error`in r.props.taskDesign?window.location.reload():f()}),children:e(`app.client.screenHost.retry`)})]})]})}):t(ee,{label:e(`app.client.screenHost.loading`,{label:i})})})}}async function gt(t,n,r,i,a=fetch){t=b(t);let o=await de(j.comments.get.href({id:t}),r,i,d,a);if(i.throwIfAborted(),o.id!==t)throw Error(e(`app.client.conversationRoute.anotherDiscussion`));let s=P(o),c=n.find(e=>e.module===s.module);if(!c)throw Error(e(`app.client.conversationRoute.enableOwningScreen`));if(c.routes&&!$(c.routes,s.href))throw Error(e(`app.client.conversationRoute.locationUnavailable`));return{active:c.id,module:{url:c.module},location:{path:c.path,href:s.href,...c.routes?{routes:c.routes}:{},conversation:{id:t,original:s.original}}}}function _t(a){let d=new Map,f=a.props,p=``,m=a.props.conversation,h,g=!!m,_=``,v=!1;function y(){a.signal.aborted||a.update()}async function b(t){if(m!==t)return;h?.abort();let n=new AbortController;h=n;let r=AbortSignal.any([a.signal,n.signal]);g=!0,_=``,y();try{let n=a.props.project;if(!n)throw Error(e(`app.client.workspace.connectProjectToOpenDiscussion`));let i=await gt(t,a.props.conversationTargets??[],n.token,r);!r.aborted&&m===t&&(f=i,x.set(i.active,window.location.pathname))}catch(t){r.aborted||(_=t instanceof Error?t.message:e(`app.client.workspace.couldNotOpenDiscussion`))}finally{h===n&&!r.aborted&&(g=!1,y())}}let x=new Map,S,C,w=()=>`bud:tabs:${a.props.project?.id}:v1`,T=()=>`${window.location.pathname}${window.location.search}${window.location.hash}`;function E(e){S=e,oe(w(),e);let t=a.props.project;t&&(document.cookie=`${ue(t.id)}=${ce(e)}; Path=/; Max-Age=31536000; SameSite=Strict`),y()}function O(){if(!S)return;let e=T();C===e?C=void 0:N(D(S))!==e&&E(le(S,e))}function P(e){let t=N(D(e));E(e),t!==T()&&(C=t,r(t,{history:`replace`,resetScroll:!1}))}function F(t){let{pathname:n}=new URL(t,`http://bud.local`);if(M(t))return{href:t,title:e(`app.client.workspace.discussion`),icon:`message`};let r=a.props.screens.map(e=>({item:e,root:new URL(e.href,`http://bud.local`).pathname})).filter(({root:e})=>e===`/`||n===e||n.startsWith(`${e}/`)).sort((e,t)=>t.root.length-e.root.length)[0],i=r?.item??a.props.screens[0];if(i.id===`pages`&&r&&n.startsWith(`${r.root}/`)){let e=n.slice(r.root.length);return{href:t,title:a.props.project?.routes.find(t=>t.path===e)?.title??e,icon:i.icon}}let o=(r&&r.root!==`/`?n.slice(r.root.length):n).split(`/`).filter(Boolean).at(-1);return{href:t,title:(o&&r?.root!==`/`?decodeURIComponent(o):void 0)??i.label,icon:i.icon}}let de=i((e,t)=>{v=!0,m&&b(m);function n(){let{pathname:e,search:t,hash:n}=window.location,r=`${e}${t}${n}`,i=M(r);if(i)return i!==m&&(m=i,b(i)),f.location.conversation?.id===i&&x.set(f.active,r),!0;let a=d.get(f.active);if(!a)return!1;let o=a.location.path;return e!==o&&(o===`/`||!e.startsWith(`${o}/`))?!1:(h?.abort(),m=void 0,g=!1,_=``,x.set(f.active,r),a.location={...a.location,href:r,conversation:void 0},f={...f,location:a.location},!0)}n(),a.props.project&&E(k(ne(w()),T(),crypto.randomUUID())),a.update(),window.addEventListener(`click`,e=>{if(!S||!(e.metaKey||e.ctrlKey)||e.shiftKey||e.button!==0)return;let t=e.target?.closest?.(`a[href]`);if(!(t instanceof HTMLAnchorElement)||t.target||t.hasAttribute(`download`))return;let n=new URL(t.href);n.origin!==window.location.origin||n.pathname.startsWith(`/api/`)||(e.preventDefault(),e.stopPropagation(),E(A(S,`${n.pathname}${n.search}${n.hash}`,crypto.randomUUID(),!1)))},{capture:!0,signal:t}),window.addEventListener(`popstate`,()=>{!n()&&!window.navigation?.currentEntry?.getState()&&r(window.location.href,{history:`replace`,resetScroll:!1}),window.navigation||O(),a.update()},{signal:t}),window.navigation?.addEventListener(`navigate`,n,{signal:t}),window.navigation?.addEventListener(`currententrychange`,()=>{n(),O(),a.update()},{signal:t}),window.navigation?.addEventListener(`navigatesuccess`,()=>{n(),a.update()},{signal:t})});return()=>{let{screens:i,project:y,taskDesign:w}=a.props,T=JSON.stringify([a.props.active,a.props.location.href,a.props.conversation]);if(p!==T){if(p=T,m=a.props.conversation,h?.abort(),_=``,g=!!m,m){let e=m;v&&a.queueTask(()=>{b(e)})}else f=a.props}let{active:E,module:ne,location:O}=f,k=i.find(e=>e.id===E)??i[0];y&&!g&&!_&&d.set(k.id,{module:ne,location:O,taskDesign:k.id===`tasks`?w:void 0});let M=S??a.props.initialTabs??(y?ie(O.href,`current`):void 0);M&&a.queueTask(()=>he(M.active));let oe=i.map(e=>e.id===k.id?e:{...e,href:x.get(e.id)??e.href});return t(se,{items:oe,activeId:k.id,title:k.label,canvas:!!y,logo:y?.logo?{light:j.logo.href({theme:`light`}),dark:y.logo.dark?j.logo.href({theme:`dark`}):void 0,label:y.name}:void 0,status:y?t(ge,{project:y}):void 0,tabs:y&&M?t(re,{tabs:M.tabs.map(e=>({id:e.id,...F(N(e))})),active:M.active,recent:D(M).recent.filter(e=>e!==N(D(M))).map(F),canBack:D(M).index>0,canForward:D(M).index<D(M).entries.length-1,onSelect:e=>P({...M,active:e}),onClose:e=>P(ae(M,e)),onBack:()=>P(te(M,-1)),onForward:()=>P(te(M,1)),onNew:()=>P(A(M,i[0]?.href??`/`,crypto.randomUUID(),!0)),onOpen:e=>{C=void 0,r(e)}}):void 0,children:y?t(`div`,{class:`h-full min-h-0`,mix:de,children:[g?t(ee,{label:e(`app.client.workspace.openingDiscussion`)}):_?t(`div`,{class:`p-3 md:p-4`,children:t(u,{class:`max-w-2xl`,role:`alert`,children:[t(l,{title:e(`app.client.workspace.discussionDidntOpen`),subtitle:_}),t(s,{children:t(o,{mix:n(`click`,()=>{m&&b(m)}),children:e(`app.client.workspace.retry`)})})]})}):null,[...d].map(([e,{module:n,taskDesign:r,location:a}])=>t(`div`,{class:`h-full min-h-0`,hidden:g||!!_||e!==k.id,children:t(ht,{label:i.find(t=>t.id===e)?.label??e,module:n,taskDesign:r,project:y,location:a,active:!g&&!_&&e===k.id})},`${e}:${y.token}`))]}):t(u,{class:`max-w-2xl`,children:[t(l,{title:e(`app.client.workspace.yourProjectSideBySide`),subtitle:e(`app.client.workspace.openBudBesideLocalProject`)}),t(s,{children:t(c,{as:`p`,variant:`ui`,children:e(`app.client.workspace.startProjectWithBudVitePlugin`)})})]})})}}export{_t as Workspace};
@@ -33,8 +33,8 @@
33
33
  </script>
34
34
  <!--bud-import-map-->
35
35
  <title>bud.sh</title>
36
- <script data-rmx-preserve-dom type="module" crossorigin src="/assets/index-Dpxjiok1.js"></script>
37
- <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/i18n-BtfXum8P.js">
36
+ <script data-rmx-preserve-dom type="module" crossorigin src="/assets/index-COvyj5zV.js"></script>
37
+ <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/i18n-CL0jBP7Y.js">
38
38
  <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/component-DWct-Tq6.js">
39
39
  <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/jsx-B4XNFIzB.js">
40
40
  <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/children-N0l0v7XI.js">
@@ -1,7 +1,7 @@
1
- import { $t as Button, H as CanvasWorkspace, Ln as jsx, Nn as Fragment, U as captureCanvasPoint, Zt as Loader, _n as ref, bn as on, bt as conversationHref, en as ToolbarSeparator, et as BranchSidebar, gn as Icon, hn as Text, in as IconButton, l as projectStore, ln as readPreference, on as Tooltip, pn as t, rn as Select, t as commentsUnavailable, tn as WorkspaceLayout, un as writePreference } from "./comment-data-DsgJWq4n.js";
2
- import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-QmqmI2Aq.js";
3
- import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-BNloVosX.js";
4
- import { t as ProjectThreadLinks } from "./project-thread-links-BmY8HQXt.js";
1
+ import { $t as Button, H as CanvasWorkspace, Pn as Fragment, Rn as jsx, U as captureCanvasPoint, Zt as Loader, _n as Icon, bt as conversationHref, en as ToolbarSeparator, et as BranchSidebar, gn as Text, in as IconButton, l as projectStore, ln as readPreference, mn as t, on as Tooltip, rn as Select, t as commentsUnavailable, tn as WorkspaceLayout, un as writePreference, vn as ref, xn as on } from "./comment-data-C-rNCB1n.js";
2
+ import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-D4D9nh4V.js";
3
+ import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-BgrfdvtL.js";
4
+ import { t as ProjectThreadLinks } from "./project-thread-links-B7uzThL9.js";
5
5
  //#region app/client/preview-image.tsx
6
6
  var failedHeight = 760;
7
7
  var stopPan = on("pointerdown", (event) => event.stopPropagation());
@@ -49588,6 +49588,10 @@ var de = {
49588
49588
  text: "Dein Projekt nebeneinander.",
49589
49589
  source: "ae5c6a16"
49590
49590
  },
49591
+ "app.controller.discussion": {
49592
+ text: "Diskussion",
49593
+ source: "52a76f71"
49594
+ },
49591
49595
  "appShell.mainNavigation": {
49592
49596
  text: "Hauptnavigation",
49593
49597
  source: "c5a8374a"
@@ -50210,10 +50214,6 @@ var de = {
50210
50214
  text: "Eine Diskussion, gemeinsam für mehrere Aufgaben.",
50211
50215
  source: "f056484b"
50212
50216
  },
50213
- "counter.count": {
50214
- text: "Anzahl:",
50215
- source: "4dc7b9ea"
50216
- },
50217
50217
  "files.codeCommentAnnotation.moved": {
50218
50218
  text: "Verschoben",
50219
50219
  source: "82869bf0"
@@ -51692,6 +51692,10 @@ var de = {
51692
51692
  source: "756213ca"
51693
51693
  },
51694
51694
  "files.fileReviewPanel.selection": {
51695
+ text: "{path} · {start}–{end}",
51696
+ source: "976a3281"
51697
+ },
51698
+ "files.fileReviewPanel.selectionOnSide": {
51695
51699
  text: "{path} · {side} {start}–{end}",
51696
51700
  source: "6445c0da"
51697
51701
  },
@@ -51703,6 +51707,14 @@ var de = {
51703
51707
  text: "{path} · {side} {start}–{end} (Ende {endSide})",
51704
51708
  source: "4d409456"
51705
51709
  },
51710
+ "files.fileReviewPanel.sideNew": {
51711
+ text: "neu",
51712
+ source: "28999611"
51713
+ },
51714
+ "files.fileReviewPanel.sideOld": {
51715
+ text: "alt",
51716
+ source: "bd2b9bd6"
51717
+ },
51706
51718
  "files.fileReviewPanel.sourceFile": {
51707
51719
  text: "Quelldatei",
51708
51720
  source: "f52d16de"
@@ -52566,6 +52578,22 @@ var de = {
52566
52578
  text: "Neu laden",
52567
52579
  source: "1a43a2ac"
52568
52580
  },
52581
+ "screens.canvas": {
52582
+ text: "Leinwand",
52583
+ source: "b2585091"
52584
+ },
52585
+ "screens.files": {
52586
+ text: "Dateien",
52587
+ source: "e71d1b30"
52588
+ },
52589
+ "screens.pages": {
52590
+ text: "Seiten",
52591
+ source: "7decab7f"
52592
+ },
52593
+ "screens.tasks": {
52594
+ text: "Aufgaben",
52595
+ source: "399e986d"
52596
+ },
52569
52597
  "select.noMatches": {
52570
52598
  text: "Keine Treffer",
52571
52599
  source: "d29421ef"
@@ -52763,6 +52791,66 @@ var de = {
52763
52791
  text: "Hoch",
52764
52792
  source: "be0a061d"
52765
52793
  },
52794
+ "tasks.taskData.label.all": {
52795
+ text: "Alle",
52796
+ source: "75afe364"
52797
+ },
52798
+ "tasks.taskData.label.blocked": {
52799
+ text: "Blockiert",
52800
+ source: "e378ac53"
52801
+ },
52802
+ "tasks.taskData.label.bug": {
52803
+ text: "Fehler",
52804
+ source: "d8da8e15"
52805
+ },
52806
+ "tasks.taskData.label.chore": {
52807
+ text: "Routineaufgabe",
52808
+ source: "0f37a562"
52809
+ },
52810
+ "tasks.taskData.label.closed": {
52811
+ text: "Geschlossen",
52812
+ source: "3201cae5"
52813
+ },
52814
+ "tasks.taskData.label.decision": {
52815
+ text: "Entscheidung",
52816
+ source: "be93ff03"
52817
+ },
52818
+ "tasks.taskData.label.deferred": {
52819
+ text: "Zurückgestellt",
52820
+ source: "59a18aca"
52821
+ },
52822
+ "tasks.taskData.label.epic": {
52823
+ text: "Epic",
52824
+ source: "e75e9488"
52825
+ },
52826
+ "tasks.taskData.label.feature": {
52827
+ text: "Funktion",
52828
+ source: "fe9102dd"
52829
+ },
52830
+ "tasks.taskData.label.hooked": {
52831
+ text: "Verknüpft",
52832
+ source: "79750f9b"
52833
+ },
52834
+ "tasks.taskData.label.in_progress": {
52835
+ text: "In Bearbeitung",
52836
+ source: "2948b425"
52837
+ },
52838
+ "tasks.taskData.label.open": {
52839
+ text: "Offen",
52840
+ source: "538b10e9"
52841
+ },
52842
+ "tasks.taskData.label.pinned": {
52843
+ text: "Angeheftet",
52844
+ source: "6d0ba1af"
52845
+ },
52846
+ "tasks.taskData.label.ready": {
52847
+ text: "Bereit",
52848
+ source: "0bca3294"
52849
+ },
52850
+ "tasks.taskData.label.task": {
52851
+ text: "Aufgabe",
52852
+ source: "76ef3d8c"
52853
+ },
52766
52854
  "tasks.taskData.low": {
52767
52855
  text: "Niedrig",
52768
52856
  source: "b1dd9521"
@@ -53682,6 +53770,7 @@ var en = {
53682
53770
  "app.client.workspace.retry": "Retry",
53683
53771
  "app.client.workspace.startProjectWithBudVitePlugin": "Start your project with the Bud Vite plugin, or run Bud from its directory. Its screens appear here when the companion connects.",
53684
53772
  "app.client.workspace.yourProjectSideBySide": "Your project, side by side.",
53773
+ "app.controller.discussion": "Discussion",
53685
53774
  "appShell.mainNavigation": "Main navigation",
53686
53775
  "breadcrumb.navigationLabel": "Breadcrumb",
53687
53776
  "canvas.artboardCanvas.chooseCollectionPage": "Choose a {collection} page",
@@ -53860,7 +53949,6 @@ var en = {
53860
53949
  other: "{count} selected"
53861
53950
  },
53862
53951
  "comments.threadTaskLinks.sharedDiscussionSubtitle": "One discussion, shared across tasks.",
53863
- "counter.count": "Count:",
53864
53952
  "files.codeCommentAnnotation.moved": "Moved",
53865
53953
  "files.codeCommentAnnotation.openDiscussion": "Open code discussion: {body}",
53866
53954
  "files.editorCommands.addNextMatchingSelection": "Add next matching selection",
@@ -54273,9 +54361,12 @@ var en = {
54273
54361
  "files.fileReviewPanel.reviewUndo": "Review undo",
54274
54362
  "files.fileReviewPanel.searchContents": "Search contents",
54275
54363
  "files.fileReviewPanel.selectedFile": "Selected file",
54276
- "files.fileReviewPanel.selection": "{path} · {side} {start}–{end}",
54364
+ "files.fileReviewPanel.selection": "{path} · {start}–{end}",
54365
+ "files.fileReviewPanel.selectionOnSide": "{path} · {side} {start}–{end}",
54277
54366
  "files.fileReviewPanel.selectionStatus": " · {status}",
54278
54367
  "files.fileReviewPanel.selectionWithEndSide": "{path} · {side} {start}–{end} ({endSide} end)",
54368
+ "files.fileReviewPanel.sideNew": "new",
54369
+ "files.fileReviewPanel.sideOld": "old",
54279
54370
  "files.fileReviewPanel.sourceFile": "Source file",
54280
54371
  "files.fileReviewPanel.stageFile": "Stage file",
54281
54372
  "files.fileReviewPanel.stageSelectedLines": "Stage selected lines",
@@ -54512,6 +54603,10 @@ var en = {
54512
54603
  "pages.pagesWorkspace.pageList": "Page list",
54513
54604
  "pages.pagesWorkspace.pageStatus": "Page status",
54514
54605
  "pages.pagesWorkspace.reload": "Reload",
54606
+ "screens.canvas": "Canvas",
54607
+ "screens.files": "Files",
54608
+ "screens.pages": "Pages",
54609
+ "screens.tasks": "Tasks",
54515
54610
  "select.noMatches": "No matches",
54516
54611
  "select.optionsLabel": "{label} options",
54517
54612
  "select.searchLabel": "Search {label}",
@@ -54568,6 +54663,21 @@ var en = {
54568
54663
  "tasks.taskData.allTasks": "All tasks",
54569
54664
  "tasks.taskData.backlog": "Backlog",
54570
54665
  "tasks.taskData.high": "High",
54666
+ "tasks.taskData.label.all": "All",
54667
+ "tasks.taskData.label.blocked": "Blocked",
54668
+ "tasks.taskData.label.bug": "Bug",
54669
+ "tasks.taskData.label.chore": "Chore",
54670
+ "tasks.taskData.label.closed": "Closed",
54671
+ "tasks.taskData.label.decision": "Decision",
54672
+ "tasks.taskData.label.deferred": "Deferred",
54673
+ "tasks.taskData.label.epic": "Epic",
54674
+ "tasks.taskData.label.feature": "Feature",
54675
+ "tasks.taskData.label.hooked": "Hooked",
54676
+ "tasks.taskData.label.in_progress": "In progress",
54677
+ "tasks.taskData.label.open": "Open",
54678
+ "tasks.taskData.label.pinned": "Pinned",
54679
+ "tasks.taskData.label.ready": "Ready",
54680
+ "tasks.taskData.label.task": "Task",
54571
54681
  "tasks.taskData.low": "Low",
54572
54682
  "tasks.taskData.noEpic": "No epic",
54573
54683
  "tasks.taskData.noStatus": "No status",
@@ -54772,6 +54882,14 @@ function useLocaleSource(read) {
54772
54882
  source = read;
54773
54883
  }
54774
54884
  /**
54885
+ * Whether the English catalog has a message by this name, for text whose key is built from data.
54886
+ * @param key - A possible message key.
54887
+ * @returns Whether `t(key)` finds a message.
54888
+ */
54889
+ function hasMessage(key) {
54890
+ return Object.hasOwn(en, key);
54891
+ }
54892
+ /**
54775
54893
  * The language messages are shown in now.
54776
54894
  * @returns The request's locale on a server, or the page's.
54777
54895
  */
@@ -67380,6 +67498,8 @@ function parseTaskView(value) {
67380
67498
  * @returns The label.
67381
67499
  */
67382
67500
  function taskLabel(value) {
67501
+ let key = `tasks.taskData.label.${value}`;
67502
+ if (hasMessage(key)) return t$2(key);
67383
67503
  return value.replaceAll("_", " ").replaceAll("-", " ").replace(/^./, (letter) => letter.toUpperCase());
67384
67504
  }
67385
67505
  /**
@@ -99330,7 +99450,7 @@ function TaskWorkspace(handle) {
99330
99450
  start: /* @__PURE__ */ jsx(Fragment, { children: [
99331
99451
  /* @__PURE__ */ jsx("div", {
99332
99452
  class: "flex shrink-0 items-center gap-2 ps-2 pe-2",
99333
- children: [/* @__PURE__ */ jsx(Breadcrumb, { items: [{ label: "Tasks" }] }), snapshot?.connection.state === "ready" ? /* @__PURE__ */ jsx(Text$1, {
99453
+ children: [/* @__PURE__ */ jsx(Breadcrumb, { items: [{ label: t$2("screens.tasks") }] }), snapshot?.connection.state === "ready" ? /* @__PURE__ */ jsx(Text$1, {
99334
99454
  variant: "ui",
99335
99455
  tone: "muted",
99336
99456
  class: "truncate max-xl:hidden",
@@ -101720,6 +101840,9 @@ var codeStyle = {
101720
101840
  * the theme's colors on its shadow host in an earlier cascade layer than this CSS.
101721
101841
  */
101722
101842
  var editorSurfaceCSS = ":host{--diffs-dark-bg:var(--bud-editor);--diffs-light-bg:var(--bud-editor)}";
101843
+ function sideWord(side) {
101844
+ return side === "deletions" ? t$2("files.fileReviewPanel.sideOld") : t$2("files.fileReviewPanel.sideNew");
101845
+ }
101723
101846
  function formatSize(bytes) {
101724
101847
  return bytes < 1024 ? `${bytes} B` : bytes < 1048576 ? `${(bytes / 1024).toFixed(1)} KB` : `${(bytes / 1024 / 1024).toFixed(1)} MB`;
101725
101848
  }
@@ -102595,13 +102718,17 @@ function FileReviewPanel(handle) {
102595
102718
  title: selection ? selection.path : void 0,
102596
102719
  children: [selection ? selection.endSide && selection.endSide !== selection.side ? t$2("files.fileReviewPanel.selectionWithEndSide", {
102597
102720
  path: selection.path,
102598
- side: selection.side === "deletions" ? t$2("files.fileReviewPanel.old") : t$2("files.fileReviewPanel.new"),
102721
+ side: sideWord(selection.side),
102599
102722
  start: selection.start,
102600
102723
  end: selection.end,
102601
- endSide: selection.endSide === "deletions" ? t$2("files.fileReviewPanel.old") : t$2("files.fileReviewPanel.new")
102724
+ endSide: sideWord(selection.endSide)
102725
+ }) : selection.side ? t$2("files.fileReviewPanel.selectionOnSide", {
102726
+ path: selection.path,
102727
+ side: sideWord(selection.side),
102728
+ start: selection.start,
102729
+ end: selection.end
102602
102730
  }) : t$2("files.fileReviewPanel.selection", {
102603
102731
  path: selection.path,
102604
- side: selection.side === "deletions" ? t$2("files.fileReviewPanel.old") : t$2("files.fileReviewPanel.new"),
102605
102732
  start: selection.start,
102606
102733
  end: selection.end
102607
102734
  }) : status, selection && status ? t$2("files.fileReviewPanel.selectionStatus", { status }) : null]
@@ -106718,4 +106845,4 @@ function unavailableComments(message = commentsUnavailable) {
106718
106845
  };
106719
106846
  }
106720
106847
  //#endregion
106721
- export { FileSearchPanel as $, RESYNC as $n, parseReviewRepository as $r, Button as $t, parseEditorPreferences as A, parseWorkSchema as Ai, sanitizeUrlAttribute as An, hasResolvedThemes as Ar, defaultReviewView as At, TaskWorkspace as B, boolean$1 as Bi, equal$1 as Bn, areLanguagesAttached as Br, fileHref as Bt, ThreadTaskLinks as C, parseWorkSyncResult as Ci, resolveMixDescriptors as Cn, WorkerPoolTerminatedError as Cr, legacyConversationHref as Ct, ReviewActionDialog as D, parseMessage as Di, SELF_CLOSING_TAGS as Dn, isFilePlainText as Dr, taskHref as Dt, FileConflictPanel as E, valueByRole as Ei, FRAMEWORK_PROPS as En, markWorkerErrorReported as Er, selectedTask as Et, FileWorkspace as F, parseWork as Fi, createComponent as Fn, attachResolvedThemes as Fr, reviewComparison as Ft, mergeThreads as G, nullable as Gi, PREVIEW_TILE_HEIGHT as Gn, parseFileSaveRequest as Gr, fileRoutes as Gt, CanvasWorkspace as H, defaulted as Hi, RoutePattern as Hn, parseReviewActionPlan as Hr, readFileLocation as Ht, defaultFileDestination as I, record as Ii, createFrameHandle as In, themeResolver as Ir, reviewContextKey as It, conversationId as J, optional as Ji, parsePreviewCapture as Jn, parseMutationPlan as Jr, CommentThreadDetail as Jt, stableJson as K, number$2 as Ki, parsePreview as Kn, parseFileSaveResult as Kr, pageRoutes as Kt, fileActionIntent as L, strict$2 as Li, jsx as Ln, getThemes as Lr, reviewHref as Lt, FileMutationDialog as M, WorkValidationError as Mi, shouldStringifyBooleanAttribute as Mn, getSharedHighlighter as Mr, parseReviewSession as Mt, FileReviewPanel as N, identifier$1 as Ni, Fragment as Nn, prepareThemeResolution as Nr, readReviewLocation as Nt, FileEditorPanel as O, parseMessageAuthor as Oi, isAllowedHostPropName as On, renderFileWithHighlighter as Or, taskRole as Ot, codeThemes as P, nonempty as Pi, Frame as Pn, validateResolvedThemeName as Pr, rememberReviewPosition as Pt, text$4 as Q, parsePreviewViewport as Qn, parseReviewHistory as Qr, Spinner as Qt, mutationFileView as R, any as Ri, Route$1 as Rn, getResolvedOrResolveLanguage as Rr, closeFileTab as Rt, writeRows as S, parseWorkSync as Si, composeMixedProps as Sn, WorkerPoolTaskCanceledError as Sr, isCodeConversation as St, ItemDiscussion as T, parseWorkValue as Ti, isEntry as Tn, isHandledWorkerPoolError as Tr, readConversationLocation as Tt, captureCanvasPoint as U, enum_ as Ui, MAX_PREVIEW_HEIGHT as Un, parseReviewActionRecoveries as Ur, reconcileFileView as Ut, parseTaskDesign as V, createSchema as Vi, joinPatterns as Vn, ResolvedLanguages as Vr, parseFileView as Vt, CommentMergeError as W, fail as Wi, PREVIEW_THUMBNAIL_WIDTHS as Wn, parseReviewActionResult as Wr, rememberFile as Wt, parseCommentThread as X, parseSafe as Xi, parsePreviewId as Xn, parseRecoveries as Xr, CommentComposer as Xt, object as Y, parse$1 as Yi, parsePreviewHash as Yn, parseMutationResult as Yr, CommentThreadItem as Yt, revision as Z, string$2 as Zi, parsePreviewPins as Zn, parseReviewDiff as Zr, Loader as Zt, requestComments as _, parseWorkItem as _i, ref as _n, isDiffPlainText as _r, PagesWorkspace as _t, saveThreads as a, parseFileDocument as ai, LiveStatus as an, parseThreadCapabilities as ar, FieldCardHeader as at, plainRow as b, parseWorkQuery as bi, on as bn, areFilesEqual as br, conversationHref as bt, previewKey as c, MAX_CANVAS_Y as ci, toast as cn, parseThreadInput as cr, initialShellTabs as ct, saveWorkspace as d, parseSectionData as di, isLocale as dn, parseThreadSnapshot as dr, readTabsCookie as dt, parseReviewSnapshot as ei, ToolbarSeparator as en, parseLiveId as er, BranchSidebar as et, storeDocument as f, parseWorkActionInput as fi, locale as fn, parseThreadStatus as fr, stepShellTab as ft, CommentsRequestError as g, parseWorkDetail as gi, Icon$1 as gn, reviewConflictIdentity as gr, visitShellTab as gt, storedWorkspace as h, parseWorkCreate as hi, Text$1 as hn, parseFileUpdate as hr, tabsCookieValue as ht, saveThread as i, parseFileChange as ii, IconButton as in, parseThread as ir, FieldCardContent as it, FileRecoveryDialog as j, statusCategory as ji, serializeStyleObject as jn, areThemesEqual as jr, legacyFileHref as jt, defaultEditorPreferences as k, fieldByRole as ki, normalizeAttributeName as kn, areFileRenderOptionsEqual as kr, defaultReviewPosition as kt, projectStore as l, parseElementAnchor as li, readPreference as ln, parseThreadLinkInput as lr, openShellTab as lt, storedFiles as m, parseWorkConnection as mi, useLocaleSource as mn, createCodeAnchor as mr, tabsCookieName as mt, unavailableComments as n, parseFileSearchQuery as ni, ShellTabBar as nn, MAX_THREADS as nr, CommentThreadHeading as nt, threadMatches as o, parseFileIndex as oi, Tooltip as on, parseThreadFilter as or, activeTab as ot, storedDocument as p, parseWorkActivity as pi, t$2 as pn, parseThreadStatusInput as pr, tabHref as pt, parseCommentInput as q, object$1 as qi, parsePreviewBranch as qn, maxFileSaveBytes as qr, taskRoutes as qt, followThreads as r, parseFileSearchResult as ri, Select as rn, parseAnchor as rr, FieldCard as rt, applyFileUpdate as s, parseFilePath as si, AppShell as sn, parseThreadId as sr, closeShellTab as st, commentsUnavailable as t, parseReviewSource as ti, WorkspaceLayout as tn, parseWorkChange as tr, ConversationSidebar as tt, saveFiles as u, parseWorkWorkspace as ui, writePreference as un, parseThreadReplyInput as ur, parseShellTabs as ut, projectLive as v, parseWorkItemRef as vi, appendFlushMarker as vn, renderDiffWithHighlighter as vr, codeCommentCounts as vt, ThreadTaskPicker as w, parseWorkUpdate as wi, clientEntry as wn, WorkerPoolWorkerError as wr, locateCodeConversations as wt, writeOptimistically as x, parseWorkSnapshot as xi, normalizeUnsafeHTMLProps as xn, areDiffTargetsEqual as xr, conversationLabel as xt, routes as y, parseWorkMutationResult as yi, stripFlushMarkers as yn, areDiffRenderOptionsEqual as yr, conversationDestination as yt, remainingMutationIntent as z, array as zi, createMultiMatcher as zn, resolveLanguage as zr, defaultFileView as zt };
106848
+ export { FileSearchPanel as $, parsePreviewViewport as $n, parseReviewHistory as $r, Button as $t, parseEditorPreferences as A, fieldByRole as Ai, normalizeAttributeName as An, areFileRenderOptionsEqual as Ar, defaultReviewView as At, TaskWorkspace as B, array as Bi, createMultiMatcher as Bn, resolveLanguage as Br, fileHref as Bt, ThreadTaskLinks as C, parseWorkSync as Ci, composeMixedProps as Cn, WorkerPoolTaskCanceledError as Cr, legacyConversationHref as Ct, ReviewActionDialog as D, valueByRole as Di, FRAMEWORK_PROPS as Dn, markWorkerErrorReported as Dr, taskHref as Dt, FileConflictPanel as E, parseWorkValue as Ei, isEntry as En, isHandledWorkerPoolError as Er, selectedTask as Et, FileWorkspace as F, nonempty as Fi, Frame as Fn, validateResolvedThemeName as Fr, reviewComparison as Ft, mergeThreads as G, fail as Gi, PREVIEW_THUMBNAIL_WIDTHS as Gn, parseReviewActionResult as Gr, fileRoutes as Gt, CanvasWorkspace as H, createSchema as Hi, joinPatterns as Hn, ResolvedLanguages as Hr, readFileLocation as Ht, defaultFileDestination as I, parseWork as Ii, createComponent as In, attachResolvedThemes as Ir, reviewContextKey as It, conversationId as J, object$1 as Ji, parsePreviewBranch as Jn, maxFileSaveBytes as Jr, CommentThreadDetail as Jt, stableJson as K, nullable as Ki, PREVIEW_TILE_HEIGHT as Kn, parseFileSaveRequest as Kr, pageRoutes as Kt, fileActionIntent as L, record as Li, createFrameHandle as Ln, themeResolver as Lr, reviewHref as Lt, FileMutationDialog as M, statusCategory as Mi, serializeStyleObject as Mn, areThemesEqual as Mr, parseReviewSession as Mt, FileReviewPanel as N, WorkValidationError as Ni, shouldStringifyBooleanAttribute as Nn, getSharedHighlighter as Nr, readReviewLocation as Nt, FileEditorPanel as O, parseMessage as Oi, SELF_CLOSING_TAGS as On, isFilePlainText as Or, taskRole as Ot, codeThemes as P, identifier$1 as Pi, Fragment as Pn, prepareThemeResolution as Pr, rememberReviewPosition as Pt, text$4 as Q, string$2 as Qi, parsePreviewPins as Qn, parseReviewDiff as Qr, Spinner as Qt, mutationFileView as R, strict$2 as Ri, jsx as Rn, getThemes as Rr, closeFileTab as Rt, writeRows as S, parseWorkSnapshot as Si, normalizeUnsafeHTMLProps as Sn, areDiffTargetsEqual as Sr, isCodeConversation as St, ItemDiscussion as T, parseWorkUpdate as Ti, clientEntry as Tn, WorkerPoolWorkerError as Tr, readConversationLocation as Tt, captureCanvasPoint as U, defaulted as Ui, RoutePattern as Un, parseReviewActionPlan as Ur, reconcileFileView as Ut, parseTaskDesign as V, boolean$1 as Vi, equal$1 as Vn, areLanguagesAttached as Vr, parseFileView as Vt, CommentMergeError as W, enum_ as Wi, MAX_PREVIEW_HEIGHT as Wn, parseReviewActionRecoveries as Wr, rememberFile as Wt, parseCommentThread as X, parse$1 as Xi, parsePreviewHash as Xn, parseMutationResult as Xr, CommentComposer as Xt, object as Y, optional as Yi, parsePreviewCapture as Yn, parseMutationPlan as Yr, CommentThreadItem as Yt, revision as Z, parseSafe as Zi, parsePreviewId as Zn, parseRecoveries as Zr, Loader as Zt, requestComments as _, parseWorkDetail as _i, Icon$1 as _n, reviewConflictIdentity as _r, PagesWorkspace as _t, saveThreads as a, parseFileChange as ai, LiveStatus as an, parseThread as ar, FieldCardHeader as at, plainRow as b, parseWorkMutationResult as bi, stripFlushMarkers as bn, areDiffRenderOptionsEqual as br, conversationHref as bt, previewKey as c, parseFilePath as ci, toast as cn, parseThreadId as cr, initialShellTabs as ct, saveWorkspace as d, parseWorkWorkspace as di, hasMessage as dn, parseThreadReplyInput as dr, readTabsCookie as dt, parseReviewRepository as ei, ToolbarSeparator as en, RESYNC as er, BranchSidebar as et, storeDocument as f, parseSectionData as fi, isLocale as fn, parseThreadSnapshot as fr, stepShellTab as ft, CommentsRequestError as g, parseWorkCreate as gi, Text$1 as gn, parseFileUpdate as gr, visitShellTab as gt, storedWorkspace as h, parseWorkConnection as hi, useLocaleSource as hn, createCodeAnchor as hr, tabsCookieValue as ht, saveThread as i, parseFileSearchResult as ii, IconButton as in, parseAnchor as ir, FieldCardContent as it, FileRecoveryDialog as j, parseWorkSchema as ji, sanitizeUrlAttribute as jn, hasResolvedThemes as jr, legacyFileHref as jt, defaultEditorPreferences as k, parseMessageAuthor as ki, isAllowedHostPropName as kn, renderFileWithHighlighter as kr, defaultReviewPosition as kt, projectStore as l, MAX_CANVAS_Y as li, readPreference as ln, parseThreadInput as lr, openShellTab as lt, storedFiles as m, parseWorkActivity as mi, t$2 as mn, parseThreadStatusInput as mr, tabsCookieName as mt, unavailableComments as n, parseReviewSource as ni, ShellTabBar as nn, parseWorkChange as nr, CommentThreadHeading as nt, threadMatches as o, parseFileDocument as oi, Tooltip as on, parseThreadCapabilities as or, activeTab as ot, storedDocument as p, parseWorkActionInput as pi, locale as pn, parseThreadStatus as pr, tabHref as pt, parseCommentInput as q, number$2 as qi, parsePreview as qn, parseFileSaveResult as qr, taskRoutes as qt, followThreads as r, parseFileSearchQuery as ri, Select as rn, MAX_THREADS as rr, FieldCard as rt, applyFileUpdate as s, parseFileIndex as si, AppShell as sn, parseThreadFilter as sr, closeShellTab as st, commentsUnavailable as t, parseReviewSnapshot as ti, WorkspaceLayout as tn, parseLiveId as tr, ConversationSidebar as tt, saveFiles as u, parseElementAnchor as ui, writePreference as un, parseThreadLinkInput as ur, parseShellTabs as ut, projectLive as v, parseWorkItem as vi, ref as vn, isDiffPlainText as vr, codeCommentCounts as vt, ThreadTaskPicker as w, parseWorkSyncResult as wi, resolveMixDescriptors as wn, WorkerPoolTerminatedError as wr, locateCodeConversations as wt, writeOptimistically as x, parseWorkQuery as xi, on as xn, areFilesEqual as xr, conversationLabel as xt, routes as y, parseWorkItemRef as yi, appendFlushMarker as yn, renderDiffWithHighlighter as yr, conversationDestination as yt, remainingMutationIntent as z, any as zi, Route$1 as zn, getResolvedOrResolveLanguage as zr, defaultFileView as zt };
@@ -1,9 +1,9 @@
1
1
  import { i as __toESM } from "./rolldown-runtime-DktXgydw.js";
2
- import { $ as FileSearchPanel, $r as parseReviewRepository, A as parseEditorPreferences, Ar as hasResolvedThemes, At as defaultReviewView, Br as areLanguagesAttached, Bt as fileHref, Cr as WorkerPoolTerminatedError, D as ReviewActionDialog, Dr as isFilePlainText, E as FileConflictPanel, Er as markWorkerErrorReported, F as FileWorkspace, Fr as attachResolvedThemes, Ft as reviewComparison, Gr as parseFileSaveRequest, Gt as fileRoutes, Hr as parseReviewActionPlan, Ht as readFileLocation, I as defaultFileDestination, Ir as themeResolver, It as reviewContextKey, Jr as parseMutationPlan, Kr as parseFileSaveResult, L as fileActionIntent, Ln as jsx, Lr as getThemes, Lt as reviewHref, M as FileMutationDialog, Mr as getSharedHighlighter, Mt as parseReviewSession, N as FileReviewPanel, Nr as prepareThemeResolution, Nt as readReviewLocation, O as FileEditorPanel, Or as renderFileWithHighlighter, P as codeThemes, Pr as validateResolvedThemeName, Pt as rememberReviewPosition, Qr as parseReviewHistory, R as mutationFileView, Rr as getResolvedOrResolveLanguage, Rt as closeFileTab, Sr as WorkerPoolTaskCanceledError, St as isCodeConversation, Tr as isHandledWorkerPoolError, Tt as readConversationLocation, Ur as parseReviewActionRecoveries, Ut as reconcileFileView, Vr as ResolvedLanguages, Vt as parseFileView, Wr as parseReviewActionResult, Wt as rememberFile, Xr as parseRecoveries, Yr as parseMutationResult, Zr as parseReviewDiff, _n as ref, _r as isDiffPlainText, ai as parseFileDocument, br as areFilesEqual, bt as conversationHref, cn as toast, ei as parseReviewSnapshot, f as storeDocument, gr as reviewConflictIdentity, hn as Text, hr as parseFileUpdate, ii as parseFileChange, j as FileRecoveryDialog, jr as areThemesEqual, k as defaultEditorPreferences, kr as areFileRenderOptionsEqual, kt as defaultReviewPosition, l as projectStore, ln as readPreference, m as storedFiles, mr as createCodeAnchor, ni as parseFileSearchQuery, oi as parseFileIndex, p as storedDocument, pn as t, qr as maxFileSaveBytes, ri as parseFileSearchResult, s as applyFileUpdate, si as parseFilePath, ti as parseReviewSource, tt as ConversationSidebar, u as saveFiles, un as writePreference, v as projectLive, vr as renderDiffWithHighlighter, vt as codeCommentCounts, wr as WorkerPoolWorkerError, wt as locateCodeConversations, xr as areDiffTargetsEqual, y as routes, yr as areDiffRenderOptionsEqual, z as remainingMutationIntent, zr as resolveLanguage, zt as defaultFileView } from "./comment-data-DsgJWq4n.js";
2
+ import { $ as FileSearchPanel, $r as parseReviewHistory, A as parseEditorPreferences, Ar as areFileRenderOptionsEqual, At as defaultReviewView, Br as resolveLanguage, Bt as fileHref, Cr as WorkerPoolTaskCanceledError, D as ReviewActionDialog, Dr as markWorkerErrorReported, E as FileConflictPanel, Er as isHandledWorkerPoolError, F as FileWorkspace, Fr as validateResolvedThemeName, Ft as reviewComparison, Gr as parseReviewActionResult, Gt as fileRoutes, Hr as ResolvedLanguages, Ht as readFileLocation, I as defaultFileDestination, Ir as attachResolvedThemes, It as reviewContextKey, Jr as maxFileSaveBytes, Kr as parseFileSaveRequest, L as fileActionIntent, Lr as themeResolver, Lt as reviewHref, M as FileMutationDialog, Mr as areThemesEqual, Mt as parseReviewSession, N as FileReviewPanel, Nr as getSharedHighlighter, Nt as readReviewLocation, O as FileEditorPanel, Or as isFilePlainText, P as codeThemes, Pr as prepareThemeResolution, Pt as rememberReviewPosition, Qr as parseReviewDiff, R as mutationFileView, Rn as jsx, Rr as getThemes, Rt as closeFileTab, Sr as areDiffTargetsEqual, St as isCodeConversation, Tr as WorkerPoolWorkerError, Tt as readConversationLocation, Ur as parseReviewActionPlan, Ut as reconcileFileView, Vr as areLanguagesAttached, Vt as parseFileView, Wr as parseReviewActionRecoveries, Wt as rememberFile, Xr as parseMutationResult, Yr as parseMutationPlan, Zr as parseRecoveries, _r as reviewConflictIdentity, ai as parseFileChange, br as areDiffRenderOptionsEqual, bt as conversationHref, ci as parseFilePath, cn as toast, ei as parseReviewRepository, f as storeDocument, gn as Text, gr as parseFileUpdate, hr as createCodeAnchor, ii as parseFileSearchResult, j as FileRecoveryDialog, jr as hasResolvedThemes, k as defaultEditorPreferences, kr as renderFileWithHighlighter, kt as defaultReviewPosition, l as projectStore, ln as readPreference, m as storedFiles, mn as t, ni as parseReviewSource, oi as parseFileDocument, p as storedDocument, qr as parseFileSaveResult, ri as parseFileSearchQuery, s as applyFileUpdate, si as parseFileIndex, ti as parseReviewSnapshot, tt as ConversationSidebar, u as saveFiles, un as writePreference, v as projectLive, vn as ref, vr as isDiffPlainText, vt as codeCommentCounts, wr as WorkerPoolTerminatedError, wt as locateCodeConversations, xr as areFilesEqual, y as routes, yr as renderDiffWithHighlighter, z as remainingMutationIntent, zr as getResolvedOrResolveLanguage, zt as defaultFileView } from "./comment-data-C-rNCB1n.js";
3
3
  import { B as DEFAULT_THEMES, C as getFiletypeFromFileName, S as getCustomExtensionsVersion, x as getCustomExtensionsMap } from "./cloneFileDiffMetadata-C1BcNpxN.js";
4
- import { n as createProjectComments, t as defineScreen } from "./screen-QmqmI2Aq.js";
4
+ import { n as createProjectComments, t as defineScreen } from "./screen-D4D9nh4V.js";
5
5
  import { t as require_lru } from "./lru-C0_oUet4.js";
6
- import { t as ProjectThreadLinks } from "./project-thread-links-BmY8HQXt.js";
6
+ import { t as ProjectThreadLinks } from "./project-thread-links-B7uzThL9.js";
7
7
  //#region ../../node_modules/.pnpm/@pierre+diffs@1.5.2_@shikijs+themes@4.5.0_react-dom@19.3.1_react@19.3.1__react@19.3.1/node_modules/@pierre/diffs/dist/highlighter/languages/getResolvedLanguages.js
8
8
  function getResolvedLanguages(languages) {
9
9
  const resolvedLanguages = [];
@@ -1,7 +1,7 @@
1
- import { Ji as optional, Ki as number, Kt as pageRoutes, Ln as jsx, Nn as Fragment, Qt as Spinner, Xi as parseSafe, Zi as string, Zt as Loader, _n as ref, _t as PagesWorkspace, bn as on, ci as MAX_CANVAS_Y, hn as Text, in as IconButton, l as projectStore, ln as readPreference, pn as t, qi as object, rn as Select, un as writePreference, zi as array } from "./comment-data-DsgJWq4n.js";
2
- import { n as createProjectComments, t as defineScreen } from "./screen-QmqmI2Aq.js";
1
+ import { Bi as array, Ji as object, Kt as pageRoutes, Pn as Fragment, Qi as string, Qt as Spinner, Rn as jsx, Yi as optional, Zi as parseSafe, Zt as Loader, _t as PagesWorkspace, gn as Text, in as IconButton, l as projectStore, li as MAX_CANVAS_Y, ln as readPreference, mn as t, qi as number, rn as Select, un as writePreference, vn as ref, xn as on } from "./comment-data-C-rNCB1n.js";
2
+ import { n as createProjectComments, t as defineScreen } from "./screen-D4D9nh4V.js";
3
3
  import { n as workspaceTab, t as followWorkspaceTab } from "../hosted.js";
4
- import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-BNloVosX.js";
4
+ import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-BgrfdvtL.js";
5
5
  //#region app/client/page-picture.tsx
6
6
  /**
7
7
  * A page as its latest captured picture, for Pages where there is no running site: its slices
@@ -1,4 +1,4 @@
1
- import { Bi as boolean, Gi as nullable, Ki as number, Kn as parsePreview, S as writeRows, Ui as enum_, Xi as parseSafe, Zi as string, Zn as parsePreviewPins, b as plainRow, c as previewKey, l as projectStore, li as parseElementAnchor, pn as t, qi as object, qn as parsePreviewBranch, v as projectLive, y as routes, zi as array } from "./comment-data-DsgJWq4n.js";
1
+ import { Bi as array, Ji as object, Jn as parsePreviewBranch, Ki as nullable, Qi as string, Qn as parsePreviewPins, S as writeRows, Vi as boolean, Wi as enum_, Zi as parseSafe, b as plainRow, c as previewKey, l as projectStore, mn as t, qi as number, qn as parsePreview, ui as parseElementAnchor, v as projectLive, y as routes } from "./comment-data-C-rNCB1n.js";
2
2
  //#region app/client/project-previews.ts
3
3
  /**
4
4
  * A preview's capture in a theme at a viewport. Captures from before viewports existed name
@@ -1,5 +1,5 @@
1
- import { C as ThreadTaskLinks, Dt as taskHref, Ei as valueByRole, Ln as jsx, Nn as Fragment, _ as requestComments, _n as ref, bn as on, in as IconButton, ir as parseThread, lr as parseThreadLinkInput, pn as t, ui as parseWorkWorkspace, vi as parseWorkItemRef, w as ThreadTaskPicker, y as routes } from "./comment-data-DsgJWq4n.js";
2
- import { n as requestTasks } from "./tasks-request-C89fN1dK.js";
1
+ import { C as ThreadTaskLinks, Di as valueByRole, Dt as taskHref, Pn as Fragment, Rn as jsx, _ as requestComments, ar as parseThread, di as parseWorkWorkspace, in as IconButton, mn as t, ur as parseThreadLinkInput, vn as ref, w as ThreadTaskPicker, xn as on, y as routes, yi as parseWorkItemRef } from "./comment-data-C-rNCB1n.js";
2
+ import { n as requestTasks } from "./tasks-request-CikFdCgP.js";
3
3
  //#region app/client/project-task-picker.tsx
4
4
  /**
5
5
  * Loads searchable task choices only while the picker is mounted.
@@ -1,4 +1,4 @@
1
- import { _ as requestComments, a as saveThreads, b as plainRow, cn as toast, dr as parseThreadSnapshot, g as CommentsRequestError, i as saveThread, ir as parseThread, l as projectStore, n as unavailableComments, o as threadMatches, or as parseThreadFilter, pn as t, sr as parseThreadId, x as writeOptimistically, y as routes } from "./comment-data-DsgJWq4n.js";
1
+ import { _ as requestComments, a as saveThreads, ar as parseThread, b as plainRow, cn as toast, cr as parseThreadId, fr as parseThreadSnapshot, g as CommentsRequestError, i as saveThread, l as projectStore, mn as t, n as unavailableComments, o as threadMatches, sr as parseThreadFilter, x as writeOptimistically, y as routes } from "./comment-data-C-rNCB1n.js";
2
2
  //#region ../work/src/lib/predict.ts
3
3
  /**
4
4
  * How a new task shows until its adapter confirms it: the requested values, and the creation