idea-manager 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/build-manifest.json +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/advisor-actions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/archive/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/filesystem/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/filesystem/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/global-advisor/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/global-memo/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/maintenance/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/advisor/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/apply-distribute/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/auto-distribute/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/brainstorm/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/git-sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/sub-projects/[subId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/chat/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/prompt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/refine/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/reorder/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/sub-projects/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/move/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page.js +7 -7
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/projects/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +4 -4
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +2 -2
- package/.next/static/chunks/app/{page-92e516361aff0ece.js → page-16b10bcc10c22811.js} +8 -8
- package/package.json +1 -1
- package/src/components/task/NoteEditor.tsx +63 -2
- /package/.next/static/{hhAzw58XbAFfL_Ly5sk13 → E6_zErdSfG_2YXZzHtQ34}/_buildManifest.js +0 -0
- /package/.next/static/{hhAzw58XbAFfL_Ly5sk13 → E6_zErdSfG_2YXZzHtQ34}/_ssgManifest.js +0 -0
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{3915:(e,t,r)=>{Promise.resolve().then(r.bind(r,9770))},9770:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>e5});var s=r(5155),n=r(2115);let a={id:"dashboard",type:"dashboard"};function o(e){return e.some(e=>"dashboard"===e.id)?e:[a,...e]}function l(e,t){switch(t.type){case"OPEN_PROJECT":{let r=e.tabs.find(e=>e.projectId===t.projectId);if(r)return{tabs:e.tabs.map(e=>e.id===r.id?{...e,initialSubId:t.initialSubId,initialTaskId:t.initialTaskId}:e),activeTabId:r.id};let s={id:t.projectId,type:"project",projectId:t.projectId,projectName:t.projectName,initialSubId:t.initialSubId,initialTaskId:t.initialTaskId};return{tabs:[...e.tabs,s],activeTabId:s.id}}case"CLOSE_TAB":{if("dashboard"===t.tabId)return e;let r=e.tabs.findIndex(e=>e.id===t.tabId),s=e.tabs.filter(e=>e.id!==t.tabId),n=e.activeTabId;return e.activeTabId===t.tabId&&(n=s[Math.max(0,r-1)]?.id||"dashboard"),{tabs:o(s),activeTabId:n}}case"SET_ACTIVE":return{...e,activeTabId:t.tabId};case"UPDATE_TAB_NAME":return{...e,tabs:e.tabs.map(e=>e.id===t.tabId?{...e,projectName:t.name}:e)};case"CONSUME_INITIAL":return{...e,tabs:e.tabs.map(e=>e.id===t.tabId?{...e,initialSubId:void 0,initialTaskId:void 0}:e)};case"HYDRATE":return{tabs:o(t.state.tabs),activeTabId:t.state.activeTabId};default:return e}}let i="im-tabs",d={tabs:[a],activeTabId:"dashboard"};function c(){return d}let u=(0,n.createContext)(null);function x(){let e=(0,n.useContext)(u);if(!e)throw Error("useTabContext must be used within TabProvider");return e}function m({children:e}){let[t,r]=(0,n.useReducer)(l,void 0,c);(0,n.useEffect)(()=>{try{let e=localStorage.getItem(i);if(e){let t=JSON.parse(e);r({type:"HYDRATE",state:{tabs:o(t.tabs),activeTabId:t.activeTabId}})}}catch{}},[]),(0,n.useEffect)(()=>{localStorage.setItem(i,JSON.stringify(t))},[t]),(0,n.useEffect)(()=>{let e=t.tabs.find(e=>e.id===t.activeTabId);if(!e)return;let r="dashboard"===e.type?"/":`/projects/${e.projectId}`;window.location.pathname!==r&&window.history.replaceState(null,"",r)},[t.activeTabId,t.tabs]),(0,n.useEffect)(()=>{let e=window.location.pathname.match(/^\/projects\/(.+)$/);if(e){let s=e[1];t.tabs.some(e=>e.projectId===s)?r({type:"SET_ACTIVE",tabId:s}):fetch(`/api/projects/${s}`).then(e=>e.ok?e.json():null).then(e=>{e&&r({type:"OPEN_PROJECT",projectId:s,projectName:e.name})})}let s=sessionStorage.getItem("im-open-project");s&&(sessionStorage.removeItem("im-open-project"),fetch(`/api/projects/${s}`).then(e=>e.ok?e.json():null).then(e=>{e&&r({type:"OPEN_PROJECT",projectId:s,projectName:e.name})}))},[]);let a=(0,n.useCallback)((e,t,s,n)=>{r({type:"OPEN_PROJECT",projectId:e,projectName:t,initialSubId:s,initialTaskId:n})},[]),d=(0,n.useCallback)(e=>{r({type:"CLOSE_TAB",tabId:e})},[]),x=(0,n.useCallback)(e=>{r({type:"SET_ACTIVE",tabId:e})},[]),m=(0,n.useCallback)((e,t)=>{r({type:"UPDATE_TAB_NAME",tabId:e,name:t})},[]),p=(0,n.useCallback)(e=>{r({type:"CONSUME_INITIAL",tabId:e})},[]),h=(0,n.useCallback)(()=>{let e=t.tabs.findIndex(e=>e.id===t.activeTabId),s=t.tabs[(e+1)%t.tabs.length];s&&r({type:"SET_ACTIVE",tabId:s.id})},[t.tabs,t.activeTabId]),f=(0,n.useCallback)(()=>{let e=t.tabs.findIndex(e=>e.id===t.activeTabId),s=t.tabs[(e-1+t.tabs.length)%t.tabs.length];s&&r({type:"SET_ACTIVE",tabId:s.id})},[t.tabs,t.activeTabId]);return(0,n.useEffect)(()=>{let e=e=>{e.ctrlKey&&"Tab"===e.key&&(e.preventDefault(),e.shiftKey?f():h())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[h,f]),(0,s.jsx)(u.Provider,{value:{state:t,openProject:a,closeTab:d,setActiveTab:x,updateTabName:m,consumeInitial:p,nextTab:h,prevTab:f},children:e})}let p=[{id:"dark",name:"Dark",emoji:"\uD83C\uDF11",colors:{"--background":"224 20% 10%","--foreground":"210 40% 98%","--card":"224 20% 13%","--card-hover":"220 15% 18%","--border":"220 15% 28%","--input":"220 15% 24%","--primary":"210 85% 60%","--primary-hover":"210 85% 50%","--accent":"265 70% 60%","--success":"142 71% 45%","--warning":"38 92% 50%","--destructive":"0 70% 55%","--muted":"220 15% 20%","--muted-foreground":"215 15% 60%"}},{id:"light",name:"Light",emoji:"☀️",colors:{"--background":"0 0% 97%","--foreground":"224 20% 14%","--card":"0 0% 100%","--card-hover":"220 15% 96%","--border":"220 15% 85%","--input":"220 15% 92%","--primary":"210 85% 50%","--primary-hover":"210 85% 42%","--accent":"265 70% 55%","--success":"142 71% 40%","--warning":"38 92% 45%","--destructive":"0 70% 50%","--muted":"220 15% 92%","--muted-foreground":"215 15% 45%"}},{id:"nord",name:"Nord",emoji:"❄️",colors:{"--background":"220 16% 16%","--foreground":"219 28% 88%","--card":"220 16% 20%","--card-hover":"220 16% 24%","--border":"220 16% 30%","--input":"220 16% 26%","--primary":"193 43% 60%","--primary-hover":"193 43% 50%","--accent":"311 20% 63%","--success":"92 28% 55%","--warning":"40 71% 73%","--destructive":"354 42% 56%","--muted":"220 16% 24%","--muted-foreground":"219 20% 55%"}},{id:"ocean",name:"Ocean",emoji:"\uD83C\uDF0A",colors:{"--background":"210 50% 8%","--foreground":"200 40% 95%","--card":"210 45% 12%","--card-hover":"210 40% 17%","--border":"210 35% 25%","--input":"210 40% 20%","--primary":"190 80% 55%","--primary-hover":"190 80% 45%","--accent":"170 60% 50%","--success":"160 60% 45%","--warning":"38 90% 50%","--destructive":"0 65% 55%","--muted":"210 40% 18%","--muted-foreground":"200 25% 55%"}},{id:"forest",name:"Forest",emoji:"\uD83C\uDF32",colors:{"--background":"150 20% 9%","--foreground":"140 20% 92%","--card":"150 18% 13%","--card-hover":"150 15% 18%","--border":"150 12% 26%","--input":"150 15% 22%","--primary":"142 50% 55%","--primary-hover":"142 50% 45%","--accent":"80 45% 55%","--success":"142 60% 45%","--warning":"45 85% 50%","--destructive":"0 60% 52%","--muted":"150 15% 18%","--muted-foreground":"140 12% 52%"}},{id:"sunset",name:"Sunset",emoji:"\uD83C\uDF05",colors:{"--background":"15 20% 10%","--foreground":"30 30% 93%","--card":"15 18% 14%","--card-hover":"15 15% 19%","--border":"15 12% 27%","--input":"15 15% 22%","--primary":"25 90% 58%","--primary-hover":"25 90% 48%","--accent":"340 65% 58%","--success":"142 55% 45%","--warning":"45 90% 52%","--destructive":"0 70% 55%","--muted":"15 15% 19%","--muted-foreground":"20 12% 52%"}},{id:"lavender",name:"Lavender",emoji:"\uD83D\uDC9C",colors:{"--background":"270 20% 10%","--foreground":"260 30% 93%","--card":"270 18% 14%","--card-hover":"270 15% 19%","--border":"270 12% 28%","--input":"270 15% 23%","--primary":"265 70% 62%","--primary-hover":"265 70% 52%","--accent":"320 55% 58%","--success":"142 55% 45%","--warning":"38 85% 52%","--destructive":"0 65% 55%","--muted":"270 15% 19%","--muted-foreground":"260 12% 52%"}},{id:"rose",name:"Ros\xe9",emoji:"\uD83C\uDF37",colors:{"--background":"0 0% 96%","--foreground":"340 20% 18%","--card":"0 0% 100%","--card-hover":"340 20% 95%","--border":"340 15% 85%","--input":"340 15% 91%","--primary":"340 75% 55%","--primary-hover":"340 75% 45%","--accent":"300 50% 55%","--success":"142 55% 42%","--warning":"38 85% 48%","--destructive":"0 70% 50%","--muted":"340 15% 91%","--muted-foreground":"340 12% 48%"}}];function h(e){return p.find(t=>t.id===e)??p[0]}let f="im-theme",b=(0,n.createContext)(null);function g(e){let t=document.documentElement;for(let[r,s]of Object.entries(e.colors))t.style.setProperty(r,s)}function j({children:e}){let[t,r]=(0,n.useState)(h("dark")),[a,o]=(0,n.useState)(!1);(0,n.useEffect)(()=>{let e=localStorage.getItem(f);if(e){let t=h(e);r(t),g(t)}o(!0)},[]),(0,n.useEffect)(()=>{a&&g(t)},[t,a]);let l=(0,n.useCallback)(e=>{r(h(e)),localStorage.setItem(f,e)},[]);return(0,s.jsx)(b.Provider,{value:{theme:t,setTheme:l,themes:p},children:e})}var y=r(7650);function v(){let{theme:e,setTheme:t,themes:r}=function(){let e=(0,n.useContext)(b);if(!e)throw Error("useTheme must be used within ThemeProvider");return e}(),[a,o]=(0,n.useState)(!1),l=(0,n.useRef)(null),i=(0,n.useRef)(null),[d,c]=(0,n.useState)({top:0,right:0}),u=(0,n.useCallback)(()=>{if(!l.current)return;let e=l.current.getBoundingClientRect();c({top:e.bottom+6,right:window.innerWidth-e.right})},[]);return(0,n.useEffect)(()=>{if(!a)return;u();let e=e=>{let t=e.target;l.current?.contains(t)||i.current?.contains(t)||o(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[a,u]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("button",{ref:l,className:"theme-picker-btn",onClick:()=>o(!a),title:"테마 변경",children:[(0,s.jsx)("span",{className:"theme-picker-preview",style:{background:`hsl(${e.colors["--primary"]})`}}),(0,s.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"3"}),(0,s.jsx)("path",{d:"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"})]})]}),a&&(0,y.createPortal)((0,s.jsxs)("div",{ref:i,className:"theme-picker-dropdown",style:{position:"fixed",top:d.top,right:d.right},children:[(0,s.jsx)("div",{className:"theme-picker-title",children:"테마"}),(0,s.jsx)("div",{className:"theme-picker-grid",children:r.map(r=>(0,s.jsxs)("button",{className:`theme-picker-item ${r.id===e.id?"theme-picker-item-active":""}`,onClick:()=>{t(r.id),o(!1)},children:[(0,s.jsxs)("div",{className:"theme-picker-swatch",children:[(0,s.jsx)("div",{style:{background:`hsl(${r.colors["--background"]})`,flex:1}}),(0,s.jsx)("div",{style:{background:`hsl(${r.colors["--primary"]})`,flex:1}}),(0,s.jsx)("div",{style:{background:`hsl(${r.colors["--accent"]})`,flex:1}})]}),(0,s.jsxs)("span",{className:"theme-picker-name",children:[r.emoji," ",r.name]})]},r.id))})]}),document.body)]})}let N="im-update-dismissed";function k(){let[e,t]=(0,n.useState)(null),[r,a]=(0,n.useState)(!1),[o,l]=(0,n.useState)(!1),[i,d]=(0,n.useState)(!1),[c,u]=(0,n.useState)(null),x=(0,n.useRef)(null);(0,n.useEffect)(()=>{x.current=localStorage.getItem(N)},[]);let m=(0,n.useCallback)(async()=>{try{let e=await fetch("/api/version");if(!e.ok)return;let r=await e.json();t(r)}catch{}},[]);(0,n.useEffect)(()=>{m();let e=setInterval(m,36e5);return()=>clearInterval(e)},[m]);let p=e?.latest!==null&&e?.latest===x.current,h=!!e?.updateAvailable&&!p,f=(0,n.useCallback)(async()=>{l(!0),u(null);try{let e=await fetch("/api/update",{method:"POST"}),t=await e.json();u(t),t.ok&&(d(!0),await m())}catch(e){u({ok:!1,error:e instanceof Error?e.message:"Network error"})}finally{l(!1)}},[m]),b=(0,n.useCallback)(()=>{if(e?.latest){try{localStorage.setItem(N,e.latest)}catch{}x.current=e.latest}t(e=>e?{...e,updateAvailable:!1}:e)},[e?.latest]);return(0,s.jsxs)(s.Fragment,{children:[h?(0,s.jsxs)("button",{onClick:()=>a(!0),title:`IM v${e?.latest} 업데이트 가능 (현재 ${e?.current})`,className:"text-xs px-2 py-1 rounded-md border border-success/40 bg-success/15 text-success hover:bg-success/25 transition-colors flex items-center gap-1.5 mr-2",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-success animate-pulse"}),"v",e?.latest," 업데이트"]}):e?(0,s.jsxs)("button",{onClick:()=>a(!0),title:`현재 IM v${e.current} \xb7 업데이트 확인`,className:"text-[10px] px-1.5 py-0.5 rounded text-muted-foreground/60 hover:text-muted-foreground transition-colors mr-2",children:["v",e.current]}):null,r&&(0,s.jsx)("div",{onClick:()=>!o&&a(!1),className:"fixed inset-0 z-[60] flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(3px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-md animate-dialog-in p-5 flex flex-col gap-3",children:[(0,s.jsxs)("div",{className:"flex items-start justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-sm font-semibold text-foreground",children:"IM 업데이트"}),(0,s.jsxs)("div",{className:"text-xs text-muted-foreground mt-0.5",children:["현재 ",(0,s.jsxs)("span",{className:"text-foreground font-mono",children:["v",e?.current]}),e?.latest&&(0,s.jsxs)(s.Fragment,{children:[" → ",(0,s.jsxs)("span",{className:`font-mono ${e.updateAvailable?"text-success":"text-foreground"}`,children:["v",e.latest]})]})]})]}),!o&&(0,s.jsx)("button",{onClick:()=>a(!1),className:"text-muted-foreground hover:text-foreground text-lg leading-none",children:"\xd7"})]}),i?(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("div",{className:"text-sm text-success flex items-center gap-2",children:[(0,s.jsx)("span",{children:"✓"}),(0,s.jsx)("span",{children:"설치 완료"}),c?.durationMs&&(0,s.jsxs)("span",{className:"text-xs text-muted-foreground",children:["(",Math.round(c.durationMs/1e3),"s)"]})]}),(0,s.jsxs)("div",{className:"text-xs text-muted-foreground leading-relaxed",children:["새 버전을 반영하려면 ",(0,s.jsx)("span",{className:"font-mono text-foreground",children:"im start"})," 프로세스를 재시작하세요. PM2로 실행 중이면 ",(0,s.jsx)("span",{className:"font-mono text-foreground",children:"pm2 restart idea-manager"}),"로 즉시 반영됩니다."]})]}):o?(0,s.jsxs)("div",{className:"flex items-center gap-2 text-sm text-foreground",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),(0,s.jsx)("span",{children:"설치 중… (최대 3분)"})]}):e?.updateAvailable?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"text-xs text-muted-foreground leading-relaxed",children:[(0,s.jsx)("span",{className:"font-mono",children:"npm install -g idea-manager@latest"}),"를 실행해 최신 버전을 설치합니다. 설치가 끝나면 재시작 안내가 표시됩니다."]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2 mt-1",children:[(0,s.jsx)("button",{onClick:b,className:"text-xs text-muted-foreground px-2 py-1 hover:text-foreground transition-colors",children:"이 버전 건너뜀"}),(0,s.jsx)("button",{onClick:f,className:"text-xs px-3 py-1.5 bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity",children:"지금 설치"})]})]}):(0,s.jsx)("div",{className:"text-xs text-muted-foreground",children:"최신 버전을 사용 중입니다."}),c&&!c.ok&&(0,s.jsxs)("div",{className:"mt-2 flex flex-col gap-1.5",children:[(0,s.jsxs)("div",{className:"text-xs text-destructive",children:["⚠ 설치 실패",void 0!==c.code&&null!==c.code?` (exit ${c.code})`:""]}),(c.stderr||c.error)&&(0,s.jsx)("pre",{className:"text-[10px] bg-muted/50 border border-border rounded p-2 max-h-40 overflow-auto whitespace-pre-wrap break-words text-muted-foreground",children:c.stderr||c.error})]})]})})]})}let w=[],C=new Set;function S(){for(let e of C)e()}function E(e){w=[...w,e],S()}function T(e){w=w.filter(t=>t.id!==e),S()}function I(){return w}function $(e){return C.add(e),()=>{C.delete(e)}}let P={refine:"⌘K Refine","task-chat":"Note Assistant","project-advisor":"Project Advisor","global-advisor":"Global Advisor",watch:"Watch"};function A(){let e=(0,n.useSyncExternalStore)($,I,I),[,t]=(0,n.useState)(0),[r,a]=(0,n.useState)(!1);return((0,n.useEffect)(()=>{if(0===e.length)return;let r=setInterval(()=>t(e=>e+1),1e3);return()=>clearInterval(r)},[e.length]),0===e.length)?null:(0,s.jsxs)("div",{className:"relative mr-2",children:[(0,s.jsxs)("button",{onClick:()=>a(e=>!e),className:"flex items-center gap-1.5 text-xs px-2 py-1 rounded-md border border-warning/40 bg-warning/15 text-warning hover:bg-warning/25 transition-colors",title:`AI 작업 ${e.length}개 진행 중`,children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),(0,s.jsxs)("span",{children:["AI ",e.length]})]}),r&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"fixed inset-0 z-[80]",onClick:()=>a(!1)}),(0,s.jsxs)("div",{className:"absolute right-0 top-full mt-1 z-[81] bg-card border border-border rounded-lg shadow-xl w-72 py-1 animate-dialog-in",children:[(0,s.jsx)("div",{className:"px-3 py-1.5 text-[10px] uppercase tracking-wider text-muted-foreground/70 border-b border-border",children:"진행 중인 AI 작업"}),e.map(e=>{var t;let r;return(0,s.jsxs)("div",{className:"px-3 py-2 flex items-center gap-2 text-xs",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse flex-shrink-0"}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("div",{className:"text-foreground truncate",children:e.label}),(0,s.jsx)("div",{className:"text-muted-foreground/70",children:P[e.type]??e.type})]}),(0,s.jsx)("span",{className:"text-muted-foreground font-mono flex-shrink-0",children:(t=e.startedAt,(r=Math.floor((Date.now()-t)/1e3))<60?`${r}s`:`${Math.floor(r/60)}m${r%60}s`)})]},e.id)})]})]})]})}function _(){let{state:e,setActiveTab:t,closeTab:r}=x();return(0,s.jsxs)("div",{className:"tab-bar",children:[e.tabs.map(n=>{let a=e.activeTabId===n.id,o="dashboard"===n.type;return(0,s.jsxs)("div",{onClick:()=>t(n.id),onMouseDown:e=>{1!==e.button||o||(e.preventDefault(),r(n.id))},className:`tab-item ${a?"tab-item-active":""}`,children:[(0,s.jsx)("span",{className:"truncate",children:o?"Dashboard":n.projectName||"Workspace"}),!o&&(0,s.jsx)("button",{onClick:e=>{e.stopPropagation(),r(n.id)},className:"tab-close",children:"\xd7"})]},n.id)}),(0,s.jsx)("div",{className:"tab-bar-spacer"}),(0,s.jsx)(A,{}),(0,s.jsx)(k,{}),(0,s.jsx)(v,{})]})}function D({onSelect:e,onCancel:t,initialPath:r}){let[a,o]=(0,n.useState)(null),[l,i]=(0,n.useState)(!0),[d,c]=(0,n.useState)(null),[u,x]=(0,n.useState)(!1),m=(0,n.useCallback)(async e=>{i(!0),c(null),x(!1);try{let t=e?`?path=${encodeURIComponent(e)}`:"",r=await fetch(`/api/filesystem${t}`);if(r.ok)o(await r.json());else{let e=await r.json();c(e.error||"불러오기 실패"),e.permissionError&&x(!0)}}catch{c("불러오기 실패")}finally{i(!1)}},[]);return(0,n.useEffect)(()=>{m(r)},[m,r]),(0,s.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",onClick:t,children:(0,s.jsxs)("div",{className:"bg-card border border-border rounded-lg shadow-xl w-[520px] max-h-[70vh] flex flex-col",onClick:e=>e.stopPropagation(),children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"프로젝트 폴더 선택"}),(0,s.jsx)("button",{onClick:t,className:"text-muted-foreground hover:text-foreground text-lg leading-none",children:"\xd7"})]}),(0,s.jsx)("div",{className:"px-4 py-2 border-b border-border bg-muted",children:(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-xs text-muted-foreground shrink-0",children:"경로:"}),(0,s.jsx)("span",{className:"text-xs font-mono truncate flex-1",title:a?.current,children:a?.current||"..."}),a?.isProject&&(0,s.jsx)("span",{className:"text-xs text-success shrink-0 font-medium",children:"프로젝트 감지"})]})}),(0,s.jsx)("div",{className:"flex-1 overflow-y-auto min-h-0",children:l?(0,s.jsx)("div",{className:"p-8 text-center text-muted-foreground text-sm",children:"불러오는 중..."}):d?(0,s.jsxs)("div",{className:"p-6 text-center",children:[(0,s.jsx)("div",{className:"text-destructive text-sm mb-2",children:d}),u&&(0,s.jsxs)("div",{className:"text-xs text-muted-foreground leading-relaxed mt-3 text-left bg-muted rounded-md p-3",children:[(0,s.jsx)("p",{className:"font-semibold mb-1",children:"macOS 권한 설정이 필요합니다"}),(0,s.jsx)("p",{children:"시스템 설정 → 개인정보 보호 및 보안 → 전체 디스크 접근 권한에서 터미널 앱을 추가해주세요."}),(0,s.jsx)("p",{className:"mt-1 text-muted-foreground",children:"Documents, Desktop 등 보호된 폴더는 별도 권한이 필요합니다."})]})]}):(0,s.jsxs)("div",{className:"py-1",children:[a?.parent&&(0,s.jsxs)("button",{onClick:()=>m(a.parent),className:"w-full text-left px-4 py-2 text-sm hover:bg-muted transition-colors flex items-center gap-2 text-muted-foreground",children:[(0,s.jsx)("span",{children:"↑"}),(0,s.jsx)("span",{children:".."})]}),a?.dirs.length===0&&(0,s.jsx)("div",{className:"px-4 py-6 text-center text-muted-foreground text-xs",children:"하위 폴더가 없습니다"}),a?.dirs.map(e=>(0,s.jsxs)("button",{onClick:()=>m(e.path),className:"w-full text-left px-4 py-2 text-sm hover:bg-muted transition-colors flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"\uD83D\uDCC1"}),(0,s.jsx)("span",{children:e.name})]},e.path))]})}),(0,s.jsxs)("div",{className:"flex items-center justify-end gap-2 px-4 py-3 border-t border-border",children:[(0,s.jsx)("button",{onClick:t,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors",children:"취소"}),(0,s.jsx)("button",{onClick:()=>a&&e(a.current),disabled:!a,className:"px-4 py-1.5 text-xs bg-primary hover:bg-primary-hover text-white rounded-md transition-colors disabled:opacity-50",children:"이 폴더 선택"})]})]})})}function M({open:e,title:t,description:r,confirmLabel:a="Confirm",cancelLabel:o="Cancel",variant:l="default",onConfirm:i,onCancel:d}){let c=(0,n.useRef)(null),u=(0,n.useRef)(null);(0,n.useEffect)(()=>{e&&c.current?.focus()},[e]);let x=(0,n.useCallback)(t=>{e&&("Escape"===t.key&&d(),"Enter"===t.key&&i())},[e,d,i]);return((0,n.useEffect)(()=>(window.addEventListener("keydown",x),()=>window.removeEventListener("keydown",x)),[x]),e)?(0,s.jsx)("div",{ref:u,onClick:e=>{e.target===u.current&&d()},className:"fixed inset-0 z-50 flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{className:"bg-card border border-border rounded-xl shadow-2xl shadow-black/40 w-full max-w-sm mx-4 animate-dialog-in",children:[(0,s.jsxs)("div",{className:"p-5",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:t}),r&&(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-1.5 leading-relaxed",children:r})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2 px-5 pb-4",children:[(0,s.jsx)("button",{onClick:d,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground bg-muted hover:bg-card-hover border border-border rounded-md transition-colors",children:o}),(0,s.jsx)("button",{ref:c,onClick:i,className:`px-3 py-1.5 text-xs text-white rounded-md transition-colors ${"danger"===l?"bg-destructive hover:bg-destructive/80":"bg-primary hover:bg-primary-hover"}`,children:a})]})]})}):null}let L=[{key:"active",label:"Active"},{key:"all",label:"All"},{key:"today",label:"Today"},{key:"archive",label:"Archive"}];function O({value:e,onChange:t}){let[r,a]=(0,n.useState)(!1);return((0,n.useEffect)(()=>a(!0),[]),r)?(0,s.jsx)("div",{className:"flex gap-1 bg-muted rounded-lg p-1",children:L.map(r=>(0,s.jsx)("button",{onClick:()=>t(r.key),className:`px-4 py-1.5 text-sm rounded-md transition-all ${e===r.key?"bg-card text-foreground shadow-sm font-medium":"text-muted-foreground hover:text-foreground"}`,children:r.label},r.key))}):null}let R={idea:"\uD83D\uDCA1",doing:"\uD83D\uDD25",writing:"✏️",submitted:"\uD83D\uDE80",testing:"\uD83E\uDDEA",done:"✅",problem:"\uD83D\uDD34"};function F({subProject:e,projectName:t,onClick:r}){let{active_count:n,pending_count:a,done_count:o,problem_count:l,task_count:i,preview_tasks:d,last_activity:c}=e;return(0,s.jsxs)("div",{onClick:r,className:"p-4 bg-card hover:bg-card-hover border border-border rounded-xl cursor-pointer transition-all group hover:border-muted-foreground/30 hover:shadow-md hover:shadow-black/20",children:[(0,s.jsxs)("div",{className:"flex items-start justify-between mb-2",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold group-hover:text-primary transition-colors truncate flex-1",children:e.name}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground ml-2 flex-shrink-0",children:t})]}),d.length>0&&(0,s.jsx)("div",{className:"space-y-1 mb-3",children:d.map((e,t)=>(0,s.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[(0,s.jsx)("span",{className:"flex-shrink-0",children:R[e.status]}),(0,s.jsx)("span",{className:`truncate ${"done"===e.status?"text-muted-foreground line-through":"text-foreground"}`,children:e.title})]},t))}),(0,s.jsxs)("div",{className:"flex items-center justify-between text-xs text-muted-foreground",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[n>0&&(0,s.jsxs)("span",{className:"text-primary",children:["active ",n]}),a>0&&(0,s.jsxs)("span",{children:["pending ",a]}),o>0&&(0,s.jsxs)("span",{className:"text-success",children:["done ",o]}),l>0&&(0,s.jsxs)("span",{className:"text-destructive",children:["problem ",l]}),0===i&&(0,s.jsx)("span",{children:"no tasks"})]}),c&&(0,s.jsx)("span",{children:function(e){if(!e)return"";let t=Math.floor((Date.now()-new Date(e).getTime())/6e4);if(t<1)return"just now";if(t<60)return`${t}m ago`;let r=Math.floor(t/60);if(r<24)return`${r}h ago`;let s=Math.floor(r/24);return`${s}d ago`}(c)})]})]})}function K(){let e,{state:t,openProject:r,closeTab:a}=x(),o="dashboard"===t.activeTabId,[l,i]=(0,n.useState)([]),[d,c]=(0,n.useState)([]),[u,m]=(0,n.useState)([]),[p,h]=(0,n.useState)(null),[f,b]=(0,n.useState)(!1),[g,j]=(0,n.useState)(""),[y,v]=(0,n.useState)(""),[N,k]=(0,n.useState)(""),[w,C]=(0,n.useState)(!0),[S,E]=(0,n.useState)(!1),[T,I]=(0,n.useState)(null),[$,P]=(0,n.useState)(null),[A,_]=(0,n.useState)(""),[L,R]=(0,n.useState)(""),[K,z]=(0,n.useState)(""),[J,W]=(0,n.useState)(!1),[B,U]=(0,n.useState)([]),[G,H]=(0,n.useState)(""),[q,V]=(0,n.useState)(!1),[X,Q]=(0,n.useState)(null),[Z,Y]=(0,n.useState)(!1),[ee,et]=(0,n.useState)(""),[er,es]=(0,n.useState)(""),[en,ea]=(0,n.useState)(!1),eo=(0,n.useRef)(null),[el,ei]=(0,n.useState)("active"),ed=(0,n.useCallback)(async()=>{let e=await fetch("/api/projects"),t=await e.json(),r=await Promise.all(t.map(async e=>{let t=await fetch(`/api/projects/${e.id}/sub-projects`),r=await t.json();return{...e,subProjects:r}}));i(r);let s=[];for(let e of r)for(let t of e.subProjects)if(t.task_count>0){let r=await fetch(`/api/projects/${e.id}/sub-projects/${t.id}/tasks`);for(let n of(await r.json()))s.push({...n,projectName:e.name,subProjectName:t.name})}m(s),c(s.filter(e=>e.is_today)),C(!1)},[]);(0,n.useEffect)(()=>{ed(),fetch("/api/global-memo").then(e=>e.json()).then(e=>H(e.content||"")),fetch("/api/maintenance",{method:"POST"}).catch(()=>{}),"true"===localStorage.getItem("im-memo-open")&&ea(!0);let e=localStorage.getItem("im-dashboard-tab");e&&ei(e)},[ed]),(0,n.useEffect)(()=>{o&&!w&&ed()},[o]);let ec=(0,n.useCallback)(async()=>{let e=await fetch("/api/archive");U((await e.json()).map(e=>{let t=l.find(t=>t.id===e.project_id),r=t?.subProjects.find(t=>t.id===e.sub_project_id);return{...e,projectName:t?.name,subProjectName:r?.name}}))},[l]),eu=async()=>{V(!0),et("");let e=await fetch("/api/sync");Q(await e.json())},ex=async e=>{Y(!0),et("");try{let t=await fetch("/api/sync",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e,repoUrl:er})}),r=await t.json();if(t.ok){if(et(r.message||"Success"),"init"===e){let e=await fetch("/api/sync").then(e=>e.json());Q(e)}"pull"===e&&ed()}else et(`Error: ${r.error}`)}catch{et("Error: request failed")}Y(!1)},em=async e=>{if(e.preventDefault(),!g.trim())return;let t=await fetch("/api/projects",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:g.trim(),description:y.trim(),project_path:N.trim()||void 0})});if(t.ok){let e=await t.json();j(""),v(""),k(""),b(!1),r(e.id,e.name)}},ep=async()=>{T&&(await fetch(`/api/projects/${T}`,{method:"DELETE"}),a(T),I(null),ed())},eh=async()=>{$&&A.trim()&&(await fetch(`/api/projects/${$.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:A.trim(),description:L.trim(),project_path:K.trim()||null})})).ok&&(P(null),ed())},ef={idea:"\uD83D\uDCA1",writing:"✏️",submitted:"\uD83D\uDE80",testing:"\uD83E\uDDEA",done:"✅",problem:"\uD83D\uDD34"},eb=(()=>{let e=0,t=0,r=0,s=0,n=0;for(let a of l)for(let o of a.subProjects)e+=o.task_count,t+=o.active_count,r+=o.pending_count,s+=o.done_count,n+=o.problem_count;return{total:e,active:t,pending:r,done:s,problem:n,today:d.length}})(),eg=[{label:"Total",value:eb.total,color:"text-foreground",bg:"bg-foreground/5",filter:"total"},{label:"Active",value:eb.active,color:"text-cyan-400",bg:"bg-cyan-400/10",filter:"active"},{label:"Pending",value:eb.pending,color:"text-indigo-400",bg:"bg-indigo-400/10",filter:"pending"},{label:"Done",value:eb.done,color:"text-emerald-400",bg:"bg-emerald-400/10",filter:"done"},{label:"Problem",value:eb.problem,color:"text-red-400",bg:"bg-red-400/10",filter:"problem"},{label:"Today",value:eb.today,color:"text-amber-400",bg:"bg-amber-400/10",filter:"today"}],ej=p?u.filter({total:()=>!0,active:e=>"doing"===e.status||"submitted"===e.status||"testing"===e.status,pending:e=>"idea"===e.status||"writing"===e.status,done:e=>"done"===e.status,problem:e=>"problem"===e.status,today:e=>e.is_today}[p]||(()=>!0)):[];return(0,s.jsxs)("div",{className:"h-full overflow-y-auto p-8 w-full max-w-5xl mx-auto",children:[(0,s.jsxs)("header",{className:"flex items-center justify-between mb-6",children:[(0,s.jsx)("div",{children:(0,s.jsxs)("h1",{className:"text-2xl font-bold tracking-tight",children:["IM ",(0,s.jsx)("span",{className:"text-muted-foreground font-normal text-sm ml-2",children:"Idea Manager v2"})]})}),(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)(O,{value:el,onChange:e=>{ei(e),localStorage.setItem("im-dashboard-tab",e),"archive"===e&&ec()}}),(0,s.jsx)("button",{onClick:eu,className:"px-3 py-2 text-sm border rounded-lg transition-colors bg-muted hover:bg-card-hover text-muted-foreground border-border",title:"DB Sync via Git",children:"Sync"}),(0,s.jsx)("button",{onClick:()=>{let e=!en;ea(e),localStorage.setItem("im-memo-open",String(e))},className:`px-3 py-2 text-sm border rounded-lg transition-colors ${en?"bg-accent/15 text-accent border-accent/30 hover:bg-accent/25":"bg-muted hover:bg-card-hover text-muted-foreground border-border"}`,title:"Quick memo",children:"Memo"}),(0,s.jsx)("button",{onClick:()=>b(!f),className:"px-4 py-2 bg-primary hover:bg-primary-hover text-white rounded-lg transition-colors font-medium text-sm",children:"+ Workspace"})]})]}),!w&&eb.total>0&&(0,s.jsxs)("div",{className:"mb-6",children:[(0,s.jsx)("div",{className:"grid grid-cols-6 gap-2",children:eg.map(({label:e,value:t,color:r,bg:n,filter:a})=>(0,s.jsxs)("button",{onClick:()=>h(p===a?null:a),className:`${n} rounded-lg p-3 text-center transition-all hover:scale-[1.02] hover:brightness-110 cursor-pointer
|
|
2
|
-
${p===a?"ring-2 ring-offset-1 ring-offset-transparent ring-current scale-[1.02]":""}`,children:[(0,s.jsx)("div",{className:`text-xl font-bold ${r}`,children:t}),(0,s.jsx)("div",{className:"text-[10px] text-muted-foreground uppercase tracking-wider mt-0.5",children:e})]},e))}),eb.total>0&&(0,s.jsxs)("div",{className:"mt-2 h-1.5 rounded-full bg-muted overflow-hidden flex",children:[eb.done>0&&(0,s.jsx)("div",{className:"bg-emerald-400 transition-all",style:{width:`${eb.done/eb.total*100}%`}}),eb.active>0&&(0,s.jsx)("div",{className:"bg-cyan-400 transition-all",style:{width:`${eb.active/eb.total*100}%`}}),eb.pending>0&&(0,s.jsx)("div",{className:"bg-indigo-400 transition-all",style:{width:`${eb.pending/eb.total*100}%`}}),eb.problem>0&&(0,s.jsx)("div",{className:"bg-red-400 transition-all",style:{width:`${eb.problem/eb.total*100}%`}})]}),p&&(0,s.jsxs)("div",{className:"mt-3 space-y-1.5",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("span",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:[eg.find(e=>e.filter===p)?.label," — ",ej.length," tasks"]}),(0,s.jsx)("button",{onClick:()=>h(null),className:"text-xs text-muted-foreground hover:text-foreground transition-colors",children:"Clear"})]}),(0,s.jsx)("div",{className:"max-h-[280px] overflow-y-auto space-y-1",children:ej.map(e=>(0,s.jsxs)("div",{onClick:()=>r(e.project_id,e.projectName,e.sub_project_id,e.id),className:"flex items-center gap-3 px-3 py-2 bg-card hover:bg-card-hover border border-border rounded-lg cursor-pointer transition-colors",children:[(0,s.jsx)("span",{className:"text-sm",children:ef[e.status]}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:e.title}),(0,s.jsxs)("span",{className:"text-xs text-muted-foreground ml-2",children:[e.projectName," / ",e.subProjectName]})]})]},e.id))})]})]}),en&&(0,s.jsxs)("div",{className:"mb-6 bg-card rounded-lg border border-border overflow-hidden",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-4 py-2 border-b border-border",children:[(0,s.jsx)("span",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"Quick Memo"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground",children:"auto-saved"})]}),(0,s.jsx)("textarea",{value:G,onChange:e=>{var t;H(t=e.target.value),eo.current&&clearTimeout(eo.current),eo.current=setTimeout(()=>{fetch("/api/global-memo",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})})},500)},placeholder:"자유롭게 메모하세요...",className:"w-full bg-transparent px-4 py-3 text-sm text-foreground resize-none focus:outline-none leading-relaxed font-mono min-h-[150px] max-h-[400px]",style:{height:Math.max(150,Math.min(400,(G.split("\n").length+1)*22))}})]}),f&&(0,s.jsxs)("form",{onSubmit:em,className:"mb-6 p-5 bg-card rounded-lg border border-border",children:[(0,s.jsx)("input",{type:"text",placeholder:"Workspace name",value:g,onChange:e=>j(e.target.value),className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 mb-3 focus:border-primary focus:outline-none text-foreground",autoFocus:!0}),(0,s.jsx)("input",{type:"text",placeholder:"Description (optional)",value:y,onChange:e=>v(e.target.value),className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 mb-3 focus:border-primary focus:outline-none text-foreground"}),(0,s.jsx)("div",{className:"mb-4",children:(0,s.jsx)("button",{type:"button",onClick:()=>E(!0),className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 text-left text-sm hover:border-primary transition-colors",children:N?(0,s.jsx)("span",{className:"font-mono text-foreground",children:N}):(0,s.jsx)("span",{className:"text-muted-foreground",children:"Workspace folder (optional)"})})}),(0,s.jsxs)("div",{className:"flex gap-2 justify-end",children:[(0,s.jsx)("button",{type:"button",onClick:()=>b(!1),className:"px-4 py-2 text-muted-foreground hover:text-foreground transition-colors text-sm",children:"Cancel"}),(0,s.jsx)("button",{type:"submit",className:"px-4 py-2 bg-primary hover:bg-primary-hover text-white rounded-lg transition-colors text-sm",children:"Create"})]})]}),w?(0,s.jsx)("div",{className:"text-center text-muted-foreground py-20",children:"Loading..."}):"archive"===el?0===B.length?(0,s.jsxs)("div",{className:"text-center py-20 text-muted-foreground",children:[(0,s.jsx)("p",{className:"text-lg mb-2",children:"No archived tasks"}),(0,s.jsx)("p",{className:"text-sm",children:"Archived tasks will appear here"})]}):(0,s.jsx)("div",{className:"space-y-2",children:B.map(e=>(0,s.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-card border border-border rounded-lg transition-colors group",children:[(0,s.jsx)("span",{className:"text-sm",children:ef[e.status]}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:e.title}),(0,s.jsxs)("span",{className:"text-xs text-muted-foreground ml-2",children:[e.projectName,e.subProjectName?` / ${e.subProjectName}`:""]}),e.description&&(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-0.5 truncate",children:e.description})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:[(0,s.jsx)("button",{onClick:async()=>{await fetch("/api/archive",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({taskId:e.id,action:"restore"})}),ec(),ed()},className:"px-2 py-1 text-xs text-primary hover:bg-primary/10 rounded transition-colors",children:"Restore"}),(0,s.jsx)("button",{onClick:async()=>{await fetch("/api/archive",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({taskId:e.id,action:"delete"})}),ec()},className:"px-2 py-1 text-xs text-destructive hover:bg-destructive/10 rounded transition-colors",children:"Delete"})]})]},e.id))}):"today"===el?0===d.length?(0,s.jsxs)("div",{className:"text-center py-20 text-muted-foreground",children:[(0,s.jsx)("p",{className:"text-lg mb-2",children:"No tasks marked for today"}),(0,s.jsx)("p",{className:"text-sm",children:"Mark tasks with the Today button in task detail"})]}):(0,s.jsx)("div",{className:"space-y-2",children:d.map(e=>(0,s.jsxs)("div",{onClick:()=>r(e.project_id,e.projectName,e.sub_project_id,e.id),className:"flex items-center gap-3 p-3 bg-card hover:bg-card-hover border border-border rounded-lg cursor-pointer transition-colors",children:[(0,s.jsx)("span",{className:"text-sm",children:ef[e.status]}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:e.title}),(0,s.jsxs)("span",{className:"text-xs text-muted-foreground ml-2",children:[e.projectName," / ",e.subProjectName]})]})]},e.id))}):(0,s.jsx)(s.Fragment,{children:"all"===el?0===l.length?(0,s.jsxs)("div",{className:"text-center py-20",children:[(0,s.jsx)("p",{className:"text-muted-foreground text-lg mb-2",children:"No workspaces yet"}),(0,s.jsx)("p",{className:"text-muted-foreground text-sm",children:"Click + Workspace to get started"})]}):(0,s.jsx)("div",{className:"space-y-6",children:l.map(e=>(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 cursor-pointer hover:text-primary transition-colors",onClick:()=>r(e.id,e.name),children:[(0,s.jsx)("h2",{className:"text-sm font-semibold",children:e.name}),e.project_path&&(0,s.jsx)("span",{className:"text-xs text-muted-foreground font-mono truncate max-w-48",children:e.project_path})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),P(e),_(e.name),R(e.description),z(e.project_path||"")},className:"text-xs text-muted-foreground hover:text-foreground transition-colors",children:"Edit"}),(0,s.jsx)("button",{onClick:t=>{var r;return r=e.id,void(t.stopPropagation(),I(r))},className:"text-xs text-muted-foreground hover:text-destructive transition-colors",children:"Delete"})]})]}),0===e.subProjects.length?(0,s.jsxs)("div",{className:"text-xs text-muted-foreground py-4 text-center border border-dashed border-border rounded-lg",children:["No projects."," ",(0,s.jsx)("span",{className:"text-primary cursor-pointer hover:underline",onClick:()=>r(e.id,e.name),children:"Open workspace"})," ","to add one."]}):(0,s.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3",children:e.subProjects.map(t=>(0,s.jsx)(F,{subProject:t,projectName:e.name,onClick:()=>r(e.id,e.name,t.id)},t.id))})]},e.id))}):0===(e=(()=>{let e=[];for(let t of l)for(let r of t.subProjects)"active"===el?(r.active_count>0||r.problem_count>0)&&e.push({sp:r,projectName:t.name,projectId:t.id}):"all"===el&&e.push({sp:r,projectName:t.name,projectId:t.id});return e.sort((e,t)=>t.sp.active_count+t.sp.problem_count-(e.sp.active_count+e.sp.problem_count)),e})()).length?(0,s.jsxs)("div",{className:"text-center py-20 text-muted-foreground",children:[(0,s.jsx)("p",{className:"text-lg mb-2",children:"No active tasks"}),(0,s.jsx)("p",{className:"text-sm",children:"Submit tasks to see them here"})]}):(0,s.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3",children:e.map(({sp:e,projectName:t,projectId:n})=>(0,s.jsx)(F,{subProject:e,projectName:t,onClick:()=>{let s=l.find(e=>e.id===n);r(n,s?.name||t,e.id)}},e.id))})}),S&&(0,s.jsx)(D,{onSelect:e=>{k(e),E(!1)},onCancel:()=>E(!1)}),q&&(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:()=>V(!1)}),(0,s.jsxs)("div",{className:"relative bg-card border border-border rounded-xl shadow-2xl w-[480px] animate-dialog-in",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-b border-border",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"DB Sync"}),(0,s.jsx)("button",{onClick:()=>V(!1),className:"text-muted-foreground hover:text-foreground text-lg px-1",children:"x"})]}),(0,s.jsxs)("div",{className:"p-5 space-y-4",children:[null===X?(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading..."}):X.initialized?(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsxs)("div",{className:"text-xs space-y-1",children:[(0,s.jsxs)("p",{children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Remote:"})," ",(0,s.jsx)("span",{className:"font-mono",children:X.remoteUrl||"none"})]}),(0,s.jsxs)("p",{children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Last sync:"})," ",X.lastCommit||"never"]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>ex("push"),disabled:Z,className:"flex-1 px-4 py-2 text-sm bg-primary text-white rounded-lg hover:bg-primary-hover transition-colors disabled:opacity-50",children:Z?"...":"Push"}),(0,s.jsx)("button",{onClick:()=>ex("pull"),disabled:Z,className:"flex-1 px-4 py-2 text-sm bg-muted text-foreground border border-border rounded-lg hover:bg-card-hover transition-colors disabled:opacity-50",children:Z?"...":"Pull"})]})]}):(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Git 저장소 URL을 입력하세요."}),(0,s.jsx)("input",{value:er,onChange:e=>es(e.target.value),placeholder:"https://github.com/user/repo.git",className:"w-full bg-input border border-border rounded-lg px-3 py-2 text-sm focus:border-primary focus:outline-none text-foreground"}),(0,s.jsx)("button",{onClick:()=>ex("init"),disabled:Z||!er.trim(),className:"w-full px-4 py-2 text-sm bg-primary text-white rounded-lg hover:bg-primary-hover transition-colors disabled:opacity-50",children:Z?"Initializing...":"Initialize"})]}),ee&&(0,s.jsx)("p",{className:`text-xs ${ee.startsWith("Error")?"text-destructive":"text-success"}`,children:ee})]})]})]}),$&&(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:()=>P(null)}),(0,s.jsxs)("div",{className:"relative bg-card border border-border rounded-xl shadow-2xl w-[480px] animate-dialog-in",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-b border-border",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"Edit Workspace"}),(0,s.jsx)("button",{onClick:()=>P(null),className:"text-muted-foreground hover:text-foreground text-lg px-1",children:"x"})]}),(0,s.jsxs)("div",{className:"p-5 space-y-3",children:[(0,s.jsx)("input",{type:"text",value:A,onChange:e=>_(e.target.value),placeholder:"Workspace name",className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 focus:border-primary focus:outline-none text-foreground",autoFocus:!0}),(0,s.jsx)("input",{type:"text",value:L,onChange:e=>R(e.target.value),placeholder:"Description (optional)",className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 focus:border-primary focus:outline-none text-foreground"}),(0,s.jsx)("button",{type:"button",onClick:()=>W(!0),className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 text-left text-sm hover:border-primary transition-colors",children:K?(0,s.jsx)("span",{className:"font-mono text-foreground",children:K}):(0,s.jsx)("span",{className:"text-muted-foreground",children:"Workspace folder (optional)"})}),K&&(0,s.jsx)("button",{type:"button",onClick:()=>z(""),className:"text-xs text-muted-foreground hover:text-destructive transition-colors",children:"Clear folder link"})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2 px-5 py-3 border-t border-border",children:[(0,s.jsx)("button",{onClick:()=>P(null),className:"px-4 py-2 text-muted-foreground hover:text-foreground transition-colors text-sm",children:"Cancel"}),(0,s.jsx)("button",{onClick:eh,disabled:!A.trim(),className:"px-4 py-2 bg-primary hover:bg-primary-hover text-white rounded-lg transition-colors text-sm disabled:opacity-50",children:"Save"})]})]})]}),J&&(0,s.jsx)(D,{onSelect:e=>{z(e),W(!1)},onCancel:()=>W(!1),initialPath:K||void 0}),(0,s.jsx)(M,{open:!!T,title:"Delete workspace?",description:"This will permanently delete the workspace and all its data.",confirmLabel:"Delete",variant:"danger",onConfirm:ep,onCancel:()=>I(null)})]})}var z=r(5326),J=r(9434),W=r(9561),B=r(7071),U=r(6732),G=r(2161),H=r(2638);let q=B.Pe.define();class V extends W.xO{constructor(e){super(),this.text=e}eq(e){return e.text===this.text}toDOM(){let e=document.createElement("span");return e.className="cm-ghost-text",e.textContent=this.text,e.style.opacity="0.35",e.style.pointerEvents="none",e}ignoreEvent(){return!0}}let X=B.sU.define({create:()=>null,update(e,t){for(let e of t.effects)if(e.is(q))return e.value;return t.docChanged||t.selection?null:e}}),Q=W.Lz.decorations.compute([X],e=>{let t=e.field(X);return t?W.NZ.set([W.NZ.widget({widget:new V(t.text),side:1}).range(t.from)]):W.NZ.none}),Z=/[.!?,;:·\n\r()[\]{}"]+/;function Y(e){let t=[];for(let r of e.split(Z)){let e=r.trim().split(/\s+/).filter(e=>e.length>=2);e.length&&t.push(e)}return t}let ee=null,et=[];function er(e){let t=e.state.field(X,!1);return!!t&&(e.dispatch({changes:{from:t.from,insert:t.text},selection:{anchor:t.from+t.text.length},effects:q.of(null)}),!0)}function es(e){let t=e.state.selection.main.head,r=e.state.doc.lineAt(t),s=r.text.match(/^(\s*[-*+]\s)\[ \](.*)$/);if(s){let t=`${s[1]}[x]${s[2]}`;return e.dispatch({changes:{from:r.from,to:r.to,insert:t}}),!0}let n=r.text.match(/^(\s*[-*+]\s)\[[xX]\](.*)$/);if(n){let t=`${n[1]}[ ]${n[2]}`;return e.dispatch({changes:{from:r.from,to:r.to,insert:t}}),!0}return!1}function en(e){return/^\s*\|/.test(e)}function ea(e){return/^\s*\|[\s:|-]+\|\s*$/.test(e)}function eo(e){let t=e.state.selection.main.head,r=e.state.doc.lineAt(t);if(!en(r.text))return!1;let s="|"+Array(Math.max(r.text.split("|").filter(e=>void 0!==e).length-2,1)).fill(" ").join("|")+"|";return e.dispatch({changes:{from:r.to,insert:"\n"+s},selection:{anchor:r.to+2}}),!0}function el(e){let t=e.state.selection.main.head,r=e.state.doc.lineAt(t);if(!en(r.text)||ea(r.text))return!1;let s=r.to<e.state.doc.length?e.state.doc.lineAt(r.to+1):null;if(s&&ea(s.text))return!1;let n=r.from>0?r.from-1:r.from;return e.dispatch({changes:{from:n,to:r.to},selection:{anchor:Math.min(n,e.state.doc.length)}}),!0}function ei(e){let{state:t}=e,r=t.selection.main.head,s=t.doc.lineAt(r);if(r!==s.to)return!1;let n=s.text,a=n.match(/^(\s*)([-*+])\s(\[[ xX]\]\s)?(.*)$/),o=n.match(/^(\s*)(\d+)\.\s(.*)$/);if(a){let[,t,n,o,l]=a;if(!l.trim())return e.dispatch({changes:{from:s.from,to:s.to,insert:t},selection:{anchor:s.from+t.length}}),!0;let i=o?`${t}${n} [ ] `:`${t}${n} `;return e.dispatch({changes:{from:r,insert:`
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{3915:(e,t,r)=>{Promise.resolve().then(r.bind(r,9770))},9770:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>e7});var s=r(5155),n=r(2115);let a={id:"dashboard",type:"dashboard"};function o(e){return e.some(e=>"dashboard"===e.id)?e:[a,...e]}function l(e,t){switch(t.type){case"OPEN_PROJECT":{let r=e.tabs.find(e=>e.projectId===t.projectId);if(r)return{tabs:e.tabs.map(e=>e.id===r.id?{...e,initialSubId:t.initialSubId,initialTaskId:t.initialTaskId}:e),activeTabId:r.id};let s={id:t.projectId,type:"project",projectId:t.projectId,projectName:t.projectName,initialSubId:t.initialSubId,initialTaskId:t.initialTaskId};return{tabs:[...e.tabs,s],activeTabId:s.id}}case"CLOSE_TAB":{if("dashboard"===t.tabId)return e;let r=e.tabs.findIndex(e=>e.id===t.tabId),s=e.tabs.filter(e=>e.id!==t.tabId),n=e.activeTabId;return e.activeTabId===t.tabId&&(n=s[Math.max(0,r-1)]?.id||"dashboard"),{tabs:o(s),activeTabId:n}}case"SET_ACTIVE":return{...e,activeTabId:t.tabId};case"UPDATE_TAB_NAME":return{...e,tabs:e.tabs.map(e=>e.id===t.tabId?{...e,projectName:t.name}:e)};case"CONSUME_INITIAL":return{...e,tabs:e.tabs.map(e=>e.id===t.tabId?{...e,initialSubId:void 0,initialTaskId:void 0}:e)};case"HYDRATE":return{tabs:o(t.state.tabs),activeTabId:t.state.activeTabId};default:return e}}let i="im-tabs",d={tabs:[a],activeTabId:"dashboard"};function c(){return d}let u=(0,n.createContext)(null);function x(){let e=(0,n.useContext)(u);if(!e)throw Error("useTabContext must be used within TabProvider");return e}function m({children:e}){let[t,r]=(0,n.useReducer)(l,void 0,c);(0,n.useEffect)(()=>{try{let e=localStorage.getItem(i);if(e){let t=JSON.parse(e);r({type:"HYDRATE",state:{tabs:o(t.tabs),activeTabId:t.activeTabId}})}}catch{}},[]),(0,n.useEffect)(()=>{localStorage.setItem(i,JSON.stringify(t))},[t]),(0,n.useEffect)(()=>{let e=t.tabs.find(e=>e.id===t.activeTabId);if(!e)return;let r="dashboard"===e.type?"/":`/projects/${e.projectId}`;window.location.pathname!==r&&window.history.replaceState(null,"",r)},[t.activeTabId,t.tabs]),(0,n.useEffect)(()=>{let e=window.location.pathname.match(/^\/projects\/(.+)$/);if(e){let s=e[1];t.tabs.some(e=>e.projectId===s)?r({type:"SET_ACTIVE",tabId:s}):fetch(`/api/projects/${s}`).then(e=>e.ok?e.json():null).then(e=>{e&&r({type:"OPEN_PROJECT",projectId:s,projectName:e.name})})}let s=sessionStorage.getItem("im-open-project");s&&(sessionStorage.removeItem("im-open-project"),fetch(`/api/projects/${s}`).then(e=>e.ok?e.json():null).then(e=>{e&&r({type:"OPEN_PROJECT",projectId:s,projectName:e.name})}))},[]);let a=(0,n.useCallback)((e,t,s,n)=>{r({type:"OPEN_PROJECT",projectId:e,projectName:t,initialSubId:s,initialTaskId:n})},[]),d=(0,n.useCallback)(e=>{r({type:"CLOSE_TAB",tabId:e})},[]),x=(0,n.useCallback)(e=>{r({type:"SET_ACTIVE",tabId:e})},[]),m=(0,n.useCallback)((e,t)=>{r({type:"UPDATE_TAB_NAME",tabId:e,name:t})},[]),p=(0,n.useCallback)(e=>{r({type:"CONSUME_INITIAL",tabId:e})},[]),h=(0,n.useCallback)(()=>{let e=t.tabs.findIndex(e=>e.id===t.activeTabId),s=t.tabs[(e+1)%t.tabs.length];s&&r({type:"SET_ACTIVE",tabId:s.id})},[t.tabs,t.activeTabId]),f=(0,n.useCallback)(()=>{let e=t.tabs.findIndex(e=>e.id===t.activeTabId),s=t.tabs[(e-1+t.tabs.length)%t.tabs.length];s&&r({type:"SET_ACTIVE",tabId:s.id})},[t.tabs,t.activeTabId]);return(0,n.useEffect)(()=>{let e=e=>{e.ctrlKey&&"Tab"===e.key&&(e.preventDefault(),e.shiftKey?f():h())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[h,f]),(0,s.jsx)(u.Provider,{value:{state:t,openProject:a,closeTab:d,setActiveTab:x,updateTabName:m,consumeInitial:p,nextTab:h,prevTab:f},children:e})}let p=[{id:"dark",name:"Dark",emoji:"\uD83C\uDF11",colors:{"--background":"224 20% 10%","--foreground":"210 40% 98%","--card":"224 20% 13%","--card-hover":"220 15% 18%","--border":"220 15% 28%","--input":"220 15% 24%","--primary":"210 85% 60%","--primary-hover":"210 85% 50%","--accent":"265 70% 60%","--success":"142 71% 45%","--warning":"38 92% 50%","--destructive":"0 70% 55%","--muted":"220 15% 20%","--muted-foreground":"215 15% 60%"}},{id:"light",name:"Light",emoji:"☀️",colors:{"--background":"0 0% 97%","--foreground":"224 20% 14%","--card":"0 0% 100%","--card-hover":"220 15% 96%","--border":"220 15% 85%","--input":"220 15% 92%","--primary":"210 85% 50%","--primary-hover":"210 85% 42%","--accent":"265 70% 55%","--success":"142 71% 40%","--warning":"38 92% 45%","--destructive":"0 70% 50%","--muted":"220 15% 92%","--muted-foreground":"215 15% 45%"}},{id:"nord",name:"Nord",emoji:"❄️",colors:{"--background":"220 16% 16%","--foreground":"219 28% 88%","--card":"220 16% 20%","--card-hover":"220 16% 24%","--border":"220 16% 30%","--input":"220 16% 26%","--primary":"193 43% 60%","--primary-hover":"193 43% 50%","--accent":"311 20% 63%","--success":"92 28% 55%","--warning":"40 71% 73%","--destructive":"354 42% 56%","--muted":"220 16% 24%","--muted-foreground":"219 20% 55%"}},{id:"ocean",name:"Ocean",emoji:"\uD83C\uDF0A",colors:{"--background":"210 50% 8%","--foreground":"200 40% 95%","--card":"210 45% 12%","--card-hover":"210 40% 17%","--border":"210 35% 25%","--input":"210 40% 20%","--primary":"190 80% 55%","--primary-hover":"190 80% 45%","--accent":"170 60% 50%","--success":"160 60% 45%","--warning":"38 90% 50%","--destructive":"0 65% 55%","--muted":"210 40% 18%","--muted-foreground":"200 25% 55%"}},{id:"forest",name:"Forest",emoji:"\uD83C\uDF32",colors:{"--background":"150 20% 9%","--foreground":"140 20% 92%","--card":"150 18% 13%","--card-hover":"150 15% 18%","--border":"150 12% 26%","--input":"150 15% 22%","--primary":"142 50% 55%","--primary-hover":"142 50% 45%","--accent":"80 45% 55%","--success":"142 60% 45%","--warning":"45 85% 50%","--destructive":"0 60% 52%","--muted":"150 15% 18%","--muted-foreground":"140 12% 52%"}},{id:"sunset",name:"Sunset",emoji:"\uD83C\uDF05",colors:{"--background":"15 20% 10%","--foreground":"30 30% 93%","--card":"15 18% 14%","--card-hover":"15 15% 19%","--border":"15 12% 27%","--input":"15 15% 22%","--primary":"25 90% 58%","--primary-hover":"25 90% 48%","--accent":"340 65% 58%","--success":"142 55% 45%","--warning":"45 90% 52%","--destructive":"0 70% 55%","--muted":"15 15% 19%","--muted-foreground":"20 12% 52%"}},{id:"lavender",name:"Lavender",emoji:"\uD83D\uDC9C",colors:{"--background":"270 20% 10%","--foreground":"260 30% 93%","--card":"270 18% 14%","--card-hover":"270 15% 19%","--border":"270 12% 28%","--input":"270 15% 23%","--primary":"265 70% 62%","--primary-hover":"265 70% 52%","--accent":"320 55% 58%","--success":"142 55% 45%","--warning":"38 85% 52%","--destructive":"0 65% 55%","--muted":"270 15% 19%","--muted-foreground":"260 12% 52%"}},{id:"rose",name:"Ros\xe9",emoji:"\uD83C\uDF37",colors:{"--background":"0 0% 96%","--foreground":"340 20% 18%","--card":"0 0% 100%","--card-hover":"340 20% 95%","--border":"340 15% 85%","--input":"340 15% 91%","--primary":"340 75% 55%","--primary-hover":"340 75% 45%","--accent":"300 50% 55%","--success":"142 55% 42%","--warning":"38 85% 48%","--destructive":"0 70% 50%","--muted":"340 15% 91%","--muted-foreground":"340 12% 48%"}}];function h(e){return p.find(t=>t.id===e)??p[0]}let f="im-theme",g=(0,n.createContext)(null);function b(e){let t=document.documentElement;for(let[r,s]of Object.entries(e.colors))t.style.setProperty(r,s)}function j({children:e}){let[t,r]=(0,n.useState)(h("dark")),[a,o]=(0,n.useState)(!1);(0,n.useEffect)(()=>{let e=localStorage.getItem(f);if(e){let t=h(e);r(t),b(t)}o(!0)},[]),(0,n.useEffect)(()=>{a&&b(t)},[t,a]);let l=(0,n.useCallback)(e=>{r(h(e)),localStorage.setItem(f,e)},[]);return(0,s.jsx)(g.Provider,{value:{theme:t,setTheme:l,themes:p},children:e})}var y=r(7650);function v(){let{theme:e,setTheme:t,themes:r}=function(){let e=(0,n.useContext)(g);if(!e)throw Error("useTheme must be used within ThemeProvider");return e}(),[a,o]=(0,n.useState)(!1),l=(0,n.useRef)(null),i=(0,n.useRef)(null),[d,c]=(0,n.useState)({top:0,right:0}),u=(0,n.useCallback)(()=>{if(!l.current)return;let e=l.current.getBoundingClientRect();c({top:e.bottom+6,right:window.innerWidth-e.right})},[]);return(0,n.useEffect)(()=>{if(!a)return;u();let e=e=>{let t=e.target;l.current?.contains(t)||i.current?.contains(t)||o(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[a,u]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("button",{ref:l,className:"theme-picker-btn",onClick:()=>o(!a),title:"테마 변경",children:[(0,s.jsx)("span",{className:"theme-picker-preview",style:{background:`hsl(${e.colors["--primary"]})`}}),(0,s.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"3"}),(0,s.jsx)("path",{d:"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"})]})]}),a&&(0,y.createPortal)((0,s.jsxs)("div",{ref:i,className:"theme-picker-dropdown",style:{position:"fixed",top:d.top,right:d.right},children:[(0,s.jsx)("div",{className:"theme-picker-title",children:"테마"}),(0,s.jsx)("div",{className:"theme-picker-grid",children:r.map(r=>(0,s.jsxs)("button",{className:`theme-picker-item ${r.id===e.id?"theme-picker-item-active":""}`,onClick:()=>{t(r.id),o(!1)},children:[(0,s.jsxs)("div",{className:"theme-picker-swatch",children:[(0,s.jsx)("div",{style:{background:`hsl(${r.colors["--background"]})`,flex:1}}),(0,s.jsx)("div",{style:{background:`hsl(${r.colors["--primary"]})`,flex:1}}),(0,s.jsx)("div",{style:{background:`hsl(${r.colors["--accent"]})`,flex:1}})]}),(0,s.jsxs)("span",{className:"theme-picker-name",children:[r.emoji," ",r.name]})]},r.id))})]}),document.body)]})}let N="im-update-dismissed";function k(){let[e,t]=(0,n.useState)(null),[r,a]=(0,n.useState)(!1),[o,l]=(0,n.useState)(!1),[i,d]=(0,n.useState)(!1),[c,u]=(0,n.useState)(null),x=(0,n.useRef)(null);(0,n.useEffect)(()=>{x.current=localStorage.getItem(N)},[]);let m=(0,n.useCallback)(async()=>{try{let e=await fetch("/api/version");if(!e.ok)return;let r=await e.json();t(r)}catch{}},[]);(0,n.useEffect)(()=>{m();let e=setInterval(m,36e5);return()=>clearInterval(e)},[m]);let p=e?.latest!==null&&e?.latest===x.current,h=!!e?.updateAvailable&&!p,f=(0,n.useCallback)(async()=>{l(!0),u(null);try{let e=await fetch("/api/update",{method:"POST"}),t=await e.json();u(t),t.ok&&(d(!0),await m())}catch(e){u({ok:!1,error:e instanceof Error?e.message:"Network error"})}finally{l(!1)}},[m]),g=(0,n.useCallback)(()=>{if(e?.latest){try{localStorage.setItem(N,e.latest)}catch{}x.current=e.latest}t(e=>e?{...e,updateAvailable:!1}:e)},[e?.latest]);return(0,s.jsxs)(s.Fragment,{children:[h?(0,s.jsxs)("button",{onClick:()=>a(!0),title:`IM v${e?.latest} 업데이트 가능 (현재 ${e?.current})`,className:"text-xs px-2 py-1 rounded-md border border-success/40 bg-success/15 text-success hover:bg-success/25 transition-colors flex items-center gap-1.5 mr-2",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-success animate-pulse"}),"v",e?.latest," 업데이트"]}):e?(0,s.jsxs)("button",{onClick:()=>a(!0),title:`현재 IM v${e.current} \xb7 업데이트 확인`,className:"text-[10px] px-1.5 py-0.5 rounded text-muted-foreground/60 hover:text-muted-foreground transition-colors mr-2",children:["v",e.current]}):null,r&&(0,s.jsx)("div",{onClick:()=>!o&&a(!1),className:"fixed inset-0 z-[60] flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(3px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-md animate-dialog-in p-5 flex flex-col gap-3",children:[(0,s.jsxs)("div",{className:"flex items-start justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-sm font-semibold text-foreground",children:"IM 업데이트"}),(0,s.jsxs)("div",{className:"text-xs text-muted-foreground mt-0.5",children:["현재 ",(0,s.jsxs)("span",{className:"text-foreground font-mono",children:["v",e?.current]}),e?.latest&&(0,s.jsxs)(s.Fragment,{children:[" → ",(0,s.jsxs)("span",{className:`font-mono ${e.updateAvailable?"text-success":"text-foreground"}`,children:["v",e.latest]})]})]})]}),!o&&(0,s.jsx)("button",{onClick:()=>a(!1),className:"text-muted-foreground hover:text-foreground text-lg leading-none",children:"\xd7"})]}),i?(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("div",{className:"text-sm text-success flex items-center gap-2",children:[(0,s.jsx)("span",{children:"✓"}),(0,s.jsx)("span",{children:"설치 완료"}),c?.durationMs&&(0,s.jsxs)("span",{className:"text-xs text-muted-foreground",children:["(",Math.round(c.durationMs/1e3),"s)"]})]}),(0,s.jsxs)("div",{className:"text-xs text-muted-foreground leading-relaxed",children:["새 버전을 반영하려면 ",(0,s.jsx)("span",{className:"font-mono text-foreground",children:"im start"})," 프로세스를 재시작하세요. PM2로 실행 중이면 ",(0,s.jsx)("span",{className:"font-mono text-foreground",children:"pm2 restart idea-manager"}),"로 즉시 반영됩니다."]})]}):o?(0,s.jsxs)("div",{className:"flex items-center gap-2 text-sm text-foreground",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),(0,s.jsx)("span",{children:"설치 중… (최대 3분)"})]}):e?.updateAvailable?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"text-xs text-muted-foreground leading-relaxed",children:[(0,s.jsx)("span",{className:"font-mono",children:"npm install -g idea-manager@latest"}),"를 실행해 최신 버전을 설치합니다. 설치가 끝나면 재시작 안내가 표시됩니다."]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2 mt-1",children:[(0,s.jsx)("button",{onClick:g,className:"text-xs text-muted-foreground px-2 py-1 hover:text-foreground transition-colors",children:"이 버전 건너뜀"}),(0,s.jsx)("button",{onClick:f,className:"text-xs px-3 py-1.5 bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity",children:"지금 설치"})]})]}):(0,s.jsx)("div",{className:"text-xs text-muted-foreground",children:"최신 버전을 사용 중입니다."}),c&&!c.ok&&(0,s.jsxs)("div",{className:"mt-2 flex flex-col gap-1.5",children:[(0,s.jsxs)("div",{className:"text-xs text-destructive",children:["⚠ 설치 실패",void 0!==c.code&&null!==c.code?` (exit ${c.code})`:""]}),(c.stderr||c.error)&&(0,s.jsx)("pre",{className:"text-[10px] bg-muted/50 border border-border rounded p-2 max-h-40 overflow-auto whitespace-pre-wrap break-words text-muted-foreground",children:c.stderr||c.error})]})]})})]})}let w=[],C=new Set;function S(){for(let e of C)e()}function E(e){w=[...w,e],S()}function T(e){w=w.filter(t=>t.id!==e),S()}function I(){return w}function $(e){return C.add(e),()=>{C.delete(e)}}let P={refine:"⌘K Refine","task-chat":"Note Assistant","project-advisor":"Project Advisor","global-advisor":"Global Advisor",watch:"Watch"};function A(){let e=(0,n.useSyncExternalStore)($,I,I),[,t]=(0,n.useState)(0),[r,a]=(0,n.useState)(!1);return((0,n.useEffect)(()=>{if(0===e.length)return;let r=setInterval(()=>t(e=>e+1),1e3);return()=>clearInterval(r)},[e.length]),0===e.length)?null:(0,s.jsxs)("div",{className:"relative mr-2",children:[(0,s.jsxs)("button",{onClick:()=>a(e=>!e),className:"flex items-center gap-1.5 text-xs px-2 py-1 rounded-md border border-warning/40 bg-warning/15 text-warning hover:bg-warning/25 transition-colors",title:`AI 작업 ${e.length}개 진행 중`,children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),(0,s.jsxs)("span",{children:["AI ",e.length]})]}),r&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"fixed inset-0 z-[80]",onClick:()=>a(!1)}),(0,s.jsxs)("div",{className:"absolute right-0 top-full mt-1 z-[81] bg-card border border-border rounded-lg shadow-xl w-72 py-1 animate-dialog-in",children:[(0,s.jsx)("div",{className:"px-3 py-1.5 text-[10px] uppercase tracking-wider text-muted-foreground/70 border-b border-border",children:"진행 중인 AI 작업"}),e.map(e=>{var t;let r;return(0,s.jsxs)("div",{className:"px-3 py-2 flex items-center gap-2 text-xs",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse flex-shrink-0"}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("div",{className:"text-foreground truncate",children:e.label}),(0,s.jsx)("div",{className:"text-muted-foreground/70",children:P[e.type]??e.type})]}),(0,s.jsx)("span",{className:"text-muted-foreground font-mono flex-shrink-0",children:(t=e.startedAt,(r=Math.floor((Date.now()-t)/1e3))<60?`${r}s`:`${Math.floor(r/60)}m${r%60}s`)})]},e.id)})]})]})]})}function _(){let{state:e,setActiveTab:t,closeTab:r}=x();return(0,s.jsxs)("div",{className:"tab-bar",children:[e.tabs.map(n=>{let a=e.activeTabId===n.id,o="dashboard"===n.type;return(0,s.jsxs)("div",{onClick:()=>t(n.id),onMouseDown:e=>{1!==e.button||o||(e.preventDefault(),r(n.id))},className:`tab-item ${a?"tab-item-active":""}`,children:[(0,s.jsx)("span",{className:"truncate",children:o?"Dashboard":n.projectName||"Workspace"}),!o&&(0,s.jsx)("button",{onClick:e=>{e.stopPropagation(),r(n.id)},className:"tab-close",children:"\xd7"})]},n.id)}),(0,s.jsx)("div",{className:"tab-bar-spacer"}),(0,s.jsx)(A,{}),(0,s.jsx)(k,{}),(0,s.jsx)(v,{})]})}function D({onSelect:e,onCancel:t,initialPath:r}){let[a,o]=(0,n.useState)(null),[l,i]=(0,n.useState)(!0),[d,c]=(0,n.useState)(null),[u,x]=(0,n.useState)(!1),m=(0,n.useCallback)(async e=>{i(!0),c(null),x(!1);try{let t=e?`?path=${encodeURIComponent(e)}`:"",r=await fetch(`/api/filesystem${t}`);if(r.ok)o(await r.json());else{let e=await r.json();c(e.error||"불러오기 실패"),e.permissionError&&x(!0)}}catch{c("불러오기 실패")}finally{i(!1)}},[]);return(0,n.useEffect)(()=>{m(r)},[m,r]),(0,s.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",onClick:t,children:(0,s.jsxs)("div",{className:"bg-card border border-border rounded-lg shadow-xl w-[520px] max-h-[70vh] flex flex-col",onClick:e=>e.stopPropagation(),children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"프로젝트 폴더 선택"}),(0,s.jsx)("button",{onClick:t,className:"text-muted-foreground hover:text-foreground text-lg leading-none",children:"\xd7"})]}),(0,s.jsx)("div",{className:"px-4 py-2 border-b border-border bg-muted",children:(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-xs text-muted-foreground shrink-0",children:"경로:"}),(0,s.jsx)("span",{className:"text-xs font-mono truncate flex-1",title:a?.current,children:a?.current||"..."}),a?.isProject&&(0,s.jsx)("span",{className:"text-xs text-success shrink-0 font-medium",children:"프로젝트 감지"})]})}),(0,s.jsx)("div",{className:"flex-1 overflow-y-auto min-h-0",children:l?(0,s.jsx)("div",{className:"p-8 text-center text-muted-foreground text-sm",children:"불러오는 중..."}):d?(0,s.jsxs)("div",{className:"p-6 text-center",children:[(0,s.jsx)("div",{className:"text-destructive text-sm mb-2",children:d}),u&&(0,s.jsxs)("div",{className:"text-xs text-muted-foreground leading-relaxed mt-3 text-left bg-muted rounded-md p-3",children:[(0,s.jsx)("p",{className:"font-semibold mb-1",children:"macOS 권한 설정이 필요합니다"}),(0,s.jsx)("p",{children:"시스템 설정 → 개인정보 보호 및 보안 → 전체 디스크 접근 권한에서 터미널 앱을 추가해주세요."}),(0,s.jsx)("p",{className:"mt-1 text-muted-foreground",children:"Documents, Desktop 등 보호된 폴더는 별도 권한이 필요합니다."})]})]}):(0,s.jsxs)("div",{className:"py-1",children:[a?.parent&&(0,s.jsxs)("button",{onClick:()=>m(a.parent),className:"w-full text-left px-4 py-2 text-sm hover:bg-muted transition-colors flex items-center gap-2 text-muted-foreground",children:[(0,s.jsx)("span",{children:"↑"}),(0,s.jsx)("span",{children:".."})]}),a?.dirs.length===0&&(0,s.jsx)("div",{className:"px-4 py-6 text-center text-muted-foreground text-xs",children:"하위 폴더가 없습니다"}),a?.dirs.map(e=>(0,s.jsxs)("button",{onClick:()=>m(e.path),className:"w-full text-left px-4 py-2 text-sm hover:bg-muted transition-colors flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"\uD83D\uDCC1"}),(0,s.jsx)("span",{children:e.name})]},e.path))]})}),(0,s.jsxs)("div",{className:"flex items-center justify-end gap-2 px-4 py-3 border-t border-border",children:[(0,s.jsx)("button",{onClick:t,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors",children:"취소"}),(0,s.jsx)("button",{onClick:()=>a&&e(a.current),disabled:!a,className:"px-4 py-1.5 text-xs bg-primary hover:bg-primary-hover text-white rounded-md transition-colors disabled:opacity-50",children:"이 폴더 선택"})]})]})})}function M({open:e,title:t,description:r,confirmLabel:a="Confirm",cancelLabel:o="Cancel",variant:l="default",onConfirm:i,onCancel:d}){let c=(0,n.useRef)(null),u=(0,n.useRef)(null);(0,n.useEffect)(()=>{e&&c.current?.focus()},[e]);let x=(0,n.useCallback)(t=>{e&&("Escape"===t.key&&d(),"Enter"===t.key&&i())},[e,d,i]);return((0,n.useEffect)(()=>(window.addEventListener("keydown",x),()=>window.removeEventListener("keydown",x)),[x]),e)?(0,s.jsx)("div",{ref:u,onClick:e=>{e.target===u.current&&d()},className:"fixed inset-0 z-50 flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{className:"bg-card border border-border rounded-xl shadow-2xl shadow-black/40 w-full max-w-sm mx-4 animate-dialog-in",children:[(0,s.jsxs)("div",{className:"p-5",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:t}),r&&(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-1.5 leading-relaxed",children:r})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2 px-5 pb-4",children:[(0,s.jsx)("button",{onClick:d,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground bg-muted hover:bg-card-hover border border-border rounded-md transition-colors",children:o}),(0,s.jsx)("button",{ref:c,onClick:i,className:`px-3 py-1.5 text-xs text-white rounded-md transition-colors ${"danger"===l?"bg-destructive hover:bg-destructive/80":"bg-primary hover:bg-primary-hover"}`,children:a})]})]})}):null}let L=[{key:"active",label:"Active"},{key:"all",label:"All"},{key:"today",label:"Today"},{key:"archive",label:"Archive"}];function O({value:e,onChange:t}){let[r,a]=(0,n.useState)(!1);return((0,n.useEffect)(()=>a(!0),[]),r)?(0,s.jsx)("div",{className:"flex gap-1 bg-muted rounded-lg p-1",children:L.map(r=>(0,s.jsx)("button",{onClick:()=>t(r.key),className:`px-4 py-1.5 text-sm rounded-md transition-all ${e===r.key?"bg-card text-foreground shadow-sm font-medium":"text-muted-foreground hover:text-foreground"}`,children:r.label},r.key))}):null}let R={idea:"\uD83D\uDCA1",doing:"\uD83D\uDD25",writing:"✏️",submitted:"\uD83D\uDE80",testing:"\uD83E\uDDEA",done:"✅",problem:"\uD83D\uDD34"};function F({subProject:e,projectName:t,onClick:r}){let{active_count:n,pending_count:a,done_count:o,problem_count:l,task_count:i,preview_tasks:d,last_activity:c}=e;return(0,s.jsxs)("div",{onClick:r,className:"p-4 bg-card hover:bg-card-hover border border-border rounded-xl cursor-pointer transition-all group hover:border-muted-foreground/30 hover:shadow-md hover:shadow-black/20",children:[(0,s.jsxs)("div",{className:"flex items-start justify-between mb-2",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold group-hover:text-primary transition-colors truncate flex-1",children:e.name}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground ml-2 flex-shrink-0",children:t})]}),d.length>0&&(0,s.jsx)("div",{className:"space-y-1 mb-3",children:d.map((e,t)=>(0,s.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[(0,s.jsx)("span",{className:"flex-shrink-0",children:R[e.status]}),(0,s.jsx)("span",{className:`truncate ${"done"===e.status?"text-muted-foreground line-through":"text-foreground"}`,children:e.title})]},t))}),(0,s.jsxs)("div",{className:"flex items-center justify-between text-xs text-muted-foreground",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[n>0&&(0,s.jsxs)("span",{className:"text-primary",children:["active ",n]}),a>0&&(0,s.jsxs)("span",{children:["pending ",a]}),o>0&&(0,s.jsxs)("span",{className:"text-success",children:["done ",o]}),l>0&&(0,s.jsxs)("span",{className:"text-destructive",children:["problem ",l]}),0===i&&(0,s.jsx)("span",{children:"no tasks"})]}),c&&(0,s.jsx)("span",{children:function(e){if(!e)return"";let t=Math.floor((Date.now()-new Date(e).getTime())/6e4);if(t<1)return"just now";if(t<60)return`${t}m ago`;let r=Math.floor(t/60);if(r<24)return`${r}h ago`;let s=Math.floor(r/24);return`${s}d ago`}(c)})]})]})}function K(){let e,{state:t,openProject:r,closeTab:a}=x(),o="dashboard"===t.activeTabId,[l,i]=(0,n.useState)([]),[d,c]=(0,n.useState)([]),[u,m]=(0,n.useState)([]),[p,h]=(0,n.useState)(null),[f,g]=(0,n.useState)(!1),[b,j]=(0,n.useState)(""),[y,v]=(0,n.useState)(""),[N,k]=(0,n.useState)(""),[w,C]=(0,n.useState)(!0),[S,E]=(0,n.useState)(!1),[T,I]=(0,n.useState)(null),[$,P]=(0,n.useState)(null),[A,_]=(0,n.useState)(""),[L,R]=(0,n.useState)(""),[K,z]=(0,n.useState)(""),[J,B]=(0,n.useState)(!1),[W,U]=(0,n.useState)([]),[G,H]=(0,n.useState)(""),[q,V]=(0,n.useState)(!1),[X,Z]=(0,n.useState)(null),[Q,Y]=(0,n.useState)(!1),[ee,et]=(0,n.useState)(""),[er,es]=(0,n.useState)(""),[en,ea]=(0,n.useState)(!1),eo=(0,n.useRef)(null),[el,ei]=(0,n.useState)("active"),ed=(0,n.useCallback)(async()=>{let e=await fetch("/api/projects"),t=await e.json(),r=await Promise.all(t.map(async e=>{let t=await fetch(`/api/projects/${e.id}/sub-projects`),r=await t.json();return{...e,subProjects:r}}));i(r);let s=[];for(let e of r)for(let t of e.subProjects)if(t.task_count>0){let r=await fetch(`/api/projects/${e.id}/sub-projects/${t.id}/tasks`);for(let n of(await r.json()))s.push({...n,projectName:e.name,subProjectName:t.name})}m(s),c(s.filter(e=>e.is_today)),C(!1)},[]);(0,n.useEffect)(()=>{ed(),fetch("/api/global-memo").then(e=>e.json()).then(e=>H(e.content||"")),fetch("/api/maintenance",{method:"POST"}).catch(()=>{}),"true"===localStorage.getItem("im-memo-open")&&ea(!0);let e=localStorage.getItem("im-dashboard-tab");e&&ei(e)},[ed]),(0,n.useEffect)(()=>{o&&!w&&ed()},[o]);let ec=(0,n.useCallback)(async()=>{let e=await fetch("/api/archive");U((await e.json()).map(e=>{let t=l.find(t=>t.id===e.project_id),r=t?.subProjects.find(t=>t.id===e.sub_project_id);return{...e,projectName:t?.name,subProjectName:r?.name}}))},[l]),eu=async()=>{V(!0),et("");let e=await fetch("/api/sync");Z(await e.json())},ex=async e=>{Y(!0),et("");try{let t=await fetch("/api/sync",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e,repoUrl:er})}),r=await t.json();if(t.ok){if(et(r.message||"Success"),"init"===e){let e=await fetch("/api/sync").then(e=>e.json());Z(e)}"pull"===e&&ed()}else et(`Error: ${r.error}`)}catch{et("Error: request failed")}Y(!1)},em=async e=>{if(e.preventDefault(),!b.trim())return;let t=await fetch("/api/projects",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:b.trim(),description:y.trim(),project_path:N.trim()||void 0})});if(t.ok){let e=await t.json();j(""),v(""),k(""),g(!1),r(e.id,e.name)}},ep=async()=>{T&&(await fetch(`/api/projects/${T}`,{method:"DELETE"}),a(T),I(null),ed())},eh=async()=>{$&&A.trim()&&(await fetch(`/api/projects/${$.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:A.trim(),description:L.trim(),project_path:K.trim()||null})})).ok&&(P(null),ed())},ef={idea:"\uD83D\uDCA1",writing:"✏️",submitted:"\uD83D\uDE80",testing:"\uD83E\uDDEA",done:"✅",problem:"\uD83D\uDD34"},eg=(()=>{let e=0,t=0,r=0,s=0,n=0;for(let a of l)for(let o of a.subProjects)e+=o.task_count,t+=o.active_count,r+=o.pending_count,s+=o.done_count,n+=o.problem_count;return{total:e,active:t,pending:r,done:s,problem:n,today:d.length}})(),eb=[{label:"Total",value:eg.total,color:"text-foreground",bg:"bg-foreground/5",filter:"total"},{label:"Active",value:eg.active,color:"text-cyan-400",bg:"bg-cyan-400/10",filter:"active"},{label:"Pending",value:eg.pending,color:"text-indigo-400",bg:"bg-indigo-400/10",filter:"pending"},{label:"Done",value:eg.done,color:"text-emerald-400",bg:"bg-emerald-400/10",filter:"done"},{label:"Problem",value:eg.problem,color:"text-red-400",bg:"bg-red-400/10",filter:"problem"},{label:"Today",value:eg.today,color:"text-amber-400",bg:"bg-amber-400/10",filter:"today"}],ej=p?u.filter({total:()=>!0,active:e=>"doing"===e.status||"submitted"===e.status||"testing"===e.status,pending:e=>"idea"===e.status||"writing"===e.status,done:e=>"done"===e.status,problem:e=>"problem"===e.status,today:e=>e.is_today}[p]||(()=>!0)):[];return(0,s.jsxs)("div",{className:"h-full overflow-y-auto p-8 w-full max-w-5xl mx-auto",children:[(0,s.jsxs)("header",{className:"flex items-center justify-between mb-6",children:[(0,s.jsx)("div",{children:(0,s.jsxs)("h1",{className:"text-2xl font-bold tracking-tight",children:["IM ",(0,s.jsx)("span",{className:"text-muted-foreground font-normal text-sm ml-2",children:"Idea Manager v2"})]})}),(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)(O,{value:el,onChange:e=>{ei(e),localStorage.setItem("im-dashboard-tab",e),"archive"===e&&ec()}}),(0,s.jsx)("button",{onClick:eu,className:"px-3 py-2 text-sm border rounded-lg transition-colors bg-muted hover:bg-card-hover text-muted-foreground border-border",title:"DB Sync via Git",children:"Sync"}),(0,s.jsx)("button",{onClick:()=>{let e=!en;ea(e),localStorage.setItem("im-memo-open",String(e))},className:`px-3 py-2 text-sm border rounded-lg transition-colors ${en?"bg-accent/15 text-accent border-accent/30 hover:bg-accent/25":"bg-muted hover:bg-card-hover text-muted-foreground border-border"}`,title:"Quick memo",children:"Memo"}),(0,s.jsx)("button",{onClick:()=>g(!f),className:"px-4 py-2 bg-primary hover:bg-primary-hover text-white rounded-lg transition-colors font-medium text-sm",children:"+ Workspace"})]})]}),!w&&eg.total>0&&(0,s.jsxs)("div",{className:"mb-6",children:[(0,s.jsx)("div",{className:"grid grid-cols-6 gap-2",children:eb.map(({label:e,value:t,color:r,bg:n,filter:a})=>(0,s.jsxs)("button",{onClick:()=>h(p===a?null:a),className:`${n} rounded-lg p-3 text-center transition-all hover:scale-[1.02] hover:brightness-110 cursor-pointer
|
|
2
|
+
${p===a?"ring-2 ring-offset-1 ring-offset-transparent ring-current scale-[1.02]":""}`,children:[(0,s.jsx)("div",{className:`text-xl font-bold ${r}`,children:t}),(0,s.jsx)("div",{className:"text-[10px] text-muted-foreground uppercase tracking-wider mt-0.5",children:e})]},e))}),eg.total>0&&(0,s.jsxs)("div",{className:"mt-2 h-1.5 rounded-full bg-muted overflow-hidden flex",children:[eg.done>0&&(0,s.jsx)("div",{className:"bg-emerald-400 transition-all",style:{width:`${eg.done/eg.total*100}%`}}),eg.active>0&&(0,s.jsx)("div",{className:"bg-cyan-400 transition-all",style:{width:`${eg.active/eg.total*100}%`}}),eg.pending>0&&(0,s.jsx)("div",{className:"bg-indigo-400 transition-all",style:{width:`${eg.pending/eg.total*100}%`}}),eg.problem>0&&(0,s.jsx)("div",{className:"bg-red-400 transition-all",style:{width:`${eg.problem/eg.total*100}%`}})]}),p&&(0,s.jsxs)("div",{className:"mt-3 space-y-1.5",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("span",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:[eb.find(e=>e.filter===p)?.label," — ",ej.length," tasks"]}),(0,s.jsx)("button",{onClick:()=>h(null),className:"text-xs text-muted-foreground hover:text-foreground transition-colors",children:"Clear"})]}),(0,s.jsx)("div",{className:"max-h-[280px] overflow-y-auto space-y-1",children:ej.map(e=>(0,s.jsxs)("div",{onClick:()=>r(e.project_id,e.projectName,e.sub_project_id,e.id),className:"flex items-center gap-3 px-3 py-2 bg-card hover:bg-card-hover border border-border rounded-lg cursor-pointer transition-colors",children:[(0,s.jsx)("span",{className:"text-sm",children:ef[e.status]}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:e.title}),(0,s.jsxs)("span",{className:"text-xs text-muted-foreground ml-2",children:[e.projectName," / ",e.subProjectName]})]})]},e.id))})]})]}),en&&(0,s.jsxs)("div",{className:"mb-6 bg-card rounded-lg border border-border overflow-hidden",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-4 py-2 border-b border-border",children:[(0,s.jsx)("span",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"Quick Memo"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground",children:"auto-saved"})]}),(0,s.jsx)("textarea",{value:G,onChange:e=>{var t;H(t=e.target.value),eo.current&&clearTimeout(eo.current),eo.current=setTimeout(()=>{fetch("/api/global-memo",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})})},500)},placeholder:"자유롭게 메모하세요...",className:"w-full bg-transparent px-4 py-3 text-sm text-foreground resize-none focus:outline-none leading-relaxed font-mono min-h-[150px] max-h-[400px]",style:{height:Math.max(150,Math.min(400,(G.split("\n").length+1)*22))}})]}),f&&(0,s.jsxs)("form",{onSubmit:em,className:"mb-6 p-5 bg-card rounded-lg border border-border",children:[(0,s.jsx)("input",{type:"text",placeholder:"Workspace name",value:b,onChange:e=>j(e.target.value),className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 mb-3 focus:border-primary focus:outline-none text-foreground",autoFocus:!0}),(0,s.jsx)("input",{type:"text",placeholder:"Description (optional)",value:y,onChange:e=>v(e.target.value),className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 mb-3 focus:border-primary focus:outline-none text-foreground"}),(0,s.jsx)("div",{className:"mb-4",children:(0,s.jsx)("button",{type:"button",onClick:()=>E(!0),className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 text-left text-sm hover:border-primary transition-colors",children:N?(0,s.jsx)("span",{className:"font-mono text-foreground",children:N}):(0,s.jsx)("span",{className:"text-muted-foreground",children:"Workspace folder (optional)"})})}),(0,s.jsxs)("div",{className:"flex gap-2 justify-end",children:[(0,s.jsx)("button",{type:"button",onClick:()=>g(!1),className:"px-4 py-2 text-muted-foreground hover:text-foreground transition-colors text-sm",children:"Cancel"}),(0,s.jsx)("button",{type:"submit",className:"px-4 py-2 bg-primary hover:bg-primary-hover text-white rounded-lg transition-colors text-sm",children:"Create"})]})]}),w?(0,s.jsx)("div",{className:"text-center text-muted-foreground py-20",children:"Loading..."}):"archive"===el?0===W.length?(0,s.jsxs)("div",{className:"text-center py-20 text-muted-foreground",children:[(0,s.jsx)("p",{className:"text-lg mb-2",children:"No archived tasks"}),(0,s.jsx)("p",{className:"text-sm",children:"Archived tasks will appear here"})]}):(0,s.jsx)("div",{className:"space-y-2",children:W.map(e=>(0,s.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-card border border-border rounded-lg transition-colors group",children:[(0,s.jsx)("span",{className:"text-sm",children:ef[e.status]}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:e.title}),(0,s.jsxs)("span",{className:"text-xs text-muted-foreground ml-2",children:[e.projectName,e.subProjectName?` / ${e.subProjectName}`:""]}),e.description&&(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-0.5 truncate",children:e.description})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:[(0,s.jsx)("button",{onClick:async()=>{await fetch("/api/archive",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({taskId:e.id,action:"restore"})}),ec(),ed()},className:"px-2 py-1 text-xs text-primary hover:bg-primary/10 rounded transition-colors",children:"Restore"}),(0,s.jsx)("button",{onClick:async()=>{await fetch("/api/archive",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({taskId:e.id,action:"delete"})}),ec()},className:"px-2 py-1 text-xs text-destructive hover:bg-destructive/10 rounded transition-colors",children:"Delete"})]})]},e.id))}):"today"===el?0===d.length?(0,s.jsxs)("div",{className:"text-center py-20 text-muted-foreground",children:[(0,s.jsx)("p",{className:"text-lg mb-2",children:"No tasks marked for today"}),(0,s.jsx)("p",{className:"text-sm",children:"Mark tasks with the Today button in task detail"})]}):(0,s.jsx)("div",{className:"space-y-2",children:d.map(e=>(0,s.jsxs)("div",{onClick:()=>r(e.project_id,e.projectName,e.sub_project_id,e.id),className:"flex items-center gap-3 p-3 bg-card hover:bg-card-hover border border-border rounded-lg cursor-pointer transition-colors",children:[(0,s.jsx)("span",{className:"text-sm",children:ef[e.status]}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:e.title}),(0,s.jsxs)("span",{className:"text-xs text-muted-foreground ml-2",children:[e.projectName," / ",e.subProjectName]})]})]},e.id))}):(0,s.jsx)(s.Fragment,{children:"all"===el?0===l.length?(0,s.jsxs)("div",{className:"text-center py-20",children:[(0,s.jsx)("p",{className:"text-muted-foreground text-lg mb-2",children:"No workspaces yet"}),(0,s.jsx)("p",{className:"text-muted-foreground text-sm",children:"Click + Workspace to get started"})]}):(0,s.jsx)("div",{className:"space-y-6",children:l.map(e=>(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 cursor-pointer hover:text-primary transition-colors",onClick:()=>r(e.id,e.name),children:[(0,s.jsx)("h2",{className:"text-sm font-semibold",children:e.name}),e.project_path&&(0,s.jsx)("span",{className:"text-xs text-muted-foreground font-mono truncate max-w-48",children:e.project_path})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),P(e),_(e.name),R(e.description),z(e.project_path||"")},className:"text-xs text-muted-foreground hover:text-foreground transition-colors",children:"Edit"}),(0,s.jsx)("button",{onClick:t=>{var r;return r=e.id,void(t.stopPropagation(),I(r))},className:"text-xs text-muted-foreground hover:text-destructive transition-colors",children:"Delete"})]})]}),0===e.subProjects.length?(0,s.jsxs)("div",{className:"text-xs text-muted-foreground py-4 text-center border border-dashed border-border rounded-lg",children:["No projects."," ",(0,s.jsx)("span",{className:"text-primary cursor-pointer hover:underline",onClick:()=>r(e.id,e.name),children:"Open workspace"})," ","to add one."]}):(0,s.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3",children:e.subProjects.map(t=>(0,s.jsx)(F,{subProject:t,projectName:e.name,onClick:()=>r(e.id,e.name,t.id)},t.id))})]},e.id))}):0===(e=(()=>{let e=[];for(let t of l)for(let r of t.subProjects)"active"===el?(r.active_count>0||r.problem_count>0)&&e.push({sp:r,projectName:t.name,projectId:t.id}):"all"===el&&e.push({sp:r,projectName:t.name,projectId:t.id});return e.sort((e,t)=>t.sp.active_count+t.sp.problem_count-(e.sp.active_count+e.sp.problem_count)),e})()).length?(0,s.jsxs)("div",{className:"text-center py-20 text-muted-foreground",children:[(0,s.jsx)("p",{className:"text-lg mb-2",children:"No active tasks"}),(0,s.jsx)("p",{className:"text-sm",children:"Submit tasks to see them here"})]}):(0,s.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3",children:e.map(({sp:e,projectName:t,projectId:n})=>(0,s.jsx)(F,{subProject:e,projectName:t,onClick:()=>{let s=l.find(e=>e.id===n);r(n,s?.name||t,e.id)}},e.id))})}),S&&(0,s.jsx)(D,{onSelect:e=>{k(e),E(!1)},onCancel:()=>E(!1)}),q&&(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:()=>V(!1)}),(0,s.jsxs)("div",{className:"relative bg-card border border-border rounded-xl shadow-2xl w-[480px] animate-dialog-in",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-b border-border",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"DB Sync"}),(0,s.jsx)("button",{onClick:()=>V(!1),className:"text-muted-foreground hover:text-foreground text-lg px-1",children:"x"})]}),(0,s.jsxs)("div",{className:"p-5 space-y-4",children:[null===X?(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading..."}):X.initialized?(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsxs)("div",{className:"text-xs space-y-1",children:[(0,s.jsxs)("p",{children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Remote:"})," ",(0,s.jsx)("span",{className:"font-mono",children:X.remoteUrl||"none"})]}),(0,s.jsxs)("p",{children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Last sync:"})," ",X.lastCommit||"never"]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>ex("push"),disabled:Q,className:"flex-1 px-4 py-2 text-sm bg-primary text-white rounded-lg hover:bg-primary-hover transition-colors disabled:opacity-50",children:Q?"...":"Push"}),(0,s.jsx)("button",{onClick:()=>ex("pull"),disabled:Q,className:"flex-1 px-4 py-2 text-sm bg-muted text-foreground border border-border rounded-lg hover:bg-card-hover transition-colors disabled:opacity-50",children:Q?"...":"Pull"})]})]}):(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Git 저장소 URL을 입력하세요."}),(0,s.jsx)("input",{value:er,onChange:e=>es(e.target.value),placeholder:"https://github.com/user/repo.git",className:"w-full bg-input border border-border rounded-lg px-3 py-2 text-sm focus:border-primary focus:outline-none text-foreground"}),(0,s.jsx)("button",{onClick:()=>ex("init"),disabled:Q||!er.trim(),className:"w-full px-4 py-2 text-sm bg-primary text-white rounded-lg hover:bg-primary-hover transition-colors disabled:opacity-50",children:Q?"Initializing...":"Initialize"})]}),ee&&(0,s.jsx)("p",{className:`text-xs ${ee.startsWith("Error")?"text-destructive":"text-success"}`,children:ee})]})]})]}),$&&(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:()=>P(null)}),(0,s.jsxs)("div",{className:"relative bg-card border border-border rounded-xl shadow-2xl w-[480px] animate-dialog-in",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-b border-border",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"Edit Workspace"}),(0,s.jsx)("button",{onClick:()=>P(null),className:"text-muted-foreground hover:text-foreground text-lg px-1",children:"x"})]}),(0,s.jsxs)("div",{className:"p-5 space-y-3",children:[(0,s.jsx)("input",{type:"text",value:A,onChange:e=>_(e.target.value),placeholder:"Workspace name",className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 focus:border-primary focus:outline-none text-foreground",autoFocus:!0}),(0,s.jsx)("input",{type:"text",value:L,onChange:e=>R(e.target.value),placeholder:"Description (optional)",className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 focus:border-primary focus:outline-none text-foreground"}),(0,s.jsx)("button",{type:"button",onClick:()=>B(!0),className:"w-full bg-input border border-border rounded-lg px-4 py-2.5 text-left text-sm hover:border-primary transition-colors",children:K?(0,s.jsx)("span",{className:"font-mono text-foreground",children:K}):(0,s.jsx)("span",{className:"text-muted-foreground",children:"Workspace folder (optional)"})}),K&&(0,s.jsx)("button",{type:"button",onClick:()=>z(""),className:"text-xs text-muted-foreground hover:text-destructive transition-colors",children:"Clear folder link"})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2 px-5 py-3 border-t border-border",children:[(0,s.jsx)("button",{onClick:()=>P(null),className:"px-4 py-2 text-muted-foreground hover:text-foreground transition-colors text-sm",children:"Cancel"}),(0,s.jsx)("button",{onClick:eh,disabled:!A.trim(),className:"px-4 py-2 bg-primary hover:bg-primary-hover text-white rounded-lg transition-colors text-sm disabled:opacity-50",children:"Save"})]})]})]}),J&&(0,s.jsx)(D,{onSelect:e=>{z(e),B(!1)},onCancel:()=>B(!1),initialPath:K||void 0}),(0,s.jsx)(M,{open:!!T,title:"Delete workspace?",description:"This will permanently delete the workspace and all its data.",confirmLabel:"Delete",variant:"danger",onConfirm:ep,onCancel:()=>I(null)})]})}var z=r(5326),J=r(9434),B=r(9561),W=r(7071),U=r(6732),G=r(2161),H=r(2638);let q={"<--\x3e":"⟷","<=>":"⇔","--\x3e":"⟶","<--":"⟵","==>":"⟹","<==":"⟸","<->":"↔","=>":"⇒","->":"→","<-":"←"},V=RegExp(Object.keys(q).sort((e,t)=>t.length-e.length).map(e=>e.replace(/[-<>=]/g,"\\$&")).join("|"),"g");class X extends B.xO{constructor(e){super(),this.ch=e}eq(e){return e.ch===this.ch}toDOM(){let e=document.createElement("span");return e.textContent=this.ch,e.className="cm-ligature",e.style.color="hsl(var(--primary))",e}ignoreEvent(){return!0}}function Z(e){let t=new W.vB,r=e.state.doc;for(let e=1;e<=r.lines;e++){let s,n=r.line(e);for(V.lastIndex=0;null!==(s=V.exec(n.text));){let e=q[s[0]];if(!e)continue;let r=n.from+s.index,a=r+s[0].length;t.add(r,a,B.NZ.replace({widget:new X(e)}))}}return t.finish()}let Q=B.Z9.fromClass(class{constructor(e){this.decorations=Z(e)}update(e){e.docChanged&&(this.decorations=Z(e.view))}},{decorations:e=>e.decorations}),Y=W.Pe.define();class ee extends B.xO{constructor(e){super(),this.text=e}eq(e){return e.text===this.text}toDOM(){let e=document.createElement("span");return e.className="cm-ghost-text",e.textContent=this.text,e.style.opacity="0.35",e.style.pointerEvents="none",e}ignoreEvent(){return!0}}let et=W.sU.define({create:()=>null,update(e,t){for(let e of t.effects)if(e.is(Y))return e.value;return t.docChanged||t.selection?null:e}}),er=B.Lz.decorations.compute([et],e=>{let t=e.field(et);return t?B.NZ.set([B.NZ.widget({widget:new ee(t.text),side:1}).range(t.from)]):B.NZ.none}),es=/[.!?,;:·\n\r()[\]{}"]+/;function en(e){let t=[];for(let r of e.split(es)){let e=r.trim().split(/\s+/).filter(e=>e.length>=2);e.length&&t.push(e)}return t}let ea=null,eo=[];function el(e){let t=e.state.field(et,!1);return!!t&&(e.dispatch({changes:{from:t.from,insert:t.text},selection:{anchor:t.from+t.text.length},effects:Y.of(null)}),!0)}function ei(e){let t=e.state.selection.main.head,r=e.state.doc.lineAt(t),s=r.text.match(/^(\s*[-*+]\s)\[ \](.*)$/);if(s){let t=`${s[1]}[x]${s[2]}`;return e.dispatch({changes:{from:r.from,to:r.to,insert:t}}),!0}let n=r.text.match(/^(\s*[-*+]\s)\[[xX]\](.*)$/);if(n){let t=`${n[1]}[ ]${n[2]}`;return e.dispatch({changes:{from:r.from,to:r.to,insert:t}}),!0}return!1}function ed(e){return/^\s*\|/.test(e)}function ec(e){return/^\s*\|[\s:|-]+\|\s*$/.test(e)}function eu(e){let t=e.state.selection.main.head,r=e.state.doc.lineAt(t);if(!ed(r.text))return!1;let s="|"+Array(Math.max(r.text.split("|").filter(e=>void 0!==e).length-2,1)).fill(" ").join("|")+"|";return e.dispatch({changes:{from:r.to,insert:"\n"+s},selection:{anchor:r.to+2}}),!0}function ex(e){let t=e.state.selection.main.head,r=e.state.doc.lineAt(t);if(!ed(r.text)||ec(r.text))return!1;let s=r.to<e.state.doc.length?e.state.doc.lineAt(r.to+1):null;if(s&&ec(s.text))return!1;let n=r.from>0?r.from-1:r.from;return e.dispatch({changes:{from:n,to:r.to},selection:{anchor:Math.min(n,e.state.doc.length)}}),!0}function em(e){let{state:t}=e,r=t.selection.main.head,s=t.doc.lineAt(r);if(r!==s.to)return!1;let n=s.text,a=n.match(/^(\s*)([-*+])\s(\[[ xX]\]\s)?(.*)$/),o=n.match(/^(\s*)(\d+)\.\s(.*)$/);if(a){let[,t,n,o,l]=a;if(!l.trim())return e.dispatch({changes:{from:s.from,to:s.to,insert:t},selection:{anchor:s.from+t.length}}),!0;let i=o?`${t}${n} [ ] `:`${t}${n} `;return e.dispatch({changes:{from:r,insert:`
|
|
3
3
|
${i}`},selection:{anchor:r+1+i.length}}),!0}if(o){let[,t,n,a]=o,l=parseInt(n,10);if(!a.trim())return e.dispatch({changes:{from:s.from,to:s.to,insert:t},selection:{anchor:s.from+t.length}}),!0;let i=`${t}${l+1}. `;return e.dispatch({changes:{from:r,insert:`
|
|
4
|
-
${i}`},selection:{anchor:r+1+i.length}}),!0}return!1}let
|
|
4
|
+
${i}`},selection:{anchor:r+1+i.length}}),!0}return!1}let ep=[{label:"/todo",detail:"체크리스트",insert:"- [ ] "},{label:"/h1",detail:"제목 1",insert:"# "},{label:"/h2",detail:"제목 2",insert:"## "},{label:"/h3",detail:"제목 3",insert:"### "},{label:"/bullet",detail:"불릿 리스트",insert:"- "},{label:"/number",detail:"번호 리스트",insert:"1. "},{label:"/quote",detail:"인용",insert:"> "},{label:"/hr",detail:"구분선",insert:"---\n"},{label:"/code",detail:"코드 블록",insert:"```\n\n```"},{label:"/code ts",detail:"TypeScript 코드",insert:"```ts\n\n```"},{label:"/code py",detail:"Python 코드",insert:"```python\n\n```"},{label:"/code sql",detail:"SQL 코드",insert:"```sql\n\n```"},{label:"/code sh",detail:"Shell 코드",insert:"```bash\n\n```"},{label:"/table",detail:"3열 테이블",insert:"| 열1 | 열2 | 열3 |\n|-----|-----|-----|\n| | | |"},{label:"/link",detail:"링크",insert:"[텍스트](url)"},{label:"/bold",detail:"굵게",insert:"****"},{label:"/details",detail:"접기/펼치기",insert:"<details>\n<summary>제목</summary>\n\n내용\n\n</details>"},{label:"/addrow",detail:"테이블 행 추가 (⌘⇧↵)",insert:""},{label:"/delrow",detail:"테이블 행 삭제 (⌘⇧⌫)",insert:""}];function eh(e){let t=e.state.doc.lineAt(e.pos),r=t.text.slice(0,e.pos-t.from).match(/^(\s*)(\/\S*)$/);return r?{from:t.from+(r[1]?.length??0),options:ep.map(e=>({label:e.label,detail:e.detail,apply:(t,r,s,n)=>{if("/addrow"===e.label){t.dispatch({changes:{from:s,to:n,insert:""}}),eu(t);return}if("/delrow"===e.label){t.dispatch({changes:{from:s,to:n,insert:""}}),ex(t);return}let a=e.insert.includes("\n\n```")?e.insert.indexOf("\n\n```")+1:e.insert.length;t.dispatch({changes:{from:s,to:n,insert:e.insert},selection:{anchor:s+a}})}})),filter:!0}:null}let ef=U.cr.define([{tag:H._A.heading1,color:"hsl(var(--foreground))",fontWeight:"800",fontSize:"1.35em"},{tag:H._A.heading2,color:"hsl(var(--foreground))",fontWeight:"700",fontSize:"1.2em"},{tag:H._A.heading3,color:"hsl(var(--foreground))",fontWeight:"700",fontSize:"1.08em"},{tag:[H._A.heading4,H._A.heading5,H._A.heading6],color:"hsl(var(--foreground))",fontWeight:"700"},{tag:H._A.processingInstruction,color:"hsl(var(--accent))",fontWeight:"700"},{tag:H._A.list,color:"hsl(var(--foreground))"},{tag:H._A.emphasis,fontStyle:"italic",color:"hsl(var(--foreground))"},{tag:H._A.strong,fontWeight:"700",color:"hsl(var(--foreground))"},{tag:[H._A.link,H._A.url],color:"hsl(var(--primary))",textDecoration:"underline"},{tag:H._A.monospace,color:"hsl(var(--warning))"},{tag:H._A.quote,color:"hsl(var(--muted-foreground))",fontStyle:"italic"},{tag:H._A.contentSeparator,color:"hsl(var(--border))"},{tag:H._A.strikethrough,textDecoration:"line-through",color:"hsl(var(--muted-foreground))"}]),eg=(0,n.forwardRef)(function({value:e,onChange:t,onBlur:r,onOpenCommand:a,onPromoteLine:o,onFocusMode:l,placeholder:i,extraCorpus:d},c){let u=(0,n.useRef)(d??[]);u.current=d??[];let x=(0,n.useMemo)(()=>[(0,J.wD)({base:J.Sz}),(0,U.y9)(ef),Q,(0,G.yU)({override:[eh],defaultKeymap:!0,icons:!1}),et,er,B.Z9.fromClass(class{constructor(e){this.view=e,this.timer=null}update(e){(e.docChanged||e.selectionSet)&&(this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>{let t=function(e,t){let r=function(e){let t=e.selection.main.head,r=e.doc.lineAt(t),s=t-r.from,n=r.text.slice(0,s),a=r.text.slice(s);if(/^[A-Za-z가-힣\w_-]/.test(a))return null;let o=n.match(/([A-Za-z가-힣][\w가-힣_-]*)$/);return o?{word:o[1],from:t-o[1].length}:null}(e);if(!r||r.word.length<2)return null;let s=e.doc.toString(),n=function(e,t){let r=[];for(let t of en(e))r.push({tokens:t,weight:3});return r.concat(function(e){if(e===ea)return eo;let t=[];for(let r of e)for(let e of en(r))t.push({tokens:e,weight:1});return ea=e,eo=t,t}(t))}(s,t),a=r.word.toLowerCase(),o=function(e){let t=new Set,r=e.toLowerCase().match(/[a-z가-힣][\w가-힣_-]{1,}/g);if(!r)return t;for(let e of r)e.length>=2&&t.add(e);return t}(s),l=new Map;for(let e of n){let t=0;for(let r of e.tokens)o.has(r.toLowerCase())&&t++;let s=1+Math.min(.25*t,1);for(let t=0;t<e.tokens.length;t++){let n=e.tokens[t];if(n.length<=r.word.length||!n.toLowerCase().startsWith(a)||n===r.word)continue;let o=Math.min(2,e.tokens.length-t-1);for(let a=0;a<=o;a++){let o=0===a?n.slice(r.word.length):`${n.slice(r.word.length)} ${e.tokens.slice(t+1,t+1+a).join(" ")}`;if(o.length>40)break;let i=1+.5*a;l.set(o,(l.get(o)??0)+e.weight*i*s)}}}if(!l.size)return null;let i=null;for(let[e,t]of l)(!i||t>=i.score)&&(i={text:e,score:t});return i?{from:e.selection.main.head,text:i.text}:null}(e.view.state,u.current);e.view.dispatch({effects:Y.of(t)})},120))}destroy(){this.timer&&clearTimeout(this.timer)}}),W.Nb.highest(B.w4.of([{key:"Tab",run:el},{key:"Escape",run:e=>!!e.state.field(et,!1)&&(e.dispatch({effects:Y.of(null)}),!0)||(e.contentDOM.blur(),!0)},{key:"Enter",run:em},{key:"Mod-Enter",run:ei},{key:"Mod-Shift-Enter",run:eu},{key:"Mod-Shift-Backspace",run:ex},{key:"Mod-k",run:()=>(a?.(),!0)},{key:"Mod-Shift-t",run:()=>(o?.(),!0)},{key:"Mod-Shift-f",run:()=>(l?.(),!0)}])),B.Lz.lineWrapping,B.Lz.theme({"&":{fontSize:"13px",backgroundColor:"transparent",color:"hsl(var(--foreground))",height:"100%"},".cm-editor":{backgroundColor:"transparent"},"&.cm-focused":{outline:"none"},".cm-scroller":{fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace",lineHeight:"1.7",backgroundColor:"transparent"},".cm-content":{padding:"12px 16px",caretColor:"hsl(var(--primary))",color:"hsl(var(--foreground))"},".cm-gutters":{display:"none"},".cm-activeLine":{backgroundColor:"transparent"},".cm-activeLineGutter":{backgroundColor:"transparent"},".cm-line":{backgroundColor:"transparent"},".cm-selectionLayer .cm-selectionBackground, .cm-content ::selection, ::selection":{backgroundColor:"hsl(var(--primary) / 0.12)"},"&.cm-focused .cm-selectionBackground":{backgroundColor:"hsl(var(--primary) / 0.15)"},".cm-cursor, .cm-dropCursor":{borderLeftColor:"hsl(var(--primary))",borderLeftWidth:"2px"},".cm-ghost-text":{color:"hsl(var(--muted-foreground))",opacity:"0.55",fontStyle:"italic"},".cm-placeholder":{color:"hsl(var(--muted-foreground) / 0.55)",whiteSpace:"normal",display:"inline-block",maxWidth:"90%",lineHeight:"1.6"},".tok-heading, .tok-heading1, .tok-heading2, .tok-heading3, .tok-heading4, .tok-heading5, .tok-heading6":{color:"hsl(var(--foreground))",fontWeight:"700"},".tok-emphasis":{fontStyle:"italic",color:"hsl(var(--foreground))"},".tok-strong":{fontWeight:"700",color:"hsl(var(--foreground))"},".tok-link":{color:"hsl(var(--primary))",textDecoration:"underline"},".tok-url":{color:"hsl(var(--primary))"},".tok-monospace, .tok-literal":{color:"hsl(var(--warning))",backgroundColor:"hsl(var(--muted) / 0.5)",padding:"0 3px",borderRadius:"3px"},".tok-list":{color:"hsl(var(--accent))"},".tok-quote":{color:"hsl(var(--muted-foreground))",fontStyle:"italic"},".tok-comment, .tok-meta":{color:"hsl(var(--muted-foreground))"}})],[a]);return(0,s.jsx)("div",{className:"h-full w-full",children:(0,s.jsx)(z.Ay,{ref:c,value:e,onChange:t,onBlur:r,extensions:x,theme:"none",basicSetup:{lineNumbers:!1,foldGutter:!1,highlightActiveLine:!1,highlightActiveLineGutter:!1,autocompletion:!1,searchKeymap:!1},placeholder:i,height:"100%",style:{height:"100%"}})})});function eb({projectId:e,onCollapse:t}){let[r,a]=(0,n.useState)(""),[o,l]=(0,n.useState)(!1),[i,d]=(0,n.useState)(!1),c=(0,n.useRef)(null);(0,n.useEffect)(()=>{(async()=>{let t=await fetch(`/api/projects/${e}/brainstorm`);a((await t.json()).content||""),d(!0)})()},[e]);let u=(0,n.useCallback)(async t=>{l(!0),await fetch(`/api/projects/${e}/brainstorm`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})}),l(!1)},[e]),x=(0,n.useCallback)(e=>{a(e),c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{u(e)},1e3)},[u]);return i?(0,s.jsxs)("div",{className:"flex flex-col h-full",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-4 py-2 border-b border-border",children:[(0,s.jsx)("h2",{className:"text-sm font-medium text-muted-foreground",children:"BRAINSTORMING"}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:o?"저장 중...":r?"저장됨":""}),t&&(0,s.jsx)("button",{onClick:t,className:"text-muted-foreground hover:text-foreground transition-colors text-xs px-1",title:"접기 (B)",children:"\xab"})]})]}),(0,s.jsx)("div",{className:"flex-1 min-h-0",children:(0,s.jsx)(eg,{value:r,onChange:x,placeholder:`자유롭게 아이디어를 적어보세요...
|
|
5
5
|
|
|
6
6
|
예시:
|
|
7
7
|
- 소셜 로그인을 활용한 사용자 인증
|
|
8
8
|
- 분석 차트가 포함된 대시보드
|
|
9
9
|
- 알림 시스템 필요 (푸시 + 이메일)
|
|
10
10
|
- 다크 모드 지원
|
|
11
|
-
- 모바일 반응형 디자인 중요`})})]}):(0,s.jsx)("div",{className:"flex items-center justify-center h-full text-muted-foreground",children:"로딩 중..."})}var ep=r(4923),eh=r(7256),ef=r(9768);let eb=["idea","doing","done","problem"],eg=["writing","submitted","testing"],ej=[{key:"idea",label:"Idea",icon:"\uD83D\uDCA1",color:"text-muted-foreground"},{key:"doing",label:"Doing",icon:"\uD83D\uDD25",color:"text-primary"},{key:"writing",label:"Writing",icon:"✏️",color:"text-warning"},{key:"submitted",label:"Submitted",icon:"\uD83D\uDE80",color:"text-primary"},{key:"testing",label:"Testing",icon:"\uD83E\uDDEA",color:"text-accent"},{key:"done",label:"Done",icon:"✅",color:"text-success"},{key:"problem",label:"Problem",icon:"\uD83D\uDD34",color:"text-destructive"}];function ey(e){return ej.find(t=>t.key===e)??ej[0]}function ev({status:e,onChange:t}){let r=eg.includes(e),n=ey(e);return(0,s.jsxs)("div",{className:"flex items-center gap-1",children:[r&&(0,s.jsxs)("span",{title:`Legacy: ${n.label} (클릭해서 새 상태로 이동)`,className:`px-2 py-1 rounded text-xs ${n.color} bg-muted/50 border border-dashed border-muted-foreground/30 mr-1`,children:[n.icon," ",n.label]}),eb.map(r=>{let n=ey(r),a=e===r;return(0,s.jsx)("button",{onClick:()=>t(r),title:n.label,className:`px-2 py-1 rounded text-base transition-all ${a?`${n.color} bg-muted scale-110`:"opacity-40 hover:opacity-80"}`,children:n.icon},r)})]})}let eN={high:"bg-destructive",medium:"bg-warning",low:"bg-muted-foreground"};function ek({subProjects:e,tasks:t,selectedSubId:r,selectedTaskId:a,onSelectSub:o,onSelectTask:l,onCreateSub:i,onDeleteSub:d,onRenameSub:c,onCreateTask:u,onStatusChange:x,onTodayToggle:m,onDeleteTask:p,onReorderSubs:h,onReorderTasks:f,onAutoDistribute:b,chatStates:g}){let[j,y]=(0,n.useState)(new Set),[v,N]=(0,n.useState)(null),[k,w]=(0,n.useState)(""),C=(0,ep.FR)((0,ep.MS)(ep.AN,{activationConstraint:{distance:5}}),(0,ep.MS)(ep.uN,{coordinateGetter:eh.JR})),S=e=>{y(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r})},E=e=>{let t=k.trim();t&&(o(e),u(t),w(""),N(null))};return(0,s.jsxs)("div",{className:"flex flex-col h-full",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-3 py-2 border-b border-border flex-shrink-0",children:[(0,s.jsx)("h2",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"Projects"}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{onClick:()=>{y(e.length>0&&e.every(e=>j.has(e.id))?new Set:new Set(e.map(e=>e.id)))},className:"text-xs text-muted-foreground hover:text-foreground transition-colors",title:e.length>0&&e.every(e=>j.has(e.id))?"Expand all":"Collapse all",children:e.length>0&&e.every(e=>j.has(e.id))?"▶":"▼"}),b&&(0,s.jsx)("button",{onClick:b,className:"text-[10px] px-1.5 py-0.5 bg-accent/15 text-accent border border-accent/30 rounded hover:bg-accent/25 transition-colors",title:"AI auto-distribute brainstorming to tasks",children:"Auto"}),(0,s.jsxs)("button",{onClick:i,className:"text-xs text-muted-foreground hover:text-foreground transition-colors",title:"Add project (N)",children:["+ ",(0,s.jsx)("span",{className:"text-muted-foreground/50",children:"N"})]})]})]}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto py-1",children:[0===e.length&&(0,s.jsx)("div",{className:"text-center py-8 text-muted-foreground text-xs",children:"Create a project to get started"}),(0,s.jsx)(ep.Mp,{sensors:C,collisionDetection:ep.fp,onDragEnd:t=>{let{active:r,over:s}=t;if(!s||r.id===s.id||!h)return;let n=e.findIndex(e=>e.id===r.id),a=e.findIndex(e=>e.id===s.id);if(-1===n||-1===a)return;let o=[...e],[l]=o.splice(n,1);o.splice(a,0,l),h(o.map(e=>e.id))},children:(0,s.jsx)(eh.gB,{items:e.map(e=>e.id),strategy:eh._G,children:e.map(e=>(0,s.jsx)(ew,{sp:e,isSelected:r===e.id,isCollapsed:j.has(e.id),tasks:r===e.id?t:[],selectedTaskId:a,addingTaskFor:v,newTaskTitle:k,onSelectSub:o,onSelectTask:l,onToggleCollapse:S,onDeleteSub:d,onRenameSub:c,onStatusChange:x,onTodayToggle:m,onDeleteTask:p,onReorderTasks:f,onAddTask:E,onSetAddingTaskFor:N,onSetNewTaskTitle:w,chatStates:g},e.id))})})]})]})}function ew({sp:e,isSelected:t,isCollapsed:r,tasks:a,selectedTaskId:o,addingTaskFor:l,newTaskTitle:i,onSelectSub:d,onSelectTask:c,onToggleCollapse:u,onDeleteSub:x,onRenameSub:m,onStatusChange:p,onTodayToggle:h,onDeleteTask:f,onReorderTasks:b,onAddTask:g,onSetAddingTaskFor:j,onSetNewTaskTitle:y,chatStates:v}){let N,[k,w]=(0,n.useState)(!1),[C,S]=(0,n.useState)(e.name),E=(0,ep.FR)((0,ep.MS)(ep.AN,{activationConstraint:{distance:5}}),(0,ep.MS)(ep.uN,{coordinateGetter:eh.JR})),{attributes:T,listeners:I,setNodeRef:$,transform:P,transition:A,isDragging:_}=(0,eh.gl)({id:e.id}),D={transform:ef.Ks.Transform.toString(P),transition:A,opacity:_?.5:1,zIndex:_?10:void 0},M=()=>{let t=C.trim();t&&t!==e.name&&m&&m(e.id,t),w(!1)};return(0,s.jsxs)("div",{ref:$,style:D,className:"mb-0.5",children:[(0,s.jsxs)("div",{onClick:()=>{!k&&(t?u(e.id):(d(e.id),r&&u(e.id)))},className:`flex items-center gap-1.5 px-2 py-1.5 cursor-pointer transition-colors group text-sm ${t?"text-foreground":"text-muted-foreground hover:text-foreground"}`,children:[(0,s.jsx)("span",{...T,...I,className:"w-4 h-4 flex items-center justify-center text-xs text-muted-foreground/40 hover:text-muted-foreground cursor-grab active:cursor-grabbing flex-shrink-0",title:"Drag to reorder",onClick:e=>e.stopPropagation(),children:"⠿"}),(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),u(e.id)},className:"w-4 h-4 flex items-center justify-center text-xs text-muted-foreground flex-shrink-0",children:r?"▶":"▼"}),(N=0===e.task_count?null:e.problem_count>0?{dotClass:"bg-destructive",label:`${e.problem_count}!`,title:`${e.problem_count} problem`}:e.done_count===e.task_count?{dotClass:"bg-success",label:`${e.done_count}/${e.task_count}`,title:"All done"}:e.done_count>0?{dotClass:"bg-primary",label:`${e.done_count}/${e.task_count}`,title:`${e.done_count} done, ${e.active_count} active`}:e.active_count>0?{dotClass:"bg-warning",label:`${e.active_count}`,title:`${e.active_count} in progress`}:null)?(0,s.jsx)("span",{className:`w-2 h-2 rounded-full ${N.dotClass} flex-shrink-0`,title:N.title}):null,k?(0,s.jsx)("input",{type:"text",value:C,onChange:e=>S(e.target.value),onKeyDown:t=>{"Enter"===t.key&&M(),"Escape"===t.key&&(S(e.name),w(!1))},onBlur:M,onClick:e=>e.stopPropagation(),className:"flex-1 min-w-0 bg-input border border-primary rounded px-1 py-0 text-sm font-medium focus:outline-none text-foreground",autoFocus:!0}):(0,s.jsx)("span",{className:`flex-1 truncate font-medium ${t?"text-primary":""}`,onDoubleClick:t=>{t.stopPropagation(),S(e.name),w(!0)},title:"Double-click to rename",children:e.name}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[e.task_count>0&&(0,s.jsx)("span",{className:"text-xs text-muted-foreground tabular-nums",children:e.task_count}),(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),S(e.name),w(!0)},className:"text-muted-foreground hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity text-xs",title:"Rename",children:"✎"}),(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),x(e.id)},className:"text-muted-foreground hover:text-destructive opacity-0 group-hover:opacity-100 transition-opacity text-xs",children:"x"})]})]}),!r&&t&&(0,s.jsxs)("div",{className:"ml-3 border-l border-border/50",children:[0===a.length&&!l&&(0,s.jsx)("div",{className:"text-xs text-muted-foreground py-2 pl-4",children:"No tasks"}),(0,s.jsx)(ep.Mp,{sensors:E,collisionDetection:ep.fp,onDragEnd:e=>{let{active:t,over:r}=e;if(!r||t.id===r.id||!b)return;let s=a.findIndex(e=>e.id===t.id),n=a.findIndex(e=>e.id===r.id);if(-1===s||-1===n)return;let o=[...a],[l]=o.splice(s,1);o.splice(n,0,l),b(o.map(e=>e.id))},children:(0,s.jsx)(eh.gB,{items:a.map(e=>e.id),strategy:eh._G,children:a.map(e=>(0,s.jsx)(eC,{task:e,isSelected:o===e.id,chatState:v?.[e.id],onSelect:()=>c(e.id),onStatusChange:p,onTodayToggle:h,onDelete:()=>f(e.id)},e.id))})}),l===e.id?(0,s.jsx)("div",{className:"pl-4 pr-2 py-1",children:(0,s.jsx)("input",{type:"text",value:i,onChange:e=>y(e.target.value),onKeyDown:t=>{"Enter"===t.key&&g(e.id),"Escape"===t.key&&(y(""),j(null))},placeholder:"Task title...",className:"w-full bg-input border border-border rounded px-2 py-1 text-sm focus:border-primary focus:outline-none text-foreground",autoFocus:!0})}):(0,s.jsxs)("button",{"data-add-task":!0,onClick:()=>{d(e.id),j(e.id)},className:"pl-4 pr-2 py-1 text-xs text-muted-foreground hover:text-foreground transition-colors text-left w-full",children:["+ Add task ",(0,s.jsx)("span",{className:"text-muted-foreground/50 ml-1",children:"T"})]})]}),!r&&!t&&e.preview_tasks&&e.preview_tasks.length>0&&(0,s.jsx)("div",{className:"ml-3 border-l border-border/50",children:e.preview_tasks.map((t,r)=>(0,s.jsxs)("div",{onClick:()=>d(e.id),className:"flex items-center gap-1.5 pl-4 pr-2 py-1 cursor-pointer text-xs text-muted-foreground hover:text-foreground transition-colors",children:[(0,s.jsx)("span",{className:"flex-shrink-0",children:ey(t.status).icon}),(0,s.jsx)("span",{className:"truncate",children:t.title})]},r))})]})}function eC({task:e,isSelected:t,chatState:r,onSelect:n,onStatusChange:a,onTodayToggle:o,onDelete:l}){let{attributes:i,listeners:d,setNodeRef:c,transform:u,transition:x,isDragging:m}=(0,eh.gl)({id:e.id}),p={transform:ef.Ks.Transform.toString(u),transition:x,opacity:m?.5:1};return(0,s.jsxs)("div",{ref:c,style:p,onClick:n,className:`group/task flex items-center gap-1 pl-2 pr-2 py-1.5 cursor-pointer transition-colors text-sm border-l-2 ${t?"bg-card-hover border-l-primary":"border-l-transparent hover:bg-card-hover/50"}`,children:[(0,s.jsx)("span",{...i,...d,className:"w-3 h-4 flex items-center justify-center text-[10px] text-muted-foreground/30 hover:text-muted-foreground cursor-grab active:cursor-grabbing flex-shrink-0",onClick:e=>e.stopPropagation(),children:"⠿"}),(0,s.jsx)("button",{onClick:t=>{var r;let s,n;t.stopPropagation(),a(e.id,(r=e.status,-1===(n=(s=["idea","doing","done"]).indexOf(r))?"idea":s[(n+1)%s.length]))},className:"flex-shrink-0 text-sm",title:`Status: ${e.status}`,children:ey(e.status).icon}),(0,s.jsx)("span",{className:`tree-priority-dot ${eN[e.priority]}`}),(0,s.jsx)("span",{className:`flex-1 truncate ${"done"===e.status?"text-muted-foreground line-through":""}`,children:e.title}),"loading"===r&&(0,s.jsx)("span",{className:"flex-shrink-0 flex items-center gap-1 text-[10px] text-warning",children:(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"})}),"done"===r&&(0,s.jsx)("span",{className:"flex-shrink-0 text-[10px] text-success",children:"✓"}),e.is_today&&(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),o(e.id,!1)},className:"text-xs flex-shrink-0 text-primary",children:"*"}),(0,s.jsx)("button",{onClick:e=>{e.stopPropagation(),l()},className:"flex-shrink-0 text-muted-foreground/0 group-hover/task:text-muted-foreground hover:!text-destructive transition-colors text-xs px-0.5",children:"\xd7"})]})}var eS=r(8426),eE=r(2957);function eT({basePath:e,taskStatus:t,onInsertToNote:r,onChatStateChange:a}){let[o,l]=(0,n.useState)([]),[i,d]=(0,n.useState)(""),[c,u]=(0,n.useState)(!1),x=(0,n.useRef)(null),m=(0,n.useRef)(null),p=(0,n.useRef)(e);(0,n.useEffect)(()=>{p.current=e,l([]),u(!1)},[e]),(0,n.useEffect)(()=>{"u">typeof Notification&&"default"===Notification.permission&&Notification.requestPermission()},[]);let h=(0,n.useCallback)(()=>{fetch(`${e}/chat`).then(e=>e.json()).then(t=>{p.current===e&&Array.isArray(t)&&l(t)})},[e]);(0,n.useEffect)(()=>{h()},[h]),(0,n.useEffect)(()=>{if("testing"!==t)return;let e=setInterval(h,3e3);return()=>clearInterval(e)},[t,h]),(0,n.useEffect)(()=>{x.current?.scrollIntoView({behavior:"smooth"})},[o]);let f=(0,n.useCallback)(async()=>{let t=i.trim();if(!t||c)return;let r=`task-chat-${Date.now()}`;d(""),u(!0),a?.("loading"),E({id:r,type:"task-chat",label:"Note Assistant",startedAt:Date.now()});let s=`temp-${Date.now()}`,n={id:s,task_id:"",role:"user",content:t,created_at:new Date().toISOString()};l(e=>[...e,n]);try{let r=await fetch(`${e}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:t})});if(p.current!==e)return void a?.("done");if(r.ok){var o;let e=await r.json();l(t=>[...t.filter(e=>e.id!==s),e.userMessage,e.aiMessage]),e.aiMessage?.content&&(o=e.aiMessage.content,document.hasFocus()||"granted"===Notification.permission&&new Notification("IM - AI Response",{body:o.slice(0,120),icon:"/icon-192.png"}))}}catch{}T(r),p.current===e&&(u(!1),m.current?.focus()),a?.("done")},[i,c,e,a]);return(0,s.jsxs)("div",{className:"flex flex-col h-full",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-3 py-1.5 border-b border-border",children:[(0,s.jsx)("span",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"Note Assistant"}),"testing"===t&&(0,s.jsxs)("span",{className:"flex items-center gap-1.5 text-xs text-warning",children:[(0,s.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-warning animate-pulse"}),"Executing..."]})]}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto px-3 py-2 space-y-2 min-h-0",children:[0===o.length&&!c&&(0,s.jsx)("div",{className:"text-sm text-muted-foreground text-center py-4",children:'노트 작성을 도와드립니다. 질문하거나 "이 부분 정리해줘" 같이 요청해보세요'}),o.filter(e=>e.content).map(e=>{let t="assistant"===e.role&&e.content.startsWith("[진행 중]");return(0,s.jsxs)("div",{className:`flex flex-col ${"user"===e.role?"items-end":"items-start"}`,children:[t&&(0,s.jsxs)("div",{className:"flex items-center gap-1.5 text-[10px] uppercase tracking-wider text-warning mb-0.5 pl-1",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),"Watch 실행 중 \xb7 실시간 출력"]}),(0,s.jsx)("div",{className:`max-w-[90%] px-3 py-2 rounded-lg text-sm leading-relaxed ${"user"===e.role?"bg-accent text-white rounded-br-sm whitespace-pre-wrap":t?"bg-warning/10 text-foreground rounded-bl-sm chat-markdown border border-warning/30":"bg-muted text-foreground rounded-bl-sm chat-markdown"}`,children:"assistant"===e.role?(0,s.jsx)(eS.oz,{remarkPlugins:[eE.A],children:e.content}):e.content}),"assistant"===e.role&&!t&&(0,s.jsx)("button",{onClick:()=>r(e.content),className:"text-xs text-muted-foreground hover:text-primary mt-0.5 px-1 transition-colors",children:"↓ 노트에 삽입"})]},e.id)}),c&&(0,s.jsxs)("div",{className:"flex gap-1 px-2 py-2",children:[(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"0ms"}}),(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"150ms"}}),(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"300ms"}})]}),(0,s.jsx)("div",{ref:x})]}),(0,s.jsxs)("div",{className:"flex gap-1.5 px-2 py-2 border-t border-border",children:[(0,s.jsx)("textarea",{ref:m,value:i,onChange:e=>d(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),f())},placeholder:"Ask AI...",rows:1,className:"flex-1 bg-input border border-border rounded-md px-3 py-2 text-sm text-foreground resize-none focus:border-primary focus:outline-none"}),(0,s.jsx)("button",{onClick:f,disabled:!i.trim()||c,className:"px-3 py-2 bg-accent text-white text-sm rounded-md disabled:opacity-40 hover:bg-accent/80 transition-colors flex-shrink-0",children:"Send"})]})]})}let eI=[{key:"continue",label:"이어서 써줘",hint:"커서 앞 맥락을 이어서 자연스럽게 덧붙임"},{key:"tidy",label:"이 부분 정리해줘",hint:"선택 영역을 깔끔히 다듬음 (의미 유지)"},{key:"split",label:"할 일로 쪼개줘",hint:"선택 영역을 체크박스 리스트로"},{key:"to-questions",label:"질문으로 바꿔줘",hint:"모호한 부분을 명확하게 하는 질문 목록으로"},{key:"summarize",label:"요약해줘",hint:"선택 영역을 3줄 이내로"},{key:"custom",label:"직접 입력…",hint:"임의 명령을 프롬프트로 전달"}],e$="im-refine-custom-history";function eP(){try{let e=localStorage.getItem(e$);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}function eA({open:e,hasSelection:t,onClose:r,onRun:a}){let[o,l]=(0,n.useState)(0),[i,d]=(0,n.useState)(!1),[c,u]=(0,n.useState)(""),[x,m]=(0,n.useState)([]),p=(0,n.useRef)(null);if((0,n.useEffect)(()=>{e&&(l(0),d(!1),u(""))},[e]),(0,n.useEffect)(()=>{i&&(p.current?.focus(),m(eP()))},[i]),!e)return null;let h=e=>{let t=eI[e];"custom"===t.key?d(!0):a(t.key)},f=()=>{let e=c.trim();e&&(!function(e){let t=e.trim();if(!t)return;let r=eP().filter(e=>e!==t),s=[t,...r].slice(0,8);try{localStorage.setItem(e$,JSON.stringify(s))}catch{}}(e),a("custom",e))};return(0,s.jsx)("div",{onClick:r,className:"fixed inset-0 z-50 flex items-start justify-center pt-[18vh]",style:{background:"rgba(0,0,0,0.4)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-md animate-dialog-in",children:[(0,s.jsxs)("div",{className:"px-4 py-3 border-b border-border flex items-center justify-between",children:[(0,s.jsx)("div",{className:"text-xs text-muted-foreground",children:t?"선택 영역에 명령 실행":"커서 위치 기준 명령 실행"}),(0,s.jsx)("button",{onClick:r,className:"text-xs text-muted-foreground hover:text-foreground",children:"Esc"})]}),i?(0,s.jsxs)("div",{className:"p-4 flex flex-col gap-3",children:[(0,s.jsx)("input",{ref:p,value:c,onChange:e=>u(e.target.value),onKeyDown:e=>{"Enter"===e.key&&f(),"Escape"===e.key&&(e.preventDefault(),d(!1))},placeholder:"예: 이 부분 markdown 표로 만들어줘",className:"w-full bg-input border border-border rounded-md px-3 py-2 text-sm focus:border-primary focus:outline-none"}),x.length>0&&(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("div",{className:"text-[10px] uppercase tracking-wider text-muted-foreground/70",children:"최근 명령"}),(0,s.jsx)("div",{className:"flex flex-wrap gap-1.5",children:x.map(e=>(0,s.jsx)("button",{onClick:()=>u(e),title:e,className:"text-xs px-2 py-1 rounded border border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground transition-colors max-w-[220px] truncate text-left",children:e},e))})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)("button",{onClick:()=>d(!1),className:"text-xs text-muted-foreground px-2 py-1",children:"뒤로"}),(0,s.jsx)("button",{onClick:f,disabled:!c.trim(),className:"text-xs px-3 py-1 bg-primary text-primary-foreground rounded disabled:opacity-40",children:"실행"})]})]}):(0,s.jsx)("ul",{onKeyDown:e=>{"ArrowDown"===e.key?(e.preventDefault(),l(e=>Math.min(e+1,eI.length-1))):"ArrowUp"===e.key?(e.preventDefault(),l(e=>Math.max(e-1,0))):"Enter"===e.key&&(e.preventDefault(),h(o))},tabIndex:0,ref:e=>{e?.focus()},className:"py-1 max-h-[50vh] overflow-y-auto focus:outline-none",children:eI.map((e,t)=>(0,s.jsxs)("li",{onMouseEnter:()=>l(t),onClick:()=>h(t),className:`px-4 py-2 cursor-pointer flex flex-col gap-0.5 ${t===o?"bg-muted":""}`,children:[(0,s.jsx)("span",{className:"text-sm text-foreground",children:e.label}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:e.hint})]},e.key))})]})})}function e_({task:e,projectId:t,subProjectId:r,siblingTasks:a,onUpdate:o,onDelete:l,onTaskPromoted:i,onTaskMoved:d,focusMode:c,onFocusModeChange:u,onChatStateChange:x}){let[m,p]=(0,n.useState)(e.title),[h,f]=(0,n.useState)(e.description),[b,g]=(0,n.useState)(!1),[j,y]=(0,n.useState)(!1),[v,N]=(0,n.useState)(""),[k,w]=(0,n.useState)(!1),[C,S]=(0,n.useState)(!1),I=e=>u?.(e),$=(0,n.useRef)(!1);(0,n.useEffect)(()=>{"testing"!==e.status||C||$.current||S(!0)},[e.status,C]);let[P,A]=(0,n.useState)(!1),[_,D]=(0,n.useState)(!1),[M,L]=(0,n.useState)(0),[O,R]=(0,n.useState)(null),[F,K]=(0,n.useState)(!1),[z,J]=(0,n.useState)(null),W=(0,n.useRef)(null),B=`/api/projects/${t}/sub-projects/${r}/tasks/${e.id}`,U=(0,n.useRef)(null),[G,H]=(0,n.useState)("");(0,n.useEffect)(()=>{let e=!1;return fetch(`/api/projects/${t}/brainstorm`).then(e=>e.ok?e.json():null).then(t=>{e||H("string"==typeof t?.content?t.content:"")}).catch(()=>{}),()=>{e=!0}},[t]);let q=(0,n.useMemo)(()=>{let t=[];if(a)for(let r of a)r.id!==e.id&&(r.title&&t.push(r.title),r.description&&t.push(r.description));return G&&t.push(G),t},[a,G,e.id]);(0,n.useEffect)(()=>{p(e.title),f(e.description)},[e.id,e.title,e.description]);let V=(0,n.useCallback)(()=>{let t=m.trim();t&&t!==e.title?o({title:t}):p(e.title),g(!1)},[m,e.title,o]),X=(0,n.useCallback)(()=>{h!==e.description&&o({description:h})},[h,e.description,o]),Q=(0,n.useCallback)(e=>{let t=h?`${h.trimEnd()}
|
|
11
|
+
- 모바일 반응형 디자인 중요`})})]}):(0,s.jsx)("div",{className:"flex items-center justify-center h-full text-muted-foreground",children:"로딩 중..."})}var ej=r(4923),ey=r(7256),ev=r(9768);let eN=["idea","doing","done","problem"],ek=["writing","submitted","testing"],ew=[{key:"idea",label:"Idea",icon:"\uD83D\uDCA1",color:"text-muted-foreground"},{key:"doing",label:"Doing",icon:"\uD83D\uDD25",color:"text-primary"},{key:"writing",label:"Writing",icon:"✏️",color:"text-warning"},{key:"submitted",label:"Submitted",icon:"\uD83D\uDE80",color:"text-primary"},{key:"testing",label:"Testing",icon:"\uD83E\uDDEA",color:"text-accent"},{key:"done",label:"Done",icon:"✅",color:"text-success"},{key:"problem",label:"Problem",icon:"\uD83D\uDD34",color:"text-destructive"}];function eC(e){return ew.find(t=>t.key===e)??ew[0]}function eS({status:e,onChange:t}){let r=ek.includes(e),n=eC(e);return(0,s.jsxs)("div",{className:"flex items-center gap-1",children:[r&&(0,s.jsxs)("span",{title:`Legacy: ${n.label} (클릭해서 새 상태로 이동)`,className:`px-2 py-1 rounded text-xs ${n.color} bg-muted/50 border border-dashed border-muted-foreground/30 mr-1`,children:[n.icon," ",n.label]}),eN.map(r=>{let n=eC(r),a=e===r;return(0,s.jsx)("button",{onClick:()=>t(r),title:n.label,className:`px-2 py-1 rounded text-base transition-all ${a?`${n.color} bg-muted scale-110`:"opacity-40 hover:opacity-80"}`,children:n.icon},r)})]})}let eE={high:"bg-destructive",medium:"bg-warning",low:"bg-muted-foreground"};function eT({subProjects:e,tasks:t,selectedSubId:r,selectedTaskId:a,onSelectSub:o,onSelectTask:l,onCreateSub:i,onDeleteSub:d,onRenameSub:c,onCreateTask:u,onStatusChange:x,onTodayToggle:m,onDeleteTask:p,onReorderSubs:h,onReorderTasks:f,onAutoDistribute:g,chatStates:b}){let[j,y]=(0,n.useState)(new Set),[v,N]=(0,n.useState)(null),[k,w]=(0,n.useState)(""),C=(0,ej.FR)((0,ej.MS)(ej.AN,{activationConstraint:{distance:5}}),(0,ej.MS)(ej.uN,{coordinateGetter:ey.JR})),S=e=>{y(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r})},E=e=>{let t=k.trim();t&&(o(e),u(t),w(""),N(null))};return(0,s.jsxs)("div",{className:"flex flex-col h-full",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-3 py-2 border-b border-border flex-shrink-0",children:[(0,s.jsx)("h2",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"Projects"}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{onClick:()=>{y(e.length>0&&e.every(e=>j.has(e.id))?new Set:new Set(e.map(e=>e.id)))},className:"text-xs text-muted-foreground hover:text-foreground transition-colors",title:e.length>0&&e.every(e=>j.has(e.id))?"Expand all":"Collapse all",children:e.length>0&&e.every(e=>j.has(e.id))?"▶":"▼"}),g&&(0,s.jsx)("button",{onClick:g,className:"text-[10px] px-1.5 py-0.5 bg-accent/15 text-accent border border-accent/30 rounded hover:bg-accent/25 transition-colors",title:"AI auto-distribute brainstorming to tasks",children:"Auto"}),(0,s.jsxs)("button",{onClick:i,className:"text-xs text-muted-foreground hover:text-foreground transition-colors",title:"Add project (N)",children:["+ ",(0,s.jsx)("span",{className:"text-muted-foreground/50",children:"N"})]})]})]}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto py-1",children:[0===e.length&&(0,s.jsx)("div",{className:"text-center py-8 text-muted-foreground text-xs",children:"Create a project to get started"}),(0,s.jsx)(ej.Mp,{sensors:C,collisionDetection:ej.fp,onDragEnd:t=>{let{active:r,over:s}=t;if(!s||r.id===s.id||!h)return;let n=e.findIndex(e=>e.id===r.id),a=e.findIndex(e=>e.id===s.id);if(-1===n||-1===a)return;let o=[...e],[l]=o.splice(n,1);o.splice(a,0,l),h(o.map(e=>e.id))},children:(0,s.jsx)(ey.gB,{items:e.map(e=>e.id),strategy:ey._G,children:e.map(e=>(0,s.jsx)(eI,{sp:e,isSelected:r===e.id,isCollapsed:j.has(e.id),tasks:r===e.id?t:[],selectedTaskId:a,addingTaskFor:v,newTaskTitle:k,onSelectSub:o,onSelectTask:l,onToggleCollapse:S,onDeleteSub:d,onRenameSub:c,onStatusChange:x,onTodayToggle:m,onDeleteTask:p,onReorderTasks:f,onAddTask:E,onSetAddingTaskFor:N,onSetNewTaskTitle:w,chatStates:b},e.id))})})]})]})}function eI({sp:e,isSelected:t,isCollapsed:r,tasks:a,selectedTaskId:o,addingTaskFor:l,newTaskTitle:i,onSelectSub:d,onSelectTask:c,onToggleCollapse:u,onDeleteSub:x,onRenameSub:m,onStatusChange:p,onTodayToggle:h,onDeleteTask:f,onReorderTasks:g,onAddTask:b,onSetAddingTaskFor:j,onSetNewTaskTitle:y,chatStates:v}){let N,[k,w]=(0,n.useState)(!1),[C,S]=(0,n.useState)(e.name),E=(0,ej.FR)((0,ej.MS)(ej.AN,{activationConstraint:{distance:5}}),(0,ej.MS)(ej.uN,{coordinateGetter:ey.JR})),{attributes:T,listeners:I,setNodeRef:$,transform:P,transition:A,isDragging:_}=(0,ey.gl)({id:e.id}),D={transform:ev.Ks.Transform.toString(P),transition:A,opacity:_?.5:1,zIndex:_?10:void 0},M=()=>{let t=C.trim();t&&t!==e.name&&m&&m(e.id,t),w(!1)};return(0,s.jsxs)("div",{ref:$,style:D,className:"mb-0.5",children:[(0,s.jsxs)("div",{onClick:()=>{!k&&(t?u(e.id):(d(e.id),r&&u(e.id)))},className:`flex items-center gap-1.5 px-2 py-1.5 cursor-pointer transition-colors group text-sm ${t?"text-foreground":"text-muted-foreground hover:text-foreground"}`,children:[(0,s.jsx)("span",{...T,...I,className:"w-4 h-4 flex items-center justify-center text-xs text-muted-foreground/40 hover:text-muted-foreground cursor-grab active:cursor-grabbing flex-shrink-0",title:"Drag to reorder",onClick:e=>e.stopPropagation(),children:"⠿"}),(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),u(e.id)},className:"w-4 h-4 flex items-center justify-center text-xs text-muted-foreground flex-shrink-0",children:r?"▶":"▼"}),(N=0===e.task_count?null:e.problem_count>0?{dotClass:"bg-destructive",label:`${e.problem_count}!`,title:`${e.problem_count} problem`}:e.done_count===e.task_count?{dotClass:"bg-success",label:`${e.done_count}/${e.task_count}`,title:"All done"}:e.done_count>0?{dotClass:"bg-primary",label:`${e.done_count}/${e.task_count}`,title:`${e.done_count} done, ${e.active_count} active`}:e.active_count>0?{dotClass:"bg-warning",label:`${e.active_count}`,title:`${e.active_count} in progress`}:null)?(0,s.jsx)("span",{className:`w-2 h-2 rounded-full ${N.dotClass} flex-shrink-0`,title:N.title}):null,k?(0,s.jsx)("input",{type:"text",value:C,onChange:e=>S(e.target.value),onKeyDown:t=>{"Enter"===t.key&&M(),"Escape"===t.key&&(S(e.name),w(!1))},onBlur:M,onClick:e=>e.stopPropagation(),className:"flex-1 min-w-0 bg-input border border-primary rounded px-1 py-0 text-sm font-medium focus:outline-none text-foreground",autoFocus:!0}):(0,s.jsx)("span",{className:`flex-1 truncate font-medium ${t?"text-primary":""}`,onDoubleClick:t=>{t.stopPropagation(),S(e.name),w(!0)},title:"Double-click to rename",children:e.name}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[e.task_count>0&&(0,s.jsx)("span",{className:"text-xs text-muted-foreground tabular-nums",children:e.task_count}),(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),S(e.name),w(!0)},className:"text-muted-foreground hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity text-xs",title:"Rename",children:"✎"}),(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),x(e.id)},className:"text-muted-foreground hover:text-destructive opacity-0 group-hover:opacity-100 transition-opacity text-xs",children:"x"})]})]}),!r&&t&&(0,s.jsxs)("div",{className:"ml-3 border-l border-border/50",children:[0===a.length&&!l&&(0,s.jsx)("div",{className:"text-xs text-muted-foreground py-2 pl-4",children:"No tasks"}),(0,s.jsx)(ej.Mp,{sensors:E,collisionDetection:ej.fp,onDragEnd:e=>{let{active:t,over:r}=e;if(!r||t.id===r.id||!g)return;let s=a.findIndex(e=>e.id===t.id),n=a.findIndex(e=>e.id===r.id);if(-1===s||-1===n)return;let o=[...a],[l]=o.splice(s,1);o.splice(n,0,l),g(o.map(e=>e.id))},children:(0,s.jsx)(ey.gB,{items:a.map(e=>e.id),strategy:ey._G,children:a.map(e=>(0,s.jsx)(e$,{task:e,isSelected:o===e.id,chatState:v?.[e.id],onSelect:()=>c(e.id),onStatusChange:p,onTodayToggle:h,onDelete:()=>f(e.id)},e.id))})}),l===e.id?(0,s.jsx)("div",{className:"pl-4 pr-2 py-1",children:(0,s.jsx)("input",{type:"text",value:i,onChange:e=>y(e.target.value),onKeyDown:t=>{"Enter"===t.key&&b(e.id),"Escape"===t.key&&(y(""),j(null))},placeholder:"Task title...",className:"w-full bg-input border border-border rounded px-2 py-1 text-sm focus:border-primary focus:outline-none text-foreground",autoFocus:!0})}):(0,s.jsxs)("button",{"data-add-task":!0,onClick:()=>{d(e.id),j(e.id)},className:"pl-4 pr-2 py-1 text-xs text-muted-foreground hover:text-foreground transition-colors text-left w-full",children:["+ Add task ",(0,s.jsx)("span",{className:"text-muted-foreground/50 ml-1",children:"T"})]})]}),!r&&!t&&e.preview_tasks&&e.preview_tasks.length>0&&(0,s.jsx)("div",{className:"ml-3 border-l border-border/50",children:e.preview_tasks.map((t,r)=>(0,s.jsxs)("div",{onClick:()=>d(e.id),className:"flex items-center gap-1.5 pl-4 pr-2 py-1 cursor-pointer text-xs text-muted-foreground hover:text-foreground transition-colors",children:[(0,s.jsx)("span",{className:"flex-shrink-0",children:eC(t.status).icon}),(0,s.jsx)("span",{className:"truncate",children:t.title})]},r))})]})}function e$({task:e,isSelected:t,chatState:r,onSelect:n,onStatusChange:a,onTodayToggle:o,onDelete:l}){let{attributes:i,listeners:d,setNodeRef:c,transform:u,transition:x,isDragging:m}=(0,ey.gl)({id:e.id}),p={transform:ev.Ks.Transform.toString(u),transition:x,opacity:m?.5:1};return(0,s.jsxs)("div",{ref:c,style:p,onClick:n,className:`group/task flex items-center gap-1 pl-2 pr-2 py-1.5 cursor-pointer transition-colors text-sm border-l-2 ${t?"bg-card-hover border-l-primary":"border-l-transparent hover:bg-card-hover/50"}`,children:[(0,s.jsx)("span",{...i,...d,className:"w-3 h-4 flex items-center justify-center text-[10px] text-muted-foreground/30 hover:text-muted-foreground cursor-grab active:cursor-grabbing flex-shrink-0",onClick:e=>e.stopPropagation(),children:"⠿"}),(0,s.jsx)("button",{onClick:t=>{var r;let s,n;t.stopPropagation(),a(e.id,(r=e.status,-1===(n=(s=["idea","doing","done"]).indexOf(r))?"idea":s[(n+1)%s.length]))},className:"flex-shrink-0 text-sm",title:`Status: ${e.status}`,children:eC(e.status).icon}),(0,s.jsx)("span",{className:`tree-priority-dot ${eE[e.priority]}`}),(0,s.jsx)("span",{className:`flex-1 truncate ${"done"===e.status?"text-muted-foreground line-through":""}`,children:e.title}),"loading"===r&&(0,s.jsx)("span",{className:"flex-shrink-0 flex items-center gap-1 text-[10px] text-warning",children:(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"})}),"done"===r&&(0,s.jsx)("span",{className:"flex-shrink-0 text-[10px] text-success",children:"✓"}),e.is_today&&(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),o(e.id,!1)},className:"text-xs flex-shrink-0 text-primary",children:"*"}),(0,s.jsx)("button",{onClick:e=>{e.stopPropagation(),l()},className:"flex-shrink-0 text-muted-foreground/0 group-hover/task:text-muted-foreground hover:!text-destructive transition-colors text-xs px-0.5",children:"\xd7"})]})}var eP=r(8426),eA=r(2957);function e_({basePath:e,taskStatus:t,onInsertToNote:r,onChatStateChange:a}){let[o,l]=(0,n.useState)([]),[i,d]=(0,n.useState)(""),[c,u]=(0,n.useState)(!1),x=(0,n.useRef)(null),m=(0,n.useRef)(null),p=(0,n.useRef)(e);(0,n.useEffect)(()=>{p.current=e,l([]),u(!1)},[e]),(0,n.useEffect)(()=>{"u">typeof Notification&&"default"===Notification.permission&&Notification.requestPermission()},[]);let h=(0,n.useCallback)(()=>{fetch(`${e}/chat`).then(e=>e.json()).then(t=>{p.current===e&&Array.isArray(t)&&l(t)})},[e]);(0,n.useEffect)(()=>{h()},[h]),(0,n.useEffect)(()=>{if("testing"!==t)return;let e=setInterval(h,3e3);return()=>clearInterval(e)},[t,h]),(0,n.useEffect)(()=>{x.current?.scrollIntoView({behavior:"smooth"})},[o]);let f=(0,n.useCallback)(async()=>{let t=i.trim();if(!t||c)return;let r=`task-chat-${Date.now()}`;d(""),u(!0),a?.("loading"),E({id:r,type:"task-chat",label:"Note Assistant",startedAt:Date.now()});let s=`temp-${Date.now()}`,n={id:s,task_id:"",role:"user",content:t,created_at:new Date().toISOString()};l(e=>[...e,n]);try{let r=await fetch(`${e}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:t})});if(p.current!==e)return void a?.("done");if(r.ok){var o;let e=await r.json();l(t=>[...t.filter(e=>e.id!==s),e.userMessage,e.aiMessage]),e.aiMessage?.content&&(o=e.aiMessage.content,document.hasFocus()||"granted"===Notification.permission&&new Notification("IM - AI Response",{body:o.slice(0,120),icon:"/icon-192.png"}))}}catch{}T(r),p.current===e&&(u(!1),m.current?.focus()),a?.("done")},[i,c,e,a]);return(0,s.jsxs)("div",{className:"flex flex-col h-full",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-3 py-1.5 border-b border-border",children:[(0,s.jsx)("span",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"Note Assistant"}),"testing"===t&&(0,s.jsxs)("span",{className:"flex items-center gap-1.5 text-xs text-warning",children:[(0,s.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-warning animate-pulse"}),"Executing..."]})]}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto px-3 py-2 space-y-2 min-h-0",children:[0===o.length&&!c&&(0,s.jsx)("div",{className:"text-sm text-muted-foreground text-center py-4",children:'노트 작성을 도와드립니다. 질문하거나 "이 부분 정리해줘" 같이 요청해보세요'}),o.filter(e=>e.content).map(e=>{let t="assistant"===e.role&&e.content.startsWith("[진행 중]");return(0,s.jsxs)("div",{className:`flex flex-col ${"user"===e.role?"items-end":"items-start"}`,children:[t&&(0,s.jsxs)("div",{className:"flex items-center gap-1.5 text-[10px] uppercase tracking-wider text-warning mb-0.5 pl-1",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),"Watch 실행 중 \xb7 실시간 출력"]}),(0,s.jsx)("div",{className:`max-w-[90%] px-3 py-2 rounded-lg text-sm leading-relaxed ${"user"===e.role?"bg-accent text-white rounded-br-sm whitespace-pre-wrap":t?"bg-warning/10 text-foreground rounded-bl-sm chat-markdown border border-warning/30":"bg-muted text-foreground rounded-bl-sm chat-markdown"}`,children:"assistant"===e.role?(0,s.jsx)(eP.oz,{remarkPlugins:[eA.A],children:e.content}):e.content}),"assistant"===e.role&&!t&&(0,s.jsx)("button",{onClick:()=>r(e.content),className:"text-xs text-muted-foreground hover:text-primary mt-0.5 px-1 transition-colors",children:"↓ 노트에 삽입"})]},e.id)}),c&&(0,s.jsxs)("div",{className:"flex gap-1 px-2 py-2",children:[(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"0ms"}}),(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"150ms"}}),(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"300ms"}})]}),(0,s.jsx)("div",{ref:x})]}),(0,s.jsxs)("div",{className:"flex gap-1.5 px-2 py-2 border-t border-border",children:[(0,s.jsx)("textarea",{ref:m,value:i,onChange:e=>d(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),f())},placeholder:"Ask AI...",rows:1,className:"flex-1 bg-input border border-border rounded-md px-3 py-2 text-sm text-foreground resize-none focus:border-primary focus:outline-none"}),(0,s.jsx)("button",{onClick:f,disabled:!i.trim()||c,className:"px-3 py-2 bg-accent text-white text-sm rounded-md disabled:opacity-40 hover:bg-accent/80 transition-colors flex-shrink-0",children:"Send"})]})]})}let eD=[{key:"continue",label:"이어서 써줘",hint:"커서 앞 맥락을 이어서 자연스럽게 덧붙임"},{key:"tidy",label:"이 부분 정리해줘",hint:"선택 영역을 깔끔히 다듬음 (의미 유지)"},{key:"split",label:"할 일로 쪼개줘",hint:"선택 영역을 체크박스 리스트로"},{key:"to-questions",label:"질문으로 바꿔줘",hint:"모호한 부분을 명확하게 하는 질문 목록으로"},{key:"summarize",label:"요약해줘",hint:"선택 영역을 3줄 이내로"},{key:"custom",label:"직접 입력…",hint:"임의 명령을 프롬프트로 전달"}],eM="im-refine-custom-history";function eL(){try{let e=localStorage.getItem(eM);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}function eO({open:e,hasSelection:t,onClose:r,onRun:a}){let[o,l]=(0,n.useState)(0),[i,d]=(0,n.useState)(!1),[c,u]=(0,n.useState)(""),[x,m]=(0,n.useState)([]),p=(0,n.useRef)(null);if((0,n.useEffect)(()=>{e&&(l(0),d(!1),u(""))},[e]),(0,n.useEffect)(()=>{i&&(p.current?.focus(),m(eL()))},[i]),!e)return null;let h=e=>{let t=eD[e];"custom"===t.key?d(!0):a(t.key)},f=()=>{let e=c.trim();e&&(!function(e){let t=e.trim();if(!t)return;let r=eL().filter(e=>e!==t),s=[t,...r].slice(0,8);try{localStorage.setItem(eM,JSON.stringify(s))}catch{}}(e),a("custom",e))};return(0,s.jsx)("div",{onClick:r,className:"fixed inset-0 z-50 flex items-start justify-center pt-[18vh]",style:{background:"rgba(0,0,0,0.4)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-md animate-dialog-in",children:[(0,s.jsxs)("div",{className:"px-4 py-3 border-b border-border flex items-center justify-between",children:[(0,s.jsx)("div",{className:"text-xs text-muted-foreground",children:t?"선택 영역에 명령 실행":"커서 위치 기준 명령 실행"}),(0,s.jsx)("button",{onClick:r,className:"text-xs text-muted-foreground hover:text-foreground",children:"Esc"})]}),i?(0,s.jsxs)("div",{className:"p-4 flex flex-col gap-3",children:[(0,s.jsx)("input",{ref:p,value:c,onChange:e=>u(e.target.value),onKeyDown:e=>{"Enter"===e.key&&f(),"Escape"===e.key&&(e.preventDefault(),d(!1))},placeholder:"예: 이 부분 markdown 표로 만들어줘",className:"w-full bg-input border border-border rounded-md px-3 py-2 text-sm focus:border-primary focus:outline-none"}),x.length>0&&(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("div",{className:"text-[10px] uppercase tracking-wider text-muted-foreground/70",children:"최근 명령"}),(0,s.jsx)("div",{className:"flex flex-wrap gap-1.5",children:x.map(e=>(0,s.jsx)("button",{onClick:()=>u(e),title:e,className:"text-xs px-2 py-1 rounded border border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground transition-colors max-w-[220px] truncate text-left",children:e},e))})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)("button",{onClick:()=>d(!1),className:"text-xs text-muted-foreground px-2 py-1",children:"뒤로"}),(0,s.jsx)("button",{onClick:f,disabled:!c.trim(),className:"text-xs px-3 py-1 bg-primary text-primary-foreground rounded disabled:opacity-40",children:"실행"})]})]}):(0,s.jsx)("ul",{onKeyDown:e=>{"ArrowDown"===e.key?(e.preventDefault(),l(e=>Math.min(e+1,eD.length-1))):"ArrowUp"===e.key?(e.preventDefault(),l(e=>Math.max(e-1,0))):"Enter"===e.key&&(e.preventDefault(),h(o))},tabIndex:0,ref:e=>{e?.focus()},className:"py-1 max-h-[50vh] overflow-y-auto focus:outline-none",children:eD.map((e,t)=>(0,s.jsxs)("li",{onMouseEnter:()=>l(t),onClick:()=>h(t),className:`px-4 py-2 cursor-pointer flex flex-col gap-0.5 ${t===o?"bg-muted":""}`,children:[(0,s.jsx)("span",{className:"text-sm text-foreground",children:e.label}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:e.hint})]},e.key))})]})})}function eR({task:e,projectId:t,subProjectId:r,siblingTasks:a,onUpdate:o,onDelete:l,onTaskPromoted:i,onTaskMoved:d,focusMode:c,onFocusModeChange:u,onChatStateChange:x}){let[m,p]=(0,n.useState)(e.title),[h,f]=(0,n.useState)(e.description),[g,b]=(0,n.useState)(!1),[j,y]=(0,n.useState)(!1),[v,N]=(0,n.useState)(""),[k,w]=(0,n.useState)(!1),[C,S]=(0,n.useState)(!1),I=e=>u?.(e),$=(0,n.useRef)(!1);(0,n.useEffect)(()=>{"testing"!==e.status||C||$.current||S(!0)},[e.status,C]);let[P,A]=(0,n.useState)(!1),[_,D]=(0,n.useState)(!1),[M,L]=(0,n.useState)(0),[O,R]=(0,n.useState)(null),[F,K]=(0,n.useState)(!1),[z,J]=(0,n.useState)(null),B=(0,n.useRef)(null),W=`/api/projects/${t}/sub-projects/${r}/tasks/${e.id}`,U=(0,n.useRef)(null),[G,H]=(0,n.useState)("");(0,n.useEffect)(()=>{let e=!1;return fetch(`/api/projects/${t}/brainstorm`).then(e=>e.ok?e.json():null).then(t=>{e||H("string"==typeof t?.content?t.content:"")}).catch(()=>{}),()=>{e=!0}},[t]);let q=(0,n.useMemo)(()=>{let t=[];if(a)for(let r of a)r.id!==e.id&&(r.title&&t.push(r.title),r.description&&t.push(r.description));return G&&t.push(G),t},[a,G,e.id]);(0,n.useEffect)(()=>{p(e.title),f(e.description)},[e.id,e.title,e.description]);let V=(0,n.useCallback)(()=>{let t=m.trim();t&&t!==e.title?o({title:t}):p(e.title),b(!1)},[m,e.title,o]),X=(0,n.useCallback)(()=>{h!==e.description&&o({description:h})},[h,e.description,o]),Z=(0,n.useCallback)(e=>{let t=h?`${h.trimEnd()}
|
|
12
12
|
|
|
13
13
|
${e.trim()}
|
|
14
14
|
`:`${e.trim()}
|
|
15
|
-
`;f(t),o({description:t})},[h,o]),
|
|
15
|
+
`;f(t),o({description:t})},[h,o]),Q=(0,n.useCallback)(async()=>{let t=h?.trim()||"(비어있음)",r=`# ${e.title}
|
|
16
16
|
|
|
17
17
|
${t}
|
|
18
|
-
`;try{await navigator.clipboard.writeText(r),y(!0),setTimeout(()=>y(!1),1500)}catch{}},[e.title,h]),Y=(0,n.useCallback)(()=>{let e=U.current?.view;e&&K(!e.state.selection.main.empty),A(!0)},[]),ee=(0,n.useCallback)(async(t,r)=>{let s=U.current?.view;if(!s)return void A(!1);let n=e.id,a=s.state.selection.main,l=a.from,i=a.to,d=a.empty?"":s.state.sliceDoc(l,i),c=s.state.doc.toString();A(!1),R(null),J(null),D(!0),L(0);let u=new AbortController;W.current=u;let x=`refine-${Date.now()}`;E({id:x,type:"refine",label:`Refine: ${e.title}`,startedAt:Date.now()});let m=Date.now(),p=setInterval(()=>L(Math.floor((Date.now()-m)/1e3)),500);try{let s,a,x=await fetch(`${B}/refine`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:t,customText:r,selection:d||void 0,note:c}),signal:u.signal}),m=await x.json();if(!x.ok||m.error)throw Error(m.error||`HTTP ${x.status}`);let p=(m.result||"").trim();if(!p)throw Error("AI 응답이 비어있습니다");if(n!==e.id){R("다른 태스크로 이동하여 결과를 버렸습니다"),setTimeout(()=>R(null),4e3);return}let h=Math.min(l,c.length),b=Math.min(i,c.length);if(l===i){let e=(h>0?"\n\n":"")+p+"\n";s=c.slice(0,h)+e+c.slice(h),a=h+e.length}else s=c.slice(0,h)+p+c.slice(b),a=h+p.length;f(s),o({description:s}),J({taskId:n,doc:c}),setTimeout(()=>{J(e=>e&&e.taskId===n?null:e)},3e4);let g=U.current?.view;if(g)try{let e=Math.min(a,g.state.doc.length);g.dispatch({selection:{anchor:e}})}catch{}}catch(e){e?.name==="AbortError"||(R(e instanceof Error?e.message:"알 수 없는 오류"),setTimeout(()=>R(null),6e3))}finally{clearInterval(p),D(!1),W.current=null,T(x)}},[B,o,e.id]),et=(0,n.useCallback)(()=>{W.current?.abort()},[]),er=(0,n.useCallback)(()=>{if(z){if(z.taskId!==e.id)return void J(null);f(z.doc),o({description:z.doc}),J(null)}},[z,e.id,o]),[es,en]=(0,n.useState)(null),[ea,eo]=(0,n.useState)(!1),[el,ei]=(0,n.useState)([]),[ed,ec]=(0,n.useState)(""),[eu,em]=(0,n.useState)(!1),ep=(0,n.useCallback)(async()=>{try{let e=await fetch("/api/projects"),t=await e.json(),r=await Promise.all(t.map(async e=>{let t=await fetch(`/api/projects/${e.id}/sub-projects`),r=await t.json();return{...e,subs:r}}));ei(r),ec(""),eo(!0)}catch{}},[]),eh=(0,n.useCallback)(async()=>{if(ed&&!eu){em(!0);try{(await fetch(`/api/tasks/${e.id}/move`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({subProjectId:ed})})).ok&&(eo(!1),d?.())}catch{}em(!1)}},[ed,eu,e.id,d]),ef=(0,n.useCallback)(async()=>{let e=U.current?.view;if(!e)return;let s=function(e){let t=e.state,r=t.selection.main.head,s=t.doc.lineAt(r),n=s.text.match(/^(\s*)([-*+])\s(?:\[[ xX]\]\s)?(.*)$/);if(!n)return null;let a=n[3]?.trim();return a?{content:a,from:s.from,to:s.to}:null}(e);if(!s){R("체크박스나 불릿 목록 줄에 커서를 두고 실행하세요"),setTimeout(()=>R(null),3e3);return}let n=s.content.slice(0,200);try{let a=await fetch(`/api/projects/${t}/sub-projects/${r}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:n})});if(!a.ok)throw Error(`HTTP ${a.status}`);let l=await a.json(),d=e.state.doc.toString(),c=d.slice(0,s.from),u=d.slice(s.to),x=u.startsWith("\n")?u.slice(1):u,m=c+x;f(m),o({description:m}),i?.(l),en(`→ 태스크 "${n}" 생성됨`),setTimeout(()=>en(null),3e3)}catch(e){R(e instanceof Error?e.message:"태스크 생성 실패"),setTimeout(()=>R(null),4e3)}},[t,r,o,i]);return((0,n.useEffect)(()=>{if(!c)return;let e=e=>{"Escape"===e.key&&I(!1)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[c]),c)?(0,s.jsxs)("div",{className:"fixed inset-0 z-40 bg-background flex flex-col",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-6 py-3 border-b border-border flex-shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)("h2",{className:"text-lg font-semibold text-foreground",children:e.title}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:"Focus Mode"})]}),(0,s.jsx)("button",{onClick:()=>I(!1),className:"text-xs px-3 py-1 rounded border border-border text-muted-foreground hover:text-foreground transition-colors",children:"Esc 닫기"})]}),(0,s.jsx)("div",{className:"flex-1 min-h-0",children:(0,s.jsx)(ex,{ref:U,value:h,onChange:f,onBlur:X,onOpenCommand:Y,onPromoteLine:ef,extraCorpus:q,placeholder:"집중 모드 — 자유롭게 작성하세요…"})}),(0,s.jsx)(eA,{open:P,hasSelection:F,onClose:()=>A(!1),onRun:ee})]}):(0,s.jsxs)("div",{className:"flex flex-col h-full",children:[(0,s.jsxs)("div",{className:"px-4 py-3 border-b border-border flex-shrink-0 space-y-2",children:[b?(0,s.jsx)("input",{value:m,onChange:e=>p(e.target.value),onBlur:V,onKeyDown:t=>{"Enter"===t.key&&V(),"Escape"===t.key&&(p(e.title),g(!1))},className:"w-full bg-transparent text-lg font-semibold border-b border-primary focus:outline-none pb-1 text-foreground",autoFocus:!0}):(0,s.jsx)("h2",{onClick:()=>g(!0),className:"text-lg font-semibold cursor-text hover:text-primary transition-colors",children:e.title}),(0,s.jsxs)("div",{className:"flex items-center gap-3 flex-wrap",children:[(0,s.jsx)(ev,{status:e.status,onChange:e=>o({status:e})}),(0,s.jsx)("div",{className:"flex items-center gap-1",children:["high","medium","low"].map(t=>(0,s.jsx)("button",{onClick:()=>o({priority:t}),className:`px-2 py-0.5 text-xs rounded transition-colors ${e.priority===t?"high"===t?"bg-destructive/20 text-destructive":"medium"===t?"bg-warning/20 text-warning":"bg-muted text-muted-foreground":"text-muted-foreground/40 hover:text-muted-foreground"}`,children:t},t))}),(0,s.jsx)("button",{onClick:()=>o({is_today:!e.is_today}),className:`text-xs px-2 py-0.5 rounded transition-colors ${e.is_today?"bg-primary/20 text-primary":"text-muted-foreground hover:text-foreground"}`,children:e.is_today?"Today *":"Mark today"}),(0,s.jsx)("span",{className:"text-border",children:"|"}),(0,s.jsx)("button",{onClick:Y,title:"AI 명령 (⌘K)",className:"text-xs px-2 py-0.5 rounded transition-colors border border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground",children:"⌘K"}),(0,s.jsx)("button",{onClick:Z,title:"노트를 Claude Code용으로 클립보드에 복사",className:"text-xs px-2 py-0.5 rounded transition-colors border border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground",children:j?"✓ Copied":"Copy as Prompt"}),(0,s.jsx)("button",{onClick:()=>I(!0),title:"포커스 모드 — 노트만 풀스크린",className:"text-xs px-2 py-0.5 rounded transition-colors border border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground",children:"Focus"}),(0,s.jsx)("button",{onClick:()=>{$.current=!0,S(e=>!e)},className:`text-xs px-2 py-0.5 rounded transition-colors border ${C?"bg-accent/15 text-accent border-accent/30":"text-muted-foreground border-border hover:text-foreground hover:border-muted-foreground"}`,children:"\uD83D\uDCAC Chat"}),(0,s.jsx)("button",{onClick:ep,className:"text-xs text-muted-foreground hover:text-foreground transition-colors ml-auto",children:"Move"}),(0,s.jsx)("button",{onClick:l,className:"text-xs text-muted-foreground hover:text-destructive transition-colors",children:"Delete"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5 flex-wrap",children:[(e.tags??[]).map(t=>(0,s.jsxs)("span",{className:"inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full bg-muted text-muted-foreground border border-border",children:[t,(0,s.jsx)("button",{onClick:()=>o({tags:e.tags.filter(e=>e!==t)}),className:"text-muted-foreground/60 hover:text-destructive text-[10px] leading-none",children:"\xd7"})]},t)),k?(0,s.jsx)("input",{value:v,onChange:e=>N(e.target.value),onKeyDown:t=>{if("Enter"===t.key){let t=v.trim();t&&!(e.tags??[]).includes(t)&&o({tags:[...e.tags??[],t]}),N("")}"Escape"===t.key&&(N(""),w(!1))},onBlur:()=>{N(""),w(!1)},placeholder:"태그 입력…",className:"text-xs bg-transparent border-b border-border focus:border-primary focus:outline-none px-1 py-0.5 w-24",autoFocus:!0}):(0,s.jsx)("button",{onClick:()=>w(!0),className:"text-[10px] text-muted-foreground/50 hover:text-muted-foreground transition-colors",children:"+ tag"})]})]}),(0,s.jsxs)("div",{className:"flex-1 min-h-0 flex flex-col relative",children:[(0,s.jsxs)("div",{className:"px-4 pt-2 pb-1 flex items-center justify-between",children:[(0,s.jsx)("span",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"Note"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/60",children:"Tab 제안 수락 \xb7 ⌘K AI 명령 \xb7 자동 저장"})]}),(0,s.jsx)("div",{className:"flex-1 min-h-0",children:(0,s.jsx)(ex,{ref:U,value:h,onChange:f,onBlur:X,onOpenCommand:Y,onPromoteLine:ef,onFocusMode:()=>I(!0),extraCorpus:q,placeholder:"자유롭게 작성하세요. 배경 \xb7 목표 \xb7 관련 파일 \xb7 결정사항 \xb7 질문 \xb7 링크 등 뭐든..."})}),_&&(0,s.jsxs)("div",{className:"absolute bottom-2 right-3 text-xs px-2 py-1 rounded bg-muted/90 text-foreground flex items-center gap-2 shadow-lg border border-border",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),(0,s.jsxs)("span",{children:["AI 작업 중 ",M,"s (최대 90s)"]}),(0,s.jsx)("button",{onClick:et,className:"ml-1 text-muted-foreground hover:text-destructive transition-colors",title:"취소",children:"취소"})]}),es&&(0,s.jsxs)("div",{className:"absolute bottom-2 right-3 text-xs px-3 py-1.5 rounded bg-success/15 text-success flex items-center gap-2 shadow-lg border border-success/30",children:[(0,s.jsx)("span",{children:"✓"}),(0,s.jsx)("span",{className:"truncate max-w-[50ch]",children:es})]}),!_&&z&&z.taskId===e.id&&(0,s.jsxs)("div",{className:"absolute bottom-2 right-3 text-xs px-2 py-1 rounded bg-accent/15 text-foreground flex items-center gap-2 shadow-lg border border-accent/30",children:[(0,s.jsx)("span",{className:"text-accent",children:"✓"}),(0,s.jsx)("span",{children:"AI 결과 적용됨"}),(0,s.jsx)("button",{onClick:er,className:"px-1.5 py-0.5 rounded bg-background/60 hover:bg-background text-foreground transition-colors",title:"되돌리기 (30초 내)",children:"↶ 되돌리기"}),(0,s.jsx)("button",{onClick:()=>J(null),className:"text-muted-foreground hover:text-foreground",title:"닫기",children:"\xd7"})]}),O&&(0,s.jsxs)("div",{className:"absolute bottom-2 right-3 text-xs px-3 py-2 rounded bg-destructive/15 text-destructive flex items-center gap-2 shadow-lg border border-destructive/40 max-w-[70%]",children:[(0,s.jsx)("span",{children:"⚠"}),(0,s.jsxs)("span",{className:"truncate",children:["AI 실패: ",O]}),(0,s.jsx)("button",{onClick:()=>R(null),className:"text-destructive/60 hover:text-destructive",children:"\xd7"})]})]}),C&&(0,s.jsx)("div",{className:"h-[38%] min-h-[240px] border-t border-border",children:(0,s.jsx)(eT,{basePath:B,taskStatus:e.status,onInsertToNote:Q,onChatStateChange:x?t=>x(e.id,t):void 0})}),(0,s.jsx)(eA,{open:P,hasSelection:F,onClose:()=>A(!1),onRun:ee}),ea&&(0,s.jsx)("div",{onClick:()=>eo(!1),className:"fixed inset-0 z-50 flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-sm p-4 flex flex-col gap-3 animate-dialog-in",children:[(0,s.jsx)("div",{className:"text-sm font-semibold text-foreground",children:"태스크 이동"}),(0,s.jsxs)("div",{className:"text-xs text-muted-foreground",children:['"',e.title,'" 을 다른 프로젝트로 이동합니다.']}),(0,s.jsxs)("select",{value:ed,onChange:e=>ec(e.target.value),className:"bg-input border border-border rounded-md px-3 py-2 text-sm text-foreground focus:border-primary focus:outline-none",children:[(0,s.jsx)("option",{value:"",children:"이동할 대상 선택…"}),el.map(e=>(0,s.jsx)("optgroup",{label:e.name,children:e.subs.map(e=>(0,s.jsxs)("option",{value:e.id,disabled:e.id===r,children:[e.name,e.id===r?" (현재)":""]},e.id))},e.id))]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)("button",{onClick:()=>eo(!1),className:"text-xs text-muted-foreground px-2 py-1",children:"취소"}),(0,s.jsx)("button",{onClick:eh,disabled:!ed||eu,className:"text-xs px-3 py-1 bg-primary text-primary-foreground rounded disabled:opacity-40",children:eu?"이동 중…":"이동"})]})]})})]})}function eD({open:e,content:t,onSave:r,onClose:a}){let[o,l]=(0,n.useState)(t),i=(0,n.useRef)(null);return((0,n.useEffect)(()=>{e&&(l(t),setTimeout(()=>i.current?.focus(),50))},[e,t]),(0,n.useEffect)(()=>{if(!e)return;let t=e=>{"Escape"===e.key&&a(),(e.metaKey||e.ctrlKey)&&"Enter"===e.key&&(e.preventDefault(),r(o))};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,o,r,a]),e)?(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:a}),(0,s.jsxs)("div",{className:"relative bg-card border border-border rounded-xl shadow-2xl w-[640px] max-h-[80vh] flex flex-col animate-dialog-in",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-b border-border",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"AI Policy"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-0.5",children:"AI 채팅과 프롬프트 다듬기에 항상 포함되는 프로젝트 컨텍스트"})]}),(0,s.jsx)("button",{onClick:a,className:"text-muted-foreground hover:text-foreground text-lg px-1",children:"x"})]}),(0,s.jsx)("div",{className:"flex-1 p-4 overflow-y-auto",children:(0,s.jsx)("textarea",{ref:i,value:o,onChange:e=>l(e.target.value),placeholder:`프로젝트 컨텍스트와 AI 지침을 작성하세요.
|
|
18
|
+
`;try{await navigator.clipboard.writeText(r),y(!0),setTimeout(()=>y(!1),1500)}catch{}},[e.title,h]),Y=(0,n.useCallback)(()=>{let e=U.current?.view;e&&K(!e.state.selection.main.empty),A(!0)},[]),ee=(0,n.useCallback)(async(t,r)=>{let s=U.current?.view;if(!s)return void A(!1);let n=e.id,a=s.state.selection.main,l=a.from,i=a.to,d=a.empty?"":s.state.sliceDoc(l,i),c=s.state.doc.toString();A(!1),R(null),J(null),D(!0),L(0);let u=new AbortController;B.current=u;let x=`refine-${Date.now()}`;E({id:x,type:"refine",label:`Refine: ${e.title}`,startedAt:Date.now()});let m=Date.now(),p=setInterval(()=>L(Math.floor((Date.now()-m)/1e3)),500);try{let s,a,x=await fetch(`${W}/refine`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:t,customText:r,selection:d||void 0,note:c}),signal:u.signal}),m=await x.json();if(!x.ok||m.error)throw Error(m.error||`HTTP ${x.status}`);let p=(m.result||"").trim();if(!p)throw Error("AI 응답이 비어있습니다");if(n!==e.id){R("다른 태스크로 이동하여 결과를 버렸습니다"),setTimeout(()=>R(null),4e3);return}let h=Math.min(l,c.length),g=Math.min(i,c.length);if(l===i){let e=(h>0?"\n\n":"")+p+"\n";s=c.slice(0,h)+e+c.slice(h),a=h+e.length}else s=c.slice(0,h)+p+c.slice(g),a=h+p.length;f(s),o({description:s}),J({taskId:n,doc:c}),setTimeout(()=>{J(e=>e&&e.taskId===n?null:e)},3e4);let b=U.current?.view;if(b)try{let e=Math.min(a,b.state.doc.length);b.dispatch({selection:{anchor:e}})}catch{}}catch(e){e?.name==="AbortError"||(R(e instanceof Error?e.message:"알 수 없는 오류"),setTimeout(()=>R(null),6e3))}finally{clearInterval(p),D(!1),B.current=null,T(x)}},[W,o,e.id]),et=(0,n.useCallback)(()=>{B.current?.abort()},[]),er=(0,n.useCallback)(()=>{if(z){if(z.taskId!==e.id)return void J(null);f(z.doc),o({description:z.doc}),J(null)}},[z,e.id,o]),[es,en]=(0,n.useState)(null),[ea,eo]=(0,n.useState)(!1),[el,ei]=(0,n.useState)([]),[ed,ec]=(0,n.useState)(""),[eu,ex]=(0,n.useState)(!1),em=(0,n.useCallback)(async()=>{try{let e=await fetch("/api/projects"),t=await e.json(),r=await Promise.all(t.map(async e=>{let t=await fetch(`/api/projects/${e.id}/sub-projects`),r=await t.json();return{...e,subs:r}}));ei(r),ec(""),eo(!0)}catch{}},[]),ep=(0,n.useCallback)(async()=>{if(ed&&!eu){ex(!0);try{(await fetch(`/api/tasks/${e.id}/move`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({subProjectId:ed})})).ok&&(eo(!1),d?.())}catch{}ex(!1)}},[ed,eu,e.id,d]),eh=(0,n.useCallback)(async()=>{let e=U.current?.view;if(!e)return;let s=function(e){let t=e.state,r=t.selection.main.head,s=t.doc.lineAt(r),n=s.text.match(/^(\s*)([-*+])\s(?:\[[ xX]\]\s)?(.*)$/);if(!n)return null;let a=n[3]?.trim();return a?{content:a,from:s.from,to:s.to}:null}(e);if(!s){R("체크박스나 불릿 목록 줄에 커서를 두고 실행하세요"),setTimeout(()=>R(null),3e3);return}let n=s.content.slice(0,200);try{let a=await fetch(`/api/projects/${t}/sub-projects/${r}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:n})});if(!a.ok)throw Error(`HTTP ${a.status}`);let l=await a.json(),d=e.state.doc.toString(),c=d.slice(0,s.from),u=d.slice(s.to),x=u.startsWith("\n")?u.slice(1):u,m=c+x;f(m),o({description:m}),i?.(l),en(`→ 태스크 "${n}" 생성됨`),setTimeout(()=>en(null),3e3)}catch(e){R(e instanceof Error?e.message:"태스크 생성 실패"),setTimeout(()=>R(null),4e3)}},[t,r,o,i]);return((0,n.useEffect)(()=>{if(!c)return;let e=e=>{"Escape"===e.key&&I(!1)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[c]),c)?(0,s.jsxs)("div",{className:"fixed inset-0 z-40 bg-background flex flex-col",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-6 py-3 border-b border-border flex-shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)("h2",{className:"text-lg font-semibold text-foreground",children:e.title}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:"Focus Mode"})]}),(0,s.jsx)("button",{onClick:()=>I(!1),className:"text-xs px-3 py-1 rounded border border-border text-muted-foreground hover:text-foreground transition-colors",children:"Esc 닫기"})]}),(0,s.jsx)("div",{className:"flex-1 min-h-0",children:(0,s.jsx)(eg,{ref:U,value:h,onChange:f,onBlur:X,onOpenCommand:Y,onPromoteLine:eh,extraCorpus:q,placeholder:"집중 모드 — 자유롭게 작성하세요…"})}),(0,s.jsx)(eO,{open:P,hasSelection:F,onClose:()=>A(!1),onRun:ee})]}):(0,s.jsxs)("div",{className:"flex flex-col h-full",children:[(0,s.jsxs)("div",{className:"px-4 py-3 border-b border-border flex-shrink-0 space-y-2",children:[g?(0,s.jsx)("input",{value:m,onChange:e=>p(e.target.value),onBlur:V,onKeyDown:t=>{"Enter"===t.key&&V(),"Escape"===t.key&&(p(e.title),b(!1))},className:"w-full bg-transparent text-lg font-semibold border-b border-primary focus:outline-none pb-1 text-foreground",autoFocus:!0}):(0,s.jsx)("h2",{onClick:()=>b(!0),className:"text-lg font-semibold cursor-text hover:text-primary transition-colors",children:e.title}),(0,s.jsxs)("div",{className:"flex items-center gap-3 flex-wrap",children:[(0,s.jsx)(eS,{status:e.status,onChange:e=>o({status:e})}),(0,s.jsx)("div",{className:"flex items-center gap-1",children:["high","medium","low"].map(t=>(0,s.jsx)("button",{onClick:()=>o({priority:t}),className:`px-2 py-0.5 text-xs rounded transition-colors ${e.priority===t?"high"===t?"bg-destructive/20 text-destructive":"medium"===t?"bg-warning/20 text-warning":"bg-muted text-muted-foreground":"text-muted-foreground/40 hover:text-muted-foreground"}`,children:t},t))}),(0,s.jsx)("button",{onClick:()=>o({is_today:!e.is_today}),className:`text-xs px-2 py-0.5 rounded transition-colors ${e.is_today?"bg-primary/20 text-primary":"text-muted-foreground hover:text-foreground"}`,children:e.is_today?"Today *":"Mark today"}),(0,s.jsx)("span",{className:"text-border",children:"|"}),(0,s.jsx)("button",{onClick:Y,title:"AI 명령 (⌘K)",className:"text-xs px-2 py-0.5 rounded transition-colors border border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground",children:"⌘K"}),(0,s.jsx)("button",{onClick:Q,title:"노트를 Claude Code용으로 클립보드에 복사",className:"text-xs px-2 py-0.5 rounded transition-colors border border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground",children:j?"✓ Copied":"Copy as Prompt"}),(0,s.jsx)("button",{onClick:()=>I(!0),title:"포커스 모드 — 노트만 풀스크린",className:"text-xs px-2 py-0.5 rounded transition-colors border border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground",children:"Focus"}),(0,s.jsx)("button",{onClick:()=>{$.current=!0,S(e=>!e)},className:`text-xs px-2 py-0.5 rounded transition-colors border ${C?"bg-accent/15 text-accent border-accent/30":"text-muted-foreground border-border hover:text-foreground hover:border-muted-foreground"}`,children:"\uD83D\uDCAC Chat"}),(0,s.jsx)("button",{onClick:em,className:"text-xs text-muted-foreground hover:text-foreground transition-colors ml-auto",children:"Move"}),(0,s.jsx)("button",{onClick:l,className:"text-xs text-muted-foreground hover:text-destructive transition-colors",children:"Delete"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5 flex-wrap",children:[(e.tags??[]).map(t=>(0,s.jsxs)("span",{className:"inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full bg-muted text-muted-foreground border border-border",children:[t,(0,s.jsx)("button",{onClick:()=>o({tags:e.tags.filter(e=>e!==t)}),className:"text-muted-foreground/60 hover:text-destructive text-[10px] leading-none",children:"\xd7"})]},t)),k?(0,s.jsx)("input",{value:v,onChange:e=>N(e.target.value),onKeyDown:t=>{if("Enter"===t.key){let t=v.trim();t&&!(e.tags??[]).includes(t)&&o({tags:[...e.tags??[],t]}),N("")}"Escape"===t.key&&(N(""),w(!1))},onBlur:()=>{N(""),w(!1)},placeholder:"태그 입력…",className:"text-xs bg-transparent border-b border-border focus:border-primary focus:outline-none px-1 py-0.5 w-24",autoFocus:!0}):(0,s.jsx)("button",{onClick:()=>w(!0),className:"text-[10px] text-muted-foreground/50 hover:text-muted-foreground transition-colors",children:"+ tag"})]})]}),(0,s.jsxs)("div",{className:"flex-1 min-h-0 flex flex-col relative",children:[(0,s.jsxs)("div",{className:"px-4 pt-2 pb-1 flex items-center justify-between",children:[(0,s.jsx)("span",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"Note"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/60",children:"Tab 제안 수락 \xb7 ⌘K AI 명령 \xb7 자동 저장"})]}),(0,s.jsx)("div",{className:"flex-1 min-h-0",children:(0,s.jsx)(eg,{ref:U,value:h,onChange:f,onBlur:X,onOpenCommand:Y,onPromoteLine:eh,onFocusMode:()=>I(!0),extraCorpus:q,placeholder:"자유롭게 작성하세요. 배경 \xb7 목표 \xb7 관련 파일 \xb7 결정사항 \xb7 질문 \xb7 링크 등 뭐든..."})}),_&&(0,s.jsxs)("div",{className:"absolute bottom-2 right-3 text-xs px-2 py-1 rounded bg-muted/90 text-foreground flex items-center gap-2 shadow-lg border border-border",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),(0,s.jsxs)("span",{children:["AI 작업 중 ",M,"s (최대 90s)"]}),(0,s.jsx)("button",{onClick:et,className:"ml-1 text-muted-foreground hover:text-destructive transition-colors",title:"취소",children:"취소"})]}),es&&(0,s.jsxs)("div",{className:"absolute bottom-2 right-3 text-xs px-3 py-1.5 rounded bg-success/15 text-success flex items-center gap-2 shadow-lg border border-success/30",children:[(0,s.jsx)("span",{children:"✓"}),(0,s.jsx)("span",{className:"truncate max-w-[50ch]",children:es})]}),!_&&z&&z.taskId===e.id&&(0,s.jsxs)("div",{className:"absolute bottom-2 right-3 text-xs px-2 py-1 rounded bg-accent/15 text-foreground flex items-center gap-2 shadow-lg border border-accent/30",children:[(0,s.jsx)("span",{className:"text-accent",children:"✓"}),(0,s.jsx)("span",{children:"AI 결과 적용됨"}),(0,s.jsx)("button",{onClick:er,className:"px-1.5 py-0.5 rounded bg-background/60 hover:bg-background text-foreground transition-colors",title:"되돌리기 (30초 내)",children:"↶ 되돌리기"}),(0,s.jsx)("button",{onClick:()=>J(null),className:"text-muted-foreground hover:text-foreground",title:"닫기",children:"\xd7"})]}),O&&(0,s.jsxs)("div",{className:"absolute bottom-2 right-3 text-xs px-3 py-2 rounded bg-destructive/15 text-destructive flex items-center gap-2 shadow-lg border border-destructive/40 max-w-[70%]",children:[(0,s.jsx)("span",{children:"⚠"}),(0,s.jsxs)("span",{className:"truncate",children:["AI 실패: ",O]}),(0,s.jsx)("button",{onClick:()=>R(null),className:"text-destructive/60 hover:text-destructive",children:"\xd7"})]})]}),C&&(0,s.jsx)("div",{className:"h-[38%] min-h-[240px] border-t border-border",children:(0,s.jsx)(e_,{basePath:W,taskStatus:e.status,onInsertToNote:Z,onChatStateChange:x?t=>x(e.id,t):void 0})}),(0,s.jsx)(eO,{open:P,hasSelection:F,onClose:()=>A(!1),onRun:ee}),ea&&(0,s.jsx)("div",{onClick:()=>eo(!1),className:"fixed inset-0 z-50 flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-sm p-4 flex flex-col gap-3 animate-dialog-in",children:[(0,s.jsx)("div",{className:"text-sm font-semibold text-foreground",children:"태스크 이동"}),(0,s.jsxs)("div",{className:"text-xs text-muted-foreground",children:['"',e.title,'" 을 다른 프로젝트로 이동합니다.']}),(0,s.jsxs)("select",{value:ed,onChange:e=>ec(e.target.value),className:"bg-input border border-border rounded-md px-3 py-2 text-sm text-foreground focus:border-primary focus:outline-none",children:[(0,s.jsx)("option",{value:"",children:"이동할 대상 선택…"}),el.map(e=>(0,s.jsx)("optgroup",{label:e.name,children:e.subs.map(e=>(0,s.jsxs)("option",{value:e.id,disabled:e.id===r,children:[e.name,e.id===r?" (현재)":""]},e.id))},e.id))]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)("button",{onClick:()=>eo(!1),className:"text-xs text-muted-foreground px-2 py-1",children:"취소"}),(0,s.jsx)("button",{onClick:ep,disabled:!ed||eu,className:"text-xs px-3 py-1 bg-primary text-primary-foreground rounded disabled:opacity-40",children:eu?"이동 중…":"이동"})]})]})})]})}function eF({open:e,content:t,onSave:r,onClose:a}){let[o,l]=(0,n.useState)(t),i=(0,n.useRef)(null);return((0,n.useEffect)(()=>{e&&(l(t),setTimeout(()=>i.current?.focus(),50))},[e,t]),(0,n.useEffect)(()=>{if(!e)return;let t=e=>{"Escape"===e.key&&a(),(e.metaKey||e.ctrlKey)&&"Enter"===e.key&&(e.preventDefault(),r(o))};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,o,r,a]),e)?(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:a}),(0,s.jsxs)("div",{className:"relative bg-card border border-border rounded-xl shadow-2xl w-[640px] max-h-[80vh] flex flex-col animate-dialog-in",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-b border-border",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"AI Policy"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-0.5",children:"AI 채팅과 프롬프트 다듬기에 항상 포함되는 프로젝트 컨텍스트"})]}),(0,s.jsx)("button",{onClick:a,className:"text-muted-foreground hover:text-foreground text-lg px-1",children:"x"})]}),(0,s.jsx)("div",{className:"flex-1 p-4 overflow-y-auto",children:(0,s.jsx)("textarea",{ref:i,value:o,onChange:e=>l(e.target.value),placeholder:`프로젝트 컨텍스트와 AI 지침을 작성하세요.
|
|
19
19
|
|
|
20
20
|
예시:
|
|
21
21
|
- 이 프로젝트는 JABIS 스마트워크 시스템입니다
|
|
22
22
|
- 기술 스택: React + TypeScript + Vite (monorepo)
|
|
23
23
|
- DB: PostgreSQL (jabis 스키마)
|
|
24
24
|
- 한국어로 응답할 것
|
|
25
|
-
- 코드 제안 시 기존 컨벤션을 따를 것`,className:"w-full bg-input border border-border rounded-lg px-4 py-3 text-sm text-foreground resize-none focus:border-primary focus:outline-none leading-relaxed font-mono min-h-[300px]"})}),(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-t border-border",children:[(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:"Cmd+Enter to save"}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{onClick:a,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground border border-border rounded-md transition-colors",children:"Cancel"}),(0,s.jsx)("button",{onClick:()=>r(o),className:"px-3 py-1.5 text-xs bg-primary text-white rounded-md hover:bg-primary-hover transition-colors",children:"Save"})]})]})]})]}):null}let
|
|
25
|
+
- 코드 제안 시 기존 컨벤션을 따를 것`,className:"w-full bg-input border border-border rounded-lg px-4 py-3 text-sm text-foreground resize-none focus:border-primary focus:outline-none leading-relaxed font-mono min-h-[300px]"})}),(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-t border-border",children:[(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:"Cmd+Enter to save"}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{onClick:a,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground border border-border rounded-md transition-colors",children:"Cancel"}),(0,s.jsx)("button",{onClick:()=>r(o),className:"px-3 py-1.5 text-xs bg-primary text-white rounded-md hover:bg-primary-hover transition-colors",children:"Save"})]})]})]})]}):null}let eK={success:{icon:"✅",color:"text-success"},error:{icon:"❌",color:"text-destructive"},"no-git":{icon:"➖",color:"text-muted-foreground"},"no-path":{icon:"➖",color:"text-muted-foreground"}};function ez({open:e,results:t,onClose:r}){let a=(0,n.useRef)(null);if((0,n.useEffect)(()=>{if(!e)return;let t=e=>{"Escape"===e.key&&r()};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,r]),!e)return null;let o=t.filter(e=>"success"===e.status).length,l=t.filter(e=>"error"===e.status).length,i=t.filter(e=>"no-git"===e.status||"no-path"===e.status).length;return(0,s.jsx)("div",{ref:a,onClick:e=>{e.target===a.current&&r()},className:"fixed inset-0 z-50 flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{className:"bg-card border border-border rounded-xl shadow-2xl shadow-black/40 w-full max-w-md mx-4 animate-dialog-in",children:[(0,s.jsxs)("div",{className:"p-5 border-b border-border",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:"Git Sync Results"}),(0,s.jsxs)("p",{className:"text-xs text-muted-foreground mt-1",children:[o," synced, ",l," failed, ",i," skipped"]})]}),(0,s.jsx)("div",{className:"max-h-64 overflow-y-auto p-3 space-y-1.5",children:0===t.length?(0,s.jsx)("p",{className:"text-xs text-muted-foreground text-center py-4",children:"No projects with linked folders"}):t.map(e=>{let t=eK[e.status];return(0,s.jsxs)("div",{className:"flex items-start gap-2 p-2 rounded-lg bg-muted/50",children:[(0,s.jsx)("span",{className:"text-sm flex-shrink-0",children:t.icon}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("div",{className:"text-xs font-medium truncate",children:e.projectName}),(0,s.jsx)("div",{className:`text-xs ${t.color} truncate`,title:e.message,children:e.message})]})]},e.projectId)})}),(0,s.jsx)("div",{className:"flex justify-end px-5 pb-4 pt-2",children:(0,s.jsx)("button",{onClick:r,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground bg-muted hover:bg-card-hover border border-border rounded-md transition-colors",children:"Close"})})]})})}let eJ={ts:"TS",tsx:"TX",js:"JS",jsx:"JX",json:"{}",md:"MD",css:"CS",scss:"SC",html:"HT",svg:"SV",png:"PN",jpg:"JP",py:"PY",go:"GO",rs:"RS",java:"JA",sql:"SQ",sh:"SH",yml:"YM",yaml:"YM",toml:"TM",xml:"XM",txt:"TX",env:"EN",lock:"LK",gitignore:"GI"};function eB({rootPath:e,onClose:t}){let[r,a]=(0,n.useState)({}),[o,l]=(0,n.useState)(new Set([e])),i=(0,n.useRef)(null),d=(0,n.useCallback)(async e=>{a(t=>({...t,[e]:{entries:[],loaded:!1,loading:!0}}));try{let t=await fetch(`/api/filesystem/tree?path=${encodeURIComponent(e)}`);if(!t.ok)throw Error("Failed to load");let r=await t.json();a(t=>({...t,[e]:{entries:r.entries,loaded:!0,loading:!1}}))}catch{a(t=>({...t,[e]:{entries:[],loaded:!0,loading:!1,error:"Failed to load"}}))}},[]);(0,n.useEffect)(()=>{d(e)},[e,d]),(0,n.useEffect)(()=>{let e=e=>{"Escape"===e.key&&t()};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[t]);let c=(e,t)=>{let n=r[e];return n?n.loading?(0,s.jsx)("div",{className:"flex items-center gap-2 py-1",style:{paddingLeft:16*t+12},children:(0,s.jsx)("span",{className:"text-xs text-muted-foreground animate-pulse",children:"Loading..."})}):n.error?(0,s.jsx)("div",{className:"flex items-center gap-2 py-1",style:{paddingLeft:16*t+12},children:(0,s.jsx)("span",{className:"text-xs text-destructive",children:n.error})}):0===n.entries.length?(0,s.jsx)("div",{className:"flex items-center gap-2 py-1",style:{paddingLeft:16*t+12},children:(0,s.jsx)("span",{className:"text-xs text-muted-foreground italic",children:"Empty"})}):n.entries.map(e=>{var n,a;let i="directory"===e.type,u=o.has(e.path);return(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:`flex items-center gap-1.5 py-[3px] pr-3 cursor-pointer transition-colors hover:bg-card-hover group ${i?"text-foreground":"text-muted-foreground"}`,style:{paddingLeft:16*t+12},onClick:()=>{var t;return i&&(t=e.path,void l(e=>{let s=new Set(e);return s.has(t)?s.delete(t):(s.add(t),r[t]?.loaded||r[t]?.loading||d(t)),s}))},children:i?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"w-4 text-center text-xs text-muted-foreground flex-shrink-0",children:u?"▼":"▶"}),(0,s.jsx)("span",{className:"text-sm flex-shrink-0",children:u?"\uD83D\uDCC2":"\uD83D\uDCC1"}),(0,s.jsx)("span",{className:"text-sm truncate flex-1 font-medium",children:e.name})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"w-4 flex-shrink-0"}),(0,s.jsx)("span",{className:"text-[10px] font-mono w-5 text-center flex-shrink-0 text-muted-foreground/70",children:(n=e.extension)?eJ[n]||n.slice(0,2).toUpperCase():"--"}),(0,s.jsx)("span",{className:"text-sm truncate flex-1",children:e.name}),void 0!==e.size&&(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/50 tabular-nums flex-shrink-0",children:(a=e.size)<1024?`${a}B`:a<1048576?`${(a/1024).toFixed(0)}K`:`${(a/1048576).toFixed(1)}M`})]})}),i&&u&&c(e.path,t+1)]},e.path)}):null},u=e.split("/").pop()||e;return(0,s.jsxs)("div",{ref:i,className:"fixed inset-0 z-50 flex justify-end",onClick:e=>{e.target===i.current&&t()},children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/40 backdrop-blur-[2px]"}),(0,s.jsxs)("div",{className:"relative w-[420px] max-w-[85vw] h-full bg-card border-l border-border shadow-2xl flex flex-col animate-drawer-in",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border flex-shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,s.jsx)("span",{className:"text-base",children:"\uD83D\uDCC2"}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold truncate",children:u}),(0,s.jsx)("p",{className:"text-[10px] text-muted-foreground font-mono truncate",children:e})]})]}),(0,s.jsx)("button",{onClick:t,className:"text-muted-foreground hover:text-foreground transition-colors text-lg px-1",title:"Close (ESC)",children:"\xd7"})]}),(0,s.jsx)("div",{className:"flex-1 overflow-y-auto py-2",children:c(e,0)}),(0,s.jsx)("div",{className:"px-4 py-2 border-t border-border flex-shrink-0",children:(0,s.jsx)("p",{className:"text-[10px] text-muted-foreground",children:"ESC to close"})})]})]})}function eW({open:e,projectId:t,onClose:r,onApplied:a}){let[o,l]=(0,n.useState)(!1),[i,d]=(0,n.useState)(!1),[c,u]=(0,n.useState)(null),[x,m]=(0,n.useState)([]),[p,h]=(0,n.useState)(new Set);(0,n.useEffect)(()=>{e&&(m([]),u(null),h(new Set),f())},[e]),(0,n.useEffect)(()=>{if(!e)return;let t=e=>{"Escape"===e.key&&r()};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,r]);let f=async()=>{l(!0),u(null);try{let e=await fetch(`/api/projects/${t}/auto-distribute`,{method:"POST"}),r=await e.json();if(!e.ok){let e=r.raw?`
|
|
26
26
|
|
|
27
27
|
AI 응답:
|
|
28
|
-
${r.raw}`:"";u((r.error||"Failed to get distribution")+e);return}m(r.distributions||[])}catch{u("AI 호출에 실패했습니다.")}finally{l(!1)}},b=async()=>{let e=x.filter(e=>e.tasks.length>0);if(0!==e.length){d(!0);try{let s=await fetch(`/api/projects/${t}/apply-distribute`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({distributions:e})});if(s.ok)a(),r();else{let e=await s.json();u(e.error||"Failed to apply")}}catch{u("적용에 실패했습니다.")}finally{d(!1)}}},g=x.reduce((e,t)=>e+t.tasks.length,0);return e?(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:r}),(0,s.jsxs)("div",{className:"relative bg-card border border-border rounded-xl shadow-2xl w-[720px] max-h-[85vh] flex flex-col animate-dialog-in",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-b border-border",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"Auto Distribute"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-0.5",children:"AI가 브레인스토밍을 분석하여 태스크를 분배합니다"})]}),(0,s.jsx)("button",{onClick:r,className:"text-muted-foreground hover:text-foreground text-lg px-1",children:"x"})]}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto p-4",children:[o&&(0,s.jsxs)("div",{className:"flex flex-col items-center justify-center py-16 gap-3",children:[(0,s.jsx)("div",{className:"w-6 h-6 border-2 border-primary border-t-transparent rounded-full animate-spin"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"AI가 분석 중..."})]}),c&&(0,s.jsxs)("div",{className:"bg-danger/10 border border-danger/30 rounded-lg p-3 mb-3",children:[(0,s.jsx)("pre",{className:"text-xs text-danger whitespace-pre-wrap break-all max-h-[200px] overflow-y-auto",children:c}),(0,s.jsx)("button",{onClick:f,className:"text-xs text-accent hover:underline mt-1",children:"다시 시도"})]}),!o&&x.length>0&&(0,s.jsx)("div",{className:"space-y-3",children:x.map((e,t)=>(0,s.jsxs)("div",{className:"border border-border rounded-lg overflow-hidden",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 bg-muted/50",children:[(0,s.jsx)("button",{onClick:()=>{h(e=>{let r=new Set(e);return r.has(t)?r.delete(t):r.add(t),r})},className:"text-xs text-muted-foreground hover:text-foreground w-4",children:p.has(t)?"▶":"▼"}),(0,s.jsx)("span",{className:`text-[10px] px-1.5 py-0.5 rounded font-medium ${e.is_new?"bg-success/15 text-success":"bg-accent/15 text-accent"}`,children:e.is_new?"NEW":"EXISTING"}),(0,s.jsx)("input",{value:e.sub_project_name,onChange:e=>{var r;return r=e.target.value,void m(e=>e.map((e,s)=>s===t?{...e,sub_project_name:r}:e))},className:"flex-1 bg-transparent text-sm font-medium text-foreground focus:outline-none border-b border-transparent focus:border-primary"}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground tabular-nums",children:e.tasks.length}),(0,s.jsx)("button",{onClick:()=>{m(e=>e.filter((e,r)=>r!==t))},className:"text-xs text-muted-foreground hover:text-danger px-1",title:"Remove group",children:"x"})]}),!p.has(t)&&(0,s.jsxs)("div",{className:"divide-y divide-border",children:[e.tasks.map((e,r)=>{var n;return(0,s.jsxs)("div",{className:"flex items-center gap-2 px-3 py-1.5 group hover:bg-muted/30",children:[(n=e.priority,(0,s.jsx)("span",{className:`inline-block w-2 h-2 rounded-full ${{high:"bg-danger",medium:"bg-warning",low:"bg-muted-foreground/40"}[n]}`})),(0,s.jsx)("input",{value:e.title,onChange:e=>{var s;return s=e.target.value,void m(e=>e.map((e,n)=>n===t?{...e,tasks:e.tasks.map((e,t)=>t===r?{...e,title:s}:e)}:e))},className:"flex-1 bg-transparent text-xs text-foreground focus:outline-none border-b border-transparent focus:border-primary"}),(0,s.jsxs)("select",{value:e.priority,onChange:e=>{var s;return s=e.target.value,void m(e=>e.map((e,n)=>n===t?{...e,tasks:e.tasks.map((e,t)=>t===r?{...e,priority:s}:e)}:e))},className:"text-[10px] bg-transparent text-muted-foreground cursor-pointer hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity",children:[(0,s.jsx)("option",{value:"high",children:"high"}),(0,s.jsx)("option",{value:"medium",children:"medium"}),(0,s.jsx)("option",{value:"low",children:"low"})]}),x.length>1&&(0,s.jsxs)("select",{value:"",onChange:e=>{let s=parseInt(e.target.value);isNaN(s)||m(e=>{let n=e[t].tasks[r];return e.map((e,a)=>a===t?{...e,tasks:e.tasks.filter((e,t)=>t!==r)}:a===s?{...e,tasks:[...e.tasks,n]}:e)})},className:"text-[10px] bg-transparent text-muted-foreground cursor-pointer hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity",title:"Move to...",children:[(0,s.jsx)("option",{value:"",children:"Move"}),x.map((e,r)=>r!==t&&(0,s.jsx)("option",{value:r,children:e.sub_project_name},r))]}),(0,s.jsx)("button",{onClick:()=>{m(e=>e.map((e,s)=>s===t?{...e,tasks:e.tasks.filter((e,t)=>t!==r)}:e))},className:"text-xs text-muted-foreground hover:text-danger opacity-0 group-hover:opacity-100 transition-opacity px-0.5",children:"x"})]},r)}),0===e.tasks.length&&(0,s.jsx)("div",{className:"px-3 py-2 text-xs text-muted-foreground italic",children:"No tasks (this group will be skipped)"})]})]},t))}),!o&&!c&&0===x.length&&(0,s.jsx)("div",{className:"text-center py-16 text-sm text-muted-foreground",children:"No distribution available"})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-t border-border",children:[(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:x.length>0&&`${x.length} projects, ${g} tasks`}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[!o&&x.length>0&&(0,s.jsx)("button",{onClick:f,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground border border-border rounded-md transition-colors",children:"Retry"}),(0,s.jsx)("button",{onClick:r,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground border border-border rounded-md transition-colors",children:"Cancel"}),(0,s.jsx)("button",{onClick:b,disabled:i||o||0===g,className:"px-4 py-1.5 text-xs bg-primary text-white rounded-md hover:bg-primary-hover transition-colors disabled:opacity-50",children:i?"Applying...":`Apply (${g})`})]})]})]})]}):null}let eK=/```action\s*\n([\s\S]*?)```/g;function ez(e){return e&&"object"==typeof e?"create_task"===e.type?"string"!=typeof e.subProjectId||"string"!=typeof e.title?null:{type:"create_task",subProjectId:e.subProjectId,projectId:"string"==typeof e.projectId?e.projectId:void 0,title:e.title,description:"string"==typeof e.description?e.description:void 0,priority:["high","medium","low"].includes(e.priority)?e.priority:void 0,status:"string"==typeof e.status?e.status:void 0}:"update_task"===e.type?"string"==typeof e.taskId&&e.changes&&"object"==typeof e.changes?{type:"update_task",taskId:e.taskId,changes:e.changes}:null:null:null}function eJ({action:e}){return(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-success text-xs font-bold",children:"+"}),(0,s.jsx)("span",{className:"text-xs text-foreground truncate flex-1",children:e.title}),e.priority&&"medium"!==e.priority&&(0,s.jsx)("span",{className:`text-[10px] px-1 rounded ${"high"===e.priority?"bg-destructive/20 text-destructive":"bg-muted text-muted-foreground"}`,children:e.priority})]})}function eW({action:e}){let t=Object.entries(e.changes).filter(([,e])=>void 0!==e).map(([e,t])=>`${e}: ${t}`).join(", ");return(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-warning text-xs font-bold",children:"~"}),(0,s.jsxs)("span",{className:"text-xs text-muted-foreground truncate",children:["task:",e.taskId.slice(0,8)]}),(0,s.jsxs)("span",{className:"text-xs text-foreground truncate flex-1",children:["→ ",t]})]})}function eB({actions:e,onApplied:t}){let[r,a]=(0,n.useState)("pending"),[o,l]=(0,n.useState)(null),[i,d]=(0,n.useState)(null),c=(0,n.useCallback)(async()=>{a("applying"),l(null);try{let r=await fetch("/api/advisor-actions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({actions:e})}),s=await r.json();if(!r.ok)throw Error(s.error||`HTTP ${r.status}`);let n=s.results,o=n.filter(e=>e.success).length,l=n.filter(e=>!e.success).length;l>0?(d(`${o} 성공, ${l} 실패`),a(o>0?"applied":"error")):(d(`${o}개 적용 완료`),a("applied")),t?.(),window.dispatchEvent(new Event("advisor-action-applied"))}catch(e){l(e instanceof Error?e.message:"적용 실패"),a("error")}},[e,t]),u=e.filter(e=>"create_task"===e.type).length,x=e.filter(e=>"update_task"===e.type).length;return(0,s.jsxs)("div",{className:`my-2 border rounded-lg text-xs ${"applied"===r?"border-success/30 bg-success/5":"error"===r?"border-destructive/30 bg-destructive/5":"border-border bg-card"}`,children:[(0,s.jsxs)("div",{className:"px-3 py-2 border-b border-border flex items-center justify-between",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,s.jsx)("span",{children:"Proposed Actions"}),u>0&&(0,s.jsxs)("span",{className:"text-success",children:["+",u," create"]}),x>0&&(0,s.jsxs)("span",{className:"text-warning",children:["~",x," update"]})]}),"applied"===r&&(0,s.jsxs)("span",{className:"text-success",children:["✓ ",i]}),"error"===r&&(0,s.jsxs)("span",{className:"text-destructive",children:["⚠ ",o||i]})]}),(0,s.jsx)("div",{className:"px-3 py-2 space-y-1.5 max-h-[200px] overflow-y-auto",children:e.map((e,t)=>(0,s.jsx)("div",{children:"create_task"===e.type?(0,s.jsx)(eJ,{action:e}):(0,s.jsx)(eW,{action:e})},t))}),"applied"!==r&&(0,s.jsxs)("div",{className:"px-3 py-2 border-t border-border flex justify-end gap-2",children:["error"===r&&(0,s.jsx)("button",{onClick:c,className:"px-2 py-1 text-foreground hover:text-primary transition-colors",children:"재시도"}),"pending"===r&&(0,s.jsx)("button",{onClick:c,className:"px-3 py-1 bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity",children:"적용"}),"applying"===r&&(0,s.jsxs)("span",{className:"flex items-center gap-1.5 text-muted-foreground",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),"적용 중…"]})]})]})}function eU({basePath:e,title:t,shortcutHint:r,placeholder:a,emptyIcon:o,emptyHints:l,activityType:i,activityLabel:d,onClose:c}){let[u,x]=(0,n.useState)([]),[m,p]=(0,n.useState)(""),[h,f]=(0,n.useState)(!1),b=(0,n.useRef)(null),g=(0,n.useRef)(null),j=(0,n.useCallback)(async()=>{try{let t=await fetch(e);if(!t.ok)return;let r=await t.json();Array.isArray(r)&&x(r)}catch{}},[e]);(0,n.useEffect)(()=>{j()},[j]),(0,n.useEffect)(()=>{b.current?.scrollIntoView({behavior:"smooth"})},[u]),(0,n.useEffect)(()=>{g.current?.focus()},[]),(0,n.useEffect)(()=>{let e=e=>{"Escape"===e.key&&(e.preventDefault(),c())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[c]);let y=(0,n.useCallback)(async()=>{let t=m.trim();if(!t||h)return;p(""),f(!0);let r=`${i}-${Date.now()}`;E({id:r,type:i,label:d,startedAt:Date.now()});let s=`temp-${Date.now()}`;x(e=>[...e,{id:s,project_id:"",role:"user",content:t,created_at:new Date().toISOString()}]);try{let r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:t})});if(r.ok){let e=await r.json();x(t=>[...t.filter(e=>e.id!==s),e.userMessage,e.aiMessage])}}catch{}T(r),f(!1),g.current?.focus()},[m,h,e,i,d]),v=(0,n.useCallback)(async()=>{await fetch(e,{method:"DELETE"}),x([]),g.current?.focus()},[e]);return(0,s.jsxs)("div",{className:"fixed inset-0 z-[55] flex items-center justify-center",onClick:c,children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/40",style:{backdropFilter:"blur(2px)"}}),(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"relative w-[560px] max-w-[90vw] h-[80vh] max-h-[700px] bg-card border border-border rounded-xl shadow-2xl flex flex-col animate-dialog-in",children:[(0,s.jsxs)("div",{className:"px-4 py-3 border-b border-border flex items-center justify-between flex-shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-semibold text-foreground",children:t}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/60",children:r})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[u.length>0&&(0,s.jsx)("button",{onClick:v,className:"text-xs text-muted-foreground hover:text-foreground transition-colors px-1",children:"Clear"}),(0,s.jsx)("button",{onClick:c,className:"text-muted-foreground hover:text-foreground transition-colors text-lg leading-none",children:"\xd7"})]})]}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-3 min-h-0",children:[0===u.length&&!h&&(0,s.jsxs)("div",{className:"flex flex-col items-center justify-center h-full text-center gap-3 text-muted-foreground",children:[(0,s.jsx)("div",{className:"text-2xl",children:o}),l.map((e,t)=>(0,s.jsx)("div",{className:0===t?"text-sm":"text-xs text-muted-foreground/70 max-w-[300px] leading-relaxed",children:e},t))]}),u.filter(e=>"system"!==e.role).map(e=>(0,s.jsx)("div",{className:`flex flex-col ${"user"===e.role?"items-end":"items-start"}`,children:"user"===e.role?(0,s.jsx)("div",{className:"max-w-[92%] px-3 py-2 rounded-lg text-sm leading-relaxed bg-accent text-white rounded-br-sm whitespace-pre-wrap",children:e.content}):(0,s.jsx)("div",{className:"max-w-[92%] w-full",children:(function(e){let t=[],r=0;for(let s of e.matchAll(eK)){let n=e.slice(r,s.index);n.trim()&&t.push({type:"markdown",text:n});try{let e=JSON.parse(s[1]),r=(Array.isArray(e)?e:[e]).map(ez).filter(e=>null!==e);r.length>0?t.push({type:"actions",actions:r}):t.push({type:"markdown",text:s[0]})}catch{t.push({type:"markdown",text:s[0]})}r=(s.index??0)+s[0].length}let s=e.slice(r);return s.trim()&&t.push({type:"markdown",text:s}),{segments:t}})(e.content).segments.map((e,t)=>"markdown"===e.type?(0,s.jsx)("div",{className:"px-3 py-2 rounded-lg bg-muted text-foreground rounded-bl-sm chat-markdown text-sm leading-relaxed",children:(0,s.jsx)(eS.oz,{remarkPlugins:[eE.A],children:e.text})},t):(0,s.jsx)(eB,{actions:e.actions},t))})},e.id)),h&&(0,s.jsx)("div",{className:"flex items-start",children:(0,s.jsx)("div",{className:"px-3 py-2 rounded-lg bg-muted text-foreground rounded-bl-sm",children:(0,s.jsxs)("div",{className:"flex gap-1",children:[(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"0ms"}}),(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"150ms"}}),(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"300ms"}})]})})}),(0,s.jsx)("div",{ref:b})]}),(0,s.jsxs)("div",{className:"flex gap-1.5 px-3 py-3 border-t border-border flex-shrink-0",children:[(0,s.jsx)("textarea",{ref:g,value:m,onChange:e=>p(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),y())},placeholder:a,rows:2,className:"flex-1 bg-input border border-border rounded-md px-3 py-2 text-sm text-foreground resize-none focus:border-primary focus:outline-none"}),(0,s.jsx)("button",{onClick:y,disabled:!m.trim()||h,className:"px-3 py-2 bg-accent text-white text-sm rounded-md disabled:opacity-40 hover:bg-accent/80 transition-colors flex-shrink-0 self-end",children:"Send"})]})]})]})}function eG({projectId:e,projectName:t,onClose:r}){return(0,s.jsx)(eU,{basePath:`/api/projects/${e}/advisor`,title:"Project Advisor",shortcutHint:"⌘L",placeholder:"프로젝트에 대해 무엇이든 물어보세요…",emptyIcon:"\uD83E\uDDED",emptyHints:["프로젝트 전체 맥락을 보고 답합니다",'"다음 뭐부터 하면 좋겠어?"\n"빠진 작업 없나?"\n"이번 주 진행 상황 정리해줘"'],activityType:"project-advisor",activityLabel:t?`Advisor: ${t}`:"Project Advisor",onClose:r})}function eH({id:e,initialSubId:t,initialTaskId:r}){let{state:a,setActiveTab:o,consumeInitial:l,updateTabName:i}=x(),d=a.activeTabId===e,c=(0,n.useRef)(t),u=(0,n.useRef)(r);(0,n.useEffect)(()=>{t&&(c.current=t),r&&(u.current=r),(t||r)&&(t&&g(t),r&&N(r),l(e))},[t,r]);let[m,p]=(0,n.useState)(null),[h,f]=(0,n.useState)([]),[b,g]=(0,n.useState)(null),[j,y]=(0,n.useState)([]),[v,N]=(0,n.useState)(null),[k,w]=(0,n.useState)(!1),[C,S]=(0,n.useState)(null),[E,T]=(0,n.useState)(!1),[I,$]=(0,n.useState)(!0),[P,A]=(0,n.useState)(""),[_,L]=(0,n.useState)(!1),[O,R]=(0,n.useState)(!1),[F,K]=(0,n.useState)(!1),[z,J]=(0,n.useState)(!1),[W,B]=(0,n.useState)(null),[U,G]=(0,n.useState)(null),[H,q]=(0,n.useState)(!1),[V,X]=(0,n.useState)(!1),[Q,Z]=(0,n.useState)({}),[Y,ee]=(0,n.useState)(null),et=(0,n.useRef)(!1),[er,es]=(0,n.useState)(500),[en,ea]=(0,n.useState)(500),eo=(0,n.useRef)(null),el=(0,n.useRef)(null),ei=(0,n.useRef)(0),ed=(0,n.useRef)(0),ec=(0,n.useCallback)((e,t)=>{t.preventDefault(),el.current=e,ei.current=t.clientX,ed.current="left"===e?er:en},[er,en]);(0,n.useEffect)(()=>{let e=e=>{if(!el.current)return;let t=e.clientX-ei.current,r=Math.max(180,Math.min(900,ed.current+t));"left"===el.current?es(r):ea(r)},t=()=>{el.current=null};return window.addEventListener("mousemove",e),window.addEventListener("mouseup",t),()=>{window.removeEventListener("mousemove",e),window.removeEventListener("mouseup",t)}},[]),(0,n.useEffect)(()=>{fetch(`/api/projects/${e}`).then(e=>e.ok?e.json():null).then(t=>{t&&(p(t),i(e,t.name))})},[e,i]);let eu=(0,n.useCallback)(async()=>{let t=await fetch(`/api/projects/${e}/sub-projects`);if(!t.ok)return;let r=await t.json();return f(r),r},[e]);(0,n.useEffect)(()=>{eu().then(e=>{if(!e||0===e.length)return;let t=c.current;t&&e.some(e=>e.id===t)?g(t):b||g(e[0].id)})},[eu]),(0,n.useEffect)(()=>{b?fetch(`/api/projects/${e}/sub-projects/${b}/tasks`).then(e=>e.json()).then(e=>{y(e);let t=u.current;t&&e.some(e=>e.id===t)&&(N(t),u.current=void 0)}):y([])},[e,b]);let ex=j.find(e=>e.id===v)??null;(0,n.useEffect)(()=>{let t=()=>{eu(),b&&fetch(`/api/projects/${e}/sub-projects/${b}/tasks`).then(e=>e.json()).then(y).catch(()=>{})};return window.addEventListener("advisor-action-applied",t),()=>window.removeEventListener("advisor-action-applied",t)},[e,b,eu]);let ep=async()=>{if(!P.trim())return;let t=await fetch(`/api/projects/${e}/sub-projects`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:P.trim()})});if(t.ok){let e=await t.json();A(""),T(!1),await eu(),g(e.id)}},eh=async t=>{if(!b)return;let r=await fetch(`/api/projects/${e}/sub-projects/${b}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:t})});if(r.ok){let e=await r.json();y(t=>[...t,e]),N(e.id),eu()}},ef=async(t,r)=>{let s=await fetch(`/api/projects/${e}/sub-projects/${b}/tasks/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:r})});if(s.ok){let e=await s.json();y(r=>r.map(r=>r.id===t?e:r)),eu()}},eb=async(t,r)=>{let s=await fetch(`/api/projects/${e}/sub-projects/${b}/tasks/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({is_today:r})});if(s.ok){let e=await s.json();y(r=>r.map(r=>r.id===t?e:r))}},eg=async t=>{if(!v||!b)return;let r=await fetch(`/api/projects/${e}/sub-projects/${b}/tasks/${v}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(r.ok){let e=await r.json();y(t=>t.map(t=>t.id===v?e:t)),eu()}},ej=async t=>{f(e=>{let r=new Map(e.map(e=>[e.id,e]));return t.map(e=>r.get(e)).filter(Boolean)}),await fetch(`/api/projects/${e}/sub-projects`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({orderedIds:t})})},ey=async t=>{let r=t||v;if(!r||!b)return;let s=j.find(e=>e.id===r);if(!s)return;await fetch(`/api/projects/${e}/sub-projects/${b}/tasks/${r}?mode=archive`,{method:"DELETE"}),y(e=>e.filter(e=>e.id!==r)),v===r&&N(null),eu(),Y?.timer&&clearTimeout(Y.timer);let n=setTimeout(()=>ee(null),3e4);ee({taskId:r,title:s.title,timer:n})},ev=async()=>{if(Y){if(clearTimeout(Y.timer),await fetch(`/api/archive?action=restore&taskId=${Y.taskId}`,{method:"POST"}),b){let t=await fetch(`/api/projects/${e}/sub-projects/${b}/tasks`);t.ok&&y(await t.json())}eu(),ee(null)}},eN=async t=>{C&&("delete-sub"===C.type?(await fetch(`/api/projects/${e}/sub-projects/${C.id}`,{method:"DELETE"}),b===C.id&&(g(null),N(null)),eu()):"delete-task"===C.type&&(await fetch(`/api/projects/${e}/sub-projects/${b}/tasks/${C.id}?mode=${t||"archive"}`,{method:"DELETE"}),y(e=>e.filter(e=>e.id!==C.id)),v===C.id&&N(null),eu()),S(null))},ew=async t=>{let r=await fetch(`/api/projects/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_path:t})});r.ok&&(p(await r.json()),w(!1))},eC=async t=>{let r=await fetch(`/api/projects/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({ai_context:t})});r.ok&&(p(await r.json()),L(!1))},eS=(0,n.useCallback)(async(t=!1)=>{if(!et.current){et.current=!0,t||J(!0);try{let r=await fetch(`/api/projects/${e}/git-sync`,{method:"POST"});if(r.ok){let e=await r.json();G(new Date),t||B(e)}}catch{}finally{et.current=!1,t||J(!1)}}},[e]);(0,n.useEffect)(()=>{if(!m?.project_path)return;let e=setInterval(()=>eS(!0),18e5);return()=>clearInterval(e)},[m?.project_path,eS]);let eE=async()=>{if(!m)return;let t=await fetch(`/api/projects/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({watch_enabled:!m.watch_enabled})});t.ok&&p(await t.json())};return((0,n.useEffect)(()=>{let e=e=>{if(!d)return;let t=e.target,r=t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||(t?.isContentEditable??!1)||!!t?.closest?.(".cm-editor");if(!r&&"KeyB"===e.code&&!e.metaKey&&!e.ctrlKey){e.preventDefault(),$(e=>!e);return}if(!r&&"KeyN"===e.code&&!e.metaKey&&!e.ctrlKey){e.preventDefault(),T(!0);return}if(!r&&"KeyT"===e.code&&!e.metaKey&&!e.ctrlKey&&b){e.preventDefault();let t=document.querySelector("[data-add-task]");t?.click();return}if((e.metaKey||e.ctrlKey)&&"KeyL"===e.code){e.preventDefault(),R(e=>!e);return}if(v&&b&&!r){let t={Digit1:"idea",Digit2:"doing",Digit3:"done",Digit4:"problem"};(e.metaKey||e.ctrlKey)&&t[e.code]&&(e.preventDefault(),ef(v,t[e.code]))}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)}),m)?(0,s.jsxs)("div",{className:"flex flex-col h-full",children:[(0,s.jsxs)("header",{className:"flex items-center justify-between px-4 py-2 border-b border-border bg-card flex-shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)("button",{onClick:()=>o("dashboard"),className:"text-muted-foreground hover:text-foreground hover:bg-muted transition-colors text-sm px-2 py-1 rounded-md",children:"← Back"}),(0,s.jsx)("span",{className:"text-border",children:"|"}),(0,s.jsx)("h1",{className:"text-sm font-semibold",children:m.name}),m.project_path&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"text-xs text-muted-foreground font-mono truncate max-w-48",title:m.project_path,children:m.project_path}),(0,s.jsx)("button",{onClick:()=>q(!0),className:"text-xs text-muted-foreground hover:text-foreground hover:bg-muted transition-colors px-1.5 py-0.5 rounded",title:"View file tree",children:"\uD83D\uDCC2"})]})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsxs)("select",{value:m.agent_type||"claude",onChange:async t=>{let r=await fetch(`/api/projects/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({agent_type:t.target.value})});r.ok&&p(await r.json())},className:"px-2 py-1.5 text-xs bg-muted border border-border rounded-md text-foreground cursor-pointer hover:bg-card-hover transition-colors",title:"AI Agent",children:[(0,s.jsx)("option",{value:"claude",children:"Claude"}),(0,s.jsx)("option",{value:"gemini",children:"Gemini"}),(0,s.jsx)("option",{value:"codex",children:"Codex"})]}),(0,s.jsxs)("button",{onClick:eE,className:`px-3 py-1.5 text-xs border rounded-md transition-colors flex items-center gap-1.5 ${m.watch_enabled?"bg-success/15 text-success border-success/30 hover:bg-success/25":"bg-muted hover:bg-card-hover text-muted-foreground border-border"}`,title:m.watch_enabled?"Watch ON":"Watch OFF",children:[(0,s.jsx)("span",{className:`inline-block w-2 h-2 rounded-full ${m.watch_enabled?"bg-success animate-pulse":"bg-muted-foreground/40"}`}),"Watch"]}),(0,s.jsxs)("button",{onClick:()=>L(!0),className:`px-3 py-1.5 text-xs border rounded-md transition-colors ${m.ai_context?"bg-accent/15 text-accent border-accent/30 hover:bg-accent/25":"bg-muted hover:bg-card-hover text-muted-foreground border-border"}`,children:["AI Policy",m.ai_context?" *":""]}),(0,s.jsx)("button",{onClick:()=>R(!0),className:`px-3 py-1.5 text-xs border rounded-md transition-colors ${O?"bg-primary/15 text-primary border-primary/30":"bg-muted hover:bg-card-hover text-muted-foreground border-border"}`,title:"프로젝트 어드바이저 (⌘L)",children:"Advisor"}),m.project_path?(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsxs)("button",{onClick:()=>eS(!1),disabled:z,className:"px-3 py-1.5 text-xs bg-muted hover:bg-card-hover text-foreground border border-border rounded-md transition-colors disabled:opacity-50 flex items-center gap-1.5",title:U?`Last sync: ${U.toLocaleTimeString()}`:"Git pull",children:[(0,s.jsx)("span",{className:z?"animate-spin":"",children:"↻"}),z?"Syncing...":"Git Sync"]}),U&&(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:U.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})})]}):(0,s.jsx)("button",{onClick:()=>w(!0),className:"px-3 py-1.5 text-xs bg-muted hover:bg-card-hover text-foreground border border-border rounded-md transition-colors",children:"Link folder"})]})]}),(0,s.jsxs)("div",{ref:eo,className:"flex-1 flex overflow-hidden",children:[I?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{style:{width:er},className:"border-r border-border flex flex-col flex-shrink-0",children:(0,s.jsx)(em,{projectId:e,onCollapse:()=>$(!1)})}),(0,s.jsx)("div",{className:"panel-resize-handle",onMouseDown:e=>ec("left",e),children:(0,s.jsx)("div",{className:"panel-resize-handle-bar"})})]}):(0,s.jsx)("button",{onClick:()=>$(!0),className:"w-8 border-r border-border flex-shrink-0 flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-card-hover transition-colors text-xs",title:"Show brainstorming (B)",style:{writingMode:"vertical-rl"},children:"Brainstorm"}),(0,s.jsxs)("div",{style:{width:en},className:"border-r border-border flex flex-col flex-shrink-0",children:[E&&(0,s.jsx)("div",{className:"px-3 py-2 border-b border-border",children:(0,s.jsx)("input",{type:"text",value:P,onChange:e=>A(e.target.value),onKeyDown:e=>{"Enter"===e.key&&ep(),"Escape"===e.key&&(A(""),T(!1))},placeholder:"Project name...",className:"w-full bg-input border border-border rounded px-2 py-1 text-xs focus:border-primary focus:outline-none text-foreground",autoFocus:!0})}),(0,s.jsx)(ek,{subProjects:h,tasks:j,selectedSubId:b,selectedTaskId:v,onSelectSub:e=>{g(e),N(null)},onSelectTask:e=>{N(e),Z(t=>{if("done"!==t[e])return t;let r={...t};return delete r[e],r})},onCreateSub:()=>T(!0),onDeleteSub:e=>{S({type:"delete-sub",id:e})},onRenameSub:async(t,r)=>{(await fetch(`/api/projects/${e}/sub-projects/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:r})})).ok&&eu()},onCreateTask:eh,onStatusChange:ef,onTodayToggle:eb,onDeleteTask:ey,onReorderSubs:ej,onReorderTasks:async t=>{b&&(y(e=>{let r=new Map(e.map(e=>[e.id,e]));return t.map(e=>r.get(e)).filter(Boolean)}),await fetch(`/api/projects/${e}/sub-projects/${b}/tasks/reorder`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({orderedIds:t})}))},onAutoDistribute:()=>X(!0),chatStates:Q})]}),(0,s.jsx)("div",{className:"panel-resize-handle",onMouseDown:e=>ec("center",e),children:(0,s.jsx)("div",{className:"panel-resize-handle-bar"})}),(0,s.jsx)("div",{className:"flex-1 min-w-0",children:ex?(0,s.jsx)(e_,{task:ex,projectId:e,subProjectId:b,siblingTasks:j,onUpdate:eg,onDelete:ey,focusMode:F,onFocusModeChange:K,onTaskPromoted:e=>y(t=>[...t,e]),onTaskMoved:()=>{y(e=>e.filter(e=>e.id!==v)),N(null)},onChatStateChange:(e,t)=>{Z(r=>({...r,[e]:t}))}}):(0,s.jsx)("div",{className:"flex items-center justify-center h-full text-muted-foreground text-sm",children:j.length>0?"Select a task":b?"Create a task to get started":"Select a project"})})]}),k&&(0,s.jsx)(D,{onSelect:ew,onCancel:()=>w(!1),initialPath:m.project_path||void 0}),(0,s.jsx)(M,{open:C?.type==="delete-sub",title:"Delete project?",description:"This will delete the project and all its tasks.",confirmLabel:"Delete",variant:"danger",onConfirm:()=>eN(),onCancel:()=>S(null)}),C?.type==="delete-task"&&(0,s.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{className:"bg-card border border-border rounded-xl shadow-2xl shadow-black/40 w-full max-w-sm mx-4 animate-dialog-in",children:[(0,s.jsxs)("div",{className:"p-5",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:"Remove task"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-1.5 leading-relaxed",children:"보관함에 넣으면 나중에 복원하거나 프롬프트를 참고할 수 있습니다."})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2 px-5 pb-4",children:[(0,s.jsx)("button",{onClick:()=>S(null),className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground bg-muted hover:bg-card-hover border border-border rounded-md transition-colors",children:"Cancel"}),(0,s.jsx)("button",{onClick:()=>eN("permanent"),className:"px-3 py-1.5 text-xs text-white bg-destructive hover:bg-destructive/80 rounded-md transition-colors",children:"Delete"}),(0,s.jsx)("button",{onClick:()=>eN("archive"),className:"px-3 py-1.5 text-xs text-white bg-primary hover:bg-primary-hover rounded-md transition-colors",children:"Archive"})]})]})}),(0,s.jsx)(eD,{open:_,content:m.ai_context||"",onSave:eC,onClose:()=>L(!1)}),(0,s.jsx)(eL,{open:!!W,results:W||[],onClose:()=>B(null)}),H&&m.project_path&&(0,s.jsx)(eR,{rootPath:m.project_path,onClose:()=>q(!1)}),(0,s.jsx)(eF,{open:V,projectId:e,onClose:()=>X(!1),onApplied:()=>{eu()}}),O&&(0,s.jsx)(eG,{projectId:e,projectName:m.name,onClose:()=>R(!1)}),Y&&(0,s.jsxs)("div",{className:"fixed bottom-4 left-1/2 -translate-x-1/2 z-50 bg-card border border-border rounded-lg shadow-xl px-4 py-2.5 flex items-center gap-3 animate-dialog-in",children:[(0,s.jsxs)("span",{className:"text-xs text-muted-foreground truncate max-w-[200px]",children:['"',Y.title,'" 삭제됨']}),(0,s.jsx)("button",{onClick:ev,className:"text-xs px-2 py-1 bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity",children:"되돌리기"}),(0,s.jsx)("button",{onClick:()=>{clearTimeout(Y.timer),ee(null)},className:"text-xs text-muted-foreground hover:text-foreground",children:"\xd7"})]})]}):(0,s.jsx)("div",{className:"flex-1 flex items-center justify-center text-muted-foreground",children:"Loading..."})}function eq(){let[e,t]=(0,n.useState)(!1),[r,a]=(0,n.useState)(""),[o,l]=(0,n.useState)([]),[i,d]=(0,n.useState)(0),[c,u]=(0,n.useState)(!1),m=(0,n.useRef)(null),{openProject:p}=x(),h=(0,n.useRef)(null);(0,n.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"p"===e.key.toLowerCase()&&(e.preventDefault(),t(e=>!e))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,n.useEffect)(()=>{if(!e)return;a(""),l([]),d(0);let t=requestAnimationFrame(()=>m.current?.focus());return()=>cancelAnimationFrame(t)},[e]),(0,n.useEffect)(()=>{if(!e)return;let t=r.trim();if(t.length<1){l([]),u(!1);return}u(!0);let s=setTimeout(()=>{h.current?.abort();let e=new AbortController;h.current=e,fetch(`/api/search?q=${encodeURIComponent(t)}`,{signal:e.signal}).then(e=>e.ok?e.json():[]).then(e=>{l(Array.isArray(e)?e:[]),d(0),u(!1)}).catch(()=>{})},120);return()=>clearTimeout(s)},[r,e]);let f=(0,n.useCallback)(e=>{p(e.projectId,e.projectName,e.subProjectId,e.taskId),t(!1)},[p]);return e?(0,s.jsx)("div",{onClick:()=>t(!1),className:"fixed inset-0 z-[60] flex items-start justify-center pt-[14vh]",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(3px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-xl animate-dialog-in",children:[(0,s.jsxs)("div",{className:"px-4 py-3 border-b border-border flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"\uD83D\uDD0E"}),(0,s.jsx)("input",{ref:m,value:r,onChange:e=>a(e.target.value),onKeyDown:e=>{if("Escape"===e.key)return void t(!1);if("ArrowDown"===e.key){e.preventDefault(),d(e=>Math.min(e+1,o.length-1));return}if("ArrowUp"===e.key){e.preventDefault(),d(e=>Math.max(e-1,0));return}if("Enter"===e.key){e.preventDefault();let t=o[i];t&&f(t)}},placeholder:"태스크 \xb7 프로젝트 \xb7 워크스페이스 검색… (⌘P)",className:"flex-1 bg-transparent text-sm text-foreground focus:outline-none"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/70 px-1.5 py-0.5 border border-border rounded",children:"↑↓ \xb7 ↵ \xb7 Esc"})]}),(0,s.jsxs)("div",{className:"max-h-[55vh] overflow-y-auto",children:[c&&(0,s.jsx)("div",{className:"px-4 py-6 text-xs text-muted-foreground",children:"검색 중…"}),!c&&r.trim()&&0===o.length&&(0,s.jsx)("div",{className:"px-4 py-6 text-xs text-muted-foreground",children:"일치하는 항목 없음"}),!c&&!r.trim()&&(0,s.jsx)("div",{className:"px-4 py-6 text-xs text-muted-foreground",children:"무엇을 찾으시나요? 태스크 제목\xb7본문, 프로젝트\xb7워크스페이스 이름을 검색합니다."}),(0,s.jsx)("ul",{children:o.map((e,t)=>(0,s.jsxs)("li",{onMouseEnter:()=>d(t),onClick:()=>f(e),className:`px-4 py-2.5 cursor-pointer border-l-2 ${t===i?"bg-muted border-primary":"border-transparent"}`,children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[(0,s.jsx)("span",{className:`px-1.5 py-0.5 rounded text-[10px] uppercase tracking-wide ${"task"===e.type?"bg-primary/15 text-primary":"project"===e.type?"bg-accent/15 text-accent":"bg-warning/15 text-warning"}`,children:"sub-project"===e.type?"project":e.type}),(0,s.jsx)("span",{children:e.projectName}),e.subProjectName&&"task"===e.type&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"opacity-50",children:"›"}),(0,s.jsx)("span",{children:e.subProjectName})]}),e.isArchived&&(0,s.jsx)("span",{className:"text-muted-foreground/70 italic",children:"(archived)"})]}),(0,s.jsx)("div",{className:"text-sm text-foreground mt-0.5 truncate",children:e.title}),e.snippet&&(0,s.jsx)("div",{className:"text-xs text-muted-foreground/80 mt-0.5 truncate",children:e.snippet})]},`${e.type}-${e.taskId??e.subProjectId??e.projectId}`))})]})]})}):null}let eV="im-quick-capture-last-dest";function eX(){try{let e=localStorage.getItem(eV);if(!e)return null;let t=JSON.parse(e);if(t?.projectId&&t?.subProjectId)return t}catch{}return null}function eQ(){let[e,t]=(0,n.useState)(!1),[r,a]=(0,n.useState)([]),[o,l]=(0,n.useState)(""),[i,d]=(0,n.useState)(""),[c,u]=(0,n.useState)(""),[m,p]=(0,n.useState)(!1),[h,f]=(0,n.useState)(null),b=(0,n.useRef)(null),{openProject:g}=x();(0,n.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"n"===e.key.toLowerCase()&&(e.preventDefault(),t(e=>!e))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,n.useEffect)(()=>{e&&fetch("/api/projects").then(e=>e.ok?e.json():[]).then(e=>{a(e.map(e=>({...e})));let t=eX(),r=e[0]?.id,s=t?.projectId&&e.some(e=>e.id===t.projectId)?t.projectId:r;s&&l(s)})},[e]),(0,n.useEffect)(()=>{if(!o)return void d("");let e=r.find(e=>e.id===o);if(e?.loaded&&e.subProjects){let t=eX(),r=e.subProjects[0]?.id??"";d(t?.projectId===o&&e.subProjects.some(e=>e.id===t.subProjectId)?t.subProjectId:r);return}fetch(`/api/projects/${o}/sub-projects`).then(e=>e.ok?e.json():[]).then(e=>{a(t=>t.map(t=>t.id===o?{...t,subProjects:e,loaded:!0}:t));let t=eX(),r=e[0]?.id??"";d(t?.projectId===o&&e.some(e=>e.id===t.subProjectId)?t.subProjectId:r)})},[o]),(0,n.useEffect)(()=>{if(!e)return;u(""),f(null),p(!1);let t=requestAnimationFrame(()=>b.current?.focus());return()=>cancelAnimationFrame(t)},[e]);let j=async()=>{let e=c.trim();if(e&&o&&i&&!m){p(!0),f(null);try{let s=await fetch(`/api/projects/${o}/sub-projects/${i}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:e})});if(!s.ok)throw Error(`HTTP ${s.status}`);let n=await s.json();try{localStorage.setItem(eV,JSON.stringify({projectId:o,subProjectId:i}))}catch{}let a=r.find(e=>e.id===o);a&&g(a.id,a.name,i,n.id),t(!1)}catch(e){f(e instanceof Error?e.message:"생성 실패"),p(!1)}}};if(!e)return null;let y=r.find(e=>e.id===o),v=y?.subProjects??[];return(0,s.jsx)("div",{onClick:()=>t(!1),className:"fixed inset-0 z-[60] flex items-start justify-center pt-[16vh]",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(3px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-md animate-dialog-in p-4 flex flex-col gap-3",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("div",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"빠른 태스크 캡처"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/70 px-1.5 py-0.5 border border-border rounded",children:"⌘N \xb7 Esc"})]}),(0,s.jsxs)("div",{className:"grid grid-cols-2 gap-2",children:[(0,s.jsx)("select",{value:o,onChange:e=>l(e.target.value),className:"bg-input border border-border rounded-md px-2 py-1.5 text-sm text-foreground focus:border-primary focus:outline-none",children:r.map(e=>(0,s.jsx)("option",{value:e.id,children:e.name},e.id))}),(0,s.jsx)("select",{value:i,onChange:e=>d(e.target.value),disabled:!v.length,className:"bg-input border border-border rounded-md px-2 py-1.5 text-sm text-foreground focus:border-primary focus:outline-none disabled:opacity-50",children:0===v.length?(0,s.jsx)("option",{value:"",children:"프로젝트 없음"}):v.map(e=>(0,s.jsx)("option",{value:e.id,children:e.name},e.id))})]}),(0,s.jsx)("input",{ref:b,value:c,onChange:e=>u(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),j()),"Escape"===e.key&&(e.preventDefault(),t(!1))},placeholder:"태스크 제목을 입력하고 Enter…",className:"w-full bg-input border border-border rounded-md px-3 py-2 text-sm text-foreground focus:border-primary focus:outline-none"}),h&&(0,s.jsxs)("div",{className:"text-xs text-destructive",children:["⚠ ",h]}),(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("div",{className:"text-[10px] text-muted-foreground/70",children:"저장 후 해당 태스크 워크스페이스로 바로 이동"}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>t(!1),className:"text-xs text-muted-foreground px-2 py-1",children:"취소"}),(0,s.jsx)("button",{onClick:j,disabled:!c.trim()||!o||!i||m,className:"text-xs px-3 py-1 bg-primary text-primary-foreground rounded disabled:opacity-40",children:m?"…":"생성"})]})]})]})})}let eZ=[{title:"전역",shortcuts:[{keys:"⌘P",desc:"전역 검색"},{keys:"⌘N",desc:"빠른 태스크 생성"},{keys:"⌘M",desc:"전역 메모 (Quick Memo)"},{keys:"⌘J",desc:"전역 AI 어드바이저"},{keys:"?",desc:"이 도움말"}]},{title:"워크스페이스",shortcuts:[{keys:"⌘L",desc:"Project Advisor 열기/닫기"},{keys:"B",desc:"브레인스토밍 패널 토글"},{keys:"N",desc:"새 프로젝트 추가"},{keys:"T",desc:"새 태스크 추가"},{keys:"⌘1",desc:"상태 → Idea"},{keys:"⌘2",desc:"상태 → Doing"},{keys:"⌘3",desc:"상태 → Done"},{keys:"⌘4",desc:"상태 → Problem"}]},{title:"노트 에디터",shortcuts:[{keys:"⌘K",desc:"AI 명령 팔레트"},{keys:"⌘⇧T",desc:"체크박스/불릿 → 태스크 승격"},{keys:"⌘⇧F",desc:"포커스 모드 (노트 풀스크린)"},{keys:"/",desc:"슬래시 명령 (/todo, /table, /code…)"},{keys:"⌘↵",desc:"체크박스 토글 [ ] ↔ [x]"},{keys:"⌘⇧↵",desc:"테이블 행 추가"},{keys:"⌘⇧⌫",desc:"테이블 행 삭제"},{keys:"Tab",desc:"고스트 자동완성 수락"},{keys:"Esc",desc:"고스트 해제"},{keys:"Enter",desc:"리스트 자동 이어쓰기"}]}];function eY(){let[e,t]=(0,n.useState)(!1);return((0,n.useEffect)(()=>{let r=r=>{if("?"===r.key&&!r.metaKey&&!r.ctrlKey&&!r.altKey){let e=r.target;if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e?.isContentEditable||e?.closest?.(".cm-editor"))return;r.preventDefault(),t(e=>!e)}"Escape"===r.key&&e&&t(!1)};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[e]),e)?(0,s.jsx)("div",{onClick:()=>t(!1),className:"fixed inset-0 z-[70] flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(3px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-lg animate-dialog-in p-5",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-foreground",children:"Keyboard Shortcuts"}),(0,s.jsx)("button",{onClick:()=>t(!1),className:"text-muted-foreground hover:text-foreground text-lg leading-none",children:"\xd7"})]}),(0,s.jsx)("div",{className:"space-y-4",children:eZ.map(e=>(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-[10px] uppercase tracking-wider text-muted-foreground/70 mb-1.5",children:e.title}),(0,s.jsx)("div",{className:"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1",children:e.shortcuts.map(e=>(0,s.jsxs)("div",{className:"contents",children:[(0,s.jsx)("kbd",{className:"text-xs font-mono px-1.5 py-0.5 rounded bg-muted border border-border text-foreground text-right whitespace-nowrap",children:e.keys}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground self-center",children:e.desc})]},e.keys))})]},e.title))}),(0,s.jsx)("div",{className:"mt-4 text-[10px] text-muted-foreground/50 text-center",children:"? 를 다시 눌러 닫기"})]})}):null}function e0(){let[e,t]=(0,n.useState)(!1),[r,a]=(0,n.useState)(""),[o,l]=(0,n.useState)(!1),i=(0,n.useRef)(null);(0,n.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"m"===e.key.toLowerCase()&&(e.preventDefault(),t(e=>!e))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,n.useEffect)(()=>{e&&!o&&fetch("/api/global-memo").then(e=>e.ok?e.json():{content:""}).then(e=>{a(e.content||""),l(!0)}).catch(()=>l(!0))},[e,o]);let d=(0,n.useCallback)(e=>{i.current&&clearTimeout(i.current),i.current=setTimeout(()=>{fetch("/api/global-memo",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:e})}).catch(()=>{})},600)},[]);return e?(0,s.jsx)("div",{onClick:()=>t(!1),className:"fixed inset-0 z-[55] flex items-center justify-center",style:{background:"rgba(0,0,0,0.3)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-[520px] max-w-[90vw] h-[65vh] max-h-[550px] flex flex-col animate-dialog-in",children:[(0,s.jsxs)("div",{className:"px-4 py-2.5 border-b border-border flex items-center justify-between flex-shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-semibold text-foreground",children:"Quick Memo"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/60",children:"⌘M"})]}),(0,s.jsx)("button",{onClick:()=>t(!1),className:"text-muted-foreground hover:text-foreground text-lg leading-none",children:"\xd7"})]}),(0,s.jsx)("div",{className:"flex-1 min-h-0 p-1",children:(0,s.jsx)("textarea",{value:r,onChange:e=>{let t=e.target.value;a(t),d(t)},placeholder:"자유롭게 메모하세요… 전역 스크래치패드입니다.",className:"w-full h-full bg-transparent text-sm text-foreground resize-none focus:outline-none p-3 font-mono leading-relaxed",autoFocus:!0})}),(0,s.jsx)("div",{className:"px-4 py-1.5 border-t border-border text-[10px] text-muted-foreground/50 flex-shrink-0",children:"자동 저장 \xb7 Esc로 닫기"})]})}):null}function e1(){let[e,t]=(0,n.useState)(!1);return((0,n.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"j"===e.key.toLowerCase()&&(e.preventDefault(),t(e=>!e))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),e)?(0,s.jsx)(eU,{basePath:"/api/global-advisor",title:"Global Advisor",shortcutHint:"⌘J",placeholder:"전체 워크스페이스에 대해 물어보세요…",emptyIcon:"\uD83C\uDF10",emptyHints:["모든 프로젝트를 조망하고 답합니다",'"전체 진행 상황 요약해줘"\n"어떤 프로젝트가 제일 급해?"\n"이번 주 뭐 해야 돼?"'],activityType:"global-advisor",activityLabel:"Global Advisor",onClose:()=>t(!1)}):null}function e2(){let{state:e}=x();return(0,s.jsxs)("div",{className:"h-screen flex flex-col",children:[(0,s.jsx)(_,{}),(0,s.jsx)(eq,{}),(0,s.jsx)(eQ,{}),(0,s.jsx)(eY,{}),(0,s.jsx)(e0,{}),(0,s.jsx)(e1,{}),(0,s.jsx)("div",{className:"flex-1 min-h-0 relative",children:e.tabs.map(t=>(0,s.jsx)("div",{className:"absolute inset-0 flex flex-col",style:{display:t.id===e.activeTabId?"flex":"none"},children:"dashboard"===t.type?(0,s.jsx)(K,{}):(0,s.jsx)(eH,{id:t.projectId,initialSubId:t.initialSubId,initialTaskId:t.initialTaskId})},t.id))})]})}function e5(){return(0,s.jsx)(j,{children:(0,s.jsx)(m,{children:(0,s.jsx)(e2,{})})})}}},e=>{e.O(0,[79,374,441,794,358],()=>e(e.s=3915)),_N_E=e.O()}]);
|
|
28
|
+
${r.raw}`:"";u((r.error||"Failed to get distribution")+e);return}m(r.distributions||[])}catch{u("AI 호출에 실패했습니다.")}finally{l(!1)}},g=async()=>{let e=x.filter(e=>e.tasks.length>0);if(0!==e.length){d(!0);try{let s=await fetch(`/api/projects/${t}/apply-distribute`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({distributions:e})});if(s.ok)a(),r();else{let e=await s.json();u(e.error||"Failed to apply")}}catch{u("적용에 실패했습니다.")}finally{d(!1)}}},b=x.reduce((e,t)=>e+t.tasks.length,0);return e?(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:r}),(0,s.jsxs)("div",{className:"relative bg-card border border-border rounded-xl shadow-2xl w-[720px] max-h-[85vh] flex flex-col animate-dialog-in",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-b border-border",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-sm font-semibold",children:"Auto Distribute"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-0.5",children:"AI가 브레인스토밍을 분석하여 태스크를 분배합니다"})]}),(0,s.jsx)("button",{onClick:r,className:"text-muted-foreground hover:text-foreground text-lg px-1",children:"x"})]}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto p-4",children:[o&&(0,s.jsxs)("div",{className:"flex flex-col items-center justify-center py-16 gap-3",children:[(0,s.jsx)("div",{className:"w-6 h-6 border-2 border-primary border-t-transparent rounded-full animate-spin"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"AI가 분석 중..."})]}),c&&(0,s.jsxs)("div",{className:"bg-danger/10 border border-danger/30 rounded-lg p-3 mb-3",children:[(0,s.jsx)("pre",{className:"text-xs text-danger whitespace-pre-wrap break-all max-h-[200px] overflow-y-auto",children:c}),(0,s.jsx)("button",{onClick:f,className:"text-xs text-accent hover:underline mt-1",children:"다시 시도"})]}),!o&&x.length>0&&(0,s.jsx)("div",{className:"space-y-3",children:x.map((e,t)=>(0,s.jsxs)("div",{className:"border border-border rounded-lg overflow-hidden",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 bg-muted/50",children:[(0,s.jsx)("button",{onClick:()=>{h(e=>{let r=new Set(e);return r.has(t)?r.delete(t):r.add(t),r})},className:"text-xs text-muted-foreground hover:text-foreground w-4",children:p.has(t)?"▶":"▼"}),(0,s.jsx)("span",{className:`text-[10px] px-1.5 py-0.5 rounded font-medium ${e.is_new?"bg-success/15 text-success":"bg-accent/15 text-accent"}`,children:e.is_new?"NEW":"EXISTING"}),(0,s.jsx)("input",{value:e.sub_project_name,onChange:e=>{var r;return r=e.target.value,void m(e=>e.map((e,s)=>s===t?{...e,sub_project_name:r}:e))},className:"flex-1 bg-transparent text-sm font-medium text-foreground focus:outline-none border-b border-transparent focus:border-primary"}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground tabular-nums",children:e.tasks.length}),(0,s.jsx)("button",{onClick:()=>{m(e=>e.filter((e,r)=>r!==t))},className:"text-xs text-muted-foreground hover:text-danger px-1",title:"Remove group",children:"x"})]}),!p.has(t)&&(0,s.jsxs)("div",{className:"divide-y divide-border",children:[e.tasks.map((e,r)=>{var n;return(0,s.jsxs)("div",{className:"flex items-center gap-2 px-3 py-1.5 group hover:bg-muted/30",children:[(n=e.priority,(0,s.jsx)("span",{className:`inline-block w-2 h-2 rounded-full ${{high:"bg-danger",medium:"bg-warning",low:"bg-muted-foreground/40"}[n]}`})),(0,s.jsx)("input",{value:e.title,onChange:e=>{var s;return s=e.target.value,void m(e=>e.map((e,n)=>n===t?{...e,tasks:e.tasks.map((e,t)=>t===r?{...e,title:s}:e)}:e))},className:"flex-1 bg-transparent text-xs text-foreground focus:outline-none border-b border-transparent focus:border-primary"}),(0,s.jsxs)("select",{value:e.priority,onChange:e=>{var s;return s=e.target.value,void m(e=>e.map((e,n)=>n===t?{...e,tasks:e.tasks.map((e,t)=>t===r?{...e,priority:s}:e)}:e))},className:"text-[10px] bg-transparent text-muted-foreground cursor-pointer hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity",children:[(0,s.jsx)("option",{value:"high",children:"high"}),(0,s.jsx)("option",{value:"medium",children:"medium"}),(0,s.jsx)("option",{value:"low",children:"low"})]}),x.length>1&&(0,s.jsxs)("select",{value:"",onChange:e=>{let s=parseInt(e.target.value);isNaN(s)||m(e=>{let n=e[t].tasks[r];return e.map((e,a)=>a===t?{...e,tasks:e.tasks.filter((e,t)=>t!==r)}:a===s?{...e,tasks:[...e.tasks,n]}:e)})},className:"text-[10px] bg-transparent text-muted-foreground cursor-pointer hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity",title:"Move to...",children:[(0,s.jsx)("option",{value:"",children:"Move"}),x.map((e,r)=>r!==t&&(0,s.jsx)("option",{value:r,children:e.sub_project_name},r))]}),(0,s.jsx)("button",{onClick:()=>{m(e=>e.map((e,s)=>s===t?{...e,tasks:e.tasks.filter((e,t)=>t!==r)}:e))},className:"text-xs text-muted-foreground hover:text-danger opacity-0 group-hover:opacity-100 transition-opacity px-0.5",children:"x"})]},r)}),0===e.tasks.length&&(0,s.jsx)("div",{className:"px-3 py-2 text-xs text-muted-foreground italic",children:"No tasks (this group will be skipped)"})]})]},t))}),!o&&!c&&0===x.length&&(0,s.jsx)("div",{className:"text-center py-16 text-sm text-muted-foreground",children:"No distribution available"})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between px-5 py-3 border-t border-border",children:[(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:x.length>0&&`${x.length} projects, ${b} tasks`}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[!o&&x.length>0&&(0,s.jsx)("button",{onClick:f,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground border border-border rounded-md transition-colors",children:"Retry"}),(0,s.jsx)("button",{onClick:r,className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground border border-border rounded-md transition-colors",children:"Cancel"}),(0,s.jsx)("button",{onClick:g,disabled:i||o||0===b,className:"px-4 py-1.5 text-xs bg-primary text-white rounded-md hover:bg-primary-hover transition-colors disabled:opacity-50",children:i?"Applying...":`Apply (${b})`})]})]})]})]}):null}let eU=/```action\s*\n([\s\S]*?)```/g;function eG(e){return e&&"object"==typeof e?"create_task"===e.type?"string"!=typeof e.subProjectId||"string"!=typeof e.title?null:{type:"create_task",subProjectId:e.subProjectId,projectId:"string"==typeof e.projectId?e.projectId:void 0,title:e.title,description:"string"==typeof e.description?e.description:void 0,priority:["high","medium","low"].includes(e.priority)?e.priority:void 0,status:"string"==typeof e.status?e.status:void 0}:"update_task"===e.type?"string"==typeof e.taskId&&e.changes&&"object"==typeof e.changes?{type:"update_task",taskId:e.taskId,changes:e.changes}:null:null:null}function eH({action:e}){return(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-success text-xs font-bold",children:"+"}),(0,s.jsx)("span",{className:"text-xs text-foreground truncate flex-1",children:e.title}),e.priority&&"medium"!==e.priority&&(0,s.jsx)("span",{className:`text-[10px] px-1 rounded ${"high"===e.priority?"bg-destructive/20 text-destructive":"bg-muted text-muted-foreground"}`,children:e.priority})]})}function eq({action:e}){let t=Object.entries(e.changes).filter(([,e])=>void 0!==e).map(([e,t])=>`${e}: ${t}`).join(", ");return(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-warning text-xs font-bold",children:"~"}),(0,s.jsxs)("span",{className:"text-xs text-muted-foreground truncate",children:["task:",e.taskId.slice(0,8)]}),(0,s.jsxs)("span",{className:"text-xs text-foreground truncate flex-1",children:["→ ",t]})]})}function eV({actions:e,onApplied:t}){let[r,a]=(0,n.useState)("pending"),[o,l]=(0,n.useState)(null),[i,d]=(0,n.useState)(null),c=(0,n.useCallback)(async()=>{a("applying"),l(null);try{let r=await fetch("/api/advisor-actions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({actions:e})}),s=await r.json();if(!r.ok)throw Error(s.error||`HTTP ${r.status}`);let n=s.results,o=n.filter(e=>e.success).length,l=n.filter(e=>!e.success).length;l>0?(d(`${o} 성공, ${l} 실패`),a(o>0?"applied":"error")):(d(`${o}개 적용 완료`),a("applied")),t?.(),window.dispatchEvent(new Event("advisor-action-applied"))}catch(e){l(e instanceof Error?e.message:"적용 실패"),a("error")}},[e,t]),u=e.filter(e=>"create_task"===e.type).length,x=e.filter(e=>"update_task"===e.type).length;return(0,s.jsxs)("div",{className:`my-2 border rounded-lg text-xs ${"applied"===r?"border-success/30 bg-success/5":"error"===r?"border-destructive/30 bg-destructive/5":"border-border bg-card"}`,children:[(0,s.jsxs)("div",{className:"px-3 py-2 border-b border-border flex items-center justify-between",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,s.jsx)("span",{children:"Proposed Actions"}),u>0&&(0,s.jsxs)("span",{className:"text-success",children:["+",u," create"]}),x>0&&(0,s.jsxs)("span",{className:"text-warning",children:["~",x," update"]})]}),"applied"===r&&(0,s.jsxs)("span",{className:"text-success",children:["✓ ",i]}),"error"===r&&(0,s.jsxs)("span",{className:"text-destructive",children:["⚠ ",o||i]})]}),(0,s.jsx)("div",{className:"px-3 py-2 space-y-1.5 max-h-[200px] overflow-y-auto",children:e.map((e,t)=>(0,s.jsx)("div",{children:"create_task"===e.type?(0,s.jsx)(eH,{action:e}):(0,s.jsx)(eq,{action:e})},t))}),"applied"!==r&&(0,s.jsxs)("div",{className:"px-3 py-2 border-t border-border flex justify-end gap-2",children:["error"===r&&(0,s.jsx)("button",{onClick:c,className:"px-2 py-1 text-foreground hover:text-primary transition-colors",children:"재시도"}),"pending"===r&&(0,s.jsx)("button",{onClick:c,className:"px-3 py-1 bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity",children:"적용"}),"applying"===r&&(0,s.jsxs)("span",{className:"flex items-center gap-1.5 text-muted-foreground",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),"적용 중…"]})]})]})}function eX({basePath:e,title:t,shortcutHint:r,placeholder:a,emptyIcon:o,emptyHints:l,activityType:i,activityLabel:d,onClose:c}){let[u,x]=(0,n.useState)([]),[m,p]=(0,n.useState)(""),[h,f]=(0,n.useState)(!1),g=(0,n.useRef)(null),b=(0,n.useRef)(null),j=(0,n.useCallback)(async()=>{try{let t=await fetch(e);if(!t.ok)return;let r=await t.json();Array.isArray(r)&&x(r)}catch{}},[e]);(0,n.useEffect)(()=>{j()},[j]),(0,n.useEffect)(()=>{g.current?.scrollIntoView({behavior:"smooth"})},[u]),(0,n.useEffect)(()=>{b.current?.focus()},[]),(0,n.useEffect)(()=>{let e=e=>{"Escape"===e.key&&(e.preventDefault(),c())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[c]);let y=(0,n.useCallback)(async()=>{let t=m.trim();if(!t||h)return;p(""),f(!0);let r=`${i}-${Date.now()}`;E({id:r,type:i,label:d,startedAt:Date.now()});let s=`temp-${Date.now()}`;x(e=>[...e,{id:s,project_id:"",role:"user",content:t,created_at:new Date().toISOString()}]);try{let r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:t})});if(r.ok){let e=await r.json();x(t=>[...t.filter(e=>e.id!==s),e.userMessage,e.aiMessage])}}catch{}T(r),f(!1),b.current?.focus()},[m,h,e,i,d]),v=(0,n.useCallback)(async()=>{await fetch(e,{method:"DELETE"}),x([]),b.current?.focus()},[e]);return(0,s.jsxs)("div",{className:"fixed inset-0 z-[55] flex items-center justify-center",onClick:c,children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/40",style:{backdropFilter:"blur(2px)"}}),(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"relative w-[560px] max-w-[90vw] h-[80vh] max-h-[700px] bg-card border border-border rounded-xl shadow-2xl flex flex-col animate-dialog-in",children:[(0,s.jsxs)("div",{className:"px-4 py-3 border-b border-border flex items-center justify-between flex-shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-semibold text-foreground",children:t}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/60",children:r})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[u.length>0&&(0,s.jsx)("button",{onClick:v,className:"text-xs text-muted-foreground hover:text-foreground transition-colors px-1",children:"Clear"}),(0,s.jsx)("button",{onClick:c,className:"text-muted-foreground hover:text-foreground transition-colors text-lg leading-none",children:"\xd7"})]})]}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-3 min-h-0",children:[0===u.length&&!h&&(0,s.jsxs)("div",{className:"flex flex-col items-center justify-center h-full text-center gap-3 text-muted-foreground",children:[(0,s.jsx)("div",{className:"text-2xl",children:o}),l.map((e,t)=>(0,s.jsx)("div",{className:0===t?"text-sm":"text-xs text-muted-foreground/70 max-w-[300px] leading-relaxed",children:e},t))]}),u.filter(e=>"system"!==e.role).map(e=>(0,s.jsx)("div",{className:`flex flex-col ${"user"===e.role?"items-end":"items-start"}`,children:"user"===e.role?(0,s.jsx)("div",{className:"max-w-[92%] px-3 py-2 rounded-lg text-sm leading-relaxed bg-accent text-white rounded-br-sm whitespace-pre-wrap",children:e.content}):(0,s.jsx)("div",{className:"max-w-[92%] w-full",children:(function(e){let t=[],r=0;for(let s of e.matchAll(eU)){let n=e.slice(r,s.index);n.trim()&&t.push({type:"markdown",text:n});try{let e=JSON.parse(s[1]),r=(Array.isArray(e)?e:[e]).map(eG).filter(e=>null!==e);r.length>0?t.push({type:"actions",actions:r}):t.push({type:"markdown",text:s[0]})}catch{t.push({type:"markdown",text:s[0]})}r=(s.index??0)+s[0].length}let s=e.slice(r);return s.trim()&&t.push({type:"markdown",text:s}),{segments:t}})(e.content).segments.map((e,t)=>"markdown"===e.type?(0,s.jsx)("div",{className:"px-3 py-2 rounded-lg bg-muted text-foreground rounded-bl-sm chat-markdown text-sm leading-relaxed",children:(0,s.jsx)(eP.oz,{remarkPlugins:[eA.A],children:e.text})},t):(0,s.jsx)(eV,{actions:e.actions},t))})},e.id)),h&&(0,s.jsx)("div",{className:"flex items-start",children:(0,s.jsx)("div",{className:"px-3 py-2 rounded-lg bg-muted text-foreground rounded-bl-sm",children:(0,s.jsxs)("div",{className:"flex gap-1",children:[(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"0ms"}}),(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"150ms"}}),(0,s.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-muted-foreground animate-bounce",style:{animationDelay:"300ms"}})]})})}),(0,s.jsx)("div",{ref:g})]}),(0,s.jsxs)("div",{className:"flex gap-1.5 px-3 py-3 border-t border-border flex-shrink-0",children:[(0,s.jsx)("textarea",{ref:b,value:m,onChange:e=>p(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),y())},placeholder:a,rows:2,className:"flex-1 bg-input border border-border rounded-md px-3 py-2 text-sm text-foreground resize-none focus:border-primary focus:outline-none"}),(0,s.jsx)("button",{onClick:y,disabled:!m.trim()||h,className:"px-3 py-2 bg-accent text-white text-sm rounded-md disabled:opacity-40 hover:bg-accent/80 transition-colors flex-shrink-0 self-end",children:"Send"})]})]})]})}function eZ({projectId:e,projectName:t,onClose:r}){return(0,s.jsx)(eX,{basePath:`/api/projects/${e}/advisor`,title:"Project Advisor",shortcutHint:"⌘L",placeholder:"프로젝트에 대해 무엇이든 물어보세요…",emptyIcon:"\uD83E\uDDED",emptyHints:["프로젝트 전체 맥락을 보고 답합니다",'"다음 뭐부터 하면 좋겠어?"\n"빠진 작업 없나?"\n"이번 주 진행 상황 정리해줘"'],activityType:"project-advisor",activityLabel:t?`Advisor: ${t}`:"Project Advisor",onClose:r})}function eQ({id:e,initialSubId:t,initialTaskId:r}){let{state:a,setActiveTab:o,consumeInitial:l,updateTabName:i}=x(),d=a.activeTabId===e,c=(0,n.useRef)(t),u=(0,n.useRef)(r);(0,n.useEffect)(()=>{t&&(c.current=t),r&&(u.current=r),(t||r)&&(t&&b(t),r&&N(r),l(e))},[t,r]);let[m,p]=(0,n.useState)(null),[h,f]=(0,n.useState)([]),[g,b]=(0,n.useState)(null),[j,y]=(0,n.useState)([]),[v,N]=(0,n.useState)(null),[k,w]=(0,n.useState)(!1),[C,S]=(0,n.useState)(null),[E,T]=(0,n.useState)(!1),[I,$]=(0,n.useState)(!0),[P,A]=(0,n.useState)(""),[_,L]=(0,n.useState)(!1),[O,R]=(0,n.useState)(!1),[F,K]=(0,n.useState)(!1),[z,J]=(0,n.useState)(!1),[B,W]=(0,n.useState)(null),[U,G]=(0,n.useState)(null),[H,q]=(0,n.useState)(!1),[V,X]=(0,n.useState)(!1),[Z,Q]=(0,n.useState)({}),[Y,ee]=(0,n.useState)(null),et=(0,n.useRef)(!1),[er,es]=(0,n.useState)(500),[en,ea]=(0,n.useState)(500),eo=(0,n.useRef)(null),el=(0,n.useRef)(null),ei=(0,n.useRef)(0),ed=(0,n.useRef)(0),ec=(0,n.useCallback)((e,t)=>{t.preventDefault(),el.current=e,ei.current=t.clientX,ed.current="left"===e?er:en},[er,en]);(0,n.useEffect)(()=>{let e=e=>{if(!el.current)return;let t=e.clientX-ei.current,r=Math.max(180,Math.min(900,ed.current+t));"left"===el.current?es(r):ea(r)},t=()=>{el.current=null};return window.addEventListener("mousemove",e),window.addEventListener("mouseup",t),()=>{window.removeEventListener("mousemove",e),window.removeEventListener("mouseup",t)}},[]),(0,n.useEffect)(()=>{fetch(`/api/projects/${e}`).then(e=>e.ok?e.json():null).then(t=>{t&&(p(t),i(e,t.name))})},[e,i]);let eu=(0,n.useCallback)(async()=>{let t=await fetch(`/api/projects/${e}/sub-projects`);if(!t.ok)return;let r=await t.json();return f(r),r},[e]);(0,n.useEffect)(()=>{eu().then(e=>{if(!e||0===e.length)return;let t=c.current;t&&e.some(e=>e.id===t)?b(t):g||b(e[0].id)})},[eu]),(0,n.useEffect)(()=>{g?fetch(`/api/projects/${e}/sub-projects/${g}/tasks`).then(e=>e.json()).then(e=>{y(e);let t=u.current;t&&e.some(e=>e.id===t)&&(N(t),u.current=void 0)}):y([])},[e,g]);let ex=j.find(e=>e.id===v)??null;(0,n.useEffect)(()=>{let t=()=>{eu(),g&&fetch(`/api/projects/${e}/sub-projects/${g}/tasks`).then(e=>e.json()).then(y).catch(()=>{})};return window.addEventListener("advisor-action-applied",t),()=>window.removeEventListener("advisor-action-applied",t)},[e,g,eu]);let em=async()=>{if(!P.trim())return;let t=await fetch(`/api/projects/${e}/sub-projects`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:P.trim()})});if(t.ok){let e=await t.json();A(""),T(!1),await eu(),b(e.id)}},ep=async t=>{if(!g)return;let r=await fetch(`/api/projects/${e}/sub-projects/${g}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:t})});if(r.ok){let e=await r.json();y(t=>[...t,e]),N(e.id),eu()}},eh=async(t,r)=>{let s=await fetch(`/api/projects/${e}/sub-projects/${g}/tasks/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:r})});if(s.ok){let e=await s.json();y(r=>r.map(r=>r.id===t?e:r)),eu()}},ef=async(t,r)=>{let s=await fetch(`/api/projects/${e}/sub-projects/${g}/tasks/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({is_today:r})});if(s.ok){let e=await s.json();y(r=>r.map(r=>r.id===t?e:r))}},eg=async t=>{if(!v||!g)return;let r=await fetch(`/api/projects/${e}/sub-projects/${g}/tasks/${v}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(r.ok){let e=await r.json();y(t=>t.map(t=>t.id===v?e:t)),eu()}},ej=async t=>{f(e=>{let r=new Map(e.map(e=>[e.id,e]));return t.map(e=>r.get(e)).filter(Boolean)}),await fetch(`/api/projects/${e}/sub-projects`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({orderedIds:t})})},ey=async t=>{let r=t||v;if(!r||!g)return;let s=j.find(e=>e.id===r);if(!s)return;await fetch(`/api/projects/${e}/sub-projects/${g}/tasks/${r}?mode=archive`,{method:"DELETE"}),y(e=>e.filter(e=>e.id!==r)),v===r&&N(null),eu(),Y?.timer&&clearTimeout(Y.timer);let n=setTimeout(()=>ee(null),3e4);ee({taskId:r,title:s.title,timer:n})},ev=async()=>{if(Y){if(clearTimeout(Y.timer),await fetch(`/api/archive?action=restore&taskId=${Y.taskId}`,{method:"POST"}),g){let t=await fetch(`/api/projects/${e}/sub-projects/${g}/tasks`);t.ok&&y(await t.json())}eu(),ee(null)}},eN=async t=>{C&&("delete-sub"===C.type?(await fetch(`/api/projects/${e}/sub-projects/${C.id}`,{method:"DELETE"}),g===C.id&&(b(null),N(null)),eu()):"delete-task"===C.type&&(await fetch(`/api/projects/${e}/sub-projects/${g}/tasks/${C.id}?mode=${t||"archive"}`,{method:"DELETE"}),y(e=>e.filter(e=>e.id!==C.id)),v===C.id&&N(null),eu()),S(null))},ek=async t=>{let r=await fetch(`/api/projects/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_path:t})});r.ok&&(p(await r.json()),w(!1))},ew=async t=>{let r=await fetch(`/api/projects/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({ai_context:t})});r.ok&&(p(await r.json()),L(!1))},eC=(0,n.useCallback)(async(t=!1)=>{if(!et.current){et.current=!0,t||J(!0);try{let r=await fetch(`/api/projects/${e}/git-sync`,{method:"POST"});if(r.ok){let e=await r.json();G(new Date),t||W(e)}}catch{}finally{et.current=!1,t||J(!1)}}},[e]);(0,n.useEffect)(()=>{if(!m?.project_path)return;let e=setInterval(()=>eC(!0),18e5);return()=>clearInterval(e)},[m?.project_path,eC]);let eS=async()=>{if(!m)return;let t=await fetch(`/api/projects/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({watch_enabled:!m.watch_enabled})});t.ok&&p(await t.json())};return((0,n.useEffect)(()=>{let e=e=>{if(!d)return;let t=e.target,r=t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||(t?.isContentEditable??!1)||!!t?.closest?.(".cm-editor");if(!r&&"KeyB"===e.code&&!e.metaKey&&!e.ctrlKey){e.preventDefault(),$(e=>!e);return}if(!r&&"KeyN"===e.code&&!e.metaKey&&!e.ctrlKey){e.preventDefault(),T(!0);return}if(!r&&"KeyT"===e.code&&!e.metaKey&&!e.ctrlKey&&g){e.preventDefault();let t=document.querySelector("[data-add-task]");t?.click();return}if((e.metaKey||e.ctrlKey)&&"KeyL"===e.code){e.preventDefault(),R(e=>!e);return}if(v&&g&&!r){let t={Digit1:"idea",Digit2:"doing",Digit3:"done",Digit4:"problem"};(e.metaKey||e.ctrlKey)&&t[e.code]&&(e.preventDefault(),eh(v,t[e.code]))}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)}),m)?(0,s.jsxs)("div",{className:"flex flex-col h-full",children:[(0,s.jsxs)("header",{className:"flex items-center justify-between px-4 py-2 border-b border-border bg-card flex-shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)("button",{onClick:()=>o("dashboard"),className:"text-muted-foreground hover:text-foreground hover:bg-muted transition-colors text-sm px-2 py-1 rounded-md",children:"← Back"}),(0,s.jsx)("span",{className:"text-border",children:"|"}),(0,s.jsx)("h1",{className:"text-sm font-semibold",children:m.name}),m.project_path&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"text-xs text-muted-foreground font-mono truncate max-w-48",title:m.project_path,children:m.project_path}),(0,s.jsx)("button",{onClick:()=>q(!0),className:"text-xs text-muted-foreground hover:text-foreground hover:bg-muted transition-colors px-1.5 py-0.5 rounded",title:"View file tree",children:"\uD83D\uDCC2"})]})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsxs)("select",{value:m.agent_type||"claude",onChange:async t=>{let r=await fetch(`/api/projects/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({agent_type:t.target.value})});r.ok&&p(await r.json())},className:"px-2 py-1.5 text-xs bg-muted border border-border rounded-md text-foreground cursor-pointer hover:bg-card-hover transition-colors",title:"AI Agent",children:[(0,s.jsx)("option",{value:"claude",children:"Claude"}),(0,s.jsx)("option",{value:"gemini",children:"Gemini"}),(0,s.jsx)("option",{value:"codex",children:"Codex"})]}),(0,s.jsxs)("button",{onClick:eS,className:`px-3 py-1.5 text-xs border rounded-md transition-colors flex items-center gap-1.5 ${m.watch_enabled?"bg-success/15 text-success border-success/30 hover:bg-success/25":"bg-muted hover:bg-card-hover text-muted-foreground border-border"}`,title:m.watch_enabled?"Watch ON":"Watch OFF",children:[(0,s.jsx)("span",{className:`inline-block w-2 h-2 rounded-full ${m.watch_enabled?"bg-success animate-pulse":"bg-muted-foreground/40"}`}),"Watch"]}),(0,s.jsxs)("button",{onClick:()=>L(!0),className:`px-3 py-1.5 text-xs border rounded-md transition-colors ${m.ai_context?"bg-accent/15 text-accent border-accent/30 hover:bg-accent/25":"bg-muted hover:bg-card-hover text-muted-foreground border-border"}`,children:["AI Policy",m.ai_context?" *":""]}),(0,s.jsx)("button",{onClick:()=>R(!0),className:`px-3 py-1.5 text-xs border rounded-md transition-colors ${O?"bg-primary/15 text-primary border-primary/30":"bg-muted hover:bg-card-hover text-muted-foreground border-border"}`,title:"프로젝트 어드바이저 (⌘L)",children:"Advisor"}),m.project_path?(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsxs)("button",{onClick:()=>eC(!1),disabled:z,className:"px-3 py-1.5 text-xs bg-muted hover:bg-card-hover text-foreground border border-border rounded-md transition-colors disabled:opacity-50 flex items-center gap-1.5",title:U?`Last sync: ${U.toLocaleTimeString()}`:"Git pull",children:[(0,s.jsx)("span",{className:z?"animate-spin":"",children:"↻"}),z?"Syncing...":"Git Sync"]}),U&&(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:U.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})})]}):(0,s.jsx)("button",{onClick:()=>w(!0),className:"px-3 py-1.5 text-xs bg-muted hover:bg-card-hover text-foreground border border-border rounded-md transition-colors",children:"Link folder"})]})]}),(0,s.jsxs)("div",{ref:eo,className:"flex-1 flex overflow-hidden",children:[I?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{style:{width:er},className:"border-r border-border flex flex-col flex-shrink-0",children:(0,s.jsx)(eb,{projectId:e,onCollapse:()=>$(!1)})}),(0,s.jsx)("div",{className:"panel-resize-handle",onMouseDown:e=>ec("left",e),children:(0,s.jsx)("div",{className:"panel-resize-handle-bar"})})]}):(0,s.jsx)("button",{onClick:()=>$(!0),className:"w-8 border-r border-border flex-shrink-0 flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-card-hover transition-colors text-xs",title:"Show brainstorming (B)",style:{writingMode:"vertical-rl"},children:"Brainstorm"}),(0,s.jsxs)("div",{style:{width:en},className:"border-r border-border flex flex-col flex-shrink-0",children:[E&&(0,s.jsx)("div",{className:"px-3 py-2 border-b border-border",children:(0,s.jsx)("input",{type:"text",value:P,onChange:e=>A(e.target.value),onKeyDown:e=>{"Enter"===e.key&&em(),"Escape"===e.key&&(A(""),T(!1))},placeholder:"Project name...",className:"w-full bg-input border border-border rounded px-2 py-1 text-xs focus:border-primary focus:outline-none text-foreground",autoFocus:!0})}),(0,s.jsx)(eT,{subProjects:h,tasks:j,selectedSubId:g,selectedTaskId:v,onSelectSub:e=>{b(e),N(null)},onSelectTask:e=>{N(e),Q(t=>{if("done"!==t[e])return t;let r={...t};return delete r[e],r})},onCreateSub:()=>T(!0),onDeleteSub:e=>{S({type:"delete-sub",id:e})},onRenameSub:async(t,r)=>{(await fetch(`/api/projects/${e}/sub-projects/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:r})})).ok&&eu()},onCreateTask:ep,onStatusChange:eh,onTodayToggle:ef,onDeleteTask:ey,onReorderSubs:ej,onReorderTasks:async t=>{g&&(y(e=>{let r=new Map(e.map(e=>[e.id,e]));return t.map(e=>r.get(e)).filter(Boolean)}),await fetch(`/api/projects/${e}/sub-projects/${g}/tasks/reorder`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({orderedIds:t})}))},onAutoDistribute:()=>X(!0),chatStates:Z})]}),(0,s.jsx)("div",{className:"panel-resize-handle",onMouseDown:e=>ec("center",e),children:(0,s.jsx)("div",{className:"panel-resize-handle-bar"})}),(0,s.jsx)("div",{className:"flex-1 min-w-0",children:ex?(0,s.jsx)(eR,{task:ex,projectId:e,subProjectId:g,siblingTasks:j,onUpdate:eg,onDelete:ey,focusMode:F,onFocusModeChange:K,onTaskPromoted:e=>y(t=>[...t,e]),onTaskMoved:()=>{y(e=>e.filter(e=>e.id!==v)),N(null)},onChatStateChange:(e,t)=>{Q(r=>({...r,[e]:t}))}}):(0,s.jsx)("div",{className:"flex items-center justify-center h-full text-muted-foreground text-sm",children:j.length>0?"Select a task":g?"Create a task to get started":"Select a project"})})]}),k&&(0,s.jsx)(D,{onSelect:ek,onCancel:()=>w(!1),initialPath:m.project_path||void 0}),(0,s.jsx)(M,{open:C?.type==="delete-sub",title:"Delete project?",description:"This will delete the project and all its tasks.",confirmLabel:"Delete",variant:"danger",onConfirm:()=>eN(),onCancel:()=>S(null)}),C?.type==="delete-task"&&(0,s.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{className:"bg-card border border-border rounded-xl shadow-2xl shadow-black/40 w-full max-w-sm mx-4 animate-dialog-in",children:[(0,s.jsxs)("div",{className:"p-5",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:"Remove task"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-1.5 leading-relaxed",children:"보관함에 넣으면 나중에 복원하거나 프롬프트를 참고할 수 있습니다."})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2 px-5 pb-4",children:[(0,s.jsx)("button",{onClick:()=>S(null),className:"px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground bg-muted hover:bg-card-hover border border-border rounded-md transition-colors",children:"Cancel"}),(0,s.jsx)("button",{onClick:()=>eN("permanent"),className:"px-3 py-1.5 text-xs text-white bg-destructive hover:bg-destructive/80 rounded-md transition-colors",children:"Delete"}),(0,s.jsx)("button",{onClick:()=>eN("archive"),className:"px-3 py-1.5 text-xs text-white bg-primary hover:bg-primary-hover rounded-md transition-colors",children:"Archive"})]})]})}),(0,s.jsx)(eF,{open:_,content:m.ai_context||"",onSave:ew,onClose:()=>L(!1)}),(0,s.jsx)(ez,{open:!!B,results:B||[],onClose:()=>W(null)}),H&&m.project_path&&(0,s.jsx)(eB,{rootPath:m.project_path,onClose:()=>q(!1)}),(0,s.jsx)(eW,{open:V,projectId:e,onClose:()=>X(!1),onApplied:()=>{eu()}}),O&&(0,s.jsx)(eZ,{projectId:e,projectName:m.name,onClose:()=>R(!1)}),Y&&(0,s.jsxs)("div",{className:"fixed bottom-4 left-1/2 -translate-x-1/2 z-50 bg-card border border-border rounded-lg shadow-xl px-4 py-2.5 flex items-center gap-3 animate-dialog-in",children:[(0,s.jsxs)("span",{className:"text-xs text-muted-foreground truncate max-w-[200px]",children:['"',Y.title,'" 삭제됨']}),(0,s.jsx)("button",{onClick:ev,className:"text-xs px-2 py-1 bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity",children:"되돌리기"}),(0,s.jsx)("button",{onClick:()=>{clearTimeout(Y.timer),ee(null)},className:"text-xs text-muted-foreground hover:text-foreground",children:"\xd7"})]})]}):(0,s.jsx)("div",{className:"flex-1 flex items-center justify-center text-muted-foreground",children:"Loading..."})}function eY(){let[e,t]=(0,n.useState)(!1),[r,a]=(0,n.useState)(""),[o,l]=(0,n.useState)([]),[i,d]=(0,n.useState)(0),[c,u]=(0,n.useState)(!1),m=(0,n.useRef)(null),{openProject:p}=x(),h=(0,n.useRef)(null);(0,n.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"p"===e.key.toLowerCase()&&(e.preventDefault(),t(e=>!e))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,n.useEffect)(()=>{if(!e)return;a(""),l([]),d(0);let t=requestAnimationFrame(()=>m.current?.focus());return()=>cancelAnimationFrame(t)},[e]),(0,n.useEffect)(()=>{if(!e)return;let t=r.trim();if(t.length<1){l([]),u(!1);return}u(!0);let s=setTimeout(()=>{h.current?.abort();let e=new AbortController;h.current=e,fetch(`/api/search?q=${encodeURIComponent(t)}`,{signal:e.signal}).then(e=>e.ok?e.json():[]).then(e=>{l(Array.isArray(e)?e:[]),d(0),u(!1)}).catch(()=>{})},120);return()=>clearTimeout(s)},[r,e]);let f=(0,n.useCallback)(e=>{p(e.projectId,e.projectName,e.subProjectId,e.taskId),t(!1)},[p]);return e?(0,s.jsx)("div",{onClick:()=>t(!1),className:"fixed inset-0 z-[60] flex items-start justify-center pt-[14vh]",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(3px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-xl animate-dialog-in",children:[(0,s.jsxs)("div",{className:"px-4 py-3 border-b border-border flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"\uD83D\uDD0E"}),(0,s.jsx)("input",{ref:m,value:r,onChange:e=>a(e.target.value),onKeyDown:e=>{if("Escape"===e.key)return void t(!1);if("ArrowDown"===e.key){e.preventDefault(),d(e=>Math.min(e+1,o.length-1));return}if("ArrowUp"===e.key){e.preventDefault(),d(e=>Math.max(e-1,0));return}if("Enter"===e.key){e.preventDefault();let t=o[i];t&&f(t)}},placeholder:"태스크 \xb7 프로젝트 \xb7 워크스페이스 검색… (⌘P)",className:"flex-1 bg-transparent text-sm text-foreground focus:outline-none"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/70 px-1.5 py-0.5 border border-border rounded",children:"↑↓ \xb7 ↵ \xb7 Esc"})]}),(0,s.jsxs)("div",{className:"max-h-[55vh] overflow-y-auto",children:[c&&(0,s.jsx)("div",{className:"px-4 py-6 text-xs text-muted-foreground",children:"검색 중…"}),!c&&r.trim()&&0===o.length&&(0,s.jsx)("div",{className:"px-4 py-6 text-xs text-muted-foreground",children:"일치하는 항목 없음"}),!c&&!r.trim()&&(0,s.jsx)("div",{className:"px-4 py-6 text-xs text-muted-foreground",children:"무엇을 찾으시나요? 태스크 제목\xb7본문, 프로젝트\xb7워크스페이스 이름을 검색합니다."}),(0,s.jsx)("ul",{children:o.map((e,t)=>(0,s.jsxs)("li",{onMouseEnter:()=>d(t),onClick:()=>f(e),className:`px-4 py-2.5 cursor-pointer border-l-2 ${t===i?"bg-muted border-primary":"border-transparent"}`,children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[(0,s.jsx)("span",{className:`px-1.5 py-0.5 rounded text-[10px] uppercase tracking-wide ${"task"===e.type?"bg-primary/15 text-primary":"project"===e.type?"bg-accent/15 text-accent":"bg-warning/15 text-warning"}`,children:"sub-project"===e.type?"project":e.type}),(0,s.jsx)("span",{children:e.projectName}),e.subProjectName&&"task"===e.type&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"opacity-50",children:"›"}),(0,s.jsx)("span",{children:e.subProjectName})]}),e.isArchived&&(0,s.jsx)("span",{className:"text-muted-foreground/70 italic",children:"(archived)"})]}),(0,s.jsx)("div",{className:"text-sm text-foreground mt-0.5 truncate",children:e.title}),e.snippet&&(0,s.jsx)("div",{className:"text-xs text-muted-foreground/80 mt-0.5 truncate",children:e.snippet})]},`${e.type}-${e.taskId??e.subProjectId??e.projectId}`))})]})]})}):null}let e0="im-quick-capture-last-dest";function e1(){try{let e=localStorage.getItem(e0);if(!e)return null;let t=JSON.parse(e);if(t?.projectId&&t?.subProjectId)return t}catch{}return null}function e2(){let[e,t]=(0,n.useState)(!1),[r,a]=(0,n.useState)([]),[o,l]=(0,n.useState)(""),[i,d]=(0,n.useState)(""),[c,u]=(0,n.useState)(""),[m,p]=(0,n.useState)(!1),[h,f]=(0,n.useState)(null),g=(0,n.useRef)(null),{openProject:b}=x();(0,n.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"n"===e.key.toLowerCase()&&(e.preventDefault(),t(e=>!e))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,n.useEffect)(()=>{e&&fetch("/api/projects").then(e=>e.ok?e.json():[]).then(e=>{a(e.map(e=>({...e})));let t=e1(),r=e[0]?.id,s=t?.projectId&&e.some(e=>e.id===t.projectId)?t.projectId:r;s&&l(s)})},[e]),(0,n.useEffect)(()=>{if(!o)return void d("");let e=r.find(e=>e.id===o);if(e?.loaded&&e.subProjects){let t=e1(),r=e.subProjects[0]?.id??"";d(t?.projectId===o&&e.subProjects.some(e=>e.id===t.subProjectId)?t.subProjectId:r);return}fetch(`/api/projects/${o}/sub-projects`).then(e=>e.ok?e.json():[]).then(e=>{a(t=>t.map(t=>t.id===o?{...t,subProjects:e,loaded:!0}:t));let t=e1(),r=e[0]?.id??"";d(t?.projectId===o&&e.some(e=>e.id===t.subProjectId)?t.subProjectId:r)})},[o]),(0,n.useEffect)(()=>{if(!e)return;u(""),f(null),p(!1);let t=requestAnimationFrame(()=>g.current?.focus());return()=>cancelAnimationFrame(t)},[e]);let j=async()=>{let e=c.trim();if(e&&o&&i&&!m){p(!0),f(null);try{let s=await fetch(`/api/projects/${o}/sub-projects/${i}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:e})});if(!s.ok)throw Error(`HTTP ${s.status}`);let n=await s.json();try{localStorage.setItem(e0,JSON.stringify({projectId:o,subProjectId:i}))}catch{}let a=r.find(e=>e.id===o);a&&b(a.id,a.name,i,n.id),t(!1)}catch(e){f(e instanceof Error?e.message:"생성 실패"),p(!1)}}};if(!e)return null;let y=r.find(e=>e.id===o),v=y?.subProjects??[];return(0,s.jsx)("div",{onClick:()=>t(!1),className:"fixed inset-0 z-[60] flex items-start justify-center pt-[16vh]",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(3px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-md animate-dialog-in p-4 flex flex-col gap-3",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("div",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wider",children:"빠른 태스크 캡처"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/70 px-1.5 py-0.5 border border-border rounded",children:"⌘N \xb7 Esc"})]}),(0,s.jsxs)("div",{className:"grid grid-cols-2 gap-2",children:[(0,s.jsx)("select",{value:o,onChange:e=>l(e.target.value),className:"bg-input border border-border rounded-md px-2 py-1.5 text-sm text-foreground focus:border-primary focus:outline-none",children:r.map(e=>(0,s.jsx)("option",{value:e.id,children:e.name},e.id))}),(0,s.jsx)("select",{value:i,onChange:e=>d(e.target.value),disabled:!v.length,className:"bg-input border border-border rounded-md px-2 py-1.5 text-sm text-foreground focus:border-primary focus:outline-none disabled:opacity-50",children:0===v.length?(0,s.jsx)("option",{value:"",children:"프로젝트 없음"}):v.map(e=>(0,s.jsx)("option",{value:e.id,children:e.name},e.id))})]}),(0,s.jsx)("input",{ref:g,value:c,onChange:e=>u(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),j()),"Escape"===e.key&&(e.preventDefault(),t(!1))},placeholder:"태스크 제목을 입력하고 Enter…",className:"w-full bg-input border border-border rounded-md px-3 py-2 text-sm text-foreground focus:border-primary focus:outline-none"}),h&&(0,s.jsxs)("div",{className:"text-xs text-destructive",children:["⚠ ",h]}),(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("div",{className:"text-[10px] text-muted-foreground/70",children:"저장 후 해당 태스크 워크스페이스로 바로 이동"}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>t(!1),className:"text-xs text-muted-foreground px-2 py-1",children:"취소"}),(0,s.jsx)("button",{onClick:j,disabled:!c.trim()||!o||!i||m,className:"text-xs px-3 py-1 bg-primary text-primary-foreground rounded disabled:opacity-40",children:m?"…":"생성"})]})]})]})})}let e5=[{title:"전역",shortcuts:[{keys:"⌘P",desc:"전역 검색"},{keys:"⌘N",desc:"빠른 태스크 생성"},{keys:"⌘M",desc:"전역 메모 (Quick Memo)"},{keys:"⌘J",desc:"전역 AI 어드바이저"},{keys:"?",desc:"이 도움말"}]},{title:"워크스페이스",shortcuts:[{keys:"⌘L",desc:"Project Advisor 열기/닫기"},{keys:"B",desc:"브레인스토밍 패널 토글"},{keys:"N",desc:"새 프로젝트 추가"},{keys:"T",desc:"새 태스크 추가"},{keys:"⌘1",desc:"상태 → Idea"},{keys:"⌘2",desc:"상태 → Doing"},{keys:"⌘3",desc:"상태 → Done"},{keys:"⌘4",desc:"상태 → Problem"}]},{title:"노트 에디터",shortcuts:[{keys:"⌘K",desc:"AI 명령 팔레트"},{keys:"⌘⇧T",desc:"체크박스/불릿 → 태스크 승격"},{keys:"⌘⇧F",desc:"포커스 모드 (노트 풀스크린)"},{keys:"/",desc:"슬래시 명령 (/todo, /table, /code…)"},{keys:"⌘↵",desc:"체크박스 토글 [ ] ↔ [x]"},{keys:"⌘⇧↵",desc:"테이블 행 추가"},{keys:"⌘⇧⌫",desc:"테이블 행 삭제"},{keys:"Tab",desc:"고스트 자동완성 수락"},{keys:"Esc",desc:"고스트 해제"},{keys:"Enter",desc:"리스트 자동 이어쓰기"}]}];function e3(){let[e,t]=(0,n.useState)(!1);return((0,n.useEffect)(()=>{let r=r=>{if("?"===r.key&&!r.metaKey&&!r.ctrlKey&&!r.altKey){let e=r.target;if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e?.isContentEditable||e?.closest?.(".cm-editor"))return;r.preventDefault(),t(e=>!e)}"Escape"===r.key&&e&&t(!1)};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[e]),e)?(0,s.jsx)("div",{onClick:()=>t(!1),className:"fixed inset-0 z-[70] flex items-center justify-center",style:{background:"rgba(0,0,0,0.5)",backdropFilter:"blur(3px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-full max-w-lg animate-dialog-in p-5",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-foreground",children:"Keyboard Shortcuts"}),(0,s.jsx)("button",{onClick:()=>t(!1),className:"text-muted-foreground hover:text-foreground text-lg leading-none",children:"\xd7"})]}),(0,s.jsx)("div",{className:"space-y-4",children:e5.map(e=>(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-[10px] uppercase tracking-wider text-muted-foreground/70 mb-1.5",children:e.title}),(0,s.jsx)("div",{className:"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1",children:e.shortcuts.map(e=>(0,s.jsxs)("div",{className:"contents",children:[(0,s.jsx)("kbd",{className:"text-xs font-mono px-1.5 py-0.5 rounded bg-muted border border-border text-foreground text-right whitespace-nowrap",children:e.keys}),(0,s.jsx)("span",{className:"text-xs text-muted-foreground self-center",children:e.desc})]},e.keys))})]},e.title))}),(0,s.jsx)("div",{className:"mt-4 text-[10px] text-muted-foreground/50 text-center",children:"? 를 다시 눌러 닫기"})]})}):null}function e4(){let[e,t]=(0,n.useState)(!1),[r,a]=(0,n.useState)(""),[o,l]=(0,n.useState)(!1),i=(0,n.useRef)(null);(0,n.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"m"===e.key.toLowerCase()&&(e.preventDefault(),t(e=>!e))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,n.useEffect)(()=>{e&&!o&&fetch("/api/global-memo").then(e=>e.ok?e.json():{content:""}).then(e=>{a(e.content||""),l(!0)}).catch(()=>l(!0))},[e,o]);let d=(0,n.useCallback)(e=>{i.current&&clearTimeout(i.current),i.current=setTimeout(()=>{fetch("/api/global-memo",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:e})}).catch(()=>{})},600)},[]);return e?(0,s.jsx)("div",{onClick:()=>t(!1),className:"fixed inset-0 z-[55] flex items-center justify-center",style:{background:"rgba(0,0,0,0.3)",backdropFilter:"blur(2px)"},children:(0,s.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"bg-card border border-border rounded-xl shadow-2xl w-[520px] max-w-[90vw] h-[65vh] max-h-[550px] flex flex-col animate-dialog-in",children:[(0,s.jsxs)("div",{className:"px-4 py-2.5 border-b border-border flex items-center justify-between flex-shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-semibold text-foreground",children:"Quick Memo"}),(0,s.jsx)("span",{className:"text-[10px] text-muted-foreground/60",children:"⌘M"})]}),(0,s.jsx)("button",{onClick:()=>t(!1),className:"text-muted-foreground hover:text-foreground text-lg leading-none",children:"\xd7"})]}),(0,s.jsx)("div",{className:"flex-1 min-h-0 p-1",children:(0,s.jsx)("textarea",{value:r,onChange:e=>{let t=e.target.value;a(t),d(t)},placeholder:"자유롭게 메모하세요… 전역 스크래치패드입니다.",className:"w-full h-full bg-transparent text-sm text-foreground resize-none focus:outline-none p-3 font-mono leading-relaxed",autoFocus:!0})}),(0,s.jsx)("div",{className:"px-4 py-1.5 border-t border-border text-[10px] text-muted-foreground/50 flex-shrink-0",children:"자동 저장 \xb7 Esc로 닫기"})]})}):null}function e6(){let[e,t]=(0,n.useState)(!1);return((0,n.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"j"===e.key.toLowerCase()&&(e.preventDefault(),t(e=>!e))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),e)?(0,s.jsx)(eX,{basePath:"/api/global-advisor",title:"Global Advisor",shortcutHint:"⌘J",placeholder:"전체 워크스페이스에 대해 물어보세요…",emptyIcon:"\uD83C\uDF10",emptyHints:["모든 프로젝트를 조망하고 답합니다",'"전체 진행 상황 요약해줘"\n"어떤 프로젝트가 제일 급해?"\n"이번 주 뭐 해야 돼?"'],activityType:"global-advisor",activityLabel:"Global Advisor",onClose:()=>t(!1)}):null}function e8(){let{state:e}=x();return(0,s.jsxs)("div",{className:"h-screen flex flex-col",children:[(0,s.jsx)(_,{}),(0,s.jsx)(eY,{}),(0,s.jsx)(e2,{}),(0,s.jsx)(e3,{}),(0,s.jsx)(e4,{}),(0,s.jsx)(e6,{}),(0,s.jsx)("div",{className:"flex-1 min-h-0 relative",children:e.tabs.map(t=>(0,s.jsx)("div",{className:"absolute inset-0 flex flex-col",style:{display:t.id===e.activeTabId?"flex":"none"},children:"dashboard"===t.type?(0,s.jsx)(K,{}):(0,s.jsx)(eQ,{id:t.projectId,initialSubId:t.initialSubId,initialTaskId:t.initialTaskId})},t.id))})]})}function e7(){return(0,s.jsx)(j,{children:(0,s.jsx)(m,{children:(0,s.jsx)(e8,{})})})}}},e=>{e.O(0,[79,374,441,794,358],()=>e(e.s=3915)),_N_E=e.O()}]);
|