idea-manager 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/.next/build-manifest.json +2 -2
  2. package/.next/routes-manifest.json +18 -0
  3. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  4. package/.next/server/app/_global-error.html +2 -2
  5. package/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/api/archive/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/filesystem/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/filesystem/tree/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/global-memo/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/projects/[id]/apply-distribute/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/projects/[id]/auto-distribute/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/projects/[id]/brainstorm/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/projects/[id]/git-sync/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/projects/[id]/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/projects/[id]/sub-projects/[subId]/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/chat/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/prompt/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/refine/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/projects/[id]/sub-projects/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/search/route.js +127 -0
  40. package/.next/server/app/api/search/route_client-reference-manifest.js +1 -0
  41. package/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/update/route.js +1 -0
  43. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -0
  44. package/.next/server/app/api/version/route.js +1 -0
  45. package/.next/server/app/api/version/route_client-reference-manifest.js +1 -0
  46. package/.next/server/app/index.html +2 -2
  47. package/.next/server/app/index.rsc +3 -3
  48. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  49. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  50. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  52. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/page.js +12 -12
  54. package/.next/server/app/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/projects/[id]/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app-paths-manifest.json +10 -7
  57. package/.next/server/pages/404.html +2 -2
  58. package/.next/server/pages/500.html +2 -2
  59. package/.next/static/chunks/app/_global-error/page-e6a77f238d2cdbb9.js +1 -0
  60. package/.next/static/chunks/app/api/archive/route-e6a77f238d2cdbb9.js +1 -0
  61. package/.next/static/chunks/app/api/filesystem/route-e6a77f238d2cdbb9.js +1 -0
  62. package/.next/static/chunks/app/api/filesystem/tree/route-e6a77f238d2cdbb9.js +1 -0
  63. package/.next/static/chunks/app/api/global-memo/route-e6a77f238d2cdbb9.js +1 -0
  64. package/.next/static/chunks/app/api/health/route-e6a77f238d2cdbb9.js +1 -0
  65. package/.next/static/chunks/app/api/projects/[id]/apply-distribute/route-e6a77f238d2cdbb9.js +1 -0
  66. package/.next/static/chunks/app/api/projects/[id]/auto-distribute/route-e6a77f238d2cdbb9.js +1 -0
  67. package/.next/static/chunks/app/api/projects/[id]/brainstorm/route-e6a77f238d2cdbb9.js +1 -0
  68. package/.next/static/chunks/app/api/projects/[id]/git-sync/route-e6a77f238d2cdbb9.js +1 -0
  69. package/.next/static/chunks/app/api/projects/[id]/route-e6a77f238d2cdbb9.js +1 -0
  70. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/route-e6a77f238d2cdbb9.js +1 -0
  71. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/chat/route-e6a77f238d2cdbb9.js +1 -0
  72. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/prompt/route-e6a77f238d2cdbb9.js +1 -0
  73. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/refine/route-e6a77f238d2cdbb9.js +1 -0
  74. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/route-e6a77f238d2cdbb9.js +1 -0
  75. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/route-e6a77f238d2cdbb9.js +1 -0
  76. package/.next/static/chunks/app/api/projects/[id]/sub-projects/route-e6a77f238d2cdbb9.js +1 -0
  77. package/.next/static/chunks/app/api/projects/route-e6a77f238d2cdbb9.js +1 -0
  78. package/.next/static/chunks/app/api/search/route-e6a77f238d2cdbb9.js +1 -0
  79. package/.next/static/chunks/app/api/sync/route-e6a77f238d2cdbb9.js +1 -0
  80. package/.next/static/chunks/app/api/update/route-e6a77f238d2cdbb9.js +1 -0
  81. package/.next/static/chunks/app/api/version/route-e6a77f238d2cdbb9.js +1 -0
  82. package/.next/static/chunks/app/page-9a1dc101e82c397c.js +28 -0
  83. package/.next/static/chunks/next/dist/client/components/builtin/app-error-e6a77f238d2cdbb9.js +1 -0
  84. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-e6a77f238d2cdbb9.js +1 -0
  85. package/.next/static/chunks/next/dist/client/components/builtin/not-found-e6a77f238d2cdbb9.js +1 -0
  86. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e6a77f238d2cdbb9.js +1 -0
  87. package/.next/static/css/eab748b03f49c43a.css +3 -0
  88. package/.next/static/mxrEVQX3r5YlDPZgpDvSp/_buildManifest.js +1 -0
  89. package/README.ja.md +4 -1
  90. package/README.ko.md +36 -6
  91. package/README.md +31 -6
  92. package/README.zh.md +4 -1
  93. package/package.json +1 -1
  94. package/src/app/api/search/route.ts +149 -0
  95. package/src/app/api/update/route.ts +52 -0
  96. package/src/app/api/version/route.ts +68 -0
  97. package/src/components/search/GlobalSearch.tsx +156 -0
  98. package/src/components/search/QuickCapture.tsx +208 -0
  99. package/src/components/tabs/TabBar.tsx +2 -0
  100. package/src/components/tabs/TabShell.tsx +4 -0
  101. package/src/components/task/CommandPalette.tsx +48 -2
  102. package/src/components/task/NoteEditor.tsx +16 -1
  103. package/src/components/task/TaskChat.tsx +31 -20
  104. package/src/components/task/TaskDetail.tsx +62 -2
  105. package/src/components/update/UpdateButton.tsx +190 -0
  106. package/src/components/workspace/WorkspacePanel.tsx +1 -0
  107. package/.next/static/63zinfEtSLCdG9nUZ3W-E/_buildManifest.js +0 -1
  108. package/.next/static/chunks/app/_global-error/page-6ec0e723e471f87a.js +0 -1
  109. package/.next/static/chunks/app/api/archive/route-6ec0e723e471f87a.js +0 -1
  110. package/.next/static/chunks/app/api/filesystem/route-6ec0e723e471f87a.js +0 -1
  111. package/.next/static/chunks/app/api/filesystem/tree/route-6ec0e723e471f87a.js +0 -1
  112. package/.next/static/chunks/app/api/global-memo/route-6ec0e723e471f87a.js +0 -1
  113. package/.next/static/chunks/app/api/health/route-6ec0e723e471f87a.js +0 -1
  114. package/.next/static/chunks/app/api/projects/[id]/apply-distribute/route-6ec0e723e471f87a.js +0 -1
  115. package/.next/static/chunks/app/api/projects/[id]/auto-distribute/route-6ec0e723e471f87a.js +0 -1
  116. package/.next/static/chunks/app/api/projects/[id]/brainstorm/route-6ec0e723e471f87a.js +0 -1
  117. package/.next/static/chunks/app/api/projects/[id]/git-sync/route-6ec0e723e471f87a.js +0 -1
  118. package/.next/static/chunks/app/api/projects/[id]/route-6ec0e723e471f87a.js +0 -1
  119. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/route-6ec0e723e471f87a.js +0 -1
  120. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/chat/route-6ec0e723e471f87a.js +0 -1
  121. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/prompt/route-6ec0e723e471f87a.js +0 -1
  122. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/refine/route-6ec0e723e471f87a.js +0 -1
  123. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/route-6ec0e723e471f87a.js +0 -1
  124. package/.next/static/chunks/app/api/projects/[id]/sub-projects/[subId]/tasks/route-6ec0e723e471f87a.js +0 -1
  125. package/.next/static/chunks/app/api/projects/[id]/sub-projects/route-6ec0e723e471f87a.js +0 -1
  126. package/.next/static/chunks/app/api/projects/route-6ec0e723e471f87a.js +0 -1
  127. package/.next/static/chunks/app/api/sync/route-6ec0e723e471f87a.js +0 -1
  128. package/.next/static/chunks/app/page-6a511af64da7531f.js +0 -28
  129. package/.next/static/chunks/next/dist/client/components/builtin/app-error-6ec0e723e471f87a.js +0 -1
  130. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-6ec0e723e471f87a.js +0 -1
  131. package/.next/static/chunks/next/dist/client/components/builtin/not-found-6ec0e723e471f87a.js +0 -1
  132. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-6ec0e723e471f87a.js +0 -1
  133. package/.next/static/css/cc32379d0efa7d1d.css +0 -3
  134. /package/.next/static/{63zinfEtSLCdG9nUZ3W-E → mxrEVQX3r5YlDPZgpDvSp}/_ssgManifest.js +0 -0
