@bud.sh/app 0.4.1 → 0.5.0

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 (74) hide show
  1. package/dist/client/assets/bud/design.js +1 -1
  2. package/dist/client/assets/{canvas-DIKX_HCJ.js → canvas-Cu6R6xxT.js} +1 -1
  3. package/dist/client/assets/difference-worker-jfTSn-Tw.js +8 -0
  4. package/dist/client/assets/{edit-B050x0rV.js → edit-DUotSxjS.js} +12 -12
  5. package/dist/client/assets/files-js6ElfkU.js +1 -0
  6. package/dist/client/assets/i18n-DxqFr2mi.js +1 -0
  7. package/dist/client/assets/index-CFFxP0gS.css +2 -0
  8. package/dist/client/assets/{index-COvyj5zV.js → index-ChANGtl-.js} +2 -2
  9. package/dist/client/assets/lru-DzKYIXMA.js +1 -0
  10. package/dist/client/assets/pages-6_lhiQmz.js +1 -0
  11. package/dist/client/assets/{project-branches-DwKjCwZv.js → project-branches-DO897zM6.js} +1 -1
  12. package/dist/client/assets/project-comments-DFFKVpia.js +1 -0
  13. package/dist/client/assets/project-thread-links-NLFWQRD2.js +1 -0
  14. package/dist/client/assets/{project-threads-DeKXNqeP.js → project-threads-Lay351p4.js} +105 -105
  15. package/dist/client/assets/{project-work-B7PGQtV9.js → project-work-du0Y-L5Y.js} +1 -1
  16. package/dist/client/assets/rolldown-runtime-XKyaHtl9.js +1 -0
  17. package/dist/client/assets/task-design-Avb2RO4w.js +23 -0
  18. package/dist/client/assets/tasks-CA-E8bbK.js +1 -0
  19. package/dist/client/assets/{tasks-request-CsUB5__X.js → tasks-request-C55IeuiP.js} +1 -1
  20. package/dist/client/assets/workspace-Cw5HvX5d.js +2 -0
  21. package/dist/client/index.html +3 -3
  22. package/dist/hosted/assets/{canvas-gWj_ocKK.js → canvas-V36732ER.js} +6 -4
  23. package/dist/hosted/assets/{comment-data-C-rNCB1n.js → comment-data-CF2ZV_3k.js} +4021 -3645
  24. package/dist/hosted/assets/{files-CAPvbavY.js → files-DjSCjfU7.js} +5 -3
  25. package/dist/hosted/assets/{pages-DJiOvT-l.js → pages-BzjzeuPu.js} +3 -3
  26. package/dist/hosted/assets/{project-branches-BgrfdvtL.js → project-branches-BT97J9i7.js} +1 -1
  27. package/dist/hosted/assets/{project-thread-links-B7uzThL9.js → project-thread-links-BRLgByEe.js} +2 -2
  28. package/dist/hosted/assets/{screen-D4D9nh4V.js → screen-CKp2C7kx.js} +68 -137
  29. package/dist/hosted/assets/{tasks-C7aGLzBw.js → tasks-Dj7AyBJB.js} +12 -5
  30. package/dist/hosted/assets/{tasks-request-CikFdCgP.js → tasks-request-DZob623r.js} +1 -1
  31. package/dist/hosted/hosted.js +164 -16
  32. package/dist/node/assets/{src-BdvZ2mYc.js → src-CerrKjID.js} +57 -1
  33. package/dist/node/design.js +829 -789
  34. package/dist/node/server.js +25 -3
  35. package/dist/node-host/assets/{canvas-kXzp80a5.js → canvas-TRUfxfL5.js} +6 -4
  36. package/dist/node-host/assets/{comment-data-CeuJbJKJ.js → comment-data-DyIZNpfG.js} +4003 -3627
  37. package/dist/node-host/assets/{files-0YIuvKzb.js → files-Dh2TiQZq.js} +5 -3
  38. package/dist/node-host/assets/{pages-DOF22SyG.js → pages-BxpjbYhs.js} +3 -3
  39. package/dist/node-host/assets/{project-branches-BeEwMBIw.js → project-branches-B7HUGiVK.js} +1 -1
  40. package/dist/node-host/assets/{project-thread-links-Bs_MtfBC.js → project-thread-links-CauJF0Cz.js} +2 -2
  41. package/dist/node-host/assets/{screen-DRTAKkn3.js → screen-CZXWJEds.js} +68 -137
  42. package/dist/node-host/assets/{tasks-BA_hcbj5.js → tasks-Bs1IOpeU.js} +12 -5
  43. package/dist/node-host/assets/{tasks-request-Doc9y_20.js → tasks-request-ZWmbc8fE.js} +1 -1
  44. package/dist/node-host/node-host.js +164 -16
  45. package/dist/server/assets/{canvas-CiN6jNIZ.js → canvas-Dc1mYCwQ.js} +7 -5
  46. package/dist/server/assets/{comment-data-9SqALQjT.js → comment-data-CsjukwAW.js} +3773 -3608
  47. package/dist/server/assets/{events-6z5v7Uca.js → events-iHpLGr3k.js} +213 -2
  48. package/dist/server/assets/{files-DBVqeLdL.js → files-E9mSFeoc.js} +6 -4
  49. package/dist/server/assets/{listener-DGWKUc2o.js → listener-DN5TyOjJ.js} +35 -9
  50. package/dist/server/assets/{pages-DJMLr6j9.js → pages-BBBXyJWV.js} +4 -4
  51. package/dist/server/assets/{project-branches-DbKEmiQT.js → project-branches-B0YIK6Ur.js} +2 -2
  52. package/dist/server/assets/{project-thread-links-C0kV_Pcl.js → project-thread-links-CBOpf6zk.js} +3 -3
  53. package/dist/server/assets/{project-work-C0FN3w5Y.js → project-work-qSKFO5yj.js} +3 -3
  54. package/dist/server/assets/{screen-BtvzEiIa.js → screen-BIQA2mr4.js} +69 -138
  55. package/dist/server/assets/{server-CYvuOSBA.js → server-DxK-UB_Z.js} +30 -4
  56. package/dist/server/assets/{services-DK4fqrlF.js → services-BRrgXYlT.js} +105 -9
  57. package/dist/server/assets/{tasks-DX71x8f9.js → tasks-CiXodsLN.js} +14 -7
  58. package/dist/server/assets/{tasks-request-C3jk9Jyu.js → tasks-request-DhwCzpRi.js} +2 -2
  59. package/dist/server/migration.js +3 -3
  60. package/dist/server/runtime.js +3 -3
  61. package/dist/server/server.js +2 -2
  62. package/dist/types/server.d.ts +11 -1
  63. package/package.json +1 -1
  64. package/dist/client/assets/difference-worker-CwQNxTJL.js +0 -8
  65. package/dist/client/assets/files-BQ9O3Z8-.js +0 -1
  66. package/dist/client/assets/i18n-CL0jBP7Y.js +0 -1
  67. package/dist/client/assets/index-CjhJtepP.css +0 -2
  68. package/dist/client/assets/lru-BkhKJhvt.js +0 -1
  69. package/dist/client/assets/pages-BGl2Yuza.js +0 -1
  70. package/dist/client/assets/project-comments-Cdip2Y10.js +0 -1
  71. package/dist/client/assets/project-thread-links-BGIkGQeU.js +0 -1
  72. package/dist/client/assets/task-design-DJp5yho1.js +0 -23
  73. package/dist/client/assets/tasks-BHXj727C.js +0 -1
  74. package/dist/client/assets/workspace-CbO7RsI2.js +0 -2
