@bud.sh/app 0.5.0 → 0.5.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 (57) hide show
  1. package/dist/client/assets/bud/design.js +1 -1
  2. package/dist/client/assets/{canvas-Cu6R6xxT.js → canvas-8GXJIuDK.js} +1 -1
  3. package/dist/client/assets/difference-worker-C99ychYw.js +8 -0
  4. package/dist/client/assets/{files-js6ElfkU.js → files-DkWt1l9H.js} +1 -1
  5. package/dist/client/assets/i18n-hH_Ba5QO.js +1 -0
  6. package/dist/client/assets/{index-ChANGtl-.js → index-Dn2pfmXf.js} +2 -2
  7. package/dist/client/assets/index-tpHYVXma.css +2 -0
  8. package/dist/client/assets/{pages-6_lhiQmz.js → pages-BVd6MQmu.js} +1 -1
  9. package/dist/client/assets/{project-branches-DO897zM6.js → project-branches-CMGRmrqr.js} +1 -1
  10. package/dist/client/assets/project-comments-D1IIQwsW.js +1 -0
  11. package/dist/client/assets/{project-thread-links-NLFWQRD2.js → project-thread-links-DKwe_SYb.js} +1 -1
  12. package/dist/client/assets/{project-threads-Lay351p4.js → project-threads-ZbKDh78d.js} +2 -2
  13. package/dist/client/assets/{project-work-du0Y-L5Y.js → project-work-D4DZqBCZ.js} +1 -1
  14. package/dist/client/assets/{task-design-Avb2RO4w.js → task-design-BPpc4Gd7.js} +1 -1
  15. package/dist/client/assets/{tasks-CA-E8bbK.js → tasks-Cn0VOZ9Z.js} +1 -1
  16. package/dist/client/assets/{tasks-request-C55IeuiP.js → tasks-request-BLyOzokZ.js} +1 -1
  17. package/dist/client/assets/{workspace-Cw5HvX5d.js → workspace-DGErsSg6.js} +2 -2
  18. package/dist/client/index.html +3 -3
  19. package/dist/hosted/assets/{canvas-V36732ER.js → canvas-BYTOp1p7.js} +4 -4
  20. package/dist/hosted/assets/{comment-data-CF2ZV_3k.js → comment-data-Cn5y2VxV.js} +6 -21
  21. package/dist/hosted/assets/{files-DjSCjfU7.js → files-B1P2_24q.js} +3 -3
  22. package/dist/hosted/assets/{pages-BzjzeuPu.js → pages-B0ZlVdci.js} +3 -3
  23. package/dist/hosted/assets/{project-branches-BT97J9i7.js → project-branches-DlCWmfRo.js} +1 -1
  24. package/dist/hosted/assets/{project-thread-links-BRLgByEe.js → project-thread-links-BZXQ200n.js} +2 -2
  25. package/dist/hosted/assets/{screen-CKp2C7kx.js → screen-CfdC3NbR.js} +5 -1
  26. package/dist/hosted/assets/{tasks-Dj7AyBJB.js → tasks-_yKh2Z6q.js} +4 -4
  27. package/dist/hosted/assets/{tasks-request-DZob623r.js → tasks-request-CFPLvLc7.js} +1 -1
  28. package/dist/hosted/hosted.js +6 -6
  29. package/dist/node/design.js +0 -5
  30. package/dist/node-host/assets/{canvas-TRUfxfL5.js → canvas-DxmcFZCh.js} +4 -4
  31. package/dist/node-host/assets/{comment-data-DyIZNpfG.js → comment-data-yfWEdDQL.js} +6 -21
  32. package/dist/node-host/assets/{files-Dh2TiQZq.js → files-anHi-apm.js} +3 -3
  33. package/dist/node-host/assets/{pages-BxpjbYhs.js → pages-CW4aF6dK.js} +3 -3
  34. package/dist/node-host/assets/{project-branches-B7HUGiVK.js → project-branches-D7rVCxQX.js} +1 -1
  35. package/dist/node-host/assets/{project-thread-links-CauJF0Cz.js → project-thread-links-m-OLpsD9.js} +2 -2
  36. package/dist/node-host/assets/{screen-CZXWJEds.js → screen-DapOVrga.js} +5 -1
  37. package/dist/node-host/assets/{tasks-Bs1IOpeU.js → tasks-BBK_CybR.js} +4 -4
  38. package/dist/node-host/assets/{tasks-request-ZWmbc8fE.js → tasks-request-B0aeNocI.js} +1 -1
  39. package/dist/node-host/node-host.js +6 -6
  40. package/dist/server/assets/{canvas-Dc1mYCwQ.js → canvas-CkMK4hoN.js} +4 -4
  41. package/dist/server/assets/{comment-data-CsjukwAW.js → comment-data-NLeHG89b.js} +6 -21
  42. package/dist/server/assets/{files-E9mSFeoc.js → files-CRdl489E.js} +3 -3
  43. package/dist/server/assets/{listener-DN5TyOjJ.js → listener-BAYn9Q-u.js} +6 -6
  44. package/dist/server/assets/{pages-BBBXyJWV.js → pages-DXVlJlBC.js} +3 -3
  45. package/dist/server/assets/{project-branches-B0YIK6Ur.js → project-branches-CwTsf6WQ.js} +1 -1
  46. package/dist/server/assets/{project-thread-links-CBOpf6zk.js → project-thread-links-lLS_rq7c.js} +2 -2
  47. package/dist/server/assets/{project-work-qSKFO5yj.js → project-work-CSZlCwH-.js} +2 -2
  48. package/dist/server/assets/{screen-BIQA2mr4.js → screen-B1zH_1O3.js} +5 -1
  49. package/dist/server/assets/{tasks-CiXodsLN.js → tasks-CGdz-uox.js} +5 -5
  50. package/dist/server/assets/{tasks-request-DhwCzpRi.js → tasks-request-D2NBjCTl.js} +1 -1
  51. package/dist/server/runtime.js +1 -1
  52. package/dist/server/server.js +1 -1
  53. package/package.json +1 -1
  54. package/dist/client/assets/difference-worker-jfTSn-Tw.js +0 -8
  55. package/dist/client/assets/i18n-DxqFr2mi.js +0 -1
  56. package/dist/client/assets/index-CFFxP0gS.css +0 -2
  57. package/dist/client/assets/project-comments-DFFKVpia.js +0 -1
@@ -1,2 +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};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pages-BVd6MQmu.js","assets/i18n-hH_Ba5QO.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-BPpc4Gd7.js","assets/rolldown-runtime-XKyaHtl9.js","assets/method-DybmO5PB.js","assets/project-threads-ZbKDh78d.js","assets/frame-D6XmK4Df.js","assets/preload-helper-BLdHbfdN.js","assets/cloneFileDiffMetadata-CWfw01dG.js","assets/workspace-tab-Bg2MFdMB.js","assets/project-comments-D1IIQwsW.js","assets/project-branches-CMGRmrqr.js","assets/canvas-8GXJIuDK.js","assets/project-thread-links-DKwe_SYb.js","assets/tasks-request-BLyOzokZ.js","assets/tasks-Cn0VOZ9Z.js","assets/project-work-D4DZqBCZ.js","assets/files-DkWt1l9H.js","assets/lru-DzKYIXMA.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./i18n-hH_Ba5QO.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-BPpc4Gd7.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-ZbKDh78d.js";import{d as pe}from"./method-DybmO5PB.js";import{t as me}from"./project-work-D4DZqBCZ.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-BVd6MQmu.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-8GXJIuDK.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-Cn0VOZ9Z.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-DkWt1l9H.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-ChANGtl-.js"></script>
37
- <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/i18n-DxqFr2mi.js">
36
+ <script data-rmx-preserve-dom type="module" crossorigin src="/assets/index-Dn2pfmXf.js"></script>
37
+ <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/i18n-hH_Ba5QO.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-CFFxP0gS.css">
45
+ <link data-rmx-preserve-dom rel="stylesheet" crossorigin href="/assets/index-tpHYVXma.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-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";
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-Cn5y2VxV.js";
2
+ import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-DlCWmfRo.js";
3
+ import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-CfdC3NbR.js";
4
+ import { t as ProjectThreadLinks } from "./project-thread-links-BZXQ200n.js";
5
5
  //#region app/client/preview-image.tsx
