@runfusion/fusion 0.24.0 → 0.25.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 (106) hide show
  1. package/dist/bin.js +2254 -1349
  2. package/dist/client/assets/AgentDetailView-ZbHEbYRT.js +18 -0
  3. package/dist/client/assets/{AgentsView-BkB9FiMT.js → AgentsView-B3jYk8Kt.js} +3 -3
  4. package/dist/client/assets/ChatView-DhPkiEGs.js +1 -0
  5. package/dist/client/assets/{DevServerView-BkvtjZBa.js → DevServerView-DyGDEiBP.js} +1 -1
  6. package/dist/client/assets/{DirectoryPicker-BK-KbnhP.js → DirectoryPicker-D5UIeIl6.js} +1 -1
  7. package/dist/client/assets/{DocumentsView-BEg1CQAk.js → DocumentsView-DNHu1T8K.js} +1 -1
  8. package/dist/client/assets/{EvalsView-Berf9bQm.js → EvalsView-CpRobtDi.js} +1 -1
  9. package/dist/client/assets/{ExperimentalAgentOnboardingModal-jcInE50G.js → ExperimentalAgentOnboardingModal-DOY_oZi7.js} +1 -1
  10. package/dist/client/assets/{InsightsView-BX5bSF1J.js → InsightsView-vp0RE8Mg.js} +1 -1
  11. package/dist/client/assets/MemoryView-PSc5lGJt.js +2 -0
  12. package/dist/client/assets/MemoryView-zaXewZzi.css +1 -0
  13. package/dist/client/assets/{NodesView-DLUOBLf6.js → NodesView-DMj6HGeC.js} +1 -1
  14. package/dist/client/assets/{PiExtensionsManager-COlJf0Kx.js → PiExtensionsManager-DL_QcN56.js} +2 -2
  15. package/dist/client/assets/PluginManager-BtYKm8IT.js +1 -0
  16. package/dist/client/assets/{ResearchView-B256Lr8I.js → ResearchView-BhWqfdV0.js} +1 -1
  17. package/dist/client/assets/{SettingsModal-BeA_nQtW.js → SettingsModal-BAgB4_AR.js} +4 -4
  18. package/dist/client/assets/{SettingsModal-yRqM4DV8.js → SettingsModal-CUCyaAyE.js} +1 -1
  19. package/dist/client/assets/{SetupWizardModal-uUZk3TKT.js → SetupWizardModal-BKscasuh.js} +1 -1
  20. package/dist/client/assets/{SkillsView-CP8JX0P_.js → SkillsView-BdELqTy7.js} +1 -1
  21. package/dist/client/assets/{TodoView-DCRIkDZ-.js → TodoView-DFNGBDNV.js} +1 -1
  22. package/dist/client/assets/{folder-open-DHjELt8-.js → folder-open-k1xmUMyr.js} +1 -1
  23. package/dist/client/assets/index-Qq2JOOWx.css +1 -0
  24. package/dist/client/assets/{index-CQyVRLOb.js → index-TFYXEVpn.js} +160 -160
  25. package/dist/client/assets/{star-DYesq1AV.js → star-ne32r3Y4.js} +1 -1
  26. package/dist/client/assets/{upload-DTWF3Db5.js → upload-MS-2Gx53.js} +1 -1
  27. package/dist/client/assets/{users--syrel4l.js → users-C519GSjH.js} +1 -1
  28. package/dist/client/index.html +2 -2
  29. package/dist/client/version.json +1 -1
  30. package/dist/droid-cli/package.json +1 -1
  31. package/dist/extension.js +1370 -629
  32. package/dist/pi-claude-cli/package.json +1 -1
  33. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +9 -11
  34. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  35. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +30 -0
  36. package/dist/plugins/fusion-plugin-dependency-graph/package.json +3 -28
  37. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +899 -895
  38. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  39. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +68 -71
  40. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  41. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +47 -50
  42. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  43. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +155 -109
  44. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  45. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  46. package/dist/plugins/fusion-plugin-reports/src/index.ts +49 -3
  47. package/dist/plugins/fusion-plugin-reports/src/report-schema.ts +38 -0
  48. package/dist/plugins/fusion-plugin-reports/src/store/__tests__/report-schema.test.ts +66 -0
  49. package/dist/plugins/fusion-plugin-reports/src/store/__tests__/report-store.test.ts +177 -0
  50. package/dist/plugins/fusion-plugin-reports/src/store/report-store.ts +341 -0
  51. package/dist/plugins/fusion-plugin-reports/src/store/report-types.ts +77 -0
  52. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  53. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  54. package/package.json +1 -1
  55. package/dist/client/assets/AgentDetailView-gy_5SUj2.js +0 -18
  56. package/dist/client/assets/ChatView-B_-B8fqu.js +0 -1
  57. package/dist/client/assets/MemoryView-CKElJY_3.js +0 -2
  58. package/dist/client/assets/MemoryView-DiajLXby.css +0 -1
  59. package/dist/client/assets/PluginManager-CfW55BF4.js +0 -1
  60. package/dist/client/assets/createLucideIcon-BazL2hk5.js +0 -21
  61. package/dist/client/assets/dashboard-view-BkTMSZYn.css +0 -1
  62. package/dist/client/assets/dashboard-view-CyWN-d02.js +0 -63
  63. package/dist/client/assets/dashboard-view-DdGlfuu-.css +0 -1
  64. package/dist/client/assets/dashboard-view-lR7YYmSC.js +0 -21
  65. package/dist/client/assets/index-CxA2Nn0_.css +0 -1
  66. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.css +0 -58
  67. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.tsx +0 -301
  68. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphHighlight.css +0 -27
  69. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.css +0 -157
  70. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.tsx +0 -126
  71. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.css +0 -35
  72. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.tsx +0 -36
  73. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.highlighting.test.tsx +0 -112
  74. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.persistence.test.tsx +0 -115
  75. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.test.tsx +0 -128
  76. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.drag.test.tsx +0 -82
  77. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.test.tsx +0 -307
  78. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphToolbar.test.tsx +0 -60
  79. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/edges.test.tsx +0 -75
  80. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filtering.test.tsx +0 -62
  81. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filters.test.ts +0 -78
  82. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/graphPositionStorage.test.ts +0 -95
  83. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/host-integration.test.ts +0 -74
  84. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/index.test.ts +0 -58
  85. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/interactions.test.tsx +0 -121
  86. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/layout.test.ts +0 -70
  87. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/persistence.test.tsx +0 -89
  88. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphData.test.ts +0 -86
  89. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphInteraction.test.ts +0 -167
  90. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphPositions.test.ts +0 -66
  91. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useNodeDrag.test.ts +0 -81
  92. package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-interop.d.ts +0 -35
  93. package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-view.tsx +0 -19
  94. package/dist/plugins/fusion-plugin-dependency-graph/src/edges.tsx +0 -70
  95. package/dist/plugins/fusion-plugin-dependency-graph/src/filters.ts +0 -8
  96. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/__tests__/useDependencyChain.test.ts +0 -53
  97. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useDependencyChain.ts +0 -60
  98. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useGraphPositions.ts +0 -45
  99. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useNodeDrag.ts +0 -114
  100. package/dist/plugins/fusion-plugin-dependency-graph/src/index.ts +0 -24
  101. package/dist/plugins/fusion-plugin-dependency-graph/src/layout.ts +0 -91
  102. package/dist/plugins/fusion-plugin-dependency-graph/src/styles/drag.css +0 -15
  103. package/dist/plugins/fusion-plugin-dependency-graph/src/types.ts +0 -21
  104. package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphData.ts +0 -17
  105. package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphInteraction.ts +0 -292
  106. package/dist/plugins/fusion-plugin-dependency-graph/src/utils/graphPositionStorage.ts +0 -65
