@bud.sh/app 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +41 -31
  2. package/dist/client/assets/bud/design.js +1 -1
  3. package/dist/client/assets/canvas-Bih9EdKJ.js +1 -0
  4. package/dist/client/assets/difference-worker-Bzg-rizy.js +8 -0
  5. package/dist/client/assets/dist-CdE5wBkg.js +5 -0
  6. package/dist/client/assets/files-1dLuoM2f.js +1 -0
  7. package/dist/client/assets/i18n-CkO6VFI0.js +1 -0
  8. package/dist/client/assets/index-Cn2mxroU.css +2 -0
  9. package/dist/client/assets/{index-ChANGtl-.js → index-DtISWZp9.js} +2 -2
  10. package/dist/client/assets/pages-BJ-tNJ4J.js +1 -0
  11. package/dist/client/assets/{project-branches-DO897zM6.js → project-branches-Ce3rXrkc.js} +1 -1
  12. package/dist/client/assets/project-comments-CPUONfs8.js +1 -0
  13. package/dist/client/assets/project-thread-links-C-TGkq59.js +1 -0
  14. package/dist/client/assets/{project-threads-Lay351p4.js → project-threads-Bv7IDBgi.js} +105 -105
  15. package/dist/client/assets/project-work-DAE9-olg.js +1 -0
  16. package/dist/client/assets/{task-design-Avb2RO4w.js → task-design-CwySIAOl.js} +3 -3
  17. package/dist/client/assets/tasks-KWsCLi_h.js +3 -0
  18. package/dist/client/assets/wasm-inline-DSUyFn1L.js +1 -0
  19. package/dist/client/assets/workspace-CVdcfaaB.js +2 -0
  20. package/dist/client/index.html +3 -3
  21. package/dist/hosted/assets/{canvas-V36732ER.js → canvas-AII16n9i.js} +97 -6
  22. package/dist/hosted/assets/{comment-data-CF2ZV_3k.js → comment-data-BXfMElfx.js} +2004 -402
  23. package/dist/hosted/assets/dist-BCSTeNf4.js +4785 -0
  24. package/dist/hosted/assets/{files-DjSCjfU7.js → files-D_1yeAVO.js} +10 -5
  25. package/dist/hosted/assets/{pages-BzjzeuPu.js → pages-CN_SbKWA.js} +3 -3
  26. package/dist/hosted/assets/{project-branches-BT97J9i7.js → project-branches-Bxp0DCwg.js} +1 -1
  27. package/dist/hosted/assets/{project-thread-links-BRLgByEe.js → project-thread-links-KqQoKBLE.js} +76 -4
  28. package/dist/{node-host/assets/screen-CZXWJEds.js → hosted/assets/screen-DpAcDUKR.js} +29 -1
  29. package/dist/hosted/assets/tasks-D66LlwxM.js +1423 -0
  30. package/dist/hosted/assets/wasm-inline-Dl9tqabx.js +4 -0
  31. package/dist/hosted/hosted.js +7885 -6219
  32. package/dist/node/assets/Stream-CAm1eJ2n.js +16604 -0
  33. package/dist/{server/assets/bridge-B_Blt55E.js → node/assets/bridge-DQSBYHmw.js} +124 -290
  34. package/dist/node/assets/config-9_jWwNBh.js +1067 -0
  35. package/dist/node/assets/load-config.server-CMVtRVmO.js +261 -0
  36. package/dist/node/assets/module-3GgtT4Xs.js +308 -0
  37. package/dist/node/assets/server-DTQFuoX2.js +846 -0
  38. package/dist/node/assets/src-D-kG1GxB.js +2 -0
  39. package/dist/node/assets/{src-CerrKjID.js → src-Dwe9APUx.js} +93 -3
  40. package/dist/node/assets/src-DysjfbM8.js +8592 -0
  41. package/dist/node/bridge.js +1 -845
  42. package/dist/node/cli.js +206 -0
  43. package/dist/node/design.js +811 -13
  44. package/dist/node/index.js +2 -739
  45. package/dist/node/plugins.js +5711 -0
  46. package/dist/node/server.js +1 -6746
  47. package/dist/node/vite.js +121 -0
  48. package/dist/{server/assets/canvas-Dc1mYCwQ.js → node-host/assets/canvas-BeDoufy1.js} +97 -7
  49. package/dist/node-host/assets/{comment-data-DyIZNpfG.js → comment-data-DE2T9yTj.js} +1980 -376
  50. package/dist/node-host/assets/dist-BCSTeNf4.js +4785 -0
  51. package/dist/node-host/assets/{files-Dh2TiQZq.js → files-Dl-PTS09.js} +11 -6
  52. package/dist/node-host/assets/{pages-BxpjbYhs.js → pages-DL2sk6_U.js} +3 -3
  53. package/dist/node-host/assets/{project-branches-B7HUGiVK.js → project-branches-DGp5ELct.js} +1 -1
  54. package/dist/{server/assets/project-thread-links-CBOpf6zk.js → node-host/assets/project-thread-links-CgBV3Jcm.js} +76 -5
  55. package/dist/{hosted/assets/screen-CKp2C7kx.js → node-host/assets/screen-B55yyVfb.js} +29 -1
  56. package/dist/node-host/assets/tasks-DZRNkoxe.js +1425 -0
  57. package/dist/node-host/assets/wasm-inline-Dl9tqabx.js +4 -0
  58. package/dist/node-host/node-host.js +6127 -4438
  59. package/dist/server/assets/{branch-previews-ClkoJ0lM.js → branch-previews-DedrpnVR.js} +1555 -673
  60. package/dist/{node-host/assets/canvas-TRUfxfL5.js → server/assets/canvas-CJWQ-jjv.js} +98 -6
  61. package/dist/server/assets/{comment-data-CsjukwAW.js → comment-data-Rg42ToTW.js} +1666 -47
  62. package/dist/server/assets/dist-BCSTeNf4.js +4785 -0
  63. package/dist/server/assets/{events-iHpLGr3k.js → events-BH_rAu7O.js} +155 -20
  64. package/dist/server/assets/{files-E9mSFeoc.js → files-CPJqKeMo.js} +12 -7
  65. package/dist/server/assets/{listener-DN5TyOjJ.js → listener-D61O6PzF.js} +708 -12
  66. package/dist/server/assets/{pages-BBBXyJWV.js → pages-KJY_Ba92.js} +4 -4
  67. package/dist/server/assets/{project-branches-B0YIK6Ur.js → project-branches-qG9ACZvo.js} +2 -2
  68. package/dist/{node-host/assets/project-thread-links-CauJF0Cz.js → server/assets/project-thread-links-CqK0lqCF.js} +77 -4
  69. package/dist/{node-host/assets/tasks-request-ZWmbc8fE.js → server/assets/project-work-DoIwxWMm.js} +87 -2
  70. package/dist/server/assets/run-BJ8r5jSh.js +572 -0
  71. package/dist/server/assets/{screen-BIQA2mr4.js → screen-CBrHPFug.js} +30 -2
  72. package/dist/server/assets/{server-DxK-UB_Z.js → server-Dkbp5stG.js} +1521 -793
  73. package/dist/server/assets/{services-BRrgXYlT.js → services-BTfig8A8.js} +234 -997
  74. package/dist/server/assets/tasks-Bgu5Lg9Y.js +1427 -0
  75. package/dist/server/assets/wasm-inline-Dl9tqabx.js +4 -0
  76. package/dist/server/capture.js +1 -2
  77. package/dist/server/migration.js +569 -12
  78. package/dist/server/runtime.js +7 -5
  79. package/dist/server/server.js +3 -3
  80. package/dist/types/assets/{config-DIC2cf_S.d.ts → config-CvcYmE2s.d.ts} +188 -50
  81. package/dist/types/assets/{contract-CAT-XFNq.d.ts → contract-B7yuuqSn.d.ts} +44 -2
  82. package/dist/types/assets/{items-CaVkByHk.d.ts → items-BQdaVksf.d.ts} +12 -1
  83. package/dist/types/assets/memory-state-BBW-FAVA.d.ts +236 -0
  84. package/dist/types/assets/picker-Be5Gx4WR.d.ts +9 -0
  85. package/dist/types/assets/{task-design-xJOhRNWh.d.ts → task-design-BDHKFHpp.d.ts} +3 -1
  86. package/dist/types/bridge.d.ts +1 -1
  87. package/dist/types/companion.d.ts +3 -3
  88. package/dist/types/design.d.ts +2 -2
  89. package/dist/types/hosted.d.ts +3 -3
  90. package/dist/types/index.d.ts +2 -2
  91. package/dist/types/node-host.d.ts +2 -2
  92. package/dist/types/plugins.d.ts +445 -0
  93. package/dist/types/screen.d.ts +2 -2
  94. package/dist/types/server.d.ts +2 -228
  95. package/dist/types/vite.d.ts +16 -0
  96. package/package.json +19 -3
  97. package/dist/client/assets/canvas-Cu6R6xxT.js +0 -1
  98. package/dist/client/assets/difference-worker-jfTSn-Tw.js +0 -8
  99. package/dist/client/assets/files-js6ElfkU.js +0 -1
  100. package/dist/client/assets/i18n-DxqFr2mi.js +0 -1
  101. package/dist/client/assets/index-CFFxP0gS.css +0 -2
  102. package/dist/client/assets/pages-6_lhiQmz.js +0 -1
  103. package/dist/client/assets/project-comments-DFFKVpia.js +0 -1
  104. package/dist/client/assets/project-thread-links-NLFWQRD2.js +0 -1
  105. package/dist/client/assets/project-work-du0Y-L5Y.js +0 -1
  106. package/dist/client/assets/tasks-CA-E8bbK.js +0 -1
  107. package/dist/client/assets/tasks-request-C55IeuiP.js +0 -1
  108. package/dist/client/assets/workspace-Cw5HvX5d.js +0 -2
  109. package/dist/hosted/assets/tasks-Dj7AyBJB.js +0 -649
  110. package/dist/hosted/assets/tasks-request-DZob623r.js +0 -113
  111. package/dist/node-host/assets/tasks-Bs1IOpeU.js +0 -651
  112. package/dist/server/assets/project-work-qSKFO5yj.js +0 -88
  113. package/dist/server/assets/tasks-CiXodsLN.js +0 -652
  114. package/dist/server/assets/tasks-request-DhwCzpRi.js +0 -115
  115. package/dist/types/assets/picker-D1Bw3ndx.d.ts +0 -14