@@ -0,0 +1,28 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{3915:(e,t,r)=>{Promise.resolve().then(r.bind(r,7928))},7928:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>eI});var s=r(5155),n=r(2115);let o={id:"dashboard",type:"dashboard"};function a(e){return e.some(e=>"dashboard"===e.id)?e:[o,...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:a(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:a(t.state.tabs),activeTabId:t.state.activeTabId};default:return e}}let i="im-tabs",d={tabs:[o],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:a(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 o=(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:o,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")),[o,a]=(0,n.useState)(!1);(0,n.useEffect)(()=>{let e=localStorage.getItem(f);if(e){let t=h(e);r(t),b(t)}a(!0)},[]),(0,n.useEffect)(()=>{o&&b(t)},[t,o]);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 v=r(7650);function y(){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}(),[o,a]=(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(!o)return;u();let e=e=>{let t=e.target;l.current?.contains(t)||i.current?.contains(t)||a(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[o,u]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("button",{ref:l,className:"theme-picker-btn",onClick:()=>a(!o),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"})]})]}),o&&(0,v.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),a(!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,o]=(0,n.useState)(!1),[a,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:()=>o(!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:()=>o(!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:()=>!a&&o(!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]})]})]})]}),!a&&(0,s.jsx)("button",{onClick:()=>o(!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"}),"로 즉시 반영됩니다."]})]}):a?(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})]})]})})]})}function w(){let{state:e,setActiveTab:t,closeTab:r}=x();return(0,s.jsxs)("div",{className:"tab-bar",children:[e.tabs.map(n=>{let o=e.activeTabId===n.id,a="dashboard"===n.type;return(0,s.jsxs)("div",{onClick:()=>t(n.id),onMouseDown:e=>{1!==e.button||a||(e.preventDefault(),r(n.id))},className:`tab-item ${o?"tab-item-active":""}`,children:[(0,s.jsx)("span",{className:"truncate",children:a?"Dashboard":n.projectName||"Workspace"}),!a&&(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)(k,{}),(0,s.jsx)(y,{})]})}function C({onSelect:e,onCancel:t,initialPath:r}){let[o,a]=(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)a(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:o?.current,children:o?.current||"..."}),o?.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:[o?.parent&&(0,s.jsxs)("button",{onClick:()=>m(o.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:".."})]}),o?.dirs.length===0&&(0,s.jsx)("div",{className:"px-4 py-6 text-center text-muted-foreground text-xs",children:"하위 폴더가 없습니다"}),o?.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:()=>o&&e(o.current),disabled:!o,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 S({open:e,title:t,description:r,confirmLabel:o="Confirm",cancelLabel:a="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:a}),(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:o})]})]})}):null}let T=[{key:"active",label:"Active"},{key:"all",label:"All"},{key:"today",label:"Today"},{key:"archive",label:"Archive"}];function E({value:e,onChange:t}){let[r,o]=(0,n.useState)(!1);return((0,n.useEffect)(()=>o(!0),[]),r)?(0,s.jsx)("div",{className:"flex gap-1 bg-muted rounded-lg p-1",children:T.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 I={idea:"\uD83D\uDCA1",doing:"\uD83D\uDD25",writing:"✏️",submitted:"\uD83D\uDE80",testing:"\uD83E\uDDEA",done:"✅",problem:"\uD83D\uDD34"};function $({subProject:e,projectName:t,onClick:r}){let{active_count:n,pending_count:o,done_count:a,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:I[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]}),o>0&&(0,s.jsxs)("span",{children:["pending ",o]}),a>0&&(0,s.jsxs)("span",{className:"text-success",children:["done ",a]}),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 _(){let e,{state:t,openProject:r,closeTab:o}=x(),a="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)(""),[v,y]=(0,n.useState)(""),[N,k]=(0,n.useState)(""),[w,T]=(0,n.useState)(!0),[I,_]=(0,n.useState)(!1),[P,A]=(0,n.useState)(null),[D,M]=(0,n.useState)(null),[L,O]=(0,n.useState)(""),[R,F]=(0,n.useState)(""),[z,J]=(0,n.useState)(""),[K,W]=(0,n.useState)(!1),[U,B]=(0,n.useState)([]),[G,q]=(0,n.useState)(""),[H,V]=(0,n.useState)(!1),[X,Z]=(0,n.useState)(null),[Y,Q]=(0,n.useState)(!1),[ee,et]=(0,n.useState)(""),[er,es]=(0,n.useState)(""),[en,eo]=(0,n.useState)(!1),ea=(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)),T(!1)},[]);(0,n.useEffect)(()=>{ed(),fetch("/api/global-memo").then(e=>e.json()).then(e=>q(e.content||"")),"true"===localStorage.getItem("im-memo-open")&&eo(!0);let e=localStorage.getItem("im-dashboard-tab");e&&ei(e)},[ed]),(0,n.useEffect)(()=>{a&&!w&&ed()},[a]);let ec=(0,n.useCallback)(async()=>{let e=await fetch("/api/archive");B((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=>{Q(!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")}Q(!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:v.trim(),project_path:N.trim()||void 0})});if(t.ok){let e=await t.json();j(""),y(""),k(""),g(!1),r(e.id,e.name)}},ep=async()=>{P&&(await fetch(`/api/projects/${P}`,{method:"DELETE"}),o(P),A(null),ed())},eh=async()=>{D&&L.trim()&&(await fetch(`/api/projects/${D.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:L.trim(),description:R.trim(),project_path:z.trim()||null})})).ok&&(M(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 o of l)for(let a of o.subProjects)e+=a.task_count,t+=a.active_count,r+=a.pending_count,s+=a.done_count,n+=a.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)(E,{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;eo(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:o})=>(0,s.jsxs)("button",{onClick:()=>h(p===o?null:o),className:`${n} rounded-lg p-3 text-center transition-all hover:scale-[1.02] hover:brightness-110 cursor-pointer
2
+ ${p===o?"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;q(t=e.target.value),ea.current&&clearTimeout(ea.current),ea.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:v,onChange:e=>y(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:()=>_(!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===U.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:U.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(),M(e),O(e.name),F(e.description),J(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(),A(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)($,{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)($,{subProject:e,projectName:t,onClick:()=>{let s=l.find(e=>e.id===n);r(n,s?.name||t,e.id)}},e.id))})}),I&&(0,s.jsx)(C,{onSelect:e=>{k(e),_(!1)},onCancel:()=>_(!1)}),H&&(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:Y,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:Y?"...":"Push"}),(0,s.jsx)("button",{onClick:()=>ex("pull"),disabled:Y,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:Y?"...":"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:Y||!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:Y?"Initializing...":"Initialize"})]}),ee&&(0,s.jsx)("p",{className:`text-xs ${ee.startsWith("Error")?"text-destructive":"text-success"}`,children:ee})]})]})]}),D&&(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:()=>M(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:()=>M(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:L,onChange:e=>O(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:R,onChange:e=>F(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:z?(0,s.jsx)("span",{className:"font-mono text-foreground",children:z}):(0,s.jsx)("span",{className:"text-muted-foreground",children:"Workspace folder (optional)"})}),z&&(0,s.jsx)("button",{type:"button",onClick:()=>J(""),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:()=>M(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:!L.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"})]})]})]}),K&&(0,s.jsx)(C,{onSelect:e=>{J(e),W(!1)},onCancel:()=>W(!1),initialPath:z||void 0}),(0,s.jsx)(S,{open:!!P,title:"Delete workspace?",description:"This will permanently delete the workspace and all its data.",confirmLabel:"Delete",variant:"danger",onConfirm:ep,onCancel:()=>A(null)})]})}function P({projectId:e,onCollapse:t}){let[r,o]=(0,n.useState)(""),[a,l]=(0,n.useState)(!1),[i,d]=(0,n.useState)(!1),c=(0,n.useRef)(null),u=(0,n.useRef)(null);(0,n.useEffect)(()=>{(async()=>{let t=await fetch(`/api/projects/${e}/brainstorm`);o((await t.json()).content||""),d(!0)})()},[e]);let x=(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]);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:a?"저장 중...":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:"editor-container",children:(0,s.jsx)("textarea",{ref:u,value:r,onChange:e=>{let t=e.target.value;o(t),c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{x(t)},1e3)},placeholder:`자유롭게 아이디어를 적어보세요...
3
+
4
+ 예시:
5
+ - 소셜 로그인을 활용한 사용자 인증
6
+ - 분석 차트가 포함된 대시보드
7
+ - 알림 시스템 필요 (푸시 + 이메일)
8
+ - 다크 모드 지원
9
+ - 모바일 반응형 디자인 중요`,className:"flex-1 w-full p-4 bg-transparent resize-none text-foreground placeholder:text-muted-foreground/40 font-mono text-sm leading-relaxed",spellCheck:!1})})]}):(0,s.jsx)("div",{className:"flex items-center justify-center h-full text-muted-foreground",children:"로딩 중..."})}var A=r(4923),D=r(7256),M=r(9768);let L=["idea","doing","done","problem"],O=["writing","submitted","testing"],R=[{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 F(e){return R.find(t=>t.key===e)??R[0]}function z({status:e,onChange:t}){let r=O.includes(e),n=F(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]}),L.map(r=>{let n=F(r),o=e===r;return(0,s.jsx)("button",{onClick:()=>t(r),title:n.label,className:`px-2 py-1 rounded text-base transition-all ${o?`${n.color} bg-muted scale-110`:"opacity-40 hover:opacity-80"}`,children:n.icon},r)})]})}let J={high:"bg-destructive",medium:"bg-warning",low:"bg-muted-foreground"};function K({subProjects:e,tasks:t,selectedSubId:r,selectedTaskId:o,onSelectSub:a,onSelectTask:l,onCreateSub:i,onDeleteSub:d,onRenameSub:c,onCreateTask:u,onStatusChange:x,onTodayToggle:m,onDeleteTask:p,onReorderSubs:h,onAutoDistribute:f,chatStates:g}){let[b,j]=(0,n.useState)(new Set),[v,y]=(0,n.useState)(null),[N,k]=(0,n.useState)(""),w=(0,A.FR)((0,A.MS)(A.AN,{activationConstraint:{distance:5}}),(0,A.MS)(A.uN,{coordinateGetter:D.JR})),C=e=>{j(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r})},S=e=>{let t=N.trim();t&&(a(e),u(t),k(""),y(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:()=>{j(e.length>0&&e.every(e=>b.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=>b.has(e.id))?"Expand all":"Collapse all",children:e.length>0&&e.every(e=>b.has(e.id))?"▶":"▼"}),f&&(0,s.jsx)("button",{onClick:f,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)(A.Mp,{sensors:w,collisionDetection:A.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),o=e.findIndex(e=>e.id===s.id);if(-1===n||-1===o)return;let a=[...e],[l]=a.splice(n,1);a.splice(o,0,l),h(a.map(e=>e.id))},children:(0,s.jsx)(D.gB,{items:e.map(e=>e.id),strategy:D._G,children:e.map(e=>(0,s.jsx)(W,{sp:e,isSelected:r===e.id,isCollapsed:b.has(e.id),tasks:r===e.id?t:[],selectedTaskId:o,addingTaskFor:v,newTaskTitle:N,onSelectSub:a,onSelectTask:l,onToggleCollapse:C,onDeleteSub:d,onRenameSub:c,onStatusChange:x,onTodayToggle:m,onDeleteTask:p,onAddTask:S,onSetAddingTaskFor:y,onSetNewTaskTitle:k,chatStates:g},e.id))})})]})]})}function W({sp:e,isSelected:t,isCollapsed:r,tasks:o,selectedTaskId:a,addingTaskFor:l,newTaskTitle:i,onSelectSub:d,onSelectTask:c,onToggleCollapse:u,onDeleteSub:x,onRenameSub:m,onStatusChange:p,onTodayToggle:h,onDeleteTask:f,onAddTask:g,onSetAddingTaskFor:b,onSetNewTaskTitle:j,chatStates:v}){let y,[N,k]=(0,n.useState)(!1),[w,C]=(0,n.useState)(e.name),{attributes:S,listeners:T,setNodeRef:E,transform:I,transition:$,isDragging:_}=(0,D.gl)({id:e.id}),P={transform:M.Ks.Transform.toString(I),transition:$,opacity:_?.5:1,zIndex:_?10:void 0},A=()=>{let t=w.trim();t&&t!==e.name&&m&&m(e.id,t),k(!1)};return(0,s.jsxs)("div",{ref:E,style:P,className:"mb-0.5",children:[(0,s.jsxs)("div",{onClick:()=>{!N&&(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",{...S,...T,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?"▶":"▼"}),(y=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 ${y.dotClass} flex-shrink-0`,title:y.title}):null,N?(0,s.jsx)("input",{type:"text",value:w,onChange:e=>C(e.target.value),onKeyDown:t=>{"Enter"===t.key&&A(),"Escape"===t.key&&(C(e.name),k(!1))},onBlur:A,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(),C(e.name),k(!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(),C(e.name),k(!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===o.length&&!l&&(0,s.jsx)("div",{className:"text-xs text-muted-foreground py-2 pl-4",children:"No tasks"}),o.map(e=>(0,s.jsxs)("div",{onClick:()=>c(e.id),className:`group/task flex items-center gap-1.5 pl-4 pr-2 py-1.5 cursor-pointer transition-colors text-sm border-l-2 ${a===e.id?"bg-card-hover border-l-primary":"border-l-transparent hover:bg-card-hover/50"}`,children:[(0,s.jsx)("button",{onClick:t=>{var r;let s,n;t.stopPropagation();let o=(r=e.status,-1===(n=(s=["idea","doing","done"]).indexOf(r))?"idea":s[(n+1)%s.length]);p(e.id,o)},className:"flex-shrink-0 text-sm",title:`Status: ${e.status}`,children:F(e.status).icon}),(0,s.jsx)("span",{className:`tree-priority-dot ${J[e.priority]}`}),(0,s.jsx)("span",{className:`flex-1 truncate ${"done"===e.status?"text-muted-foreground line-through":""}`,children:e.title}),v?.[e.id]==="loading"&&(0,s.jsxs)("span",{className:"flex-shrink-0 flex items-center gap-1 text-[10px] text-warning",title:"AI 응답 대기 중",children:[(0,s.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse"}),"AI..."]}),v?.[e.id]==="done"&&(0,s.jsx)("span",{className:"flex-shrink-0 text-[10px] text-success",title:"AI 응답 완료",children:"✓"}),e.is_today&&(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),h(e.id,!1)},className:"text-xs flex-shrink-0 text-primary",title:"Remove from today",children:"*"}),(0,s.jsx)("button",{onClick:t=>{t.stopPropagation(),f(e.id)},className:"flex-shrink-0 text-muted-foreground/0 group-hover/task:text-muted-foreground hover:!text-destructive transition-colors text-xs px-0.5",title:"Delete task",children:"\xd7"})]},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=>j(e.target.value),onKeyDown:t=>{"Enter"===t.key&&g(e.id),"Escape"===t.key&&(j(""),b(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),b(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:F(t.status).icon}),(0,s.jsx)("span",{className:"truncate",children:t.title})]},r))})]})}var U=r(8426),B=r(2957);function G({basePath:e,taskStatus:t,onInsertToNote:r,onChatStateChange:o}){let[a,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"})},[a]);let f=(0,n.useCallback)(async()=>{let t=i.trim();if(!t||c)return;d(""),u(!0),o?.("loading");let r=`temp-${Date.now()}`,s={id:r,task_id:"",role:"user",content:t,created_at:new Date().toISOString()};l(e=>[...e,s]);try{let s=await fetch(`${e}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:t})});if(p.current!==e)return void o?.("done");if(s.ok){var n;let e=await s.json();l(t=>[...t.filter(e=>e.id!==r),e.userMessage,e.aiMessage]),e.aiMessage?.content&&(n=e.aiMessage.content,document.hasFocus()||"granted"===Notification.permission&&new Notification("IM - AI Response",{body:n.slice(0,120),icon:"/icon-192.png"}))}}catch{}p.current===e&&(u(!1),m.current?.focus()),o?.("done")},[i,c,e,o]);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===a.length&&!c&&(0,s.jsx)("div",{className:"text-sm text-muted-foreground text-center py-4",children:'노트 작성을 도와드립니다. 질문하거나 "이 부분 정리해줘" 같이 요청해보세요'}),a.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)(U.oz,{remarkPlugins:[B.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"})]})]})}var q=r(5326),H=r(9434),V=r(9561),X=r(7071),Z=r(6732),Y=r(2638);let Q=X.Pe.define();class ee extends V.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=X.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}}),er=V.Lz.decorations.compute([et],e=>{let t=e.field(et);return t?V.NZ.set([V.NZ.widget({widget:new ee(t.text),side:1}).range(t.from)]):V.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 eo=null,ea=[];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:Q.of(null)}),!0)}function ei(e){return!!e.state.field(et,!1)&&(e.dispatch({effects:Q.of(null)}),!0)}function ed(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,o=n.match(/^(\s*)([-*+])\s(\[[ xX]\]\s)?(.*)$/),a=n.match(/^(\s*)(\d+)\.\s(.*)$/);if(o){let[,t,n,a,l]=o;if(!l.trim())return e.dispatch({changes:{from:s.from,to:s.to,insert:t},selection:{anchor:s.from+t.length}}),!0;let i=a?`${t}${n} [ ] `:`${t}${n} `;return e.dispatch({changes:{from:r,insert:`
10
+ ${i}`},selection:{anchor:r+1+i.length}}),!0}if(a){let[,t,n,o]=a,l=parseInt(n,10);if(!o.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:`
11
+ ${i}`},selection:{anchor:r+1+i.length}}),!0}return!1}let ec=Z.cr.define([{tag:Y._A.heading1,color:"hsl(var(--foreground))",fontWeight:"800",fontSize:"1.35em"},{tag:Y._A.heading2,color:"hsl(var(--foreground))",fontWeight:"700",fontSize:"1.2em"},{tag:Y._A.heading3,color:"hsl(var(--foreground))",fontWeight:"700",fontSize:"1.08em"},{tag:[Y._A.heading4,Y._A.heading5,Y._A.heading6],color:"hsl(var(--foreground))",fontWeight:"700"},{tag:Y._A.processingInstruction,color:"hsl(var(--accent))",fontWeight:"700"},{tag:Y._A.list,color:"hsl(var(--foreground))"},{tag:Y._A.emphasis,fontStyle:"italic",color:"hsl(var(--foreground))"},{tag:Y._A.strong,fontWeight:"700",color:"hsl(var(--foreground))"},{tag:[Y._A.link,Y._A.url],color:"hsl(var(--primary))",textDecoration:"underline"},{tag:Y._A.monospace,color:"hsl(var(--warning))"},{tag:Y._A.quote,color:"hsl(var(--muted-foreground))",fontStyle:"italic"},{tag:Y._A.contentSeparator,color:"hsl(var(--border))"},{tag:Y._A.strikethrough,textDecoration:"line-through",color:"hsl(var(--muted-foreground))"}]),eu=(0,n.forwardRef)(function({value:e,onChange:t,onBlur:r,onOpenCommand:o,onPromoteLine:a,placeholder:l,extraCorpus:i},d){let c=(0,n.useRef)(i??[]);c.current=i??[];let u=(0,n.useMemo)(()=>[(0,H.wD)({base:H.Sz}),(0,Z.y9)(ec),et,er,V.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),o=r.text.slice(s);if(/^[A-Za-z가-힣\w_-]/.test(o))return null;let a=n.match(/([A-Za-z가-힣][\w가-힣_-]*)$/);return a?{word:a[1],from:t-a[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===eo)return ea;let t=[];for(let r of e)for(let e of en(r))t.push({tokens:e,weight:1});return eo=e,ea=t,t}(t))}(s,t),o=r.word.toLowerCase(),a=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)a.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(o)||n===r.word)continue;let a=Math.min(2,e.tokens.length-t-1);for(let o=0;o<=a;o++){let a=0===o?n.slice(r.word.length):`${n.slice(r.word.length)} ${e.tokens.slice(t+1,t+1+o).join(" ")}`;if(a.length>40)break;let i=1+.5*o;l.set(a,(l.get(a)??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,c.current);e.view.dispatch({effects:Q.of(t)})},120))}destroy(){this.timer&&clearTimeout(this.timer)}}),X.Nb.highest(V.w4.of([{key:"Tab",run:el},{key:"Escape",run:ei},{key:"Enter",run:ed},{key:"Mod-k",run:()=>(o?.(),!0)},{key:"Mod-Shift-t",run:()=>(a?.(),!0)}])),V.Lz.lineWrapping,V.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.25)"},"&.cm-focused .cm-selectionBackground":{backgroundColor:"hsl(var(--primary) / 0.3)"},".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))"}},{dark:!0})],[o]);return(0,s.jsx)("div",{className:"h-full w-full",children:(0,s.jsx)(q.Ay,{ref:d,value:e,onChange:t,onBlur:r,extensions:u,theme:"none",basicSetup:{lineNumbers:!1,foldGutter:!1,highlightActiveLine:!1,highlightActiveLineGutter:!1,autocompletion:!1,searchKeymap:!1},placeholder:l,height:"100%",style:{height:"100%"}})})}),ex=[{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 ep(){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 eh({open:e,hasSelection:t,onClose:r,onRun:o}){let[a,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=ex[e];"custom"===t.key?d(!0):o(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(em,JSON.stringify(s))}catch{}}(e),o("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,ex.length-1))):"ArrowUp"===e.key?(e.preventDefault(),l(e=>Math.max(e-1,0))):"Enter"===e.key&&(e.preventDefault(),h(a))},tabIndex:0,ref:e=>{e?.focus()},className:"py-1 max-h-[50vh] overflow-y-auto focus:outline-none",children:ex.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===a?"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 ef({task:e,projectId:t,subProjectId:r,siblingTasks:o,onUpdate:a,onDelete:l,onTaskPromoted:i,onChatStateChange:d}){let[c,u]=(0,n.useState)(e.title),[x,m]=(0,n.useState)(e.description),[p,h]=(0,n.useState)(!1),[f,g]=(0,n.useState)(!1),[b,j]=(0,n.useState)(!1),v=(0,n.useRef)(!1);(0,n.useEffect)(()=>{"testing"!==e.status||b||v.current||j(!0)},[e.status,b]);let[y,N]=(0,n.useState)(!1),[k,w]=(0,n.useState)(!1),[C,S]=(0,n.useState)(0),[T,E]=(0,n.useState)(null),[I,$]=(0,n.useState)(!1),[_,P]=(0,n.useState)(null),A=(0,n.useRef)(null),D=`/api/projects/${t}/sub-projects/${r}/tasks/${e.id}`,M=(0,n.useRef)(null),[L,O]=(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||O("string"==typeof t?.content?t.content:"")}).catch(()=>{}),()=>{e=!0}},[t]);let R=(0,n.useMemo)(()=>{let t=[];if(o)for(let r of o)r.id!==e.id&&(r.title&&t.push(r.title),r.description&&t.push(r.description));return L&&t.push(L),t},[o,L,e.id]);(0,n.useEffect)(()=>{u(e.title),m(e.description)},[e.id,e.title,e.description]);let F=(0,n.useCallback)(()=>{let t=c.trim();t&&t!==e.title?a({title:t}):u(e.title),h(!1)},[c,e.title,a]),J=(0,n.useCallback)(()=>{x!==e.description&&a({description:x})},[x,e.description,a]),K=(0,n.useCallback)(e=>{let t=x?`${x.trimEnd()}
12
+
13
+ ${e.trim()}
14
+ `:`${e.trim()}
15
+ `;m(t),a({description:t})},[x,a]),W=(0,n.useCallback)(async()=>{let t=x?.trim()||"(비어있음)",r=`# ${e.title}
16
+
17
+ ${t}
18
+ `;try{await navigator.clipboard.writeText(r),g(!0),setTimeout(()=>g(!1),1500)}catch{}},[e.title,x]),U=(0,n.useCallback)(()=>{let e=M.current?.view;e&&$(!e.state.selection.main.empty),N(!0)},[]),B=(0,n.useCallback)(async(t,r)=>{let s=M.current?.view;if(!s)return void N(!1);let n=e.id,o=s.state.selection.main,l=o.from,i=o.to,d=o.empty?"":s.state.sliceDoc(l,i),c=s.state.doc.toString();N(!1),E(null),P(null),w(!0),S(0);let u=new AbortController;A.current=u;let x=Date.now(),p=setInterval(()=>S(Math.floor((Date.now()-x)/1e3)),500);try{let s,o,x=await fetch(`${D}/refine`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:t,customText:r,selection:d||void 0,note:c}),signal:u.signal}),p=await x.json();if(!x.ok||p.error)throw Error(p.error||`HTTP ${x.status}`);let h=(p.result||"").trim();if(!h)throw Error("AI 응답이 비어있습니다");if(n!==e.id){E("다른 태스크로 이동하여 결과를 버렸습니다"),setTimeout(()=>E(null),4e3);return}let f=Math.min(l,c.length),g=Math.min(i,c.length);if(l===i){let e=(f>0?"\n\n":"")+h+"\n";s=c.slice(0,f)+e+c.slice(f),o=f+e.length}else s=c.slice(0,f)+h+c.slice(g),o=f+h.length;m(s),a({description:s}),P({taskId:n,doc:c}),setTimeout(()=>{P(e=>e&&e.taskId===n?null:e)},3e4);let b=M.current?.view;if(b)try{let e=Math.min(o,b.state.doc.length);b.dispatch({selection:{anchor:e}})}catch{}}catch(e){e?.name==="AbortError"||(E(e instanceof Error?e.message:"알 수 없는 오류"),setTimeout(()=>E(null),6e3))}finally{clearInterval(p),w(!1),A.current=null}},[D,a,e.id]),q=(0,n.useCallback)(()=>{A.current?.abort()},[]),H=(0,n.useCallback)(()=>{if(_){if(_.taskId!==e.id)return void P(null);m(_.doc),a({description:_.doc}),P(null)}},[_,e.id,a]),[V,X]=(0,n.useState)(null),Z=(0,n.useCallback)(async()=>{let e=M.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 o=n[3]?.trim();return o?{content:o,from:s.from,to:s.to}:null}(e);if(!s){E("체크박스나 불릿 목록 줄에 커서를 두고 실행하세요"),setTimeout(()=>E(null),3e3);return}let n=s.content.slice(0,200);try{let o=await fetch(`/api/projects/${t}/sub-projects/${r}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:n})});if(!o.ok)throw Error(`HTTP ${o.status}`);let l=await o.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,p=c+x;m(p),a({description:p}),i?.(l),X(`→ 태스크 "${n}" 생성됨`),setTimeout(()=>X(null),3e3)}catch(e){E(e instanceof Error?e.message:"태스크 생성 실패"),setTimeout(()=>E(null),4e3)}},[t,r,a,i]);return(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:[p?(0,s.jsx)("input",{value:c,onChange:e=>u(e.target.value),onBlur:F,onKeyDown:t=>{"Enter"===t.key&&F(),"Escape"===t.key&&(u(e.title),h(!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:()=>h(!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)(z,{status:e.status,onChange:e=>a({status:e})}),(0,s.jsx)("div",{className:"flex items-center gap-1",children:["high","medium","low"].map(t=>(0,s.jsx)("button",{onClick:()=>a({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:()=>a({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:U,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:W,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:f?"✓ Copied":"Copy as Prompt"}),(0,s.jsx)("button",{onClick:()=>{v.current=!0,j(e=>!e)},className:`text-xs px-2 py-0.5 rounded transition-colors border ${b?"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:l,className:"text-xs text-muted-foreground hover:text-destructive transition-colors ml-auto",children:"Delete"})]})]}),(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)(eu,{ref:M,value:x,onChange:m,onBlur:J,onOpenCommand:U,onPromoteLine:Z,extraCorpus:R,placeholder:"자유롭게 작성하세요. 배경 \xb7 목표 \xb7 관련 파일 \xb7 결정사항 \xb7 질문 \xb7 링크 등 뭐든..."})}),k&&(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 작업 중 ",C,"s (최대 90s)"]}),(0,s.jsx)("button",{onClick:q,className:"ml-1 text-muted-foreground hover:text-destructive transition-colors",title:"취소",children:"취소"})]}),V&&(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:V})]}),!k&&_&&_.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:H,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:()=>P(null),className:"text-muted-foreground hover:text-foreground",title:"닫기",children:"\xd7"})]}),T&&(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 실패: ",T]}),(0,s.jsx)("button",{onClick:()=>E(null),className:"text-destructive/60 hover:text-destructive",children:"\xd7"})]})]}),b&&(0,s.jsx)("div",{className:"h-[38%] min-h-[240px] border-t border-border",children:(0,s.jsx)(G,{basePath:D,taskStatus:e.status,onInsertToNote:K,onChatStateChange:d?t=>d(e.id,t):void 0})}),(0,s.jsx)(eh,{open:y,hasSelection:I,onClose:()=>N(!1),onRun:B})]})}function eg({open:e,content:t,onSave:r,onClose:o}){let[a,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&&o(),(e.metaKey||e.ctrlKey)&&"Enter"===e.key&&(e.preventDefault(),r(a))};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,a,r,o]),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:o}),(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:o,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:a,onChange:e=>l(e.target.value),placeholder:`프로젝트 컨텍스트와 AI 지침을 작성하세요.
19
+
20
+ 예시:
21
+ - 이 프로젝트는 JABIS 스마트워크 시스템입니다
22
+ - 기술 스택: React + TypeScript + Vite (monorepo)
23
+ - DB: PostgreSQL (jabis 스키마)
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:o,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(a),className:"px-3 py-1.5 text-xs bg-primary text-white rounded-md hover:bg-primary-hover transition-colors",children:"Save"})]})]})]})]}):null}let eb={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 ej({open:e,results:t,onClose:r}){let o=(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 a=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:o,onClick:e=>{e.target===o.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:[a," 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=eb[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 ev={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 ey({rootPath:e,onClose:t}){let[r,o]=(0,n.useState)({}),[a,l]=(0,n.useState)(new Set([e])),i=(0,n.useRef)(null),d=(0,n.useCallback)(async e=>{o(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();o(t=>({...t,[e]:{entries:r.entries,loaded:!0,loading:!1}}))}catch{o(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,o;let i="directory"===e.type,u=a.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)?ev[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:(o=e.size)<1024?`${o}B`:o<1048576?`${(o/1024).toFixed(0)}K`:`${(o/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 eN({open:e,projectId:t,onClose:r,onApplied:o}){let[a,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
+
27
+ AI 응답:
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)o(),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:[a&&(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:"다시 시도"})]}),!a&&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,o)=>o===t?{...e,tasks:e.tasks.filter((e,t)=>t!==r)}:o===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))}),!a&&!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:[!a&&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||a||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}function ek({id:e,initialSubId:t,initialTaskId:r}){let{state:o,setActiveTab:a,consumeInitial:l,updateTabName:i}=x(),d=o.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,v]=(0,n.useState)([]),[y,N]=(0,n.useState)(null),[k,w]=(0,n.useState)(!1),[T,E]=(0,n.useState)(null),[I,$]=(0,n.useState)(!1),[_,A]=(0,n.useState)(!0),[D,M]=(0,n.useState)(""),[L,O]=(0,n.useState)(!1),[R,F]=(0,n.useState)(!1),[z,J]=(0,n.useState)(null),[W,U]=(0,n.useState)(null),[B,G]=(0,n.useState)(!1),[q,H]=(0,n.useState)(!1),[V,X]=(0,n.useState)({}),Z=(0,n.useRef)(!1),[Y,Q]=(0,n.useState)(500),[ee,et]=(0,n.useState)(500),er=(0,n.useRef)(null),es=(0,n.useRef)(null),en=(0,n.useRef)(0),eo=(0,n.useRef)(0),ea=(0,n.useCallback)((e,t)=>{t.preventDefault(),es.current=e,en.current=t.clientX,eo.current="left"===e?Y:ee},[Y,ee]);(0,n.useEffect)(()=>{let e=e=>{if(!es.current)return;let t=e.clientX-en.current,r=Math.max(180,Math.min(900,eo.current+t));"left"===es.current?Q(r):et(r)},t=()=>{es.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 el=(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)(()=>{el().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)})},[el]),(0,n.useEffect)(()=>{g?fetch(`/api/projects/${e}/sub-projects/${g}/tasks`).then(e=>e.json()).then(e=>{v(e);let t=u.current;t&&e.some(e=>e.id===t)&&(N(t),u.current=void 0)}):v([])},[e,g]);let ei=j.find(e=>e.id===y)??null,ed=async()=>{if(!D.trim())return;let t=await fetch(`/api/projects/${e}/sub-projects`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:D.trim()})});if(t.ok){let e=await t.json();M(""),$(!1),await el(),b(e.id)}},ec=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();v(t=>[...t,e]),N(e.id),el()}},eu=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();v(r=>r.map(r=>r.id===t?e:r)),el()}},ex=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();v(r=>r.map(r=>r.id===t?e:r))}},em=async t=>{if(!y||!g)return;let r=await fetch(`/api/projects/${e}/sub-projects/${g}/tasks/${y}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(r.ok){let e=await r.json();v(t=>t.map(t=>t.id===y?e:t)),el()}},ep=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})})},eh=e=>{let t=e||y;t&&E({type:"delete-task",id:t})},eb=async t=>{T&&("delete-sub"===T.type?(await fetch(`/api/projects/${e}/sub-projects/${T.id}`,{method:"DELETE"}),g===T.id&&(b(null),N(null)),el()):"delete-task"===T.type&&(await fetch(`/api/projects/${e}/sub-projects/${g}/tasks/${T.id}?mode=${t||"archive"}`,{method:"DELETE"}),v(e=>e.filter(e=>e.id!==T.id)),y===T.id&&N(null),el()),E(null))},ev=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))},ek=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()),O(!1))},ew=(0,n.useCallback)(async(t=!1)=>{if(!Z.current){Z.current=!0,t||F(!0);try{let r=await fetch(`/api/projects/${e}/git-sync`,{method:"POST"});if(r.ok){let e=await r.json();U(new Date),t||J(e)}}catch{}finally{Z.current=!1,t||F(!1)}}},[e]);(0,n.useEffect)(()=>{if(!m?.project_path)return;let e=setInterval(()=>ew(!0),18e5);return()=>clearInterval(e)},[m?.project_path,ew]);let eC=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(),A(e=>!e);return}if(!r&&"KeyN"===e.code&&!e.metaKey&&!e.ctrlKey){e.preventDefault(),$(!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(y&&g&&!r){let t={Digit1:"idea",Digit2:"doing",Digit3:"done",Digit4:"problem"};(e.metaKey||e.ctrlKey)&&t[e.code]&&(e.preventDefault(),eu(y,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:()=>a("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:()=>G(!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:eC,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:()=>O(!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?" *":""]}),m.project_path?(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsxs)("button",{onClick:()=>ew(!1),disabled:R,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:W?`Last sync: ${W.toLocaleTimeString()}`:"Git pull",children:[(0,s.jsx)("span",{className:R?"animate-spin":"",children:"↻"}),R?"Syncing...":"Git Sync"]}),W&&(0,s.jsx)("span",{className:"text-xs text-muted-foreground",children:W.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:er,className:"flex-1 flex overflow-hidden",children:[_?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{style:{width:Y},className:"border-r border-border flex flex-col flex-shrink-0",children:(0,s.jsx)(P,{projectId:e,onCollapse:()=>A(!1)})}),(0,s.jsx)("div",{className:"panel-resize-handle",onMouseDown:e=>ea("left",e),children:(0,s.jsx)("div",{className:"panel-resize-handle-bar"})})]}):(0,s.jsx)("button",{onClick:()=>A(!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:ee},className:"border-r border-border flex flex-col flex-shrink-0",children:[I&&(0,s.jsx)("div",{className:"px-3 py-2 border-b border-border",children:(0,s.jsx)("input",{type:"text",value:D,onChange:e=>M(e.target.value),onKeyDown:e=>{"Enter"===e.key&&ed(),"Escape"===e.key&&(M(""),$(!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)(K,{subProjects:h,tasks:j,selectedSubId:g,selectedTaskId:y,onSelectSub:e=>{b(e),N(null)},onSelectTask:e=>{N(e),X(t=>{if("done"!==t[e])return t;let r={...t};return delete r[e],r})},onCreateSub:()=>$(!0),onDeleteSub:e=>{E({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&&el()},onCreateTask:ec,onStatusChange:eu,onTodayToggle:ex,onDeleteTask:eh,onReorderSubs:ep,onAutoDistribute:()=>H(!0),chatStates:V})]}),(0,s.jsx)("div",{className:"panel-resize-handle",onMouseDown:e=>ea("center",e),children:(0,s.jsx)("div",{className:"panel-resize-handle-bar"})}),(0,s.jsx)("div",{className:"flex-1 min-w-0",children:ei?(0,s.jsx)(ef,{task:ei,projectId:e,subProjectId:g,siblingTasks:j,onUpdate:em,onDelete:eh,onTaskPromoted:e=>v(t=>[...t,e]),onChatStateChange:(e,t)=>{X(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)(C,{onSelect:ev,onCancel:()=>w(!1),initialPath:m.project_path||void 0}),(0,s.jsx)(S,{open:T?.type==="delete-sub",title:"Delete project?",description:"This will delete the project and all its tasks.",confirmLabel:"Delete",variant:"danger",onConfirm:()=>eb(),onCancel:()=>E(null)}),T?.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:()=>E(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:()=>eb("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:()=>eb("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)(eg,{open:L,content:m.ai_context||"",onSave:ek,onClose:()=>O(!1)}),(0,s.jsx)(ej,{open:!!z,results:z||[],onClose:()=>J(null)}),B&&m.project_path&&(0,s.jsx)(ey,{rootPath:m.project_path,onClose:()=>G(!1)}),(0,s.jsx)(eN,{open:q,projectId:e,onClose:()=>H(!1),onApplied:()=>{el()}})]}):(0,s.jsx)("div",{className:"flex-1 flex items-center justify-center text-muted-foreground",children:"Loading..."})}function ew(){let[e,t]=(0,n.useState)(!1),[r,o]=(0,n.useState)(""),[a,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;o(""),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=>o(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,a.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=a[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===a.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:a.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 eC="im-quick-capture-last-dest";function eS(){try{let e=localStorage.getItem(eC);if(!e)return null;let t=JSON.parse(e);if(t?.projectId&&t?.subProjectId)return t}catch{}return null}function eT(){let[e,t]=(0,n.useState)(!1),[r,o]=(0,n.useState)([]),[a,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=>{o(e.map(e=>({...e})));let t=eS(),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(!a)return void d("");let e=r.find(e=>e.id===a);if(e?.loaded&&e.subProjects){let t=eS(),r=e.subProjects[0]?.id??"";d(t?.projectId===a&&e.subProjects.some(e=>e.id===t.subProjectId)?t.subProjectId:r);return}fetch(`/api/projects/${a}/sub-projects`).then(e=>e.ok?e.json():[]).then(e=>{o(t=>t.map(t=>t.id===a?{...t,subProjects:e,loaded:!0}:t));let t=eS(),r=e[0]?.id??"";d(t?.projectId===a&&e.some(e=>e.id===t.subProjectId)?t.subProjectId:r)})},[a]),(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&&a&&i&&!m){p(!0),f(null);try{let s=await fetch(`/api/projects/${a}/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(eC,JSON.stringify({projectId:a,subProjectId:i}))}catch{}let o=r.find(e=>e.id===a);o&&b(o.id,o.name,i,n.id),t(!1)}catch(e){f(e instanceof Error?e.message:"생성 실패"),p(!1)}}};if(!e)return null;let v=r.find(e=>e.id===a),y=v?.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:a,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:!y.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===y.length?(0,s.jsx)("option",{value:"",children:"프로젝트 없음"}):y.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()||!a||!i||m,className:"text-xs px-3 py-1 bg-primary text-primary-foreground rounded disabled:opacity-40",children:m?"…":"생성"})]})]})]})})}function eE(){let{state:e}=x();return(0,s.jsxs)("div",{className:"h-screen flex flex-col",children:[(0,s.jsx)(w,{}),(0,s.jsx)(ew,{}),(0,s.jsx)(eT,{}),(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)(_,{}):(0,s.jsx)(ek,{id:t.projectId,initialSubId:t.initialSubId,initialTaskId:t.initialTaskId})},t.id))})]})}function eI(){return(0,s.jsx)(j,{children:(0,s.jsx)(m,{children:(0,s.jsx)(eE,{})})})}}},e=>{e.O(0,[79,374,441,794,358],()=>e(e.s=3915)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2,64,86,94,123,167,175,177,178,202,212,363,437,460,514,595,711,770,772,819,822,851,860,896,922,980,988],{4441:()=>{}},_=>{_.O(0,[441,794,358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2,64,86,94,123,167,175,177,178,202,212,363,437,460,514,595,711,770,772,819,822,851,860,896,922,980,988],{4441:()=>{}},_=>{_.O(0,[441,794,358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2,64,86,94,123,167,175,177,178,202,212,363,437,460,514,595,711,770,772,819,822,851,860,896,922,980,988],{4441:()=>{}},_=>{_.O(0,[441,794,358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2,64,86,94,123,167,175,177,178,202,212,363,437,460,514,595,711,770,772,819,822,851,860,896,922,980,988],{4441:()=>{}},_=>{_.O(0,[441,794,358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1,3 @@
1
+ @font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/8d697b304b401681-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/ba015fad6dcf6784-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/4cf2300e9c8272f7-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Geist Fallback;src:local("Arial");ascent-override:95.94%;descent-override:28.16%;line-gap-override:0.00%;size-adjust:104.76%}.__className_188709{font-family:Geist,Geist Fallback;font-style:normal}.__variable_188709{--font-geist-sans:"Geist","Geist Fallback"}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/9610d9e46709d722-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/747892c23ea88013-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/93f479601ee12b01-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Geist Mono Fallback;src:local("Arial");ascent-override:74.67%;descent-override:21.92%;line-gap-override:0.00%;size-adjust:134.59%}.__className_9a8899{font-family:Geist Mono,Geist Mono Fallback;font-style:normal}.__variable_9a8899{--font-geist-mono:"Geist Mono","Geist Mono Fallback"}
2
+
3
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:host,:root{--font-sans:"Pretendard",var(--font-geist-sans),system-ui,sans-serif;--font-mono:var(--font-geist-mono);--color-red-400:oklch(70.4% .191 22.216);--color-amber-400:oklch(82.8% .189 84.429);--color-emerald-400:oklch(76.5% .177 163.223);--color-cyan-400:oklch(78.9% .154 211.53);--color-indigo-400:oklch(67.3% .182 276.935);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1) infinite;--animate-bounce:bounce 1s infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:"Pretendard",var(--font-geist-sans),system-ui,sans-serif;--default-mono-font-family:var(--font-geist-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.right-3{right:calc(var(--spacing) * 3)}.bottom-2{bottom:calc(var(--spacing) * 2)}.z-50{z-index:50}.z-\[60\]{z-index:60}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-\[38\%\]{height:38%}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[50vh\]{max-height:50vh}.max-h-\[55vh\]{max-height:55vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[200px\]{max-height:200px}.max-h-\[280px\]{max-height:280px}.max-h-\[400px\]{max-height:400px}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[150px\]{min-height:150px}.min-h-\[240px\]{min-height:240px}.min-h-\[300px\]{min-height:300px}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-\[420px\]{width:420px}.w-\[480px\]{width:480px}.w-\[520px\]{width:520px}.w-\[640px\]{width:640px}.w-\[720px\]{width:720px}.w-full{width:100%}.max-w-5xl{max-width:var(--container-5xl)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[50ch\]{max-width:50ch}.max-w-\[70\%\]{max-width:70%}.max-w-\[85vw\]{max-width:85vw}.max-w-\[90\%\]{max-width:90%}.max-w-\[220px\]{max-width:220px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-\[1\.02\]{scale:1.02}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:hsl(var(--border))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e+38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-br-sm{border-bottom-right-radius:var(--radius-sm)}.rounded-bl-sm{border-bottom-left-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent\/30{border-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,hsl(var(--accent)) 30%,transparent)}}.border-border,.border-border\/50{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.border-destructive\/40{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.border-destructive\/40{border-color:color-mix(in oklab,hsl(var(--destructive)) 40%,transparent)}}.border-muted-foreground\/30{border-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.border-muted-foreground\/30{border-color:color-mix(in oklab,hsl(var(--muted-foreground)) 30%,transparent)}}.border-primary{border-color:hsl(var(--primary))}.border-success\/30{border-color:hsl(var(--success))}@supports (color:color-mix(in lab,red,red)){.border-success\/30{border-color:color-mix(in oklab,hsl(var(--success)) 30%,transparent)}}.border-success\/40{border-color:hsl(var(--success))}@supports (color:color-mix(in lab,red,red)){.border-success\/40{border-color:color-mix(in oklab,hsl(var(--success)) 40%,transparent)}}.border-transparent{border-color:#0000}.border-warning\/30{border-color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.border-warning\/30{border-color:color-mix(in oklab,hsl(var(--warning)) 30%,transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-primary{border-left-color:hsl(var(--primary))}.border-l-transparent{border-left-color:#0000}.bg-accent,.bg-accent\/15{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.bg-accent\/15{background-color:color-mix(in oklab,hsl(var(--accent)) 15%,transparent)}}.bg-amber-400\/10{background-color:#fcbb001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/10{background-color:color-mix(in oklab,var(--color-amber-400) 10%,transparent)}}.bg-background\/60{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-card{background-color:hsl(var(--card))}.bg-card-hover{background-color:hsl(var(--card-hover))}.bg-cyan-400{background-color:var(--color-cyan-400)}.bg-cyan-400\/10{background-color:#00d2ef1a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-400\/10{background-color:color-mix(in oklab,var(--color-cyan-400) 10%,transparent)}}.bg-destructive,.bg-destructive\/15{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/15{background-color:color-mix(in oklab,hsl(var(--destructive)) 15%,transparent)}}.bg-destructive\/20{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/20{background-color:color-mix(in oklab,hsl(var(--destructive)) 20%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-400\/10{background-color:#00d2941a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-400\/10{background-color:color-mix(in oklab,var(--color-emerald-400) 10%,transparent)}}.bg-foreground\/5{background-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.bg-foreground\/5{background-color:color-mix(in oklab,hsl(var(--foreground)) 5%,transparent)}}.bg-indigo-400{background-color:var(--color-indigo-400)}.bg-indigo-400\/10{background-color:#7d87ff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-400\/10{background-color:color-mix(in oklab,var(--color-indigo-400) 10%,transparent)}}.bg-input{background-color:hsl(var(--input))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground,.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.bg-muted\/50{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,hsl(var(--muted)) 50%,transparent)}}.bg-muted\/90{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/90{background-color:color-mix(in oklab,hsl(var(--muted)) 90%,transparent)}}.bg-primary,.bg-primary\/15{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.bg-primary\/20{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/20{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.bg-red-400{background-color:var(--color-red-400)}.bg-red-400\/10{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.bg-red-400\/10{background-color:color-mix(in oklab,var(--color-red-400) 10%,transparent)}}.bg-success,.bg-success\/15{background-color:hsl(var(--success))}@supports (color:color-mix(in lab,red,red)){.bg-success\/15{background-color:color-mix(in oklab,hsl(var(--success)) 15%,transparent)}}.bg-transparent{background-color:#0000}.bg-warning,.bg-warning\/10{background-color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.bg-warning\/10{background-color:color-mix(in oklab,hsl(var(--warning)) 10%,transparent)}}.bg-warning\/15{background-color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.bg-warning\/15{background-color:color-mix(in oklab,hsl(var(--warning)) 15%,transparent)}}.bg-warning\/20{background-color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.bg-warning\/20{background-color:color-mix(in oklab,hsl(var(--warning)) 20%,transparent)}}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[3px\]{padding-block:3px}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-\[14vh\]{padding-top:14vh}.pt-\[16vh\]{padding-top:16vh}.pt-\[18vh\]{padding-top:18vh}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-geist-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent{color:hsl(var(--accent))}.text-amber-400{color:var(--color-amber-400)}.text-border{color:hsl(var(--border))}.text-cyan-400{color:var(--color-cyan-400)}.text-destructive,.text-destructive\/60{color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.text-destructive\/60{color:color-mix(in oklab,hsl(var(--destructive)) 60%,transparent)}}.text-emerald-400{color:var(--color-emerald-400)}.text-foreground{color:hsl(var(--foreground))}.text-indigo-400{color:var(--color-indigo-400)}.text-muted-foreground,.text-muted-foreground\/0{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/0{color:color-mix(in oklab,hsl(var(--muted-foreground)) 0%,transparent)}}.text-muted-foreground\/40{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.text-muted-foreground\/50{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-primary{color:hsl(var(--primary))}.text-red-400{color:var(--color-red-400)}.text-success{color:hsl(var(--success))}.text-warning{color:hsl(var(--warning))}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040)}.shadow-2xl,.shadow-lg{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.shadow-sm,.shadow-xl{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-black\/40{--tw-shadow-color:#0006}@supports (color:color-mix(in lab,red,red)){.shadow-black\/40{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black) 40%,transparent) var(--tw-shadow-alpha),transparent)}}.ring-current{--tw-ring-color:currentcolor}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-transparent{--tw-ring-offset-color:transparent}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px)}.backdrop-blur-\[2px\],.backdrop-blur-sm{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.group-hover\:text-muted-foreground:is(:where(.group):hover *){color:hsl(var(--muted-foreground))}.group-hover\:text-primary:is(:where(.group):hover *){color:hsl(var(--primary))}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/task\:text-muted-foreground:is(:where(.group\/task):hover *){color:hsl(var(--muted-foreground))}}.placeholder\:text-muted-foreground\/40::placeholder{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-muted-foreground\/40::placeholder{color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}@media (hover:hover){.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-muted-foreground:hover,.hover\:border-muted-foreground\/30:hover{border-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.hover\:border-muted-foreground\/30:hover{border-color:color-mix(in oklab,hsl(var(--muted-foreground)) 30%,transparent)}}.hover\:border-primary:hover{border-color:hsl(var(--primary))}.hover\:bg-accent\/25:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/25:hover{background-color:color-mix(in oklab,hsl(var(--accent)) 25%,transparent)}}.hover\:bg-accent\/80:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/80:hover{background-color:color-mix(in oklab,hsl(var(--accent)) 80%,transparent)}}.hover\:bg-background:hover{background-color:hsl(var(--background))}.hover\:bg-card-hover:hover,.hover\:bg-card-hover\/50:hover{background-color:hsl(var(--card-hover))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-card-hover\/50:hover{background-color:color-mix(in oklab,hsl(var(--card-hover)) 50%,transparent)}}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 10%,transparent)}}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 80%,transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/30:hover{background-color:color-mix(in oklab,hsl(var(--muted)) 30%,transparent)}}.hover\:bg-primary-hover:hover{background-color:hsl(var(--primary-hover))}.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.hover\:bg-success\/25:hover{background-color:hsl(var(--success))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-success\/25:hover{background-color:color-mix(in oklab,hsl(var(--success)) 25%,transparent)}}.hover\:\!text-destructive:hover{color:hsl(var(--destructive))!important}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-black\/20:hover{--tw-shadow-color:#0003}@supports (color:color-mix(in lab,red,red)){.hover\:shadow-black\/20:hover{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black) 20%,transparent) var(--tw-shadow-alpha),transparent)}}.hover\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\:border-primary:focus{border-color:hsl(var(--primary))}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}}:root{--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%}body{background:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-weight:500}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:hsl(var(--background))}::-webkit-scrollbar-thumb{background:hsl(var(--border));border-radius:3px}::-webkit-scrollbar-thumb:hover{background:hsl(var(--muted-foreground))}input:focus,textarea:focus{box-shadow:0 0 0 2px hsl(var(--primary)/.3);outline:none}.editor-container{flex:1;min-height:0;display:flex;position:relative}.memo-overlay{pointer-events:none;position:absolute;inset:0;overflow:hidden}.memo-pin{pointer-events:auto;cursor:pointer;z-index:10;position:absolute}.memo-pin-icon{filter:drop-shadow(0 1px 2px #0000004d);font-size:14px;transition:transform .15s}.memo-pin:hover .memo-pin-icon{transform:scale(1.3)}.memo-tooltip{background:hsl(var(--card));border:1px solid hsl(var(--border));z-index:20;border-radius:8px;width:240px;padding:8px 12px;position:absolute;top:-4px;right:24px;box-shadow:0 4px 12px #0000004d}.memo-tooltip-anchor{color:hsl(var(--muted-foreground));text-overflow:ellipsis;white-space:nowrap;margin-bottom:4px;font-size:11px;font-style:italic;overflow:hidden}.memo-tooltip-question{color:hsl(var(--foreground));font-size:12px;line-height:1.4}.memo-popover{background:hsl(var(--card));border:1px solid hsl(var(--border));z-index:30;border-radius:10px;flex-direction:column;width:300px;max-height:320px;display:flex;position:absolute;top:-4px;right:24px;box-shadow:0 8px 24px #0006}.memo-popover-anchor{color:hsl(var(--muted-foreground));text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid hsl(var(--border));padding:8px 12px 4px;font-size:11px;font-style:italic;overflow:hidden}.memo-popover-messages{flex-direction:column;flex:1;gap:6px;min-height:0;padding:8px;display:flex;overflow-y:auto}.memo-popover-bubble{word-break:break-word;border-radius:10px;max-width:90%;padding:6px 10px;font-size:12px;line-height:1.5}.memo-popover-bubble-ai{background:hsl(var(--muted));color:hsl(var(--foreground));border-bottom-left-radius:3px;align-self:flex-start}.memo-popover-bubble-user{background:hsl(var(--accent));color:#fff;border-bottom-right-radius:3px;align-self:flex-end}.memo-popover-input-area{border-top:1px solid hsl(var(--border));gap:6px;padding:6px 8px;display:flex}.memo-popover-input{background:hsl(var(--input));border:1px solid hsl(var(--border));color:hsl(var(--foreground));resize:none;font-size:12px;font-family:var(--font-sans);border-radius:6px;flex:1;padding:5px 10px}.memo-popover-input::placeholder{color:hsl(var(--muted-foreground)/.5)}.memo-popover-send{background:hsl(var(--accent));color:#fff;cursor:pointer;border:none;border-radius:6px;flex-shrink:0;padding:5px 10px;font-size:11px;font-weight:600;transition:opacity .15s}.memo-popover-send:hover:not(:disabled){opacity:.85}.memo-popover-send:disabled{opacity:.4;cursor:not-allowed}.resize-handle{cursor:row-resize;background:hsl(var(--background));border-top:1px solid hsl(var(--border));border-bottom:1px solid hsl(var(--border));flex-shrink:0;justify-content:center;align-items:center;height:6px;transition:background .15s;display:flex}.resize-handle:hover{background:hsl(var(--muted))}.resize-handle-bar{background:hsl(var(--muted-foreground)/.4);border-radius:1px;width:32px;height:2px}.resize-handle:hover .resize-handle-bar{background:hsl(var(--muted-foreground))}.chat-panel{flex-direction:column;height:100%;min-height:0;display:flex}.chat-header{border-bottom:1px solid hsl(var(--border));flex-shrink:0;justify-content:space-between;align-items:center;padding:8px 16px;display:flex}.chat-messages{flex-direction:column;flex:1;gap:8px;min-height:0;padding:12px 16px;display:flex;overflow-y:auto}.chat-empty{height:100%;color:hsl(var(--muted-foreground));justify-content:center;align-items:center;font-size:12px;display:flex}.chat-message{flex-direction:column;max-width:85%;display:flex}.chat-message-ai{align-self:flex-start}.chat-message-user{align-self:flex-end}.chat-bubble{word-break:break-word;border-radius:12px;padding:8px 12px;font-size:13px;line-height:1.5}.chat-bubble-ai{background:hsl(var(--muted));color:hsl(var(--foreground));border-bottom-left-radius:4px}.chat-bubble-user{background:hsl(var(--accent));color:#fff;border-bottom-right-radius:4px}.chat-time{color:hsl(var(--muted-foreground));margin-top:2px;padding:0 4px;font-size:10px}.chat-message-user .chat-time{text-align:right}.chat-loading{gap:4px;padding:12px 16px;display:flex}.chat-loading .dot{background:hsl(var(--muted-foreground));border-radius:50%;width:6px;height:6px;animation:chatDotBounce 1.4s ease-in-out infinite both}.chat-loading .dot:first-child{animation-delay:-.32s}.chat-loading .dot:nth-child(2){animation-delay:-.16s}.chat-loading .dot:nth-child(3){animation-delay:0s}@keyframes chatDotBounce{0%,80%,to{opacity:.4;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}.chat-input-area{border-top:1px solid hsl(var(--border));flex-shrink:0;gap:8px;padding:8px 12px;display:flex}.chat-input{background:hsl(var(--input));border:1px solid hsl(var(--border));color:hsl(var(--foreground));resize:none;font-size:13px;font-family:var(--font-sans);border-radius:8px;flex:1;padding:6px 12px}.chat-input::placeholder{color:hsl(var(--muted-foreground)/.5)}.chat-send-btn{background:hsl(var(--accent));color:#fff;cursor:pointer;border:none;border-radius:8px;flex-shrink:0;padding:6px 14px;font-size:12px;font-weight:600;transition:opacity .15s}.chat-send-btn:hover:not(:disabled){opacity:.85}.chat-send-btn:disabled{opacity:.4;cursor:not-allowed}.pin-toggle{cursor:pointer;background:0 0;border:none;flex-shrink:0;padding:0;font-size:12px;transition:all .15s}.pin-toggle:hover{transform:scale(1.2)}.tree-action-btn{color:hsl(var(--muted-foreground));background:hsl(var(--muted));border:1px solid hsl(var(--border));cursor:pointer;border-radius:4px;flex-shrink:0;padding:1px 6px;font-size:10px;transition:all .15s}.tree-action-btn:hover{color:hsl(var(--foreground));background:hsl(var(--card-hover))}.tree-action-btn-danger:hover{color:hsl(var(--destructive));border-color:hsl(var(--destructive)/.3)}.refine-popover{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:10px;flex-direction:column;max-height:300px;margin:4px 0 8px;display:flex;box-shadow:0 4px 16px #0000004d}.refine-header{border-bottom:1px solid hsl(var(--border));color:hsl(var(--foreground));justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.refine-close{color:hsl(var(--muted-foreground));cursor:pointer;background:0 0;border:none;padding:0 4px;font-size:16px;line-height:1}.refine-close:hover{color:hsl(var(--foreground))}.refine-context{color:hsl(var(--muted-foreground));border-bottom:1px solid hsl(var(--border));padding:6px 12px;font-size:11px;line-height:1.4}.refine-messages{flex-direction:column;flex:1;gap:6px;min-height:40px;padding:8px;display:flex;overflow-y:auto}.lock-toggle{cursor:pointer;background:0 0;border:none;flex-shrink:0;padding:0;font-size:14px;transition:transform .15s}.lock-toggle:hover:not(:disabled){transform:scale(1.2)}.lock-toggle:disabled{opacity:.4;cursor:not-allowed}.status-badge{cursor:pointer;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;gap:2px;padding:1px 4px;font-size:12px;transition:background .15s;display:flex}.status-badge:hover:not(:disabled){background:hsl(var(--muted))}.status-badge-label{color:hsl(var(--muted-foreground));font-size:10px}.item-detail{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:8px;margin:0 8px 8px;padding:12px}.prompt-section{border-top:1px solid hsl(var(--border));padding-top:8px}.prompt-header{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}.prompt-action-btn{color:hsl(var(--muted-foreground));background:hsl(var(--muted));border:1px solid hsl(var(--border));cursor:pointer;border-radius:4px;padding:2px 8px;font-size:10px;transition:all .15s}.prompt-action-btn:hover:not(:disabled){color:hsl(var(--foreground));background:hsl(var(--card-hover))}.prompt-action-btn:disabled{opacity:.4;cursor:not-allowed}.prompt-generate-btn{color:hsl(var(--accent));border-color:hsl(var(--accent)/.3)}.prompt-generate-btn:hover:not(:disabled){background:hsl(var(--accent)/.1);color:hsl(var(--accent))}.prompt-content{border:1px solid hsl(var(--border));white-space:pre-wrap;border-radius:6px;padding:8px 12px}.prompt-content,.prompt-edit-textarea{color:hsl(var(--foreground));background:hsl(var(--background));font-size:14px;line-height:1.7;font-family:var(--font-mono)}.prompt-edit-textarea{width:100%;border:1px solid hsl(var(--accent)/.5);resize:vertical;border-radius:6px;padding:10px 14px}.tree-node-row{cursor:pointer;border-radius:6px;align-items:flex-start;gap:6px;padding:6px 8px;transition:background .15s;display:flex}.tree-node-row:hover{background:hsl(var(--card-hover))}.tree-priority-dot{border-radius:50%;flex-shrink:0;width:6px;height:6px;margin-top:1px}.tree-icon-btn{cursor:pointer;background:0 0;border:none;flex-shrink:0;padding:1px 2px;font-size:11px;transition:transform .15s}.tree-icon-btn:hover{transform:scale(1.2)}.tree-progress-badge{color:hsl(var(--muted-foreground));background:hsl(var(--muted));font-variant-numeric:tabular-nums;border-radius:8px;padding:0 5px;font-size:9px;line-height:16px}.tree-children-group{border-left:1px solid hsl(var(--border)/.5);margin-left:3px}.card-grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;padding:12px;display:grid}.project-card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:12px;transition:border-color .2s,box-shadow .2s;overflow:hidden}.project-card:hover{border-color:hsl(var(--muted-foreground)/.3);box-shadow:0 4px 12px #0003}.project-card-header{align-items:flex-start;gap:8px;padding:12px 14px 8px;display:flex}.project-card-icon{flex-shrink:0;margin-top:1px;font-size:20px}.project-card-title{flex:1;min-width:0;font-size:14px;font-weight:600;line-height:1.3}.project-card-desc{color:hsl(var(--muted-foreground));-webkit-line-clamp:2;-webkit-box-orient:vertical;padding:0 14px 8px;font-size:11px;line-height:1.4;display:-webkit-box;overflow:hidden}.project-card-progress{background:hsl(var(--muted));border-radius:2px;height:3px;margin:0 14px;overflow:hidden}.project-card-progress-fill{border-radius:2px;height:100%;transition:width .3s}.project-card-stats{color:hsl(var(--muted-foreground));align-items:center;gap:10px;padding:8px 14px;font-size:10px;display:flex}.project-card-stat{align-items:center;gap:3px;display:flex}.project-card-children{border-top:1px solid hsl(var(--border));max-height:240px;overflow-y:auto}.project-card-child{align-items:center;gap:6px;padding:5px 14px;font-size:12px;transition:background .1s;display:flex}.project-card-child:hover{background:hsl(var(--card-hover))}.project-card-child-done{opacity:.4;text-decoration:line-through}.project-card-expand{border-top:1px solid hsl(var(--border));text-align:center;color:hsl(var(--muted-foreground));cursor:pointer;padding:6px 14px;font-size:11px;transition:background .15s,color .15s}.project-card-expand:hover{background:hsl(var(--card-hover));color:hsl(var(--foreground))}.view-toggle{background:hsl(var(--muted));border-radius:6px;padding:2px;display:flex}.view-toggle-btn{color:hsl(var(--muted-foreground));cursor:pointer;background:0 0;border:none;border-radius:4px;padding:2px 8px;font-size:11px;transition:all .15s}.view-toggle-btn-active,.view-toggle-btn:hover{color:hsl(var(--foreground))}.view-toggle-btn-active{background:hsl(var(--card));box-shadow:0 1px 3px #0003}@keyframes scanIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.animate-scan-in{animation:scanIn .2s ease-out}@keyframes progressIndeterminate{0%{width:0;margin-left:0}50%{width:40%;margin-left:30%}to{width:0;margin-left:100%}}.animate-progress-indeterminate{animation:progressIndeterminate 1.5s ease-in-out infinite}.tab-bar{background:hsl(var(--background));border-bottom:1px solid hsl(var(--border));-webkit-overflow-scrolling:touch;flex-shrink:0;align-items:center;gap:0;height:36px;padding:0 4px;display:flex;overflow-x:auto}.tab-bar::-webkit-scrollbar{height:0}.tab-item{color:hsl(var(--muted-foreground));cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;border-bottom:2px solid #0000;flex-shrink:0;align-items:center;gap:6px;max-width:180px;padding:6px 12px;font-size:13px;transition:all .15s;display:flex}.tab-item:hover{color:hsl(var(--foreground));background:hsl(var(--muted))}.tab-item-active{color:hsl(var(--foreground));border-bottom-color:hsl(var(--primary))}.tab-close{color:hsl(var(--muted-foreground));opacity:0;border-radius:3px;padding:0 2px;font-size:15px;line-height:1;transition:opacity .1s,color .1s}.tab-item:hover .tab-close{opacity:1}.tab-close:hover{color:hsl(var(--destructive));background:hsl(var(--destructive)/.15)}.tab-bar-spacer{flex:1;min-width:8px}.theme-picker-btn{color:hsl(var(--muted-foreground));border:1px solid hsl(var(--border));background:hsl(var(--card));cursor:pointer;border-radius:6px;flex-shrink:0;align-items:center;gap:5px;margin-right:4px;padding:4px 8px;font-size:12px;transition:all .15s;display:flex}.theme-picker-btn:hover{color:hsl(var(--foreground));border-color:hsl(var(--primary)/.5);background:hsl(var(--card-hover))}.theme-picker-preview{border-radius:50%;flex-shrink:0;width:10px;height:10px}.theme-picker-dropdown{z-index:9999;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:10px;min-width:240px;padding:10px;animation:dialogIn .15s ease-out;box-shadow:0 8px 24px #0000004d}.theme-picker-title{color:hsl(var(--muted-foreground));text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px;padding:0 2px;font-size:11px;font-weight:600}.theme-picker-grid{grid-template-columns:1fr 1fr;gap:6px;display:grid}.theme-picker-item{background:hsl(var(--muted));cursor:pointer;text-align:left;border:1.5px solid #0000;border-radius:8px;flex-direction:column;gap:5px;padding:6px;transition:all .15s;display:flex}.theme-picker-item:hover{border-color:hsl(var(--primary)/.4)}.theme-picker-item-active{border-color:hsl(var(--primary));background:hsl(var(--primary)/.1)}.theme-picker-swatch{border-radius:4px;height:20px;display:flex;overflow:hidden}.theme-picker-name{color:hsl(var(--foreground));font-size:11px;font-weight:500}.panel-resize-handle{cursor:col-resize;z-index:10;background:0 0;flex-shrink:0;justify-content:center;align-items:center;width:6px;transition:background .15s;display:flex;position:relative}.panel-resize-handle:active,.panel-resize-handle:hover{background:hsl(var(--primary)/.15)}.panel-resize-handle-bar{background:hsl(var(--muted-foreground)/.2);border-radius:1px;width:2px;height:32px;transition:background .15s}.panel-resize-handle:active .panel-resize-handle-bar,.panel-resize-handle:hover .panel-resize-handle-bar{background:hsl(var(--primary)/.6)}.chat-markdown p{margin:.25em 0}.chat-markdown p:first-child{margin-top:0}.chat-markdown p:last-child{margin-bottom:0}.chat-markdown strong{color:hsl(var(--foreground));font-weight:700}.chat-markdown code{background:hsl(var(--background));font-size:.9em;font-family:var(--font-mono);border-radius:4px;padding:1px 5px}.chat-markdown pre{background:hsl(var(--background));border-radius:6px;margin:.5em 0;padding:8px 12px;overflow-x:auto}.chat-markdown pre code{background:0 0;padding:0}.chat-markdown ol,.chat-markdown ul{margin:.3em 0;padding-left:1.4em}.chat-markdown li{margin:.15em 0}.chat-markdown h1,.chat-markdown h2,.chat-markdown h3,.chat-markdown h4,.chat-markdown h5,.chat-markdown h6{margin:.5em 0 .25em;font-weight:700;line-height:1.3}.chat-markdown h1{font-size:1.2em}.chat-markdown h2{font-size:1.1em}.chat-markdown h3{font-size:1.05em}.chat-markdown blockquote{border-left:3px solid hsl(var(--border));color:hsl(var(--muted-foreground));margin:.4em 0;padding-left:10px}.chat-markdown hr{border:none;border-top:1px solid hsl(var(--border));margin:.5em 0}.chat-markdown table{border-collapse:collapse;width:100%;margin:.5em 0;font-size:.85em}.chat-markdown td,.chat-markdown th{border:1px solid hsl(var(--border));text-align:left;padding:4px 8px}.chat-markdown th{background:hsl(var(--muted));font-weight:600}.chat-markdown tr:nth-child(2n){background:hsl(var(--muted)/.3)}@keyframes dialogIn{0%{opacity:0;transform:scale(.95)translateY(4px)}to{opacity:1;transform:scale(1)translateY(0)}}.animate-dialog-in{animation:dialogIn .15s ease-out}@keyframes drawerIn{0%{transform:translate(100%)}to{transform:translate(0)}}.animate-drawer-in{animation:drawerIn .2s ease-out}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(1turn)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}
@@ -0,0 +1 @@
1
+ var a,b,c,d;self.__BUILD_MANIFEST=(a=0,b=0,c=0,d=0,{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:13,errorRate:1e-4,numBits:250,numHashes:14,bitArray:[0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,1,1,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,1,1,1,0,0,1,0,1,1,1,1,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,1,1,0,0,1,0,1,1,1,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,1,1,1,1,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,0,1,0,1,1,0,1,0,0,1,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,0,1,0,1,1,1,0,1,0,1,1,0,0,1,1,0,1,0,1,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,1,0,1,1,1,0,1,0]},__routerFilterDynamic:{numItems:2,errorRate:1e-4,numBits:39,numHashes:14,bitArray:[1,0,1,0,1,1,0,1,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,1,1,0,1,1,0,0,0,0]},sortedPages:["/_app"]}),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
package/README.ja.md CHANGED
@@ -34,7 +34,10 @@ im start
34
34
  - **3パネルレイアウト** — ブレスト | プロジェクトツリー | タスク詳細
35
35
  - **タブナビゲーション** — 複数プロジェクトを同時に開く
36
36
  - **ファイルツリー** — リンクされたディレクトリを閲覧
37
- - **AIチャット**タスクごとの対話で作業を改善
37
+ - **CodeMirrorノートエディタ**Markdownシンタックスハイライト、GFM、リスト自動継続(v1.6〜)
38
+ - **⌘K AIコマンドパレット** — 選択範囲の整形/続き書き/要約/タスク分解をノート内で実行、結果はカーソル位置に挿入(v1.6〜)
39
+ - **文脈認識オートコンプリート** — 現在のノート・兄弟タスク・ブレストから多語フレーズを提案(v1.6〜)
40
+ - **Note Assistant** — タスクごとのAIチャットで作業を改善、ワンクリックでノートに挿入
38
41
  - **ローカルファースト** — SQLite (sql.js)、ネイティブ依存なし
39
42
 
40
43
  ## 要件
package/README.ko.md CHANGED
@@ -39,10 +39,12 @@ im start
39
39
  ### 태스크 상태 흐름
40
40
 
41
41
  ```
42
- 💡 아이디어 → ✏️ 작성중🚀 제출 → 🧪 테스트 → ✅ 완료
43
- 🔴 문제
42
+ 💡 아이디어 → 🔥 진행중 → ✅ 완료
43
+ 🔴 문제
44
44
  ```
45
45
 
46
+ 기존 상태(`작성중`, `제출`, `테스트`)는 그대로 유지되며, v1.6 이전 태스크에 한해 점선 뱃지로 표시됩니다.
47
+
46
48
  ## CLI 명령어
47
49
 
48
50
  | 명령어 | 설명 |
@@ -119,16 +121,31 @@ im watch --project <id> # 특정 프로젝트
119
121
  im watch --interval 30 --dry-run # 미리보기 모드
120
122
  ```
121
123
 
124
+ ### 노트 중심 에디터 (v1.6)
125
+
126
+ 기존의 "설명 + 프롬프트" 분리 구조를 하나의 마크다운 노트로 통합했습니다.
127
+
128
+ - **CodeMirror 에디터** — 마크다운 문법 하이라이트: 헤딩·리스트 마커(`-`, `1.`)·코드·링크·인용 시각 분리. GFM 활성화 (체크박스·취소선·테이블).
129
+ - **⌘K AI 명령 팔레트** — 노트를 떠나지 않고 선택 영역을 다듬거나 커서에서 이어 쓰기:
130
+ - 이어서 써줘 · 이 부분 정리해줘 · 할 일로 쪼개줘 · 질문으로 바꿔줘 · 요약해줘 · 직접 입력
131
+ - 결과가 해당 위치에 바로 삽입됩니다. 실행 중 **취소**, 적용 후 30초 내 **되돌리기** 가능.
132
+ - Sonnet 모델 + 경량 컨텍스트로 평균 ~7초 응답.
133
+ - **맥락 인식 자동완성** — 고스트 텍스트가 다단어 구절(최대 3개)을 제안. 코퍼스에 현재 노트 + 같은 프로젝트 형제 태스크 + 브레인스토밍을 포함. 현재 노트와 어휘가 겹치는 구절이 우선 노출되어 주제 연관 단어가 상위로. `Tab` 수락, `Esc` 해제.
134
+ - **리스트 자동 이어쓰기** — Enter로 불릿/번호/체크박스 이어 씀, 빈 항목에서 Enter로 리스트 탈출.
135
+ - **Copy as Prompt** — 노트 전체를 Claude Code 등에 붙여넣기 좋은 포맷으로 한 번에 복사.
136
+
122
137
  ### 워크스페이스
123
138
 
124
139
  - **3-패널 레이아웃** — 브레인스토밍 | 프로젝트 트리 | 태스크 상세 (드래그로 크기 조절)
125
140
  - **탭 기반 네비게이션** — 여러 프로젝트 동시 열기
126
141
  - **파일 트리 드로어** — 연결된 프로젝트 디렉토리 탐색
127
142
  - **브레인스토밍 패널** — 자유로운 메모 + AI 인라인 메모
128
- - **프롬프트 에디터**태스크별 프롬프트 작성/편집/복사
129
- - **AI 채팅** — 태스크별 대화로 작업 개선
130
- - **대시보드**Active / All / Today
131
- - **키보드 단축키**`B` 브레인스토밍, `N` 서브 프로젝트, `T` 태스크, `Cmd+1~6` 상태 변경
143
+ - **자동 분배**AI가 브레인스토밍을 분석하여 프로젝트들로 태스크 자동 분배 (미리보기/편집 모달)
144
+ - **Note Assistant** — 태스크별 AI 대화 (구 "AI 채팅")로 노트를 다듬고, 한 번의 클릭으로 노트에 삽입
145
+ - **Quick Memo** 대시보드 상단의 전역 스크래치패드 (자동 저장)
146
+ - **아침 알림**매일 오전 9시 오늘의 태스크 요약을 macOS 알림으로
147
+ - **대시보드** — Active / All / Today / Archive 뷰
148
+ - **키보드 단축키** — `B` 브레인스토밍, `N` 프로젝트, `T` 태스크, `⌘K` AI 명령 팔레트, `⌘1/2/3/4` 상태 (아이디어/진행중/완료/문제)
132
149
 
133
150
  ### 데이터
134
151
 
@@ -170,6 +187,19 @@ source ~/.zshrc
170
187
  lsof -t -i :3456 | xargs kill -9 # macOS/Linux
171
188
  ```
172
189
 
190
+ ## 변경 이력
191
+
192
+ ### v1.6.0
193
+
194
+ - **⌘K AI 명령 팔레트** — 노트 안에서 다듬기/이어 쓰기/요약/할 일 분해 명령, 결과가 커서에 바로 삽입. 취소 + 30초 되돌리기. Sonnet + 경량 컨텍스트로 90s 타임아웃 → ~7s.
195
+ - **CodeMirror 노트 에디터** — textarea를 풀 마크다운 에디터로 교체: 문법 하이라이트, GFM 체크박스/취소선/테이블, 리스트 자동 이어쓰기, 고스트 자동완성.
196
+ - **맥락 인식 자동완성** — 현재 노트 + 형제 태스크 + 브레인스토밍에서 다단어 구절 제안. 공유 어휘 가중치로 주제 연관 완성이 우선.
197
+ - **`doing` 상태 추가** — 기본 플로우를 아이디어 → 진행중 → 완료로 단순화. 기존 상태는 뱃지로 호환.
198
+ - **태스크 아카이브 / 태그** — `is_archived`, `tags` 컬럼, 대시보드 Archive 탭.
199
+ - **프롬프트 → 노트 병합** — 기존 `task_prompts`가 노트 설명에 일회 병합 (멱등).
200
+ - **Note Assistant** — 태스크 AI 채팅을 노트 작성 보조 역할로 재배치, 한 번의 클릭으로 노트 삽입.
201
+ - 런타임: `RunAgentOptions.model` 오버라이드, CodeMirror 내부 입력을 글로벌 단축키에서 제외.
202
+
173
203
  ## 라이선스
174
204
 
175
205
  MIT