circuschief 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/package.json +1 -1
  2. package/packages/server/src/api/git.js +15 -0
  3. package/packages/server/src/api/projects-commandButtons.js +96 -0
  4. package/packages/server/src/api/projects-session-helpers.js +51 -33
  5. package/packages/server/src/api/projects.js +102 -111
  6. package/packages/server/src/api/sessions-archive.js +2 -1
  7. package/packages/server/src/api/sessions-lifecycle.js +2 -1
  8. package/packages/server/src/api/sessions-patch.js +2 -0
  9. package/packages/server/src/config.js +6 -0
  10. package/packages/server/src/db/DatabaseManager.js +1 -1
  11. package/packages/server/src/db/ProjectRepository.js +17 -3
  12. package/packages/server/src/db/migrations/index.js +7 -0
  13. package/packages/server/src/db/migrations/miscMigrations.js +78 -1
  14. package/packages/server/src/db/migrations/projectsMigrations.js +4 -0
  15. package/packages/server/src/index.js +7 -1
  16. package/packages/server/src/services/gitService.js +42 -6
  17. package/packages/server/src/services/gitSessionSetup.js +4 -3
  18. package/packages/server/src/services/kanbanTriggers.js +1 -0
  19. package/packages/server/src/services/sessionExecution.js +2 -2
  20. package/packages/server/src/services/templateTriggerService.js +1 -0
  21. package/packages/shared/src/contracts/projects.js +3 -0
  22. package/packages/shared/src/types.js +4 -3
  23. package/packages/web/dist/assets/ActiveSessionsView-BVco8bPU.css +1 -0
  24. package/packages/web/dist/assets/ActiveSessionsView-HgcjR-fv.js +1 -0
  25. package/packages/web/dist/assets/{AgentLogsView-D4l0N9ZA.js → AgentLogsView-gnpmy7Ck.js} +1 -1
  26. package/packages/web/dist/assets/{ApiClient-Dbs1H78V.js → ApiClient-CcqJ-GAv.js} +1 -1
  27. package/packages/web/dist/assets/{ArchiveConfirmModal-CQZeuYBz.css → ArchiveConfirmModal-BQ-4gI0R.css} +1 -1
  28. package/packages/web/dist/assets/ArchiveConfirmModal-NDLcfHE9.js +1 -0
  29. package/packages/web/dist/assets/CommandButtonDetailView-UGoO1Rhg.js +1 -0
  30. package/packages/web/dist/assets/EffortLevelSelector-B9STpy07.js +1 -0
  31. package/packages/web/dist/assets/{GeneralSettingsView-BqCzCX-z.js → GeneralSettingsView-Bvp1zmeb.js} +1 -1
  32. package/packages/web/dist/assets/InputWithButton-cYdrEmTs.css +1 -0
  33. package/packages/web/dist/assets/{PathChooser-CXFxb8Oj.js → InputWithButton-kjjnlpHt.js} +1 -1
  34. package/packages/web/dist/assets/InterpolationHelp-Cwyt_Kff.js +1 -0
  35. package/packages/web/dist/assets/MarkdownEditor-CfuhardG.js +2 -0
  36. package/packages/web/dist/assets/{ModelSelector-DSxaZWBL.js → ModelSelector-vRSpXjhL.js} +1 -1
  37. package/packages/web/dist/assets/{NewSessionView-BsI7JtO9.js → NewSessionView-CJqnlwjP.js} +2 -2
  38. package/packages/web/dist/assets/{NewSessionView-Byoi1XdQ.css → NewSessionView-D_Hi7M9g.css} +1 -1
  39. package/packages/web/dist/assets/ProjectEditView-I36pvIJH.css +1 -0
  40. package/packages/web/dist/assets/ProjectEditView-LZhWNyZD.js +1 -0
  41. package/packages/web/dist/assets/ProjectListView-CumumZN-.css +1 -0
  42. package/packages/web/dist/assets/ProjectListView-DxpzlBb6.js +1 -0
  43. package/packages/web/dist/assets/ProjectNewView-CaLXfFzd.css +1 -0
  44. package/packages/web/dist/assets/ProjectNewView-X1y2iuaX.js +1 -0
  45. package/packages/web/dist/assets/{ProvidersView-CgAr0qms.js → ProvidersView-DC-v48Oj.js} +1 -1
  46. package/packages/web/dist/assets/{ProvidersView-B_QQF3RM.css → ProvidersView-uD8SKWpA.css} +1 -1
  47. package/packages/web/dist/assets/{QuickResponseSettings-uDDpwaza.js → QuickResponseSettings-DOZUtaRb.js} +1 -1
  48. package/packages/web/dist/assets/{QuickResponsesPanel-D0qs0Fm_.js → QuickResponsesPanel-BboDyvfE.js} +1 -1
  49. package/packages/web/dist/assets/{ResizableTextarea-_kHi1Mg3.js → ResizableTextarea-BIUrLAki.js} +1 -1
  50. package/packages/web/dist/assets/{SessionCard-Be1-bK0C.js → SessionCard-D9a5ABHO.js} +1 -1
  51. package/packages/web/dist/assets/{SessionDetailView-mnGRMaLY.css → SessionDetailView-D_p4QqDv.css} +1 -1
  52. package/packages/web/dist/assets/SessionDetailView-DpnAZfLe.js +36 -0
  53. package/packages/web/dist/assets/{SessionFormOptions-DvhOyP6z.js → SessionFormOptions-16tOEDkt.js} +1 -1
  54. package/packages/web/dist/assets/{SessionListView-CuHsWj85.js → SessionListView-BxayFy5a.js} +1 -1
  55. package/packages/web/dist/assets/{SessionLogStream-Da_GniUZ.js → SessionLogStream-DMUzZOml.js} +6 -6
  56. package/packages/web/dist/assets/SettingsView-IKYDEAFw.js +1 -0
  57. package/packages/web/dist/assets/{SlashCommandWizard-B_8ifpxN.js → SlashCommandWizard-CCEtEF98.js} +1 -1
  58. package/packages/web/dist/assets/{SummarySettingsView-KvgSGHdd.js → SummarySettingsView-Cq_0Bsk4.js} +1 -1
  59. package/packages/web/dist/assets/{TemplateDetailView-BhOjYIvS.js → TemplateDetailView-Vj413FOj.js} +1 -1
  60. package/packages/web/dist/assets/{commandButtons-B4OYZP0J.js → commandButtons-BqI7V84_.js} +1 -1
  61. package/packages/web/dist/assets/index-B0PaFn8J.js +1 -0
  62. package/packages/web/dist/assets/index-B0uKzlP3.js +1 -0
  63. package/packages/web/dist/assets/index-BOj2hM4W.js +1 -0
  64. package/packages/web/dist/assets/index-BVH1Fur5.js +1 -0
  65. package/packages/web/dist/assets/index-Bm4uwnFi.js +1 -0
  66. package/packages/web/dist/assets/index-C82-hypB.js +7 -0
  67. package/packages/web/dist/assets/index-C98wGWOV.js +1 -0
  68. package/packages/web/dist/assets/index-CQt0yAHQ.js +1 -0
  69. package/packages/web/dist/assets/index-CTe3Gmxt.js +1 -0
  70. package/packages/web/dist/assets/{index-BqVgX_Jy.js → index-Crwsqc5t.js} +3 -3
  71. package/packages/web/dist/assets/{index-BHVnr8MO.js → index-CzgbuOA8.js} +2 -2
  72. package/packages/web/dist/assets/index-D8oIVxkt.js +1 -0
  73. package/packages/web/dist/assets/index-DIrFNnos.js +1 -0
  74. package/packages/web/dist/assets/index-DVkCrevC.js +3 -0
  75. package/packages/web/dist/assets/index-DXvlnigm.js +1 -0
  76. package/packages/web/dist/assets/{index-CSOPrlmq.js → index-MnvuyUxj.js} +3 -3
  77. package/packages/web/dist/assets/index-mMvVdgsE.js +1 -0
  78. package/packages/web/dist/assets/index-okhXrCbj.js +1 -0
  79. package/packages/web/dist/assets/index-yghSjW4j.js +1 -0
  80. package/packages/web/dist/assets/{projects-B2du-GX8.js → projects-BpAyb9ba.js} +1 -1
  81. package/packages/web/dist/assets/{providers-B__J6FX0.js → providers-Di1AKmPp.js} +1 -1
  82. package/packages/web/dist/assets/{sessions-VDrd87yA.js → sessions-GqIMf9RF.js} +1 -1
  83. package/packages/web/dist/assets/{settings-CZ7Pc-Pt.js → settings-j6pMR_H2.js} +1 -1
  84. package/packages/web/dist/assets/useSummaryHelpers-GVg7sMWF.js +1 -0
  85. package/packages/web/dist/index.html +1 -1
  86. package/packages/web/dist/assets/ActiveSessionsView-3697sD8N.js +0 -1
  87. package/packages/web/dist/assets/ActiveSessionsView-DfYXc6dz.css +0 -1
  88. package/packages/web/dist/assets/ArchiveConfirmModal-Bv3vGOMM.js +0 -1
  89. package/packages/web/dist/assets/CommandButtonDetailView-Bk_SHxpu.js +0 -1
  90. package/packages/web/dist/assets/EffortLevelSelector-VfBEelvO.js +0 -1
  91. package/packages/web/dist/assets/InterpolationHelp-Dc1Y0T6v.js +0 -1
  92. package/packages/web/dist/assets/MarkdownEditor-DwBQkZbs.js +0 -2
  93. package/packages/web/dist/assets/PathChooser-BoMGzeg2.css +0 -1
  94. package/packages/web/dist/assets/ProjectEditView-Bes4Mib4.js +0 -1
  95. package/packages/web/dist/assets/ProjectEditView-DNwBUNRk.css +0 -1
  96. package/packages/web/dist/assets/ProjectListView-C55H1JHQ.css +0 -1
  97. package/packages/web/dist/assets/ProjectListView-DzEu-C36.js +0 -1
  98. package/packages/web/dist/assets/ProjectNewView-CpgE4R-l.css +0 -1
  99. package/packages/web/dist/assets/ProjectNewView-Cv-iEAgl.js +0 -1
  100. package/packages/web/dist/assets/SessionDetailView-DUYb7qTA.js +0 -36
  101. package/packages/web/dist/assets/SettingsView-5RDCXNUa.js +0 -1
  102. package/packages/web/dist/assets/index-80Qu7W6P.js +0 -1
  103. package/packages/web/dist/assets/index-B8_Iqwcq.js +0 -1
  104. package/packages/web/dist/assets/index-B9JErft2.js +0 -1
  105. package/packages/web/dist/assets/index-BarVnQIj.js +0 -3
  106. package/packages/web/dist/assets/index-BsvRdU0B.js +0 -1
  107. package/packages/web/dist/assets/index-Bugg2M-E.js +0 -1
  108. package/packages/web/dist/assets/index-C2Pjy-M8.js +0 -1
  109. package/packages/web/dist/assets/index-CS_wb_Vj.js +0 -1
  110. package/packages/web/dist/assets/index-ClzNIdCp.js +0 -1
  111. package/packages/web/dist/assets/index-Cn9Ajkye.js +0 -1
  112. package/packages/web/dist/assets/index-CucpVX4L.js +0 -1
  113. package/packages/web/dist/assets/index-D9hZYvW3.js +0 -1
  114. package/packages/web/dist/assets/index-DA0dK_PG.js +0 -7
  115. package/packages/web/dist/assets/index-DgpSn-jR.js +0 -1
  116. package/packages/web/dist/assets/index-HZwIyC9t.js +0 -1
  117. package/packages/web/dist/assets/index-SS3wA2sI.js +0 -1
