@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.
- package/dist/bin.js +2254 -1349
- package/dist/client/assets/AgentDetailView-ZbHEbYRT.js +18 -0
- package/dist/client/assets/{AgentsView-BkB9FiMT.js → AgentsView-B3jYk8Kt.js} +3 -3
- package/dist/client/assets/ChatView-DhPkiEGs.js +1 -0
- package/dist/client/assets/{DevServerView-BkvtjZBa.js → DevServerView-DyGDEiBP.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-BK-KbnhP.js → DirectoryPicker-D5UIeIl6.js} +1 -1
- package/dist/client/assets/{DocumentsView-BEg1CQAk.js → DocumentsView-DNHu1T8K.js} +1 -1
- package/dist/client/assets/{EvalsView-Berf9bQm.js → EvalsView-CpRobtDi.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-jcInE50G.js → ExperimentalAgentOnboardingModal-DOY_oZi7.js} +1 -1
- package/dist/client/assets/{InsightsView-BX5bSF1J.js → InsightsView-vp0RE8Mg.js} +1 -1
- package/dist/client/assets/MemoryView-PSc5lGJt.js +2 -0
- package/dist/client/assets/MemoryView-zaXewZzi.css +1 -0
- package/dist/client/assets/{NodesView-DLUOBLf6.js → NodesView-DMj6HGeC.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-COlJf0Kx.js → PiExtensionsManager-DL_QcN56.js} +2 -2
- package/dist/client/assets/PluginManager-BtYKm8IT.js +1 -0
- package/dist/client/assets/{ResearchView-B256Lr8I.js → ResearchView-BhWqfdV0.js} +1 -1
- package/dist/client/assets/{SettingsModal-BeA_nQtW.js → SettingsModal-BAgB4_AR.js} +4 -4
- package/dist/client/assets/{SettingsModal-yRqM4DV8.js → SettingsModal-CUCyaAyE.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-uUZk3TKT.js → SetupWizardModal-BKscasuh.js} +1 -1
- package/dist/client/assets/{SkillsView-CP8JX0P_.js → SkillsView-BdELqTy7.js} +1 -1
- package/dist/client/assets/{TodoView-DCRIkDZ-.js → TodoView-DFNGBDNV.js} +1 -1
- package/dist/client/assets/{folder-open-DHjELt8-.js → folder-open-k1xmUMyr.js} +1 -1
- package/dist/client/assets/index-Qq2JOOWx.css +1 -0
- package/dist/client/assets/{index-CQyVRLOb.js → index-TFYXEVpn.js} +160 -160
- package/dist/client/assets/{star-DYesq1AV.js → star-ne32r3Y4.js} +1 -1
- package/dist/client/assets/{upload-DTWF3Db5.js → upload-MS-2Gx53.js} +1 -1
- package/dist/client/assets/{users--syrel4l.js → users-C519GSjH.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +1370 -629
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +9 -11
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +30 -0
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +3 -28
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +899 -895
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +68 -71
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +47 -50
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +155 -109
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/src/index.ts +49 -3
- package/dist/plugins/fusion-plugin-reports/src/report-schema.ts +38 -0
- package/dist/plugins/fusion-plugin-reports/src/store/__tests__/report-schema.test.ts +66 -0
- package/dist/plugins/fusion-plugin-reports/src/store/__tests__/report-store.test.ts +177 -0
- package/dist/plugins/fusion-plugin-reports/src/store/report-store.ts +341 -0
- package/dist/plugins/fusion-plugin-reports/src/store/report-types.ts +77 -0
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/dist/client/assets/AgentDetailView-gy_5SUj2.js +0 -18
- package/dist/client/assets/ChatView-B_-B8fqu.js +0 -1
- package/dist/client/assets/MemoryView-CKElJY_3.js +0 -2
- package/dist/client/assets/MemoryView-DiajLXby.css +0 -1
- package/dist/client/assets/PluginManager-CfW55BF4.js +0 -1
- package/dist/client/assets/createLucideIcon-BazL2hk5.js +0 -21
- package/dist/client/assets/dashboard-view-BkTMSZYn.css +0 -1
- package/dist/client/assets/dashboard-view-CyWN-d02.js +0 -63
- package/dist/client/assets/dashboard-view-DdGlfuu-.css +0 -1
- package/dist/client/assets/dashboard-view-lR7YYmSC.js +0 -21
- package/dist/client/assets/index-CxA2Nn0_.css +0 -1
- package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.css +0 -58
- package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.tsx +0 -301
- package/dist/plugins/fusion-plugin-dependency-graph/src/GraphHighlight.css +0 -27
- package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.css +0 -157
- package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.tsx +0 -126
- package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.css +0 -35
- package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.tsx +0 -36
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.highlighting.test.tsx +0 -112
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.persistence.test.tsx +0 -115
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.test.tsx +0 -128
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.drag.test.tsx +0 -82
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.test.tsx +0 -307
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphToolbar.test.tsx +0 -60
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/edges.test.tsx +0 -75
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filtering.test.tsx +0 -62
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filters.test.ts +0 -78
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/graphPositionStorage.test.ts +0 -95
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/host-integration.test.ts +0 -74
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/index.test.ts +0 -58
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/interactions.test.tsx +0 -121
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/layout.test.ts +0 -70
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/persistence.test.tsx +0 -89
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphData.test.ts +0 -86
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphInteraction.test.ts +0 -167
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphPositions.test.ts +0 -66
- package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useNodeDrag.test.ts +0 -81
- package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-interop.d.ts +0 -35
- package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-view.tsx +0 -19
- package/dist/plugins/fusion-plugin-dependency-graph/src/edges.tsx +0 -70
- package/dist/plugins/fusion-plugin-dependency-graph/src/filters.ts +0 -8
- package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/__tests__/useDependencyChain.test.ts +0 -53
- package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useDependencyChain.ts +0 -60
- package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useGraphPositions.ts +0 -45
- package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useNodeDrag.ts +0 -114
- package/dist/plugins/fusion-plugin-dependency-graph/src/index.ts +0 -24
- package/dist/plugins/fusion-plugin-dependency-graph/src/layout.ts +0 -91
- package/dist/plugins/fusion-plugin-dependency-graph/src/styles/drag.css +0 -15
- package/dist/plugins/fusion-plugin-dependency-graph/src/types.ts +0 -21
- package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphData.ts +0 -17
- package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphInteraction.ts +0 -292
- 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};
|