@vibeflow-tools/cli 0.11.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/chunk-22ZK3AD6.js +6 -0
  3. package/dist/chunk-2CI62NHU.js +8 -0
  4. package/dist/chunk-2FTOVVDE.js +10 -0
  5. package/dist/chunk-2HKRXAUP.js +10 -0
  6. package/dist/chunk-32Z32W7T.js +2 -0
  7. package/dist/chunk-3V7HLRIS.js +6 -0
  8. package/dist/chunk-4KWRHSXU.js +10 -0
  9. package/dist/chunk-ACDVAO4P.js +6 -0
  10. package/dist/chunk-BBIA4IIO.js +2 -0
  11. package/dist/chunk-BOPGIKZN.js +8 -0
  12. package/dist/chunk-BUQI2W5H.js +2 -0
  13. package/dist/chunk-BZDBSBRV.js +2 -0
  14. package/dist/chunk-CKNX42Z3.js +10 -0
  15. package/dist/chunk-CQ524DVH.js +2 -0
  16. package/dist/chunk-EAYTSVCN.js +2 -0
  17. package/dist/chunk-EDJNSJXJ.js +10 -0
  18. package/dist/chunk-EZX6HYC3.js +8 -0
  19. package/dist/chunk-FYRJDWDC.js +2 -0
  20. package/dist/chunk-GN436FFO.js +10 -0
  21. package/dist/chunk-GQQIUROY.js +2 -0
  22. package/dist/chunk-GTZDS3U3.js +6 -0
  23. package/dist/chunk-ICO6AZHJ.js +10 -0
  24. package/dist/chunk-IJ67OEKX.js +2 -0
  25. package/dist/chunk-ILUMCOF2.js +2 -0
  26. package/dist/chunk-JAWQQLJC.js +8 -0
  27. package/dist/chunk-JQTURVVN.js +2 -0
  28. package/dist/chunk-KZZ4ADHY.js +6 -0
  29. package/dist/chunk-L6EJ7QTO.js +6 -0
  30. package/dist/chunk-LYJHU4LP.js +10 -0
  31. package/dist/chunk-N5PXJMOU.js +6 -0
  32. package/dist/chunk-NHVKGOSV.js +10 -0
  33. package/dist/chunk-O4LGEPMQ.js +8 -0
  34. package/dist/chunk-P63ZVL36.js +2 -0
  35. package/dist/chunk-PFOVGF7M.js +10 -0
  36. package/dist/chunk-PGGJRQCO.js +2 -0
  37. package/dist/chunk-PN5C7EHL.js +8 -0
  38. package/dist/chunk-PWP474PZ.js +2 -0
  39. package/dist/chunk-Q7MEW67Z.js +8 -0
  40. package/dist/chunk-QJMBWTAZ.js +8 -0
  41. package/dist/chunk-R5NQALFI.js +2 -0
  42. package/dist/chunk-RBBUTBE3.js +6 -0
  43. package/dist/chunk-RRQ5P63N.js +2 -0
  44. package/dist/chunk-SQPWTIQO.js +2 -0
  45. package/dist/chunk-TTWEWSD3.js +6 -0
  46. package/dist/chunk-WARORREB.js +2 -0
  47. package/dist/chunk-WHXU37AT.js +10 -0
  48. package/dist/chunk-WKEMBLJR.js +2 -0
  49. package/dist/chunk-WVRMKUU5.js +6 -0
  50. package/dist/chunk-WZ2QQDYW.js +2 -0
  51. package/dist/chunk-X3VLCXWS.js +6 -0
  52. package/dist/chunk-X4CQRMD4.js +6 -0
  53. package/dist/chunk-X4RGF6JJ.js +2 -0
  54. package/dist/chunk-XHZXHACL.js +2 -0
  55. package/dist/chunk-XJ35INCK.js +10 -0
  56. package/dist/chunk-YMBPKWZ4.js +2 -0
  57. package/dist/chunk-ZHA4Y2KB.js +8 -0
  58. package/dist/cli/chunk-22ZK3AD6.js +6 -0
  59. package/dist/cli/chunk-2CI62NHU.js +8 -0
  60. package/dist/cli/chunk-2FTOVVDE.js +10 -0
  61. package/dist/cli/chunk-2HKRXAUP.js +10 -0
  62. package/dist/cli/chunk-32Z32W7T.js +2 -0
  63. package/dist/cli/chunk-3V7HLRIS.js +6 -0
  64. package/dist/cli/chunk-4KWRHSXU.js +10 -0
  65. package/dist/cli/chunk-ACDVAO4P.js +6 -0
  66. package/dist/cli/chunk-BBIA4IIO.js +2 -0
  67. package/dist/cli/chunk-BOPGIKZN.js +8 -0
  68. package/dist/cli/chunk-BUQI2W5H.js +2 -0
  69. package/dist/cli/chunk-BZDBSBRV.js +2 -0
  70. package/dist/cli/chunk-CKNX42Z3.js +10 -0
  71. package/dist/cli/chunk-CQ524DVH.js +2 -0
  72. package/dist/cli/chunk-EAYTSVCN.js +2 -0
  73. package/dist/cli/chunk-EDJNSJXJ.js +10 -0
  74. package/dist/cli/chunk-EZX6HYC3.js +8 -0
  75. package/dist/cli/chunk-FYRJDWDC.js +2 -0
  76. package/dist/cli/chunk-GN436FFO.js +10 -0
  77. package/dist/cli/chunk-GQQIUROY.js +2 -0
  78. package/dist/cli/chunk-GTZDS3U3.js +6 -0
  79. package/dist/cli/chunk-ICO6AZHJ.js +10 -0
  80. package/dist/cli/chunk-IJ67OEKX.js +2 -0
  81. package/dist/cli/chunk-ILUMCOF2.js +2 -0
  82. package/dist/cli/chunk-JAWQQLJC.js +8 -0
  83. package/dist/cli/chunk-JQTURVVN.js +2 -0
  84. package/dist/cli/chunk-KZZ4ADHY.js +6 -0
  85. package/dist/cli/chunk-L6EJ7QTO.js +6 -0
  86. package/dist/cli/chunk-LYJHU4LP.js +10 -0
  87. package/dist/cli/chunk-N5PXJMOU.js +6 -0
  88. package/dist/cli/chunk-NHVKGOSV.js +10 -0
  89. package/dist/cli/chunk-O4LGEPMQ.js +8 -0
  90. package/dist/cli/chunk-P63ZVL36.js +2 -0
  91. package/dist/cli/chunk-PFOVGF7M.js +10 -0
  92. package/dist/cli/chunk-PGGJRQCO.js +2 -0
  93. package/dist/cli/chunk-PN5C7EHL.js +8 -0
  94. package/dist/cli/chunk-PWP474PZ.js +2 -0
  95. package/dist/cli/chunk-Q7MEW67Z.js +8 -0
  96. package/dist/cli/chunk-QJMBWTAZ.js +8 -0
  97. package/dist/cli/chunk-R5NQALFI.js +2 -0
  98. package/dist/cli/chunk-RBBUTBE3.js +6 -0
  99. package/dist/cli/chunk-RRQ5P63N.js +2 -0
  100. package/dist/cli/chunk-SQPWTIQO.js +2 -0
  101. package/dist/cli/chunk-TTWEWSD3.js +6 -0
  102. package/dist/cli/chunk-WARORREB.js +2 -0
  103. package/dist/cli/chunk-WHXU37AT.js +10 -0
  104. package/dist/cli/chunk-WKEMBLJR.js +2 -0
  105. package/dist/cli/chunk-WVRMKUU5.js +6 -0
  106. package/dist/cli/chunk-WZ2QQDYW.js +2 -0
  107. package/dist/cli/chunk-X3VLCXWS.js +6 -0
  108. package/dist/cli/chunk-X4CQRMD4.js +6 -0
  109. package/dist/cli/chunk-X4RGF6JJ.js +2 -0
  110. package/dist/cli/chunk-XHZXHACL.js +2 -0
  111. package/dist/cli/chunk-XJ35INCK.js +10 -0
  112. package/dist/cli/chunk-YMBPKWZ4.js +2 -0
  113. package/dist/cli/chunk-ZHA4Y2KB.js +8 -0
  114. package/dist/cli/comments-5LRGOYLT.js +2 -0
  115. package/dist/cli/comments-D3SKM2F4.js +2 -0
  116. package/dist/cli/comments-GGE2X2EE.js +2 -0
  117. package/dist/cli/comments-GZ6HQMHL.js +2 -0
  118. package/dist/cli/comments-LHSMBKJ3.js +2 -0
  119. package/dist/cli/comments-M5HDNHXR.js +2 -0
  120. package/dist/cli/comments-MJP5KLEE.js +2 -0
  121. package/dist/cli/comments-TQHWMRB4.js +2 -0
  122. package/dist/cli/comments-VSWJW47E.js +2 -0
  123. package/dist/cli/files-3GGL6AHA.js +2 -0
  124. package/dist/cli/files-4M7AX2IR.js +2 -0
  125. package/dist/cli/files-7GFBKISD.js +2 -0
  126. package/dist/cli/files-7H73XU4Z.js +2 -0
  127. package/dist/cli/files-FL23FKMK.js +2 -0
  128. package/dist/cli/files-GQPP5SSP.js +2 -0
  129. package/dist/cli/files-QO35EIJI.js +2 -0
  130. package/dist/cli/files-R6BRCQQX.js +2 -0
  131. package/dist/cli/files-WH4W5IPG.js +2 -0
  132. package/dist/cli/files-XKVCQQMI.js +2 -0
  133. package/dist/cli/git-NH6PGXOM.js +2 -0
  134. package/dist/cli/index.js +63 -71
  135. package/dist/cli/push-25YMX4RZ.js +2 -0
  136. package/dist/cli/push-26JSGYHL.js +2 -0
  137. package/dist/cli/push-5NNA77B2.js +2 -0
  138. package/dist/cli/push-7M34G4OW.js +2 -0
  139. package/dist/cli/push-AARMGHSL.js +2 -0
  140. package/dist/cli/push-EVBLKP53.js +2 -0
  141. package/dist/cli/push-HG6EPV6P.js +2 -0
  142. package/dist/cli/push-RFYHMZBR.js +2 -0
  143. package/dist/cli/push-RQJQM7U7.js +2 -0
  144. package/dist/cli/push-S4G36KHW.js +2 -0
  145. package/dist/cli/push-S5XSREE5.js +2 -0
  146. package/dist/cli/push-SWN2KN2R.js +2 -0
  147. package/dist/cli/review-gate-MGMU7CIR.js +2 -0
  148. package/dist/cli/review-gate-QR2E4REN.js +2 -0
  149. package/dist/cli/settings-KKHPB344.js +2 -0
  150. package/dist/cli/settings-PYRZJJ4H.js +2 -0
  151. package/dist/cli/tasks-3HXDHCPS.js +2 -0
  152. package/dist/cli/tasks-5X5AAK2N.js +2 -0
  153. package/dist/cli/tasks-MUL5SYJQ.js +2 -0
  154. package/dist/cli/tasks-N3AEGAEB.js +2 -0
  155. package/dist/cli/tasks-NSLXFEXZ.js +2 -0
  156. package/dist/cli/tasks-OJTUAWAN.js +2 -0
  157. package/dist/cli/tasks-SV7ZVS7W.js +2 -0
  158. package/dist/cli/tasks-VCU3JVNJ.js +2 -0
  159. package/dist/cli/verify-44MRXSPT.js +2 -0
  160. package/dist/cli/verify-AXMQ27UT.js +2 -0
  161. package/dist/cli/verify-BJ62CQI3.js +2 -0
  162. package/dist/cli/verify-DEG2BZOB.js +2 -0
  163. package/dist/cli/verify-DGL7A4WD.js +2 -0
  164. package/dist/cli/verify-GP427VCE.js +2 -0
  165. package/dist/cli/verify-QUCASFYP.js +2 -0
  166. package/dist/cli/verify-RY7B6C2P.js +2 -0
  167. package/dist/cli/verify-TTAW3GG6.js +2 -0
  168. package/dist/cli/verify-VLVCMBBW.js +2 -0
  169. package/dist/cli/verify-XL7JI7LN.js +2 -0
  170. package/dist/cli/verify-ZOAIUNRD.js +2 -0
  171. package/dist/cli/workspace-AJAVENKA.js +2 -0
  172. package/dist/client/kanban-browser.js +16 -15
  173. package/dist/client/overlay-browser.js +4 -4
  174. package/dist/files-3GGL6AHA.js +2 -0
  175. package/dist/files-4M7AX2IR.js +2 -0
  176. package/dist/files-7GFBKISD.js +2 -0
  177. package/dist/files-7H73XU4Z.js +2 -0
  178. package/dist/files-FL23FKMK.js +2 -0
  179. package/dist/files-GQPP5SSP.js +2 -0
  180. package/dist/files-QO35EIJI.js +2 -0
  181. package/dist/files-R6BRCQQX.js +2 -0
  182. package/dist/files-WH4W5IPG.js +2 -0
  183. package/dist/files-XKVCQQMI.js +2 -0
  184. package/dist/index.js +63 -71
  185. package/dist/workspace-AJAVENKA.js +2 -0
  186. package/package.json +2 -1
@@ -1592,19 +1592,19 @@ Error generating stack: `+f.message+`
1592
1592
  outline: 2px solid #f59e0b !important;
1593
1593
  outline-offset: 2px !important;
1594
1594
  background-color: rgba(245, 158, 11, 0.08) !important;
1595
- }`;function setupShadowDom(){let host=document.createElement("div");host.id="vibeflow-studio-root",host.style.pointerEvents="none",document.body.appendChild(host);let root=host.attachShadow({mode:"open"}),styleEl=document.createElement("style");styleEl.textContent=OVERLAY_CSS,root.appendChild(styleEl);let hostStyle=document.createElement("style");return hostStyle.textContent=HOST_PAGE_CSS,document.head.appendChild(hostStyle),{host,root}}function loadPrefs(){try{let p=JSON.parse(localStorage.getItem(PREFS_KEY)??"{}");state.indicatorsVisible=p.indicatorsVisible===!0,state.sidebarShowDone=p.sidebarShowDone!==!1,state.showAllPages=p.showAllPages===!0,state.theme="dark",applyOverlayTheme(state.theme)}catch{}}function applyOverlayTheme(theme){state.theme=theme,state.host&&state.host.setAttribute("data-theme",theme)}function startAnnotationHover(host){document.addEventListener("mouseover",e=>onAnnotateMouseOver(e,host),!0),document.addEventListener("mouseout",onAnnotateMouseOut,!0)}function stopAnnotationHover(host){if(document.removeEventListener("mouseover",e=>onAnnotateMouseOver(e,host),!0),document.removeEventListener("mouseout",onAnnotateMouseOut,!0),state.hoverTarget){try{state.hoverTarget.classList.remove("vibeflow-hover-highlight")}catch{}state.hoverTarget=null}}function onAnnotateMouseOver(e,host){let t=e.target;if(!(!t||t===document.documentElement||t===document.body)&&e.composedPath().indexOf(host)===-1&&state.hoverTarget!==t){if(state.hoverTarget)try{state.hoverTarget.classList.remove("vibeflow-hover-highlight")}catch{}state.hoverTarget=t;try{t.classList.add("vibeflow-hover-highlight")}catch{}}}function onAnnotateMouseOut(e){let t=e.target;if(t===state.hoverTarget){try{t.classList.remove("vibeflow-hover-highlight")}catch{}state.hoverTarget=null}}function setAnnotateHighlight(element){if(clearAnnotateHighlight(),!!element){state.annotateHighlightTarget=element;try{element.classList.add("vibeflow-annotate-highlight")}catch{}}}function clearAnnotateHighlight(){if(state.annotateHighlightTarget){try{state.annotateHighlightTarget.classList.remove("vibeflow-annotate-highlight")}catch{}state.annotateHighlightTarget=null}}function el(tag,props,...children){let node=document.createElement(tag);if(props)for(let key of Object.keys(props))key==="className"?node.className=props[key]:key==="placeholder"?node.placeholder=props[key]:key==="type"?node.type=props[key]:key==="value"?node.value=props[key]:node.setAttribute(key,props[key]);for(let child of children)child!=null&&node.appendChild(typeof child=="string"?document.createTextNode(child):child);return node}var healthPollTimer=null;function connectWS(){if(PROTO_CONFIG.wsUrl){state.reconnectTimer&&(clearTimeout(state.reconnectTimer),state.reconnectTimer=null);try{state.ws=new WebSocket(PROTO_CONFIG.wsUrl)}catch{scheduleReconnect();return}state.ws.onopen=()=>{state.reconnectAttempt=0,state.pingInterval&&clearInterval(state.pingInterval),state.pingInterval=setInterval(()=>{var _a;((_a=state.ws)==null?void 0:_a.readyState)===WebSocket.OPEN&&state.ws.send(JSON.stringify({type:"ping"}))},PING_INTERVAL)},state.ws.onmessage=e=>{var _a,_b,_c,_d;let msg;try{msg=JSON.parse(e.data)}catch{return}msg.type!=="pong"&&(msg.type==="reload"&&location.reload(),msg.type==="tasks-updated"&&((_b=(_a=state).onTasksUpdatedMessage)==null||_b.call(_a)),(msg.type==="task-changed"||msg.type==="task-deleted")&&((_d=(_c=state).onTasksUpdatedMessage)==null||_d.call(_c)))},state.ws.onclose=()=>{state.pingInterval&&(clearInterval(state.pingInterval),state.pingInterval=null),scheduleReconnect()},state.ws.onerror=()=>{var _a;(_a=state.ws)==null||_a.close()},stopHealthPoll(),healthPollTimer=setInterval(checkHealth,HEALTH_POLL_INTERVAL)}}function scheduleReconnect(){let delay=Math.min(RECONNECT_BASE*2**state.reconnectAttempt,RECONNECT_MAX);state.reconnectAttempt++,state.reconnectTimer=setTimeout(connectWS,delay)}function stopHealthPoll(){healthPollTimer&&(clearInterval(healthPollTimer),healthPollTimer=null)}function checkHealth(){if(!PROTO_CONFIG.wsUrl||state.ws&&state.ws.readyState===WebSocket.OPEN)return;let healthUrl=PROTO_CONFIG.wsUrl.replace("ws://","http://").replace("wss://","https://").replace("/ws","/api/health");fetch(healthUrl,{signal:AbortSignal.timeout(3e3)}).then(r=>{r.ok||(stopHealthPoll(),scheduleReconnect())}).catch(()=>{stopHealthPoll(),scheduleReconnect()})}function setupWsVisibilityReconnect(){document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(!state.ws||state.ws.readyState!==WebSocket.OPEN)&&(state.reconnectAttempt=0,connectWS())})}function fetchTasks(){let url=PROTO_CONFIG.boardId?`${PROTO_CONFIG.apiUrl}?boardId=${encodeURIComponent(PROTO_CONFIG.boardId)}`:PROTO_CONFIG.apiUrl,headers={};PROTO_CONFIG.overlayApiKey&&(headers["X-Overlay-Api-Key"]=PROTO_CONFIG.overlayApiKey),fetch(url,Object.keys(headers).length>0?{headers}:void 0).then(r=>r.json()).then(d=>{var _a,_b;state.tasks=d.tasks??[],(_b=(_a=state).onTasksFetched)==null||_b.call(_a,state.tasks)}).catch(()=>{})}function submitTask(selector,cssSelector,title,description,status,source,type,annotatedElementText){let apiUrl=PROTO_CONFIG.apiUrl,allowedOrigin=location.origin,fetchUrl=apiUrl;try{let parsed=new URL(apiUrl);if(parsed.protocol!=="http:"&&parsed.protocol!=="https:")throw new Error(" blocked protocol");fetchUrl=parsed.href}catch{fetchUrl=new URL(apiUrl,allowedOrigin).href}return fetch(fetchUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title,description,selector,cssSelector:cssSelector||null,url:location.pathname,status:status||void 0,file:(source==null?void 0:source.file)??null,line:(source==null?void 0:source.line)??null,col:(source==null?void 0:source.col)??null,component:(source==null?void 0:source.component)??null,type:type||null,annotatedElementText:annotatedElementText||null,...PROTO_CONFIG.boardId?{boardId:PROTO_CONFIG.boardId}:{}})}).then(r=>r.json()).then(d=>{var _a,_b;return d.success&&fetchTasks(),{success:d.success===!0,taskId:(_a=d.task)==null?void 0:_a.id,taskAuthor:(_b=d.task)==null?void 0:_b.author}}).catch(err=>(console.error("[Vibeflow Studio]",err),{success:!1}))}var PAGES_URL=PROTO_CONFIG.pagesUrl;function fetchPages(){PAGES_URL&&fetch(PAGES_URL).then(r=>r.json()).then(d=>{state.pages=d.pages??[],renderPageSwitcher()}).catch(()=>{})}function renderPageSwitcher(){if(state.pageSwitcher&&(state.pageSwitcher.remove(),state.pageSwitcher=null),!state.root||state.pages.length<2)return;let currentPath=location.pathname,switcher=el("div",{className:"vibeflow-page-switcher"});switcher.appendChild(el("span",{className:"page-switcher-label"},"Pages:"));for(let page of state.pages){let tab=el("a",{className:"page-tab"+(page===currentPath||currentPath==="/"&&page==="/index.html"?" active":""),href:page},page.replace(/^\//,"").replace(/\.html$/,""));switcher.appendChild(tab)}state.root.appendChild(switcher),state.pageSwitcher=switcher}var STABLE_DATA_ATTRS=["data-testid","data-test","data-cy","data-test-id","data-id"];function buildCssSelector(element){let parts=[],node=element,depth=0;for(;node&&node!==document.body&&depth<6;){let semId=getSemanticId(node);if(semId){parts.unshift(`#${semId}`);break}let anchorAttr=null,anchorName=null;for(let attr of STABLE_DATA_ATTRS){let val=node.getAttribute(attr);if(val){anchorAttr=attr,anchorName=val;break}}if(anchorAttr&&anchorName){parts.unshift(`[${anchorAttr}="${anchorName}"]`);break}let segment=node.tagName.toLowerCase(),stableClasses=Array.from(node.classList).filter(c=>!/^[0-9a-f]{5,}/.test(c)&&!c.startsWith("vibeflow-")).slice(0,2);stableClasses.length>0&&(segment+=`.${stableClasses.join(".")}`);let parent=node.parentElement;if(parent){let parentChildren=Array.from(parent.children);parentChildren.filter(c=>c.tagName===node.tagName).length>1&&(segment+=`:nth-child(${parentChildren.indexOf(node)+1})`)}parts.unshift(segment),node=node.parentElement,depth++}return parts.join(" > ")}function resolveTestId(el2){let attrs=STABLE_DATA_ATTRS,node=el2;for(;node&&node!==document.body;){for(let attr of attrs){let val=node.getAttribute(attr);if(val)return{attr,value:val}}let id=node.getAttribute("id");if(id&&isSemanticId(id))return{attr:"id",value:id};node=node.parentElement}return null}function isSemanticId(id){return!/^[0-9a-f-]{8,}$/i.test(id)&&!/^\d+$/.test(id)}function getSemanticId(el2){let id=el2.getAttribute("id");return id&&isSemanticId(id)?id:null}function parseComponentFromReactStack(stack){let SKIP=/^(react-stack|jsxDEV|renderWith|Object\.|_callee)/i;for(let line of stack.split(`
1595
+ }`;function setupShadowDom(){let host=document.createElement("div");host.id="vibeflow-studio-root",host.style.pointerEvents="none",document.body.appendChild(host);let root=host.attachShadow({mode:"open"}),styleEl=document.createElement("style");styleEl.textContent=OVERLAY_CSS,root.appendChild(styleEl);let hostStyle=document.createElement("style");return hostStyle.textContent=HOST_PAGE_CSS,document.head.appendChild(hostStyle),{host,root}}function loadPrefs(){try{let p=JSON.parse(localStorage.getItem(PREFS_KEY)??"{}");state.indicatorsVisible=p.indicatorsVisible===!0,state.sidebarShowDone=p.sidebarShowDone!==!1,state.showAllPages=p.showAllPages===!0,state.theme="dark",applyOverlayTheme(state.theme)}catch{}}function applyOverlayTheme(theme){state.theme=theme,state.host&&state.host.setAttribute("data-theme",theme)}function startAnnotationHover(host){document.addEventListener("mouseover",e=>onAnnotateMouseOver(e,host),!0),document.addEventListener("mouseout",onAnnotateMouseOut,!0)}function stopAnnotationHover(host){if(document.removeEventListener("mouseover",e=>onAnnotateMouseOver(e,host),!0),document.removeEventListener("mouseout",onAnnotateMouseOut,!0),state.hoverTarget){try{state.hoverTarget.classList.remove("vibeflow-hover-highlight")}catch{}state.hoverTarget=null}}function onAnnotateMouseOver(e,host){let t=e.target;if(!(!t||t===document.documentElement||t===document.body)&&e.composedPath().indexOf(host)===-1&&state.hoverTarget!==t){if(state.hoverTarget)try{state.hoverTarget.classList.remove("vibeflow-hover-highlight")}catch{}state.hoverTarget=t;try{t.classList.add("vibeflow-hover-highlight")}catch{}}}function onAnnotateMouseOut(e){let t=e.target;if(t===state.hoverTarget){try{t.classList.remove("vibeflow-hover-highlight")}catch{}state.hoverTarget=null}}function setAnnotateHighlight(element){if(clearAnnotateHighlight(),!!element){state.annotateHighlightTarget=element;try{element.classList.add("vibeflow-annotate-highlight")}catch{}}}function clearAnnotateHighlight(){if(state.annotateHighlightTarget){try{state.annotateHighlightTarget.classList.remove("vibeflow-annotate-highlight")}catch{}state.annotateHighlightTarget=null}}function el(tag,props,...children){let node=document.createElement(tag);if(props)for(let key of Object.keys(props))key==="className"?node.className=props[key]:key==="placeholder"?node.placeholder=props[key]:key==="type"?node.type=props[key]:key==="value"?node.value=props[key]:node.setAttribute(key,props[key]);for(let child of children)child!=null&&node.appendChild(typeof child=="string"?document.createTextNode(child):child);return node}var healthPollTimer=null;function connectWS(){if(PROTO_CONFIG.wsUrl){state.reconnectTimer&&(clearTimeout(state.reconnectTimer),state.reconnectTimer=null);try{state.ws=new WebSocket(PROTO_CONFIG.wsUrl)}catch{scheduleReconnect();return}state.ws.onopen=()=>{state.reconnectAttempt=0,state.pingInterval&&clearInterval(state.pingInterval),state.pingInterval=setInterval(()=>{var _a;((_a=state.ws)==null?void 0:_a.readyState)===WebSocket.OPEN&&state.ws.send(JSON.stringify({type:"ping"}))},PING_INTERVAL)},state.ws.onmessage=e=>{var _a,_b,_c,_d;let msg;try{msg=JSON.parse(e.data)}catch{return}msg.type!=="pong"&&(msg.type==="reload"&&location.reload(),msg.type==="tasks-updated"&&((_b=(_a=state).onTasksUpdatedMessage)==null||_b.call(_a)),(msg.type==="task-changed"||msg.type==="task-deleted")&&((_d=(_c=state).onTasksUpdatedMessage)==null||_d.call(_c)))},state.ws.onclose=()=>{state.pingInterval&&(clearInterval(state.pingInterval),state.pingInterval=null),scheduleReconnect()},state.ws.onerror=()=>{var _a;(_a=state.ws)==null||_a.close()},stopHealthPoll(),healthPollTimer=setInterval(checkHealth,HEALTH_POLL_INTERVAL)}}function scheduleReconnect(){let delay=Math.min(RECONNECT_BASE*2**state.reconnectAttempt,RECONNECT_MAX);state.reconnectAttempt++,state.reconnectTimer=setTimeout(connectWS,delay)}function stopHealthPoll(){healthPollTimer&&(clearInterval(healthPollTimer),healthPollTimer=null)}function checkHealth(){if(!PROTO_CONFIG.wsUrl||state.ws&&state.ws.readyState===WebSocket.OPEN)return;let healthUrl=PROTO_CONFIG.wsUrl.replace("ws://","http://").replace("wss://","https://").replace("/ws","/api/health");fetch(healthUrl,{signal:AbortSignal.timeout(3e3)}).then(r=>{r.ok||(stopHealthPoll(),scheduleReconnect())}).catch(()=>{stopHealthPoll(),scheduleReconnect()})}function setupWsVisibilityReconnect(){document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(!state.ws||state.ws.readyState!==WebSocket.OPEN)&&(state.reconnectAttempt=0,connectWS())})}function fetchTasks(){let url=PROTO_CONFIG.boardId?`${PROTO_CONFIG.apiUrl}?boardId=${encodeURIComponent(PROTO_CONFIG.boardId)}`:PROTO_CONFIG.apiUrl,headers={};PROTO_CONFIG.overlayApiKey&&(headers["X-Overlay-Api-Key"]=PROTO_CONFIG.overlayApiKey),fetch(url,Object.keys(headers).length>0?{headers}:void 0).then(r=>r.json()).then(d=>{var _a,_b;state.tasks=d.tasks??[],(_b=(_a=state).onTasksFetched)==null||_b.call(_a,state.tasks)}).catch(()=>{})}function buildTaskPayload(args){var _a,_b,_c,_d,_e,_f;let tags=Array.isArray((_a=args.advanced)==null?void 0:_a.tags)&&args.advanced.tags.length>0?args.advanced.tags:void 0;return{title:args.title,description:args.description,selector:args.selector,cssSelector:args.cssSelector||null,url:typeof location<"u"?location.pathname:void 0,status:args.status||void 0,file:((_b=args.source)==null?void 0:_b.file)??null,line:((_c=args.source)==null?void 0:_c.line)??null,col:((_d=args.source)==null?void 0:_d.col)??null,component:((_e=args.source)==null?void 0:_e.component)??null,type:args.type||null,annotatedElementText:args.annotatedElementText||null,priority:((_f=args.advanced)==null?void 0:_f.priority)||void 0,tags,...args.boardId?{boardId:args.boardId}:{}}}function submitTask(selector,cssSelector,title,description,status,source,type,annotatedElementText,advanced){let apiUrl=PROTO_CONFIG.apiUrl,allowedOrigin=location.origin,fetchUrl=apiUrl;try{let parsed=new URL(apiUrl);if(parsed.protocol!=="http:"&&parsed.protocol!=="https:")throw new Error(" blocked protocol");fetchUrl=parsed.href}catch{fetchUrl=new URL(apiUrl,allowedOrigin).href}return fetch(fetchUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(buildTaskPayload({selector,cssSelector,title,description,status,source,type,annotatedElementText,advanced,boardId:PROTO_CONFIG.boardId}))}).then(r=>r.json()).then(d=>{var _a,_b;return d.success&&fetchTasks(),{success:d.success===!0,taskId:(_a=d.task)==null?void 0:_a.id,taskAuthor:(_b=d.task)==null?void 0:_b.author}}).catch(err=>(console.error("[Vibeflow Studio]",err),{success:!1}))}var PAGES_URL=PROTO_CONFIG.pagesUrl;function fetchPages(){PAGES_URL&&fetch(PAGES_URL).then(r=>r.json()).then(d=>{state.pages=d.pages??[],renderPageSwitcher()}).catch(()=>{})}function renderPageSwitcher(){if(state.pageSwitcher&&(state.pageSwitcher.remove(),state.pageSwitcher=null),!state.root||state.pages.length<2)return;let currentPath=location.pathname,switcher=el("div",{className:"vibeflow-page-switcher"});switcher.appendChild(el("span",{className:"page-switcher-label"},"Pages:"));for(let page of state.pages){let tab=el("a",{className:"page-tab"+(page===currentPath||currentPath==="/"&&page==="/index.html"?" active":""),href:page},page.replace(/^\//,"").replace(/\.html$/,""));switcher.appendChild(tab)}state.root.appendChild(switcher),state.pageSwitcher=switcher}var STABLE_DATA_ATTRS=["data-testid","data-test","data-cy","data-test-id","data-id"];function buildCssSelector(element){let parts=[],node=element,depth=0;for(;node&&node!==document.body&&depth<6;){let semId=getSemanticId(node);if(semId){parts.unshift(`#${semId}`);break}let anchorAttr=null,anchorName=null;for(let attr of STABLE_DATA_ATTRS){let val=node.getAttribute(attr);if(val){anchorAttr=attr,anchorName=val;break}}if(anchorAttr&&anchorName){parts.unshift(`[${anchorAttr}="${anchorName}"]`);break}let segment=node.tagName.toLowerCase(),stableClasses=Array.from(node.classList).filter(c=>!/^[0-9a-f]{5,}/.test(c)&&!c.startsWith("vibeflow-")).slice(0,2);stableClasses.length>0&&(segment+=`.${stableClasses.join(".")}`);let parent=node.parentElement;if(parent){let parentChildren=Array.from(parent.children);parentChildren.filter(c=>c.tagName===node.tagName).length>1&&(segment+=`:nth-child(${parentChildren.indexOf(node)+1})`)}parts.unshift(segment),node=node.parentElement,depth++}return parts.join(" > ")}function resolveTestId(el2){let attrs=STABLE_DATA_ATTRS,node=el2;for(;node&&node!==document.body;){for(let attr of attrs){let val=node.getAttribute(attr);if(val)return{attr,value:val}}let id=node.getAttribute("id");if(id&&isSemanticId(id))return{attr:"id",value:id};node=node.parentElement}return null}function isSemanticId(id){return!/^[0-9a-f-]{8,}$/i.test(id)&&!/^\d+$/.test(id)}function getSemanticId(el2){let id=el2.getAttribute("id");return id&&isSemanticId(id)?id:null}function parseComponentFromReactStack(stack){let SKIP=/^(react-stack|jsxDEV|renderWith|Object\.|_callee)/i;for(let line of stack.split(`
1596
1596
  `)){let m=line.match(/^\s*at\s+([A-Z][A-Za-z0-9._$]*)\s+\(/);if(m&&!SKIP.test(m[1]))return m[1]}return null}function parseFunctionFromReactStack(stack){let SKIP=/^(react-stack|jsxDEV|renderWith|Object\.|_callee)/i;for(let line of stack.split(`