@@ -1 +1 @@
1
- import{M as n}from"./ModelSelector-DSxaZWBL.js";import{M as r}from"./SlashCommandWizard-B_8ifpxN.js";import{E as m}from"./EffortLevelSelector-VfBEelvO.js";import{_ as p,a,c as i,b as t,d as s,k as u}from"./index-CSOPrlmq.js";const g={class:"form-group"},f={class:"options-row"},v={class:"mode-selector-wrapper"},b={class:"model-selector-wrapper"},c={class:"effort-selector-wrapper"},k={class:"thinking-toggle"},y={class:"field-with-badge"},h={class:"toggle-switch"},S=["checked"],I={key:0,class:"thinking-toggle"},w={class:"field-with-badge"},E={class:"toggle-switch"},B=["checked"],V={__name:"SessionFormOptions",props:{mode:{type:String,default:"yolo"},model:{type:String,default:null},effortLevel:{type:String,default:null},thinkingEnabled:{type:Boolean,default:!0},startImmediately:{type:Boolean,default:!0},hideStartImmediately:{type:Boolean,default:!1}},emits:["update:mode","update:model","update:providerId","update:effortLevel","update:thinkingEnabled","update:startImmediately"],setup(o){return(d,e)=>(a(),i("div",g,[e[10]||(e[10]=t("label",{class:"form-label"},"Options",-1)),t("div",f,[t("div",v,[s(r,{"model-value":o.mode,"onUpdate:modelValue":e[0]||(e[0]=l=>d.$emit("update:mode",l))},null,8,["model-value"])]),t("div",b,[s(n,{"model-value":o.model,"onUpdate:modelValue":e[1]||(e[1]=l=>d.$emit("update:model",l)),"onUpdate:providerId":e[2]||(e[2]=l=>d.$emit("update:providerId",l))},null,8,["model-value"])]),t("div",c,[s(m,{"model-value":o.effortLevel,"onUpdate:modelValue":e[3]||(e[3]=l=>d.$emit("update:effortLevel",l))},null,8,["model-value"])]),t("div",k,[t("div",y,[t("label",h,[t("input",{type:"checkbox",checked:o.thinkingEnabled,onChange:e[4]||(e[4]=l=>d.$emit("update:thinkingEnabled",l.target.checked))},null,40,S),e[6]||(e[6]=t("span",{class:"toggle-slider"},null,-1))]),e[7]||(e[7]=t("span",{class:"toggle-label"},"Enable Thinking",-1))])]),o.hideStartImmediately?u("",!0):(a(),i("div",I,[t("div",w,[t("label",E,[t("input",{type:"checkbox",checked:o.startImmediately,onChange:e[5]||(e[5]=l=>d.$emit("update:startImmediately",l.target.checked))},null,40,B),e[8]||(e[8]=t("span",{class:"toggle-slider"},null,-1))]),e[9]||(e[9]=t("span",{class:"toggle-label"},"Start Immediately",-1))])]))])]))}},C=p(V,[["__scopeId","data-v-cbbbb3d9"]]);export{C as S};
1
+ import{M as n}from"./ModelSelector-vRSpXjhL.js";import{M as r}from"./SlashCommandWizard-CCEtEF98.js";import{E as m}from"./EffortLevelSelector-B9STpy07.js";import{_ as p,a,c as i,b as t,d as s,i as u}from"./index-MnvuyUxj.js";const g={class:"form-group"},f={class:"options-row"},v={class:"mode-selector-wrapper"},b={class:"model-selector-wrapper"},c={class:"effort-selector-wrapper"},k={class:"thinking-toggle"},y={class:"field-with-badge"},h={class:"toggle-switch"},S=["checked"],I={key:0,class:"thinking-toggle"},w={class:"field-with-badge"},E={class:"toggle-switch"},B=["checked"],V={__name:"SessionFormOptions",props:{mode:{type:String,default:"yolo"},model:{type:String,default:null},effortLevel:{type:String,default:null},thinkingEnabled:{type:Boolean,default:!0},startImmediately:{type:Boolean,default:!0},hideStartImmediately:{type:Boolean,default:!1}},emits:["update:mode","update:model","update:providerId","update:effortLevel","update:thinkingEnabled","update:startImmediately"],setup(o){return(d,e)=>(a(),i("div",g,[e[10]||(e[10]=t("label",{class:"form-label"},"Options",-1)),t("div",f,[t("div",v,[s(r,{"model-value":o.mode,"onUpdate:modelValue":e[0]||(e[0]=l=>d.$emit("update:mode",l))},null,8,["model-value"])]),t("div",b,[s(n,{"model-value":o.model,"onUpdate:modelValue":e[1]||(e[1]=l=>d.$emit("update:model",l)),"onUpdate:providerId":e[2]||(e[2]=l=>d.$emit("update:providerId",l))},null,8,["model-value"])]),t("div",c,[s(m,{"model-value":o.effortLevel,"onUpdate:modelValue":e[3]||(e[3]=l=>d.$emit("update:effortLevel",l))},null,8,["model-value"])]),t("div",k,[t("div",y,[t("label",h,[t("input",{type:"checkbox",checked:o.thinkingEnabled,onChange:e[4]||(e[4]=l=>d.$emit("update:thinkingEnabled",l.target.checked))},null,40,S),e[6]||(e[6]=t("span",{class:"toggle-slider"},null,-1))]),e[7]||(e[7]=t("span",{class:"toggle-label"},"Enable Thinking",-1))])]),o.hideStartImmediately?u("",!0):(a(),i("div",I,[t("div",w,[t("label",E,[t("input",{type:"checkbox",checked:o.startImmediately,onChange:e[5]||(e[5]=l=>d.$emit("update:startImmediately",l.target.checked))},null,40,B),e[8]||(e[8]=t("span",{class:"toggle-slider"},null,-1))]),e[9]||(e[9]=t("span",{class:"toggle-label"},"Start Immediately",-1))])]))])]))}},C=p(V,[["__scopeId","data-v-cbbbb3d9"]]);export{C as S};
@@ -1 +1 @@
1
- import{m as ce,y as Re,x as V,z as Ie,A as Be,l as A,B as Qe,C as Xe,_ as Se,a as t,c as o,b as e,F as X,r as Z,u as v,E as re,t as F,k as C,G as ne,i as je,f as Fe,d as Q,w as ge,o as Pe,j as G,v as ye,n as we,e as ue,h as de,g as Ke,q as Ue,H as xe,p as Le,I as Ze,J as Ve,s as et}from"./index-CSOPrlmq.js";import{u as De}from"./projects-B2du-GX8.js";import{u as $e}from"./sessions-VDrd87yA.js";import{u as Me,a as Ge,f as tt,b as st}from"./SessionLogStream-Da_GniUZ.js";import{a as Oe}from"./ApiClient-Dbs1H78V.js";import{u as He}from"./commandButtons-B4OYZP0J.js";import{S as qe}from"./SessionCard-Be1-bK0C.js";import{S as nt,M as ot,A as at}from"./ArchiveConfirmModal-Bv3vGOMM.js";import{u as We}from"./EffortLevelSelector-VfBEelvO.js";import{u as lt}from"./providers-B__J6FX0.js";import{M as rt}from"./ModelSelector-DSxaZWBL.js";import{I as ze}from"./InterpolationHelp-Dc1Y0T6v.js";import{R as it}from"./ResizableTextarea-_kHi1Mg3.js";import{S as dt}from"./SessionFormOptions-DvhOyP6z.js";import{S as ut,a as ct}from"./SlashCommandWizard-B_8ifpxN.js";import"./settings-CZ7Pc-Pt.js";function mt(){const u=Re({}),c=Re({}),m=Re({});async function p(r){const a=r.filter(g=>!u[g.id]&&!c[g.id]).map(g=>g.id);if(a.length!==0){for(const g of a)c[g]=!0,m[g]=!1;try{const g=await Oe.getSessionSummariesBatch(a);for(const i of a)g[i]&&(u[i]=g[i]),c[i]=!1}catch(g){console.warn("Failed to fetch summaries batch:",g.message);for(const i of a)m[i]=!0,c[i]=!1}}}async function l(r){var a;c[r]=!0,m[r]=!1;try{const g=await Oe.getSessionSummary(r);g&&(u[r]=g)}catch(g){((a=g.response)==null?void 0:a.status)!==404&&(console.warn(`Failed to fetch summary for session ${r}:`,g.message),m[r]=!0)}finally{c[r]=!1}}async function E(r){m[r]=!1,await l(r)}function R(r,a){u[r]=a,c[r]=!1,m[r]=!1}function _(r){delete u[r],delete c[r],delete m[r]}function S(r,a=400){let g=null;const i=ce(r,()=>{clearTimeout(g),g=setTimeout(()=>{const j=r();p(j)},a)});return()=>{clearTimeout(g),i()}}return{summaries:u,loadingSummaries:c,summaryErrors:m,fetchSummariesBatch:p,fetchSummary:l,retryFetchSummary:E,updateSummary:R,cleanupSummary:_,watchSessionsForSummaries:S}}function Ye(){const u=$e();function c(r){u.statusFilter===r?u.setStatusFilter(null):u.setStatusFilter(r)}function m(r){u.starredFilter===r?u.setStarredFilter(null):u.setStarredFilter(r)}function p(){u.starredFilter===null?u.setStarredFilter("starred"):u.starredFilter==="starred"?u.setStarredFilter("unstarred"):u.setStarredFilter(null)}const l=V(()=>u.starredFilter==="starred"?"Showing starred sessions only. Click to filter unstarred.":u.starredFilter==="unstarred"?"Showing unstarred sessions only. Click to show all.":"Showing all sessions. Click to filter by starred.");function E(){u.scheduledFilter===null?u.setScheduledFilter("scheduled"):u.scheduledFilter==="scheduled"?u.setScheduledFilter("not-scheduled"):u.setScheduledFilter(null)}const R=V(()=>u.scheduledFilter==="scheduled"?"Showing workflows with scheduled sessions. Click to filter non-scheduled.":u.scheduledFilter==="not-scheduled"?"Showing workflows without scheduled sessions. Click to show all.":"Showing all workflows. Click to filter by scheduled."),_=V(()=>{let r=u.groupedSessions;u.starredFilter==="starred"?r=r.filter($=>$.parent.starred):u.starredFilter==="unstarred"&&(r=r.filter($=>!$.parent.starred));const a=r.map($=>({group:$,status:u.getWorkflowAggregatedStatus($.parent.id)}));let g=a;u.scheduledFilter&&(g=a.filter(({status:$})=>{const T=$.scheduledCount>0;return u.scheduledFilter==="scheduled"?T:!T}));let i=0,j=0;for(const{status:$}of g)$.effectiveStatus==="running"?i++:j++;return{running:i,idle:j}}),S=V(()=>{let r=u.groupedSessions;return u.statusFilter&&(r=r.filter(a=>{const i=u.getWorkflowAggregatedStatus(a.parent.id).effectiveStatus;return u.statusFilter==="running"&&i==="running"||u.statusFilter==="idle"&&i==="idle"})),u.starredFilter==="starred"?r=r.filter(a=>a.parent.starred):u.starredFilter==="unstarred"&&(r=r.filter(a=>!a.parent.starred)),u.scheduledFilter&&(r=r.filter(a=>{const i=u.getWorkflowAggregatedStatus(a.parent.id).scheduledCount>0;return!!(u.scheduledFilter==="scheduled"&&i||u.scheduledFilter==="not-scheduled"&&!i)})),r});return{toggleFilter:c,toggleStarredFilter:m,toggleStarFilterIcon:p,starFilterTooltip:l,toggleScheduledFilterIcon:E,scheduledFilterTooltip:R,filteredGroupedSessions:S,statusFilterCounts:_}}function pt(u,c){const m=De(),p=$e(),l=He(),E=Me(),{fetchSummariesBatch:R,updateSummary:_,cleanupSummary:S}=c,{onReconnect:r}=Ie();function a(f,n,P,b){var ie;const H=l.runs[f],q=p.sessions.find(oe=>oe.id===n),ee=(ie=q==null?void 0:q.latestCommandRuns)==null?void 0:ie.find(oe=>oe.runId===f),te=(H==null?void 0:H.startedAt)||(ee==null?void 0:ee.startedAt)||Date.now();l.runs[f]||(l.runs[f]={runId:f,buttonId:P,sessionId:n,status:"running",output:"",exitCode:null,startedAt:te,outputTruncated:!1}),l.appendOutput(f,b),p.updateSessionCommandRun(n,P,{buttonId:P,status:"running",runId:f,startedAt:te})}function g({runId:f,sessionId:n,buttonId:P,exitCode:b,output:H}){l.runs[f]||(l.runs[f]={runId:f,buttonId:P,sessionId:n,status:"running",output:"",exitCode:null,startedAt:Date.now(),outputTruncated:!1}),l.completeRun(f,b,H);const J=b===0?"success":"error";p.updateSessionCommandRun(n,P,{buttonId:P,status:J,exitCode:b,runId:f,completedAt:Date.now()})}function i(f,n,P,b){l.runs[f]||(l.runs[f]={runId:f,buttonId:P,sessionId:n,status:"running",output:"",exitCode:null,startedAt:Date.now(),outputTruncated:!1}),l.errorRun(f,b),p.updateSessionCommandRun(n,P,{buttonId:P,status:"error",runId:f,completedAt:Date.now()})}function j(f,n,P){const{onSessionCreated:b,onSessionUpdated:H,onSessionDeleted:J,onSessionSummaryUpdated:q,onCommandRunOutput:ee,onCommandRunComplete:te,onCommandRunError:ie,onCommandRunDeleted:oe,onKanbanBoardUpdated:me,onKanbanCardMoved:ae,onKanbanCardAdded:pe,onKanbanCardRemoved:ve}=f,D=[];return D.push(b(U=>{n.sessionsStore.addSessionToList(U)})),D.push(H(U=>{n.sessionsStore.updateSession(U)})),D.push(J(U=>{n.sessionsStore.removeSessionFromList(U),P.cleanupSummary(U)})),D.push(q((U,d)=>{P.updateSummary(U,d)})),D.push(ee(a)),D.push(te(g)),D.push(ie(i)),D.push(oe((U,d,s)=>{n.commandButtonsStore.clearRun(U),n.sessionsStore.removeSessionCommandRun(d,s)})),D.push(me(U=>{n.kanbanStore.handleBoardUpdated(U)})),D.push(ae((U,d,s,y)=>{n.kanbanStore.handleCardMoved(U,d,s,y)})),D.push(pe((U,d)=>{n.kanbanStore.handleCardAdded(U,d)})),D.push(ve((U,d)=>{n.kanbanStore.handleCardRemoved(U,d)})),D}const $=[];let T=null;const h=A(!1);let I=0;const Y=3e4,L=async()=>{if(document.visibilityState!=="visible")return;const f=Date.now();if(f-I<Y)return;I=f;const n=u.value;n&&(await p.fetchSessions(n,{silent:!0}),R(p.sessions))};return document.addEventListener("visibilitychange",L),ce(u,async f=>{if(!f)return;h.value=!1,$.forEach(D=>D()),$.length=0,T&&(T(),T=null),await m.fetchProject(f),await p.fetchSessions(f),await l.fetchButtons(f),R(p.sessions),I=Date.now();const{subscribe:n,unsubscribe:P,onSessionCreated:b,onSessionUpdated:H,onSessionDeleted:J,onSessionSummaryUpdated:q,onCommandRunOutput:ee,onCommandRunComplete:te,onCommandRunError:ie,onCommandRunDeleted:oe,onKanbanBoardUpdated:me,onKanbanCardMoved:ae,onKanbanCardAdded:pe,onKanbanCardRemoved:ve}=Qe(f);T=P,n(),$.push(...j({onSessionCreated:b,onSessionUpdated:H,onSessionDeleted:J,onSessionSummaryUpdated:q,onCommandRunOutput:ee,onCommandRunComplete:te,onCommandRunError:ie,onCommandRunDeleted:oe,onKanbanBoardUpdated:me,onKanbanCardMoved:ae,onKanbanCardAdded:pe,onKanbanCardRemoved:ve},{sessionsStore:p,commandButtonsStore:l,kanbanStore:E},{updateSummary:_,cleanupSummary:S})),$.push(r(async()=>{const D=u.value;D&&(I=Date.now(),await p.fetchSessions(D,{silent:!0}),R(p.sessions))}))},{immediate:!0}),Be(()=>{$.forEach(f=>f()),T&&T(),document.removeEventListener("visibilitychange",L)}),{archivedLoaded:h}}function vt(){const u=$e(),c=Ge(),m=A({}),p={},l=new Map,E=4;function R(i,j=0){fetch(`/api/sessions/${i}/streaming-state`).then($=>$.ok?$.json():null).then($=>{var T;if($&&((T=$.workLogs)!=null&&T.length||$.partialText||$.thinking)){c.hydrateSessionState(i,$);const h=l.get(i);h&&(clearTimeout(h.timeout),l.delete(i))}else _(i,j)}).catch(()=>{_(i,j)})}function _(i,j=0){if(j>=E||!m.value[i])return;const $=u.sessions.find(I=>I.id===i);if(!$||!["running","starting"].includes($.status))return;const T=1500*Math.pow(2,j),h=setTimeout(()=>{l.delete(i),R(i,j+1)},T);l.set(i,{count:j,timeout:h})}function S(i){if(m.value[i])return;const j=Xe(i),$=[];$.push(j.onWorkLog(T=>{c.addSessionWorkLog(i,T)})),$.push(j.onPartial(T=>{T&&c.setSessionPartialText(i,T)})),$.push(j.onThinkingPartial(T=>{T&&c.setPartialThinking(T,i)})),$.push(j.onChangesUpdate(T=>{c.setSessionFileCount(i,T)})),$.push(j.onStatus(T=>{["running","starting"].includes(T)?p[i]&&(clearTimeout(p[i]),delete p[i]):p[i]=setTimeout(()=>{delete p[i],c.clearSessionEphemeralState(i)},2e3)})),j.subscribe(),m.value[i]={subscription:j,cleanup:()=>{$.forEach(T=>T&&T()),j.unsubscribe()}},R(i)}function r(i){const j=m.value[i];j&&(j.cleanup(),delete m.value[i]),p[i]&&(clearTimeout(p[i]),delete p[i]);const $=l.get(i);$&&(clearTimeout($.timeout),l.delete(i))}ce(()=>u.sessions.filter(i=>["running","starting"].includes(i.status)).map(i=>i.id),(i,j=[])=>{const $=i.filter(h=>!j.includes(h)),T=j.filter(h=>!i.includes(h));$.forEach(h=>S(h)),T.forEach(h=>r(h))},{immediate:!0});const{onReconnect:a}=Ie(),g=a(()=>{for(const i of Object.keys(m.value))R(i)});return Be(()=>{Object.keys(m.value).forEach(i=>r(i)),g()}),{activeSubscriptions:m}}const ft={class:"filters-container"},ht={class:"status-filters"},bt=["aria-label","onClick"],gt={class:"filter-label"},yt={class:"filter-count"},kt=["title"],St={key:0,class:"star-icon"},$t={key:1,class:"star-icon star-crossed"},Ct={key:2,class:"star-icon"},wt=["title"],Et={key:0,class:"schedule-icon"},_t={key:1,class:"schedule-icon schedule-crossed"},Tt={key:2,class:"schedule-icon"},jt={__name:"SessionFiltersPanel",props:{showStatusFilters:{type:Boolean,default:!0},showScheduledFilter:{type:Boolean,default:!0}},setup(u){const c=$e(),{toggleFilter:m,toggleStarFilterIcon:p,starFilterTooltip:l,toggleScheduledFilterIcon:E,scheduledFilterTooltip:R,statusFilterCounts:_}=Ye();return(S,r)=>(t(),o("div",ft,[e("div",ht,[u.showStatusFilters?(t(),o(X,{key:0},Z(["running","idle"],a=>e("button",{key:a,class:re(["filter-btn",{active:v(c).statusFilter===a,"filter-btn-empty":v(_)[a]===0}]),"aria-label":`${a} (${v(_)[a]})`,onClick:g=>v(m)(a)},[e("span",gt,F(a),1),e("span",yt,F(v(_)[a]),1)],10,bt)),64)):C("",!0),e("button",{class:re(["filter-btn star-btn",{"star-filter-active":v(c).starredFilter==="starred","star-filter-unstarred":v(c).starredFilter==="unstarred","star-filter-all":v(c).starredFilter===null}]),title:v(l),onClick:r[0]||(r[0]=(...a)=>v(p)&&v(p)(...a))},[v(c).starredFilter==="starred"?(t(),o("span",St,"⭐")):v(c).starredFilter==="unstarred"?(t(),o("span",$t,"⭐")):(t(),o("span",Ct,"☆"))],10,kt),u.showScheduledFilter?(t(),o("button",{key:1,class:re(["filter-btn schedule-btn",{"schedule-filter-active":v(c).scheduledFilter==="scheduled","schedule-filter-not-scheduled":v(c).scheduledFilter==="not-scheduled","schedule-filter-all":v(c).scheduledFilter===null}]),title:v(R),onClick:r[1]||(r[1]=(...a)=>v(E)&&v(E)(...a))},[v(c).scheduledFilter==="scheduled"?(t(),o("span",Et,"⏰")):v(c).scheduledFilter==="not-scheduled"?(t(),o("span",_t,"⏰")):(t(),o("span",Tt,"⏰"))],10,wt)):C("",!0)])]))}},Ne=Se(jt,[["__scopeId","data-v-2c9a63d9"]]),Ft={key:0,class:"skeleton-list"},Mt={key:1,class:"error-message"},Rt={key:2,class:"empty-state"},At={key:3,class:"session-list"},xt={key:0,class:"load-more-container"},Lt=["disabled"],Ot={key:0},Bt={key:1},Pt={__name:"ArchivedTabContent",props:{summaries:{type:Object,required:!0},loadingSummaries:{type:Object,required:!0},summaryErrors:{type:Object,required:!0}},emits:["retrySummary","unarchive","loadMore"],setup(u){const c=$e(),m=V(()=>{const{total:p,offset:l}=c.archivedPagination;return Math.max(0,p-l)});return(p,l)=>(t(),o("div",null,[v(c).archivedPagination.loading&&v(c).archivedSessions.length===0?(t(),o("div",Ft,[(t(),o(X,null,Z(3,E=>e("div",{key:E,class:"skeleton card",style:{height:"120px"}})),64))])):v(c).error?(t(),o("div",Mt,F(v(c).error),1)):v(c).archivedSessions.length===0?(t(),o("div",Rt,[...l[3]||(l[3]=[e("p",null,"No archived sessions. Archive completed sessions to keep your session list tidy.",-1)])])):(t(),o("div",At,[(t(!0),o(X,null,Z(v(c).archivedSessions,E=>(t(),ne(qe,{key:E.id,session:E,"show-summary":!0,summary:u.summaries[E.id],"summary-loading":u.loadingSummaries[E.id],"summary-error":u.summaryErrors[E.id],"show-unarchive":!0,"kanban-enabled":!1,"pr-url":E.prUrl,"pr-summary":u.summaries[E.id],onRetrySummary:l[0]||(l[0]=R=>p.$emit("retrySummary",R)),onUnarchive:l[1]||(l[1]=R=>p.$emit("unarchive",R))},null,8,["session","summary","summary-loading","summary-error","pr-url","pr-summary"]))),128)),v(c).archivedPagination.hasMore?(t(),o("div",xt,[e("button",{class:"btn btn-secondary",disabled:v(c).archivedPagination.loading,onClick:l[2]||(l[2]=E=>p.$emit("loadMore"))},[v(c).archivedPagination.loading?(t(),o("span",Ot,"Loading...")):(t(),o("span",Bt,"Load More ("+F(m.value)+" remaining)",1))],8,Lt)])):C("",!0)]))]))}},Ut=Se(Pt,[["__scopeId","data-v-c0906664"]]),Dt={class:"scheduled-session-card card"},Vt={class:"card-header"},Nt={class:"session-info"},It={class:"session-name"},Kt={class:"timing-info"},Gt={class:"timing-item"},Ht={class:"timing-details"},qt={class:"timing-text"},Wt={class:"timing-absolute"},zt={key:0,class:"timing-item"},Yt={class:"timing-details"},Jt={class:"timing-absolute"},Qt={class:"card-actions"},Xt=["disabled"],Zt=["disabled"],es={__name:"ScheduledSessionCard",props:{session:{type:Object,required:!0}},setup(u){const c=u,m=$e(),p=je(),l=A(!1),E=A(!1),R=V(()=>{const a=new Date(c.session.scheduledAt);return tt(a,{addSuffix:!0})}),_=V(()=>{const a=new Date(c.session.scheduledAt);return st(a,"MMM d, h:mm a")});async function S(){if(confirm("Cancel this scheduled session?")){l.value=!0;try{await m.updateSessionFields(c.session.id,{status:"stopped"}),p.success("Session cancelled")}catch(a){console.error("Failed to cancel session:",a),p.error(`Failed to cancel session: ${a.message}`)}finally{l.value=!1}}}function r(){}return(a,g)=>{const i=Fe("router-link");return t(),o("div",Dt,[e("div",Vt,[e("div",Nt,[Q(i,{to:`/sessions/${u.session.id}`,class:"session-name-link"},{default:ge(()=>[e("h3",It,F(u.session.name),1)]),_:1},8,["to"])]),g[2]||(g[2]=e("div",{class:"status-badge-container"},[e("span",{class:"status-badge status-scheduled"},"scheduled")],-1))]),e("div",Kt,[e("div",Gt,[g[3]||(g[3]=e("span",{class:"timing-icon"},"⏰",-1)),e("div",Ht,[e("span",qt,F(R.value),1),e("span",Wt,F(_.value),1)])]),u.session.autoRescheduleEnabled?(t(),o("div",zt,[g[5]||(g[5]=e("span",{class:"timing-icon"},"🔄",-1)),e("div",Yt,[g[4]||(g[4]=e("span",{class:"timing-text"},"Auto-reschedule",-1)),e("span",Jt," Attempt "+F(u.session.rescheduleCount)+"/"+F(u.session.maxRescheduleCount||"∞"),1)])])):C("",!0)]),e("div",Qt,[e("button",{class:"btn btn-secondary btn-small",disabled:l.value,onClick:g[0]||(g[0]=j=>E.value=!0)}," Edit Schedule ",8,Xt),e("button",{class:"btn btn-danger btn-small",disabled:l.value,onClick:S}," Cancel ",8,Zt)]),Q(nt,{"is-open":E.value,session:u.session,onClose:g[1]||(g[1]=j=>E.value=!1),onSaved:r},null,8,["is-open","session"])])}}},ts=Se(es,[["__scopeId","data-v-d41e6b57"]]),ss={key:0,class:"skeleton-list"},ns={key:1,class:"empty-state"},os={key:2,class:"session-list"},as={__name:"ScheduledTabContent",props:{sessions:{type:Array,required:!0},loading:{type:Boolean,default:!1}},setup(u){return(c,m)=>(t(),o("div",null,[u.loading?(t(),o("div",ss,[(t(),o(X,null,Z(3,p=>e("div",{key:p,class:"skeleton card",style:{height:"120px"}})),64))])):u.sessions.length===0?(t(),o("div",ns,[...m[0]||(m[0]=[e("p",null,"No scheduled sessions. Use scheduling options when creating a new session to schedule it for later.",-1)])])):(t(),o("div",os,[(t(!0),o(X,null,Z(u.sessions,p=>(t(),ne(ts,{key:p.id,session:p},null,8,["session"]))),128))]))]))}},ls=Se(as,[["__scopeId","data-v-75cf4e60"]]),rs={class:"templates-panel"},is={class:"templates-header"},ds={key:0,class:"template-form card","data-testid":"template-form"},us={class:"form-group"},cs={class:"form-group"},ms={class:"form-group"},ps=["disabled"],vs={class:"form-group"},fs=["value"],hs={class:"form-group"},bs={class:"form-group"},gs={class:"form-group"},ys={class:"form-group"},ks={class:"form-actions"},Ss=["disabled"],$s={key:0,class:"loading-spinner"},Cs={key:1,class:"loading-state"},ws={key:2},Es={key:0,class:"template-section"},_s={class:"templates-list"},Ts={class:"template-header"},js={class:"template-name"},Fs={class:"template-prompt"},Ms={class:"template-meta"},Rs={key:0,class:"meta-badge"},As={key:1,class:"meta-badge"},xs={key:2,class:"meta-badge"},Ls={key:3,class:"meta-badge"},Os={key:4,class:"meta-badge meta-badge-chain"},Bs={key:1,class:"template-section"},Ps={class:"templates-list"},Us={class:"template-header"},Ds={class:"template-name"},Vs={class:"template-prompt"},Ns={class:"template-meta"},Is={key:0,class:"meta-badge"},Ks={key:1,class:"meta-badge"},Gs={key:2,class:"meta-badge"},Hs={key:3,class:"meta-badge"},qs={key:4,class:"meta-badge meta-badge-chain"},Ws={key:2,class:"empty-state"},zs={__name:"TemplatesPanel",props:{projectId:{type:String,required:!0}},setup(u,{expose:c}){const m=u,p=We(),l=je(),E=lt(),R=A(!1),_=A(!1),S=A({name:"",prompt:"",isGlobal:!1,nextTemplateId:null,thinkingEnabled:null,gitBranch:"",model:null,mode:null}),r=V(()=>p.loading),a=V(()=>p.projectTemplates),g=V(()=>p.globalTemplates),i=V(()=>[...p.projectTemplates,...p.globalTemplates]);Pe(async()=>{E.providers.length===0&&await E.fetchProviders(),p.fetchProjectTemplates(m.projectId)}),ce(()=>m.projectId,f=>{p.fetchProjectTemplates(f)});function j(f,n=100){return f.length<=n?f:`${f.substring(0,n)}...`}function $(f){const n=p.getTemplateById(f);return(n==null?void 0:n.name)||"Unknown"}function T(f){var n;for(const P of E.providers){const b=(n=P.models)==null?void 0:n.find(H=>H.modelId===f);if(b)return P.isBuiltIn?b.displayName:b.modelId}return f}function h(){S.value={name:"",prompt:"",isGlobal:!1,nextTemplateId:null,thinkingEnabled:null,gitBranch:"",model:null,mode:null}}function I(){R.value=!0}function Y(){R.value=!1,h()}async function L(){if(!_.value){_.value=!0;try{const f={name:S.value.name,prompt:S.value.prompt,nextTemplateId:S.value.nextTemplateId||void 0,thinkingEnabled:S.value.thinkingEnabled,gitBranch:S.value.gitBranch||void 0,model:S.value.model,mode:S.value.mode};S.value.isGlobal?(await p.createGlobalTemplate(f),l.success("Global template created")):(await p.createProjectTemplate(m.projectId,f),l.success("Template created")),Y()}catch(f){l.error(f.message)}finally{_.value=!1}}}return c({formData:S,getModelName:T,resetForm:h}),(f,n)=>{const P=Fe("router-link");return t(),o("div",rs,[e("div",is,[n[8]||(n[8]=e("h2",null,"Session Templates",-1)),R.value?C("",!0):(t(),o("button",{key:0,class:"btn btn-primary btn-sm","data-testid":"new-template-btn",onClick:I}," New Template "))]),R.value?(t(),o("div",ds,[n[23]||(n[23]=e("h3",null,"Create Template",-1)),e("form",{onSubmit:de(L,["prevent"])},[e("div",us,[n[9]||(n[9]=e("label",{class:"form-label"},"Name",-1)),G(e("input",{"onUpdate:modelValue":n[0]||(n[0]=b=>S.value.name=b),type:"text",class:"form-input",placeholder:"Template name",required:""},null,512),[[ye,S.value.name]])]),e("div",cs,[n[10]||(n[10]=e("label",{class:"form-label"},"Prompt",-1)),G(e("textarea",{"onUpdate:modelValue":n[1]||(n[1]=b=>S.value.prompt=b),class:"form-input form-textarea",placeholder:"Session prompt. Use {{rootSession.summary}} to reference root session data.",rows:"4",required:""},null,512),[[ye,S.value.prompt]]),Q(ze)]),e("div",ms,[n[12]||(n[12]=e("label",{class:"form-label"},"Scope",-1)),G(e("select",{"onUpdate:modelValue":n[2]||(n[2]=b=>S.value.isGlobal=b),class:"form-input",disabled:f.editingTemplate},[...n[11]||(n[11]=[e("option",{value:!1}," Project Only ",-1),e("option",{value:!0}," Global (all projects) ",-1)])],8,ps),[[we,S.value.isGlobal]])]),e("div",vs,[n[14]||(n[14]=e("label",{class:"form-label"},"Next Template (Optional)",-1)),G(e("select",{"onUpdate:modelValue":n[3]||(n[3]=b=>S.value.nextTemplateId=b),class:"form-input"},[n[13]||(n[13]=e("option",{value:null}," None ",-1)),(t(!0),o(X,null,Z(i.value,b=>(t(),o("option",{key:b.id,value:b.id},F(b.name)+" "+F(b.projectId?"":"(Global)"),9,fs))),128))],512),[[we,S.value.nextTemplateId]]),n[15]||(n[15]=e("p",{class:"form-help"}," Chain another template to run after this one completes. ",-1))]),e("div",hs,[n[16]||(n[16]=e("label",{class:"form-label"},"Model",-1)),Q(rt,{modelValue:S.value.model,"onUpdate:modelValue":n[4]||(n[4]=b=>S.value.model=b),"allow-empty":!0,"empty-label":"Inherit from root session"},null,8,["modelValue"])]),e("div",bs,[n[18]||(n[18]=e("label",{class:"form-label",for:"create-mode"},"Mode",-1)),G(e("select",{id:"create-mode","onUpdate:modelValue":n[5]||(n[5]=b=>S.value.mode=b),class:"form-input","data-testid":"mode-select"},[...n[17]||(n[17]=[e("option",{value:null}," Inherit from root session ",-1),e("option",{value:"plan"}," Plan ",-1),e("option",{value:"standard"}," Standard ",-1),e("option",{value:"yolo"}," YOLO ",-1)])],512),[[we,S.value.mode]])]),e("div",gs,[n[20]||(n[20]=e("label",{class:"form-label",for:"create-thinking"},"Extended Thinking",-1)),G(e("select",{id:"create-thinking","onUpdate:modelValue":n[6]||(n[6]=b=>S.value.thinkingEnabled=b),class:"form-input","data-testid":"thinking-select"},[...n[19]||(n[19]=[e("option",{value:null}," Inherit from root session ",-1),e("option",{value:!0}," Enabled ",-1),e("option",{value:!1}," Disabled ",-1)])],512),[[we,S.value.thinkingEnabled]])]),e("div",ys,[n[21]||(n[21]=e("label",{class:"form-label"},"Git Branch (Optional)",-1)),G(e("input",{"onUpdate:modelValue":n[7]||(n[7]=b=>S.value.gitBranch=b),type:"text",class:"form-input",placeholder:"Leave empty to inherit from root session"},null,512),[[ye,S.value.gitBranch]])]),e("div",ks,[e("button",{type:"button",class:"btn","data-testid":"cancel-btn",onClick:Y}," Cancel "),e("button",{type:"submit",class:"btn btn-primary",disabled:_.value,"data-testid":"submit-btn"},[_.value?(t(),o("span",$s)):C("",!0),n[22]||(n[22]=ue(" Create ",-1))],8,Ss)])],32)])):C("",!0),r.value?(t(),o("div",Cs,[...n[24]||(n[24]=[e("span",{class:"loading-spinner"},null,-1),ue(" Loading templates... ",-1)])])):(t(),o("div",ws,[a.value.length>0?(t(),o("div",Es,[n[25]||(n[25]=e("h3",{class:"section-title"}," Project Templates ",-1)),e("div",_s,[(t(!0),o(X,null,Z(a.value,b=>(t(),ne(P,{key:b.id,to:`/projects/${u.projectId}/templates/${b.id}`,class:"template-card card","data-testid":`template-card-${b.id}`},{default:ge(()=>[e("div",Ts,[e("h4",js,F(b.name),1)]),e("p",Fs,F(j(b.prompt)),1),e("div",Ms,[b.thinkingEnabled?(t(),o("span",Rs,"Thinking")):C("",!0),b.gitBranch?(t(),o("span",As,F(b.gitBranch),1)):C("",!0),b.model?(t(),o("span",xs,F(T(b.model)),1)):C("",!0),b.mode?(t(),o("span",Ls,F(b.mode),1)):C("",!0),b.nextTemplateId?(t(),o("span",Os," Chains to: "+F($(b.nextTemplateId)),1)):C("",!0)])]),_:2},1032,["to","data-testid"]))),128))])])):C("",!0),g.value.length>0?(t(),o("div",Bs,[n[27]||(n[27]=e("h3",{class:"section-title"}," Global Templates ",-1)),e("div",Ps,[(t(!0),o(X,null,Z(g.value,b=>(t(),ne(P,{key:b.id,to:`/projects/${u.projectId}/templates/${b.id}`,class:"template-card card","data-testid":`template-card-${b.id}`},{default:ge(()=>[e("div",Us,[e("h4",Ds,F(b.name),1)]),e("p",Vs,F(j(b.prompt)),1),e("div",Ns,[n[26]||(n[26]=e("span",{class:"meta-badge meta-badge-global"},"Global",-1)),b.thinkingEnabled?(t(),o("span",Is,"Thinking")):C("",!0),b.gitBranch?(t(),o("span",Ks,F(b.gitBranch),1)):C("",!0),b.model?(t(),o("span",Gs,F(T(b.model)),1)):C("",!0),b.mode?(t(),o("span",Hs,F(b.mode),1)):C("",!0),b.nextTemplateId?(t(),o("span",qs," Chains to: "+F($(b.nextTemplateId)),1)):C("",!0)])]),_:2},1032,["to","data-testid"]))),128))])])):C("",!0),a.value.length===0&&g.value.length===0&&!R.value?(t(),o("div",Ws,[n[28]||(n[28]=e("p",null,"No templates yet. Create a template to automate session workflows.",-1)),e("button",{class:"btn btn-primary","data-testid":"create-template-btn",onClick:I}," Create Template ")])):C("",!0)]))])}}},Ys=Se(zs,[["__scopeId","data-v-d08b4ac0"]]),Js={class:"command-buttons-panel"},Qs={class:"panel-header"},Xs={key:0,class:"loading-state"},Zs={key:1,class:"error-message"},en={key:2,class:"empty-state"},tn={key:3,class:"buttons-table"},sn=["onClick"],nn={class:"col-label"},on={class:"col-command"},an={class:"col-order"},ln=["onClick"],rn={class:"modal-body"},dn={class:"modal-footer"},un={__name:"CommandButtonsPanel",props:{projectId:{type:String,required:!0}},setup(u){const c=u,m=Ke(),p=He(),l=A(null),E=r=>r.length>50?`${r.substring(0,50)}...`:r,R=r=>{m.push(`/projects/${c.projectId}/command-buttons/${r.id}`)},_=r=>{l.value=r},S=async()=>{if(l.value)try{await p.deleteButton(c.projectId,l.value.id),l.value=null}catch(r){console.error("Failed to delete button:",r)}};return(r,a)=>{const g=Fe("router-link");return t(),o("div",Js,[e("div",Qs,[a[5]||(a[5]=e("h3",null,"Command Buttons",-1)),Q(g,{to:`/projects/${u.projectId}/command-buttons/new`,class:"btn btn-primary btn-sm"},{default:ge(()=>[...a[4]||(a[4]=[ue(" + New Command Button ",-1)])]),_:1},8,["to"])]),v(p).loading?(t(),o("div",Xs,[...a[6]||(a[6]=[e("span",{class:"loading-spinner"},null,-1),ue(" Loading command buttons... ",-1)])])):v(p).error?(t(),o("div",Zs,F(v(p).error),1)):v(p).buttons.length===0?(t(),o("div",en,[a[8]||(a[8]=e("p",null,"No command buttons configured yet.",-1)),Q(g,{to:`/projects/${u.projectId}/command-buttons/new`,class:"btn btn-primary"},{default:ge(()=>[...a[7]||(a[7]=[ue(" Create First Button ",-1)])]),_:1},8,["to"])])):(t(),o("div",tn,[a[9]||(a[9]=Ue('<div class="table-header" data-v-990a48bf><div class="col-label" data-v-990a48bf> Label </div><div class="col-command" data-v-990a48bf> Command </div><div class="col-order" data-v-990a48bf> Sort Order </div><div class="col-actions" data-v-990a48bf> Actions </div></div>',1)),(t(!0),o(X,null,Z(v(p).buttons,i=>(t(),o("div",{key:i.id,class:"table-row",onClick:j=>R(i)},[e("div",nn,F(i.label),1),e("div",on,[e("code",null,F(E(i.command)),1)]),e("div",an,F(i.sortOrder),1),e("div",{class:"col-actions",onClick:a[0]||(a[0]=de(()=>{},["stop"]))},[e("button",{class:"btn btn-sm btn-outline-danger",onClick:j=>_(i)}," Delete ",8,ln)])],8,sn))),128))])),l.value?(t(),o("div",{key:4,class:"modal-overlay",onClick:a[3]||(a[3]=i=>l.value=null)},[e("div",{class:"modal-dialog",onClick:a[2]||(a[2]=de(()=>{},["stop"]))},[a[12]||(a[12]=e("div",{class:"modal-header"},[e("h4",null,"Delete Command Button")],-1)),e("div",rn,[e("p",null,[a[10]||(a[10]=ue('Are you sure you want to delete the command button "',-1)),e("strong",null,F(l.value.label),1),a[11]||(a[11]=ue('"?',-1))])]),e("div",dn,[e("button",{class:"btn btn-outline-secondary",onClick:a[1]||(a[1]=i=>l.value=null)}," Cancel "),e("button",{class:"btn btn-danger",onClick:S}," Delete ")])])])):C("",!0)])}}},cn=Se(un,[["__scopeId","data-v-990a48bf"]]),mn={class:"modal-content"},pn={class:"modal-header"},vn={class:"modal-title"},fn={class:"modal-body"},hn={class:"form-group"},bn={class:"sessions-list"},gn={key:0,class:"loading-state"},yn={key:1,class:"empty-state"},kn={key:0},Sn={key:1},$n=["onClick"],Cn={class:"session-info"},wn={class:"session-name"},En={class:"session-meta"},_n={key:0,class:"session-mode"},Tn={class:"session-date"},jn={class:"modal-footer"},Fn=["disabled"],Mn={__name:"AddSessionToLaneModal",props:{isOpen:{type:Boolean,default:!1},projectId:{type:String,default:""},laneId:{type:String,default:""},laneName:{type:String,default:""}},emits:["close","update:isOpen","added"],setup(u,{emit:c}){const m=u,p=c;$e();const l=Me(),E=je(),R=A(!1),_=A(!1),S=A(""),r=A(null),a=A([]),g=V(()=>{let L=a.value.filter(f=>!l.isSessionOnBoard(f.id));if(L=L.filter(f=>!f.parentSessionId),S.value.trim()){const f=S.value.toLowerCase();L=L.filter(n=>{var P;return(P=n.name)==null?void 0:P.toLowerCase().includes(f)})}return L});function i(L){switch(L){case"running":case"starting":return"●";case"waiting":return"◐";case"completed":return"✓";case"error":return"✕";case"stopped":return"■";case"scheduled":return"⏰";default:return"○"}}function j(L){return L?new Date(L).toLocaleDateString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function $(L){r.value=L}function T(){}function h(){p("update:isOpen",!1),p("close"),S.value="",r.value=null}async function I(){if(m.projectId){R.value=!0;try{const L=await Oe.getProjectSessions(m.projectId,!1,null);a.value=Array.isArray(L)?L:(L==null?void 0:L.sessions)||[]}catch(L){console.error("Failed to load sessions:",L),E.error("Failed to load sessions"),a.value=[]}finally{R.value=!1}}}async function Y(){if(!(!r.value||!m.laneId)){_.value=!0;try{await l.addSessionToBoard(m.projectId,r.value,m.laneId),E.success("Session added to board"),p("added",r.value),h()}catch(L){console.error("Failed to add session to board:",L),E.error(L.message||"Failed to add session to board")}finally{_.value=!1}}}return ce(()=>m.isOpen,L=>{L&&I()},{immediate:!0}),(L,f)=>u.isOpen?(t(),o("div",{key:0,class:"modal-backdrop",onClick:de(h,["self"])},[e("div",mn,[e("div",pn,[e("h2",vn," Add Session to "+F(u.laneName),1),e("button",{class:"close-btn","aria-label":"Close",onClick:h}," × ")]),e("div",fn,[e("div",hn,[f[1]||(f[1]=e("label",{for:"session-search",class:"form-label"},"Search Sessions",-1)),G(e("input",{id:"session-search","onUpdate:modelValue":f[0]||(f[0]=n=>S.value=n),type:"text",class:"form-input",placeholder:"Search by name...",onInput:T},null,544),[[ye,S.value]])]),e("div",bn,[R.value?(t(),o("div",gn,[...f[2]||(f[2]=[e("span",{class:"loading-spinner"},null,-1),ue(" Loading sessions... ",-1)])])):g.value.length===0?(t(),o("div",yn,[S.value?(t(),o("p",kn,' No sessions matching "'+F(S.value)+'" ',1)):(t(),o("p",Sn," No available sessions to add. "))])):(t(!0),o(X,{key:2},Z(g.value,n=>(t(),o("div",{key:n.id,class:re(["session-item",{selected:r.value===n.id}]),onClick:P=>$(n.id)},[e("div",{class:re(["session-status",`status-${n.status}`])},F(i(n.status)),3),e("div",Cn,[e("div",wn,F(n.name),1),e("div",En,[n.mode?(t(),o("span",_n,F(n.mode),1)):C("",!0),e("span",Tn,F(j(n.updatedAt||n.createdAt)),1)])])],10,$n))),128))])]),e("div",jn,[e("button",{class:"btn btn-secondary",onClick:h}," Cancel "),e("button",{class:"btn btn-primary",disabled:!r.value||_.value,onClick:Y},F(_.value?"Adding...":"Add to Lane"),9,Fn)])])])):C("",!0)}},Je=Se(Mn,[["__scopeId","data-v-916a53c8"]]),Rn={class:"modal-content"},An={class:"modal-body"},xn={class:"form-group"},Ln={key:0,class:"form-group"},On={class:"lane-position-controls"},Bn=["disabled"],Pn={class:"lane-position-label"},Un=["disabled"],Dn={class:"form-group"},Vn={class:"automation-options"},Nn={class:"radio-option"},In={class:"radio-option"},Kn={class:"radio-option"},Gn={key:1,class:"form-group"},Hn={key:0,label:"Project Templates"},qn=["value"],Wn={key:1,label:"Global Templates"},zn=["value"],Yn={key:2,class:"form-group"},Jn={class:"prompt-actions-row"},Qn={key:4,class:"agent-settings-section"},Xn={key:0,class:"agent-settings-body"},Zn={class:"form-group"},eo={class:"toggle-switch-row"},to={class:"toggle-switch"},so={key:0,class:"reschedule-settings"},no={class:"form-group"},oo={class:"checkbox-option"},ao={class:"checkbox-option"},lo={class:"form-group"},ro={class:"form-group"},io={class:"form-group"},uo={class:"form-group"},co={class:"danger-zone"},mo=["disabled"],po={class:"modal-footer"},vo=["disabled"],fo={__name:"LaneSettingsModal",props:{isOpen:{type:Boolean,default:!1},projectId:{type:String,default:""},lane:{type:Object,default:null}},emits:["close","update:isOpen","updated","deleted"],setup(u,{emit:c}){const m=u,p=c,l=Me(),E=We(),R=je(),_=De(),S=A(!1),r=A(!1),a=A("none"),g=A(!1),i=A(!1),j=A(null),$=A(-1),T=A(-1),h=Re({name:"",onEnterTemplateId:null,onEnterPrompt:"",onEnterMode:null,onEnterModel:null,onEnterEffortLevel:null,onEnterThinkingEnabled:null,onEnterAutoRescheduleEnabled:!1,onEnterRescheduleDelayMinutes:15,onEnterRescheduleOnTokenLimit:!0,onEnterRescheduleOnServiceError:!0,onEnterMaxRescheduleCount:null,onEnterMaxTotalTokens:null,onEnterRescheduleAtTokenCount:null}),I=V(()=>E.projectTemplates),Y=V(()=>E.globalTemplates),L=V(()=>{const d=_.getProjectById(m.projectId);return(d==null?void 0:d.workingDirectory)||null}),f=V(()=>T.value),n=V(()=>{var d,s;return((s=(d=l.board)==null?void 0:d.lanes)==null?void 0:s.length)||0}),P=V(()=>!(!h.name.trim()||a.value==="template"&&!h.onEnterTemplateId||a.value==="prompt"&&!h.onEnterPrompt.trim()));function b(d){return{onEnterAutoRescheduleEnabled:d.onEnterAutoRescheduleEnabled||!1,onEnterRescheduleDelayMinutes:d.onEnterRescheduleDelayMinutes||15,onEnterRescheduleOnTokenLimit:d.onEnterRescheduleOnTokenLimit??!0,onEnterRescheduleOnServiceError:d.onEnterRescheduleOnServiceError??!0,onEnterMaxRescheduleCount:d.onEnterMaxRescheduleCount||null,onEnterMaxTotalTokens:d.onEnterMaxTotalTokens||null,onEnterRescheduleAtTokenCount:d.onEnterRescheduleAtTokenCount||null}}function H(d){return{name:d.name||"",onEnterTemplateId:d.onEnterTemplateId||null,onEnterPrompt:d.onEnterPrompt||"",onEnterMode:d.onEnterMode||null,onEnterModel:d.onEnterModel||null,onEnterEffortLevel:d.onEnterEffortLevel||null,onEnterThinkingEnabled:d.onEnterThinkingEnabled??null,...b(d)}}function J(d){return d.onEnterTemplateId?"template":d.onEnterPrompt?"prompt":"none"}function q(d){return!!(d.onEnterMode||d.onEnterModel||d.onEnterEffortLevel||d.onEnterThinkingEnabled!==null||d.onEnterAutoRescheduleEnabled)}function ee(){var d,s;if(m.lane){const y=H(m.lane);Object.assign(h,y),a.value=J(m.lane),g.value=q(h);const he=((s=(d=l.board)==null?void 0:d.lanes)==null?void 0:s.findIndex(B=>B.id===m.lane.id))??-1;$.value=he,T.value=he}else{const y=H({});Object.assign(h,y),a.value="none",g.value=!1,$.value=-1,T.value=-1}}function te(){T.value=$.value,p("update:isOpen",!1),p("close")}function ie({text:d}){const s=j.value;if(s){const y=s.selectionStart,he=s.selectionEnd,B=h.onEnterPrompt.substring(0,y),k=h.onEnterPrompt.substring(he);h.onEnterPrompt=B+d+k,Ze(()=>{s.selectionStart=s.selectionEnd=y+d.length,s.focus()})}}function oe(d){const s=T.value;s<0||s===d||(T.value=d)}function me(){return{onEnterTemplateId:null,onEnterPrompt:null,onEnterMode:null,onEnterModel:null,onEnterEffortLevel:null,onEnterThinkingEnabled:null,onEnterAutoRescheduleEnabled:!1,onEnterRescheduleDelayMinutes:15,onEnterRescheduleOnTokenLimit:!0,onEnterRescheduleOnServiceError:!0,onEnterMaxRescheduleCount:null,onEnterMaxTotalTokens:null,onEnterRescheduleAtTokenCount:null}}function ae(d){return{...me(),onEnterTemplateId:d.onEnterTemplateId,onEnterPrompt:null}}function pe(d){return{onEnterTemplateId:null,onEnterPrompt:d.onEnterPrompt.trim(),onEnterMode:d.onEnterMode,onEnterModel:d.onEnterModel,onEnterEffortLevel:d.onEnterEffortLevel,onEnterThinkingEnabled:d.onEnterThinkingEnabled,onEnterAutoRescheduleEnabled:d.onEnterAutoRescheduleEnabled,onEnterRescheduleDelayMinutes:d.onEnterRescheduleDelayMinutes,onEnterRescheduleOnTokenLimit:d.onEnterRescheduleOnTokenLimit,onEnterRescheduleOnServiceError:d.onEnterRescheduleOnServiceError,onEnterMaxRescheduleCount:d.onEnterMaxRescheduleCount,onEnterMaxTotalTokens:d.onEnterMaxTotalTokens,onEnterRescheduleAtTokenCount:d.onEnterRescheduleAtTokenCount}}async function ve(d,s,y,he){var M;if(y===s||y<0)return;const B=(M=l.board)==null?void 0:M.lanes;if(!B||B.length<=1)return;const k=B.map(w=>w.id);k.splice(s,1),k.splice(y,0,d.id),await l.reorderLanes(he,k)}async function D(){if(!(!m.lane||!P.value)){S.value=!0;try{const d={name:h.name.trim()};a.value==="template"?Object.assign(d,ae(h)):a.value==="prompt"?Object.assign(d,pe(h)):Object.assign(d,me()),await ve(m.lane,$.value,T.value,m.projectId),await l.updateLane(m.projectId,m.lane.id,d),R.success("Lane settings saved"),p("updated"),te()}catch(d){console.error("Failed to save lane settings:",d),R.error(d.message||"Failed to save lane settings")}finally{S.value=!1}}}async function U(){if(m.lane&&confirm(`Are you sure you want to delete the "${m.lane.name}" lane? This cannot be undone.`)){r.value=!0;try{await l.deleteLane(m.projectId,m.lane.id),R.success("Lane deleted"),p("deleted"),te()}catch(d){console.error("Failed to delete lane:",d),R.error(d.message||"Failed to delete lane")}finally{r.value=!1}}}return ce(()=>m.isOpen,d=>{d&&(ee(),m.projectId&&E.projectTemplates.length===0&&E.globalTemplates.length===0&&E.fetchProjectTemplates(m.projectId))},{immediate:!0}),ce(()=>m.lane,()=>{m.isOpen&&ee()}),ce(()=>{var d;return(d=l.board)==null?void 0:d.lanes},d=>{if(m.isOpen&&m.lane&&d){const s=d.findIndex(y=>y.id===m.lane.id);s>=0&&($.value=s,T.value=s)}},{deep:!0}),(d,s)=>u.isOpen?(t(),o("div",{key:0,class:"modal-backdrop",onClick:de(te,["self"])},[e("div",Rn,[e("div",{class:"modal-header"},[s[22]||(s[22]=e("h2",{class:"modal-title"}," Lane Settings ",-1)),e("button",{class:"close-btn","aria-label":"Close",onClick:te}," × ")]),e("div",An,[e("div",xn,[s[23]||(s[23]=e("label",{for:"lane-name",class:"form-label"},"Lane Name",-1)),G(e("input",{id:"lane-name","onUpdate:modelValue":s[0]||(s[0]=y=>h.name=y),type:"text",class:"form-input",placeholder:"Enter lane name"},null,512),[[ye,h.name]])]),n.value>1?(t(),o("div",Ln,[s[26]||(s[26]=e("label",{class:"form-label"},"Position",-1)),e("div",On,[e("button",{class:"btn btn-icon",disabled:f.value<=0,title:"Move left",onClick:s[1]||(s[1]=y=>oe(f.value-1))},[...s[24]||(s[24]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"15 18 9 12 15 6"})],-1)])],8,Bn),e("span",Pn,F(f.value+1)+" of "+F(n.value),1),e("button",{class:"btn btn-icon",disabled:f.value>=n.value-1,title:"Move right",onClick:s[2]||(s[2]=y=>oe(f.value+1))},[...s[25]||(s[25]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"9 18 15 12 9 6"})],-1)])],8,Un)])])):C("",!0),e("div",Dn,[s[30]||(s[30]=e("label",{class:"form-label"},"On-Enter Automation",-1)),e("div",Vn,[e("label",Nn,[G(e("input",{"onUpdate:modelValue":s[3]||(s[3]=y=>a.value=y),type:"radio",value:"none",name:"automation"},null,512),[[xe,a.value]]),s[27]||(s[27]=e("span",null,"None",-1))]),e("label",In,[G(e("input",{"onUpdate:modelValue":s[4]||(s[4]=y=>a.value=y),type:"radio",value:"template",name:"automation"},null,512),[[xe,a.value]]),s[28]||(s[28]=e("span",null,"Run a template",-1))]),e("label",Kn,[G(e("input",{"onUpdate:modelValue":s[5]||(s[5]=y=>a.value=y),type:"radio",value:"prompt",name:"automation"},null,512),[[xe,a.value]]),s[29]||(s[29]=e("span",null,"Run a custom prompt",-1))])])]),a.value==="template"?(t(),o("div",Gn,[s[32]||(s[32]=e("label",{for:"template-select",class:"form-label"},"Select Template",-1)),G(e("select",{id:"template-select","onUpdate:modelValue":s[6]||(s[6]=y=>h.onEnterTemplateId=y),class:"form-input"},[s[31]||(s[31]=e("option",{value:null}," Select a template... ",-1)),I.value.length?(t(),o("optgroup",Hn,[(t(!0),o(X,null,Z(I.value,y=>(t(),o("option",{key:y.id,value:y.id},F(y.name),9,qn))),128))])):C("",!0),Y.value.length?(t(),o("optgroup",Wn,[(t(!0),o(X,null,Z(Y.value,y=>(t(),o("option",{key:y.id,value:y.id},F(y.name),9,zn))),128))])):C("",!0)],512),[[we,h.onEnterTemplateId]]),s[33]||(s[33]=e("p",{class:"form-help"}," When a session enters this lane, the selected template will automatically run. ",-1))])):C("",!0),a.value==="prompt"?(t(),o("div",Yn,[s[34]||(s[34]=e("label",{for:"custom-prompt",class:"form-label"},"Custom Prompt",-1)),Q(it,{id:"custom-prompt",ref_key:"promptTextareaRef",ref:j,modelValue:h.onEnterPrompt,"onUpdate:modelValue":s[7]||(s[7]=y=>h.onEnterPrompt=y),class:"form-input form-textarea",placeholder:"Enter the prompt to run when a session enters this lane...",rows:"4","min-height":80},null,8,["modelValue"]),e("div",Jn,[Q(ze),L.value?(t(),ne(ut,{key:0,onOpen:s[8]||(s[8]=y=>i.value=!0)})):C("",!0)])])):C("",!0),a.value==="prompt"?(t(),ne(ct,{key:3,"is-open":i.value,"onUpdate:isOpen":s[9]||(s[9]=y=>i.value=y),"working-directory":L.value||"",mode:"insert","hide-builtin":!0,onInsert:ie},null,8,["is-open","working-directory"])):C("",!0),a.value==="prompt"?(t(),o("div",Qn,[e("button",{type:"button",class:"section-toggle",onClick:s[10]||(s[10]=y=>g.value=!g.value)},[e("span",{class:re(["toggle-chevron",{open:g.value}])},"▶",2),s[35]||(s[35]=ue(" Session Settings ",-1))]),g.value?(t(),o("div",Xn,[Q(dt,{mode:h.onEnterMode||"standard",model:h.onEnterModel,"effort-level":h.onEnterEffortLevel,"thinking-enabled":h.onEnterThinkingEnabled??!1,"hide-start-immediately":!0,"onUpdate:mode":s[11]||(s[11]=y=>h.onEnterMode=y),"onUpdate:model":s[12]||(s[12]=y=>h.onEnterModel=y),"onUpdate:effortLevel":s[13]||(s[13]=y=>h.onEnterEffortLevel=y),"onUpdate:thinkingEnabled":s[14]||(s[14]=y=>h.onEnterThinkingEnabled=y)},null,8,["mode","model","effort-level","thinking-enabled"]),e("div",Zn,[e("label",eo,[e("label",to,[G(e("input",{"onUpdate:modelValue":s[15]||(s[15]=y=>h.onEnterAutoRescheduleEnabled=y),type:"checkbox"},null,512),[[Le,h.onEnterAutoRescheduleEnabled]]),s[36]||(s[36]=e("span",{class:"toggle-slider"},null,-1))]),s[37]||(s[37]=e("span",{class:"toggle-label"},"Auto-reschedule on errors",-1))])]),h.onEnterAutoRescheduleEnabled?(t(),o("div",so,[e("div",no,[s[40]||(s[40]=e("p",{class:"settings-label"}," Reschedule Triggers ",-1)),e("label",oo,[G(e("input",{"onUpdate:modelValue":s[16]||(s[16]=y=>h.onEnterRescheduleOnTokenLimit=y),type:"checkbox"},null,512),[[Le,h.onEnterRescheduleOnTokenLimit]]),s[38]||(s[38]=e("span",null,"Token limit errors",-1))]),e("label",ao,[G(e("input",{"onUpdate:modelValue":s[17]||(s[17]=y=>h.onEnterRescheduleOnServiceError=y),type:"checkbox"},null,512),[[Le,h.onEnterRescheduleOnServiceError]]),s[39]||(s[39]=e("span",null,"Service unavailability",-1))])]),e("div",lo,[s[42]||(s[42]=e("label",{class:"form-label"},"Reschedule Delay",-1)),G(e("select",{"onUpdate:modelValue":s[18]||(s[18]=y=>h.onEnterRescheduleDelayMinutes=y),class:"form-input"},[...s[41]||(s[41]=[e("option",{value:5}," 5 minutes ",-1),e("option",{value:15}," 15 minutes ",-1),e("option",{value:30}," 30 minutes ",-1),e("option",{value:60}," 1 hour ",-1),e("option",{value:120}," 2 hours ",-1)])],512),[[we,h.onEnterRescheduleDelayMinutes,void 0,{number:!0}]])]),e("div",ro,[s[43]||(s[43]=e("label",{class:"form-label"},"Max Reschedule Count",-1)),G(e("input",{"onUpdate:modelValue":s[19]||(s[19]=y=>h.onEnterMaxRescheduleCount=y),type:"number",min:"1",max:"100",class:"form-input",placeholder:"Unlimited"},null,512),[[ye,h.onEnterMaxRescheduleCount,void 0,{number:!0}]])]),e("div",io,[s[44]||(s[44]=e("label",{class:"form-label"},"Max Total Tokens",-1)),G(e("input",{"onUpdate:modelValue":s[20]||(s[20]=y=>h.onEnterMaxTotalTokens=y),type:"number",min:"1000",step:"1000",class:"form-input",placeholder:"Unlimited"},null,512),[[ye,h.onEnterMaxTotalTokens,void 0,{number:!0}]])]),e("div",uo,[s[45]||(s[45]=e("label",{class:"form-label"},"Reschedule At Token Count",-1)),G(e("input",{"onUpdate:modelValue":s[21]||(s[21]=y=>h.onEnterRescheduleAtTokenCount=y),type:"number",min:"10000",step:"10000",class:"form-input",placeholder:"None"},null,512),[[ye,h.onEnterRescheduleAtTokenCount,void 0,{number:!0}]])])])):C("",!0)])):C("",!0)])):C("",!0),e("div",co,[s[46]||(s[46]=e("h4",{class:"danger-title"}," Danger Zone ",-1)),s[47]||(s[47]=e("p",{class:"danger-description"}," Deleting this lane will remove all cards from it. Sessions will remain in the project. ",-1)),e("button",{class:"btn btn-danger",disabled:r.value,onClick:U},F(r.value?"Deleting...":"Delete Lane"),9,mo)])]),e("div",po,[e("button",{class:"btn btn-secondary",onClick:te}," Cancel "),e("button",{class:"btn btn-primary",disabled:S.value||!P.value,onClick:D},F(S.value?"Saving...":"Save Changes"),9,vo)])])])):C("",!0)}},ho=Se(fo,[["__scopeId","data-v-93f5604f"]]),bo={class:"kanban-board"},go={key:0,class:"kanban-loading"},yo={key:1,class:"kanban-error"},ko={key:2,class:"kanban-empty"},So={key:3,class:"kanban-lanes-container"},$o=["onDragover","onDrop"],Co={class:"lane-header"},wo={class:"lane-title-row"},Eo={class:"lane-title"},_o={key:0,class:"lane-automation-indicator",title:"Automation enabled"},To={class:"lane-header-actions"},jo={class:"lane-count"},Fo=["onClick"],Mo={class:"lane-cards"},Ro={key:0,class:"card-drop-indicator"},Ao=["onDragstart","onDragover"],xo={class:"card-header"},Lo={class:"card-title"},Oo={class:"card-meta"},Bo={key:0,class:"card-mode"},Po={class:"card-reorder-arrows"},Uo=["onClick"],Do=["onClick"],Vo=["onClick"],No=["onClick"],Io={key:0,class:"card-drop-indicator"},Ko={key:1,class:"lane-empty"},Go={class:"lane-footer"},Ho={key:0,class:"lane-automation"},qo={key:1,class:"lane-automation"},Wo=["onClick"],zo={class:"add-lane-container"},Yo={key:1,class:"add-lane-form"},Jo={__name:"KanbanBoard",props:{projectId:{type:String,required:!0}},setup(u){const c=u,m=Me(),p=A(!1),l=A(""),E=A(null),R=A(null),_=A(null),S=A(-1),r=A(null),a=A(-1),g=A(!1),i=A(null),j=A(!1),$=A(null),T=A(!1),h=A(null),I=A(null),Y=V(()=>m.board),L=V(()=>m.loading),f=V(()=>m.error),n=async()=>{try{await m.fetchBoard(c.projectId)}catch(M){console.error("Failed to fetch kanban board:",M)}},P=M=>{switch(M){case"running":case"starting":return"●";case"waiting":return"◐";case"completed":return"✓";case"error":return"✕";case"stopped":return"■";case"scheduled":return"⏰";default:return"○"}},b=(M,w,W,N)=>{E.value="card",R.value=w,_.value=W,S.value=N;const z=M.dataTransfer;z.effectAllowed="move",z.setData("text/plain",w.id)},H=(M,w,W)=>{if(E.value!=="card")return;const N=M.currentTarget.getBoundingClientRect(),z=N.top+N.height/2,se=M.clientY<z?W:W+1;w===_.value&&(se===S.value||se===S.value+1)?(r.value=null,a.value=-1):(r.value=w,a.value=se)},J=()=>{E.value=null,R.value=null,_.value=null,S.value=-1,r.value=null,a.value=-1},q=async(M,w,W)=>{var fe,le;const N=(le=(fe=Y.value)==null?void 0:fe.lanes)==null?void 0:le.find(x=>x.id===M);if(!(N!=null&&N.cards))return;let z=W>=0?W:N.cards.length;if(z>w&&z--,z===w)return;const se=N.cards.map(x=>x.id),[be]=se.splice(w,1);se.splice(z,0,be);try{await m.reorderCards(c.projectId,M,se)}catch(x){console.error("Failed to reorder cards:",x)}},ee=async(M,w)=>{try{await m.moveCard(c.projectId,M,w,{runOnEnterTemplate:!0})}catch(W){console.error("Failed to move card:",W)}},te=async(M,w)=>{if(M.preventDefault(),E.value!=="card"||!R.value){J();return}const W=M.dataTransfer.getData("text/plain");if(!W){J();return}_.value===w?await q(w,S.value,a.value):await ee(W,w),J()},ie=async(M,w,W)=>{var be,fe;const N=(fe=(be=Y.value)==null?void 0:be.lanes)==null?void 0:fe.find(le=>le.id===M);if(!(N!=null&&N.cards))return;const z=N.cards.map(le=>le.id),[se]=z.splice(w,1);z.splice(W,0,se);try{await m.reorderCards(c.projectId,M,z)}catch(le){console.error("Failed to reorder cards:",le)}},oe=async M=>{if(confirm("Remove this session from the board?"))try{await m.removeCard(c.projectId,M)}catch(w){console.error("Failed to remove card:",w)}},me=async()=>{if(l.value.trim())try{await m.createLane(c.projectId,{name:l.value.trim()}),ae()}catch(M){console.error("Failed to add lane:",M)}},ae=()=>{p.value=!1,l.value=""},pe=M=>{i.value=M,g.value=!0},ve=()=>{g.value=!1,i.value=null},D=()=>{},U=M=>{$.value=M,j.value=!0},d=()=>{j.value=!1,$.value=null},s=()=>{},y=()=>{d()},he=(M,w)=>{h.value=M,I.value=w,T.value=!0},B=()=>{T.value=!1,h.value=null,I.value=null},k=()=>{B()};return ce(()=>c.projectId,M=>{M&&n()},{immediate:!0}),Pe(()=>{c.projectId&&n()}),(M,w)=>{var N,z,se,be,fe,le;const W=Fe("router-link");return t(),o("div",bo,[L.value?(t(),o("div",go,[...w[5]||(w[5]=[e("span",{class:"loading-spinner"},null,-1),ue(" Loading board... ",-1)])])):f.value?(t(),o("div",yo,[w[6]||(w[6]=e("span",{class:"error-icon"},"!",-1)),ue(" "+F(f.value)+" ",1),e("button",{class:"retry-btn",onClick:n}," Retry ")])):Y.value?(t(),o("div",So,[(t(!0),o(X,null,Z(Y.value.lanes,x=>{var Ee,_e,Te;return t(),o("div",{key:x.id,class:"kanban-lane",onDragover:de(K=>{var O;return H(K,x.id,((O=x.cards)==null?void 0:O.length)||0)},["prevent"]),onDrop:K=>te(K,x.id)},[e("div",Co,[e("div",wo,[e("h3",Eo,F(x.name),1),x.onEnterTemplateId||x.onEnterPrompt?(t(),o("span",_o,[...w[8]||(w[8]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"currentColor"},[e("path",{d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1)])])):C("",!0)]),e("div",To,[e("span",jo,F(((Ee=x.cards)==null?void 0:Ee.length)||0),1),e("button",{class:"lane-settings-btn",title:"Lane settings",onClick:K=>U(x)},[...w[9]||(w[9]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[e("circle",{cx:"12",cy:"12",r:"3"}),e("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"})],-1)])],8,Fo)])]),e("div",Mo,[(t(!0),o(X,null,Z(x.cards,(K,O)=>{var ke,Ae;return t(),o(X,{key:K.id},[E.value==="card"&&r.value===x.id&&a.value===O?(t(),o("div",Ro)):C("",!0),e("div",{class:re(["kanban-card",{dragging:E.value==="card"&&((ke=R.value)==null?void 0:ke.id)===K.id}]),draggable:"true",onDragstart:de(Ce=>b(Ce,K,x.id,O),["stop"]),onDragover:de(Ce=>H(Ce,x.id,O),["prevent","stop"]),onDragend:J},[(Ae=K.sessions)!=null&&Ae[0]?(t(),ne(W,{key:0,to:`/sessions/${K.sessions[0].id}`,class:"card-link"},{default:ge(()=>[e("div",xo,[e("span",{class:re(["card-status",`status-${K.sessions[0].status}`])},F(P(K.sessions[0].status)),3),e("h4",Lo,F(K.sessions[0].name),1)]),e("div",Oo,[K.sessions[0].mode?(t(),o("span",Bo,F(K.sessions[0].mode),1)):C("",!0)])]),_:2},1032,["to"])):C("",!0),e("div",Po,[O>0?(t(),o("button",{key:0,class:"card-reorder-btn",title:"Move card up",onClick:de(Ce=>ie(x.id,O,O-1),["prevent"])},[...w[10]||(w[10]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"18 15 12 9 6 15"})],-1)])],8,Uo)):C("",!0),O<x.cards.length-1?(t(),o("button",{key:1,class:"card-reorder-btn",title:"Move card down",onClick:de(Ce=>ie(x.id,O,O+1),["prevent"])},[...w[11]||(w[11]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"6 9 12 15 18 9"})],-1)])],8,Do)):C("",!0)]),e("button",{class:"card-move-btn",title:"Move to lane",onClick:de(Ce=>he(K,x.id),["prevent"])},[...w[12]||(w[12]=[Ue('<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 4 19 4 19 8"></polyline><line x1="14" y1="10" x2="19" y2="4"></line><polyline points="9 20 5 20 5 16"></polyline><line x1="10" y1="14" x2="5" y2="20"></line></svg>',1)])],8,Vo),e("button",{class:"card-remove-btn",title:"Remove from board",onClick:de(Ce=>oe(K.id),["prevent"])}," × ",8,No)],42,Ao)],64)}),128)),E.value==="card"&&r.value===x.id&&a.value===(((_e=x.cards)==null?void 0:_e.length)||0)?(t(),o("div",Io)):C("",!0),(Te=x.cards)!=null&&Te.length?C("",!0):(t(),o("div",Ko,[...w[13]||(w[13]=[e("span",null,"Drop sessions here",-1)])]))]),e("div",Go,[x.onEnterTemplateId?(t(),o("span",Ho," Auto: triggers template on entry ")):x.onEnterPrompt?(t(),o("span",qo," Auto: runs custom prompt on entry ")):C("",!0),e("button",{class:"add-session-btn",onClick:K=>pe(x)}," + Add Session ",8,Wo)])],40,$o)}),128)),e("div",zo,[p.value?(t(),o("div",Yo,[G(e("input",{"onUpdate:modelValue":w[1]||(w[1]=x=>l.value=x),type:"text",placeholder:"Lane name...",class:"add-lane-input",onKeyup:[Ve(me,["enter"]),Ve(ae,["escape"])]},null,544),[[ye,l.value]]),e("div",{class:"add-lane-actions"},[e("button",{class:"add-lane-confirm",onClick:me}," Add "),e("button",{class:"add-lane-cancel",onClick:ae}," Cancel ")])])):(t(),o("button",{key:0,class:"add-lane-btn",onClick:w[0]||(w[0]=x=>p.value=!0)}," + Add Lane "))])])):(t(),o("div",ko,[...w[7]||(w[7]=[e("p",null,"Kanban board is not available for this project.",-1)])])),Q(Je,{"is-open":g.value,"project-id":u.projectId,"lane-id":(N=i.value)==null?void 0:N.id,"lane-name":(z=i.value)==null?void 0:z.name,"onUpdate:isOpen":w[2]||(w[2]=x=>g.value=x),onClose:ve,onAdded:D},null,8,["is-open","project-id","lane-id","lane-name"]),Q(ho,{"is-open":j.value,"project-id":u.projectId,lane:$.value,"onUpdate:isOpen":w[3]||(w[3]=x=>j.value=x),onClose:d,onUpdated:s,onDeleted:y},null,8,["is-open","project-id","lane"]),Q(ot,{"is-open":T.value,"project-id":u.projectId,"card-id":(se=h.value)==null?void 0:se.id,"current-lane-id":I.value,"session-name":(le=(fe=(be=h.value)==null?void 0:be.sessions)==null?void 0:fe[0])==null?void 0:le.name,"onUpdate:isOpen":w[4]||(w[4]=x=>T.value=x),onClose:B,onMoved:k},null,8,["is-open","project-id","card-id","current-lane-id","session-name"])])}}},Qo={class:"container"},Xo={class:"page-header"},Zo={class:"project-title"},ea=["href"],ta={class:"tabs"},sa={class:"tabs-desktop"},na={class:"tabs-left"},oa={class:"tabs-mobile"},aa=["value"],la={key:0,value:"kanban"},ra={key:2,class:"tab-spacer"},ia={key:3},da={key:0,class:"skeleton-list"},ua={key:1,class:"error-message"},ca={key:2,class:"empty-state"},ma={key:3,class:"empty-state"},pa={key:4,class:"session-list"},va={key:5},fa={key:6},ha={class:"modal-content lane-selector-modal"},ba={class:"modal-body"},ga={class:"modal-description"},ya={class:"lane-options"},ka=["onClick"],Sa={class:"lane-option-name"},$a={class:"lane-option-count"},Ca={key:0,class:"empty-lanes"},Va={__name:"SessionListView",setup(u){const c=et(),m=Ke(),p=De(),l=$e(),E=Me(),R=Ge();vt(),R.restoreCollapsedLogState();const _=V(()=>{switch(c.name){case"ArchivedSessions":return"archived";case"ProjectTemplates":return"templates";case"ProjectCommands":return"commands";case"ScheduledSessions":return"scheduled";case"ProjectKanban":return"kanban";default:return"sessions"}});function S(B){const k=c.params.id,M={sessions:`/projects/${k}/sessions`,archived:`/projects/${k}/archived`,templates:`/projects/${k}/templates`,commands:`/projects/${k}/commands`,scheduled:`/projects/${k}/scheduled`,kanban:`/projects/${k}/kanban`};m.push(M[B])}const r=V(()=>c.params.id),{summaries:a,loadingSummaries:g,summaryErrors:i,fetchSummariesBatch:j,retryFetchSummary:$,updateSummary:T,cleanupSummary:h}=mt(),{filteredGroupedSessions:I}=Ye(),{archivedLoaded:Y}=pt(r,{fetchSummariesBatch:j,updateSummary:T,cleanupSummary:h}),L=V(()=>l.scheduledSessions||[]),f=V(()=>l.loadingScheduled||!1);let n=null;ce(()=>l.sessions,()=>{clearTimeout(n),n=setTimeout(()=>{j(l.sessions)},400)}),ce(()=>c.name,async B=>{B==="ArchivedSessions"?await P():B==="ScheduledSessions"&&await H()},{immediate:!0}),ce(()=>l.starredFilter,async(B,k)=>{_.value==="archived"&&Y.value&&B!==k&&(await l.fetchArchivedSessions(r.value,{reset:!0}),j(l.archivedSessions))});async function P(){Y.value||(await l.fetchArchivedSessions(r.value,{reset:!0}),Y.value=!0,j(l.archivedSessions))}async function b(){await l.loadMoreArchivedSessions(r.value),j(l.archivedSessions)}async function H(){await l.fetchScheduledSessions(r.value)}const J=A(!1),q=A(null),ee=A(!1);function te(B){const k=l.sessions.find(M=>M.id===B);q.value=k||{id:B},J.value=!0}async function ie(B){if(q.value){ee.value=!0;try{await l.archiveSession(q.value.id,{cleanup:B}),ae.success("Session archived")}catch(k){ae.error(k.message||"Failed to archive session")}finally{ee.value=!1,J.value=!1,q.value=null}}}function oe(){J.value=!1,q.value=null}async function me(B){try{await l.unarchiveSession(B)}catch(k){console.error("Failed to unarchive session:",k)}}const ae=je(),pe=A(!1),ve=A(null),D=A(!1),U=A(null);function d(B){U.value=B,D.value=!0}function s(){D.value=!1,U.value=null}async function y(B){if(!(!U.value||!B))try{await E.addSessionToBoard(c.params.id,U.value.id,B.id),ae.success(`Session added to "${B.name}"`),s()}catch(k){console.error("Failed to add session to board:",k),ae.error(k.message||"Failed to add session to board")}}function he(){pe.value=!1,ve.value=null}return Pe(()=>{l.restoreStatusFilter(),l.restoreStarredFilter(),l.restoreScheduledFilter();const B=c.params.id;B&&E.fetchBoard(B).catch(k=>{console.warn("Failed to fetch kanban board:",k)})}),Be(()=>{clearTimeout(n)}),(B,k)=>{var w,W,N,z,se,be,fe,le,x,Ee,_e,Te,K;const M=Fe("router-link");return t(),o("div",Qo,[e("div",Xo,[e("div",null,[e("div",Zo,[e("h1",null,F(((w=v(p).currentProject)==null?void 0:w.name)||"Sessions"),1),(W=v(p).currentProject)!=null&&W.repoUrl?(t(),o("a",{key:0,href:v(p).currentProject.repoUrl,target:"_blank",rel:"noopener noreferrer",class:"repo-link",title:"Open repository"},[...k[8]||(k[8]=[e("svg",{class:"repo-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6m4-3l6 6m0 0l-6 6m6-6H9"})],-1)])],8,ea)):C("",!0),Q(M,{to:`/projects/${v(c).params.id}/edit`,class:"settings-link",title:"Project settings"},{default:ge(()=>[...k[9]||(k[9]=[e("svg",{class:"settings-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M12.22 2h-.44a2 2 0 00-2 2v.18a2 2 0 01-1 1.73l-.43.25a2 2 0 01-2 0l-.15-.08a2 2 0 00-2.73.73l-.22.38a2 2 0 00.73 2.73l.15.1a2 2 0 011 1.72v.51a2 2 0 01-1 1.74l-.15.09a2 2 0 00-.73 2.73l.22.38a2 2 0 002.73.73l.15-.08a2 2 0 012 0l.43.25a2 2 0 011 1.73V20a2 2 0 002 2h.44a2 2 0 002-2v-.18a2 2 0 011-1.73l.43-.25a2 2 0 012 0l.15.08a2 2 0 002.73-.73l.22-.39a2 2 0 00-.73-2.73l-.15-.08a2 2 0 01-1-1.74v-.5a2 2 0 011-1.74l.15-.09a2 2 0 00.73-2.73l-.22-.38a2 2 0 00-2.73-.73l-.15.08a2 2 0 01-2 0l-.43-.25a2 2 0 01-1-1.73V4a2 2 0 00-2-2z"}),e("circle",{cx:"12",cy:"12",r:"3"})],-1)])]),_:1},8,["to"])])]),_.value==="sessions"?(t(),ne(M,{key:0,to:`/projects/${v(c).params.id}/sessions/new`,class:"btn btn-primary mobile-only"},{default:ge(()=>[...k[10]||(k[10]=[ue(" + Session ",-1)])]),_:1},8,["to"])):C("",!0)]),e("div",ta,[e("div",sa,[e("div",na,[e("button",{class:re(["tab",{active:_.value==="sessions"}]),onClick:k[0]||(k[0]=O=>v(m).push(`/projects/${v(c).params.id}/sessions`))}," Sessions ",2),e("button",{class:re(["tab",{active:_.value==="archived"}]),onClick:k[1]||(k[1]=O=>v(m).push(`/projects/${v(c).params.id}/archived`))}," Archived ",2),e("button",{class:re(["tab",{active:_.value==="templates"}]),onClick:k[2]||(k[2]=O=>v(m).push(`/projects/${v(c).params.id}/templates`))}," Templates ",2),e("button",{class:re(["tab",{active:_.value==="commands"}]),onClick:k[3]||(k[3]=O=>v(m).push(`/projects/${v(c).params.id}/commands`))}," Commands ",2),e("button",{class:re(["tab",{active:_.value==="scheduled"}]),onClick:k[4]||(k[4]=O=>v(m).push(`/projects/${v(c).params.id}/scheduled`))}," Scheduled ",2),(N=v(p).currentProject)!=null&&N.kanbanEnabled?(t(),o("button",{key:0,class:re(["tab",{active:_.value==="kanban"}]),onClick:k[5]||(k[5]=O=>v(m).push(`/projects/${v(c).params.id}/kanban`))}," Kanban ",2)):C("",!0)]),_.value==="sessions"?(t(),ne(M,{key:0,to:`/projects/${v(c).params.id}/sessions/new`,class:"btn btn-primary desktop-only","aria-label":"New Session"},{default:ge(()=>[...k[11]||(k[11]=[e("span",{class:"add-session-label-full"},"+ Session",-1),e("span",{class:"add-session-label-short"},"+",-1)])]),_:1},8,["to"])):C("",!0)]),e("div",oa,[e("select",{value:_.value,class:"tab-select",onChange:k[6]||(k[6]=O=>S(O.target.value))},[k[12]||(k[12]=Ue('<option value="sessions"> Sessions </option><option value="archived"> Archived </option><option value="templates"> Templates </option><option value="commands"> Commands </option><option value="scheduled"> Scheduled </option>',5)),(z=v(p).currentProject)!=null&&z.kanbanEnabled?(t(),o("option",la," Kanban ")):C("",!0)],40,aa)])]),_.value==="sessions"?(t(),ne(Ne,{key:0,"show-status-filters":!0,"show-scheduled-filter":!0})):_.value==="archived"?(t(),ne(Ne,{key:1,"show-status-filters":!1,"show-scheduled-filter":!1})):(t(),o("div",ra)),_.value==="sessions"?(t(),o("div",ia,[v(l).loading?(t(),o("div",da,[(t(),o(X,null,Z(3,O=>e("div",{key:O,class:"skeleton card",style:{height:"120px"}})),64))])):v(l).error?(t(),o("div",ua,F(v(l).error),1)):v(l).sessions.length===0?(t(),o("div",ca,[k[14]||(k[14]=e("p",null,"No sessions yet. Start a new session to interact with Claude.",-1)),Q(M,{to:`/projects/${v(c).params.id}/sessions/new`,class:"btn btn-primary"},{default:ge(()=>[...k[13]||(k[13]=[ue(" New Session ",-1)])]),_:1},8,["to"])])):v(I).length===0?(t(),o("div",ma,[...k[15]||(k[15]=[e("p",null,"No sessions match the current filter.",-1)])])):(t(),o("div",pa,[(t(!0),o(X,null,Z(v(I),O=>{var ke;return t(),ne(qe,{key:O.parent.id,session:O.parent,"show-summary":!0,summary:v(a)[O.parent.id],"summary-loading":v(g)[O.parent.id],"summary-error":v(i)[O.parent.id],"show-archive":!0,"kanban-enabled":((ke=v(p).currentProject)==null?void 0:ke.kanbanEnabled)??!0,"pr-url":O.parent.prUrl,"pr-summary":v(a)[O.parent.id],onRetrySummary:v($),onArchive:te,onAddToBoard:d},null,8,["session","summary","summary-loading","summary-error","kanban-enabled","pr-url","pr-summary","onRetrySummary"])}),128))]))])):C("",!0),_.value==="archived"?(t(),ne(Ut,{key:4,summaries:v(a),"loading-summaries":v(g),"summary-errors":v(i),onRetrySummary:v($),onUnarchive:me,onLoadMore:b},null,8,["summaries","loading-summaries","summary-errors","onRetrySummary"])):C("",!0),_.value==="templates"?(t(),o("div",va,[Q(Ys,{"project-id":v(c).params.id},null,8,["project-id"])])):C("",!0),_.value==="commands"?(t(),o("div",fa,[Q(cn,{"project-id":v(c).params.id},null,8,["project-id"])])):C("",!0),_.value==="scheduled"?(t(),ne(ls,{key:7,sessions:L.value,loading:f.value},null,8,["sessions","loading"])):C("",!0),_.value==="kanban"?(t(),ne(Jo,{key:8,"project-id":v(c).params.id},null,8,["project-id"])):C("",!0),Q(Je,{"is-open":pe.value,"project-id":v(c).params.id,"lane-id":(se=ve.value)==null?void 0:se.id,"lane-name":(be=ve.value)==null?void 0:be.name,"onUpdate:isOpen":k[7]||(k[7]=O=>pe.value=O),onClose:he},null,8,["is-open","project-id","lane-id","lane-name"]),D.value?(t(),o("div",{key:9,class:"modal-backdrop",onClick:de(s,["self"])},[e("div",ha,[e("div",{class:"modal-header"},[k[16]||(k[16]=e("h2",{class:"modal-title"}," Add to Kanban Board ",-1)),e("button",{class:"close-btn","aria-label":"Close",onClick:s}," × ")]),e("div",ba,[e("p",ga,' Select a lane to add "'+F((fe=U.value)==null?void 0:fe.name)+'" to: ',1),e("div",ya,[(t(!0),o(X,null,Z((le=v(E).board)==null?void 0:le.lanes,O=>{var ke;return t(),o("button",{key:O.id,class:"lane-option-btn",onClick:Ae=>y(O)},[e("span",Sa,F(O.name),1),e("span",$a,F(((ke=O.cards)==null?void 0:ke.length)||0)+" cards",1)],8,ka)}),128))]),(Ee=(x=v(E).board)==null?void 0:x.lanes)!=null&&Ee.length?C("",!0):(t(),o("p",Ca," No lanes available. Go to the Kanban tab to create lanes first. "))]),e("div",{class:"modal-footer"},[e("button",{class:"btn btn-secondary",onClick:s}," Cancel ")])])])):C("",!0),Q(at,{"is-open":J.value,"session-name":((_e=q.value)==null?void 0:_e.name)||"this session","has-cleanup-script":!!((Te=v(p).currentProject)!=null&&Te.onSessionDeleted&&!((K=q.value)!=null&&K.parentSessionId)),loading:ee.value,onConfirm:ie,onCancel:oe},null,8,["is-open","session-name","has-cleanup-script","loading"])])}}};export{Va as default};
1
+ import{l as me,y as Ae,x as V,z as Ie,A as Be,n as A,B as Qe,C as Xe,_ as Ce,a as t,c as o,b as e,F as X,r as Z,u as v,E as ie,t as F,i as C,G as oe,k as Fe,g as Me,d as Q,w as ye,o as Pe,m as G,v as ke,p as Ee,f as ce,j as ue,h as Ke,e as Ue,H as xe,q as Le,I as Ze,J as Ve,s as et}from"./index-MnvuyUxj.js";import{u as De}from"./projects-BpAyb9ba.js";import{u as we}from"./sessions-GqIMf9RF.js";import{u as Re,a as Ge,f as tt,b as st}from"./SessionLogStream-DMUzZOml.js";import{a as Oe}from"./ApiClient-CcqJ-GAv.js";import{u as He}from"./commandButtons-BqI7V84_.js";import{S as qe}from"./SessionCard-D9a5ABHO.js";import{S as nt,M as ot,A as at}from"./ArchiveConfirmModal-NDLcfHE9.js";import{u as We}from"./EffortLevelSelector-B9STpy07.js";import{u as lt}from"./providers-Di1AKmPp.js";import{M as rt}from"./ModelSelector-vRSpXjhL.js";import{I as ze}from"./InterpolationHelp-Cwyt_Kff.js";import{R as it}from"./ResizableTextarea-BIUrLAki.js";import{S as dt}from"./SessionFormOptions-16tOEDkt.js";import{S as ut,a as ct}from"./SlashCommandWizard-CCEtEF98.js";import"./settings-j6pMR_H2.js";function mt(){const u=Ae({}),c=Ae({}),m=Ae({});async function p(r){const a=r.filter(g=>!u[g.id]&&!c[g.id]).map(g=>g.id);if(a.length!==0){for(const g of a)c[g]=!0,m[g]=!1;try{const g=await Oe.getSessionSummariesBatch(a);for(const i of a)g[i]&&(u[i]=g[i]),c[i]=!1}catch(g){console.warn("Failed to fetch summaries batch:",g.message);for(const i of a)m[i]=!0,c[i]=!1}}}async function l(r){var a;c[r]=!0,m[r]=!1;try{const g=await Oe.getSessionSummary(r);g&&(u[r]=g)}catch(g){((a=g.response)==null?void 0:a.status)!==404&&(console.warn(`Failed to fetch summary for session ${r}:`,g.message),m[r]=!0)}finally{c[r]=!1}}async function E(r){m[r]=!1,await l(r)}function R(r,a){u[r]=a,c[r]=!1,m[r]=!1}function _(r){delete u[r],delete c[r],delete m[r]}function S(r,a=400){let g=null;const i=me(r,()=>{clearTimeout(g),g=setTimeout(()=>{const j=r();p(j)},a)});return()=>{clearTimeout(g),i()}}return{summaries:u,loadingSummaries:c,summaryErrors:m,fetchSummariesBatch:p,fetchSummary:l,retryFetchSummary:E,updateSummary:R,cleanupSummary:_,watchSessionsForSummaries:S}}function Ye(){const u=we();function c(r){u.statusFilter===r?u.setStatusFilter(null):u.setStatusFilter(r)}function m(r){u.starredFilter===r?u.setStarredFilter(null):u.setStarredFilter(r)}function p(){u.starredFilter===null?u.setStarredFilter("starred"):u.starredFilter==="starred"?u.setStarredFilter("unstarred"):u.setStarredFilter(null)}const l=V(()=>u.starredFilter==="starred"?"Showing starred sessions only. Click to filter unstarred.":u.starredFilter==="unstarred"?"Showing unstarred sessions only. Click to show all.":"Showing all sessions. Click to filter by starred.");function E(){u.scheduledFilter===null?u.setScheduledFilter("scheduled"):u.scheduledFilter==="scheduled"?u.setScheduledFilter("not-scheduled"):u.setScheduledFilter(null)}const R=V(()=>u.scheduledFilter==="scheduled"?"Showing workflows with scheduled sessions. Click to filter non-scheduled.":u.scheduledFilter==="not-scheduled"?"Showing workflows without scheduled sessions. Click to show all.":"Showing all workflows. Click to filter by scheduled."),_=V(()=>{let r=u.groupedSessions;u.starredFilter==="starred"?r=r.filter($=>$.parent.starred):u.starredFilter==="unstarred"&&(r=r.filter($=>!$.parent.starred));const a=r.map($=>({group:$,status:u.getWorkflowAggregatedStatus($.parent.id)}));let g=a;u.scheduledFilter&&(g=a.filter(({status:$})=>{const T=$.scheduledCount>0;return u.scheduledFilter==="scheduled"?T:!T}));let i=0,j=0;for(const{status:$}of g)$.effectiveStatus==="running"?i++:j++;return{running:i,idle:j}}),S=V(()=>{let r=u.groupedSessions;return u.statusFilter&&(r=r.filter(a=>{const i=u.getWorkflowAggregatedStatus(a.parent.id).effectiveStatus;return u.statusFilter==="running"&&i==="running"||u.statusFilter==="idle"&&i==="idle"})),u.starredFilter==="starred"?r=r.filter(a=>a.parent.starred):u.starredFilter==="unstarred"&&(r=r.filter(a=>!a.parent.starred)),u.scheduledFilter&&(r=r.filter(a=>{const i=u.getWorkflowAggregatedStatus(a.parent.id).scheduledCount>0;return!!(u.scheduledFilter==="scheduled"&&i||u.scheduledFilter==="not-scheduled"&&!i)})),r});return{toggleFilter:c,toggleStarredFilter:m,toggleStarFilterIcon:p,starFilterTooltip:l,toggleScheduledFilterIcon:E,scheduledFilterTooltip:R,filteredGroupedSessions:S,statusFilterCounts:_}}function pt(u,c){const m=De(),p=we(),l=He(),E=Re(),{fetchSummariesBatch:R,updateSummary:_,cleanupSummary:S}=c,{onReconnect:r}=Ie();function a(f,n,B,b){var de;const q=l.runs[f],H=p.sessions.find(ae=>ae.id===n),ee=(de=H==null?void 0:H.latestCommandRuns)==null?void 0:de.find(ae=>ae.runId===f),te=(q==null?void 0:q.startedAt)||(ee==null?void 0:ee.startedAt)||Date.now();l.runs[f]||(l.runs[f]={runId:f,buttonId:B,sessionId:n,status:"running",output:"",exitCode:null,startedAt:te,outputTruncated:!1}),l.appendOutput(f,b),p.updateSessionCommandRun(n,B,{buttonId:B,status:"running",runId:f,startedAt:te})}function g({runId:f,sessionId:n,buttonId:B,exitCode:b,output:q}){l.runs[f]||(l.runs[f]={runId:f,buttonId:B,sessionId:n,status:"running",output:"",exitCode:null,startedAt:Date.now(),outputTruncated:!1}),l.completeRun(f,b,q);const J=b===0?"success":"error";p.updateSessionCommandRun(n,B,{buttonId:B,status:J,exitCode:b,runId:f,completedAt:Date.now()})}function i(f,n,B,b){l.runs[f]||(l.runs[f]={runId:f,buttonId:B,sessionId:n,status:"running",output:"",exitCode:null,startedAt:Date.now(),outputTruncated:!1}),l.errorRun(f,b),p.updateSessionCommandRun(n,B,{buttonId:B,status:"error",runId:f,completedAt:Date.now()})}function j(f,n,B){const{onSessionCreated:b,onSessionUpdated:q,onSessionDeleted:J,onSessionSummaryUpdated:H,onCommandRunOutput:ee,onCommandRunComplete:te,onCommandRunError:de,onCommandRunDeleted:ae,onKanbanBoardUpdated:pe,onKanbanCardMoved:le,onKanbanCardAdded:ve,onKanbanCardRemoved:fe}=f,D=[];return D.push(b(P=>{n.sessionsStore.addSessionToList(P)})),D.push(q(P=>{n.sessionsStore.updateSession(P)})),D.push(J(P=>{n.sessionsStore.removeSessionFromList(P),B.cleanupSummary(P)})),D.push(H((P,d)=>{B.updateSummary(P,d)})),D.push(ee(a)),D.push(te(g)),D.push(de(i)),D.push(ae((P,d,s)=>{n.commandButtonsStore.clearRun(P),n.sessionsStore.removeSessionCommandRun(d,s)})),D.push(pe(P=>{n.kanbanStore.handleBoardUpdated(P)})),D.push(le((P,d,s,y)=>{n.kanbanStore.handleCardMoved(P,d,s,y)})),D.push(ve((P,d)=>{n.kanbanStore.handleCardAdded(P,d)})),D.push(fe((P,d)=>{n.kanbanStore.handleCardRemoved(P,d)})),D}const $=[];let T=null;const h=A(!1);let I=0;const Y=3e4,L=async()=>{if(document.visibilityState!=="visible")return;const f=Date.now();if(f-I<Y)return;I=f;const n=u.value;n&&(await p.fetchSessions(n,{silent:!0}),R(p.sessions))};return document.addEventListener("visibilitychange",L),me(u,async f=>{if(!f)return;h.value=!1,$.forEach(D=>D()),$.length=0,T&&(T(),T=null),await m.fetchProject(f),await p.fetchSessions(f),await l.fetchButtons(f),R(p.sessions),I=Date.now();const{subscribe:n,unsubscribe:B,onSessionCreated:b,onSessionUpdated:q,onSessionDeleted:J,onSessionSummaryUpdated:H,onCommandRunOutput:ee,onCommandRunComplete:te,onCommandRunError:de,onCommandRunDeleted:ae,onKanbanBoardUpdated:pe,onKanbanCardMoved:le,onKanbanCardAdded:ve,onKanbanCardRemoved:fe}=Qe(f);T=B,n(),$.push(...j({onSessionCreated:b,onSessionUpdated:q,onSessionDeleted:J,onSessionSummaryUpdated:H,onCommandRunOutput:ee,onCommandRunComplete:te,onCommandRunError:de,onCommandRunDeleted:ae,onKanbanBoardUpdated:pe,onKanbanCardMoved:le,onKanbanCardAdded:ve,onKanbanCardRemoved:fe},{sessionsStore:p,commandButtonsStore:l,kanbanStore:E},{updateSummary:_,cleanupSummary:S})),$.push(r(async()=>{const D=u.value;D&&(I=Date.now(),await p.fetchSessions(D,{silent:!0}),R(p.sessions))}))},{immediate:!0}),Be(()=>{$.forEach(f=>f()),T&&T(),document.removeEventListener("visibilitychange",L)}),{archivedLoaded:h}}function vt(){const u=we(),c=Ge(),m=A({}),p={},l=new Map,E=4;function R(i,j=0){fetch(`/api/sessions/${i}/streaming-state`).then($=>$.ok?$.json():null).then($=>{var T;if($&&((T=$.workLogs)!=null&&T.length||$.partialText||$.thinking)){c.hydrateSessionState(i,$);const h=l.get(i);h&&(clearTimeout(h.timeout),l.delete(i))}else _(i,j)}).catch(()=>{_(i,j)})}function _(i,j=0){if(j>=E||!m.value[i])return;const $=u.sessions.find(I=>I.id===i);if(!$||!["running","starting"].includes($.status))return;const T=1500*Math.pow(2,j),h=setTimeout(()=>{l.delete(i),R(i,j+1)},T);l.set(i,{count:j,timeout:h})}function S(i){if(m.value[i])return;const j=Xe(i),$=[];$.push(j.onWorkLog(T=>{c.addSessionWorkLog(i,T)})),$.push(j.onPartial(T=>{T&&c.setSessionPartialText(i,T)})),$.push(j.onThinkingPartial(T=>{T&&c.setPartialThinking(T,i)})),$.push(j.onChangesUpdate(T=>{c.setSessionFileCount(i,T)})),$.push(j.onStatus(T=>{["running","starting"].includes(T)?p[i]&&(clearTimeout(p[i]),delete p[i]):p[i]=setTimeout(()=>{delete p[i],c.clearSessionEphemeralState(i)},2e3)})),j.subscribe(),m.value[i]={subscription:j,cleanup:()=>{$.forEach(T=>T&&T()),j.unsubscribe()}},R(i)}function r(i){const j=m.value[i];j&&(j.cleanup(),delete m.value[i]),p[i]&&(clearTimeout(p[i]),delete p[i]);const $=l.get(i);$&&(clearTimeout($.timeout),l.delete(i))}me(()=>u.sessions.filter(i=>["running","starting"].includes(i.status)).map(i=>i.id),(i,j=[])=>{const $=i.filter(h=>!j.includes(h)),T=j.filter(h=>!i.includes(h));$.forEach(h=>S(h)),T.forEach(h=>r(h))},{immediate:!0});const{onReconnect:a}=Ie(),g=a(()=>{for(const i of Object.keys(m.value))R(i)});return Be(()=>{Object.keys(m.value).forEach(i=>r(i)),g()}),{activeSubscriptions:m}}const ft={class:"filters-container"},ht={class:"status-filters"},bt=["aria-label","onClick"],gt={class:"filter-label"},yt={class:"filter-count"},kt=["title"],St={key:0,class:"star-icon"},$t={key:1,class:"star-icon star-crossed"},Ct={key:2,class:"star-icon"},wt=["title"],Et={key:0,class:"schedule-icon"},_t={key:1,class:"schedule-icon schedule-crossed"},Tt={key:2,class:"schedule-icon"},jt={__name:"SessionFiltersPanel",props:{showStatusFilters:{type:Boolean,default:!0},showScheduledFilter:{type:Boolean,default:!0}},setup(u){const c=we(),{toggleFilter:m,toggleStarFilterIcon:p,starFilterTooltip:l,toggleScheduledFilterIcon:E,scheduledFilterTooltip:R,statusFilterCounts:_}=Ye();return(S,r)=>(t(),o("div",ft,[e("div",ht,[u.showStatusFilters?(t(),o(X,{key:0},Z(["running","idle"],a=>e("button",{key:a,class:ie(["filter-btn",{active:v(c).statusFilter===a,"filter-btn-empty":v(_)[a]===0}]),"aria-label":`${a} (${v(_)[a]})`,onClick:g=>v(m)(a)},[e("span",gt,F(a),1),e("span",yt,F(v(_)[a]),1)],10,bt)),64)):C("",!0),e("button",{class:ie(["filter-btn star-btn",{"star-filter-active":v(c).starredFilter==="starred","star-filter-unstarred":v(c).starredFilter==="unstarred","star-filter-all":v(c).starredFilter===null}]),title:v(l),onClick:r[0]||(r[0]=(...a)=>v(p)&&v(p)(...a))},[v(c).starredFilter==="starred"?(t(),o("span",St,"⭐")):v(c).starredFilter==="unstarred"?(t(),o("span",$t,"⭐")):(t(),o("span",Ct,"☆"))],10,kt),u.showScheduledFilter?(t(),o("button",{key:1,class:ie(["filter-btn schedule-btn",{"schedule-filter-active":v(c).scheduledFilter==="scheduled","schedule-filter-not-scheduled":v(c).scheduledFilter==="not-scheduled","schedule-filter-all":v(c).scheduledFilter===null}]),title:v(R),onClick:r[1]||(r[1]=(...a)=>v(E)&&v(E)(...a))},[v(c).scheduledFilter==="scheduled"?(t(),o("span",Et,"⏰")):v(c).scheduledFilter==="not-scheduled"?(t(),o("span",_t,"⏰")):(t(),o("span",Tt,"⏰"))],10,wt)):C("",!0)])]))}},Ne=Ce(jt,[["__scopeId","data-v-2c9a63d9"]]),Ft={key:0,class:"skeleton-list"},Mt={key:1,class:"error-message"},Rt={key:2,class:"empty-state"},At={key:3,class:"session-list"},xt={key:0,class:"load-more-container"},Lt=["disabled"],Ot={key:0},Bt={key:1},Pt={__name:"ArchivedTabContent",props:{summaries:{type:Object,required:!0},loadingSummaries:{type:Object,required:!0},summaryErrors:{type:Object,required:!0}},emits:["retrySummary","unarchive","loadMore"],setup(u){const c=we(),m=V(()=>{const{total:p,offset:l}=c.archivedPagination;return Math.max(0,p-l)});return(p,l)=>(t(),o("div",null,[v(c).archivedPagination.loading&&v(c).archivedSessions.length===0?(t(),o("div",Ft,[(t(),o(X,null,Z(3,E=>e("div",{key:E,class:"skeleton card",style:{height:"120px"}})),64))])):v(c).error?(t(),o("div",Mt,F(v(c).error),1)):v(c).archivedSessions.length===0?(t(),o("div",Rt,[...l[3]||(l[3]=[e("p",null,"No archived sessions. Archive completed sessions to keep your session list tidy.",-1)])])):(t(),o("div",At,[(t(!0),o(X,null,Z(v(c).archivedSessions,E=>(t(),oe(qe,{key:E.id,session:E,"show-summary":!0,summary:u.summaries[E.id],"summary-loading":u.loadingSummaries[E.id],"summary-error":u.summaryErrors[E.id],"show-unarchive":!0,"kanban-enabled":!1,"pr-url":E.prUrl,"pr-summary":u.summaries[E.id],onRetrySummary:l[0]||(l[0]=R=>p.$emit("retrySummary",R)),onUnarchive:l[1]||(l[1]=R=>p.$emit("unarchive",R))},null,8,["session","summary","summary-loading","summary-error","pr-url","pr-summary"]))),128)),v(c).archivedPagination.hasMore?(t(),o("div",xt,[e("button",{class:"btn btn-secondary",disabled:v(c).archivedPagination.loading,onClick:l[2]||(l[2]=E=>p.$emit("loadMore"))},[v(c).archivedPagination.loading?(t(),o("span",Ot,"Loading...")):(t(),o("span",Bt,"Load More ("+F(m.value)+" remaining)",1))],8,Lt)])):C("",!0)]))]))}},Ut=Ce(Pt,[["__scopeId","data-v-c0906664"]]),Dt={class:"scheduled-session-card card"},Vt={class:"card-header"},Nt={class:"session-info"},It={class:"session-name"},Kt={class:"timing-info"},Gt={class:"timing-item"},Ht={class:"timing-details"},qt={class:"timing-text"},Wt={class:"timing-absolute"},zt={key:0,class:"timing-item"},Yt={class:"timing-details"},Jt={class:"timing-absolute"},Qt={class:"card-actions"},Xt=["disabled"],Zt=["disabled"],es={__name:"ScheduledSessionCard",props:{session:{type:Object,required:!0}},setup(u){const c=u,m=we(),p=Fe(),l=A(!1),E=A(!1),R=V(()=>{const a=new Date(c.session.scheduledAt);return tt(a,{addSuffix:!0})}),_=V(()=>{const a=new Date(c.session.scheduledAt);return st(a,"MMM d, h:mm a")});async function S(){if(confirm("Cancel this scheduled session?")){l.value=!0;try{await m.updateSessionFields(c.session.id,{status:"stopped"}),p.success("Session cancelled")}catch(a){console.error("Failed to cancel session:",a),p.error(`Failed to cancel session: ${a.message}`)}finally{l.value=!1}}}function r(){}return(a,g)=>{const i=Me("router-link");return t(),o("div",Dt,[e("div",Vt,[e("div",Nt,[Q(i,{to:`/sessions/${u.session.id}`,class:"session-name-link"},{default:ye(()=>[e("h3",It,F(u.session.name),1)]),_:1},8,["to"])]),g[2]||(g[2]=e("div",{class:"status-badge-container"},[e("span",{class:"status-badge status-scheduled"},"scheduled")],-1))]),e("div",Kt,[e("div",Gt,[g[3]||(g[3]=e("span",{class:"timing-icon"},"⏰",-1)),e("div",Ht,[e("span",qt,F(R.value),1),e("span",Wt,F(_.value),1)])]),u.session.autoRescheduleEnabled?(t(),o("div",zt,[g[5]||(g[5]=e("span",{class:"timing-icon"},"🔄",-1)),e("div",Yt,[g[4]||(g[4]=e("span",{class:"timing-text"},"Auto-reschedule",-1)),e("span",Jt," Attempt "+F(u.session.rescheduleCount)+"/"+F(u.session.maxRescheduleCount||"∞"),1)])])):C("",!0)]),e("div",Qt,[e("button",{class:"btn btn-secondary btn-small",disabled:l.value,onClick:g[0]||(g[0]=j=>E.value=!0)}," Edit Schedule ",8,Xt),e("button",{class:"btn btn-danger btn-small",disabled:l.value,onClick:S}," Cancel ",8,Zt)]),Q(nt,{"is-open":E.value,session:u.session,onClose:g[1]||(g[1]=j=>E.value=!1),onSaved:r},null,8,["is-open","session"])])}}},ts=Ce(es,[["__scopeId","data-v-d41e6b57"]]),ss={key:0,class:"skeleton-list"},ns={key:1,class:"empty-state"},os={key:2,class:"session-list"},as={__name:"ScheduledTabContent",props:{sessions:{type:Array,required:!0},loading:{type:Boolean,default:!1}},setup(u){return(c,m)=>(t(),o("div",null,[u.loading?(t(),o("div",ss,[(t(),o(X,null,Z(3,p=>e("div",{key:p,class:"skeleton card",style:{height:"120px"}})),64))])):u.sessions.length===0?(t(),o("div",ns,[...m[0]||(m[0]=[e("p",null,"No scheduled sessions. Use scheduling options when creating a new session to schedule it for later.",-1)])])):(t(),o("div",os,[(t(!0),o(X,null,Z(u.sessions,p=>(t(),oe(ts,{key:p.id,session:p},null,8,["session"]))),128))]))]))}},ls=Ce(as,[["__scopeId","data-v-75cf4e60"]]),rs={class:"templates-panel"},is={class:"templates-header"},ds={key:0,class:"template-form card","data-testid":"template-form"},us={class:"form-group"},cs={class:"form-group"},ms={class:"form-group"},ps=["disabled"],vs={class:"form-group"},fs=["value"],hs={class:"form-group"},bs={class:"form-group"},gs={class:"form-group"},ys={class:"form-group"},ks={class:"form-actions"},Ss=["disabled"],$s={key:0,class:"loading-spinner"},Cs={key:1,class:"loading-state"},ws={key:2},Es={key:0,class:"template-section"},_s={class:"templates-list"},Ts={class:"template-header"},js={class:"template-name"},Fs={class:"template-prompt"},Ms={class:"template-meta"},Rs={key:0,class:"meta-badge"},As={key:1,class:"meta-badge"},xs={key:2,class:"meta-badge"},Ls={key:3,class:"meta-badge"},Os={key:4,class:"meta-badge meta-badge-chain"},Bs={key:1,class:"template-section"},Ps={class:"templates-list"},Us={class:"template-header"},Ds={class:"template-name"},Vs={class:"template-prompt"},Ns={class:"template-meta"},Is={key:0,class:"meta-badge"},Ks={key:1,class:"meta-badge"},Gs={key:2,class:"meta-badge"},Hs={key:3,class:"meta-badge"},qs={key:4,class:"meta-badge meta-badge-chain"},Ws={key:2,class:"empty-state"},zs={__name:"TemplatesPanel",props:{projectId:{type:String,required:!0}},setup(u,{expose:c}){const m=u,p=We(),l=Fe(),E=lt(),R=A(!1),_=A(!1),S=A({name:"",prompt:"",isGlobal:!1,nextTemplateId:null,thinkingEnabled:null,gitBranch:"",model:null,mode:null}),r=V(()=>p.loading),a=V(()=>p.projectTemplates),g=V(()=>p.globalTemplates),i=V(()=>[...p.projectTemplates,...p.globalTemplates]);Pe(async()=>{E.providers.length===0&&await E.fetchProviders(),p.fetchProjectTemplates(m.projectId)}),me(()=>m.projectId,f=>{p.fetchProjectTemplates(f)});function j(f,n=100){return f.length<=n?f:`${f.substring(0,n)}...`}function $(f){const n=p.getTemplateById(f);return(n==null?void 0:n.name)||"Unknown"}function T(f){var n;for(const B of E.providers){const b=(n=B.models)==null?void 0:n.find(q=>q.modelId===f);if(b)return B.isBuiltIn?b.displayName:b.modelId}return f}function h(){S.value={name:"",prompt:"",isGlobal:!1,nextTemplateId:null,thinkingEnabled:null,gitBranch:"",model:null,mode:null}}function I(){R.value=!0}function Y(){R.value=!1,h()}async function L(){if(!_.value){_.value=!0;try{const f={name:S.value.name,prompt:S.value.prompt,nextTemplateId:S.value.nextTemplateId||void 0,thinkingEnabled:S.value.thinkingEnabled,gitBranch:S.value.gitBranch||void 0,model:S.value.model,mode:S.value.mode};S.value.isGlobal?(await p.createGlobalTemplate(f),l.success("Global template created")):(await p.createProjectTemplate(m.projectId,f),l.success("Template created")),Y()}catch(f){l.error(f.message)}finally{_.value=!1}}}return c({formData:S,getModelName:T,resetForm:h}),(f,n)=>{const B=Me("router-link");return t(),o("div",rs,[e("div",is,[n[8]||(n[8]=e("h2",null,"Session Templates",-1)),R.value?C("",!0):(t(),o("button",{key:0,class:"btn btn-primary btn-sm","data-testid":"new-template-btn",onClick:I}," New Template "))]),R.value?(t(),o("div",ds,[n[23]||(n[23]=e("h3",null,"Create Template",-1)),e("form",{onSubmit:ue(L,["prevent"])},[e("div",us,[n[9]||(n[9]=e("label",{class:"form-label"},"Name",-1)),G(e("input",{"onUpdate:modelValue":n[0]||(n[0]=b=>S.value.name=b),type:"text",class:"form-input",placeholder:"Template name",required:""},null,512),[[ke,S.value.name]])]),e("div",cs,[n[10]||(n[10]=e("label",{class:"form-label"},"Prompt",-1)),G(e("textarea",{"onUpdate:modelValue":n[1]||(n[1]=b=>S.value.prompt=b),class:"form-input form-textarea",placeholder:"Session prompt. Use {{rootSession.summary}} to reference root session data.",rows:"4",required:""},null,512),[[ke,S.value.prompt]]),Q(ze)]),e("div",ms,[n[12]||(n[12]=e("label",{class:"form-label"},"Scope",-1)),G(e("select",{"onUpdate:modelValue":n[2]||(n[2]=b=>S.value.isGlobal=b),class:"form-input",disabled:f.editingTemplate},[...n[11]||(n[11]=[e("option",{value:!1}," Project Only ",-1),e("option",{value:!0}," Global (all projects) ",-1)])],8,ps),[[Ee,S.value.isGlobal]])]),e("div",vs,[n[14]||(n[14]=e("label",{class:"form-label"},"Next Template (Optional)",-1)),G(e("select",{"onUpdate:modelValue":n[3]||(n[3]=b=>S.value.nextTemplateId=b),class:"form-input"},[n[13]||(n[13]=e("option",{value:null}," None ",-1)),(t(!0),o(X,null,Z(i.value,b=>(t(),o("option",{key:b.id,value:b.id},F(b.name)+" "+F(b.projectId?"":"(Global)"),9,fs))),128))],512),[[Ee,S.value.nextTemplateId]]),n[15]||(n[15]=e("p",{class:"form-help"}," Chain another template to run after this one completes. ",-1))]),e("div",hs,[n[16]||(n[16]=e("label",{class:"form-label"},"Model",-1)),Q(rt,{modelValue:S.value.model,"onUpdate:modelValue":n[4]||(n[4]=b=>S.value.model=b),"allow-empty":!0,"empty-label":"Inherit from root session"},null,8,["modelValue"])]),e("div",bs,[n[18]||(n[18]=e("label",{class:"form-label",for:"create-mode"},"Mode",-1)),G(e("select",{id:"create-mode","onUpdate:modelValue":n[5]||(n[5]=b=>S.value.mode=b),class:"form-input","data-testid":"mode-select"},[...n[17]||(n[17]=[e("option",{value:null}," Inherit from root session ",-1),e("option",{value:"plan"}," Plan ",-1),e("option",{value:"standard"}," Standard ",-1),e("option",{value:"yolo"}," YOLO ",-1)])],512),[[Ee,S.value.mode]])]),e("div",gs,[n[20]||(n[20]=e("label",{class:"form-label",for:"create-thinking"},"Extended Thinking",-1)),G(e("select",{id:"create-thinking","onUpdate:modelValue":n[6]||(n[6]=b=>S.value.thinkingEnabled=b),class:"form-input","data-testid":"thinking-select"},[...n[19]||(n[19]=[e("option",{value:null}," Inherit from root session ",-1),e("option",{value:!0}," Enabled ",-1),e("option",{value:!1}," Disabled ",-1)])],512),[[Ee,S.value.thinkingEnabled]])]),e("div",ys,[n[21]||(n[21]=e("label",{class:"form-label"},"Git Branch (Optional)",-1)),G(e("input",{"onUpdate:modelValue":n[7]||(n[7]=b=>S.value.gitBranch=b),type:"text",class:"form-input",placeholder:"Leave empty to inherit from root session"},null,512),[[ke,S.value.gitBranch]])]),e("div",ks,[e("button",{type:"button",class:"btn","data-testid":"cancel-btn",onClick:Y}," Cancel "),e("button",{type:"submit",class:"btn btn-primary",disabled:_.value,"data-testid":"submit-btn"},[_.value?(t(),o("span",$s)):C("",!0),n[22]||(n[22]=ce(" Create ",-1))],8,Ss)])],32)])):C("",!0),r.value?(t(),o("div",Cs,[...n[24]||(n[24]=[e("span",{class:"loading-spinner"},null,-1),ce(" Loading templates... ",-1)])])):(t(),o("div",ws,[a.value.length>0?(t(),o("div",Es,[n[25]||(n[25]=e("h3",{class:"section-title"}," Project Templates ",-1)),e("div",_s,[(t(!0),o(X,null,Z(a.value,b=>(t(),oe(B,{key:b.id,to:`/projects/${u.projectId}/templates/${b.id}`,class:"template-card card","data-testid":`template-card-${b.id}`},{default:ye(()=>[e("div",Ts,[e("h4",js,F(b.name),1)]),e("p",Fs,F(j(b.prompt)),1),e("div",Ms,[b.thinkingEnabled?(t(),o("span",Rs,"Thinking")):C("",!0),b.gitBranch?(t(),o("span",As,F(b.gitBranch),1)):C("",!0),b.model?(t(),o("span",xs,F(T(b.model)),1)):C("",!0),b.mode?(t(),o("span",Ls,F(b.mode),1)):C("",!0),b.nextTemplateId?(t(),o("span",Os," Chains to: "+F($(b.nextTemplateId)),1)):C("",!0)])]),_:2},1032,["to","data-testid"]))),128))])])):C("",!0),g.value.length>0?(t(),o("div",Bs,[n[27]||(n[27]=e("h3",{class:"section-title"}," Global Templates ",-1)),e("div",Ps,[(t(!0),o(X,null,Z(g.value,b=>(t(),oe(B,{key:b.id,to:`/projects/${u.projectId}/templates/${b.id}`,class:"template-card card","data-testid":`template-card-${b.id}`},{default:ye(()=>[e("div",Us,[e("h4",Ds,F(b.name),1)]),e("p",Vs,F(j(b.prompt)),1),e("div",Ns,[n[26]||(n[26]=e("span",{class:"meta-badge meta-badge-global"},"Global",-1)),b.thinkingEnabled?(t(),o("span",Is,"Thinking")):C("",!0),b.gitBranch?(t(),o("span",Ks,F(b.gitBranch),1)):C("",!0),b.model?(t(),o("span",Gs,F(T(b.model)),1)):C("",!0),b.mode?(t(),o("span",Hs,F(b.mode),1)):C("",!0),b.nextTemplateId?(t(),o("span",qs," Chains to: "+F($(b.nextTemplateId)),1)):C("",!0)])]),_:2},1032,["to","data-testid"]))),128))])])):C("",!0),a.value.length===0&&g.value.length===0&&!R.value?(t(),o("div",Ws,[n[28]||(n[28]=e("p",null,"No templates yet. Create a template to automate session workflows.",-1)),e("button",{class:"btn btn-primary","data-testid":"create-template-btn",onClick:I}," Create Template ")])):C("",!0)]))])}}},Ys=Ce(zs,[["__scopeId","data-v-d08b4ac0"]]),Js={class:"command-buttons-panel"},Qs={class:"panel-header"},Xs={key:0,class:"loading-state"},Zs={key:1,class:"error-message"},en={key:2,class:"empty-state"},tn={key:3,class:"buttons-table"},sn=["onClick"],nn={class:"col-label"},on={class:"col-command"},an={class:"col-order"},ln=["onClick"],rn={class:"modal-body"},dn={class:"modal-footer"},un={__name:"CommandButtonsPanel",props:{projectId:{type:String,required:!0}},setup(u){const c=u,m=Ke(),p=He(),l=A(null),E=r=>r.length>50?`${r.substring(0,50)}...`:r,R=r=>{m.push(`/projects/${c.projectId}/command-buttons/${r.id}`)},_=r=>{l.value=r},S=async()=>{if(l.value)try{await p.deleteButton(c.projectId,l.value.id),l.value=null}catch(r){console.error("Failed to delete button:",r)}};return(r,a)=>{const g=Me("router-link");return t(),o("div",Js,[e("div",Qs,[a[5]||(a[5]=e("h3",null,"Command Buttons",-1)),Q(g,{to:`/projects/${u.projectId}/command-buttons/new`,class:"btn btn-primary btn-sm"},{default:ye(()=>[...a[4]||(a[4]=[ce(" + New Command Button ",-1)])]),_:1},8,["to"])]),v(p).loading?(t(),o("div",Xs,[...a[6]||(a[6]=[e("span",{class:"loading-spinner"},null,-1),ce(" Loading command buttons... ",-1)])])):v(p).error?(t(),o("div",Zs,F(v(p).error),1)):v(p).buttons.length===0?(t(),o("div",en,[a[8]||(a[8]=e("p",null,"No command buttons configured yet.",-1)),Q(g,{to:`/projects/${u.projectId}/command-buttons/new`,class:"btn btn-primary"},{default:ye(()=>[...a[7]||(a[7]=[ce(" Create First Button ",-1)])]),_:1},8,["to"])])):(t(),o("div",tn,[a[9]||(a[9]=Ue('<div class="table-header" data-v-990a48bf><div class="col-label" data-v-990a48bf> Label </div><div class="col-command" data-v-990a48bf> Command </div><div class="col-order" data-v-990a48bf> Sort Order </div><div class="col-actions" data-v-990a48bf> Actions </div></div>',1)),(t(!0),o(X,null,Z(v(p).buttons,i=>(t(),o("div",{key:i.id,class:"table-row",onClick:j=>R(i)},[e("div",nn,F(i.label),1),e("div",on,[e("code",null,F(E(i.command)),1)]),e("div",an,F(i.sortOrder),1),e("div",{class:"col-actions",onClick:a[0]||(a[0]=ue(()=>{},["stop"]))},[e("button",{class:"btn btn-sm btn-outline-danger",onClick:j=>_(i)}," Delete ",8,ln)])],8,sn))),128))])),l.value?(t(),o("div",{key:4,class:"modal-overlay",onClick:a[3]||(a[3]=i=>l.value=null)},[e("div",{class:"modal-dialog",onClick:a[2]||(a[2]=ue(()=>{},["stop"]))},[a[12]||(a[12]=e("div",{class:"modal-header"},[e("h4",null,"Delete Command Button")],-1)),e("div",rn,[e("p",null,[a[10]||(a[10]=ce('Are you sure you want to delete the command button "',-1)),e("strong",null,F(l.value.label),1),a[11]||(a[11]=ce('"?',-1))])]),e("div",dn,[e("button",{class:"btn btn-outline-secondary",onClick:a[1]||(a[1]=i=>l.value=null)}," Cancel "),e("button",{class:"btn btn-danger",onClick:S}," Delete ")])])])):C("",!0)])}}},cn=Ce(un,[["__scopeId","data-v-990a48bf"]]),mn={class:"modal-content"},pn={class:"modal-header"},vn={class:"modal-title"},fn={class:"modal-body"},hn={class:"form-group"},bn={class:"sessions-list"},gn={key:0,class:"loading-state"},yn={key:1,class:"empty-state"},kn={key:0},Sn={key:1},$n=["onClick"],Cn={class:"session-info"},wn={class:"session-name"},En={class:"session-meta"},_n={key:0,class:"session-mode"},Tn={class:"session-date"},jn={class:"modal-footer"},Fn=["disabled"],Mn={__name:"AddSessionToLaneModal",props:{isOpen:{type:Boolean,default:!1},projectId:{type:String,default:""},laneId:{type:String,default:""},laneName:{type:String,default:""}},emits:["close","update:isOpen","added"],setup(u,{emit:c}){const m=u,p=c;we();const l=Re(),E=Fe(),R=A(!1),_=A(!1),S=A(""),r=A(null),a=A([]),g=V(()=>{let L=a.value.filter(f=>!l.isSessionOnBoard(f.id));if(L=L.filter(f=>!f.parentSessionId),S.value.trim()){const f=S.value.toLowerCase();L=L.filter(n=>{var B;return(B=n.name)==null?void 0:B.toLowerCase().includes(f)})}return L});function i(L){switch(L){case"running":case"starting":return"●";case"waiting":return"◐";case"completed":return"✓";case"error":return"✕";case"stopped":return"■";case"scheduled":return"⏰";default:return"○"}}function j(L){return L?new Date(L).toLocaleDateString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function $(L){r.value=L}function T(){}function h(){p("update:isOpen",!1),p("close"),S.value="",r.value=null}async function I(){if(m.projectId){R.value=!0;try{const L=await Oe.getProjectSessions(m.projectId,!1,null);a.value=Array.isArray(L)?L:(L==null?void 0:L.sessions)||[]}catch(L){console.error("Failed to load sessions:",L),E.error("Failed to load sessions"),a.value=[]}finally{R.value=!1}}}async function Y(){if(!(!r.value||!m.laneId)){_.value=!0;try{await l.addSessionToBoard(m.projectId,r.value,m.laneId),E.success("Session added to board"),p("added",r.value),h()}catch(L){console.error("Failed to add session to board:",L),E.error(L.message||"Failed to add session to board")}finally{_.value=!1}}}return me(()=>m.isOpen,L=>{L&&I()},{immediate:!0}),(L,f)=>u.isOpen?(t(),o("div",{key:0,class:"modal-backdrop",onClick:ue(h,["self"])},[e("div",mn,[e("div",pn,[e("h2",vn," Add Session to "+F(u.laneName),1),e("button",{class:"close-btn","aria-label":"Close",onClick:h}," × ")]),e("div",fn,[e("div",hn,[f[1]||(f[1]=e("label",{for:"session-search",class:"form-label"},"Search Sessions",-1)),G(e("input",{id:"session-search","onUpdate:modelValue":f[0]||(f[0]=n=>S.value=n),type:"text",class:"form-input",placeholder:"Search by name...",onInput:T},null,544),[[ke,S.value]])]),e("div",bn,[R.value?(t(),o("div",gn,[...f[2]||(f[2]=[e("span",{class:"loading-spinner"},null,-1),ce(" Loading sessions... ",-1)])])):g.value.length===0?(t(),o("div",yn,[S.value?(t(),o("p",kn,' No sessions matching "'+F(S.value)+'" ',1)):(t(),o("p",Sn," No available sessions to add. "))])):(t(!0),o(X,{key:2},Z(g.value,n=>(t(),o("div",{key:n.id,class:ie(["session-item",{selected:r.value===n.id}]),onClick:B=>$(n.id)},[e("div",{class:ie(["session-status",`status-${n.status}`])},F(i(n.status)),3),e("div",Cn,[e("div",wn,F(n.name),1),e("div",En,[n.mode?(t(),o("span",_n,F(n.mode),1)):C("",!0),e("span",Tn,F(j(n.updatedAt||n.createdAt)),1)])])],10,$n))),128))])]),e("div",jn,[e("button",{class:"btn btn-secondary",onClick:h}," Cancel "),e("button",{class:"btn btn-primary",disabled:!r.value||_.value,onClick:Y},F(_.value?"Adding...":"Add to Lane"),9,Fn)])])])):C("",!0)}},Je=Ce(Mn,[["__scopeId","data-v-916a53c8"]]),Rn={class:"modal-content"},An={class:"modal-body"},xn={class:"form-group"},Ln={key:0,class:"form-group"},On={class:"lane-position-controls"},Bn=["disabled"],Pn={class:"lane-position-label"},Un=["disabled"],Dn={class:"form-group"},Vn={class:"automation-options"},Nn={class:"radio-option"},In={class:"radio-option"},Kn={class:"radio-option"},Gn={key:1,class:"form-group"},Hn={key:0,label:"Project Templates"},qn=["value"],Wn={key:1,label:"Global Templates"},zn=["value"],Yn={key:2,class:"form-group"},Jn={class:"prompt-actions-row"},Qn={key:4,class:"agent-settings-section"},Xn={key:0,class:"agent-settings-body"},Zn={class:"form-group"},eo={class:"toggle-switch-row"},to={class:"toggle-switch"},so={key:0,class:"reschedule-settings"},no={class:"form-group"},oo={class:"checkbox-option"},ao={class:"checkbox-option"},lo={class:"form-group"},ro={class:"form-group"},io={class:"form-group"},uo={class:"form-group"},co={class:"danger-zone"},mo=["disabled"],po={class:"modal-footer"},vo=["disabled"],fo={__name:"LaneSettingsModal",props:{isOpen:{type:Boolean,default:!1},projectId:{type:String,default:""},lane:{type:Object,default:null}},emits:["close","update:isOpen","updated","deleted"],setup(u,{emit:c}){const m=u,p=c,l=Re(),E=We(),R=Fe(),_=De(),S=A(!1),r=A(!1),a=A("none"),g=A(!1),i=A(!1),j=A(null),$=A(-1),T=A(-1),h=Ae({name:"",onEnterTemplateId:null,onEnterPrompt:"",onEnterMode:null,onEnterModel:null,onEnterEffortLevel:null,onEnterThinkingEnabled:null,onEnterAutoRescheduleEnabled:!1,onEnterRescheduleDelayMinutes:15,onEnterRescheduleOnTokenLimit:!0,onEnterRescheduleOnServiceError:!0,onEnterMaxRescheduleCount:null,onEnterMaxTotalTokens:null,onEnterRescheduleAtTokenCount:null}),I=V(()=>E.projectTemplates),Y=V(()=>E.globalTemplates),L=V(()=>{const d=_.getProjectById(m.projectId);return(d==null?void 0:d.workingDirectory)||null}),f=V(()=>T.value),n=V(()=>{var d,s;return((s=(d=l.board)==null?void 0:d.lanes)==null?void 0:s.length)||0}),B=V(()=>!(!h.name.trim()||a.value==="template"&&!h.onEnterTemplateId||a.value==="prompt"&&!h.onEnterPrompt.trim()));function b(d){return{onEnterAutoRescheduleEnabled:d.onEnterAutoRescheduleEnabled||!1,onEnterRescheduleDelayMinutes:d.onEnterRescheduleDelayMinutes||15,onEnterRescheduleOnTokenLimit:d.onEnterRescheduleOnTokenLimit??!0,onEnterRescheduleOnServiceError:d.onEnterRescheduleOnServiceError??!0,onEnterMaxRescheduleCount:d.onEnterMaxRescheduleCount||null,onEnterMaxTotalTokens:d.onEnterMaxTotalTokens||null,onEnterRescheduleAtTokenCount:d.onEnterRescheduleAtTokenCount||null}}function q(d){return{name:d.name||"",onEnterTemplateId:d.onEnterTemplateId||null,onEnterPrompt:d.onEnterPrompt||"",onEnterMode:d.onEnterMode||null,onEnterModel:d.onEnterModel||null,onEnterEffortLevel:d.onEnterEffortLevel||null,onEnterThinkingEnabled:d.onEnterThinkingEnabled??null,...b(d)}}function J(d){return d.onEnterTemplateId?"template":d.onEnterPrompt?"prompt":"none"}function H(d){return!!(d.onEnterMode||d.onEnterModel||d.onEnterEffortLevel||d.onEnterThinkingEnabled!==null||d.onEnterAutoRescheduleEnabled)}function ee(){var d,s;if(m.lane){const y=q(m.lane);Object.assign(h,y),a.value=J(m.lane),g.value=H(h);const be=((s=(d=l.board)==null?void 0:d.lanes)==null?void 0:s.findIndex(O=>O.id===m.lane.id))??-1;$.value=be,T.value=be}else{const y=q({});Object.assign(h,y),a.value="none",g.value=!1,$.value=-1,T.value=-1}}function te(){T.value=$.value,p("update:isOpen",!1),p("close")}function de({text:d}){const s=j.value;if(s){const y=s.selectionStart,be=s.selectionEnd,O=h.onEnterPrompt.substring(0,y),k=h.onEnterPrompt.substring(be);h.onEnterPrompt=O+d+k,Ze(()=>{s.selectionStart=s.selectionEnd=y+d.length,s.focus()})}}function ae(d){const s=T.value;s<0||s===d||(T.value=d)}function pe(){return{onEnterTemplateId:null,onEnterPrompt:null,onEnterMode:null,onEnterModel:null,onEnterEffortLevel:null,onEnterThinkingEnabled:null,onEnterAutoRescheduleEnabled:!1,onEnterRescheduleDelayMinutes:15,onEnterRescheduleOnTokenLimit:!0,onEnterRescheduleOnServiceError:!0,onEnterMaxRescheduleCount:null,onEnterMaxTotalTokens:null,onEnterRescheduleAtTokenCount:null}}function le(d){return{...pe(),onEnterTemplateId:d.onEnterTemplateId,onEnterPrompt:null}}function ve(d){return{onEnterTemplateId:null,onEnterPrompt:d.onEnterPrompt.trim(),onEnterMode:d.onEnterMode,onEnterModel:d.onEnterModel,onEnterEffortLevel:d.onEnterEffortLevel,onEnterThinkingEnabled:d.onEnterThinkingEnabled,onEnterAutoRescheduleEnabled:d.onEnterAutoRescheduleEnabled,onEnterRescheduleDelayMinutes:d.onEnterRescheduleDelayMinutes,onEnterRescheduleOnTokenLimit:d.onEnterRescheduleOnTokenLimit,onEnterRescheduleOnServiceError:d.onEnterRescheduleOnServiceError,onEnterMaxRescheduleCount:d.onEnterMaxRescheduleCount,onEnterMaxTotalTokens:d.onEnterMaxTotalTokens,onEnterRescheduleAtTokenCount:d.onEnterRescheduleAtTokenCount}}async function fe(d,s,y,be){var M;if(y===s||y<0)return;const O=(M=l.board)==null?void 0:M.lanes;if(!O||O.length<=1)return;const k=O.map(w=>w.id);k.splice(s,1),k.splice(y,0,d.id),await l.reorderLanes(be,k)}async function D(){if(!(!m.lane||!B.value)){S.value=!0;try{const d={name:h.name.trim()};a.value==="template"?Object.assign(d,le(h)):a.value==="prompt"?Object.assign(d,ve(h)):Object.assign(d,pe()),await fe(m.lane,$.value,T.value,m.projectId),await l.updateLane(m.projectId,m.lane.id,d),R.success("Lane settings saved"),p("updated"),te()}catch(d){console.error("Failed to save lane settings:",d),R.error(d.message||"Failed to save lane settings")}finally{S.value=!1}}}async function P(){if(m.lane&&confirm(`Are you sure you want to delete the "${m.lane.name}" lane? This cannot be undone.`)){r.value=!0;try{await l.deleteLane(m.projectId,m.lane.id),R.success("Lane deleted"),p("deleted"),te()}catch(d){console.error("Failed to delete lane:",d),R.error(d.message||"Failed to delete lane")}finally{r.value=!1}}}return me(()=>m.isOpen,d=>{d&&(ee(),m.projectId&&E.projectTemplates.length===0&&E.globalTemplates.length===0&&E.fetchProjectTemplates(m.projectId))},{immediate:!0}),me(()=>m.lane,()=>{m.isOpen&&ee()}),me(()=>{var d;return(d=l.board)==null?void 0:d.lanes},d=>{if(m.isOpen&&m.lane&&d){const s=d.findIndex(y=>y.id===m.lane.id);s>=0&&($.value=s,T.value=s)}},{deep:!0}),(d,s)=>u.isOpen?(t(),o("div",{key:0,class:"modal-backdrop",onClick:ue(te,["self"])},[e("div",Rn,[e("div",{class:"modal-header"},[s[22]||(s[22]=e("h2",{class:"modal-title"}," Lane Settings ",-1)),e("button",{class:"close-btn","aria-label":"Close",onClick:te}," × ")]),e("div",An,[e("div",xn,[s[23]||(s[23]=e("label",{for:"lane-name",class:"form-label"},"Lane Name",-1)),G(e("input",{id:"lane-name","onUpdate:modelValue":s[0]||(s[0]=y=>h.name=y),type:"text",class:"form-input",placeholder:"Enter lane name"},null,512),[[ke,h.name]])]),n.value>1?(t(),o("div",Ln,[s[26]||(s[26]=e("label",{class:"form-label"},"Position",-1)),e("div",On,[e("button",{class:"btn btn-icon",disabled:f.value<=0,title:"Move left",onClick:s[1]||(s[1]=y=>ae(f.value-1))},[...s[24]||(s[24]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"15 18 9 12 15 6"})],-1)])],8,Bn),e("span",Pn,F(f.value+1)+" of "+F(n.value),1),e("button",{class:"btn btn-icon",disabled:f.value>=n.value-1,title:"Move right",onClick:s[2]||(s[2]=y=>ae(f.value+1))},[...s[25]||(s[25]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"9 18 15 12 9 6"})],-1)])],8,Un)])])):C("",!0),e("div",Dn,[s[30]||(s[30]=e("label",{class:"form-label"},"On-Enter Automation",-1)),e("div",Vn,[e("label",Nn,[G(e("input",{"onUpdate:modelValue":s[3]||(s[3]=y=>a.value=y),type:"radio",value:"none",name:"automation"},null,512),[[xe,a.value]]),s[27]||(s[27]=e("span",null,"None",-1))]),e("label",In,[G(e("input",{"onUpdate:modelValue":s[4]||(s[4]=y=>a.value=y),type:"radio",value:"template",name:"automation"},null,512),[[xe,a.value]]),s[28]||(s[28]=e("span",null,"Run a template",-1))]),e("label",Kn,[G(e("input",{"onUpdate:modelValue":s[5]||(s[5]=y=>a.value=y),type:"radio",value:"prompt",name:"automation"},null,512),[[xe,a.value]]),s[29]||(s[29]=e("span",null,"Run a custom prompt",-1))])])]),a.value==="template"?(t(),o("div",Gn,[s[32]||(s[32]=e("label",{for:"template-select",class:"form-label"},"Select Template",-1)),G(e("select",{id:"template-select","onUpdate:modelValue":s[6]||(s[6]=y=>h.onEnterTemplateId=y),class:"form-input"},[s[31]||(s[31]=e("option",{value:null}," Select a template... ",-1)),I.value.length?(t(),o("optgroup",Hn,[(t(!0),o(X,null,Z(I.value,y=>(t(),o("option",{key:y.id,value:y.id},F(y.name),9,qn))),128))])):C("",!0),Y.value.length?(t(),o("optgroup",Wn,[(t(!0),o(X,null,Z(Y.value,y=>(t(),o("option",{key:y.id,value:y.id},F(y.name),9,zn))),128))])):C("",!0)],512),[[Ee,h.onEnterTemplateId]]),s[33]||(s[33]=e("p",{class:"form-help"}," When a session enters this lane, the selected template will automatically run. ",-1))])):C("",!0),a.value==="prompt"?(t(),o("div",Yn,[s[34]||(s[34]=e("label",{for:"custom-prompt",class:"form-label"},"Custom Prompt",-1)),Q(it,{id:"custom-prompt",ref_key:"promptTextareaRef",ref:j,modelValue:h.onEnterPrompt,"onUpdate:modelValue":s[7]||(s[7]=y=>h.onEnterPrompt=y),class:"form-input form-textarea",placeholder:"Enter the prompt to run when a session enters this lane...",rows:"4","min-height":80},null,8,["modelValue"]),e("div",Jn,[Q(ze),L.value?(t(),oe(ut,{key:0,onOpen:s[8]||(s[8]=y=>i.value=!0)})):C("",!0)])])):C("",!0),a.value==="prompt"?(t(),oe(ct,{key:3,"is-open":i.value,"onUpdate:isOpen":s[9]||(s[9]=y=>i.value=y),"working-directory":L.value||"",mode:"insert","hide-builtin":!0,onInsert:de},null,8,["is-open","working-directory"])):C("",!0),a.value==="prompt"?(t(),o("div",Qn,[e("button",{type:"button",class:"section-toggle",onClick:s[10]||(s[10]=y=>g.value=!g.value)},[e("span",{class:ie(["toggle-chevron",{open:g.value}])},"▶",2),s[35]||(s[35]=ce(" Session Settings ",-1))]),g.value?(t(),o("div",Xn,[Q(dt,{mode:h.onEnterMode||"standard",model:h.onEnterModel,"effort-level":h.onEnterEffortLevel,"thinking-enabled":h.onEnterThinkingEnabled??!1,"hide-start-immediately":!0,"onUpdate:mode":s[11]||(s[11]=y=>h.onEnterMode=y),"onUpdate:model":s[12]||(s[12]=y=>h.onEnterModel=y),"onUpdate:effortLevel":s[13]||(s[13]=y=>h.onEnterEffortLevel=y),"onUpdate:thinkingEnabled":s[14]||(s[14]=y=>h.onEnterThinkingEnabled=y)},null,8,["mode","model","effort-level","thinking-enabled"]),e("div",Zn,[e("label",eo,[e("label",to,[G(e("input",{"onUpdate:modelValue":s[15]||(s[15]=y=>h.onEnterAutoRescheduleEnabled=y),type:"checkbox"},null,512),[[Le,h.onEnterAutoRescheduleEnabled]]),s[36]||(s[36]=e("span",{class:"toggle-slider"},null,-1))]),s[37]||(s[37]=e("span",{class:"toggle-label"},"Auto-reschedule on errors",-1))])]),h.onEnterAutoRescheduleEnabled?(t(),o("div",so,[e("div",no,[s[40]||(s[40]=e("p",{class:"settings-label"}," Reschedule Triggers ",-1)),e("label",oo,[G(e("input",{"onUpdate:modelValue":s[16]||(s[16]=y=>h.onEnterRescheduleOnTokenLimit=y),type:"checkbox"},null,512),[[Le,h.onEnterRescheduleOnTokenLimit]]),s[38]||(s[38]=e("span",null,"Token limit errors",-1))]),e("label",ao,[G(e("input",{"onUpdate:modelValue":s[17]||(s[17]=y=>h.onEnterRescheduleOnServiceError=y),type:"checkbox"},null,512),[[Le,h.onEnterRescheduleOnServiceError]]),s[39]||(s[39]=e("span",null,"Service unavailability",-1))])]),e("div",lo,[s[42]||(s[42]=e("label",{class:"form-label"},"Reschedule Delay",-1)),G(e("select",{"onUpdate:modelValue":s[18]||(s[18]=y=>h.onEnterRescheduleDelayMinutes=y),class:"form-input"},[...s[41]||(s[41]=[e("option",{value:5}," 5 minutes ",-1),e("option",{value:15}," 15 minutes ",-1),e("option",{value:30}," 30 minutes ",-1),e("option",{value:60}," 1 hour ",-1),e("option",{value:120}," 2 hours ",-1)])],512),[[Ee,h.onEnterRescheduleDelayMinutes,void 0,{number:!0}]])]),e("div",ro,[s[43]||(s[43]=e("label",{class:"form-label"},"Max Reschedule Count",-1)),G(e("input",{"onUpdate:modelValue":s[19]||(s[19]=y=>h.onEnterMaxRescheduleCount=y),type:"number",min:"1",max:"100",class:"form-input",placeholder:"Unlimited"},null,512),[[ke,h.onEnterMaxRescheduleCount,void 0,{number:!0}]])]),e("div",io,[s[44]||(s[44]=e("label",{class:"form-label"},"Max Total Tokens",-1)),G(e("input",{"onUpdate:modelValue":s[20]||(s[20]=y=>h.onEnterMaxTotalTokens=y),type:"number",min:"1000",step:"1000",class:"form-input",placeholder:"Unlimited"},null,512),[[ke,h.onEnterMaxTotalTokens,void 0,{number:!0}]])]),e("div",uo,[s[45]||(s[45]=e("label",{class:"form-label"},"Reschedule At Token Count",-1)),G(e("input",{"onUpdate:modelValue":s[21]||(s[21]=y=>h.onEnterRescheduleAtTokenCount=y),type:"number",min:"10000",step:"10000",class:"form-input",placeholder:"None"},null,512),[[ke,h.onEnterRescheduleAtTokenCount,void 0,{number:!0}]])])])):C("",!0)])):C("",!0)])):C("",!0),e("div",co,[s[46]||(s[46]=e("h4",{class:"danger-title"}," Danger Zone ",-1)),s[47]||(s[47]=e("p",{class:"danger-description"}," Deleting this lane will remove all cards from it. Sessions will remain in the project. ",-1)),e("button",{class:"btn btn-danger",disabled:r.value,onClick:P},F(r.value?"Deleting...":"Delete Lane"),9,mo)])]),e("div",po,[e("button",{class:"btn btn-secondary",onClick:te}," Cancel "),e("button",{class:"btn btn-primary",disabled:S.value||!B.value,onClick:D},F(S.value?"Saving...":"Save Changes"),9,vo)])])])):C("",!0)}},ho=Ce(fo,[["__scopeId","data-v-93f5604f"]]),bo={class:"kanban-board"},go={key:0,class:"kanban-loading"},yo={key:1,class:"kanban-error"},ko={key:2,class:"kanban-empty"},So={key:3,class:"kanban-lanes-container"},$o=["onDragover","onDrop"],Co={class:"lane-header"},wo={class:"lane-title-row"},Eo={class:"lane-title"},_o={key:0,class:"lane-automation-indicator",title:"Automation enabled"},To={class:"lane-header-actions"},jo={class:"lane-count"},Fo=["onClick"],Mo={class:"lane-cards"},Ro={key:0,class:"card-drop-indicator"},Ao=["onDragstart","onDragover"],xo={class:"card-header"},Lo={class:"card-title"},Oo={class:"card-meta"},Bo={key:0,class:"card-mode"},Po={class:"card-reorder-arrows"},Uo=["onClick"],Do=["onClick"],Vo=["onClick"],No=["onClick"],Io={key:0,class:"card-drop-indicator"},Ko={key:1,class:"lane-empty"},Go={class:"lane-footer"},Ho={key:0,class:"lane-automation"},qo={key:1,class:"lane-automation"},Wo=["onClick"],zo={class:"add-lane-container"},Yo={key:1,class:"add-lane-form"},Jo={__name:"KanbanBoard",props:{projectId:{type:String,required:!0}},setup(u){const c=u,m=Re(),p=A(!1),l=A(""),E=A(null),R=A(null),_=A(null),S=A(-1),r=A(null),a=A(-1),g=A(!1),i=A(null),j=A(!1),$=A(null),T=A(!1),h=A(null),I=A(null),Y=V(()=>m.board),L=V(()=>m.loading),f=V(()=>m.error),n=async()=>{try{await m.fetchBoard(c.projectId)}catch(M){console.error("Failed to fetch kanban board:",M)}},B=M=>{switch(M){case"running":case"starting":return"●";case"waiting":return"◐";case"completed":return"✓";case"error":return"✕";case"stopped":return"■";case"scheduled":return"⏰";default:return"○"}},b=(M,w,W,N)=>{E.value="card",R.value=w,_.value=W,S.value=N;const z=M.dataTransfer;z.effectAllowed="move",z.setData("text/plain",w.id)},q=(M,w,W)=>{if(E.value!=="card")return;const N=M.currentTarget.getBoundingClientRect(),z=N.top+N.height/2,se=M.clientY<z?W:W+1;w===_.value&&(se===S.value||se===S.value+1)?(r.value=null,a.value=-1):(r.value=w,a.value=se)},J=()=>{E.value=null,R.value=null,_.value=null,S.value=-1,r.value=null,a.value=-1},H=async(M,w,W)=>{var he,re;const N=(re=(he=Y.value)==null?void 0:he.lanes)==null?void 0:re.find(x=>x.id===M);if(!(N!=null&&N.cards))return;let z=W>=0?W:N.cards.length;if(z>w&&z--,z===w)return;const se=N.cards.map(x=>x.id),[ge]=se.splice(w,1);se.splice(z,0,ge);try{await m.reorderCards(c.projectId,M,se)}catch(x){console.error("Failed to reorder cards:",x)}},ee=async(M,w)=>{try{await m.moveCard(c.projectId,M,w,{runOnEnterTemplate:!0})}catch(W){console.error("Failed to move card:",W)}},te=async(M,w)=>{if(M.preventDefault(),E.value!=="card"||!R.value){J();return}const W=M.dataTransfer.getData("text/plain");if(!W){J();return}_.value===w?await H(w,S.value,a.value):await ee(W,w),J()},de=async(M,w,W)=>{var ge,he;const N=(he=(ge=Y.value)==null?void 0:ge.lanes)==null?void 0:he.find(re=>re.id===M);if(!(N!=null&&N.cards))return;const z=N.cards.map(re=>re.id),[se]=z.splice(w,1);z.splice(W,0,se);try{await m.reorderCards(c.projectId,M,z)}catch(re){console.error("Failed to reorder cards:",re)}},ae=async M=>{if(confirm("Remove this session from the board?"))try{await m.removeCard(c.projectId,M)}catch(w){console.error("Failed to remove card:",w)}},pe=async()=>{if(l.value.trim())try{await m.createLane(c.projectId,{name:l.value.trim()}),le()}catch(M){console.error("Failed to add lane:",M)}},le=()=>{p.value=!1,l.value=""},ve=M=>{i.value=M,g.value=!0},fe=()=>{g.value=!1,i.value=null},D=()=>{},P=M=>{$.value=M,j.value=!0},d=()=>{j.value=!1,$.value=null},s=()=>{},y=()=>{d()},be=(M,w)=>{h.value=M,I.value=w,T.value=!0},O=()=>{T.value=!1,h.value=null,I.value=null},k=()=>{O()};return me(()=>c.projectId,M=>{M&&n()},{immediate:!0}),Pe(()=>{c.projectId&&n()}),(M,w)=>{var N,z,se,ge,he,re;const W=Me("router-link");return t(),o("div",bo,[L.value?(t(),o("div",go,[...w[5]||(w[5]=[e("span",{class:"loading-spinner"},null,-1),ce(" Loading board... ",-1)])])):f.value?(t(),o("div",yo,[w[6]||(w[6]=e("span",{class:"error-icon"},"!",-1)),ce(" "+F(f.value)+" ",1),e("button",{class:"retry-btn",onClick:n}," Retry ")])):Y.value?(t(),o("div",So,[(t(!0),o(X,null,Z(Y.value.lanes,x=>{var _e,Te,je;return t(),o("div",{key:x.id,class:"kanban-lane",onDragover:ue(K=>{var ne;return q(K,x.id,((ne=x.cards)==null?void 0:ne.length)||0)},["prevent"]),onDrop:K=>te(K,x.id)},[e("div",Co,[e("div",wo,[e("h3",Eo,F(x.name),1),x.onEnterTemplateId||x.onEnterPrompt?(t(),o("span",_o,[...w[8]||(w[8]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"currentColor"},[e("path",{d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1)])])):C("",!0)]),e("div",To,[e("span",jo,F(((_e=x.cards)==null?void 0:_e.length)||0),1),e("button",{class:"lane-settings-btn",title:"Lane settings",onClick:K=>P(x)},[...w[9]||(w[9]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[e("circle",{cx:"12",cy:"12",r:"3"}),e("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"})],-1)])],8,Fo)])]),e("div",Mo,[(t(!0),o(X,null,Z(x.cards,(K,ne)=>{var U,Se;return t(),o(X,{key:K.id},[E.value==="card"&&r.value===x.id&&a.value===ne?(t(),o("div",Ro)):C("",!0),e("div",{class:ie(["kanban-card",{dragging:E.value==="card"&&((U=R.value)==null?void 0:U.id)===K.id}]),draggable:"true",onDragstart:ue($e=>b($e,K,x.id,ne),["stop"]),onDragover:ue($e=>q($e,x.id,ne),["prevent","stop"]),onDragend:J},[(Se=K.sessions)!=null&&Se[0]?(t(),oe(W,{key:0,to:`/sessions/${K.sessions[0].id}`,class:"card-link"},{default:ye(()=>[e("div",xo,[e("span",{class:ie(["card-status",`status-${K.sessions[0].status}`])},F(B(K.sessions[0].status)),3),e("h4",Lo,F(K.sessions[0].name),1)]),e("div",Oo,[K.sessions[0].mode?(t(),o("span",Bo,F(K.sessions[0].mode),1)):C("",!0)])]),_:2},1032,["to"])):C("",!0),e("div",Po,[ne>0?(t(),o("button",{key:0,class:"card-reorder-btn",title:"Move card up",onClick:ue($e=>de(x.id,ne,ne-1),["prevent"])},[...w[10]||(w[10]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"18 15 12 9 6 15"})],-1)])],8,Uo)):C("",!0),ne<x.cards.length-1?(t(),o("button",{key:1,class:"card-reorder-btn",title:"Move card down",onClick:ue($e=>de(x.id,ne,ne+1),["prevent"])},[...w[11]||(w[11]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"6 9 12 15 18 9"})],-1)])],8,Do)):C("",!0)]),e("button",{class:"card-move-btn",title:"Move to lane",onClick:ue($e=>be(K,x.id),["prevent"])},[...w[12]||(w[12]=[Ue('<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 4 19 4 19 8"></polyline><line x1="14" y1="10" x2="19" y2="4"></line><polyline points="9 20 5 20 5 16"></polyline><line x1="10" y1="14" x2="5" y2="20"></line></svg>',1)])],8,Vo),e("button",{class:"card-remove-btn",title:"Remove from board",onClick:ue($e=>ae(K.id),["prevent"])}," × ",8,No)],42,Ao)],64)}),128)),E.value==="card"&&r.value===x.id&&a.value===(((Te=x.cards)==null?void 0:Te.length)||0)?(t(),o("div",Io)):C("",!0),(je=x.cards)!=null&&je.length?C("",!0):(t(),o("div",Ko,[...w[13]||(w[13]=[e("span",null,"Drop sessions here",-1)])]))]),e("div",Go,[x.onEnterTemplateId?(t(),o("span",Ho," Auto: triggers template on entry ")):x.onEnterPrompt?(t(),o("span",qo," Auto: runs custom prompt on entry ")):C("",!0),e("button",{class:"add-session-btn",onClick:K=>ve(x)}," + Add Session ",8,Wo)])],40,$o)}),128)),e("div",zo,[p.value?(t(),o("div",Yo,[G(e("input",{"onUpdate:modelValue":w[1]||(w[1]=x=>l.value=x),type:"text",placeholder:"Lane name...",class:"add-lane-input",onKeyup:[Ve(pe,["enter"]),Ve(le,["escape"])]},null,544),[[ke,l.value]]),e("div",{class:"add-lane-actions"},[e("button",{class:"add-lane-confirm",onClick:pe}," Add "),e("button",{class:"add-lane-cancel",onClick:le}," Cancel ")])])):(t(),o("button",{key:0,class:"add-lane-btn",onClick:w[0]||(w[0]=x=>p.value=!0)}," + Add Lane "))])])):(t(),o("div",ko,[...w[7]||(w[7]=[e("p",null,"Kanban board is not available for this project.",-1)])])),Q(Je,{"is-open":g.value,"project-id":u.projectId,"lane-id":(N=i.value)==null?void 0:N.id,"lane-name":(z=i.value)==null?void 0:z.name,"onUpdate:isOpen":w[2]||(w[2]=x=>g.value=x),onClose:fe,onAdded:D},null,8,["is-open","project-id","lane-id","lane-name"]),Q(ho,{"is-open":j.value,"project-id":u.projectId,lane:$.value,"onUpdate:isOpen":w[3]||(w[3]=x=>j.value=x),onClose:d,onUpdated:s,onDeleted:y},null,8,["is-open","project-id","lane"]),Q(ot,{"is-open":T.value,"project-id":u.projectId,"card-id":(se=h.value)==null?void 0:se.id,"current-lane-id":I.value,"session-name":(re=(he=(ge=h.value)==null?void 0:ge.sessions)==null?void 0:he[0])==null?void 0:re.name,"onUpdate:isOpen":w[4]||(w[4]=x=>T.value=x),onClose:O,onMoved:k},null,8,["is-open","project-id","card-id","current-lane-id","session-name"])])}}},Qo={class:"container"},Xo={class:"page-header"},Zo={class:"project-title"},ea=["href"],ta={class:"tabs"},sa={class:"tabs-desktop"},na={class:"tabs-left"},oa={class:"tabs-mobile"},aa=["value"],la={key:0,value:"kanban"},ra={key:2,class:"tab-spacer"},ia={key:3},da={key:0,class:"skeleton-list"},ua={key:1,class:"error-message"},ca={key:2,class:"empty-state"},ma={key:3,class:"empty-state"},pa={key:4,class:"session-list"},va={key:5},fa={key:6},ha={class:"modal-content lane-selector-modal"},ba={class:"modal-body"},ga={class:"modal-description"},ya={class:"lane-options"},ka=["onClick"],Sa={class:"lane-option-name"},$a={class:"lane-option-count"},Ca={key:0,class:"empty-lanes"},Va={__name:"SessionListView",setup(u){const c=et(),m=Ke(),p=De(),l=we(),E=Re(),R=Ge();vt(),R.restoreCollapsedLogState();const _=V(()=>{switch(c.name){case"ArchivedSessions":return"archived";case"ProjectTemplates":return"templates";case"ProjectCommands":return"commands";case"ScheduledSessions":return"scheduled";case"ProjectKanban":return"kanban";default:return"sessions"}});function S(O){const k=c.params.id,M={sessions:`/projects/${k}/sessions`,archived:`/projects/${k}/archived`,templates:`/projects/${k}/templates`,commands:`/projects/${k}/commands`,scheduled:`/projects/${k}/scheduled`,kanban:`/projects/${k}/kanban`};m.push(M[O])}const r=V(()=>c.params.id),{summaries:a,loadingSummaries:g,summaryErrors:i,fetchSummariesBatch:j,retryFetchSummary:$,updateSummary:T,cleanupSummary:h}=mt(),{filteredGroupedSessions:I}=Ye(),{archivedLoaded:Y}=pt(r,{fetchSummariesBatch:j,updateSummary:T,cleanupSummary:h}),L=V(()=>l.scheduledSessions||[]),f=V(()=>l.loadingScheduled||!1);let n=null;me(()=>l.sessions,()=>{clearTimeout(n),n=setTimeout(()=>{j(l.sessions)},400)}),me(()=>c.name,async O=>{O==="ArchivedSessions"?await B():O==="ScheduledSessions"&&await q()},{immediate:!0}),me(()=>l.starredFilter,async(O,k)=>{_.value==="archived"&&Y.value&&O!==k&&(await l.fetchArchivedSessions(r.value,{reset:!0}),j(l.archivedSessions))});async function B(){Y.value||(await l.fetchArchivedSessions(r.value,{reset:!0}),Y.value=!0,j(l.archivedSessions))}async function b(){await l.loadMoreArchivedSessions(r.value),j(l.archivedSessions)}async function q(){await l.fetchScheduledSessions(r.value)}const J=A(!1),H=A(null),ee=A(!1);function te(O){const k=l.sessions.find(M=>M.id===O);H.value=k||{id:O},J.value=!0}async function de(O){if(H.value){ee.value=!0;try{await l.archiveSession(H.value.id,{cleanup:O}),le.success("Session archived")}catch(k){le.error(k.message||"Failed to archive session")}finally{ee.value=!1,J.value=!1,H.value=null}}}function ae(){J.value=!1,H.value=null}async function pe(O){try{await l.unarchiveSession(O)}catch(k){console.error("Failed to unarchive session:",k)}}const le=Fe(),ve=A(!1),fe=A(null),D=A(!1),P=A(null);function d(O){P.value=O,D.value=!0}function s(){D.value=!1,P.value=null}async function y(O){if(!(!P.value||!O))try{await E.addSessionToBoard(c.params.id,P.value.id,O.id),le.success(`Session added to "${O.name}"`),s()}catch(k){console.error("Failed to add session to board:",k),le.error(k.message||"Failed to add session to board")}}function be(){ve.value=!1,fe.value=null}return Pe(()=>{l.restoreStatusFilter(),l.restoreStarredFilter(),l.restoreScheduledFilter();const O=c.params.id;O&&E.fetchBoard(O).catch(k=>{console.warn("Failed to fetch kanban board:",k)})}),Be(()=>{clearTimeout(n)}),(O,k)=>{var w,W,N,z,se,ge,he,re,x,_e,Te,je,K,ne;const M=Me("router-link");return t(),o("div",Qo,[e("div",Xo,[e("div",null,[e("div",Zo,[e("h1",null,F(((w=v(p).currentProject)==null?void 0:w.name)||"Sessions"),1),(W=v(p).currentProject)!=null&&W.repoUrl?(t(),o("a",{key:0,href:v(p).currentProject.repoUrl,target:"_blank",rel:"noopener noreferrer",class:"repo-link",title:"Open repository"},[...k[8]||(k[8]=[e("svg",{class:"repo-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6m4-3l6 6m0 0l-6 6m6-6H9"})],-1)])],8,ea)):C("",!0),Q(M,{to:`/projects/${v(c).params.id}/edit`,class:"settings-link",title:"Project settings"},{default:ye(()=>[...k[9]||(k[9]=[e("svg",{class:"settings-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M12.22 2h-.44a2 2 0 00-2 2v.18a2 2 0 01-1 1.73l-.43.25a2 2 0 01-2 0l-.15-.08a2 2 0 00-2.73.73l-.22.38a2 2 0 00.73 2.73l.15.1a2 2 0 011 1.72v.51a2 2 0 01-1 1.74l-.15.09a2 2 0 00-.73 2.73l.22.38a2 2 0 002.73.73l.15-.08a2 2 0 012 0l.43.25a2 2 0 011 1.73V20a2 2 0 002 2h.44a2 2 0 002-2v-.18a2 2 0 011-1.73l.43-.25a2 2 0 012 0l.15.08a2 2 0 002.73-.73l.22-.39a2 2 0 00-.73-2.73l-.15-.08a2 2 0 01-1-1.74v-.5a2 2 0 011-1.74l.15-.09a2 2 0 00.73-2.73l-.22-.38a2 2 0 00-2.73-.73l-.15.08a2 2 0 01-2 0l-.43-.25a2 2 0 01-1-1.73V4a2 2 0 00-2-2z"}),e("circle",{cx:"12",cy:"12",r:"3"})],-1)])]),_:1},8,["to"])])]),_.value==="sessions"?(t(),oe(M,{key:0,to:`/projects/${v(c).params.id}/sessions/new`,class:"btn btn-primary mobile-only"},{default:ye(()=>[...k[10]||(k[10]=[ce(" + Session ",-1)])]),_:1},8,["to"])):C("",!0)]),e("div",ta,[e("div",sa,[e("div",na,[e("button",{class:ie(["tab",{active:_.value==="sessions"}]),onClick:k[0]||(k[0]=U=>v(m).push(`/projects/${v(c).params.id}/sessions`))}," Sessions ",2),e("button",{class:ie(["tab",{active:_.value==="archived"}]),onClick:k[1]||(k[1]=U=>v(m).push(`/projects/${v(c).params.id}/archived`))}," Archived ",2),e("button",{class:ie(["tab",{active:_.value==="templates"}]),onClick:k[2]||(k[2]=U=>v(m).push(`/projects/${v(c).params.id}/templates`))}," Templates ",2),e("button",{class:ie(["tab",{active:_.value==="commands"}]),onClick:k[3]||(k[3]=U=>v(m).push(`/projects/${v(c).params.id}/commands`))}," Commands ",2),e("button",{class:ie(["tab",{active:_.value==="scheduled"}]),onClick:k[4]||(k[4]=U=>v(m).push(`/projects/${v(c).params.id}/scheduled`))}," Scheduled ",2),(N=v(p).currentProject)!=null&&N.kanbanEnabled?(t(),o("button",{key:0,class:ie(["tab",{active:_.value==="kanban"}]),onClick:k[5]||(k[5]=U=>v(m).push(`/projects/${v(c).params.id}/kanban`))}," Kanban ",2)):C("",!0)]),_.value==="sessions"?(t(),oe(M,{key:0,to:`/projects/${v(c).params.id}/sessions/new`,class:"btn btn-primary desktop-only","aria-label":"New Session"},{default:ye(()=>[...k[11]||(k[11]=[e("span",{class:"add-session-label-full"},"+ Session",-1),e("span",{class:"add-session-label-short"},"+",-1)])]),_:1},8,["to"])):C("",!0)]),e("div",oa,[e("select",{value:_.value,class:"tab-select",onChange:k[6]||(k[6]=U=>S(U.target.value))},[k[12]||(k[12]=Ue('<option value="sessions"> Sessions </option><option value="archived"> Archived </option><option value="templates"> Templates </option><option value="commands"> Commands </option><option value="scheduled"> Scheduled </option>',5)),(z=v(p).currentProject)!=null&&z.kanbanEnabled?(t(),o("option",la," Kanban ")):C("",!0)],40,aa)])]),_.value==="sessions"?(t(),oe(Ne,{key:0,"show-status-filters":!0,"show-scheduled-filter":!0})):_.value==="archived"?(t(),oe(Ne,{key:1,"show-status-filters":!1,"show-scheduled-filter":!1})):(t(),o("div",ra)),_.value==="sessions"?(t(),o("div",ia,[v(l).loading?(t(),o("div",da,[(t(),o(X,null,Z(3,U=>e("div",{key:U,class:"skeleton card",style:{height:"120px"}})),64))])):v(l).error?(t(),o("div",ua,F(v(l).error),1)):v(l).sessions.length===0?(t(),o("div",ca,[k[14]||(k[14]=e("p",null,"No sessions yet. Start a new session to interact with the agent.",-1)),Q(M,{to:`/projects/${v(c).params.id}/sessions/new`,class:"btn btn-primary"},{default:ye(()=>[...k[13]||(k[13]=[ce(" New Session ",-1)])]),_:1},8,["to"])])):v(I).length===0?(t(),o("div",ma,[...k[15]||(k[15]=[e("p",null,"No sessions match the current filter.",-1)])])):(t(),o("div",pa,[(t(!0),o(X,null,Z(v(I),U=>{var Se;return t(),oe(qe,{key:U.parent.id,session:U.parent,"show-summary":!0,summary:v(a)[U.parent.id],"summary-loading":v(g)[U.parent.id],"summary-error":v(i)[U.parent.id],"show-archive":!0,"kanban-enabled":((Se=v(p).currentProject)==null?void 0:Se.kanbanEnabled)??!0,"pr-url":U.parent.prUrl,"pr-summary":v(a)[U.parent.id],onRetrySummary:v($),onArchive:te,onAddToBoard:d},null,8,["session","summary","summary-loading","summary-error","kanban-enabled","pr-url","pr-summary","onRetrySummary"])}),128))]))])):C("",!0),_.value==="archived"?(t(),oe(Ut,{key:4,summaries:v(a),"loading-summaries":v(g),"summary-errors":v(i),onRetrySummary:v($),onUnarchive:pe,onLoadMore:b},null,8,["summaries","loading-summaries","summary-errors","onRetrySummary"])):C("",!0),_.value==="templates"?(t(),o("div",va,[Q(Ys,{"project-id":v(c).params.id},null,8,["project-id"])])):C("",!0),_.value==="commands"?(t(),o("div",fa,[Q(cn,{"project-id":v(c).params.id},null,8,["project-id"])])):C("",!0),_.value==="scheduled"?(t(),oe(ls,{key:7,sessions:L.value,loading:f.value},null,8,["sessions","loading"])):C("",!0),_.value==="kanban"?(t(),oe(Jo,{key:8,"project-id":v(c).params.id},null,8,["project-id"])):C("",!0),Q(Je,{"is-open":ve.value,"project-id":v(c).params.id,"lane-id":(se=fe.value)==null?void 0:se.id,"lane-name":(ge=fe.value)==null?void 0:ge.name,"onUpdate:isOpen":k[7]||(k[7]=U=>ve.value=U),onClose:be},null,8,["is-open","project-id","lane-id","lane-name"]),D.value?(t(),o("div",{key:9,class:"modal-backdrop",onClick:ue(s,["self"])},[e("div",ha,[e("div",{class:"modal-header"},[k[16]||(k[16]=e("h2",{class:"modal-title"}," Add to Kanban Board ",-1)),e("button",{class:"close-btn","aria-label":"Close",onClick:s}," × ")]),e("div",ba,[e("p",ga,' Select a lane to add "'+F((he=P.value)==null?void 0:he.name)+'" to: ',1),e("div",ya,[(t(!0),o(X,null,Z((re=v(E).board)==null?void 0:re.lanes,U=>{var Se;return t(),o("button",{key:U.id,class:"lane-option-btn",onClick:$e=>y(U)},[e("span",Sa,F(U.name),1),e("span",$a,F(((Se=U.cards)==null?void 0:Se.length)||0)+" cards",1)],8,ka)}),128))]),(_e=(x=v(E).board)==null?void 0:x.lanes)!=null&&_e.length?C("",!0):(t(),o("p",Ca," No lanes available. Go to the Kanban tab to create lanes first. "))]),e("div",{class:"modal-footer"},[e("button",{class:"btn btn-secondary",onClick:s}," Cancel ")])])])):C("",!0),Q(at,{"is-open":J.value,"session-name":((Te=H.value)==null?void 0:Te.name)||"this session","has-cleanup-script":!!((je=v(p).currentProject)!=null&&je.onSessionDeleted&&((K=H.value)!=null&&K.gitWorktree)&&!((ne=H.value)!=null&&ne.parentSessionId)),loading:ee.value,onConfirm:de,onCancel:ae},null,8,["is-open","session-name","has-cleanup-script","loading"])])}}};export{Va as default};