@@ -0,0 +1,3 @@
1
+ import{r as e}from"./i18n-CkO6VFI0.js";import{t}from"./jsx-B4XNFIzB.js";import{t as n}from"./component-DWct-Tq6.js";import{n as r}from"./on-mixin-iWnqUzq5.js";import{n as i}from"./attrs-mixin-CmlG_FtV.js";import{a,c as o,l as s,o as c,r as l}from"./loader-Q6-HPKft.js";import{t as u}from"./screen-Dfvzj6n2.js";import{A as d,An as f,E as p,Et as m,F as ee,Fn as h,Ft as te,It as g,Ln as _,Lt as v,Pn as ne,bt as re,dt as y,f as b,ht as ie,k as x,kt as ae,mt as S,w as oe,xt as C,zn as se}from"./task-design-CwySIAOl.js";import{C as ce,E as w,H as T,Nt as E,S as le,U as ue,V as D,Y as O,b as k,p as de,pt as fe,s as A,ut as j,w as M,x as N}from"./project-threads-Bv7IDBgi.js";import{n as pe,r as P,t as me}from"./project-work-DAE9-olg.js";import{r as he,t as F}from"./project-comments-CPUONfs8.js";import{n as I,r as ge}from"./project-thread-links-C-TGkq59.js";var L=[`provisioning`,`working`,`review`,`needs_context`,`changes`,`approved`,`pushing`,`pushed`,`merged`,`failed`,`discarded`],R=50,z=500,_e=10,B=1e4;function V(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function H(e,t,n,r=!1){if(r&&e===null)return e;if(typeof e!=`string`||e.length>n)throw TypeError(`Invalid run ${t}.`);return e}function U(e,t){if(!L.includes(e))throw TypeError(`Invalid run ${t}.`);return e}function W(e){if(e==null)return null;if(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535)throw TypeError(`Invalid run port.`);return e}function ve(e){if(e===void 0)return{dev:null,agent:null};if(!V(e))throw TypeError(`Invalid run ports.`);let t=W(e.terminal),n=W(e.preview);return{dev:W(e.dev),agent:W(e.agent),...t?{terminal:t}:{},...n?{preview:n}:{}}}function G(e,t){if(!V(e))throw TypeError(`Invalid run ${t}.`);return{name:H(e.name,t,1e3),email:H(e.email,t,1e3)}}function K(e){if(!V(e)||e.version!==1)throw TypeError(`Invalid run.`);let t=e.base;if(!V(t))throw TypeError(`Invalid run base.`);let n=e.error;if(n!==null&&!V(n))throw TypeError(`Invalid run error.`);if(!Array.isArray(e.activity)||e.activity.length>R)throw TypeError(`Invalid run activity.`);if(!Array.isArray(e.previous)||e.previous.length>_e)throw TypeError(`Invalid earlier runs.`);return{version:1,id:H(e.id,`id`,100),state:U(e.state,`state`),failedIn:e.failedIn===null?null:U(e.failedIn,`failedIn`),provider:H(e.provider,`provider`,200),sandbox:H(e.sandbox,`sandbox`,500,!0),harness:H(e.harness,`harness`,200),model:H(e.model,`model`,200),session:H(e.session,`session`,500,!0),ports:ve(e.ports),asleep:e.asleep===!0,branch:H(e.branch,`branch`,300),base:{branch:H(t.branch,`base`,300),commit:H(t.commit,`base`,100,!0)},head:H(e.head,`head`,100,!0),pushed:H(e.pushed,`pushed`,100,!0),summary:H(e.summary,`summary`,B,!0),question:e.question===void 0?null:H(e.question,`question`,2e3,!0),activity:e.activity.map(e=>{if(!V(e)||![`status`,`message`,`tool`,`error`].includes(e.kind))throw TypeError(`Invalid run activity.`);return{at:H(e.at,`activity`,64),kind:e.kind,text:H(e.text,`activity`,z)}}),error:n===null?null:{message:H(n.message,`error`,z),at:H(n.at,`error`,64),retryable:n.retryable===!0},startedBy:G(e.startedBy,`startedBy`),approvedBy:e.approvedBy===null?null:G(e.approvedBy,`approvedBy`),createdAt:H(e.createdAt,`createdAt`,64),updatedAt:H(e.updatedAt,`updatedAt`,64),previous:e.previous.map(e=>{if(!V(e))throw TypeError(`Invalid earlier run.`);return{id:H(e.id,`previous`,100),state:U(e.state,`previous`),endedAt:H(e.endedAt,`previous`,64)}})}}function q(e){let t=e;if(!t||typeof t.enabled!=`boolean`||typeof t.ready!=`boolean`||typeof t.canAdd!=`boolean`||t.message!==null&&typeof t.message!=`string`||!Array.isArray(t.problems)||t.problems.length>10||t.problems.some(e=>!e||typeof e.value!=`string`||e.reason!==`missing`&&e.reason!==`category`))throw TypeError(`Invalid factory state.`);let n=t.statuses,r=[`open`,`inProgress`,`needsApproval`,`readyToMerge`,`merged`];return{enabled:t.enabled,ready:t.ready,message:t.message,problems:t.problems.map(e=>({value:e.value,reason:e.reason})),canAdd:t.canAdd,statuses:n&&r.every(e=>typeof n[e]==`string`)?Object.fromEntries(r.map(e=>[e,n[e]])):null}}async function J(t,n,r,i){let a=await fetch(t,{method:i===void 0?`GET`:`POST`,headers:{"X-Bud-Token":n,...i===void 0?{}:{"Content-Type":`application/json`}},...i===void 0?{}:{body:JSON.stringify(i)},credentials:`same-origin`,redirect:`error`,cache:`no-store`,signal:r}),o=await a.json().catch(()=>null);if(!a.ok)throw Error(o&&typeof o==`object`&&`error`in o&&typeof o.error==`string`?o.error:e(`app.client.factorySetup.failed`));return q(o)}var Y=new Map,X=new Map;function ye(e,t,n){let r=X.get(e)??new Set;X.set(e,r),r.add(t),n.addEventListener(`abort`,()=>r.delete(t),{once:!0})}function be(e,t=!1){let n=Y.get(e);return(!n||t)&&(n=J(k.factoryApi.status.href(),e,new AbortController().signal),n.catch(()=>Y.delete(e)),Y.set(e,n)),n}function xe(n){let i=null,a=!1;function c(){n.signal.aborted||n.update()}be(n.props.token).then(e=>{i=e,c()},()=>{});async function l(){a=!0,c();try{i=await J(k.factoryApi.addStatuses.href(),n.props.token,n.signal,{}),Y.set(n.props.token,Promise.resolve(i));for(let e of X.get(n.props.token)??[])e(i);b.success(e(`app.client.factorySetup.added`)),n.props.onAdded()}catch(t){b.error(e(`app.client.factorySetup.failed`),{description:t instanceof Error?t.message:void 0})}finally{a=!1,c()}}return()=>{if(!i?.enabled||i.ready)return null;let n=e=>i.problems.filter(t=>t.reason===e).map(e=>C(e.value)).join(`, `);return t(`div`,{class:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2 border-b border-line bg-panel px-4 py-2`,role:`status`,"data-testid":`factory-setup`,children:[t(s,{variant:`ui-caption`,class:`min-w-0 flex-1`,children:i.message??[n(`missing`)&&e(`app.client.factorySetup.missing`,{statuses:n(`missing`)}),n(`category`)&&e(`app.client.factorySetup.otherKind`,{statuses:n(`category`)})].filter(Boolean).join(` `)}),i.canAdd?t(o,{variant:`secondary`,size:`small`,disabled:a,"data-testid":`factory-add-statuses`,mix:r(`click`,()=>void l()),children:e(`app.client.factorySetup.add`)}):null]})}}async function Z(t,n,r,i=!1,a={}){let o=await fetch(t,{method:i?`POST`:`GET`,headers:{"X-Bud-Token":n,...i?{"Content-Type":`application/json`}:{}},...i?{body:JSON.stringify(a)}:{},credentials:`same-origin`,redirect:`error`,cache:`no-store`,signal:r}),s=await o.json().catch(()=>null);if(!o.ok)throw Error(s&&typeof s==`object`&&`error`in s&&typeof s.error==`string`?s.error:e(`app.client.factoryRun.failed`));return s}function Se(e){return e?.run==null?null:K(e.run)}var Ce=1e4;function we(n){let r=null,i,a,o=0,s;n.signal.addEventListener(`abort`,()=>clearInterval(s));function c(){n.signal.aborted||n.update()}ye(n.props.token,e=>{r=e,c()},n.signal),be(n.props.token).then(e=>{r=e,c()},()=>{});async function l(){let e=++o;try{let t=Se(await Z(k.factoryApi.run.href({id:n.props.itemId}),n.props.token,n.signal));e===o&&(i=t)}catch{e===o&&i===void 0&&(i=null)}c()}async function u(t,r={}){try{let e=Se(await Z(k.factoryApi[t].href({id:n.props.itemId}),n.props.token,n.signal,!0,r));o++,i=e,c()}catch(t){throw b.error(e(`app.client.factoryRun.refused`),{description:t instanceof Error?t.message:void 0}),l(),t}}async function d(){let t=window.open(``,`_blank`);try{let r=(await Z(k.factoryApi.preview.href({id:n.props.itemId}),n.props.token,n.signal))?.preview?.url;if(typeof r!=`string`||!/^https?:\/\//.test(r))throw Error(e(`app.client.factoryRun.noPreview`));t?(t.opener=null,t.location.href=r):window.open(r,`_blank`,`noopener`)}catch(n){t?.close(),b.error(e(`app.client.factoryRun.previewFailed`),{description:n instanceof Error?n.message:void 0})}}return()=>{let o=`${n.props.revision}:${n.props.runState??``}`;if(o!==a&&(a=o,n.queueTask(()=>void l())),!r?.enabled)return null;let f=i&&[`provisioning`,`working`,`changes`,`approved`,`pushing`].includes(i.state);return f&&!s?s=setInterval(c,Ce):!f&&s&&(clearInterval(s),s=void 0),t(D,{run:i,blocked:r.ready?null:r.message??e(`app.client.factoryRun.statusesMissing`),preview:!!i?.ports.dev,onStart:()=>u(`start`),onChanges:e=>u(`changes`,{message:e}),onAnswer:e=>u(`answer`,{message:e}),onApprove:()=>u(`approve`),onDiscard:()=>u(`discard`),onRetry:()=>u(`retry`),onPreview:d,onCanvas:()=>{E(`bud:canvas-branch:${n.props.projectId}`,i.branch),window.location.assign(`/canvas`)}})}}var Te=[`provisioning`,`working`,`changes`,`review`,`needs_context`,`failed`],Ee=[`approved`,`pushing`];async function De(e,t,n){await Z(k.factoryApi.discard.href({id:t}),e,n,!0)}function Oe(n){let i=!1;async function s(e){i=!0,n.update();try{await n.props.onAnswer(e)}finally{i=!1,n.signal.aborted||n.update()}}return()=>t(p,{label:e(`app.client.factoryRun.moveTitle`),dismissible:!i,initialFocus:`[data-run-move-keep]`,onClose:()=>void s(!1),children:t(l,{children:[t(c,{title:e(`app.client.factoryRun.moveTitle`),subtitle:e(`app.client.factoryRun.moveQuestion`,{id:n.props.itemId,status:n.props.status})}),t(a,{class:`justify-end`,children:[t(o,{variant:`ghost`,size:`small`,disabled:i,"data-run-move-keep":!0,mix:r(`click`,()=>void s(!1)),children:e(`app.client.factoryRun.keepRun`)}),t(o,{variant:`primary`,size:`small`,disabled:i,"data-testid":`run-move-discard`,mix:r(`click`,()=>void s(!0)),children:e(`app.client.factoryRun.discardAndMove`)})]})]})})}var ke=12e4,Ae=[`working`,`changes`,`review`,`pushing`,`approved`,`failed`];async function Q(t,n,r,i){let a=await fetch(t,{method:i===void 0?`GET`:`POST`,headers:{"X-Bud-Token":n,...i===void 0?{}:{"Content-Type":`application/json`}},...i===void 0?{}:{body:JSON.stringify(i)},credentials:`same-origin`,redirect:`error`,cache:`no-store`,signal:r}),o=await a.json().catch(()=>null);if(!a.ok)throw Error(o&&typeof o==`object`&&`error`in o&&typeof o.error==`string`?o.error:e(`app.client.agentPanel.failed`));return o}function je(e){let t=e.element,n=[`On ${e.path}`];return t&&(n.push(`at ${t.label||t.breadcrumb||t.selector} <${t.tagName}>`),t.source?.file&&n.push(`(${t.source.file}${t.source.line?`:${t.source.line}`:``}${t.source.component?`, ${t.source.component}`:``})`)),`${e.body.trim()}\n\n${n.join(` `)}.`}function Me(n){let r,i={state:`none`},a,o=0,s=()=>{n.signal.aborted||n.update()},c=setInterval(()=>{r&&Ae.includes(r.state)&&Q(k.factoryApi.touch.href({id:n.props.itemId}),n.props.token,n.signal,{}).catch(()=>{})},ke);n.signal.addEventListener(`abort`,()=>clearInterval(c));async function l(){i={state:`waking`},s();try{let e=(await Q(k.factoryApi.preview.href({id:n.props.itemId}),n.props.token,n.signal))?.preview?.url;i=typeof e==`string`&&/^https?:\/\//.test(e)?{state:`ready`,url:e}:{state:`none`}}catch(t){if(n.signal.aborted)return;i={state:`failed`,message:t instanceof Error?t.message:e(`app.client.agentPanel.failed`)}}s()}async function u(){let e=++o;try{let t=await Q(k.factoryApi.run.href({id:n.props.itemId}),n.props.token,n.signal);if(e!==o)return;let a=r;r=t?.run==null?null:K(t.run),r?.sandbox&&r.ports.dev&&Ae.includes(r.state)?(i.state===`none`||a?.sandbox!==r?.sandbox)&&l():i={state:`none`}}catch{e===o&&r===void 0&&(r=null)}s()}let d=(t,r,i,a)=>{let o=0,s=r.cols,c=r.rows,l=null,u=Promise.resolve(),d=(e,t)=>{u=u.then(()=>Q(e,n.props.token,a,t)).then(()=>{},()=>{})},f=new TextEncoder,p=()=>{l={cols:s,rows:c},d(k.factoryApi.terminalResize.href({id:n.props.itemId,session:t}),{cols:s,rows:c})};return(async()=>{for(;!a.aborted;){i.state(`connecting`);try{let r=new URL(k.factoryApi.terminal.href({id:n.props.itemId,session:t}),window.location.origin),u={cols:s,rows:c};r.searchParams.set(`cols`,String(s)),r.searchParams.set(`rows`,String(c)),r.searchParams.set(`from`,String(o));let d=await fetch(r,{headers:{"X-Bud-Token":n.props.token},credentials:`same-origin`,cache:`no-store`,signal:a});if(!d.ok||!d.body){let t=await d.json().catch(()=>null),n=typeof t?.error==`string`?t.error:e(`app.client.agentPanel.failed`);if(i.write(f.encode(`\r\n\x1b[2m${n}\x1b[0m\r\n`)),i.state(`closed`),d.status===404)return}else{i.state(`open`),l=u,(s!==u.cols||c!==u.rows)&&p();let t=d.body.pipeThrough(new TextDecoderStream).getReader(),n=``,r=!1;for(;!r;){let{done:e,value:a}=await t.read();if(e)break;n+=a;let s=n.split(`
2
+
3
+ `);n=s.pop()??``;for(let e of s){let t=/^id: (\d+)$/m.exec(e)?.[1],n=/^data: (.*)$/m.exec(e)?.[1];/^event: exit$/m.test(e)?r=!0:t&&n&&(i.write(Uint8Array.from(atob(n),e=>e.charCodeAt(0))),o=Number(t))}}i.state(`closed`),l=null,r&&(i.write(f.encode(`\r\n\x1b[2m${e(`app.client.agentPanel.ended`)}\x1b[0m\r\n`)),o=0)}}catch{if(a.aborted)return;i.state(`closed`),l=null}await new Promise(e=>setTimeout(e,2e3))}})(),{input:e=>d(k.factoryApi.terminalInput.href({id:n.props.itemId,session:t}),{data:e}),resize:(e,t)=>{s=e,c=t,l&&p()}}};async function f(t){try{let i=await Q(k.factoryApi.changes.href({id:n.props.itemId}),n.props.token,n.signal,{message:je(t)});r=i?.run==null?r:K(i.run),b.success(e(`app.client.agentPanel.changesSent`)),s()}catch(t){throw b.error(e(`app.client.agentPanel.changesRefused`),{description:t instanceof Error?t.message:void 0}),t}}return()=>{let o=n.props.runState??``;o!==a&&(a=o,n.queueTask(()=>void u()));let s=r?.sandbox&&r.ports.terminal&&Ae.includes(r.state)?{tabs:[{id:`agent`,label:e(`app.client.agentPanel.agent`)},{id:`dev`,label:e(`app.client.agentPanel.devServer`)},{id:`shell`,label:e(`app.client.agentPanel.shell`)}],connect:d}:null;return t(T,{details:n.props.details,preview:i,terminal:s,onWake:()=>void l(),onComment:r?.state===`review`?f:void 0})}}var Ne=/^[a-f0-9]{64}$/;function $(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:null}function Pe(e){let t=$(e);if(!t)return null;let{x:n,y:r}=t;return typeof n==`number`&&typeof r==`number`&&Number.isFinite(n)&&Number.isFinite(r)?{x:n,y:r}:null}function Fe(e){let t=$(e);if(!t||t.version!==1||typeof t.thread!=`string`)return null;let n=$(t.page),r=$(t.code),i=null;try{i=t.element?f(t.element):null}catch{}return{version:1,thread:t.thread.slice(0,200),page:n&&typeof n.id==`string`&&typeof n.path==`string`?{id:n.id,path:n.path,title:typeof n.title==`string`?n.title:n.path}:null,viewport:typeof t.viewport==`number`?t.viewport:null,branch:typeof t.branch==`string`?t.branch:null,point:Pe(t.point),element:i,image:typeof t.image==`string`&&Ne.test(t.image)?t.image:null,code:r&&typeof r.path==`string`&&typeof r.startLine==`number`&&typeof r.endLine==`number`?{path:r.path,startLine:r.startLine,endLine:r.endLine,commit:typeof r.commit==`string`?r.commit:null}:null}}async function Ie(e,t,n){let r=await fetch(e,{headers:{"X-Bud-Token":t},credentials:`same-origin`,redirect:`error`,signal:n});if(!r.ok)throw Error(String(r.status));return r}function Le(i){let a=null,o=null,c=()=>{i.signal.aborted||i.update()};return i.signal.addEventListener(`abort`,()=>{o&&URL.revokeObjectURL(o)}),(async()=>{try{if(a=Fe((await(await Ie(k.tasksApi.context.href({id:i.props.itemId}),i.props.token,i.signal)).json()).context),c(),a?.image){let e=await Ie(k.tasksApi.attachment.href({hash:a.image}),i.props.token,i.signal);o=URL.createObjectURL(await e.blob()),c()}}catch{}})(),()=>{if(!a)return null;let{page:i,element:c,code:l,viewport:u,branch:d}=a,f=c?.source,p=[];return i&&p.push([e(`app.client.taskContextBlock.page`),i.title===i.path?i.path:`${i.title} (${i.path})`]),u&&p.push([e(`app.client.taskContextBlock.viewport`),`${u} px`]),d&&p.push([e(`app.client.taskContextBlock.branch`),d]),c&&p.push([e(`app.client.taskContextBlock.element`),`${c.label||c.breadcrumb} <${c.tagName}>`]),f?.file&&p.push([e(`app.client.taskContextBlock.source`),`${f.file}${f.line?`:${f.line}`:``}${f.component?` (${f.component})`:``}`]),l&&p.push([e(`app.client.taskContextBlock.code`),`${l.path}:${l.startLine}–${l.endLine}${l.commit?` @ ${l.commit.slice(0,8)}`:``}`]),t(`section`,{class:`flex min-w-0 flex-col gap-3`,"data-testid":`task-context`,children:[t(s,{as:`h3`,variant:`ui`,weight:`medium`,children:e(`app.client.taskContextBlock.context`)}),o?t(`a`,{href:o,target:`_blank`,rel:`noopener`,class:`block overflow-hidden rounded-lg ring-1 ring-[var(--bud-card-border)]`,mix:r(`click`,e=>{e.preventDefault(),window.open(o,`_blank`,`noopener`)}),children:t(`img`,{src:o,alt:e(`app.client.taskContextBlock.screenshot`),class:`block h-auto max-h-80 w-full object-cover`,"data-testid":`task-context-image`})}):null,p.length?t(`dl`,{class:`grid min-w-0 grid-cols-[auto_minmax(0,1fr)] gap-x-4 gap-y-1`,children:p.map(([e,r])=>t(n,{children:[t(`dt`,{children:t(s,{variant:`ui-caption`,tone:`muted`,children:e})}),t(`dd`,{class:`min-w-0`,children:t(s,{variant:`ui-caption`,class:`[overflow-wrap:anywhere]`,children:r})})]}))}):null]})}}function Re(a){let c=a.props.conversationId,l=c,u=!!c,f=!1,p=!1,m=[a.props.itemId],h=F({store:A(a.props.project),token:a.props.project.token,signal:a.signal,filter:{itemId:a.props.itemId},initial:a.props.initial,onChange(){a.signal.aborted||a.update()}});h.loaded&&(l??=h.snapshot.threads[0]?.id);let te=i(()=>{h.loaded||h.load().then(()=>{l??=h.snapshot.threads[0]?.id,a.signal.aborted||a.update()})});async function g(e){let t=await h.write(e);return await a.props.onChange?.(),t}function _(e){return{project:a.props.project,thread:e,items:a.props.items,canLink:h.snapshot.capabilities.link,busy:h.busy,onChange:async()=>{await h.load(),h.snapshot.threads.some(t=>t.id===e.id)&&await h.loadThread(e.id,!0),await a.props.onChange?.()}}}function v(n){return t(`div`,{class:`flex items-start justify-between gap-2`,children:[a.props.renderThreadLinks?a.props.renderThreadLinks(n):t(I,{part:n.anchor?`links`:void 0,..._(n)}),!n.anchor&&h.snapshot.capabilities.reply&&h.snapshot.threads.length>1?t(o,{variant:`ghost`,size:`small`,disabled:h.busy,"aria-pressed":!f&&l===n.id,mix:r(`click`,()=>{l=n.id,u=!0,f=!1,a.update()}),children:e(`app.client.taskDiscussion.reply`)}):null]})}function ne(n){return t(O,{location:n.anchor?j(n):e(`app.client.taskDiscussion.discussion`),actions:a.props.renderThreadLinks?void 0:t(I,{part:`action`,..._(n)}),status:n.status,busy:h.busy,onStatusChange:h.snapshot.capabilities.status?e=>{g({id:n.id,status:e}).catch(()=>{})}:void 0})}return()=>{c!==a.props.conversationId&&(c=a.props.conversationId,u=!!c,c&&(l=c,f=!1));let{threads:i,capabilities:_}=h.snapshot,y=f?void 0:i.find(e=>e.id===l&&!e.anchor)??(u?void 0:i.find(e=>!e.anchor&&e.status!==`resolved`)??(_.create?void 0:i.find(e=>!e.anchor))),b=!f&&(u&&(!y||!_.reply)||!(!y||y.messagesLoaded));h.ready&&!h.busy&&!h.loading&&a.queueTask(()=>{u&&l&&h.loadThread(l);for(let e of h.snapshot.threads)!e.messagesLoaded&&(!e.anchor||e.id===l)&&h.loadThread(e.id)});let ie=i.reduce((e,t)=>e+t.messageCount,0);return t(`section`,{class:`flex min-w-0 flex-col gap-3`,"aria-label":e(`app.client.taskDiscussion.taskDiscussion`),mix:te,children:[t(`div`,{class:`flex items-center gap-2`,children:[t(s,{as:`h3`,variant:`ui`,weight:`medium`,children:e(`app.client.taskDiscussion.discussion`)}),ie?t(s,{variant:`ui-caption`,tone:`muted`,children:ie}):null,h.ready&&_.create&&i.length?t(o,{variant:`ghost`,size:`small`,class:`ms-auto`,disabled:h.busy||f,mix:r(`click`,()=>{f=!0,a.update()}),children:e(`app.client.taskDiscussion.newDiscussion`)}):null]}),h.error?t(`div`,{class:`flex flex-col items-start gap-2`,children:[t(s,{variant:`ui-caption`,role:`alert`,children:h.error}),t(o,{variant:`secondary`,size:`small`,mix:r(`click`,()=>{h.load().then(()=>l?h.loadThread(l,!0):void 0)}),children:e(`app.client.taskDiscussion.reloadComments`)})]}):null,h.loaded?h.ready?t(n,{children:[i.length?i.map(e=>e.anchor?t(d,{id:e.id,expanded:l===e.id,heading:ne(e),messages:e.messages,messageCount:e.messageCount,now:h.now,onExpand:()=>{l=e.id,u=!1,h.loadThread(e.id),a.update()},renderDetail:()=>t(x,{heading:ne(e),messages:e.messages,messageCount:e.messageCount,messagesLoaded:e.messagesLoaded,messagesTruncated:e.messagesTruncated,now:h.now,busy:h.busy,links:v(e),onReply:_.reply?(t,n)=>g({id:e.id,body:t,parentId:n}):void 0,viewerId:h.viewer?.id,onDelete:_.delete?async t=>{let n=e.messages[0]?.id===t;await h.remove(e.id,t),n&&l===e.id&&(l=void 0),a.update()}:void 0})},e.id):t(w,{thread:e,links:v(e)},e.id)):t(s,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.noDiscussionYet`)}),_.create||_.reply&&(u||i.some(e=>!e.anchor))?t(`div`,{class:`flex min-w-0 flex-col gap-2`,children:[_.create&&(f||!u&&!i.length)?t(`div`,{class:`flex items-start justify-between gap-2`,"aria-label":e(`app.client.taskDiscussion.newDiscussionTasks`),children:[t(M,{itemIds:m,items:a.props.items??[],href:re,busy:h.busy,onEdit:_.link?()=>{p=!0,a.update()}:void 0}),f?t(o,{variant:`ghost`,size:`small`,disabled:h.busy,mix:r(`click`,()=>{f=!1,a.update()}),children:e(`app.client.taskDiscussion.cancel`)}):null]}):i.length>1?t(s,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.replyingTo`,{name:y?.messages[0]?.author.name??e(`app.client.taskDiscussion.theDiscussion`)})}):null,t(ee,{label:e(`app.client.taskDiscussion.addTaskComment`),placeholder:e(`app.client.taskDiscussion.addContextPlaceholder`),busy:h.busy||b,class:`w-full`,onSubmit:async t=>{if(b)throw Error(e(`app.client.taskDiscussion.loadBeforeReplying`));y&&_.reply?await g({id:y.id,body:t}):(l=(await g({anchor:null,itemIds:m,body:t})).thread.id,u=!!l,f=!1,m=[a.props.itemId],a.update())}},`task-composer`)]}):null]}):t(s,{variant:`ui-caption`,tone:`muted`,children:e(`app.client.taskDiscussion.commentsUnavailable`)}):t(s,{variant:`ui-caption`,tone:`muted`,role:`status`,children:e(`app.client.taskDiscussion.loadingDiscussion`)}),p?t(ge,{project:a.props.project,selected:m,required:[a.props.itemId],onSave:async e=>{m=e,a.update()},onClose:()=>{p=!1,a.update()}}):null]})}}function ze(e,t){return e.revision===null?Object.entries(e.values).some(([e,n])=>JSON.stringify(n)!==JSON.stringify(t.values[e])):e.revision!==t.revision}async function Be(t,n,r,i,a){let[o,s,c]=await Promise.all([P(k.tasksApi.show.href({id:n}),t,i,e=>e),he(t,n,i,a),r]),l=h(o,c);if(l.item.id!==n)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));return{detail:l,discussion:s}}async function Ve(t,n,r,i){let a=await A(t),o=de(a),s=o?Promise.resolve(o):me(t).refresh(n),c=r?S(r):null,l=e=>Be(t.token,c,e,n,i),u=``,d=c?l(s.then(e=>e.schema)).catch(e=>{if(!o||e instanceof pe)throw e;return l(me(t).refresh(n).then(e=>e.schema))}).catch(t=>(u=t instanceof Error?t.message:e(`app.client.projectTasks.couldNotLoadTask`),null)):null;try{await s;let e=await d;return{store:a,stored:!!o,error:``,task:e,taskError:u}}catch(t){return n.throwIfAborted(),{store:a,stored:!1,error:t instanceof Error?t.message:e(`app.client.projectTasks.couldNotLoadTasks`)}}}function He(n){let a=n.props.project,o=n.props.initial.store,s=me(a),c=de(o),l=()=>{let e=c?.snapshot.schemaVersion;c=de(o);let t=m?o.work.get(m.item.id):void 0;(t&&!t.$hasPendingWrites&&ze(N(t),m.item)||!m&&C&&c?.snapshot.schemaVersion!==e)&&q(),G()},u=[o.boards.subscribeChanges(l),o.work.subscribeChanges(l)],d=S(n.props.href),f=y(n.props.href),p=n.props.initial.task,m=p?.detail.item.id===d?p.detail:null,ee=m?p.discussion:void 0,x=!1,C=n.props.initial.task?``:n.props.initial.taskError??``,w=d!==null&&!m&&!C,T=n.props.initial.error,E=null,D=null,O=new Set,A=n.props.href,j,M=!1,pe=!1;function he(e){let t=e?o.work.get(e.item.id):void 0;if(!e||!t?.$hasPendingWrites)return e;let n={...e.item.values,...N(t).values};return{...e,item:{...e.item,values:n}}}function F(){if(!c)throw Error(e(`app.client.projectTasks.refreshBeforeChanges`));return c.schema}async function I(e,t,r){let i=new AbortController;O.add(i);try{return await P(e,a.token,AbortSignal.any([n.signal,i.signal]),r,fetch,{body:t})}finally{O.delete(i)}}async function ge(e){await ce(o.work,{upsert:[e]}),m?.item.id===e.id&&(m={...m,item:e}),G()}async function L(){await K(),d&&await q()}let R=new Map;async function z(t,r,i,a){let o=a?R.get(a):void 0,s=Promise.withResolvers();a&&R.set(a,s.promise);try{let n=await le(i,async()=>{let n=await o,i=`expectedRevision`in r?r.expectedRevision:void 0,c=await I(t,n&&i===n.from&&n.to?{...r,expectedRevision:n.to}:r,e=>_(e,F()));if(a&&c.item.id!==a)throw Error(e(`app.client.projectTasks.differentTaskRefreshRetry`));return await ge(c.item),s.resolve(i?{from:i,to:c.item.revision}:null),c.item});return d&&await q(),n}catch(t){throw s.resolve(null),n.signal.aborted||b.error(e(`app.client.projectTasks.undidTaskChange`),{description:t instanceof Error?t.message:e(`app.client.projectTasks.writeNotConfirmed`)}),L(),t}finally{a&&R.get(a)===s.promise&&R.delete(a)}}function _e(e,t){return()=>{let n=o.work.get(e);if(!n)return;let{values:r}=t(N(n));o.work.update(e,e=>{e.values=r})}}let B=null;async function V(t,r,i){let s=o.work.get(t),c=s?.run;if(!s||!c)return r;let l=F(),u=N(s),d=ae(i(u),l,`status`);if(ae(u,l,`status`)===d)return r;if(Ee.includes(c.state))throw Error(e(`app.client.projectTasks.runPushing`));if(!Te.includes(c.state))return r;let f=Promise.withResolvers(),p=await new Promise(e=>{B={itemId:t,status:l.statuses.find(e=>e.value===d)?.label??d,answer:t=>(e(t),f.promise)},G()});try{if(!p)throw Error(e(`app.client.projectTasks.runKept`));await De(a.token,t,n.signal);let i=await ve.get(t);return{...r,expectedRevision:i.revision??r.expectedRevision}}finally{f.resolve(),B=null,G()}}let H=null,U=e=>{H=e,G()};ye(a.token,U,n.signal),be(a.token).then(U,()=>{});function W(e){let t=H?.enabled?H.statuses:null;if(!t||!e)return;let n=[t.open,t.inProgress,t.needsApproval,t.readyToMerge,t.merged];return{shown:n,collapsed:e.statuses.filter(e=>!n.includes(e.value)&&(e.category===`done`||e.category===`cancelled`)).map(e=>e.value)}}let ve={create:e=>z(k.tasksApi.create.href(),e,()=>{o.work.insert(g(F(),`pending-${crypto.randomUUID()}`,e))}),update:async(e,t)=>{let n=await V(e,t,e=>v(e,t));return z(k.tasksApi.update.href({id:e}),n,_e(e,e=>v(e,n)),e)},act:async(e,t)=>{let n=await V(e,t,e=>te(F(),e,t));return z(k.tasksApi.mutate.href({id:e}),n,_e(e,e=>te(F(),e,n)),e)},get:async t=>{let r=await P(k.tasksApi.show.href({id:t}),a.token,n.signal,e=>h(e,F()));if(r.item.id!==t)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));return r.item},section:(e,t,r=n.signal)=>P(k.tasksApi.section.href({id:e,section:t}),a.token,AbortSignal.any([n.signal,r]),e=>ne(e,F())),sync:async e=>{try{let t=await I(k.tasksApi.sync.href(),e,se);return await L(),t}catch(e){throw L(),e}}};function G(){n.signal.aborted||n.update()}async function K(){E?.abort();let t=new AbortController;E=t,x=!0,T=``,G();try{await s.refresh(AbortSignal.any([n.signal,t.signal]))}catch(r){!t.signal.aborted&&!n.signal.aborted&&(T=r instanceof Error?r.message:e(`app.client.projectTasks.couldNotLoadTasks`))}finally{E===t&&(x=!1,G())}}async function q(){if(D?.abort(),!d){m=null,w=!1,C=``,G();return}let t=d,r=new AbortController;D=r;let i=m?.item.id!==t;i&&(m=null),w=!0,C=``,G();try{let o=AbortSignal.any([n.signal,r.signal]);if(i){let e=await Be(a.token,t,F(),o,n.props.conversationId);if(r.signal.aborted||t!==d)return;m=e.detail,ee=e.discussion;return}let s=await P(k.tasksApi.show.href({id:t}),a.token,o,e=>h(e,F()));if(r.signal.aborted||t!==d)return;if(s.item.id!==t)throw Error(e(`app.client.projectTasks.differentTaskRefresh`));m=s}catch(i){!r.signal.aborted&&!n.signal.aborted&&t===d&&(C=i instanceof Error?i.message:e(`app.client.projectTasks.couldNotLoadTask`))}finally{D===r&&(w=!1,G())}}function J(e,t=!0){e!==d&&(d=e,f=!1,t&&Y(!1),q(),G())}function Y(e){let t=re(null);if(!n.props.active||!fe(window.location.href)&&window.location.pathname!==t&&!window.location.pathname.startsWith(`${t}/`)){M=!0;return}M=!1;let r=f&&d?ie(d):re(d);window.location.pathname+window.location.search+window.location.hash!==r&&(j=new URL(r,window.location.origin).href,window.history[e?`replaceState`:`pushState`]({...window.history.state,budTask:d},``,r))}let X=i((e,t)=>{pe=!0;let r=d;d=S(n.props.href),m?.item.id!==d&&!(C&&r===d)&&q(),n.props.initial.stored&&K(),t.addEventListener(`abort`,()=>{for(let e of u)e.unsubscribe();E?.abort(),D?.abort();for(let e of O)e.abort()},{once:!0})});return()=>{if(pe&&A!==n.props.href){if(A=n.props.href,j!==A){M=!1;let e=S(A),t=y(A);e===d?t!==f&&(f=t):n.queueTask(()=>{J(e,!1),f=t,G()})}j=void 0}M&&n.props.active&&n.queueTask(()=>Y(!0));let i=c,s=m?o.work.get(m.item.id)?.run?.state??m.item.run?.state??null:null,l=m&&s?m.item.id:null,u=i?.snapshot.items.map(e=>({id:e.id,title:ae(e,i.schema,`title`)||void 0}));return t(`div`,{class:`flex h-full min-h-0 flex-col`,mix:X,children:[t(xe,{token:a.token,onAdded:()=>void K()}),B?t(Oe,{itemId:B.itemId,status:B.status,onAnswer:B.answer},B.itemId):null,t(`div`,{class:`min-h-0 flex-1`,children:t(ue,{projectName:a.name,project:{id:a.id,name:a.name},design:n.props.design,storageKey:`bud:tasks:${a.id}:v1`,snapshot:i?.snapshot??null,schema:i?.schema??null,loading:x,error:T,selectedId:d,detail:he(m),discussion:m?t(`div`,{class:`flex min-w-0 flex-col gap-8`,children:[t(Le,{token:a.token,itemId:m.item.id},`context-${m.item.id}`),t(we,{token:a.token,projectId:a.id,itemId:m.item.id,revision:m.item.revision,runState:o.work.get(m.item.id)?.run?.state??m.item.run?.state},`run-${m.item.id}`),t(Re,{project:a,itemId:m.item.id,initial:ee,items:u,conversationId:n.props.conversationId,onChange:L},m.item.id)]}):void 0,detailLoading:w,detailError:C,operations:ve,columns:W(i?.schema??null),pageActions:l?t(oe,{tooltip:!0,icon:`terminal`,active:f,label:e(f?`app.client.projectTasks.closeAgentView`:`app.client.projectTasks.openAgentView`),"data-testid":`agent-view-toggle`,mix:r(`click`,()=>{f=!f,Y(!1),G()})}):void 0,pageFrame:f&&l?e=>t(Me,{token:a.token,itemId:l,runState:s,details:e},`agent-${l}`):void 0,onSelect:J,onReload:()=>{K()},onReloadDetail:()=>{q()}})})]})}}var Ue=u({routes:m,load:({project:e,signal:t,url:n,conversation:r})=>Ve(e,t,n.href,r?.id),render:(e,{project:n,url:r,active:i,taskDesign:a,conversation:o})=>t(He,{project:n,initial:e,design:a,href:r.href,active:i,conversationId:o?.id})});export{Ue as default};
@@ -0,0 +1 @@
1
+ var e=`AGFzbQEAAAABSgxgBX9/f39/AGAEf39/fwF/YAABf2AAAGABfwF/YAF/AGADf39/AGACf38AYAR/f39/AGADf39/AX9gAn9/AX9gBn9/f39/fwF/A1taAgICAgIDAgIEBAICAgICBAQEBAICAgICAgICAgICAgICAgICAgICAgMCAgUEBAYHCAMAAQkKBwcFBwYIBQgGCgMDBgkHBwAHCQUGBwkHCAkEAAIBBAsLBwYHBAUBcAEJCQUDAQAdBgkBfwFBgIDAAAsH7QYyBm1lbW9yeQIADWdldEdyaWRTdHJpZGUAAApnZXRNYXhDb2xzAA4LZ2V0Q2VsbFNpemUAAQ5nZXREZWJ1Z0xvZ01heAACFGdldERlYnVnTG9nRW50cnlTaXplAAEQZ2V0RGVidWdMb2dDb3VudAADDmdldERlYnVnTG9nUHRyAAQNY2xlYXJSZXNwb25zZQAFDmdldFJlc3BvbnNlTGVuAAYOZ2V0UmVzcG9uc2VQdHIABxRnZXRTY3JvbGxiYWNrTGluZUxlbgAIEWdldFNjcm9sbGJhY2tMaW5lAAkbZ2V0U2Nyb2xsYmFja0Rpc2NhcmRlZENvdW50AAoSZ2V0U2Nyb2xsYmFja0NvdW50AAsZZ2V0SHlwZXJsaW5rUmVqZWN0ZWRDb3VudAAMEWdldEh5cGVybGlua0NvdW50AA0UZ2V0SHlwZXJsaW5rQ2FwYWNpdHkADgxnZXRMaW5rSWRMZW4ADwxnZXRMaW5rSWRQdHIAEA1nZXRMaW5rVXJpTGVuABENZ2V0TGlua1VyaVB0cgASDGdldEJlbGxDb3VudAATD2dldFRpdGxlQ2hhbmdlZAAUC2dldFRpdGxlTGVuABULZ2V0VGl0bGVQdHIAFhVnZXRLaXR0eUtleWJvYXJkRmxhZ3MAFx9nZXRTeW5jaHJvbml6ZWRPdXRwdXRHZW5lcmF0aW9uABgVZ2V0U3luY2hyb25pemVkT3V0cHV0ABkOZ2V0Rm9jdXNFdmVudHMAGhBnZXRNb3VzZUVuY29kaW5nABsLZ2V0TW91c2VTZ3IAHBBnZXRNb3VzZVRyYWNraW5nAB0RZ2V0VXNpbmdBbHRTY3JlZW4AHhFnZXRCcmFja2V0ZWRQYXN0ZQAfEGdldEN1cnNvcktleXNBcHAAIAdnZXRSb3dzACEHZ2V0Q29scwAi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gABFDQBBAC8B3JHAgAAOBAAZGQEZC0EALwHeueiAACIGQf8HSw0YIAZBADoAwczwgAAMGAtB7bowIQYDQCAGQe3CMEYNGCAGQdSRwIAAakEAOgAAIAZBAWohBgwACwtBACEGAkBBAC0AgpLAgAAiBw0AQQBBgIKACDYC4LnogABBAEEAOgC6vOiAAAwXCwNAIAZB/wFxIgkgB0H/AXFPDRcCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAlBAXQvAdyRwIAAIg0OMgABAgMEBRQGBwgUFBQUFBQUFBQUFBQJCgsMFA0ODxQUFBQUFBQUEBEUFBQUFBQUFBITFAtBAEGAgoAINgLgueiAAEEAQQA6ALq86IAADBsLQQBBAC0AurzogABBAXI6ALq86IAADBoLQQBBAC0AurzogABBAnI6ALq86IAADBkLQQBBAC0AurzogABBBHI6ALq86IAADBgLIAZBAWoiDUH/AXEiCSAHQf8BcUkNEEEALQC6vOiAACEHDBULQQBBAC0AurzogABBEHI6ALq86IAADBYLQQBBAC0AurzogABBIHI6ALq86IAADBULQQBBAC0AurzogABBwAByOgC6vOiAAAwUC0EAQQAtALq86IAAQYABcjoAurzogAAMEwtBAEEALQC6vOiAAEH8AXE6ALq86IAADBILQQBBAC0AurzogABB+wFxOgC6vOiAAAwRC0EAQQAtALq86IAAQfcBcToAurzogAAMEAtBAEEALQC6vOiAAEHvAXE6ALq86IAADA8LQQBBAC0AurzogABB3wFxOgC6vOiAAAwOC0EAQQAtALq86IAAQb8BcToAurzogAAMDQtBAEEALQC6vOiAAEH/AHE6ALq86IAADAwLIAZB4LnogAAQv4CAgABB/wFxIAZqIQYMCwtBAEGAAjsB4LnogAAMCgsgBkHiueiAABC/gICAAEH/AXEgBmohBgwJC0EAQYACOwHiueiAAAwICyANQWJqIg9B//8DcUEISQ0EIA1B+P8DcUEoRg0DIA1Bpn9qQf//A3FBCEkNAiANQZx/akH//wNxQQhJDQEgB0F/aiEGIAdB/wFxQX9qIQ0DQCANIAlGDQggCUGFksCAAGohByAJQQFqIg8hCSAHLQAARQ0HDAALC0EA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ACEBQQBBCDoAgJLAgABBAEEAOgCZlsCAAEEAQQA7Af6RwIAACyABDwsCQCAAQfABcUEgRw0AAkBBAC0AlpLAgAAiAkEBSw0AIAIgADoAlJLAgABBAEEALQCWksCAAEEBajoAlpLAgAALQQBBAzoAgJLAgABBAA8LAkAgAEFQakH/AXFBzgBLDQBBACAAOgCBksCAAEEAQQA6AICSwIAAQQQPCwJAIABB/wFxQR9LDQBBACAAOgCBksCAAEECDwtBAEEAOgCAksCAAEEAC4YBAAJAIABB//8DcUEALwHGtuiAAE8NACABQf//A3FBAC8BxLbogABB//8DcU8NAEEAKAKwtuiAAEEALwHAtuiAACAAQf//A3EiAGxBDGxqIAFB//8DcUEMbGoiASACKQIANwIAIAFBCGogAkEIaigCADYCAEEAKAK4tuiAACAAakEBOgAACwuRBAEBfyOAgICAAEGACGsiAiSAgICAAEGwtuiAACAAIAEQyoCAgAACQEHIBEUNAEHYkcCAAEEAQcgE/AsAC0EAIAE7Afq56IAAQQAgADsB/LnogABBAEEBOgDAzPCAAEEAQoCAgICAoICAATcB1rnogABBAEKAgoAINwLgueiAAEEAQgA3AJG66IAAQQBCADcAl7rogABBACABOwHwueiAAEEAQQE6AIi66IAAQQBBADsB3rnogABBAEEAOgC+zPCAAEEAQQA6AL3M8IAAQQBBADoAvMzwgABBAEEAOgC7zPCAAEEAQQA6ALq86IAAQQBBADYBsrzogABBAEEANgC1vOiAAEEAQQA2AIm66IAAQQBBADYAjLrogABBAEEAOwHuueiAAEEAQgA3Af656IAAQQBCgAI3AfK56IAAQQBBgAI7Aey56IAAQQBCADcAn7rogABBAEIANwCnuuiAAEEAQQA7AYa66IAAQQBBADoAkLrogABBAEEANgLoueiAAEEAQQA6ALm86IAAQQBBADYCyLbogABBAEEAOwHQtuiAAEEAQQA2AdK56IAAQQBBADYArrrogAACQEGACEUNACACQQBBgAj8CwALQQghAQJAA0AgAUH/B0sNASACIAFqQQE6AAAgAUEIaiEBDAALCwJAQYAIRQ0AQcHM8IAAIAJBgAj8CgAACyACQYAIaiSAgICAAAuFAgEHfwJAIAJB//8DcUUNACABQf//A3EgAEH//wNxTQ0AIAEgAGsiBCACQf//A3EiAiAEQf//A3EiBCACIARJGyIFa0H//wNxIQZBACECA0ACQCAGIAJHDQAgBSAAakH//wNxIQIDQCAAQf//A3EgAk8NA0GwtuiAACAAIAMQuoCAgAAgAEEBaiEADAALCyABIAJBf3NqIgdB//8DcSEEAkBBAC8BxLbogABBDGwiCEUNAEEAKAKwtuiAACIJQQAvAcC26IAAIgogBGxBDGxqIAkgCiAHIAVrQf//A3FsQQxsaiAI/AoAAAtBACgCuLbogAAgBGpBAToAACACQQFqIQIMAAsLC/ABAQR/I4CAgIAAQRBrIgAkgICAgAACQAJAAkBBAC8B5LnogABBAWoiAUH//wNxQQAvAfC56IAAIgJJDQBBAC8B7rnogAAhAUEALQCfuuiAAA0BIAFB//8DcQ0BQQAhAUEAKAKglsCAACIDRQ0BIANBACgCsLbogABBAC8B/LnogAAQvoCAgABBAC8B8LnogAAhAkEALwHuueiAACEBDAELQQAgATsB5LnogAAMAQsgAEGAAjYCDCAAQYACOwEIIABBIDYCBCAAQQAvAeK56IAAOwEKIAEgAkEBIABBBGoQvYCAgAALIABBEGokgICAgAALWAACQCADIAJJDQAgAEIANwIADwsgBEH/AXEhBAJAA0AgAiADRg0BAkAgASADai0AACAERw0AIABBAToABCAAIAM2AgAPCyADQQFqIQMMAAsLIABCADcCAAv1AgEFfyOAgICAAEEQayIEJICAgIAAAkACQCABIANHDQBBASEFIAFFDQEgAEEBIAEbIgYgAkEBIAMbIgdGDQECQCABQRBLDQACQCABQQRPDQAgAC0AACAHLQAARiAAIAFBf2oiA2otAAAgByADai0AAEZxIAAgAUEBdiIDai0AACAHIANqLQAARnEhBQwDC0EAIQMgBEEANgIAIAQgAUF8aiIFNgIEIAQgAUEBdkEMcSIANgIIIAQgBSAAazYCDEEAIQUCQANAIANBEEYNASAHIAQgA2ooAgAiAGooAAAgBiAAaigAAHMgBXIhBSADQQRqIQMMAAsLIAVFIQUMAgsgAUF/akECdkEBaiEAIAYhAyAHIQUCQANAIABBf2oiAEUNASAFKAAAIQIgAygAACEIIANBBGohAyAFQQRqIQUgCCACRw0CDAALCyAGIAFBfGoiA2ooAAAgByADaigAAEYhBQwBC0EAIQULIARBEGokgICAgAAgBQvdAQIFfwF+I4CAgIAAQRBrIgMkgICAgABBACEEAkADQAJAIAIgBEsNAEEAIQUMAgsgASAEaiEGAkACQCAAKAIMIgcgAiAEayIFaiAAKAIISw0AAkAgBUUNACAAKAIEIAdqIAYgBfwKAAALIAAgACgCDCAFajYCDAwBCyAAKAIAKAIAIQcgAyAFNgIEIAMgBjYCACADQQhqIAAgA0EBQQEgBxGAgICAAICAgIAAIAMpAwgiCEIgiKciBUH//wNxDQIgCKchBQsgBSAEaiEEDAALCyADQRBqJICAgIAAIAUL6wEBA38jgICAgABBMGsiAiSAgICAAEEAIQMCQANAIAFB5ABJDQEgAkEPaiADakEfaiABIAFB5ABuIgRB5ABsayIBIAFB/wFxQQpuIgFBCmxrQQh0IAFyQbDgAHI7AAAgA0F+aiEDIAQhAQwACwsCQAJAIAFBCUsNACACQQ9qIANqQSBqIAFBMHI6AAAgA0EgaiEBDAELIAJBD2ogA2pBH2ogASABQf8BcUEKbiIEQQpsa0EIdCAEckGw4AByOwAAIANBH2ohAQsgACACQQ9qIAFqQSEgAWsQtICAgAAhASACQTBqJICAgIAAIAELdgECfwJAQQAvAdK56IAAIgJBgBBGDQBBAC8B1LnogAAhAwJAIAFBwAAgAUHAAEkbIgFFDQAgA0EGdEG7vOiAAGogACAB/AoAAAtBACADQQFqQf8PcTsB1LnogAAgAyABOgC7vPCAAEEAIAJBAWo7AdK56IAACwviAQEBfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFB//8DcSICQZh4ag4RAQsCAwsEBQsLCwsLCwsLBgcACwJAIAJB6XdqDgMICQoAC0GggMCAACEBIAJBL0cNCgwLC0GigMCAACEBDAoLQaSAwIAAIQEMCQtBpoDAgAAhAQwIC0GogMCAACEBDAcLQaqAwIAAIQEMBgtBrIDAgAAhAQwFC0GugMCAACEBDAQLQbCAwIAAIQEMAwtBsoDAgAAhAQwCC0G0gMCAACEBDAELQbaAwIAAIQELIAAgAS8AADsAAAv4BQEKfyOAgICAAEEQayIBJICAgIAAQQJBACAAQQFxIgIbIQNBA0EAIAIbIQRBBEEAIAIbIQVBAC0AgpLAgAAiBkEBIAZBAUsbQQF0IQdBACEGA0ACQAJAAkAgByAGRg0AIAFBDmogBkHckcCAAGovAQAiCBC3gICAACABLQAPDQEMAgsgAUEQaiSAgICAAA8LQQBBAC8B/rnogAAiCUEBIAEtAA5BD3EiCnRyIAlBfiAKd3EgAhs7Af656IAACwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAhBmHhqDhEBEgIDBAUGEhISEhISEhIHCAALAkACQAJAAkACQAJAIAhBemoOBwECFxcXFwMACwJAIAhB6XdqDgMOEQ8ACwJAIAhBAUYNACAIQRRGDQQgCEEZRg0FIAhBL0YNDiAIQdQPRg0QIAhB6g9GDRIMFwtBACACOgCFuuiAAAwWC0EAIAI6AIa66IAADBULQQAgAjoAiLrogAAMFAtBACACOgC9zPCAAAwTC0EAIAI6AIO66IAADBILQQAgAjoAwMzwgAAMEQtB6AchCCACDQ9BACEIQQAvAfi56IAAQegHRw0QDA8LQeoHIQggAg0NQQAhCEEALwH4ueiAAEHqB0cNDwwNC0HrByEIIAINC0EAIQhBAC8B+LnogABB6wdHDQ4MCwtBACACOgCCuuiAAAwNC0EAIAI6AIS66IAADAwLQQAgAzoAhLrogAAMCwtBACAEOgCEuuiAAAwKC0EAIAU6AIS66IAADAkLIABBABDHgICAAAwICyAAQQEQx4CAgAAMBwtBACACOgCAuuiAAAwGCyACDQEQwICAgAAMBQsCQCACRQ0AQQAtAIG66IAADQBBAEEAKALMtuiAAEEBajYCzLbogAALQQAgAjoAgbrogAAMBAsQwYCAgAAMAwtBACAIOwH4ueiAAAwCC0EAIAg7Afi56IAADAELQQAgCDsB+LnogAALIAZBAmohBgwACwvmAQECfyOAgICAAEEQayICJICAgIAAQQAhAyACQQA6AAsgAiABOgAJIAIgADoACCACQgA3AwAgAkEALQCCksCAACIBOgAKIAFBBCABQQRJG0EBdCEBAkADQCABIANGDQEgAiADaiADQdyRwIAAai8BADsBACADQQJqIQMMAAsLQQAtAL/M8IAAIgNBDGwiASACKQMANwHStuiAACABQdq26IAAaiACQQhqKAIANgEAQQAgA0EBakEfcToAv8zwgABBAEEAKALUkcCAAEEBaiIDQX8gAxs2AtSRwIAAIAJBEGokgICAgAALewEDfwJAIAFB//8DcSIDIAAvARZPDQBBACEEQQAhAQJAA0AgASAALwEUTw0BIAAoAgAgAC8BECADbEEMbGogBGoiBSACKQIANwIAIAVBCGogAkEIaigCADYCACAEQQxqIQQgAUEBaiEBDAALCyAAKAIIIANqQQE6AAALC9ACAQN/AkAgAEH//wNxIgRBAC8BxrbogABPDQAgAUH//wNxIgVBAC8BxLbogAAiACAFIABJGyEBAkAgBSACQf//A3EiBiAAIAYgAEkbIgZPDQAgAUEAKAKwtuiAAEEALwHAtuiAACAEbEEMbGoiBSABQQxsai0ACUUgAUH//wNxQQBHcWshASACQf//A3EgAE8NAAJAIAUgBkEMbGotAAkNACAGQQFqIQYMAQsgBiAFIAZBf2pB//8DcUEMbGotAAlBAkZqIQYLQQAgBkH//wNxIgAgAUH//wNxIgFrIgIgAiAASxshACABQQxsIQECQANAIABFDQFBACgCsLbogAAgBEEALwHAtuiAAGxBDGxqIAFqIgIgAykCADcCACACQQhqIANBCGooAgA2AgAgAUEMaiEBIABBf2ohAAwACwtBACgCuLbogAAgBGpBAToAAAsLaQEDf0EAIQEDQAJAAkAgAUHg3QBGDQAgACABaiICQQhqIgMvAQBFDQEgAigCACACQQRqKAIAEMWAgIAADAELIABBADYC6F0gAEIANwLgXQ8LIAJCADcCACADQQA2AgAgAUEMaiEBDAALC+wBAQV/AkAgAkH//wNxRQ0AIAFB//8DcSAAQf//A3FNDQAgAkH//wNxIgIgASAAa0H//wNxIgQgAiAESRshBSABQf//A3EhBiAAQf//A3EhAANAAkAgBSAAaiICIAZJDQADQCAAQf//A3EgAUH//wNxTw0DQbC26IAAIAAgAxC6gICAACAAQQFqIQAMAAsLAkBBAC8BxLbogABBDGwiBEUNAEEAKAKwtuiAACIHIABBAC8BwLbogAAiCGxBDGxqIAcgAiAIbEEMbGogBPwKAAALQQAoAri26IAAIABqQQE6AAAgAEEBaiEADAALCwuGAgEFfyOAgICAAEEQayIDJICAgIAAAkACQAJAIAAgACgC5F1BDGxqIgQvAQggAkH//wNxIgVJDQAgBCgCACEGDAELIANBBGogAkH//wNxIgUQxICAgAAgAy8BDA0BIAMoAgghByADKAIEIQYCQCAELwEIRQ0AIAQoAgAgBCgCBBDFgICAAAsgBCACOwEIIAQgBzYCBCAEIAY2AgALAkAgBUEMbCIFRQ0AIAYgASAF/AoAAAsgBCACOwEKIAAgACgC5F1BAWpB6AdwNgLkXQJAIAAoAuBdIgJB6AdPDQAgACACQQFqNgLgXQwBCyAAIAAoAuhdQQFqNgLoXQsgA0EQaiSAgICAAAvdAgEDf0EAIQICQCAAQQFqQf8BcSIDQQAtAIKSwIAAIgRPDQACQAJAAkAgA0EBdC8B3JHAgABBfmoOBAEDAwADCyAAQQJqQf8BcSIAIARPDQIgAEEBdC8B3JHAgAAhAEECIQIMAQsgAEEEakH/AXEiAyAETw0BIANBAXQvAdyRwIAAIQICQCAAQQJqQf8BcUEBdC8B3JHAgAAiAyAAQQNqQf8BcUEBdC8B3JHAgAAiAEcNACAAIAJB//8DcUcNAEEEIQICQCADQf8BcSIAQQhPDQBBECEADAILAkAgAEH4AU0NAEHnASEADAILIANBeGpB/wFxQQpuQegBaiIAQf8BIABB/wFJGyEADAELIANBBWxB/wBqQf//A3FB/wFuQSRsIABBBWxB/wBqQf//A3FB/wFuQQZsaiACQQVsQf8AakH//wNxQf8BbmpBEGohAEEEIQILIAEgADsBAAsgAguKAQEBf0EAQQAvAda56IAAOwHkueiAAEEAQQAvAdi56IAAOwHeueiAAEEAQQAoAdq56IAANgLgueiAAEEAQQAtALvM8IAAOgC6vOiAAEEAQQAtAJ+66IAAQQdsIgAoAJG66IAANgGyvOiAAEEAIABBlLrogABqKAAANgC1vOiAAEEAQQA6ALzM8IAAC38BAX9BAEEALwHkueiAADsB1rnogABBAEEALwHeueiAADsB2LnogABBAEEAKALgueiAADYB2rnogABBAEEALQC6vOiAADoAu8zwgABBAC0An7rogABBB2wiAEEAKAGyvOiAADYAkbrogAAgAEGUuuiAAGpBACgAtbzogAA2AAAL7gIBBX8CQCAAQf//A3FBAC8BxrbogABPDQAgAUH//wNxQQAvAcS26IAAQf//A3FPDQACQAJAAkACQAJAQQAoArC26IAAIgNBAC8BwLbogAAgAEH//wNxIgBsIgRBDGxqIgUgAUH//wNxIgZBDGxqIgctAAkOAwAFAQULIAZFDQEgBSABQX9qQf//A3FBDGxqIgEtAAlBAkcNASABIAIpAgA3AgAgAUEIaiACQQhqKAIANgIAQQAvAcC26IAAIABsIQRBACgCsLbogAAhAwwBCyAHIAIpAgA3AgAgB0EIaiACQQhqKAIANgIAIAFBAWoiAUH//wNxQQAvAcS26IAATw0CQQAoArC26IAAQQAvAcC26IAAIABsQQxsaiABQf//A3FBDGxqIgEtAAlFDQEMAgsgAyAEQQxsaiAGQQxsaiEBCyABIAIpAgA3AgAgAUEIaiACQQhqKAIANgIAC0EAKAK4tuiAACAAakEBOgAACwudAQEDfyOAgICAAEEQayIDJICAgIAAQQAhBAN/AkAgAkH//wNxIgUNACABQf8BcSECIANBC2pBf2ohBQJAA0AgBEUNASAAIAJqIAUgBGotAAA6AAAgAkEBaiECIARBf2ohBAwACwsgA0EQaiSAgICAACACDwsgA0ELaiAEaiACIAVBCm4iBUEKbGtBMHI6AAAgBEEBaiEEIAUhAgwACwvuAQMBfwF+AX8jgICAgABBIGsiAiSAgICAACACIAGtQgx+IgNCIIinIgRBAEc6ABwCQAJAAkAgBEUNAEKAgICAICEDDAELAkACQCADpyIEDQBC/P///w8hAwwBC0IAQoCAgIAgQQApA5iAwIAAIgOnIARBAkEAIANCIIinKAIAEYGAgIAAgICAgAAiBBsgBK2EIQMgBEUNAQsgAiABNgIUIAIgAz4CECACQQA7ARggAkEQaiEBDAELIAIgA0IgiD0BDCACQQRqIQELIAAgASkCADcCACAAQQhqIAFBCGooAgA2AgAgAkEgaiSAgICAAAsdAAJAIAFFDQAgASAAIAFBDGxBAiABEMaAgIAACwvQAQECfyOAgICAAEEQayIFJICAgIAAIAUgA0EfcToADwJAAkBBICACQQRqIgJBASADdCIDIAIgA0sbIgNBf2pnayICQf//A3FBfWoiBkENTw0AIAFCASACrIanakF8aiAGQQJ0IgMoAuTS8oAANgIAIAMgATYC5NLygAAMAQsgAUIBQSAgA0GDgARqQRB2QX9qZ2siA61C//8Dg4anQRB0akF8aiADQf//A3FBAnQiAygCmNPygAA2AgAgAyABNgKY0/KAAAsgBUEQaiSAgICAAAuEBQEBfwJAIABBAXFBAC0An7rogABGDQBBACgCrLbogAAiAkUNAAJAAkACQCAAQQFxRQ0AIAJBAC8B/LnogABBAC8B+rnogAAQyICAgABB//8DcQ0DQQBBAC0AvszwgAA6AIe66IAAQQBBAC8B5rnogAA7Aeq56IAAQQBBADsB5rnogAAgAUEBcUUNAUEAQQAvAeS56IAAOwH2ueiAAEEAQQAvAeK56IAAOwHsueiAAEEAQQAtALq86IAAOgCQuuiAAEEAQQAoAbK86IAANgCJuuiAAEEAQQAoALW86IAANgCMuuiAAEEAQQAoAd656IAAQRB3NgHyueiAAAwBCyACEMmAgIAAQQBBAC8B6rnogAA7Aea56IAAQQBBADoAn7rogAACQCABQQFxRQ0AQQBBAC8B8rnogAA7AeC56IAAQQBBAC8B7LnogAA7AeK56IAAQQBBAC0AkLrogAA6ALq86IAAQQBBACgAibrogAA2AbK86IAAQQBBACgAjLrogAA2ALW86IAAQQBBAC8B9rnogAAiAEEALwH6ueiAAEF/akH//wNxIgEgACABSRs7AeS56IAAQQBBAC8B9LnogAAiAEEALwH8ueiAAEF/akH//wNxIgEgACABSRs7Ad656IAAQQBBADoAvMzwgABBAEEALQCHuuiAADoAvszwgAALQQAhAANAIABBAC8B+rnogAAiAU8NAkEAKAK4tuiAACAAakEBOgAAIABBAWohAAwACwsgAhDJgICAAEGwtuiAAEEALwH8ueiAAEEALwH6ueiAABDKgICAAEEAQQE6AJ+66IAAQQAvAfq56IAAIQELQQAgATsB8LnogABBAEEAOwHuueiAAAsLuwMDCH8BfgF/I4CAgIAAQRBrIgMkgICAgAAgAC8BECIEIAFBgAgQzICAgAAhBSAALwESIgYgAkGABBDMgICAACEHAkACQCAEIAVB//8DcSICRw0AQQAhASAHQf//A3EgBkH//wNxRg0BCyADIAdB//8DcSIIIAJsEMSAgIAAIAMvAQgiAQ0AIAMoAgQhCSADKAIAIQoCQAJAQQANAEEAKQOYgMCAACILpyAIQQBBACALQiCIpygCABGBgICAAICAgIAAIgYNAQsgCiAJEMWAgIAAQQIhAQwBCwJAIAhFDQAgBkEBIAj8CwALIAJBDGwhDEEAIQEgCiECAkADQCABIAAvARZPDQECQCAALwEUQQxsIgRFDQAgAiAAKAIAIAEgAC8BEGxBDGxqIAT8CgAACyAGIAFqIAAoAgggAWotAAA6AAAgAiAMaiECIAFBAWohAQwACwsCQCAALwEQRQ0AIAAoAgAgACgCBBDFgICAACAAKAIIIAAoAgwQzYCAgAALIAAgBzsBEiAAIAU7ARAgACAINgIMIAAgBjYCCCAAIAk2AgQgACAKNgIAQQAhAQsgA0EQaiSAgICAACABC0QBBH9BACEBAkADQCABQRhGDQEgAUGwtuiAAGoiAi0AACEDIAIgACABaiIELQAAOgAAIAQgAzoAACABQQFqIQEMAAsLC10AAkAgACABIAIQyICAgABB//8DcQ0AIAAgAjsBFiAAIAE7ARRBACEBAkADQCABQf//A3EgAkH//wNxTw0BIAAgARDLgICAACABQQFqIQEgAC8BFiECDAALCw8LAAsSACAAIAFBuIDAgAAQuoCAgAALUwAgAEH//wNxIgBBASAAQQFLGyEAIAFB//8DcSEBIAJB//8DcSECAkADQCAAQf//A3EgAU8NASAAQQF0Qf7/A3EiACACIAAgAkkbIQAMAAsLIAALGgACQCABRQ0AIAEgACABQQAgARDGgICAAAsLDgAgAEKAgICA8AA3AgALBABBBAsEAEEAC6cCAgF+Bn9CACEFAkAgA0UNACADQX9qIQYgAiEHAkACQANAIAEoAgggASgCDCIIayEJIAEoAgQgCGohCiADQX9qIgNFDQECQCAHQQRqKAIAIgggCSAIIAlJGyILRQ0AIAogBygCACAL/AoAAAsgB0EIaiEHIAEgASgCDCALajYCDCAIIAlNDQAMAgsLIAIgBkEDdGoiBygCACELAkACQCAHKAIEIgcOAgMAAQsCQCAJRQ0AIAogCy0AACAJ/AsACyABIAEoAgwgCWo2AgwMAQsDQAJAIAcgCSAJIAdLGyIIRQ0AIAogCyAI/AoAAAsgASABKAIMIAhqNgIMIAogB2ohCiAJIAdJIQggCSAHayEJIAhFDQALC0KAgICAwAAhBQsgACAFNwIACwgAQbCS8oAAC5UCAQR/I4CAgIAAQRBrIgQkgICAgAAgBCACQR9xOgAPQQAhBQJAQX8gAUEEaiIGIAYgAUkbIgFBASACdCICIAEgAksbIgFBf2pnIgJFDQACQAJAQSAgAmsiAkH//wNxQX1qIgZBDU8NAEIBIAKtQv//A4OGpyEHIAZBAnQiAigC5NLygAAiAUUNASACQeTS8oAAaiAHIAFqQXxqKAIANgIAIAEhBQwCCyABQYOABGpBEHYQ1ICAgAAhBQwBCyACQbDS8oAAaiEBAkAgAigCsNLygAAiAkH//wNxDQBBARDUgICAACICRQ0BIAEgAiAHajYCACACIQUMAQsgASACIAdqNgIAIAIhBQsgBEEQaiSAgICAACAFC2QBAn9CAUEgIABBf2pnayIArUL//wODhqchAQJAIABB//8DcUECdCICKAKY0/KAACIARQ0AIAJBmNPygABqIAFBEHQgAGpBfGooAgA2AgAgAA8LQQAgAUAAIgBBEHQgAEF/RhsLHAAgAUEAIAQgBCACIAMgBCAEENaAgIAAQQFxGwvgAQECfyOAgICAAEEQayIGJICAgIAAIAYgA0EfcToAD0F/IARBBGoiByAHIARJGyIEQQEgA3QiAyAEIANLGyEEAkACQAJAIAJBBGoiAiADIAIgA0sbIgNBf2pnIgJBb2pBDEsNACAEQX9qZyIDDQFBACEDDAILQgFBICADQYOABGpBEHZBf2pna61C//8Dg4anQgFBICAEQYOABGpBEHZBf2pna61C//8Dg4anRiEDDAELQgFBICACa61C//8Dg4anQgFBICADa61C//8Dg4anRiEDCyAGQRBqJICAgIAAIAMLvQ0BDH8jgICAgABBEGsiAiSAgICAAEGABCABQf//A3EiA0EBIANBAUsbIgNBgAQgA0GABEkbIAFBgARLGyEEQQAvAfq56IAAIQUCQAJAQYAIIABB//8DcSIBQQEgAUEBSxsiAUGACCABQYAISRsgAEGACEsbIgZBAC8B/LnogAAiB0cNACAEIAVB//8DcUYNAQtBsLbogAAgBiAEEMiAgIAAQf//A3ENAAJAQQAtAJ+66IAARQ0AQQAoAqy26IAAIAYgBBDIgICAAEH//wNxDQELAkAgBiAHSSIIRQ0AIAQgBUH//wNxIgEgBCABSRshCSAGQQxsIQpBACELQQAhDANAIAwgCUYNASAKIQAgBiEBAkADQCAHIAFB//8DcUYNAUEAKAKwtuiAACALQQAvAcC26IAAbGogAGoiA0EAKQK4gMCAADcCACADQQhqQQAoAsCAwIAANgIAIABBDGohACABQQFqIQEMAAsLIAtBDGohCyAMQQFqIQwMAAsLAkAgBCAFQf//A3EiC08NAEEALwHkueiAACIBIARJIgANAEEAIAEgBGtBAWoiASAAGyEMAkBBAC0An7rogAANAEEAKAKglsCAAEUNACAGIAcgCBshACABQf//A3EhA0EAIQEDQCADIAFGDQFBsLbogAAgASAAENiAgIAAQQAoAqCWwIAAQQAoArC26IAAIAFBAC8BwLbogABsQQxsaiAAEL6AgIAAIAFBAWohAQwACwtBACAFIAxBuIDAgAAQvYCAgABBAEEAQQAvAeS56IAAIgEgDEH//wNxayIAIAAgAUsbOwHkueiAAAtBACEBQQAgBDsB+rnogABBACAGOwH8ueiAAEEAIAQ7Aca26IAAQQAgBjsBxLbogAACQCAEIAtNDQACQEEALQCfuuiAAA0AQQAhAUEAKAKglsCAACIARQ0AIAAoAuBdIgAgBCAFa0H//wNxIgMgACADSRsiCEUNAEEAIAUgCGogCEG4gMCAABCwgICAAEEAIQoCQANAIAogCEYNAUEAKAKglsCAACIBKALgXSIARQ0BIAEgAEF/ajYC4F0gASABKALkXUHnB2pB6AdwIgA2AuRdIApBf3MgCGoiDUH//wNxIQkgASAAQQxsaiELQQAhAQNAAkACQCABIAZGDQBBACgCsLbogABBAC8BwLbogAAgCWxBDGxqIAFBDGwiDGohA0G4gMCAACEAIAEgCy8BCk8NASACQQhqIAsoAgAgDGoiAEEIaigCADYCACACIAApAgA3AwAgAiEADAELQbC26IAAIA0gBhDYgICAAEEAKAK4tuiAACAJakEBOgAAIApBAWohCgwCCyADIAApAgA3AgAgA0EIaiAAQQhqKAIANgIAIAFBAWohAQwACwsLQQBBAC8B5LnogAAgCGo7AeS56IAAIAghAQsgASAFaiEBA0AgAUH//wNxIARPDQFBsLbogAAgARDLgICAACABQQFqIQEMAAsLAkAgBiAHTQ0AIAQgBUH//wNxIgEgBCABSRshDCAGIAdrIQkgB0EMbCEFQQAhC0EAIQcDQCAHIAxGDQEgCSEBIAUhAAJAA0AgAUUNAUEAKAKwtuiAACALQQAvAcC26IAAbGogAGoiA0EAKQK4gMCAADcCACADQQhqQQAoAsCAwIAANgIAIAFBf2ohASAAQQxqIQAMAAsLQQAoAri26IAAIAdqQQE6AAAgC0EMaiELIAdBAWohBwwACwtBACAEOwHwueiAAEEAQQA7Ae656IAAQQAhAQJAA0AgAUH//wNxIARPDQFBsLbogAAgAUEALwH8ueiAABDYgICAACABQQFqIQEMAAsLAkBBAC8B3rnogAAgBkkNAEEAIAZBf2o7Ad656IAACwJAQQAvAeS56IAAIARJDQBBACAEQX9qOwHkueiAAAtBACEBAkADQCAEIAFGDQFBACgCuLbogAAgAWpBAToAACABQQFqIQEMAAsLQQAtAJ+66IAARQ0AQQAoAqy26IAAIgsvARYhByALIAQ7ARYgCy8BFCEMIAsgBjsBFCAGIAxrQf//A3FBDGwhCSAMQQxsIQVBACEDA0AgAyAERg0BAkACQCADIAdJDQAgCyADEMuAgIAADAELAkAgBiAMTQ0AIAsoAgAgAyALLwEQbEEMbGogBWohASAJIQADQCAARQ0BIAFBCGpBACgCwIDAgAA2AgAgAUEAKQK4gMCAADcCACAAQXRqIQAgAUEMaiEBDAALCyALIAMgBhDYgICAACALKAIIIANqQQE6AAALIANBAWohAwwACwsgAkEQaiSAgICAAAuwAgEHfyABQf//A3EhA0EAIQFBACEEA0ACQAJAIAFB//8DcSIFIAJB//8DcSIGTw0AAkACQAJAIAAoAgAgAC8BECADbEEMbGoiByAFQQxsaiIILQAJDgMABAECCwJAIAVFDQAgByABQX9qQf//A3FBDGxqLQAJQQJGDQQLIAhBACkCuIDAgAA3AgAgCEEIakEAKALAgMCAADYCAEEBIQQMAwsCQAJAIAFBAWoiCUH//wNxIgUgBk8NACAHIAVBDGxqLQAJRQ0BCyAIQQApAriAwIAANwIAIAhBCGpBACgCwIDAgAA2AgBBASEEIAkhAQwECyABQQJqIQEMAwtBASEEIAhBCWpBAToAAAwBCwJAIARBAXFFDQAgACgCCCADakEBOgAACw8LIAFBAWohAQwACwv7CAENfyOAgICAAEHAujBrIgIkgICAgABBgAQgAUEBIAEbIAFBgARLGyEBQYAIIABBASAAGyAAQYAISxshAAJAAkBBAC0A2NPygABFDQAgACABEK+AgIAAAkBBAC8B7NPygABFDQBBACgC3NPygABBACgC4NPygAAQxYCAgABBACgC5NPygABBACgC6NPygAAQzYCAgAALQQBCADcC7NPygABBAEIANwLk0/KAAEEAQgA3AtzT8oAADAELIAJBsLowaiIDQgA3AwAgAkG4ujBqIgRCADcDACACQgA3A6i6MCACQai6MGogACABEMqAgIAAIAJBADoAl7owIAJBAToAlLowIAJBADoAmLowIAJBAToAnLowIAJBADoAnrowIAJBADoAoLowIAJBADoApLowIAJBADoAorowIAJBADoAo7owIAJBADoAobowIAJBADoAm7owIAJBADoAmrowAkBB3KQoRQ0AIAJBjJIIakEAQdykKPwLAAsgAkH4tjBqIAQpAwA3AgAgAkHwtjBqIAMpAwA3AgAgAiACKQOoujA3Aui2MAJAQZIDRQ0AIAJBgLcwakEAQZID/AsACyACQYeSCGpBADYAACACQQA2AYSSCCACLQCaujAhAyACLQCbujAhBCACLQCkujAhBSACLQCjujAhBiACLQCiujAhByACLQChujAhCCACLQCgujAhCSACLQCeujAhCiACLQCcujAhCwJAQYEQRQ0AIAJBgIAIakEAQYEQ/AsACyACLQCYujAhDCACLQCXujAhDSACLQCUujAhDgJAQYaoKEUNAEHUkcCAACACQYySCGpBhqgo/AoAAAtBACALOgCIuuiAAEEAIAo6AIa66IAAQQAgCToAhbrogABBACAIOgCDuuiAAEEAIAc6AIK66IAAQQAgBjoAgbrogABBACAFOgCAuuiAAEEAIAA7Afy56IAAQQAgATsB+rnogABBAEKAAjcB8rnogABBACABOwHwueiAAEEAQYACNgLsueiAAEEAQgA3AuS56IAAQQBBgAI7AeK56IAAQQBCgIKAiICAgIABNwHaueiAAEEAQQA6AIe66IAAQQBBADoAhLrogABBAEEAOwH+ueiAAEEAQgA3AJe66IAAQQBCADcAkbrogABBAEIANwCJuuiAAEEAIAQ6AJ+66IAAQQBCADcCoLrogABBAEIANwKouuiAAEEAQQA7AbC66IAAAkBBhwJFDQBBsrrogAAgAkGEkAhqQYcC/AoAAAtBACADOgC5vOiAAEEAQQA6ALq86IAAAkBBgZAIRQ0AQbu86IAA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AAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAA==`;export{e as WASM_BASE64};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pages-BJ-tNJ4J.js","assets/i18n-CkO6VFI0.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-CwySIAOl.js","assets/rolldown-runtime-XKyaHtl9.js","assets/method-DybmO5PB.js","assets/project-threads-Bv7IDBgi.js","assets/frame-D6XmK4Df.js","assets/preload-helper-BLdHbfdN.js","assets/cloneFileDiffMetadata-CWfw01dG.js","assets/workspace-tab-Bg2MFdMB.js","assets/project-comments-CPUONfs8.js","assets/project-branches-Ce3rXrkc.js","assets/canvas-Bih9EdKJ.js","assets/project-thread-links-C-TGkq59.js","assets/project-work-DAE9-olg.js","assets/tasks-KWsCLi_h.js","assets/files-1dLuoM2f.js","assets/lru-DzKYIXMA.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./i18n-CkO6VFI0.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,Ht as f,Jn as p,Ot as m,Qn as h,Wt as g,Xn as _,Yn as v,Zn as y,ar as b,cr as x,dt as te,ir as S,mt as C,nt as w,qn as T,rr as E,sr as D}from"./task-design-CwySIAOl.js";import{$ as ne,At as O,Mt as k,Nt as re,Q as ie,X as A,Z as ae,at as oe,b as j,ct as M,et as se,it as ce,jt as le,kt as ue,nt as N,pt as de,rt as fe,t as P,tt as pe,v as me,y as he}from"./project-threads-Bv7IDBgi.js";import{d as ge}from"./method-DybmO5PB.js";import{t as _e}from"./project-work-DAE9-olg.js";import{n as ve}from"./workspace-tab-Bg2MFdMB.js";function ye(e){let n=`connecting`,r=i((t,r)=>{let{project:i}=e.props;_e(i),P(i);let a=he(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 be=new WeakMap;function F(e,t){let n=D(e,t,{abortEarly:!0});if(n.success)return n.value;let r=n.issues[0];throw be.get(r)??Error(r.message)}function I(e,t){return _((n,r)=>{let i=e[`~run`](n,r);return i.issues?d(t,r.path):i})}function L(e,t){return _((n,r)=>{let i=e[`~run`](n,r);if(i.issues)return i;let a=t(i.value);return a===void 0?i:d(a,r.path)})}function R(e,t){return _((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=d(e.message,r.path);return be.set(t.issues[0],e),t}})}function xe(e){return _((t,n)=>e(t)[`~run`](t,n))}function z(e,t){return _((n,r)=>n==null?{value:t()}:e[`~run`](n,r))}function B(e,t){let n=S(t);return _((r,i)=>{if(!r||typeof r!=`object`||Array.isArray(r))return d(`${e} must be an object.`,i.path);for(let n of Object.keys(r))if(!Object.hasOwn(t,n))return d(`${e}.${n} is not a supported setting.`,[...i.path,n]);return n[`~run`](r,i)})}function Se(e,t,n=0){let r=p(e);return _((e,i)=>!Array.isArray(e)||e.length<n?d(t,i.path):r[`~run`](e,i))}var Ce=y(B(`files`,{edit:z(I(v(),`files.edit must be true or false.`),()=>!0)}),()=>({edit:!0})),V=`flows must be [{ id, title, start, script, steps: [{ id, title }], block? }] with short ids, local paths and unique steps.`,we=e=>typeof e==`string`&&/^[a-z0-9][a-z0-9-]{0,62}$/.test(e),H=e=>typeof e==`string`&&e.trim()!==``&&e.length<=200;function Te(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(!we(t)||!H(n)||!H(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 we(t)&&H(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=>!H(e))?null:{id:t,title:n.trim(),start:r,script:i.trim(),steps:s,block:o}}var Ee=_((e,t)=>{if(e===void 0)return{value:[]};if(!Array.isArray(e))return d(V,t.path);let n=e.map(Te);if(n.some(e=>!e))return d(V,t.path);let r=n.map(e=>e.id);return new Set(r).size===r.length?{value:n}:d(V,t.path)});function De(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 Oe=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`}),ke=`logo must be an image path inside the project (.svg, .png, .webp, .jpg, .gif or .ico), or { light, dark }.`;function Ae(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(Oe,n)?t:null}var je=_((e,t)=>{if(e===void 0)return{value:null};let n=Ae(typeof e==`object`&&e?e.light:e),r=typeof e==`object`&&e?e.dark:void 0,i=r===void 0?null:Ae(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}}:d(ke,t.path)}),U=[`open`,`inProgress`,`needsApproval`,`readyToMerge`,`merged`],Me={open:`open`,inProgress:`in_progress`,needsApproval:`needs_approval`,readyToMerge:`ready_to_merge`,merged:`merged`},Ne=`opencode/deepseek-v4.1-flash-free`,W=`factory must be false or an object with statuses, setup, dev, branchPrefix, sleepAfter, instructions and push as documented.`,Pe=/^[A-Za-z][\w-]{0,63}$/,Fe=[`statuses`,`setup`,`dev`,`branchPrefix`,`sleepAfter`,`instructions`,`push`],Ie=/^\.\/(?!.*(?:^|\/)\.\.?(?:\/|$))[\w./-]+$/;function Le(e,t){return typeof e==`string`&&e.trim().length>0&&e.length<=t}function Re(e){if(e===void 0&&(e={}),!e||typeof e!=`object`||Array.isArray(e))return;let{remote:t=`origin`,credential:n=null,username:r=`x-access-token`,...i}=e;if(!Object.keys(i).length&&typeof t==`string`&&/^[\w][\w.-]{0,99}$/.test(t)&&(n===null||typeof n==`string`&&/^[A-Z_][A-Z0-9_]{0,99}$/.test(n))&&typeof r==`string`&&/^[\w][\w.@-]{0,99}$/.test(r))return{remote:t,credential:n,username:r}}function ze(e){if(e===void 0)return null;if(!e||typeof e!=`object`||Array.isArray(e))return;let{command:t,port:n,path:r=`/`,env:i={},...a}=e;if(Object.keys(a).length||!Le(t,4e3)||typeof r!=`string`||!/^\/(?!\/)[^\s#?]{0,500}$/.test(r)||typeof n!=`number`||!Number.isInteger(n)||n<1||n>65535||!i||typeof i!=`object`||Array.isArray(i))return;let o=Object.entries(i);if(!o.some(([e,t])=>!/^[A-Z_][A-Z0-9_]*$/.test(e)||typeof t!=`string`))return{command:t,port:n,path:r,env:Object.fromEntries(o)}}var Be=_((e,t)=>{if(e===void 0||e===!1)return{value:null};if(!e||typeof e!=`object`||Array.isArray(e))return d(W,t.path);let n=e,r=n.statuses??{};if(Object.keys(n).some(e=>!Fe.includes(e))||!r||typeof r!=`object`)return d(W,t.path);let i=r;if(Object.keys(i).some(e=>!U.includes(e)))return d(W,t.path);let a={...Me};for(let e of U){let n=i[e];if(n!==void 0){if(typeof n!=`string`||!Pe.test(n))return d(W,t.path);a[e]=n}}if(new Set(Object.values(a)).size!==U.length)return d(W,t.path);let o=ze(n.dev),s=Re(n.push);if(o===void 0||s===void 0)return d(W,t.path);let c=n.branchPrefix??`dev/`;return typeof c!=`string`||!/^[a-z0-9][a-z0-9._-]*\/$/i.test(c)||c.length>50||n.sleepAfter!==void 0&&!(typeof n.sleepAfter==`number`&&Number.isInteger(n.sleepAfter)&&n.sleepAfter>=0&&n.sleepAfter<=1440)||n.setup!==void 0&&!Le(n.setup,4e3)||n.instructions!==void 0&&!(typeof n.instructions==`string`&&Ie.test(n.instructions))?d(W,t.path):{value:{statuses:a,sandbox:null,agent:{harness:`bud:opencode`,model:Ne,keys:[]},setup:n.setup??null,dev:o,branchPrefix:c,sleepAfter:n.sleepAfter??5,instructions:n.instructions??null,push:s}}}),Ve=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.terminal.terminal-foreground.terminal-cursor.terminal-selection.terminal-black.terminal-red.terminal-green.terminal-yellow.terminal-blue.terminal-magenta.terminal-cyan.terminal-white.terminal-bright-black.terminal-bright-red.terminal-bright-green.terminal-bright-yellow.terminal-bright-blue.terminal-bright-magenta.terminal-bright-cyan.terminal-bright-white`.split(`.`)),He=`theme must be { light, dark }, each mapping Bud's tokens (${Ve.slice(0,3).join(`, `)}, …) to CSS colors or shadows.`;function Ue(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 We(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=Ue(r);if(!Ve.includes(n)||e===null)return null;t[n]=e}return Object.freeze(t)}var Ge=_((e,t)=>{if(e===void 0)return{value:{light:{},dark:{}}};if(!e||typeof e!=`object`||Array.isArray(e))return d(He,t.path);let{light:n,dark:r,...i}=e,a={light:We(n),dark:We(r)};return Object.keys(i).length||!a.light||!a.dark?d(He,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 Ke(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 qe=_((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 d(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 d(G,t.path);let a=i;if(Object.keys(a).some(e=>![`install`,`build`,`serve`].includes(e)))return d(G,t.path);let o={main:r.main===void 0?null:Ke(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])?d(G,t.path):{value:o}});function Je(e,t,n){let r=t?/\.server\.ts$/:/\.(?:ts|tsx|js|jsx)$/;return I(x().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.`))}function Ye(e){return y(xe(t=>t===!1?h([!1]):I(x().refine(e=>/^[\w@:./-]{1,100}$/.test(e)),`storage.${e} is false, or a store named by its plugin, such as bud:beads.`)),`bud:beads`)}var Xe=y(B(`storage`,{work:Ye(`work`),threads:Ye(`threads`)}),()=>({work:`bud:beads`,threads:`bud:beads`})),Ze=y(B(`designs`,{tasks:y(xe(e=>e===`bud:beads`?h([`bud:beads`]):Je(`designs.tasks`,!1)),`bud:beads`),pages:y(h([`path`,`title`]),`path`)}),()=>({tasks:`bud:beads`,pages:`path`})),Qe=new Set([`bud:dom`,`bud:react`,`bud:react-grab`]),$e=Je(`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.`),et=_((e,t)=>{if(e===void 0)return{value:{name:`bud:dom`,module:null}};if(typeof e==`string`&&Qe.has(e))return{value:{name:e,module:null}};let n=$e[`~run`](e,t);return n.issues?n:{value:{name:n.value,module:n.value}}});function tt(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=ge.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 nt(){return{id:`pages`,label:`Pages`,icon:`browser`,path:`/pages`,module:`bud:pages`}}function rt(){return{id:`canvas`,label:`Canvas`,icon:`grid`,path:`/canvas`,module:`bud:canvas`}}function it(){return{id:`tasks`,label:`Tasks`,icon:`tasks`,path:`/tasks`,module:`bud:tasks`}}function at(){return{id:`files`,label:`Files`,icon:`files`,path:`/files`,module:`bud:files`}}var q=[nt(),rt(),it(),at()],ot=new Map(q.map(e=>[e.module,e])),st=[`/comments`,...q.map(e=>e.path),`/api`,`/health`,`/__bud`,`/assets`,`/app`,`/src`,`/node_modules`,`/agents`,`/brand`,`/fonts`,`/frameworks`,`/licenses`],ct=L(I(T().refine(e=>!!e&&typeof e==`object`),`Each screen must be an object.`),({id:e,label:t,icon:n=`layers`,module:r,path:i})=>{if(typeof e!=`string`||!/^[a-z][a-z0-9-]{0,31}$/.test(e))return`Screen ids are 1-32 lowercase letters, digits and hyphens.`;if(typeof t!=`string`||!t.trim())return`Screen ${e} needs a label.`;if(typeof n!=`string`||!n)return`Screen ${e} needs an icon name.`;if(typeof r!=`string`)return`Screen ${e} needs a module.`;let a=ot.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(q.some(t=>t.id===e))return`Screen id "${e}" is reserved for a built-in screen.`;if(st.includes(i))return`Bud reserves the path ${i}.`}),lt=y(R(I(p(T()).refine(e=>e.length>0),`screens must list at least one screen.`),e=>{let t=new Set,n=new Set;return e.map(e=>{let r=F(ct,e),{id:i,label:a,icon:o=`layers`,module:s}=r,c=r.path??ot.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&&tt(r.routes,c),{id:i,label:a,icon:o,path:c,module:s,...r.routes===void 0?{}:{routes:r.routes}}})}),()=>q.map(e=>({...e}))),ut=globalThis,dt=Symbol.for(`@bud.sh/project/plugins`);ut[dt]??=new WeakMap,ut[dt];var ft=`ready must be a CSS selector, { selector } or { expression }.`,J=_((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 d(ft,t.path)}),pt=()=>[`light`,`dark`],mt=()=>[{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 X(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,32)}var ht=_((e,t)=>{if(!Array.isArray(e)||e.length===0||e.length>4)return d(Y,t.path);let n=[];for(let r of e){if(!r||typeof r!=`object`||Array.isArray(r))return d(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||!X(e)||!c(i,240,3840)||a!==void 0&&!c(a,240,4e3)||o!==void 0&&typeof o!=`boolean`)return d(Y,t.path);let l=o??i<800;n.push({id:X(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}:d(Y,t.path)}),gt=y(B(`previews`,{scale:z(I(E().refine(e=>Number.isInteger(e)&&e>=1&&e<=3),`previews.scale must be 1, 2 or 3.`),()=>2),themes:z(I(p(h([`light`,`dark`])).refine(e=>e.length>0&&new Set(e).size===e.length),`previews.themes must list light, dark or both, once each.`),pt),viewports:z(ht,mt),ready:z(J,()=>null),readyTimeout:z(I(E().refine(e=>Number.isInteger(e)&&e>=1e3&&e<=6e5),`previews.readyTimeout must be whole milliseconds from 1000 to 600000.`),()=>6e4),css:z(I(x().refine(e=>e.length<=2e4&&!e.includes(`<`)),`previews.css must be CSS text without <, up to 20000 characters.`),()=>``)}),()=>({scale:2,themes:pt(),viewports:mt(),ready:null,readyTimeout:6e4,css:``})),_t=e=>!!e&&typeof e==`object`;function Z(e,t){let n=S(t);return _((t,r)=>_t(t)?n[`~run`](Array.isArray(t)?{...t}:t,r):d(e,r.path))}var vt=L(Z(`Bud config must export an object.`,{routes:I(p(T()).refine(e=>e.length>0),`bud.config must define at least one route.`),name:b(I(x().refine(e=>!!e.trim()),`name must be a nonempty string.`)),target:b(Z(`target must be an object.`,{origin:T(),port:T()})),comments:b(Z(`comments must be an object.`,{remote:T()})),port:T(),screens:T(),storage:T(),designs:T(),previews:T(),files:T(),logo:T(),theme:T(),locale:T(),factory:T(),picker:T(),branches:T(),flows:T()}),({target:e})=>{if(e?.port===0)return`target.port must be a listening port, not zero.`;if(e?.origin!==void 0&&(typeof e.origin!=`string`||!e.origin.trim()))return`target.origin must be an HTTP(S) origin.`}),yt=L(T().transform(e=>typeof e==`string`?{path:e,title:e===`/`?`Home`:e}:e),e=>{if(!e||typeof e.path!=`string`||!e.path.startsWith(`/`)||e.path.startsWith(`//`))return`Canvas routes must be local paths beginning with a single /.`;if(new URL(e.path,`http://bud.invalid`).origin!==`http://bud.invalid`||e.path.includes(`\\`))return`Canvas routes must stay on the target origin.`;let t=e.id??bt(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&&!D(J,e.ready).success)return`A route ready must be false, a CSS selector, { selector } or { expression }.`}).transform(e=>{let t=bt(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:F(J,e.ready)}}});function bt(e){let t=new URL(e,`http://bud.invalid`),n=t.searchParams.toString();return`${t.pathname}${n?`?${n}`:``}${t.hash}`}var xt=L(Se(yt,`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);R(L(R(L(L(R(L(R(vt,e=>({...e,routes:F(xt,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&&wt(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=F(Ee,e.flows),n=t.flatMap(e=>e.steps.map(t=>De(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:F(lt,e.screens),storage:F(Xe,e.storage),designs:F(Ze,e.designs),previews:F(gt,e.previews),files:F(Ce,e.files),logo:F(je,e.logo),theme:F(Ge,e.theme),locale:e.locale===void 0?`en`:e.locale,factory:F(Be,e.factory),picker:F(et,e.picker),branches:F(qe,e.branches)}));function wt(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 Q(e,t){let n=m();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 Tt(e,t){let n=e?Q(tt(e,t.path),t.url):{route:null,params:{}};if(!n)throw Error(`No screen route matches ${t.url.pathname}.`);return{...t,...n}}var $={"bud:pages":()=>a(()=>import(`./pages-BJ-tNJ4J.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-Bih9EdKJ.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-KWsCLi_h.js`),__vite__mapDeps([23,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,22,18,21])),"bud:files":()=>a(()=>import(`./files-1dLuoM2f.js`),__vite__mapDeps([24,11,1,2,3,6,4,5,7,15,8,9,10,12,16,13,14,25,18,21,22]))};function Et(e){return Object.hasOwn($,e)?$[e]():a(()=>import(e),[])}async function Dt(e,t,n=Et){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?.(Tt(r.routes,t));return t.signal.throwIfAborted(),{screen:r,data:i}}async function Ot(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(),w(r.default)}function kt(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 Ot(r.props.taskDesign,r.signal),a={...await Dt(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&&!Q(h.routes,h.href))throw Error(e(`app.client.screenHost.noRouteMatches`,{href:h.href}));g=Tt(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 At(t,n,r,i,a=fetch){t=g(t);let o=await me(j.comments.get.href({id:t}),r,i,f,a);if(i.throwIfAborted(),o.id!==t)throw Error(e(`app.client.conversationRoute.anotherDiscussion`));let s=M(o),c=n.find(e=>e.module===s.module);if(!c)throw Error(e(`app.client.conversationRoute.enableOwningScreen`));if(c.routes&&!Q(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 jt(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 At(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,w,T=()=>`bud:tabs:${a.props.project?.id}:v1`,E=()=>`${window.location.pathname}${window.location.search}${window.location.hash}`;function D(e){S=e,re(T(),e);let t=a.props.project;t&&(document.cookie=`${fe(t.id)}=${ce(e)}; Path=/; Max-Age=31536000; SameSite=Strict`),y()}function O(){if(!S)return;let e=E();w===e?w=void 0:N(A(S))!==e&&D(oe(S,e))}function M(e){let t=N(A(e));D(e),t!==E()&&(w=t,r(t,{history:`replace`,resetScroll:!1}))}function P(t){let{pathname:n}=new URL(t,`http://bud.local`);if(de(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}}if(te(t)){let n=C(t);if(n)return{href:t,title:e(`app.client.workspace.agentView`,{task:n}),icon:`terminal`}}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 me=i((e,t)=>{v=!0,m&&b(m);function n(){let{pathname:e,search:t,hash:n}=window.location,r=`${e}${t}${n}`,i=de(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&&D(se(k(T()),E(),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(),D(ne(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:te}=a.props,C=JSON.stringify([a.props.active,a.props.location.href,a.props.conversation]);if(p!==C){if(p=C,m=a.props.conversation,h?.abort(),_=``,g=!!m,m){let e=m;v&&a.queueTask(()=>{b(e)})}else f=a.props}let{active:T,module:E,location:D}=f,O=i.find(e=>e.id===T)??i[0];y&&!g&&!_&&d.set(O.id,{module:E,location:D,taskDesign:O.id===`tasks`?te:void 0});let k=S??a.props.initialTabs??(y?ie(D.href,`current`):void 0);k&&a.queueTask(()=>ve(k.active));let re=i.map(e=>e.id===O.id?e:{...e,href:x.get(e.id)??e.href});return t(le,{items:re,activeId:O.id,title:O.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(ye,{project:y}):void 0,tabs:y&&k?t(ue,{tabs:k.tabs.map(e=>({id:e.id,...P(N(e))})),active:k.active,recent:A(k).recent.filter(e=>e!==N(A(k))).map(P),canBack:A(k).index>0,canForward:A(k).index<A(k).entries.length-1,onSelect:e=>M({...k,active:e}),onClose:e=>M(ae(k,e)),onBack:()=>M(pe(k,-1)),onForward:()=>M(pe(k,1)),onNew:()=>M(ne(k,i[0]?.href??`/`,crypto.randomUUID(),!0)),onOpen:e=>{w=void 0,r(e)}}):void 0,children:y?t(`div`,{class:`h-full min-h-0`,mix:me,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!==O.id,children:t(kt,{label:i.find(t=>t.id===e)?.label??e,module:n,taskDesign:r,project:y,location:a,active:!g&&!_&&e===O.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{jt 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-DtISWZp9.js"></script>
37
+ <link data-rmx-preserve-dom rel="modulepreload" crossorigin href="/assets/i18n-CkO6VFI0.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-Cn2mxroU.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 { Gt as Loader, Jt as ToolbarSeparator, K as BranchSidebar, Mn as jsx, On as Fragment, Qt as IconButton, U as CanvasWorkspace, W as captureCanvasPoint, Yt as WorkspaceLayout, Zt as Select, cn as t, dn as Icon, en as Tooltip, fn as ref, hn as on, in as writePreference, l as projectStore, mt as conversationHref, qt as Button, rn as readPreference, t as commentsUnavailable, un as Text } from "./comment-data-BXfMElfx.js";
2
+ import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-Bxp0DCwg.js";
3
+ import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-DpAcDUKR.js";
4
+ import { n as ProjectThreadLinks, t as ProjectMakeTask } from "./project-thread-links-KqQoKBLE.js";
5
5
  //#region app/client/preview-image.tsx
6
6
  var failedHeight = 760;
7
7
  var stopPan = on("pointerdown", (event) => event.stopPropagation());
@@ -289,6 +289,92 @@ function PreviewRefresh(handle) {
289
289
  };
290
290
  }
291
291
  //#endregion
292
+ //#region app/client/task-context.ts
293
+ var CROP = {
294
+ width: 1200,
295
+ height: 800
296
+ };
297
+ var QUALITY = .82;
298
+ /**
299
+ * What a task made from a canvas comment takes along: the page around the comment's point with
300
+ * the point marked, and the element there with its source.
301
+ * @param previews - The canvas's pictures, for the branch the comment is on.
302
+ * @param thread - The discussion.
303
+ * @param sizes - The project's viewports.
304
+ * @returns The context, or undefined when the comment has no picture to take it from.
305
+ */
306
+ async function canvasTaskContext(previews, thread, sizes) {
307
+ let anchor = thread.anchor;
308
+ if (!anchor || "type" in anchor) return void 0;
309
+ let size = sizes.find((candidate) => candidate.width === anchor.viewport) ?? sizes[0];
310
+ if (!size) return void 0;
311
+ let picture = await previews.picture(anchor.pageId, "light", size);
312
+ if (!picture) return void 0;
313
+ let { capture, images } = picture;
314
+ let pin = capture.pins?.find((entry) => entry.id === thread.id && entry.x !== null);
315
+ let point = pin && pin.x !== null && pin.y !== null ? {
316
+ x: pin.x,
317
+ y: pin.y
318
+ } : {
319
+ x: anchor.offsetX * capture.width,
320
+ y: anchor.offsetY
321
+ };
322
+ let [image, element] = await Promise.all([cropAround(capture, images, point).catch(() => void 0), previews.describe(anchor.pageId, capture, point.x, point.y).catch(() => null)]);
323
+ return {
324
+ ...image ? { image } : {},
325
+ element,
326
+ point
327
+ };
328
+ }
329
+ /**
330
+ * Cuts the page around a point out of a capture's slices and marks the point.
331
+ * @param capture - The capture's size, scale and slices.
332
+ * @param images - The slices' images, top to bottom.
333
+ * @param point - The point in CSS pixels.
334
+ * @returns The JPEG as base64.
335
+ */
336
+ async function cropAround(capture, images, point) {
337
+ let width = Math.min(CROP.width, capture.width);
338
+ let height = Math.min(CROP.height, capture.height);
339
+ let left = Math.max(0, Math.min(capture.width - width, Math.round(point.x - width / 2)));
340
+ let top = Math.max(0, Math.min(capture.height - height, Math.round(point.y - height / 2)));
341
+ let canvas = new OffscreenCanvas(width, height);
342
+ let context = canvas.getContext("2d");
343
+ if (!context) throw new Error("No canvas.");
344
+ context.fillStyle = "#fff";
345
+ context.fillRect(0, 0, width, height);
346
+ let tileTop = 0;
347
+ for (let [index, tile] of capture.tiles.entries()) {
348
+ let tileBottom = tileTop + tile.height;
349
+ let from = Math.max(top, tileTop);
350
+ let to = Math.min(top + height, tileBottom);
351
+ if (to > from && images[index]) {
352
+ let bitmap = await createImageBitmap(images[index]);
353
+ context.drawImage(bitmap, left * capture.scale, (from - tileTop) * capture.scale, width * capture.scale, (to - from) * capture.scale, 0, from - top, width, to - from);
354
+ bitmap.close();
355
+ }
356
+ tileTop = tileBottom;
357
+ }
358
+ let x = point.x - left;
359
+ let y = point.y - top;
360
+ context.lineWidth = 6;
361
+ context.strokeStyle = "#fff";
362
+ context.beginPath();
363
+ context.arc(x, y, 18, 0, Math.PI * 2);
364
+ context.stroke();
365
+ context.lineWidth = 3;
366
+ context.strokeStyle = "#ef4444";
367
+ context.stroke();
368
+ let blob = await canvas.convertToBlob({
369
+ type: "image/jpeg",
370
+ quality: QUALITY
371
+ });
372
+ let bytes = new Uint8Array(await blob.arrayBuffer());
373
+ let binary = "";
374
+ for (let index = 0; index < bytes.length; index += 32768) binary += String.fromCharCode(...bytes.subarray(index, index + 32768));
375
+ return btoa(binary);
376
+ }
377
+ //#endregion
292
378
  //#region app/client/project-differences.ts
293
379
  var results = /* @__PURE__ */ new Map();
294
380
  function worker() {
@@ -1006,7 +1092,12 @@ function ProjectCanvas(handle) {
1006
1092
  await comments.loadThread(thread.id, true);
1007
1093
  }
1008
1094
  }),
1009
- renderThreadActions: (thread) => /* @__PURE__ */ jsx(ProjectThreadLinks, {
1095
+ renderThreadActions: (thread) => /* @__PURE__ */ jsx(Fragment, { children: [/* @__PURE__ */ jsx(ProjectMakeTask, {
1096
+ thread,
1097
+ canMake: comments.snapshot.capabilities.link && project.storage.work?.state === "ready",
1098
+ busy: comments.busy,
1099
+ onMake: async (id) => comments.makeTask(id, await canvasTaskContext(previews, thread, sizes).catch(() => void 0))
1100
+ }), /* @__PURE__ */ jsx(ProjectThreadLinks, {
1010
1101
  part: "action",
1011
1102
  project,
1012
1103
  thread,
@@ -1016,7 +1107,7 @@ function ProjectCanvas(handle) {
1016
1107
  await comments.load();
1017
1108
  await comments.loadThread(thread.id, true);
1018
1109
  }
1019
- }),
1110
+ })] }),
1020
1111
  initialThreadId: requestedThread,
1021
1112
  loaded: comments.loaded,
1022
1113
  busy: comments.busy,