1597
1597
  `)){let m=line.match(/^\s*at\s+([A-Za-z_$][A-Za-z0-9._$]*)\s+\(/);if(m&&!SKIP.test(m[1]))return m[1]}return null}function getReactSource(el2){var _a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l,_m,_n,_o,_p,_q,_r,_s;let fiberKey=Object.keys(el2).find(k=>k.startsWith("__reactFiber")||k.startsWith("__reactInternalInstance"));if(!fiberKey)return null;let fiber=el2[fiberKey],result={},nearestComponent,parentComponent,depth=0;for(;fiber&&depth<20;){if(fiber._debugSource&&!result.file&&(result.file=fiber._debugSource.fileName,result.line=fiber._debugSource.lineNumber,result.col=fiber._debugSource.columnNumber),!result.component){let ownerName=((_b=(_a=fiber._debugOwner)==null?void 0:_a.type)==null?void 0:_b.displayName)??((_d=(_c=fiber._debugOwner)==null?void 0:_c.type)==null?void 0:_d.name);ownerName&&!nearestComponent&&(nearestComponent=ownerName);let ownerParentName=((_h=(_g=(_f=(_e=fiber._debugOwner)==null?void 0:_e.return)==null?void 0:_f._debugOwner)==null?void 0:_g.type)==null?void 0:_h.displayName)??((_l=(_k=(_j=(_i=fiber._debugOwner)==null?void 0:_i.return)==null?void 0:_j._debugOwner)==null?void 0:_k.type)==null?void 0:_l.name)??((_o=(_n=(_m=fiber._debugOwner)==null?void 0:_m._debugOwner)==null?void 0:_n.type)==null?void 0:_o.displayName)??((_r=(_q=(_p=fiber._debugOwner)==null?void 0:_p._debugOwner)==null?void 0:_q.type)==null?void 0:_r.name);ownerParentName&&ownerParentName!==ownerName&&!parentComponent&&(parentComponent=ownerParentName)}if(!result.component){let stack=(_s=fiber._debugStack)==null?void 0:_s.stack;if(stack){let name=parseComponentFromReactStack(stack);name&&!nearestComponent&&(nearestComponent=name);let functionName=parseFunctionFromReactStack(stack);functionName&&(result.functionName=functionName)}}if((result.file||result.component)&&depth>0)break;fiber=fiber.return,depth++}return nearestComponent&&(result.component=parentComponent?`${parentComponent} > ${nearestComponent}`:nearestComponent),result.file!=null||result.component!=null?result:null}function getVue3Source(el2){var _a,_b,_c;let node=el2;for(;node;){let instance=node.__vueParentComponent;if(instance)return{file:((_a=instance.type)==null?void 0:_a.__file)??void 0,component:((_b=instance.type)==null?void 0:_b.name)??((_c=instance.type)==null?void 0:_c.__name)??void 0};node=node.parentElement}return null}function getVue2Source(el2){var _a,_b;let node=el2;for(;node;){let vm=node.__vue__;if(vm)return{file:((_a=vm.$options)==null?void 0:_a.__file)??void 0,component:((_b=vm.$options)==null?void 0:_b.name)??void 0};node=node.parentElement}return null}function getAngularSource(el2){var _a;let ng=window.ng;if(!ng)return null;let node=el2;for(;node;){try{let component=ng.getComponent(node);if(component)return{component:((_a=component.constructor)==null?void 0:_a.name)??void 0}}catch{}node=node.parentElement}return null}function getPreactSource(el2){var _a,_b,_c,_d;let e=el2,children=((_a=e.__P)==null?void 0:_a.__k)??[],GENERIC_NAMES=new Set(["Object","VNode","VNode2"]);for(let vnode of children){if(!vnode||typeof vnode!="object")continue;let v=vnode,typeNameRaw2=(_b=v==null?void 0:v.type)==null?void 0:_b.name,ctorNameRaw=(_c=v==null?void 0:v.constructor)==null?void 0:_c.name,ctorName=ctorNameRaw&&!GENERIC_NAMES.has(ctorNameRaw)?ctorNameRaw:void 0,name=typeNameRaw2??ctorName??void 0;if(name)return{component:name}}let attrNode=e.__preactattr__;if(!attrNode)return null;let typeNameRaw=(_d=attrNode==null?void 0:attrNode.type)==null?void 0:_d.name;return typeNameRaw?{component:typeNameRaw}:null}function resolveFrameworkSource(el2){return getReactSource(el2)??getVue3Source(el2)??getVue2Source(el2)??getAngularSource(el2)??getPreactSource(el2)}function buildSourcePointer(element){let cssSelector=buildCssSelector(element),pointer={selector:cssSelector,display:cssSelector},tier1=resolveFrameworkSource(element);tier1&&(tier1.file!=null&&(pointer.file=tier1.file),tier1.line!=null&&(pointer.line=tier1.line),tier1.col!=null&&(pointer.col=tier1.col),tier1.component!=null&&(pointer.component=tier1.component),tier1.functionName!=null&&(pointer.functionName=tier1.functionName));let protoId=element.getAttribute("data-vibeflow-id");if(protoId)return pointer.selector=`[data-vibeflow-id="${protoId}"]`,pointer.display=protoId,pointer;let testIdResult=resolveTestId(element);if(testIdResult&&(pointer.test_id=testIdResult.value),pointer.file){let fileName=pointer.file.replace(/\\/g,"/").split("/").pop()??pointer.file;pointer.selector=pointer.line==null?pointer.file:`${pointer.file}:${pointer.line}`,pointer.display=pointer.line==null?fileName:`${fileName}:${pointer.line}`}else pointer.component?(pointer.selector=pointer.component,pointer.display=pointer.component):pointer.functionName?(pointer.selector=pointer.functionName,pointer.display=pointer.functionName):testIdResult&&(pointer.selector=testIdResult.attr==="id"?`#${testIdResult.value}`:`[${testIdResult.attr}="${testIdResult.value}"]`,pointer.display=`${testIdResult.attr}:${testIdResult.value}`);return pointer}var VLQ_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",VLQ_TABLE={};for(let i=0;i<VLQ_CHARS.length;i++)VLQ_TABLE[VLQ_CHARS.charCodeAt(i)]=i;function vlqDecodeInt(s,pos){let result=0,shift=0,byte=0;do byte=VLQ_TABLE[s.charCodeAt(pos++)]??0,result|=(byte&31)<<shift,shift+=5;while(byte&32);return[result&1?-(result>>1):result>>1,pos]}function vlqDecodeSegment(seg){let out=[],pos=0;for(;pos<seg.length;){let[n,next]=vlqDecodeInt(seg,pos);out.push(n),pos=next}return out}function findFlatMapping(map,genLine,genCol){if(!map.mappings||!map.sources)return null;let lines=map.mappings.split(";"),srcIdx=0,srcLine=0,srcCol=0,best=null;for(let i=0;i<lines.length;i++){let genColAcc=0;for(let seg of lines[i].split(",")){if(!seg)continue;let d=vlqDecodeSegment(seg);if(!(d.length<1)&&(genColAcc+=d[0],d.length>=4&&(srcIdx+=d[1],srcLine+=d[2],srcCol+=d[3],i===genLine&&genColAcc<=genCol&&(best={source:map.sources[srcIdx]??"",line:srcLine+1,col:srcCol+1}),i===genLine&&genColAcc>genCol)))break}if(i>genLine)break}return best}function resolveInMap(map,genLine,genCol){if(map.sections){let best=null;for(let s of map.sections)(s.offset.line<genLine||s.offset.line===genLine&&s.offset.column<=genCol)&&(best=s);if(!best)return null;let relLine=genLine-best.offset.line,relCol=relLine===0?genCol-best.offset.column:genCol;return resolveInMap(best.map,relLine,relCol)}return findFlatMapping(map,genLine,genCol)}var smCache=new Map;function fetchSourceMap(chunkUrl){let p=smCache.get(chunkUrl);return p||(p=fetch(`${chunkUrl}.map`).then(r=>r.ok?r.json():null).catch(()=>null),smCache.set(chunkUrl,p)),p}var SKIP_FRAME_RE=/node_modules|_next\/dist|react-stack-top-frame|jsxDEV|react_stack_bottom_frame|fakeJSXCallSite|initializeElement/;function parseUserFrame(stack){for(let line of stack.split(`
1598
1598
  `)){let m=line.match(/at [^(]+ \((https?:\/\/[^)]+):(\d+):(\d+)\)/);if(!m)continue;let[,url,lineStr,colStr]=m;if(!SKIP_FRAME_RE.test(url))return{chunkUrl:url,line:parseInt(lineStr,10),col:parseInt(colStr,10)}}return null}function getDebugStackStr(el2){var _a;let fiberKey=Object.keys(el2).find(k=>k.startsWith("__reactFiber")||k.startsWith("__reactInternalInstance"));if(!fiberKey)return null;let fiber=el2[fiberKey];return((_a=fiber==null?void 0:fiber._debugStack)==null?void 0:_a.stack)??null}function cleanSourcePath(raw){return raw.replace(/\?.*$/,"").replace(/^https?:\/\/[^/]+\/@fs/,"").replace(/^https?:\/\/[^/]+/,"").replace(/^file:\/\/\/app\//,"").replace(/^file:\/\/\//,"").replace(/\[project\]\//g,"").replace(/%28/g,"(").replace(/%29/g,")").replace(/%20/g," ")}var DIRECT_SRC_EXT_RE=/\.m?[tj]sx?(\?[^)]*)?$/,BUNDLE_CHUNK_RE=/chunk[-_.][0-9a-f]{6,}|\.chunk\.[0-9a-f]|webpack|_next\/(?:static\/chunks|dist)|rollup/i;function isDirectSourceUrl(url){return!(!url||!DIRECT_SRC_EXT_RE.test(url)||BUNDLE_CHUNK_RE.test(url)||SKIP_FRAME_RE.test(url))}function captureV8CallSites(err){if(typeof Error.captureStackTrace!="function")return null;let prev=Error.prepareStackTrace,captured=null;try{Error.prepareStackTrace=(_,sites)=>(captured=sites,sites.map(s=>` at ${s.getFunctionName()??"<anonymous>"} (${s.getFileName()}:${s.getLineNumber()}:${s.getColumnNumber()})`).join(`
1599
1599
  `)),err.stack}finally{Error.prepareStackTrace=prev}return captured}function getDebugStackError(el2){let fiberKey=Object.keys(el2).find(k=>k.startsWith("__reactFiber")||k.startsWith("__reactInternalInstance"));if(!fiberKey)return null;let fiber=el2[fiberKey],ds=fiber==null?void 0:fiber._debugStack;return ds instanceof Error?ds:null}function resolveDirectSourceFromStack(el2){var _a,_b,_c,_d;let stackErr=getDebugStackError(el2);if(!stackErr)return null;let callSites=captureV8CallSites(stackErr);if(callSites)for(let site of callSites){let fileName=((_a=site.getFileName)==null?void 0:_a.call(site))??null;if(!(!fileName||SKIP_FRAME_RE.test(fileName))&&isDirectSourceUrl(fileName))return{file:cleanSourcePath(fileName),line:((_b=site.getLineNumber)==null?void 0:_b.call(site))??1,col:((_c=site.getColumnNumber)==null?void 0:_c.call(site))??1,fnName:((_d=site.getFunctionName)==null?void 0:_d.call(site))??void 0}}let stack=typeof stackErr.stack=="string"?stackErr.stack:null;if(!stack)return null;for(let raw of stack.split(`
1600
1600
  `)){let m=raw.match(/^\s*at [^(]+ \(([^)]+):(\d+):(\d+)\)$/)??raw.match(/^\s*at ((?:https?|file):\/\/[^:]+):(\d+):(\d+)$/);if(!m)continue;let[,url,lineStr,colStr]=m;if(isDirectSourceUrl(url)&&!SKIP_FRAME_RE.test(url))return{file:cleanSourcePath(url),line:parseInt(lineStr,10),col:parseInt(colStr,10)}}return null}async function resolveSourceFromStack(el2){let stack=getDebugStackStr(el2);if(!stack)return null;let frame=parseUserFrame(stack);if(!frame)return null;let map=await fetchSourceMap(frame.chunkUrl);if(!map)return null;let mapped=resolveInMap(map,frame.line-1,frame.col-1);return mapped?{file:cleanSourcePath(mapped.source),line:mapped.line,col:mapped.col}:null}async function buildSourcePointerAsync(element){let pointer=buildSourcePointer(element);if(pointer.file)return pointer;let direct=resolveDirectSourceFromStack(element);if(direct){pointer.file=direct.file,pointer.line=direct.line,pointer.col=direct.col;let fileName2=direct.file.replace(/\\/g,"/").split("/").pop()??direct.file;return pointer.selector=`${direct.file}:${direct.line}`,pointer.display=`${fileName2}:${direct.line}`,pointer}let resolved=await resolveSourceFromStack(element);if(!resolved)return pointer;pointer.file=resolved.file,pointer.line=resolved.line,pointer.col=resolved.col;let fileName=resolved.file.replace(/\\/g,"/").split("/").pop()??resolved.file;return pointer.selector=`${resolved.file}:${resolved.line}`,pointer.display=`${fileName}:${resolved.line}`,pointer}var import_react23=__toESM(require_react(),1);var import_jsx_runtime=__toESM(require_jsx_runtime(),1);var import_react3=__toESM(require_react(),1);var import_react2=__toESM(require_react());var toKebabCase=string=>string.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),mergeClasses=(...classes)=>classes.filter((className,index,array)=>!!className&&className.trim()!==""&&array.indexOf(className)===index).join(" ").trim();var import_react=__toESM(require_react());var defaultAttributes={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"};var Icon=(0,import_react.forwardRef)(({color="currentColor",size=24,strokeWidth=2,absoluteStrokeWidth,className="",children,iconNode,...rest},ref)=>(0,import_react.createElement)("svg",{ref,...defaultAttributes,width:size,height:size,stroke:color,strokeWidth:absoluteStrokeWidth?Number(strokeWidth)*24/Number(size):strokeWidth,className:mergeClasses("lucide",className),...rest},[...iconNode.map(([tag,attrs])=>(0,import_react.createElement)(tag,attrs)),...Array.isArray(children)?children:[children]]));var createLucideIcon=(iconName,iconNode)=>{let Component=(0,import_react2.forwardRef)(({className,...props},ref)=>(0,import_react2.createElement)(Icon,{ref,iconNode,className:mergeClasses(`lucide-${toKebabCase(iconName)}`,className),...props}));return Component.displayName=`${iconName}`,Component};var CircleCheckBig=createLucideIcon("CircleCheckBig",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);var Eye=createLucideIcon("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);var Lock=createLucideIcon("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);var MessageCircle=createLucideIcon("MessageCircle",[["path",{d:"M7.9 20A9 9 0 1 0 4 16.1L2 22Z",key:"vv11sd"}]]);var Paperclip=createLucideIcon("Paperclip",[["path",{d:"M13.234 20.252 21 12.3",key:"1cbrk9"}],["path",{d:"m16 6-8.414 8.586a2 2 0 0 0 0 2.828 2 2 0 0 0 2.828 0l8.414-8.586a4 4 0 0 0 0-5.656 4 4 0 0 0-5.656 0l-8.415 8.585a6 6 0 1 0 8.486 8.486",key:"1pkts6"}]]);var import_jsx_runtime2=__toESM(require_jsx_runtime(),1),TYPE_BADGE_STYLES={Bug:{background:"rgba(239,68,68,0.12)",color:"#f87171",border:"rgba(239,68,68,0.25)"},Research:{background:"rgba(192,132,252,0.12)",color:"#c084fc",border:"rgba(139,92,246,0.2)"},Task:{background:"rgba(148,163,184,0.1)",color:"#94a3b8",border:"rgba(148,163,184,0.2)"}};function TypeBadge({type,style}){let effectiveType=typeof type=="string"&&type.trim()&&type!=="[object Object]"&&TYPE_BADGE_STYLES[type]?type:"Task",colors=TYPE_BADGE_STYLES[effectiveType];return(0,import_jsx_runtime2.jsx)("span",{style:{fontSize:9,fontWeight:700,letterSpacing:"0.04em",padding:"1px 5px",borderRadius:3,flexShrink:0,textTransform:"uppercase",background:colors.background,color:colors.color,border:`1px solid ${colors.border}`,lineHeight:"1.5",...style},children:effectiveType})}var import_jsx_runtime3=__toESM(require_jsx_runtime(),1),PRIORITY_BADGE_STYLES={Critical:{background:"rgba(239,68,68,0.15)",color:"#f87171",border:"rgba(239,68,68,0.3)"},High:{background:"rgba(249,115,22,0.12)",color:"#fb923c",border:"rgba(249,115,22,0.25)"},Medium:{background:"rgba(234,179,8,0.12)",color:"#facc15",border:"rgba(234,179,8,0.25)"},Low:{background:"rgba(148,163,184,0.1)",color:"#94a3b8",border:"rgba(148,163,184,0.2)"}};function PriorityBadge({priority,style}){if(!priority||!PRIORITY_BADGE_STYLES[priority])return null;let colors=PRIORITY_BADGE_STYLES[priority];return(0,import_jsx_runtime3.jsx)("span",{style:{fontSize:9,fontWeight:700,letterSpacing:"0.04em",padding:"1px 5px",borderRadius:3,flexShrink:0,textTransform:"uppercase",background:colors.background,color:colors.color,border:`1px solid ${colors.border}`,lineHeight:"1.5",...style},children:priority})}var import_jsx_runtime4=__toESM(require_jsx_runtime(),1);var import_jsx_runtime5=__toESM(require_jsx_runtime(),1);var import_react6=__toESM(require_react(),1);var import_react4=__toESM(require_react(),1);var TASK_TYPES=[{value:"Task",icon:"\u2611",label:"Task",css:"type-task",tooltip:"A general task or feature to implement."},{value:"Bug",icon:"\u{1F41E}",label:"Bug",css:"type-bug",tooltip:"A defect \u2014 annotator collects page errors and console logs to help reproduce it."},{value:"Research",icon:"\u{1F52C}",label:"Research",css:"type-research",tooltip:"A research task \u2014 agent will NOT write code but must attach a findings report."}],TASK_TYPE_VALUES=TASK_TYPES.map(t=>t.value),TASK_TYPE_ICONS=Object.fromEntries(TASK_TYPES.map(t=>[t.value,t.icon])),TASK_TYPE_CSS=Object.fromEntries(TASK_TYPES.map(t=>[t.value,t.css])),TASK_TYPE_COLORS={Task:"#94a3b8",Bug:"#ef4444",Research:"#a855f7"};function getTaskTypeIcon(type){return TASK_TYPE_ICONS[type??"Task"]??"\u2611"}function getTaskTypeColor(type){return TASK_TYPE_COLORS[type??"Task"]??TASK_TYPE_COLORS.Task}var import_jsx_runtime6=__toESM(require_jsx_runtime(),1);function TypePicker({id,value,onChange,disabled}){let[open,setOpen]=import_react4.default.useState(!1),rootRef=import_react4.default.useRef(null),current=TASK_TYPES.find(t=>t.value===value)??TASK_TYPES[0];return import_react4.default.useEffect(()=>{let handler=e=>{var _a;(_a=rootRef.current)!=null&&_a.contains(e.target)||setOpen(!1)};return document.addEventListener("click",handler),()=>document.removeEventListener("click",handler)},[]),(0,import_jsx_runtime6.jsxs)("div",{id,ref:rootRef,style:{position:"relative",display:"inline-block"},children:[(0,import_jsx_runtime6.jsxs)("button",{type:"button",title:current==null?void 0:current.tooltip,onClick:e=>{e.preventDefault(),disabled||setOpen(o=>!o)},style:{display:"inline-flex",alignItems:"center",gap:5,padding:"3px 8px",borderRadius:6,border:"1px solid var(--p-border, rgba(255,255,255,0.08))",background:"var(--p-hover, rgba(255,255,255,0.05))",color:"var(--p-text-m, rgba(255,255,255,0.7))",fontSize:12,cursor:"pointer",whiteSpace:"nowrap"},children:[(0,import_jsx_runtime6.jsx)("span",{style:{fontSize:13},children:current==null?void 0:current.icon}),(0,import_jsx_runtime6.jsx)("span",{children:current==null?void 0:current.label})]}),open&&(0,import_jsx_runtime6.jsx)("div",{style:{position:"absolute",top:"100%",left:0,marginTop:4,background:"var(--p-card, #1e293b)",border:"1px solid var(--p-border-s, rgba(255,255,255,0.12))",borderRadius:8,padding:"4px 0",zIndex:200,minWidth:140,boxShadow:"0 8px 24px rgba(0,0,0,0.4)"},children:TASK_TYPES.map(t=>(0,import_jsx_runtime6.jsxs)("button",{type:"button",title:t.tooltip,onClick:()=>{onChange(t.value),setOpen(!1)},style:{display:"flex",alignItems:"center",gap:8,width:"100%",padding:"6px 12px",border:"none",background:t.value===value?"var(--p-hover, rgba(255,255,255,0.06))":"transparent",color:t.value===value?"var(--p-text, #fff)":"var(--p-text-f, rgba(255,255,255,0.55))",fontSize:12,cursor:"pointer",textAlign:"left"},children:[(0,import_jsx_runtime6.jsx)("span",{style:{fontSize:14,lineHeight:1},children:t.icon}),(0,import_jsx_runtime6.jsx)("span",{children:t.label})]},t.value))})]})}var import_react5=__toESM(require_react(),1);function splitTableCells(row){return row.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(cell=>cell.trim())}function isTableDivider(line){return/^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?\s*$/.test(line)}function renderTables(markdown){let lines=markdown.split(`
1601
1601
  `),out=[],i=0;for(;i<lines.length;){let headerLine=lines[i]??"",dividerLine=lines[i+1]??"";if(headerLine.includes("|")&&isTableDivider(dividerLine)){let headerCells=splitTableCells(headerLine),bodyRows=[];for(i+=2;i<lines.length&&lines[i].includes("|")&&lines[i].trim()!=="";)bodyRows.push(splitTableCells(lines[i])),i+=1;let headHtml=`<tr>${headerCells.map(cell=>`<th style="text-align:left;padding:7px 10px;border:1px solid #334155;color:#e2e8f0;background:#0f172a;">${cell}</th>`).join("")}</tr>`,bodyHtml=bodyRows.map(row=>`<tr>${row.map(cell=>`<td style="padding:7px 10px;border:1px solid #334155;color:#cbd5e1;vertical-align:top;">${cell}</td>`).join("")}</tr>`).join("");out.push(`<div style="overflow-x:auto;margin:0.65em 0;"><table style="border-collapse:collapse;min-width:360px;width:100%;font-size:12px;"><thead>${headHtml}</thead><tbody>${bodyHtml}</tbody></table></div>`);continue}out.push(lines[i]),i+=1}return out.join(`
