@kw-yeh/vibeflow 4.11.36 → 4.11.39

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.
@@ -0,0 +1,13 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9845],{6329:(e,t,s)=>{"use strict";s.d(t,{h:()=>x});var n=s(26514),r=s(72975),a=s(41487),i=s(67297),l=s(5026),o=s(75834),c=s(46816),d=s(68027),u=s(67564),m=s(4416);function x({title:e,children:t,description:s,footer:h,showHeader:f=!1,className:p,contentClassName:g,bodyClassName:b,saving:j=!1,motionVariant:v="dialog",onClose:N}){let y=(0,o.useId)(),w=(0,o.useId)(),k=(0,o.useRef)(null),C=(0,o.useRef)("u">typeof document&&document.activeElement instanceof HTMLElement?document.activeElement:null),S=(0,o.useRef)(N),A=(0,o.useRef)(j),z=(0,a.tF)(),$=(0,i.I)()??!1,E=f||void 0!==s||void 0!==h||void 0!==b,P="drawer"===v,T=(0,u.mB)({timing:"micro",enterDuration:.14,reducedMotion:$}),R=(0,u.mB)({timing:P?"spatial":"standard",exitTiming:"micro",exitDuration:P?.14:void 0,transform:P?{x:16}:{scale:.98},reducedMotion:$});return(0,o.useEffect)(()=>{S.current=N,A.current=j},[N,j]),(0,o.useEffect)(()=>(0,d.$)(),[]),(0,o.useEffect)(()=>{if(!z)return;k.current?.focus();let e=e=>{if("Escape"!==e.key||A.current)return;let t=document.querySelectorAll('[role="dialog"][aria-modal="true"]');t[t.length-1]===k.current&&S.current()};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e),C.current?.focus()}},[z]),(0,n.jsxs)(l.PY1.div,{initial:"hidden",animate:"visible",exit:"exit",inert:!z,"aria-hidden":!z||void 0,"data-dialog-state":z?"present":"exiting",className:(0,m.cn)("fixed inset-0 z-50 flex items-center justify-center p-4",!z&&"pointer-events-none",p),children:[(0,n.jsx)(l.PY1.div,{variants:T,className:"absolute inset-0 bg-background/80",onClick:j||!z?void 0:N}),(0,n.jsx)(l.PY1.div,{variants:R,ref:k,role:z?"dialog":void 0,"aria-modal":z?"true":void 0,"aria-labelledby":z?y:void 0,"aria-describedby":z&&s?w:void 0,tabIndex:-1,className:(0,m.cn)("relative z-10 w-full rounded-lg border bg-card text-card-foreground shadow-lg outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",E&&"flex max-h-[min(90vh,760px)] flex-col overflow-hidden",g),children:E?(0,n.jsxs)(n.Fragment,{children:[f&&(0,n.jsxs)("div",{className:"flex shrink-0 items-start justify-between gap-4 border-b border-border/70 px-5 py-4",children:[(0,n.jsxs)("div",{className:"min-w-0 space-y-1",children:[(0,n.jsx)("h2",{id:y,className:"truncate text-lg font-semibold tracking-tight",children:e}),s&&(0,n.jsx)("div",{id:w,className:"text-sm leading-5 text-muted-foreground",children:s})]}),(0,n.jsx)(c.K,{"aria-label":`關閉${e}`,onClick:N,disabled:j,className:"mt-0.5 shrink-0 p-1",children:(0,n.jsx)(r.A,{className:"size-4"})})]}),!f&&(0,n.jsx)("h2",{id:y,className:"sr-only",children:e}),(0,n.jsx)("div",{className:(0,m.cn)("min-h-0 flex-1 overflow-y-auto px-5 py-4",b),children:t}),h&&(0,n.jsx)("div",{className:"flex shrink-0 items-center justify-between gap-3 border-t border-border/70 bg-muted/20 px-5 py-3",children:h})]}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("h2",{id:y,className:"sr-only",children:e}),t]})})]})}},23072:(e,t,s)=>{"use strict";s.d(t,{h:()=>l});var n=s(26514),r=s(75834),a=s(4416);let i=(0,r.lazy)(()=>Promise.all([s.e(7045),s.e(7915)]).then(s.bind(s,37915)));function l({source:e,compact:t=!1,className:s}){return(0,n.jsx)("div",{className:(0,a.cn)("prose max-w-none break-words rounded-md bg-muted/30 p-3 text-muted-foreground",t?"prose-xs":"prose-sm",s),children:(0,n.jsx)(r.Suspense,{fallback:null,children:(0,n.jsx)(i,{source:e,compact:t})})})}},24464:(e,t,s)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/home",function(){return s(84652)}])},26374:(e,t,s)=>{"use strict";function n(){return window.vibeflow??null}function r(){return null!==n()}async function a(){let e=n();return e?e.getState():null}async function i(){let e=n();return e?e.getVersion():null}async function l(){let e=n();return e?e.getUpdateStatus():null}async function o(){let e=n();return e?e.checkForUpdate():null}async function c(){let e=n();e&&await e.openUpdateTerminal()}function d(e){let t=n();return t?t.onUpdateAvailable(e):()=>{}}async function u(e){let t=n();t&&await t.setBoard(e)}async function m(e){let t=n();return t?t.setSettings(e):null}async function x(){let e=n();return e?e.getJevKeyStatus():null}async function h(e){let t=n();return t?t.saveJevApiKey(e):null}async function f(){let e=n();return e?e.removeJevApiKey():null}async function p(){let e=n();return e?e.getGithubAuthStatus():null}async function g(e){let t=n();return t?t.getGithubInbox(e):null}async function b(){let e=n();return e?e.getJiraAuthStatus():null}async function j(){let e=n();e&&await e.startJiraAuthLogin()}async function v(){let e=n();e&&await e.cancelJiraAuthLogin()}async function N(e){let t=n();t&&await t.inputJiraAuthLogin(e)}async function y(){let e=n();return e?e.logoutJiraAuth():null}function w(e){let t=n();return t?t.onJiraAuthEvent(e):()=>{}}async function k(e){let t=n();return t?t.getJiraInbox(e):null}async function C(e){let t=n();return t?t.getGithubTaskLinks(e):{}}async function S(){let e=n();e&&await e.startGithubAuthLogin()}async function A(){let e=n();e&&await e.cancelGithubAuthLogin()}async function z(){let e=n();return e?e.logoutGithubAuth():null}function $(e){let t=n();return t?t.onGithubAuthEvent(e):()=>{}}function E(e){return window.prompt(e)?.trim()||null}async function P(e="選擇資料夾"){let t=n();if(!t)return null;try{let s=await t.pickFolder({title:e});if("path"in s)return s.path;if("canceled"in s)return null}catch{}return E("輸入資料夾的絕對路徑")}async function T(e){let t=n();return t?t.getGitInfo(e):null}async function R(){let e=n();return e?e.listRecentProjects():[]}async function I(e){let t=n();return t?t.initRepository(e):null}async function D(){let e=n();return e?e.detectAgents():[]}async function K(e,t=!1){let s=n();return s?s.listAgentModels(e,t):null}async function B(e){let t=n();return t?t.createTask(e):null}async function F(e){let t=n();return t?t.updateTask(e):null}async function _(e){let t=n();return t?t.resetTaskRun(e):null}async function M(e){let t=n();return t?t.getDiff(e):[]}async function L(e,t){let s=n();return s?s.getDiffEntries(e,t):[]}async function V(e,t){let s=n();return s?s.getDiffFile(e,t):null}async function G(e){let t=n();return t?t.listArtifacts(e):[]}async function O(e,t){let s=n();return s?s.readArtifact(e,t):null}async function H(e){let t=n();return t?t.openArtifactsDir(e):"bridge unavailable"}async function J(e){let t=n();return t?t.getSpecs(e):[]}async function W(e){return n()?E("skill"===e?"輸入 skill 目錄的絕對路徑(需含 SKILL.md)":`輸入 ${e} 檔案的絕對路徑`):null}async function U(){let e=n();return e?e.listLibrary():[]}async function q(e,t){let s=n();return s?s.importLibraryEntry({kind:e,sourcePath:t}):null}async function Y(e,t,s,r){let a=n();return a?a.createLibraryEntry({kind:e,name:t,content:s,description:r}):null}async function X(e,t){let s=n();return s?s.readLibraryEntry({kind:e,name:t}):null}async function Q(e,t,s){let r=n();return r?r.updateLibraryEntry({kind:e,name:t,content:s}):null}async function Z(e,t){let s=n();return!!s&&s.deleteLibraryEntry({kind:e,name:t})}async function ee(e){let t=n();return t?t.restoreBuiltinSkill({name:e}):null}async function et(){let e=n();return e?e.listRemovedBuiltinSkills():[]}async function es(e){let t=n();t&&await t.openExternal(e)}function en(e){let t=n();return t?t.onStateChanged(e):()=>{}}async function er(e){let t=n();if(!t)return null;try{return await t.getProgress(e)}catch{return null}}function ea(e){let t=n();return t?t.onProgressUpdate(e):()=>{}}function ei(e){let t=n();return t?t.onProgressNotify(e):()=>{}}async function el(e){let t=n();return t?t.cleanupTask(e):null}async function eo(e){let t=n();return t?t.deleteTask(e):null}async function ec(e){let t=n();return t?t.attachments.write(e):[]}async function ed(e){let t=n();return t?t.term.start(e):null}async function eu(e){let t=n();return t?t.term.startStandalone(e):null}async function em(e,t){let s=n();return s?s.term.renameStandalone(e,t):null}function ex(e,t){n()?.term.input(e,t)}function eh(e,t,s){n()?.term.resize(e,t,s)}function ef(e){n()?.term.kill(e)}async function ep(e){await n()?.term.scrollToBottom(e)}async function eg(e){let t=n();return!!t&&t.term.sessionExists(e)}function eb(e){let t=n();return t?t.term.onData(e):()=>{}}async function ej(e,t){let s=n();return s?s.term.readFile(e,t):null}async function ev(e,t){let s=n();return s?s.term.existingFiles(e,t):null}async function eN(e,t){let s=n();return s?s.term.openFile(e,t):null}s.d(t,{AD:()=>eu,BO:()=>u,Bj:()=>A,Br:()=>eN,C7:()=>a,EA:()=>z,Eb:()=>U,Er:()=>p,FS:()=>f,Gw:()=>M,It:()=>P,K4:()=>g,KG:()=>D,Kg:()=>l,Mk:()=>h,N9:()=>ej,P7:()=>y,Qb:()=>c,Qk:()=>eb,R9:()=>O,TG:()=>S,Tw:()=>ev,UT:()=>B,Vc:()=>eg,Vz:()=>ef,WL:()=>_,Wc:()=>L,YK:()=>v,Yd:()=>et,Yq:()=>em,ZS:()=>Q,_5:()=>ei,_B:()=>el,_O:()=>d,_R:()=>C,aT:()=>r,c:()=>W,dU:()=>ed,eF:()=>j,hE:()=>q,jT:()=>T,jt:()=>x,kK:()=>es,kt:()=>ep,lC:()=>F,lX:()=>o,lr:()=>H,ly:()=>J,lz:()=>en,ny:()=>b,oc:()=>m,qX:()=>ea,qe:()=>R,qw:()=>K,re:()=>$,ry:()=>Z,s0:()=>ec,sQ:()=>V,sp:()=>X,su:()=>i,t3:()=>eh,uq:()=>Y,vj:()=>ee,vq:()=>eo,wn:()=>G,y$:()=>w,y4:()=>er,yl:()=>N,zY:()=>I,zh:()=>k,zj:()=>ex})},46816:(e,t,s)=>{"use strict";s.d(t,{K:()=>l});var n=s(26514),r=s(75834),a=s(4416);let i={default:"text-muted-foreground hover:bg-accent hover:text-foreground",primary:"text-muted-foreground hover:bg-accent hover:text-primary",danger:"text-muted-foreground hover:bg-destructive/15 hover:text-destructive"},l=r.forwardRef(({className:e,children:t,tone:s="default",type:r="button",...l},o)=>(0,n.jsx)("button",{ref:o,type:r,className:(0,a.cn)("inline-flex shrink-0 items-center justify-center rounded-full p-1.5 transition-colors outline-none active:scale-95 motion-reduce:transform-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 disabled:active:scale-100 [&_svg]:pointer-events-none",i[s],e),...l,children:t}));l.displayName="IconButton"},54996:(e,t,s)=>{"use strict";s.d(t,{$:()=>o});var n=s(26514),r=s(75834),a=s(24779),i=s(4416);let l=(0,a.F)("inline-flex items-center justify-center gap-2 whitespace-nowrap text-base font-medium transition-colors active:scale-95 motion-reduce:transform-none disabled:pointer-events-none disabled:opacity-50 disabled:active:scale-100 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",{variants:{variant:{default:"rounded-full bg-primary text-primary-foreground hover:bg-primary/90",destructive:"rounded-full bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"rounded-lg border bg-background hover:bg-accent hover:text-accent-foreground",secondary:"rounded-lg bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"rounded-lg hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}}),o=r.forwardRef(({className:e,variant:t,size:s,...r},a)=>(0,n.jsx)("button",{ref:a,className:(0,i.cn)(l({variant:t,size:s,className:e})),...r}));o.displayName="Button"},67564:(e,t,s)=>{"use strict";s.d(t,{mB:()=>l,n:()=>i});let n={micro:.12,standard:.16,spatial:.18},r={enter:[.2,0,0,1],exit:[.4,0,1,1]};function a(e,t,s,i=n[e]){return{duration:t?.01:i,ease:r[s]}}function i({timing:e,enterDuration:t,initialOpacity:s=0,transform:n,reducedMotion:r}){return{hidden:{opacity:s,...r?{}:n??{}},visible:{opacity:1,...r?{}:{...n?.x===void 0?{}:{x:0},...n?.y===void 0?{}:{y:0},...n?.scale===void 0?{}:{scale:1}},transition:a(e,r,"enter",t)}}}function l({timing:e,enterDuration:t,initialOpacity:s,exitTiming:n="micro",exitDuration:r,transform:o,exitTransform:c=o,reducedMotion:d}){return{...i({timing:e,enterDuration:t,initialOpacity:s,transform:o,reducedMotion:d}),exit:{opacity:0,...d?{}:c??{},transition:a(n,d,"exit",r)}}}},68027:(e,t,s)=>{"use strict";s.d(t,{$:()=>r,o:()=>a});let n=0;function r(){n+=1;let e=!1;return()=>{e||(e=!0,n-=1)}}function a(){return n>0}},84652:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>nD});var n=s(26514),r=s(75834),a=s(24322),i=s.n(a),l=s(18690),o=s(80527),c=s(67297),d=s(5026),u=s(74567),m=s(29334),x=s(71520),h=s(44416),f=s(78617),p=s(42533),g=s(54903),b=s(71353),j=s(58629),v=s(18319),N=s(17329),y=s(70170),w=s(87854),k=s(78141),C=s(85781),S=s(38031);let A={judging:"判斷任務中…",scouting:"補充 context 中…",selecting:"選擇模型中…"};function z(e){return"routing"!==e.status?"":e.phase?A[e.phase]:"判斷任務中…"}function $(e,t){let s=e.effort??"模型預設 effort";return t?`Jev effort:${s}`:`Jev:${e.model??"CLI 預設模型"} \xb7 ${s}`}let E="text-xs font-semibold uppercase tracking-wider text-muted-foreground";var P=s(46816),T=s(4416);let R=[{id:"board",label:"看板"},{id:"workspace",label:"工作區"},{id:"github",label:"工作項目"},{id:"terminals",label:"終端機"}];function I({value:e,onChange:t}){return(0,n.jsx)("div",{role:"tablist","aria-label":"檢視",className:"flex h-full items-stretch gap-4",children:R.map(s=>{let r=s.id===e;return(0,n.jsx)("button",{type:"button",role:"tab","aria-selected":r,onClick:()=>t(s.id),className:(0,T.cn)("-mb-px flex items-center border-b-2 px-1 text-sm font-medium outline-none transition-colors motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50",r?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),children:s.label},s.id)})})}var D=s(26374);let K={open:"text-success",draft:"text-muted-foreground",merged:"text-primary",closed:"text-destructive"},B={open:"Open",draft:"Draft",merged:"Merged",closed:"Closed"},F={APPROVED:"已核准",CHANGES_REQUESTED:"要求修改",REVIEW_REQUIRED:"待 review"};function _(e){return`${e.repo}#${e.number}`}function M(e,t=Date.now()){let s=Date.parse(e);if(Number.isNaN(s))return"";let n=Math.max(0,Math.floor((t-s)/6e4));if(n<1)return"剛剛";if(n<60)return`${n} 分鐘前`;let r=Math.floor(n/60);if(r<24)return`${r} 小時前`;let a=Math.floor(r/24);return a<7?`${a} 天前`:a<30?`${Math.floor(a/7)} 週前`:a<365?`${Math.floor(a/30)} 個月前`:`${Math.floor(a/365)} 年前`}function L(e){let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let s=e=>String(e).padStart(2,"0");return`${t.getFullYear()}-${s(t.getMonth()+1)}-${s(t.getDate())} ${s(t.getHours())}:${s(t.getMinutes())}`}var V=s(26392),G=s(379);function O(e){return e.input+e.output+e.cacheRead+e.cacheWrite}function H(e){return e&&0!==e.length?{done:e.filter(e=>"completed"===e.status).length,total:e.length}:null}function J({done:e,total:t,className:s}){return(0,n.jsx)("span",{role:"progressbar","aria-valuemin":0,"aria-valuemax":t,"aria-valuenow":e,"aria-label":`完成 ${e}/${t} 個步驟`,className:(0,T.cn)("relative block h-1 overflow-hidden rounded-full bg-border",s),children:(0,n.jsx)("span",{className:"absolute inset-y-0 left-0 rounded-full bg-primary transition-[width] motion-reduce:transition-none",style:{width:`${e/t*100}%`}})})}function W({dot:e,spinning:t,label:s,className:r}){return t?(0,n.jsx)("span",{role:"img","aria-label":s,title:s,className:(0,T.cn)("flex shrink-0",r),children:(0,n.jsx)(k.A,{"aria-hidden":"true",className:"size-3 animate-spin text-warning motion-reduce:animate-none"})}):(0,n.jsx)("span",{role:"img","aria-label":s,title:s,className:(0,T.cn)("size-1.5 shrink-0 rounded-full",e,r)})}function U(e){return e?.state==="waiting"?"permission"===e.waitingFor?{dot:"bg-warning",spinning:!1,label:"等待權限"}:{dot:"bg-primary",spinning:!1,label:"等待輸入"}:{dot:"bg-warning",spinning:!0,label:e?.tool?`執行中:${e.tool}`:"執行中"}}function q({progress:e,usage:t}){let s=e?.totalUsage??t;if(!e&&!s)return null;let r=H(e?.todos??null),a=s?O(s):0;return(0,n.jsxs)("div",{className:"mt-2 flex items-center gap-2 text-xs text-muted-foreground",children:[e&&(0,n.jsx)(W,{...U(e.activity)}),r&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("span",{className:"shrink-0 tabular-nums",children:[r.done,"/",r.total]}),(0,n.jsx)(J,{done:r.done,total:r.total,className:"min-w-8 flex-1"})]}),!r&&(0,n.jsx)("span",{className:"flex-1"}),a>0&&(0,n.jsxs)("span",{className:"shrink-0 tabular-nums",title:`${a.toLocaleString()} tokens`,children:[a<1e3?String(a):a<1e6?`${(a/1e3).toFixed(+(a<1e4))}k`:`${(a/1e6).toFixed(2)}M`," tok"]})]})}function Y({progress:e,mark:t=!0}){let s=H(e?.todos??null),r=t&&!!e;return s||r?(0,n.jsxs)("span",{className:"flex shrink-0 items-center gap-1.5 text-xs text-muted-foreground",children:[r&&(0,n.jsx)(W,{...U(e?.activity)}),s&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(J,{done:s.done,total:s.total,className:"w-10"}),(0,n.jsxs)("span",{className:"tabular-nums",children:[s.done,"/",s.total]})]})]}):null}function X({status:e}){return"completed"===e?(0,n.jsx)(V.A,{className:"mt-0.5 size-3.5 shrink-0 text-primary"}):"in_progress"===e?(0,n.jsx)(f.A,{className:"mt-0.5 size-3.5 shrink-0 text-foreground"}):(0,n.jsx)(G.A,{className:"mt-0.5 size-3.5 shrink-0 text-muted-foreground/60"})}function Q({usage:e,contextTokens:t}){let s=[["輸入",e.input],["輸出",e.output],["快取讀取",e.cacheRead],["快取寫入",e.cacheWrite]];return(0,n.jsxs)("dl",{className:"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm",children:[s.map(([e,t])=>(0,n.jsxs)("div",{className:"contents",children:[(0,n.jsx)("dt",{className:"text-muted-foreground",children:e}),(0,n.jsx)("dd",{className:"text-right tabular-nums",children:t.toLocaleString()})]},e)),e.reasoning>0&&(0,n.jsxs)("div",{className:"contents",children:[(0,n.jsx)("dt",{className:"text-muted-foreground",children:" 其中推理"}),(0,n.jsx)("dd",{className:"text-right tabular-nums text-muted-foreground",children:e.reasoning.toLocaleString()})]}),(0,n.jsxs)("div",{className:"contents font-medium",children:[(0,n.jsx)("dt",{children:"合計"}),(0,n.jsx)("dd",{className:"text-right tabular-nums",children:O(e).toLocaleString()})]}),null!=t&&t>0&&(0,n.jsxs)("div",{className:"contents",children:[(0,n.jsx)("dt",{className:"text-muted-foreground",children:"目前 context"}),(0,n.jsx)("dd",{className:"text-right tabular-nums text-muted-foreground",children:t.toLocaleString()})]})]})}function Z({progress:e,usage:t}){var s;let r=e?.totalUsage??t;if(!e&&!r)return null;let a=H(e?.todos??null),i=e?"waiting"===(s=e.activity).state?"permission"===s.waitingFor?"等待權限":"等待輸入":"working"===s.state?s.tool?`執行中:${s.tool}`:"執行中":null:null,l=e?function(e){if(!e)return null;let t=Math.max(0,Math.round((Date.now()-e)/1e3));return t<60?`${t} 秒前`:t<3600?`${Math.floor(t/60)} 分鐘前`:`${Math.floor(t/3600)} 小時前`}(e.activity.at):null,o=e&&O(e.totalUsage)>O(e.runUsage);return(0,n.jsxs)("section",{className:"space-y-3 rounded-md border border-border/70 p-3","aria-label":"任務進度",children:[e&&(0,n.jsxs)("div",{className:"space-y-2",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{className:E,children:"進度"}),a&&(0,n.jsxs)("span",{className:"text-xs tabular-nums text-muted-foreground",children:[a.done,"/",a.total]}),(0,n.jsx)("span",{className:"flex-1"}),i&&(0,n.jsxs)("span",{className:(0,T.cn)("flex items-center gap-1 text-xs","waiting"===e.activity.state?"text-primary":"text-muted-foreground"),children:["working"===e.activity.state&&(0,n.jsx)(k.A,{className:"size-3 animate-spin motion-reduce:animate-none"}),i,l&&(0,n.jsxs)("span",{className:"text-muted-foreground",children:["\xb7 ",l]})]})]}),a&&(0,n.jsx)(J,{done:a.done,total:a.total}),e.todos&&e.todos.length>0?(0,n.jsx)("ul",{className:"space-y-1 text-sm",children:e.todos.map((e,t)=>(0,n.jsxs)("li",{className:"flex items-start gap-2",children:[(0,n.jsx)(X,{status:e.status}),(0,n.jsx)("span",{className:(0,T.cn)("min-w-0 break-words","completed"===e.status&&"text-muted-foreground line-through","in_progress"===e.status&&"font-medium"),children:"in_progress"===e.status&&e.activeForm?e.activeForm:e.content})]},e.id??`${t}:${e.content}`))}):(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"Agent 尚未建立待辦清單。"})]}),r&&O(r)>0&&(0,n.jsxs)("div",{className:"space-y-2",children:[(0,n.jsxs)("span",{className:E,children:["Token 使用量",o?"(含先前執行)":""]}),(0,n.jsx)(Q,{usage:r,contextTokens:e?.contextTokens})]})]})}let ee=["backlog","in_progress","done"],et={backlog:"Backlog",in_progress:"In Progress",done:"Done"},es={backlog:"bg-muted-foreground/60",in_progress:"bg-warning animate-pulse",done:"bg-success"};function en(e){if("master"===e.role)return"Master";if(e.projectName)return e.projectName;let t=(e.projectPath??"").split(/[/\\]/).filter(Boolean);return t[t.length-1]??"未指定專案"}function er(e,t){let s=(0,r.useRef)(null);return(0,r.useEffect)(()=>{if(!e)return;let n=e=>{s.current?.contains(e.target)||t()},r=e=>{"Escape"===e.key&&t()};return window.addEventListener("mousedown",n),window.addEventListener("keydown",r),()=>{window.removeEventListener("mousedown",n),window.removeEventListener("keydown",r)}},[e,t]),s}let ea="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors motion-reduce:transition-none";function ei({task:e,anchor:t,onEdit:s,onDelete:a,onClose:i}){let[l,o]=(0,r.useState)(!1),c=er(!0,i),d=Math.max(8,Math.min(t.right-208,window.innerWidth-208-8)),u=Math.max(8,Math.min(t.top,window.innerHeight-224));return(0,n.jsxs)("div",{ref:c,role:"menu",style:{top:u,left:d},onClick:e=>e.stopPropagation(),className:"fixed z-50 w-52 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg",children:[s&&(0,n.jsxs)("button",{type:"button",role:"menuitem",onClick:()=>{s(),i()},className:(0,T.cn)("focus-visible:ring-[3px] focus-visible:ring-ring/50",ea,"hover:bg-accent hover:text-accent-foreground"),children:[(0,n.jsx)(x.A,{className:"size-3.5 shrink-0"}),"編輯任務"]}),l?(0,n.jsxs)("div",{className:"flex items-center gap-1 rounded-sm bg-destructive/10 p-1",children:[(0,n.jsx)("button",{type:"button",onClick:()=>o(!1),className:"rounded-sm px-2 py-1 text-sm text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:"取消"}),(0,n.jsx)("button",{type:"button",onClick:()=>{a(),i()},className:"ml-auto rounded-sm px-2 py-1 text-sm font-medium text-destructive outline-none transition-colors motion-reduce:transition-none hover:bg-destructive/15 focus-visible:ring-[3px] focus-visible:ring-ring/50",children:"確認刪除"})]}):(0,n.jsxs)("button",{type:"button",role:"menuitem",onClick:()=>o(!0),className:(0,T.cn)("focus-visible:ring-[3px] focus-visible:ring-ring/50",ea,"text-destructive hover:bg-destructive/15"),title:`刪除任務「${e.title}」(清理 worktree)`,children:[(0,n.jsx)(h.A,{className:"size-3.5 shrink-0"}),"刪除任務"]})]})}function el({link:e}){let t="issue"===e.kind?f.A:"draft"===e.state?p.A:g.A,s="issue"===e.kind?"Issue":"PR";return(0,n.jsxs)("button",{type:"button",title:`${s} #${e.number} \xb7 ${B[e.state]}(在 GitHub 開啟)`,"aria-label":`在 GitHub 開啟 ${s} #${e.number}`,onClick:t=>{t.stopPropagation(),(0,D.kK)(e.url)},className:(0,T.cn)("flex shrink-0 items-center gap-0.5 rounded-xs outline-none hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50",K[e.state]),children:[(0,n.jsx)(t,{className:"size-3"}),"#",e.number]})}function eo({id:e,className:t}){return(0,n.jsx)("span",{className:(0,T.cn)("shrink-0 font-mono text-[11px] text-muted-foreground/80",t),title:`任務 id:${e}`,children:e})}function ec(e,t,s){return"done"===e?{dot:"bg-success",label:"Done"}:"backlog"===e?t.launchError?{dot:"bg-destructive",label:"開始失敗"}:{dot:"bg-muted-foreground/60",label:"Backlog"}:s?.activity.state==="waiting"&&"permission"===s.activity.waitingFor?{dot:"bg-warning",label:"等待權限"}:s?.activity.state==="waiting"?{dot:"bg-primary",label:"等待回覆"}:{dot:"bg-warning",label:"執行中",spinning:!0}}function ed(e){let t=e?.todos;return t?.length?`${t.filter(e=>"completed"===e.status).length}/${t.length}`:null}function eu({slaves:e,progress:t,selectedTaskId:s,onSelectTask:r}){return(0,n.jsx)("ul",{className:"ml-3 mt-1 space-y-0.5 border-l-2 border-master/40 pl-2","aria-label":"Slave 卡片",children:e.map(({task:e,column:a})=>{let i=ec(a,e,t[e.id]),l="in_progress"===a?ed(t[e.id]):null;return(0,n.jsx)("li",{children:(0,n.jsxs)("button",{type:"button",onClick:()=>r(e.id),title:`${e.title} \xb7 ${en(e)} \xb7 ${i.label}`,className:(0,T.cn)("flex w-full items-center gap-2 rounded-sm px-1.5 py-1 text-left text-xs outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",e.id===s&&"bg-accent"),children:[(0,n.jsx)(W,{...i}),(0,n.jsx)(eo,{id:e.id}),(0,n.jsx)("span",{className:(0,T.cn)("min-w-0 flex-1 truncate","done"===a?"text-muted-foreground":"text-foreground"),children:e.title}),(0,n.jsx)("span",{className:"max-w-[40%] shrink-0 truncate text-muted-foreground",children:en(e)}),l&&(0,n.jsx)("span",{className:"shrink-0 tabular-nums text-muted-foreground",children:l})]})},e.id)})})}function em({slaves:e}){let t=e.filter(e=>"done"===e.column).length,s=e.filter(e=>"in_progress"===e.column).length,r=e.length?Math.round(t/e.length*100):0;return(0,n.jsxs)("div",{className:"mt-2 space-y-1.5 text-xs text-muted-foreground",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)(b.A,{className:"size-3 shrink-0 text-master"}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",children:0===e.length?"還沒有 slave 卡片":`${e.length} 個 slave \xb7 ${s} 執行中 \xb7 ${t} 完成`})]}),e.length>0&&(0,n.jsx)("div",{className:"h-1 overflow-hidden rounded-full bg-muted",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":r,"aria-label":"Slave 完成比例",children:(0,n.jsx)("div",{className:"h-full bg-success",style:{width:`${r}%`}})})]})}function ex({task:e,column:t,progress:s,links:a,selected:i,onSelect:l,onEdit:o,onDelete:c,onOpenTerminal:d,terminals:u,onShowTerminal:m,slaves:x}){let h=(0,r.useRef)(null),[f,p]=(0,r.useState)(null),g=null!==f,C="in_progress"===t,S="done"===t,A="master"===e.role,E=A?"工作":C||S&&e.worktreePath?"分支":"專案";return(0,n.jsxs)("div",{ref:h,role:"button",tabIndex:0,"aria-label":`開啟任務:${e.title}`,onClick:l,onKeyDown:e=>{e.target!==e.currentTarget||("Enter"===e.key||" "===e.key)&&(e.preventDefault(),l())},className:(0,T.cn)("relative cursor-pointer rounded-md border bg-card p-3 outline-none transition-colors motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50",S&&"bg-card/60",A&&"bg-master/5",A&&!i&&"border-master/50 hover:border-master/70",i?"border-primary shadow-[0_0_0_2px] shadow-primary/20":"border-border hover:border-input"),children:[(0,n.jsxs)("div",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[A?(0,n.jsx)(b.A,{className:"size-3 shrink-0 text-master"}):(0,n.jsx)(j.A,{className:"size-3 shrink-0"}),(0,n.jsx)("span",{className:(0,T.cn)("min-w-0 flex-1 truncate",A&&"font-medium text-master"),children:en(e)}),(0,n.jsx)(eo,{id:e.id}),(0,n.jsx)(P.K,{"aria-label":`在${E}目錄開啟 Terminal:${e.title}`,title:`在${E}目錄開啟額外 Terminal`,onClick:e=>{e.stopPropagation(),d()},className:"size-6 shrink-0 p-1",children:(0,n.jsx)(v.A,{className:"size-3.5"})}),S?(0,n.jsxs)("span",{className:"flex shrink-0 items-center gap-1 rounded-xs bg-primary/15 px-1.5 py-0.5 font-medium text-primary",children:[(0,n.jsx)(N.A,{className:"size-2.5"}),"complete"]}):(0,n.jsx)(P.K,{"aria-label":`任務選項:${e.title}`,"aria-haspopup":"menu","aria-expanded":g,title:"移動、編輯或刪除",onClick:e=>{if(e.stopPropagation(),g)return void p(null);let t=h.current?.getBoundingClientRect();t&&p({top:t.top+32,right:t.right-4})},className:"size-5 shrink-0 p-0.5",children:(0,n.jsx)(y.A,{className:"size-3.5"})})]}),(0,n.jsx)("div",{className:"mt-2",title:e.title,children:(0,n.jsx)("span",{className:(0,T.cn)("line-clamp-2 text-[15px] font-medium leading-[1.4]",S?"text-muted-foreground":"text-foreground"),children:e.title})}),A?(0,n.jsx)(em,{slaves:x??[]}):(0,n.jsxs)("div",{className:"mt-2 flex items-center gap-2 text-xs text-muted-foreground",children:[(0,n.jsx)(w.A,{className:"size-3 shrink-0"}),(0,n.jsxs)("span",{className:"min-w-0 flex-1 truncate",title:"backlog"!==t||e.worktreePath?void 0:"分支會在開始執行時建立",children:[e.branch,"backlog"===t&&!e.worktreePath&&(0,n.jsx)("span",{className:"text-muted-foreground/70",children:"(開始時建立)"})]}),a?.issue&&(0,n.jsx)(el,{link:a.issue}),a?.pr&&(0,n.jsx)(el,{link:a.pr})]}),u.length>0&&(0,n.jsx)("div",{className:"mt-2 flex flex-wrap gap-1.5","aria-label":"已開啟的 Terminal",children:u.map(e=>(0,n.jsxs)("button",{type:"button","aria-label":`查看 Terminal:${e.title}`,title:e.title,onClick:t=>{t.stopPropagation(),m(e.sessionKey)},className:"flex max-w-full items-center gap-1 rounded-sm bg-muted px-1.5 py-0.5 text-xs text-muted-foreground outline-none hover:bg-accent hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(v.A,{className:"size-3 shrink-0"}),(0,n.jsx)("span",{className:"min-w-0 truncate",children:e.title})]},e.sessionKey))}),(C||S)&&(0,n.jsx)(q,{progress:s,usage:e.usage}),e.jevRoute?.status==="routing"&&(0,n.jsxs)("p",{className:"mt-1.5 flex items-center gap-1.5 text-xs text-muted-foreground",role:"status",children:[(0,n.jsx)(k.A,{className:"size-3 shrink-0 animate-spin"}),(0,n.jsxs)("span",{className:"min-w-0 truncate",children:["Jev:",z(e.jevRoute)]})]}),e.jevRoute&&"routing"!==e.jevRoute.status&&(0,n.jsx)("p",{className:"mt-1.5 truncate text-xs text-muted-foreground",title:e.jevRoute.reason,children:$(e.jevRoute,e.model)}),"backlog"===t&&e.launchError&&(0,n.jsxs)("p",{className:"mt-1.5 truncate text-xs text-destructive",title:e.launchError,children:["開始失敗:",e.launchError]}),f&&(0,n.jsx)(ei,{task:e,anchor:f,onEdit:o,onDelete:c,onClose:()=>p(null)})]})}function eh({projects:e,value:t,onChange:s}){let[a,i]=(0,r.useState)(!1),l=er(a,()=>i(!1));return(0,n.jsxs)("div",{className:"relative",children:[(0,n.jsxs)("button",{type:"button","aria-haspopup":"menu","aria-expanded":a,onClick:()=>i(e=>!e),className:"flex items-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium text-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(j.A,{className:"size-3.5 shrink-0 text-muted-foreground"}),t??"所有專案",(0,n.jsx)(C.A,{className:"size-3.5 shrink-0 text-muted-foreground"})]}),a&&(0,n.jsx)("div",{ref:l,role:"menu",className:"absolute left-0 top-8 z-20 w-56 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg",children:[null,...e].map(e=>(0,n.jsxs)("button",{type:"button",role:"menuitem",onClick:()=>{s(e),i(!1)},className:(0,T.cn)("focus-visible:ring-[3px] focus-visible:ring-ring/50",ea,"hover:bg-accent hover:text-accent-foreground"),children:[(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",children:e??"所有專案"}),e===t&&(0,n.jsx)(S.A,{className:"size-3 shrink-0"})]},e??"__all__"))})]})}function ef({board:e,progress:t,view:s,onViewChange:a,taskLinks:i,selectedTaskId:l,onSelectTask:o,onEditTask:c,onDeleteTask:d,onOpenTaskTerminal:m,taskTerminals:x,onShowTaskTerminal:h,onNewTask:f}){let[p,g]=(0,r.useState)(null),b=[...e.backlog,...e.in_progress,...e.done],j=Array.from(new Set(b.map(en))).sort((e,t)=>e.localeCompare(t)),v=p&&j.includes(p)?p:null,[N,y]=(0,r.useState)(()=>new Set),w=new Set(b.filter(e=>"master"===e.role).map(e=>e.id)),k=t=>ee.flatMap(s=>e[s].filter(e=>e.masterId===t).map(e=>({task:e,column:s})));return(0,n.jsxs)("div",{className:"flex h-full min-h-0 flex-col bg-background",children:[(0,n.jsxs)("div",{className:"flex h-12 shrink-0 items-center gap-3 border-b border-border px-5",children:[(0,n.jsx)(I,{value:s,onChange:a}),(0,n.jsx)("span",{className:"h-4 w-px bg-border"}),(0,n.jsx)(eh,{projects:j,value:v,onChange:g})]}),(0,n.jsx)("div",{className:"grid min-h-0 flex-1 grid-cols-3 gap-4 overflow-hidden px-5 pb-4 pt-3",children:ee.map(s=>{let r=e[s].filter(e=>!(e.masterId&&w.has(e.masterId))&&(!v||("master"===e.role?"Master"===v||k(e.id).some(e=>en(e.task)===v):en(e)===v)));return(0,n.jsxs)("section",{className:"flex min-h-0 flex-col gap-2",children:[(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-2 px-1",children:[(0,n.jsx)("span",{className:(0,T.cn)("size-1.5 shrink-0 rounded-full",es[s])}),(0,n.jsx)("h2",{className:(0,T.cn)(E,"in_progress"===s&&"text-warning"),children:et[s]}),(0,n.jsx)("span",{className:"text-xs tabular-nums text-muted-foreground/80",children:r.length})]}),(0,n.jsxs)("div",{className:"min-h-0 flex-1 space-y-2 overflow-y-auto rounded-md p-1",children:[r.map(e=>{let r="master"===e.role?k(e.id):void 0,a=N.has(e.id);return(0,n.jsxs)("div",{children:[(0,n.jsx)(ex,{task:e,column:s,slaves:r,progress:"in_progress"===s?t[e.id]??null:null,links:i[e.id],selected:e.id===l,onSelect:()=>o(e.id),onEdit:"backlog"===s?()=>c(e.id):void 0,onDelete:()=>d(e.id),onOpenTerminal:()=>m(e.id),terminals:x.filter(t=>t.taskId===e.id),onShowTerminal:h}),r&&r.length>0&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("button",{type:"button","aria-expanded":!a,onClick:()=>{let t;return t=e.id,y(e=>{let s=new Set(e);return s.has(t)?s.delete(t):s.add(t),s})},className:"ml-3 mt-1 flex items-center gap-1 rounded-sm px-1.5 py-0.5 text-xs text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(C.A,{className:(0,T.cn)("size-3 transition-transform motion-reduce:transition-none",a&&"-rotate-90")}),a?`展開 ${r.length} 個 slave`:"收合"]}),!a&&(0,n.jsx)(eu,{slaves:r,progress:t,selectedTaskId:l,onSelectTask:o})]})]},e.id)}),"backlog"===s&&(0,n.jsxs)("button",{type:"button",onClick:f,className:"flex w-full items-center justify-center gap-1.5 rounded-md px-3 py-2.5 text-sm text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(u.A,{className:"size-3.5"}),"新增任務"]}),0===r.length&&"backlog"!==s&&(0,n.jsx)("p",{className:"px-2 py-1 text-sm text-muted-foreground/60",children:"尚無任務"})]})]},s)})})]})}var ep=s(9523),eg=s(1445),eb=s(41336),ej=s(55985),ev=s(19897),eN=s(72752),ey=s(37055),ew=s(6510),ek=s(98201),eC=s(55713),eS=s(50405),eA=s(85320),ez=s(37763),e$=s(15344),eE=s(72975),eP=s(78543),eT=s(25382),eR=s(23072),eI=s(23469),eD=s.n(eI),eK=s(54996);function eB(e){return new Promise((t,s)=>{let n=new FileReader;n.onload=()=>{if("string"!=typeof n.result)return void s(Error(`無法讀取附件:${e.name}`));let r=n.result.indexOf(",");r<0?s(Error(`無法解析附件:${e.name}`)):t({name:e.name,mime:e.type||"application/octet-stream",dataBase64:n.result.slice(r+1)})},n.onerror=()=>s(n.error??Error(`無法讀取附件:${e.name}`)),n.readAsDataURL(e)})}function eF(e){return Promise.all(Array.from(e).map(eB))}function e_(e,t){let s=()=>e.clientWidth>0&&e.clientHeight>0;return s()||t.aborted?Promise.resolve():new Promise(n=>{let r=new ResizeObserver(()=>{s()&&a()}),a=()=>{r.disconnect(),t.removeEventListener("abort",a),n()};t.addEventListener("abort",a),r.observe(e)})}function eM(e,t,s){if(!Number.isFinite(e)||!Number.isFinite(t)||!Number.isFinite(s)||e<=2||t<=0||s<=0||t<=s)return e;let n=Math.ceil((t-s)/(t/e));return Math.max(2,e-n)}let eL=/(?<=^|[\s"'`(<[])(?:file:\/\/|~[\\/]|\.{1,2}[\\/]|[a-z]:[\\/]|\/(?!\/)|[\p{L}\p{N}_@.+-]+[\\/])/giu,eV=/[\s"'`<>]/,eG=(e,t)=>e.line<t.line||e.line===t.line&&e.offset<t.offset;function eO(e,t){try{let s=new URL(e);if("file:"===s.protocol)return void t?.(e);if("http:"!==s.protocol&&"https:"!==s.protocol)return;window.open(s.href,"_blank","noopener,noreferrer")}catch{}}function eH(e,t){let s=e.buffer.active,n=t,r=t;for(;n>0&&s.getLine(n)?.isWrapped;)n--;for(;r+1<s.length&&s.getLine(r+1)?.isWrapped;)r++;let a="",i=[],l=[];for(let e=n;e<=r;e++){let t=s.getLine(e);if(t)for(let s=0;s<t.length;s++){let n=t.getCell(s);if(!n||0===n.getWidth())continue;let r=n.getChars()||" ";a+=r;for(let t=0;t<r.length;t++)i.push({x:s+1,y:e+1}),l.push({x:s+Math.max(1,n.getWidth()),y:e+1})}}return{first:n,last:r,text:a.trimEnd(),starts:i,ends:l}}function eJ(e,t,s){let n=(t,n,r)=>({text:t,range:{start:n,end:r},activate:()=>s(t),hover:()=>eW(e,t),leave:()=>eU(e)});return e.registerLinkProvider({provideLinks(s,r){var a;let i,l,o,c=e.buffer.active,d=eH(e,s-1),u=[d];for(;u.length<=3&&u[0].first>0;)u.unshift(eH(e,u[0].first-1));let m=u.length-1;for(;u.length<=m+3&&u[u.length-1].last+1<c.length;)u.push(eH(e,u[u.length-1].last+1));let x=function(e){let t=[];for(let s of e.matchAll(/"[^"\r\n]+"|'[^'\r\n]+'|[^\s"'<>`]+/g)){let e=s[0],n=s.index;if(e.startsWith('"')||e.startsWith("'"))e=e.slice(1,-1),n++;else{let t=e.indexOf("](");t>=0&&(n+=t+2,e=e.slice(t+2));let s=e.match(/^[([{]+/)?.[0].length??0;n+=s,e=e.slice(s).replace(/[)\]},;.!?]+$/,"")}if(/^[a-z][a-z\d+.-]*:/i.test(e)&&!/^file:\/\//i.test(e)&&!/^[a-z]:[\\/]/i.test(e))continue;let r=e.length;e=e.replace(/:\d+(?::\d+)?$/,"");let a=/^(?:file:\/\/|\/|~[\\/]|\.{1,2}[\\/]|[a-z]:[\\/])/i.test(e),i=/^[\p{L}\p{N}_@.+-][^\s:]*\.[a-z][a-z\d]{0,15}$/iu.test(e)&&!e.includes("@");e&&(a||i)&&t.push({path:e,start:n,end:n+r})}return t}(d.text),h=(a=u.map(e=>e.text),i=new Set,l=[],o=(e,t,s,n,r,c)=>{let d=a[t],u=s;for(;u<d.length&&!eV.test(d[u]);)u++;let m=n+d.slice(s,u);if(u>s&&(c>0||n.includes(" "))){let s=m.replace(/[)\]},;.!?]+$/,""),n=s.replace(/:\d+(?::\d+)?$/,""),r=`${e.line}:${e.offset}:${n}`;n&&!i.has(r)&&(i.add(r),l.push({path:n,start:e,end:{line:t,offset:u-(m.length-s.length)}}))}if(++r>=12||m.length>=1024)return;if(u<d.length){" "===d[u]&&u+1<d.length&&!eV.test(d[u+1])&&o(e,t,u+1,`${m} `,r,c);return}if(c>=3||t+1>=a.length)return;let x=a[t+1].match(/^\s*/)[0].length;x>=a[t+1].length||(o(e,t+1,x,m,r,c+1),o(e,t+1,x,`${m} `,r,c+1))},a.forEach((e,t)=>{for(let s of e.matchAll(eL))o({line:t,offset:s.index},t,s.index,"",0,0)}),l).filter(e=>e.start.line<=m&&e.end.line>=m),f=()=>x.map(e=>n(e.path,d.starts[e.start],d.ends[e.end-1]));h.length?(0,D.Tw)(t,[...new Set(h.map(e=>e.path))]).then(e=>{let t=function(e,t){let s=new Set(t),n=[];for(let t of e.filter(e=>s.has(e.path)).sort((e,t)=>t.path.length-e.path.length))n.every(e=>!eG(t.start,e.end)||!eG(e.start,t.end))&&n.push(t);return n}(h,e??[]),s=e=>t.some(t=>(t.start.line<m||t.start.offset<=e)&&(t.end.line>m||e<t.end.offset));r([...t.map(e=>n(e.path,u[e.start.line].starts[e.start.offset],u[e.end.line].ends[e.end.offset-1])),...f().filter((e,t)=>!s(x[t].start)&&!s(x[t].end-1))])},()=>r(f())):r(f())}})}function eW(e,t){e.element&&(e.element.title=t)}function eU(e){e.element?.removeAttribute("title")}var eq=s(9036),eY=s(7640),eX=s(62607);let eQ=eD()(()=>s.e(1225).then(s.bind(s,91225)).then(e=>e.TerminalFilePreview),{loadableGenerated:{webpack:()=>[91225]},ssr:!1});function eZ(e,t){t&&e.writeln(`⏳ ${t}`)}function e0(e,t){let s=t instanceof Error?t.message:String(t);e.writeln(`\r
2
+ ⚠️ 無法開始執行:${s}`)}function e1({taskId:e,sessionKey:t,cwd:a,launchCommand:i,launchNonce:l=0,provisionNotice:o=null,readOnly:c=!1,onReturnToBacklog:d,onLaunchAgent:u,active:m=!0,toolbarStart:x,toolbarEnd:h}){let f=void 0!==x||void 0!==h,p=t??e,[g,b]=(0,r.useState)(null),j=(0,r.useRef)(null),v=(0,r.useRef)(null),N=(0,r.useRef)(0),[y,w]=(0,r.useState)(!1),[k,C]=(0,r.useState)(!1),[S,A]=(0,r.useState)(!1),[z,$]=(0,r.useState)(!1),[E,P]=(0,r.useState)(!1),[R,I]=(0,r.useState)(!1),K=(0,r.useRef)(!1),B=(0,r.useRef)(-1),F=(0,r.useRef)(null),_=(0,r.useRef)(!1),M=(0,r.useRef)(i),L=(0,r.useRef)(l);M.current=i,L.current=l;let V=(0,r.useRef)(a);V.current=a;let G=(0,r.useRef)(c),O=(0,r.useRef)(o);O.current=o;let H=(0,r.useRef)(m);H.current=m,(0,r.useEffect)(()=>{m&&v.current?.focus()},[m]),(0,r.useEffect)(()=>{let e=()=>{if(!H.current||document.querySelector('[role="dialog"][aria-modal="true"]'))return;let e=document.activeElement;e instanceof HTMLElement&&!j.current?.contains(e)&&e.closest('input, textarea, select, [contenteditable="true"]')||v.current?.focus()};return window.addEventListener("focus",e),()=>window.removeEventListener("focus",e)},[]);let J=(0,r.useCallback)(t=>{let s=V.current,n=v.current;s&&(K.current=!1,_.current=!0,n&&eZ(n,O.current),(0,D.dU)({taskId:e,sessionKey:p,launch:t,cols:n?.cols,rows:n?.rows}).then(()=>{K.current=!0,v.current?.focus()}).catch(e=>{_.current=!1,v.current&&e0(v.current,e)}))},[e,p]),W=(0,r.useCallback)(()=>{let t=V.current,s=v.current;t&&s&&(0,D.aT)()&&!G.current&&(K.current=!1,_.current=!1,(0,D.dU)({taskId:e,sessionKey:p,cols:s.cols,rows:s.rows}).then(()=>{K.current=!0,s.focus()}))},[e,p]),U=(0,r.useCallback)(async()=>{let e=v.current;if(e&&d&&!G.current){A(!0);try{if(!await d())return;e.reset(),e.clear(),W(),e.focus()}catch(s){let t=s instanceof Error?s.message:String(s);e.writeln(`\r
3
+ ⚠️ 退回 Backlog 失敗:${t}`)}finally{A(!1)}}},[d,W]),q=(0,r.useCallback)(async()=>{let e=v.current;if(e&&u&&!G.current){$(!0),e.reset(),e.clear();try{await u(),e.focus()}catch(s){let t=s instanceof Error?s.message:String(s);e.writeln(`\r
4
+ ⚠️ 啟動 Agent 失敗:${t}`)}finally{$(!1)}}},[u]),Y=(0,r.useCallback)(()=>{if(!K.current||G.current)return;let e=M.current;if(!e)return;let t=L.current;B.current!==t&&(B.current=t,J(e))},[J]);(0,r.useEffect)(()=>{G.current=c,v.current&&(v.current.options.disableStdin=c)},[c]),(0,r.useEffect)(()=>{let t,n,r,a,i,l,o=!1;K.current=!1;let c=new AbortController;return F.current=()=>c.abort(),(async()=>{let d,[{Terminal:u},{FitAddon:m},{WebLinksAddon:x}]=await Promise.all([s.e(3779).then(s.bind(s,15167)),s.e(5695).then(s.bind(s,95695)),s.e(4847).then(s.bind(s,54847))]);if(o||!j.current)return;let h=new u({fontSize:12,fontFamily:'Menlo, Monaco, "Courier New", monospace',cursorBlink:!0,disableStdin:G.current,linkHandler:{activate:(e,t)=>eO(t,b),hover:(e,t)=>eW(h,t),leave:()=>eU(h)},theme:{background:"#191919",foreground:"#e6e6e6",cursor:"#4c9bf5",cursorAccent:"#191919",selectionBackground:"rgba(76, 155, 245, 0.30)",selectionForeground:"#ededed",black:"#3b3b3b",red:"#f0716a",green:"#4ec98a",yellow:"#e2b341",blue:"#4c9bf5",magenta:"#c58af9",cyan:"#4dd0e1",white:"#c8c8c8",brightBlack:"#6e6e6e",brightRed:"#ff8b84",brightGreen:"#6bdfa3",brightYellow:"#f2c862",brightBlue:"#7db8ff",brightMagenta:"#d7a6ff",brightCyan:"#72e0ee",brightWhite:"#ffffff"}}),f=new m;h.loadAddon(f),eJ(h,p,b),h.loadAddon(new x((e,t)=>eO(t,b),{hover:(e,t)=>eW(h,t),leave:()=>eU(h)})),h.open(j.current);let g=()=>{let e=j.current;if(!e||0===e.clientWidth||0===e.clientHeight)return;f.fit();let t=h.element?.querySelector(".xterm-screen"),s=h.element?.querySelector(".xterm-viewport");if(!t||!s)return;let n=eM(h.cols,t.getBoundingClientRect().width,s.clientWidth);n!==h.cols&&h.resize(n,h.rows)};if(v.current=h,await document.fonts.ready,M.current||await e_(j.current,c.signal),await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(e))),o||v.current!==h)return;g(),H.current&&h.focus();let N=window.vibeflow;if(!N)return h.writeln("⚠️ 未連線到 VibeFlow core,無法開啟終端。");if(G.current)return h.writeln("ℹ️ 任務已完成 — 終端為唯讀,僅供查閱訊息。");if(!V.current)return h.writeln("⚠️ 尚未設定工作目錄,請先選擇專案或建立任務。");let y=G.current?null:M.current;y&&(B.current=L.current),_.current=!!y,y&&eZ(h,O.current);try{d=await N.term.start({taskId:e,sessionKey:p,launch:y??void 0,cols:h.cols,rows:h.rows})}catch(e){_.current=!1,e0(h,e);return}let{scrollback:w}=d;w&&h.write(w),t=N.term.onData(({sessionKey:e,data:t})=>{e===p&&h.write(t)}),n=N.term.onExit(({sessionKey:e,exitCode:t,intentional:s})=>{if(e!==p||s)return;let n=_.current;if(_.current=!1,!n){K.current=!1,h.writeln(`\r
5
+ ℹ️ 終端已結束(exit code: ${t})`);return}0===t?h.writeln("\r\n✅ Agent 執行完成。"):h.writeln(`\r
6
+ ⚠️ 連線中斷或異常結束(exit code: ${t})`),h.writeln("\r\nℹ️ 已切回互動終端,可手動輸入命令。"),W()}),h.attachCustomKeyEventHandler(e=>"Enter"!==e.key||!e.shiftKey||!!e.altKey||!!e.ctrlKey||!!e.metaKey||!!e.isComposing||!!G.current||(e.preventDefault(),e.stopPropagation(),"keydown"===e.type&&N.term.input(p,"\x1b\r"),!1)),h.onData(e=>{G.current||(N.term.input(p,e),k())}),h.onScroll(()=>{let e=h.buffer.active;P(e.viewportY<e.baseY)});let k=()=>{clearTimeout(i),i=setTimeout(()=>{N.term.isScrolledBack(p).then(e=>{o||v.current!==h||I(e)})},150)},C=j.current;C?.addEventListener("wheel",k,{capture:!0,passive:!0}),l=()=>C?.removeEventListener("wheel",k,{capture:!0}),r=new ResizeObserver(()=>{clearTimeout(a),a=setTimeout(()=>{if(!o&&v.current===h)try{let{cols:e,rows:t}=h;if(g(),h.cols===e&&h.rows===t)return;N.term.resize(p,h.cols,h.rows)}catch{}},100)}),j.current&&r.observe(j.current),K.current=!0,Y()})(),()=>{o=!0,c.abort(),F.current=null,K.current=!1,t?.(),n?.(),r?.disconnect(),clearTimeout(a),clearTimeout(i),l?.(),(0,D.Vz)(p),v.current?.dispose(),v.current=null}},[e,p,Y,W]),(0,r.useEffect)(()=>{i&&F.current?.(),Y()},[i,l,Y]);let X=async t=>{if(!G.current&&K.current&&0!==t.length){C(!0);try{let s=await eF(t),n=await (0,D.s0)({taskId:e,attachments:s});if(n.length>0){let e=n.map(({path:e})=>`'${e.replace(/'/g,"'\\''")}'`).join(" ");(0,D.zj)(p,`${e} `)}}catch(t){let e=t instanceof Error?t.message:String(t);v.current?.writeln(`\r
7
+ ⚠️ 附加檔案失敗:${e}`)}finally{C(!1)}}},Q=async()=>{v.current?.scrollToBottom(),P(!1),await (0,D.kt)(p),I(!1),v.current?.focus()};return(0,n.jsxs)("div",{onDragEnter:e=>{e.dataTransfer.types.includes("Files")&&(e.preventDefault(),!c&&K.current&&(N.current+=1,w(!0)))},onDragOver:e=>{e.dataTransfer.types.includes("Files")&&(e.preventDefault(),e.dataTransfer.dropEffect=c||!K.current?"none":"copy")},onDragLeave:e=>{e.dataTransfer.types.includes("Files")&&(e.preventDefault(),!c&&K.current&&(N.current=Math.max(0,N.current-1),0===N.current&&w(!1)))},onDrop:e=>{e.preventDefault(),N.current=0,w(!1),!c&&K.current&&X(e.dataTransfer.files)},className:(0,T.cn)("flex min-h-36 w-full flex-1 flex-col overflow-hidden transition-colors",f?"bg-background":"rounded-md border border-border bg-card",y&&(f?"bg-primary/5 ring-1 ring-inset ring-primary":"border-primary bg-primary/5")),children:[(0,n.jsxs)("div",{className:(0,T.cn)("flex shrink-0 items-center border-b border-border",f?"h-10 gap-2 px-3":"justify-between bg-muted/50 px-2 py-1"),children:[f?(0,n.jsx)("div",{className:"flex min-w-0 flex-1 items-center gap-1.5",children:x}):(0,n.jsx)("span",{className:"min-w-0 truncate font-mono text-xs text-muted-foreground",children:a??"(no cwd)"}),k?(0,n.jsx)("span",{className:"shrink-0 px-2 text-xs text-muted-foreground",children:"附加檔案中…"}):c?(0,n.jsx)("span",{className:"shrink-0 px-2 text-xs uppercase tracking-wide text-muted-foreground",children:"唯讀"}):(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[d&&(0,n.jsxs)(eK.$,{variant:"ghost",size:"sm",className:"h-6 shrink-0 px-2 text-xs",onClick:()=>void U(),disabled:!a||S||z,title:"捨棄這次執行的程式碼變更與 artifacts 並退回 Backlog,之後按「開始」才會重新啟動 Agent",children:[(0,n.jsx)(eq.A,{className:(0,T.cn)("size-3",S&&"animate-pulse")}),S?"退回中…":"退回 Backlog"]}),u&&(0,n.jsxs)(eK.$,{variant:"ghost",size:"sm",className:"h-6 shrink-0 px-2 text-xs",onClick:()=>void q(),disabled:!a||z||S,title:"只帶入 Agent 設定,不傳入任務內容",children:[(0,n.jsx)(eY.A,{className:(0,T.cn)("size-3",z&&"animate-pulse")}),z?"啟動中…":"啟動 Agent"]})]}),h]}),(0,n.jsxs)("div",{className:"relative min-h-0 w-full flex-1 overflow-hidden bg-background p-1",children:[(0,n.jsx)("div",{ref:j,className:"h-full w-full overflow-hidden"}),(E||R)&&(0,n.jsxs)(eK.$,{variant:"secondary",size:"sm",className:"absolute bottom-3 right-5 h-7 px-2 text-xs shadow-md",onClick:()=>void Q(),children:[(0,n.jsx)(eX.A,{className:"size-3"}),"回到最新"]})]}),null!==g&&(0,n.jsx)(eQ,{sessionKey:p,path:g,onClose:()=>b(null)},g)]})}var e5=s(6329),e2=s(86570);let e3={claude:"Claude Code",codex:"Codex CLI"},e4={codex:["gpt-5-codex","gpt-5"]},e6={assignees:[],authors:[]},e7=":unassigned",e8=(e,t)=>e.localeCompare(t);function e9(e,t){return Array.from(new Set([...e,...t])).sort(e8)}function te(e,t){return e8(e.projectName,t.projectName)||t.item.number-e.item.number}function tt(e,t,s){return e.flatMap(e=>e[t].map(t=>({item:t,projectName:e.projectName,projectPath:e.projectPath}))).filter(e=>(function(e,t){let{item:s}=e,{assignees:n,authors:r}=t;return(!n.length||!!(0===s.assignees.length?n.includes(e7):s.assignees.some(e=>n.includes(e.login))))&&(!r.length||!!(s.author&&r.includes(s.author.login)))})(e,s)).sort(te)}let ts=["board","workspace","github","terminals"],tn=["jira","issues","prs"],tr="vibeflow:workspace-rail",ta=["vibeflow:terminal-tabs","vibeflow:board-split-px"],ti="vibeflow:inbox-tab",tl="vibeflow:github-filters",to="vibeflow:jira-scope",tc="vibeflow:diff-view";function td(e){try{let t=window.localStorage.getItem(e);return null===t?null:JSON.parse(t)}catch{return null}}function tu(e,t){try{window.localStorage.setItem(e,JSON.stringify(t))}catch{}}let tm=e=>Array.isArray(e)&&e.every(e=>"string"==typeof e);function tx(e){let t=e??{};return{assignees:tm(t.assignees)?t.assignees:e6.assignees,authors:tm(t.authors)?t.authors:e6.authors}}function th(e,t){return e.path===t.path&&e.status===t.status&&e.additions===t.additions&&e.deletions===t.deletions&&e.revision===t.revision}var tf=s(68027);let tp=(0,r.lazy)(()=>s.e(1201).then(s.bind(s,31201)).then(e=>({default:e.default}))),tg={slaves:"Slaves",task:"任務",spec:"決策",artifacts:"Artifacts",diff:"Git diff"},tb=["task","spec","artifacts","diff"],tj=["task","spec"],tv=["task"],tN={A:"新增",M:"修改",D:"刪除",R:"更名","?":"未追蹤"},ty={image:"截圖",video:"影片",text:"文字",binary:"二進位"},tw="vibeflow:workspace-aside-px",tk="--vf-workspace-aside",tC={slaves:b.A,task:ep.A,spec:eg.A,artifacts:eb.A,diff:ej.A},tS="vibeflow:workspace-inspector",tA=new Set,tz=null;function t$(){return null===tz&&(tz="rail"===window.localStorage.getItem(tS)?"rail":"docked"),tz}function tE(e){for(let t of(tz=e,window.localStorage.setItem(tS,e),tA))t()}function tP(e){return tA.add(e),()=>{tA.delete(e)}}let tT={split:!1,fullContext:!1},tR=new Set,tI=null;function tD(){let e,t;return null===tI&&(tI={split:!0===(t=(e=td(tc))&&"object"==typeof e?e:{}).split,fullContext:!0===t.fullContext}),tI}function tK(e){for(let t of(tu(tc,tI={...tD(),...e}),tR))t()}function tB(e){return tR.add(e),()=>{tR.delete(e)}}function tF(){return(0,r.useSyncExternalStore)(tB,tD,()=>tT)}let t_="(min-width: 1024px)";function tM(e){let t=window.matchMedia(t_);return t.addEventListener("change",e),()=>t.removeEventListener("change",e)}let tL=!1;function tV(){if(tL)return;tL=!0;let e=Number(window.localStorage.getItem(tw));Number.isFinite(e)&&e>=336&&document.documentElement.style.setProperty(tk,`${e}px`)}function tG(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function tO(e){return("image"===e.kind||"video"===e.kind)&&!e.scratch}function tH({title:e,icon:t,children:s,actions:r,count:a,heading:i}){return(0,n.jsxs)("section",{className:"flex min-h-0 flex-1 flex-col border-b border-border last:border-b-0",children:[(0,n.jsxs)("div",{className:"flex h-10 shrink-0 items-center justify-between gap-2 border-b border-border/70 px-4",children:[i??(0,n.jsxs)("h2",{className:(0,T.cn)(E,"flex min-w-0 items-center gap-2"),children:[t,(0,n.jsx)("span",{className:"truncate",children:e}),void 0!==a&&a>0&&(0,n.jsx)("span",{className:"shrink-0 tabular-nums text-muted-foreground/80",children:a})]}),r]}),(0,n.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto p-4",children:s})]})}let tJ={MERGED:"bg-primary/15 text-primary",OPEN:"bg-success/15 text-success",CLOSED:"bg-destructive/15 text-destructive"};function tW({outcome:e}){let[t,s]=(0,r.useState)(!1),{pr:a,commits:i,files:l}=e;return(0,n.jsxs)("div",{className:"space-y-4",children:[a&&(0,n.jsxs)("div",{className:"space-y-2",children:[(0,n.jsxs)("h3",{className:(0,T.cn)(E,"flex items-center gap-1.5"),children:[(0,n.jsx)(g.A,{className:"size-3.5"}),"Pull Request"]}),(0,n.jsxs)("div",{className:"space-y-2 rounded-md border border-border/70 bg-muted/20 p-2.5 text-sm",children:[(0,n.jsxs)("div",{className:"flex items-start gap-2",children:[(0,n.jsx)("span",{className:(0,T.cn)("shrink-0 rounded-xs px-1.5 py-0.5 text-xs font-medium",tJ[a.state]??"bg-secondary text-secondary-foreground"),children:a.state}),(0,n.jsx)("span",{className:"min-w-0 flex-1 break-words text-foreground",children:a.title})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsxs)("button",{type:"button",onClick:()=>void(0,D.kK)(a.url),className:"flex items-center gap-1.5 rounded-sm text-xs text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(ev.A,{className:"size-3"}),"#",a.number]}),a.body&&(0,n.jsx)("button",{type:"button",onClick:()=>s(e=>!e),className:"rounded-sm text-xs text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50",children:t?"收合說明":"展開說明"})]}),a.body&&t&&(0,n.jsx)(eR.h,{source:a.body,compact:!0,className:"bg-transparent p-0"})]})]}),i.length>0&&(0,n.jsxs)("div",{className:"space-y-2",children:[(0,n.jsxs)("h3",{className:(0,T.cn)(E,"flex items-center gap-1.5"),children:[(0,n.jsx)(eN.A,{className:"size-3.5"}),"Commits",(0,n.jsx)("span",{className:"tabular-nums font-normal",children:i.length})]}),(0,n.jsx)("ul",{className:"space-y-1 rounded-md bg-muted/30 p-2.5 text-sm",children:i.map(e=>(0,n.jsxs)("li",{className:"flex items-start gap-2",children:[(0,n.jsx)("code",{className:"shrink-0 font-mono text-xs text-muted-foreground",children:e.sha}),(0,n.jsx)("span",{className:"min-w-0 break-words",children:e.subject})]},e.sha))})]}),l.length>0&&(0,n.jsxs)("div",{className:"space-y-2",children:[(0,n.jsxs)("h3",{className:(0,T.cn)(E,"flex items-center gap-1.5"),children:[(0,n.jsx)(ej.A,{className:"size-3.5"}),"變更檔案",(0,n.jsx)("span",{className:"tabular-nums font-normal",children:l.length}),(0,n.jsxs)("span",{className:"ml-auto font-normal tabular-nums",children:[(0,n.jsxs)("span",{className:"text-success",children:["+",e.additions]}),(0,n.jsxs)("span",{className:"ml-1 text-destructive",children:["−",e.deletions]})]})]}),(0,n.jsx)("ul",{className:"space-y-1 rounded-md bg-muted/30 p-2.5 text-sm",children:l.map(e=>(0,n.jsxs)("li",{className:"flex items-start gap-2",children:[(0,n.jsx)("span",{className:"min-w-0 flex-1 break-all font-mono text-xs",children:e.path}),(e.additions>0||e.deletions>0)&&(0,n.jsxs)("span",{className:"shrink-0 text-xs tabular-nums",children:[(0,n.jsxs)("span",{className:"text-success",children:["+",e.additions]}),(0,n.jsxs)("span",{className:"ml-1 text-destructive",children:["−",e.deletions]})]})]},e.path))}),e.truncated&&(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:["只列出前 ",l.length," 個檔案。"]})]})]})}function tU({task:e,column:t,progress:s,master:r,onSelectTask:a}){let i="master"===e.role;return(0,n.jsxs)("div",{className:"space-y-4 text-base",children:[(0,n.jsxs)("div",{children:[(0,n.jsxs)("div",{className:"mb-2 flex flex-wrap items-center gap-1.5",children:[(0,n.jsx)("span",{className:"rounded-xs bg-secondary px-1.5 py-0.5 text-xs font-medium text-secondary-foreground",children:"in_progress"===t?"In Progress":"done"===t?"Done":"Backlog"}),i&&(0,n.jsxs)("span",{className:"flex items-center gap-1 rounded-xs bg-master/15 px-1.5 py-0.5 text-xs font-medium text-master",children:[(0,n.jsx)(b.A,{className:"size-3"}),"Master"]})]}),(0,n.jsx)("h3",{className:"break-words text-lg font-semibold tracking-tight text-foreground",children:e.title})]}),"backlog"===t&&e.launchError&&(0,n.jsxs)("p",{className:"rounded-md border border-destructive/40 bg-destructive/10 p-2.5 text-sm",children:["上次開始執行時無法建立分支,卡片已退回 Backlog:",e.launchError,(0,n.jsx)("br",{}),(0,n.jsx)("span",{className:"text-muted-foreground",children:"可以編輯分支名稱或基準分支後再開始。"})]}),e.jevRoute?.status==="routing"&&(0,n.jsxs)("div",{className:"flex items-center gap-2 rounded-md bg-muted/30 p-2.5 text-sm text-muted-foreground",role:"status",children:[(0,n.jsx)(k.A,{className:"size-3.5 shrink-0 animate-spin"}),"Jev:",z(e.jevRoute),"(完成後才會啟動 agent)"]}),e.jevRoute&&"routing"!==e.jevRoute.status&&(0,n.jsxs)("div",{className:"space-y-1 rounded-md bg-muted/30 p-2.5 text-sm text-muted-foreground",children:[(0,n.jsx)("p",{children:$(e.jevRoute,e.model)}),e.jevRoute.reason&&(0,n.jsxs)("p",{children:["自動選擇未完成:",e.jevRoute.reason]}),e.jevRoute.context&&(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{className:"cursor-pointer select-none",children:["前置分析(",e.jevRoute.scoutModel??"高思考模型",")"]}),(0,n.jsx)("div",{className:"mt-2 text-foreground",children:(0,n.jsx)(eR.h,{source:e.jevRoute.context,compact:!0})})]})]}),r&&(0,n.jsxs)("button",{type:"button",onClick:()=>a?.(r.id),title:"開啟 master 卡片",className:"flex w-full items-center gap-2 rounded-md border border-master/30 bg-master/5 p-2.5 text-left text-sm outline-none transition-colors motion-reduce:transition-none hover:bg-master/10 focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(b.A,{className:"size-3.5 shrink-0 text-master"}),(0,n.jsx)("span",{className:"shrink-0 text-muted-foreground",children:"屬於"}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate font-medium",children:r.title}),(0,n.jsx)(ey.A,{className:"size-3.5 shrink-0 text-muted-foreground"})]}),i?(0,n.jsx)("div",{className:"space-y-1.5 rounded-md bg-muted/30 p-2.5 text-sm text-muted-foreground",children:(0,n.jsxs)("div",{className:"flex items-start gap-2",children:[(0,n.jsx)(ew.A,{className:"mt-0.5 size-3.5 shrink-0"}),(0,n.jsx)("span",{className:"min-w-0 break-all font-mono text-xs",children:e.worktreePath??e.workDir??"開始執行時建立專屬資料夾"})]})}):(0,n.jsxs)("div",{className:"space-y-1.5 rounded-md bg-muted/30 p-2.5 text-sm text-muted-foreground",children:[e.projectName&&(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)(j.A,{className:"size-3.5 shrink-0"}),(0,n.jsx)("span",{className:"min-w-0 truncate",children:e.projectName})]}),(0,n.jsxs)("div",{className:"flex items-start gap-2",children:[(0,n.jsx)(w.A,{className:"mt-0.5 size-3.5 shrink-0"}),(0,n.jsxs)("span",{className:"min-w-0 break-all",children:[e.branch,"done"!==t&&!e.worktreePath&&(0,n.jsx)("span",{className:"text-muted-foreground/70",children:"backlog"===t?"(開始執行時建立)":"(建立中…)"})]})]}),e.baseBranch&&(0,n.jsxs)("div",{className:"flex items-start gap-2",children:[(0,n.jsx)(ek.A,{className:"mt-0.5 size-3.5 shrink-0"}),(0,n.jsxs)("span",{className:"min-w-0 break-all",children:["base: ",e.baseBranch]})]})]}),e.description&&(0,n.jsx)(eR.h,{source:e.description}),"backlog"!==t&&(0,n.jsx)(Z,{progress:"in_progress"===t?s:null,usage:e.usage}),e.outcome&&(0,n.jsx)(tW,{outcome:e.outcome})]})}function tq({specs:e}){return(0,n.jsx)("div",{className:"space-y-6",children:e.map(e=>(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsx)("p",{className:"break-all font-mono text-xs text-muted-foreground",children:e.path}),(0,n.jsx)(eR.h,{source:e.markdown,className:"bg-transparent p-0"}),e.truncated&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"內容過長,僅顯示前段。"}),null!=e.updatedAt&&(0,n.jsxs)("p",{className:"text-xs text-muted-foreground tabular-nums",children:["更新於 ",new Date(e.updatedAt).toLocaleString()]})]},e.path))})}function tY({taskId:e,artifact:t}){let[s,a]=(0,r.useState)(null),[i,l]=(0,r.useState)(!1);(0,r.useEffect)(()=>{let s=!0;return a(null),l(!1),(0,D.R9)(e,t.name).then(e=>{s&&a(e?.dataUrl??null)}).catch(()=>{s&&a(null)}),()=>{s=!1}},[e,t.name,t.modifiedAt]);let o="video"===t.kind;return!s||i?(0,n.jsx)("div",{className:"flex h-24 items-center justify-center rounded-md border border-border/70 bg-card",children:o?(0,n.jsx)(eC.A,{className:"size-5 text-muted-foreground"}):(0,n.jsx)(eb.A,{className:"size-5 text-muted-foreground"})}):o?(0,n.jsxs)("div",{className:"relative h-24 w-full overflow-hidden rounded-md border border-border/70 bg-card",children:[(0,n.jsx)("video",{src:s,muted:!0,playsInline:!0,preload:"metadata",onError:()=>l(!0),className:"h-full w-full object-contain"}),(0,n.jsx)("span",{className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:(0,n.jsx)("span",{className:"flex size-7 items-center justify-center rounded-full bg-background/80 ring-1 ring-border/70",children:(0,n.jsx)(eS.A,{className:"size-3.5 fill-current text-foreground"})})})]}):(0,n.jsx)("img",{src:s,alt:t.name,className:"h-24 w-full rounded-md border border-border/70 bg-card object-contain"})}function tX({taskId:e,artifact:t,onClose:s}){var a;let[i,l]=(0,r.useState)(void 0),[o,c]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{let s=!0;return l(void 0),c(!1),(0,D.R9)(e,t.name).then(e=>{s&&l(e)}).catch(()=>{s&&l(null)}),()=>{s=!1}},[e,t.name,t.modifiedAt]),(0,n.jsx)(e5.h,{title:t.name,description:`${ty[t.kind]} \xb7 ${tG(t.size)}${t.scratch?" \xb7 工作暫存":""}`,onClose:s,showHeader:!0,contentClassName:"max-w-5xl",bodyClassName:"p-4",children:void 0===i?(0,n.jsxs)("div",{className:"flex h-40 items-center justify-center gap-2 text-sm text-muted-foreground",children:[(0,n.jsx)(k.A,{className:"size-3.5 animate-spin"}),"讀取中…"]}):null===i?(0,n.jsx)("p",{className:"py-10 text-center text-sm text-muted-foreground",children:"讀不到這個檔案,可能已被刪除。"}):"image"===i.kind&&i.dataUrl?(0,n.jsx)(e2.p,{src:i.dataUrl,alt:t.name}):"video"===i.kind&&i.dataUrl?o?(0,n.jsx)("p",{className:"py-10 text-center text-sm text-muted-foreground",children:"這個影片的編碼無法在 app 內播放。用 Artifacts 分頁的「開啟資料夾」以系統播放器開啟。"}):(0,n.jsx)("video",{src:i.dataUrl,controls:!0,autoPlay:!0,loop:!0,muted:!0,playsInline:!0,onError:()=>c(!0),className:"max-h-[70vh] w-full rounded-md bg-black"}):"binary"===i.kind?(0,n.jsxs)("p",{className:"py-10 text-center text-sm text-muted-foreground",children:["無法內嵌預覽的檔案(",tG(t.size),")。用 Artifacts 分頁的「開啟資料夾」以系統播放器或編輯器開啟。"]}):(0,n.jsxs)(n.Fragment,{children:[(a=t.name,/\.(md|markdown|mdx)$/i.test(a))?(0,n.jsx)(eR.h,{source:i.text??""}):(0,n.jsx)("pre",{className:"whitespace-pre-wrap break-words rounded-md bg-muted/30 p-3 font-mono text-xs",children:i.text}),i.truncated&&(0,n.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"內容過長,僅顯示開頭 256 KB。"})]})})}function tQ({taskId:e,artifacts:t,artifactsDir:s}){let[a,i]=(0,r.useState)(null),[o,c]=(0,r.useState)(!1),[d,u]=(0,r.useState)("idle"),[m,x]=(0,r.useState)(null),h=t.filter(tO),f=t.filter(e=>!tO(e)),p=(0,r.useCallback)(()=>{x(null),(0,D.lr)(e).then(e=>x(e||null)).catch(()=>x("開啟失敗"))},[e]),g=(0,r.useCallback)(()=>{s&&navigator.clipboard.writeText(s).then(()=>{u("copied"),window.setTimeout(()=>u("idle"),1600)}).catch(()=>u("error"))},[s]);return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"mb-3 space-y-2 rounded-md border border-border/70 bg-muted/20 p-2.5",children:[(0,n.jsx)("div",{className:"text-xs font-medium text-muted-foreground",children:"Artifact 資料夾"}),(0,n.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[(0,n.jsx)("code",{className:"min-w-0 flex-1 select-all break-all rounded-xs bg-background px-2 py-1.5 font-mono text-xs text-foreground",title:s??"尚無可用路徑",children:s??"尚無可用路徑"}),(0,n.jsxs)(eK.$,{variant:"outline",size:"sm",onClick:g,disabled:!s,title:"複製 Artifact 資料夾路徑",className:"shrink-0 text-xs",children:["copied"===d?(0,n.jsx)(S.A,{className:"size-3.5"}):(0,n.jsx)(eA.A,{className:"size-3.5"}),"copied"===d?"已複製":"error"===d?"複製失敗":"複製路徑"]})]})]}),(0,n.jsxs)("div",{className:"mb-2 flex items-center justify-end gap-2",children:[m&&(0,n.jsx)("span",{className:"min-w-0 truncate text-xs text-muted-foreground",title:m,children:m}),(0,n.jsxs)(eK.$,{variant:"outline",size:"sm",onClick:p,title:s??"任務的 artifacts 目錄",className:"text-xs",children:[(0,n.jsx)(ew.A,{className:"size-3.5"}),"開啟資料夾"]})]}),0===t.length?(0,n.jsxs)("div",{className:"space-y-2 py-8 text-center",children:[(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"還沒有暫存產物。"}),(0,n.jsxs)("p",{className:"text-xs leading-5 text-muted-foreground/80",children:["驗證截圖、錄影與報告可放在上方資料夾,工作暫存可放在其下的 ",(0,n.jsx)("code",{className:"rounded-xs bg-muted/40 px-1 py-0.5 font-mono",children:"scratch/"}),",完成任務時會一併清除。"]})]}):(0,n.jsxs)("div",{className:"space-y-2",children:[h.length>0?(0,n.jsx)("ul",{className:"grid grid-cols-2 gap-2",children:h.map(t=>(0,n.jsx)("li",{children:(0,n.jsxs)("button",{type:"button",onClick:()=>i(t),title:t.name,className:"w-full rounded-md border border-border/70 bg-muted/20 p-2 text-left outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(tY,{taskId:e,artifact:t}),(0,n.jsxs)("div",{className:"mt-1.5 flex items-baseline gap-1.5",children:[(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate font-mono text-xs",children:t.name}),(0,n.jsx)("span",{className:"shrink-0 text-xs tabular-nums text-muted-foreground",children:tG(t.size)})]})]})},t.name))}):(0,n.jsx)("p",{className:"py-6 text-center text-sm text-muted-foreground",children:"還沒有驗證截圖或錄影。"}),f.length>0&&(0,n.jsxs)("div",{className:"rounded-md border border-border/70",children:[(0,n.jsxs)("button",{type:"button",onClick:()=>c(e=>!e),"aria-expanded":o,className:"flex w-full items-center gap-1.5 rounded-md px-2 py-1.5 text-xs text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(ey.A,{className:(0,T.cn)("size-3.5 shrink-0 transition-transform motion-reduce:transition-none",o&&"rotate-90")}),"其他 ",f.length," 個檔案(報告、script、log)"]}),o&&(0,n.jsx)("ul",{className:"border-t border-border/70",children:f.map(e=>(0,n.jsx)("li",{children:(0,n.jsxs)("button",{type:"button",onClick:()=>i(e),title:e.name,className:"flex w-full items-center gap-2 px-2 py-1 text-left outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:["image"===e.kind?(0,n.jsx)(eb.A,{className:"size-3.5 shrink-0 text-muted-foreground"}):"video"===e.kind?(0,n.jsx)(eC.A,{className:"size-3.5 shrink-0 text-muted-foreground"}):(0,n.jsx)(eg.A,{className:"size-3.5 shrink-0 text-muted-foreground"}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate font-mono text-xs",children:e.name}),(0,n.jsxs)("span",{className:"shrink-0 text-xs tabular-nums text-muted-foreground/80",children:[function(e){let t=Math.floor((Date.now()-e)/6e4);if(t<1)return"剛剛";if(t<60)return`${t} 分前`;let s=Math.floor(t/60);return s<24?`${s} 小時前`:`${Math.floor(s/24)} 天前`}(e.modifiedAt)," \xb7 ",tG(e.size)]})]})},e.name))})]})]}),(0,n.jsx)(l.N,{children:a&&(0,n.jsx)(tX,{taskId:e,artifact:a,onClose:()=>i(null)},`artifact-${e}-${a.name}`)})]})}function tZ({slaves:e,progressById:t,onSelectTask:s}){if(0===e.length)return(0,n.jsx)("p",{className:"py-10 text-center text-sm text-muted-foreground",children:"Master 還沒有建立任何 slave 卡片。"});let r=e.filter(e=>"done"===e.column).length;return(0,n.jsxs)("div",{className:"space-y-3",children:[(0,n.jsxs)("p",{className:"text-sm text-muted-foreground",children:[e.length," 張卡片 \xb7 ",r," 完成"]}),(0,n.jsx)("ul",{className:"space-y-1.5",children:e.map(({task:e,column:r})=>{let a=t[e.id],i=ec(r,e,a),l="in_progress"===r?ed(a):null,o="in_progress"===r?a?.todos?.find(e=>"in_progress"===e.status):void 0,c=e.outcome?.pr;return(0,n.jsx)("li",{children:(0,n.jsxs)("button",{type:"button",onClick:()=>s?.(e.id),title:`開啟:${e.title}`,className:"w-full rounded-md border border-border/70 bg-muted/20 px-2.5 py-2 text-left outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)(W,{...i}),(0,n.jsx)(eo,{id:e.id}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate text-sm font-medium",children:e.title}),(0,n.jsx)("span",{className:"shrink-0 text-xs text-muted-foreground",children:i.label}),l&&(0,n.jsx)("span",{className:"shrink-0 text-xs tabular-nums text-muted-foreground",children:l})]}),(0,n.jsxs)("div",{className:"mt-1 flex items-center gap-2 pl-3.5 text-xs text-muted-foreground",children:[(0,n.jsx)(j.A,{className:"size-3 shrink-0"}),(0,n.jsx)("span",{className:"max-w-[45%] shrink-0 truncate",children:en(e)}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",children:"backlog"===r&&e.launchError?e.launchError:o?o.activeForm??o.content:e.branch}),c&&(0,n.jsxs)("span",{className:"shrink-0",children:["PR #",c.number]})]})]})},e.id)})})]})}let t0=(0,r.memo)(function({file:e,showHeader:t=!0}){let{split:s,fullContext:a}=tF();return(0,n.jsxs)("div",{className:(0,T.cn)("overflow-hidden",t&&"rounded-md border border-border/70"),children:[t&&(0,n.jsxs)("div",{className:"flex items-center gap-2 border-b border-border/70 bg-muted/30 px-2 py-1.5",children:[(0,n.jsx)("span",{className:"rounded-xs bg-secondary px-1.5 py-0.5 text-xs font-medium text-secondary-foreground",children:tN[e.status]??e.status}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate font-mono text-xs",title:e.path,children:e.path}),e.truncated&&(0,n.jsx)("span",{className:"shrink-0 text-xs text-muted-foreground",children:"已截斷"})]}),(0,n.jsx)("div",{className:"min-w-0 max-w-full overflow-x-auto text-xs [&_.diff-content]:whitespace-pre-wrap [&_.diff-content]:break-words [&_pre]:whitespace-pre-wrap [&_pre]:break-words [&_table]:min-w-full [&_table]:table-fixed [&_td]:min-w-0 [&_td]:align-top",children:(0,n.jsx)(r.Suspense,{fallback:null,children:(0,n.jsx)(tp,{oldValue:e.oldValue,newValue:e.newValue,splitView:s,showDiffOnly:!a,useDarkTheme:!0,compareMethod:"diffLines",renderContent:e=>(0,n.jsx)("span",{className:"block min-w-0 max-w-full whitespace-pre-wrap break-words",children:e}),styles:{variables:{dark:{diffViewerBackground:"var(--card)",diffViewerColor:"var(--card-foreground)",addedBackground:"rgba(78, 201, 138, 0.15)",addedColor:"var(--foreground)",removedBackground:"rgba(229, 72, 77, 0.15)",removedColor:"var(--foreground)",wordAddedBackground:"rgba(78, 201, 138, 0.32)",wordRemovedBackground:"rgba(229, 72, 77, 0.32)",addedGutterBackground:"rgba(78, 201, 138, 0.20)",removedGutterBackground:"rgba(229, 72, 77, 0.20)",gutterBackground:"var(--muted)",gutterBackgroundDark:"var(--muted)",gutterColor:"var(--muted-foreground)",addedGutterColor:"var(--foreground)",removedGutterColor:"var(--foreground)",highlightBackground:"rgba(76, 155, 245, 0.15)",highlightGutterBackground:"rgba(76, 155, 245, 0.20)",codeFoldGutterBackground:"var(--muted)",codeFoldBackground:"var(--secondary)",codeFoldContentColor:"var(--muted-foreground)",emptyLineBackground:"var(--card)"}},diffContainer:{width:"100%",maxWidth:"100%",overflowX:"visible"},line:{width:"100%"},content:{width:"100%",maxWidth:"100%",overflowX:"visible"},contentText:{display:"block",width:"100%",maxWidth:"100%",whiteSpace:"pre-wrap",overflowWrap:"anywhere",wordBreak:"break-word"},lineContent:{display:"block",width:"100%",maxWidth:"100%",whiteSpace:"pre-wrap",overflowWrap:"anywhere",wordBreak:"break-word"},gutter:{maxWidth:"2.5rem",minWidth:"2.5rem",width:"2.5rem",paddingLeft:"0.25rem",paddingRight:"0.25rem",whiteSpace:"nowrap"}}})})})]})});function t1(){let{split:e,fullContext:t}=tF(),s=e=>(0,T.cn)("rounded-sm px-2 py-1 text-xs outline-none transition-colors motion-reduce:transition-none",e?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-foreground");return(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsxs)("div",{role:"group","aria-label":"Diff 版面",className:"flex rounded-md border border-border/70 p-0.5",children:[(0,n.jsx)("button",{type:"button","aria-pressed":!e,onClick:()=>tK({split:!1}),className:(0,T.cn)("focus-visible:ring-[3px] focus-visible:ring-ring/50",s(!e)),children:"整合"}),(0,n.jsx)("button",{type:"button","aria-pressed":e,onClick:()=>tK({split:!0}),className:(0,T.cn)("focus-visible:ring-[3px] focus-visible:ring-ring/50",s(e)),children:"左右對照"})]}),(0,n.jsx)("button",{type:"button","aria-pressed":t,onClick:()=>tK({fullContext:!t}),title:t?"只顯示變更附近的行":"顯示檔案的所有行",className:(0,T.cn)("border border-border/70 focus-visible:ring-[3px] focus-visible:ring-ring/50",s(t)),children:t?"收合未變更":"全部展開"})]})}function t5({entry:e,file:t,onClose:s}){return(0,n.jsx)(e5.h,{title:e.path,description:(0,n.jsxs)("span",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{children:tN[e.status]??e.status}),(e.additions>0||e.deletions>0)&&(0,n.jsxs)("span",{className:"font-mono tabular-nums",children:[(0,n.jsxs)("span",{className:"text-success",children:["+",e.additions]}),(0,n.jsxs)("span",{className:"ml-1 text-destructive",children:["−",e.deletions]})]}),t?.truncated&&(0,n.jsx)("span",{children:"\xb7 已截斷"})]}),onClose:s,showHeader:!0,contentClassName:"max-w-6xl",bodyClassName:"p-4",children:void 0===t?(0,n.jsxs)("div",{className:"flex h-40 items-center justify-center gap-2 text-sm text-muted-foreground",children:[(0,n.jsx)(k.A,{className:"size-3.5 animate-spin"}),"讀取內容中…"]}):null===t?(0,n.jsx)("p",{className:"py-10 text-center text-sm text-muted-foreground",children:"讀不到這個檔案的內容。"}):(0,n.jsxs)("div",{className:"space-y-3",children:[(0,n.jsx)(t1,{}),(0,n.jsx)(t0,{file:t,showHeader:!1})]})})}function t2({diff:e}){return(0,n.jsxs)("div",{className:"flex items-center gap-1",children:[(0,n.jsx)(P.K,{"aria-label":"重新整理 Git diff",title:"重新整理(含 fetch origin)",className:"p-1",disabled:e.loading,onClick:e.manualRefresh,children:(0,n.jsx)(ez.A,{className:(0,T.cn)("size-3.5",e.loading&&"animate-spin")})}),e.entries.length>0&&(0,n.jsx)(P.K,{"aria-label":"放大檢視 Git diff",title:"放大檢視(全部展開)",className:"p-1",onClick:e.expand,children:(0,n.jsx)(e$.A,{className:"size-3.5"})})]})}function t3({taskId:e,diff:t}){let{entries:s,contents:r,selectedEntry:a,setSelectedPath:i,loading:o,error:c,expanded:d,fullFiles:u,closeExpanded:m}=t;return(0,n.jsxs)(n.Fragment,{children:[o&&0===s.length?(0,n.jsxs)("div",{className:"flex h-full items-center justify-center gap-2 text-sm text-muted-foreground",children:[(0,n.jsx)(k.A,{className:"size-3.5 animate-spin"}),"讀取 diff 中…"]}):c?(0,n.jsx)("div",{className:"rounded-md border border-destructive/40 bg-destructive/10 p-2 text-sm",children:c}):0===s.length?(0,n.jsx)("p",{className:"py-10 text-center text-sm text-muted-foreground",children:"與基準分支相比沒有變更。"}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("ul",{className:"space-y-1",children:s.map(e=>(0,n.jsx)("li",{children:(0,n.jsxs)("button",{type:"button",onClick:()=>i(e.path),title:`檢視 ${e.path} 的 diff`,className:"flex w-full items-center gap-2 rounded-md border border-border/70 bg-muted/30 px-2 py-1.5 text-left outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)("span",{className:"shrink-0 rounded-xs bg-secondary px-1.5 py-0.5 text-xs font-medium text-secondary-foreground",children:tN[e.status]??e.status}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate font-mono text-xs",title:e.path,children:e.path}),(e.additions>0||e.deletions>0)&&(0,n.jsxs)("span",{className:"shrink-0 font-mono text-xs tabular-nums",children:[(0,n.jsxs)("span",{className:"text-success",children:["+",e.additions]}),(0,n.jsxs)("span",{className:"ml-1 text-destructive",children:["−",e.deletions]})]}),(0,n.jsx)(ey.A,{className:"size-3.5 shrink-0 text-muted-foreground"})]})},e.path))}),s.length>=80&&(0,n.jsxs)("p",{className:"mt-2 text-xs text-muted-foreground",children:["變更檔案超過 ",80," 個,僅顯示前 ",80," 個。"]})]}),(0,n.jsx)(l.N,{children:a&&(0,n.jsx)(t5,{entry:a,file:a.path in r?r[a.path]:void 0,onClose:()=>i(null)},`diff-${e}-${a.path}`)}),d&&(0,n.jsx)("div",{className:"fixed inset-0 z-50 flex bg-background/95 text-foreground",children:(0,n.jsxs)("div",{className:"flex min-h-0 w-full flex-col",children:[(0,n.jsxs)("div",{className:"flex h-12 shrink-0 items-center justify-between border-b border-border px-5",children:[(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("h2",{className:"text-base font-semibold",children:"Git diff"}),(0,n.jsxs)("p",{className:"text-sm text-muted-foreground",children:[s.length," changed ",1===s.length?"file":"files"]})]}),(0,n.jsxs)("div",{className:"flex items-center gap-3",children:[(0,n.jsx)(t1,{}),(0,n.jsx)(P.K,{"aria-label":"關閉 diff 放大檢視",title:"關閉",onClick:m,children:(0,n.jsx)(eE.A,{className:"size-4"})})]})]}),(0,n.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto p-5",children:(0,n.jsx)("div",{className:"mx-auto w-full max-w-6xl space-y-4",children:null===u?(0,n.jsxs)("div",{className:"flex items-center justify-center gap-2 py-10 text-sm text-muted-foreground",children:[(0,n.jsx)(k.A,{className:"size-3.5 animate-spin"}),"讀取全部 diff 內容中…"]}):u.map(e=>(0,n.jsx)(t0,{file:e},e.path))})})]})})]})}function t4({task:e,column:t,progress:s,launch:a,onStart:i,onReturnToBacklog:l,onLaunchAgent:o,onComplete:c,onEdit:d,onDelete:u,active:m=!0,slaves:f=[],progressById:p={},master:g=null,onSelectTask:j}){var v;let N="master"===e.role,[y,k]=(0,r.useState)(null),[C,A]=(0,r.useState)(!1),[z,$]=(0,r.useState)([]),E=(0,r.useId)(),R=`${E}-panel`,I=e=>`${E}-tab-${e}`,K=e.worktreePath??e.projectPath??(N?e.workDir??e.workspacePath:void 0)??null,B="in_progress"!==t||e.worktreePath?null:N?"正在準備 master 的工作資料夾,完成後 agent 會自動啟動…":`正在準備工作環境:從最新的 ${e.baseBranch??"基準分支"} 建立分支 ${e.branch} 與 worktree,有 remote 時會一併推送到 origin。第一次開始執行需要幾秒鐘,完成後 agent 會自動啟動…`,F=function(e,t){let s,n;if(!e||!t)return null;let r=t.replace(/\\/g,"/"),a=(n=(s=e.replace(/\\/g,"/").replace(/\/+$/,"")).lastIndexOf("/"))>=0?s.slice(n+1):s;return`${r}/${a}.artifacts`}(e.worktreePath,e.workspacePath),_=function(e,t){let[s,n]=(0,r.useState)([]),[a,i]=(0,r.useState)({}),[l,o]=(0,r.useState)(null),[c,d]=(0,r.useState)(!1),[u,m]=(0,r.useState)(null),[x,h]=(0,r.useState)(0),[f,p]=(0,r.useState)(!1),[g,b]=(0,r.useState)(null),j=(0,r.useRef)(new Map),v=(0,r.useCallback)(e=>{let t=new Set(e.map(e=>e.path));for(let e of j.current.keys())t.has(e)||j.current.delete(e);n(t=>(function(e,t){if(e.length!==t.length)return t;let s=!1,n=t.map((t,n)=>{let r=e[n];return th(r,t)?r:(s=!0,t)});return s?n:e})(t,e)),i(t=>{let s;return s=new Set(e.map(e=>e.path)),Object.keys(t).every(e=>s.has(e))?t:Object.fromEntries(Object.entries(t).filter(([e])=>s.has(e)))})},[]),N=s.find(e=>e.path===l)??null;(0,r.useEffect)(()=>{if(!N)return;let t=N.path,s=j.current.get(t);if(t in a&&s&&th(s,N))return;let n=!0;return(0,D.sQ)(e,t).then(e=>{n&&(j.current.set(t,N),i(s=>{var n;return(n=s[t])===e||n&&e&&n.path===e.path&&n.status===e.status&&n.additions===e.additions&&n.deletions===e.deletions&&n.oldValue===e.oldValue&&n.newValue===e.newValue&&n.truncated===e.truncated?s:{...s,[t]:e}}))}).catch(()=>{n&&(j.current.set(t,N),i(e=>null===e[t]?e:{...e,[t]:null}))}),()=>{n=!1}},[e,N,a]),(0,r.useEffect)(()=>{let s;if(!t)return;let n=!0,r=!1,a=async t=>{if(r&&(0,tf.o)()){n&&(s=setTimeout(()=>void a(!1),3e3));return}r=!0;try{let s=await (0,D.Wc)(e,{fetch:t});if(!n)return;v(s),m(null)}catch(e){n&&m(e instanceof Error?e.message:String(e))}finally{n&&(d(!1),s=setTimeout(()=>void a(!1),3e3))}};return d(!0),a(!0),()=>{n=!1,s&&clearTimeout(s)}},[e,t,x,v]),(0,r.useEffect)(()=>{l&&!s.some(e=>e.path===l)&&o(null)},[s,l]),(0,r.useEffect)(()=>{if(!f)return;let t=!0;return(0,D.Gw)(e).then(e=>{t&&b(e)}).catch(e=>{t&&m(e instanceof Error?e.message:String(e))}),()=>{t=!1}},[f,e]);let y=(0,r.useCallback)(()=>{p(!1),b(null)},[]);return{entries:s,contents:a,selectedEntry:N,setSelectedPath:o,loading:c,error:u,expanded:f,fullFiles:g,expand:(0,r.useCallback)(()=>p(!0),[]),closeExpanded:y,manualRefresh:(0,r.useCallback)(()=>{i({}),j.current.clear(),h(e=>e+1)},[])}}(e.id,"in_progress"===t&&!N),M=function(e,t,s){let[n,a]=(0,r.useState)([]);return(0,r.useEffect)(()=>{let n;if(a([]),!t)return;let r=!0,i=!1,l=async()=>{if(i&&(0,tf.o)()){r&&s&&(n=setTimeout(()=>void l(),3e3));return}i=!0;try{let t=await (0,D.ly)(e);r&&a(t)}catch{}finally{r&&s&&(n=setTimeout(()=>void l(),3e3))}};return l(),()=>{r=!1,n&&clearTimeout(n)}},[e,t,s]),n}(e.id,"backlog"!==t&&!N,"in_progress"===t&&!N),L=z.filter(tO).length;(0,r.useEffect)(()=>{let s;if("in_progress"!==t)return void $([]);let n=!0,r=!1,a=async()=>{if(r&&(0,tf.o)()){n&&(s=setTimeout(()=>void a(),3e3));return}r=!0;try{let t=await (0,D.wn)(e.id);n&&$(t)}catch{}finally{n&&(s=setTimeout(()=>void a(),3e3))}};return a(),()=>{n=!1,s&&clearTimeout(s)}},[e.id,t]),(0,r.useEffect)(()=>{if(!C)return;let e=e=>{"Escape"!==e.key||document.querySelector('[role="dialog"][aria-modal="true"]')||A(!1)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[C]);let V="backlog"===t,G=a?.launch,O=a?.nonce??0,H=(N?(v=f.length>0,"in_progress"===t?["slaves","task","artifacts"]:v?["slaves","task"]:["task"]):"done"===t?tj:"backlog"===t?tv:tb).filter(e=>"spec"!==e||M.length>0),J="done"===t&&H.includes("spec")?"spec":H[0],W=y&&H.includes(y)?y:J,U=e=>"artifacts"===e?L:"diff"===e?_.entries.length:"slaves"===e?f.length:0,q=(0,n.jsx)("div",{role:"tablist","aria-label":"任務檢視",className:"flex min-w-0 rounded-md border border-border/70 p-0.5",children:H.map(e=>{let t=U(e);return(0,n.jsxs)("button",{type:"button",role:"tab",id:I(e),"aria-selected":W===e,"aria-controls":R,onClick:()=>{k(e)},className:(0,T.cn)("shrink-0 rounded-sm px-2 py-0.5 text-xs outline-none transition-colors motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50",W===e?"bg-primary/15 text-primary":"text-muted-foreground hover:text-foreground"),children:[tg[e],t>0&&(0,n.jsx)("span",{className:"ml-1 tabular-nums text-muted-foreground/80",children:t})]},e)})}),X="slaves"===W?(0,n.jsx)(tZ,{slaves:f,progressById:p,onSelectTask:j}):"task"===W?(0,n.jsx)(tU,{task:e,column:t,progress:s,master:g,onSelectTask:j}):"spec"===W?(0,n.jsx)(tq,{specs:M}):"artifacts"===W?(0,n.jsx)(tQ,{taskId:e.id,artifacts:z,artifactsDir:F}):(0,n.jsx)(t3,{taskId:e.id,diff:_}),Q=(0,n.jsx)("div",{role:"tabpanel",id:R,"aria-labelledby":I(W),className:"h-full",children:X}),Z=(0,r.useSyncExternalStore)(tP,t$,()=>"docked"),ee=(0,r.useSyncExternalStore)(tM,()=>window.matchMedia(t_).matches,()=>!0),et=ee&&"docked"===Z,[es,en]=(0,r.useState)(!1),er=et||es,ea=(0,n.jsx)(tH,{title:tg[W],count:U(W),actions:(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:["diff"===W&&(0,n.jsx)(t2,{diff:_}),et?(0,n.jsx)(P.K,{"aria-label":"收合側欄",title:"收合成圖示列,讓終端機佔滿寬度",className:"p-1",onClick:()=>tE("rail"),children:(0,n.jsx)(eP.A,{className:"size-3.5"})}):(0,n.jsxs)(n.Fragment,{children:[ee&&(0,n.jsx)(P.K,{"aria-label":"固定側欄",title:"固定在終端機旁",className:"p-1",onClick:()=>{en(!1),tE("docked")},children:(0,n.jsx)(eT.A,{className:"size-3.5"})}),(0,n.jsx)(P.K,{"aria-label":"關閉側欄",className:"p-1",onClick:()=>en(!1),children:(0,n.jsx)(eE.A,{className:"size-3.5"})})]})]}),children:Q}),ei=(0,n.jsx)("div",{role:"tablist","aria-label":"任務檢視","aria-orientation":"vertical",className:"flex w-11 shrink-0 flex-col items-center gap-1 border-l border-border bg-card/40 py-1.5",children:H.map(e=>{let t=tC[e],s=U(e),r=er&&W===e;return(0,n.jsxs)("button",{type:"button",role:"tab",id:I(e),"aria-selected":r,"aria-controls":R,"aria-label":s>0?`${tg[e]}(${s})`:tg[e],title:tg[e],onClick:()=>{var t;return t=e,void(er&&t===W?et?tE("rail"):en(!1):(k(t),et||en(!0)))},className:(0,T.cn)("relative flex size-8 items-center justify-center rounded-md outline-none transition-colors motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50",r?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:[(0,n.jsx)(t,{className:"size-4"}),s>0&&(0,n.jsx)("span",{"aria-hidden":"true",className:"absolute -right-0.5 -top-0.5 flex h-3.5 min-w-3.5 items-center justify-center rounded-full bg-primary px-1 text-[9px] font-semibold tabular-nums text-primary-foreground",children:s})]},e)})}),[el,eo]=(0,r.useState)("idle"),ec=(0,r.useRef)(null),ed=(0,r.useRef)(null),eu=(0,r.useRef)(null);(0,r.useLayoutEffect)(tV,[]);let em=(e,t)=>{let s,n=Math.round(Math.max(336,Math.min(e,Math.max(336,(s=ec.current?.clientWidth??0)>0?s-320-10-44:e))));document.documentElement.style.setProperty(tk,`${n}px`),t&&window.localStorage.setItem(tw,String(n))},ex=()=>{if(!eu.current)return;eu.current=null;let e=ed.current?.getBoundingClientRect().width??0;e>0&&em(e,!0)},eh=e=>{let t=ed.current?.getBoundingClientRect().width??0;t<=0||em(t+e,!0)},ef=C?(0,n.jsxs)("div",{className:"flex items-center gap-1",children:[(0,n.jsx)("button",{type:"button",onClick:()=>A(!1),className:"rounded-md px-1.5 py-1 text-sm text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:"取消"}),(0,n.jsx)("button",{type:"button",onClick:()=>u(e.id),className:"rounded-md px-1.5 py-1 text-sm text-destructive outline-none transition-colors motion-reduce:transition-none hover:bg-destructive/15 focus-visible:ring-[3px] focus-visible:ring-ring/50",children:"確認刪除"})]}):(0,n.jsx)(P.K,{"aria-label":"刪除任務",title:"刪除任務(清理 worktree)",tone:"danger",onClick:()=>A(!0),children:(0,n.jsx)(h.A,{className:"size-4"})});return"in_progress"===t?(0,n.jsx)("div",{className:"flex h-full min-w-0 flex-col overflow-hidden bg-background text-foreground",children:(0,n.jsxs)("main",{ref:ec,className:"flex min-h-0 flex-1 overflow-hidden",children:[(0,n.jsxs)("div",{className:"relative flex min-h-0 min-w-0 flex-1 flex-col",children:[(0,n.jsx)("div",{className:"flex min-h-0 flex-1 flex-col",onPointerDown:()=>en(!1),children:(0,n.jsx)(e1,{taskId:e.id,cwd:K,launchCommand:G,launchNonce:O,provisionNotice:B,readOnly:!1,onReturnToBacklog:()=>l(e),onLaunchAgent:()=>o(e),active:m,toolbarStart:(0,n.jsxs)(n.Fragment,{children:[N?(0,n.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5 rounded-xs bg-master/15 px-1.5 py-0.5 text-xs font-medium text-master",children:[(0,n.jsx)(b.A,{className:"size-3 shrink-0"}),"Master"]}):(0,n.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5 rounded-xs bg-muted px-1.5 py-0.5 font-mono text-xs text-foreground",title:e.branch,children:[(0,n.jsx)(w.A,{className:"size-3 shrink-0 text-muted-foreground"}),(0,n.jsx)("span",{className:"truncate",children:e.branch})]}),e.baseBranch&&(0,n.jsxs)("span",{className:"min-w-0 shrink truncate font-mono text-xs text-muted-foreground",title:`基準分支:${e.baseBranch}`,children:["← ",e.baseBranch]}),(0,n.jsx)(P.K,{"aria-label":"copied"===el?"已複製 worktree 路徑":"error"===el?"複製 worktree 路徑失敗":"複製 worktree 路徑",title:K??void 0,className:"p-1",disabled:!K,onClick:()=>{K&&navigator.clipboard.writeText(K).then(()=>eo("copied")).catch(()=>eo("error")).finally(()=>window.setTimeout(()=>eo("idle"),1600))},children:"copied"===el?(0,n.jsx)(S.A,{className:"size-3.5"}):(0,n.jsx)(eA.A,{className:"size-3.5"})}),(0,n.jsx)(Y,{progress:s})]}),toolbarEnd:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{"aria-hidden":"true",className:"h-4 w-px shrink-0 bg-border"}),(0,n.jsxs)(eK.$,{size:"sm",className:"h-7 shrink-0 px-2.5 text-xs",onClick:()=>{c(e)},title:"標記完成後會清理 PTY 與 worktree",children:[(0,n.jsx)(S.A,{className:"size-3.5"}),"完成"]}),ef]})})}),!et&&es&&(0,n.jsx)("aside",{"aria-label":tg[W],onKeyDown:e=>{"Escape"!==e.key||(0,tf.o)()||en(!1)},className:"absolute bottom-0 right-0 top-10 z-20 flex w-[min(var(--vf-workspace-aside,24rem),calc(100%-2rem))] flex-col border-l border-border bg-card shadow-xl xl:w-[min(var(--vf-workspace-aside,27rem),calc(100%-2rem))]",children:ea})]}),et&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{role:"separator","aria-orientation":"vertical","aria-label":"調整終端機與側邊面板的寬度",tabIndex:0,onPointerDown:e=>{let t=ed.current?.getBoundingClientRect().width??0;t<=0||(eu.current={x:e.clientX,width:t},e.currentTarget.setPointerCapture(e.pointerId))},onPointerMove:e=>{let t=eu.current;t&&em(t.width-(e.clientX-t.x),!1)},onPointerUp:ex,onPointerCancel:ex,onKeyDown:e=>{"ArrowLeft"===e.key?(e.preventDefault(),eh(24)):"ArrowRight"===e.key&&(e.preventDefault(),eh(-24))},className:"flex w-2.5 shrink-0 cursor-col-resize items-center justify-center border-x border-border bg-card outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:(0,n.jsx)("span",{className:"h-12 w-0.5 rounded-full bg-input"})}),(0,n.jsx)("aside",{ref:ed,className:"flex min-h-0 w-[var(--vf-workspace-aside,24rem)] min-w-0 max-w-[calc(100%-23.375rem)] shrink-0 flex-col bg-card/40 xl:w-[var(--vf-workspace-aside,27rem)]",children:ea})]}),ei]})}):(0,n.jsxs)("div",{className:"flex h-full min-w-0 flex-col overflow-hidden bg-background text-foreground",children:[(0,n.jsxs)("header",{className:"flex h-12 shrink-0 items-center gap-3 border-b border-border px-5",children:[(0,n.jsx)("div",{className:"min-w-0 flex-1",children:(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[N?(0,n.jsx)(b.A,{className:"size-3.5 shrink-0 text-master"}):(0,n.jsx)(w.A,{className:"size-3.5 shrink-0 text-muted-foreground"}),(0,n.jsx)("span",{className:"min-w-0 truncate text-base font-semibold",children:e.title})]})}),V&&(0,n.jsxs)(eK.$,{size:"sm",variant:"outline",onClick:()=>{i(e)},disabled:!K,children:[(0,n.jsx)(eS.A,{className:"size-3.5"}),"開始"]}),"backlog"===t&&(0,n.jsx)(P.K,{"aria-label":"編輯任務",title:"編輯任務",onClick:()=>{d(e.id)},children:(0,n.jsx)(x.A,{className:"size-4"})}),ef]}),(0,n.jsx)("main",{className:"flex min-h-0 flex-1 flex-col overflow-hidden bg-card/40",children:"backlog"===t&&1===H.length?(0,n.jsx)(tH,{title:tg.task,children:(0,n.jsx)(tU,{task:e,column:t,progress:s,master:g,onSelectTask:j})}):(0,n.jsx)(tH,{heading:q,children:Q})})]})}var t6=s(26814),t7=s(6684),t8=s(37744);let t9={backlog:"Backlog",in_progress:"In Progress",done:"Done"};function se(e,t){return"backlog"===t?{dot:"bg-muted-foreground/60",label:t9.backlog}:"done"===t?{dot:"bg-success",label:t9.done}:U(e?.activity)}function st({branch:e}){return(0,n.jsx)("span",{"aria-hidden":"true",className:(0,T.cn)("pointer-events-none absolute -top-1 left-[18px] w-2.5 border-l border-master/50","last"===e?"h-6":"-bottom-1"),children:(0,n.jsx)("span",{className:"absolute left-0 top-[23px] w-full border-t border-master/50"})})}function ss({running:e,viewing:t,selectedTaskId:s,progress:r,onSelect:a,collapsed:i,onCollapsedChange:l}){let o,c=(o=new Set(e.map(e=>e.id)),e.filter(e=>!(e.masterId&&o.has(e.masterId))).flatMap(t=>{let s=e.filter(e=>e.masterId===t.id);return[{task:t,branch:"none"},...s.map((e,t)=>({task:e,branch:t===s.length-1?"last":"middle"}))]}));if(i)return(0,n.jsxs)("nav",{"aria-label":"進行中的任務",className:"flex w-11 shrink-0 flex-col items-center gap-1 overflow-y-auto border-r border-border bg-card/40 py-1.5",children:[(0,n.jsx)(P.K,{"aria-label":"展開任務清單",title:"展開任務清單",className:"mb-1 size-8 rounded-md",onClick:()=>l(!1),children:(0,n.jsx)(t6.A,{className:"size-4"})}),[...t?[{task:t.task,column:t.column}]:[],...c.map(({task:e})=>({task:e,column:"in_progress"}))].map(({task:e,column:t})=>{let i=e.id===s;return(0,n.jsx)("button",{type:"button","aria-label":e.title,"aria-current":i?"page":void 0,title:e.title,onClick:()=>a(e.id),className:(0,T.cn)("flex size-8 shrink-0 items-center justify-center rounded-md outline-none transition-colors motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50",i?"bg-primary/15":"hover:bg-accent"),children:(0,n.jsx)(W,{...se(r[e.id],t),className:"size-2"})},e.id)})]});let d=(e,t,i)=>{let l=e.id===s,o="master"===e.role,c=(0,n.jsxs)("button",{type:"button","aria-current":l?"page":void 0,title:e.title,onClick:()=>a(e.id),className:(0,T.cn)("flex w-full min-w-0 flex-col gap-1 rounded-md border px-2.5 py-2 text-left outline-none transition-colors motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50",l?"border-primary/60 bg-accent text-foreground":"border-transparent text-muted-foreground hover:bg-accent/60 hover:text-foreground"),children:[(0,n.jsxs)("span",{className:"flex min-w-0 items-center gap-2 text-sm font-medium text-foreground",children:[o?(0,n.jsx)(b.A,{className:"size-3.5 shrink-0 text-master"}):(0,n.jsx)("span",{className:"flex w-3.5 shrink-0 justify-center",children:(0,n.jsx)(W,{...se(r[e.id],t)})}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",children:e.title}),(0,n.jsx)(eo,{id:e.id,className:"font-normal"})]}),(0,n.jsxs)("span",{className:"flex min-w-0 items-center gap-2 pl-[22px] text-xs",children:[(0,n.jsx)("span",{className:"min-w-0 truncate",children:"in_progress"===t?o?"Master":e.projectName??"":t9[t]}),"in_progress"===t&&(0,n.jsx)(Y,{progress:r[e.id],mark:o})]})]},e.id);return"none"===i?c:(0,n.jsxs)("div",{className:"relative pl-7",children:[(0,n.jsx)(st,{branch:i}),c]},e.id)};return(0,n.jsxs)("nav",{"aria-label":"進行中的任務",className:"flex w-64 shrink-0 flex-col border-r border-border bg-card/40",children:[(0,n.jsxs)("div",{className:"flex h-10 shrink-0 items-center gap-2 border-b border-border pl-3 pr-1.5",children:[(0,n.jsx)("span",{className:"size-1.5 shrink-0 rounded-full bg-warning"}),(0,n.jsx)("h2",{className:(0,T.cn)(E,"text-warning"),children:"In Progress"}),(0,n.jsx)("span",{className:"text-xs tabular-nums text-muted-foreground/80",children:e.length}),(0,n.jsx)("span",{className:"flex-1"}),(0,n.jsx)(P.K,{"aria-label":"收合任務清單",title:"收合任務清單,讓終端機更寬",className:"p-1",onClick:()=>l(!0),children:(0,n.jsx)(t7.A,{className:"size-3.5"})})]}),(0,n.jsxs)("div",{className:"min-h-0 flex-1 space-y-1 overflow-y-auto p-1.5",children:[t&&(0,n.jsxs)("div",{className:"mb-2 space-y-1 border-b border-border pb-2",children:[(0,n.jsxs)("p",{className:"flex items-center gap-1.5 px-1 text-xs text-muted-foreground",children:[(0,n.jsx)(t8.A,{className:"size-3"}),"目前檢視"]}),d(t.task,t.column,"none")]}),c.map(({task:e,branch:t})=>d(e,"in_progress",t)),0===c.length&&(0,n.jsx)("p",{className:"px-2 py-3 text-sm text-muted-foreground",children:"目前沒有進行中的任務"})]})]})}var sn=s(67564);function sr(){let e;return("boolean"==typeof(e=td(tr))?e:null)??!window.matchMedia("(min-width: 1280px)").matches}function sa({active:e,children:t}){let s=(0,o.E)(),a=(0,c.I)()??!1,i=(0,sn.n)({timing:"standard",initialOpacity:.96,transform:{x:4},reducedMotion:a});return(0,r.useEffect)(()=>{s.stop(),s.set("hidden"),e&&s.start("visible")},[e,s,a]),(0,n.jsx)(d.PY1.div,{initial:"hidden",animate:s,variants:i,inert:!e,"aria-hidden":!e||void 0,className:(0,T.cn)("h-full",!e&&"hidden pointer-events-none"),children:t})}function si({board:e,onBoardChange:t,onEditTask:s,onTaskDone:a,onDeleteTask:i,onOpenTaskTerminal:o,taskTerminals:x,onShowTaskTerminal:h,progress:f,selectedTaskId:p,onSelectTask:g,onNewTask:b,view:j,onViewChange:v,githubView:N,taskLinks:y}){let[w,k]=(0,r.useState)(new Set),[C,S]=(0,r.useState)({}),A=(0,r.useRef)(C);A.current=C;let z=(0,c.I)()??!1,$=(0,sn.n)({timing:"standard",initialOpacity:.96,transform:{x:4},reducedMotion:z}),E=e=>k(t=>t.has(e)?t:new Set(t).add(e)),[P,R]=(0,r.useState)(null),[I,K]=(0,r.useState)(null),B=async(e,t={})=>{E(e.id),S(s=>({...s,[e.id]:{launch:t,nonce:(s[e.id]?.nonce??0)+1}}))};(0,r.useEffect)(()=>{if(!p||(E(p),C[p]))return;let t=e.in_progress.find(e=>e.id===p);if(!t||null==t.launchedAt||!t.worktreePath)return;let s=!1;return(0,D.Vc)(t.id).then(e=>{s||!e||A.current[t.id]||B(t,{resume:!0})}),()=>{s=!0}},[p]);let F=s=>{let n={...s,launchedAt:Date.now()};t({backlog:e.backlog.filter(e=>e.id!==s.id),in_progress:[n,...e.in_progress],done:e.done}),B(n)},_=e=>new Promise((t,s)=>{K({task:e,settle:n=>{(K(null),n)?M(e).then(()=>t(!0),s):t(!1)}})}),M=async e=>{let s=await (0,D.WL)(e.id);if(!s)throw Error("未連線到 VibeFlow core");let n=s.state.board;t({backlog:[s.task,...n.backlog.filter(t=>t.id!==e.id)],in_progress:n.in_progress.filter(t=>t.id!==e.id),done:n.done.filter(t=>t.id!==e.id)})},L=async e=>{await B(e,{includeTaskPrompt:!1})},V=e=>R(e),[G,O]=(0,r.useState)(sr),H=e=>{O(e),tu(tr,e)},J="workspace"===j;return(0,n.jsxs)("div",{className:"flex h-full overflow-hidden bg-background text-foreground",children:[(0,n.jsx)("div",{className:(0,T.cn)("min-h-0 min-w-0 flex-1 overflow-hidden",J&&"hidden"),children:"github"===j?N:(0,n.jsx)(ef,{board:e,progress:f,selectedTaskId:p??null,onSelectTask:g,onEditTask:s,onDeleteTask:i,onOpenTaskTerminal:o,taskTerminals:x,onShowTaskTerminal:h,onNewTask:b,view:j,onViewChange:v,taskLinks:y})}),(()=>{let t=[...e.in_progress.map(e=>({task:e,column:"in_progress"})),...e.backlog.map(e=>({task:e,column:"backlog"})),...e.done.map(e=>({task:e,column:"done"}))],r=p?t.find(({task:e})=>e.id===p):null,a=new Set;for(let e of w){let s=t.find(({task:t})=>t.id===e);s?.column==="in_progress"&&a.add(e)}return r&&a.add(r.task.id),(0,n.jsxs)("div",{className:(0,T.cn)("min-h-0 min-w-0 flex-1",J?"flex":"hidden"),children:[(0,n.jsx)(ss,{running:e.in_progress,viewing:r&&"in_progress"!==r.column?r:null,selectedTaskId:p??null,progress:f,onSelect:g,collapsed:G,onCollapsedChange:H}),(0,n.jsxs)("main",{className:"min-h-0 min-w-0 flex-1",children:[Array.from(a).map(e=>{let r=t.find(({task:t})=>t.id===e);if(!r)return null;let a=e===p;return(0,n.jsx)(sa,{active:a,children:(0,n.jsx)(t4,{task:r.task,column:r.column,active:a&&J,progress:f[r.task.id]??null,progressById:f,slaves:"master"===r.task.role?t.filter(({task:e})=>e.masterId===r.task.id):void 0,master:r.task.masterId?t.find(({task:e})=>e.id===r.task.masterId)?.task??null:null,onSelectTask:g,launch:C[e],onStart:F,onReturnToBacklog:_,onLaunchAgent:L,onComplete:V,onEdit:s,onDelete:i})},e)}),!r&&(0,n.jsx)(d.PY1.div,{initial:"hidden",animate:"visible",variants:$,className:"flex h-full items-center justify-center p-8",children:(0,n.jsxs)("div",{className:"flex flex-col items-center gap-3 text-center",children:[(0,n.jsx)("p",{className:"text-base text-muted-foreground",children:"從左側選一張卡片,或建立新的任務。"}),(0,n.jsxs)(eK.$,{size:"sm",onClick:b,className:"rounded-full px-4",children:[(0,n.jsx)(u.A,{}),"新增任務"]})]})})]})]})})(),(0,n.jsx)(l.N,{children:P&&(0,n.jsx)(e5.h,{title:"完成任務",onClose:()=>R(null),contentClassName:"max-w-md rounded-lg p-5",children:(0,n.jsxs)("div",{className:"space-y-5",children:[(0,n.jsxs)("div",{className:"flex items-start gap-3",children:[(0,n.jsx)("span",{className:"mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-full bg-destructive/15 text-destructive",children:(0,n.jsx)(m.A,{className:"size-5"})}),(0,n.jsxs)("div",{className:"min-w-0 space-y-1",children:[(0,n.jsxs)("h2",{className:"text-lg font-semibold tracking-tight",children:["完成「",P.title,"」?"]}),(0,n.jsxs)("p",{className:"text-base leading-6 text-muted-foreground",children:["這會刪除這張卡的 worktree(尚未 commit 的變更會一起消失)、本地分支",P.branch?`「${P.branch}」`:"","與 artifacts, 並把專案切回",P.baseBranch?`「${P.baseBranch}」`:"基準分支","後更新。此操作無法復原,請先確認要保留的變更都已經 commit 或 push。"]})]})]}),(0,n.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",className:"rounded-full",onClick:()=>R(null),children:"取消"}),(0,n.jsx)(eK.$,{variant:"destructive",size:"sm",className:"rounded-full active:scale-95 motion-reduce:transform-none",onClick:()=>{var s;let n;P&&(R(null),s="done",(n={backlog:e.backlog.filter(e=>e.id!==P.id),in_progress:e.in_progress.filter(e=>e.id!==P.id),done:e.done.filter(e=>e.id!==P.id)})[s]=[P,...n[s]],t(n),a(P.id))},children:"完成並清理"})]})]})},"confirm-done-dialog")}),(0,n.jsx)(l.N,{children:I&&(0,n.jsx)(e5.h,{title:"退回 Backlog",onClose:()=>I.settle(!1),contentClassName:"max-w-md rounded-lg p-5",children:(0,n.jsxs)("div",{className:"space-y-5",children:[(0,n.jsxs)("div",{className:"flex items-start gap-3",children:[(0,n.jsx)("span",{className:"mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-full bg-destructive/15 text-destructive",children:(0,n.jsx)(m.A,{className:"size-5"})}),(0,n.jsxs)("div",{className:"min-w-0 space-y-1",children:[(0,n.jsxs)("h2",{className:"text-lg font-semibold tracking-tight",children:["把「",I.task.title,"」退回 Backlog?"]}),(0,n.jsxs)("p",{className:"text-base leading-6 text-muted-foreground",children:["這會停止 Agent,並把 worktree 還原到",I.task.baseBranch?`「${I.task.baseBranch}」`:"基準分支","——這張卡在本地的 commit 與未 commit 變更都會消失,artifacts 也會一併刪除。遠端分支不會被改動。此操作無法復原。"]})]})]}),(0,n.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",className:"rounded-full",onClick:()=>I.settle(!1),children:"取消"}),(0,n.jsx)(eK.$,{variant:"destructive",size:"sm",className:"rounded-full active:scale-95 motion-reduce:transform-none",onClick:()=>I.settle(!0),children:"清除並退回"})]})]})},"confirm-return-dialog")})]})}let sl=eD()(()=>s.e(1225).then(s.bind(s,91225)).then(e=>e.TerminalFilePreview),{loadableGenerated:{webpack:()=>[91225]},ssr:!1});function so({sessionKey:e,projectPath:t,displayPath:a,taskId:i,title:l,onStarted:o}){let[c,d]=(0,r.useState)(null),u=(0,r.useRef)(null),m=(0,r.useRef)(l);m.current=l;let x=(0,r.useRef)(o);return x.current=o,(0,r.useEffect)(()=>{let n,r,a,l,o=!1,c=null,h=new AbortController;return(async()=>{let[{Terminal:f},{FitAddon:p},{WebLinksAddon:g}]=await Promise.all([s.e(3779).then(s.bind(s,15167)),s.e(5695).then(s.bind(s,95695)),s.e(4847).then(s.bind(s,54847))]);if(o||!u.current)return;let b=new f({fontSize:12,fontFamily:'Menlo, Monaco, "Courier New", monospace',cursorBlink:!0,theme:{background:"#191919",foreground:"#e6e6e6",cursor:"#4c9bf5"},linkHandler:{activate:(e,t)=>eO(t,d),hover:(e,t)=>eW(b,t),leave:()=>eU(b)}});c=b;let j=new p;b.loadAddon(j),eJ(b,e,d),b.loadAddon(new g((e,t)=>eO(t,d),{hover:(e,t)=>eW(b,t),leave:()=>eU(b)})),b.open(u.current);let v=()=>{if(!u.current||0===u.current.clientWidth||0===u.current.clientHeight)return;j.fit();let e=b.element?.querySelector(".xterm-screen"),t=b.element?.querySelector(".xterm-viewport");if(e&&t){let s=eM(b.cols,e.getBoundingClientRect().width,t.clientWidth);s!==b.cols&&b.resize(s,b.rows)}};if(await document.fonts.ready,await e_(u.current,h.signal),await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(e))),o)return;v();let N=window.vibeflow;if(!N)return b.writeln("⚠️ 未連線到 VibeFlow core,無法開啟終端。");n=N.term.onData(({sessionKey:t,data:s})=>{t===e&&b.write(s)}),r=N.term.onExit(({sessionKey:t,exitCode:s,intentional:n})=>{t!==e||n||b.writeln(`\r
8
+ ℹ️ 終端已結束(exit code: ${s})`)});try{let s=await (0,D.AD)({sessionKey:e,...i?{taskId:i}:t?{projectPath:t}:{},title:m.current,cols:b.cols,rows:b.rows});if(!s)throw Error("未連線到 VibeFlow core");if(o)return void(0,D.Vz)(e);x.current?.(),s.scrollback&&b.write(s.scrollback),b.onData(t=>(0,D.zj)(e,t)),b.focus()}catch(e){o||b.writeln(`⚠️ 無法開啟終端:${e instanceof Error?e.message:String(e)}`)}a=new ResizeObserver(()=>{clearTimeout(l),l=setTimeout(()=>{if(o)return;let t=b.cols,s=b.rows;v(),(t!==b.cols||s!==b.rows)&&(0,D.t3)(e,b.cols,b.rows)},100)}),u.current&&a.observe(u.current)})(),()=>{o=!0,h.abort(),n?.(),r?.(),a?.disconnect(),clearTimeout(l),c?.dispose()}},[e,t,i]),(0,n.jsxs)("div",{className:"min-h-0 min-w-0 flex-1 overflow-hidden p-2",children:[(0,n.jsx)("div",{ref:u,className:"h-full w-full overflow-hidden","aria-label":`終端機:${a??t??"~"}`}),null!==c&&(0,n.jsx)(sl,{sessionKey:e,path:c,onClose:()=>d(null)},c)]})}var sc=s(28333);let sd="w-full rounded-md border bg-background px-3 py-2 text-base outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 transition-shadow motion-reduce:transition-none";function su(e){let t=e.split(/[/\\]/).filter(Boolean);return t[t.length-1]??e}function sm(e,t){return!!(t&&e.find(e=>e.path===t)?.missing)}function sx({projectPath:e,recentProjects:t,disabled:s,onSelect:a,onBrowse:i,compact:l=!1}){let o=l?"h-8 px-2 py-1 text-sm":void 0,c=l?"rounded-md border border-border p-1.5":"rounded-md border border-border p-2",d=e?su(e):null,u=t.filter(t=>!(t.missing&&t.name===d&&t.path!==e));e&&!u.some(t=>t.path===e)&&u.unshift({path:e,name:d??e,lastUsedAt:0,missing:!1});let x=new Map;for(let e of u)x.set(e.name,(x.get(e.name)??0)+1);let h=sm(t,e),[f,p]=(0,r.useState)(""),g=()=>{let e=f.trim();e&&(a(e),p(""))};return(0,n.jsxs)("div",{className:"space-y-1.5",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsxs)("select",{name:"project-folder","aria-label":"專案資料夾",title:e??void 0,value:e??"",onChange:e=>e.target.value&&a(e.target.value),disabled:s||0===u.length,className:(0,T.cn)(sd,"min-w-0 flex-1",o,h&&"border-destructive/60"),children:[(0,n.jsx)("option",{value:"",disabled:!0,children:u.length>0?"選擇使用過的專案…":"尚無使用過的專案,請點右側按鈕選取"}),u.map(e=>{let t,s;return(0,n.jsxs)("option",{value:e.path,title:e.path,children:[e.name,(x.get(e.name)??0)>1?` — ${(s=Math.max((t=e.path.replace(/[\\/]+$/,"")).lastIndexOf("/"),t.lastIndexOf("\\")))>0?t.slice(0,s):t}`:"",e.missing?"(路徑遺失)":""]},e.path)})]}),(0,n.jsx)(P.K,{"aria-label":"從資料夾選擇專案",title:"從資料夾選擇專案",onClick:i,disabled:s,tone:"primary",className:c,children:(0,n.jsx)(ew.A,{className:"size-4"})})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("input",{type:"text",name:"project-path","aria-label":"輸入專案資料夾路徑",placeholder:l?"或輸入絕對路徑後按 Enter":"或輸入資料夾的絕對路徑,按 Enter 套用",value:f,onChange:e=>p(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),g())},disabled:s,spellCheck:!1,className:(0,T.cn)(sd,"min-w-0 flex-1 font-mono text-sm",o)}),(0,n.jsx)(P.K,{"aria-label":"套用輸入的路徑",title:"套用輸入的路徑",onClick:g,disabled:s||""===f.trim(),className:c,children:(0,n.jsx)(sc.A,{className:"size-4"})})]}),e&&!h&&!l&&(0,n.jsx)("p",{className:"truncate text-sm text-muted-foreground",title:e,children:e}),h&&(0,n.jsxs)("p",{className:"flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm",children:[(0,n.jsx)(m.A,{className:"mt-0.5 size-3.5 shrink-0 text-destructive"}),(0,n.jsxs)("span",{children:["找不到 ",(0,n.jsx)("code",{className:"break-all text-foreground",children:e}),",專案可能已被移動或刪除。請點右側資料夾按鈕重新選取,之後選單會改用新的路徑。"]})]})]})}function sh({view:e,onViewChange:t,terminals:s,taskWorktreePaths:a,focusedSessionKey:i,recentProjects:l,onCreate:o,onRename:c,onStarted:d,onClose:m,onBrowse:x}){let[h,f]=(0,r.useState)(!1),[p,g]=(0,r.useState)(null),[b,j]=(0,r.useState)(null),v=s.find(e=>e.sessionKey===b),N=(0,r.useRef)(new Map);return(0,r.useEffect)(()=>{if("terminals"!==e||!i)return;let t=N.current.get(i);t?.scrollIntoView({block:"center"}),t?.focus({preventScroll:!0})},[i,e]),(0,n.jsxs)("div",{className:"@container flex h-full min-h-0 flex-col bg-background",children:[(0,n.jsxs)("div",{className:"flex h-12 shrink-0 items-center justify-between gap-3 border-b border-border px-5",children:[(0,n.jsx)(I,{value:e,onChange:t}),(0,n.jsxs)(eK.$,{size:"sm","aria-label":"新增 Terminal",onClick:()=>f(!0),children:[(0,n.jsx)(u.A,{className:"size-4"}),(0,n.jsx)("span",{className:"hidden sm:inline",children:"新增 Terminal"})]})]}),0===s.length?(0,n.jsxs)("div",{className:"flex flex-1 flex-col items-center justify-center gap-3 text-center text-muted-foreground",children:[(0,n.jsx)("p",{children:"尚未開啟 Terminal"}),(0,n.jsx)("p",{className:"text-sm",children:"選擇專案或資料夾,即可在該目錄開啟獨立終端機;不選則在家目錄開啟。"})]}):(0,n.jsx)("div",{className:"terminal-grid-scroll grid min-h-0 w-full flex-1 auto-rows-[480px] grid-cols-1 content-start gap-4 overflow-y-auto p-4 @min-[728px]:grid-cols-2 @min-[1084px]:grid-cols-3",children:s.map(e=>{let t=e.taskId?a[e.taskId]??e.projectPath:e.projectPath??"~";return(0,n.jsxs)("section",{ref:t=>{t?N.current.set(e.sessionKey,t):N.current.delete(e.sessionKey)},tabIndex:-1,"aria-label":`Terminal:${e.title}`,className:(0,T.cn)("flex h-[480px] w-full min-w-0 flex-col overflow-hidden rounded-md border bg-card outline-none",i===e.sessionKey?"border-primary ring-2 ring-primary/30":"border-border"),children:[(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-2 border-b border-border px-3 py-2",children:[(0,n.jsx)(sf,{title:e.title,fallback:e.projectPath?su(e.projectPath):"~",onCommit:t=>c(e.sessionKey,t)}),(0,n.jsx)(P.K,{"aria-label":`關閉 Terminal:${e.title}`,title:"關閉並釋放 Terminal",onClick:()=>j(e.sessionKey),className:"size-7 shrink-0",children:(0,n.jsx)(eE.A,{className:"size-4"})})]}),(0,n.jsx)("div",{className:"truncate border-b border-border px-3 py-1 font-mono text-xs text-muted-foreground",title:t,children:t}),(0,n.jsx)(so,{sessionKey:e.sessionKey,title:e.title,onStarted:()=>d(e.sessionKey),projectPath:e.projectPath,displayPath:t,taskId:e.taskId})]},e.sessionKey)})}),h&&(0,n.jsx)(e5.h,{title:"新增 Terminal",onClose:()=>f(!1),contentClassName:"max-w-lg rounded-lg p-5",children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsx)("h2",{className:"text-lg font-semibold",children:"選擇專案或資料夾"}),(0,n.jsx)(sx,{projectPath:p,recentProjects:l,disabled:!1,onSelect:g,onBrowse:()=>{x().then(e=>{e&&g(e)})}}),(0,n.jsxs)("div",{className:"flex flex-wrap justify-end gap-2",children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>f(!1),children:"取消"}),(0,n.jsx)(eK.$,{variant:"outline",size:"sm",onClick:()=>{o(),g(null),f(!1)},children:"不選專案(家目錄)"}),(0,n.jsx)(eK.$,{size:"sm",disabled:!p||sm(l,p),onClick:()=>{p&&(o(p),g(null),f(!1))},children:"開啟 Terminal"})]})]})}),v&&(0,n.jsx)(e5.h,{title:"關閉 Terminal",onClose:()=>j(null),contentClassName:"max-w-md rounded-lg p-5",children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsxs)("h2",{className:"text-lg font-semibold",children:["關閉「",v.title,"」?"]}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"關閉 Terminal 會結束這個 session,正在執行的指令也會中止。"}),(0,n.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>j(null),children:"取消"}),(0,n.jsx)(eK.$,{variant:"destructive",size:"sm",onClick:()=>{m(v.sessionKey),j(null)},children:"確認關閉"})]})]})})]})}function sf({title:e,fallback:t,onCommit:s}){let[a,i]=(0,r.useState)(e),[l,o]=(0,r.useState)(!1),c=l?a:e;return(0,n.jsx)("input",{"aria-label":`編輯 Terminal 標題:${e}`,title:"點擊編輯標題",value:c,onFocus:()=>{i(e),o(!0)},onChange:e=>i(e.target.value),onBlur:()=>{o(!1);let n=a.trim()||t;n!==e&&s(n)},onKeyDown:e=>{"Enter"===e.key&&e.currentTarget.blur()},className:"min-w-0 flex-1 rounded-sm bg-transparent px-1 text-sm font-medium outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"})}let sp=["low","medium","high","xhigh","max","ultra"];[...sp];let sg=["low","medium","high","xhigh"];function sb(e,t){return t?e?.find(e=>e.id===t):e?.find(e=>e.isDefault)}function sj(e,t){if(0===t.length||void 0===e||"auto"===e)return;if(t.includes(e))return e;let s=sp.indexOf(e),n=sp.filter(e=>t.includes(e)),r=n.filter(e=>sp.indexOf(e)<=s);return r.length>0?r[r.length-1]:n[0]}let sv=[{value:"auto",label:"自動",description:"Jev 會依任務與目前模型選擇合適的推理強度。"},{value:"low",label:"快速",description:"適合範圍明確、低風險的小任務。"},{value:"medium",label:"標準",description:"兼顧速度與推理深度,適合一般開發任務。"},{value:"high",label:"深入",description:"適合跨檔案、除錯或需要較多判斷的任務。"},{value:"xhigh",label:"極致",description:"適合高複雜度、長鏈推理或高風險變更。"},{value:"max",label:"最大",description:"最深的推理,適合最困難的問題。"},{value:"ultra",label:"委派",description:"最深推理並自動委派子任務,耗時與用量可能明顯增加。"}],sN="auto";function sy({value:e,onChange:t,levels:s,disabled:r=!1,className:a}){let i=sv.filter(e=>"auto"===e.value||s.includes(e.value)),l="auto"===e?e:sj(e,s)??"auto",o=i.find(e=>e.value===l)??i[0];return(0,n.jsx)("select",{name:"task-effort",value:o.value,disabled:r||1===i.length,title:0===s.length?"這個 model 不支援調整推理強度,啟動時使用模型預設值。":o.description,onChange:e=>t(e.target.value),className:(0,T.cn)(sd,a),children:i.map(e=>(0,n.jsxs)("option",{value:e.value,children:[e.label," \xb7 ",e.value]},e.value))})}var sw=s(37614);function sk({value:e,onChange:t,disabled:s=!1}){return(0,n.jsx)("button",{type:"button",role:"switch","aria-checked":e,"aria-label":"Auto Mode",disabled:s,onClick:()=>t(!e),className:"rounded-full p-1 outline-none transition-opacity motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50",children:(0,n.jsx)("span",{className:(0,T.cn)("relative inline-block h-4 w-7 shrink-0 rounded-full transition-colors motion-reduce:transition-none",e?"bg-primary":"bg-border"),children:(0,n.jsx)("span",{className:(0,T.cn)("absolute left-0 top-0.5 size-3 rounded-full bg-foreground ring-1 ring-border transition-transform motion-reduce:transform-none motion-reduce:transition-none",e?"translate-x-3.5":"translate-x-0.5")})})})}function sC({value:e,onChange:t,disabled:s=!1}){return(0,n.jsxs)("div",{className:"space-y-2.5 rounded-lg border border-border/50 p-4",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,n.jsxs)("span",{className:"flex items-center gap-1.5 text-base font-medium",children:[(0,n.jsx)(sw.A,{className:"size-4 text-muted-foreground"}),"Auto Mode"]}),(0,n.jsx)(sk,{value:e,onChange:t,disabled:s})]}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:e?"開啟:Agent 會直接修改檔案、執行指令,不會逐次向你確認。":"關閉:Agent 每次要動作前,都會在終端機裡等你允許。"})]})}let sS=(0,T.cn)(sd,"h-8 px-2 py-1 text-sm");function sA({title:e,header:t,saving:s,onClose:r,content:a,sidebar:i,actions:l}){return(0,n.jsxs)(e5.h,{title:e,saving:s,onClose:r,contentClassName:"max-w-[880px] overflow-hidden",children:[(0,n.jsx)(P.K,{"aria-label":`關閉${e}`,onClick:r,disabled:s,className:"absolute right-3 top-3 z-10 p-1",children:(0,n.jsx)(eE.A,{className:"size-4"})}),(0,n.jsxs)("div",{className:"flex max-h-[90vh] flex-col overflow-y-auto md:h-[min(90vh,720px)] md:flex-row md:overflow-hidden",children:[(0,n.jsxs)("div",{className:"flex min-h-[360px] min-w-0 flex-1 flex-col gap-3 p-5 pr-12 md:min-h-0 md:pr-5",children:[(0,n.jsx)("div",{className:"flex flex-wrap items-center gap-3",children:t}),a]}),(0,n.jsxs)("aside",{className:"flex w-full shrink-0 flex-col border-t border-border/70 bg-muted/20 md:w-[300px] md:border-l md:border-t-0",children:[(0,n.jsx)("div",{className:"flex min-h-0 flex-1 flex-col gap-4 px-3 pb-3 pt-4 md:overflow-y-auto md:pt-12",children:i}),(0,n.jsx)("div",{className:"flex shrink-0 gap-2 border-t border-border/70 px-3 py-3",children:l})]})]})]})}function sz({label:e,children:t}){return(0,n.jsxs)("section",{"aria-label":e,className:"space-y-1.5",children:[(0,n.jsx)("h3",{className:(0,T.cn)(E,"px-1"),children:e}),t]})}function s$({label:e,children:t}){return(0,n.jsxs)("label",{className:"grid grid-cols-[76px_minmax(0,1fr)] items-center gap-2 px-1",children:[(0,n.jsx)("span",{className:"text-sm text-muted-foreground",children:e}),(0,n.jsx)("span",{className:"min-w-0",children:t})]})}function sE({children:e,tone:t}){return(0,n.jsx)("div",{className:(0,T.cn)("px-1 text-sm leading-5","warning"===t?"text-warning":"danger"===t?"text-destructive":"text-muted-foreground"),children:e})}function sP(e){let[t,s]=(0,r.useState)(null);return(0,r.useEffect)(()=>{let t=!1;return(0,D.qw)(e).then(n=>{t||s({agentCli:e,models:n?.models??[]})}).catch(()=>{t||s({agentCli:e,models:[]})}),()=>{t=!0}},[e]),t?.agentCli===e?t.models:null}function sT(e,t,s,n,a){var i;let l=(i=sb(e,function(e){let t,s=e.model?.trim();if(!(!s||e4[(t=e.agentCli)&&t in e3?t:"claude"]?.includes(s)))return s}({agentCli:t,model:s})),i?.efforts??null??sg);return(0,r.useEffect)(()=>{if(null===e)return;let t=sj(n,l);"auto"!==n&&t&&t!==n&&a(t)},[e,l,n,a]),l}let sR="__custom__";function sI({agents:e,detectTimedOut:t,onRetry:s,agentCli:a,onAgentChange:i,model:l,onModelChange:o,models:c,effort:d,onEffortChange:u,effortLevels:m,autoMode:x,onAutoModeChange:h,disabled:f}){let[p,g]=(0,r.useState)(!1);(0,r.useEffect)(()=>{g(!1)},[a]);let b=c??[],j=p?void 0:sb(b,l||void 0)?.description,v=!l||p||b.some(e=>e.id===l)?b:[{id:l,label:l},...b];return(0,n.jsxs)(sz,{label:"執行",children:[null===e?(0,n.jsx)(sE,{tone:t?"danger":void 0,children:t?(0,n.jsxs)(n.Fragment,{children:["偵測逾時,請確認 Agent CLI 已安裝。",(0,n.jsx)("button",{type:"button",onClick:s,className:"ml-1 rounded-sm text-primary underline outline-none hover:no-underline focus-visible:ring-[3px] focus-visible:ring-ring/50",children:"重新偵測"})]}):(0,n.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,n.jsx)(k.A,{className:"size-3 animate-spin"}),"偵測 Agent CLI…"]})}):0===e.length?(0,n.jsx)(sE,{tone:"danger",children:"未偵測到 Agent CLI(claude / codex)。"}):(0,n.jsx)(s$,{label:"Agent",children:(0,n.jsx)("select",{name:"agent-agent-cli",value:a,disabled:f,onChange:e=>i(e.target.value),className:sS,children:e.map(e=>(0,n.jsx)("option",{value:e.id,children:e.name},e.id))})}),(0,n.jsx)(s$,{label:"Model",children:(0,n.jsxs)("select",{name:"agent-model",value:p?sR:l,disabled:f,title:j,onChange:e=>{e.target.value===sR?g(!0):(g(!1),o(e.target.value))},className:sS,children:[(0,n.jsx)("option",{value:"",children:"未指定(由 Jev 選擇,沒有金鑰時用 CLI 預設模型)"}),v.map(e=>(0,n.jsx)("option",{value:e.id,children:e.label},e.id)),(0,n.jsx)("option",{value:sR,children:"自訂…"})]})}),p&&(0,n.jsx)(s$,{label:"Model id",children:(0,n.jsx)("input",{name:"agent-custom-model",value:l,onChange:e=>o(e.target.value.trim()),placeholder:"例如 claude-opus-5-5",autoFocus:!0,className:sS})}),null===c&&(0,n.jsx)(sE,{children:(0,n.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,n.jsx)(k.A,{className:"size-3 animate-spin"}),"讀取 model list…"]})}),(0,n.jsx)(s$,{label:"推理強度",children:(0,n.jsx)(sy,{value:d,onChange:u,levels:m,disabled:f,className:"h-8 px-2 py-1 text-sm"})}),(0,n.jsxs)("div",{className:"grid grid-cols-[76px_minmax(0,1fr)] items-center gap-2 px-1",children:[(0,n.jsx)("span",{className:"text-sm text-muted-foreground",children:"Auto Mode"}),(0,n.jsxs)("span",{className:"flex items-center justify-between gap-2",children:[(0,n.jsx)("span",{className:"text-sm text-muted-foreground",children:x?"不逐次確認":"每步等你允許"}),(0,n.jsx)(sk,{value:x,onChange:h,disabled:f})]})]})]})}function sD({task:e,detectAgents:t,pickFolder:s,loadRecentProjects:a,loadGitInfo:i,saving:o,error:c,defaultAutoMode:d=!0,masters:u=[],onSubmit:m,onClose:x}){let[h,f]=(0,r.useState)(""),[p,g]=(0,r.useState)(""),[j,v]=(0,r.useState)(""),[N,y]=(0,r.useState)("claude"),[C,S]=(0,r.useState)(""),[A,z]=(0,r.useState)(sN),$=sP(N),E=sT($,N,C,A,z),[P,R]=(0,r.useState)(!0),[I,D]=(0,r.useState)(null),[K,B]=(0,r.useState)(""),[F,_]=(0,r.useState)(""),[M,L]=(0,r.useState)(null),[V,G]=(0,r.useState)(!1),[O,H]=(0,r.useState)(!1),[J,W]=(0,r.useState)([]),[U,q]=(0,r.useState)(null),[Y,X]=(0,r.useState)(!1),[Q,Z]=(0,r.useState)(0),[ee,et]=(0,r.useState)(!1),es=(0,r.useRef)(null),en=e??es.current;if((0,r.useEffect)(()=>{e&&(es.current=e)},[e]),(0,r.useEffect)(()=>{e&&(g(e.title),v(e.description??""),y(e.agentCli??"claude"),S(e.model??""),z(e.effort??sN),R(e.autoMode??d),D(e.projectPath??null),B(e.baseBranch??""),_(e.branch),f(e.masterId??""),L(null),G(!1),H(!1),et(!1))},[e,d]),(0,r.useEffect)(()=>{if(!e)return;let t=!0;return a().then(e=>{t&&W(e)}),()=>{t=!1}},[e,a]),(0,r.useEffect)(()=>{if(!e?.projectPath)return;let t=!0;return G(!0),i(e.projectPath).then(e=>{t&&L(e)}).finally(()=>{t&&G(!1)}),()=>{t=!1}},[e,i]),(0,r.useEffect)(()=>{if(!e)return;let s=!0;X(!1),q(null);let n=setTimeout(()=>{s&&X(!0)},6e3);return t().then(e=>{s&&(clearTimeout(n),q(e))}),()=>{s=!1,clearTimeout(n)}},[e,t,Q]),!en)return null;let er=!!en.worktreePath,ea=p!==en.title||j!==(en.description??"")||N!==(en.agentCli??"claude")||C!==(en.model??"")||A!==(en.effort??sN)||P!==(en.autoMode??d)||O||K!==(en.baseBranch??"")||F.trim()!==en.branch,ei=()=>{o||(ea?et(!0):x())},el=sm(J,I),eo=async(e,t=!1)=>{if(D(e),H(e!==en.projectPath),L(null),!(!t&&sm(J,e))){G(!0);try{let t=await i(e);L(t),B(t?.defaultBase??"")}finally{G(!1)}}},ec=async()=>{let e=await s();e&&(W(t=>t.map(t=>t.path===e?{...t,missing:!1}:t)),await eo(e,!0))},ed=M?.isRepo??!0,eu=M?.hasRemote??!1,em=O||K!==(en.baseBranch??"")||""!==F.trim()&&F.trim()!==en.branch,ex=p.trim().length>0&&!o&&!V&&(!O||ed&&!el),eh=en?.role==="master",ef=()=>{if(!ex)return;let e={title:p.trim(),description:j.trim(),agentCli:N,model:C,effort:A,autoMode:P};eh?m(e):m({...e,...I?{projectPath:I,baseBranch:K||null}:{},branch:F.trim(),...h!==(en?.masterId??"")?{masterId:h||null}:{}})},ep=(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-3",children:[ee&&(0,n.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-md border border-warning/40 bg-warning/10 px-3 py-2 text-sm",children:[(0,n.jsx)("span",{className:"text-warning",children:"有未儲存的變更,確定要離開?"}),(0,n.jsxs)("div",{className:"flex gap-1.5",children:[(0,n.jsx)("button",{type:"button",onClick:()=>et(!1),className:"rounded-md px-2 py-0.5 text-sm text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:"繼續編輯"}),(0,n.jsx)("button",{type:"button",onClick:x,className:"rounded-md px-2 py-0.5 text-sm text-destructive outline-none transition-colors motion-reduce:transition-none hover:bg-destructive/15 focus-visible:ring-[3px] focus-visible:ring-ring/50",children:"放棄離開"})]})]}),(0,n.jsx)("input",{autoFocus:!0,name:"edit-task-title","aria-label":"任務標題",autoComplete:"off",value:p,onChange:e=>g(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&ef()},placeholder:"任務標題,例如:實作登入頁面",className:"w-full rounded-sm bg-transparent text-2xl font-semibold tracking-tight outline-none placeholder:text-muted-foreground/60 focus-visible:ring-[3px] focus-visible:ring-ring/50"}),(0,n.jsx)("textarea",{name:"edit-task-description","aria-label":"詳細描述",autoComplete:"off",value:j,onChange:e=>v(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&ef()},placeholder:"描述這個任務的目標、需求或背景脈絡…",className:(0,T.cn)(sd,"min-h-32 flex-1 resize-none text-sm leading-6")}),c&&(0,n.jsx)("p",{role:"alert",className:"rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm",children:c})]}),eg=!eh&&(0,n.jsxs)(sz,{label:"位置",children:[(0,n.jsxs)("div",{className:"space-y-1 px-1",children:[(0,n.jsx)("span",{className:"text-sm text-muted-foreground",children:"專案"}),(0,n.jsx)(sx,{compact:!0,projectPath:I,recentProjects:J,disabled:o||V,onSelect:e=>void eo(e),onBrowse:()=>void ec()})]}),V&&(0,n.jsx)(sE,{children:(0,n.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,n.jsx)(k.A,{className:"size-3 animate-spin"}),"偵測 Git 狀態中…"]})}),O&&!el&&!V&&!ed&&(0,n.jsx)(sE,{tone:"danger",children:"這個資料夾不是 Git repository,請改選一個 Git 專案。"}),ed&&eu&&(0,n.jsx)(s$,{label:"基準分支",children:(0,n.jsxs)("select",{name:"edit-base-branch",value:K,onChange:e=>B(e.target.value),disabled:o||V,className:sS,children:[K&&!(M?.branches??[]).includes(K)&&(0,n.jsx)("option",{value:K,children:K}),(M?.branches??[]).map(e=>(0,n.jsx)("option",{value:e,children:e},e))]})}),(0,n.jsx)(s$,{label:"分支",children:(0,n.jsx)("input",{name:"edit-branch",autoComplete:"off",value:F,onChange:e=>_(e.target.value),placeholder:"例如 feature/login-fix",disabled:o,className:sS})}),er&&em?(0,n.jsx)(sE,{tone:"warning",children:"這張卡已經有 worktree。儲存後會移除它與本地分支,下次開始執行時再重新建立;有未完成的變更時無法儲存。origin 上已推送的分支不會被刪除。"}):(0,n.jsx)(sE,{children:"分支在卡片開始執行時才建立並推到 origin。"}),u.length>0&&(0,n.jsx)(s$,{label:"隸屬於",children:(0,n.jsxs)("select",{name:"edit-master-id",value:h,onChange:e=>f(e.target.value),disabled:o,className:sS,children:[(0,n.jsx)("option",{value:"",children:"無"}),u.map(e=>(0,n.jsx)("option",{value:e.id,children:e.title},e.id))]})})]});return(0,n.jsx)(l.N,{children:e&&(0,n.jsx)(sA,{title:"編輯任務",header:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{className:"text-sm text-muted-foreground",children:"編輯任務 \xb7 Backlog"}),(0,n.jsxs)("span",{title:"建立後不能更改角色",className:(0,T.cn)("flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-sm",eh?"border-master/40 text-master":"border-border text-muted-foreground"),children:[eh?(0,n.jsx)(b.A,{className:"size-3.5"}):(0,n.jsx)(w.A,{className:"size-3.5"}),eh?"Master":"一般任務"]})]}),saving:o,onClose:ei,content:ep,sidebar:(0,n.jsxs)(n.Fragment,{children:[eg,(0,n.jsx)(sI,{agents:U,detectTimedOut:Y,onRetry:()=>Z(e=>e+1),agentCli:N,onAgentChange:e=>{y(e),S("")},model:C,onModelChange:S,models:$,effort:A,onEffortChange:z,effortLevels:E,autoMode:P,onAutoModeChange:R,disabled:o})]}),actions:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:ei,disabled:o,className:"flex-1 rounded-full",children:"取消"}),(0,n.jsxs)(eK.$,{size:"sm",onClick:ef,disabled:!ex,className:(0,T.cn)("flex-[2] rounded-full",o&&"opacity-80"),children:[o&&(0,n.jsx)(k.A,{className:"animate-spin"}),o?"儲存中…":"儲存變更"]})]})},en.id)})}var sK=s(85499),sB=s(93659);function sF({creating:e,error:t,pickFolder:s,loadRecentProjects:a,loadGitInfo:i,initRepository:l,detectAgents:o,onSubmit:c,onClose:d,masters:u=[],defaultAutoMode:m=!0,workstationPath:x}){let[h,f]=(0,r.useState)("task"),[p,g]=(0,r.useState)(""),[j,v]=(0,r.useState)(""),[N,y]=(0,r.useState)(""),[C,S]=(0,r.useState)(""),[A,z]=(0,r.useState)(null),[$,E]=(0,r.useState)([]),[R,I]=(0,r.useState)(null),[D,K]=(0,r.useState)(!1),[B,F]=(0,r.useState)(!1),[_,M]=(0,r.useState)(""),[L,V]=(0,r.useState)(""),[G,O]=(0,r.useState)(null),[H,J]=(0,r.useState)(!1),[W,U]=(0,r.useState)(0),[q,Y]=(0,r.useState)("claude"),[X,Q]=(0,r.useState)(""),[Z,ee]=(0,r.useState)(sN),et=sP(q),es=sT(et,q,X,Z,ee),[en,er]=(0,r.useState)(m),[ea,ei]=(0,r.useState)([]),[el,eo]=(0,r.useState)(null),[ec,ed]=(0,r.useState)(!1),[eu,em]=(0,r.useState)(!1),ex=(0,r.useRef)(0),eh=(0,r.useRef)(null),ef=(0,r.useRef)(null);(0,r.useEffect)(()=>{let e=!0;J(!1),O(null);let t=setTimeout(()=>{e&&J(!0)},6e3);return o().then(s=>{e&&(clearTimeout(t),O(s),!s.some(e=>"claude"===e.id)&&s.length>0&&Y(s[0].id))}),()=>{e=!1,clearTimeout(t)}},[o,W]),(0,r.useEffect)(()=>{eh.current?.focus()},[]),(0,r.useEffect)(()=>{let e=!0;return a().then(t=>{e&&E(t)}),()=>{e=!1}},[a]);let ep=sm($,A),eg=async e=>{z(e),I(null),M(""),K(!0);try{let t=await i(e);I(t),M(t?.defaultBase??"")}finally{K(!1)}},eb=async e=>{if(sm($,e)){z(e),I(null),M("");return}await eg(e)},ej=async()=>{let e=await s();e&&(E(t=>t.map(t=>t.path===e?{...t,missing:!1}:t)),await eg(e))},ev=async()=>{if(A){F(!0);try{let e=await l(A);I(e),M(e?.defaultBase??"")}finally{F(!1)}}},eN=async()=>{let e=await s();e&&g(e)},ey=async e=>{eo(null),em(!0);try{let t=(await eF(e)).map(e=>({id:ex.current++,input:e}));ei(e=>[...e,...t])}catch(e){eo(e instanceof Error?e.message:String(e))}finally{em(!1)}},ek=R?.isRepo??!1,eC=R?.hasRemote??!1,eS=`${x?.trim()||"~/Desktop"}/${A?su(A):"<專案名>"}`,eA="master"===h,ez=eA||!!A&&!ep&&ek&&!D&&!B,e$=N.trim().length>0&&!e&&!eu&&ez,eP=e||eu,eT=()=>{if(!e$||!eA&&!A)return;let e={title:N.trim(),description:C.trim(),agentCli:q,model:X,effort:Z,autoMode:en,attachments:ea.map(({input:e})=>e)};c(eA?{...e,role:"master",baseBranch:null,branch:"",workDir:p.trim()||void 0}:{...e,projectPath:A??void 0,baseBranch:eC&&_||null,branch:L.trim(),masterId:j||void 0})},eR=(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{className:"text-sm text-muted-foreground",children:"新增任務"}),(0,n.jsx)("div",{role:"radiogroup","aria-label":"卡片角色",className:"inline-flex rounded-full border border-border bg-muted/40 p-0.5",children:["task","master"].map(t=>(0,n.jsxs)("button",{type:"button",role:"radio","aria-checked":h===t,disabled:e,onClick:()=>f(t),className:(0,T.cn)("flex items-center gap-1.5 rounded-full px-3 py-1 text-sm outline-none transition-colors motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50",h===t?"master"===t?"bg-master/15 text-master":"bg-background text-foreground shadow-xs":"text-muted-foreground hover:text-foreground"),children:["master"===t?(0,n.jsx)(b.A,{className:"size-3.5"}):(0,n.jsx)(w.A,{className:"size-3.5"}),"master"===t?"Master":"一般任務"]},t))})]}),eI=(0,n.jsxs)("div",{onDragEnter:e=>{e.preventDefault(),eP||ed(!0)},onDragOver:e=>{e.preventDefault(),e.dataTransfer.dropEffect="copy"},onDragLeave:e=>{e.currentTarget.contains(e.relatedTarget)||ed(!1)},onDrop:e=>{e.preventDefault(),ed(!1),!eP&&e.dataTransfer.files.length>0&&ey(e.dataTransfer.files)},className:(0,T.cn)("flex min-h-0 flex-1 flex-col gap-3 rounded-lg",ec&&"outline-2 outline-offset-4 outline-dashed outline-primary/70"),children:[(0,n.jsx)("input",{ref:eh,name:"task-title","aria-label":"任務標題",autoComplete:"off",value:N,onChange:e=>y(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&eT()},placeholder:"任務標題,例如:實作登入頁面",className:"w-full rounded-sm bg-transparent text-2xl font-semibold tracking-tight outline-none placeholder:text-muted-foreground/60 focus-visible:ring-[3px] focus-visible:ring-ring/50"}),(0,n.jsx)("textarea",{name:"task-description","aria-label":"詳細描述",autoComplete:"off",value:C,onChange:e=>S(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&eT()},placeholder:eA?"描述整體目標、涉及的 repo 與限制。Master 會先判斷要不要拆成多張卡…":"描述這個任務的目標、需求或背景脈絡…(可以直接把檔案拖進來當附件)",className:(0,T.cn)(sd,"min-h-32 flex-1 resize-none text-sm leading-6")}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsxs)(eK.$,{variant:"outline",size:"sm",onClick:()=>ef.current?.click(),disabled:eP,className:"rounded-full",children:[(0,n.jsx)(sK.A,{}),"附件"]}),(0,n.jsx)("input",{ref:ef,type:"file",multiple:!0,disabled:eP,className:"hidden",onChange:e=>{e.target.files&&ey(e.target.files),e.target.value=""}}),ea.map(({id:t,input:s})=>(0,n.jsxs)("span",{className:"flex max-w-56 items-center gap-1.5 rounded-full border border-border/60 bg-muted/40 py-0.5 pl-2.5 pr-1 text-sm",children:[(0,n.jsx)(sB.A,{className:"size-3.5 shrink-0 text-primary"}),(0,n.jsx)("span",{className:"min-w-0 truncate",title:s.name,children:s.name}),(0,n.jsx)(P.K,{"aria-label":`移除附件 ${s.name}`,onClick:()=>ei(e=>e.filter(e=>e.id!==t)),disabled:e,className:"p-0.5",children:(0,n.jsx)(eE.A,{className:"size-3.5"})})]},t)),eu&&(0,n.jsxs)("span",{className:"flex items-center gap-1.5 text-sm text-muted-foreground",children:[(0,n.jsx)(k.A,{className:"size-3 animate-spin"}),"讀取附件中…"]})]}),el&&(0,n.jsx)("p",{className:"text-sm text-destructive",children:el}),t&&(0,n.jsx)("p",{role:"alert",className:"rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm",children:t})]}),eD=eA?(0,n.jsxs)(sz,{label:"位置",children:[(0,n.jsxs)("div",{className:"space-y-1 px-1",children:[(0,n.jsx)("span",{className:"text-sm text-muted-foreground",children:"工作目錄"}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("input",{name:"master-work-dir","aria-label":"工作目錄",autoComplete:"off",value:p,onChange:e=>g(e.target.value),placeholder:"留空則由 VibeFlow 建立",className:(0,T.cn)(sS,"min-w-0 flex-1 font-mono")}),(0,n.jsx)(P.K,{"aria-label":"選擇工作目錄",title:"選擇工作目錄",onClick:()=>void eN(),disabled:e,tone:"primary",className:"rounded-md border border-border p-1.5",children:(0,n.jsx)(ew.A,{className:"size-4"})})]})]}),(0,n.jsx)(sE,{children:(0,n.jsxs)("details",{children:[(0,n.jsx)("summary",{className:"cursor-pointer rounded-sm outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",children:"任何資料夾都可以,不建立分支或 worktree。"}),(0,n.jsxs)("ul",{className:"mt-1 list-disc space-y-1 pl-4",children:[(0,n.jsx)("li",{children:"先判斷任務要不要拆卡,再為每個 repo 建立卡片,掛在這張 Master 底下。"}),(0,n.jsx)("li",{children:en?"Auto Mode 開啟:沒有前置依賴的卡片會直接開始執行。":"Auto Mode 關閉:派出的卡片留在 Backlog,由你決定何時開始。"}),(0,n.jsx)("li",{children:"追蹤進度並回報;不會自己合併 PR 或把卡片移到 Done。"})]})]})})]}):(0,n.jsxs)(sz,{label:"位置",children:[(0,n.jsxs)("div",{className:"space-y-1 px-1",children:[(0,n.jsx)("span",{className:"text-sm text-muted-foreground",children:"專案"}),(0,n.jsx)(sx,{compact:!0,projectPath:A,recentProjects:$,disabled:e||B||D,onSelect:e=>void eb(e),onBrowse:()=>void ej()})]}),(D||B)&&(0,n.jsx)(sE,{children:(0,n.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,n.jsx)(k.A,{className:"size-3 animate-spin"}),B?"初始化 Git…":"偵測 Git 狀態中…"]})}),!A&&(0,n.jsx)(sE,{children:"選擇專案後才能建立任務。"}),R&&!ep&&!D&&!B&&!ek&&(0,n.jsxs)("div",{className:"space-y-2 rounded-md border border-destructive/40 bg-destructive/10 p-2.5 text-sm",children:[(0,n.jsxs)("p",{children:["這個資料夾不是 Git repository。可以在這裡初始化:會執行",(0,n.jsx)("code",{className:"text-foreground",children:" git init "}),"並建立一個空的初始 commit。"]}),(0,n.jsx)(eK.$,{size:"sm",variant:"outline",onClick:()=>void ev(),disabled:e,className:"rounded-full",children:"初始化 Git"})]}),ek&&eC&&(0,n.jsx)(s$,{label:"基準分支",children:(0,n.jsx)("select",{name:"base-branch",value:_,onChange:e=>M(e.target.value),className:sS,children:(R?.branches??[]).map(e=>(0,n.jsx)("option",{value:e,children:e},e))})}),ek&&(0,n.jsx)(s$,{label:"分支",children:(0,n.jsx)("input",{name:"branch",autoComplete:"off",value:L,onChange:e=>V(e.target.value),placeholder:"留空則自動命名",className:sS})}),u.length>0&&(0,n.jsx)(s$,{label:"隸屬於",children:(0,n.jsxs)("select",{name:"master-id",value:j,onChange:e=>v(e.target.value),className:sS,children:[(0,n.jsx)("option",{value:"",children:"無"}),u.map(e=>(0,n.jsx)("option",{value:e.id,children:e.title},e.id))]})}),ek&&(0,n.jsx)(sE,{children:(0,n.jsxs)("details",{children:[(0,n.jsx)("summary",{className:"cursor-pointer rounded-sm outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",children:eC?"開始執行時才建立分支與 worktree 並 push。":`沒有 remote,開始執行時從 ${R?.currentBranch??"HEAD"} 建立本地 worktree。`}),(0,n.jsxs)("ul",{className:"mt-1 list-disc space-y-1 pl-4",children:[(0,n.jsxs)("li",{children:[eC?"從當下最新的 origin 基準分支":"從基準分支",",在"," ",(0,n.jsx)("code",{className:"break-all text-foreground",children:eS})," ","底下建立這張卡專用的 worktree 與分支;專案資料夾本身不會被切換。"]}),eC&&(0,n.jsx)("li",{children:"把新分支 push 到 origin;若 remote 已有同名分支,則取回並接續那條分支的工作。"}),(0,n.jsx)("li",{children:"把被 git 忽略的檔案(例如 .env)複製進 worktree,相依套件資料夾在背景複製。"}),(0,n.jsx)("li",{children:"VibeFlow 的執行期檔案寫進 .git/info/exclude,不動專案的 .gitignore。"})]})]})})]});return(0,n.jsx)(sA,{title:"新增任務",header:eR,saving:e,onClose:d,content:eI,sidebar:(0,n.jsxs)(n.Fragment,{children:[eD,(0,n.jsx)(sI,{agents:G,detectTimedOut:H,onRetry:()=>U(e=>e+1),agentCli:q,onAgentChange:e=>{Y(e),Q("")},model:X,onModelChange:Q,models:et,effort:Z,onEffortChange:ee,effortLevels:es,autoMode:en,onAutoModeChange:er,disabled:e})]}),actions:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:d,disabled:e,className:"flex-1 rounded-full",children:"取消"}),(0,n.jsxs)(eK.$,{size:"sm",onClick:eT,disabled:!e$,className:(0,T.cn)("flex-[2] rounded-full",e&&"opacity-80"),children:[e&&(0,n.jsx)(k.A,{className:"animate-spin"}),e?"建立中…":eA?"建立 Master":"建立任務"]})]})})}var s_=s(1896),sM=s(69758),sL=s(87617),sV=s(80802),sG=s(21684),sO=s(37156),sH=s(43812);let sJ=[{id:"skill",label:"Skills",hint:"儲存可重複使用的 skill;啟動任務時不會自動載入。import 需選擇含 SKILL.md 的目錄。"},{id:"prompt",label:"Prompts",hint:"儲存可重複使用的文字片段;啟動任務時不會自動加入 prompt。"},{id:"script",label:"Scripts",hint:"儲存可重複使用的腳本;啟動任務時不會把清單寫進 prompt。"}],sW={skill:sG.A,prompt:eg.A,script:v.A};function sU(e,t){return"skill"!==e?"":`---
9
+ name: ${t}
10
+ description:
11
+ ---
12
+
13
+ `}function sq({onEditingChange:e}){let[t,s]=(0,r.useState)([]),[a,i]=(0,r.useState)(!0),[l,o]=(0,r.useState)(null),[c,d]=(0,r.useState)(null),[m,x]=(0,r.useState)(null),[f,p]=(0,r.useState)(null),[g,b]=(0,r.useState)([]),[j,v]=(0,r.useState)(null),N=(0,r.useCallback)(async()=>{let[e,t]=await Promise.all([(0,D.Eb)(),(0,D.Yd)()]);s(e),b(t),i(!1)},[]);(0,r.useEffect)(()=>{N()},[N]),(0,r.useEffect)(()=>{e?.(null!==f)},[f,e]);let y=async(e,t)=>{o(e),d(null);try{await t(),await N()}catch(e){d(e instanceof Error?e.message:String(e))}finally{o(null)}};return f?(0,n.jsxs)("div",{className:"space-y-3",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"text-base font-medium",children:f.entry.name}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"skill"===f.entry.kind?"編輯 SKILL.md。frontmatter 的 name 與 description 兩個 CLI 都會讀。":"編輯檔案內容。"})]}),(0,n.jsx)("textarea",{value:f.content,onChange:e=>p({...f,content:e.target.value}),rows:18,spellCheck:!1,className:(0,T.cn)(sd,"resize-y font-mono text-sm leading-5")}),c&&(0,n.jsx)("p",{className:"text-sm text-destructive",children:c}),(0,n.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>p(null),children:"取消"}),(0,n.jsx)(eK.$,{size:"sm",onClick:()=>void(()=>{if(!f)return;let{entry:e,content:t}=f;return y(`save:${e.key}`,async()=>{await (0,D.ZS)(e.kind,e.name,t),p(null)})})(),disabled:null!==l,children:"儲存"})]})]}):(0,n.jsxs)("div",{className:"space-y-5",children:[(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"啟用的項目會在每次啟動任務時自動投遞:Claude 以 session-only plugin 載入,Codex 以 VibeFlow 組出的 CODEX_HOME 載入。本機與專案自己的 skill 仍會照常載入,這裡的項目是額外加上去的。"}),c&&(0,n.jsx)("p",{className:"text-sm text-destructive",children:c}),sJ.map(({id:e,label:s,hint:r})=>{let i=t.filter(t=>t.kind===e),o=sW[e];return(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,n.jsxs)("span",{className:(0,T.cn)(E,"flex items-center gap-2"),children:[(0,n.jsx)(o,{className:"size-3.5"}),s,(0,n.jsx)("span",{className:"tabular-nums text-muted-foreground/70",children:i.length})]}),(0,n.jsxs)("div",{className:"flex gap-2",children:[(0,n.jsxs)(eK.$,{variant:"ghost",size:"sm",onClick:()=>{y(`import:${e}`,async()=>{let t=await (0,D.c)(e);t&&await (0,D.hE)(e,t)})},disabled:null!==l,children:[l===`import:${e}`?(0,n.jsx)(k.A,{className:"size-3.5 animate-spin"}):(0,n.jsx)(sO.A,{className:"size-3.5"}),"Import"]}),(0,n.jsxs)(eK.$,{variant:"ghost",size:"sm",onClick:()=>x({kind:e,name:"",content:sU(e,""),description:""}),disabled:null!==l,children:[(0,n.jsx)(u.A,{className:"size-3.5"}),"新建"]})]})]}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:r}),m?.kind===e&&(0,n.jsxs)("div",{className:"space-y-2 rounded-md border border-border/60 p-3",children:[(0,n.jsx)("input",{autoFocus:!0,value:m.name,onChange:t=>{let s=t.target.value;x({...m,name:s,content:m.content===sU(e,m.name)?sU(e,s):m.content})},placeholder:"skill"===e?"skill 名稱(目錄名)":"檔名,如 house-rules.md",className:(0,T.cn)(sd,"font-mono text-sm")}),"skill"!==e&&(0,n.jsx)("input",{value:m.description,onChange:e=>x({...m,description:e.target.value}),placeholder:"用途說明",className:(0,T.cn)(sd,"text-sm")}),(0,n.jsx)("textarea",{value:m.content,onChange:e=>x({...m,content:e.target.value}),rows:8,spellCheck:!1,placeholder:"skill"===e?"":"內容",className:(0,T.cn)(sd,"resize-y font-mono text-sm leading-5")}),(0,n.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>x(null),children:"取消"}),(0,n.jsx)(eK.$,{size:"sm",onClick:()=>void(()=>{if(!m)return;let{kind:e,name:t,content:s,description:n}=m;return y("create",async()=>{await (0,D.uq)(e,t,s,n.trim()||void 0),x(null)})})(),disabled:null!==l||0===m.name.trim().length,children:"建立"})]})]}),a?(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"讀取中…"}):0===i.length?(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"尚無項目。"}):(0,n.jsx)("div",{className:"grid gap-2",children:i.map(e=>(0,n.jsxs)("div",{className:"flex items-start gap-3 rounded-md border border-border/60 px-3 py-2.5",children:[(0,n.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,n.jsxs)("p",{className:"flex items-center gap-2 font-mono text-sm",children:[(0,n.jsx)("span",{className:"truncate",children:e.name}),e.builtin&&(0,n.jsx)("span",{className:"shrink-0 rounded-sm bg-muted px-1.5 font-sans text-xs text-muted-foreground",children:"內建"}),e.builtin?.updateAvailable?(0,n.jsx)("span",{className:"shrink-0 rounded-sm bg-primary/15 px-1.5 font-sans text-xs text-primary",children:"有新版"}):e.builtin?.modified?(0,n.jsx)("span",{className:"shrink-0 rounded-sm bg-muted px-1.5 font-sans text-xs text-muted-foreground",children:"已修改"}):null]}),e.description&&(0,n.jsx)("p",{className:"line-clamp-2 text-sm text-muted-foreground",title:e.description,children:e.description}),e.sourcePath&&(0,n.jsxs)("p",{className:"truncate text-xs text-muted-foreground/70",children:["來源:",e.sourcePath]})]}),(0,n.jsxs)("div",{className:"flex shrink-0 gap-1",children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>{y(`open:${e.key}`,async()=>{p({entry:e,content:await (0,D.sp)(e.kind,e.name)??""})})},disabled:null!==l,children:"編輯"}),e.builtin?.modified&&(0,n.jsxs)(eK.$,{variant:"ghost",size:"sm",onClick:()=>{var t;j!==(t=e.name)?v(t):(v(null),y(`restore:${t}`,()=>(0,D.vj)(t)))},onBlur:()=>v(null),disabled:null!==l,title:"以 VibeFlow 出貨的版本覆蓋(會丟掉你的修改)",children:[l===`restore:${e.name}`?(0,n.jsx)(k.A,{className:"size-3.5 animate-spin"}):(0,n.jsx)(sH.A,{className:"size-3.5"}),j===e.name?"確定覆蓋?":"還原預設"]}),e.sourcePath&&(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>{y(`reimport:${e.key}`,async()=>{e.sourcePath&&await (0,D.hE)(e.kind,e.sourcePath)})},disabled:null!==l,title:"從來源重新複製一份快照",children:l===`reimport:${e.key}`?(0,n.jsx)(k.A,{className:"size-3.5 animate-spin"}):(0,n.jsx)(ez.A,{className:"size-3.5"})}),(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>void y(`delete:${e.key}`,()=>(0,D.ry)(e.kind,e.name)),disabled:null!==l,title:"從 library 刪除",children:(0,n.jsx)(h.A,{className:"size-3.5 text-destructive"})})]})]},e.key))})]},e)}),g.length>0&&(0,n.jsxs)("p",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-muted-foreground",children:["已移除的內建 skill:",g.map(e=>(0,n.jsxs)(eK.$,{variant:"ghost",size:"sm",onClick:()=>void y(`restore:${e}`,()=>(0,D.vj)(e)),disabled:null!==l,title:"放回 VibeFlow 出貨的版本",children:[(0,n.jsx)(sH.A,{className:"size-3.5"}),e]},e))]})]})}function sY({output:e,active:t}){let a=(0,r.useRef)(null),i=(0,r.useRef)(null),l=(0,r.useRef)(""),o=(0,r.useRef)(t),c=(0,r.useRef)(e);return o.current=t,c.current=e,(0,r.useEffect)(()=>{let e=!1,t=null,n=null;return Promise.all([s.e(3779).then(s.bind(s,15167)),s.e(5695).then(s.bind(s,95695)),s.e(4847).then(s.bind(s,54847))]).then(([{Terminal:s},{FitAddon:r},{WebLinksAddon:d}])=>{if(e||!a.current)return;let u=new s({convertEol:!0,cursorBlink:!0,fontSize:12,rows:12,theme:{background:"#111827"},linkHandler:{activate:(e,t)=>eO(t),hover:(e,t)=>eW(u,t),leave:()=>eU(u)}}),m=new r;u.loadAddon(m),u.loadAddon(new d((e,t)=>eO(t),{hover:(e,t)=>eW(u,t),leave:()=>eU(u)})),u.open(a.current),m.fit(),(t=new ResizeObserver(()=>m.fit())).observe(a.current),u.onData(e=>{o.current&&(0,D.yl)(e)}),n=u,i.current=u,l.current="",c.current&&(u.write(c.current),l.current=c.current)}),()=>{e=!0,t?.disconnect(),n?.dispose(),i.current=null}},[]),(0,r.useEffect)(()=>{let t=i.current;if(!t)return;e.startsWith(l.current)||(t.reset(),l.current="");let s=e.slice(l.current.length);s&&t.write(s),l.current=e},[e]),(0,n.jsx)("div",{ref:a,className:"h-48 w-full overflow-hidden rounded-sm border border-border bg-[#111827] p-1",tabIndex:0,"aria-label":"Atlassian CLI 登入終端"})}function sX(e,t){return e instanceof Error&&e.message?e.message:t}function sQ({appVersion:e}){let[t,s]=(0,r.useState)(!1),[a,i]=(0,r.useState)(null),[l,o]=(0,r.useState)(null),[c,d]=(0,r.useState)(!1),[u,m]=(0,r.useState)(null);return(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,n.jsxs)("p",{className:"text-sm text-muted-foreground",children:["VibeFlow 版本:",void 0===e?"讀取中…":e?`v${e}`:"無法取得"]}),(0,n.jsxs)(eK.$,{variant:"outline",size:"sm",disabled:t,onClick:()=>{s(!0),o(null),m(null),(0,D.lX)().then(i).catch(e=>{i(null),o(sX(e,"無法連線到 npm registry"))}).finally(()=>s(!1))},children:[t?(0,n.jsx)(k.A,{className:"animate-spin"}):(0,n.jsx)(ez.A,{}),t?"檢查中…":"檢查更新"]})]}),l&&(0,n.jsxs)("p",{role:"alert",className:"text-sm text-destructive",children:["檢查更新失敗:",l]}),a?.status==="current"&&(0,n.jsxs)("p",{role:"status",className:"text-sm text-muted-foreground",children:["已是最新版本(v",a.currentVersion,")。"]}),a?.status==="unsupported"&&(0,n.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"目前不是全域 npm 安裝(例如原始碼執行),無法從這裡更新。"}),a?.status==="available"&&(0,n.jsxs)("div",{role:"status",className:"space-y-2 rounded-md border border-border bg-primary/10 p-3 text-sm",children:[(0,n.jsxs)("p",{children:["VibeFlow v",a.latestVersion," 已發布(目前 v",a.currentVersion,")。 按下更新會開啟系統終端機執行更新指令(Windows:",(0,n.jsx)("code",{children:"vibeflow update"}),";其他平台:",(0,n.jsx)("code",{children:"sudo vibeflow update"}),")。安裝完成後 host 會自動重新啟動。"]}),(0,n.jsx)(eK.$,{size:"sm",disabled:c,onClick:()=>{d(!0),m(null),(0,D.Qb)().catch(e=>m(sX(e,"無法開啟更新終端機"))).finally(()=>d(!1))},children:c?"開啟中…":"更新 VibeFlow"}),u&&(0,n.jsx)("p",{role:"alert",className:"text-destructive",children:u})]})]})}var sZ=s(63252);let s0={enabled:!0,stepCompleted:!1,allCompleted:!0,waitingInput:!0,desktop:!1};function s1(e){return{...s0,...e??{}}}function s5(){return"Notification"in window?Notification.permission:"unsupported"}function s2({checked:e,label:t,disabled:s,onChange:r}){return(0,n.jsx)("button",{type:"button",role:"switch","aria-checked":e,"aria-label":t,disabled:s,onClick:()=>r(!e),className:"rounded-full p-1 outline-none transition-opacity motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50",children:(0,n.jsx)("span",{className:(0,T.cn)("relative inline-block h-4 w-7 shrink-0 rounded-full transition-colors motion-reduce:transition-none",e?"bg-primary":"bg-border"),children:(0,n.jsx)("span",{className:(0,T.cn)("absolute left-0 top-0.5 size-3 rounded-full bg-foreground ring-1 ring-border transition-transform motion-reduce:transform-none motion-reduce:transition-none",e?"translate-x-3.5":"translate-x-0.5")})})})}function s3({label:e,hint:t,checked:s,disabled:r,onChange:a}){return(0,n.jsxs)("div",{className:(0,T.cn)("flex items-start justify-between gap-3",r&&"opacity-60"),children:[(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("div",{className:"text-sm",children:e}),t&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:t})]}),(0,n.jsx)(s2,{checked:s,label:e,disabled:r,onChange:a})]})}function s4({value:e,onChange:t,desktopBlocked:s,onRequestDesktop:r}){let a=s=>t({...e,...s}),i=!e.enabled;return(0,n.jsxs)("div",{className:"space-y-3 rounded-lg border border-border/50 p-4",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,n.jsxs)("span",{className:"flex items-center gap-1.5 text-base font-medium",children:[(0,n.jsx)(sZ.A,{className:"size-4 text-muted-foreground"}),"通知"]}),(0,n.jsx)(s2,{checked:e.enabled,label:"通知",onChange:e=>a({enabled:e})})]}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"從 agent 的執行紀錄判斷階段,不需要 agent 額外回報。正在看的卡片不會跳通知。"}),(0,n.jsxs)("div",{className:"space-y-2.5 border-t border-border/50 pt-3",children:[(0,n.jsx)(s3,{label:"步驟完成",hint:"待辦清單中每完成一項就通知",checked:e.stepCompleted,disabled:i,onChange:e=>a({stepCompleted:e})}),(0,n.jsx)(s3,{label:"全部步驟完成",checked:e.allCompleted,disabled:i,onChange:e=>a({allCompleted:e})}),(0,n.jsx)(s3,{label:"等待輸入",hint:"Agent 停下來等你回覆或允許權限",checked:e.waitingInput,disabled:i,onChange:e=>a({waitingInput:e})}),(0,n.jsx)(s3,{label:"桌面通知",hint:s?"瀏覽器已封鎖通知,請在瀏覽器的網站設定中允許。":"頁面不在前景時也會跳出系統通知。從瀏覽器網址列「安裝 VibeFlow」後,通知會以 VibeFlow App 顯示,不帶網址。",checked:e.desktop&&!s,disabled:i,onChange:async e=>{if(!e)return a({desktop:!1});a({desktop:await r()})}})]})]})}let s6=[{id:"claude",name:"Claude Code"},{id:"codex",name:"Codex CLI"}],s7={builtin:"內建清單","claude-cli":"Claude Code CLI","codex-app-server":"Codex CLI","codex-cache":"Codex 本機快取"};function s8({open:e,systemPrompt:t,workstationPath:s,autoMode:a,notifications:i,jiraStoryPointsFields:o,saving:c,error:d,onSave:u,onPickFolder:x,onClose:h}){let[f,p]=(0,r.useState)(""),[g,b]=(0,r.useState)(void 0),[j,v]=(0,r.useState)(""),[N,y]=(0,r.useState)(!0),[w,C]=(0,r.useState)(i),[S,A]=(0,r.useState)(""),[z,$]=(0,r.useState)(!1),[E,P]=(0,r.useState)({}),[R,I]=(0,r.useState)(null),[K,B]=(0,r.useState)(void 0),[F,_]=(0,r.useState)(""),[M,L]=(0,r.useState)(!1),[G,O]=(0,r.useState)(null),[H,J]=(0,r.useState)(void 0),[W,U]=(0,r.useState)(!1),[q,Y]=(0,r.useState)(!1),[X,Q]=(0,r.useState)(null),[Z,ee]=(0,r.useState)("idle"),[et,es]=(0,r.useState)(""),[en,er]=(0,r.useState)(""),[ea,ei]=(0,r.useState)(null),[el,eo]=(0,r.useState)(!1),[ec,ed]=(0,r.useState)(null),[eu,em]=(0,r.useState)("idle"),[ex,eh]=(0,r.useState)(""),[ef,ep]=(0,r.useState)("https://github.com/login/device"),[eg,eb]=(0,r.useState)(null),[ej,eN]=(0,r.useState)(!1),[ey,ew]=(0,r.useState)(!1);(0,r.useEffect)(()=>{e&&(p(t),v(s),y(a),C(i),A(o.join(", ")),$("denied"===s5()||"unsupported"===s5()),U(!1),_(""),O(null),B(void 0),(0,D.jt)().then(B).catch(e=>{B(null),O(e instanceof Error?e.message:String(e))}),Y(!1),ee("idle"),ei(null),es(""),er(""),(0,D.ny)().then(Q),em("idle"),eh(""),eb(null),ew(!1),(0,D.Er)().then(ed))},[e,t,s,a,i,o]),(0,r.useEffect)(()=>{if(!e)return;let t=!1;for(let e of(b(void 0),(0,D.su)().then(e=>{t||b(e)}).catch(()=>{t||b(null)}),P({}),J(void 0),(0,D.KG)().then(e=>e.map(e=>e.id)).catch(()=>null).then(e=>{t||J(e)}),s6))(0,D.qw)(e.id).catch(()=>null).then(s=>{t||P(t=>({...t,[e.id]:s}))});return()=>{t=!0}},[e]),(0,r.useEffect)(()=>{if(e)return(0,D.y$)(e=>{"starting"===e.type&&(ee("waiting"),eo(!0),ei(null)),"output"===e.type&&er(t=>(t+e.data).slice(-32e3)),"url"===e.type&&es(e.url),"success"===e.type&&(Q(e.status),ee("idle"),eo(!1)),"signed-out"===e.type&&(Q(e.status),ee("idle"),eo(!1)),"cancelled"===e.type&&(ee("idle"),eo(!1)),"error"===e.type&&(ee("error"),eo(!1),ei(e.error))})},[e]);let ek=async e=>{I(e);try{let t=await (0,D.qw)(e,!0).catch(()=>null);P(s=>({...s,[e]:t}))}finally{I(null)}},eC=async()=>{if(F.trim()){L(!0),O(null);try{let e=await (0,D.Mk)(F);if(!e)throw Error("未連線到 VibeFlow core");B(e),_("")}catch(e){O(e instanceof Error?e.message:String(e))}finally{L(!1)}}},eS=async()=>{L(!0),O(null);try{let e=await (0,D.FS)();if(!e)throw Error("未連線到 VibeFlow core");B(e),_("")}catch(e){O(e instanceof Error?e.message:String(e))}finally{L(!1)}};(0,r.useEffect)(()=>{if(e)return(0,D.re)(e=>{if("starting"===e.type){em("starting"),eb(null);return}if("code"===e.type){em("waiting"),eh(e.code),ep(e.url),ew(!1),eN(!1);return}if("success"===e.type){ed(e.status),em("success"),eN(!1);return}if("cancelled"===e.type){em("idle"),eN(!1);return}em("error"),eb(e.error),eN(!1)})},[e]);let[eA,e$]=(0,r.useState)(!1),[eE,eP]=(0,r.useState)(!1),eT=f.trim(),eR=""===eT,eI=S.split(",").map(e=>e.trim()).filter(Boolean),eD=eI.every(e=>/^customfield_\d+$/.test(e)),eB=!c&&!W&&!q&&eD,eF=async()=>{let e=await x();e&&v(e)},e_=async()=>{U(!0),em("starting"),eh(""),eb(null),ew(!1),eN(!0);try{await (0,D.TG)()}catch(e){em("error"),eb(e instanceof Error?e.message:String(e)),eN(!1)}},eM=async()=>{("starting"===eu||"waiting"===eu)&&await (0,D.Bj)(),U(!1),em("idle"),eN(!1),eh(""),eb(null),ew(!1),ed(await (0,D.Er)())},eL=async()=>{eN(!0),eb(null);try{let e=await (0,D.EA)();ed(e)}catch(e){eb(e instanceof Error?e.message:String(e))}finally{eN(!1)}},eV=()=>{el&&(0,D.YK)(),W&&("starting"===eu||"waiting"===eu)&&(0,D.Bj)(),h()},eG=async()=>{ee("waiting"),eo(!0),ei(null),es(""),er("");try{await (0,D.eF)()}catch(e){eo(!1),ee("error"),ei(e instanceof Error?e.message:String(e))}},eO=async()=>{el&&await (0,D.YK)(),Y(!1),eo(!1),ee("idle"),Q(await (0,D.ny)())},eH=async()=>{ex&&(await navigator.clipboard.writeText(ex),ew(!0),window.setTimeout(()=>ew(!1),1500))};return(0,n.jsx)(l.N,{children:e&&(0,n.jsx)(e5.h,{title:q?"Atlassian(Jira)":W?"登入 GitHub CLI":eA?"Library":"設定",description:q?"登入 Atlassian 以讀取指派給你的 Jira ticket。":W?"使用 GitHub CLI 的網頁授權流程登入 github.com。":eA?"管理 VibeFlow 的 skills、文字片段與腳本;啟動任務時都不會自動載入。":"調整 system prompt 與 agent 帳號連線。",saving:c||ej,onClose:eV,showHeader:!0,contentClassName:"max-w-2xl",footer:q?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>void eO(),children:"返回設定"}),(0,n.jsx)(eK.$,{size:"sm",disabled:c||el||!eD,onClick:()=>u(eT,j.trim(),N,w,eI),children:"儲存設定"})]}):W?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>void eM(),disabled:ej&&"success"!==eu,children:"success"===eu?"完成":"返回"}),"error"===eu&&(0,n.jsx)(eK.$,{size:"sm",onClick:()=>void e_(),children:"重新登入"})]}):eA?eE?null:(0,n.jsxs)(eK.$,{variant:"ghost",size:"sm",onClick:()=>e$(!1),children:[(0,n.jsx)(s_.A,{className:"size-3.5"}),"返回設定"]}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:eV,disabled:c,children:"取消"}),(0,n.jsxs)(eK.$,{size:"sm",onClick:()=>{eB&&u(eT,j.trim(),N,w,eI)},disabled:!eB,className:(0,T.cn)(c&&"opacity-80"),children:[c&&(0,n.jsx)(k.A,{className:"animate-spin"}),c?"儲存中…":"儲存設定"]})]}),children:q?(0,n.jsxs)("div",{className:"space-y-5",children:[(0,n.jsxs)("button",{type:"button",onClick:()=>void eO(),className:"inline-flex items-center gap-1.5 rounded-sm text-sm text-muted-foreground outline-none hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(s_.A,{className:"size-4"}),"返回設定"]}),(0,n.jsxs)("div",{className:"space-y-1 text-sm",children:[(0,n.jsx)("p",{className:"font-medium",children:X?.installed===!1?"找不到 Atlassian CLI(acli)。":X?.authenticated?"已登入 Atlassian":"尚未登入 Atlassian。"}),X?.authenticated&&(0,n.jsxs)("p",{className:"text-muted-foreground",children:[X.email??"帳號"," \xb7 ",X.site]}),"waiting"===Z&&(0,n.jsxs)("p",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,n.jsx)(k.A,{className:"size-4 animate-spin"}),"請在瀏覽器完成授權;若帳號有多個 site,再於下方終端選擇。"]}),ea&&(0,n.jsx)("p",{role:"alert",className:"text-destructive",children:ea})]}),(el||en)&&(0,n.jsx)(sY,{output:en,active:el}),X?.installed===!1?(0,n.jsxs)("div",{className:"flex gap-2",children:[(0,n.jsxs)(eK.$,{variant:"outline",size:"sm",onClick:()=>void(0,D.kK)("https://developer.atlassian.com/cloud/acli/guides/install-acli/"),children:[(0,n.jsx)(ev.A,{}),"安裝說明"]}),(0,n.jsxs)(eK.$,{size:"sm",onClick:()=>void(0,D.ny)().then(Q),children:[(0,n.jsx)(ez.A,{}),"重新檢查"]})]}):(0,n.jsxs)("div",{className:"flex flex-wrap gap-2",children:[el?(0,n.jsx)(eK.$,{variant:"outline",size:"sm",onClick:()=>void(0,D.YK)(),children:"取消"}):(0,n.jsx)(eK.$,{size:"sm",onClick:()=>void eG(),children:X?.authenticated?"重新登入":"使用瀏覽器登入"}),X?.authenticated&&(0,n.jsxs)(eK.$,{variant:"outline",size:"sm",disabled:el,onClick:async()=>{try{Q(await (0,D.P7)())}catch(e){ei(e instanceof Error?e.message:String(e))}},children:[(0,n.jsx)(sM.A,{}),"登出"]}),et&&(0,n.jsxs)(eK.$,{variant:"ghost",size:"sm",onClick:()=>void(0,D.kK)(et),children:[(0,n.jsx)(ev.A,{}),"手動開啟登入頁"]})]}),(0,n.jsxs)("label",{className:"block space-y-1.5 text-sm",children:[(0,n.jsx)("span",{className:"font-medium",children:"Story Points 欄位 ID"}),(0,n.jsx)("input",{value:S,onChange:e=>A(e.target.value),placeholder:"customfield_10033, customfield_10016",className:(0,T.cn)(sd,"font-mono text-sm")}),!eD&&(0,n.jsx)("span",{className:"text-destructive",children:"請使用 customfield_12345 格式,以逗號分隔。"})]})]}):W?(0,n.jsxs)("div",{className:"space-y-5",children:[(0,n.jsxs)("button",{type:"button",onClick:()=>void eM(),disabled:ej&&"success"!==eu,className:"inline-flex items-center gap-1.5 rounded-sm text-base text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:opacity-50",children:[(0,n.jsx)(s_.A,{className:"size-4"}),"返回設定"]}),(0,n.jsx)("div",{className:"rounded-md border border-border/60 p-3",children:(0,n.jsxs)("div",{className:"flex items-start gap-3",children:["success"===eu?(0,n.jsx)(V.A,{className:"mt-0.5 size-5 shrink-0 text-success"}):"error"===eu?(0,n.jsx)(m.A,{className:"mt-0.5 size-5 shrink-0 text-destructive"}):(0,n.jsx)(k.A,{className:"mt-0.5 size-5 shrink-0 animate-spin text-muted-foreground"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1 space-y-1",children:[(0,n.jsx)("p",{className:"text-base font-medium",children:"success"===eu?"GitHub CLI 已完成授權":"error"===eu?"GitHub CLI 授權失敗":"waiting"===eu?"等待 GitHub 授權完成":"正在啟動 GitHub CLI 登入"}),(0,n.jsx)("p",{className:"text-sm leading-5 text-muted-foreground",children:"success"===eu?`目前登入帳號:${ec?.login??"GitHub"}`:"error"===eu?eg:"waiting"===eu?"請複製授權碼並開啟 GitHub 授權頁,完成後 VibeFlow 會自動更新狀態。":"VibeFlow 正在背景準備 gh auth login。"})]})]})}),("waiting"===eu||ex)&&(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsxs)("label",{className:"block space-y-1.5",children:[(0,n.jsx)("span",{className:"text-base font-medium",children:"授權碼"}),(0,n.jsxs)("div",{className:"flex rounded-md border bg-background focus-within:ring-[3px] focus-within:ring-ring/50",children:[(0,n.jsx)("input",{readOnly:!0,value:ex,className:"min-w-0 flex-1 bg-transparent px-3 py-2 font-mono text-base tracking-wider outline-none"}),(0,n.jsxs)("button",{type:"button",onClick:()=>void eH(),className:"flex h-9 items-center gap-1.5 rounded-r-md px-3 text-base text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:ring-inset disabled:opacity-50",disabled:!ex,children:[(0,n.jsx)(sL.A,{className:"size-4"}),ey?"已複製":"複製"]})]})]}),(0,n.jsxs)("label",{className:"block space-y-1.5",children:[(0,n.jsx)("span",{className:"text-base font-medium",children:"登入網址"}),(0,n.jsxs)("div",{className:"flex rounded-md border bg-background focus-within:ring-[3px] focus-within:ring-ring/50",children:[(0,n.jsx)("input",{readOnly:!0,value:ef,className:"min-w-0 flex-1 bg-transparent px-3 py-2 text-base outline-none"}),(0,n.jsxs)("button",{type:"button",onClick:()=>void(0,D.kK)(ef),className:"flex h-9 items-center gap-1.5 rounded-r-md px-3 text-base text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:ring-inset",children:[(0,n.jsx)(ev.A,{className:"size-4"}),"開啟"]})]})]})]})]}):eA?(0,n.jsx)(sq,{onEditingChange:eP}):(0,n.jsxs)("div",{className:"space-y-6",children:[(0,n.jsx)(sQ,{appVersion:g}),(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsx)(sC,{value:N,onChange:y}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"新卡片的預設值;每張卡片可在建立或編輯時各自調整。"})]}),(0,n.jsx)("section",{className:"space-y-2",children:(0,n.jsx)(s4,{value:w,onChange:C,desktopBlocked:z,onRequestDesktop:async()=>{if("unsupported"===s5())return $(!0),!1;let e=await Notification.requestPermission()==="granted";return $(!e),e}})}),(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsx)("div",{className:"flex items-center justify-between",children:(0,n.jsxs)("span",{className:"text-base font-medium",children:["工作站資料夾",(0,n.jsx)("span",{className:(0,T.cn)("ml-2 rounded-xs px-1.5 py-0.5 text-xs font-medium",""===j.trim()?"bg-secondary text-secondary-foreground":"bg-primary/15 text-primary"),children:""===j.trim()?"預設(~/Desktop)":"已自訂"})]})}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("input",{name:"workstation-path",autoComplete:"off",spellCheck:!1,value:j,placeholder:"~/Desktop",onChange:e=>v(e.target.value),className:(0,T.cn)(sd,"font-mono text-sm")}),(0,n.jsx)(eK.$,{variant:"outline",size:"sm",className:"shrink-0",onClick:()=>void eF(),children:"選擇資料夾"})]}),(0,n.jsxs)("p",{className:"text-sm text-muted-foreground",children:["每個任務的 worktree 與執行期檔案會建立在 ","<工作站>/<專案名>/"," 底下;留空則預設為 ~/Desktop。"]})]}),(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsx)("div",{className:"flex items-center justify-between",children:(0,n.jsxs)("span",{className:"text-base font-medium",children:["System Prompt",(0,n.jsx)("span",{className:(0,T.cn)("ml-2 rounded-xs px-1.5 py-0.5 text-xs font-medium",eR?"bg-secondary text-secondary-foreground":"bg-primary/15 text-primary"),children:eR?"未設定":"已自訂"})]})}),(0,n.jsx)("textarea",{name:"system-prompt",autoComplete:"off",value:f,onChange:e=>p(e.target.value),rows:10,spellCheck:!1,className:(0,T.cn)(sd,"resize-y font-mono text-sm leading-5")}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"啟動 Agent 時會以此 prompt 作為 system prompt;留空則不附加 system prompt。"})]}),(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"text-base font-medium",children:"Library"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"保存可重複使用的 skills、文字片段與腳本。啟動任務時不會載入或加入 prompt, agent 只會收到 system prompt 與任務內容。"})]}),(0,n.jsxs)(eK.$,{variant:"secondary",size:"sm",onClick:()=>e$(!0),children:[(0,n.jsx)(sV.A,{className:"size-3.5"}),"管理 Library"]})]}),(0,n.jsxs)("section",{className:"space-y-3",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"text-base font-medium",children:"Jev 自動選擇模型與 effort"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"任務沒指定模型時,Jev 會依任務複雜度選擇模型(判斷不了就先讓最強的模型唯讀讀過 repo 補充 context);effort 設為 auto 時也會一併選擇推理強度。金鑰只儲存在本機主機資料目錄,不會放入看板狀態或回傳給瀏覽器。"})]}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:void 0===K?"讀取金鑰狀態中…":null===K?"無法讀取 Jev 金鑰狀態":"saved"===K.source?"已設定 Jev API key(本機儲存)":"environment"===K.source?"已透過 TYPESAFE_API_KEY 環境變數設定":"尚未設定 Jev API key"}),(0,n.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,n.jsx)("input",{type:"password","aria-label":"Jev API key",name:"jev-api-key",autoComplete:"off",spellCheck:!1,value:F,onChange:e=>_(e.target.value),placeholder:"輸入 TypeSafe Jev API key",className:(0,T.cn)(sd,"min-w-48 flex-1 font-mono text-sm")}),(0,n.jsx)(eK.$,{size:"sm",disabled:M||!F.trim(),onClick:()=>void eC(),children:M?"處理中…":"儲存金鑰"}),K?.source==="saved"&&(0,n.jsx)(eK.$,{size:"sm",variant:"outline",disabled:M,onClick:()=>void eS(),children:"移除金鑰"})]}),G&&(0,n.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:G})]}),(0,n.jsxs)("section",{className:"space-y-3",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"text-base font-medium",children:"CLI 與帳號設定"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"Model 清單直接取自已登入的 Agent CLI,不需要 API key;Jev 自動選擇使用上方獨立的金鑰。設定 GitHub CLI 以支援本機 GitHub 操作。"})]}),(0,n.jsxs)("div",{className:"grid gap-2",children:[s6.map(e=>{let t=E[e.id],s=Array.isArray(H)&&!H.includes(e.id),r=void 0===H||!s&&(void 0===t||t?.pending===!0||R===e.id);return(0,n.jsxs)("div",{className:"flex items-center gap-3 rounded-md border border-border/60 px-3 py-2.5",children:[r?(0,n.jsx)(k.A,{className:"size-4 shrink-0 animate-spin text-muted-foreground"}):s?(0,n.jsx)(m.A,{className:"size-4 shrink-0 text-muted-foreground"}):t?.error||!t?(0,n.jsx)(m.A,{className:"size-4 shrink-0 text-destructive"}):(0,n.jsx)(V.A,{className:"size-4 shrink-0 text-success"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,n.jsx)("p",{className:"text-base font-medium",children:e.name}),(0,n.jsx)("p",{className:"truncate text-sm text-muted-foreground",children:void 0===H?"偵測 CLI…":s?`未安裝・PATH 中找不到 ${e.id} 指令`:void 0===t?"讀取 model 清單…":t?t.pending?`正在向 ${e.name} 取得 model 清單…`:`${t.models.length} 個 models 可用・來源:${s7[t.source]}`:"無法取得 model 清單"}),!s&&t?.loginRequired?(0,n.jsxs)("p",{className:"text-sm text-destructive",children:["尚未登入,請在終端機執行 ",(0,n.jsxs)("code",{children:[e.id," login"]})," 後重新整理。"]}):!s&&t?.error&&(0,n.jsx)("p",{className:"truncate text-sm text-destructive",title:t.error,children:t.error})]}),!s&&void 0!==H&&(0,n.jsx)(eK.$,{type:"button",size:"sm",variant:"ghost",className:"h-8 w-8 p-0",disabled:R===e.id,"aria-label":`向 ${e.name} 重新取得 model 清單`,title:`向 ${e.name} 重新取得 model 清單`,onClick:()=>void ek(e.id),children:(0,n.jsx)(ez.A,{className:(0,T.cn)("size-4",R===e.id&&"animate-spin")})})]},e.id)}),(0,n.jsxs)("div",{className:"flex items-center gap-3 rounded-md border border-border/60 px-3 py-2.5",children:[ec?.authenticated?(0,n.jsx)(V.A,{className:"size-4 shrink-0 text-success"}):ec?.error?(0,n.jsx)(m.A,{className:"size-4 shrink-0 text-destructive"}):(0,n.jsx)("span",{className:"size-4 shrink-0 rounded-full border border-muted-foreground/50"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,n.jsx)("p",{className:"text-base font-medium",children:"GitHub CLI"}),(0,n.jsx)("p",{className:"truncate text-sm text-muted-foreground",children:ec?.authenticated?`${ec.login??"GitHub"} 已授權(${ec.gitProtocol??"https"})`:ec?.installed===!1?"找不到 GitHub CLI(gh)":ec?.error?ec.error:"尚未授權"})]}),ec?.authenticated&&(0,n.jsx)(eK.$,{type:"button",size:"sm",variant:"ghost",className:"h-8 px-2",disabled:ej,onClick:()=>void e_(),children:"切換使用者"}),ec?.authenticated&&(0,n.jsxs)(eK.$,{type:"button",size:"sm",variant:"ghost",className:"h-8 px-2",disabled:ej,onClick:()=>void eL(),children:[ej?(0,n.jsx)(k.A,{className:"size-4 animate-spin"}):(0,n.jsx)(sM.A,{className:"size-4"}),"登出"]}),!ec?.authenticated&&(0,n.jsx)(eK.$,{type:"button",size:"sm",variant:"outline",disabled:ec?.installed===!1||ej,onClick:()=>void e_(),children:ej?"啟動中…":"登入"})]}),(0,n.jsxs)("button",{type:"button",onClick:()=>Y(!0),className:"flex w-full items-center gap-3 rounded-md border border-border/60 px-3 py-2.5 text-left outline-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[X?.authenticated?(0,n.jsx)(V.A,{className:"size-4 shrink-0 text-success"}):(0,n.jsx)("span",{className:"size-4 shrink-0 rounded-full border border-muted-foreground/50"}),(0,n.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,n.jsx)("span",{className:"block text-base font-medium",children:"Atlassian(Jira)"}),(0,n.jsx)("span",{className:"block truncate text-sm text-muted-foreground",children:X?.authenticated?`${X.email??"帳號"} \xb7 ${X.site}`:X?.installed===!1?"找不到 Atlassian CLI(acli)":"尚未登入"})]})]})]}),eg&&!W&&(0,n.jsx)("p",{className:"rounded-md border border-destructive/40 bg-destructive/10 p-2 text-base",children:eg})]}),d&&(0,n.jsx)("p",{className:"rounded-md border border-destructive/40 bg-destructive/10 p-2 text-base",children:d})]})},"settings-dialog")})}var s9=s(30592),ne=s(93776),nt=s(79751),ns=s(93202),nn=s(51256);function nr({view:e,onSelectView:t,onNewTask:s,onRemoteShare:r,remoteActive:a,onOpenSettings:i}){return(0,n.jsxs)("aside",{className:"flex w-12 flex-shrink-0 flex-col overflow-hidden border-r border-border bg-card text-card-foreground",children:[(0,n.jsx)("div",{className:"flex h-12 shrink-0 items-center justify-center border-b border-border",children:(0,n.jsx)("img",{src:"/logo.svg",alt:"VibeFlow",className:"size-5"})}),(0,n.jsx)("div",{className:"flex shrink-0 justify-center px-2 pt-3",children:(0,n.jsx)(P.K,{"aria-label":"新增任務",onClick:s,title:"新增任務",className:"size-8 p-1.5",children:(0,n.jsx)(u.A,{className:"size-4"})})}),(0,n.jsxs)("nav",{"aria-label":"檢視",className:"flex flex-1 flex-col items-center gap-1 px-2 py-3",children:[(0,n.jsx)(P.K,{"aria-label":"看板","aria-current":"board"===e?"page":void 0,title:"看板",onClick:()=>t("board"),className:(0,T.cn)("size-8","board"===e&&"text-primary hover:text-primary"),children:(0,n.jsx)(s9.A,{className:"size-4"})}),(0,n.jsx)(P.K,{"aria-label":"工作區","aria-current":"workspace"===e?"page":void 0,title:"工作區",onClick:()=>t("workspace"),className:(0,T.cn)("size-8","workspace"===e&&"text-primary hover:text-primary"),children:(0,n.jsx)(ne.A,{className:"size-4"})}),(0,n.jsx)(P.K,{"aria-label":"工作項目","aria-current":"github"===e?"page":void 0,title:"工作項目",onClick:()=>t("github"),className:(0,T.cn)("size-8","github"===e&&"text-primary hover:text-primary"),children:(0,n.jsx)(nt.A,{className:"size-4"})}),(0,n.jsx)(P.K,{"aria-label":"終端機","aria-current":"terminals"===e?"page":void 0,title:"終端機",onClick:()=>t("terminals"),className:(0,T.cn)("size-8","terminals"===e&&"text-primary hover:text-primary"),children:(0,n.jsx)(v.A,{className:"size-4"})})]}),(0,n.jsxs)("div",{className:"flex flex-col items-center gap-1 border-t border-border p-2",children:[r&&(0,n.jsx)(P.K,{"aria-label":"遠端控制",onClick:r,title:"遠端控制",className:(0,T.cn)("size-8",a&&"text-primary hover:text-primary"),children:(0,n.jsx)(ns.A,{className:"size-4"})}),(0,n.jsx)(P.K,{"aria-label":"設定 System Prompt",onClick:i,title:"設定(System Prompt)",className:"size-8",children:(0,n.jsx)(nn.A,{className:"size-4"})})]})]})}var na=s(32310),ni=s(2141),nl=s(4792);function no({name:e,allLabel:t,icon:s,options:a,value:i,onChange:l,optionLabel:o=e=>e}){let[c,d]=(0,r.useState)(!1),u=er(c,()=>d(!1)),m=0===i.length?t:1===i.length?o(i[0]):`${e} \xb7 ${i.length}`;return(0,n.jsxs)("div",{ref:u,className:"relative shrink-0",onKeyDown:e=>{"Escape"===e.key&&c&&(e.stopPropagation(),d(!1))},children:[(0,n.jsxs)("button",{type:"button","aria-haspopup":"menu","aria-expanded":c,"aria-label":`${e}篩選:${m}`,onClick:()=>d(e=>!e),className:"flex items-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium text-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(s,{className:"size-3.5 shrink-0 text-muted-foreground"}),(0,n.jsx)("span",{className:"max-w-40 truncate",children:m}),(0,n.jsx)(C.A,{className:"size-3.5 shrink-0 text-muted-foreground"})]}),c&&(0,n.jsxs)("div",{role:"menu","aria-label":`${e}篩選`,className:"absolute left-0 top-8 z-20 max-h-80 w-56 overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg",children:[(0,n.jsxs)("button",{type:"button",role:"menuitemcheckbox","aria-checked":0===i.length,onClick:()=>l([]),className:(0,T.cn)("focus-visible:ring-[3px] focus-visible:ring-ring/50",ea,"hover:bg-accent hover:text-accent-foreground"),children:[(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",children:t}),0===i.length&&(0,n.jsx)(S.A,{className:"size-3 shrink-0"})]}),a.map(e=>{let t=i.includes(e);return(0,n.jsxs)("button",{type:"button",role:"menuitemcheckbox","aria-checked":t,onClick:()=>l(i.includes(e)?i.filter(t=>t!==e):[...i,e]),className:(0,T.cn)("focus-visible:ring-[3px] focus-visible:ring-ring/50",ea,"hover:bg-accent hover:text-accent-foreground"),children:[(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",children:o(e)}),t&&(0,n.jsx)(S.A,{className:"size-3 shrink-0"})]},e)})]})]})}function nc({item:e,className:t}){if("issue"===e.kind)return(0,n.jsx)(f.A,{className:(0,T.cn)("size-3 shrink-0 text-success",t)});let s="draft"===e.state?p.A:g.A;return(0,n.jsx)(s,{className:(0,T.cn)("size-3 shrink-0",K[e.state],t)})}function nd({user:e}){return(0,n.jsx)("span",{title:e.login,className:"flex size-5 shrink-0 items-center justify-center rounded-full bg-accent text-[9px] font-semibold text-foreground",children:e.login.replace(/[^A-Za-z0-9]/g,"").slice(0,2).toUpperCase()||"?"})}function nu({children:e,className:t}){return(0,n.jsx)("span",{className:(0,T.cn)("inline-flex items-center gap-1 rounded-xs bg-accent px-1.5 py-0.5 text-xs leading-4 text-muted-foreground",t),children:e})}function nm({item:e}){return(0,n.jsxs)(n.Fragment,{children:["issue"===e.kind&&e.issueType&&(0,n.jsx)(nu,{className:"font-medium text-foreground",children:e.issueType.name}),"pr"===e.kind&&(0,n.jsx)(nu,{className:(0,T.cn)("font-medium",K[e.state]),children:B[e.state]}),"pr"===e.kind&&e.reviewDecision&&F[e.reviewDecision]&&(0,n.jsx)(nu,{children:F[e.reviewDecision]}),e.labels.map(e=>(0,n.jsxs)(nu,{children:[(0,n.jsx)("span",{className:"size-1.5 shrink-0 rounded-full",style:{backgroundColor:`#${e.color}`}}),e.name]},e.name))]})}function nx({entry:e,selected:t,onBoard:s,now:r,onSelect:a}){let{item:i}=e,l="pr"===i.kind||i.issueType||i.labels.length>0;return(0,n.jsxs)("button",{type:"button","aria-pressed":t,onClick:a,className:(0,T.cn)("block w-full rounded-md border bg-card p-3 text-left outline-none transition-colors motion-reduce:transition-none focus-visible:ring-[3px] focus-visible:ring-ring/50",t?"border-primary shadow-[0_0_0_2px] shadow-primary/20":"border-border hover:border-input"),children:[(0,n.jsxs)("span",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[(0,n.jsx)(nc,{item:i}),(0,n.jsxs)("span",{className:"min-w-0 truncate",children:[e.projectName," #",i.number]}),s&&(0,n.jsx)("span",{className:"shrink-0 rounded-xs bg-primary/15 px-1.5 py-0.5 font-medium text-primary",children:"已在看板"}),(0,n.jsx)("span",{className:"ml-auto shrink-0",title:L(i.createdAt),children:M(i.createdAt,r)})]}),(0,n.jsx)("span",{className:"mt-2 line-clamp-2 text-[15px] font-medium leading-[1.4] text-foreground",children:i.title}),l&&(0,n.jsx)("span",{className:"mt-2 flex flex-wrap gap-1",children:(0,n.jsx)(nm,{item:i})}),(0,n.jsxs)("span",{className:"mt-2.5 flex items-center gap-3 text-xs text-muted-foreground",children:[i.author&&(0,n.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5",children:[(0,n.jsx)(nd,{user:i.author}),(0,n.jsxs)("span",{className:"truncate",children:[i.author.login," 發起"]})]}),i.assignees.length>0&&(0,n.jsxs)("span",{className:"ml-auto flex shrink-0 items-center gap-1.5",children:["指派",(0,n.jsx)("span",{className:"flex -space-x-1",children:i.assignees.slice(0,3).map(e=>(0,n.jsx)(nd,{user:e},e.login))})]})]})]})}function nh({label:e,children:t}){return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("dt",{className:"text-muted-foreground",children:e}),(0,n.jsx)("dd",{className:"min-w-0 text-foreground",children:t})]})}function nf({entry:e,taskId:t,projects:s,onBrowseProject:a,onClose:i,onConvert:l,onOpenTask:o}){let c,{item:d}=e,[m,x]=(0,r.useState)(null),[h,f]=(0,r.useState)(!1),[p,g]=(0,r.useState)(null),[b,j]=(0,r.useState)(e.projectPath??""),v=async()=>{if(!h&&b){f(!0),g(null);try{x(await l(b))}catch(e){g(e instanceof Error?e.message:String(e))}finally{f(!1)}}},N=m??t;return(0,n.jsx)(e5.h,{title:d.title,description:`${d.repo} \xb7 ${"issue"===d.kind?"Issue":"PR"} #${d.number}`,showHeader:!0,saving:h,onClose:i,contentClassName:"max-w-3xl",footer:(0,n.jsxs)("div",{className:"flex w-full flex-wrap items-center gap-2",children:[(0,n.jsxs)(eK.$,{variant:"outline",size:"sm",onClick:()=>void(0,D.kK)(d.url),children:[(0,n.jsx)(ev.A,{}),"在 GitHub 開啟"]}),m&&(0,n.jsx)("span",{className:"text-sm text-success",children:"已建立到 Backlog"}),!e.projectPath&&(0,n.jsxs)("div",{className:"ml-auto flex items-center gap-1",children:[(0,n.jsxs)("select",{"aria-label":"建立到專案",value:b,onChange:e=>j(e.target.value),disabled:h,className:"h-9 max-w-56 rounded-md border border-input bg-background px-2 text-sm focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)("option",{value:"",children:"選擇本機專案…"}),b&&!s.some(e=>e.path===b)&&(0,n.jsx)("option",{value:b,children:b}),s.map(e=>(0,n.jsxs)("option",{value:e.path,children:[e.name," \xb7 ",e.path]},e.path))]}),(0,n.jsx)(P.K,{"aria-label":"從資料夾選擇專案",title:"從資料夾選擇專案",disabled:h,onClick:()=>void a().then(e=>{e&&j(e)}),children:(0,n.jsx)(ew.A,{className:"size-4"})})]}),N?(0,n.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",onClick:()=>void v(),disabled:h||!b,title:"已經有對應卡片,仍可再建一張",children:"再建一張"}),(0,n.jsxs)(eK.$,{size:"sm",onClick:()=>o(N),children:[(0,n.jsx)(na.A,{}),"前往卡片"]})]}):(0,n.jsxs)("div",{className:"ml-auto flex items-center gap-2 text-sm",children:[e.projectPath&&(0,n.jsxs)("span",{className:"text-muted-foreground",children:["建立到:",e.projectName]}),(0,n.jsxs)(eK.$,{size:"sm",onClick:()=>void v(),disabled:h||!b,children:[h?(0,n.jsx)(k.A,{className:"animate-spin"}):(0,n.jsx)(u.A,{}),h?"建立中…":"建立卡片"]})]})]}),children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsxs)("div",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:["issue"===d.kind?(0,n.jsx)(nu,{className:"bg-success/15 font-medium text-success",children:"Open"}):(0,n.jsx)(nu,{className:(0,T.cn)("font-medium",K[d.state]),children:B[d.state]}),(0,n.jsxs)("span",{className:"min-w-0 truncate",children:[d.repo," \xb7 ","issue"===d.kind?"Issue":"PR"," #",d.number]})]}),(0,n.jsxs)("dl",{className:"mt-3 grid grid-cols-[64px_minmax(0,1fr)] gap-y-1.5 text-xs",children:[(0,n.jsx)(nh,{label:"專案",children:e.projectName}),(0,n.jsx)(nh,{label:"發起人",children:d.author?.login??"—"}),(0,n.jsx)(nh,{label:"指派",children:(c=d.assignees).length?c.map(e=>e.login).join("、"):"—"}),(0,n.jsx)(nh,{label:"建立時間",children:L(d.createdAt)}),"issue"===d.kind&&(0,n.jsx)(nh,{label:"Issue Type",children:d.issueType?.name??"—"}),"pr"===d.kind&&(0,n.jsx)(nh,{label:"分支",children:(0,n.jsxs)("span",{className:"break-all",children:[d.headRefName," → ",d.baseRefName]})}),"pr"===d.kind&&d.reviewDecision&&(0,n.jsx)(nh,{label:"Review",children:F[d.reviewDecision]??d.reviewDecision}),d.labels.length>0&&(0,n.jsx)(nh,{label:"Labels",children:(0,n.jsx)("span",{className:"flex flex-wrap gap-1",children:d.labels.map(e=>(0,n.jsxs)(nu,{children:[(0,n.jsx)("span",{className:"size-1.5 shrink-0 rounded-full",style:{backgroundColor:`#${e.color}`}}),e.name]},e.name))})}),d.milestone&&(0,n.jsx)(nh,{label:"Milestone",children:d.milestone})]}),(0,n.jsx)("div",{className:"border-t border-border pt-4",children:d.body.trim()?(0,n.jsx)(eR.h,{source:d.body,compact:!0}):(0,n.jsx)("p",{className:"text-sm text-muted-foreground/70",children:"沒有內文"})}),p&&(0,n.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:p})]})})}function np({children:e,action:t}){return(0,n.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-3 px-6 text-center text-sm text-muted-foreground",children:[(0,n.jsx)("p",{className:"max-w-md",children:e}),t]})}function ng({column:e,selectedKey:t,boardCards:s,now:r,onSelect:a}){return(0,n.jsxs)("section",{"aria-label":e.repo,className:"flex min-h-0 w-[320px] shrink-0 flex-col gap-2",children:[(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-2 px-1",title:e.repo,children:[(0,n.jsx)("h2",{className:(0,T.cn)(E,"min-w-0 truncate"),children:e.projectName.split("/").pop()}),(0,n.jsx)("span",{className:"text-xs tabular-nums text-muted-foreground/80",children:e.entries.length})]}),(0,n.jsx)("div",{className:"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto rounded-md p-1",children:e.entries.map(e=>{let i=_(e.item);return(0,n.jsx)(nx,{entry:e,selected:i===t,onBoard:s.has(i),now:r,onSelect:()=>a(i)},i)})})]})}let nb=e=>e===e7?"未指派":e;function nj({view:e,onViewChange:t,inbox:s,loading:a,error:i,onRefresh:l,filters:o,onFiltersChange:c,boardCards:d,projects:u,onBrowseProject:m,onConvert:x,onOpenTask:h,onOpenSettings:f,sourceKind:p,embedded:g=!1}){let b,j,[v,N]=(0,r.useState)(null),y=function(){let[e,t]=(0,r.useState)(()=>Date.now());return(0,r.useEffect)(()=>{let e=setInterval(()=>t(Date.now()),3e4);return()=>clearInterval(e)},[3e4]),e}(),w=s?.status==="ok"?s.repos:[],k={assignees:[e7,...e9((j=w.flatMap(e=>p?e[p]:[...e.issues,...e.prs])).flatMap(e=>e.assignees.map(e=>e.login)),o.assignees.filter(e=>e!==e7))],authors:e9(j.flatMap(e=>e.author?[e.author.login]:[]),o.authors)},C=o.assignees.length>0||o.authors.length>0,S=tt(w,"issues",o),A=tt(w,"prs",o),z=w.filter(e=>e.error),$="issues"===p?S:"prs"===p?A:[...S,...A],E=function(e){let t=new Map;for(let s of e){let e=t.get(s.item.repo);e?e.entries.push(s):t.set(s.item.repo,{repo:s.item.repo,projectName:s.projectName,entries:[s]})}return[...t.values()]}($),R=$.find(e=>_(e.item)===v)??null,D=s?.status==="ok"&&null!==v&&null===R;(0,r.useEffect)(()=>{D&&N(null)},[D]);let K=e=>t=>c({...o,[e]:t}),B=s?.fetchedAt??0,F=B?`${M(new Date(B).toISOString(),y)}更新`:null;return b=s?"gh-missing"===s.status?(0,n.jsx)(np,{children:"找不到 GitHub CLI(gh)。安裝後按右上角的重新整理,就能看到指派給你或你建立的 Issue 與 PR。"}):"unauthenticated"===s.status?(0,n.jsx)(np,{action:(0,n.jsx)(eK.$,{size:"sm",onClick:f,children:"開啟設定登入 GitHub"}),children:"GitHub CLI 尚未登入。"}):0===w.length?(0,n.jsx)(np,{children:i??"目前沒有與你相關的 open Issue 或 PR。"}):(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-3 overflow-hidden px-5 pb-4 pt-3",children:[(z.length>0||i)&&(0,n.jsxs)("div",{role:"alert",className:"shrink-0 space-y-1 rounded-md bg-destructive/10 px-3 py-2 text-sm text-destructive",children:[i&&(0,n.jsx)("p",{children:i}),z.map(e=>(0,n.jsxs)("p",{className:"truncate",title:e.error,children:[e.repo,":",e.error]},e.repo))]}),0===E.length?(0,n.jsx)("p",{className:"px-1 text-sm text-muted-foreground/60",children:C?"沒有符合篩選條件的項目":"prs"===p?"沒有指派給你、你建立、請你 review 或你 review 過的 open PR":"issues"===p?"沒有指派給你或你建立的 open Issue":"目前沒有與你相關的 open Issue 或 PR"}):(0,n.jsx)("div",{className:"flex min-h-0 flex-1 gap-4 overflow-x-auto pb-2",children:E.map(e=>(0,n.jsx)(ng,{column:e,selectedKey:v,boardCards:d,now:y,onSelect:N},e.repo))})]}):a?(0,n.jsx)(np,{children:"讀取 GitHub 中…"}):i?(0,n.jsx)(np,{children:i}):null,(0,n.jsxs)("div",{className:(0,T.cn)("flex min-h-0 flex-col bg-background",g?"flex-1":"h-full"),onKeyDown:e=>{"Escape"===e.key&&v&&(e.stopPropagation(),N(null))},children:[(0,n.jsxs)("div",{className:(0,T.cn)("flex shrink-0 items-center gap-3 border-b border-border px-5",g?"h-11":"h-12"),children:[!g&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(I,{value:e,onChange:t}),(0,n.jsx)("span",{className:"h-4 w-px bg-border"})]}),"issues"!==p&&(0,n.jsx)(no,{name:"Assignee",allLabel:"所有 Assignee",icon:ni.A,options:k.assignees,value:o.assignees,onChange:K("assignees"),optionLabel:nb}),"issues"!==p&&(0,n.jsx)(no,{name:"發起人",allLabel:"所有發起人",icon:nl.A,options:k.authors,value:o.authors,onChange:K("authors")}),C&&(0,n.jsxs)("button",{type:"button",onClick:()=>c(e6),className:"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-sm text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)(eE.A,{className:"size-3.5 shrink-0"}),"清除篩選"]}),(0,n.jsxs)("span",{className:"ml-auto min-w-0 truncate text-sm text-muted-foreground",children:[s?.login?`${s.login} \xb7 `:"","issues"===p?`${S.length} 筆`:"prs"===p?`${A.length} 筆`:"指派給我、我建立、我 review 的",F?` \xb7 ${F}`:""]}),(0,n.jsx)(P.K,{"aria-label":"重新整理 Issue 與 PR",title:"重新整理",onClick:l,disabled:a,children:(0,n.jsx)(ez.A,{className:(0,T.cn)("size-4",a&&"animate-spin motion-reduce:animate-none")})})]}),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1",children:[(0,n.jsx)("div",{className:"flex min-w-0 flex-1 flex-col",children:b}),R&&(0,n.jsx)(nf,{entry:R,taskId:d.get(_(R.item)),projects:u,onBrowseProject:m,onClose:()=>N(null),onConvert:e=>x(R.item,e),onOpenTask:h},_(R.item))]})]})}function nv(e){return Number(e.split("-").at(-1))||0}function nN(e,t){return e.dueDate?t.dueDate?e.dueDate.localeCompare(t.dueDate)||nv(t.key)-nv(e.key):-1:t.dueDate?1:nv(t.key)-nv(e.key)}let ny={new:"bg-accent text-muted-foreground",indeterminate:"bg-primary/15 text-primary",done:"bg-success/15 text-success"};function nw(e,t=Date.now()){if(!e)return{text:"無期限",tone:"none",title:""};let s=new Date(`${e.slice(0,10)}T00:00:00`).getTime();if(!Number.isFinite(s))return{text:"無期限",tone:"none",title:""};let n=new Date(t);n.setHours(0,0,0,0);let r=Math.round((s-n.getTime())/864e5);return r<0?{text:`已逾期 ${-r} 天`,tone:"overdue",title:e}:0===r?{text:"今天到期",tone:"today",title:e}:r<=3?{text:`剩 ${r} 天`,tone:"soon",title:e}:{text:`截止 ${new Date(s).getMonth()+1}/${new Date(s).getDate()}`,tone:"normal",title:e}}function nk({inbox:e,loading:t,error:s,scope:a,onScopeChange:i,onRefresh:o,boardCards:c,projects:d,onBrowseProject:m,onCreate:x,onOpenTask:h,onOpenSettings:p}){let[g,b]=(0,r.useState)(null),[j,v]=(0,r.useState)(""),[N,y]=(0,r.useState)(!1),[w,C]=(0,r.useState)(null),[S,A]=(0,r.useState)(null),[z,$]=(0,r.useState)(!1),E=e?.tickets??[],R=function(e){let t=[{name:"To Do",tickets:[]},{name:"In Progress",tickets:[]},{name:"To be Released",tickets:[]},{name:"Done",tickets:[]}];for(let s of e)t["to be released"===s.status.name.toLowerCase()?2:"done"===s.status.category?3:+("new"!==s.status.category)].tickets.push(s);return t.map(e=>({...e,tickets:e.tickets.sort(nN)}))}(E),I=E.find(e=>e.key===g),K=I?c.get(I.key):void 0,B=w??K;(0,r.useEffect)(()=>{g&&e?.status==="ok"&&!I&&b(null)},[g,I,e?.status]);let F=async()=>{if(I&&j&&!N){y(!0),A(null);try{let e=await x(I,j);C(e),$(!1)}catch(e){A(e instanceof Error?e.message:String(e))}finally{y(!1)}}},_=(e,t=!1)=>(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col items-center justify-center gap-3 px-5 text-center text-sm text-muted-foreground",children:[(0,n.jsx)("p",{className:"max-w-md",children:e}),t&&(0,n.jsx)(eK.$,{size:"sm",onClick:p,children:"開啟設定"})]});return(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col bg-background",children:[(0,n.jsxs)("div",{className:"flex min-h-11 shrink-0 flex-wrap items-center gap-3 border-b border-border px-5 py-1",children:[(0,n.jsxs)("label",{className:"flex items-center gap-2 text-sm",children:[(0,n.jsx)("span",{className:"shrink-0 text-muted-foreground",children:"抓取範圍"}),(0,n.jsxs)("select",{"aria-label":"Jira 抓取範圍",value:a,onChange:e=>i(e.target.value),className:"h-8 max-w-40 rounded-md border border-input bg-background px-2 text-sm focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)("option",{value:"sprint",children:"Active Sprint"}),(0,n.jsx)("option",{value:"all",children:"全部指派給我"})]})]}),(0,n.jsxs)("span",{className:"ml-auto min-w-0 truncate text-sm text-muted-foreground",children:[e?.email??e?.site??"",e?.status==="ok"?` \xb7 ${E.length} 筆`:"",e?.fetchedAt?` \xb7 ${new Date(e.fetchedAt).toLocaleTimeString()} 更新`:""]}),(0,n.jsx)(P.K,{"aria-label":"重新整理 Jira ticket",title:"重新整理 Jira ticket",onClick:o,disabled:t,children:(0,n.jsx)(ez.A,{className:(0,T.cn)("size-4",t&&"animate-spin motion-reduce:animate-none")})})]}),e?.error&&(0,n.jsx)("div",{role:"alert",className:"border-b border-destructive/30 bg-destructive/10 px-5 py-2 text-sm text-destructive",children:e.error}),e?.status==="acli-missing"?_("找不到 Atlassian CLI(acli)。安裝並登入後就能看到指派給你的 Jira ticket。",!0):e?.status==="unauthenticated"?_("尚未登入 Atlassian。",!0):e?e.error&&0===E.length?_(e.error):(0,n.jsxs)("div",{className:"min-h-0 flex-1 overflow-auto px-5 py-4",children:[0===E.length&&(0,n.jsx)("p",{className:"mb-4 text-sm text-muted-foreground",children:"目前沒有符合抓取範圍的 Jira ticket"}),(0,n.jsx)("div",{className:"grid min-h-full min-w-[1040px] grid-cols-4 items-start gap-3",children:R.map(e=>(0,n.jsxs)("section",{"aria-label":`${e.name},${e.tickets.length} 筆`,className:"min-w-0 rounded-md border border-border bg-muted/20 p-2",children:[(0,n.jsxs)("h3",{className:"flex min-w-0 items-center gap-2 px-1 py-1 text-sm font-medium",children:[(0,n.jsx)("span",{className:(0,T.cn)("size-2 shrink-0 rounded-full","To Do"===e.name?"bg-muted-foreground":"Done"===e.name?"bg-success":"bg-primary")}),(0,n.jsx)("span",{className:"min-w-0 truncate",title:e.name,children:e.name}),(0,n.jsx)("span",{className:"ml-auto shrink-0 text-xs tabular-nums text-muted-foreground",children:e.tickets.length})]}),(0,n.jsx)("div",{className:"mt-2 space-y-2",children:e.tickets.map(e=>{let t=nw(e.dueDate);return(0,n.jsxs)("button",{type:"button",onClick:()=>{b(e.key),v(""),A(null),C(null),$(!1)},"aria-pressed":e.key===g,className:(0,T.cn)("min-h-32 w-full rounded-md border bg-card p-3 text-left outline-none transition-colors hover:border-input focus-visible:ring-[3px] focus-visible:ring-ring/50",e.key===g?"border-primary":"border-border"),children:[(0,n.jsxs)("span",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[(0,n.jsx)(f.A,{className:"size-3 shrink-0"}),(0,n.jsx)("span",{className:"font-mono tabular-nums",children:e.key}),c.has(e.key)&&(0,n.jsx)("span",{className:"rounded-xs bg-primary/15 px-1.5 py-0.5 text-primary",children:"已在看板"}),(0,n.jsx)("span",{className:(0,T.cn)("ml-auto max-w-[45%] truncate rounded-xs px-1.5 py-0.5",ny[e.status.category]),children:e.status.name})]}),(0,n.jsx)("span",{className:"mt-2 line-clamp-2 min-h-10 text-[15px] font-medium leading-5",children:e.summary}),(0,n.jsxs)("span",{className:"mt-3 flex items-center justify-between gap-2 text-xs text-muted-foreground",children:[(0,n.jsx)("span",{children:null===e.storyPoints?"— pt":`◆ ${e.storyPoints} pt`}),(0,n.jsx)("span",{title:t.title,className:(0,T.cn)("overdue"===t.tone&&"text-destructive",("soon"===t.tone||"today"===t.tone)&&"text-warning"),children:t.text})]})]},e.key)})})]},e.name))})]}):_(t?"讀取 Jira 中…":s??"無法讀取 Jira ticket"),(0,n.jsx)(l.N,{children:I&&(0,n.jsx)(e5.h,{title:`${I.key} ${I.summary}`,showHeader:!0,saving:N,description:`${I.issueType} \xb7 ${I.status.name}`,onClose:()=>b(null),contentClassName:"max-w-3xl",bodyClassName:"min-h-0",footer:(0,n.jsxs)("div",{className:"flex w-full flex-wrap items-center gap-2",children:[w&&(0,n.jsx)("span",{className:"text-sm text-success",children:"已建立到 Backlog"}),B&&!z?(0,n.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[(0,n.jsx)(eK.$,{variant:"ghost",size:"sm",title:"已經有對應卡片,仍可再建一張",onClick:()=>{$(!0),C(null),v("")},children:"再建一張"}),(0,n.jsxs)(eK.$,{size:"sm",onClick:()=>{b(null),h(B)},children:[(0,n.jsx)(na.A,{}),"前往卡片"]})]}):(0,n.jsxs)("div",{className:"ml-auto flex flex-wrap items-center gap-2",children:[(0,n.jsxs)("select",{"aria-label":"建立到專案",value:j,onChange:e=>v(e.target.value),disabled:N,className:"h-9 max-w-56 rounded-md border border-input bg-background px-2 text-sm focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)("option",{value:"",children:"選擇專案…"}),j&&!d.some(e=>e.path===j)&&(0,n.jsx)("option",{value:j,children:j}),d.map(e=>(0,n.jsxs)("option",{value:e.path,children:[e.name," \xb7 ",e.path]},e.path))]}),(0,n.jsx)(P.K,{"aria-label":"從資料夾選擇專案",title:"從資料夾選擇專案",disabled:N,className:"rounded-md border border-border p-2",onClick:()=>void m().then(e=>{e&&v(e)}),children:(0,n.jsx)(ew.A,{className:"size-4"})}),(0,n.jsxs)(eK.$,{size:"sm",disabled:!j||N,title:j?void 0:"先選擇要建立到哪個專案",onClick:()=>void F(),children:[N?(0,n.jsx)(k.A,{className:"animate-spin"}):(0,n.jsx)(u.A,{}),N?"建立中…":"建立卡片"]})]})]}),children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsxs)("dl",{className:"grid grid-cols-[90px_minmax(0,1fr)] gap-2 text-sm",children:[(0,n.jsx)("dt",{className:"text-muted-foreground",children:"編號"}),(0,n.jsx)("dd",{children:(0,n.jsxs)("a",{href:I.url,target:"_blank",rel:"noopener noreferrer",onClick:e=>{e.preventDefault(),(0,D.kK)(I.url)},className:"inline-flex items-center gap-1 text-primary underline outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[I.key,(0,n.jsx)(ev.A,{className:"size-3"})]})}),(0,n.jsx)("dt",{className:"text-muted-foreground",children:"狀態"}),(0,n.jsx)("dd",{children:I.status.name}),(0,n.jsx)("dt",{className:"text-muted-foreground",children:"Story Points"}),(0,n.jsx)("dd",{children:I.storyPoints??"—"}),(0,n.jsx)("dt",{className:"text-muted-foreground",children:"期限"}),(0,n.jsx)("dd",{children:nw(I.dueDate).text}),(0,n.jsx)("dt",{className:"text-muted-foreground",children:"Sprint"}),(0,n.jsx)("dd",{children:I.sprint??"—"}),(0,n.jsx)("dt",{className:"text-muted-foreground",children:"優先度"}),(0,n.jsx)("dd",{children:I.priority??"—"}),I.parentKey&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("dt",{className:"text-muted-foreground",children:"Parent"}),(0,n.jsx)("dd",{children:(0,n.jsxs)("a",{href:`https://${e?.site}/browse/${I.parentKey}`,target:"_blank",rel:"noopener noreferrer",onClick:t=>{t.preventDefault(),(0,D.kK)(`https://${e?.site}/browse/${I.parentKey}`)},className:"inline-flex items-center gap-1 text-primary underline outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[I.parentKey,(0,n.jsx)(ev.A,{className:"size-3"})]})})]})]}),(0,n.jsx)("div",{className:"border-t border-border pt-4",children:I.description?(0,n.jsx)(eR.h,{source:I.description,compact:!0}):(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"沒有內文"})}),I.attachments.length>0&&(0,n.jsxs)("section",{className:"border-t border-border pt-4","aria-label":"附件",children:[(0,n.jsxs)("h3",{className:"mb-2 flex items-center gap-2 text-sm font-medium",children:[(0,n.jsx)(sK.A,{className:"size-4"}),"附件 ",(0,n.jsx)("span",{className:"text-xs tabular-nums text-muted-foreground",children:I.attachments.length})]}),(0,n.jsx)("ul",{className:"space-y-1.5",children:I.attachments.map(e=>(0,n.jsxs)("li",{className:"flex min-w-0 items-center gap-2 text-sm",children:[(0,n.jsx)("a",{href:e.url,target:"_blank",rel:"noopener noreferrer",title:e.filename,onClick:t=>{t.preventDefault(),(0,D.kK)(e.url)},className:"min-w-0 truncate text-primary underline outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",children:e.filename}),null!==e.size&&(0,n.jsx)("span",{className:"shrink-0 text-xs text-muted-foreground",children:function(e){if(e<1024)return`${e} B`;let t=e<1048576?"KB":e<0x40000000?"MB":"GB";return`${new Intl.NumberFormat("zh-TW",{maximumFractionDigits:1}).format(e/("KB"===t?1024:"MB"===t?1048576:0x40000000))} ${t}`}(e.size)})]},e.id))})]}),S&&(0,n.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:S})]})},I.key)})]})}let nC=[{id:"jira",label:"Jira"},{id:"issues",label:"Issues"},{id:"prs",label:"Pull Requests"}];function nS({view:e,onViewChange:t,tab:s,onTabChange:a,jira:i,github:l,githubFilters:o,onGithubFiltersChange:c,jiraCards:d,githubCards:u,projects:m,onBrowseProject:x,onCreateJira:h,onConvertGithub:f,onOpenTask:p,onOpenSettings:g}){let b=(0,r.useRef)([]),j={jira:i.inbox?.status==="ok"?i.inbox.tickets.length:null,issues:l.inbox?.status==="ok"?l.inbox.repos.reduce((e,t)=>e+t.issues.length,0):null,prs:l.inbox?.status==="ok"?l.inbox.repos.reduce((e,t)=>e+t.prs.length,0):null};return(0,n.jsxs)("div",{className:"flex h-full min-h-0 flex-col bg-background",children:[(0,n.jsx)("div",{className:"flex h-12 shrink-0 items-center border-b border-border px-5",children:(0,n.jsx)(I,{value:e,onChange:t})}),(0,n.jsx)("div",{role:"tablist","aria-label":"來源",className:"flex h-10 shrink-0 items-stretch gap-5 border-b border-border px-5",children:nC.map((e,t)=>(0,n.jsxs)("button",{ref:e=>{b.current[t]=e},type:"button",role:"tab","aria-selected":s===e.id,tabIndex:s===e.id?0:-1,onKeyDown:e=>((e,t)=>{let s="ArrowRight"===e.key?1:"ArrowLeft"===e.key?-1:0;if(!s)return;e.preventDefault();let n=(t+s+nC.length)%nC.length;b.current[n]?.focus(),a(nC[n].id)})(e,t),onClick:()=>a(e.id),className:(0,T.cn)("-mb-px flex items-center gap-1.5 border-b-2 px-1 text-sm font-medium outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",s===e.id?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),children:[e.label,null!==j[e.id]&&(0,n.jsx)("span",{className:"text-xs tabular-nums text-muted-foreground/80",children:j[e.id]})]},e.id))}),"jira"===s?(0,n.jsx)(nk,{...i,onRefresh:i.refresh,boardCards:d,projects:m,onBrowseProject:x,onCreate:h,onOpenTask:p,onOpenSettings:g}):(0,n.jsx)(nj,{view:e,onViewChange:t,inbox:l.inbox,loading:l.loading,error:l.error,onRefresh:l.refresh,filters:o[s],onFiltersChange:e=>c(s,e),boardCards:u,onConvert:f,onOpenTask:p,onOpenSettings:g,projects:m,onBrowseProject:x,sourceKind:s,embedded:!0})]})}var nA=s(4504);function nz({roomCode:e,peerCount:t,onClose:a,onStop:i}){let l=`https://vibe-flow-remote.vercel.app/?room=${e}`,[o,c]=(0,r.useState)(""),[d,u]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{let e=!0;return s.e(167).then(s.t.bind(s,20167,19)).then(({default:t})=>{t.toDataURL(l,{width:240,margin:2}).then(t=>{e&&c(t)})}),()=>{e=!1}},[l]),(0,n.jsxs)(e5.h,{title:"遠端控制",onClose:a,showHeader:!0,contentClassName:"max-w-xs",children:[(0,n.jsx)("div",{className:"mb-4 flex justify-center",children:o?(0,n.jsx)("img",{src:o,alt:"QR Code",width:200,height:200,className:"rounded-md"}):(0,n.jsx)("div",{className:"flex h-[200px] w-[200px] items-center justify-center rounded-md bg-muted",children:(0,n.jsx)("span",{className:"text-sm text-muted-foreground",children:"生成中…"})})}),(0,n.jsxs)("div",{className:"mb-3 text-center",children:[(0,n.jsx)("p",{className:"mb-1 text-sm text-muted-foreground",children:"Room Code"}),(0,n.jsx)("p",{className:"font-mono text-3xl font-bold tracking-widest",children:e})]}),(0,n.jsxs)("div",{className:"mb-4 flex items-center justify-center gap-1.5 text-sm text-muted-foreground",children:[(0,n.jsx)(nA.A,{className:"size-3"}),(0,n.jsx)("span",{children:t>0?`${t} 台裝置已連線`:"等待裝置連線…"})]}),(0,n.jsxs)("div",{className:"flex gap-2",children:[(0,n.jsxs)("button",{type:"button",onClick:function(){navigator.clipboard.writeText(l),u(!0),setTimeout(()=>u(!1),2e3)},className:"flex flex-1 items-center justify-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm text-muted-foreground outline-none transition-colors motion-reduce:transition-none hover:bg-accent hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[d?(0,n.jsx)(S.A,{className:"size-3.5"}):(0,n.jsx)(eA.A,{className:"size-3.5"}),d?"已複製":"複製連結"]}),(0,n.jsx)(eK.$,{size:"sm",variant:"destructive",onClick:i,children:"停止分享"})]})]})}function n$({toast:e,onOpen:t,onDismiss:s}){return(0,r.useEffect)(()=>{let t=setTimeout(()=>s(e.id),6e3);return()=>clearTimeout(t)},[e.id,s]),(0,n.jsxs)(d.PY1.li,{layout:!0,initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:8},transition:{duration:.15},className:"pointer-events-auto flex w-80 items-start gap-2 rounded-lg border border-border bg-popover p-3 text-popover-foreground shadow-lg",children:[(0,n.jsx)(sZ.A,{className:"mt-0.5 size-4 shrink-0 text-primary"}),(0,n.jsxs)("button",{type:"button",onClick:()=>{t(e.taskId),s(e.id)},className:"min-w-0 flex-1 rounded-sm text-left outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",children:[(0,n.jsx)("span",{className:"block truncate text-sm font-medium",children:e.title}),(0,n.jsx)("span",{className:"block text-sm text-muted-foreground",children:e.body})]}),(0,n.jsx)(P.K,{"aria-label":"關閉通知",onClick:()=>s(e.id),className:"size-5 p-0.5",children:(0,n.jsx)(eE.A,{className:"size-3.5"})})]})}function nE({toasts:e,onOpen:t,onDismiss:s}){return(0,n.jsx)("ol",{"aria-live":"polite","aria-label":"通知",className:"pointer-events-none fixed bottom-4 right-4 z-50 flex flex-col items-end gap-2",children:(0,n.jsx)(l.N,{initial:!1,children:e.map(e=>(0,n.jsx)(n$,{toast:e,onOpen:t,onDismiss:s},e.id))})})}function nP(e,t){return{capabilities:{createTask:!1},tasks:["backlog","in_progress","done"].flatMap(t=>e[t].map(e=>({id:e.id,title:e.title,description:e.description,projectName:e.projectName,column:t,launchedAt:e.launchedAt}))),workspaces:[],settings:{autoMode:t}}}let nT={backlog:[],in_progress:[],done:[]};function nR(e,t){for(let s of Object.values(e)){let e=s.find(e=>e.id===t);if(e)return e}return null}function nI(e,t){let s=new Set(t.map(e=>e.sessionKey));return[...t,...e.filter(e=>e.pending&&!s.has(e.sessionKey))]}function nD(){let[e,t]=(0,r.useState)(nT),[a,o]=(0,r.useState)({}),[c,d]=(0,r.useState)(s1()),[u,m]=(0,r.useState)([]),[x,h]=(0,r.useState)(null),[f,p]=(0,r.useState)(null),[g,b]=(0,r.useState)(null),[j,v]=(0,r.useState)(!1),[N,y]=(0,r.useState)(!0),[w,C]=(0,r.useState)(""),[S,A]=(0,r.useState)(""),[z,$]=(0,r.useState)([]),[E,P]=(0,r.useState)(!1),[T,R]=(0,r.useState)(!1),[I,K]=(0,r.useState)(!1),[B,F]=(0,r.useState)(null),[M,L]=(0,r.useState)(!1),[V,G]=(0,r.useState)(null),[O,H]=(0,r.useState)(null),[J,W]=(0,r.useState)(!1),[U,q]=(0,r.useState)(null),[Y,X]=(0,r.useState)(!1),[Q,Z]=(0,r.useState)(null),[ee,et]=(0,r.useState)([]),es=(0,r.useRef)(ee);es.current=ee;let[en,er]=(0,r.useState)(null),[ea,ei]=(0,r.useState)(!1),[el,eo]=(0,r.useState)("board"),[ec,ed]=(0,r.useState)({issues:e6,prs:e6}),[eu,em]=(0,r.useState)(null),[ex,eh]=(0,r.useState)("sprint"),[ef,ep]=(0,r.useState)([]);(0,r.useEffect)(()=>{let e=!0;return(0,D.C7)().then(s=>{let n,r,a,i,l,o;if(!e)return;s&&(t(s.board),y(s.settings.autoMode),C(s.settings.systemPrompt??""),A(s.settings.workstationPath??""),$(s.settings.jira?.storyPointsFields??[]),d(s1(s.settings.notifications)),et(e=>nI(e,s.terminals??[])));let c=(r=(n=new URLSearchParams(window.location.search)).get("view"),a=n.get("task")||null,r&&ts.includes(r)?{view:r,taskId:a}:{view:a?"workspace":"board",taskId:a});for(let e of(eo(c.view),Z(c.taskId),ta))try{window.localStorage.removeItem(e)}catch{}em((i=td(ti),tn.includes(i)?i:null)),eh("all"===(l=td(to))?l:"sprint"),ed({issues:tx((o=td(tl)??{}).issues),prs:tx(o.prs)}),P(!0)}),()=>{e=!1}},[]),(0,r.useEffect)(()=>(0,D.lz)(e=>{t(e.board),y(e.settings.autoMode),C(e.settings.systemPrompt??""),A(e.settings.workstationPath??""),$(e.settings.jira?.storyPointsFields??[]),d(s1(e.settings.notifications)),et(t=>nI(t,e.terminals??[]))}),[]),(0,r.useEffect)(()=>{let e;E&&(e=new URL(window.location.href),"board"!==el||Q?e.searchParams.set("view",el):e.searchParams.delete("view"),Q?e.searchParams.set("task",Q):e.searchParams.delete("task"),e.href!==window.location.href&&window.history.replaceState(window.history.state,"",e))},[E,el,Q]),(0,r.useEffect)(()=>{E&&tu(ti,eu)},[E,eu]),(0,r.useEffect)(()=>{E&&tu(to,ex)},[E,ex]),(0,r.useEffect)(()=>{E&&tu(tl,ec)},[E,ec]),(0,r.useEffect)(()=>(0,D.qX)(({taskId:e,progress:t})=>{o(s=>({...s,[e]:t}))}),[]),(0,r.useEffect)(()=>{let e=!0,t=(0,D._O)(h);return(0,D.Kg)().then(t=>{e&&h(t)}).catch(()=>{}),()=>{e=!1,t()}},[]);let eg=e.in_progress.map(e=>e.id).join(",");(0,r.useEffect)(()=>{let e=!0;for(let t of eg?eg.split(","):[])(0,D.y4)(t).then(s=>{e&&s&&o(e=>e[t]?e:{...e,[t]:s})});return()=>{e=!1}},[eg]),(0,r.useEffect)(()=>{let t=new Set(Object.values(e).flat().map(e=>e.id));Z(e=>e&&!t.has(e)?null:e)},[e]);let eb=()=>(0,D.It)("選擇專案資料夾"),ej=(e,t)=>{let s=`terminal_${window.crypto.randomUUID()}`;er(s),et(n=>[...n,{pending:!0,sessionKey:s,title:e?su(e):"~",...e?{projectPath:e}:{},...t?{taskId:t}:{}}]),eo("terminals")},ev=e=>{Z(e),eo("workspace")},eN=t=>{"workspace"===t&&!Q&&e.in_progress[0]&&Z(e.in_progress[0].id),eo(t)},ey=(0,r.useRef)(ev);ey.current=ev;let ew=(0,r.useRef)(Q);ew.current=Q;let ek=(0,r.useRef)(el);ek.current=el;let eC=(0,r.useRef)(c);eC.current=c;let eS=(0,r.useCallback)(e=>{m(t=>t.filter(t=>t.id!==e))},[]);(0,r.useEffect)(()=>{let e=0;return(0,D._5)(({taskId:t,title:s,notifications:n})=>{let r=eC.current;if(!r.enabled||"visible"===document.visibilityState&&document.hasFocus()&&"workspace"===ek.current&&ew.current===t)return;let a=n.map(n=>({id:`${Date.now()}-${e++}`,taskId:t,title:s,body:function(e){switch(e.kind){case"step_completed":return`完成 ${e.done}/${e.total} — ${e.item??""}`;case"all_completed":return"所有步驟已完成";case"waiting_input":return"permission"===e.waitingFor?"等待你允許權限":"等待你的輸入"}}(n)}));if(m(e=>[...e,...a].slice(-5)),r.desktop&&"u">typeof Notification&&"granted"===Notification.permission&&!document.hasFocus())for(let e of a){let s=new Notification(e.title,{body:e.body,tag:`${t}:${e.body}`});s.onclick=()=>{window.focus(),ey.current(t),s.close()}}})},[]);let eA=()=>{G(null),ei(!0)},ez=async(e,s)=>{let n,r=await (0,D.UT)({baseBranch:null,...(n=[e.url,e.body.trim()].filter(Boolean).join("\n\n"),{title:e.title,description:n,..."pr"===e.kind?{branch:e.headRefName,baseBranch:e.baseRefName}:{},github:{kind:e.kind,repo:e.repo,number:e.number,url:e.url}}),projectPath:s,autoMode:N});if(!r)throw Error("未連線到 VibeFlow core");return t(r.state.board),r.task.id},e$=async(e,t,s,n,r)=>{K(!0),F(null);try{await (0,D.oc)({systemPrompt:e,workstationPath:t||void 0,autoMode:s,notifications:n,jira:{storyPointsFields:r}}),C(e),A(t),y(s),d(n),$(r),R(!1)}catch(e){F(e instanceof Error?e.message:String(e))}finally{K(!1)}},eP=async e=>{L(!0),G(null);try{let s=await (0,D.UT)({...e,branch:e.branch||void 0,model:e.model||void 0});s&&(t(s.state.board),ei(!1),ev(s.task.id))}catch(e){G(e instanceof Error?e.message:String(e))}finally{L(!1)}},eT=async e=>{if(O){W(!0),q(null);try{let s=await (0,D.lC)({taskId:O.id,title:e.title,description:e.description,agentCli:e.agentCli,model:e.model||void 0,effort:e.effort,autoMode:e.autoMode,projectPath:e.projectPath,baseBranch:e.baseBranch,branch:e.branch,masterId:e.masterId});s&&t(s.board),H(null)}catch(e){q(e instanceof Error?e.message:String(e))}finally{W(!1)}}},eR=async e=>{let s=await (0,D._B)(e);s&&t(s.board)},eI=async e=>{let s=await (0,D.vq)(e);s&&(t(s.board),Z(t=>t===e?null:t))},eD=function(e,t){let[s,n]=(0,r.useState)(null),[a,i]=(0,r.useState)(!1),[l,o]=(0,r.useState)(null),c=(0,r.useRef)(0),d=(0,r.useCallback)(async e=>{let t=++c.current;i(!0),o(null);try{let s=await (0,D.K4)({force:e});t===c.current&&n(s)}catch(e){t===c.current&&o(e instanceof Error?e.message:String(e))}finally{t===c.current&&i(!1)}},[]),u=function(e){let t=new Set;for(let s of Object.values(e))for(let e of s)e.projectPath&&t.add(e.projectPath);return Array.from(t).sort().join("\n")}(e);return(0,r.useEffect)(()=>{t&&d(!1)},[t,u,d]),{inbox:s,loading:a,error:l,refresh:()=>d(!0),reload:()=>d(!1)}}(e,E),eK=function(e,t){let[s,n]=(0,r.useState)(null),[a,i]=(0,r.useState)(!1),[l,o]=(0,r.useState)(null),c=(0,r.useRef)(0),d=(0,r.useCallback)(async e=>{let s=++c.current;i(!0),o(null);try{let r=await (0,D.zh)({force:e,scope:t});s===c.current&&r&&n(e=>({scope:t,inbox:r.error&&e?.scope===t&&"ok"===e.inbox.status&&e.inbox.tickets.length?{...e.inbox,error:r.error}:r}))}catch(e){s===c.current&&o(e instanceof Error?e.message:String(e))}finally{s===c.current&&i(!1)}},[t]);return(0,r.useEffect)(()=>{e&&d(!1)},[e,d]),(0,r.useEffect)(()=>(0,D.y$)(e=>{("success"===e.type||"signed-out"===e.type)&&d(!0)}),[d]),{inbox:s?.scope===t?s.inbox:null,loading:a,error:l,refresh:()=>d(!0),reload:()=>d(!1)}}(E,ex),eB=function(e,t){let[s,n]=(0,r.useState)({}),a=(0,r.useRef)(0),i=(0,r.useCallback)(async e=>{let t=++a.current;try{let s=await (0,D._R)({force:e});t===a.current&&n(s)}catch{}},[]),l=function(e){let t=[];for(let s of Object.values(e))for(let e of s)t.push([e.id,e.projectPath,e.branch,e.provisionedAt??"",e.github?.number??"",e.outcome?.pr?.number??""].join("|"));return t.sort().join("\n")}(e);return(0,r.useEffect)(()=>{t&&i(!1)},[t,l,i]),{links:s,refresh:()=>i(!0)}}(e,E),eF=[...e.in_progress,...e.backlog,...e.done],e_=function(e){let t=new Map;for(let s of e)s.github&&t.set(_(s.github),s.id);return t}(eF),eM=function(e){let t=new Map;for(let s of e)s.jira&&!t.has(s.jira.key)&&t.set(s.jira.key,s.id);return t}(eF),eL=eu??(eK.inbox?.status==="ok"?"jira":"issues"),eV=Array.from(new Map([...eF.filter(e=>e.projectPath).map(e=>[e.projectPath,{path:e.projectPath,name:e.projectName??e.projectPath}]),...ef.filter(e=>!e.missing).map(e=>[e.path,{path:e.path,name:e.name}])]).values()).sort((e,t)=>e.name.localeCompare(t.name));(0,r.useEffect)(()=>{E&&(0,D.qe)().then(ep)},[E,e.backlog.length]);let eG=async(e,s)=>{let n={title:`${e.key} ${e.summary}`,description:[e.url,e.description].filter(Boolean).join("\n\n"),jira:{key:e.key,url:e.url,site:new URL(e.url).host}},r=await (0,D.UT)({...n,projectPath:s,baseBranch:null,autoMode:N});if(!r)throw Error("未連線到 VibeFlow core");return t(r.state.board),r.task.id},eO=function({board:e,autoMode:t,onStateChange:n}){let[a,i]=(0,r.useState)(null),[l,o]=(0,r.useState)(0),c=(0,r.useRef)(new Set),d=(0,r.useRef)(new Map),u=(0,r.useRef)(e),m=(0,r.useRef)(t),x=(0,r.useRef)(n);async function h(e,t){if(!e||"object"!=typeof e)return;let{type:s,payload:n}=e;switch(s){case"client:get-state":try{t.send({type:"vf:state",payload:nP(u.current,m.current)})}catch{}break;case"client:send-command":{let{taskId:e,text:t}=n??{};if(!e||!t)break;(0,D.zj)(e,String(t).slice(0,1e3));break}case"client:subscribe-terminal":{let{taskId:e}=n??{};if(!e)break;let s=d.current.get(e);s||(s=new Set,d.current.set(e,s)),s.add(t);break}case"client:unsubscribe-terminal":{let{taskId:e}=n??{};e&&d.current.get(e)?.delete(t);break}case"client:move-task":{let{taskId:e,targetColumn:t}=n??{};if(!e||!t)break;let s=function(e,t,s){let n,r={...e};for(let e of["backlog","in_progress","done"]){let s=r[e].findIndex(e=>e.id===t);if(-1!==s){n=r[e][s],r[e]=r[e].filter(e=>e.id!==t);break}}return n?(r[s]=[n,...r[s]],r):e}(u.current,e,t);x.current(s),await (0,D.BO)(s)}}}return(0,r.useEffect)(()=>{u.current=e},[e]),(0,r.useEffect)(()=>{m.current=t},[t]),(0,r.useEffect)(()=>{x.current=n},[n]),(0,r.useEffect)(()=>{if(!c.current.size)return;let s=nP(e,t);for(let e of c.current)try{e.send({type:"vf:state",payload:s})}catch{}},[e,t]),(0,r.useEffect)(()=>{let e;if(!a)return;let t=!1;return async function(){let{Peer:n}=await s.e(1886).then(s.bind(s,11886));t||((e=new n(`vibeflow-${a}`)).on("connection",e=>{c.current.add(e),o(e=>e+1),e.on("open",()=>{(async()=>{try{e.send({type:"vf:hello",payload:{version:"1.0"}}),e.send({type:"vf:state",payload:nP(u.current,m.current)})}catch{}})()}),e.on("data",t=>{h(t,e)}),e.on("close",()=>{for(let[,t]of(c.current.delete(e),o(e=>e-1),d.current))t.delete(e)})}),e.on("error",e=>{console.error("[VibeFlow Remote] PeerJS error:",e)}))}(),()=>{for(let e of(t=!0,c.current))try{e.close()}catch{}c.current.clear(),d.current.clear(),o(0),e?.destroy()}},[a]),(0,r.useEffect)(()=>{if(a)return(0,D.Qk)(({sessionKey:e,data:t})=>{let s=e.split(":")[0],n=d.current.get(s);if(!n?.size)return;let r={type:"vf:terminal-chunk",payload:{taskId:s,data:t}};for(let e of n)try{e.send(r)}catch{}})},[a]),{roomCode:a,peerCount:l,startSharing:()=>{i(String(Math.floor(1e5+9e5*Math.random())))},stopSharing:()=>i(null)}}({board:e,autoMode:N,onStateChange:e=>{t(e),(0,D.BO)(e)}});return(0,n.jsxs)(r.Fragment,{children:[(0,n.jsx)(i(),{children:(0,n.jsx)("title",{children:"VibeFlow"})}),(0,n.jsx)("div",{className:"bg-background text-foreground",children:E?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"flex h-screen overflow-hidden",children:[(0,n.jsx)(nr,{view:el,onSelectView:eN,onNewTask:eA,remoteActive:!!eO.roomCode,onOpenSettings:()=>{F(null),R(!0)}}),(0,n.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col overflow-hidden",children:[x&&f!==x.latestVersion&&(0,n.jsxs)("div",{role:"status",className:"flex items-center gap-3 border-b border-border bg-primary/10 px-4 py-2 text-sm",children:[(0,n.jsxs)("span",{className:"min-w-0 flex-1",children:[x.installedVersion?(0,n.jsxs)(n.Fragment,{children:["VibeFlow v",x.installedVersion," 已安裝,但 host 沒有自動重新啟動:",x.restartBlocked,"。 要立即使用新版,請執行 ",(0,n.jsx)("code",{children:"vibeflow shutdown"})," 後再執行 ",(0,n.jsx)("code",{children:"vibeflow"}),"。"]}):(0,n.jsxs)(n.Fragment,{children:["VibeFlow v",x.latestVersion," 已發布(目前 v",x.currentVersion,")。 按下更新會開啟系統終端機執行更新指令(Windows:",(0,n.jsx)("code",{children:"vibeflow update"}),";其他平台:",(0,n.jsx)("code",{children:"sudo vibeflow update"}),")。安裝完成後 host 會自動重新啟動。"]}),g&&(0,n.jsx)("span",{role:"alert",className:"block text-destructive",children:g})]}),!x.installedVersion&&(0,n.jsx)("button",{type:"button",disabled:j,onClick:()=>{v(!0),b(null),(0,D.Qb)().catch(e=>{b(e instanceof Error?e.message:"無法開啟更新終端機")}).finally(()=>v(!1))},className:"shrink-0 rounded-sm border border-border bg-background px-3 py-1 hover:bg-accent focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:opacity-50",children:j?"開啟中…":"更新 VibeFlow"}),(0,n.jsx)("button",{type:"button","aria-label":"關閉更新提示",onClick:()=>p(x.latestVersion),className:"rounded-sm p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50",children:(0,n.jsx)(eE.A,{className:"size-4"})})]}),(0,n.jsxs)("div",{className:"min-h-0 flex-1",children:[(0,n.jsx)("div",{className:"terminals"===el?"hidden":"h-full",children:(0,n.jsx)(si,{onSelectTask:ev,onNewTask:eA,board:e,onBoardChange:e=>{t(e),(0,D.BO)(e)},onEditTask:t=>{q(null),e.backlog.some(e=>e.id===t)&&H(nR(e,t))},onTaskDone:eR,onDeleteTask:eI,onOpenTaskTerminal:t=>{let s=nR(e,t);s?.projectPath&&ej(s.projectPath,t)},taskTerminals:ee,onShowTaskTerminal:e=>{er(e),eo("terminals")},progress:a,selectedTaskId:Q,view:el,onViewChange:eN,taskLinks:eB.links,githubView:(0,n.jsx)(nS,{view:el,onViewChange:eN,tab:eL,onTabChange:em,jira:{...eK,scope:ex,onScopeChange:eh},github:{...eD,refresh:()=>{eD.refresh(),eB.refresh()}},githubFilters:ec,onGithubFiltersChange:(e,t)=>ed(s=>({...s,[e]:t})),jiraCards:eM,githubCards:e_,projects:eV,onBrowseProject:eb,onCreateJira:eG,onConvertGithub:ez,onOpenTask:ev,onOpenSettings:()=>{F(null),R(!0)}})})}),(0,n.jsx)("div",{className:"terminals"===el?"h-full":"hidden",children:(0,n.jsx)(sh,{view:el,onViewChange:eN,terminals:ee,taskWorktreePaths:Object.fromEntries([...e.in_progress,...e.done].filter(e=>e.worktreePath).map(e=>[e.id,e.worktreePath])),focusedSessionKey:en,recentProjects:ef,onCreate:e=>ej(e),onRename:(e,t)=>{let s=es.current.find(t=>t.sessionKey===e);et(s=>s.map(s=>s.sessionKey===e?{...s,title:t}:s)),s&&!s.pending&&(0,D.Yq)(e,t).catch(()=>{})},onStarted:e=>{let t=es.current.find(t=>t.sessionKey===e);t?.pending&&(et(t=>t.map(t=>t.sessionKey===e?(({pending:e,...t})=>t)(t):t)),(0,D.Yq)(e,t.title).catch(()=>{}))},onClose:e=>{(0,D.Vz)(e),et(t=>t.filter(t=>t.sessionKey!==e)),er(t=>t===e?null:t)},onBrowse:eb})})]})]})]}),(0,n.jsx)(l.N,{children:ea&&(0,n.jsx)(sF,{creating:M,error:V,pickFolder:eb,loadRecentProjects:D.qe,loadGitInfo:D.jT,initRepository:D.zY,detectAgents:D.KG,defaultAutoMode:N,workstationPath:S,masters:[...e.in_progress,...e.backlog].filter(e=>"master"===e.role).map(e=>({id:e.id,title:e.title})),onSubmit:eP,onClose:()=>ei(!1)},"new-task-dialog")}),(0,n.jsx)(sD,{task:O,defaultAutoMode:N,detectAgents:D.KG,pickFolder:eb,loadRecentProjects:D.qe,loadGitInfo:D.jT,saving:J,error:U,masters:[...e.in_progress,...e.backlog].filter(e=>"master"===e.role).map(e=>({id:e.id,title:e.title})),onSubmit:eT,onClose:()=>H(null)}),(0,n.jsx)(s8,{open:T,systemPrompt:w,workstationPath:S,autoMode:N,notifications:c,jiraStoryPointsFields:z,saving:I,error:B,onSave:e$,onPickFolder:()=>(0,D.It)("選擇工作區資料夾"),onClose:()=>R(!1)}),(0,n.jsx)(l.N,{children:M&&(0,n.jsx)(e5.h,{title:"建立任務中",saving:!0,onClose:()=>{},contentClassName:"max-w-sm rounded-lg p-5",children:(0,n.jsx)("div",{className:"space-y-4",children:(0,n.jsxs)("div",{className:"flex items-start gap-3",children:[(0,n.jsx)("span",{className:"mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-full bg-primary/15 text-primary",children:(0,n.jsx)(k.A,{className:"size-5 animate-spin"})}),(0,n.jsxs)("div",{className:"min-w-0 space-y-1",children:[(0,n.jsx)("h2",{className:"text-lg font-semibold tracking-tight",children:"正在建立 workspace"}),(0,n.jsx)("p",{className:"text-base leading-6 text-muted-foreground",children:"正在建立 git worktree、分支與任務資料。完成前請先不要切換或操作其他任務。"})]})]})})},"creating-task-dialog")}),(0,n.jsx)(l.N,{children:Y&&eO.roomCode&&(0,n.jsx)(nz,{roomCode:eO.roomCode,peerCount:eO.peerCount,onClose:()=>X(!1),onStop:()=>{eO.stopSharing(),X(!1)}},"remote-share-dialog")}),(0,n.jsx)(nE,{toasts:u,onOpen:e=>ey.current(e),onDismiss:eS})]}):(0,n.jsx)("div",{className:"flex min-h-screen items-center justify-center bg-background text-base text-muted-foreground",children:"載入中…"})})]})}},86570:(e,t,s)=>{"use strict";s.d(t,{p:()=>d});var n=s(26514),r=s(18921),a=s(79608),i=s(75834),l=s(4416);let o={scale:1,x:0,y:0};function c(e,t,s){return Math.min(s,Math.max(t,e))}function d({src:e,alt:t,className:s}){let u=(0,i.useRef)(null),m=(0,i.useRef)(null),x=(0,i.useRef)(null),[h,f]=(0,i.useState)(o),[p,g]=(0,i.useState)(!1),b=(0,i.useCallback)((e,t,s)=>{let n=u.current,r=m.current;if(!n||!r)return{x:e,y:t};let a=Math.max(0,(r.offsetWidth*s-n.clientWidth)/2),i=Math.max(0,(r.offsetHeight*s-n.clientHeight)/2);return{x:c(e,-a,a),y:c(t,-i,i)}},[]),j=(0,i.useCallback)((e,t=0,s=0)=>{f(n=>{let r=c(e(n.scale),1,6);return r===n.scale?n:{scale:r,...b(t-(t-n.x)*r/n.scale,s-(s-n.y)*r/n.scale,r)}})},[b]);(0,i.useEffect)(()=>{f(o)},[e]),(0,i.useEffect)(()=>{let e=u.current;if(!e)return;let t=t=>{t.preventDefault();let s=e.getBoundingClientRect();j(e=>e*Math.exp(-(.0015*t.deltaY)),t.clientX-s.left-s.width/2,t.clientY-s.top-s.height/2)};return e.addEventListener("wheel",t,{passive:!1}),()=>e.removeEventListener("wheel",t)},[j]),(0,i.useEffect)(()=>{let e=()=>f(e=>({...e,...b(e.x,e.y,e.scale)}));return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[b]);let v=h.scale>1,N=e=>{x.current?.pointerId===e.pointerId&&(x.current=null,g(!1))};return(0,n.jsxs)("div",{className:(0,l.cn)("space-y-3",s),children:[(0,n.jsx)("div",{ref:u,onPointerDown:e=>{v&&0===e.button&&(e.currentTarget.setPointerCapture(e.pointerId),x.current={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,originX:h.x,originY:h.y},g(!0))},onPointerMove:e=>{let t=x.current;if(!t||t.pointerId!==e.pointerId)return;let s=t.originX+(e.clientX-t.startX),n=t.originY+(e.clientY-t.startY);f(e=>({...e,...b(s,n,e.scale)}))},onPointerUp:N,onPointerCancel:N,className:(0,l.cn)("flex h-[min(60vh,520px)] touch-none select-none items-center justify-center overflow-hidden rounded-md bg-muted/20",v&&(p?"cursor-grabbing":"cursor-grab")),children:(0,n.jsx)("img",{ref:m,src:e,alt:t,draggable:!1,className:"max-h-full max-w-full object-contain",style:{transform:`translate(${h.x}px, ${h.y}px) scale(${h.scale})`}})}),(0,n.jsxs)("div",{className:"flex items-center gap-3 px-1",children:[(0,n.jsx)(r.A,{className:"size-3.5 shrink-0 text-muted-foreground"}),(0,n.jsx)("input",{type:"range",min:1,max:6,step:.05,value:h.scale,onChange:e=>{let t=Number(e.target.value);j(()=>t)},"aria-label":"縮放圖片",className:"h-4 min-w-0 flex-1 cursor-pointer accent-primary outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"}),(0,n.jsx)(a.A,{className:"size-3.5 shrink-0 text-muted-foreground"})]}),(0,n.jsx)("p",{className:"px-1 text-xs text-muted-foreground",children:"滑桿或滾輪縮放,放大後可拖曳圖片平移。"})]})}}},e=>{e.O(0,[5174,636,6593,8792],()=>e(e.s=24464)),_N_E=e.O()}]);