@@ -1 +0,0 @@
1
- import{r as g,j as e}from"./vendor-react-K0fH_qHe.js";import{v as fe,ee as ye,ef as Y,s as je,X as Z,ar as Ne,aP as Se,I as T,aW as ee,W as se,R as ve,eg as we,an as Ce,eh as Ie,ei as $e,cr as Pe,ej as Re,ek as ke,el as Ee,em as Be,en as te,co as Ae,eo as Le}from"./index-CQyVRLOb.js";import{D as De}from"./DirectoryPicker-BK-KbnhP.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-DHjELt8-.js";const ie="fusion-plugin-agent-browser",ne={enabled:{type:"boolean",label:"Enable Agent Browser",group:"General"},installChannel:{type:"enum",label:"Install Channel",enumValues:["stable","beta","nightly"],defaultValue:"stable",group:"General"},commandTimeoutMs:{type:"number",label:"Command Timeout (ms)",defaultValue:12e4,group:"General"},headlessMode:{type:"boolean",label:"Headless Mode",defaultValue:!0,group:"Browser"},allowedDomains:{type:"array",label:"Allowed Domains",itemType:"string",group:"Browser"},promptExecutorSystem:{type:"string",label:"Executor System Prompt",multiline:!0,group:"Prompt Contributions"},promptExecutorTask:{type:"string",label:"Executor Task Prompt",multiline:!0,group:"Prompt Contributions"},promptTriage:{type:"string",label:"Triage Prompt",multiline:!0,group:"Prompt Contributions"},promptReviewer:{type:"string",label:"Reviewer Prompt",multiline:!0,group:"Prompt Contributions"},promptHeartbeat:{type:"string",label:"Heartbeat Prompt",multiline:!0,group:"Prompt Contributions"},skillExposure:{type:"enum",label:"Skill Exposure",enumValues:["none","selected","all"],defaultValue:"selected",group:"Skills"}},ae=[{id:"fusion-plugin-hermes-runtime",name:"Hermes Runtime",description:"Runtime provider for Hermes CLI-backed execution.",category:"runtime",path:"./plugins/fusion-plugin-hermes-runtime",experimental:!0},{id:"fusion-plugin-paperclip-runtime",name:"Paperclip Runtime",description:"Runtime provider for Paperclip agent connections.",category:"runtime",path:"./plugins/fusion-plugin-paperclip-runtime"},{id:"fusion-plugin-openclaw-runtime",name:"OpenClaw Runtime",description:"Runtime provider for OpenClaw execution.",category:"runtime",path:"./plugins/fusion-plugin-openclaw-runtime",experimental:!0},{id:"fusion-plugin-droid-runtime",name:"Droid Runtime",description:"Runtime provider for Droid CLI execution.",category:"runtime",path:"./plugins/fusion-plugin-droid-runtime",experimental:!0},{id:"fusion-plugin-dependency-graph",name:"Dependency Graph",description:"Dashboard plugin for task dependency graph visualization.",category:"integration",path:"./plugins/fusion-plugin-dependency-graph"},{id:"fusion-plugin-whatsapp-chat",name:"WhatsApp Chat",description:"Pairs to WhatsApp Web (multi-device) with QR or pairing code, then bridges direct chats to a Fusion agent.",category:"integration",path:"./plugins/fusion-plugin-whatsapp-chat"},{id:ie,name:"Agent Browser",description:"Built-in integration metadata. Package install support lands in FN-3101.",category:"integration",hasSetup:!0}],I={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function Fe(c){const o=c.settingsSchema,h=o&&Object.keys(o).length>0;return c.id!==ie?h?o:void 0:h?{...ne,...o}:ne}function Oe(c){const o=new Map,h=[];for(const[x,f]of Object.entries(c))if(f.group){const N=o.get(f.group)??[];N.push([x,f]),o.set(f.group,N)}else h.push([x,f]);return{grouped:o,ungrouped:h}}function Ve({addToast:c,projectId:o}){const[h,x]=g.useState([]),[f,N]=g.useState(!0),[le,$]=g.useState(!1),[w,P]=g.useState(""),[B,A]=g.useState(!1),[L,D]=g.useState(!1),[S,F]=g.useState(null),[l,R]=g.useState(null),[p,b]=g.useState({}),[re,O]=g.useState(!1),[z,G]=g.useState(null),[ce,k]=g.useState({}),[oe,U]=g.useState(null),[C,q]=g.useState(null),{confirm:ue}=fe(),m=g.useCallback(async()=>{try{N(!0);const s=await ye(o);x(s)}catch(s){c(`Failed to load plugins: ${s instanceof Error?s.message:String(s)}`,"error")}finally{N(!1)}},[o,c]);g.useEffect(()=>{m()},[m]),g.useEffect(()=>{const s=ae.filter(r=>r.hasSetup&&h.some(i=>i.id===r.id));if(s.length===0)return;let n=!1;return Promise.all(s.map(async r=>{try{const i=await Y(r.id,o);if(n)return;k(u=>({...u,[r.id]:i}))}catch{if(n)return;k(i=>({...i,[r.id]:{hasSetup:!0,setupCheckDeferred:!0,deferredReason:"plugin-not-started",pluginState:"installed"}}))}})),()=>{n=!0}},[h,o]);const de=g.useRef([]);de.current=h,g.useEffect(()=>{const s=o?`?projectId=${encodeURIComponent(o)}`:"",n=r=>{try{const i=JSON.parse(r.data);if(i.scope==="project"&&(i.projectId??o)!==o)return;switch(i.transition){case"installing":case"enabled":case"disabled":case"settings-updated":x(u=>{const a=u.findIndex(t=>t.id===i.pluginId);if(a>=0){const t=[...u];return t[a]={...t[a],enabled:i.enabled,state:i.state,settings:i.settings,error:i.error},t}else return m(),u});break;case"state-changed":x(u=>{const a=u.findIndex(t=>t.id===i.pluginId);if(a>=0){const t=[...u];return t[a]={...t[a],state:i.state,error:i.error},t}return u});break;case"uninstalled":x(u=>u.filter(a=>a.id!==i.pluginId));break;case"error":x(u=>{const a=u.findIndex(t=>t.id===i.pluginId);if(a>=0){const t=[...u];return t[a]={...t[a],state:i.state,error:i.error},t}return u});break}}catch{}};return je(`/api/events${s}`,{events:{"plugin:lifecycle":n},onReconnect:()=>{m()}})},[o,m]);const _=async()=>{if(!w.trim()){c("Please enter a plugin path","error");return}try{A(!0),await te({path:w,...L?{aiScanOnLoad:!0}:{}},o),c("Plugin installed globally","success"),$(!1),P(""),D(!1),await m()}catch(s){c(`Failed to install plugin: ${s instanceof Error?s.message:String(s)}`,"error")}finally{A(!1)}},pe=async s=>{if(!s.path){c(`${s.name} is built in and does not have an installable package yet`,"warning");return}try{G(s.id),await te({path:s.path},o),c(`${s.name} installed globally`,"success"),await m()}catch(n){c(`Failed to install ${s.name}: ${n instanceof Error?n.message:String(n)}`,"error")}finally{G(null)}},M=async s=>{try{q(s.id);const n=await Le(s.id,o);if(!n.success){c(`Failed to install ${s.name} setup: ${n.error??"unknown error"}`,"error");return}c(`${s.name} setup installed`,"success"),U(s.id);const r=await Y(s.id,o);k(i=>({...i,[s.id]:r}))}catch(n){c(`Failed to install ${s.name} setup: ${n instanceof Error?n.message:String(n)}`,"error")}finally{q(null),U(null)}},V=async s=>{try{await Ee(s.id,o),c(`${s.name} enabled for this project`,"success"),await m()}catch(n){c(`Failed to enable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},W=async s=>{try{await ke(s.id,o),c(`${s.name} disabled for this project`,"success"),await m()}catch(n){c(`Failed to disable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},H=async s=>{try{F(s.id),await Re(s.id,o),c(`${s.name} reloaded`,"success"),await m()}catch(n){c(`Failed to reload plugin: ${n instanceof Error?n.message:String(n)}`,"error")}finally{F(null)}},J=async s=>{if(await ue({title:"Uninstall Plugin Globally",message:`Are you sure you want to uninstall "${s.name}" globally (all projects)?`,danger:!0}))try{await Be(s.id,o),c(`${s.name} uninstalled globally`,"success"),await m(),R(null)}catch(r){c(`Failed to uninstall plugin: ${r instanceof Error?r.message:String(r)}`,"error")}},ge=async(s,n)=>{try{await Ie(s.id,{aiScanOnLoad:n},o),c(`AI scan on load ${n?"enabled":"disabled"}`,"success"),await m()}catch(r){c(`Failed to update plugin: ${r instanceof Error?r.message:String(r)}`,"error")}},me=async s=>{try{await $e(s.id,o),c(`${s.name} rescanned`,"success"),await m()}catch(n){c(`Failed to rescan plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},E=async s=>{R(s);try{O(!0);const n=await Ae(s.id,o);b(n)}catch{b({})}finally{O(!1)}},he=async()=>{if(l)try{await Pe(l.id,p,o),c("Settings saved","success")}catch(s){c(`Failed to save settings: ${s instanceof Error?s.message:String(s)}`,"error")}};if(l)return e.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[e.jsxs("div",{className:"plugin-manager-detail-header",children:[e.jsx("button",{className:"btn-icon",onClick:()=>R(null),"aria-label":"Back to plugin list",children:e.jsx(Z,{size:16})}),e.jsxs("div",{className:"plugin-detail-title",children:[e.jsx("h4",{className:"plugin-detail-name",children:l.name}),e.jsx("span",{className:"plugin-state-badge",style:{color:I[l.state]||I.installed},children:l.state})]})]}),e.jsxs("div",{className:"plugin-detail-content",children:[e.jsxs("div",{className:"plugin-detail-card",children:[l.description&&e.jsx("p",{className:"plugin-description",children:l.description}),l.author&&e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Author:"}),l.author]}),l.homepage&&e.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[e.jsx("span",{className:"text-muted",children:"Homepage:"}),e.jsxs("a",{href:l.homepage,target:"_blank",rel:"noopener noreferrer",children:[l.homepage,e.jsx(Ne,{size:12})]})]}),e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Version:"}),l.version]})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h5",{className:"plugin-detail-section-heading",children:"Security Scan"}),e.jsxs("div",{className:"plugin-security-row",children:[e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:!!l.aiScanOnLoad,onChange:s=>void ge(l,s.target.checked)}),"Enable AI scan before load/reload"]}),e.jsxs("button",{className:"btn btn-secondary btn-sm",onClick:()=>void me(l),children:[e.jsx(Se,{size:14})," Rescan and Reload"]})]}),e.jsx("p",{className:"text-muted",children:"Turning this on only updates configuration. Use Rescan and Reload to run it now."}),l.lastSecurityScan?e.jsxs("div",{className:"plugin-security-results",children:[e.jsxs("div",{className:"plugin-security-header",children:[e.jsx("span",{className:`plugin-state-badge plugin-security-badge plugin-security-badge--${l.lastSecurityScan.verdict}`,children:l.lastSecurityScan.verdict}),e.jsx("span",{className:"text-muted",children:l.lastSecurityScan.scannedAt})]}),e.jsx("p",{className:"plugin-security-summary",children:l.lastSecurityScan.summary}),e.jsxs("details",{children:[e.jsxs("summary",{children:["Findings (",l.lastSecurityScan.findings.length,")"]}),e.jsx("ul",{className:"plugin-security-findings",children:l.lastSecurityScan.findings.map((s,n)=>e.jsxs("li",{children:[e.jsx("strong",{children:s.severity})," ",s.category," — ",s.file,": ",s.reason]},`${s.file}-${n}`))})]})]}):e.jsx("p",{className:"text-muted",children:"No security scan has been run yet."})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h5",{className:"plugin-detail-section-heading",children:"Settings"}),re?e.jsx("p",{className:"text-muted",children:"Loading..."}):(()=>{const s=Fe(l);return s&&Object.keys(s).length>0?e.jsxs("div",{className:"plugin-settings-form",children:[(()=>{const{grouped:n,ungrouped:r}=Oe(s),i=[];r.length>0&&i.push({title:null,entries:r});for(const[u,a]of n.entries())i.push({title:u,entries:a});return i.map(u=>e.jsxs("div",{className:u.title?"plugin-settings-group":void 0,children:[u.title&&e.jsx("h6",{className:"plugin-settings-group-heading",children:u.title}),u.entries.map(([a,t])=>{const y=`setting-${a}-help`;return e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:`setting-${a}`,children:[t.label||a,t.required&&" *"]}),t.type==="string"&&!t.multiline&&e.jsx("input",{className:"input",type:"text",id:`setting-${a}`,value:p[a]??"",onChange:d=>b({...p,[a]:d.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?y:void 0}),t.type==="string"&&t.multiline&&e.jsx("textarea",{className:"input",id:`setting-${a}`,rows:4,value:p[a]??"",onChange:d=>b({...p,[a]:d.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?y:void 0}),t.type==="password"&&e.jsx("input",{className:"input",type:"password",id:`setting-${a}`,value:p[a]??"",onChange:d=>b({...p,[a]:d.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?y:void 0}),t.type==="number"&&e.jsx("input",{className:"input",type:"number",id:`setting-${a}`,value:p[a]??"",onChange:d=>b({...p,[a]:Number(d.target.value)}),"aria-describedby":t.description&&!t.required?y:void 0}),t.type==="boolean"&&e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:p[a]??!1,onChange:d=>b({...p,[a]:d.target.checked})}),t.description]}),t.type==="enum"&&e.jsxs("select",{className:"select",id:`setting-${a}`,value:p[a]??"",onChange:d=>b({...p,[a]:d.target.value}),"aria-describedby":t.description&&!t.required?y:void 0,children:[e.jsx("option",{value:"",children:"Select..."}),t.enumValues?.map(d=>e.jsx("option",{value:d,children:d},d))]}),t.type==="array"&&e.jsxs("div",{className:"plugin-settings-array",children:[p[a]?.map((d,j)=>e.jsxs("div",{className:"plugin-settings-array-item",children:[e.jsx("input",{className:"input",type:t.itemType==="number"?"number":"text",value:d??"",onChange:Q=>{const v=Q.target.value,X=[...p[a]||[]];X[j]=t.itemType==="number"?Number(v):v,b({...p,[a]:X})}}),e.jsx("button",{className:"btn-icon",onClick:()=>{const v=[...p[a]||[]];v.splice(j,1),b({...p,[a]:v})},"aria-label":"Remove item",children:e.jsx(Z,{size:14})})]},j)),e.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const d=p[a]||[],j=t.itemType==="number"?0:"";b({...p,[a]:[...d,j]})},children:[e.jsx(T,{size:14})," Add Item"]})]}),t.description&&!t.required&&!t.multiline&&e.jsx("span",{id:y,className:"form-help",children:t.description})]},a)})]},u.title??"ungrouped"))})(),e.jsx("button",{className:"btn btn-primary",onClick:he,children:"Save Settings"})]}):e.jsx("p",{className:"text-muted",children:"No configurable settings."})})()]}),e.jsxs("div",{className:"plugin-detail-actions",children:[l.state==="started"&&e.jsxs("button",{className:"btn btn-secondary",onClick:()=>H(l),disabled:S===l.id,children:[e.jsx(ee,{size:14,className:S===l.id?"spin":""}),S===l.id?"Reloading...":"Reload"]}),l.enabled?e.jsx("button",{className:"btn btn-secondary",onClick:()=>W(l),children:"Disable in Project"}):e.jsx("button",{className:"btn btn-primary",onClick:()=>V(l),children:"Enable in Project"}),e.jsxs("button",{className:"btn btn-danger",onClick:()=>J(l),children:[e.jsx(se,{size:14})," Uninstall Globally"]})]})]})]});const be=new Map(h.map(s=>[s.id,s])),K=h,xe=()=>e.jsxs("section",{className:"plugin-builtins-section","aria-label":"Built-in Plugins",children:[e.jsxs("div",{className:"plugin-builtins-header",children:[e.jsx("h4",{className:"plugin-builtins-heading",children:"Built-in Plugins"}),e.jsx("p",{className:"plugin-builtins-description",children:"Built-in plugin catalog for runtimes and integrations."})]}),e.jsx("div",{className:"plugin-builtins-list","aria-label":"Built-in plugin recommendations",children:ae.map(s=>{const n=be.get(s.id),r=!!n,i=ce[s.id],u=!!(i&&"setupCheckDeferred"in i&&i.setupCheckDeferred),a=i&&"status"in i?i.status:void 0,t=r&&s.hasSetup&&i?.hasSetup&&!u&&n?.state==="started"&&(a==="not-installed"||a==="error"),y=r&&i?.hasSetup&&a==="installed",d=oe===s.id,j=!s.path;return e.jsxs("div",{className:"plugin-builtins-item",children:[e.jsxs("div",{className:"plugin-builtins-meta",children:[e.jsx("span",{className:"plugin-builtins-name",children:s.name}),s.experimental&&e.jsx("span",{className:"plugin-builtins-runtime-badge",children:"Experimental"}),e.jsx("span",{className:"plugin-builtins-runtime-badge",children:s.category}),e.jsx("span",{className:`plugin-builtins-status ${r?"plugin-builtins-status--installed":"plugin-builtins-status--available"}`,children:r?"Installed":j?"Built in":"Not installed"}),t&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--warning",children:"Setup required"}),y&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--ready",children:"Setup ready"}),d&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--pending",children:"Checking setup..."}),u&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--deferred",children:"Start plugin to check setup"}),e.jsx("span",{className:"plugin-builtins-description-text",children:s.description})]}),j?r&&t?e.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void M(s),disabled:C===s.id||d,children:C===s.id?"Setting up...":"Install Setup"}):r&&n?e.jsx("button",{className:"btn btn-secondary btn-sm",onClick:()=>void E(n),children:"Manage"}):e.jsx("span",{className:"plugin-builtins-metadata-only",children:"Built-in metadata only"}):e.jsx("button",{className:`btn ${r&&!t?"btn-secondary":"btn-primary"} btn-sm`,onClick:()=>{if(!r){pe(s);return}if(t){M(s);return}n&&E(n)},disabled:z===s.id||C===s.id||d,children:r?t?C===s.id?"Setting up...":"Install Setup":"Manage":z===s.id?"Installing...":`Install ${s.name}`})]},s.id)})})]});return e.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[e.jsxs("div",{className:"plugin-manager-header",children:[e.jsx("span",{className:"plugin-manager-header-title",children:"Installed Plugins"}),e.jsxs("div",{className:"plugin-manager-actions",children:[e.jsxs("button",{className:"btn btn-sm",onClick:m,title:"Refresh","aria-label":"Refresh plugin list",children:[e.jsx(ve,{size:14,className:f?"spin":""}),"Refresh"]}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>$(!0),children:[e.jsx(T,{size:14})," Install"]})]})]}),le&&e.jsxs("div",{className:"plugin-install-form",children:[e.jsxs("p",{className:"plugin-install-hint",children:["Browse to a plugin package root (contains ",e.jsx("code",{children:"manifest.json"}),") or a built ",e.jsx("code",{children:"dist"})," directory."]}),e.jsx(De,{value:w,onChange:P,placeholder:"Absolute path to plugin directory or dist folder",onInputKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),_())}}),e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:L,onChange:s=>D(s.target.checked)}),"Enable AI security scan on load"]}),e.jsxs("div",{className:"plugin-install-actions",children:[e.jsx("button",{className:"btn btn-primary",onClick:_,disabled:B||!w.trim(),children:B?"Installing...":"Install Plugin Globally"}),e.jsx("button",{className:"btn btn-secondary",onClick:()=>{$(!1),P("")},children:"Cancel"})]})]}),f?e.jsx("div",{className:"settings-empty-state",children:"Loading plugins..."}):e.jsxs(e.Fragment,{children:[K.length===0?e.jsxs("div",{className:"settings-empty-state",children:[e.jsx(we,{size:32,className:"text-muted"}),e.jsx("p",{children:"No plugins installed."}),e.jsx("p",{className:"text-muted",children:"Install a plugin to get started, or use the built-in catalog below."})]}):e.jsx("div",{className:"plugin-list",children:K.map(s=>e.jsxs("div",{className:"plugin-item",children:[e.jsxs("div",{className:"plugin-info",children:[e.jsx("span",{className:"plugin-name",children:s.name}),e.jsxs("span",{className:"plugin-version text-muted",children:["v",s.version]}),e.jsx("span",{className:"plugin-state-badge",style:{color:I[s.state]||I.installed},children:s.state})]}),e.jsxs("div",{className:"plugin-actions",children:[s.state==="started"&&e.jsx("button",{className:"btn-icon",onClick:()=>H(s),disabled:S===s.id,title:"Reload",children:e.jsx(ee,{size:14,className:S===s.id?"spin":""})}),e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>s.enabled?W(s):V(s),"aria-label":`${s.enabled?"Disable":"Enable"} ${s.name}`}),e.jsx("span",{className:"toggle-slider"})]}),e.jsx("button",{className:"btn-icon",onClick:()=>E(s),title:"Settings",children:e.jsx(Ce,{size:14})}),e.jsx("button",{className:"btn-icon",onClick:()=>J(s),title:"Uninstall globally",children:e.jsx(se,{size:14})})]})]},s.id))}),xe()]})]})}export{ne as AGENT_BROWSER_SETTINGS_SCHEMA,ie as BUILTIN_AGENT_BROWSER_PLUGIN_ID,Ve as PluginManager,I as STATE_COLORS};
@@ -1,21 +0,0 @@
1
- import{r as s}from"./vendor-react-K0fH_qHe.js";/**
2
- * @license lucide-react v0.542.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const C=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),w=t=>t.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,r,o)=>o?o.toUpperCase():r.toLowerCase()),i=t=>{const e=w(t);return e.charAt(0).toUpperCase()+e.slice(1)},l=(...t)=>t.filter((e,r,o)=>!!e&&e.trim()!==""&&o.indexOf(e)===r).join(" ").trim(),f=t=>{for(const e in t)if(e.startsWith("aria-")||e==="role"||e==="title")return!0};/**
7
- * @license lucide-react v0.542.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */var h={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
12
- * @license lucide-react v0.542.0 - ISC
13
- *
14
- * This source code is licensed under the ISC license.
15
- * See the LICENSE file in the root directory of this source tree.
16
- */const g=s.forwardRef(({color:t="currentColor",size:e=24,strokeWidth:r=2,absoluteStrokeWidth:o,className:n="",children:a,iconNode:u,...c},p)=>s.createElement("svg",{ref:p,...h,width:e,height:e,stroke:t,strokeWidth:o?Number(r)*24/Number(e):r,className:l("lucide",n),...!a&&!f(c)&&{"aria-hidden":"true"},...c},[...u.map(([m,d])=>s.createElement(m,d)),...Array.isArray(a)?a:[a]]));/**
17
- * @license lucide-react v0.542.0 - ISC
18
- *
19
- * This source code is licensed under the ISC license.
20
- * See the LICENSE file in the root directory of this source tree.
21
- */const b=(t,e)=>{const r=s.forwardRef(({className:o,...n},a)=>s.createElement(g,{ref:a,iconNode:e,className:l(`lucide-${C(i(t))}`,`lucide-${t}`,o),...n}));return r.displayName=i(t),r};export{b as c};
@@ -1 +0,0 @@
1
- .graph-task-node{position:absolute;z-index:1;width:min(100%,var(--graph-task-node-width, calc(var(--space-2xl) * 9)));max-width:var(--graph-task-node-max-width, calc(var(--space-2xl) * 9.5));transition:box-shadow var(--transition-fast),z-index var(--transition-fast),opacity var(--transition-fast),border-color var(--transition-fast);border:var(--btn-border-width) solid transparent;border-radius:var(--radius-sm)}.graph-task-node:hover{box-shadow:var(--shadow-md);z-index:2}.graph-task-node--highlighted{box-shadow:0 0 0 var(--btn-border-width) var(--todo),var(--shadow-md);z-index:2}.graph-task-node--dimmed{opacity:.4}.graph-task-node--active{border-color:rgba(var(--in-progress-rgb),.5);box-shadow:0 0 0 var(--btn-border-width) rgba(var(--in-progress-rgb),.45),0 0 .75rem rgba(var(--in-progress-rgb),.5),0 0 1.5rem rgba(var(--in-progress-rgb),.2);transform:scale(1.01)}.graph-task-node--in-review{border-inline-start:calc(var(--btn-border-width) * 3) solid var(--in-review);border-start-start-radius:var(--radius-md);border-end-start-radius:var(--radius-md)}.graph-task-active-indicator{display:flex;align-items:center;min-height:1.25rem;width:100%;padding-inline:var(--space-sm);background:rgba(var(--in-progress-rgb),.85);border-radius:var(--radius-sm) var(--radius-sm) 0 0;animation:graph-task-active-pulse calc(var(--transition-normal) * 8) ease-in-out infinite}.graph-task-active-indicator-text{font-family:var(--font-mono);font-size:.625rem;font-weight:600;line-height:1;letter-spacing:.04em;text-transform:uppercase;color:var(--card)}.graph-task-node .card{width:100%;height:100%}.graph-task-node[data-current-step="0"] .card-steps-list .card-step-item:nth-child(1),.graph-task-node[data-current-step="1"] .card-steps-list .card-step-item:nth-child(2),.graph-task-node[data-current-step="2"] .card-steps-list .card-step-item:nth-child(3),.graph-task-node[data-current-step="3"] .card-steps-list .card-step-item:nth-child(4),.graph-task-node[data-current-step="4"] .card-steps-list .card-step-item:nth-child(5),.graph-task-node[data-current-step="5"] .card-steps-list .card-step-item:nth-child(6),.graph-task-node[data-current-step="6"] .card-steps-list .card-step-item:nth-child(7),.graph-task-node[data-current-step="7"] .card-steps-list .card-step-item:nth-child(8),.graph-task-node[data-current-step="8"] .card-steps-list .card-step-item:nth-child(9),.graph-task-node[data-current-step="9"] .card-steps-list .card-step-item:nth-child(10),.graph-task-node[data-current-step="10"] .card-steps-list .card-step-item:nth-child(11),.graph-task-node[data-current-step="11"] .card-steps-list .card-step-item:nth-child(12),.graph-task-node[data-current-step="12"] .card-steps-list .card-step-item:nth-child(13),.graph-task-node[data-current-step="13"] .card-steps-list .card-step-item:nth-child(14),.graph-task-node[data-current-step="14"] .card-steps-list .card-step-item:nth-child(15),.graph-task-node[data-current-step="15"] .card-steps-list .card-step-item:nth-child(16),.graph-task-node[data-current-step="16"] .card-steps-list .card-step-item:nth-child(17),.graph-task-node[data-current-step="17"] .card-steps-list .card-step-item:nth-child(18),.graph-task-node[data-current-step="18"] .card-steps-list .card-step-item:nth-child(19),.graph-task-node[data-current-step="19"] .card-steps-list .card-step-item:nth-child(20){background:rgba(var(--in-progress-rgb),.15);border-left:calc(var(--btn-border-width) * 2) solid var(--in-progress);padding-left:var(--space-xs);font-weight:500}.graph-task-node[data-current-step="0"] .card-steps-list .card-step-item:nth-child(1) .card-step-dot,.graph-task-node[data-current-step="1"] .card-steps-list .card-step-item:nth-child(2) .card-step-dot,.graph-task-node[data-current-step="2"] .card-steps-list .card-step-item:nth-child(3) .card-step-dot,.graph-task-node[data-current-step="3"] .card-steps-list .card-step-item:nth-child(4) .card-step-dot,.graph-task-node[data-current-step="4"] .card-steps-list .card-step-item:nth-child(5) .card-step-dot,.graph-task-node[data-current-step="5"] .card-steps-list .card-step-item:nth-child(6) .card-step-dot,.graph-task-node[data-current-step="6"] .card-steps-list .card-step-item:nth-child(7) .card-step-dot,.graph-task-node[data-current-step="7"] .card-steps-list .card-step-item:nth-child(8) .card-step-dot,.graph-task-node[data-current-step="8"] .card-steps-list .card-step-item:nth-child(9) .card-step-dot,.graph-task-node[data-current-step="9"] .card-steps-list .card-step-item:nth-child(10) .card-step-dot,.graph-task-node[data-current-step="10"] .card-steps-list .card-step-item:nth-child(11) .card-step-dot,.graph-task-node[data-current-step="11"] .card-steps-list .card-step-item:nth-child(12) .card-step-dot,.graph-task-node[data-current-step="12"] .card-steps-list .card-step-item:nth-child(13) .card-step-dot,.graph-task-node[data-current-step="13"] .card-steps-list .card-step-item:nth-child(14) .card-step-dot,.graph-task-node[data-current-step="14"] .card-steps-list .card-step-item:nth-child(15) .card-step-dot,.graph-task-node[data-current-step="15"] .card-steps-list .card-step-item:nth-child(16) .card-step-dot,.graph-task-node[data-current-step="16"] .card-steps-list .card-step-item:nth-child(17) .card-step-dot,.graph-task-node[data-current-step="17"] .card-steps-list .card-step-item:nth-child(18) .card-step-dot,.graph-task-node[data-current-step="18"] .card-steps-list .card-step-item:nth-child(19) .card-step-dot,.graph-task-node[data-current-step="19"] .card-steps-list .card-step-item:nth-child(20) .card-step-dot{width:.5rem;height:.5rem;animation:graph-task-step-pulse calc(var(--transition-normal) * 10) ease-in-out infinite}@keyframes graph-task-active-pulse{0%,to{background:rgba(var(--in-progress-rgb),.85)}50%{background:rgba(var(--in-progress-rgb),.65)}}@keyframes graph-task-step-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.2);opacity:.75}}@media(max-width:768px){.graph-task-node{width:min(100%,var(--graph-task-node-mobile-width, calc(var(--space-2xl) * 8)))}.graph-task-node--active{transform:scale(1.005)}.graph-task-active-indicator{min-height:1.5rem;padding-inline:var(--space-md)}.graph-task-active-indicator-text{font-size:.6875rem}}.graph-node--highlighted{opacity:1;box-shadow:var(--shadow-glow)}.graph-node--dimmed{opacity:.25;transition:opacity var(--transition-fast)}.graph-edge--highlighted{opacity:1;stroke:var(--todo);stroke-width:var(--space-xs)}.graph-edge--dimmed{opacity:.15;transition:opacity var(--transition-fast)}@media(max-width:768px){.graph-node--dimmed,.graph-edge--dimmed{transition:opacity var(--transition-fast)}}.graph-node--draggable{cursor:grab;touch-action:none}.graph-node--dragging{z-index:3;cursor:grabbing;box-shadow:var(--shadow-lg);transform:scale(1.02);transition:transform var(--transition-fast),box-shadow var(--transition-fast),z-index var(--transition-fast)}.graph-toolbar{position:absolute;right:var(--space-md);bottom:var(--space-md);display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);background:var(--surface);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:10}.graph-toolbar__zoom-label{min-width:3.5ch;color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem;text-align:center}@media(max-width:768px){.graph-toolbar{right:var(--space-sm);bottom:var(--space-sm);padding:var(--space-md)}.graph-toolbar .btn-icon{min-width:calc(var(--space-xs) * 11);min-height:calc(var(--space-xs) * 11)}}.dependency-graph{position:relative;height:100%;padding:var(--space-md)}.dependency-graph__viewport{position:relative;overflow:hidden;height:100%;min-height:calc(var(--space-2xl) * 10);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface);touch-action:none}.graph-canvas-transform{position:relative;transform-origin:top left}.graph-canvas-transform--animate{transition:transform var(--transition-normal)}.dependency-graph__nodes-layer{position:relative;z-index:1}.dependency-graph__nodes-layer .graph-task-node{max-width:min(100%,calc(var(--space-2xl) * 9))}.dependency-graph-edges{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible}.dependency-graph__empty{color:var(--text-muted);display:flex;align-items:center;justify-content:center;height:100%}@media(max-width:768px){.dependency-graph{padding:var(--space-sm)}}
@@ -1,63 +0,0 @@
1
- import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{c as X}from"./createLucideIcon-BazL2hk5.js";/**
2
- * @license lucide-react v0.542.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const It=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],zt=X("arrow-left",It);/**
7
- * @license lucide-react v0.542.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const At=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],he=X("check",At);/**
12
- * @license lucide-react v0.542.0 - ISC
13
- *
14
- * This source code is licensed under the ISC license.
15
- * See the LICENSE file in the root directory of this source tree.
16
- */const Ot=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],Tt=X("chevron-up",Ot);/**
17
- * @license lucide-react v0.542.0 - ISC
18
- *
19
- * This source code is licensed under the ISC license.
20
- * See the LICENSE file in the root directory of this source tree.
21
- */const Pt=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],Ht=X("copy",Pt);/**
22
- * @license lucide-react v0.542.0 - ISC
23
- *
24
- * This source code is licensed under the ISC license.
25
- * See the LICENSE file in the root directory of this source tree.
26
- */const Bt=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],it=X("download",Bt);/**
27
- * @license lucide-react v0.542.0 - ISC
28
- *
29
- * This source code is licensed under the ISC license.
30
- * See the LICENSE file in the root directory of this source tree.
31
- */const Gt=[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]],Xe=X("grip-vertical",Gt);/**
32
- * @license lucide-react v0.542.0 - ISC
33
- *
34
- * This source code is licensed under the ISC license.
35
- * See the LICENSE file in the root directory of this source tree.
36
- */const Lt=[["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m16.2 7.8 2.9-2.9",key:"r700ao"}],["path",{d:"M18 12h4",key:"wj9ykh"}],["path",{d:"m16.2 16.2 2.9 2.9",key:"1bxg5t"}],["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"m4.9 19.1 2.9-2.9",key:"bwix9q"}],["path",{d:"M2 12h4",key:"j09sii"}],["path",{d:"m4.9 4.9 2.9 2.9",key:"giyufr"}]],Vt=X("loader",Lt);/**
37
- * @license lucide-react v0.542.0 - ISC
38
- *
39
- * This source code is licensed under the ISC license.
40
- * See the LICENSE file in the root directory of this source tree.
41
- */const Jt=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],$e=X("pencil",Jt);/**
42
- * @license lucide-react v0.542.0 - ISC
43
- *
44
- * This source code is licensed under the ISC license.
45
- * See the LICENSE file in the root directory of this source tree.
46
- */const Ut=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],Te=X("plus",Ut);/**
47
- * @license lucide-react v0.542.0 - ISC
48
- *
49
- * This source code is licensed under the ISC license.
50
- * See the LICENSE file in the root directory of this source tree.
51
- */const Kt=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],ht=X("sparkles",Kt);/**
52
- * @license lucide-react v0.542.0 - ISC
53
- *
54
- * This source code is licensed under the ISC license.
55
- * See the LICENSE file in the root directory of this source tree.
56
- */const qt=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],Ve=X("trash-2",qt);/**
57
- * @license lucide-react v0.542.0 - ISC
58
- *
59
- * This source code is licensed under the ISC license.
60
- * See the LICENSE file in the root directory of this source tree.
61
- */const Wt=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],oe=X("x",Wt),Yt="/api/plugins/roadmap-planner";async function z(a,r){const d=await fetch(`${Yt}${a}`,{headers:{"Content-Type":"application/json",...r?.headers??{}},...r});if(!d.ok){let g=`${d.status} ${d.statusText}`;try{const _=await d.json();_.error&&(g=_.error)}catch{}throw new Error(g)}if(d.status!==204)return await d.json()}function A(a){return a?`?projectId=${encodeURIComponent(a)}`:""}function Xt(a){return z(`/roadmaps${A(a)}`)}function Qt(a,r){return z(`/roadmaps/${a}${A(r)}`)}function Zt(a,r){return z(`/roadmaps${A(r)}`,{method:"POST",body:JSON.stringify({...a,projectId:r})})}function ea(a,r,d){return z(`/roadmaps/${a}${A(d)}`,{method:"PATCH",body:JSON.stringify({...r,projectId:d})})}function ta(a,r){return z(`/roadmaps/${a}${A(r)}`,{method:"DELETE"})}function st(a,r,d){return z(`/roadmaps/${a}/milestones${A(d)}`,{method:"POST",body:JSON.stringify({...r,projectId:d})})}function aa(a,r,d){return z(`/roadmaps/milestones/${a}${A(d)}`,{method:"PATCH",body:JSON.stringify({...r,projectId:d})})}function ra(a,r){return z(`/roadmaps/milestones/${a}${A(r)}`,{method:"DELETE"})}function sa(a,r,d){return z(`/roadmaps/${a}/milestones/reorder${A(d)}`,{method:"POST",body:JSON.stringify({orderedMilestoneIds:r,projectId:d})})}function nt(a,r,d){return z(`/roadmaps/milestones/${a}/features${A(d)}`,{method:"POST",body:JSON.stringify({...r,projectId:d})})}function na(a,r,d){return z(`/roadmaps/features/${a}${A(d)}`,{method:"PATCH",body:JSON.stringify({...r,projectId:d})})}function ia(a,r){return z(`/roadmaps/features/${a}${A(r)}`,{method:"DELETE"})}function oa(a,r,d){return z(`/roadmaps/milestones/${a}/features/reorder${A(d)}`,{method:"POST",body:JSON.stringify({orderedFeatureIds:r,projectId:d})})}function la(a,r,d,g){return z(`/roadmaps/features/${a}/move${A(g)}`,{method:"POST",body:JSON.stringify({targetMilestoneId:r,targetIndex:d,projectId:g})})}function da(a,r,d=5,g){return z(`/roadmaps/${a}/suggestions/milestones${A(g)}`,{method:"POST",body:JSON.stringify({goalPrompt:r,count:d,projectId:g})})}function ca(a,r,d){return z(`/roadmaps/milestones/${a}/suggestions/features${A(d)}`,{method:"POST",body:JSON.stringify({...r,projectId:d})})}function ua(a,r){return z(`/roadmaps/${a}/handoff${A(r)}`)}function ma(a){const r=a?.projectId,[d,g]=s.useState([]),[_,j]=s.useState(null),[N,f]=s.useState(null),[E,D]=s.useState([]),[y,S]=s.useState({}),[O,Q]=s.useState(!1),[J,I]=s.useState(null),[le,fe]=s.useState(null),[Je,ve]=s.useState(!1),[be,ae]=s.useState(null),[xe,B]=s.useState([]),[P,G]=s.useState(!1),[we,L]=s.useState({}),[de,re]=s.useState({}),Z=s.useRef(we),_e=s.useRef(de),ce=s.useRef(xe);Z.current=we,_e.current=de,ce.current=xe;const je=s.useRef(r),M=s.useRef(0),ue=s.useRef(0),ye=s.useRef(d),x=s.useRef(_),me=s.useRef(E),Ce=s.useRef(y),$=s.useRef(r),Pe=s.useRef(le);ye.current=d,x.current=_,me.current=E,Ce.current=y,$.current=r,Pe.current=le,s.useEffect(()=>{je.current!==r&&(je.current=r,M.current++,j(null),f(null),D([]),S({}),fe(null),ae(null),B([]),G(!1),L({}),re({}))},[r]);const ee=s.useCallback(async()=>{Q(!0),I(null);try{const n=await Xt(r);g(n)}catch(n){I(n instanceof Error?n:new Error("Failed to fetch roadmaps"))}finally{Q(!1)}},[r]),C=s.useCallback(async n=>{try{const c=await Qt(n,r);f(c),D(c.milestones||[]);const o={};for(const i of c.milestones||[])o[i.id]=i.features||[];S(o)}catch(c){I(c instanceof Error?c:new Error("Failed to fetch roadmap"))}},[r]);s.useEffect(()=>{ee()},[ee]),s.useEffect(()=>{_?C(_):(f(null),D([]),S({}))},[_,C]);const He=s.useCallback(async(n,c)=>{try{const o=await Zt(n,$.current);g(i=>[...i,o]),c?.onSuccess?.()}catch(o){const i=o instanceof Error?o:new Error("Failed to create roadmap");throw c?.onError?.(i),i}},[]),Ne=s.useCallback(async(n,c,o)=>{try{const i=await ea(n,c,$.current);g(u=>u.map(l=>l.id===n?i:l)),x.current===n&&f(u=>u?{...u,...i}:null),o?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to update roadmap");throw o?.onError?.(u),u}},[]),Be=s.useCallback(async(n,c)=>{try{await ta(n,$.current),g(o=>o.filter(i=>i.id!==n)),x.current===n&&(j(null),f(null),D([]),S({})),c?.onSuccess?.()}catch(o){const i=o instanceof Error?o:new Error("Failed to delete roadmap");throw c?.onError?.(i),i}},[]),Ue=s.useCallback(n=>{j(n)},[]),h=s.useCallback(async(n,c)=>{const o=x.current;if(!o){const i=new Error("No roadmap selected");throw c?.onError?.(i),i}try{const i=await st(o,n,$.current);D(u=>[...u,i]),S(u=>({...u,[i.id]:[]})),x.current&&C(x.current),c?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to create milestone");throw c?.onError?.(u),u}},[C]),R=s.useCallback(async(n,c,o)=>{try{const i=await aa(n,c,$.current);D(u=>u.map(l=>l.id===n?i:l)),x.current&&C(x.current),o?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to update milestone");throw o?.onError?.(u),u}},[C]),se=s.useCallback(async(n,c)=>{try{await ra(n,$.current),D(o=>o.filter(i=>i.id!==n)),S(o=>{const i={...o};return delete i[n],i}),x.current&&C(x.current),c?.onSuccess?.()}catch(o){const i=o instanceof Error?o:new Error("Failed to delete milestone");throw c?.onError?.(i),i}},[C]),Ke=s.useCallback(async(n,c,o)=>{try{const i=await nt(n,c,$.current);S(u=>({...u,[n]:[...u[n]||[],i]})),x.current&&C(x.current),o?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to create feature");throw o?.onError?.(u),u}},[C]),Re=s.useCallback(async(n,c,o)=>{try{const i=await na(n,c,$.current);S(u=>{const l={};for(const[v,p]of Object.entries(u))l[v]=p.map(w=>w.id===n?i:w);return l}),x.current&&C(x.current),o?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to update feature");throw o?.onError?.(u),u}},[C]),Ie=s.useCallback(async(n,c)=>{try{await ia(n,$.current),S(o=>{const i={};for(const[u,l]of Object.entries(o))i[u]=l.filter(v=>v.id!==n);return i}),x.current&&C(x.current),c?.onSuccess?.()}catch(o){const i=o instanceof Error?o:new Error("Failed to delete feature");throw c?.onError?.(i),i}},[C]),k=s.useCallback(async(n,c,o)=>{const i=me.current,u=c.map(l=>i.find(v=>v.id===l)).filter(l=>l!==void 0).map((l,v)=>({...l,orderIndex:v}));D(u);try{await sa(n,c,$.current),x.current&&C(x.current),o?.onSuccess?.()}catch(l){D(i);const v=l instanceof Error?l:new Error("Failed to reorder milestones");throw o?.onError?.(v),v}},[C]),pe=s.useCallback(async(n,c,o)=>{const i=Ce.current[n]||[],u=i.map(p=>p.id);if(JSON.stringify(u)===JSON.stringify(c)){o?.onSuccess?.();return}const l=Ce.current,v=c.map(p=>i.find(w=>w.id===p)).filter(p=>p!==void 0).map((p,w)=>({...p,orderIndex:w}));S(p=>({...p,[n]:v}));try{await oa(n,c,$.current),x.current&&C(x.current),o?.onSuccess?.()}catch(p){S(l);const w=p instanceof Error?p:new Error("Failed to reorder features");throw o?.onError?.(w),w}},[C]),te=s.useCallback(async(n,c,o,i)=>{const u=Ce.current;let l=null;for(const[F,W]of Object.entries(u))if(W.some(We=>We.id===n)){l=F;break}if(!l){const F=new Error("Feature not found");throw i?.onError?.(F),F}if(l===c){const F=u[l]||[],W=Math.max(0,Math.min(o,F.length-1));if(F.findIndex(Ye=>Ye.id===n)===W){i?.onSuccess?.();return}}const v=u[l]||[],p=u[c]||[],w=v.find(F=>F.id===n);if(!w){const F=new Error("Feature not found");throw i?.onError?.(F),F}const H=v.filter(F=>F.id!==n).map((F,W)=>({...F,orderIndex:W})),Ee={...w,milestoneId:c,orderIndex:o},ie=[...p];ie.splice(o,0,Ee);const qe=ie.map((F,W)=>({...F,orderIndex:W}));S(l===c?F=>({...F,[l]:qe}):F=>({...F,[l]:H,[c]:qe}));try{await la(n,c,o,r),x.current&&C(x.current),i?.onSuccess?.()}catch(F){S(u);const W=F instanceof Error?F:new Error("Failed to move feature");throw i?.onError?.(W),W}},[C,r]);function U(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`draft-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}const ne=s.useCallback(async(n,c=5,o)=>{const i=x.current;if(!i){const v=new Error("No roadmap selected");throw o?.onError?.(v),v}const u=M.current,l=$.current;G(!0);try{const v=await da(i,n,c,l);if(M.current!==u)return;const p=v.suggestions.map(w=>({id:U(),title:w.title,description:w.description}));B(p),o?.onSuccess?.()}catch(v){if(M.current!==u)return;const p=v instanceof Error?v:new Error("Failed to generate suggestions");throw o?.onError?.(p),p}finally{M.current===u&&G(!1)}},[]),ze=s.useCallback((n,c)=>{const i=ce.current.map(u=>u.id===n?{...u,...c}:u);ce.current=i,B(u=>u.map(l=>l.id===n?{...l,...c}:l))},[]),K=s.useCallback(async(n,c)=>{const o=x.current;if(!o){const p=new Error("No roadmap selected");throw c?.onError?.(p),p}const i=M.current,u=ce.current,l=u.findIndex(p=>p.id===n);if(l===-1){const p=new Error("Suggestion draft not found");throw c?.onError?.(p),p}const v=u[l];if(!v.title.trim()){const p=new Error("Title cannot be empty");throw c?.onError?.(p),p}B(p=>p.filter(w=>w.id!==n));try{if(await st(o,{title:v.title,description:v.description},$.current),M.current!==i){B(p=>{const w=[...p];return w.splice(l,0,v),w});return}x.current&&C(x.current),c?.onSuccess?.()}catch(p){B(H=>{const Ee=[...H];return Ee.splice(l,0,v),Ee});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw c?.onError?.(w),w}},[C]),q=s.useCallback(async n=>{const c=x.current;if(!c){const l=new Error("No roadmap selected");throw n?.onError?.(l),l}const o=[...ce.current];if(o.length===0)return;const i=o.findIndex(l=>!l.title.trim());if(i!==-1){const l=new Error(`Title cannot be empty at position ${i+1}`);throw n?.onError?.(l),l}B([]);const u=M.current;for(let l=0;l<o.length&&M.current===u;l++){const v=o[l];try{await st(c,{title:v.title,description:v.description},$.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw n?.onError?.(w),w}}M.current===u&&(x.current&&C(x.current),n?.onSuccess?.())},[C]),Qe=s.useCallback(n=>_e.current[n]??!1,[]),Ge=s.useCallback(async(n,c,o)=>{const i=M.current,u=$.current;re(l=>({...l,[n]:!0}));try{const l=await ca(n,c,u);if(M.current!==i)return;const v=l.suggestions.map(p=>({id:U(),title:p.title,description:p.description}));L(p=>({...p,[n]:v})),o?.onSuccess?.()}catch(l){if(M.current!==i)return;const v=l instanceof Error?l:new Error("Failed to generate feature suggestions");throw o?.onError?.(v),v}finally{M.current===i&&re(l=>({...l,[n]:!1}))}},[]),Se=s.useCallback((n,c,o)=>{const u=(Z.current[n]||[]).map(l=>l.id===c?{...l,...o}:l);Z.current={...Z.current,[n]:u},L(l=>({...l,[n]:l[n]?.map(v=>v.id===c?{...v,...o}:v)||[]}))},[]),Le=s.useCallback(async(n,c,o)=>{const i=M.current,u=Z.current[n]||[],l=u.findIndex(p=>p.id===c);if(l===-1){const p=new Error("Suggestion draft not found");throw o?.onError?.(p),p}const v=u[l];if(!v.title.trim()){const p=new Error("Title cannot be empty");throw o?.onError?.(p),p}L(p=>({...p,[n]:p[n]?.filter(w=>w.id!==c)||[]}));try{if(await nt(n,{title:v.title,description:v.description},$.current),M.current!==i){L(p=>{const H=[...p[n]||[]];return H.splice(l,0,v),{...p,[n]:H}});return}x.current&&C(x.current),o?.onSuccess?.()}catch(p){L(H=>{const ie=[...H[n]||[]];return ie.splice(l,0,v),{...H,[n]:ie}});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw o?.onError?.(w),w}},[C]),Ze=s.useCallback(async(n,c)=>{const o=[...Z.current[n]||[]];if(o.length===0)return;const i=o.findIndex(l=>!l.title.trim());if(i!==-1){const l=new Error(`Title cannot be empty at position ${i+1}`);throw c?.onError?.(l),l}L(l=>({...l,[n]:[]}));const u=M.current;for(let l=0;l<o.length&&M.current===u;l++){const v=o[l];try{await nt(n,{title:v.title,description:v.description},$.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw c?.onError?.(w),w}}M.current===u&&(x.current&&C(x.current),c?.onSuccess?.())},[C]),ke=s.useCallback(()=>{B([]),G(!1)},[]),et=s.useCallback(n=>{L(c=>{const o={...c};return delete o[n],o}),re(c=>{const o={...c};return delete o[n],o})},[]),ge=s.useCallback(async(n,c)=>{const o=++ue.current,i=r;ve(!0),ae(null);try{const u=await ua(n,i);if(ue.current!==o||r!==i)return;fe(u),c?.onSuccess?.()}catch(u){if(ue.current!==o||r!==i)return;const l=u instanceof Error?u:new Error(String(u));ae(l),fe(null),c?.onError?.(l)}finally{ue.current===o&&ve(!1)}},[r]),Ae=s.useCallback(()=>{fe(null),ae(null),ve(!1)},[]),tt=s.useCallback(async()=>{await ee(),x.current&&await C(x.current)},[ee,C]);return{roadmaps:d,selectedRoadmapId:_,selectedRoadmap:N,milestones:E,featuresByMilestoneId:y,loading:O,error:J,createRoadmap:He,updateRoadmap:Ne,deleteRoadmap:Be,selectRoadmap:Ue,createMilestone:h,updateMilestone:R,deleteMilestone:se,reorderMilestones:k,createFeature:Ke,updateFeature:Re,deleteFeature:Ie,reorderFeatures:pe,moveFeature:te,milestoneSuggestions:xe,isGeneratingSuggestions:P,generateMilestoneSuggestions:ne,updateMilestoneSuggestionDraft:ze,acceptMilestoneSuggestion:K,acceptAllMilestoneSuggestions:q,clearMilestoneSuggestions:ke,featureSuggestionsByMilestoneId:we,isGeneratingFeatureSuggestions:Qe,generateFeatureSuggestions:Ge,updateFeatureSuggestionDraft:Se,acceptFeatureSuggestion:Le,acceptAllFeatureSuggestions:Ze,clearFeatureSuggestions:et,handoffPayload:le,isFetchingHandoff:Je,handoffError:be,fetchHandoff:ge,clearHandoff:Ae,refresh:tt}}function pt(){return typeof window>"u"?"desktop":window.matchMedia("(max-width: 768px)").matches?"mobile":window.matchMedia("(min-width: 769px) and (max-width: 1024px)").matches?"tablet":"desktop"}function pa(){const[a,r]=s.useState(()=>pt());return s.useEffect(()=>{const d=()=>r(pt());return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d)},[]),a}function ga(){return{confirm:async a=>{const r=typeof a=="string"?a:[a.title,a.message].filter(Boolean).join(`
62
-
63
- `);return window.confirm(r||"Are you sure?")}}}function ha({isOpen:a,onClose:r,roadmapTitle:d,handoffPayload:g,isLoading:_,error:j,onFetchHandoff:N,onCopyToClipboard:f}){return a?e.jsx("div",{className:"modal-overlay open",onClick:r,role:"presentation",children:e.jsxs("div",{className:"modal modal-lg",onClick:E=>E.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":"handoff-modal-title",children:[e.jsxs("div",{className:"modal-header",children:[e.jsxs("h2",{id:"handoff-modal-title",children:["Export Roadmap: ",d]}),e.jsx("button",{className:"modal-close",onClick:r,"aria-label":"Close modal",children:e.jsx(oe,{size:18})})]}),e.jsxs("div",{className:"modal-body",children:[e.jsx("p",{className:"text-muted roadmaps-view__handoff-intro",children:"Export roadmap data for use in mission and task planning flows. This is a read-only export — no missions or tasks will be created."}),j&&e.jsxs("div",{className:"form-error roadmaps-view__handoff-error",children:["Error loading handoff data: ",j.message]}),!g&&!_&&e.jsx("div",{className:"roadmaps-view__handoff-empty-state",children:e.jsxs("button",{className:"btn btn-primary",onClick:N,children:[e.jsx(it,{size:16,className:"roadmaps-view__handoff-button-icon"}),"Load Handoff Data"]})}),_&&e.jsxs("div",{className:"roadmaps-view__handoff-loading-state",children:[e.jsx(Vt,{size:24,className:"spin"}),e.jsx("p",{className:"roadmaps-view__handoff-loading-text",children:"Loading handoff data..."})]}),g&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__handoff-section",children:[e.jsx("h3",{className:"roadmaps-view__handoff-section-title",children:"Mission Planning Handoff"}),e.jsx("div",{className:"card roadmaps-view__handoff-card",children:e.jsx("pre",{className:"roadmaps-view__handoff-pre roadmaps-view__handoff-pre--mission",children:JSON.stringify(g.mission,null,2)})})]}),e.jsxs("div",{className:"roadmaps-view__handoff-section",children:[e.jsxs("h3",{className:"roadmaps-view__handoff-section-title",children:["Feature Task Planning Handoffs (",g.features.length,")"]}),e.jsx("div",{className:"card roadmaps-view__handoff-card",children:e.jsx("pre",{className:"roadmaps-view__handoff-pre roadmaps-view__handoff-pre--features",children:JSON.stringify(g.features,null,2)})})]})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("div",{className:"modal-actions-left",children:g&&e.jsxs("button",{className:"btn btn-sm",onClick:f,children:[e.jsx(Ht,{size:14,className:"roadmaps-view__handoff-copy-icon"}),"Copy to Clipboard"]})}),e.jsx("div",{className:"modal-actions-right",children:e.jsx("button",{className:"btn",onClick:r,children:"Close"})})]})]})}):null}function fa({roadmap:a,isSelected:r,onSelect:d,onEdit:g,onDelete:_,onExport:j}){const N=y=>{y.key==="Enter"&&d()},f=y=>{y.stopPropagation(),g()},E=y=>{y.stopPropagation(),_()},D=y=>{y.stopPropagation(),j()};return e.jsxs("div",{className:`roadmaps-view__sidebar-item${r?" roadmaps-view__sidebar-item--active":""}`,onClick:d,onKeyDown:N,role:"button",tabIndex:0,"aria-selected":r,"data-testid":`roadmap-item-${a.id}`,children:[e.jsxs("div",{className:"roadmaps-view__sidebar-item-content",children:[e.jsx("div",{className:"roadmaps-view__sidebar-item-title",children:a.title}),a.description&&e.jsx("div",{className:"roadmaps-view__sidebar-item-desc",children:a.description})]}),e.jsxs("div",{className:"roadmaps-view__sidebar-item-actions",onClick:f,role:"presentation",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:D,title:"Export roadmap","aria-label":"Export roadmap","data-testid":`roadmap-export-${a.id}`,type:"button",children:e.jsx(it,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:f,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`roadmap-edit-${a.id}`,type:"button",children:e.jsx($e,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:E,title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`roadmap-delete-${a.id}`,type:"button",children:e.jsx(Ve,{size:14})})]})]})}function va({roadmaps:a,selectedRoadmapId:r,onSelect:d,onCreate:g,onEdit:_,onDelete:j,onExport:N,showCreateForm:f,onCancelCreate:E,onSaveCreate:D}){return e.jsxs("div",{className:"roadmaps-view__mobile-list","data-testid":"roadmaps-view__mobile-list",children:[e.jsxs("div",{className:"roadmaps-view__mobile-list-header",children:[e.jsx("h2",{className:"roadmaps-view__mobile-list-title",children:"Roadmaps"}),!f&&e.jsx("button",{className:"roadmaps-view__mobile-add-btn",onClick:g,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-create-roadmap-btn",children:e.jsx(Te,{size:18})})]}),f&&e.jsx("div",{className:"roadmaps-view__mobile-create-form",children:e.jsx(ft,{onSave:D,onCancel:E})}),a.length===0&&!f?e.jsxs("div",{className:"roadmaps-view__mobile-empty",children:[e.jsx("p",{children:"No roadmaps yet."}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:g,children:[e.jsx(Te,{size:14}),e.jsx("span",{children:"Create Roadmap"})]})]}):e.jsx("div",{className:"roadmaps-view__mobile-list-items",children:a.map(y=>e.jsxs("div",{className:`roadmaps-view__mobile-item${y.id===r?" roadmaps-view__mobile-item--active":""}`,onClick:()=>d(y.id),role:"button",tabIndex:0,onKeyDown:S=>{S.key==="Enter"&&d(y.id)},"data-testid":`mobile-roadmap-item-${y.id}`,children:[e.jsxs("div",{className:"roadmaps-view__mobile-item-content",children:[e.jsx("span",{className:"roadmaps-view__mobile-item-title",children:y.title}),y.description&&e.jsx("span",{className:"roadmaps-view__mobile-item-desc",children:y.description})]}),e.jsxs("div",{className:"roadmaps-view__mobile-item-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:S=>{S.stopPropagation(),N(y)},title:"Export roadmap","aria-label":"Export roadmap","data-testid":`mobile-roadmap-export-${y.id}`,children:e.jsx(it,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:S=>{S.stopPropagation(),_(y)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`mobile-roadmap-edit-${y.id}`,children:e.jsx($e,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:S=>{S.stopPropagation(),j(y.id)},title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`mobile-roadmap-delete-${y.id}`,children:e.jsx(Ve,{size:16})})]})]},y.id))})]})}function ba({roadmapTitle:a,onBack:r,onEdit:d,onDelete:g,onCreate:_}){return e.jsxs("div",{className:"roadmaps-view__mobile-header","data-testid":"roadmaps-view__mobile-header",children:[e.jsx("button",{className:"roadmaps-view__mobile-back-btn",onClick:r,title:"Back to roadmap list","aria-label":"Back to roadmap list","data-testid":"mobile-back-btn",children:e.jsx(zt,{size:20})}),e.jsx("h2",{className:"roadmaps-view__mobile-header-title",children:a}),e.jsxs("div",{className:"roadmaps-view__mobile-header-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:_,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-header-create-btn",children:e.jsx(Te,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:d,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"mobile-header-edit-btn",children:e.jsx($e,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:g,title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"mobile-header-delete-btn",children:e.jsx(Ve,{size:18})})]})]})}function xa({milestone:a,features:r,onEditMilestone:d,onDeleteMilestone:g,onAddFeature:_,onEditFeature:j,onDeleteFeature:N,milestoneEdit:f,onMilestoneEditChange:E,onMilestoneEditFieldChange:D,onCancelMilestoneEdit:y,onSaveMilestoneEdit:S,featureEdit:O,onFeatureEditChange:Q,onStartFeatureEdit:J,onCancelFeatureEdit:I,onSaveFeatureEdit:le,projectId:fe,addToast:Je,isMilestoneDragging:ve,isMilestoneDropTarget:be,milestoneDropPosition:ae,onMilestoneDragStart:xe,onMilestoneDragEnd:B,onMilestoneDragOver:P,onMilestoneDrop:G,onMilestoneDragLeave:we,isFeatureDragging:L,isFeatureDropTarget:de,featureDropIndex:re,onFeatureDragStart:Z,onFeatureDragEnd:_e,onFeatureDragOver:ce,onFeatureDrop:je,onFeatureDragLeave:M,onFeatureDropOnMilestone:ue,featureSuggestions:ye,isGeneratingFeatureSuggestions:x,onGenerateFeatureSuggestions:me,onAcceptFeatureSuggestion:Ce,onAcceptAllFeatureSuggestions:$,onUpdateFeatureSuggestionDraft:Pe,onClearFeatureSuggestions:ee}){const C=f?.milestoneId===a.id,He=h=>{h.key==="Enter"?(h.preventDefault(),f&&S({title:f.value})):h.key==="Escape"&&y()},Ne=h=>{h.key==="Escape"&&y()},Be=["roadmaps-view__milestone",ve?"roadmaps-view__milestone--dragging":"",be?"roadmaps-view__milestone--drop-target":"",be&&ae==="before"?"roadmaps-view__milestone--drop-before":"",be&&ae==="after"?"roadmaps-view__milestone--drop-after":""].filter(Boolean).join(" "),Ue=["roadmaps-view__feature-list",de?"roadmaps-view__feature-list--drop-target":""].filter(Boolean).join(" ");return e.jsxs("div",{className:Be,draggable:!C,onDragStart:h=>{C||(xe(a.id),h.dataTransfer.setData("text/plain",`milestone:${a.id}`),h.dataTransfer.effectAllowed="move")},onDragEnd:B,onDragOver:h=>{h.dataTransfer.types.includes("text/plain")&&h.dataTransfer.types.includes("text/plain")&&(h.preventDefault(),h.dataTransfer.dropEffect="move",P(a.id))},onDrop:h=>{h.preventDefault(),h.dataTransfer.getData("text/plain")?.startsWith("feature:")||G(a.id)},onDragLeave:we,"data-testid":`milestone-card-${a.id}`,children:[e.jsx("div",{className:"roadmaps-view__milestone-header",children:C&&f?e.jsxs("div",{className:"roadmaps-view__inline-edit",children:[e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${a.id}`,children:e.jsx(Xe,{size:14})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:f.value,onChange:h=>{D("title"),E(h.target.value)},onKeyDown:He,placeholder:"Milestone title",autoFocus:!0,"data-testid":`milestone-title-input-${a.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>S({title:f.value}),"aria-label":"Save milestone title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:y,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(oe,{size:14})})]}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:f.field==="description"?f.value:a.description||"",onChange:h=>{D("description"),E(h.target.value)},onKeyDown:Ne,placeholder:"Milestone description (optional)",rows:2,"data-testid":`milestone-desc-input-${a.id}`})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__milestone-title-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${a.id}`,children:e.jsx(Xe,{size:14})}),e.jsx("h3",{className:"roadmaps-view__milestone-title",children:a.title}),e.jsxs("div",{className:"roadmaps-view__milestone-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:d,title:"Edit milestone","aria-label":"Edit milestone","data-testid":`milestone-edit-${a.id}`,children:e.jsx($e,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:g,title:"Delete milestone","aria-label":"Delete milestone","data-testid":`milestone-delete-${a.id}`,children:e.jsx(Ve,{size:14})})]})]}),a.description&&e.jsx("p",{className:"roadmaps-view__milestone-desc",children:a.description})]})}),e.jsxs("div",{className:"roadmaps-view__milestone-actions-bar",children:[e.jsxs("button",{className:"roadmaps-view__add-feature-btn",onClick:_,title:"Add feature","aria-label":"Add feature","data-testid":`add-feature-${a.id}`,children:[e.jsx(Te,{size:12}),e.jsx("span",{children:"Add Feature"})]}),e.jsxs("button",{className:"roadmaps-view__suggest-btn",onClick:()=>{me?.()},disabled:x??!1,title:"Generate feature suggestions with AI","aria-label":"Generate feature suggestions","data-testid":`generate-features-${a.id}`,children:[e.jsx(ht,{size:12}),e.jsx("span",{children:x?"Generating...":"AI Suggestions"})]})]}),e.jsxs("div",{className:Ue,onDragOver:h=>{h.preventDefault(),h.dataTransfer.dropEffect="move",h.dataTransfer.getData("text/plain")?.startsWith("feature:")&&ue()},onDrop:h=>{h.preventDefault();const R=h.dataTransfer.getData("text/plain");R?.startsWith("feature:")&&je(R.split(":")[1],r.length)},onDragLeave:M,children:[r.length===0?e.jsx("p",{className:"roadmaps-view__empty-features",children:"No features yet."}):r.map((h,R)=>{const se=O?.featureId===h.id,Ke=L(h.id),Re=k=>{k.key==="Enter"?(k.preventDefault(),O&&le({title:O.value})):k.key==="Escape"&&I()},Ie=["roadmaps-view__feature-item",Ke?"roadmaps-view__feature-item--dragging":"",de&&re===R?"roadmaps-view__feature-item--drop-before":"",de&&re===R+1?"roadmaps-view__feature-item--drop-after":""].filter(Boolean).join(" ");return e.jsx("div",{className:Ie,draggable:!se,onDragStart:k=>{se||(Z(h.id,a.id),k.dataTransfer.setData("text/plain",`feature:${h.id}`),k.dataTransfer.effectAllowed="move")},onDragEnd:_e,onDragOver:k=>{if(k.preventDefault(),k.stopPropagation(),k.dataTransfer.dropEffect="move",k.dataTransfer.getData("text/plain")?.startsWith("feature:")){const te=k.currentTarget.getBoundingClientRect(),U=te.top+te.height/2,ne=k.clientY<U?"before":"after";ce(h.id,ne)}},onDrop:k=>{k.preventDefault(),k.stopPropagation();const pe=k.dataTransfer.getData("text/plain");if(pe?.startsWith("feature:")){const te=pe.split(":")[1],U=k.currentTarget.getBoundingClientRect(),ne=U.top+U.height/2,ze=k.clientY<ne?"before":"after";let K=R;ze==="after"&&(K=R+1),je(te,K)}},onDragLeave:M,"data-testid":`feature-item-${h.id}`,children:se&&O?e.jsx("div",{className:"roadmaps-view__inline-edit roadmaps-view__inline-edit--compact",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Xe,{size:12})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:O.value,onChange:k=>Q(k.target.value),onKeyDown:Re,placeholder:"Feature title",autoFocus:!0,"data-testid":`feature-title-input-${h.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>le({title:O.value}),"aria-label":"Save feature title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:I,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(oe,{size:14})})]})}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Xe,{size:12})}),e.jsxs("div",{className:"roadmaps-view__feature-content",children:[e.jsx("span",{className:"roadmaps-view__feature-title",children:h.title}),h.description&&e.jsx("p",{className:"roadmaps-view__feature-desc",children:h.description})]}),e.jsxs("div",{className:"roadmaps-view__feature-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>j(h.id),title:"Edit feature","aria-label":"Edit feature","data-testid":`feature-edit-${h.id}`,children:e.jsx($e,{size:12})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>N(h.id),title:"Delete feature","aria-label":"Delete feature","data-testid":`feature-delete-${h.id}`,children:e.jsx(Ve,{size:12})})]})]})},h.id)}),ye&&ye.length>0&&e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h4",{className:"roadmap-suggestion-title",children:"AI Feature Suggestions"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-accept-all-btn",onClick:()=>$?.(),title:"Accept all suggestions","aria-label":"Accept all","data-testid":`accept-all-features-${a.id}`,children:"Accept All"}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:()=>ee?.(),title:"Clear suggestions","aria-label":"Clear","data-testid":`clear-features-${a.id}`,children:"Clear"})]})]}),e.jsx("div",{className:"roadmap-suggestion-list",children:ye.map(h=>e.jsx(wa,{suggestion:h,onUpdateDraft:R=>Pe?.(a.id,h.id,R),onAccept:()=>{Ce?.(a.id,h.id)},testIdPrefix:`feature-suggestion-${a.id}`},h.id))})]})]})]})}function wa({suggestion:a,onUpdateDraft:r,onAccept:d,testIdPrefix:g}){const[_,j]=s.useState(!1),[N,f]=s.useState(a.title),[E,D]=s.useState(a.description||""),y=()=>{f(a.title),D(a.description||""),j(!0)},S=()=>{r({title:N.trim(),description:E.trim()||void 0}),j(!1)},O=()=>{f(a.title),D(a.description||""),j(!1)},Q=()=>{a.title.trim()&&d()},J=a.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:N,onChange:I=>f(I.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":`${g}-${a.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:E,onChange:I=>D(I.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${g}-${a.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:S,disabled:!N.trim(),title:"Save","data-testid":`${g}-${a.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:O,title:"Cancel","data-testid":`${g}-${a.id}-cancel`,children:e.jsx(oe,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${g}-${a.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:a.title}),a.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:a.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:y,title:"Edit suggestion","aria-label":"Edit","data-testid":`${g}-${a.id}-edit`,children:e.jsx($e,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:Q,disabled:!J,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${g}-${a.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function gt({suggestion:a,onUpdateDraft:r,onAccept:d,testIdPrefix:g}){const[_,j]=s.useState(!1),[N,f]=s.useState(a.title),[E,D]=s.useState(a.description||""),y=()=>{f(a.title),D(a.description||""),j(!0)},S=()=>{r({title:N.trim(),description:E.trim()||void 0}),j(!1)},O=()=>{f(a.title),D(a.description||""),j(!1)},Q=()=>{a.title.trim()&&d()},J=a.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:N,onChange:I=>f(I.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":`${g}-${a.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:E,onChange:I=>D(I.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${g}-${a.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:S,disabled:!N.trim(),title:"Save","data-testid":`${g}-${a.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:O,title:"Cancel","data-testid":`${g}-${a.id}-cancel`,children:e.jsx(oe,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${g}-${a.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:a.title}),a.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:a.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:y,title:"Edit suggestion","aria-label":"Edit","data-testid":`${g}-${a.id}-edit`,children:e.jsx($e,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:Q,disabled:!J,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${g}-${a.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function ft({onSave:a,onCancel:r}){const[d,g]=s.useState(""),[_,j]=s.useState(""),N=f=>{f.preventDefault(),d.trim()&&a({title:d.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form","data-testid":"create-roadmap-form",children:e.jsxs("form",{onSubmit:N,children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:d,onChange:f=>g(f.target.value),placeholder:"Roadmap title",autoFocus:!0,"data-testid":"create-roadmap-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:f=>j(f.target.value),placeholder:"Roadmap description (optional)",rows:2,"data-testid":"create-roadmap-description"}),e.jsxs("div",{className:"roadmaps-view__create-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__btn roadmaps-view__btn--primary",disabled:!d.trim(),"data-testid":"create-roadmap-submit",children:"Create"}),e.jsx("button",{type:"button",className:"roadmaps-view__btn",onClick:r,"data-testid":"create-roadmap-cancel",children:"Cancel"})]})]})})}function _a({onSave:a,onCancel:r}){const[d,g]=s.useState(""),[_,j]=s.useState(""),N=f=>{f.preventDefault(),d.trim()&&a({title:d.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-milestone-form",children:e.jsxs("form",{onSubmit:N,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:d,onChange:f=>g(f.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":"create-milestone-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:f=>j(f.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-milestone-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!d.trim(),"aria-label":"Save milestone",title:"Save","data-testid":"create-milestone-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:r,"aria-label":"Cancel",title:"Cancel","data-testid":"create-milestone-cancel",children:e.jsx(oe,{size:14})})]})]})})}function ja({onSave:a,onCancel:r}){const[d,g]=s.useState(""),[_,j]=s.useState(""),N=f=>{f.preventDefault(),d.trim()&&a({title:d.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-feature-form",children:e.jsxs("form",{onSubmit:N,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:d,onChange:f=>g(f.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":"create-feature-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:f=>j(f.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-feature-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!d.trim(),"aria-label":"Save feature",title:"Save","data-testid":"create-feature-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:r,"aria-label":"Cancel",title:"Cancel","data-testid":"create-feature-cancel",children:e.jsx(oe,{size:14})})]})]})})}function ya({projectId:a,addToast:r}){const{confirm:d}=ga(),g=pa()==="mobile",{roadmaps:_,selectedRoadmapId:j,selectedRoadmap:N,milestones:f,featuresByMilestoneId:E,loading:D,error:y,createRoadmap:S,updateRoadmap:O,deleteRoadmap:Q,selectRoadmap:J,createMilestone:I,updateMilestone:le,deleteMilestone:fe,createFeature:Je,updateFeature:ve,deleteFeature:be,reorderMilestones:ae,reorderFeatures:xe,moveFeature:B,milestoneSuggestions:P,isGeneratingSuggestions:G,generateMilestoneSuggestions:we,updateMilestoneSuggestionDraft:L,acceptMilestoneSuggestion:de,acceptAllMilestoneSuggestions:re,clearMilestoneSuggestions:Z,featureSuggestionsByMilestoneId:_e,isGeneratingFeatureSuggestions:ce,generateFeatureSuggestions:je,updateFeatureSuggestionDraft:M,acceptFeatureSuggestion:ue,acceptAllFeatureSuggestions:ye,clearFeatureSuggestions:x,handoffPayload:me,isFetchingHandoff:Ce,handoffError:$,fetchHandoff:Pe,clearHandoff:ee}=ma({projectId:a}),[C,He]=s.useState(!1),[Ne,Be]=s.useState(null),[Ue,h]=s.useState(""),[R,se]=s.useState(""),[Ke,Re]=s.useState(!1),Ie=s.useRef(null);s.useEffect(()=>{Ie.current!==null&&Ie.current!==j&&Re(!1),Ie.current=j},[j]);const[k,pe]=s.useState({roadmapId:null,field:null,value:""}),[te,U]=s.useState({milestoneId:null,field:null,value:""}),[ne,ze]=s.useState({featureId:null,field:null,value:""}),[K,q]=s.useState({type:null,parentId:void 0,title:"",description:""}),[Qe,Ge]=s.useState(!1),[Se,Le]=s.useState({draggingId:null,dropTargetId:null,dropPosition:null}),Ze=s.useCallback(t=>{Le(m=>({...m,draggingId:t}))},[]),ke=s.useCallback(()=>{Le({draggingId:null,dropTargetId:null,dropPosition:null})},[]),et=s.useCallback(t=>{Le(m=>m.draggingId===t?m:{...m,dropTargetId:t,dropPosition:null})},[]),[ge,Ae]=s.useState({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}),tt=s.useCallback((t,m)=>{Ae(b=>({...b,draggingId:t,draggingMilestoneId:m}))},[]),n=s.useCallback(()=>{Ae({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null})},[]),c=s.useCallback((t,m)=>{Ae(b=>{if(b.draggingId===t)return b;const V=(E[b.draggingMilestoneId||""]||[]).findIndex(De=>De.id===t);let Y;return m==="before"?Y=V:Y=V+1,{...b,dropTargetMilestoneId:b.draggingMilestoneId,dropTargetIndex:Y,dropPosition:m}})},[E]),o=s.useCallback(()=>{Ae(t=>({...t,dropTargetMilestoneId:t.draggingMilestoneId,dropTargetIndex:(E[t.draggingMilestoneId||""]||[]).length}))},[E]),i=s.useCallback(async(t,m)=>{const{draggingMilestoneId:b,dropTargetMilestoneId:T}=ge;if(!b){n();return}const V=T||b,Y=E[b]||[],De=Y.find(Me=>Me.id===t);if(!De){n();return}if(b!==V){if(b===V){n();return}try{await B(t,V,m,{onError:Me=>{r(`Failed to move feature: ${Me.message}`,"error")}})}catch{}}else{const Me=[...Y],$t=Me.findIndex(Oe=>Oe.id===t);Me.splice($t,1),Me.splice(m,0,De);const mt=Me.map(Oe=>Oe.id),Rt=Y.map(Oe=>Oe.id);if(mt.join(",")===Rt.join(",")){n();return}try{await xe(b,mt,{onError:Oe=>{r(`Failed to reorder features: ${Oe.message}`,"error")}})}catch{}}n()},[ge,E,xe,B,r,n]),u=s.useCallback(t=>{const m=t.currentTarget.getBoundingClientRect(),b=t.clientX,T=t.clientY;(b<m.left||b>m.right||T<m.top||T>m.bottom)&&Ae(V=>({...V,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}))},[]),l=s.useCallback(t=>ge.draggingId===t,[ge.draggingId]),v=s.useCallback(async t=>{const{draggingId:m}=Se;if(!m||m===t){ke();return}const b=f.map(De=>De.id),T=b.indexOf(m),V=b.indexOf(t);if(T===-1||V===-1){ke();return}const Y=[...b];if(Y.splice(T,1),Y.splice(V,0,m),Y.join(",")===b.join(",")){ke();return}try{await ae(j,Y,{onError:De=>{r(`Failed to reorder milestones: ${De.message}`,"error")}})}catch{}ke()},[Se,f,j,ae,r,ke]),p=s.useCallback(t=>{const m=t.currentTarget.getBoundingClientRect(),b=t.clientX,T=t.clientY;(b<m.left||b>m.right||T<m.top||T>m.bottom)&&Le(V=>({...V,dropTargetId:null,dropPosition:null}))},[]),w=s.useCallback(t=>{J(t.id),pe({roadmapId:t.id,field:"title",value:t.title})},[J]),H=s.useCallback(()=>{pe({roadmapId:null,field:null,value:""})},[]),Ee=s.useCallback(async t=>{if(k.roadmapId)try{await O(k.roadmapId,t,{onError:m=>r(m.message,"error")}),H()}catch{}},[k.roadmapId,O,H,r]),ie=s.useCallback(async t=>{if(await d({title:"Delete Roadmap",message:"Delete this roadmap? This cannot be undone.",danger:!0}))try{await Q(t,{onError:b=>r(b.message,"error")}),r("Roadmap deleted","success")}catch{}},[Q,r,d]),qe=s.useCallback((t,m)=>{Be(t),h(m),He(!0),ee()},[ee]),F=s.useCallback(()=>{He(!1),Be(null),h(""),ee()},[ee]),W=s.useCallback(()=>{Ne&&Pe(Ne,{onError:t=>r(`Failed to load handoff: ${t.message}`,"error")})},[Ne,Pe,r]),We=s.useCallback(()=>{if(me){const t=JSON.stringify(me,null,2);navigator.clipboard.writeText(t).then(()=>{r("Handoff data copied to clipboard","success")}).catch(()=>{r("Failed to copy to clipboard","error")})}},[me,r]),Ye=s.useCallback(async t=>{try{await S(t,{onError:m=>r(m.message,"error")}),q({type:null,parentId:void 0,title:"",description:""}),r("Roadmap created","success")}catch{}},[S,r]),vt=s.useCallback(t=>{U({milestoneId:t.id,field:"title",value:t.title})},[]),bt=s.useCallback(t=>{U(m=>({...m,value:t}))},[]),xt=s.useCallback(t=>{U(m=>({...m,field:t}))},[]),at=s.useCallback(()=>{U({milestoneId:null,field:null,value:""})},[]),wt=s.useCallback(async t=>{if(te.milestoneId)try{await le(te.milestoneId,t,{onError:m=>r(m.message,"error")}),at()}catch{}},[te.milestoneId,le,at,r]),_t=s.useCallback(async t=>{if(await d({title:"Delete Milestone",message:"Delete this milestone and all its features?",danger:!0}))try{await fe(t,{onError:b=>r(b.message,"error")}),r("Milestone deleted","success")}catch{}},[fe,r,d]),jt=s.useCallback(async t=>{try{await I(t,{onError:m=>r(m.message,"error")}),q({type:null,parentId:void 0,title:"",description:""}),r("Milestone created","success")}catch{}},[I,r]),ot=s.useCallback((t,m,b)=>{ze({featureId:t,field:"title",value:m})},[]),yt=s.useCallback(t=>{ze(m=>({...m,value:t}))},[]),rt=s.useCallback(()=>{ze({featureId:null,field:null,value:""})},[]),Ct=s.useCallback(async t=>{if(ne.featureId)try{await ve(ne.featureId,t,{onError:m=>r(m.message,"error")}),rt()}catch{}},[ne.featureId,ve,rt,r]),Nt=s.useCallback(async t=>{if(await d({title:"Delete Feature",message:"Delete this feature?",danger:!0}))try{await be(t,{onError:b=>r(b.message,"error")}),r("Feature deleted","success")}catch{}},[be,r,d]),lt=s.useCallback(async()=>{if(R.trim())try{await we(R,5,{onError:t=>r(t.message,"error")})}catch{}},[R,we,r]),dt=s.useCallback(async t=>{try{await de(t,{onError:m=>r(m.message,"error")}),r("Milestone added","success")}catch{}},[de,r]),ct=s.useCallback(async()=>{try{await re({onError:t=>r(t.message,"error")}),r(`${P.length} milestones added`,"success"),se("")}catch{}},[re,P.length,r]),ut=s.useCallback(()=>{Z(),se("")},[Z]),St=s.useCallback(async t=>{try{await je(t,{count:5},{onError:m=>r(m.message,"error")})}catch{}},[je,r]),kt=s.useCallback(async(t,m)=>{try{await ue(t,m,{onError:b=>r(b.message,"error")}),r("Feature added","success")}catch{}},[ue,r]),Et=s.useCallback((t,m,b)=>{M(t,m,b)},[M]),Ft=s.useCallback(async t=>{const m=_e[t]||[];try{await ye(t,{onError:b=>r(b.message,"error")}),r(`${m.length} features added`,"success")}catch{}},[ye,_e,r]),Dt=s.useCallback(t=>{x(t)},[x]),Mt=s.useCallback(async(t,m)=>{try{await Je(t,m,{onError:b=>r(b.message,"error")}),q({type:null,parentId:void 0,title:"",description:""}),r("Feature created","success")}catch{}},[Je,r]),Fe=j;return D&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--loading",children:e.jsx("div",{className:"roadmaps-view__loading-state",children:"Loading roadmaps..."})}):y&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--error",children:e.jsxs("div",{className:"roadmaps-view__error-state",children:[e.jsx("p",{children:"Failed to load roadmaps"}),e.jsx("p",{className:"roadmaps-view__error-msg",children:y.message})]})}):e.jsxs("div",{className:"roadmaps-view",children:[g&&!Fe&&e.jsx(va,{roadmaps:_,selectedRoadmapId:Fe,onSelect:t=>J(t),onCreate:()=>Ge(!0),onEdit:w,onDelete:ie,onExport:t=>qe(t.id,t.title),showCreateForm:Qe,onCancelCreate:()=>Ge(!1),onSaveCreate:async t=>{await Ye(t),Ge(!1)}}),!g&&e.jsxs("aside",{className:"roadmaps-view__sidebar","aria-label":"Roadmaps",children:[e.jsxs("div",{className:"roadmaps-view__sidebar-header",children:[e.jsx("h2",{className:"roadmaps-view__sidebar-title",children:"Roadmaps"}),e.jsx("button",{className:"roadmaps-view__add-btn",onClick:()=>q({type:"roadmap",title:"",description:""}),title:"Create roadmap","aria-label":"Create roadmap","data-testid":"create-roadmap-btn",children:e.jsx(Te,{size:16})})]}),K.type==="roadmap"&&e.jsx(ft,{onSave:Ye,onCancel:()=>q({type:null,parentId:void 0,title:"",description:""})}),e.jsx("div",{className:"roadmaps-view__sidebar-list",children:_.length===0?e.jsx("p",{className:"roadmaps-view__empty-sidebar",children:"No roadmaps yet. Click + to create one."}):_.map(t=>e.jsx(fa,{roadmap:t,isSelected:t.id===Fe,onSelect:()=>J(t.id),onEdit:()=>w(t),onDelete:()=>ie(t.id),onExport:()=>qe(t.id,t.title)},t.id))})]}),e.jsxs("main",{className:"roadmaps-view__main","aria-label":"Roadmap content",children:[g&&Fe&&e.jsx(ba,{roadmapTitle:N?.title||"Untitled Roadmap",onBack:()=>J(null),onEdit:()=>{N&&w(N)},onDelete:()=>ie(Fe),onCreate:()=>Ge(!0)}),Fe?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"roadmaps-view__roadmap-header",children:k.roadmapId===Fe?e.jsx("div",{className:"roadmaps-view__inline-edit",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input roadmaps-view__inline-input--large",value:k.value,onChange:t=>pe(m=>({...m,value:t.target.value})),onKeyDown:t=>{t.key==="Enter"?Ee({title:k.value}):t.key==="Escape"&&H()},placeholder:"Roadmap title",autoFocus:!0,"data-testid":"roadmap-title-input"}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>Ee({title:k.value}),"aria-label":"Save",title:"Save",children:e.jsx(he,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:H,"aria-label":"Cancel",title:"Cancel",children:e.jsx(oe,{size:16})})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__roadmap-title-row",children:[e.jsx("h1",{className:"roadmaps-view__roadmap-title",children:N?.title||"Untitled Roadmap"}),e.jsxs("div",{className:"roadmaps-view__roadmap-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>{N&&w(N)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"edit-roadmap-btn",children:e.jsx($e,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>ie(Fe),title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"delete-roadmap-btn",children:e.jsx(Ve,{size:16})})]})]}),N?.description&&e.jsx("p",{className:"roadmaps-view__roadmap-desc",children:N.description})]})}),g?Ke?e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"}),e.jsx("button",{className:"roadmap-suggestion-collapse-btn",onClick:()=>Re(!1),"aria-label":"Collapse suggestion panel","data-testid":"collapse-suggestion-panel-btn",children:e.jsx(Tt,{size:16})})]}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:R,onChange:t=>se(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:G||!j,"data-testid":"goal-prompt-input",autoFocus:!0}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:lt,disabled:!R.trim()||G||!j,"data-testid":"generate-suggestions-btn",children:G?"Generating...":"Generate Milestones"}),P.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:ct,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",P.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ut,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(oe,{size:14})})]})]})]}),P.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:P.map(t=>e.jsx(gt,{suggestion:t,onUpdateDraft:m=>L(t.id,m),onAccept:()=>dt(t.id),testIdPrefix:"suggestion"},t.id))})]}):e.jsx("div",{className:"roadmap-suggestion-section",children:e.jsxs("button",{className:"roadmap-suggestion-expand-btn",onClick:()=>Re(!0),disabled:!j,"data-testid":"expand-suggestion-panel-btn",children:[e.jsx(ht,{size:16}),"Generate Milestone Ideas"]})}):e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsx("div",{className:"roadmap-suggestion-header",children:e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"})}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:R,onChange:t=>se(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:G||!j,"data-testid":"goal-prompt-input"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:lt,disabled:!R.trim()||G||!j,"data-testid":"generate-suggestions-btn",children:G?"Generating...":"Generate Milestones"}),P.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:ct,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",P.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ut,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(oe,{size:14})})]})]})]}),P.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:P.map(t=>e.jsx(gt,{suggestion:t,onUpdateDraft:m=>L(t.id,m),onAccept:()=>dt(t.id),testIdPrefix:"suggestion"},t.id))})]}),e.jsxs("div",{className:"roadmaps-view__milestone-lanes",children:[K.type==="milestone"&&e.jsx(_a,{onSave:jt,onCancel:()=>q({type:null,parentId:void 0,title:"",description:""})}),f.length===0&&K.type!=="milestone"?e.jsxs("div",{className:"roadmaps-view__empty-milestones",children:[e.jsx("p",{children:"This roadmap has no milestones."}),e.jsxs("button",{className:"roadmaps-view__add-milestone-btn",onClick:()=>q({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn-empty",children:[e.jsx(Te,{size:14}),e.jsx("span",{children:"Add Milestone"})]})]}):e.jsxs(e.Fragment,{children:[K.type!=="milestone"&&e.jsxs("button",{className:"roadmaps-view__add-milestone-fab",onClick:()=>q({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn",children:[e.jsx(Te,{size:14}),e.jsx("span",{children:"Add Milestone"})]}),f.map(t=>e.jsx(xa,{milestone:t,features:E[t.id]||[],onEditMilestone:()=>vt(t),onDeleteMilestone:()=>_t(t.id),onAddFeature:()=>q({type:"feature",parentId:t.id,title:"",description:""}),onEditFeature:m=>{const b=E[t.id]?.find(T=>T.id===m);b&&ot(m,b.title,b.description)},onDeleteFeature:Nt,milestoneEdit:te,onMilestoneEditChange:bt,onMilestoneEditFieldChange:xt,onCancelMilestoneEdit:at,onSaveMilestoneEdit:wt,featureEdit:ne,onFeatureEditChange:yt,onStartFeatureEdit:ot,onCancelFeatureEdit:rt,onSaveFeatureEdit:Ct,projectId:a,addToast:r,isMilestoneDragging:Se.draggingId===t.id,isMilestoneDropTarget:Se.dropTargetId===t.id,milestoneDropPosition:Se.dropTargetId===t.id?Se.dropPosition:null,onMilestoneDragStart:Ze,onMilestoneDragEnd:ke,onMilestoneDragOver:et,onMilestoneDrop:v,onMilestoneDragLeave:p,isFeatureDragging:l,isFeatureDropTarget:ge.dropTargetMilestoneId===t.id,featureDropIndex:ge.dropTargetMilestoneId===t.id?ge.dropTargetIndex:null,onFeatureDragStart:tt,onFeatureDragEnd:n,onFeatureDragOver:c,onFeatureDrop:i,onFeatureDragLeave:u,onFeatureDropOnMilestone:o,featureSuggestions:_e[t.id],isGeneratingFeatureSuggestions:ce(t.id),onGenerateFeatureSuggestions:()=>St(t.id),onAcceptFeatureSuggestion:m=>kt(t.id,m),onAcceptAllFeatureSuggestions:()=>Ft(t.id),onUpdateFeatureSuggestionDraft:(m,b,T)=>Et(m,b,T),onClearFeatureSuggestions:()=>Dt(t.id)},t.id))]})]})]}):e.jsx("div",{className:"roadmaps-view__empty-main",children:e.jsx("p",{children:"Select a roadmap from the sidebar to view its milestones."})})]}),K.type==="feature"&&K.parentId&&e.jsx("div",{className:"roadmaps-view__feature-create-overlay",children:e.jsx(ja,{onSave:t=>Mt(K.parentId,t),onCancel:()=>q({type:null,parentId:void 0,title:"",description:""})})}),e.jsx(ha,{isOpen:C,onClose:F,roadmapId:Ne||"",roadmapTitle:Ue,handoffPayload:me,isLoading:Ce,error:$,onFetchHandoff:W,onCopyToClipboard:We})]})}function ka({context:a}){return e.jsx(ya,{projectId:a?.projectId,addToast:a?.addToast??(()=>{})})}export{ka as RoadmapDashboardView};
@@ -1 +0,0 @@
1
- .roadmaps-view{display:flex;height:100%;overflow:hidden}.roadmaps-view--loading,.roadmaps-view--error{display:flex;align-items:center;justify-content:center}.roadmaps-view__loading-state,.roadmaps-view__error-state{text-align:center;color:var(--text-muted)}.roadmaps-view__error-msg{font-size:.85rem;margin-top:4px}.roadmaps-view__handoff-intro,.roadmaps-view__handoff-error,.roadmaps-view__handoff-section{margin-bottom:var(--space-lg)}.roadmaps-view__handoff-empty-state,.roadmaps-view__handoff-loading-state{text-align:center;padding:var(--space-xl)}.roadmaps-view__handoff-button-icon{margin-right:var(--space-sm)}.roadmaps-view__handoff-loading-text{margin-top:var(--space-md)}.roadmaps-view__handoff-section-title{margin-bottom:var(--space-sm)}.roadmaps-view__handoff-card{padding:var(--space-md)}.roadmaps-view__handoff-pre{white-space:pre-wrap;font-size:.75rem;overflow:auto}.roadmaps-view__handoff-pre--mission{max-height:200px}.roadmaps-view__handoff-pre--features{max-height:300px}.roadmaps-view__handoff-copy-icon{margin-right:var(--space-xs)}.roadmaps-view__sidebar{width:280px;flex-shrink:0;display:flex;flex-direction:column;border-right:1px solid var(--border);background:var(--surface-elevated)}.roadmaps-view__sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:1px solid var(--border)}.roadmaps-view__sidebar-title{font-size:1rem;font-weight:600;color:var(--text-primary)}.roadmaps-view__add-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:var(--radius-sm);background:var(--accent);color:var(--cta-text);cursor:pointer;transition:opacity var(--transition-fast)}.roadmaps-view__add-btn:hover{opacity:.85}.roadmaps-view__sidebar-list{flex:1;overflow-y:auto;padding:var(--space-sm)}.roadmaps-view__empty-sidebar{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:.9rem}.roadmaps-view__sidebar-item{display:flex;align-items:flex-start;justify-content:space-between;padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);cursor:pointer;transition:background var(--transition-fast);gap:var(--space-sm)}.roadmaps-view__sidebar-item:hover{background:var(--surface-hover)}.roadmaps-view__sidebar-item--active{background:var(--card-hover)}.roadmaps-view__sidebar-item-content{flex:1;min-width:0}.roadmaps-view__sidebar-item-title{font-weight:500;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.roadmaps-view__sidebar-item-desc{font-size:.8rem;color:var(--text-muted);margin-top:2px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.roadmaps-view__sidebar-item-actions{display:flex;gap:2px;opacity:0;transition:opacity var(--transition-fast)}.roadmaps-view__sidebar-item:hover .roadmaps-view__sidebar-item-actions{opacity:1}.roadmaps-view__icon-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.roadmaps-view__icon-btn:hover{background:var(--surface-hover, color-mix(in srgb, var(--text) 6%, transparent));color:var(--text)}.roadmaps-view__icon-btn--danger:hover{background:color-mix(in srgb,var(--color-error) 10%,transparent);color:var(--color-error)}.roadmaps-view__icon-btn--success:hover{background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)}.roadmaps-view__icon-btn:disabled{opacity:.4;cursor:not-allowed}.roadmaps-view__main{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.roadmaps-view__empty-main{display:flex;align-items:center;justify-content:center;flex:1;color:var(--text-muted)}.roadmaps-view__roadmap-header{padding:var(--space-lg);border-bottom:1px solid var(--border)}.roadmaps-view__roadmap-title-row{display:flex;align-items:center;gap:var(--space-md)}.roadmaps-view__roadmap-title{font-size:1.5rem;font-weight:600;color:var(--text-primary);flex:1}.roadmaps-view__roadmap-actions{display:flex;gap:var(--space-xs)}.roadmaps-view__roadmap-desc{margin-top:var(--space-sm);color:var(--text-muted);font-size:.95rem}.roadmaps-view__milestone-lanes{flex:1;display:flex;flex-direction:row;gap:var(--space-md);padding:var(--space-md);overflow-x:auto;overflow-y:hidden}.roadmaps-view__milestone{min-width:300px;width:320px;flex-shrink:0;display:flex;flex-direction:column;background:var(--surface-elevated);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-sm);transition:opacity var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast);cursor:grab}.roadmaps-view__milestone:active{cursor:grabbing}.roadmaps-view__milestone--dragging{opacity:.5}.roadmaps-view__milestone--drop-target{border-color:var(--accent)}.roadmaps-view__milestone--drop-before{border-top:3px solid var(--accent)}.roadmaps-view__milestone--drop-after{border-bottom:3px solid var(--accent)}.roadmaps-view__drag-handle{display:flex;align-items:center;justify-content:center;color:var(--text-muted);cursor:grab;padding:2px;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.roadmaps-view__drag-handle:hover{color:var(--text-primary);background:var(--surface-hover)}.roadmaps-view__milestone-header{padding:var(--space-md);border-bottom:1px solid var(--border)}.roadmaps-view__milestone-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-sm)}.roadmaps-view__milestone-title{font-size:1rem;font-weight:600;color:var(--text-primary);flex:1}.roadmaps-view__milestone-actions{display:flex;gap:2px}.roadmaps-view__milestone-desc{margin-top:var(--space-xs);font-size:.85rem;color:var(--text-muted)}.roadmaps-view__milestone-actions-bar{padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--border)}.roadmaps-view__add-feature-btn{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);border:1px dashed var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:.8rem;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.roadmaps-view__add-feature-btn:hover{background:var(--surface-hover);color:var(--text-primary);border-color:var(--text-muted)}.roadmaps-view__suggest-btn{display:flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:var(--accent);color:var(--cta-text);border:1px solid var(--accent);border-radius:var(--radius-md);font-size:.75rem;cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast)}.roadmaps-view__suggest-btn:hover{background:color-mix(in srgb,var(--accent) 88%,var(--bg) 12%);border-color:color-mix(in srgb,var(--accent) 88%,var(--bg) 12%)}.roadmaps-view__suggest-btn:active{transform:scale(.97)}.roadmaps-view__suggest-btn:disabled{opacity:.5;cursor:not-allowed}.roadmaps-view__feature-list{flex:1;overflow-y:auto;padding:var(--space-sm);transition:background var(--transition-fast)}.roadmaps-view__feature-list--drop-target{background:color-mix(in srgb,var(--color-info) 5%,transparent)}.roadmaps-view__empty-features{padding:var(--space-md);text-align:center;color:var(--text-muted);font-size:.85rem}.roadmaps-view__feature-item{display:flex;align-items:flex-start;justify-content:space-between;padding:var(--space-sm);border-bottom:1px solid var(--border);gap:var(--space-sm);transition:opacity var(--transition-fast),border-color var(--transition-fast);cursor:grab}.roadmaps-view__feature-item:active{cursor:grabbing}.roadmaps-view__feature-item:last-child{border-bottom:none}.roadmaps-view__feature-item--dragging{opacity:.5}.roadmaps-view__feature-item--drop-before{border-top:3px solid var(--accent)}.roadmaps-view__feature-item--drop-after{border-bottom:3px solid var(--accent)}.roadmaps-view__drag-handle--feature{flex-shrink:0}.roadmaps-view__feature-content{flex:1;min-width:0}.roadmaps-view__feature-title{font-weight:500;color:var(--text-primary);font-size:.9rem}.roadmaps-view__feature-desc{font-size:.8rem;color:var(--text-muted);margin-top:2px}.roadmaps-view__feature-actions{display:flex;gap:2px;opacity:0;transition:opacity var(--transition-fast)}.roadmaps-view__feature-item:hover .roadmaps-view__feature-actions{opacity:1}.roadmaps-view__inline-edit{display:flex;flex-direction:column;gap:var(--space-sm)}.roadmaps-view__inline-edit-row{display:flex;align-items:center;gap:var(--space-xs)}.roadmaps-view__inline-input{flex:1;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-input);color:var(--text-primary);font-size:.9rem;font-family:inherit}.roadmaps-view__inline-input:focus{outline:none;border-color:var(--accent)}.roadmaps-view__inline-input--large{font-size:1.1rem;font-weight:600;padding:var(--space-sm) var(--space-md)}.roadmaps-view__inline-textarea{width:100%;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-input);color:var(--text-primary);font-size:.85rem;font-family:inherit;resize:vertical}.roadmaps-view__inline-textarea:focus{outline:none;border-color:var(--accent)}.roadmaps-view__create-form{padding:var(--space-md);border-bottom:1px solid var(--border);background:var(--surface-elevated)}.roadmaps-view__create-form-actions{display:flex;gap:var(--space-sm);margin-top:var(--space-sm)}.roadmaps-view__btn{padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-input);color:var(--text-primary);font-size:.85rem;cursor:pointer;transition:background var(--transition-fast)}.roadmaps-view__btn:hover{background:var(--surface-hover)}.roadmaps-view__btn--primary{background:var(--accent);border-color:var(--accent);color:var(--cta-text)}.roadmaps-view__btn--primary:hover{opacity:.9}.roadmaps-view__btn:disabled{opacity:.5;cursor:not-allowed}.roadmaps-view__empty-milestones{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;gap:var(--space-md);color:var(--text-muted);padding:var(--space-xl)}.roadmaps-view__add-milestone-btn,.roadmaps-view__add-milestone-fab{display:inline-flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-lg);border:1px dashed var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:.9rem;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.roadmaps-view__add-milestone-fab{align-self:flex-start;min-width:150px}.roadmaps-view__add-milestone-btn:hover,.roadmaps-view__add-milestone-fab:hover{background:var(--surface-hover);color:var(--text-primary);border-color:var(--text-muted)}.roadmaps-view__create-form--inline{border:1px dashed var(--border);border-radius:var(--radius-sm);margin:var(--space-sm);background:var(--surface-elevated)}.roadmaps-view__inline-form{display:flex;flex-direction:column;gap:var(--space-xs)}.roadmaps-view__inline-form-actions{display:flex;justify-content:flex-end;gap:var(--space-xs)}.roadmaps-view__feature-create-overlay{position:fixed;bottom:var(--space-lg);left:50%;transform:translate(-50%);z-index:100}.roadmaps-view__inline-edit--compact .roadmaps-view__inline-input{padding:var(--space-xs) var(--space-sm);font-size:.85rem}.roadmap-suggestion-section{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);margin-bottom:var(--space-lg)}.roadmap-suggestion-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-md)}.roadmap-suggestion-title{font-size:1rem;font-weight:600;color:var(--text-primary);margin:0}.roadmap-suggestion-form{display:flex;flex-direction:column;gap:var(--space-sm)}.roadmap-suggestion-input{width:100%;padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-input);color:var(--text-primary);font-size:.9rem;font-family:inherit;resize:vertical;min-height:60px;transition:border-color var(--transition-fast)}.roadmap-suggestion-input:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.roadmap-suggestion-input:disabled{opacity:.6;cursor:not-allowed}.roadmap-suggestion-input::placeholder{color:var(--text-muted)}.roadmap-suggestion-actions{display:flex;gap:var(--space-sm);align-items:center}.roadmap-suggestion-generate-btn{padding:var(--space-sm) var(--space-lg);background:var(--accent);color:var(--cta-text);border:none;border-radius:var(--radius-sm);font-size:.9rem;font-weight:500;cursor:pointer;transition:opacity var(--transition-fast),transform var(--transition-instant)}.roadmap-suggestion-generate-btn:hover:not(:disabled){opacity:.9}.roadmap-suggestion-generate-btn:active:not(:disabled){transform:scale(.98)}.roadmap-suggestion-generate-btn:disabled{opacity:.5;cursor:not-allowed}.roadmap-suggestion-accept-all-btn{padding:var(--space-sm) var(--space-md);background:var(--color-success);color:var(--cta-text);border:none;border-radius:var(--radius-sm);font-size:.85rem;font-weight:500;cursor:pointer;transition:opacity var(--transition-fast),transform var(--transition-instant)}.roadmap-suggestion-accept-all-btn:hover{opacity:.9}.roadmap-suggestion-accept-all-btn:active{transform:scale(.98)}.roadmap-suggestion-clear-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;color:var(--text-muted);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:color var(--transition-fast),border-color var(--transition-fast)}.roadmap-suggestion-clear-btn:hover{color:var(--color-error);border-color:var(--color-error)}.roadmap-suggestion-list{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-md)}.roadmap-suggestion-card{display:flex;align-items:flex-start;justify-content:space-between;padding:var(--space-md);background:var(--surface-elevated);border:1px solid var(--border);border-radius:var(--radius-sm);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.roadmap-suggestion-card:hover{border-color:var(--accent);box-shadow:var(--shadow-sm)}.roadmap-suggestion-card-content{display:flex;flex-direction:column;gap:var(--space-xs);flex:1;min-width:0}.roadmap-suggestion-card-title{font-size:.9rem;font-weight:500;color:var(--text-primary)}.roadmap-suggestion-card-desc{font-size:.85rem;color:var(--text-muted);line-height:1.4}.roadmap-suggestion-card-actions{display:flex;gap:var(--space-xs);flex-shrink:0}.roadmap-suggestion-accept-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:var(--color-success);color:var(--cta-text);border:none;border-radius:var(--radius-sm);cursor:pointer;transition:opacity var(--transition-fast),transform var(--transition-instant)}.roadmap-suggestion-accept-btn:hover{opacity:.9}.roadmap-suggestion-accept-btn:active{transform:scale(.95)}.roadmap-suggestion-accept-btn:disabled{opacity:.5;cursor:not-allowed}.roadmap-suggestion-edit-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:var(--surface-elevated);color:var(--text-muted);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast)}.roadmap-suggestion-edit-btn:hover{background:var(--surface-hover);color:var(--text-primary)}.roadmap-suggestion-card--editing{background:var(--surface-elevated);border-color:var(--accent)}.roadmap-suggestion-edit-form{display:flex;flex-direction:column;gap:var(--space-sm);flex:1;min-width:0}.roadmap-suggestion-textarea{width:100%;padding:var(--space-sm);background:var(--bg);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:.9rem;font-family:inherit;resize:vertical;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.roadmap-suggestion-textarea:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.roadmap-suggestion-textarea::placeholder{color:var(--text-dim)}.roadmap-suggestion-edit-actions{display:flex;gap:var(--space-xs)}.roadmap-suggestion-save-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:var(--color-success);color:var(--cta-text);border:none;border-radius:var(--radius-sm);cursor:pointer;transition:opacity var(--transition-fast)}.roadmap-suggestion-save-btn:hover:not(:disabled){opacity:.9}.roadmap-suggestion-save-btn:disabled{opacity:.5;cursor:not-allowed}.roadmap-suggestion-cancel-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:var(--surface-elevated);color:var(--text-muted);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast)}.roadmap-suggestion-cancel-btn:hover{background:var(--surface-hover);color:var(--text-primary)}.roadmap-suggestion-expand-btn{width:100%;display:flex;align-items:center;justify-content:center;gap:var(--space-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);color:var(--text-primary);cursor:pointer;font-size:.9rem;font-weight:600;transition:background var(--transition-fast),color var(--transition-fast)}.roadmap-suggestion-expand-btn:hover:not(:disabled){background:var(--card-hover)}.roadmap-suggestion-expand-btn:active:not(:disabled){transform:scale(.98)}.roadmap-suggestion-expand-btn:disabled{opacity:.5;cursor:not-allowed}.roadmap-suggestion-collapse-btn{display:flex;align-items:center;justify-content:center;background:none;border:none;color:var(--text-muted);cursor:pointer;padding:var(--space-xs);border-radius:var(--radius-sm);transition:color var(--transition-fast)}.roadmap-suggestion-collapse-btn:hover{color:var(--text-primary)}@media(max-width:768px){.roadmaps-view{overflow-y:auto;-webkit-overflow-scrolling:touch}.roadmaps-view__sidebar{display:none}.roadmaps-view__main{overflow-y:auto;-webkit-overflow-scrolling:touch;flex:1;padding-bottom:calc(var(--mobile-nav-height) + env(safe-area-inset-bottom,0px))}.roadmaps-view__mobile-list{display:flex;flex-direction:column;width:100%;height:100%;background:var(--surface)}.roadmaps-view__mobile-list-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:1px solid var(--border);flex-shrink:0}.roadmaps-view__mobile-list-title{margin:0;font-size:1rem;font-weight:600;color:var(--text)}.roadmaps-view__mobile-add-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:var(--radius-md);background:var(--accent);color:var(--cta-text);cursor:pointer;transition:opacity var(--transition-fast)}.roadmaps-view__mobile-add-btn:hover{opacity:.85}.roadmaps-view__mobile-add-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.roadmaps-view__mobile-create-form{padding:var(--space-md);border-bottom:1px solid var(--border);background:var(--bg)}.roadmaps-view__mobile-list-items{flex:1;overflow-y:auto}.roadmaps-view__mobile-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:1px solid var(--border);min-height:44px;cursor:pointer;transition:background var(--transition-fast)}.roadmaps-view__mobile-item:hover{background:var(--surface-hover)}.roadmaps-view__mobile-item--active{background:color-mix(in srgb,var(--accent) 10%,transparent);border-left:3px solid var(--accent)}.roadmaps-view__mobile-item-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.roadmaps-view__mobile-item-title{font-weight:500;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.roadmaps-view__mobile-item-desc{font-size:.8rem;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.roadmaps-view__mobile-item-actions{display:flex;gap:var(--space-xs);flex-shrink:0}.roadmaps-view__mobile-action-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:var(--radius-md);background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.roadmaps-view__mobile-action-btn:hover{background:var(--surface-hover);color:var(--text)}.roadmaps-view__mobile-action-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.roadmaps-view__mobile-action-btn--danger:hover{background:color-mix(in srgb,var(--color-error) 10%,transparent);color:var(--color-error)}.roadmaps-view__mobile-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);padding:var(--space-2xl);color:var(--text-muted);text-align:center}.roadmaps-view__mobile-header{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0;position:sticky;top:0;z-index:10}.roadmaps-view__mobile-back-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:var(--radius-md);background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast);flex-shrink:0}.roadmaps-view__mobile-back-btn:hover{background:var(--surface-hover);color:var(--text)}.roadmaps-view__mobile-back-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.roadmaps-view__mobile-header-title{flex:1;margin:0;font-size:1rem;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.roadmaps-view__mobile-header-actions{display:flex;gap:var(--space-xs);flex-shrink:0}.roadmaps-view__milestone-lanes{flex-direction:column;overflow-x:hidden;overflow-y:auto;padding-bottom:calc(var(--mobile-nav-height) + env(safe-area-inset-bottom,0px))}.roadmaps-view__milestone{width:100%;min-width:unset}.roadmap-suggestion-section{padding:var(--space-md);margin:var(--space-md)}.roadmap-suggestion-actions{flex-wrap:wrap}.roadmap-suggestion-generate-btn,.roadmap-suggestion-accept-all-btn{flex:1}.roadmap-suggestion-card{padding:var(--space-sm)}.roadmaps-view__roadmap-header{padding:var(--space-md) var(--space-lg)}.roadmaps-view__create-form{margin:var(--space-sm)}.roadmaps-view__icon-btn{width:36px;height:36px}.roadmaps-view__feature-create-overlay{bottom:calc(var(--mobile-nav-height) + env(safe-area-inset-bottom,0px) + var(--space-md))}}
@@ -1,21 +0,0 @@
1
- import{r as o,j as M}from"./vendor-react-K0fH_qHe.js";import{cg as Mt,ch as Pt,t as wt,w as Ct,b5 as St}from"./index-CQyVRLOb.js";import{c as nt}from"./createLucideIcon-BazL2hk5.js";import"./vendor-xterm-DzcZoU0P.js";const ft=4;function Dt({taskId:t,position:r,scale:c,onPositionChange:l,onDragStateChange:a,onDragEnd:i}){const[d,k]=o.useState(!1),y=o.useRef(null),C=o.useRef(r),m=o.useRef(!1);C.current=r;const b=o.useCallback(s=>{y.current=null,k(!1),s&&(a?.(!1),i?.(),m.current=!0)},[i,a]),n=o.useCallback(s=>{if(!s.isPrimary)return;s.stopPropagation();const w=s.currentTarget;typeof w.setPointerCapture=="function"&&w.setPointerCapture(s.pointerId),y.current={pointerId:s.pointerId,startPointer:{x:s.clientX,y:s.clientY},startPosition:C.current}},[]),g=o.useCallback(s=>{const w=y.current;if(!w||w.pointerId!==s.pointerId)return;s.stopPropagation();const E=s.clientX-w.startPointer.x,N=s.clientY-w.startPointer.y,$=Math.hypot(E,N);if(!d&&$>=ft&&(k(!0),a?.(!0)),$<ft)return;const v=c>0?c:1;l(t,{x:w.startPosition.x+E/v,y:w.startPosition.y+N/v})},[d,a,l,c,t]),h=o.useCallback(s=>{const w=y.current;!w||w.pointerId!==s.pointerId||(s.stopPropagation(),typeof s.currentTarget.hasPointerCapture=="function"&&s.currentTarget.hasPointerCapture(s.pointerId)&&typeof s.currentTarget.releasePointerCapture=="function"&&s.currentTarget.releasePointerCapture(s.pointerId),b(d))},[b,d]),P=o.useCallback(s=>{const w=y.current;!w||w.pointerId!==s.pointerId||(s.stopPropagation(),typeof s.currentTarget.hasPointerCapture=="function"&&s.currentTarget.hasPointerCapture(s.pointerId)&&typeof s.currentTarget.releasePointerCapture=="function"&&s.currentTarget.releasePointerCapture(s.pointerId),b(d))},[b,d]),j=o.useCallback(s=>{m.current&&(m.current=!1,s.preventDefault(),s.stopPropagation())},[]);return o.useMemo(()=>({isDragging:d,onPointerDown:n,onPointerMove:g,onPointerUp:h,onPointerCancel:P,onClickCapture:j}),[d,j,P,n,g,h])}const Tt=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function Nt(t){return t?t.charAt(0).toUpperCase()+t.slice(1):"Executing"}function It({style:t,position:r,scale:c,isHighlighted:l=!1,isDimmed:a=!1,onMouseEnter:i,onMouseLeave:d,onClick:k,onNodePositionChange:y,onNodeDragStateChange:C,onNodeDragEnd:m,...b}){const{task:n,globalPaused:g,taskStuckTimeoutMs:h,lastFetchTimeMs:P,onOpenDetail:j}=b,s=n.status==="failed",w=n.paused===!0,E=Mt(n,h,P),N=n.column==="triage"&&n.status==="awaiting-approval",$=!g&&!s&&!w&&!E&&!N&&(n.column==="in-progress"||Tt.has(n.status)),v=typeof n.currentStep=="number"&&n.currentStep>=0&&Array.isArray(n.steps)&&n.currentStep<n.steps.length,q=n.column==="in-review",G=Dt({taskId:n.id,position:r,scale:c,onPositionChange:y,onDragStateChange:C,onDragEnd:m});return M.jsxs("div",{className:`graph-task-node graph-node--draggable${G.isDragging?" graph-node--dragging":""}${l?" graph-task-node--highlighted graph-node--highlighted":""}${a?" graph-task-node--dimmed graph-node--dimmed":""}${$?" graph-task-node--active":""}${q?" graph-task-node--in-review":""}`,style:t,draggable:!1,"data-testid":`graph-task-node-${n.id}`,"data-current-step":$&&v?String(n.currentStep):void 0,onMouseEnter:i,onMouseLeave:d,onClick:H=>{k?.(H),!H.defaultPrevented&&j(n)},onClickCapture:G.onClickCapture,onPointerDown:G.onPointerDown,onPointerMove:G.onPointerMove,onPointerUp:G.onPointerUp,onPointerCancel:G.onPointerCancel,children:[$?M.jsx("div",{className:"graph-task-active-indicator",children:M.jsx("span",{className:"graph-task-active-indicator-text",children:Nt(n.status)})}):null,M.jsx(Pt,{...b,onOpenDetail:()=>{},disableDrag:!0})]})}/**
2
- * @license lucide-react v0.542.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const Rt=[["path",{d:"M8 3H5a2 2 0 0 0-2 2v3",key:"1dcmit"}],["path",{d:"M21 8V5a2 2 0 0 0-2-2h-3",key:"1e4gt3"}],["path",{d:"M3 16v3a2 2 0 0 0 2 2h3",key:"wsl5sc"}],["path",{d:"M16 21h3a2 2 0 0 0 2-2v-3",key:"18trek"}]],zt=nt("maximize",Rt);/**
7
- * @license lucide-react v0.542.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const jt=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Et=nt("rotate-ccw",jt);/**
12
- * @license lucide-react v0.542.0 - ISC
13
- *
14
- * This source code is licensed under the ISC license.
15
- * See the LICENSE file in the root directory of this source tree.
16
- */const Ot=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],_t=nt("zoom-in",Ot);/**
17
- * @license lucide-react v0.542.0 - ISC
18
- *
19
- * This source code is licensed under the ISC license.
20
- * See the LICENSE file in the root directory of this source tree.
21
- */const $t=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Ht=nt("zoom-out",$t);function Gt({zoom:t,onZoomIn:r,onZoomOut:c,onFitToGraph:l,onResetView:a}){return M.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[M.jsx("button",{className:"btn btn-icon",title:"Zoom in (Ctrl+=)","aria-label":"Zoom in",onClick:r,children:M.jsx(_t,{size:16})}),M.jsx("button",{className:"btn btn-icon",title:"Zoom out (Ctrl+-)","aria-label":"Zoom out",onClick:c,children:M.jsx(Ht,{size:16})}),M.jsxs("div",{className:"graph-toolbar__zoom-label","aria-live":"polite",children:[Math.round(t*100),"%"]}),M.jsx("button",{className:"btn btn-icon",title:"Fit to graph (Ctrl+Shift+F)","aria-label":"Fit to graph",onClick:l,children:M.jsx(zt,{size:16})}),M.jsx("button",{className:"btn btn-icon",title:"Reset view (Ctrl+0)","aria-label":"Reset view",onClick:a,children:M.jsx(Et,{size:16})})]})}const At=280,Lt=100;function Wt({edges:t,positions:r,nodeWidth:c=At,nodeHeight:l=Lt,highlightedEdgeIds:a}){const i=!!(a&&a.size>0);return M.jsxs("svg",{className:"dependency-graph-edges","aria-hidden":"true",children:[M.jsx("defs",{children:M.jsx("marker",{id:"dependency-graph-arrowhead",markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",markerUnits:"strokeWidth",children:M.jsx("path",{d:"M 0 0 L 10 3.5 L 0 7 z",fill:"var(--border)"})})}),t.map(d=>{const k=r.get(d.source),y=r.get(d.target);if(!k||!y)return null;const C=`${d.source}->${d.target}`,m=i&&(a?.has(C)??!1),b=k.x+c/2,n=k.y+l,g=y.x+c/2,h=y.y,P=n+(h-n)/2;return M.jsx("path",{"data-testid":"dependency-edge","data-edge-id":C,className:`dependency-graph-edge${m?" graph-edge--highlighted":""}${i&&!m?" graph-edge--dimmed":""}`,d:`M ${b} ${n} C ${b} ${P}, ${g} ${P}, ${g} ${h}`,fill:"none",stroke:m?"var(--todo)":"var(--border)",strokeWidth:m?"var(--space-xs)":"var(--btn-border-width)",opacity:i&&!m?.15:1,markerEnd:"url(#dependency-graph-arrowhead)",style:{transition:"opacity var(--transition-fast), stroke var(--transition-fast), stroke-width var(--transition-fast)"}},C)})]})}const vt=new Set(["triage","todo","in-progress","in-review"]);function Yt(t){return t.filter(r=>vt.has(r.column))}const Xt={nodeWidth:280,nodeHeight:100,horizontalGap:40,verticalGap:80};function it(t,r){const c={...Xt,...r},l=t.nodes.map(n=>n.task.id);if(l.length===0)return new Map;const a=new Map,i=new Map;for(const n of l)i.set(n,0),a.set(n,[]);for(const n of t.edges)!i.has(n.source)||!i.has(n.target)||(a.get(n.target)?.push(n.source),i.set(n.source,(i.get(n.source)??0)+1));const d=l.filter(n=>(i.get(n)??0)===0),k=[];for(;d.length>0;){const n=d.shift();k.push(n);for(const g of a.get(n)??[]){const h=(i.get(g)??0)-1;i.set(g,h),h===0&&d.push(g)}}for(const n of l)k.includes(n)||k.push(n);const y=new Map;for(const n of k){const g=t.edges.filter(P=>P.source===n).map(P=>P.target);let h=0;for(const P of g)h=Math.max(h,(y.get(P)??0)+1);y.set(n,h)}const C=new Map;for(const n of l){const g=y.get(n)??0,h=C.get(g)??[];h.push(n),C.set(g,h)}const m=new Map,b=Array.from(C.keys()).sort((n,g)=>n-g);for(const n of b){const g=C.get(n)??[];g.sort();const P=-(g.length*c.nodeWidth+Math.max(0,g.length-1)*c.horizontalGap)/2;g.forEach((j,s)=>{const w=P+s*(c.nodeWidth+c.horizontalGap),E=n*(c.nodeHeight+c.verticalGap);m.set(j,{x:w,y:E})})}return m}function Zt(t){return o.useMemo(()=>{const r=t.map(a=>({task:a})),c=new Set(t.map(a=>a.id)),l=t.flatMap(a=>(a.dependencies??[]).filter(i=>c.has(i)).map(i=>({source:a.id,target:i})));return{nodes:r,edges:l}},[t])}const Q=.1,tt=3,ht=40,Ut=200;function K(t,r,c){return Math.min(c,Math.max(r,t))}function Ft(t){if(!(t instanceof HTMLElement))return!1;const r=t.tagName.toLowerCase();return t.isContentEditable||r==="input"||r==="textarea"||r==="select"}function Vt(){const[t,r]=o.useState({x:0,y:0}),[c,l]=o.useState(1),[a,i]=o.useState(!1),d=o.useRef(t),k=o.useRef(c),y=o.useRef(null),C=o.useRef(null),m=o.useRef(new Map),b=o.useRef(null);o.useEffect(()=>{d.current=t},[t]),o.useEffect(()=>{k.current=c},[c]),o.useEffect(()=>()=>{y.current!==null&&window.clearTimeout(y.current)},[]);const n=o.useMemo(()=>`translate(${t.x}px, ${t.y}px) scale(${c})`,[t.x,t.y,c]),g=o.useMemo(()=>Math.round(c*100),[c]),h=o.useCallback(u=>{if(!u){y.current!==null&&(window.clearTimeout(y.current),y.current=null),i(!1);return}i(!0),y.current!==null&&window.clearTimeout(y.current),y.current=window.setTimeout(()=>{i(!1),y.current=null},Ut)},[]),P=o.useCallback((u,p,f)=>({x:K(u.x,-p,p),y:K(u.y,-f,f)}),[]),j=o.useCallback((u,p,f,S)=>{const D=k.current,I=d.current,R=K(u,Q,tt),O=R/D,z=P({x:p.x-(p.x-I.x)*O,y:p.y-(p.y-I.y)*O},f,S);l(R),r(z)},[P]),s=o.useCallback((u,p,f,S)=>{h(!1);const D=S??{x:p/2,y:f/2};j(k.current*u,D,p,f)},[h,j]),w=o.useCallback((u,p)=>{if(u&&p){s(1.2,u,p);return}l(f=>K(f+.1,Q,tt))},[s]),E=o.useCallback((u,p)=>{if(u&&p){s(1/1.2,u,p);return}l(f=>K(f-.1,Q,tt))},[s]),N=o.useCallback(()=>{h(!0),r({x:0,y:0}),l(1)},[h]),$=o.useCallback((u,p,f,S)=>{if(h(!0),u.size===0){r({x:0,y:0}),l(1);return}const D=S?.nodeWidth??280,I=S?.nodeHeight??100,R=Array.from(u.values()),O=Math.min(...R.map(A=>A.x)),z=Math.min(...R.map(A=>A.y)),Z=Math.max(...R.map(A=>A.x+D)),W=Math.max(...R.map(A=>A.y+I)),U=Math.max(1,Z-O),F=Math.max(1,W-z),B=Math.max(1,p-ht*2),ot=Math.max(1,f-ht*2),V=K(Math.min(B/U,ot/F),Q,tt),rt=(p-U*V)/2-O*V,st=(f-F*V)/2-z*V;l(V),r(P({x:rt,y:st},p,f))},[P,h]),v=o.useCallback((u,p)=>{if(m.current.set(u,p),m.current.size===2){const[f,S]=Array.from(m.current.values());b.current={distance:Math.hypot(f.x-S.x,f.y-S.y),zoom:k.current,pan:d.current,midpoint:{x:(f.x+S.x)/2,y:(f.y+S.y)/2}},C.current=null;return}C.current={start:p,panStart:d.current}},[]),q=o.useCallback((u,p,f,S)=>{if(m.current.has(u)&&m.current.set(u,p),m.current.size>=2&&b.current){h(!1);const[R,O]=Array.from(m.current.values()),Z=Math.hypot(R.x-O.x,R.y-O.y)/Math.max(1,b.current.distance),W={x:(R.x+O.x)/2,y:(R.y+O.y)/2},U=K(b.current.zoom*Z,Q,tt),F=U/b.current.zoom,B=P({x:W.x-(b.current.midpoint.x-b.current.pan.x)*F,y:W.y-(b.current.midpoint.y-b.current.pan.y)*F},f,S);l(U),r(B);return}const D=C.current;if(!D)return;h(!1);const I={x:D.panStart.x+(p.x-D.start.x),y:D.panStart.y+(p.y-D.start.y)};r(P(I,f,S))},[P,h]),G=o.useCallback(u=>{m.current.delete(u),m.current.size<2&&(b.current=null),m.current.size===0&&(C.current=null)},[]),H=o.useCallback((u,p,f,S)=>{const D=u<0?1.1:.9;h(!1),j(k.current*D,p,f,S)},[h,j]),L=o.useCallback((u,p,f,S,D)=>{if(Ft(u.target))return;const I=u.metaKey||u.ctrlKey;if(u.key==="Escape"){u.preventDefault(),N();return}if(I){if(u.key==="="||u.key==="+"){u.preventDefault(),s(1.2,p,f);return}if(u.key==="-"){u.preventDefault(),s(1/1.2,p,f);return}if(u.key==="0"){u.preventDefault(),N();return}(u.key==="f"||u.key==="F")&&u.shiftKey&&(u.preventDefault(),$(S,p,f,D))}},[$,N,s]);return{pan:t,zoom:c,zoomPercent:g,transform:n,transitioning:a,zoomIn:w,zoomOut:E,resetView:N,fitToGraph:$,setAnimate:h,onPointerDown:v,onPointerMove:q,onPointerUp:G,onWheelZoom:H,handleKeyDown:L}}function Kt(t){const{upstreamMap:r,downstreamMap:c}=o.useMemo(()=>{const a=new Map,i=new Map;for(const d of t)a.set(d.id,new Set(d.dependencies??[])),i.has(d.id)||i.set(d.id,new Set);for(const d of t)for(const k of d.dependencies??[])i.has(k)||i.set(k,new Set),i.get(k)?.add(d.id);return{upstreamMap:a,downstreamMap:i}},[t]);return{getChain:o.useCallback(a=>{if(!r.has(a)&&!c.has(a))return new Set;const i=new Set([a]),d=(k,y)=>{const C=[k],m=new Set([k]);for(;C.length>0;){const b=C.shift();if(!b)continue;const n=y.get(b);if(n)for(const g of n)m.has(g)||(m.add(g),i.add(g),C.push(g))}};return d(a,r),d(a,c),i},[c,r])}}const ct="fusion-plugin-dependency-graph:positions";function et(t){if(!t||typeof t!="object")return!1;const r=t;return typeof r.x=="number"&&Number.isFinite(r.x)&&typeof r.y=="number"&&Number.isFinite(r.y)}function Bt(t){const r=wt(ct,t);if(!r)return{};try{const c=JSON.parse(r);if(!c||typeof c!="object")return{};const l={};for(const[a,i]of Object.entries(c))et(i)&&(l[a]=i);return l}catch{return{}}}function qt(t,r,c){const l={};for(const[a,i]of Object.entries(t))r.has(a)&&et(i)&&(l[a]=i);Ct(ct,JSON.stringify(l),c)}function Jt(t){St(ct,t)}function Qt(t,r,c){const l={};for(const[a,i]of Object.entries(t))c.has(a)&&et(i)&&(l[a]=i);for(const[a,i]of Object.entries(r))c.has(a)&&et(i)&&(l[a]=i);return l}function te(t,r){const c={};for(const[l,a]of Object.entries(t))r.has(l)&&(c[l]=a);return c}function ee({projectId:t,visibleTaskIds:r}){const[c,l]=o.useState(null);o.useEffect(()=>{l(Bt(t))},[t]);const a=o.useCallback(d=>{qt(d,r,t),l(te(d,r))},[t,r]),i=o.useCallback(()=>{Jt(t),l(null)},[t]);return{savedPositions:c,persistPositions:a,clearSavedPositions:i}}const X=280,Y=100,gt=4;function ne({tasks:t,projectId:r,onOpenTaskDetail:c,onOpenDetail:l,addToast:a,globalPaused:i,onUpdateTask:d,onArchiveTask:k,onUnarchiveTask:y,onDeleteTask:C,onRetryTask:m,onOpenDetailWithTab:b,taskStuckTimeoutMs:n,onOpenMission:g,onMoveTask:h,lastFetchTimeMs:P,workflowStepNameLookup:j}){const s=o.useRef(null),w=o.useRef(!1),E=o.useRef(null),N=o.useRef(!1),[$,v]=o.useState(null),[q,G]=o.useState(null),H=o.useMemo(()=>Yt(t),[t]),L=Zt(H),{getChain:u}=Kt(H),p=$??q,f=o.useMemo(()=>p?u(p):new Set,[p,u]),S=o.useMemo(()=>it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80}),[L]),D=o.useMemo(()=>new Set(H.map(e=>e.id)),[H]),{savedPositions:I,persistPositions:R,clearSavedPositions:O}=ee({projectId:r,visibleTaskIds:D}),[z,Z]=o.useState(S),[W,U]=o.useState(!1);o.useEffect(()=>{const e={};for(const[T,_]of S.entries())e[T]=_;const x=I?Qt(e,I,D):e;Z(new Map(Object.entries(x)))},[S,I,D]);const{transform:F,zoom:B,transitioning:ot,zoomIn:V,zoomOut:rt,resetView:st,fitToGraph:A,onPointerDown:mt,onPointerMove:yt,onPointerUp:ut,onWheelZoom:xt,handleKeyDown:kt}=Vt();o.useEffect(()=>{if(w.current||H.length===0)return;if(!!(I&&Object.keys(I).length>0)){w.current=!0;return}const x=s.current;x&&(A(z,x.clientWidth,x.clientHeight,{nodeWidth:X,nodeHeight:Y}),w.current=!0)},[H.length,A,z,I]);const lt=o.useMemo(()=>{const e=Array.from(z.values());if(e.length===0)return{width:0,height:0};const x=Math.max(...e.map(_=>_.x+X)),T=Math.max(...e.map(_=>_.y+Y));return{width:x,height:T}},[z]),dt=o.useCallback(()=>{O();const e=it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80});Z(e)},[O,L]),bt=o.useCallback(()=>{const e={};for(const[x,T]of z.entries())e[x]=T;R(e)},[R,z]);return M.jsxs("section",{className:"dependency-graph","data-testid":"dependency-graph",children:[M.jsx("div",{ref:s,className:"dependency-graph__viewport",onPointerDown:e=>{W||(E.current={x:e.clientX,y:e.clientY},N.current=!1,mt(e.pointerId,{x:e.clientX,y:e.clientY}))},onPointerMove:e=>{if(W)return;const x=s.current;if(!x)return;const T=E.current;if(T){const _=Math.abs(e.clientX-T.x),J=Math.abs(e.clientY-T.y);(_>gt||J>gt)&&(N.current=!0)}yt(e.pointerId,{x:e.clientX,y:e.clientY},x.clientWidth,x.clientHeight)},onPointerUp:e=>{W||ut(e.pointerId),E.current=null},onPointerCancel:e=>{W||ut(e.pointerId),E.current=null,N.current=!1},onWheel:e=>{e.preventDefault();const x=s.current;if(!x)return;const T=x.getBoundingClientRect();xt(e.deltaY,{x:e.clientX-T.left,y:e.clientY-T.top},x.clientWidth,x.clientHeight)},onKeyDown:e=>{const x=s.current;x&&kt(e,x.clientWidth,x.clientHeight,z,{nodeWidth:X,nodeHeight:Y})},tabIndex:0,style:{outline:"none"},onClick:()=>{N.current||W||G(null)},children:H.length===0?M.jsx("div",{className:"dependency-graph__empty",children:"No active tasks to display in graph view."}):M.jsxs("div",{className:`graph-canvas-transform${ot?" graph-canvas-transform--animate":""}`,style:{transform:F,width:`${lt.width}px`,height:`${lt.height}px`},children:[M.jsx(Wt,{edges:L.edges,positions:z,nodeWidth:X,nodeHeight:Y,highlightedEdgeIds:f.size>0?new Set(L.edges.filter(e=>f.has(e.source)&&f.has(e.target)).map(e=>`${e.source}->${e.target}`)):void 0}),M.jsx("div",{className:"dependency-graph__nodes-layer",children:L.nodes.map(e=>{const x=z.get(e.task.id);return x?M.jsx(It,{task:e.task,projectId:r,style:{minHeight:`${Y}px`,left:`${x.x}px`,top:`${x.y}px`},position:x,scale:B,onNodePositionChange:(T,_)=>{Z(J=>{const at=J.get(T);if(at&&at.x===_.x&&at.y===_.y)return J;const pt=new Map(J);return pt.set(T,_),pt})},onNodeDragStateChange:U,onNodeDragEnd:bt,isHighlighted:f.size>0&&f.has(e.task.id),isDimmed:f.size>0&&!f.has(e.task.id),onOpenDetail:l??(T=>c?.(T.id)),addToast:a??(()=>{}),globalPaused:i,onUpdateTask:d,onArchiveTask:k,onUnarchiveTask:y,onDeleteTask:C,onRetryTask:m,onOpenDetailWithTab:b,taskStuckTimeoutMs:n,onOpenMission:g,onMoveTask:h,lastFetchTimeMs:P,workflowStepNameLookup:j,onMouseEnter:()=>v(e.task.id),onMouseLeave:()=>v(null),onClick:T=>{T.stopPropagation(),N.current=!1,G(_=>_===e.task.id?null:e.task.id)}},e.task.id):null})})]})}),M.jsx(Gt,{zoom:B,onZoomIn:()=>{const e=s.current;e&&V(e.clientWidth,e.clientHeight)},onZoomOut:()=>{const e=s.current;e&&rt(e.clientWidth,e.clientHeight)},onFitToGraph:()=>{dt();const e=s.current;if(!e)return;const x=it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80});A(x,e.clientWidth,e.clientHeight,{nodeWidth:X,nodeHeight:Y})},onResetView:()=>{dt(),st()}})]})}function oe(t){return new Map((t??[]).map(r=>[r.id,r.name]))}function ce({context:t}){return o.createElement(ne,{tasks:t?.tasks??[],projectId:t?.projectId,workflowStepNameLookup:oe(t?.workflowSteps),onOpenDetail:t?.openTaskDetail})}export{ne as DependencyGraph,ce as DependencyGraphDashboardView};