1602
- `)}function renderMarkdown(md){if(!md)return'<span style="color:#475569;font-style:italic;">No description yet</span>';let escaped=md.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");return renderTables(escaped).replace(/^### (.+)$/gm,'<h3 style="font-weight:700;margin:0.8em 0 0.3em;font-size:1.05em;color:#cbd5e1;">$1</h3>').replace(/^## (.+)$/gm,'<h2 style="font-weight:700;margin:0.8em 0 0.3em;font-size:1.2em;color:#f1f5f9;">$1</h2>').replace(/^# (.+)$/gm,'<h1 style="font-weight:700;margin:0.8em 0 0.3em;font-size:1.4em;color:#f1f5f9;">$1</h1>').replace(/[*][*]([^\n]+?)[*][*]/g,'<strong style="font-weight:700;color:#f1f5f9;">$1</strong>').replace(/__([^\n]+?)__/g,'<strong style="font-weight:700;color:#f1f5f9;">$1</strong>').replace(/[*]([^\n*]+?)[*]/g,'<em style="font-style:italic;color:#94a3b8;">$1</em>').replace(/(?<![a-zA-Z0-9])_([^_\n]+?)_(?![a-zA-Z0-9])/g,'<em style="font-style:italic;color:#94a3b8;">$1</em>').replace(/`(.+?)`/g,'<code style="font-family:Menlo,monospace;font-size:12px;background:#1e293b;padding:1px 5px;border-radius:3px;color:#7dd3fc;">$1</code>').replace(/\[([^\]]+)\]\((https?:\/\/[^)]+)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer" style="color:#60a5fa;text-decoration:underline;">$1</a>').replace(/(^|[\s(>])((https?:\/\/)[^\s<>"']+)/g,'$1<a href="$2" target="_blank" rel="noopener noreferrer" style="color:#60a5fa;text-decoration:underline;word-break:break-all;">$2</a>').replace(/(^|[^\w])#([a-f0-9]{30})(?![a-f0-9])/gi,'$1<a href="#task-$2" data-task-ref="$2" style="color:#60a5fa;text-decoration:underline;font-family:Menlo,monospace;">#$2</a>').replace(/^[-*] (.+)$/gm,'<li style="margin:0.2em 0;display:list-item;">$1</li>').replace(/^---$/gm,'<hr style="border:none;border-top:1px solid #334155;margin:0.8em 0;">').replace(/(<li[^>]*>[\s\S]*?<\/li>\n?)+/g,m=>`<ul style="padding-left:1.5em;margin:0.4em 0;list-style-type:disc;">${m}</ul>`).replace(/^(?!<[a-z]|$).+$/gm,line=>`<p style="margin:0.5em 0;">${line}</p>`)}var import_jsx_runtime7=__toESM(require_jsx_runtime(),1);function MarkdownPreview({markdown,className,style}){let rootRef=import_react5.default.useRef(null),cacheRef=import_react5.default.useRef({}),[hoverPreview,setHoverPreview]=import_react5.default.useState(null);return import_react5.default.useEffect(()=>{let root=rootRef.current;if(!root)return;function clearPreview(){setHoverPreview(null)}async function handleOver(ev){let target=ev.target,link=target==null?void 0:target.closest("a[data-task-ref]");if(!link){clearPreview();return}ev.preventDefault();let id=link.getAttribute("data-task-ref");if(!id)return;let rect=link.getBoundingClientRect(),cached=cacheRef.current[id];if(cached){setHoverPreview({id,title:cached.title,status:cached.status,x:rect.left,y:rect.bottom+6});return}try{let data=await(await fetch(`/api/tasks/${id}`)).json(),info={title:data.title??`Task ${id}`,status:data.status??"unknown"};cacheRef.current[id]=info,setHoverPreview({id,title:info.title,status:info.status,x:rect.left,y:rect.bottom+6})}catch{setHoverPreview({id,title:`Task ${id}`,status:"unknown",x:rect.left,y:rect.bottom+6})}}function handleRefClick(ev){var _a,_b;let link=(_b=(_a=ev.target)==null?void 0:_a.closest)==null?void 0:_b.call(_a,"a[data-task-ref]");if(!link)return;let refId=link.getAttribute("data-task-ref");refId&&window.dispatchEvent(new CustomEvent("vibeflow-task-ref-click",{detail:{refId}}))}return root.addEventListener("mouseover",handleOver),root.addEventListener("mouseleave",clearPreview),root.addEventListener("click",handleRefClick),()=>{root.removeEventListener("mouseover",handleOver),root.removeEventListener("mouseleave",clearPreview),root.removeEventListener("click",handleRefClick)}},[]),(0,import_jsx_runtime7.jsxs)("div",{style:{position:"relative"},children:[(0,import_jsx_runtime7.jsx)("div",{ref:rootRef,className,style,dangerouslySetInnerHTML:{__html:renderMarkdown(markdown)}}),hoverPreview&&(0,import_jsx_runtime7.jsxs)("div",{style:{position:"fixed",left:hoverPreview.x,top:hoverPreview.y,background:"#0f172a",border:"1px solid rgba(59,130,246,0.4)",color:"#e2e8f0",borderRadius:8,padding:"8px 10px",fontSize:11,boxShadow:"0 10px 24px rgba(2,6,23,0.55)",zIndex:60,pointerEvents:"none",minWidth:180},children:[(0,import_jsx_runtime7.jsxs)("div",{style:{color:"#60a5fa",fontFamily:"Menlo,monospace",marginBottom:3},children:["#",hoverPreview.id]}),(0,import_jsx_runtime7.jsx)("div",{style:{fontWeight:600,marginBottom:3},children:hoverPreview.title}),(0,import_jsx_runtime7.jsxs)("div",{style:{color:"#94a3b8"},children:["status: ",hoverPreview.status]})]})]})}var import_jsx_runtime8=__toESM(require_jsx_runtime(),1);var import_jsx_runtime9=__toESM(require_jsx_runtime(),1);var LS_SEEN_KEY="proto-comments-seen";function isNewComments(taskId,count){try{let raw=localStorage.getItem(LS_SEEN_KEY),seen=raw?JSON.parse(raw):{};return count>(seen[taskId]??0)}catch{return!1}}var KEY_DIGITS=16;var MAX_INT=BigInt("9".repeat(KEY_DIGITS));var import_react8=__toESM(require_react(),1);var import_react7=__toESM(require_react(),1),import_react_dom=__toESM(require_react_dom(),1);var TAG_PALETTE=[{bg:"color-mix(in srgb, var(--p-blue) 14%, transparent)",text:"var(--p-blue-200)",border:"color-mix(in srgb, var(--p-blue) 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-green) 14%, transparent)",text:"var(--p-green-300)",border:"color-mix(in srgb, var(--p-green) 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-purple) 14%, transparent)",text:"var(--p-purple-300)",border:"color-mix(in srgb, var(--p-purple) 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-amber) 14%, transparent)",text:"var(--p-amber-300)",border:"color-mix(in srgb, var(--p-amber) 30%, transparent)"},{bg:"color-mix(in srgb, #f472b6 14%, transparent)",text:"#f9a8d4",border:"color-mix(in srgb, #f472b6 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-cyan) 14%, transparent)",text:"var(--p-cyan-300)",border:"color-mix(in srgb, var(--p-cyan) 30%, transparent)"},{bg:"color-mix(in srgb, #f87171 14%, transparent)",text:"#fca5a5",border:"color-mix(in srgb, #f87171 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-text-g) 14%, transparent)",text:"var(--p-text-m)",border:"color-mix(in srgb, var(--p-text-g) 30%, transparent)"}];function hashTagName(name){let hash=0;for(let i=0;i<name.length;i++)hash=hash*31+name.charCodeAt(i)>>>0;return hash%TAG_PALETTE.length}function getTagColors(name){return TAG_PALETTE[hashTagName(name)]}var import_jsx_runtime10=__toESM(require_jsx_runtime(),1);function TagPills({tags,onRemove,size="sm"}){if(!tags.length)return null;let padding=size==="xs"?"1px 6px":"2px 7px",fontSize=size==="xs"?9:10;return(0,import_jsx_runtime10.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:3,alignItems:"center"},children:tags.map(tag=>{let{bg,text,border}=getTagColors(tag);return(0,import_jsx_runtime10.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:3,padding,borderRadius:100,background:bg,border:`1px solid ${border}`,color:text,fontSize,fontWeight:600,whiteSpace:"nowrap"},children:[tag,onRemove&&(0,import_jsx_runtime10.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),onRemove(tag)},style:{display:"flex",background:"none",border:"none",color:text,cursor:"pointer",padding:0,lineHeight:1,opacity:.7},onMouseEnter:e=>{e.currentTarget.style.opacity="1"},onMouseLeave:e=>{e.currentTarget.style.opacity="0.7"},children:"\xD7"})]},tag)})})}var import_jsx_runtime11=__toESM(require_jsx_runtime(),1);function isImageFileName(name){return/\.(png|jpe?g|gif|webp|svg|avif)$/i.test(name)}function withHexAlpha(hexColor,alpha){if(!/^#[0-9a-fA-F]{6}$/.test(hexColor))return;let normalized=Math.max(0,Math.min(1,alpha)),alphaHex=Math.round(normalized*255).toString(16).padStart(2,"0");return`${hexColor}${alphaHex}`}function resolveTaskCardBorderColor(statusColor,priority){return withHexAlpha(statusColor,priority==="Critical"?.36:priority==="High"?.3:.24)??"color-mix(in srgb, var(--p-text-g) 40%, transparent)"}function resolveTaskCardBgColor(typeColor){return withHexAlpha(typeColor,.1)??"transparent"}var DONE_ARTICLE_STYLE={padding:"7px 8px",gap:4,opacity:1,userSelect:"none"},DONE_INNER_ROW_STYLE={display:"flex",alignItems:"center",gap:5},DONE_CHECK_ICON_STYLE={width:12,height:12,color:"color-mix(in srgb, var(--p-green) 55%, transparent)",flexShrink:0},DONE_TITLE_STYLE={fontSize:11.5,fontWeight:600,color:"var(--p-text-m)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1},VERIFIED_BADGE_STYLE={fontSize:9,fontWeight:700,color:"#22c55e",background:"rgba(34,197,94,0.12)",border:"1px solid rgba(34,197,94,0.3)",borderRadius:4,padding:"1px 5px",marginLeft:6,flexShrink:0,letterSpacing:.5},CARD_TITLE_ROW_STYLE={display:"flex",alignItems:"center",gap:5,minWidth:0},SPINNER_SHRINK_STYLE={flexShrink:0},CARD_TITLE_TEXT_STYLE={fontSize:11.5,fontWeight:600,color:"var(--p-text)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1},DESC_THUMB_ROW_STYLE={display:"flex",alignItems:"flex-start",gap:8},DESC_TEXT_STYLE={fontSize:10,color:"var(--p-text-g)",lineHeight:"1.45",overflow:"hidden",display:"-webkit-box",WebkitBoxOrient:"vertical",WebkitLineClamp:2,flex:1,minWidth:0},THUMB_WRAPPER_STYLE={position:"relative",flexShrink:0},THUMB_IMG_STYLE={width:52,height:34,borderRadius:6,objectFit:"cover",border:"1px solid color-mix(in srgb, var(--p-border) 90%, transparent)",display:"block",cursor:"pointer"},CARD_FOOTER_STYLE={display:"flex",alignItems:"center",gap:2,marginTop:1},SPACER_STYLE={flex:1},TaskCard=import_react7.default.memo(function({task,col,liveActivity,onOpen,onDragStart}){var _a;let isInProgress=col.id==="in-progress",isDone=col.id==="done",[showThumbPreview,setShowThumbPreview]=import_react7.default.useState(!1),[thumbRect,setThumbRect]=import_react7.default.useState(null),thumbRef=import_react7.default.useRef(null),commentCount=task.commentCount??0,fileCount=task.fileCount??0,hasNewComments=commentCount>0&&isNewComments(task.id,commentCount),cardBorderColor=resolveTaskCardBorderColor(col.color,task.priority),typeColor=getTaskTypeColor(task.type),cardBgColor=resolveTaskCardBgColor(typeColor),firstImage=(_a=task.files)==null?void 0:_a.find(f=>isImageFileName(f.name)),thumbnailUrl=firstImage?`/api/tasks/${task.id}/files/${encodeURIComponent(firstImage.name)}`:null;function handleDragStart(e){onDragStart(e,task.id),e.currentTarget.classList.add("dragging")}function handleDragEnd(e){e.currentTarget.classList.remove("dragging")}function handleClick(){onOpen(task)}return isDone?(0,import_jsx_runtime11.jsx)("article",{className:"task-card",draggable:!0,"data-task-id":task.id,style:{...DONE_ARTICLE_STYLE},onDragStart:handleDragStart,onDragEnd:handleDragEnd,onClick:handleClick,children:(0,import_jsx_runtime11.jsxs)("div",{style:DONE_INNER_ROW_STYLE,children:[(0,import_jsx_runtime11.jsx)(CircleCheckBig,{style:DONE_CHECK_ICON_STYLE}),(0,import_jsx_runtime11.jsx)("span",{style:DONE_TITLE_STYLE,children:task.title}),task.verified&&(0,import_jsx_runtime11.jsx)("span",{style:VERIFIED_BADGE_STYLE,children:"\u2713 VERIFIED"})]})}):(0,import_jsx_runtime11.jsxs)("article",{className:`task-card${liveActivity?" task-live-edit":""}`,draggable:!0,"data-task-id":task.id,style:{padding:"7px 8px",gap:4,userSelect:"none",background:liveActivity?"rgba(59,130,246,0.08)":cardBgColor,border:liveActivity?"1px solid rgba(59,130,246,0.5)":cardBorderColor?`1px solid ${cardBorderColor}`:void 0,...liveActivity?{boxShadow:"0 0 0 2px rgba(59,130,246,0.14)"}:{}},onDragStart:handleDragStart,onDragEnd:handleDragEnd,onClick:handleClick,children:[(0,import_jsx_runtime11.jsxs)("div",{style:CARD_TITLE_ROW_STYLE,children:[isInProgress&&(0,import_jsx_runtime11.jsx)("span",{className:"spinner",style:SPINNER_SHRINK_STYLE}),(0,import_jsx_runtime11.jsx)("span",{style:CARD_TITLE_TEXT_STYLE,children:task.title})]}),(task.description||thumbnailUrl)&&(0,import_jsx_runtime11.jsxs)("div",{style:DESC_THUMB_ROW_STYLE,children:[task.description&&(0,import_jsx_runtime11.jsx)("div",{style:DESC_TEXT_STYLE,children:task.description}),thumbnailUrl&&(0,import_jsx_runtime11.jsxs)("div",{style:THUMB_WRAPPER_STYLE,onMouseEnter:()=>{if(thumbRef.current){let r=thumbRef.current.getBoundingClientRect();setThumbRect({top:r.top,right:r.right})}setShowThumbPreview(!0)},onMouseLeave:()=>{setShowThumbPreview(!1),setThumbRect(null)},children:[(0,import_jsx_runtime11.jsx)("img",{ref:thumbRef,src:thumbnailUrl,alt:"Task screenshot","data-role":"task-thumb",style:THUMB_IMG_STYLE}),showThumbPreview&&thumbRect&&import_react_dom.default.createPortal((0,import_jsx_runtime11.jsx)("img",{src:thumbnailUrl,alt:"Task screenshot enlarged preview","data-role":"task-thumb-preview",style:{position:"fixed",right:window.innerWidth-thumbRect.right,bottom:window.innerHeight-thumbRect.top+8,width:220,height:138,borderRadius:8,objectFit:"cover",border:"1px solid color-mix(in srgb, var(--p-border) 96%, transparent)",boxShadow:"0 10px 24px color-mix(in srgb, var(--p-bg) 75%, transparent)",pointerEvents:"none",zIndex:9999,background:"var(--p-bg)"}}),document.body)]})]}),(0,import_jsx_runtime11.jsxs)("div",{className:"flex items-center",style:CARD_FOOTER_STYLE,children:[(0,import_jsx_runtime11.jsx)(TypeBadge,{type:task.type}),task.priority&&(0,import_jsx_runtime11.jsx)(PriorityBadge,{priority:task.priority}),isInProgress&&task.assigneeName&&(0,import_jsx_runtime11.jsx)("span",{style:{fontSize:10,fontWeight:600,padding:"1px 6px",borderRadius:6,background:"rgba(59,130,246,0.12)",color:"#60a5fa",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:80},children:task.assigneeName}),task.tags&&task.tags.length>0&&(0,import_jsx_runtime11.jsx)(TagPills,{tags:task.tags,size:"xs"}),(0,import_jsx_runtime11.jsx)("div",{style:SPACER_STYLE}),liveActivity&&(0,import_jsx_runtime11.jsx)(LiveActivityBadge,{activity:liveActivity}),(0,import_jsx_runtime11.jsx)(CardIconButton,{icon:(0,import_jsx_runtime11.jsx)(MessageCircle,{style:{width:9,height:9}}),label:commentCount>0?String(commentCount):"",color:hasNewComments?"var(--p-purple)":commentCount>0?"var(--p-text-m)":"var(--p-border-t)",hoverColor:hasNewComments?"var(--p-purple-300)":"var(--p-text)",title:commentCount>0?`${commentCount} comment(s)`:"Add comment",badge:hasNewComments,badgeColor:"var(--p-purple)",onClick:e=>{e.stopPropagation(),onOpen(task,"comments")}}),(0,import_jsx_runtime11.jsx)(CardIconButton,{icon:(0,import_jsx_runtime11.jsx)(Paperclip,{style:{width:9,height:9}}),label:fileCount>0?String(fileCount):"",color:fileCount>0?"var(--p-blue-300)":"var(--p-border-t)",hoverColor:fileCount>0?"var(--p-cyan-300)":"var(--p-text-sub)",title:fileCount>0?`${fileCount} file(s) attached`:"Files",onClick:e=>{e.stopPropagation(),onOpen(task,"files")}})]})]})});function CardIconButton({icon,label,color,hoverColor,title,badge,badgeColor,onClick}){let[hovered,setHovered]=import_react7.default.useState(!1);return(0,import_jsx_runtime11.jsxs)("button",{style:{display:"inline-flex",alignItems:"center",gap:2,padding:"2px 3px",borderRadius:3,border:"none",background:hovered?"color-mix(in srgb, var(--p-text-m) 10%, transparent)":"transparent",cursor:"pointer",fontSize:9,color:hovered?hoverColor:color,transition:"color .1s, background .1s"},title,onMouseEnter:()=>setHovered(!0),onMouseLeave:()=>setHovered(!1),onClick,children:[icon,label&&(0,import_jsx_runtime11.jsx)("span",{children:label}),badge&&(0,import_jsx_runtime11.jsx)("span",{style:{width:4,height:4,background:badgeColor??color,borderRadius:"50%",flexShrink:0}})]})}function LiveActivityBadge({activity}){let isLocked=activity.state==="locked"||activity.state==="editing",icon=isLocked?(0,import_jsx_runtime11.jsx)(Lock,{style:{width:8,height:8}}):(0,import_jsx_runtime11.jsx)(Eye,{style:{width:8,height:8}}),label=isLocked?`Locked by ${activity.user}`:`${activity.user} viewing`;return(0,import_jsx_runtime11.jsxs)("span",{style:isLocked?{display:"inline-flex",alignItems:"center",gap:3,borderRadius:999,padding:"1px 5px",fontSize:9,fontWeight:600,border:"1px solid rgba(244,114,182,0.35)",color:"#f9a8d4",background:"rgba(157,23,77,0.28)",flexShrink:0,maxWidth:110,overflow:"hidden",whiteSpace:"nowrap",flexWrap:"nowrap"}:{display:"inline-flex",alignItems:"center",gap:3,borderRadius:999,padding:"1px 5px",fontSize:9,fontWeight:600,border:"1px solid rgba(59,130,246,0.35)",color:"#93c5fd",background:"rgba(30,58,138,0.28)",flexShrink:0,maxWidth:110,overflow:"hidden",whiteSpace:"nowrap",flexWrap:"nowrap"},title:label,"data-testid":"live-activity-badge",children:[icon,(0,import_jsx_runtime11.jsx)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",minWidth:0,flex:"1 1 0"},children:activity.user})]})}var import_jsx_runtime12=__toESM(require_jsx_runtime(),1);var import_react9=__toESM(require_react(),1);var import_jsx_runtime13=__toESM(require_jsx_runtime(),1);var import_react10=__toESM(require_react(),1);var import_jsx_runtime14=__toESM(require_jsx_runtime(),1);var import_jsx_runtime15=__toESM(require_jsx_runtime(),1);var import_react19=__toESM(require_react(),1);var import_react14=__toESM(require_react(),1);var import_react11=__toESM(require_react(),1),import_jsx_runtime16=__toESM(require_jsx_runtime(),1),AutoExpandTextarea=import_react11.default.forwardRef(function({value,onChange,baseRows=4,maxRows,style,...rest},forwardedRef){let localRef=import_react11.default.useRef(null),resolvedMaxRows=maxRows??baseRows*2,resize=import_react11.default.useCallback(()=>{let el2=localRef.current;if(!el2)return;el2.style.height="auto";let computed=window.getComputedStyle(el2),lineHeight=Number.parseFloat(computed.lineHeight||"0")||18,verticalPadding=Number.parseFloat(computed.paddingTop||"0")+Number.parseFloat(computed.paddingBottom||"0"),border=Number.parseFloat(computed.borderTopWidth||"0")+Number.parseFloat(computed.borderBottomWidth||"0"),minHeight=baseRows*lineHeight+verticalPadding+border,maxHeight=resolvedMaxRows*lineHeight+verticalPadding+border,target=Math.max(minHeight,Math.min(el2.scrollHeight,maxHeight));el2.style.height=`${target}px`,el2.style.overflowY=el2.scrollHeight>maxHeight?"auto":"hidden"},[baseRows,resolvedMaxRows]);return import_react11.default.useLayoutEffect(()=>{resize()},[value,resize]),(0,import_jsx_runtime16.jsx)("textarea",{...rest,ref:el2=>{localRef.current=el2,typeof forwardedRef=="function"?forwardedRef(el2):forwardedRef&&(forwardedRef.current=el2)},rows:baseRows,value,onChange:e=>onChange(e.target.value),style:{...style,resize:"none"}})});var import_react13=__toESM(require_react(),1);var import_react12=__toESM(require_react(),1),import_react_dom2=__toESM(require_react_dom(),1),import_jsx_runtime17=__toESM(require_jsx_runtime(),1);var import_jsx_runtime18=__toESM(require_jsx_runtime(),1);var import_jsx_runtime19=__toESM(require_jsx_runtime(),1);var import_jsx_runtime20=__toESM(require_jsx_runtime(),1);var import_react15=__toESM(require_react(),1);var import_jsx_runtime21=__toESM(require_jsx_runtime(),1);var import_react18=__toESM(require_react(),1);var import_react16=__toESM(require_react(),1),import_react_dom3=__toESM(require_react_dom(),1);var import_jsx_runtime22=__toESM(require_jsx_runtime(),1);var import_react17=__toESM(require_react(),1);var import_jsx_runtime23=__toESM(require_jsx_runtime(),1);var import_jsx_runtime24=__toESM(require_jsx_runtime(),1);var import_jsx_runtime25=__toESM(require_jsx_runtime(),1);var import_jsx_runtime26=__toESM(require_jsx_runtime(),1);var MAX_UPLOAD_BYTES=5*1024*1024;var import_react20=__toESM(require_react(),1);var import_jsx_runtime27=__toESM(require_jsx_runtime(),1);var import_react21=__toESM(require_react(),1);var import_jsx_runtime28=__toESM(require_jsx_runtime(),1);var import_react22=__toESM(require_react(),1);var import_jsx_runtime29=__toESM(require_jsx_runtime(),1);var IGNORED_PATTERNS=[/Error evaluating Node\.js code/i,/nextjs-portal/i],buffer=[],recording=!1;function addEntry(level,args){let message=args.map(a=>{if(typeof a=="string")return a;if(a instanceof Error)return a.message;try{return JSON.stringify(a)}catch{return String(a)}}).join(" ").slice(0,500);!message||IGNORED_PATTERNS.some(pattern=>pattern.test(message))||(buffer.push({level,message,timestamp:new Date().toISOString()}),buffer.length>50&&buffer.splice(0,buffer.length-50))}function startRecording(){if(recording)return;recording=!0;let origError=console.error.bind(console);console.error=(...args)=>{addEntry("error",args),origError(...args)};let origWarn=console.warn.bind(console);console.warn=(...args)=>{addEntry("warn",args),origWarn(...args)},window.addEventListener("error",e=>{let loc=e.filename?` (${e.filename.split("/").pop()}:${e.lineno})`:"";addEntry("error",[`${e.message}${loc}`])}),window.addEventListener("unhandledrejection",e=>{let msg=e.reason instanceof Error?e.reason.message:String(e.reason??"Unhandled promise rejection");addEntry("error",[`Unhandled rejection: ${msg}`])})}function getRecordedLogs(){if(buffer.length===0)return"";let lines=buffer.map(e=>{let icon=e.level==="error"?"\u{1F534}":"\u{1F7E1}",time=e.timestamp.slice(11,19);return`- ${icon} \`${time}\` ${e.message}`});return`
1602
+ `)}function renderMarkdown(md){if(!md)return'<span style="color:#475569;font-style:italic;">No description yet</span>';let escaped=md.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");return renderTables(escaped).replace(/^### (.+)$/gm,'<h3 style="font-weight:700;margin:0.8em 0 0.3em;font-size:1.05em;color:#cbd5e1;">$1</h3>').replace(/^## (.+)$/gm,'<h2 style="font-weight:700;margin:0.8em 0 0.3em;font-size:1.2em;color:#f1f5f9;">$1</h2>').replace(/^# (.+)$/gm,'<h1 style="font-weight:700;margin:0.8em 0 0.3em;font-size:1.4em;color:#f1f5f9;">$1</h1>').replace(/[*][*]([^\n]+?)[*][*]/g,'<strong style="font-weight:700;color:#f1f5f9;">$1</strong>').replace(/__([^\n]+?)__/g,'<strong style="font-weight:700;color:#f1f5f9;">$1</strong>').replace(/[*]([^\n*]+?)[*]/g,'<em style="font-style:italic;color:#94a3b8;">$1</em>').replace(/(?<![a-zA-Z0-9])_([^_\n]+?)_(?![a-zA-Z0-9])/g,'<em style="font-style:italic;color:#94a3b8;">$1</em>').replace(/`(.+?)`/g,'<code style="font-family:Menlo,monospace;font-size:12px;background:#1e293b;padding:1px 5px;border-radius:3px;color:#7dd3fc;">$1</code>').replace(/\[([^\]]+)\]\((https?:\/\/[^)]+)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer" style="color:#60a5fa;text-decoration:underline;">$1</a>').replace(/(^|[\s(>])((https?:\/\/)[^\s<>"']+)/g,'$1<a href="$2" target="_blank" rel="noopener noreferrer" style="color:#60a5fa;text-decoration:underline;word-break:break-all;">$2</a>').replace(/(^|[^\w])#([a-f0-9]{30})(?![a-f0-9])/gi,'$1<a href="#task-$2" data-task-ref="$2" style="color:#60a5fa;text-decoration:underline;font-family:Menlo,monospace;">#$2</a>').replace(/^[-*] (.+)$/gm,'<li style="margin:0.2em 0;display:list-item;">$1</li>').replace(/^---$/gm,'<hr style="border:none;border-top:1px solid #334155;margin:0.8em 0;">').replace(/(<li[^>]*>[\s\S]*?<\/li>\n?)+/g,m=>`<ul style="padding-left:1.5em;margin:0.4em 0;list-style-type:disc;">${m}</ul>`).replace(/^(?!<[a-z]|$).+$/gm,line=>`<p style="margin:0.5em 0;">${line}</p>`)}var import_jsx_runtime7=__toESM(require_jsx_runtime(),1);function MarkdownPreview({markdown,className,style}){let rootRef=import_react5.default.useRef(null),cacheRef=import_react5.default.useRef({}),[hoverPreview,setHoverPreview]=import_react5.default.useState(null);return import_react5.default.useEffect(()=>{let root=rootRef.current;if(!root)return;function clearPreview(){setHoverPreview(null)}async function handleOver(ev){let target=ev.target,link=target==null?void 0:target.closest("a[data-task-ref]");if(!link){clearPreview();return}ev.preventDefault();let id=link.getAttribute("data-task-ref");if(!id)return;let rect=link.getBoundingClientRect(),cached=cacheRef.current[id];if(cached){setHoverPreview({id,title:cached.title,status:cached.status,x:rect.left,y:rect.bottom+6});return}try{let data=await(await fetch(`/api/tasks/${id}`)).json(),info={title:data.title??`Task ${id}`,status:data.status??"unknown"};cacheRef.current[id]=info,setHoverPreview({id,title:info.title,status:info.status,x:rect.left,y:rect.bottom+6})}catch{setHoverPreview({id,title:`Task ${id}`,status:"unknown",x:rect.left,y:rect.bottom+6})}}function handleRefClick(ev){var _a,_b;let link=(_b=(_a=ev.target)==null?void 0:_a.closest)==null?void 0:_b.call(_a,"a[data-task-ref]");if(!link)return;let refId=link.getAttribute("data-task-ref");refId&&window.dispatchEvent(new CustomEvent("vibeflow-task-ref-click",{detail:{refId}}))}return root.addEventListener("mouseover",handleOver),root.addEventListener("mouseleave",clearPreview),root.addEventListener("click",handleRefClick),()=>{root.removeEventListener("mouseover",handleOver),root.removeEventListener("mouseleave",clearPreview),root.removeEventListener("click",handleRefClick)}},[]),(0,import_jsx_runtime7.jsxs)("div",{style:{position:"relative"},children:[(0,import_jsx_runtime7.jsx)("div",{ref:rootRef,className,style,dangerouslySetInnerHTML:{__html:renderMarkdown(markdown)}}),hoverPreview&&(0,import_jsx_runtime7.jsxs)("div",{style:{position:"fixed",left:hoverPreview.x,top:hoverPreview.y,background:"#0f172a",border:"1px solid rgba(59,130,246,0.4)",color:"#e2e8f0",borderRadius:8,padding:"8px 10px",fontSize:11,boxShadow:"0 10px 24px rgba(2,6,23,0.55)",zIndex:60,pointerEvents:"none",minWidth:180},children:[(0,import_jsx_runtime7.jsxs)("div",{style:{color:"#60a5fa",fontFamily:"Menlo,monospace",marginBottom:3},children:["#",hoverPreview.id]}),(0,import_jsx_runtime7.jsx)("div",{style:{fontWeight:600,marginBottom:3},children:hoverPreview.title}),(0,import_jsx_runtime7.jsxs)("div",{style:{color:"#94a3b8"},children:["status: ",hoverPreview.status]})]})]})}var import_jsx_runtime8=__toESM(require_jsx_runtime(),1);var import_jsx_runtime9=__toESM(require_jsx_runtime(),1);var LS_SEEN_KEY="proto-comments-seen";function isNewComments(taskId,count){try{let raw=localStorage.getItem(LS_SEEN_KEY),seen=raw?JSON.parse(raw):{};return count>(seen[taskId]??0)}catch{return!1}}var KEY_DIGITS=16;var MAX_INT=BigInt("9".repeat(KEY_DIGITS));var import_react8=__toESM(require_react(),1);var import_react7=__toESM(require_react(),1),import_react_dom=__toESM(require_react_dom(),1);var TAG_PALETTE=[{bg:"color-mix(in srgb, var(--p-blue) 14%, transparent)",text:"var(--p-blue-200)",border:"color-mix(in srgb, var(--p-blue) 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-green) 14%, transparent)",text:"var(--p-green-300)",border:"color-mix(in srgb, var(--p-green) 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-purple) 14%, transparent)",text:"var(--p-purple-300)",border:"color-mix(in srgb, var(--p-purple) 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-amber) 14%, transparent)",text:"var(--p-amber-300)",border:"color-mix(in srgb, var(--p-amber) 30%, transparent)"},{bg:"color-mix(in srgb, #f472b6 14%, transparent)",text:"#f9a8d4",border:"color-mix(in srgb, #f472b6 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-cyan) 14%, transparent)",text:"var(--p-cyan-300)",border:"color-mix(in srgb, var(--p-cyan) 30%, transparent)"},{bg:"color-mix(in srgb, #f87171 14%, transparent)",text:"#fca5a5",border:"color-mix(in srgb, #f87171 30%, transparent)"},{bg:"color-mix(in srgb, var(--p-text-g) 14%, transparent)",text:"var(--p-text-m)",border:"color-mix(in srgb, var(--p-text-g) 30%, transparent)"}];function hashTagName(name){let hash=0;for(let i=0;i<name.length;i++)hash=hash*31+name.charCodeAt(i)>>>0;return hash%TAG_PALETTE.length}function getTagColors(name){return TAG_PALETTE[hashTagName(name)]}var import_jsx_runtime10=__toESM(require_jsx_runtime(),1);function TagPills({tags,onRemove,size="sm"}){if(!tags.length)return null;let padding=size==="xs"?"1px 6px":"2px 7px",fontSize=size==="xs"?9:10;return(0,import_jsx_runtime10.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:3,alignItems:"center"},children:tags.map(tag=>{let{bg,text,border}=getTagColors(tag);return(0,import_jsx_runtime10.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:3,padding,borderRadius:100,background:bg,border:`1px solid ${border}`,color:text,fontSize,fontWeight:600,whiteSpace:"nowrap"},children:[tag,onRemove&&(0,import_jsx_runtime10.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),onRemove(tag)},style:{display:"flex",background:"none",border:"none",color:text,cursor:"pointer",padding:0,lineHeight:1,opacity:.7},onMouseEnter:e=>{e.currentTarget.style.opacity="1"},onMouseLeave:e=>{e.currentTarget.style.opacity="0.7"},children:"\xD7"})]},tag)})})}var import_jsx_runtime11=__toESM(require_jsx_runtime(),1);function isImageFileName(name){return/\.(png|jpe?g|gif|webp|svg|avif)$/i.test(name)}function withHexAlpha(hexColor,alpha){if(!/^#[0-9a-fA-F]{6}$/.test(hexColor))return;let normalized=Math.max(0,Math.min(1,alpha)),alphaHex=Math.round(normalized*255).toString(16).padStart(2,"0");return`${hexColor}${alphaHex}`}function resolveTaskCardBorderColor(statusColor,priority){return withHexAlpha(statusColor,priority==="Critical"?.36:priority==="High"?.3:.24)??"color-mix(in srgb, var(--p-text-g) 40%, transparent)"}function resolveTaskCardBgColor(typeColor){return withHexAlpha(typeColor,.1)??"transparent"}var DONE_ARTICLE_STYLE={padding:"7px 8px",gap:4,opacity:1,userSelect:"none"},DONE_INNER_ROW_STYLE={display:"flex",alignItems:"center",gap:5},DONE_CHECK_ICON_STYLE={width:12,height:12,color:"color-mix(in srgb, var(--p-green) 55%, transparent)",flexShrink:0},DONE_TITLE_STYLE={fontSize:11.5,fontWeight:600,color:"var(--p-text-m)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1},VERIFIED_BADGE_STYLE={fontSize:9,fontWeight:700,color:"#22c55e",background:"rgba(34,197,94,0.12)",border:"1px solid rgba(34,197,94,0.3)",borderRadius:4,padding:"1px 5px",marginLeft:6,flexShrink:0,letterSpacing:.5},CARD_TITLE_ROW_STYLE={display:"flex",alignItems:"center",gap:5,minWidth:0},SPINNER_SHRINK_STYLE={flexShrink:0},CARD_TITLE_TEXT_STYLE={fontSize:11.5,fontWeight:600,color:"var(--p-text)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1},DESC_THUMB_ROW_STYLE={display:"flex",alignItems:"flex-start",gap:8},DESC_TEXT_STYLE={fontSize:10,color:"var(--p-text-g)",lineHeight:"1.45",overflow:"hidden",display:"-webkit-box",WebkitBoxOrient:"vertical",WebkitLineClamp:2,flex:1,minWidth:0},THUMB_WRAPPER_STYLE={position:"relative",flexShrink:0},THUMB_IMG_STYLE={width:52,height:34,borderRadius:6,objectFit:"cover",border:"1px solid color-mix(in srgb, var(--p-border) 90%, transparent)",display:"block",cursor:"pointer"},CARD_FOOTER_STYLE={display:"flex",alignItems:"center",gap:2,marginTop:1},SPACER_STYLE={flex:1},TaskCard=import_react7.default.memo(function({task,col,liveActivity,compact,onOpen,onDragStart}){var _a;let isInProgress=col.id==="in-progress",isDone=col.id==="done",[showThumbPreview,setShowThumbPreview]=import_react7.default.useState(!1),[thumbRect,setThumbRect]=import_react7.default.useState(null),thumbRef=import_react7.default.useRef(null),commentCount=task.commentCount??0,fileCount=task.fileCount??0,hasNewComments=commentCount>0&&isNewComments(task.id,commentCount),cardBorderColor=resolveTaskCardBorderColor(col.color,task.priority),typeColor=getTaskTypeColor(task.type),cardBgColor=resolveTaskCardBgColor(typeColor),firstImage=(_a=task.files)==null?void 0:_a.find(f=>isImageFileName(f.name)),thumbnailUrl=firstImage?`/api/tasks/${task.id}/files/${encodeURIComponent(firstImage.name)}`:null;function handleDragStart(e){onDragStart(e,task.id),e.currentTarget.classList.add("dragging")}function handleDragEnd(e){e.currentTarget.classList.remove("dragging")}function handleClick(){onOpen(task)}if(compact||isDone){let dotClass=col.id==="in-progress"?"sd-inprogress":`sd-${col.id}`;return(0,import_jsx_runtime11.jsx)("article",{className:"task-card",draggable:!0,"data-task-id":task.id,"data-compact":compact?"true":void 0,style:{...DONE_ARTICLE_STYLE},onDragStart:handleDragStart,onDragEnd:handleDragEnd,onClick:handleClick,children:(0,import_jsx_runtime11.jsxs)("div",{style:DONE_INNER_ROW_STYLE,children:[isDone?(0,import_jsx_runtime11.jsx)(CircleCheckBig,{style:DONE_CHECK_ICON_STYLE}):(0,import_jsx_runtime11.jsx)("span",{className:dotClass,style:{flexShrink:0}}),(0,import_jsx_runtime11.jsx)("span",{style:{...DONE_TITLE_STYLE,...isDone?{}:{color:"var(--p-text)"}},children:task.title}),!compact&&!isDone&&task.tags&&task.tags.length>0&&(0,import_jsx_runtime11.jsx)(TagPills,{tags:task.tags,size:"xs"}),!compact&&!isDone&&(commentCount>0||fileCount>0)&&(0,import_jsx_runtime11.jsxs)("span",{style:{fontSize:9,color:"var(--p-text-m)",flexShrink:0},children:[commentCount>0&&`\u{1F4AC}${commentCount}`,commentCount>0&&fileCount>0&&" ",fileCount>0&&`\u{1F4CE}${fileCount}`]}),isDone&&task.verified&&(0,import_jsx_runtime11.jsx)("span",{style:VERIFIED_BADGE_STYLE,children:"\u2713 VERIFIED"})]})})}return(0,import_jsx_runtime11.jsxs)("article",{className:`task-card${liveActivity?" task-live-edit":""}`,draggable:!0,"data-task-id":task.id,style:{padding:"7px 8px",gap:4,userSelect:"none",background:liveActivity?"rgba(59,130,246,0.08)":cardBgColor,border:liveActivity?"1px solid rgba(59,130,246,0.5)":cardBorderColor?`1px solid ${cardBorderColor}`:void 0,...liveActivity?{boxShadow:"0 0 0 2px rgba(59,130,246,0.14)"}:{}},onDragStart:handleDragStart,onDragEnd:handleDragEnd,onClick:handleClick,children:[(0,import_jsx_runtime11.jsxs)("div",{style:CARD_TITLE_ROW_STYLE,children:[isInProgress&&(0,import_jsx_runtime11.jsx)("span",{className:"spinner",style:SPINNER_SHRINK_STYLE}),(0,import_jsx_runtime11.jsx)("span",{style:CARD_TITLE_TEXT_STYLE,children:task.title})]}),(task.description||thumbnailUrl)&&(0,import_jsx_runtime11.jsxs)("div",{style:DESC_THUMB_ROW_STYLE,children:[task.description&&(0,import_jsx_runtime11.jsx)("div",{style:DESC_TEXT_STYLE,children:task.description}),thumbnailUrl&&(0,import_jsx_runtime11.jsxs)("div",{style:THUMB_WRAPPER_STYLE,onMouseEnter:()=>{if(thumbRef.current){let r=thumbRef.current.getBoundingClientRect();setThumbRect({top:r.top,right:r.right})}setShowThumbPreview(!0)},onMouseLeave:()=>{setShowThumbPreview(!1),setThumbRect(null)},children:[(0,import_jsx_runtime11.jsx)("img",{ref:thumbRef,src:thumbnailUrl,alt:"Task screenshot","data-role":"task-thumb",style:THUMB_IMG_STYLE}),showThumbPreview&&thumbRect&&import_react_dom.default.createPortal((0,import_jsx_runtime11.jsx)("img",{src:thumbnailUrl,alt:"Task screenshot enlarged preview","data-role":"task-thumb-preview",style:{position:"fixed",right:window.innerWidth-thumbRect.right,bottom:window.innerHeight-thumbRect.top+8,width:220,height:138,borderRadius:8,objectFit:"cover",border:"1px solid color-mix(in srgb, var(--p-border) 96%, transparent)",boxShadow:"0 10px 24px color-mix(in srgb, var(--p-bg) 75%, transparent)",pointerEvents:"none",zIndex:9999,background:"var(--p-bg)"}}),document.body)]})]}),(0,import_jsx_runtime11.jsxs)("div",{className:"flex items-center",style:CARD_FOOTER_STYLE,children:[(0,import_jsx_runtime11.jsx)(TypeBadge,{type:task.type}),task.priority&&(0,import_jsx_runtime11.jsx)(PriorityBadge,{priority:task.priority}),isInProgress&&task.assigneeName&&(0,import_jsx_runtime11.jsx)("span",{style:{fontSize:10,fontWeight:600,padding:"1px 6px",borderRadius:6,background:"rgba(59,130,246,0.12)",color:"#60a5fa",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:80},children:task.assigneeName}),task.tags&&task.tags.length>0&&(0,import_jsx_runtime11.jsx)(TagPills,{tags:task.tags,size:"xs"}),(0,import_jsx_runtime11.jsx)("div",{style:SPACER_STYLE}),liveActivity&&(0,import_jsx_runtime11.jsx)(LiveActivityBadge,{activity:liveActivity}),(0,import_jsx_runtime11.jsx)(CardIconButton,{icon:(0,import_jsx_runtime11.jsx)(MessageCircle,{style:{width:9,height:9}}),label:commentCount>0?String(commentCount):"",color:hasNewComments?"var(--p-purple)":commentCount>0?"var(--p-text-m)":"var(--p-border-t)",hoverColor:hasNewComments?"var(--p-purple-300)":"var(--p-text)",title:commentCount>0?`${commentCount} comment(s)`:"Add comment",badge:hasNewComments,badgeColor:"var(--p-purple)",onClick:e=>{e.stopPropagation(),onOpen(task,"comments")}}),(0,import_jsx_runtime11.jsx)(CardIconButton,{icon:(0,import_jsx_runtime11.jsx)(Paperclip,{style:{width:9,height:9}}),label:fileCount>0?String(fileCount):"",color:fileCount>0?"var(--p-blue-300)":"var(--p-border-t)",hoverColor:fileCount>0?"var(--p-cyan-300)":"var(--p-text-sub)",title:fileCount>0?`${fileCount} file(s) attached`:"Files",onClick:e=>{e.stopPropagation(),onOpen(task,"files")}})]})]})});function CardIconButton({icon,label,color,hoverColor,title,badge,badgeColor,onClick}){let[hovered,setHovered]=import_react7.default.useState(!1);return(0,import_jsx_runtime11.jsxs)("button",{style:{display:"inline-flex",alignItems:"center",gap:2,padding:"2px 3px",borderRadius:3,border:"none",background:hovered?"color-mix(in srgb, var(--p-text-m) 10%, transparent)":"transparent",cursor:"pointer",fontSize:9,color:hovered?hoverColor:color,transition:"color .1s, background .1s"},title,onMouseEnter:()=>setHovered(!0),onMouseLeave:()=>setHovered(!1),onClick,children:[icon,label&&(0,import_jsx_runtime11.jsx)("span",{children:label}),badge&&(0,import_jsx_runtime11.jsx)("span",{style:{width:4,height:4,background:badgeColor??color,borderRadius:"50%",flexShrink:0}})]})}function LiveActivityBadge({activity}){let isLocked=activity.state==="locked"||activity.state==="editing",icon=isLocked?(0,import_jsx_runtime11.jsx)(Lock,{style:{width:8,height:8}}):(0,import_jsx_runtime11.jsx)(Eye,{style:{width:8,height:8}}),label=isLocked?`Locked by ${activity.user}`:`${activity.user} viewing`;return(0,import_jsx_runtime11.jsxs)("span",{style:isLocked?{display:"inline-flex",alignItems:"center",gap:3,borderRadius:999,padding:"1px 5px",fontSize:9,fontWeight:600,border:"1px solid rgba(244,114,182,0.35)",color:"#f9a8d4",background:"rgba(157,23,77,0.28)",flexShrink:0,maxWidth:110,overflow:"hidden",whiteSpace:"nowrap",flexWrap:"nowrap"}:{display:"inline-flex",alignItems:"center",gap:3,borderRadius:999,padding:"1px 5px",fontSize:9,fontWeight:600,border:"1px solid rgba(59,130,246,0.35)",color:"#93c5fd",background:"rgba(30,58,138,0.28)",flexShrink:0,maxWidth:110,overflow:"hidden",whiteSpace:"nowrap",flexWrap:"nowrap"},title:label,"data-testid":"live-activity-badge",children:[icon,(0,import_jsx_runtime11.jsx)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",minWidth:0,flex:"1 1 0"},children:activity.user})]})}var import_jsx_runtime12=__toESM(require_jsx_runtime(),1);var import_react9=__toESM(require_react(),1);var import_jsx_runtime13=__toESM(require_jsx_runtime(),1);var import_react10=__toESM(require_react(),1);var import_jsx_runtime14=__toESM(require_jsx_runtime(),1);var import_jsx_runtime15=__toESM(require_jsx_runtime(),1);var import_react19=__toESM(require_react(),1);var import_react14=__toESM(require_react(),1);var import_react11=__toESM(require_react(),1),import_jsx_runtime16=__toESM(require_jsx_runtime(),1),AutoExpandTextarea=import_react11.default.forwardRef(function({value,onChange,baseRows=4,maxRows,style,...rest},forwardedRef){let localRef=import_react11.default.useRef(null),resolvedMaxRows=maxRows??baseRows*2,resize=import_react11.default.useCallback(()=>{let el2=localRef.current;if(!el2)return;el2.style.height="auto";let computed=window.getComputedStyle(el2),lineHeight=Number.parseFloat(computed.lineHeight||"0")||18,verticalPadding=Number.parseFloat(computed.paddingTop||"0")+Number.parseFloat(computed.paddingBottom||"0"),border=Number.parseFloat(computed.borderTopWidth||"0")+Number.parseFloat(computed.borderBottomWidth||"0"),minHeight=baseRows*lineHeight+verticalPadding+border,maxHeight=resolvedMaxRows*lineHeight+verticalPadding+border,target=Math.max(minHeight,Math.min(el2.scrollHeight,maxHeight));el2.style.height=`${target}px`,el2.style.overflowY=el2.scrollHeight>maxHeight?"auto":"hidden"},[baseRows,resolvedMaxRows]);return import_react11.default.useLayoutEffect(()=>{resize()},[value,resize]),(0,import_jsx_runtime16.jsx)("textarea",{...rest,ref:el2=>{localRef.current=el2,typeof forwardedRef=="function"?forwardedRef(el2):forwardedRef&&(forwardedRef.current=el2)},rows:baseRows,value,onChange:e=>onChange(e.target.value),style:{...style,resize:"none"}})});var import_react13=__toESM(require_react(),1);var import_react12=__toESM(require_react(),1),import_react_dom2=__toESM(require_react_dom(),1),import_jsx_runtime17=__toESM(require_jsx_runtime(),1);var import_jsx_runtime18=__toESM(require_jsx_runtime(),1);var import_jsx_runtime19=__toESM(require_jsx_runtime(),1);var import_jsx_runtime20=__toESM(require_jsx_runtime(),1);var import_react15=__toESM(require_react(),1);var import_jsx_runtime21=__toESM(require_jsx_runtime(),1);var import_react18=__toESM(require_react(),1);var import_react16=__toESM(require_react(),1),import_react_dom3=__toESM(require_react_dom(),1);var import_jsx_runtime22=__toESM(require_jsx_runtime(),1);var import_react17=__toESM(require_react(),1);var import_jsx_runtime23=__toESM(require_jsx_runtime(),1);var import_jsx_runtime24=__toESM(require_jsx_runtime(),1);var import_jsx_runtime25=__toESM(require_jsx_runtime(),1);var import_jsx_runtime26=__toESM(require_jsx_runtime(),1);var MAX_UPLOAD_BYTES=5*1024*1024;var import_react20=__toESM(require_react(),1);var import_jsx_runtime27=__toESM(require_jsx_runtime(),1);var import_react21=__toESM(require_react(),1);var import_jsx_runtime28=__toESM(require_jsx_runtime(),1);var import_react22=__toESM(require_react(),1);var import_jsx_runtime29=__toESM(require_jsx_runtime(),1);var IGNORED_PATTERNS=[/Error evaluating Node\.js code/i,/nextjs-portal/i],buffer=[],recording=!1;function addEntry(level,args){let message=args.map(a=>{if(typeof a=="string")return a;if(a instanceof Error)return a.message;try{return JSON.stringify(a)}catch{return String(a)}}).join(" ").slice(0,500);!message||IGNORED_PATTERNS.some(pattern=>pattern.test(message))||(buffer.push({level,message,timestamp:new Date().toISOString()}),buffer.length>50&&buffer.splice(0,buffer.length-50))}function startRecording(){if(recording)return;recording=!0;let origError=console.error.bind(console);console.error=(...args)=>{addEntry("error",args),origError(...args)};let origWarn=console.warn.bind(console);console.warn=(...args)=>{addEntry("warn",args),origWarn(...args)},window.addEventListener("error",e=>{let loc=e.filename?` (${e.filename.split("/").pop()}:${e.lineno})`:"";addEntry("error",[`${e.message}${loc}`])}),window.addEventListener("unhandledrejection",e=>{let msg=e.reason instanceof Error?e.reason.message:String(e.reason??"Unhandled promise rejection");addEntry("error",[`Unhandled rejection: ${msg}`])})}function getRecordedLogs(){if(buffer.length===0)return"";let lines=buffer.map(e=>{let icon=e.level==="error"?"\u{1F534}":"\u{1F7E1}",time=e.timestamp.slice(11,19);return`- ${icon} \`${time}\` ${e.message}`});return`
1603
1603
 
1604
1604
  ---
1605
1605
  **Console logs** (${buffer.length} entr${buffer.length===1?"y":"ies"})
1606
1606
  ${lines.join(`
1607
- `)}`}function clampTriggerPos(pos,viewport){let x=Math.max(8,Math.min(viewport.width-64,pos.x)),y=Math.max(8,Math.min(viewport.height-64,pos.y));return{x,y}}function parseCookies(){let cookies=[];if(!document.cookie)return cookies;for(let pair of document.cookie.split(";")){let trimmed=pair.trim();if(!trimmed)continue;let eqIdx=trimmed.indexOf("=");if(eqIdx===-1)continue;let name=trimmed.slice(0,eqIdx).trim(),value=trimmed.slice(eqIdx+1).trim();cookies.push({name,value,domain:location.hostname,path:"/",expires:-1,httpOnly:!1,secure:location.protocol==="https:",sameSite:"Lax"})}return cookies}function captureAuthState(){let localStorageData={};try{for(let i=0;i<localStorage.length;i++){let key=localStorage.key(i);key&&(localStorageData[key]=localStorage.getItem(key)??"")}}catch{}let sessionStorageData={};try{for(let i=0;i<sessionStorage.length;i++){let key=sessionStorage.key(i);key&&(sessionStorageData[key]=sessionStorage.getItem(key)??"")}}catch{}return{cookies:parseCookies(),localStorage:localStorageData,sessionStorage:sessionStorageData}}var AUTH_TTL_MS=1440*60*1e3;async function sendBaselineToServer(taskId,baseline){try{let cfg=PROTO_CONFIG,apiUrl=`/api/tasks/${taskId}/baseline`;cfg!=null&&cfg.apiUrl&&(apiUrl=`${cfg.apiUrl.replace(/\/api\/(overlay\/)?tasks$/,"")}/api/tasks/${taskId}/baseline`),cfg!=null&&cfg.boardId&&(apiUrl+=`?boardId=${encodeURIComponent(cfg.boardId)}`);let headers={"Content-Type":"application/json"};cfg!=null&&cfg.overlayApiKey&&(headers["X-Overlay-Api-Key"]=cfg.overlayApiKey),await fetch(apiUrl,{method:"POST",headers,body:JSON.stringify({baseline})})}catch(err){console.error("[Vibeflow] Failed to store baseline:",err)}}async function sendPageBaselineToServer(taskId,page){try{let cfg=PROTO_CONFIG,apiUrl=`/api/tasks/${taskId}/baseline-page`;cfg!=null&&cfg.apiUrl&&(apiUrl=`${cfg.apiUrl.replace(/\/api\/(overlay\/)?tasks$/,"")}/api/tasks/${taskId}/baseline-page`),cfg!=null&&cfg.boardId&&(apiUrl+=`?boardId=${encodeURIComponent(cfg.boardId)}`);let headers={"Content-Type":"application/json"};cfg!=null&&cfg.overlayApiKey&&(headers["X-Overlay-Api-Key"]=cfg.overlayApiKey),await fetch(apiUrl,{method:"POST",headers,body:JSON.stringify({page})})}catch(err){console.error("[Vibeflow] Failed to store page baseline:",err)}}async function captureAndStoreAuthState(taskId,taskAuthor){let authState=captureAuthState();try{let cfg=PROTO_CONFIG,apiUrl=`/api/tasks/${taskId}/auth-state`;cfg!=null&&cfg.apiUrl&&(apiUrl=`${cfg.apiUrl.replace(/\/api\/(overlay\/)?tasks$/,"")}/api/tasks/${taskId}/auth-state`),cfg!=null&&cfg.boardId&&(apiUrl+=`?boardId=${encodeURIComponent(cfg.boardId)}`);let headers={"Content-Type":"application/json"};cfg!=null&&cfg.overlayApiKey&&(headers["X-Overlay-Api-Key"]=cfg.overlayApiKey),await fetch(apiUrl,{method:"POST",headers,body:JSON.stringify({authState,taskAuthor})})}catch(err){console.error("[Vibeflow] Failed to store auth state:",err)}}var RELEVANT_STYLES=["display","visibility","opacity","position","overflow","overflow-x","overflow-y","width","min-width","max-width","height","min-height","max-height","margin","margin-top","margin-right","margin-bottom","margin-left","padding","padding-top","padding-right","padding-bottom","padding-left","border","border-width","border-style","border-color","border-radius","background-color","background-image","color","font-size","font-weight","font-style","font-family","line-height","letter-spacing","text-align","text-decoration","text-overflow","white-space","flex-direction","flex-wrap","flex","justify-content","align-items","gap","row-gap","column-gap","grid-template-columns","grid-template-rows","z-index","box-shadow","transform","transition","cursor","user-select","pointer-events","top","left","right","bottom"];function buildKey(el2){let path=[],current=el2;for(;current&&current!==document.documentElement;){let parentEl=current.parentElement;if(!parentEl)break;let index=Array.from(parentEl.children).indexOf(current);path.unshift(index),current=parentEl}return path.join("/")}function buildDisplaySelector(el2){let tag=el2.tagName.toLowerCase(),taskId=el2.getAttribute("data-task-id");if(taskId)return`${tag}.task-card[data-task-id=${taskId}]`;let status=el2.getAttribute("data-status");if(status&&el2.classList.contains("column-scroll"))return`${tag}.column-scroll[data-status=${status}]`;let colId=el2.getAttribute("data-column-id");if(colId)return`${tag}[data-column-id=${colId}]`;let classes=Array.from(el2.classList).slice(0,2),selector=tag;classes.length&&(selector+="."+classes.join("."));let parent=el2.parentElement;if(parent){let siblings=Array.from(parent.children).filter(c=>c.tagName===el2.tagName);if(siblings.length>1){let idx=siblings.indexOf(el2)+1;selector+=`:nth-of-type(${idx})`}}return selector}function filterStyles(el2,styles=RELEVANT_STYLES){let computed=window.getComputedStyle(el2),result={};for(let prop of styles)result[prop]=computed.getPropertyValue(prop);return result}function normalizeText(text,limit=200){return text.replace(/\s+/g," ").trim().slice(0,limit)}function childSignature(children){let counts=new Map;for(let child of children){let tag=child.tagName.toLowerCase(),classes=Array.from(child.classList).slice(0,2).join("."),key=classes?`${tag}.${classes}`:tag;counts.set(key,(counts.get(key)||0)+1)}return Array.from(counts.entries()).map(([key,count])=>`${key} \xD7${count}`).slice(0,10)}function getXPath(el2){let parts=[],node=el2;for(;node&&node!==document.documentElement;){let index=1,sibling=node.previousElementSibling;for(;sibling;)sibling.tagName===node.tagName&&index++,sibling=sibling.previousElementSibling;let tag=node.tagName.toLowerCase();parts.unshift(`${tag}[${index}]`),node=node.parentElement}return"/"+parts.join("/")}function getParentSnippet(el2){let parent=el2.parentElement;if(!parent||parent===document.body)return;let html=parent.outerHTML;return html.length<=500?html:html.slice(0,500)+"\u2026"}function getBrowserString(){return navigator.userAgent}function capturePositionContext(el2){let rect=el2.getBoundingClientRect(),zIndex="auto",position="static",parentZIndex,current=el2;for(;current&&current!==document.documentElement;){let style=window.getComputedStyle(current),pos=style.position,z=style.zIndex;if(pos!=="static"||z!=="auto"){if(current===el2)position=pos,zIndex=z;else if(parentZIndex===void 0){parentZIndex=z;break}}if(pos!=="static")break;current=current.parentElement}return{boundingBox:{x:rect.x,y:rect.y,width:rect.width,height:rect.height},scrollPosition:{x:window.scrollX,y:window.scrollY},viewport:{width:window.innerWidth,height:window.innerHeight,dpr:window.devicePixelRatio},stackingContext:{zIndex,position,parentZIndex}}}function captureComputedStyles(el2){let style=window.getComputedStyle(el2),result={};for(let prop of RELEVANT_STYLES)result[prop]=style.getPropertyValue(prop);return result}function captureDomSnapshot(el2,cssSelector,consoleErrors=[]){return{outerHTML:el2.outerHTML,computedStyles:captureComputedStyles(el2),selector:cssSelector,xpath:getXPath(el2),position:capturePositionContext(el2),parentSnippet:getParentSnippet(el2),browser:getBrowserString(),consoleErrors,capturedAt:new Date().toISOString()}}function capturePageSnapshot(maxElements=1e3){let elements={},count=0,truncated=!1,walker=document.createTreeWalker(document.body,NodeFilter.SHOW_ELEMENT,{acceptNode(node){if(count>=maxElements)return NodeFilter.FILTER_REJECT;let el2=node;return el2.classList.length>0||el2.hasAttribute("data-task-id")||el2.hasAttribute("data-status")||el2.hasAttribute("data-column-id")?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}}),queue=[],n;for(;n=walker.nextNode();)queue.push(n);for(let el2 of queue){if(count>=maxElements){truncated=!0;break}let key=buildKey(el2),children=Array.from(el2.children),dataAttrs={};for(let a of Array.from(el2.attributes))a.name.startsWith("data-")&&(dataAttrs[a.name.slice(5)]=a.value);let position={x:0,y:0,width:0,height:0};try{let r=el2.getBoundingClientRect();position={x:Math.round(r.x),y:Math.round(r.y),width:Math.round(r.width),height:Math.round(r.height)}}catch{}elements[key]={key,selector:buildDisplaySelector(el2),tag:el2.tagName.toLowerCase(),classes:Array.from(el2.classList),dataAttrs,parentKey:el2.parentElement?buildKey(el2.parentElement):"",childCount:children.length,childSignature:childSignature(children),text:normalizeText(el2.textContent??""),position,baseline:filterStyles(el2,RELEVANT_STYLES),after:filterStyles(el2,RELEVANT_STYLES)},count++}return{version:1,capturedAt:new Date().toISOString(),truncated,elements}}var import_jsx_runtime30=__toESM(require_jsx_runtime(),1),_externalShowAddModal=null,_externalFlashTrigger=null,_externalSetTriggerVisible=null,_externalHideTrigger=null,_externalDisableOverlay=null;function showOverlayTrigger(){_externalSetTriggerVisible==null||_externalSetTriggerVisible()}function hideOverlayTrigger(){_externalHideTrigger==null||_externalHideTrigger()}function disableVibeflowOverlay(){_externalDisableOverlay==null||_externalDisableOverlay()}var TRIGGER_HIDDEN_KEY="vibeflow-trigger-hidden";function hasPrototypingApi(){return typeof window<"u"&&"__vf_prototyping"in window}function openPrototypingPanel(){let api=window.__vf_prototyping;api==null||api.openPanel()}function flashFavicon(durationMs=2200){let head=document.head,existing=head.querySelector('link[rel*="icon"]'),originalHref=(existing==null?void 0:existing.href)??"";existing&&existing.remove();let link=document.createElement("link");link.rel="icon",link.type="image/svg+xml";let animatedSvg='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" fill="none"><rect width="18" height="18" rx="4" fill="#2563eb"/><rect x="2.5" y="5" width="2" height="8" rx="1" fill="white" opacity=".7"><animate attributeName="height" values="3;13;3" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0s"/><animate attributeName="y" values="7.5;2.5;7.5" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0s"/></rect><rect x="6.5" y="2" width="2" height="14" rx="1" fill="white"><animate attributeName="height" values="3;15;3" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.15s"/><animate attributeName="y" values="7.5;1.5;7.5" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.15s"/></rect><rect x="10.5" y="6" width="2" height="6" rx="1" fill="white" opacity=".7"><animate attributeName="height" values="3;12;3" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.3s"/><animate attributeName="y" values="7.5;3;7.5" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.3s"/></rect><rect x="14.5" y="4" width="2" height="10" rx="1" fill="white" opacity=".85"><animate attributeName="height" values="3;13;3" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.45s"/><animate attributeName="y" values="7.5;2.5;7.5" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.45s"/></rect></svg>';link.href=`data:image/svg+xml,${encodeURIComponent(animatedSvg)}`,head.appendChild(link),window.setTimeout(()=>{if(link.remove(),originalHref){let restore=document.createElement("link");restore.rel="icon",restore.type="image/svg+xml",restore.href=originalHref,head.appendChild(restore)}},durationMs)}function flashOverlayTrigger(){_externalFlashTrigger==null||_externalFlashTrigger()}function CornerTrigger({onClick,flashing,onHide,onDisable}){let svgIcon=(0,import_jsx_runtime30.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 18 18",fill:"none","aria-hidden":"true",children:[(0,import_jsx_runtime30.jsx)("rect",{x:"2.5",y:"5",width:"2",height:"8",rx:"1",fill:"currentColor",opacity:"0.7"}),(0,import_jsx_runtime30.jsx)("rect",{x:"6.5",y:"2",width:"2",height:"14",rx:"1",fill:"currentColor"}),(0,import_jsx_runtime30.jsx)("rect",{x:"10.5",y:"6",width:"2",height:"6",rx:"1",fill:"currentColor",opacity:"0.7"}),(0,import_jsx_runtime30.jsx)("rect",{x:"14.5",y:"4",width:"2",height:"10",rx:"1",fill:"currentColor",opacity:"0.85"})]}),[pos,setPos]=import_react23.default.useState(()=>{try{let saved=localStorage.getItem("vibeflow-trigger-pos");if(saved){let parsed=JSON.parse(saved);if(typeof parsed.x=="number"&&isFinite(parsed.x)&&typeof parsed.y=="number"&&isFinite(parsed.y))return clampTriggerPos(parsed,{width:window.innerWidth,height:window.innerHeight})}}catch{}return null}),[isDragging,setIsDragging]=import_react23.default.useState(!1),[isHolding,setIsHolding]=import_react23.default.useState(!1),dragOrigin=import_react23.default.useRef(null),holdTimer=import_react23.default.useRef(null),didDrag=import_react23.default.useRef(!1),isRightClick=import_react23.default.useRef(!1),buttonRef=import_react23.default.useRef(null),posRef=import_react23.default.useRef(null);posRef.current=pos;let[ctxMenu,setCtxMenu]=import_react23.default.useState(null);import_react23.default.useEffect(()=>{if(pos)try{localStorage.setItem("vibeflow-trigger-pos",JSON.stringify(pos))}catch{}},[pos]),import_react23.default.useEffect(()=>{if(!ctxMenu)return;function onDocClick(){setCtxMenu(null)}return document.addEventListener("click",onDocClick,{once:!0}),()=>document.removeEventListener("click",onDocClick)},[ctxMenu]);function getInitialPos(el2){let rect=el2.getBoundingClientRect();return{x:rect.left,y:rect.top}}function onPointerDown(e){let target=e.currentTarget,pointerId=e.pointerId,clientX=e.clientX,clientY=e.clientY;didDrag.current=!1,isRightClick.current=e.button===2,!isRightClick.current&&(holdTimer.current=window.setTimeout(()=>{setIsHolding(!0);let startPos=posRef.current??getInitialPos(target);dragOrigin.current={mouseX:clientX,mouseY:clientY,posX:startPos.x,posY:startPos.y},target.setPointerCapture(pointerId)},300))}function onPointerMove(e){if(!dragOrigin.current)return;let dx=e.clientX-dragOrigin.current.mouseX,dy=e.clientY-dragOrigin.current.mouseY;!isDragging&&(Math.abs(dx)>3||Math.abs(dy)>3)&&setIsDragging(!0),didDrag.current=!0;let bw=window.innerWidth,bh=window.innerHeight,x=Math.max(8,Math.min(bw-64,dragOrigin.current.posX+dx)),y=Math.max(8,Math.min(bh-64,dragOrigin.current.posY+dy));setPos({x,y})}function onPointerUp(_e){holdTimer.current!==null&&(window.clearTimeout(holdTimer.current),holdTimer.current=null);let wasDragged=didDrag.current,wasRight=isRightClick.current;dragOrigin.current=null,setIsDragging(!1),setIsHolding(!1),didDrag.current=!1,isRightClick.current=!1,!wasDragged&&!wasRight&&onClick()}function onPointerCancel(){holdTimer.current!==null&&(window.clearTimeout(holdTimer.current),holdTimer.current=null),dragOrigin.current=null,setIsDragging(!1),setIsHolding(!1),didDrag.current=!1}let posStyle=pos===null?{}:{position:"fixed",left:pos.x,top:pos.y,bottom:"auto",right:"auto"},className=["vibeflow-corner-trigger",flashing?"saved-flash":"",isHolding?"trigger-holding":"",isDragging?"trigger-dragging":""].filter(Boolean).join(" "),title=isDragging?"Drag to reposition":isHolding?"Drag to reposition \xB7 Release to open":"Open Kanban board \xB7 Hold to drag";function onContextMenu(e){e.preventDefault(),e.stopPropagation();let MENU_W=120,ITEM_H=28,PAD=8,itemCount=2+(hasPrototypingApi()?1:0),MENU_H=ITEM_H*itemCount,x=Math.min(e.clientX,window.innerWidth-MENU_W-PAD),y=Math.min(e.clientY,window.innerHeight-MENU_H-PAD);setCtxMenu({x:Math.max(PAD,x),y:Math.max(PAD,y)})}return(0,import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment,{children:[(0,import_jsx_runtime30.jsx)("button",{ref:buttonRef,className,title,style:posStyle,onPointerDown,onPointerMove,onPointerUp,onPointerCancel,onContextMenu,"data-vibeflow-ignore":"true",children:svgIcon}),ctxMenu&&(0,import_jsx_runtime30.jsxs)("div",{className:"vibeflow-trigger-ctx-menu",style:{position:"fixed",left:ctxMenu.x,top:ctxMenu.y},onClick:e=>e.stopPropagation(),children:[hasPrototypingApi()&&(0,import_jsx_runtime30.jsx)("button",{type:"button",onClick:()=>{setCtxMenu(null),openPrototypingPanel()},children:"Prototyping"}),(0,import_jsx_runtime30.jsx)("button",{type:"button",onClick:()=>{setCtxMenu(null),onHide()},children:"Hide Vibeflow"}),(0,import_jsx_runtime30.jsx)("button",{type:"button",onClick:()=>{setCtxMenu(null),onDisable()},children:"Disable Vibeflow"})]})]})}var STATUS_OPTIONS=["backlog","todo","in-progress","review","done"],STATUS_ACTIVE={backlog:{background:"rgba(100,116,139,0.2)",borderColor:"rgba(100,116,139,0.5)",color:"#94a3b8"},todo:{background:"rgba(245,158,11,0.15)",borderColor:"rgba(245,158,11,0.4)",color:"#fcd34d"},"in-progress":{background:"rgba(59,130,246,0.15)",borderColor:"rgba(59,130,246,0.4)",color:"#93c5fd"},review:{background:"rgba(139,92,246,0.15)",borderColor:"rgba(139,92,246,0.4)",color:"#c4b5fd"},done:{background:"rgba(52,211,153,0.12)",borderColor:"rgba(52,211,153,0.4)",color:"#6ee7b7"}};function OverlayAddModal({opts,onClose,onSubmit}){let[title,setTitle]=import_react23.default.useState(opts.initialTitle??""),[description,setDescription]=import_react23.default.useState(opts.initialDescription??""),[status,setStatus]=import_react23.default.useState("todo"),[type,setType]=import_react23.default.useState("Task"),[showPreview,setShowPreview]=import_react23.default.useState(!1),[titleError,setTitleError]=import_react23.default.useState(!1),titleRef=import_react23.default.useRef(null),[dragPos,setDragPos]=import_react23.default.useState(null),[isDragging,setIsDragging]=import_react23.default.useState(!1),dragOrigin=import_react23.default.useRef(null);function onHeaderPointerDown(e){if(e.target.closest("button, input, select, textarea, a"))return;e.currentTarget.setPointerCapture(e.pointerId);let startX=(dragPos==null?void 0:dragPos.x)??window.innerWidth/2-270,startY=(dragPos==null?void 0:dragPos.y)??window.innerHeight/2-200;dragOrigin.current={mouseX:e.clientX,mouseY:e.clientY,posX:startX,posY:startY},setIsDragging(!0)}function onHeaderPointerMove(e){if(!dragOrigin.current)return;let dx=e.clientX-dragOrigin.current.mouseX,dy=e.clientY-dragOrigin.current.mouseY;setDragPos({x:dragOrigin.current.posX+dx,y:dragOrigin.current.posY+dy})}function onHeaderPointerUp(){dragOrigin.current=null,setIsDragging(!1)}import_react23.default.useEffect(()=>{setTimeout(()=>{var _a;return(_a=titleRef.current)==null?void 0:_a.focus()},50)},[]);function handleBackdropClick(e){e.target===e.currentTarget&&onClose()}function handleKeyDown(e){e.key==="Escape"&&onClose(),(e.ctrlKey||e.metaKey)&&e.key==="Enter"&&handleSave()}async function handleSave(){var _a;let t=title.trim();if(!t){setTitleError(!0),(_a=titleRef.current)==null||_a.focus();return}setTitleError(!1);let desc=description.trim()||t;if(type==="Bug"){let logs=getRecordedLogs();logs&&(desc+=logs)}let result=await onSubmit(opts.selector??location.pathname,opts.cssSelector??location.pathname,t,desc,status,type,{file:opts.file,line:opts.line,col:opts.col,component:opts.component});if(result.success&&result.taskId){let baselineSelector=opts.cssSelector??opts.selector,targetEl=baselineSelector?document.querySelector(baselineSelector):null;if(targetEl&&baselineSelector)try{let snapshot=captureDomSnapshot(targetEl,baselineSelector);sendBaselineToServer(result.taskId,snapshot)}catch(err){console.error("[Vibeflow] Failed to capture baseline:",err)}captureAndStoreAuthState(result.taskId,result.taskAuthor??"unknown")}onClose()}let statusBtnBase={padding:"2px 8px",borderRadius:4,fontSize:11,cursor:"pointer",border:"1px solid var(--vibeflow-border-strong)",background:"transparent",color:"var(--vibeflow-text-muted)",fontFamily:"inherit",fontWeight:500,transition:"all .12s"},modalStyle=dragPos===null?{}:{position:"fixed",left:dragPos.x,top:dragPos.y,margin:0};return(0,import_jsx_runtime30.jsx)("div",{className:"vibeflow-modal-backdrop",onClick:handleBackdropClick,onKeyDown:handleKeyDown,children:(0,import_jsx_runtime30.jsxs)("div",{className:"vibeflow-modal overlay-add-modal",role:"dialog","aria-modal":"true",style:modalStyle,children:[(0,import_jsx_runtime30.jsxs)("div",{className:"modal-header overlay-modal-header",style:{cursor:isDragging?"grabbing":"grab",userSelect:"none"},onPointerDown:onHeaderPointerDown,onPointerMove:onHeaderPointerMove,onPointerUp:onHeaderPointerUp,children:[(0,import_jsx_runtime30.jsx)("span",{title:"Drag to move",style:{display:"flex",alignItems:"center",color:"var(--vibeflow-text-muted)",opacity:.5,flexShrink:0,pointerEvents:"none"},children:(0,import_jsx_runtime30.jsxs)("svg",{width:"12",height:"16",viewBox:"0 0 12 16",fill:"currentColor","aria-hidden":"true",children:[(0,import_jsx_runtime30.jsx)("circle",{cx:"3",cy:"3",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"9",cy:"3",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"3",cy:"8",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"9",cy:"8",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"3",cy:"13",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"9",cy:"13",r:"1.5"})]})}),(0,import_jsx_runtime30.jsx)(TypePicker,{value:type,onChange:setType}),(0,import_jsx_runtime30.jsx)("input",{ref:titleRef,type:"text",placeholder:"Task title\u2026",value:title,onChange:e=>{setTitle(e.target.value),titleError&&e.target.value.trim()&&setTitleError(!1)},style:{flex:1,fontSize:14,fontWeight:600,padding:"4px 8px",border:`1px solid ${titleError?"rgba(239,68,68,0.7)":"transparent"}`,borderRadius:6,background:titleError?"rgba(239,68,68,0.07)":"transparent",color:"var(--vibeflow-text-primary)",fontFamily:"inherit",outline:"none",cursor:"text"},onFocus:e=>{titleError||(e.currentTarget.style.borderColor="var(--vibeflow-accent-strong)",e.currentTarget.style.background="var(--vibeflow-surface-elevated)")},onBlur:e=>{titleError||(e.currentTarget.style.borderColor="transparent",e.currentTarget.style.background="transparent")},onKeyDown:e=>{e.key==="Enter"&&handleSave(),e.key==="Escape"&&onClose()}}),titleError&&(0,import_jsx_runtime30.jsx)("span",{style:{fontSize:11,color:"rgba(239,68,68,0.9)",flexShrink:0,whiteSpace:"nowrap"},children:"Title is required"}),(0,import_jsx_runtime30.jsx)("button",{type:"button",onClick:onClose,style:{width:26,height:26,flexShrink:0,display:"flex",alignItems:"center",justifyContent:"center",borderRadius:6,border:"none",background:"transparent",color:"var(--vibeflow-text-muted)",cursor:"pointer"},onMouseOver:e=>{e.currentTarget.style.background="var(--vibeflow-surface-hover)",e.currentTarget.style.color="var(--vibeflow-text-secondary)"},onMouseOut:e=>{e.currentTarget.style.background="transparent",e.currentTarget.style.color="var(--vibeflow-text-muted)"},"aria-label":"Close",children:"\u2715"})]}),(0,import_jsx_runtime30.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"8px 16px",borderBottom:"1px solid var(--vibeflow-border-strong)"},children:[(0,import_jsx_runtime30.jsx)("span",{style:{fontSize:10,color:"var(--vibeflow-text-muted)",fontWeight:500,textTransform:"uppercase",letterSpacing:"0.04em",flexShrink:0},children:"Status"}),STATUS_OPTIONS.map(s=>(0,import_jsx_runtime30.jsx)("button",{type:"button",style:{...statusBtnBase,...s===status?STATUS_ACTIVE[s]:{}},onClick:()=>setStatus(s),onMouseOver:e=>{s!==status&&(e.currentTarget.style.background="var(--vibeflow-surface-hover)",e.currentTarget.style.color="var(--vibeflow-text-secondary)")},onMouseOut:e=>{s!==status&&(e.currentTarget.style.background="transparent",e.currentTarget.style.color="var(--vibeflow-text-muted)")},children:s},s))]}),(opts.file||opts.component)&&(0,import_jsx_runtime30.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"6px 16px",background:"var(--vibeflow-surface-elevated)",borderBottom:"1px solid var(--vibeflow-border-subtle)",fontSize:11,color:"var(--vibeflow-text-muted)"},children:[opts.file&&(0,import_jsx_runtime30.jsxs)("a",{href:`vscode://file${opts.file}${opts.line==null?"":`:${opts.line}`}`,target:"_blank",rel:"noreferrer",style:{display:"inline-flex",alignItems:"center",gap:4,padding:"2px 6px",borderRadius:4,background:"var(--vibeflow-accent-soft)",border:"1px solid var(--vibeflow-accent-border)",color:"var(--vibeflow-accent-strong)",textDecoration:"none",fontSize:11},children:["\u{1F5CE} ",opts.file.split("/").slice(-2).join("/"),opts.line==null?"":`:${opts.line}`]}),opts.component&&(0,import_jsx_runtime30.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:4,padding:"2px 6px",borderRadius:4,background:"rgba(139,92,246,0.08)",border:"1px solid rgba(139,92,246,0.25)",color:"#8b5cf6",fontSize:11},children:["\u2B21 ",opts.component]})]}),(0,import_jsx_runtime30.jsxs)("div",{className:"modal-tabs",children:[(0,import_jsx_runtime30.jsx)("div",{className:`modal-tab${showPreview?"":" active"}`,onClick:()=>setShowPreview(!1),children:"Edit"}),(0,import_jsx_runtime30.jsx)("div",{className:`modal-tab${showPreview?" active":""}`,onClick:()=>setShowPreview(!0),children:"Preview"})]}),(0,import_jsx_runtime30.jsx)("div",{className:"modal-body",children:showPreview?(0,import_jsx_runtime30.jsx)(MarkdownPreview,{markdown:description,className:"modal-preview-pane"}):(0,import_jsx_runtime30.jsx)("div",{className:"modal-editor-pane",children:(0,import_jsx_runtime30.jsx)(AutoExpandTextarea,{className:"dp-textarea",placeholder:"Description (markdown supported)\u2026",value:description,onChange:setDescription,baseRows:5,maxRows:14})})}),type==="Bug"&&(0,import_jsx_runtime30.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"6px 16px",background:"rgba(239,68,68,0.06)",borderTop:"1px solid rgba(239,68,68,0.18)",fontSize:11,color:"rgba(239,68,68,0.75)"},children:[(0,import_jsx_runtime30.jsx)("span",{children:"\u{1F534}"}),(0,import_jsx_runtime30.jsx)("span",{children:"Console errors & warnings will be attached to this report"})]}),(0,import_jsx_runtime30.jsxs)("div",{className:"modal-footer",children:[(0,import_jsx_runtime30.jsxs)("div",{className:"modal-footer-left",children:[(0,import_jsx_runtime30.jsx)("button",{type:"button",className:"btn-primary",onClick:handleSave,disabled:!title.trim(),style:{opacity:title.trim()?1:.45,cursor:title.trim()?"pointer":"not-allowed"},children:"Add Task"}),(0,import_jsx_runtime30.jsx)("button",{type:"button",className:"btn-ghost",onClick:onClose,children:"Cancel"})]}),(0,import_jsx_runtime30.jsx)("div",{className:"modal-footer-center",children:(0,import_jsx_runtime30.jsx)("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:11,color:"var(--vibeflow-text-muted)",cursor:"pointer",userSelect:"none"}})})]})]})})}function OverlayApp({onOpenKanban,onSubmitTask}){let[addModalOpts,setAddModalOpts]=import_react23.default.useState(null),[triggerFlashing,setTriggerFlashing]=import_react23.default.useState(!1),[isHidden,setIsHidden]=import_react23.default.useState(()=>{try{return localStorage.getItem(TRIGGER_HIDDEN_KEY)==="1"}catch{return!1}});import_react23.default.useEffect(()=>(_externalShowAddModal=opts=>setAddModalOpts(opts),_externalFlashTrigger=()=>{setTriggerFlashing(!0),window.setTimeout(()=>setTriggerFlashing(!1),1500),flashFavicon()},_externalSetTriggerVisible=()=>{try{localStorage.removeItem(TRIGGER_HIDDEN_KEY)}catch{}setIsHidden(!1)},_externalHideTrigger=()=>{try{localStorage.setItem(TRIGGER_HIDDEN_KEY,"1")}catch{}setIsHidden(!0)},_externalDisableOverlay=()=>{state.disabled=!0,state.host&&(state.host.remove(),state.host=null)},()=>{_externalShowAddModal=null,_externalFlashTrigger=null,_externalSetTriggerVisible=null,_externalHideTrigger=null,_externalDisableOverlay=null}),[]);let isKanbanPage=typeof document<"u"&&document.body.hasAttribute("data-vibeflow-cli-kanban");return(0,import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment,{children:[!isKanbanPage&&!isHidden&&(0,import_jsx_runtime30.jsx)(CornerTrigger,{onClick:onOpenKanban,flashing:triggerFlashing,onHide:()=>{try{localStorage.setItem(TRIGGER_HIDDEN_KEY,"1")}catch{}setIsHidden(!0)},onDisable:()=>{state.disabled=!0,state.host&&(state.host.remove(),state.host=null)}}),addModalOpts!==null&&(0,import_jsx_runtime30.jsx)(OverlayAddModal,{opts:addModalOpts,onClose:()=>setAddModalOpts(null),onSubmit:async(selector,cssSelector,title,description,status,type,meta)=>{let result=await onSubmitTask(selector,cssSelector,title,description,status,type,meta);return setAddModalOpts(null),result}})]})}function buildTypePickerEl(initialType="Task"){let selectedType=initialType,detailed=TASK_TYPES,currentInfo=()=>detailed.find(t=>t.value===selectedType)??detailed[0],container=el("div",{className:"type-picker"}),trigger=el("button",{className:"type-picker-trigger",type:"button"}),dropdown=el("div",{className:"type-picker-dropdown"}),refresh=()=>{let info=currentInfo();trigger.title=(info==null?void 0:info.tooltip)??"",trigger.replaceChildren(el("span",{className:"type-picker-icon"},(info==null?void 0:info.icon)??""),el("span",{className:"type-picker-label"},(info==null?void 0:info.label)??"")),dropdown.replaceChildren();for(let t of detailed){let opt=el("button",{className:t.value===selectedType?"type-picker-option type-picker-option--active":"type-picker-option",type:"button",title:t.tooltip},el("span",{className:"type-picker-icon"},t.icon),el("span",{className:"type-picker-label"},t.label));opt.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),selectedType=t.value,refresh(),dropdown.classList.remove("open")}),dropdown.appendChild(opt)}};return trigger.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),dropdown.classList.toggle("open")}),refresh(),container.append(trigger,dropdown),{el:container,getValue:()=>selectedType,setValue:v=>{selectedType=v,refresh()}}}function renderMarkdown2(md){return md?md.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/^### (.+)$/gm,"<h3>$1</h3>").replace(/^## (.+)$/gm,"<h2>$1</h2>").replace(/^# (.+)$/gm,"<h1>$1</h1>").replace(/[*][*](.+?)[*][*]/g,"<strong>$1</strong>").replace(/__(.+?)__/g,"<strong>$1</strong>").replace(/[*](.+?)[*]/g,"<em>$1</em>").replace(/_([^_]+?)_/g,"<em>$1</em>").replace(/`(.+?)`/g,"<code>$1</code>").replace(/^[-*] (.+)$/gm,"<li>$1</li>").replace(/^---$/gm,"<hr>").replace(/(<li>[\s\S]*?<\/li>\n?)+/g,m=>`<ul>${m}</ul>`).replace(/^(?!<[a-z]|$).+$/gm,line=>`<p>${line}</p>`):'<span class="modal-preview-empty">No description yet</span>'}function showEditModal(task){if(!state.root)return;state.editModal&&(state.editModal.remove(),state.editModal=null);let titleInput=el("input",{type:"text",placeholder:"Task title..."});titleInput.value=task.title??"";let statusSelect=el("select");for(let s of["backlog","todo","in-progress","review","done"]){let opt=el("option",{value:s},s);s===task.status&&(opt.selected=!0),statusSelect.appendChild(opt)}let typePicker=buildTypePickerEl(task.type??"Task"),header=el("div",{className:"modal-header"},titleInput,typePicker.el,statusSelect),tabEdit=el("div",{className:"modal-tab active"},"Edit"),tabPreview=el("div",{className:"modal-tab"},"Preview"),tabs=el("div",{className:"modal-tabs"},tabEdit,tabPreview),textarea=el("textarea",{placeholder:"Description (markdown supported)..."});textarea.value=task.description??"";let editorPane=el("div",{className:"modal-editor-pane"},textarea),previewPane=el("div",{className:"modal-preview-pane"});previewPane.style.display="none";let refreshPreview=()=>{previewPane.innerHTML=renderMarkdown2(textarea.value)},body=el("div",{className:"modal-body"},editorPane,previewPane);tabEdit.addEventListener("click",()=>{tabEdit.classList.add("active"),tabPreview.classList.remove("active"),editorPane.style.display="",previewPane.style.display="none"}),tabPreview.addEventListener("click",event=>{event.isTrusted&&(tabPreview.classList.add("active"),tabEdit.classList.remove("active"),editorPane.style.display="none",previewPane.style.display="",refreshPreview())});let btnSave=el("button",{className:"btn-primary"},"Save"),btnCancel=el("button",{className:"btn-ghost"},"Cancel"),footerLeft=el("div",{className:"modal-footer-left"},btnSave,btnCancel),footerRight=el("div",{className:"modal-footer-right"}),footerCenter=buildSourceRow({file:task.file,line:task.line,col:task.col,component:task.component}),footer=el("div",{className:"modal-footer"},footerLeft,footerCenter,footerRight),modal=el("div",{className:"vibeflow-modal"},header,tabs,body,footer),backdrop=el("div",{className:"vibeflow-modal-backdrop"},modal);state.editModal=backdrop,state.root.appendChild(backdrop),titleInput.focus(),backdrop.addEventListener("click",e=>{e.target===backdrop&&(backdrop.remove(),state.editModal=null)}),btnSave.addEventListener("click",()=>{let newTitle=titleInput.value.trim();if(!newTitle)return;let url=PROTO_CONFIG.boardId?`${PROTO_CONFIG.apiUrl}/${task.id}?boardId=${encodeURIComponent(PROTO_CONFIG.boardId)}`:`${PROTO_CONFIG.apiUrl}/${task.id}`;fetch(url,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:newTitle,status:statusSelect.value,type:typePicker.getValue(),description:textarea.value.trim()})}).then(r=>r.json()).then(d=>{d.success&&fetchTasksAndRender()}).catch(err=>console.error("[Vibeflow Studio]",err)),backdrop.remove(),state.editModal=null}),btnCancel.addEventListener("click",()=>{backdrop.remove(),state.editModal=null}),document.addEventListener("keydown",function onModalKey(e){if(!state.editModal){document.removeEventListener("keydown",onModalKey);return}e.key==="Escape"&&(backdrop.remove(),state.editModal=null,document.removeEventListener("keydown",onModalKey)),(e.ctrlKey||e.metaKey)&&e.key==="Enter"&&(btnSave.click(),document.removeEventListener("keydown",onModalKey))})}function fetchTasksAndRender(){fetchTasks()}function buildSourceRow(src){let row=el("div",{className:"modal-source-row"});if(!src.file&&!src.component)return row;let label="";src.file?(label=src.file.replace(/\\/g,"/").split("/").slice(-2).join("/"),src.line!=null&&(label+=`:${src.line}`),src.col!=null&&(label+=`:${src.col}`)):src.component&&(label=`\u2B21 ${src.component}`),src.component&&src.file&&(label+=` \xB7 \u2B21 ${src.component}`);let sourceEl=el("span",{className:"modal-source-label",title:src.file??""},label);if(src.file&&src.line!=null){let link=el("a",{className:"modal-source-link",title:"Open in editor",href:`vscode://file${src.file}:${src.line}`,target:"_blank"},"\u2197");row.append(sourceEl,link)}else row.append(sourceEl);return row}function showInspectModal(element,pointer){if(!state.root)return;state.editModal&&(state.editModal.remove(),state.editModal=null);let cssSelector=buildCssSelector(element),tag=element.tagName.toLowerCase(),elId=element.getAttribute("id"),classes=Array.from(element.classList).filter(c=>!c.startsWith("vibeflow-")),dataAttrs=Array.from(element.attributes).filter(a=>a.name.startsWith("data-")&&!a.name.startsWith("data-proto")).map(a=>({name:a.name,value:a.value})),heading=el("div",{className:"inspect-heading"},el("span",{className:"inspect-tag"},`<${tag}>`),el("span",{className:"inspect-title"},"Element Inspector")),closeBtn=el("button",{className:"inspect-close"},"\u2715");function makeRow(label,value,copyable=!0){let row=el("div",{className:"inspect-row"}),lbl=el("span",{className:"inspect-row-label"},label),val=el("code",{className:"inspect-row-value"},value||"\u2014");if(row.append(lbl,val),copyable&&value){let btn=el("button",{className:"inspect-copy-btn",title:"Copy"},"\u2398");btn.addEventListener("click",()=>{var _a;(_a=navigator.clipboard)==null||_a.writeText(value).catch(()=>{}),btn.textContent="\u2713",setTimeout(()=>{btn.textContent="\u2398"},1200)}),row.appendChild(btn)}return row}let rows=el("div",{className:"inspect-rows"});if(rows.appendChild(makeRow("Selector",pointer.selector)),cssSelector!==pointer.selector&&rows.appendChild(makeRow("CSS selector",cssSelector)),pointer.test_id&&rows.appendChild(makeRow("Test ID",pointer.test_id)),elId&&rows.appendChild(makeRow("id",elId)),classes.length>0&&rows.appendChild(makeRow("Classes",classes.join(" "))),pointer.file){let fileLine=pointer.file+(pointer.line!=null?`:${pointer.line}`:"")+(pointer.col!=null?`:${pointer.col}`:""),srcRow=makeRow("Source file",fileLine);if(pointer.line!=null){let openLink=el("a",{className:"inspect-copy-btn",title:"Open in VS Code",href:`vscode://file${pointer.file}:${pointer.line}`,target:"_blank"},"\u2197");srcRow.appendChild(openLink)}rows.appendChild(srcRow)}pointer.component&&rows.appendChild(makeRow("Component",pointer.component));for(let attr of dataAttrs)rows.appendChild(makeRow(attr.name,attr.value));let copyAllBtn=el("button",{className:"inspect-copy-all-btn"},"\u2398 Copy all");copyAllBtn.addEventListener("click",()=>{var _a;let lines=[];pointer.file&&lines.push(`Source: ${pointer.file}${pointer.line!=null?`:${pointer.line}`:""}${pointer.col!=null?`:${pointer.col}`:""}`),pointer.component&&lines.push(`Component: ${pointer.component}`),pointer.test_id&&lines.push(`TestID: ${pointer.test_id}`),lines.push(`Selector: ${pointer.selector}`),cssSelector!==pointer.selector&&lines.push(`CSS selector: ${cssSelector}`),elId&&lines.push(`id: ${elId}`),classes.length>0&&lines.push(`Classes: ${classes.join(" ")}`),(_a=navigator.clipboard)==null||_a.writeText(lines.join(`
1607
+ `)}`}function clampTriggerPos(pos,viewport){let x=Math.max(8,Math.min(viewport.width-64,pos.x)),y=Math.max(8,Math.min(viewport.height-64,pos.y));return{x,y}}function parseCookies(){let cookies=[];if(!document.cookie)return cookies;for(let pair of document.cookie.split(";")){let trimmed=pair.trim();if(!trimmed)continue;let eqIdx=trimmed.indexOf("=");if(eqIdx===-1)continue;let name=trimmed.slice(0,eqIdx).trim(),value=trimmed.slice(eqIdx+1).trim();cookies.push({name,value,domain:location.hostname,path:"/",expires:-1,httpOnly:!1,secure:location.protocol==="https:",sameSite:"Lax"})}return cookies}function captureAuthState(){let localStorageData={};try{for(let i=0;i<localStorage.length;i++){let key=localStorage.key(i);key&&(localStorageData[key]=localStorage.getItem(key)??"")}}catch{}let sessionStorageData={};try{for(let i=0;i<sessionStorage.length;i++){let key=sessionStorage.key(i);key&&(sessionStorageData[key]=sessionStorage.getItem(key)??"")}}catch{}return{cookies:parseCookies(),localStorage:localStorageData,sessionStorage:sessionStorageData}}var AUTH_TTL_MS=1440*60*1e3;async function sendBaselineToServer(taskId,baseline){try{let cfg=PROTO_CONFIG,apiUrl=`/api/tasks/${taskId}/baseline`;cfg!=null&&cfg.apiUrl&&(apiUrl=`${cfg.apiUrl.replace(/\/api\/(overlay\/)?tasks$/,"")}/api/tasks/${taskId}/baseline`),cfg!=null&&cfg.boardId&&(apiUrl+=`?boardId=${encodeURIComponent(cfg.boardId)}`);let headers={"Content-Type":"application/json"};cfg!=null&&cfg.overlayApiKey&&(headers["X-Overlay-Api-Key"]=cfg.overlayApiKey),await fetch(apiUrl,{method:"POST",headers,body:JSON.stringify({baseline})})}catch(err){console.error("[Vibeflow] Failed to store baseline:",err)}}async function sendPageBaselineToServer(taskId,page){try{let cfg=PROTO_CONFIG,apiUrl=`/api/tasks/${taskId}/baseline-page`;cfg!=null&&cfg.apiUrl&&(apiUrl=`${cfg.apiUrl.replace(/\/api\/(overlay\/)?tasks$/,"")}/api/tasks/${taskId}/baseline-page`),cfg!=null&&cfg.boardId&&(apiUrl+=`?boardId=${encodeURIComponent(cfg.boardId)}`);let headers={"Content-Type":"application/json"};cfg!=null&&cfg.overlayApiKey&&(headers["X-Overlay-Api-Key"]=cfg.overlayApiKey),await fetch(apiUrl,{method:"POST",headers,body:JSON.stringify({page})})}catch(err){console.error("[Vibeflow] Failed to store page baseline:",err)}}async function captureAndStoreAuthState(taskId,taskAuthor){let authState=captureAuthState();try{let cfg=PROTO_CONFIG,apiUrl=`/api/tasks/${taskId}/auth-state`;cfg!=null&&cfg.apiUrl&&(apiUrl=`${cfg.apiUrl.replace(/\/api\/(overlay\/)?tasks$/,"")}/api/tasks/${taskId}/auth-state`),cfg!=null&&cfg.boardId&&(apiUrl+=`?boardId=${encodeURIComponent(cfg.boardId)}`);let headers={"Content-Type":"application/json"};cfg!=null&&cfg.overlayApiKey&&(headers["X-Overlay-Api-Key"]=cfg.overlayApiKey),await fetch(apiUrl,{method:"POST",headers,body:JSON.stringify({authState,taskAuthor})})}catch(err){console.error("[Vibeflow] Failed to store auth state:",err)}}var RELEVANT_STYLES=["display","visibility","opacity","position","overflow","overflow-x","overflow-y","width","min-width","max-width","height","min-height","max-height","margin","margin-top","margin-right","margin-bottom","margin-left","padding","padding-top","padding-right","padding-bottom","padding-left","border","border-width","border-style","border-color","border-radius","background-color","background-image","color","font-size","font-weight","font-style","font-family","line-height","letter-spacing","text-align","text-decoration","text-overflow","white-space","flex-direction","flex-wrap","flex","justify-content","align-items","gap","row-gap","column-gap","grid-template-columns","grid-template-rows","z-index","box-shadow","transform","transition","cursor","user-select","pointer-events","top","left","right","bottom"];function buildKey(el2){let path=[],current=el2;for(;current&&current!==document.documentElement;){let parentEl=current.parentElement;if(!parentEl)break;let index=Array.from(parentEl.children).indexOf(current);path.unshift(index),current=parentEl}return path.join("/")}function buildDisplaySelector(el2){let tag=el2.tagName.toLowerCase(),taskId=el2.getAttribute("data-task-id");if(taskId)return`${tag}.task-card[data-task-id=${taskId}]`;let status=el2.getAttribute("data-status");if(status&&el2.classList.contains("column-scroll"))return`${tag}.column-scroll[data-status=${status}]`;let colId=el2.getAttribute("data-column-id");if(colId)return`${tag}[data-column-id=${colId}]`;let classes=Array.from(el2.classList).slice(0,2),selector=tag;classes.length&&(selector+="."+classes.join("."));let parent=el2.parentElement;if(parent){let siblings=Array.from(parent.children).filter(c=>c.tagName===el2.tagName);if(siblings.length>1){let idx=siblings.indexOf(el2)+1;selector+=`:nth-of-type(${idx})`}}return selector}function filterStyles(el2,styles=RELEVANT_STYLES){let computed=window.getComputedStyle(el2),result={};for(let prop of styles)result[prop]=computed.getPropertyValue(prop);return result}function normalizeText(text,limit=200){return text.replace(/\s+/g," ").trim().slice(0,limit)}function childSignature(children){let counts=new Map;for(let child of children){let tag=child.tagName.toLowerCase(),classes=Array.from(child.classList).slice(0,2).join("."),key=classes?`${tag}.${classes}`:tag;counts.set(key,(counts.get(key)||0)+1)}return Array.from(counts.entries()).map(([key,count])=>`${key} \xD7${count}`).slice(0,10)}function getXPath(el2){let parts=[],node=el2;for(;node&&node!==document.documentElement;){let index=1,sibling=node.previousElementSibling;for(;sibling;)sibling.tagName===node.tagName&&index++,sibling=sibling.previousElementSibling;let tag=node.tagName.toLowerCase();parts.unshift(`${tag}[${index}]`),node=node.parentElement}return"/"+parts.join("/")}function getParentSnippet(el2){let parent=el2.parentElement;if(!parent||parent===document.body)return;let html=parent.outerHTML;return html.length<=500?html:html.slice(0,500)+"\u2026"}function getBrowserString(){return navigator.userAgent}function capturePositionContext(el2){let rect=el2.getBoundingClientRect(),zIndex="auto",position="static",parentZIndex,current=el2;for(;current&&current!==document.documentElement;){let style=window.getComputedStyle(current),pos=style.position,z=style.zIndex;if(pos!=="static"||z!=="auto"){if(current===el2)position=pos,zIndex=z;else if(parentZIndex===void 0){parentZIndex=z;break}}if(pos!=="static")break;current=current.parentElement}return{boundingBox:{x:rect.x,y:rect.y,width:rect.width,height:rect.height},scrollPosition:{x:window.scrollX,y:window.scrollY},viewport:{width:window.innerWidth,height:window.innerHeight,dpr:window.devicePixelRatio},stackingContext:{zIndex,position,parentZIndex}}}function captureComputedStyles(el2){let style=window.getComputedStyle(el2),result={};for(let prop of RELEVANT_STYLES)result[prop]=style.getPropertyValue(prop);return result}function captureDomSnapshot(el2,cssSelector,consoleErrors=[]){return{outerHTML:el2.outerHTML,computedStyles:captureComputedStyles(el2),selector:cssSelector,xpath:getXPath(el2),position:capturePositionContext(el2),parentSnippet:getParentSnippet(el2),browser:getBrowserString(),consoleErrors,capturedAt:new Date().toISOString()}}function capturePageSnapshot(maxElements=1e3){let elements={},count=0,truncated=!1,walker=document.createTreeWalker(document.body,NodeFilter.SHOW_ELEMENT,{acceptNode(node){if(count>=maxElements)return NodeFilter.FILTER_REJECT;let el2=node;return el2.classList.length>0||el2.hasAttribute("data-task-id")||el2.hasAttribute("data-status")||el2.hasAttribute("data-column-id")?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}}),queue=[],n;for(;n=walker.nextNode();)queue.push(n);for(let el2 of queue){if(count>=maxElements){truncated=!0;break}let key=buildKey(el2),children=Array.from(el2.children),dataAttrs={};for(let a of Array.from(el2.attributes))a.name.startsWith("data-")&&(dataAttrs[a.name.slice(5)]=a.value);let position={x:0,y:0,width:0,height:0};try{let r=el2.getBoundingClientRect();position={x:Math.round(r.x),y:Math.round(r.y),width:Math.round(r.width),height:Math.round(r.height)}}catch{}elements[key]={key,selector:buildDisplaySelector(el2),tag:el2.tagName.toLowerCase(),classes:Array.from(el2.classList),dataAttrs,parentKey:el2.parentElement?buildKey(el2.parentElement):"",childCount:children.length,childSignature:childSignature(children),text:normalizeText(el2.textContent??""),position,baseline:filterStyles(el2,RELEVANT_STYLES),after:filterStyles(el2,RELEVANT_STYLES)},count++}return{version:1,capturedAt:new Date().toISOString(),truncated,elements}}var import_jsx_runtime30=__toESM(require_jsx_runtime(),1),_externalShowAddModal=null,_externalFlashTrigger=null,_externalSetTriggerVisible=null,_externalHideTrigger=null,_externalDisableOverlay=null;function showOverlayTrigger(){_externalSetTriggerVisible==null||_externalSetTriggerVisible()}function hideOverlayTrigger(){_externalHideTrigger==null||_externalHideTrigger()}function disableVibeflowOverlay(){_externalDisableOverlay==null||_externalDisableOverlay()}var TRIGGER_HIDDEN_KEY="vibeflow-trigger-hidden";function hasPrototypingApi(){return typeof window<"u"&&"__vf_prototyping"in window}function openPrototypingPanel(){let api=window.__vf_prototyping;api==null||api.openPanel()}function flashFavicon(durationMs=2200){let head=document.head,existing=head.querySelector('link[rel*="icon"]'),originalHref=(existing==null?void 0:existing.href)??"";existing&&existing.remove();let link=document.createElement("link");link.rel="icon",link.type="image/svg+xml";let animatedSvg='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" fill="none"><rect width="18" height="18" rx="4" fill="#2563eb"/><rect x="2.5" y="5" width="2" height="8" rx="1" fill="white" opacity=".7"><animate attributeName="height" values="3;13;3" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0s"/><animate attributeName="y" values="7.5;2.5;7.5" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0s"/></rect><rect x="6.5" y="2" width="2" height="14" rx="1" fill="white"><animate attributeName="height" values="3;15;3" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.15s"/><animate attributeName="y" values="7.5;1.5;7.5" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.15s"/></rect><rect x="10.5" y="6" width="2" height="6" rx="1" fill="white" opacity=".7"><animate attributeName="height" values="3;12;3" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.3s"/><animate attributeName="y" values="7.5;3;7.5" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.3s"/></rect><rect x="14.5" y="4" width="2" height="10" rx="1" fill="white" opacity=".85"><animate attributeName="height" values="3;13;3" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.45s"/><animate attributeName="y" values="7.5;2.5;7.5" dur="0.8s" repeatCount="3" calcMode="spline" keySplines=".4 0 .2 1;.4 0 .2 1" begin="0.45s"/></rect></svg>';link.href=`data:image/svg+xml,${encodeURIComponent(animatedSvg)}`,head.appendChild(link),window.setTimeout(()=>{if(link.remove(),originalHref){let restore=document.createElement("link");restore.rel="icon",restore.type="image/svg+xml",restore.href=originalHref,head.appendChild(restore)}},durationMs)}function flashOverlayTrigger(){_externalFlashTrigger==null||_externalFlashTrigger()}function CornerTrigger({onClick,flashing,onHide,onDisable}){let svgIcon=(0,import_jsx_runtime30.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 18 18",fill:"none","aria-hidden":"true",children:[(0,import_jsx_runtime30.jsx)("rect",{x:"2.5",y:"5",width:"2",height:"8",rx:"1",fill:"currentColor",opacity:"0.7"}),(0,import_jsx_runtime30.jsx)("rect",{x:"6.5",y:"2",width:"2",height:"14",rx:"1",fill:"currentColor"}),(0,import_jsx_runtime30.jsx)("rect",{x:"10.5",y:"6",width:"2",height:"6",rx:"1",fill:"currentColor",opacity:"0.7"}),(0,import_jsx_runtime30.jsx)("rect",{x:"14.5",y:"4",width:"2",height:"10",rx:"1",fill:"currentColor",opacity:"0.85"})]}),[pos,setPos]=import_react23.default.useState(()=>{try{let saved=localStorage.getItem("vibeflow-trigger-pos");if(saved){let parsed=JSON.parse(saved);if(typeof parsed.x=="number"&&isFinite(parsed.x)&&typeof parsed.y=="number"&&isFinite(parsed.y))return clampTriggerPos(parsed,{width:window.innerWidth,height:window.innerHeight})}}catch{}return null}),[isDragging,setIsDragging]=import_react23.default.useState(!1),[isHolding,setIsHolding]=import_react23.default.useState(!1),dragOrigin=import_react23.default.useRef(null),holdTimer=import_react23.default.useRef(null),didDrag=import_react23.default.useRef(!1),isRightClick=import_react23.default.useRef(!1),buttonRef=import_react23.default.useRef(null),posRef=import_react23.default.useRef(null);posRef.current=pos;let[ctxMenu,setCtxMenu]=import_react23.default.useState(null);import_react23.default.useEffect(()=>{if(pos)try{localStorage.setItem("vibeflow-trigger-pos",JSON.stringify(pos))}catch{}},[pos]),import_react23.default.useEffect(()=>{if(!ctxMenu)return;function onDocClick(){setCtxMenu(null)}return document.addEventListener("click",onDocClick,{once:!0}),()=>document.removeEventListener("click",onDocClick)},[ctxMenu]);function getInitialPos(el2){let rect=el2.getBoundingClientRect();return{x:rect.left,y:rect.top}}function onPointerDown(e){let target=e.currentTarget,pointerId=e.pointerId,clientX=e.clientX,clientY=e.clientY;didDrag.current=!1,isRightClick.current=e.button===2,!isRightClick.current&&(holdTimer.current=window.setTimeout(()=>{setIsHolding(!0);let startPos=posRef.current??getInitialPos(target);dragOrigin.current={mouseX:clientX,mouseY:clientY,posX:startPos.x,posY:startPos.y},target.setPointerCapture(pointerId)},300))}function onPointerMove(e){if(!dragOrigin.current)return;let dx=e.clientX-dragOrigin.current.mouseX,dy=e.clientY-dragOrigin.current.mouseY;!isDragging&&(Math.abs(dx)>3||Math.abs(dy)>3)&&setIsDragging(!0),didDrag.current=!0;let bw=window.innerWidth,bh=window.innerHeight,x=Math.max(8,Math.min(bw-64,dragOrigin.current.posX+dx)),y=Math.max(8,Math.min(bh-64,dragOrigin.current.posY+dy));setPos({x,y})}function onPointerUp(_e){holdTimer.current!==null&&(window.clearTimeout(holdTimer.current),holdTimer.current=null);let wasDragged=didDrag.current,wasRight=isRightClick.current;dragOrigin.current=null,setIsDragging(!1),setIsHolding(!1),didDrag.current=!1,isRightClick.current=!1,!wasDragged&&!wasRight&&onClick()}function onPointerCancel(){holdTimer.current!==null&&(window.clearTimeout(holdTimer.current),holdTimer.current=null),dragOrigin.current=null,setIsDragging(!1),setIsHolding(!1),didDrag.current=!1}let posStyle=pos===null?{}:{position:"fixed",left:pos.x,top:pos.y,bottom:"auto",right:"auto"},className=["vibeflow-corner-trigger",flashing?"saved-flash":"",isHolding?"trigger-holding":"",isDragging?"trigger-dragging":""].filter(Boolean).join(" "),title=isDragging?"Drag to reposition":isHolding?"Drag to reposition \xB7 Release to open":"Open Kanban board \xB7 Hold to drag";function onContextMenu(e){e.preventDefault(),e.stopPropagation();let MENU_W=120,ITEM_H=28,PAD=8,itemCount=2+(hasPrototypingApi()?1:0),MENU_H=ITEM_H*itemCount,x=Math.min(e.clientX,window.innerWidth-MENU_W-PAD),y=Math.min(e.clientY,window.innerHeight-MENU_H-PAD);setCtxMenu({x:Math.max(PAD,x),y:Math.max(PAD,y)})}return(0,import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment,{children:[(0,import_jsx_runtime30.jsx)("button",{ref:buttonRef,className,title,style:posStyle,onPointerDown,onPointerMove,onPointerUp,onPointerCancel,onContextMenu,"data-vibeflow-ignore":"true",children:svgIcon}),ctxMenu&&(0,import_jsx_runtime30.jsxs)("div",{className:"vibeflow-trigger-ctx-menu",style:{position:"fixed",left:ctxMenu.x,top:ctxMenu.y},onClick:e=>e.stopPropagation(),children:[hasPrototypingApi()&&(0,import_jsx_runtime30.jsx)("button",{type:"button",onClick:()=>{setCtxMenu(null),openPrototypingPanel()},children:"Prototyping"}),(0,import_jsx_runtime30.jsx)("button",{type:"button",onClick:()=>{setCtxMenu(null),onHide()},children:"Hide Vibeflow"}),(0,import_jsx_runtime30.jsx)("button",{type:"button",onClick:()=>{setCtxMenu(null),onDisable()},children:"Disable Vibeflow"})]})]})}var STATUS_OPTIONS=["backlog","todo","in-progress","review","done"],STATUS_ACTIVE={backlog:{background:"rgba(100,116,139,0.2)",borderColor:"rgba(100,116,139,0.5)",color:"#94a3b8"},todo:{background:"rgba(245,158,11,0.15)",borderColor:"rgba(245,158,11,0.4)",color:"#fcd34d"},"in-progress":{background:"rgba(59,130,246,0.15)",borderColor:"rgba(59,130,246,0.4)",color:"#93c5fd"},review:{background:"rgba(139,92,246,0.15)",borderColor:"rgba(139,92,246,0.4)",color:"#c4b5fd"},done:{background:"rgba(52,211,153,0.12)",borderColor:"rgba(52,211,153,0.4)",color:"#6ee7b7"}},PRIORITY_ACTIVE={Critical:{background:"rgba(239,68,68,0.15)",borderColor:"rgba(239,68,68,0.4)",color:"#fca5a5"},High:{background:"rgba(245,158,11,0.15)",borderColor:"rgba(245,158,11,0.4)",color:"#fcd34d"},Medium:{background:"rgba(100,116,139,0.2)",borderColor:"rgba(100,116,139,0.5)",color:"#94a3b8"},Low:{background:"transparent",borderColor:"var(--vibeflow-border-strong)",color:"var(--vibeflow-text-muted)"}};function OverlayAddModal({opts,onClose,onSubmit}){let[title,setTitle]=import_react23.default.useState(opts.initialTitle??""),[description,setDescription]=import_react23.default.useState(opts.initialDescription??""),[status,setStatus]=import_react23.default.useState("todo"),[showAdvanced,setShowAdvanced]=import_react23.default.useState(!1),[tags,setTags]=import_react23.default.useState([]),[tagDraft,setTagDraft]=import_react23.default.useState(""),[priority,setPriority]=import_react23.default.useState("");function commitTagDraft(){let parts=tagDraft.split(/[,\n]/).map(p=>p.trim()).filter(p=>p.length>0);parts.length&&setTags(prev=>[...prev,...parts.filter(p=>!prev.includes(p))]),setTagDraft("")}let[type,setType]=import_react23.default.useState("Task"),[showPreview,setShowPreview]=import_react23.default.useState(!1),[titleError,setTitleError]=import_react23.default.useState(!1),titleRef=import_react23.default.useRef(null),[dragPos,setDragPos]=import_react23.default.useState(null),[isDragging,setIsDragging]=import_react23.default.useState(!1),dragOrigin=import_react23.default.useRef(null);function onHeaderPointerDown(e){if(e.target.closest("button, input, select, textarea, a"))return;e.currentTarget.setPointerCapture(e.pointerId);let startX=(dragPos==null?void 0:dragPos.x)??window.innerWidth/2-270,startY=(dragPos==null?void 0:dragPos.y)??window.innerHeight/2-200;dragOrigin.current={mouseX:e.clientX,mouseY:e.clientY,posX:startX,posY:startY},setIsDragging(!0)}function onHeaderPointerMove(e){if(!dragOrigin.current)return;let dx=e.clientX-dragOrigin.current.mouseX,dy=e.clientY-dragOrigin.current.mouseY;setDragPos({x:dragOrigin.current.posX+dx,y:dragOrigin.current.posY+dy})}function onHeaderPointerUp(){dragOrigin.current=null,setIsDragging(!1)}import_react23.default.useEffect(()=>{setTimeout(()=>{var _a;return(_a=titleRef.current)==null?void 0:_a.focus()},50)},[]);function handleBackdropClick(e){e.target===e.currentTarget&&onClose()}function handleKeyDown(e){e.key==="Escape"&&onClose(),(e.ctrlKey||e.metaKey)&&e.key==="Enter"&&handleSave()}async function handleSave(){var _a;let t=title.trim();if(!t){setTitleError(!0),(_a=titleRef.current)==null||_a.focus();return}setTitleError(!1);let desc=description.trim()||t;if(type==="Bug"){let logs=getRecordedLogs();logs&&(desc+=logs)}let result=await onSubmit(opts.selector??location.pathname,opts.cssSelector??location.pathname,t,desc,status,type,{file:opts.file,line:opts.line,col:opts.col,component:opts.component},{tags,priority:priority||void 0});if(result.success&&result.taskId){let baselineSelector=opts.cssSelector??opts.selector,targetEl=baselineSelector?document.querySelector(baselineSelector):null;if(targetEl&&baselineSelector)try{let snapshot=captureDomSnapshot(targetEl,baselineSelector);sendBaselineToServer(result.taskId,snapshot)}catch(err){console.error("[Vibeflow] Failed to capture baseline:",err)}captureAndStoreAuthState(result.taskId,result.taskAuthor??"unknown")}onClose()}let statusBtnBase={padding:"2px 8px",borderRadius:4,fontSize:11,cursor:"pointer",border:"1px solid var(--vibeflow-border-strong)",background:"transparent",color:"var(--vibeflow-text-muted)",fontFamily:"inherit",fontWeight:500,transition:"all .12s"},modalStyle=dragPos===null?{}:{position:"fixed",left:dragPos.x,top:dragPos.y,margin:0};return(0,import_jsx_runtime30.jsx)("div",{className:"vibeflow-modal-backdrop",onClick:handleBackdropClick,onKeyDown:handleKeyDown,children:(0,import_jsx_runtime30.jsxs)("div",{className:"vibeflow-modal overlay-add-modal",role:"dialog","aria-modal":"true",style:modalStyle,children:[(0,import_jsx_runtime30.jsxs)("div",{className:"modal-header overlay-modal-header",style:{cursor:isDragging?"grabbing":"grab",userSelect:"none"},onPointerDown:onHeaderPointerDown,onPointerMove:onHeaderPointerMove,onPointerUp:onHeaderPointerUp,children:[(0,import_jsx_runtime30.jsx)("span",{title:"Drag to move",style:{display:"flex",alignItems:"center",color:"var(--vibeflow-text-muted)",opacity:.5,flexShrink:0,pointerEvents:"none"},children:(0,import_jsx_runtime30.jsxs)("svg",{width:"12",height:"16",viewBox:"0 0 12 16",fill:"currentColor","aria-hidden":"true",children:[(0,import_jsx_runtime30.jsx)("circle",{cx:"3",cy:"3",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"9",cy:"3",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"3",cy:"8",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"9",cy:"8",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"3",cy:"13",r:"1.5"}),(0,import_jsx_runtime30.jsx)("circle",{cx:"9",cy:"13",r:"1.5"})]})}),(0,import_jsx_runtime30.jsx)(TypePicker,{value:type,onChange:setType}),(0,import_jsx_runtime30.jsx)("input",{ref:titleRef,type:"text",placeholder:"Task title\u2026",value:title,onChange:e=>{setTitle(e.target.value),titleError&&e.target.value.trim()&&setTitleError(!1)},style:{flex:1,fontSize:14,fontWeight:600,padding:"4px 8px",border:`1px solid ${titleError?"rgba(239,68,68,0.7)":"transparent"}`,borderRadius:6,background:titleError?"rgba(239,68,68,0.07)":"transparent",color:"var(--vibeflow-text-primary)",fontFamily:"inherit",outline:"none",cursor:"text"},onFocus:e=>{titleError||(e.currentTarget.style.borderColor="var(--vibeflow-accent-strong)",e.currentTarget.style.background="var(--vibeflow-surface-elevated)")},onBlur:e=>{titleError||(e.currentTarget.style.borderColor="transparent",e.currentTarget.style.background="transparent")},onKeyDown:e=>{e.key==="Enter"&&handleSave(),e.key==="Escape"&&onClose()}}),titleError&&(0,import_jsx_runtime30.jsx)("span",{style:{fontSize:11,color:"rgba(239,68,68,0.9)",flexShrink:0,whiteSpace:"nowrap"},children:"Title is required"}),(0,import_jsx_runtime30.jsx)("button",{type:"button",onClick:onClose,style:{width:26,height:26,flexShrink:0,display:"flex",alignItems:"center",justifyContent:"center",borderRadius:6,border:"none",background:"transparent",color:"var(--vibeflow-text-muted)",cursor:"pointer"},onMouseOver:e=>{e.currentTarget.style.background="var(--vibeflow-surface-hover)",e.currentTarget.style.color="var(--vibeflow-text-secondary)"},onMouseOut:e=>{e.currentTarget.style.background="transparent",e.currentTarget.style.color="var(--vibeflow-text-muted)"},"aria-label":"Close",children:"\u2715"})]}),(0,import_jsx_runtime30.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"8px 16px",borderBottom:"1px solid var(--vibeflow-border-strong)"},children:[(0,import_jsx_runtime30.jsx)("span",{style:{fontSize:10,color:"var(--vibeflow-text-muted)",fontWeight:500,textTransform:"uppercase",letterSpacing:"0.04em",flexShrink:0},children:"Status"}),STATUS_OPTIONS.map(s=>(0,import_jsx_runtime30.jsx)("button",{type:"button",style:{...statusBtnBase,...s===status?STATUS_ACTIVE[s]:{}},onClick:()=>setStatus(s),onMouseOver:e=>{s!==status&&(e.currentTarget.style.background="var(--vibeflow-surface-hover)",e.currentTarget.style.color="var(--vibeflow-text-secondary)")},onMouseOut:e=>{s!==status&&(e.currentTarget.style.background="transparent",e.currentTarget.style.color="var(--vibeflow-text-muted)")},children:s},s))]}),(opts.file||opts.component)&&(0,import_jsx_runtime30.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"6px 16px",background:"var(--vibeflow-surface-elevated)",borderBottom:"1px solid var(--vibeflow-border-subtle)",fontSize:11,color:"var(--vibeflow-text-muted)"},children:[opts.file&&(0,import_jsx_runtime30.jsxs)("a",{href:`vscode://file${opts.file}${opts.line==null?"":`:${opts.line}`}`,target:"_blank",rel:"noreferrer",style:{display:"inline-flex",alignItems:"center",gap:4,padding:"2px 6px",borderRadius:4,background:"var(--vibeflow-accent-soft)",border:"1px solid var(--vibeflow-accent-border)",color:"var(--vibeflow-accent-strong)",textDecoration:"none",fontSize:11},children:["\u{1F5CE} ",opts.file.split("/").slice(-2).join("/"),opts.line==null?"":`:${opts.line}`]}),opts.component&&(0,import_jsx_runtime30.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:4,padding:"2px 6px",borderRadius:4,background:"rgba(139,92,246,0.08)",border:"1px solid rgba(139,92,246,0.25)",color:"#8b5cf6",fontSize:11},children:["\u2B21 ",opts.component]})]}),(0,import_jsx_runtime30.jsxs)("div",{className:"modal-tabs",children:[(0,import_jsx_runtime30.jsx)("div",{className:`modal-tab${showPreview?"":" active"}`,onClick:()=>setShowPreview(!1),children:"Edit"}),(0,import_jsx_runtime30.jsx)("div",{className:`modal-tab${showPreview?" active":""}`,onClick:()=>setShowPreview(!0),children:"Preview"})]}),(0,import_jsx_runtime30.jsx)("div",{className:"modal-body",children:showPreview?(0,import_jsx_runtime30.jsx)(MarkdownPreview,{markdown:description,className:"modal-preview-pane"}):(0,import_jsx_runtime30.jsx)("div",{className:"modal-editor-pane",children:(0,import_jsx_runtime30.jsx)(AutoExpandTextarea,{className:"dp-textarea",placeholder:"Description (markdown supported)\u2026",value:description,onChange:setDescription,baseRows:5,maxRows:14})})}),type==="Bug"&&(0,import_jsx_runtime30.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"6px 16px",background:"rgba(239,68,68,0.06)",borderTop:"1px solid rgba(239,68,68,0.18)",fontSize:11,color:"rgba(239,68,68,0.75)"},children:[(0,import_jsx_runtime30.jsx)("span",{children:"\u{1F534}"}),(0,import_jsx_runtime30.jsx)("span",{children:"Console errors & warnings will be attached to this report"})]}),(0,import_jsx_runtime30.jsxs)("div",{style:{borderTop:"1px solid var(--vibeflow-border-subtle)"},children:[(0,import_jsx_runtime30.jsxs)("button",{type:"button",onClick:()=>setShowAdvanced(v=>!v),style:{display:"flex",alignItems:"center",gap:6,width:"100%",padding:"6px 16px",background:"transparent",border:"none",cursor:"pointer",fontSize:11,fontWeight:600,color:"var(--vibeflow-text-muted)",fontFamily:"inherit"},children:[(0,import_jsx_runtime30.jsx)("span",{style:{display:"inline-block",fontSize:9,transition:"transform .12s",transform:showAdvanced?"rotate(90deg)":"none"},children:"\u25B6"}),"Advanced"]}),showAdvanced&&(0,import_jsx_runtime30.jsxs)("div",{style:{padding:"2px 16px 10px",display:"flex",flexDirection:"column",gap:8},children:[(0,import_jsx_runtime30.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,flexWrap:"wrap"},children:[(0,import_jsx_runtime30.jsx)("span",{style:{fontSize:10,color:"var(--vibeflow-text-muted)",fontWeight:500,textTransform:"uppercase",letterSpacing:"0.04em",flexShrink:0},children:"Tags"}),tags.map(tag=>(0,import_jsx_runtime30.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:4,padding:"1px 4px 1px 8px",borderRadius:100,background:"rgba(59,130,246,0.12)",border:"1px solid rgba(59,130,246,0.3)",fontSize:10,color:"#93c5fd",fontWeight:600},children:[tag,(0,import_jsx_runtime30.jsx)("button",{type:"button",onClick:()=>setTags(prev=>prev.filter(x=>x!==tag)),style:{display:"flex",background:"none",border:"none",color:"#93c5fd",cursor:"pointer",padding:0,lineHeight:1},children:"\u2715"})]},tag)),(0,import_jsx_runtime30.jsx)("input",{value:tagDraft,onChange:e=>setTagDraft(e.target.value),onKeyDown:e=>{(e.key==="Enter"||e.key===",")&&(e.preventDefault(),commitTagDraft())},onBlur:commitTagDraft,placeholder:"Add tag\u2026",style:{flex:"1 1 90px",minWidth:90,background:"transparent",border:"1px dashed var(--vibeflow-border-strong)",borderRadius:4,padding:"2px 6px",fontSize:11,color:"var(--vibeflow-text-secondary)",fontFamily:"inherit",outline:"none"}})]}),(0,import_jsx_runtime30.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6},children:[(0,import_jsx_runtime30.jsx)("span",{style:{fontSize:10,color:"var(--vibeflow-text-muted)",fontWeight:500,textTransform:"uppercase",letterSpacing:"0.04em",flexShrink:0},children:"Priority"}),["Critical","High","Medium","Low"].map(p=>(0,import_jsx_runtime30.jsx)("button",{type:"button",style:{...statusBtnBase,...p===priority?PRIORITY_ACTIVE[p]:{}},onClick:()=>setPriority(prev=>prev===p?"":p),children:p},p))]})]})]}),(0,import_jsx_runtime30.jsxs)("div",{className:"modal-footer",children:[(0,import_jsx_runtime30.jsxs)("div",{className:"modal-footer-left",children:[(0,import_jsx_runtime30.jsx)("button",{type:"button",className:"btn-primary",onClick:handleSave,disabled:!title.trim(),style:{opacity:title.trim()?1:.45,cursor:title.trim()?"pointer":"not-allowed"},children:"Add Task"}),(0,import_jsx_runtime30.jsx)("button",{type:"button",className:"btn-ghost",onClick:onClose,children:"Cancel"})]}),(0,import_jsx_runtime30.jsx)("div",{className:"modal-footer-center",children:(0,import_jsx_runtime30.jsx)("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:11,color:"var(--vibeflow-text-muted)",cursor:"pointer",userSelect:"none"}})})]})]})})}function OverlayApp({onOpenKanban,onSubmitTask}){let[addModalOpts,setAddModalOpts]=import_react23.default.useState(null),[triggerFlashing,setTriggerFlashing]=import_react23.default.useState(!1),[isHidden,setIsHidden]=import_react23.default.useState(()=>{try{return localStorage.getItem(TRIGGER_HIDDEN_KEY)==="1"}catch{return!1}});import_react23.default.useEffect(()=>(_externalShowAddModal=opts=>setAddModalOpts(opts),_externalFlashTrigger=()=>{setTriggerFlashing(!0),window.setTimeout(()=>setTriggerFlashing(!1),1500),flashFavicon()},_externalSetTriggerVisible=()=>{try{localStorage.removeItem(TRIGGER_HIDDEN_KEY)}catch{}setIsHidden(!1)},_externalHideTrigger=()=>{try{localStorage.setItem(TRIGGER_HIDDEN_KEY,"1")}catch{}setIsHidden(!0)},_externalDisableOverlay=()=>{state.disabled=!0,state.host&&(state.host.remove(),state.host=null)},()=>{_externalShowAddModal=null,_externalFlashTrigger=null,_externalSetTriggerVisible=null,_externalHideTrigger=null,_externalDisableOverlay=null}),[]);let isKanbanPage=typeof document<"u"&&document.body.hasAttribute("data-vibeflow-cli-kanban");return(0,import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment,{children:[!isKanbanPage&&!isHidden&&(0,import_jsx_runtime30.jsx)(CornerTrigger,{onClick:onOpenKanban,flashing:triggerFlashing,onHide:()=>{try{localStorage.setItem(TRIGGER_HIDDEN_KEY,"1")}catch{}setIsHidden(!0)},onDisable:()=>{state.disabled=!0,state.host&&(state.host.remove(),state.host=null)}}),addModalOpts!==null&&(0,import_jsx_runtime30.jsx)(OverlayAddModal,{opts:addModalOpts,onClose:()=>setAddModalOpts(null),onSubmit:async(selector,cssSelector,title,description,status,type,meta,advanced)=>{let result=await onSubmitTask(selector,cssSelector,title,description,status,type,meta,advanced);return setAddModalOpts(null),result}})]})}function buildTypePickerEl(initialType="Task"){let selectedType=initialType,detailed=TASK_TYPES,currentInfo=()=>detailed.find(t=>t.value===selectedType)??detailed[0],container=el("div",{className:"type-picker"}),trigger=el("button",{className:"type-picker-trigger",type:"button"}),dropdown=el("div",{className:"type-picker-dropdown"}),refresh=()=>{let info=currentInfo();trigger.title=(info==null?void 0:info.tooltip)??"",trigger.replaceChildren(el("span",{className:"type-picker-icon"},(info==null?void 0:info.icon)??""),el("span",{className:"type-picker-label"},(info==null?void 0:info.label)??"")),dropdown.replaceChildren();for(let t of detailed){let opt=el("button",{className:t.value===selectedType?"type-picker-option type-picker-option--active":"type-picker-option",type:"button",title:t.tooltip},el("span",{className:"type-picker-icon"},t.icon),el("span",{className:"type-picker-label"},t.label));opt.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),selectedType=t.value,refresh(),dropdown.classList.remove("open")}),dropdown.appendChild(opt)}};return trigger.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),dropdown.classList.toggle("open")}),refresh(),container.append(trigger,dropdown),{el:container,getValue:()=>selectedType,setValue:v=>{selectedType=v,refresh()}}}function renderMarkdown2(md){return md?md.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/^### (.+)$/gm,"<h3>$1</h3>").replace(/^## (.+)$/gm,"<h2>$1</h2>").replace(/^# (.+)$/gm,"<h1>$1</h1>").replace(/[*][*](.+?)[*][*]/g,"<strong>$1</strong>").replace(/__(.+?)__/g,"<strong>$1</strong>").replace(/[*](.+?)[*]/g,"<em>$1</em>").replace(/_([^_]+?)_/g,"<em>$1</em>").replace(/`(.+?)`/g,"<code>$1</code>").replace(/^[-*] (.+)$/gm,"<li>$1</li>").replace(/^---$/gm,"<hr>").replace(/(<li>[\s\S]*?<\/li>\n?)+/g,m=>`<ul>${m}</ul>`).replace(/^(?!<[a-z]|$).+$/gm,line=>`<p>${line}</p>`):'<span class="modal-preview-empty">No description yet</span>'}function showEditModal(task){if(!state.root)return;state.editModal&&(state.editModal.remove(),state.editModal=null);let titleInput=el("input",{type:"text",placeholder:"Task title..."});titleInput.value=task.title??"";let statusSelect=el("select");for(let s of["backlog","todo","in-progress","review","done"]){let opt=el("option",{value:s},s);s===task.status&&(opt.selected=!0),statusSelect.appendChild(opt)}let typePicker=buildTypePickerEl(task.type??"Task"),header=el("div",{className:"modal-header"},titleInput,typePicker.el,statusSelect),tabEdit=el("div",{className:"modal-tab active"},"Edit"),tabPreview=el("div",{className:"modal-tab"},"Preview"),tabs=el("div",{className:"modal-tabs"},tabEdit,tabPreview),textarea=el("textarea",{placeholder:"Description (markdown supported)..."});textarea.value=task.description??"";let editorPane=el("div",{className:"modal-editor-pane"},textarea),previewPane=el("div",{className:"modal-preview-pane"});previewPane.style.display="none";let refreshPreview=()=>{previewPane.innerHTML=renderMarkdown2(textarea.value)},body=el("div",{className:"modal-body"},editorPane,previewPane);tabEdit.addEventListener("click",()=>{tabEdit.classList.add("active"),tabPreview.classList.remove("active"),editorPane.style.display="",previewPane.style.display="none"}),tabPreview.addEventListener("click",event=>{event.isTrusted&&(tabPreview.classList.add("active"),tabEdit.classList.remove("active"),editorPane.style.display="none",previewPane.style.display="",refreshPreview())});let btnSave=el("button",{className:"btn-primary"},"Save"),btnCancel=el("button",{className:"btn-ghost"},"Cancel"),footerLeft=el("div",{className:"modal-footer-left"},btnSave,btnCancel),footerRight=el("div",{className:"modal-footer-right"}),footerCenter=buildSourceRow({file:task.file,line:task.line,col:task.col,component:task.component}),footer=el("div",{className:"modal-footer"},footerLeft,footerCenter,footerRight),modal=el("div",{className:"vibeflow-modal"},header,tabs,body,footer),backdrop=el("div",{className:"vibeflow-modal-backdrop"},modal);state.editModal=backdrop,state.root.appendChild(backdrop),titleInput.focus(),backdrop.addEventListener("click",e=>{e.target===backdrop&&(backdrop.remove(),state.editModal=null)}),btnSave.addEventListener("click",()=>{let newTitle=titleInput.value.trim();if(!newTitle)return;let url=PROTO_CONFIG.boardId?`${PROTO_CONFIG.apiUrl}/${task.id}?boardId=${encodeURIComponent(PROTO_CONFIG.boardId)}`:`${PROTO_CONFIG.apiUrl}/${task.id}`;fetch(url,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:newTitle,status:statusSelect.value,type:typePicker.getValue(),description:textarea.value.trim()})}).then(r=>r.json()).then(d=>{d.success&&fetchTasksAndRender()}).catch(err=>console.error("[Vibeflow Studio]",err)),backdrop.remove(),state.editModal=null}),btnCancel.addEventListener("click",()=>{backdrop.remove(),state.editModal=null}),document.addEventListener("keydown",function onModalKey(e){if(!state.editModal){document.removeEventListener("keydown",onModalKey);return}e.key==="Escape"&&(backdrop.remove(),state.editModal=null,document.removeEventListener("keydown",onModalKey)),(e.ctrlKey||e.metaKey)&&e.key==="Enter"&&(btnSave.click(),document.removeEventListener("keydown",onModalKey))})}function fetchTasksAndRender(){fetchTasks()}function buildSourceRow(src){let row=el("div",{className:"modal-source-row"});if(!src.file&&!src.component)return row;let label="";src.file?(label=src.file.replace(/\\/g,"/").split("/").slice(-2).join("/"),src.line!=null&&(label+=`:${src.line}`),src.col!=null&&(label+=`:${src.col}`)):src.component&&(label=`\u2B21 ${src.component}`),src.component&&src.file&&(label+=` \xB7 \u2B21 ${src.component}`);let sourceEl=el("span",{className:"modal-source-label",title:src.file??""},label);if(src.file&&src.line!=null){let link=el("a",{className:"modal-source-link",title:"Open in editor",href:`vscode://file${src.file}:${src.line}`,target:"_blank"},"\u2197");row.append(sourceEl,link)}else row.append(sourceEl);return row}function showInspectModal(element,pointer){if(!state.root)return;state.editModal&&(state.editModal.remove(),state.editModal=null);let cssSelector=buildCssSelector(element),tag=element.tagName.toLowerCase(),elId=element.getAttribute("id"),classes=Array.from(element.classList).filter(c=>!c.startsWith("vibeflow-")),dataAttrs=Array.from(element.attributes).filter(a=>a.name.startsWith("data-")&&!a.name.startsWith("data-proto")).map(a=>({name:a.name,value:a.value})),heading=el("div",{className:"inspect-heading"},el("span",{className:"inspect-tag"},`<${tag}>`),el("span",{className:"inspect-title"},"Element Inspector")),closeBtn=el("button",{className:"inspect-close"},"\u2715");function makeRow(label,value,copyable=!0){let row=el("div",{className:"inspect-row"}),lbl=el("span",{className:"inspect-row-label"},label),val=el("code",{className:"inspect-row-value"},value||"\u2014");if(row.append(lbl,val),copyable&&value){let btn=el("button",{className:"inspect-copy-btn",title:"Copy"},"\u2398");btn.addEventListener("click",()=>{var _a;(_a=navigator.clipboard)==null||_a.writeText(value).catch(()=>{}),btn.textContent="\u2713",setTimeout(()=>{btn.textContent="\u2398"},1200)}),row.appendChild(btn)}return row}let rows=el("div",{className:"inspect-rows"});if(rows.appendChild(makeRow("Selector",pointer.selector)),cssSelector!==pointer.selector&&rows.appendChild(makeRow("CSS selector",cssSelector)),pointer.test_id&&rows.appendChild(makeRow("Test ID",pointer.test_id)),elId&&rows.appendChild(makeRow("id",elId)),classes.length>0&&rows.appendChild(makeRow("Classes",classes.join(" "))),pointer.file){let fileLine=pointer.file+(pointer.line!=null?`:${pointer.line}`:"")+(pointer.col!=null?`:${pointer.col}`:""),srcRow=makeRow("Source file",fileLine);if(pointer.line!=null){let openLink=el("a",{className:"inspect-copy-btn",title:"Open in VS Code",href:`vscode://file${pointer.file}:${pointer.line}`,target:"_blank"},"\u2197");srcRow.appendChild(openLink)}rows.appendChild(srcRow)}pointer.component&&rows.appendChild(makeRow("Component",pointer.component));for(let attr of dataAttrs)rows.appendChild(makeRow(attr.name,attr.value));let copyAllBtn=el("button",{className:"inspect-copy-all-btn"},"\u2398 Copy all");copyAllBtn.addEventListener("click",()=>{var _a;let lines=[];pointer.file&&lines.push(`Source: ${pointer.file}${pointer.line!=null?`:${pointer.line}`:""}${pointer.col!=null?`:${pointer.col}`:""}`),pointer.component&&lines.push(`Component: ${pointer.component}`),pointer.test_id&&lines.push(`TestID: ${pointer.test_id}`),lines.push(`Selector: ${pointer.selector}`),cssSelector!==pointer.selector&&lines.push(`CSS selector: ${cssSelector}`),elId&&lines.push(`id: ${elId}`),classes.length>0&&lines.push(`Classes: ${classes.join(" ")}`),(_a=navigator.clipboard)==null||_a.writeText(lines.join(`
1608
1608
  `)).catch(()=>{}),copyAllBtn.textContent="\u2713 Copied!",setTimeout(()=>{copyAllBtn.textContent="\u2398 Copy all"},1500)});let box=el("div",{className:"vibeflow-inspect-modal"},el("div",{className:"inspect-header"},heading,closeBtn),rows,el("div",{className:"inspect-footer"},copyAllBtn)),backdrop=el("div",{className:"vibeflow-modal-backdrop"},box);state.editModal=backdrop,state.root.appendChild(backdrop),closeBtn.addEventListener("click",()=>{backdrop.remove(),state.editModal=null}),backdrop.addEventListener("click",e=>{e.target===backdrop&&(backdrop.remove(),state.editModal=null)}),document.addEventListener("keydown",function onInspectKey(e){if(!state.editModal){document.removeEventListener("keydown",onInspectKey);return}e.key==="Escape"&&(backdrop.remove(),state.editModal=null,document.removeEventListener("keydown",onInspectKey))})}function getTaskTypeTooltip(type){var _a;return((_a=TASK_TYPES.find(t=>t.value===(type??"Task")))==null?void 0:_a.tooltip)??""}function buildOverlayTaskCard(task,options){let{currentPath,onOpen,onDone,onDelete,showSelector=!0,showDescription=!0,showActions=!1}=options,statusBadge=el("span",{className:`status-badge status-${task.status.replace(" ","-")}`},task.status),effectiveType=task.type??"Task",typeBadge=el("span",{className:`type-badge type-badge-${effectiveType.toLowerCase()}`,title:getTaskTypeTooltip(effectiveType)},effectiveType),header=el("div",{className:"task-card-header"},statusBadge,typeBadge);task.status==="in-progress"&&header.appendChild(el("span",{className:"task-spinner"})),task.url&&task.url!==currentPath&&header.appendChild(el("span",{className:"task-url-badge"},task.url));let icon=getTaskTypeIcon(task.type),card=el("div",{className:task.status==="in-progress"?"task-card in-progress":"task-card"},el("span",{className:"task-watermark",title:`Type: ${task.type??"Task"}`},icon),header,el("div",{className:"task-title"},task.title??"Untitled"));if(showSelector&&card.appendChild(el("div",{className:"task-selector"},task.selector)),showDescription&&task.description&&card.appendChild(el("div",{className:"task-description"},task.description)),card.addEventListener("click",e=>{var _a,_b;(_b=(_a=e.target).closest)!=null&&_b.call(_a,".task-actions")||onOpen(task)}),showActions){let actions=el("div",{className:"task-actions"});if(task.status!=="done"&&onDone){let doneBtn=el("button",{className:"done-btn"},"\u2713 Done");doneBtn.addEventListener("click",e=>{e.stopPropagation(),onDone(task)}),actions.appendChild(doneBtn)}if(onDelete){let deleteBtn=el("button",{className:"delete-btn"},"\u2715");deleteBtn.addEventListener("click",e=>{e.stopPropagation(),onDelete(task)}),actions.appendChild(deleteBtn)}card.appendChild(actions)}return card}function renderIndicators(){if(!state.indicatorContainer||(state.indicatorContainer.replaceChildren(),forceHideTooltip(),!state.indicatorsVisible||state.tasks.length===0))return;let currentPath=location.pathname,pageTasks=state.tasks.filter(t=>!t.url||t.url===currentPath);if(pageTasks.length===0)return;let bySelector={};for(let t of pageTasks){let domSel=t.cssSelector||t.selector;bySelector[domSel]||(bySelector[domSel]=[]),bySelector[domSel].push(t)}let vpW=window.innerWidth||document.documentElement.clientWidth,vpH=window.innerHeight||document.documentElement.clientHeight;for(let sel of Object.keys(bySelector)){let group=bySelector[sel],targetEl;try{targetEl=document.querySelector(sel)}catch{continue}if(!targetEl)continue;let rect=targetEl.getBoundingClientRect();if(rect.width===0&&rect.height===0||rect.bottom<0||rect.top>vpH||rect.right<0||rect.left>vpW)continue;let activeTasks=group.filter(t=>t.status!=="done"),allDone=activeTasks.length===0;if(allDone&&!state.sidebarShowDone)continue;let indicator=el("div",{className:"vibeflow-task-indicator"+(allDone?" all-done":"")});indicator.textContent=allDone?"\u2713":String(activeTasks.length),indicator.style.left=`${rect.right-10}px`,indicator.style.top=`${rect.top-10}px`;let grp=group,capturedAllDone=allDone;indicator.addEventListener("mouseenter",()=>{state.tooltipPinned||showIndicatorTooltip(indicator,grp)}),indicator.addEventListener("mouseleave",e=>{if(state.tooltipPinned)return;let rel=e.relatedTarget;state.activeTooltip&&rel&&(rel===state.activeTooltip||state.activeTooltip.contains(rel))||hideIndicatorTooltip()}),indicator.addEventListener("click",e=>{e.stopPropagation(),grp.length===1?(forceHideTooltip(),showEditModal(grp[0])):(forceHideTooltip(),showIndicatorTooltip(indicator,grp),state.tooltipPinned=!0)}),state.indicatorContainer.appendChild(indicator)}}function scheduleRenderIndicators(){state.indicatorRafId||(state.indicatorRafId=requestAnimationFrame(()=>{state.indicatorRafId=null,renderIndicators()}))}function hideIndicatorTooltip(){state.tooltipPinned||state.activeTooltip&&(state.activeTooltip.remove(),state.activeTooltip=null)}function forceHideTooltip(){state.tooltipPinned=!1,state.activeTooltip&&(state.activeTooltip.remove(),state.activeTooltip=null)}function showIndicatorTooltip(indicator,group){if(!state.root)return;hideIndicatorTooltip();let tooltip=el("div",{className:"vibeflow-task-tooltip"}),closeBtn=el("button",{className:"tooltip-close-btn"},"\u2715");closeBtn.addEventListener("click",e=>{e.stopPropagation(),forceHideTooltip()}),tooltip.appendChild(closeBtn);for(let task of group){let card=buildOverlayTaskCard(task,{currentPath:location.pathname,showSelector:!1,showDescription:!0,showActions:!1,onOpen:capturedTask=>{forceHideTooltip(),showEditModal(capturedTask)}});tooltip.appendChild(card)}let iRect=indicator.getBoundingClientRect();tooltip.style.left=`${Math.min(iRect.right+6,window.innerWidth-330)}px`,tooltip.style.top=`${Math.max(4,Math.min(iRect.top-8,window.innerHeight-420))}px`,tooltip.addEventListener("mouseleave",hideIndicatorTooltip),state.root.appendChild(tooltip),state.activeTooltip=tooltip}function setupIndicatorScrollRefresh(){window.addEventListener("scroll",scheduleRenderIndicators,!0),window.addEventListener("resize",scheduleRenderIndicators)}function setupInteractionDebounce(host){let interactionDebounce=null;function onUserInteraction(e){e.composedPath().indexOf(host)===-1&&(interactionDebounce&&clearTimeout(interactionDebounce),interactionDebounce=setTimeout(()=>{interactionDebounce=null,renderIndicators()},150))}document.addEventListener("click",onUserInteraction,!0),document.addEventListener("keyup",onUserInteraction,!0)}function setupClickOutsideTooltipClose(host){document.addEventListener("click",e=>{!state.tooltipPinned||!state.activeTooltip||(e.composedPath?e.composedPath():[e.target]).includes(host)||forceHideTooltip()},!0)}function detectReactQuality(root=document){let sampleElements=Array.from(root.querySelectorAll("*")).slice(0,50),hasReact=!1,hasDebugSource=!1,hasDebugOwner=!1;for(let elem of sampleElements){for(let key of Object.keys(elem)){if(!key.startsWith("__reactFiber$")&&!key.startsWith("__reactInternalInstance"))continue;hasReact=!0;let fiber=elem[key];if(fiber!=null&&fiber._debugSource){hasDebugSource=!0;break}if(fiber!=null&&fiber._debugStack){hasDebugSource=!0;break}fiber!=null&&fiber._debugOwner&&(hasDebugOwner=!0)}if(hasDebugSource)break}return hasReact?hasDebugSource?"full":hasDebugOwner?"partial":"none":"not-react"}var SHOWN_KEY="vibeflow-react-quality-shown";function hasShownQualityModal(){try{return!!localStorage.getItem(SHOWN_KEY)}catch{return!1}}function markQualityModalShown(){try{localStorage.setItem(SHOWN_KEY,"1")}catch{}}function showReactQualityModal(quality){if(!state.root)return;closeReactQualityModal(),markQualityModalShown();let levelCards=[{icon:"\u{1F7E2}",label:"Full context",color:"#4ade80",desc:"React dev mode + source maps. Component name + source file + line.",active:quality==="full"},{icon:"\u{1F7E1}",label:"Partial",color:"#fbbf24",desc:"React dev mode, but no debug stack found. Component name only.",active:quality==="partial"},{icon:"\u{1F534}",label:"No context",color:"#f87171",desc:"Production build. DOM selectors only \u2014 no component or source info.",active:quality==="none"}].map(lv=>{let card=el("div",{className:"rq-level"+(lv.active?" rq-level--active":"")});return card.appendChild(el("div",{className:"rq-level-icon"},lv.icon)),card.appendChild(Object.assign(el("div",{className:"rq-level-label"},lv.label),{style:`color:${lv.color}`})),card.appendChild(el("div",{className:"rq-level-desc"},lv.desc)),card}),levelRow=el("div",{className:"rq-levels"},...levelCards),heading=el("div",{className:"rq-heading"},{full:"You have full context",partial:"You have partial context",none:"No React context available","not-react":"React not detected"}[quality]??"React context"),features=buildFeatureRows(quality),header=el("div",{className:"rq-header"},heading,levelRow),body=el("div",{className:"rq-body"},...features),closeBtn=el("button",{className:"rq-close",title:"Close","aria-label":"Close"},"\u2715"),btnContinue=el("button",{className:"rq-btn rq-btn-secondary"},"Continue annotating"),footer=el("div",{className:"rq-footer"},btnContinue),modal=el("div",{className:"vibeflow-rq-modal",id:"vibeflow-rq-modal"},closeBtn,header,body,footer),overlay=el("div",{className:"vibeflow-rq-overlay",id:"vibeflow-rq-overlay"},modal);function close(){overlay.remove()}closeBtn.addEventListener("click",close),btnContinue.addEventListener("click",close),overlay.addEventListener("click",e=>{e.target===overlay&&close()}),state.root.appendChild(overlay)}function closeReactQualityModal(){var _a,_b;(_b=(_a=state.root)==null?void 0:_a.querySelector("#vibeflow-rq-overlay"))==null||_b.remove()}function featureRow(icon,text,detail){let row=el("div",{className:"rq-feature"});row.appendChild(el("span",{className:"rq-feature-icon"},icon));let textEl=el("div",{className:"rq-feature-text"});return textEl.appendChild(el("strong",null,text)),textEl.appendChild(el("span",null," \u2014 "+detail)),row.appendChild(textEl),row}function codeBlock(code){let pre=el("pre",{className:"rq-codeblock"});return pre.appendChild(el("code",null,code)),pre}function sectionTitle(title){return el("div",{className:"rq-section-title"},title)}function buildFeatureRows(quality){let rows=[];return rows.push(sectionTitle("What is captured now")),rows.push(featureRow("\u2705","CSS selector","always available \u2014 stable element targeting")),quality==="full"?(rows.push(featureRow("\u2705","Component name","from React fiber (_debugOwner)")),rows.push(featureRow("\u2705","Source file + line","resolved via source maps (React 18.3+ _debugStack or legacy _debugSource)")),rows.push(el("div",{className:"rq-note rq-note--success"},"You have the best possible context. Your agent receives component name, source file, and line number for each annotation.")),rows):(quality==="partial"&&(rows.push(featureRow("\u2705","Component name","from React fiber (_debugOwner)")),rows.push(featureRow("\u274C","Source file + line","no debug stack found on React fibers")),rows.push(sectionTitle("How to get source file + line")),rows.push(el("div",{className:"rq-note rq-note--amber"},"Source file resolution requires React dev mode with debug stacks (_debugStack / _debugSource) and source maps served by your bundler. Both are enabled by default when running in development mode.")),rows.push(codeBlock(`# Next.js
1609
1609
  next dev (or: npm run dev)
1610
1610
 
@@ -1615,7 +1615,7 @@ npm run dev (NODE_ENV=development)
1615
1615
  next dev (or: npm run dev)
1616
1616
 
1617
1617
  # Vite
1618
- npm run dev (NODE_ENV=development)`)),rows.push(el("div",{className:"rq-note"},"Dev mode enables React debug stacks (_debugStack) and source maps. No Babel plugins or extra config required \u2014 file + line are resolved automatically via source maps."))),rows)}async function showPopover(element,x,y){if(!state.root)return;state.popover&&(state.popover.remove(),state.popover=null);let pointer=await buildSourcePointerAsync(element),selector=pointer.selector,cssSelector=buildCssSelector(element),displayName=pointer.display,targetIcon=el("div",{className:"popover-target-icon"},"\u2B21"),targetName=el("div",{className:"popover-target-name"},displayName.slice(0,50)),reactQuality=detectReactQuality(),showBadge=reactQuality!=="not-react"&&reactQuality!=="full",qualityTooltip={none:"React production build \u2014 no component context available (click to learn more)",partial:"React partial context \u2014 component name only, no source file (click to learn more)",full:"Drag to move","not-react":"Drag to move"},dragHandleClass=showBadge?`popover-drag-handle popover-drag-handle--quality-${reactQuality}`:"popover-drag-handle",dragHandle=el("div",{className:dragHandleClass,title:qualityTooltip[reactQuality]??"Drag to move"});if(showBadge)dragHandle.appendChild(document.createTextNode("\u26A0"));else{let gripSvg=document.createElementNS("http://www.w3.org/2000/svg","svg");gripSvg.setAttribute("width","12"),gripSvg.setAttribute("height","16"),gripSvg.setAttribute("viewBox","0 0 12 16"),gripSvg.setAttribute("fill","currentColor"),gripSvg.setAttribute("aria-hidden","true");let gripDots=[[3,3],[9,3],[3,8],[9,8],[3,13],[9,13]];for(let[cx,cy]of gripDots){let circle=document.createElementNS("http://www.w3.org/2000/svg","circle");circle.setAttribute("cx",String(cx)),circle.setAttribute("cy",String(cy)),circle.setAttribute("r","1.5"),gripSvg.appendChild(circle)}dragHandle.appendChild(gripSvg)}let header=el("div",{className:"popover-header"},targetIcon,targetName,dragHandle),sourceRow=el("div",{className:"popover-source"});if(pointer.file){let label=pointer.file.replace(/\\/g,"/").split("/").slice(-2).join("/")+(pointer.line==null?"":`:${pointer.line}`),srcLink=el("a",{href:`vscode://file${pointer.file}${pointer.line==null?"":`:${pointer.line}`}`,target:"_blank",title:pointer.file},label);pointer.component?sourceRow.append(srcLink,el("span",{className:"popover-source-sep"}," \xB7 \u2B21 "+pointer.component)):sourceRow.appendChild(srcLink)}else pointer.component&&sourceRow.appendChild(el("span",null,"\u2B21 "+pointer.component));let titleInput=el("input",{type:"text",placeholder:"Task title..."}),textarea=el("textarea",{placeholder:"Describe your feedback..."}),typePicker=buildTypePickerEl("Task"),titleRow=el("div",{className:"popover-title-row"},typePicker.el,titleInput),body=el("div",{className:"popover-body"},titleRow,textarea),btnSave=el("button",{className:"btn-primary"},"Save"),btnCancel=el("button",null,"Cancel"),spacer=el("div",{className:"popover-actions-spacer"}),actions=el("div",{className:"popover-actions"},btnSave,btnCancel,spacer),popover=el("div",{className:"vibeflow-popover"},header,sourceRow,body,actions);state.popover=popover,showBadge&&!hasShownQualityModal()&&(markQualityModalShown(),window.setTimeout(()=>showReactQualityModal(reactQuality),200)),showBadge&&dragHandle.addEventListener("click",e=>{e.stopPropagation(),showReactQualityModal(reactQuality)}),popover.addEventListener("click",e=>{var _a;e.target.closest(".type-picker")||(_a=popover.querySelector(".type-picker-dropdown"))==null||_a.classList.remove("open")});let posX=x===void 0?element.getBoundingClientRect().left:x,posY=y===void 0?element.getBoundingClientRect().bottom+8:y;popover.style.left=`${Math.min(posX,window.innerWidth-620)}px`,popover.style.top=`${Math.min(posY,window.innerHeight-350)}px`;let dragState=null;dragHandle.addEventListener("pointerdown",e=>{e.preventDefault(),dragHandle.setPointerCapture(e.pointerId),dragState={startX:e.clientX,startY:e.clientY,origLeft:parseInt(popover.style.left,10)||0,origTop:parseInt(popover.style.top,10)||0},popover.classList.add("popover-dragging")}),dragHandle.addEventListener("pointermove",e=>{if(!dragState)return;let dx=e.clientX-dragState.startX,dy=e.clientY-dragState.startY,maxX=window.innerWidth-(popover.offsetWidth||480),maxY=window.innerHeight-(popover.offsetHeight||250);popover.style.left=`${Math.max(0,Math.min(maxX,dragState.origLeft+dx))}px`,popover.style.top=`${Math.max(0,Math.min(maxY,dragState.origTop+dy))}px`}),dragHandle.addEventListener("pointerup",()=>{dragState=null,popover.classList.remove("popover-dragging")}),dragHandle.addEventListener("pointercancel",()=>{dragState=null,popover.classList.remove("popover-dragging")}),state.root.appendChild(popover),titleInput.focus(),btnSave.addEventListener("click",()=>{var _a,_b;let text=textarea.value.trim(),rawTitle=titleInput.value.trim();if(!rawTitle){titleInput.classList.remove("input-error"),titleInput.offsetWidth,titleInput.classList.add("input-error"),titleInput.focus();let clear=()=>{titleInput.classList.remove("input-error"),titleInput.removeEventListener("input",clear)};titleInput.addEventListener("input",clear);return}let title=rawTitle;if(!text&&!title)return;let rawInnerText=((_a=element.innerText)==null?void 0:_a.trim())??"",capturedHtmlText=rawInnerText?rawInnerText.slice(0,300):void 0,selectedType=typePicker.getValue(),desc=text||title;if(selectedType==="Bug"){let logs=getRecordedLogs();logs&&(desc+=logs)}submitTask(selector,cssSelector,title,desc,void 0,{file:pointer.file,line:pointer.line,col:pointer.col,component:pointer.component},selectedType||void 0,capturedHtmlText).then(result=>{if(result.taskId)try{let snapshot=captureDomSnapshot(element,cssSelector);sendBaselineToServer(result.taskId,snapshot);try{let pageSnapshot=capturePageSnapshot();sendPageBaselineToServer(result.taskId,pageSnapshot)}catch(err){console.error("[Vibeflow] Failed to capture page baseline:",err)}}catch(err){console.error("[Vibeflow] Failed to capture baseline:",err)}}),(_b=state.popover)==null||_b.remove(),state.popover=null,clearAnnotateHighlight(),flashOverlayTrigger()}),btnCancel.addEventListener("click",()=>{var _a;(_a=state.popover)==null||_a.remove(),state.popover=null,clearAnnotateHighlight()})}function toggleSidebar(){fetchTasks()}function hasPrototypingApi2(){return typeof window<"u"&&"__vf_prototyping"in window}function openPrototypingPanel2(){let api=window.__vf_prototyping;api==null||api.openPanel()}function showContextMenu(element,x,y){if(hideContextMenu(),state.disabled)return;let displayName=buildSourcePointer(element).display;if(setAnnotateHighlight(element),!state.root)return;let menu=el("div",{className:"vibeflow-context-menu"});menu.style.left=`${Math.min(x,window.innerWidth-220)}px`,menu.style.top=`${Math.min(y,window.innerHeight-200)}px`;let annotateBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F4DD}"),`Annotate "${displayName.slice(0,30)}"`);annotateBtn.addEventListener("click",()=>{hideContextMenu(!0),showPopover(element,x,y)}),menu.appendChild(annotateBtn);let inspectBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F50D}"),"Inspect selector");if(inspectBtn.addEventListener("click",()=>{hideContextMenu(),buildSourcePointerAsync(element).then(ptr=>showInspectModal(element,ptr))}),menu.appendChild(inspectBtn),hasPrototypingApi2()){let prototypingBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F3A8}"),"Prototyping");prototypingBtn.addEventListener("click",()=>{hideContextMenu(),openPrototypingPanel2()}),menu.appendChild(prototypingBtn)}if((()=>{try{return localStorage.getItem(TRIGGER_HIDDEN_KEY)==="1"}catch{return!1}})()){let showBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F441}"),"Show Vibeflow");showBtn.addEventListener("click",()=>{hideContextMenu(),showOverlayTrigger()}),menu.appendChild(showBtn)}else{let hideBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F441}"),"Hide Vibeflow");hideBtn.addEventListener("click",()=>{hideContextMenu(),hideOverlayTrigger()}),menu.appendChild(hideBtn)}let disableBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F6AB}"),"Disable Vibeflow");disableBtn.addEventListener("click",()=>{hideContextMenu(),disableVibeflowOverlay()}),menu.appendChild(disableBtn),state.contextMenu=menu,state.root.appendChild(menu),setTimeout(()=>{document.addEventListener("click",()=>hideContextMenu(),{once:!0})},0)}function hideContextMenu(keepHighlight){state.contextMenu&&(state.contextMenu.remove(),state.contextMenu=null),keepHighlight||clearAnnotateHighlight()}function setupKeyboardShortcuts(host){document.addEventListener("keydown",e=>{e.altKey&&e.key==="a"&&(e.preventDefault(),toggleAnnotationMode(host)),e.altKey&&e.key==="s"&&(e.preventDefault(),toggleSidebar()),e.key==="Escape"&&(state.contextMenu?hideContextMenu():state.popover?(state.popover.remove(),state.popover=null,clearAnnotateHighlight()):state.annotationMode?toggleAnnotationMode(host):state.sidebarPinned&&void 0)},!0)}function toggleAnnotationMode(host){state.annotationMode=!state.annotationMode,document.body.classList.toggle("vibeflow-overlay-active",state.annotationMode),state.annotationMode,state.annotationMode?startAnnotationHover(host):(stopAnnotationHover(host),state.popover&&(state.popover.remove(),state.popover=null))}function setupContextMenuListener(host){document.addEventListener("contextmenu",e=>{let target=e.target;!target||!(target instanceof Element)||target===document.body||target===document.documentElement||e.composedPath().indexOf(host)===-1&&(e.preventDefault(),showContextMenu(target,e.clientX,e.clientY))},!0)}function setupClickToAnnotate(host){document.addEventListener("click",e=>{if(!state.annotationMode||e.composedPath().indexOf(host)!==-1)return;let target=e.target;!target||!(target instanceof Element)||target===document.body||target===document.documentElement||(e.preventDefault(),e.stopPropagation(),showPopover(target,e.clientX,e.clientY))},!0)}function setupSpaNavigation(onRouteChange){let _protoOrigPush=history.pushState.bind(history);history.pushState=(...args)=>{_protoOrigPush(...args),onRouteChange()};let _protoOrigReplace=history.replaceState.bind(history);history.replaceState=(...args)=>{_protoOrigReplace(...args),onRouteChange()},window.addEventListener("popstate",onRouteChange),window.addEventListener("hashchange",onRouteChange)}var import_react24=__toESM(require_react(),1),import_client=__toESM(require_client(),1);function main(){startRecording();let selfScript=document.querySelector("script[data-board-id]")??document.querySelector('script[src*="vibeflow-overlay"]');selfScript&&!selfScript.hasAttribute("data-vibeflow-overlay")&&selfScript.setAttribute("data-vibeflow-overlay",""),selfScript!=null&&selfScript.dataset.boardId&&!PROTO_CONFIG.boardId&&(PROTO_CONFIG.boardId=selfScript.dataset.boardId);let globalBoardId=window.__PROTO_BOARD_ID;if(globalBoardId&&!PROTO_CONFIG.boardId&&(PROTO_CONFIG.boardId=globalBoardId),selfScript!=null&&selfScript.dataset.overlayApiKey&&!PROTO_CONFIG.overlayApiKey&&(PROTO_CONFIG.overlayApiKey=selfScript.dataset.overlayApiKey),document.getElementById("vibeflow-studio-root"))return;try{localStorage.removeItem(TRIGGER_HIDDEN_KEY)}catch{}let{host,root}=setupShadowDom();state.host=host,state.root=root,loadPrefs();let indicatorContainer=el("div",{className:"vibeflow-indicators"});state.indicatorContainer=indicatorContainer,root.appendChild(indicatorContainer);let reactContainer=document.createElement("div");reactContainer.className="vibeflow-react-root",root.appendChild(reactContainer),(0,import_client.createRoot)(reactContainer).render(import_react24.default.createElement(OverlayApp,{onOpenKanban:()=>{if(PROTO_CONFIG.boardId)try{let origin=new URL(PROTO_CONFIG.apiUrl).origin;window.open(`${origin}/kanban?board=${encodeURIComponent(PROTO_CONFIG.boardId)}`,"_blank","noopener")}catch{}else if(PROTO_CONFIG.wsUrl){let kanbanUrl=PROTO_CONFIG.apiUrl.replace("/api/tasks","/kanban");window.open(kanbanUrl,"_blank","noopener")}},onSubmitTask:(selector,cssSelector,title,description,status,type,meta)=>submitTask(selector,cssSelector,title,description,status,meta,type)})),state.onTasksFetched=()=>{renderIndicators()},state.onTasksUpdatedMessage=fetchTasks,connectWS(),setupWsVisibilityReconnect(),fetchTasks(),fetchPages(),setupKeyboardShortcuts(host),setupContextMenuListener(host),setupClickToAnnotate(host),setupIndicatorScrollRefresh(),setupInteractionDebounce(host),setupClickOutsideTooltipClose(host),setupSpaNavigation(()=>{location.href!==state.currentHref&&(state.currentHref=location.href,renderIndicators())})}main();})();
1618
+ npm run dev (NODE_ENV=development)`)),rows.push(el("div",{className:"rq-note"},"Dev mode enables React debug stacks (_debugStack) and source maps. No Babel plugins or extra config required \u2014 file + line are resolved automatically via source maps."))),rows)}async function showPopover(element,x,y){if(!state.root)return;state.popover&&(state.popover.remove(),state.popover=null);let pointer=await buildSourcePointerAsync(element),selector=pointer.selector,cssSelector=buildCssSelector(element),displayName=pointer.display,targetIcon=el("div",{className:"popover-target-icon"},"\u2B21"),targetName=el("div",{className:"popover-target-name"},displayName.slice(0,50)),reactQuality=detectReactQuality(),showBadge=reactQuality!=="not-react"&&reactQuality!=="full",qualityTooltip={none:"React production build \u2014 no component context available (click to learn more)",partial:"React partial context \u2014 component name only, no source file (click to learn more)",full:"Drag to move","not-react":"Drag to move"},dragHandleClass=showBadge?`popover-drag-handle popover-drag-handle--quality-${reactQuality}`:"popover-drag-handle",dragHandle=el("div",{className:dragHandleClass,title:qualityTooltip[reactQuality]??"Drag to move"});if(showBadge)dragHandle.appendChild(document.createTextNode("\u26A0"));else{let gripSvg=document.createElementNS("http://www.w3.org/2000/svg","svg");gripSvg.setAttribute("width","12"),gripSvg.setAttribute("height","16"),gripSvg.setAttribute("viewBox","0 0 12 16"),gripSvg.setAttribute("fill","currentColor"),gripSvg.setAttribute("aria-hidden","true");let gripDots=[[3,3],[9,3],[3,8],[9,8],[3,13],[9,13]];for(let[cx,cy]of gripDots){let circle=document.createElementNS("http://www.w3.org/2000/svg","circle");circle.setAttribute("cx",String(cx)),circle.setAttribute("cy",String(cy)),circle.setAttribute("r","1.5"),gripSvg.appendChild(circle)}dragHandle.appendChild(gripSvg)}let header=el("div",{className:"popover-header"},targetIcon,targetName,dragHandle),sourceRow=el("div",{className:"popover-source"});if(pointer.file){let label=pointer.file.replace(/\\/g,"/").split("/").slice(-2).join("/")+(pointer.line==null?"":`:${pointer.line}`),srcLink=el("a",{href:`vscode://file${pointer.file}${pointer.line==null?"":`:${pointer.line}`}`,target:"_blank",title:pointer.file},label);pointer.component?sourceRow.append(srcLink,el("span",{className:"popover-source-sep"}," \xB7 \u2B21 "+pointer.component)):sourceRow.appendChild(srcLink)}else pointer.component&&sourceRow.appendChild(el("span",null,"\u2B21 "+pointer.component));let titleInput=el("input",{type:"text",placeholder:"Task title..."}),textarea=el("textarea",{placeholder:"Describe your feedback..."}),typePicker=buildTypePickerEl("Task"),titleRow=el("div",{className:"popover-title-row"},typePicker.el,titleInput),body=el("div",{className:"popover-body"},titleRow,textarea),btnSave=el("button",{className:"btn-primary"},"Save"),btnCancel=el("button",null,"Cancel"),spacer=el("div",{className:"popover-actions-spacer"}),actions=el("div",{className:"popover-actions"},btnSave,btnCancel,spacer),popover=el("div",{className:"vibeflow-popover"},header,sourceRow,body,actions);state.popover=popover,showBadge&&!hasShownQualityModal()&&(markQualityModalShown(),window.setTimeout(()=>showReactQualityModal(reactQuality),200)),showBadge&&dragHandle.addEventListener("click",e=>{e.stopPropagation(),showReactQualityModal(reactQuality)}),popover.addEventListener("click",e=>{var _a;e.target.closest(".type-picker")||(_a=popover.querySelector(".type-picker-dropdown"))==null||_a.classList.remove("open")});let posX=x===void 0?element.getBoundingClientRect().left:x,posY=y===void 0?element.getBoundingClientRect().bottom+8:y;popover.style.left=`${Math.min(posX,window.innerWidth-620)}px`,popover.style.top=`${Math.min(posY,window.innerHeight-350)}px`;let dragState=null;dragHandle.addEventListener("pointerdown",e=>{e.preventDefault(),dragHandle.setPointerCapture(e.pointerId),dragState={startX:e.clientX,startY:e.clientY,origLeft:parseInt(popover.style.left,10)||0,origTop:parseInt(popover.style.top,10)||0},popover.classList.add("popover-dragging")}),dragHandle.addEventListener("pointermove",e=>{if(!dragState)return;let dx=e.clientX-dragState.startX,dy=e.clientY-dragState.startY,maxX=window.innerWidth-(popover.offsetWidth||480),maxY=window.innerHeight-(popover.offsetHeight||250);popover.style.left=`${Math.max(0,Math.min(maxX,dragState.origLeft+dx))}px`,popover.style.top=`${Math.max(0,Math.min(maxY,dragState.origTop+dy))}px`}),dragHandle.addEventListener("pointerup",()=>{dragState=null,popover.classList.remove("popover-dragging")}),dragHandle.addEventListener("pointercancel",()=>{dragState=null,popover.classList.remove("popover-dragging")}),state.root.appendChild(popover),titleInput.focus(),btnSave.addEventListener("click",()=>{var _a,_b;let text=textarea.value.trim(),rawTitle=titleInput.value.trim();if(!rawTitle){titleInput.classList.remove("input-error"),titleInput.offsetWidth,titleInput.classList.add("input-error"),titleInput.focus();let clear=()=>{titleInput.classList.remove("input-error"),titleInput.removeEventListener("input",clear)};titleInput.addEventListener("input",clear);return}let title=rawTitle;if(!text&&!title)return;let rawInnerText=((_a=element.innerText)==null?void 0:_a.trim())??"",capturedHtmlText=rawInnerText?rawInnerText.slice(0,300):void 0,selectedType=typePicker.getValue(),desc=text||title;if(selectedType==="Bug"){let logs=getRecordedLogs();logs&&(desc+=logs)}submitTask(selector,cssSelector,title,desc,void 0,{file:pointer.file,line:pointer.line,col:pointer.col,component:pointer.component},selectedType||void 0,capturedHtmlText).then(result=>{if(result.taskId)try{let snapshot=captureDomSnapshot(element,cssSelector);sendBaselineToServer(result.taskId,snapshot);try{let pageSnapshot=capturePageSnapshot();sendPageBaselineToServer(result.taskId,pageSnapshot)}catch(err){console.error("[Vibeflow] Failed to capture page baseline:",err)}}catch(err){console.error("[Vibeflow] Failed to capture baseline:",err)}}),(_b=state.popover)==null||_b.remove(),state.popover=null,clearAnnotateHighlight(),flashOverlayTrigger()}),btnCancel.addEventListener("click",()=>{var _a;(_a=state.popover)==null||_a.remove(),state.popover=null,clearAnnotateHighlight()})}function toggleSidebar(){fetchTasks()}function hasPrototypingApi2(){return typeof window<"u"&&"__vf_prototyping"in window}function openPrototypingPanel2(){let api=window.__vf_prototyping;api==null||api.openPanel()}function showContextMenu(element,x,y){if(hideContextMenu(),state.disabled)return;let displayName=buildSourcePointer(element).display;if(setAnnotateHighlight(element),!state.root)return;let menu=el("div",{className:"vibeflow-context-menu"});menu.style.left=`${Math.min(x,window.innerWidth-220)}px`,menu.style.top=`${Math.min(y,window.innerHeight-200)}px`;let annotateBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F4DD}"),`Annotate "${displayName.slice(0,30)}"`);annotateBtn.addEventListener("click",()=>{hideContextMenu(!0),showPopover(element,x,y)}),menu.appendChild(annotateBtn);let inspectBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F50D}"),"Inspect selector");if(inspectBtn.addEventListener("click",()=>{hideContextMenu(),buildSourcePointerAsync(element).then(ptr=>showInspectModal(element,ptr))}),menu.appendChild(inspectBtn),hasPrototypingApi2()){let prototypingBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F3A8}"),"Prototyping");prototypingBtn.addEventListener("click",()=>{hideContextMenu(),openPrototypingPanel2()}),menu.appendChild(prototypingBtn)}if((()=>{try{return localStorage.getItem(TRIGGER_HIDDEN_KEY)==="1"}catch{return!1}})()){let showBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F441}"),"Show Vibeflow");showBtn.addEventListener("click",()=>{hideContextMenu(),showOverlayTrigger()}),menu.appendChild(showBtn)}else{let hideBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F441}"),"Hide Vibeflow");hideBtn.addEventListener("click",()=>{hideContextMenu(),hideOverlayTrigger()}),menu.appendChild(hideBtn)}let disableBtn=el("button",null,el("span",{className:"menu-icon"},"\u{1F6AB}"),"Disable Vibeflow");disableBtn.addEventListener("click",()=>{hideContextMenu(),disableVibeflowOverlay()}),menu.appendChild(disableBtn),state.contextMenu=menu,state.root.appendChild(menu),setTimeout(()=>{document.addEventListener("click",()=>hideContextMenu(),{once:!0})},0)}function hideContextMenu(keepHighlight){state.contextMenu&&(state.contextMenu.remove(),state.contextMenu=null),keepHighlight||clearAnnotateHighlight()}function setupKeyboardShortcuts(host){document.addEventListener("keydown",e=>{e.altKey&&e.key==="a"&&(e.preventDefault(),toggleAnnotationMode(host)),e.altKey&&e.key==="s"&&(e.preventDefault(),toggleSidebar()),e.key==="Escape"&&(state.contextMenu?hideContextMenu():state.popover?(state.popover.remove(),state.popover=null,clearAnnotateHighlight()):state.annotationMode?toggleAnnotationMode(host):state.sidebarPinned&&void 0)},!0)}function toggleAnnotationMode(host){state.annotationMode=!state.annotationMode,document.body.classList.toggle("vibeflow-overlay-active",state.annotationMode),state.annotationMode,state.annotationMode?startAnnotationHover(host):(stopAnnotationHover(host),state.popover&&(state.popover.remove(),state.popover=null))}function setupContextMenuListener(host){document.addEventListener("contextmenu",e=>{let target=e.target;!target||!(target instanceof Element)||target===document.body||target===document.documentElement||e.composedPath().indexOf(host)===-1&&(e.preventDefault(),showContextMenu(target,e.clientX,e.clientY))},!0)}function setupClickToAnnotate(host){document.addEventListener("click",e=>{if(!state.annotationMode||e.composedPath().indexOf(host)!==-1)return;let target=e.target;!target||!(target instanceof Element)||target===document.body||target===document.documentElement||(e.preventDefault(),e.stopPropagation(),showPopover(target,e.clientX,e.clientY))},!0)}function setupSpaNavigation(onRouteChange){let _protoOrigPush=history.pushState.bind(history);history.pushState=(...args)=>{_protoOrigPush(...args),onRouteChange()};let _protoOrigReplace=history.replaceState.bind(history);history.replaceState=(...args)=>{_protoOrigReplace(...args),onRouteChange()},window.addEventListener("popstate",onRouteChange),window.addEventListener("hashchange",onRouteChange)}var import_react24=__toESM(require_react(),1),import_client=__toESM(require_client(),1);function main(){startRecording();let selfScript=document.querySelector("script[data-board-id]")??document.querySelector('script[src*="vibeflow-overlay"]');selfScript&&!selfScript.hasAttribute("data-vibeflow-overlay")&&selfScript.setAttribute("data-vibeflow-overlay",""),selfScript!=null&&selfScript.dataset.boardId&&!PROTO_CONFIG.boardId&&(PROTO_CONFIG.boardId=selfScript.dataset.boardId);let globalBoardId=window.__PROTO_BOARD_ID;if(globalBoardId&&!PROTO_CONFIG.boardId&&(PROTO_CONFIG.boardId=globalBoardId),selfScript!=null&&selfScript.dataset.overlayApiKey&&!PROTO_CONFIG.overlayApiKey&&(PROTO_CONFIG.overlayApiKey=selfScript.dataset.overlayApiKey),document.getElementById("vibeflow-studio-root"))return;try{localStorage.removeItem(TRIGGER_HIDDEN_KEY)}catch{}let{host,root}=setupShadowDom();state.host=host,state.root=root,loadPrefs();let indicatorContainer=el("div",{className:"vibeflow-indicators"});state.indicatorContainer=indicatorContainer,root.appendChild(indicatorContainer);let reactContainer=document.createElement("div");reactContainer.className="vibeflow-react-root",root.appendChild(reactContainer),(0,import_client.createRoot)(reactContainer).render(import_react24.default.createElement(OverlayApp,{onOpenKanban:()=>{if(PROTO_CONFIG.boardId)try{let origin=new URL(PROTO_CONFIG.apiUrl).origin;window.open(`${origin}/kanban?board=${encodeURIComponent(PROTO_CONFIG.boardId)}`,"_blank","noopener")}catch{}else if(PROTO_CONFIG.wsUrl){let kanbanUrl=PROTO_CONFIG.apiUrl.replace("/api/tasks","/kanban");window.open(kanbanUrl,"_blank","noopener")}},onSubmitTask:(selector,cssSelector,title,description,status,type,meta,advanced)=>submitTask(selector,cssSelector,title,description,status,meta,type,void 0,advanced)})),state.onTasksFetched=()=>{renderIndicators()},state.onTasksUpdatedMessage=fetchTasks,connectWS(),setupWsVisibilityReconnect(),fetchTasks(),fetchPages(),setupKeyboardShortcuts(host),setupContextMenuListener(host),setupClickToAnnotate(host),setupIndicatorScrollRefresh(),setupInteractionDebounce(host),setupClickOutsideTooltipClose(host),setupSpaNavigation(()=>{location.href!==state.currentHref&&(state.currentHref=location.href,renderIndicators())})}main();})();
1619
1619
  /*! Bundled license information:
1620
1620
 
1621
1621
  react/cjs/react.production.min.js:
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a,b,c,d,e,f,g,h,i}from"./chunk-PWP474PZ.js";import"./chunk-2CI62NHU.js";import"./chunk-X4RGF6JJ.js";export{f as deleteFile,b as ensureFilesDir,h as getFileCount,g as getFilePath,a as getFilesDir,d as listFiles,i as migrateAllLegacyLinkedRefs,c as readTaskFileRefs,e as saveFile};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{s as a,t as b,u as c,v as d,w as e,x as f,y as g}from"./chunk-BOPGIKZN.js";export{e as deleteFile,b as ensureFilesDir,g as getFileCount,f as getFilePath,a as getFilesDir,c as listFiles,d as saveFile};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a,b,c,d,e,f,g}from"./chunk-ILUMCOF2.js";import"./chunk-EZX6HYC3.js";export{e as deleteFile,b as ensureFilesDir,g as getFileCount,f as getFilePath,a as getFilesDir,c as listFiles,d as saveFile};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o}from"./chunk-IJ67OEKX.js";import"./chunk-PN5C7EHL.js";export{c as ALLOWED_FILE_EXTENSIONS,a as MAX_FILENAME_LENGTH,b as MAX_FILE_SIZE,l as deleteFile,h as ensureFilesDir,n as getFileCount,m as getFilePath,g as getFilesDir,e as isAllowedFileExtension,d as isValidFilename,j as listFiles,o as migrateAllLegacyLinkedRefs,i as readTaskFileRefs,k as saveFile,f as validateFilename};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a,b,c,d,e,f,g,h,i}from"./chunk-R5NQALFI.js";import"./chunk-JAWQQLJC.js";import"./chunk-X4RGF6JJ.js";export{f as deleteFile,b as ensureFilesDir,h as getFileCount,g as getFilePath,a as getFilesDir,d as listFiles,i as migrateAllLegacyLinkedRefs,c as readTaskFileRefs,e as saveFile};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a,b,c,d,e,f,g,h,i}from"./chunk-BUQI2W5H.js";import"./chunk-O4LGEPMQ.js";import"./chunk-X4RGF6JJ.js";export{f as deleteFile,b as ensureFilesDir,h as getFileCount,g as getFilePath,a as getFilesDir,d as listFiles,i as migrateAllLegacyLinkedRefs,c as readTaskFileRefs,e as saveFile};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a,b,c,d,e,f,g,h,i}from"./chunk-32Z32W7T.js";import"./chunk-ZHA4Y2KB.js";import"./chunk-X4RGF6JJ.js";export{f as deleteFile,b as ensureFilesDir,h as getFileCount,g as getFilePath,a as getFilesDir,d as listFiles,i as migrateAllLegacyLinkedRefs,c as readTaskFileRefs,e as saveFile};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o}from"./chunk-BBIA4IIO.js";import"./chunk-Q7MEW67Z.js";import"./chunk-XHZXHACL.js";export{c as ALLOWED_FILE_EXTENSIONS,a as MAX_FILENAME_LENGTH,b as MAX_FILE_SIZE,l as deleteFile,h as ensureFilesDir,n as getFileCount,m as getFilePath,g as getFilesDir,e as isAllowedFileExtension,d as isValidFilename,j as listFiles,o as migrateAllLegacyLinkedRefs,i as readTaskFileRefs,k as saveFile,f as validateFilename};