6
6
  var failedHeight = 760;
7
7
  var stopPan = on("pointerdown", (event) => event.stopPropagation());
@@ -49962,10 +49962,6 @@ var de = {
49962
49962
  text: "Leinwand verschieben",
49963
49963
  source: "233eddf0"
49964
49964
  },
49965
- "canvas.canvasWorkspace.reload": {
49966
- text: "Neu laden",
49967
- source: "1a43a2ac"
49968
- },
49969
49965
  "canvas.canvasWorkspace.savingComments": {
49970
49966
  text: "Kommentare werden gespeichert",
49971
49967
  source: "1f15fbfb"
@@ -54059,7 +54055,6 @@ var en = {
54059
54055
  "canvas.canvasWorkspace.interactWithPages": "Interact with pages",
54060
54056
  "canvas.canvasWorkspace.newComment": "New comment",
54061
54057
  "canvas.canvasWorkspace.panCanvas": "Pan canvas",
54062
- "canvas.canvasWorkspace.reload": "Reload",
54063
54058
  "canvas.canvasWorkspace.savingComments": "Saving comments",
54064
54059
  "canvas.canvasWorkspace.showDarkPages": "Show dark pages",
54065
54060
  "canvas.canvasWorkspace.showFullPages": "Show full pages",
@@ -82980,23 +82975,13 @@ function CanvasWorkspace(handle) {
82980
82975
  if (zoomLabel) zoomLabel.textContent = `${Math.round(scale * 100)}%`;
82981
82976
  }
82982
82977
  }),