@@ -0,0 +1 @@
1
+ import{r as e}from"./i18n-DxqFr2mi.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{A as c,An as l,At as u,F as d,Mn as f,Mt as p,Pn as m,f as h,ht as g,jt as _,k as v,kn as y,ut as b,wt as x,xt as S}from"./task-design-Avb2RO4w.js";import{C,E as w,S as T,V as E,b as D,ct as O,dt as ee,p as k,q as A,s as j,w as M,x as N}from"./project-threads-Lay351p4.js";import{n as P,t as F}from"./tasks-request-C55IeuiP.js";import{t as I}from"./project-work-du0Y-L5Y.js";import{r as L,t as R}from"./project-comments-DFFKVpia.js";import{n as z,t as B}from"./project-thread-links-NLFWQRD2.js";function te(s){let l=s.props.conversationId,u=l,f=!!l,p=!1,m=!1,h=[s.props.itemId],_=R({store:j(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()}});_.loaded&&(u??=_.snapshot.threads[0]?.id);let y=i(()=>{_.loaded||_.load().then(()=>{u??=_.snapshot.threads[0]?.id,s.signal.aborted||s.update()})});async function b(e){let t=await _.write(e);return await s.props.onChange?.(),t}function x(e){return{project:s.props.project,thread:e,items:s.props.items,canLink:_.snapshot.capabilities.link,busy:_.busy,onChange:async()=>{await _.load(),_.snapshot.threads.some(t=>t.id===e.id)&&await _.loadThread(e.id,!0),await s.props.onChange?.()}}}function S(n){return t(`div`,{class:`flex items-start justify-between gap-2`,children:[s.props.renderThreadLinks?s.props.renderThreadLinks(n):t(B,{part:n.anchor?`links`:void 0,...x(n)}),!n.anchor&&_.snapshot.capabilities.reply&&_.snapshot.threads.length>1?t(a,{variant:`ghost`,size:`small`,disabled:_.busy,"aria-pressed":!p&&u===n.id,mix:r(`click`,()=>{u=n.id,f=!0,p=!1,s.update()}),children:e(`app.client.taskDiscussion.reply`)}):null]})}function C(n){return t(A,{location:n.anchor?O(n):e(`app.client.taskDiscussion.discussion`),actions:s.props.renderThreadLinks?void 0:t(B,{part:`action`,...x(n)}),status:n.status,busy:_.busy,onStatusChange:_.snapshot.capabilities.status?e=>{b({id:n.id,status:e}).catch(()=>{})}:void 0})}return()=>{l!==s.props.conversationId&&(l=s.props.conversationId,f=!!l,l&&(u=l,p=!1));let{threads:i,capabilities:x}=_.snapshot,T=p?void 0:i.find(e=>e.id===u&&!e.anchor)??(f?void 0:i.find(e=>!e.anchor&&e.status!==`resolved`)??(x.create?void 0:i.find(e=>!e.anchor))),E=!p&&(f&&(!T||!x.reply)||!(!T||T.messagesLoaded));_.ready&&!_.busy&&!_.loading&&s.queueTask(()=>{f&&u&&_.loadThread(u);for(let e of _.snapshot.threads)!e.messagesLoaded&&(!e.anchor||e.id===u)&&_.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,_.ready&&x.create&&i.length?t(a,{variant:`ghost`,size:`small`,class:`ms-auto`,disabled:_.busy||p,mix:r(`click`,()=>{p=!0,s.update()}),children:e(`app.client.taskDiscussion.newDiscussion`)}):null]}),_.error?t(`div`,{class:`flex flex-col items-start gap-2`,children:[t(o,{variant:`ui-caption`,role:`alert`,children:_.error}),t(a,{variant:`secondary`,size:`small`,mix:r(`click`,()=>{_.load().then(()=>u?_.loadThread(u,!0):void 0)}),children:e(`app.client.taskDiscussion.reloadComments`)})]}):null,_.loaded?_.ready?t(n,{children:[i.length?i.map(e=>e.anchor?t(c,{id:e.id,expanded:u===e.id,heading:C(e),messages:e.messages,messageCount:e.messageCount,now:_.now,onExpand:()=>{u=e.id,f=!1,_.loadThread(e.id),s.update()},renderDetail:()=>t(v,{heading:C(e),messages:e.messages,messageCount:e.messageCount,messagesLoaded:e.messagesLoaded,messagesTruncated:e.messagesTruncated,now:_.now,busy:_.busy,links:S(e),onReply:x.reply?(t,n)=>b({id:e.id,body:t,parentId:n}):void 0,viewerId:_.viewer?.id,onDelete:x.delete?async t=>{let n=e.messages[0]?.id===t;await _.remove(e.id,t),n&&u===e.id&&(u=void 0),s.update()}:void 0})},e.id):t(w,{thread:e,links:S(e)},e.id)):t(o,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.noDiscussionYet`)}),x.create||x.reply&&(f||i.some(e=>!e.anchor))?t(`div`,{class:`flex min-w-0 flex-col gap-2`,children:[x.create&&(p||!f&&!i.length)?t(`div`,{class:`flex items-start justify-between gap-2`,"aria-label":e(`app.client.taskDiscussion.newDiscussionTasks`),children:[t(M,{itemIds:h,items:s.props.items??[],href:g,busy:_.busy,onEdit:x.link?()=>{m=!0,s.update()}:void 0}),p?t(a,{variant:`ghost`,size:`small`,disabled:_.busy,mix:r(`click`,()=>{p=!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(d,{label:e(`app.client.taskDiscussion.addTaskComment`),placeholder:e(`app.client.taskDiscussion.addContextPlaceholder`),busy:_.busy||E,class:`w-full`,onSubmit:async t=>{if(E)throw Error(e(`app.client.taskDiscussion.loadBeforeReplying`));T&&x.reply?await b({id:T.id,body:t}):(u=(await b({anchor:null,itemIds:h,body:t})).thread.id,f=!!u,p=!1,h=[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`)}),m?t(z,{project:s.props.project,selected:h,required:[s.props.itemId],onSave:async e=>{h=e,s.update()},onClose:()=>{m=!1,s.update()}}):null]})}}function ne(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 V(t,n,r,i,a){let[o,s,c]=await Promise.all([P(D.tasksApi.show.href({id:n}),t,i,e=>e),L(t,n,i,a),r]),u=l(o,c);if(u.item.id!==n)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));return{detail:u,discussion:s}}async function H(t,n,r,i){let a=await j(t),o=k(a),s=o?Promise.resolve(o):I(t).refresh(n),c=r?b(r):null,l=e=>V(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 U(n){let r=n.props.project,a=n.props.initial.store,o=I(r),s=k(a),c=()=>{let e=s?.snapshot.schemaVersion;s=k(a);let t=w?a.work.get(w.item.id):void 0;(t&&!t.$hasPendingWrites&&ne(N(t),w.item)||!w&&j&&s?.snapshot.schemaVersion!==e)&&$(),Z()},d=[a.boards.subscribeChanges(c),a.work.subscribeChanges(c)],v=b(n.props.href),S=n.props.initial.task,w=S?.detail.item.id===v?S.detail:null,O=w?S.discussion:void 0,A=!1,j=n.props.initial.task?``:n.props.initial.taskError??``,M=v!==null&&!w&&!j,F=n.props.initial.error,L=null,R=null,z=new Set,B=n.props.href,H,U=!1,W=!1;function re(e){let t=e?a.work.get(e.item.id):void 0;if(!e||!t?.$hasPendingWrites)return e;let n={...e.item.values,...N(t).values};return{...e,item:{...e.item,values:n}}}function G(){if(!s)throw Error(e(`app.client.projectTasks.refreshBeforeChanges`));return s.schema}async function K(e,t,i){let a=new AbortController;z.add(a);try{return await P(e,r.token,AbortSignal.any([n.signal,a.signal]),i,fetch,{body:t})}finally{z.delete(a)}}async function ie(e){await C(a.work,{upsert:[e]}),w?.item.id===e.id&&(w={...w,item:e}),Z()}async function q(){await Q(),v&&await $()}let J=new Map;async function Y(t,r,i,a){let o=a?J.get(a):void 0,s=Promise.withResolvers();a&&J.set(a,s.promise);try{let n=await T(i,async()=>{let n=await o,i=`expectedRevision`in r?r.expectedRevision:void 0,c=await K(t,n&&i===n.from&&n.to?{...r,expectedRevision:n.to}:r,e=>f(e,G()));if(a&&c.item.id!==a)throw Error(e(`app.client.projectTasks.differentTaskRefreshRetry`));return await ie(c.item),s.resolve(i?{from:i,to:c.item.revision}:null),c.item});return v&&await $(),n}catch(t){throw s.resolve(null),n.signal.aborted||h.error(e(`app.client.projectTasks.undidTaskChange`),{description:t instanceof Error?t.message:e(`app.client.projectTasks.writeNotConfirmed`)}),q(),t}finally{a&&J.get(a)===s.promise&&J.delete(a)}}function X(e,t){return()=>{let n=a.work.get(e);if(!n)return;let{values:r}=t(N(n));a.work.update(e,e=>{e.values=r})}}let ae={create:e=>Y(D.tasksApi.create.href(),e,()=>{a.work.insert(_(G(),`pending-${crypto.randomUUID()}`,e))}),update:(e,t)=>Y(D.tasksApi.update.href({id:e}),t,X(e,e=>p(e,t)),e),act:(e,t)=>Y(D.tasksApi.mutate.href({id:e}),t,X(e,e=>u(G(),e,t)),e),get:async t=>{let i=await P(D.tasksApi.show.href({id:t}),r.token,n.signal,e=>l(e,G()));if(i.item.id!==t)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));return i.item},section:(e,t,i=n.signal)=>P(D.tasksApi.section.href({id:e,section:t}),r.token,AbortSignal.any([n.signal,i]),e=>y(e,G())),sync:async e=>{try{let t=await K(D.tasksApi.sync.href(),e,m);return await q(),t}catch(e){throw q(),e}}};function Z(){n.signal.aborted||n.update()}async function Q(){L?.abort();let t=new AbortController;L=t,A=!0,F=``,Z();try{await o.refresh(AbortSignal.any([n.signal,t.signal]))}catch(r){!t.signal.aborted&&!n.signal.aborted&&(F=r instanceof Error?r.message:e(`app.client.projectTasks.couldNotLoadTasks`))}finally{L===t&&(A=!1,Z())}}async function $(){if(R?.abort(),!v){w=null,M=!1,j=``,Z();return}let t=v,i=new AbortController;R=i;let a=w?.item.id!==t;a&&(w=null),M=!0,j=``,Z();try{let o=AbortSignal.any([n.signal,i.signal]);if(a){let e=await V(r.token,t,G(),o,n.props.conversationId);if(i.signal.aborted||t!==v)return;w=e.detail,O=e.discussion;return}let s=await P(D.tasksApi.show.href({id:t}),r.token,o,e=>l(e,G()));if(i.signal.aborted||t!==v)return;if(s.item.id!==t)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));w=s}catch(r){!i.signal.aborted&&!n.signal.aborted&&t===v&&(j=r instanceof Error?r.message:e(`app.client.projectTasks.couldNotLoadTask`))}finally{R===i&&(M=!1,Z())}}function oe(e,t=!0){e!==v&&(v=e,t&&se(!1),$(),Z())}function se(e){let t=g(null);if(!n.props.active||!ee(window.location.href)&&window.location.pathname!==t&&!window.location.pathname.startsWith(`${t}/`)){U=!0;return}U=!1;let r=g(v);window.location.pathname+window.location.search+window.location.hash!==r&&(H=new URL(r,window.location.origin).href,window.history[e?`replaceState`:`pushState`]({...window.history.state,budTask:v},``,r))}let ce=i((e,t)=>{W=!0;let r=v;v=b(n.props.href),w?.item.id!==v&&!(j&&r===v)&&$(),n.props.initial.stored&&Q(),t.addEventListener(`abort`,()=>{for(let e of d)e.unsubscribe();L?.abort(),R?.abort();for(let e of z)e.abort()},{once:!0})});return()=>{if(W&&B!==n.props.href){if(B=n.props.href,H!==B){U=!1;let e=b(B);e!==v&&n.queueTask(()=>oe(e,!1))}H=void 0}U&&n.props.active&&n.queueTask(()=>se(!0));let e=s,i=e?.snapshot.items.map(t=>({id:t.id,title:x(t,e.schema,`title`)||void 0}));return t(`div`,{class:`h-full min-h-0`,mix:ce,children:t(E,{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:A,error:F,selectedId:v,detail:re(w),discussion:w?t(te,{project:r,itemId:w.item.id,initial:O,items:i,conversationId:n.props.conversationId,onChange:q},w.item.id):void 0,detailLoading:M,detailError:j,operations:ae,onSelect:oe,onReload:()=>{Q()},onReloadDetail:()=>{$()}})})}}var W=s({routes:S,load:({project:e,signal:t,url:n,conversation:r})=>H(e,t,n.href,r?.id),render:(e,{project:n,url:r,active:i,taskDesign:a,conversation:o})=>t(U,{project:n,initial:e,design:a,href:r.href,active:i,conversationId:o?.id})});export{W as default};
@@ -1 +1 @@
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
+ import{r as e}from"./i18n-DxqFr2mi.js";import{Ct as t,Nn as n,jn as r}from"./task-design-Avb2RO4w.js";import{b as i}from"./project-threads-Lay351p4.js";var a=t(),o=t();for(let[e,t]of Object.entries(i.tasksApi))(t.method===`GET`?a:o).add(t.pattern,e);function s(e,t){if(!e.startsWith(`/`)||e.startsWith(`//`)||e.length>7e3||/[\\#\u0000-\u0020]/.test(e))return!1;try{let i=(t?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`)&&r({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 n(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};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pages-6_lhiQmz.js","assets/i18n-DxqFr2mi.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-Avb2RO4w.js","assets/rolldown-runtime-XKyaHtl9.js","assets/method-DybmO5PB.js","assets/project-threads-Lay351p4.js","assets/frame-D6XmK4Df.js","assets/preload-helper-BLdHbfdN.js","assets/cloneFileDiffMetadata-CWfw01dG.js","assets/workspace-tab-Bg2MFdMB.js","assets/project-comments-DFFKVpia.js","assets/project-branches-DO897zM6.js","assets/canvas-Cu6R6xxT.js","assets/project-thread-links-NLFWQRD2.js","assets/tasks-request-C55IeuiP.js","assets/tasks-CA-E8bbK.js","assets/project-work-du0Y-L5Y.js","assets/files-js6ElfkU.js","assets/lru-DzKYIXMA.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./i18n-DxqFr2mi.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{$n as d,Ct as f,Gn as p,Hn as m,Jn as h,Kn as g,Lt as _,Qn as v,Un as y,Wn as b,er as x,nr as S,nt as C,qn as w,rr as T,zt as E}from"./task-design-Avb2RO4w.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-Lay351p4.js";import{d as pe}from"./method-DybmO5PB.js";import{t as me}from"./project-work-du0Y-L5Y.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=S(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 p((n,r)=>{let i=e[`~run`](n,r);return i.issues?h(t,r.path):i})}function z(e,t){return p((n,r)=>{let i=e[`~run`](n,r);if(i.issues)return i;let a=t(i.value);return a===void 0?i:h(a,r.path)})}function B(e,t){return p((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=h(e.message,r.path);return I.set(t.issues[0],e),t}})}function _e(e){return p((t,n)=>e(t)[`~run`](t,n))}function V(e,t){return p((n,r)=>n==null?{value:t()}:e[`~run`](n,r))}function H(e,t){let n=d(t);return p((r,i)=>{if(!r||typeof r!=`object`||Array.isArray(r))return h(`${e} must be an object.`,i.path);for(let n of Object.keys(r))if(!Object.hasOwn(t,n))return h(`${e}.${n} is not a supported setting.`,[...i.path,n]);return n[`~run`](r,i)})}function ve(e,t,n=0){let r=y(e);return p((e,i)=>!Array.isArray(e)||e.length<n?h(t,i.path):r[`~run`](e,i))}var ye=g(H(`files`,{edit:V(R(b(),`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=p((e,t)=>{if(e===void 0)return{value:[]};if(!Array.isArray(e))return h(U,t.path);let n=e.map(xe);if(n.some(e=>!e))return h(U,t.path);let r=n.map(e=>e.id);return new Set(r).size===r.length?{value:n}:h(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=p((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}}:h(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=p((e,t)=>{if(e===void 0)return{value:{light:{},dark:{}}};if(!e||typeof e!=`object`||Array.isArray(e))return h(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?h(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=p((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 h(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 h(G,t.path);let a=i;if(Object.keys(a).some(e=>![`install`,`build`,`serve`].includes(e)))return h(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])?h(G,t.path):{value:o}});function q(e,t,n){let r=t?/\.server\.ts$/:/\.(?:ts|tsx|js|jsx)$/;return R(T().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=w([!1,`bud:beads`,`bud:memory`,`bud:git-comments`]);function Ie(e){let t=q(`storage.${e}`,!0);return g(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=g(H(`storage`,{work:Ie(`work`),threads:Ie(`threads`)}),()=>({work:`bud:beads`,threads:`bud:beads`})),Re=g(H(`designs`,{tasks:g(_e(e=>e===`bud:beads`?w([`bud:beads`]):q(`designs.tasks`,!1)),`bud:beads`),pages:g(w([`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=p((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=p((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 h(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=p((e,t)=>{if(!Array.isArray(e)||e.length===0||e.length>4)return h(Y,t.path);let n=[];for(let r of e){if(!r||typeof r!=`object`||Array.isArray(r))return h(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 h(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}:h(Y,t.path)}),qe=g(H(`previews`,{scale:V(R(v().refine(e=>Number.isInteger(e)&&e>=1&&e<=3),`previews.scale must be 1, 2 or 3.`),()=>2),themes:V(R(y(w([`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(v().refine(e=>Number.isInteger(e)&&e>=1e3&&e<=6e5),`previews.readyTimeout must be whole milliseconds from 1000 to 600000.`),()=>6e4),css:V(R(T().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(m().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=g(B(R(y(m()).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=d(t);return p((t,r)=>rt(t)?n[`~run`](Array.isArray(t)?{...t}:t,r):h(e,r.path))}var it=z(Z(`Bud config must export an object.`,{routes:R(y(m()).refine(e=>e.length>0),`bud.config must define at least one route.`),name:x(R(T().refine(e=>!!e.trim()),`name must be a nonempty string.`)),target:x(Z(`target must be an object.`,{origin:m(),port:m()})),comments:x(Z(`comments must be an object.`,{remote:m()})),port:m(),screens:m(),storage:m(),designs:m(),previews:m(),files:m(),logo:m(),theme:m(),locale:m(),picker:m(),branches:m(),flows:m()}),({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(m().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&&!S(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=f();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-6_lhiQmz.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-Cu6R6xxT.js`),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,21,22])),"bud:tasks":()=>a(()=>import(`./tasks-CA-E8bbK.js`),__vite__mapDeps([23,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,22,24,18,21])),"bud:files":()=>a(()=>import(`./files-js6ElfkU.js`),__vite__mapDeps([25,11,1,2,6,4,3,5,7,15,8,9,10,12,16,13,14,26,18,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(),C(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=E(t);let o=await de(j.comments.get.href({id:t}),r,i,_,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-COvyj5zV.js"></script>
37
- <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/i18n-CL0jBP7Y.js">
36
+ <script data-rmx-preserve-dom type="module" crossorigin src="/assets/index-ChANGtl-.js"></script>
37
+ <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/i18n-DxqFr2mi.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">
@@ -42,7 +42,7 @@
42
42
  <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/frame-D6XmK4Df.js">
43
43
  <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/run-B2H4brp5.js">
44
44
  <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/preload-helper-BLdHbfdN.js">
45
- <link data-rmx-preserve-dom rel="stylesheet" crossorigin href="/assets/index-CjhJtepP.css">
45
+ <link data-rmx-preserve-dom rel="stylesheet" crossorigin href="/assets/index-CFFxP0gS.css">
46
46
  </head>
47
47
  <body>
48
48
  <!--app-html-->
@@ -1,7 +1,7 @@
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";
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-CF2ZV_3k.js";
2
+ import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-BT97J9i7.js";
3
+ import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-CKp2C7kx.js";
4
+ import { t as ProjectThreadLinks } from "./project-thread-links-BRLgByEe.js";
5
5
  //#region app/client/preview-image.tsx
6
6
  var failedHeight = 760;
7
7
  var stopPan = on("pointerdown", (event) => event.stopPropagation());
@@ -1031,6 +1031,8 @@ function ProjectCanvas(handle) {
1031
1031
  },
1032
1032
  onSync: () => comments.sync().catch(() => {}),
1033
1033
  onReload: comments.load,
1034
+ viewerId: comments.viewer?.id,
1035
+ onDeleteComment: (threadId, messageId) => comments.remove(threadId, messageId),
1034
1036
  onCopyThreadLink: (thread) => navigator.clipboard.writeText(new URL(conversationHref(thread.id), window.location.origin).href),
1035
1037
  interactive: false,
1036
1038
  branch: selected,