82983
- handle.props.error || handle.props.commentsUnavailable || notice ? /* @__PURE__ */ jsx("div", {
82984
- role: handle.props.error ? "alert" : "status",
82985
- class: `absolute top-3 left-3 max-w-[calc(100%-24px)] bud-overlay rounded-lg px-3 py-2 ${handle.props.error ? "text-red-500" : "text-muted"}`,
82986
- children: [/* @__PURE__ */ jsx(Text$1, {
82978
+ handle.props.commentsUnavailable || notice ? /* @__PURE__ */ jsx("div", {
82979
+ role: "status",
82980
+ class: "absolute top-3 left-3 max-w-[calc(100%-24px)] bud-overlay rounded-lg px-3 py-2 text-muted",
82981
+ children: /* @__PURE__ */ jsx(Text$1, {
82987
82982
  variant: "ui-caption",
82988
- children: handle.props.error || handle.props.commentsUnavailable || notice
82989
- }), handle.props.error ? /* @__PURE__ */ jsx("button", {
82990
- type: "button",
82991
- class: "ml-2 underline",
82992
- mix: on("click", () => {
82993
- handle.props.onReload?.();
82994
- }),
82995
- children: /* @__PURE__ */ jsx(Text$1, {
82996
- variant: "ui-caption",
82997
- children: t$2("canvas.canvasWorkspace.reload")
82998
- })
82999
- }) : null]
82983
+ children: handle.props.commentsUnavailable || notice
82984
+ })
83000
82985
  }) : null,
83001
82986
  panel && !handle.props.commentsUnavailable ? /* @__PURE__ */ jsx(ConversationSidebar, {
83002
82987
  threads: handle.props.snapshot.threads,
@@ -1,9 +1,9 @@
1
1
  import { i as __toESM } from "./rolldown-runtime-DktXgydw.js";
2
- import { $ as FileSearchPanel, $r as parseReviewActionResult, A as parseEditorPreferences, Ar as areDiffTargetsEqual, At as defaultReviewView, Br as areThemesEqual, Bt as fileHref, Cr as createCodeAnchor, D as ReviewActionDialog, Dr as renderDiffWithHighlighter, E as FileConflictPanel, Er as isDiffPlainText, F as FileWorkspace, Fr as markWorkerErrorReported, Ft as reviewComparison, Gr as themeResolver, Gt as fileRoutes, Hr as prepareThemeResolution, Ht as readFileLocation, I as defaultFileDestination, Ir as isFilePlainText, It as reviewContextKey, Jr as resolveLanguage, Kr as getThemes, L as fileActionIntent, Lr as renderFileWithHighlighter, Lt as reviewHref, M as FileMutationDialog, Mr as WorkerPoolTerminatedError, Mt as parseReviewSession, N as FileReviewPanel, Nr as WorkerPoolWorkerError, Nt as readReviewLocation, O as FileEditorPanel, Or as areDiffRenderOptionsEqual, P as codeThemes, Pr as isHandledWorkerPoolError, Pt as rememberReviewPosition, Qr as parseReviewActionRecoveries, R as mutationFileView, Rn as jsx, Rr as areFileRenderOptionsEqual, Rt as closeFileTab, St as isCodeConversation, Tr as reviewConflictIdentity, Tt as readConversationLocation, Ur as validateResolvedThemeName, Ut as reconcileFileView, Vr as getSharedHighlighter, Vt as parseFileView, Wr as attachResolvedThemes, Wt as rememberFile, Xr as ResolvedLanguages, Yr as areLanguagesAttached, Zr as parseReviewActionPlan, ai as parseRecoveries, bt as conversationHref, ci as parseReviewRepository, cn as toast, di as parseFileSearchQuery, ei as parseFileSaveRequest, f as storeDocument, fi as parseFileSearchResult, gi as parseFilePath, gn as Text, hi as parseFileIndex, ii as parseMutationResult, j as FileRecoveryDialog, jr as WorkerPoolTaskCanceledError, k as defaultEditorPreferences, kr as areFilesEqual, kt as defaultReviewPosition, l as projectStore, li as parseReviewSnapshot, ln as readPreference, m as storedFiles, mi as parseFileDocument, mn as t, ni as maxFileSaveBytes, oi as parseReviewDiff, p as storedDocument, pi as parseFileChange, qr as getResolvedOrResolveLanguage, ri as parseMutationPlan, s as applyFileUpdate, si as parseReviewHistory, ti as parseFileSaveResult, tt as ConversationSidebar, u as saveFiles, ui as parseReviewSource, un as writePreference, v as projectLive, vn as ref, vt as codeCommentCounts, wr as parseFileUpdate, wt as locateCodeConversations, y as routes, z as remainingMutationIntent, zr as hasResolvedThemes, zt as defaultFileView } from "./comment-data-CF2ZV_3k.js";
2
+ import { $ as FileSearchPanel, $r as parseReviewActionResult, A as parseEditorPreferences, Ar as areDiffTargetsEqual, At as defaultReviewView, Br as areThemesEqual, Bt as fileHref, Cr as createCodeAnchor, D as ReviewActionDialog, Dr as renderDiffWithHighlighter, E as FileConflictPanel, Er as isDiffPlainText, F as FileWorkspace, Fr as markWorkerErrorReported, Ft as reviewComparison, Gr as themeResolver, Gt as fileRoutes, Hr as prepareThemeResolution, Ht as readFileLocation, I as defaultFileDestination, Ir as isFilePlainText, It as reviewContextKey, Jr as resolveLanguage, Kr as getThemes, L as fileActionIntent, Lr as renderFileWithHighlighter, Lt as reviewHref, M as FileMutationDialog, Mr as WorkerPoolTerminatedError, Mt as parseReviewSession, N as FileReviewPanel, Nr as WorkerPoolWorkerError, Nt as readReviewLocation, O as FileEditorPanel, Or as areDiffRenderOptionsEqual, P as codeThemes, Pr as isHandledWorkerPoolError, Pt as rememberReviewPosition, Qr as parseReviewActionRecoveries, R as mutationFileView, Rn as jsx, Rr as areFileRenderOptionsEqual, Rt as closeFileTab, St as isCodeConversation, Tr as reviewConflictIdentity, Tt as readConversationLocation, Ur as validateResolvedThemeName, Ut as reconcileFileView, Vr as getSharedHighlighter, Vt as parseFileView, Wr as attachResolvedThemes, Wt as rememberFile, Xr as ResolvedLanguages, Yr as areLanguagesAttached, Zr as parseReviewActionPlan, ai as parseRecoveries, bt as conversationHref, ci as parseReviewRepository, cn as toast, di as parseFileSearchQuery, ei as parseFileSaveRequest, f as storeDocument, fi as parseFileSearchResult, gi as parseFilePath, gn as Text, hi as parseFileIndex, ii as parseMutationResult, j as FileRecoveryDialog, jr as WorkerPoolTaskCanceledError, k as defaultEditorPreferences, kr as areFilesEqual, kt as defaultReviewPosition, l as projectStore, li as parseReviewSnapshot, ln as readPreference, m as storedFiles, mi as parseFileDocument, mn as t, ni as maxFileSaveBytes, oi as parseReviewDiff, p as storedDocument, pi as parseFileChange, qr as getResolvedOrResolveLanguage, ri as parseMutationPlan, s as applyFileUpdate, si as parseReviewHistory, ti as parseFileSaveResult, tt as ConversationSidebar, u as saveFiles, ui as parseReviewSource, un as writePreference, v as projectLive, vn as ref, vt as codeCommentCounts, wr as parseFileUpdate, wt as locateCodeConversations, y as routes, z as remainingMutationIntent, zr as hasResolvedThemes, zt as defaultFileView } from "./comment-data-Cn5y2VxV.js";
3
3
  import { B as DEFAULT_THEMES, C as getFiletypeFromFileName, S as getCustomExtensionsVersion, x as getCustomExtensionsMap } from "./cloneFileDiffMetadata-C1BcNpxN.js";
4
4
  import { t as require_lru } from "./lru-C0_oUet4.js";
5
- import { n as createProjectComments, t as defineScreen } from "./screen-CKp2C7kx.js";
6
- import { t as ProjectThreadLinks } from "./project-thread-links-BRLgByEe.js";
5
+ import { n as createProjectComments, t as defineScreen } from "./screen-CfdC3NbR.js";
6
+ import { t as ProjectThreadLinks } from "./project-thread-links-BZXQ200n.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 { Kt as pageRoutes, Pn as Fragment, Qt as Spinner, Rn as jsx, Zi as array, Zt as Loader, _i as MAX_CANVAS_Y, _t as PagesWorkspace, aa as object, ca as parseSafe, gn as Text, ia as number, in as IconButton, l as projectStore, la as string, ln as readPreference, mn as t, oa as optional, rn as Select, un as writePreference, vn as ref, xn as on } from "./comment-data-CF2ZV_3k.js";
1
+ import { Kt as pageRoutes, Pn as Fragment, Qt as Spinner, Rn as jsx, Zi as array, Zt as Loader, _i as MAX_CANVAS_Y, _t as PagesWorkspace, aa as object, ca as parseSafe, gn as Text, ia as number, in as IconButton, l as projectStore, la as string, ln as readPreference, mn as t, oa as optional, rn as Select, un as writePreference, vn as ref, xn as on } from "./comment-data-Cn5y2VxV.js";
2
2
  import { n as workspaceTab, t as followWorkspaceTab } from "../hosted.js";
3
- import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-BT97J9i7.js";
4
- import { n as createProjectComments, t as defineScreen } from "./screen-CKp2C7kx.js";
3
+ import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-DlCWmfRo.js";
4
+ import { n as createProjectComments, t as defineScreen } from "./screen-CfdC3NbR.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 { Jn as parsePreviewBranch, Qi as boolean, Qn as parsePreviewPins, S as writeRows, Zi as array, aa as object, b as plainRow, c as previewKey, ca as parseSafe, ia as number, l as projectStore, la as string, mn as t, qn as parsePreview, ra as nullable, ta as enum_, v as projectLive, vi as parseElementAnchor, y as routes } from "./comment-data-CF2ZV_3k.js";
1
+ import { Jn as parsePreviewBranch, Qi as boolean, Qn as parsePreviewPins, S as writeRows, Zi as array, aa as object, b as plainRow, c as previewKey, ca as parseSafe, ia as number, l as projectStore, la as string, mn as t, qn as parsePreview, ra as nullable, ta as enum_, v as projectLive, vi as parseElementAnchor, y as routes } from "./comment-data-Cn5y2VxV.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, Di as parseWorkItemRef, Dt as taskHref, Fi as valueByRole, Pn as Fragment, Rn as jsx, _ as requestComments, fr as parseThread, in as IconButton, mn as t, vn as ref, vr as parseThreadLinkInput, w as ThreadTaskPicker, xn as on, y as routes, yi as parseWorkWorkspace } from "./comment-data-CF2ZV_3k.js";
2
- import { n as requestTasks } from "./tasks-request-DZob623r.js";
1
+ import { C as ThreadTaskLinks, Di as parseWorkItemRef, Dt as taskHref, Fi as valueByRole, Pn as Fragment, Rn as jsx, _ as requestComments, fr as parseThread, in as IconButton, mn as t, vn as ref, vr as parseThreadLinkInput, w as ThreadTaskPicker, xn as on, y as routes, yi as parseWorkWorkspace } from "./comment-data-Cn5y2VxV.js";
2
+ import { n as requestTasks } from "./tasks-request-CFPLvLc7.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 { S as writeRows, _ as requestComments, a as saveThreads, ar as predictThreadStatus, b as plainRow, br as parseThreadSnapshot, cn as toast, fr as parseThread, g as CommentsRequestError, gr as parseThreadId, hr as parseThreadFilter, i as saveThread, ir as predictThreadReply, l as projectStore, mn as t, n as unavailableComments, nr as predictThreadCreate, o as threadMatches, rr as predictThreadDelete, x as writeOptimistically, y as routes } from "./comment-data-CF2ZV_3k.js";
1
+ import { S as writeRows, _ as requestComments, a as saveThreads, ar as predictThreadStatus, b as plainRow, br as parseThreadSnapshot, cn as toast, fr as parseThread, g as CommentsRequestError, gr as parseThreadId, hr as parseThreadFilter, i as saveThread, ir as predictThreadReply, l as projectStore, mn as t, n as unavailableComments, nr as predictThreadCreate, o as threadMatches, rr as predictThreadDelete, x as writeOptimistically, y as routes } from "./comment-data-Cn5y2VxV.js";
2
2
  //#region app/client/project-comments.ts
3
3
  var viewers = /* @__PURE__ */ new Map();
4
4
  function parseViewer(value) {
@@ -233,6 +233,10 @@ function createProjectComments(options) {
233
233
  if (!detailFailures.size) error = "";
234
234
  }
235
235
  } catch (cause) {
236
+ if (!signal.aborted && turn === generation && cause instanceof CommentsRequestError && cause.code === "not-found") {
237
+ await forget(id);
238
+ return;
239
+ }
236
240
  if (!signal.aborted && turn === generation) {
237
241
  detailFailures.add(id);
238
242
  error = cause instanceof Error ? cause.message : t("app.client.projectComments.couldNotLoadDiscussion");
@@ -1,8 +1,8 @@
1
- import { $t as Button, B as TaskWorkspace, C as ThreadTaskLinks, Dt as taskHref, Et as selectedTask, Jt as CommentThreadDetail, Mi as parseWorkSyncResult, Oi as parseWorkMutationResult, Ot as taskRole, Pn as Fragment, Rn as jsx, S as writeRows, T as ItemDiscussion, Ti as parseWorkDetail, Tt as readConversationLocation, Xt as CommentComposer, Yt as CommentThreadItem, b as plainRow, bi as parseSectionData, cn as toast, cr as predictWorkUpdate, gn as Text, h as storedWorkspace, l as projectStore, mn as t, nt as CommentThreadHeading, or as predictWorkAction, qt as taskRoutes, sr as predictWorkCreate, vn as ref, x as writeOptimistically, xn as on, xt as conversationLabel, y as routes } from "./comment-data-CF2ZV_3k.js";
2
- import { n as requestTasks, t as TaskRequestError } from "./tasks-request-DZob623r.js";
1
+ import { $t as Button, B as TaskWorkspace, C as ThreadTaskLinks, Dt as taskHref, Et as selectedTask, Jt as CommentThreadDetail, Mi as parseWorkSyncResult, Oi as parseWorkMutationResult, Ot as taskRole, Pn as Fragment, Rn as jsx, S as writeRows, T as ItemDiscussion, Ti as parseWorkDetail, Tt as readConversationLocation, Xt as CommentComposer, Yt as CommentThreadItem, b as plainRow, bi as parseSectionData, cn as toast, cr as predictWorkUpdate, gn as Text, h as storedWorkspace, l as projectStore, mn as t, nt as CommentThreadHeading, or as predictWorkAction, qt as taskRoutes, sr as predictWorkCreate, vn as ref, x as writeOptimistically, xn as on, xt as conversationLabel, y as routes } from "./comment-data-Cn5y2VxV.js";
2
+ import { n as requestTasks, t as TaskRequestError } from "./tasks-request-CFPLvLc7.js";
3
3
  import { r as projectWork } from "../hosted.js";
4
- import { i as loadItemComments, n as createProjectComments, t as defineScreen } from "./screen-CKp2C7kx.js";
5
- import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-BRLgByEe.js";
4
+ import { i as loadItemComments, n as createProjectComments, t as defineScreen } from "./screen-CfdC3NbR.js";
5
+ import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-BZXQ200n.js";
6
6
  //#region app/client/task-discussion.tsx
7
7
  /**
8
8
  * Owns a task's filtered discussions and lazy detail requests within its mounted lifetime.
@@ -1,4 +1,4 @@
1
- import { Bn as createMultiMatcher, Di as parseWorkItemRef, ki as parseWorkQuery, mn as t, y as routes } from "./comment-data-CF2ZV_3k.js";
1
+ import { Bn as createMultiMatcher, Di as parseWorkItemRef, ki as parseWorkQuery, mn as t, y as routes } from "./comment-data-Cn5y2VxV.js";
2
2
  //#region app/client/tasks-request.ts
3
3
  var reads = createMultiMatcher();
4
4
  var writes = createMultiMatcher();
@@ -1,5 +1,5 @@
1
- import { $i as createSchema, $n as parsePreviewViewport, $t as Button, Ai as parseWorkSnapshot, An as normalizeAttributeName, Bi as withoutMessages, Bn as createMultiMatcher, Ci as parseWorkConnection, Cn as composeMixedProps, Ct as legacyConversationHref, Di as parseWorkItemRef, Dn as FRAMEWORK_PROPS, Dt as taskHref, Ei as parseWorkItem, En as isEntry, Et as selectedTask, Fi as valueByRole, Fn as Frame, G as mergeThreads, Gi as identifier$3, Gn as PREVIEW_THUMBNAIL_WIDTHS, Gt as fileRoutes, Hi as parseWorkSchema, Hn as joinPatterns, Ii as messageDeletionRefusal, In as createComponent, J as conversationId, Ji as record$1, Jn as parsePreviewBranch, K as stableJson, Ki as nonempty$1, Kn as PREVIEW_TILE_HEIGHT, Kt as pageRoutes, Li as messageDeletionRefusals, Ln as createFrameHandle, Mi as parseWorkSyncResult, Mn as serializeStyleObject, Ni as parseWorkUpdate, Nn as shouldStringifyBooleanAttribute, Oi as parseWorkMutationResult, On as SELF_CLOSING_TAGS, Pi as parseWorkValue, Pn as Fragment, Q as text$6, Qi as boolean$2, Qn as parsePreviewPins, Ri as parseMessage, Rn as jsx, S as writeRows, Si as parseWorkActivity, Sn as normalizeUnsafeHTMLProps, Sr as parseThreadStatusInput, Ti as parseWorkDetail, Tn as clientEntry, Tt as readConversationLocation, Ui as statusCategory, Un as RoutePattern, V as parseTaskDesign, Vi as fieldByRole, Vn as equal, W as CommentMergeError, Wi as WorkValidationError, Wn as MAX_PREVIEW_HEIGHT, X as parseCommentThread, Xi as any, Xn as parsePreviewHash, Y as object$2, Yi as strict$2, Yn as parsePreviewCapture, Z as revision$2, Zi as array$2, Zn as parsePreviewId, Zt as Loader, _ as requestComments, _i as MAX_CANVAS_Y, _r as parseThreadInput, aa as object$1, an as LiveStatus, at as FieldCardHeader, b as plainRow, bi as parseSectionData, bn as stripFlushMarkers, br as parseThreadSnapshot, ca as parseSafe, ct as initialShellTabs, d as saveWorkspace, dn as hasMessage, dr as parseAnchor, dt as readTabsCookie, ea as defaulted, er as RESYNC, fn as isLocale, fr as parseThread, ft as stepShellTab, gn as Text, gr as parseThreadId, gt as visitShellTab, hn as useLocaleSource, hr as parseThreadFilter, ht as tabsCookieValue, ia as number$2, it as FieldCardContent, ji as parseWorkSync, jn as sanitizeUrlAttribute, jt as legacyFileHref, ki as parseWorkQuery, kn as isAllowedHostPropName, l as projectStore, la as string$2, ln as readPreference, lr as parseWorkChange, lt as openShellTab, mn as t, mr as parseThreadDeleteInput, mt as tabsCookieName, n as unavailableComments, na as fail$11, nn as ShellTabBar, oa as optional$3, ot as activeTab, pn as locale, pr as parseThreadCapabilities, pt as tabHref, q as parseCommentInput$1, qi as parseWork, qt as taskRoutes, r as followThreads, rt as FieldCard, sa as parse, sn as AppShell, st as closeShellTab, t as commentsUnavailable, ta as enum_, tr as parseLiveId, un as writePreference, ur as MAX_THREADS, ut as parseShellTabs, v as projectLive, vi as parseElementAnchor, vn as ref$1, vr as parseThreadLinkInput, wi as parseWorkCreate, wn as resolveMixDescriptors, xi as parseWorkActionInput, xn as on, xr as parseThreadStatus, y as routes, yi as parseWorkWorkspace, yn as appendFlushMarker, yr as parseThreadReplyInput, yt as conversationDestination, zi as parseMessageAuthor, zn as Route } from "./assets/comment-data-CF2ZV_3k.js";
2
- import { n as requestTasks } from "./assets/tasks-request-DZob623r.js";
1
+ import { $i as createSchema, $n as parsePreviewViewport, $t as Button, Ai as parseWorkSnapshot, An as normalizeAttributeName, Bi as withoutMessages, Bn as createMultiMatcher, Ci as parseWorkConnection, Cn as composeMixedProps, Ct as legacyConversationHref, Di as parseWorkItemRef, Dn as FRAMEWORK_PROPS, Dt as taskHref, Ei as parseWorkItem, En as isEntry, Et as selectedTask, Fi as valueByRole, Fn as Frame, G as mergeThreads, Gi as identifier$3, Gn as PREVIEW_THUMBNAIL_WIDTHS, Gt as fileRoutes, Hi as parseWorkSchema, Hn as joinPatterns, Ii as messageDeletionRefusal, In as createComponent, J as conversationId, Ji as record$1, Jn as parsePreviewBranch, K as stableJson, Ki as nonempty$1, Kn as PREVIEW_TILE_HEIGHT, Kt as pageRoutes, Li as messageDeletionRefusals, Ln as createFrameHandle, Mi as parseWorkSyncResult, Mn as serializeStyleObject, Ni as parseWorkUpdate, Nn as shouldStringifyBooleanAttribute, Oi as parseWorkMutationResult, On as SELF_CLOSING_TAGS, Pi as parseWorkValue, Pn as Fragment, Q as text$6, Qi as boolean$2, Qn as parsePreviewPins, Ri as parseMessage, Rn as jsx, S as writeRows, Si as parseWorkActivity, Sn as normalizeUnsafeHTMLProps, Sr as parseThreadStatusInput, Ti as parseWorkDetail, Tn as clientEntry, Tt as readConversationLocation, Ui as statusCategory, Un as RoutePattern, V as parseTaskDesign, Vi as fieldByRole, Vn as equal, W as CommentMergeError, Wi as WorkValidationError, Wn as MAX_PREVIEW_HEIGHT, X as parseCommentThread, Xi as any, Xn as parsePreviewHash, Y as object$2, Yi as strict$2, Yn as parsePreviewCapture, Z as revision$2, Zi as array$2, Zn as parsePreviewId, Zt as Loader, _ as requestComments, _i as MAX_CANVAS_Y, _r as parseThreadInput, aa as object$1, an as LiveStatus, at as FieldCardHeader, b as plainRow, bi as parseSectionData, bn as stripFlushMarkers, br as parseThreadSnapshot, ca as parseSafe, ct as initialShellTabs, d as saveWorkspace, dn as hasMessage, dr as parseAnchor, dt as readTabsCookie, ea as defaulted, er as RESYNC, fn as isLocale, fr as parseThread, ft as stepShellTab, gn as Text, gr as parseThreadId, gt as visitShellTab, hn as useLocaleSource, hr as parseThreadFilter, ht as tabsCookieValue, ia as number$2, it as FieldCardContent, ji as parseWorkSync, jn as sanitizeUrlAttribute, jt as legacyFileHref, ki as parseWorkQuery, kn as isAllowedHostPropName, l as projectStore, la as string$2, ln as readPreference, lr as parseWorkChange, lt as openShellTab, mn as t, mr as parseThreadDeleteInput, mt as tabsCookieName, n as unavailableComments, na as fail$11, nn as ShellTabBar, oa as optional$3, ot as activeTab, pn as locale, pr as parseThreadCapabilities, pt as tabHref, q as parseCommentInput$1, qi as parseWork, qt as taskRoutes, r as followThreads, rt as FieldCard, sa as parse, sn as AppShell, st as closeShellTab, t as commentsUnavailable, ta as enum_, tr as parseLiveId, un as writePreference, ur as MAX_THREADS, ut as parseShellTabs, v as projectLive, vi as parseElementAnchor, vn as ref$1, vr as parseThreadLinkInput, wi as parseWorkCreate, wn as resolveMixDescriptors, xi as parseWorkActionInput, xn as on, xr as parseThreadStatus, y as routes, yi as parseWorkWorkspace, yn as appendFlushMarker, yr as parseThreadReplyInput, yt as conversationDestination, zi as parseMessageAuthor, zn as Route } from "./assets/comment-data-Cn5y2VxV.js";
2
+ import { n as requestTasks } from "./assets/tasks-request-CFPLvLc7.js";
3
3
  import * as Crypto from "node:crypto";
4
4
  import { createHash, randomBytes, randomUUID } from "node:crypto";
5
5
  import * as Path from "node:path";
@@ -38884,10 +38884,10 @@ function ProjectLiveStatus(handle) {
38884
38884
  //#endregion
38885
38885
  //#region app/client/screens.ts
38886
38886
  var builtIns = {
38887
- "bud:pages": () => import("./assets/pages-BzjzeuPu.js"),
38888
- "bud:canvas": () => import("./assets/canvas-V36732ER.js"),
38889
- "bud:tasks": () => import("./assets/tasks-Dj7AyBJB.js"),
38890
- "bud:files": () => import("./assets/files-DjSCjfU7.js")
38887
+ "bud:pages": () => import("./assets/pages-B0ZlVdci.js"),
38888
+ "bud:canvas": () => import("./assets/canvas-BYTOp1p7.js"),
38889
+ "bud:tasks": () => import("./assets/tasks-_yKh2Z6q.js"),
38890
+ "bud:files": () => import("./assets/files-B1P2_24q.js")
38891
38891
  };
38892
38892
  /**
38893
38893
  * Imports a screen module: a built-in by its key, any other by the URL the server gave it.
@@ -3853,10 +3853,6 @@ var de = {
3853
3853
  text: "Leinwand verschieben",
3854
3854
  source: "233eddf0"
3855
3855
  },
3856
- "canvas.canvasWorkspace.reload": {
3857
- text: "Neu laden",
3858
- source: "1a43a2ac"
3859
- },
3860
3856
  "canvas.canvasWorkspace.savingComments": {
3861
3857
  text: "Kommentare werden gespeichert",
3862
3858
  source: "1f15fbfb"
@@ -7950,7 +7946,6 @@ var en = {
7950
7946
  "canvas.canvasWorkspace.interactWithPages": "Interact with pages",
7951
7947
  "canvas.canvasWorkspace.newComment": "New comment",
7952
7948
  "canvas.canvasWorkspace.panCanvas": "Pan canvas",
7953
- "canvas.canvasWorkspace.reload": "Reload",
7954
7949
  "canvas.canvasWorkspace.savingComments": "Saving comments",
7955
7950
  "canvas.canvasWorkspace.showDarkPages": "Show dark pages",
7956
7951
  "canvas.canvasWorkspace.showFullPages": "Show full pages",
@@ -1,7 +1,7 @@
1
- import { $t as Button, H as CanvasWorkspace, 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 } from "./comment-data-DyIZNpfG.js";
2
- import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-B7HUGiVK.js";
3
- import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-CZXWJEds.js";
4
- import { t as ProjectThreadLinks } from "./project-thread-links-CauJF0Cz.js";
1
+ import { $t as Button, H as CanvasWorkspace, 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 } from "./comment-data-yfWEdDQL.js";
2
+ import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-D7rVCxQX.js";
3
+ import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-DapOVrga.js";
4
+ import { t as ProjectThreadLinks } from "./project-thread-links-m-OLpsD9.js";
5
5
  import { on, ref } from "remix/component";
6
6
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
7
7
  //#region app/client/preview-image.tsx
@@ -41890,10 +41890,6 @@ var de = {
41890
41890
  text: "Leinwand verschieben",
41891
41891
  source: "233eddf0"
41892
41892
  },
41893
- "canvas.canvasWorkspace.reload": {
41894
- text: "Neu laden",
41895
- source: "1a43a2ac"
41896
- },
41897
41893
  "canvas.canvasWorkspace.savingComments": {
41898
41894
  text: "Kommentare werden gespeichert",
41899
41895
  source: "1f15fbfb"
@@ -45987,7 +45983,6 @@ var en = {
45987
45983
  "canvas.canvasWorkspace.interactWithPages": "Interact with pages",
45988
45984
  "canvas.canvasWorkspace.newComment": "New comment",
45989
45985
  "canvas.canvasWorkspace.panCanvas": "Pan canvas",
45990
- "canvas.canvasWorkspace.reload": "Reload",
45991
45986
  "canvas.canvasWorkspace.savingComments": "Saving comments",
45992
45987
  "canvas.canvasWorkspace.showDarkPages": "Show dark pages",
45993
45988
  "canvas.canvasWorkspace.showFullPages": "Show full pages",
@@ -74888,23 +74883,13 @@ function CanvasWorkspace(handle) {
74888
74883
  if (zoomLabel) zoomLabel.textContent = `${Math.round(scale * 100)}%`;
74889
74884
  }
74890
74885
  }),
74891
- handle.props.error || handle.props.commentsUnavailable || notice ? /* @__PURE__ */ jsxs("div", {
74892
- role: handle.props.error ? "alert" : "status",
74893
- class: `absolute top-3 left-3 max-w-[calc(100%-24px)] bud-overlay rounded-lg px-3 py-2 ${handle.props.error ? "text-red-500" : "text-muted"}`,
74894
- children: [/* @__PURE__ */ jsx(Text, {
74886
+ handle.props.commentsUnavailable || notice ? /* @__PURE__ */ jsx("div", {
74887
+ role: "status",
74888
+ class: "absolute top-3 left-3 max-w-[calc(100%-24px)] bud-overlay rounded-lg px-3 py-2 text-muted",
74889
+ children: /* @__PURE__ */ jsx(Text, {
74895
74890
  variant: "ui-caption",
74896
- children: handle.props.error || handle.props.commentsUnavailable || notice
74897
- }), handle.props.error ? /* @__PURE__ */ jsx("button", {
74898
- type: "button",
74899
- class: "ml-2 underline",
74900
- mix: on("click", () => {
74901
- handle.props.onReload?.();
74902
- }),
74903
- children: /* @__PURE__ */ jsx(Text, {
74904
- variant: "ui-caption",
74905
- children: t$2("canvas.canvasWorkspace.reload")
74906
- })
74907
- }) : null]
74891
+ children: handle.props.commentsUnavailable || notice
74892
+ })
74908
74893
  }) : null,
74909
74894
  panel && !handle.props.commentsUnavailable ? /* @__PURE__ */ jsx(ConversationSidebar, {
74910
74895
  threads: handle.props.snapshot.threads,
@@ -1,9 +1,9 @@
1
1
  import { i as __toESM } from "./rolldown-runtime-DktXgydw.js";
2
- import { $ as FileSearchPanel, $n as markWorkerErrorReported, A as parseEditorPreferences, Ar as parseFileSearchResult, At as defaultReviewView, Bt as fileHref, Cr as parseRecoveries, D as ReviewActionDialog, Dr as parseReviewSnapshot, E as FileConflictPanel, Er as parseReviewRepository, F as FileWorkspace, Ft as reviewComparison, Gn as renderDiffWithHighlighter, Gt as fileRoutes, Hn as parseFileUpdate, Ht as readFileLocation, I as defaultFileDestination, It as reviewContextKey, Jn as areDiffTargetsEqual, Kn as areDiffRenderOptionsEqual, L as fileActionIntent, Lt as reviewHref, M as FileMutationDialog, Mr as parseFileDocument, Mt as parseReviewSession, N as FileReviewPanel, Nr as parseFileIndex, Nt as readReviewLocation, O as FileEditorPanel, Or as parseReviewSource, P as codeThemes, Pr as parseFilePath, Pt as rememberReviewPosition, Qn as isHandledWorkerPoolError, R as mutationFileView, Rt as closeFileTab, Sr as parseMutationResult, St as isCodeConversation, Tr as parseReviewHistory, Tt as readConversationLocation, Un as reviewConflictIdentity, Ut as reconcileFileView, Vn as createCodeAnchor, Vt as parseFileView, Wn as isDiffPlainText, Wt as rememberFile, Xn as WorkerPoolTerminatedError, Yn as WorkerPoolTaskCanceledError, Zn as WorkerPoolWorkerError, _r as parseReviewActionResult, ar as getSharedHighlighter, br as maxFileSaveBytes, bt as conversationHref, cn as toast, cr as attachResolvedThemes, dr as getResolvedOrResolveLanguage, er as isFilePlainText, f as storeDocument, fr as resolveLanguage, gn as Text, gr as parseReviewActionRecoveries, hr as parseReviewActionPlan, ir as areThemesEqual, j as FileRecoveryDialog, jr as parseFileChange, k as defaultEditorPreferences, kr as parseFileSearchQuery, kt as defaultReviewPosition, l as projectStore, ln as readPreference, lr as themeResolver, m as storedFiles, mn as t, mr as ResolvedLanguages, nr as areFileRenderOptionsEqual, or as prepareThemeResolution, p as storedDocument, pr as areLanguagesAttached, qn as areFilesEqual, rr as hasResolvedThemes, s as applyFileUpdate, sr as validateResolvedThemeName, tr as renderFileWithHighlighter, tt as ConversationSidebar, u as saveFiles, un as writePreference, ur as getThemes, v as projectLive, vr as parseFileSaveRequest, vt as codeCommentCounts, wr as parseReviewDiff, wt as locateCodeConversations, xr as parseMutationPlan, y as routes, yr as parseFileSaveResult, z as remainingMutationIntent, zt as defaultFileView } from "./comment-data-DyIZNpfG.js";
2
+ import { $ as FileSearchPanel, $n as markWorkerErrorReported, A as parseEditorPreferences, Ar as parseFileSearchResult, At as defaultReviewView, Bt as fileHref, Cr as parseRecoveries, D as ReviewActionDialog, Dr as parseReviewSnapshot, E as FileConflictPanel, Er as parseReviewRepository, F as FileWorkspace, Ft as reviewComparison, Gn as renderDiffWithHighlighter, Gt as fileRoutes, Hn as parseFileUpdate, Ht as readFileLocation, I as defaultFileDestination, It as reviewContextKey, Jn as areDiffTargetsEqual, Kn as areDiffRenderOptionsEqual, L as fileActionIntent, Lt as reviewHref, M as FileMutationDialog, Mr as parseFileDocument, Mt as parseReviewSession, N as FileReviewPanel, Nr as parseFileIndex, Nt as readReviewLocation, O as FileEditorPanel, Or as parseReviewSource, P as codeThemes, Pr as parseFilePath, Pt as rememberReviewPosition, Qn as isHandledWorkerPoolError, R as mutationFileView, Rt as closeFileTab, Sr as parseMutationResult, St as isCodeConversation, Tr as parseReviewHistory, Tt as readConversationLocation, Un as reviewConflictIdentity, Ut as reconcileFileView, Vn as createCodeAnchor, Vt as parseFileView, Wn as isDiffPlainText, Wt as rememberFile, Xn as WorkerPoolTerminatedError, Yn as WorkerPoolTaskCanceledError, Zn as WorkerPoolWorkerError, _r as parseReviewActionResult, ar as getSharedHighlighter, br as maxFileSaveBytes, bt as conversationHref, cn as toast, cr as attachResolvedThemes, dr as getResolvedOrResolveLanguage, er as isFilePlainText, f as storeDocument, fr as resolveLanguage, gn as Text, gr as parseReviewActionRecoveries, hr as parseReviewActionPlan, ir as areThemesEqual, j as FileRecoveryDialog, jr as parseFileChange, k as defaultEditorPreferences, kr as parseFileSearchQuery, kt as defaultReviewPosition, l as projectStore, ln as readPreference, lr as themeResolver, m as storedFiles, mn as t, mr as ResolvedLanguages, nr as areFileRenderOptionsEqual, or as prepareThemeResolution, p as storedDocument, pr as areLanguagesAttached, qn as areFilesEqual, rr as hasResolvedThemes, s as applyFileUpdate, sr as validateResolvedThemeName, tr as renderFileWithHighlighter, tt as ConversationSidebar, u as saveFiles, un as writePreference, ur as getThemes, v as projectLive, vr as parseFileSaveRequest, vt as codeCommentCounts, wr as parseReviewDiff, wt as locateCodeConversations, xr as parseMutationPlan, y as routes, yr as parseFileSaveResult, z as remainingMutationIntent, zt as defaultFileView } from "./comment-data-yfWEdDQL.js";
3
3
  import { B as DEFAULT_THEMES, C as getFiletypeFromFileName, S as getCustomExtensionsVersion, x as getCustomExtensionsMap } from "./cloneFileDiffMetadata-C1BcNpxN.js";
4
4
  import { t as require_lru } from "./lru-C0_oUet4.js";
5
- import { n as createProjectComments, t as defineScreen } from "./screen-CZXWJEds.js";
6
- import { t as ProjectThreadLinks } from "./project-thread-links-CauJF0Cz.js";
5
+ import { n as createProjectComments, t as defineScreen } from "./screen-DapOVrga.js";
6
+ import { t as ProjectThreadLinks } from "./project-thread-links-m-OLpsD9.js";
7
7
  import { ref } from "remix/component";
8
8
  import { jsx, jsxs } from "remix/component/jsx-runtime";
9
9
  //#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
@@ -1,7 +1,7 @@
1
- import { Fr as MAX_CANVAS_Y, Kt as pageRoutes, Qt as Spinner, Zt as Loader, _t as PagesWorkspace, gn as Text, in as IconButton, l as projectStore, ln as readPreference, mn as t, rn as Select, un as writePreference } from "./comment-data-DyIZNpfG.js";
1
+ import { Fr as MAX_CANVAS_Y, Kt as pageRoutes, Qt as Spinner, Zt as Loader, _t as PagesWorkspace, gn as Text, in as IconButton, l as projectStore, ln as readPreference, mn as t, rn as Select, un as writePreference } from "./comment-data-yfWEdDQL.js";
2
2
  import { n as workspaceTab, t as followWorkspaceTab } from "../node-host.js";
3
- import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-B7HUGiVK.js";
4
- import { n as createProjectComments, t as defineScreen } from "./screen-CZXWJEds.js";
3
+ import { n as createProjectPreviews, r as locatePreview, t as createProjectBranches } from "./project-branches-D7rVCxQX.js";
4
+ import { n as createProjectComments, t as defineScreen } from "./screen-DapOVrga.js";
5
5
  import { array, number, object, optional, parseSafe, string } from "remix/data-schema";
6
6
  import { on, ref } from "remix/component";
7
7
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { Ir as parseElementAnchor, S as writeRows, Si as parsePreviewPins, _i as parsePreview, b as plainRow, c as previewKey, l as projectStore, mn as t, v as projectLive, vi as parsePreviewBranch, y as routes } from "./comment-data-DyIZNpfG.js";
1
+ import { Ir as parseElementAnchor, S as writeRows, Si as parsePreviewPins, _i as parsePreview, b as plainRow, c as previewKey, l as projectStore, mn as t, v as projectLive, vi as parsePreviewBranch, y as routes } from "./comment-data-yfWEdDQL.js";
2
2
  import { array, boolean, enum_, nullable, number, object, parseSafe, string } from "remix/data-schema";
3
3
  //#region app/client/project-previews.ts
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { $r as valueByRole, An as parseThread, C as ThreadTaskLinks, Dt as taskHref, Gr as parseWorkItemRef, In as parseThreadLinkInput, Lr as parseWorkWorkspace, _ as requestComments, in as IconButton, mn as t, w as ThreadTaskPicker, y as routes } from "./comment-data-DyIZNpfG.js";
2
- import { n as requestTasks } from "./tasks-request-ZWmbc8fE.js";
1
+ import { $r as valueByRole, An as parseThread, C as ThreadTaskLinks, Dt as taskHref, Gr as parseWorkItemRef, In as parseThreadLinkInput, Lr as parseWorkWorkspace, _ as requestComments, in as IconButton, mn as t, w as ThreadTaskPicker, y as routes } from "./comment-data-yfWEdDQL.js";
2
+ import { n as requestTasks } from "./tasks-request-B0aeNocI.js";
3
3
  import { on, ref } from "remix/component";
4
4
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
5
5
  //#region app/client/project-task-picker.tsx
@@ -1,4 +1,4 @@
1
- import { An as parseThread, Cn as predictThreadStatus, Nn as parseThreadFilter, Pn as parseThreadId, Rn as parseThreadSnapshot, S as writeRows, Sn as predictThreadReply, _ as requestComments, a as saveThreads, b as plainRow, bn as predictThreadCreate, cn as toast, g as CommentsRequestError, i as saveThread, l as projectStore, mn as t, n as unavailableComments, o as threadMatches, x as writeOptimistically, xn as predictThreadDelete, y as routes } from "./comment-data-DyIZNpfG.js";
1
+ import { An as parseThread, Cn as predictThreadStatus, Nn as parseThreadFilter, Pn as parseThreadId, Rn as parseThreadSnapshot, S as writeRows, Sn as predictThreadReply, _ as requestComments, a as saveThreads, b as plainRow, bn as predictThreadCreate, cn as toast, g as CommentsRequestError, i as saveThread, l as projectStore, mn as t, n as unavailableComments, o as threadMatches, x as writeOptimistically, xn as predictThreadDelete, y as routes } from "./comment-data-yfWEdDQL.js";
2
2
  //#region app/client/project-comments.ts
3
3
  var viewers = /* @__PURE__ */ new Map();
4
4
  function parseViewer(value) {
@@ -233,6 +233,10 @@ function createProjectComments(options) {
233
233
  if (!detailFailures.size) error = "";
234
234
  }
235
235
  } catch (cause) {
236
+ if (!signal.aborted && turn === generation && cause instanceof CommentsRequestError && cause.code === "not-found") {
237
+ await forget(id);
238
+ return;
239
+ }
236
240
  if (!signal.aborted && turn === generation) {
237
241
  detailFailures.add(id);
238
242
  error = cause instanceof Error ? cause.message : t("app.client.projectComments.couldNotLoadDiscussion");
@@ -1,8 +1,8 @@
1
- import { $t as Button, B as TaskWorkspace, C as ThreadTaskLinks, Dt as taskHref, En as predictWorkUpdate, Et as selectedTask, Jt as CommentThreadDetail, Kr as parseWorkMutationResult, Ot as taskRole, Rr as parseSectionData, S as writeRows, T as ItemDiscussion, Tn as predictWorkCreate, Tt as readConversationLocation, Ur as parseWorkDetail, Xr as parseWorkSyncResult, Xt as CommentComposer, Yt as CommentThreadItem, b as plainRow, cn as toast, gn as Text, h as storedWorkspace, l as projectStore, mn as t, nt as CommentThreadHeading, qt as taskRoutes, wn as predictWorkAction, x as writeOptimistically, xt as conversationLabel, y as routes } from "./comment-data-DyIZNpfG.js";
2
- import { n as requestTasks, t as TaskRequestError } from "./tasks-request-ZWmbc8fE.js";
1
+ import { $t as Button, B as TaskWorkspace, C as ThreadTaskLinks, Dt as taskHref, En as predictWorkUpdate, Et as selectedTask, Jt as CommentThreadDetail, Kr as parseWorkMutationResult, Ot as taskRole, Rr as parseSectionData, S as writeRows, T as ItemDiscussion, Tn as predictWorkCreate, Tt as readConversationLocation, Ur as parseWorkDetail, Xr as parseWorkSyncResult, Xt as CommentComposer, Yt as CommentThreadItem, b as plainRow, cn as toast, gn as Text, h as storedWorkspace, l as projectStore, mn as t, nt as CommentThreadHeading, qt as taskRoutes, wn as predictWorkAction, x as writeOptimistically, xt as conversationLabel, y as routes } from "./comment-data-yfWEdDQL.js";
2
+ import { n as requestTasks, t as TaskRequestError } from "./tasks-request-B0aeNocI.js";
3
3
  import { r as projectWork } from "../node-host.js";
4
- import { i as loadItemComments, n as createProjectComments, t as defineScreen } from "./screen-CZXWJEds.js";
5
- import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-CauJF0Cz.js";
4
+ import { i as loadItemComments, n as createProjectComments, t as defineScreen } from "./screen-DapOVrga.js";
5
+ import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-m-OLpsD9.js";
6
6
  import { on, ref } from "remix/component";
7
7
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
8
8
  //#region app/client/task-discussion.tsx
@@ -1,4 +1,4 @@
1
- import { Gr as parseWorkItemRef, mn as t, qr as parseWorkQuery, y as routes } from "./comment-data-DyIZNpfG.js";
1
+ import { Gr as parseWorkItemRef, mn as t, qr as parseWorkQuery, y as routes } from "./comment-data-yfWEdDQL.js";
2
2
  import { createMultiMatcher } from "remix/route-pattern/match";
3
3
  //#region app/client/tasks-request.ts
4
4
  var reads = createMultiMatcher();
@@ -1,5 +1,5 @@
1
- import { $r as valueByRole, $t as Button, An as parseThread, Bn as parseThreadStatusInput, Br as parseWorkActivity, Ci as parsePreviewViewport, Ct as legacyConversationHref, Dn as parseWorkChange, Dt as taskHref, Et as selectedTask, Fn as parseThreadInput, Fr as MAX_CANVAS_Y, G as mergeThreads, Gr as parseWorkItemRef, Gt as fileRoutes, Hr as parseWorkCreate, In as parseThreadLinkInput, Ir as parseElementAnchor, J as conversationId, Jr as parseWorkSnapshot, K as stableJson, Kr as parseWorkMutationResult, Kt as pageRoutes, Ln as parseThreadReplyInput, Lr as parseWorkWorkspace, Mn as parseThreadDeleteInput, Nn as parseThreadFilter, On as MAX_THREADS, Pn as parseThreadId, Q as text$6, Qr as parseWorkValue, Rn as parseThreadSnapshot, Rr as parseSectionData, S as writeRows, Si as parsePreviewPins, Tt as readConversationLocation, Ur as parseWorkDetail, V as parseTaskDesign, Vr as parseWorkConnection, W as CommentMergeError, Wr as parseWorkItem, X as parseCommentThread, Xr as parseWorkSyncResult, Y as object$2, Yr as parseWorkSync, Z as revision$2, Zr as parseWorkUpdate, Zt as Loader, _ as requestComments, ai as fieldByRole, an as LiveStatus, at as FieldCardHeader, b as plainRow, bi as parsePreviewHash, ci as WorkValidationError, ct as initialShellTabs, d as saveWorkspace, di as parseWork, dn as hasMessage, dt as readTabsCookie, ei as messageDeletionRefusal, fi as record$2, fn as isLocale, ft as stepShellTab, gi as PREVIEW_TILE_HEIGHT, gn as Text, gt as visitShellTab, hi as PREVIEW_THUMBNAIL_WIDTHS, hn as useLocaleSource, ht as tabsCookieValue, ii as withoutMessages, it as FieldCardContent, jn as parseThreadCapabilities, jt as legacyFileHref, kn as parseAnchor, l as projectStore, li as identifier$3, ln as readPreference, lt as openShellTab, mi as MAX_PREVIEW_HEIGHT, mn as t, mt as tabsCookieName, n as unavailableComments, ni as parseMessage, nn as ShellTabBar, oi as parseWorkSchema, ot as activeTab, pi as strict$2, pn as locale, pt as tabHref, q as parseCommentInput$1, qr as parseWorkQuery, qt as taskRoutes, r as followThreads, ri as parseMessageAuthor, rt as FieldCard, si as statusCategory, sn as AppShell, st as closeShellTab, t as commentsUnavailable, ti as messageDeletionRefusals, ui as nonempty$1, un as writePreference, ut as parseShellTabs, v as projectLive, vi as parsePreviewBranch, vn as RESYNC, xi as parsePreviewId, y as routes, yi as parsePreviewCapture, yn as parseLiveId, yt as conversationDestination, zn as parseThreadStatus, zr as parseWorkActionInput } from "./assets/comment-data-DyIZNpfG.js";
2
- import { n as requestTasks } from "./assets/tasks-request-ZWmbc8fE.js";
1
+ import { $r as valueByRole, $t as Button, An as parseThread, Bn as parseThreadStatusInput, Br as parseWorkActivity, Ci as parsePreviewViewport, Ct as legacyConversationHref, Dn as parseWorkChange, Dt as taskHref, Et as selectedTask, Fn as parseThreadInput, Fr as MAX_CANVAS_Y, G as mergeThreads, Gr as parseWorkItemRef, Gt as fileRoutes, Hr as parseWorkCreate, In as parseThreadLinkInput, Ir as parseElementAnchor, J as conversationId, Jr as parseWorkSnapshot, K as stableJson, Kr as parseWorkMutationResult, Kt as pageRoutes, Ln as parseThreadReplyInput, Lr as parseWorkWorkspace, Mn as parseThreadDeleteInput, Nn as parseThreadFilter, On as MAX_THREADS, Pn as parseThreadId, Q as text$6, Qr as parseWorkValue, Rn as parseThreadSnapshot, Rr as parseSectionData, S as writeRows, Si as parsePreviewPins, Tt as readConversationLocation, Ur as parseWorkDetail, V as parseTaskDesign, Vr as parseWorkConnection, W as CommentMergeError, Wr as parseWorkItem, X as parseCommentThread, Xr as parseWorkSyncResult, Y as object$2, Yr as parseWorkSync, Z as revision$2, Zr as parseWorkUpdate, Zt as Loader, _ as requestComments, ai as fieldByRole, an as LiveStatus, at as FieldCardHeader, b as plainRow, bi as parsePreviewHash, ci as WorkValidationError, ct as initialShellTabs, d as saveWorkspace, di as parseWork, dn as hasMessage, dt as readTabsCookie, ei as messageDeletionRefusal, fi as record$2, fn as isLocale, ft as stepShellTab, gi as PREVIEW_TILE_HEIGHT, gn as Text, gt as visitShellTab, hi as PREVIEW_THUMBNAIL_WIDTHS, hn as useLocaleSource, ht as tabsCookieValue, ii as withoutMessages, it as FieldCardContent, jn as parseThreadCapabilities, jt as legacyFileHref, kn as parseAnchor, l as projectStore, li as identifier$3, ln as readPreference, lt as openShellTab, mi as MAX_PREVIEW_HEIGHT, mn as t, mt as tabsCookieName, n as unavailableComments, ni as parseMessage, nn as ShellTabBar, oi as parseWorkSchema, ot as activeTab, pi as strict$2, pn as locale, pt as tabHref, q as parseCommentInput$1, qr as parseWorkQuery, qt as taskRoutes, r as followThreads, ri as parseMessageAuthor, rt as FieldCard, si as statusCategory, sn as AppShell, st as closeShellTab, t as commentsUnavailable, ti as messageDeletionRefusals, ui as nonempty$1, un as writePreference, ut as parseShellTabs, v as projectLive, vi as parsePreviewBranch, vn as RESYNC, xi as parsePreviewId, y as routes, yi as parsePreviewCapture, yn as parseLiveId, yt as conversationDestination, zn as parseThreadStatus, zr as parseWorkActionInput } from "./assets/comment-data-yfWEdDQL.js";
2
+ import { n as requestTasks } from "./assets/tasks-request-B0aeNocI.js";
3
3
  import { access, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, stat, symlink, writeFile } from "node:fs/promises";
4
4
  import * as Path from "node:path";
5
5
  import { dirname, extname, isAbsolute, join, relative, resolve, sep } from "node:path";
@@ -37591,10 +37591,10 @@ function ProjectLiveStatus(handle) {
37591
37591
  //#endregion
37592
37592
  //#region app/client/screens.ts
37593
37593
  var builtIns = {
37594
- "bud:pages": () => import("./assets/pages-BxpjbYhs.js"),
37595
- "bud:canvas": () => import("./assets/canvas-TRUfxfL5.js"),
37596
- "bud:tasks": () => import("./assets/tasks-Bs1IOpeU.js"),
37597
- "bud:files": () => import("./assets/files-Dh2TiQZq.js")
37594
+ "bud:pages": () => import("./assets/pages-CW4aF6dK.js"),
37595
+ "bud:canvas": () => import("./assets/canvas-DxmcFZCh.js"),
37596
+ "bud:tasks": () => import("./assets/tasks-BBK_CybR.js"),
37597
+ "bud:files": () => import("./assets/files-anHi-apm.js")
37598
37598
  };
37599
37599
  /**
37600
37600
  * Imports a screen module: a built-in by its key, any other by the URL the server gave it.
@@ -1,8 +1,8 @@
1
1
  import { Bn as Icon } from "./events-iHpLGr3k.js";
2
- import { Bt as Button, En as t, H as captureCanvasPoint, On as Text, Rt as Loader, Sn as writePreference, V as CanvasWorkspace, W as BranchSidebar, fn as ToolbarSeparator, gn as IconButton, hn as Select, l as projectStore, pn as WorkspaceLayout, t as commentsUnavailable, ut as conversationHref, vn as Tooltip, xn as readPreference } from "./comment-data-CsjukwAW.js";
3
- import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-B0YIK6Ur.js";
4
- import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-BIQA2mr4.js";
5
- import { t as ProjectThreadLinks } from "./project-thread-links-CBOpf6zk.js";
2
+ import { Bt as Button, En as t, H as captureCanvasPoint, On as Text, Rt as Loader, Sn as writePreference, V as CanvasWorkspace, W as BranchSidebar, fn as ToolbarSeparator, gn as IconButton, hn as Select, l as projectStore, pn as WorkspaceLayout, t as commentsUnavailable, ut as conversationHref, vn as Tooltip, xn as readPreference } from "./comment-data-NLeHG89b.js";
3
+ import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-CwTsf6WQ.js";
4
+ import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-B1zH_1O3.js";
5
+ import { t as ProjectThreadLinks } from "./project-thread-links-lLS_rq7c.js";
6
6
  import { on, ref } from "remix/component";
7
7
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
8
8
  //#region app/client/preview-image.tsx