circuschief 1.0.0 → 1.1.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 (89) hide show
  1. package/package.json +1 -1
  2. package/packages/server/src/agents/AgentGateway.js +2 -0
  3. package/packages/server/src/agents/adapters/GeminiAdapter.js +105 -0
  4. package/packages/server/src/agents/adapters/cliUtils.js +15 -0
  5. package/packages/server/src/agents/adapters/codexCliRunner.js +1 -8
  6. package/packages/server/src/agents/adapters/geminiCliRunner.js +183 -0
  7. package/packages/server/src/agents/adapters/geminiEventMapper.js +195 -0
  8. package/packages/server/src/db/ProviderRepository.js +4 -2
  9. package/packages/server/src/db/migrations/index.js +9 -0
  10. package/packages/server/src/db/migrations/providerMigrations.js +88 -3
  11. package/packages/server/src/db/seedBaselineData.js +23 -1
  12. package/packages/server/src/schema.sql +1 -1
  13. package/packages/server/src/services/e2eSpawnCapture.js +47 -6
  14. package/packages/server/src/services/geminiSpawnHelper.js +47 -0
  15. package/packages/server/src/services/gitDiff.js +22 -47
  16. package/packages/server/src/services/gitService.js +6 -2
  17. package/packages/server/src/services/providerTestService.js +59 -1
  18. package/packages/server/src/services/queryParamBuilder.js +33 -1
  19. package/packages/server/src/services/sessionExecution.js +4 -0
  20. package/packages/server/src/services/sessionPrompts.js +22 -0
  21. package/packages/server/src/services/sessionProvider.js +41 -1
  22. package/packages/shared/src/constants.js +1 -1
  23. package/packages/shared/src/contracts/providers.js +1 -1
  24. package/packages/shared/src/types.js +7 -0
  25. package/packages/web/dist/assets/{ActiveSessionsView-Cxh8mHmB.js → ActiveSessionsView-EdNxmPmZ.js} +1 -1
  26. package/packages/web/dist/assets/{AgentLogsView-xdfI2bR6.js → AgentLogsView-C2wX0JPP.js} +1 -1
  27. package/packages/web/dist/assets/{ArchiveConfirmModal-DXZYdzHR.js → ArchiveConfirmModal-DJERn5XO.js} +1 -1
  28. package/packages/web/dist/assets/{CommandButtonDetailView-D8xfqLAp.js → CommandButtonDetailView-CBPI8-US.js} +1 -1
  29. package/packages/web/dist/assets/EffortLevelSelector-PaBpUveC.js +1 -0
  30. package/packages/web/dist/assets/{GeneralSettingsView-sPXkLlLy.js → GeneralSettingsView-Dw-x83R0.js} +1 -1
  31. package/packages/web/dist/assets/{InputWithButton-B-o0DgMH.js → InputWithButton-CHHcpF4I.js} +1 -1
  32. package/packages/web/dist/assets/{InterpolationHelp-Dxn1li4l.js → InterpolationHelp-CLNPz8s8.js} +1 -1
  33. package/packages/web/dist/assets/MarkdownEditor-DYi1igfT.js +2 -0
  34. package/packages/web/dist/assets/ModelSelector-Cko_yTO5.js +1 -0
  35. package/packages/web/dist/assets/{ModelSelector-BNYKujL-.css → ModelSelector-Dtwe5xLH.css} +1 -1
  36. package/packages/web/dist/assets/{NewSessionView-BR_COfgW.js → NewSessionView-DwUfBg70.js} +1 -1
  37. package/packages/web/dist/assets/{ProjectEditView-WImU7sNd.js → ProjectEditView-CSbsea3U.js} +1 -1
  38. package/packages/web/dist/assets/{ProjectListView-CYmmAcBD.js → ProjectListView-CEc_LWZL.js} +1 -1
  39. package/packages/web/dist/assets/{ProjectNewView-DEhqw3Jv.js → ProjectNewView-D4U0uRlp.js} +1 -1
  40. package/packages/web/dist/assets/ProvidersView-2KCOiY6Q.css +1 -0
  41. package/packages/web/dist/assets/ProvidersView-CD1j8BOv.js +1 -0
  42. package/packages/web/dist/assets/{QuickResponsesPanel-BqmnTd-D.js → QuickResponsesPanel-Dp39f12o.js} +1 -1
  43. package/packages/web/dist/assets/ResizableTextarea-BWywIqOv.js +1 -0
  44. package/packages/web/dist/assets/ResizableTextarea-DERSH3Wz.css +1 -0
  45. package/packages/web/dist/assets/{SessionCard-Bw77-KwD.js → SessionCard-B6d5ijDW.js} +1 -1
  46. package/packages/web/dist/assets/{SessionDetailView-B59TEkr-.js → SessionDetailView-DWbXdx7A.js} +19 -19
  47. package/packages/web/dist/assets/{SessionDetailView-CKVBnR4T.css → SessionDetailView-ULeIkWS0.css} +1 -1
  48. package/packages/web/dist/assets/{SessionFormOptions-hqijxc0S.js → SessionFormOptions-Dz9ik4Fo.js} +1 -1
  49. package/packages/web/dist/assets/{SessionListView-DYXHM9I-.js → SessionListView-C129buBe.js} +1 -1
  50. package/packages/web/dist/assets/{SessionLogStream-5NfVr9pF.js → SessionLogStream-BvXUNNBZ.js} +1 -1
  51. package/packages/web/dist/assets/{SettingsView-DI8ncOAV.js → SettingsView-DW1NvpX_.js} +1 -1
  52. package/packages/web/dist/assets/SlashCommandWizard-DleYBxrE.js +1 -0
  53. package/packages/web/dist/assets/{SummarySettingsView-C2Qs35mm.js → SummarySettingsView-CLUfcWvf.js} +1 -1
  54. package/packages/web/dist/assets/{TemplateDetailView-zVkIvgtu.js → TemplateDetailView-Cukb205e.js} +1 -1
  55. package/packages/web/dist/assets/{commandButtons-CoU3G4zK.js → commandButtons-DejH0rVN.js} +1 -1
  56. package/packages/web/dist/assets/{index-CLRsVASf.js → index-BD7Y3rBE.js} +1 -1
  57. package/packages/web/dist/assets/{index-uySCcnA_.css → index-Bd20AzX1.css} +1 -1
  58. package/packages/web/dist/assets/{index-CslU0psO.js → index-BgJiarKe.js} +1 -1
  59. package/packages/web/dist/assets/{index-9yF1uCCA.js → index-Bk32fSSG.js} +1 -1
  60. package/packages/web/dist/assets/{index-CAGdsDh7.js → index-BkA6pF2Z.js} +1 -1
  61. package/packages/web/dist/assets/{index-DsjWqc6R.js → index-Cltr-Ldt.js} +1 -1
  62. package/packages/web/dist/assets/{index-DI4NxaWD.js → index-Co-46Tp3.js} +1 -1
  63. package/packages/web/dist/assets/{index-DUa7adFh.js → index-Cpykk857.js} +1 -1
  64. package/packages/web/dist/assets/{index-C7Ww2auW.js → index-CtABl0D1.js} +1 -1
  65. package/packages/web/dist/assets/{index-BKstCaYU.js → index-Cuqk5m9S.js} +1 -1
  66. package/packages/web/dist/assets/{index-C2QFVD7d.js → index-CvXApbVC.js} +15 -15
  67. package/packages/web/dist/assets/{index-BhbH7eOk.js → index-D2gN-xEH.js} +1 -1
  68. package/packages/web/dist/assets/{index-Bo7PdwM5.js → index-Dd3WpmyQ.js} +1 -1
  69. package/packages/web/dist/assets/{index-c99Bo3JV.js → index-Dk6--9rj.js} +1 -1
  70. package/packages/web/dist/assets/{index-BjuRttEY.js → index-MZf7MlPX.js} +3 -3
  71. package/packages/web/dist/assets/{index-CP-SxOlV.js → index-NShCcwfj.js} +1 -1
  72. package/packages/web/dist/assets/{index-rkQx2tso.js → index-hA3VEuSq.js} +1 -1
  73. package/packages/web/dist/assets/{index-DOzONENy.js → index-p0mp3nca.js} +1 -1
  74. package/packages/web/dist/assets/{index-mT1JpxDc.js → index-qntNa5r_.js} +1 -1
  75. package/packages/web/dist/assets/{index-DZBpETI5.js → index-qq9ceNSK.js} +1 -1
  76. package/packages/web/dist/assets/{projectDefaults-B8esIcYq.js → projectDefaults-D9xkp2XR.js} +1 -1
  77. package/packages/web/dist/assets/{projects-C-8PSxKi.js → projects-BvLADGKx.js} +1 -1
  78. package/packages/web/dist/assets/{providers-oXifvvqN.js → providers-DZ-fOa4G.js} +1 -1
  79. package/packages/web/dist/assets/{sessions-Nq5VafSf.js → sessions-DETEyjPI.js} +1 -1
  80. package/packages/web/dist/assets/{settings-DtpuiyT6.js → settings-TWfbahn5.js} +1 -1
  81. package/packages/web/dist/index.html +2 -2
  82. package/packages/web/dist/assets/EffortLevelSelector-D2Hdzc_8.js +0 -1
  83. package/packages/web/dist/assets/MarkdownEditor-D4Kbb-9l.js +0 -2
  84. package/packages/web/dist/assets/ModelSelector-72C7MUH4.js +0 -1
  85. package/packages/web/dist/assets/ProvidersView-XZh3jkmH.js +0 -1
  86. package/packages/web/dist/assets/ProvidersView-bZemq_Rv.css +0 -1
  87. package/packages/web/dist/assets/ResizableTextarea-BQNw5e0C.css +0 -1
  88. package/packages/web/dist/assets/ResizableTextarea-DpWdIAP6.js +0 -1
  89. package/packages/web/dist/assets/SlashCommandWizard-BQ_rMzn-.js +0 -1
@@ -1 +1 @@
1
- import{p as se,_ as N,k as J,o as X,l as T,a as i,c,b as e,m as S,q as F,s as B,f as P,e as te,v as V,d as q,i as x,n as r,x as H,t as _,j as Q,y as K,T as W,z as L,A as oe,F as A,r as Y,u as G,D as le,w as ne,B as ae,g as ie,h as re}from"./index-C2QFVD7d.js";import{u as ue}from"./projects-C-8PSxKi.js";import{u as Z}from"./projectDefaults-B8esIcYq.js";import{a as O}from"./ApiClient-DfbJwzpz.js";import{P as de}from"./InputWithButton-B-o0DgMH.js";import{M as pe}from"./ModelSelector-72C7MUH4.js";import"./providers-oXifvvqN.js";const z=se("quickResponses",{state:()=>({projectResponses:[],globalResponses:[],loading:!1,error:null,currentProjectId:null}),getters:{allResponses:a=>[...a.projectResponses,...a.globalResponses],hasResponses:a=>a.projectResponses.length>0||a.globalResponses.length>0},actions:{async fetchForProject(a){this.loading=!0,this.error=null,this.currentProjectId=a;try{const u=await O.getQuickResponses(a);return this.projectResponses=u.project,this.globalResponses=u.global,u}catch(u){throw this.error=u.message,u}finally{this.loading=!1}},async createResponse(a,u){this.loading=!0,this.error=null;try{const o=await O.createQuickResponse(a,u);return o.projectId===null?this.globalResponses.push(o):this.projectResponses.push(o),o}catch(o){throw this.error=o.message,o}finally{this.loading=!1}},async updateResponse(a,u){this.loading=!0,this.error=null;try{const o=await O.updateQuickResponse(a,u),v=this.projectResponses.findIndex(b=>b.id===a);if(v!==-1)this.projectResponses[v]=o;else{const b=this.globalResponses.findIndex(w=>w.id===a);b!==-1&&(this.globalResponses[b]=o)}return o}catch(o){throw this.error=o.message,o}finally{this.loading=!1}},async deleteResponse(a){this.loading=!0,this.error=null;try{await O.deleteQuickResponse(a);const u=this.projectResponses.findIndex(o=>o.id===a);if(u!==-1)this.projectResponses.splice(u,1);else{const o=this.globalResponses.findIndex(v=>v.id===a);o!==-1&&this.globalResponses.splice(o,1)}}catch(u){throw this.error=u.message,u}finally{this.loading=!1}},async reorderResponses(a,u){this.loading=!0,this.error=null;try{const o=u.map((v,b)=>({id:v,sortOrder:b}));if(a){const v=await O.reorderQuickResponses(a,o);this.projectResponses=v.project,this.globalResponses=v.global}else{const v=await O.reorderGlobalQuickResponses(o);this.globalResponses=v}}catch(o){throw this.error=o.message,o}finally{this.loading=!1}},clearResponses(){this.projectResponses=[],this.globalResponses=[],this.currentProjectId=null,this.error=null}}}),ce={class:"advanced-settings"},ve={class:"form-group"},fe={class:"form-group"},me={class:"checkbox-label"},be={class:"form-group"},ge={class:"form-group"},ye={class:"checkbox-label"},he={class:"form-group"},ke={class:"form-group"},Re={class:"form-group"},Se=["disabled"],Ce={key:0,class:"loading-spinner"},$e={__name:"ProjectSessionDefaults",props:{projectId:{type:String,required:!0}},setup(a,{expose:u}){const o=a,v=Z(),b=J(),w=r(""),h=r(!1),n=r(""),g=r(!0),p=r(""),y=r(""),$=r(""),k=r(null),I=r(!1);X(()=>{v.fetchDefaults(o.projectId)}),T(()=>v.getDefaultsForProject(o.projectId),d=>{d&&(w.value=d.mode||"",h.value=d.thinkingEnabled||!1,n.value=d.effortLevel??"",g.value=d.startImmediately!==!1,p.value=d.gitMode||"",y.value=d.gitBranch||"",$.value=d.model||"",k.value=d.providerId||null)},{immediate:!0});function D(){return{mode:w.value||null,thinkingEnabled:h.value,effortLevel:n.value||null,startImmediately:g.value,gitMode:p.value||null,gitBranch:y.value||null,model:$.value||null,providerId:$.value&&k.value||null}}async function U(){if(confirm("Reset all session defaults to system defaults?")){I.value=!0;try{await v.resetDefaults(o.projectId),w.value="",h.value=!1,n.value="",g.value=!0,p.value="",y.value="",$.value="",k.value=null,b.success("Session defaults reset to system defaults")}catch(d){b.error(d.message)}finally{I.value=!1}}}return u({collectNonDefaultValues:D}),(d,s)=>(i(),c("details",ce,[s[25]||(s[25]=e("summary",null,"Session Defaults",-1)),s[26]||(s[26]=e("p",{class:"form-help"}," Set default values for new sessions created in this project. These values can be overridden when creating individual sessions. ",-1)),e("div",ve,[s[9]||(s[9]=e("label",{class:"form-label",for:"defaultMode"},"Mode",-1)),S(e("select",{id:"defaultMode","onUpdate:modelValue":s[0]||(s[0]=l=>w.value=l),class:"form-input"},[...s[8]||(s[8]=[e("option",{value:""}," Use system default (standard) ",-1),e("option",{value:"plan"}," Plan ",-1),e("option",{value:"standard"}," Standard ",-1),e("option",{value:"yolo"}," YOLO ",-1)])],512),[[F,w.value]])]),e("div",fe,[e("label",me,[S(e("input",{"onUpdate:modelValue":s[1]||(s[1]=l=>h.value=l),type:"checkbox"},null,512),[[B,h.value]]),s[10]||(s[10]=P(" Enable thinking (extended thinking) by default ",-1))]),s[11]||(s[11]=e("p",{class:"form-help"}," Enable the agent's extended thinking capability for new sessions. ",-1))]),e("div",be,[s[13]||(s[13]=e("label",{class:"form-label",for:"defaultEffortLevel"},"Default Effort Level",-1)),S(e("select",{id:"defaultEffortLevel","onUpdate:modelValue":s[2]||(s[2]=l=>n.value=l),class:"form-input"},[...s[12]||(s[12]=[te('<option value="" data-v-c9a88468> Auto (default) </option><option value="low" data-v-c9a88468> Low </option><option value="medium" data-v-c9a88468> Medium </option><option value="high" data-v-c9a88468> High </option><option value="max" data-v-c9a88468> Max </option>',5)])],512),[[F,n.value]]),s[14]||(s[14]=e("p",{class:"form-help"}," Set the default effort level for new sessions. Controls how much effort the agent puts into responses. ",-1))]),e("div",ge,[e("label",ye,[S(e("input",{"onUpdate:modelValue":s[3]||(s[3]=l=>g.value=l),type:"checkbox"},null,512),[[B,g.value]]),s[15]||(s[15]=P(" Start sessions immediately ",-1))]),s[16]||(s[16]=e("p",{class:"form-help"},' When enabled, sessions will start automatically. When disabled, sessions will be created in "waiting" state. ',-1))]),e("div",he,[s[18]||(s[18]=e("label",{class:"form-label",for:"defaultGitMode"},"Git Mode",-1)),S(e("select",{id:"defaultGitMode","onUpdate:modelValue":s[4]||(s[4]=l=>p.value=l),class:"form-input"},[...s[17]||(s[17]=[e("option",{value:""}," No git isolation ",-1),e("option",{value:"branch"}," Create branch for each session ",-1),e("option",{value:"worktree"}," Create worktree for each session ",-1)])],512),[[F,p.value]]),s[19]||(s[19]=e("p",{class:"form-help"}," Controls how git changes are isolated for each session. ",-1))]),e("div",ke,[s[20]||(s[20]=e("label",{class:"form-label",for:"defaultGitBranch"},"Default Git Branch",-1)),S(e("input",{id:"defaultGitBranch","onUpdate:modelValue":s[5]||(s[5]=l=>y.value=l),type:"text",class:"form-input",placeholder:"e.g., feature/ai-implementation"},null,512),[[V,y.value]]),s[21]||(s[21]=e("p",{class:"form-help"}," When using git branch mode, this is the branch name pattern for new sessions. ",-1))]),e("div",Re,[s[22]||(s[22]=e("label",{class:"form-label",for:"defaultModel"},"Model",-1)),q(pe,{modelValue:$.value,"onUpdate:modelValue":s[6]||(s[6]=l=>$.value=l),"provider-id":k.value,"onUpdate:providerId":s[7]||(s[7]=l=>k.value=l),"allow-empty":!0,"empty-label":"Use system default","select-class":"form-input"},null,8,["modelValue","provider-id"]),s[23]||(s[23]=e("p",{class:"form-help"}," Choose the default model for new sessions in this project. ",-1))]),e("button",{type:"button",class:"btn btn-secondary",disabled:I.value,onClick:U},[I.value?(i(),c("span",Ce)):x("",!0),s[24]||(s[24]=P(" Reset to System Defaults ",-1))],8,Se)]))}},we=N($e,[["__scopeId","data-v-c9a88468"]]),Ie={class:"dialog-header"},je={class:"dialog-content"},xe={class:"form-group"},De={key:0,class:"form-error"},Ee={class:"form-group"},Pe={key:0,class:"form-error"},_e={class:"form-group"},Ue={class:"form-group"},Ve={class:"checkbox-label"},Me={key:0,class:"form-group"},Ge={class:"radio-group"},Oe={class:"radio-label"},Le={class:"radio-label"},qe={key:1,class:"error-message"},Qe={class:"dialog-footer"},Te=["disabled"],Be={__name:"QuickResponseDialog",props:{isOpen:{type:Boolean,default:!1},projectId:{type:String,required:!0},editingResponse:{type:Object,default:null},defaultIsGlobal:{type:Boolean,default:!1}},emits:["close","saved"],setup(a,{emit:u}){const o=a,v=u,b=z(),w=r(null),h=`dialog-title-${Math.random().toString(36).slice(2)}`,n=r({label:"",content:"",category:"",autoSubmit:!0,isGlobal:!1}),g=r(!1),p=r(null),y=L(()=>!!o.editingResponse),$=L(()=>n.value.label&&n.value.label.length>50?"Label must be 50 characters or less":null),k=L(()=>n.value.content&&n.value.content.length>1e4?"Content must be 10,000 characters or less":null),I=L(()=>n.value.label.trim().length>0&&n.value.label.length<=50&&n.value.content.trim().length>0&&n.value.content.length<=1e4);T(()=>o.isOpen,d=>{d&&(o.editingResponse?n.value={label:o.editingResponse.label||"",content:o.editingResponse.content||"",category:o.editingResponse.category||"",autoSubmit:o.editingResponse.autoSubmit||!1,isGlobal:o.editingResponse.projectId===null}:n.value={label:"",content:"",category:"",autoSubmit:!0,isGlobal:o.defaultIsGlobal},p.value=null,oe(()=>{var s;(s=w.value)==null||s.focus()}))}),T(()=>o.isOpen,d=>{if(d){const s=l=>{l.key==="Escape"&&D()};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)}});function D(){v("close")}async function U(){if(!(!I.value||g.value)){g.value=!0,p.value=null;try{const d={label:n.value.label.trim(),content:n.value.content,category:n.value.category.trim()||null,autoSubmit:n.value.autoSubmit};y.value?await b.updateResponse(o.editingResponse.id,d):(d.isGlobal=n.value.isGlobal,await b.createResponse(o.projectId,d)),v("saved"),v("close")}catch(d){p.value=d.message||"Failed to save quick response"}finally{g.value=!1}}}return(d,s)=>(i(),H(W,{to:"body"},[a.isOpen?(i(),c("div",{key:0,class:"dialog-overlay",onClick:Q(D,["self"])},[e("div",{class:"dialog",role:"dialog","aria-modal":"true","aria-labelledby":h},[e("div",Ie,[e("h2",{id:h,class:"dialog-title"},_(y.value?"Edit Quick Response":"Add Quick Response"),1),e("button",{class:"close-button","aria-label":"Close dialog",onClick:D}," × ")]),e("form",{class:"dialog-form",onSubmit:Q(U,["prevent"])},[e("div",je,[e("div",xe,[s[7]||(s[7]=e("label",{for:"qr-label",class:"form-label"},"Label *",-1)),S(e("input",{id:"qr-label",ref_key:"labelInput",ref:w,"onUpdate:modelValue":s[0]||(s[0]=l=>n.value.label=l),type:"text",class:"form-input",placeholder:"e.g., Yes, LGTM, Run tests",maxlength:"50",required:"",onBlur:s[1]||(s[1]=l=>n.value.label=n.value.label.trim())},null,544),[[V,n.value.label]]),s[8]||(s[8]=e("span",{class:"form-help"},"Short text shown on the button (max 50 characters)",-1)),$.value?(i(),c("span",De,_($.value),1)):x("",!0)]),e("div",Ee,[s[9]||(s[9]=e("label",{for:"qr-content",class:"form-label"},"Content *",-1)),S(e("textarea",{id:"qr-content","onUpdate:modelValue":s[2]||(s[2]=l=>n.value.content=l),class:"form-textarea",placeholder:"The full message that will be inserted into the prompt",rows:"4",maxlength:"10000",required:""},null,512),[[V,n.value.content]]),s[10]||(s[10]=e("span",{class:"form-help"},"The full message that will be inserted (max 10,000 characters)",-1)),k.value?(i(),c("span",Pe,_(k.value),1)):x("",!0)]),e("div",_e,[s[11]||(s[11]=e("label",{for:"qr-category",class:"form-label"},"Category (optional)",-1)),S(e("input",{id:"qr-category","onUpdate:modelValue":s[3]||(s[3]=l=>n.value.category=l),type:"text",class:"form-input",placeholder:"e.g., feedback, commands",maxlength:"50"},null,512),[[V,n.value.category]]),s[12]||(s[12]=e("span",{class:"form-help"},"Optional grouping for organization",-1))]),e("div",Ue,[e("label",Ve,[S(e("input",{"onUpdate:modelValue":s[4]||(s[4]=l=>n.value.autoSubmit=l),type:"checkbox",class:"checkbox-input"},null,512),[[B,n.value.autoSubmit]]),s[13]||(s[13]=e("span",{class:"checkbox-text"},"Auto-submit",-1))]),s[14]||(s[14]=e("span",{class:"form-help indent"},"Send immediately when clicked (no confirmation)",-1))]),y.value?x("",!0):(i(),c("div",Me,[s[17]||(s[17]=e("span",{class:"form-label"},"Scope",-1)),e("div",Ge,[e("label",Oe,[S(e("input",{"onUpdate:modelValue":s[5]||(s[5]=l=>n.value.isGlobal=l),type:"radio",value:!1,class:"radio-input"},null,512),[[K,n.value.isGlobal]]),s[15]||(s[15]=e("span",{class:"radio-text"},"Project-specific",-1))]),e("label",Le,[S(e("input",{"onUpdate:modelValue":s[6]||(s[6]=l=>n.value.isGlobal=l),type:"radio",value:!0,class:"radio-input"},null,512),[[K,n.value.isGlobal]]),s[16]||(s[16]=e("span",{class:"radio-text"},"Global (all projects)",-1))])])])),p.value?(i(),c("div",qe,_(p.value),1)):x("",!0)]),e("div",Qe,[e("button",{type:"button",class:"btn btn-secondary",onClick:D}," Cancel "),e("button",{type:"submit",class:"btn btn-primary",disabled:!I.value||g.value},_(g.value?"Saving...":y.value?"Save Changes":"Save Quick Response"),9,Te)])],32)])])):x("",!0)]))}},Ne=N(Be,[["__scopeId","data-v-6efa077c"]]),Fe={class:"settings-panel",role:"dialog","aria-modal":"true"},Ae={class:"settings-header"},He={class:"settings-content"},We={class:"section"},ze={class:"section-header"},Ke={key:0,class:"loading-state"},Ye={key:1,class:"empty-state"},Je={key:2,class:"response-list"},Xe={class:"response-info"},Ze={class:"response-label"},es={class:"response-content"},ss={key:0,class:"auto-badge"},ts={class:"response-actions"},os=["disabled","onClick"],ls=["disabled","onClick"],ns=["onClick"],as=["onClick"],is={class:"section"},rs={class:"section-header"},us={key:0,class:"loading-state"},ds={key:1,class:"empty-state"},ps={key:2,class:"response-list"},cs={class:"response-info"},vs={class:"response-label"},fs={class:"response-content"},ms={key:0,class:"auto-badge"},bs={class:"response-actions"},gs=["disabled","onClick"],ys=["disabled","onClick"],hs=["onClick"],ks=["onClick"],Rs={class:"confirm-dialog"},Ss={class:"confirm-message"},Cs={class:"confirm-actions"},$s={__name:"QuickResponseSettings",props:{isOpen:{type:Boolean,default:!1},projectId:{type:String,required:!0}},emits:["close"],setup(a,{expose:u}){const o=z(),v=r(!1),b=r(null),w=r(!1),h=r(null),n=L(()=>o.loading),g=L(()=>o.projectResponses),p=L(()=>o.globalResponses);function y(l){return l.length<=60?l:`${l.substring(0,60)}...`}function $(l){b.value=null,w.value=l,v.value=!0}function k(l){b.value=l,w.value=l.projectId===null,v.value=!0}function I(){v.value=!1,b.value=null}function D(){}function U(l){h.value=l}async function d(){if(h.value)try{await o.deleteResponse(h.value.id),h.value=null}catch(l){console.error("Failed to delete response:",l)}}async function s(l,f,m,E){const j=m+E;if(j<0||j>=f.length)return;const M=[...f];[M[m],M[j]]=[M[j],M[m]];const R=M.map(t=>t.id);try{await o.reorderResponses(l,R)}catch(t){console.error("Failed to reorder responses:",t)}}return u({moveResponse:s}),(l,f)=>(i(),c(A,null,[(i(),H(W,{to:"body"},[a.isOpen?(i(),c("div",{key:0,class:"settings-overlay",onClick:f[3]||(f[3]=Q(m=>l.$emit("close"),["self"]))},[e("div",Fe,[e("div",Ae,[f[6]||(f[6]=e("h2",{class:"settings-title"}," Quick Responses ",-1)),e("button",{class:"close-button","aria-label":"Close settings",onClick:f[0]||(f[0]=m=>l.$emit("close"))}," × ")]),e("div",He,[e("div",We,[e("div",ze,[f[7]||(f[7]=e("h3",{class:"section-title"}," Project Responses ",-1)),e("button",{class:"add-button",onClick:f[1]||(f[1]=m=>$(!1))}," + Add ")]),n.value?(i(),c("div",Ke," Loading... ")):g.value.length===0?(i(),c("div",Ye," No project-specific quick responses yet. ")):(i(),c("ul",Je,[(i(!0),c(A,null,Y(g.value,(m,E)=>(i(),c("li",{key:m.id,class:"response-item"},[e("div",Xe,[e("span",Ze,_(m.label),1),e("span",es,_(y(m.content)),1),m.autoSubmit?(i(),c("span",ss,"Auto-submit")):x("",!0)]),e("div",ts,[e("button",{class:"action-button",disabled:E===0,title:"Move up",onClick:j=>s(a.projectId,g.value,E,-1)}," ↑ ",8,os),e("button",{class:"action-button",disabled:E===g.value.length-1,title:"Move down",onClick:j=>s(a.projectId,g.value,E,1)}," ↓ ",8,ls),e("button",{class:"action-button",title:"Edit","aria-label":"Edit",onClick:j=>k(m)}," ✏️ ",8,ns),e("button",{class:"action-button action-danger",title:"Delete",onClick:j=>U(m)}," 🗑️ ",8,as)])]))),128))]))]),e("div",is,[e("div",rs,[f[8]||(f[8]=e("h3",{class:"section-title"}," Global Responses ",-1)),e("button",{class:"add-button",onClick:f[2]||(f[2]=m=>$(!0))}," + Add ")]),n.value?(i(),c("div",us," Loading... ")):p.value.length===0?(i(),c("div",ds," No global quick responses yet. Global responses appear in all projects. ")):(i(),c("ul",ps,[(i(!0),c(A,null,Y(p.value,(m,E)=>(i(),c("li",{key:m.id,class:"response-item"},[e("div",cs,[e("span",vs,_(m.label),1),e("span",fs,_(y(m.content)),1),m.autoSubmit?(i(),c("span",ms,"Auto-submit")):x("",!0)]),e("div",bs,[e("button",{class:"action-button",disabled:E===0,title:"Move up",onClick:j=>s(null,p.value,E,-1)}," ↑ ",8,gs),e("button",{class:"action-button",disabled:E===p.value.length-1,title:"Move down",onClick:j=>s(null,p.value,E,1)}," ↓ ",8,ys),e("button",{class:"action-button",title:"Edit","aria-label":"Edit",onClick:j=>k(m)}," ✏️ ",8,hs),e("button",{class:"action-button action-danger",title:"Delete",onClick:j=>U(m)}," 🗑️ ",8,ks)])]))),128))]))])])])])):x("",!0)])),q(Ne,{"is-open":v.value,"project-id":a.projectId,"editing-response":b.value,"default-is-global":w.value,onClose:I,onSaved:D},null,8,["is-open","project-id","editing-response","default-is-global"]),(i(),H(W,{to:"body"},[h.value?(i(),c("div",{key:0,class:"confirm-overlay",onClick:f[5]||(f[5]=Q(m=>h.value=null,["self"]))},[e("div",Rs,[e("p",Ss,' Are you sure you want to delete "'+_(h.value.label)+'"? ',1),e("div",Cs,[e("button",{class:"btn btn-secondary",onClick:f[4]||(f[4]=m=>h.value=null)}," Cancel "),e("button",{class:"btn btn-danger",onClick:d}," Delete ")])])])):x("",!0)]))],64))}},ws=N($s,[["__scopeId","data-v-63dc5bd1"]]),Is={class:"container"},js={key:0,class:"loading-state"},xs={class:"form-group"},Ds={class:"form-group"},Es={class:"form-group"},Ps={class:"input-with-button"},_s=["placeholder"],Us=["disabled"],Vs={class:"form-help"},Ms={class:"form-group"},Gs={class:"form-group"},Os={class:"form-label",for:"systemPrompt"},Ls={class:"advanced-settings"},qs={class:"form-group"},Qs={class:"form-group"},Ts={class:"advanced-settings"},Bs={class:"advanced-settings"},Ns={class:"form-group"},Fs={class:"checkbox-label"},As={key:0,class:"error-message"},Hs={class:"form-actions"},Ws={class:"form-actions-right"},zs=["disabled"],Ks={key:0,class:"loading-spinner"},Ys={__name:"ProjectEditView",setup(a){const u=le,o=ae(),v=re(),b=ue(),w=Z(),h=z(),n=J(),g=r(""),p=r(""),y=r(""),$=r(""),k=r(""),I=r(""),D=r(""),U=r(!1),d=r(!1),s=r(null),l=r(!1),f=r(null),m=r(!1);X(()=>{b.fetchProject(o.params.id),h.fetchForProject(o.params.id)}),T(()=>b.currentProject,R=>{R&&(g.value=R.name,p.value=R.workingDirectory,y.value=R.worktreePath||"",$.value=R.repoUrl||"",k.value=R.systemPrompt||u,I.value=R.onSessionCreated||"",D.value=R.onSessionDeleted||"",U.value=R.kanbanEnabled||!1)},{immediate:!0});async function E(){if(p.value){d.value=!0;try{const R=await O.detectWorktreePath(p.value);y.value=R.worktreePath}catch{}finally{d.value=!1}}}async function j(){var R;l.value=!0,f.value=null;try{const t=(R=s.value)==null?void 0:R.collectNonDefaultValues();await b.updateProject(o.params.id,{name:g.value,workingDirectory:p.value,worktreePath:y.value||null,repoUrl:$.value||null,systemPrompt:k.value===u?null:k.value,onSessionCreated:I.value||null,onSessionDeleted:D.value||null,kanbanEnabled:U.value}),t&&Object.keys(t).length>0&&await w.updateDefaults(o.params.id,t),n.success("Repository updated"),v.push(`/projects/${o.params.id}/sessions`)}catch(t){f.value=t.message}finally{l.value=!1}}async function M(){if(confirm("Are you sure you want to delete this project?"))try{await b.deleteProject(o.params.id),n.success("Repository removed"),v.push("/")}catch(R){f.value=R.message}}return(R,t)=>{const ee=ie("router-link");return i(),c("div",Is,[t[34]||(t[34]=e("h1",null,"Edit Project",-1)),G(b).loading?(i(),c("div",js,[...t[11]||(t[11]=[e("span",{class:"loading-spinner"},null,-1),P(" Loading... ",-1)])])):G(b).currentProject?(i(),c("form",{key:1,class:"form card",onSubmit:Q(j,["prevent"])},[e("div",xs,[t[12]||(t[12]=e("label",{class:"form-label",for:"name"},"Project Name",-1)),S(e("input",{id:"name","onUpdate:modelValue":t[0]||(t[0]=C=>g.value=C),type:"text",class:"form-input",required:""},null,512),[[V,g.value]])]),e("div",Ds,[t[13]||(t[13]=e("label",{class:"form-label",for:"workingDirectory"},"Working Directory",-1)),q(de,{modelValue:p.value,"onUpdate:modelValue":t[1]||(t[1]=C=>p.value=C)},null,8,["modelValue"])]),e("div",Es,[t[17]||(t[17]=e("label",{class:"form-label",for:"worktreePath"},"Worktree Path",-1)),e("div",Ps,[S(e("input",{id:"worktreePath","onUpdate:modelValue":t[2]||(t[2]=C=>y.value=C),type:"text",class:"form-input",placeholder:p.value+"/.worktrees"},null,8,_s),[[V,y.value]]),e("button",{type:"button",class:"btn btn-secondary btn-sm",disabled:!p.value||d.value,onClick:E}," Detect ",8,Us)]),e("p",Vs,[t[14]||(t[14]=P(" Where git worktrees are created for sessions. Changing this only affects new sessions. ",-1)),t[15]||(t[15]=e("br",null,null,-1)),t[16]||(t[16]=P("Effective path: ",-1)),e("code",null,_(y.value||(p.value?`${p.value}/.worktrees`:""))+"/{sessionId}",1)])]),e("div",Ms,[t[18]||(t[18]=e("label",{class:"form-label",for:"repoUrl"},"Repository URL",-1)),S(e("input",{id:"repoUrl","onUpdate:modelValue":t[3]||(t[3]=C=>$.value=C),type:"url",class:"form-input",placeholder:"https://github.com/username/repo"},null,512),[[V,$.value]]),t[19]||(t[19]=e("p",{class:"form-help"}," Link to the project's repository (e.g., GitHub, GitLab). This can be automatically populated from session summaries. ",-1))]),e("div",Gs,[e("label",Os,[t[20]||(t[20]=P(" System Prompt ",-1)),k.value!==G(u)?(i(),c("button",{key:0,type:"button",class:"btn-link",onClick:t[4]||(t[4]=C=>k.value=G(u))}," Reset to Default ")):x("",!0)]),S(e("textarea",{id:"systemPrompt","onUpdate:modelValue":t[5]||(t[5]=C=>k.value=C),class:"form-input form-textarea",rows:"8"},null,512),[[V,k.value]]),t[21]||(t[21]=e("p",{class:"form-help"}," Customize the system prompt for the AI agent. The default prompt is pre-filled above. ",-1))]),e("details",Ls,[t[26]||(t[26]=e("summary",null,"Session Lifecycle Hooks",-1)),e("div",qs,[t[22]||(t[22]=e("label",{class:"form-label",for:"onSessionCreated"},"On Session Created",-1)),S(e("textarea",{id:"onSessionCreated","onUpdate:modelValue":t[6]||(t[6]=C=>I.value=C),class:"form-input form-textarea-small",rows:"3",placeholder:"Shell command to run when a session is created..."},null,512),[[V,I.value]]),t[23]||(t[23]=e("p",{class:"form-help"}," Runs in the background after session creation. Environment variables: CIRCUSCHIEF_SESSION_ID, CIRCUSCHIEF_PROJECT_ID, CIRCUSCHIEF_SESSION_NAME ",-1))]),e("div",Qs,[t[24]||(t[24]=e("label",{class:"form-label",for:"onSessionDeleted"},"On Session Deleted",-1)),S(e("textarea",{id:"onSessionDeleted","onUpdate:modelValue":t[7]||(t[7]=C=>D.value=C),class:"form-input form-textarea-small",rows:"3",placeholder:"Shell command to run when a session is deleted..."},null,512),[[V,D.value]]),t[25]||(t[25]=e("p",{class:"form-help"}," Runs in the background after session deletion. Environment variables: CIRCUSCHIEF_SESSION_ID, CIRCUSCHIEF_PROJECT_ID, CIRCUSCHIEF_SESSION_NAME ",-1))])]),q(we,{ref_key:"sessionDefaultsRef",ref:s,"project-id":G(o).params.id},null,8,["project-id"]),e("details",Ts,[t[27]||(t[27]=e("summary",null,"Quick Responses",-1)),t[28]||(t[28]=e("p",{class:"form-help"}," Quick responses are shortcuts that can be inserted into the chat input. You can create project-specific or global responses. ",-1)),e("button",{type:"button",class:"btn btn-secondary",onClick:t[8]||(t[8]=C=>m.value=!0)}," Manage Quick Responses ")]),e("details",Bs,[t[31]||(t[31]=e("summary",null,[P("Kanban Board "),e("span",{class:"inline-block rounded bg-amber-900/50 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-amber-300 ml-2"},"Experimental")],-1)),e("div",Ns,[e("label",Fs,[S(e("input",{"onUpdate:modelValue":t[9]||(t[9]=C=>U.value=C),type:"checkbox"},null,512),[[B,U.value]]),t[29]||(t[29]=P(" Enable Kanban board ",-1))]),t[30]||(t[30]=e("p",{class:"form-help"},[e("strong",null,"Experimental."),P(" This feature is in active development and may change or be removed. Enable a Kanban board to visually organize sessions into lanes. Sessions can be dragged between lanes, and lanes can trigger automated workflows. ")],-1))])]),f.value?(i(),c("div",As,_(f.value),1)):x("",!0),e("div",Hs,[e("button",{type:"button",class:"btn btn-danger",onClick:M}," Delete "),e("div",Ws,[q(ee,{to:`/projects/${G(o).params.id}/sessions`,class:"btn"},{default:ne(()=>[...t[32]||(t[32]=[P(" Cancel ",-1)])]),_:1},8,["to"]),e("button",{type:"submit",class:"btn btn-primary",disabled:l.value},[l.value?(i(),c("span",Ks)):x("",!0),t[33]||(t[33]=P(" Save ",-1))],8,zs)])])],32)):x("",!0),q(ws,{"is-open":m.value,"project-id":G(o).params.id,onClose:t[10]||(t[10]=C=>m.value=!1)},null,8,["is-open","project-id"])])}}},lt=N(Ys,[["__scopeId","data-v-2f1cd4c6"]]);export{lt as default};
1
+ import{p as se,_ as N,k as J,o as X,l as T,a as i,c,b as e,m as S,q as F,s as B,f as P,e as te,v as V,d as q,i as x,n as r,x as H,t as _,j as Q,y as K,T as W,z as L,A as oe,F as A,r as Y,u as G,D as le,w as ne,B as ae,g as ie,h as re}from"./index-CvXApbVC.js";import{u as ue}from"./projects-BvLADGKx.js";import{u as Z}from"./projectDefaults-D9xkp2XR.js";import{a as O}from"./ApiClient-DfbJwzpz.js";import{P as de}from"./InputWithButton-CHHcpF4I.js";import{M as pe}from"./ModelSelector-Cko_yTO5.js";import"./providers-DZ-fOa4G.js";const z=se("quickResponses",{state:()=>({projectResponses:[],globalResponses:[],loading:!1,error:null,currentProjectId:null}),getters:{allResponses:a=>[...a.projectResponses,...a.globalResponses],hasResponses:a=>a.projectResponses.length>0||a.globalResponses.length>0},actions:{async fetchForProject(a){this.loading=!0,this.error=null,this.currentProjectId=a;try{const u=await O.getQuickResponses(a);return this.projectResponses=u.project,this.globalResponses=u.global,u}catch(u){throw this.error=u.message,u}finally{this.loading=!1}},async createResponse(a,u){this.loading=!0,this.error=null;try{const o=await O.createQuickResponse(a,u);return o.projectId===null?this.globalResponses.push(o):this.projectResponses.push(o),o}catch(o){throw this.error=o.message,o}finally{this.loading=!1}},async updateResponse(a,u){this.loading=!0,this.error=null;try{const o=await O.updateQuickResponse(a,u),v=this.projectResponses.findIndex(b=>b.id===a);if(v!==-1)this.projectResponses[v]=o;else{const b=this.globalResponses.findIndex(w=>w.id===a);b!==-1&&(this.globalResponses[b]=o)}return o}catch(o){throw this.error=o.message,o}finally{this.loading=!1}},async deleteResponse(a){this.loading=!0,this.error=null;try{await O.deleteQuickResponse(a);const u=this.projectResponses.findIndex(o=>o.id===a);if(u!==-1)this.projectResponses.splice(u,1);else{const o=this.globalResponses.findIndex(v=>v.id===a);o!==-1&&this.globalResponses.splice(o,1)}}catch(u){throw this.error=u.message,u}finally{this.loading=!1}},async reorderResponses(a,u){this.loading=!0,this.error=null;try{const o=u.map((v,b)=>({id:v,sortOrder:b}));if(a){const v=await O.reorderQuickResponses(a,o);this.projectResponses=v.project,this.globalResponses=v.global}else{const v=await O.reorderGlobalQuickResponses(o);this.globalResponses=v}}catch(o){throw this.error=o.message,o}finally{this.loading=!1}},clearResponses(){this.projectResponses=[],this.globalResponses=[],this.currentProjectId=null,this.error=null}}}),ce={class:"advanced-settings"},ve={class:"form-group"},fe={class:"form-group"},me={class:"checkbox-label"},be={class:"form-group"},ge={class:"form-group"},ye={class:"checkbox-label"},he={class:"form-group"},ke={class:"form-group"},Re={class:"form-group"},Se=["disabled"],Ce={key:0,class:"loading-spinner"},$e={__name:"ProjectSessionDefaults",props:{projectId:{type:String,required:!0}},setup(a,{expose:u}){const o=a,v=Z(),b=J(),w=r(""),h=r(!1),n=r(""),g=r(!0),p=r(""),y=r(""),$=r(""),k=r(null),I=r(!1);X(()=>{v.fetchDefaults(o.projectId)}),T(()=>v.getDefaultsForProject(o.projectId),d=>{d&&(w.value=d.mode||"",h.value=d.thinkingEnabled||!1,n.value=d.effortLevel??"",g.value=d.startImmediately!==!1,p.value=d.gitMode||"",y.value=d.gitBranch||"",$.value=d.model||"",k.value=d.providerId||null)},{immediate:!0});function D(){return{mode:w.value||null,thinkingEnabled:h.value,effortLevel:n.value||null,startImmediately:g.value,gitMode:p.value||null,gitBranch:y.value||null,model:$.value||null,providerId:$.value&&k.value||null}}async function U(){if(confirm("Reset all session defaults to system defaults?")){I.value=!0;try{await v.resetDefaults(o.projectId),w.value="",h.value=!1,n.value="",g.value=!0,p.value="",y.value="",$.value="",k.value=null,b.success("Session defaults reset to system defaults")}catch(d){b.error(d.message)}finally{I.value=!1}}}return u({collectNonDefaultValues:D}),(d,s)=>(i(),c("details",ce,[s[25]||(s[25]=e("summary",null,"Session Defaults",-1)),s[26]||(s[26]=e("p",{class:"form-help"}," Set default values for new sessions created in this project. These values can be overridden when creating individual sessions. ",-1)),e("div",ve,[s[9]||(s[9]=e("label",{class:"form-label",for:"defaultMode"},"Mode",-1)),S(e("select",{id:"defaultMode","onUpdate:modelValue":s[0]||(s[0]=l=>w.value=l),class:"form-input"},[...s[8]||(s[8]=[e("option",{value:""}," Use system default (standard) ",-1),e("option",{value:"plan"}," Plan ",-1),e("option",{value:"standard"}," Standard ",-1),e("option",{value:"yolo"}," YOLO ",-1)])],512),[[F,w.value]])]),e("div",fe,[e("label",me,[S(e("input",{"onUpdate:modelValue":s[1]||(s[1]=l=>h.value=l),type:"checkbox"},null,512),[[B,h.value]]),s[10]||(s[10]=P(" Enable thinking (extended thinking) by default ",-1))]),s[11]||(s[11]=e("p",{class:"form-help"}," Enable the agent's extended thinking capability for new sessions. ",-1))]),e("div",be,[s[13]||(s[13]=e("label",{class:"form-label",for:"defaultEffortLevel"},"Default Effort Level",-1)),S(e("select",{id:"defaultEffortLevel","onUpdate:modelValue":s[2]||(s[2]=l=>n.value=l),class:"form-input"},[...s[12]||(s[12]=[te('<option value="" data-v-c9a88468> Auto (default) </option><option value="low" data-v-c9a88468> Low </option><option value="medium" data-v-c9a88468> Medium </option><option value="high" data-v-c9a88468> High </option><option value="max" data-v-c9a88468> Max </option>',5)])],512),[[F,n.value]]),s[14]||(s[14]=e("p",{class:"form-help"}," Set the default effort level for new sessions. Controls how much effort the agent puts into responses. ",-1))]),e("div",ge,[e("label",ye,[S(e("input",{"onUpdate:modelValue":s[3]||(s[3]=l=>g.value=l),type:"checkbox"},null,512),[[B,g.value]]),s[15]||(s[15]=P(" Start sessions immediately ",-1))]),s[16]||(s[16]=e("p",{class:"form-help"},' When enabled, sessions will start automatically. When disabled, sessions will be created in "waiting" state. ',-1))]),e("div",he,[s[18]||(s[18]=e("label",{class:"form-label",for:"defaultGitMode"},"Git Mode",-1)),S(e("select",{id:"defaultGitMode","onUpdate:modelValue":s[4]||(s[4]=l=>p.value=l),class:"form-input"},[...s[17]||(s[17]=[e("option",{value:""}," No git isolation ",-1),e("option",{value:"branch"}," Create branch for each session ",-1),e("option",{value:"worktree"}," Create worktree for each session ",-1)])],512),[[F,p.value]]),s[19]||(s[19]=e("p",{class:"form-help"}," Controls how git changes are isolated for each session. ",-1))]),e("div",ke,[s[20]||(s[20]=e("label",{class:"form-label",for:"defaultGitBranch"},"Default Git Branch",-1)),S(e("input",{id:"defaultGitBranch","onUpdate:modelValue":s[5]||(s[5]=l=>y.value=l),type:"text",class:"form-input",placeholder:"e.g., feature/ai-implementation"},null,512),[[V,y.value]]),s[21]||(s[21]=e("p",{class:"form-help"}," When using git branch mode, this is the branch name pattern for new sessions. ",-1))]),e("div",Re,[s[22]||(s[22]=e("label",{class:"form-label",for:"defaultModel"},"Model",-1)),q(pe,{modelValue:$.value,"onUpdate:modelValue":s[6]||(s[6]=l=>$.value=l),"provider-id":k.value,"onUpdate:providerId":s[7]||(s[7]=l=>k.value=l),"allow-empty":!0,"empty-label":"Use system default","select-class":"form-input"},null,8,["modelValue","provider-id"]),s[23]||(s[23]=e("p",{class:"form-help"}," Choose the default model for new sessions in this project. ",-1))]),e("button",{type:"button",class:"btn btn-secondary",disabled:I.value,onClick:U},[I.value?(i(),c("span",Ce)):x("",!0),s[24]||(s[24]=P(" Reset to System Defaults ",-1))],8,Se)]))}},we=N($e,[["__scopeId","data-v-c9a88468"]]),Ie={class:"dialog-header"},je={class:"dialog-content"},xe={class:"form-group"},De={key:0,class:"form-error"},Ee={class:"form-group"},Pe={key:0,class:"form-error"},_e={class:"form-group"},Ue={class:"form-group"},Ve={class:"checkbox-label"},Me={key:0,class:"form-group"},Ge={class:"radio-group"},Oe={class:"radio-label"},Le={class:"radio-label"},qe={key:1,class:"error-message"},Qe={class:"dialog-footer"},Te=["disabled"],Be={__name:"QuickResponseDialog",props:{isOpen:{type:Boolean,default:!1},projectId:{type:String,required:!0},editingResponse:{type:Object,default:null},defaultIsGlobal:{type:Boolean,default:!1}},emits:["close","saved"],setup(a,{emit:u}){const o=a,v=u,b=z(),w=r(null),h=`dialog-title-${Math.random().toString(36).slice(2)}`,n=r({label:"",content:"",category:"",autoSubmit:!0,isGlobal:!1}),g=r(!1),p=r(null),y=L(()=>!!o.editingResponse),$=L(()=>n.value.label&&n.value.label.length>50?"Label must be 50 characters or less":null),k=L(()=>n.value.content&&n.value.content.length>1e4?"Content must be 10,000 characters or less":null),I=L(()=>n.value.label.trim().length>0&&n.value.label.length<=50&&n.value.content.trim().length>0&&n.value.content.length<=1e4);T(()=>o.isOpen,d=>{d&&(o.editingResponse?n.value={label:o.editingResponse.label||"",content:o.editingResponse.content||"",category:o.editingResponse.category||"",autoSubmit:o.editingResponse.autoSubmit||!1,isGlobal:o.editingResponse.projectId===null}:n.value={label:"",content:"",category:"",autoSubmit:!0,isGlobal:o.defaultIsGlobal},p.value=null,oe(()=>{var s;(s=w.value)==null||s.focus()}))}),T(()=>o.isOpen,d=>{if(d){const s=l=>{l.key==="Escape"&&D()};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)}});function D(){v("close")}async function U(){if(!(!I.value||g.value)){g.value=!0,p.value=null;try{const d={label:n.value.label.trim(),content:n.value.content,category:n.value.category.trim()||null,autoSubmit:n.value.autoSubmit};y.value?await b.updateResponse(o.editingResponse.id,d):(d.isGlobal=n.value.isGlobal,await b.createResponse(o.projectId,d)),v("saved"),v("close")}catch(d){p.value=d.message||"Failed to save quick response"}finally{g.value=!1}}}return(d,s)=>(i(),H(W,{to:"body"},[a.isOpen?(i(),c("div",{key:0,class:"dialog-overlay",onClick:Q(D,["self"])},[e("div",{class:"dialog",role:"dialog","aria-modal":"true","aria-labelledby":h},[e("div",Ie,[e("h2",{id:h,class:"dialog-title"},_(y.value?"Edit Quick Response":"Add Quick Response"),1),e("button",{class:"close-button","aria-label":"Close dialog",onClick:D}," × ")]),e("form",{class:"dialog-form",onSubmit:Q(U,["prevent"])},[e("div",je,[e("div",xe,[s[7]||(s[7]=e("label",{for:"qr-label",class:"form-label"},"Label *",-1)),S(e("input",{id:"qr-label",ref_key:"labelInput",ref:w,"onUpdate:modelValue":s[0]||(s[0]=l=>n.value.label=l),type:"text",class:"form-input",placeholder:"e.g., Yes, LGTM, Run tests",maxlength:"50",required:"",onBlur:s[1]||(s[1]=l=>n.value.label=n.value.label.trim())},null,544),[[V,n.value.label]]),s[8]||(s[8]=e("span",{class:"form-help"},"Short text shown on the button (max 50 characters)",-1)),$.value?(i(),c("span",De,_($.value),1)):x("",!0)]),e("div",Ee,[s[9]||(s[9]=e("label",{for:"qr-content",class:"form-label"},"Content *",-1)),S(e("textarea",{id:"qr-content","onUpdate:modelValue":s[2]||(s[2]=l=>n.value.content=l),class:"form-textarea",placeholder:"The full message that will be inserted into the prompt",rows:"4",maxlength:"10000",required:""},null,512),[[V,n.value.content]]),s[10]||(s[10]=e("span",{class:"form-help"},"The full message that will be inserted (max 10,000 characters)",-1)),k.value?(i(),c("span",Pe,_(k.value),1)):x("",!0)]),e("div",_e,[s[11]||(s[11]=e("label",{for:"qr-category",class:"form-label"},"Category (optional)",-1)),S(e("input",{id:"qr-category","onUpdate:modelValue":s[3]||(s[3]=l=>n.value.category=l),type:"text",class:"form-input",placeholder:"e.g., feedback, commands",maxlength:"50"},null,512),[[V,n.value.category]]),s[12]||(s[12]=e("span",{class:"form-help"},"Optional grouping for organization",-1))]),e("div",Ue,[e("label",Ve,[S(e("input",{"onUpdate:modelValue":s[4]||(s[4]=l=>n.value.autoSubmit=l),type:"checkbox",class:"checkbox-input"},null,512),[[B,n.value.autoSubmit]]),s[13]||(s[13]=e("span",{class:"checkbox-text"},"Auto-submit",-1))]),s[14]||(s[14]=e("span",{class:"form-help indent"},"Send immediately when clicked (no confirmation)",-1))]),y.value?x("",!0):(i(),c("div",Me,[s[17]||(s[17]=e("span",{class:"form-label"},"Scope",-1)),e("div",Ge,[e("label",Oe,[S(e("input",{"onUpdate:modelValue":s[5]||(s[5]=l=>n.value.isGlobal=l),type:"radio",value:!1,class:"radio-input"},null,512),[[K,n.value.isGlobal]]),s[15]||(s[15]=e("span",{class:"radio-text"},"Project-specific",-1))]),e("label",Le,[S(e("input",{"onUpdate:modelValue":s[6]||(s[6]=l=>n.value.isGlobal=l),type:"radio",value:!0,class:"radio-input"},null,512),[[K,n.value.isGlobal]]),s[16]||(s[16]=e("span",{class:"radio-text"},"Global (all projects)",-1))])])])),p.value?(i(),c("div",qe,_(p.value),1)):x("",!0)]),e("div",Qe,[e("button",{type:"button",class:"btn btn-secondary",onClick:D}," Cancel "),e("button",{type:"submit",class:"btn btn-primary",disabled:!I.value||g.value},_(g.value?"Saving...":y.value?"Save Changes":"Save Quick Response"),9,Te)])],32)])])):x("",!0)]))}},Ne=N(Be,[["__scopeId","data-v-6efa077c"]]),Fe={class:"settings-panel",role:"dialog","aria-modal":"true"},Ae={class:"settings-header"},He={class:"settings-content"},We={class:"section"},ze={class:"section-header"},Ke={key:0,class:"loading-state"},Ye={key:1,class:"empty-state"},Je={key:2,class:"response-list"},Xe={class:"response-info"},Ze={class:"response-label"},es={class:"response-content"},ss={key:0,class:"auto-badge"},ts={class:"response-actions"},os=["disabled","onClick"],ls=["disabled","onClick"],ns=["onClick"],as=["onClick"],is={class:"section"},rs={class:"section-header"},us={key:0,class:"loading-state"},ds={key:1,class:"empty-state"},ps={key:2,class:"response-list"},cs={class:"response-info"},vs={class:"response-label"},fs={class:"response-content"},ms={key:0,class:"auto-badge"},bs={class:"response-actions"},gs=["disabled","onClick"],ys=["disabled","onClick"],hs=["onClick"],ks=["onClick"],Rs={class:"confirm-dialog"},Ss={class:"confirm-message"},Cs={class:"confirm-actions"},$s={__name:"QuickResponseSettings",props:{isOpen:{type:Boolean,default:!1},projectId:{type:String,required:!0}},emits:["close"],setup(a,{expose:u}){const o=z(),v=r(!1),b=r(null),w=r(!1),h=r(null),n=L(()=>o.loading),g=L(()=>o.projectResponses),p=L(()=>o.globalResponses);function y(l){return l.length<=60?l:`${l.substring(0,60)}...`}function $(l){b.value=null,w.value=l,v.value=!0}function k(l){b.value=l,w.value=l.projectId===null,v.value=!0}function I(){v.value=!1,b.value=null}function D(){}function U(l){h.value=l}async function d(){if(h.value)try{await o.deleteResponse(h.value.id),h.value=null}catch(l){console.error("Failed to delete response:",l)}}async function s(l,f,m,E){const j=m+E;if(j<0||j>=f.length)return;const M=[...f];[M[m],M[j]]=[M[j],M[m]];const R=M.map(t=>t.id);try{await o.reorderResponses(l,R)}catch(t){console.error("Failed to reorder responses:",t)}}return u({moveResponse:s}),(l,f)=>(i(),c(A,null,[(i(),H(W,{to:"body"},[a.isOpen?(i(),c("div",{key:0,class:"settings-overlay",onClick:f[3]||(f[3]=Q(m=>l.$emit("close"),["self"]))},[e("div",Fe,[e("div",Ae,[f[6]||(f[6]=e("h2",{class:"settings-title"}," Quick Responses ",-1)),e("button",{class:"close-button","aria-label":"Close settings",onClick:f[0]||(f[0]=m=>l.$emit("close"))}," × ")]),e("div",He,[e("div",We,[e("div",ze,[f[7]||(f[7]=e("h3",{class:"section-title"}," Project Responses ",-1)),e("button",{class:"add-button",onClick:f[1]||(f[1]=m=>$(!1))}," + Add ")]),n.value?(i(),c("div",Ke," Loading... ")):g.value.length===0?(i(),c("div",Ye," No project-specific quick responses yet. ")):(i(),c("ul",Je,[(i(!0),c(A,null,Y(g.value,(m,E)=>(i(),c("li",{key:m.id,class:"response-item"},[e("div",Xe,[e("span",Ze,_(m.label),1),e("span",es,_(y(m.content)),1),m.autoSubmit?(i(),c("span",ss,"Auto-submit")):x("",!0)]),e("div",ts,[e("button",{class:"action-button",disabled:E===0,title:"Move up",onClick:j=>s(a.projectId,g.value,E,-1)}," ↑ ",8,os),e("button",{class:"action-button",disabled:E===g.value.length-1,title:"Move down",onClick:j=>s(a.projectId,g.value,E,1)}," ↓ ",8,ls),e("button",{class:"action-button",title:"Edit","aria-label":"Edit",onClick:j=>k(m)}," ✏️ ",8,ns),e("button",{class:"action-button action-danger",title:"Delete",onClick:j=>U(m)}," 🗑️ ",8,as)])]))),128))]))]),e("div",is,[e("div",rs,[f[8]||(f[8]=e("h3",{class:"section-title"}," Global Responses ",-1)),e("button",{class:"add-button",onClick:f[2]||(f[2]=m=>$(!0))}," + Add ")]),n.value?(i(),c("div",us," Loading... ")):p.value.length===0?(i(),c("div",ds," No global quick responses yet. Global responses appear in all projects. ")):(i(),c("ul",ps,[(i(!0),c(A,null,Y(p.value,(m,E)=>(i(),c("li",{key:m.id,class:"response-item"},[e("div",cs,[e("span",vs,_(m.label),1),e("span",fs,_(y(m.content)),1),m.autoSubmit?(i(),c("span",ms,"Auto-submit")):x("",!0)]),e("div",bs,[e("button",{class:"action-button",disabled:E===0,title:"Move up",onClick:j=>s(null,p.value,E,-1)}," ↑ ",8,gs),e("button",{class:"action-button",disabled:E===p.value.length-1,title:"Move down",onClick:j=>s(null,p.value,E,1)}," ↓ ",8,ys),e("button",{class:"action-button",title:"Edit","aria-label":"Edit",onClick:j=>k(m)}," ✏️ ",8,hs),e("button",{class:"action-button action-danger",title:"Delete",onClick:j=>U(m)}," 🗑️ ",8,ks)])]))),128))]))])])])])):x("",!0)])),q(Ne,{"is-open":v.value,"project-id":a.projectId,"editing-response":b.value,"default-is-global":w.value,onClose:I,onSaved:D},null,8,["is-open","project-id","editing-response","default-is-global"]),(i(),H(W,{to:"body"},[h.value?(i(),c("div",{key:0,class:"confirm-overlay",onClick:f[5]||(f[5]=Q(m=>h.value=null,["self"]))},[e("div",Rs,[e("p",Ss,' Are you sure you want to delete "'+_(h.value.label)+'"? ',1),e("div",Cs,[e("button",{class:"btn btn-secondary",onClick:f[4]||(f[4]=m=>h.value=null)}," Cancel "),e("button",{class:"btn btn-danger",onClick:d}," Delete ")])])])):x("",!0)]))],64))}},ws=N($s,[["__scopeId","data-v-63dc5bd1"]]),Is={class:"container"},js={key:0,class:"loading-state"},xs={class:"form-group"},Ds={class:"form-group"},Es={class:"form-group"},Ps={class:"input-with-button"},_s=["placeholder"],Us=["disabled"],Vs={class:"form-help"},Ms={class:"form-group"},Gs={class:"form-group"},Os={class:"form-label",for:"systemPrompt"},Ls={class:"advanced-settings"},qs={class:"form-group"},Qs={class:"form-group"},Ts={class:"advanced-settings"},Bs={class:"advanced-settings"},Ns={class:"form-group"},Fs={class:"checkbox-label"},As={key:0,class:"error-message"},Hs={class:"form-actions"},Ws={class:"form-actions-right"},zs=["disabled"],Ks={key:0,class:"loading-spinner"},Ys={__name:"ProjectEditView",setup(a){const u=le,o=ae(),v=re(),b=ue(),w=Z(),h=z(),n=J(),g=r(""),p=r(""),y=r(""),$=r(""),k=r(""),I=r(""),D=r(""),U=r(!1),d=r(!1),s=r(null),l=r(!1),f=r(null),m=r(!1);X(()=>{b.fetchProject(o.params.id),h.fetchForProject(o.params.id)}),T(()=>b.currentProject,R=>{R&&(g.value=R.name,p.value=R.workingDirectory,y.value=R.worktreePath||"",$.value=R.repoUrl||"",k.value=R.systemPrompt||u,I.value=R.onSessionCreated||"",D.value=R.onSessionDeleted||"",U.value=R.kanbanEnabled||!1)},{immediate:!0});async function E(){if(p.value){d.value=!0;try{const R=await O.detectWorktreePath(p.value);y.value=R.worktreePath}catch{}finally{d.value=!1}}}async function j(){var R;l.value=!0,f.value=null;try{const t=(R=s.value)==null?void 0:R.collectNonDefaultValues();await b.updateProject(o.params.id,{name:g.value,workingDirectory:p.value,worktreePath:y.value||null,repoUrl:$.value||null,systemPrompt:k.value===u?null:k.value,onSessionCreated:I.value||null,onSessionDeleted:D.value||null,kanbanEnabled:U.value}),t&&Object.keys(t).length>0&&await w.updateDefaults(o.params.id,t),n.success("Repository updated"),v.push(`/projects/${o.params.id}/sessions`)}catch(t){f.value=t.message}finally{l.value=!1}}async function M(){if(confirm("Are you sure you want to delete this project?"))try{await b.deleteProject(o.params.id),n.success("Repository removed"),v.push("/")}catch(R){f.value=R.message}}return(R,t)=>{const ee=ie("router-link");return i(),c("div",Is,[t[34]||(t[34]=e("h1",null,"Edit Project",-1)),G(b).loading?(i(),c("div",js,[...t[11]||(t[11]=[e("span",{class:"loading-spinner"},null,-1),P(" Loading... ",-1)])])):G(b).currentProject?(i(),c("form",{key:1,class:"form card",onSubmit:Q(j,["prevent"])},[e("div",xs,[t[12]||(t[12]=e("label",{class:"form-label",for:"name"},"Project Name",-1)),S(e("input",{id:"name","onUpdate:modelValue":t[0]||(t[0]=C=>g.value=C),type:"text",class:"form-input",required:""},null,512),[[V,g.value]])]),e("div",Ds,[t[13]||(t[13]=e("label",{class:"form-label",for:"workingDirectory"},"Working Directory",-1)),q(de,{modelValue:p.value,"onUpdate:modelValue":t[1]||(t[1]=C=>p.value=C)},null,8,["modelValue"])]),e("div",Es,[t[17]||(t[17]=e("label",{class:"form-label",for:"worktreePath"},"Worktree Path",-1)),e("div",Ps,[S(e("input",{id:"worktreePath","onUpdate:modelValue":t[2]||(t[2]=C=>y.value=C),type:"text",class:"form-input",placeholder:p.value+"/.worktrees"},null,8,_s),[[V,y.value]]),e("button",{type:"button",class:"btn btn-secondary btn-sm",disabled:!p.value||d.value,onClick:E}," Detect ",8,Us)]),e("p",Vs,[t[14]||(t[14]=P(" Where git worktrees are created for sessions. Changing this only affects new sessions. ",-1)),t[15]||(t[15]=e("br",null,null,-1)),t[16]||(t[16]=P("Effective path: ",-1)),e("code",null,_(y.value||(p.value?`${p.value}/.worktrees`:""))+"/{sessionId}",1)])]),e("div",Ms,[t[18]||(t[18]=e("label",{class:"form-label",for:"repoUrl"},"Repository URL",-1)),S(e("input",{id:"repoUrl","onUpdate:modelValue":t[3]||(t[3]=C=>$.value=C),type:"url",class:"form-input",placeholder:"https://github.com/username/repo"},null,512),[[V,$.value]]),t[19]||(t[19]=e("p",{class:"form-help"}," Link to the project's repository (e.g., GitHub, GitLab). This can be automatically populated from session summaries. ",-1))]),e("div",Gs,[e("label",Os,[t[20]||(t[20]=P(" System Prompt ",-1)),k.value!==G(u)?(i(),c("button",{key:0,type:"button",class:"btn-link",onClick:t[4]||(t[4]=C=>k.value=G(u))}," Reset to Default ")):x("",!0)]),S(e("textarea",{id:"systemPrompt","onUpdate:modelValue":t[5]||(t[5]=C=>k.value=C),class:"form-input form-textarea",rows:"8"},null,512),[[V,k.value]]),t[21]||(t[21]=e("p",{class:"form-help"}," Customize the system prompt for the AI agent. The default prompt is pre-filled above. ",-1))]),e("details",Ls,[t[26]||(t[26]=e("summary",null,"Session Lifecycle Hooks",-1)),e("div",qs,[t[22]||(t[22]=e("label",{class:"form-label",for:"onSessionCreated"},"On Session Created",-1)),S(e("textarea",{id:"onSessionCreated","onUpdate:modelValue":t[6]||(t[6]=C=>I.value=C),class:"form-input form-textarea-small",rows:"3",placeholder:"Shell command to run when a session is created..."},null,512),[[V,I.value]]),t[23]||(t[23]=e("p",{class:"form-help"}," Runs in the background after session creation. Environment variables: CIRCUSCHIEF_SESSION_ID, CIRCUSCHIEF_PROJECT_ID, CIRCUSCHIEF_SESSION_NAME ",-1))]),e("div",Qs,[t[24]||(t[24]=e("label",{class:"form-label",for:"onSessionDeleted"},"On Session Deleted",-1)),S(e("textarea",{id:"onSessionDeleted","onUpdate:modelValue":t[7]||(t[7]=C=>D.value=C),class:"form-input form-textarea-small",rows:"3",placeholder:"Shell command to run when a session is deleted..."},null,512),[[V,D.value]]),t[25]||(t[25]=e("p",{class:"form-help"}," Runs in the background after session deletion. Environment variables: CIRCUSCHIEF_SESSION_ID, CIRCUSCHIEF_PROJECT_ID, CIRCUSCHIEF_SESSION_NAME ",-1))])]),q(we,{ref_key:"sessionDefaultsRef",ref:s,"project-id":G(o).params.id},null,8,["project-id"]),e("details",Ts,[t[27]||(t[27]=e("summary",null,"Quick Responses",-1)),t[28]||(t[28]=e("p",{class:"form-help"}," Quick responses are shortcuts that can be inserted into the chat input. You can create project-specific or global responses. ",-1)),e("button",{type:"button",class:"btn btn-secondary",onClick:t[8]||(t[8]=C=>m.value=!0)}," Manage Quick Responses ")]),e("details",Bs,[t[31]||(t[31]=e("summary",null,[P("Kanban Board "),e("span",{class:"inline-block rounded bg-amber-900/50 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-amber-300 ml-2"},"Experimental")],-1)),e("div",Ns,[e("label",Fs,[S(e("input",{"onUpdate:modelValue":t[9]||(t[9]=C=>U.value=C),type:"checkbox"},null,512),[[B,U.value]]),t[29]||(t[29]=P(" Enable Kanban board ",-1))]),t[30]||(t[30]=e("p",{class:"form-help"},[e("strong",null,"Experimental."),P(" This feature is in active development and may change or be removed. Enable a Kanban board to visually organize sessions into lanes. Sessions can be dragged between lanes, and lanes can trigger automated workflows. ")],-1))])]),f.value?(i(),c("div",As,_(f.value),1)):x("",!0),e("div",Hs,[e("button",{type:"button",class:"btn btn-danger",onClick:M}," Delete "),e("div",Ws,[q(ee,{to:`/projects/${G(o).params.id}/sessions`,class:"btn"},{default:ne(()=>[...t[32]||(t[32]=[P(" Cancel ",-1)])]),_:1},8,["to"]),e("button",{type:"submit",class:"btn btn-primary",disabled:l.value},[l.value?(i(),c("span",Ks)):x("",!0),t[33]||(t[33]=P(" Save ",-1))],8,zs)])])],32)):x("",!0),q(ws,{"is-open":m.value,"project-id":G(o).params.id,onClose:t[10]||(t[10]=C=>m.value=!1)},null,8,["is-open","project-id"])])}}},lt=N(Ys,[["__scopeId","data-v-2f1cd4c6"]]);export{lt as default};
@@ -1 +1 @@
1
- import{_ as h,o as y,a as e,c as a,b as o,d as l,w as p,u as c,F as u,r as _,t as d,e as f,f as k,g,h as C,i as n,j as w}from"./index-C2QFVD7d.js";import{u as A}from"./projects-C-8PSxKi.js";import{f as V}from"./useSummaryHelpers-GVg7sMWF.js";import"./ApiClient-DfbJwzpz.js";const P={class:"container"},j={class:"page-header"},x={key:0,class:"skeleton-list"},S={key:1,class:"error-message"},N={key:2,class:"empty-state"},R={key:3,class:"project-list"},T=["onClick"],B={class:"project-info"},F={class:"project-name"},L={class:"project-path"},$={key:0,class:"project-meta"},D={key:0},E={key:1,class:"meta-separator"},I={key:2},M={class:"project-actions"},Y={__name:"ProjectListView",setup(W){const b=C(),i=A();function m(v){b.push(`/projects/${v}/sessions`)}return y(()=>{i.fetchProjects()}),(v,t)=>{const r=g("router-link");return e(),a("div",P,[o("div",j,[t[2]||(t[2]=o("h1",null,"Repositories",-1)),l(r,{to:"/projects/new",class:"btn btn-primary"},{default:p(()=>[...t[1]||(t[1]=[o("span",{class:"add-repo-label-full"},"Add Repository",-1),o("span",{class:"add-repo-label-short"},"+ Add",-1)])]),_:1})]),c(i).loading?(e(),a("div",x,[(e(),a(u,null,_(3,s=>o("div",{key:s,class:"skeleton card",style:{height:"80px"}})),64))])):c(i).error?(e(),a("div",S,d(c(i).error),1)):c(i).projects.length===0?(e(),a("div",N,[t[4]||(t[4]=f('<div class="welcome-hero card" data-v-7bcc5373><h2 class="welcome-heading" data-v-7bcc5373> Welcome to Circus Chief </h2><p class="welcome-subtitle" data-v-7bcc5373> Your command center for coding agent sessions. Point it at a codebase and start building. </p></div><div class="steps-grid" data-v-7bcc5373><div class="step-card card" data-v-7bcc5373><div class="step-number" data-v-7bcc5373> 1 </div><h3 class="step-title" data-v-7bcc5373> Pick a repo folder </h3><p class="step-desc" data-v-7bcc5373> Point to any codebase on your machine </p></div><div class="step-card card" data-v-7bcc5373><div class="step-number" data-v-7bcc5373> 2 </div><h3 class="step-title" data-v-7bcc5373> Create coding sessions </h3><p class="step-desc" data-v-7bcc5373> Start tasks with your AI coding agent </p></div><div class="step-card card" data-v-7bcc5373><div class="step-number" data-v-7bcc5373> 3 </div><h3 class="step-title" data-v-7bcc5373> Track changes &amp; artifacts </h3><p class="step-desc" data-v-7bcc5373> View diffs, canvas, and conversation history </p></div></div>',2)),l(r,{to:"/projects/new",class:"btn btn-primary cta-button"},{default:p(()=>[...t[3]||(t[3]=[k(" Add Your First Repository ",-1)])]),_:1})])):(e(),a("div",R,[(e(!0),a(u,null,_(c(i).projects,s=>(e(),a("div",{key:s.id,class:"project-card card",onClick:q=>m(s.id)},[o("div",B,[o("h3",F,d(s.name),1),o("p",L,d(s.workingDirectory),1),s.sessionCount>0||s.lastActivityAt?(e(),a("p",$,[s.sessionCount>0?(e(),a("span",D,d(s.sessionCount)+" session"+d(s.sessionCount!==1?"s":""),1)):n("",!0),s.sessionCount>0&&s.lastActivityAt?(e(),a("span",E,"·")):n("",!0),s.lastActivityAt?(e(),a("span",I,d(c(V)(s.lastActivityAt)),1)):n("",!0)])):n("",!0)]),o("div",M,[l(r,{to:`/projects/${s.id}/edit`,class:"btn edit-btn",onClick:t[0]||(t[0]=w(()=>{},["stop"]))},{default:p(()=>[...t[5]||(t[5]=[o("span",{class:"edit-label-full"},"Edit",-1),o("span",{class:"edit-label-short","aria-hidden":"true"},"⚙",-1)])]),_:1},8,["to"])])],8,T))),128))]))])}}},K=h(Y,[["__scopeId","data-v-7bcc5373"]]);export{K as default};
1
+ import{_ as h,o as y,a as e,c as a,b as o,d as l,w as p,u as c,F as u,r as _,t as d,e as f,f as k,g,h as C,i as n,j as w}from"./index-CvXApbVC.js";import{u as A}from"./projects-BvLADGKx.js";import{f as V}from"./useSummaryHelpers-GVg7sMWF.js";import"./ApiClient-DfbJwzpz.js";const P={class:"container"},j={class:"page-header"},x={key:0,class:"skeleton-list"},S={key:1,class:"error-message"},N={key:2,class:"empty-state"},R={key:3,class:"project-list"},T=["onClick"],B={class:"project-info"},F={class:"project-name"},L={class:"project-path"},$={key:0,class:"project-meta"},D={key:0},E={key:1,class:"meta-separator"},I={key:2},M={class:"project-actions"},Y={__name:"ProjectListView",setup(W){const b=C(),i=A();function m(v){b.push(`/projects/${v}/sessions`)}return y(()=>{i.fetchProjects()}),(v,t)=>{const r=g("router-link");return e(),a("div",P,[o("div",j,[t[2]||(t[2]=o("h1",null,"Repositories",-1)),l(r,{to:"/projects/new",class:"btn btn-primary"},{default:p(()=>[...t[1]||(t[1]=[o("span",{class:"add-repo-label-full"},"Add Repository",-1),o("span",{class:"add-repo-label-short"},"+ Add",-1)])]),_:1})]),c(i).loading?(e(),a("div",x,[(e(),a(u,null,_(3,s=>o("div",{key:s,class:"skeleton card",style:{height:"80px"}})),64))])):c(i).error?(e(),a("div",S,d(c(i).error),1)):c(i).projects.length===0?(e(),a("div",N,[t[4]||(t[4]=f('<div class="welcome-hero card" data-v-7bcc5373><h2 class="welcome-heading" data-v-7bcc5373> Welcome to Circus Chief </h2><p class="welcome-subtitle" data-v-7bcc5373> Your command center for coding agent sessions. Point it at a codebase and start building. </p></div><div class="steps-grid" data-v-7bcc5373><div class="step-card card" data-v-7bcc5373><div class="step-number" data-v-7bcc5373> 1 </div><h3 class="step-title" data-v-7bcc5373> Pick a repo folder </h3><p class="step-desc" data-v-7bcc5373> Point to any codebase on your machine </p></div><div class="step-card card" data-v-7bcc5373><div class="step-number" data-v-7bcc5373> 2 </div><h3 class="step-title" data-v-7bcc5373> Create coding sessions </h3><p class="step-desc" data-v-7bcc5373> Start tasks with your AI coding agent </p></div><div class="step-card card" data-v-7bcc5373><div class="step-number" data-v-7bcc5373> 3 </div><h3 class="step-title" data-v-7bcc5373> Track changes &amp; artifacts </h3><p class="step-desc" data-v-7bcc5373> View diffs, canvas, and conversation history </p></div></div>',2)),l(r,{to:"/projects/new",class:"btn btn-primary cta-button"},{default:p(()=>[...t[3]||(t[3]=[k(" Add Your First Repository ",-1)])]),_:1})])):(e(),a("div",R,[(e(!0),a(u,null,_(c(i).projects,s=>(e(),a("div",{key:s.id,class:"project-card card",onClick:q=>m(s.id)},[o("div",B,[o("h3",F,d(s.name),1),o("p",L,d(s.workingDirectory),1),s.sessionCount>0||s.lastActivityAt?(e(),a("p",$,[s.sessionCount>0?(e(),a("span",D,d(s.sessionCount)+" session"+d(s.sessionCount!==1?"s":""),1)):n("",!0),s.sessionCount>0&&s.lastActivityAt?(e(),a("span",E,"·")):n("",!0),s.lastActivityAt?(e(),a("span",I,d(c(V)(s.lastActivityAt)),1)):n("",!0)])):n("",!0)]),o("div",M,[l(r,{to:`/projects/${s.id}/edit`,class:"btn edit-btn",onClick:t[0]||(t[0]=w(()=>{},["stop"]))},{default:p(()=>[...t[5]||(t[5]=[o("span",{class:"edit-label-full"},"Edit",-1),o("span",{class:"edit-label-short","aria-hidden":"true"},"⚙",-1)])]),_:1},8,["to"])])],8,T))),128))]))])}}},K=h(Y,[["__scopeId","data-v-7bcc5373"]]);export{K as default};
@@ -1 +1 @@
1
- import{_ as A,k as O,l as T,a as f,c as v,b as t,d as E,m as u,v as d,f as k,u as h,D as R,i as w,t as j,w as H,j as M,n as s,g as W,h as B}from"./index-C2QFVD7d.js";import{u as $}from"./projects-C-8PSxKi.js";import{P as J}from"./InputWithButton-B-o0DgMH.js";import{a as L}from"./ApiClient-DfbJwzpz.js";const q={class:"container"},z={class:"form-group"},Y={class:"form-group"},G={class:"advanced-settings"},K={class:"form-group"},Q={class:"input-with-button"},X=["disabled"],Z={class:"form-group"},ee={class:"form-label",for:"systemPrompt"},te={class:"form-group"},oe={class:"form-group"},se={key:0,class:"error-message"},le={class:"form-actions"},ae=["disabled"],re={key:0,class:"loading-spinner"},ne={__name:"ProjectNewView",setup(ie,{expose:_}){const x=B(),N=$(),U=O(),c=R,n=s(""),a=s(""),i=s(""),r=s(R),S=s(""),b=s(""),m=s(!1),p=s(null),y=s(!1),I=s(!0),C=s(!0);T(a,l=>{if(l&&I.value){const e=l.replace(/\/+$/,"").split("/");n.value=e[e.length-1]||""}l&&C.value&&D()});function g(){I.value=!1}function P(){C.value=!1}async function D(){if(a.value){y.value=!0;try{const l=await L.detectWorktreePath(a.value);i.value=l.worktreePath,C.value=!0}catch{}finally{y.value=!1}}}_({name:n,workingDirectory:a,worktreePath:i,onNameInput:g,onWorktreePathInput:P});async function V(){m.value=!0,p.value=null;try{const l=await N.createProject({name:n.value,workingDirectory:a.value,systemPrompt:r.value===c?null:r.value,onSessionCreated:S.value||void 0,onSessionDeleted:b.value||void 0,worktreePath:i.value||null});U.success("Repository added"),x.push(`/projects/${l.id}/sessions`)}catch(l){p.value=l.message}finally{m.value=!1}}return(l,e)=>{const F=W("router-link");return f(),v("div",q,[e[21]||(e[21]=t("h1",null,"Add a Repository",-1)),t("form",{class:"form card",onSubmit:M(V,["prevent"])},[t("div",z,[e[7]||(e[7]=t("label",{class:"form-label",for:"workingDirectory"},"Repository Folder",-1)),E(J,{modelValue:a.value,"onUpdate:modelValue":e[0]||(e[0]=o=>a.value=o)},null,8,["modelValue"]),e[8]||(e[8]=t("p",{class:"form-help"}," The root of your codebase — typically a git repository. ",-1))]),t("div",Y,[e[9]||(e[9]=t("label",{class:"form-label",for:"name"},"Display Name",-1)),u(t("input",{id:"name","onUpdate:modelValue":e[1]||(e[1]=o=>n.value=o),type:"text",class:"form-input",placeholder:"my-app",required:"",onInput:g},null,544),[[d,n.value]])]),t("details",G,[e[18]||(e[18]=t("summary",null,"Advanced Settings",-1)),t("div",K,[e[10]||(e[10]=t("label",{class:"form-label",for:"worktreePath"},"Worktree Path",-1)),t("div",Q,[u(t("input",{id:"worktreePath","onUpdate:modelValue":e[2]||(e[2]=o=>i.value=o),type:"text",class:"form-input",placeholder:"/path/to/.worktrees",onInput:P},null,544),[[d,i.value]]),t("button",{type:"button",class:"btn btn-secondary btn-sm",disabled:!a.value||y.value,onClick:D}," Detect ",8,X)]),e[11]||(e[11]=t("p",{class:"form-help"}," Directory where git worktrees will be created for sessions. Leave empty to use the default. ",-1))]),t("div",Z,[t("label",ee,[e[12]||(e[12]=k(" System Prompt ",-1)),r.value!==h(c)?(f(),v("button",{key:0,type:"button",class:"btn-link",onClick:e[3]||(e[3]=o=>r.value=h(c))}," Reset to Default ")):w("",!0)]),u(t("textarea",{id:"systemPrompt","onUpdate:modelValue":e[4]||(e[4]=o=>r.value=o),class:"form-input form-textarea",rows:"8"},null,512),[[d,r.value]]),e[13]||(e[13]=t("p",{class:"form-help"}," Customize the system prompt for the AI agent. The default prompt is pre-filled above. ",-1))]),t("div",te,[e[14]||(e[14]=t("label",{class:"form-label",for:"onSessionCreated"},"On Session Created",-1)),u(t("textarea",{id:"onSessionCreated","onUpdate:modelValue":e[5]||(e[5]=o=>S.value=o),class:"form-input form-textarea-small",rows:"3",placeholder:"Shell command to run when a session is created..."},null,512),[[d,S.value]]),e[15]||(e[15]=t("p",{class:"form-help"}," Runs in the background after session creation. Environment variables: CIRCUSCHIEF_SESSION_ID, CIRCUSCHIEF_PROJECT_ID, CIRCUSCHIEF_SESSION_NAME ",-1))]),t("div",oe,[e[16]||(e[16]=t("label",{class:"form-label",for:"onSessionDeleted"},"On Session Deleted",-1)),u(t("textarea",{id:"onSessionDeleted","onUpdate:modelValue":e[6]||(e[6]=o=>b.value=o),class:"form-input form-textarea-small",rows:"3",placeholder:"Shell command to run when a session is deleted..."},null,512),[[d,b.value]]),e[17]||(e[17]=t("p",{class:"form-help"}," Runs in the background after session deletion. Environment variables: CIRCUSCHIEF_SESSION_ID, CIRCUSCHIEF_PROJECT_ID, CIRCUSCHIEF_SESSION_NAME ",-1))])]),p.value?(f(),v("div",se,j(p.value),1)):w("",!0),t("div",le,[E(F,{to:"/",class:"btn"},{default:H(()=>[...e[19]||(e[19]=[k(" Cancel ",-1)])]),_:1}),t("button",{type:"submit",class:"btn btn-primary",disabled:m.value},[m.value?(f(),v("span",re)):w("",!0),e[20]||(e[20]=k(" Add Repository ",-1))],8,ae)])],32)])}}},fe=A(ne,[["__scopeId","data-v-3fea4262"]]);export{fe as default};
1
+ import{_ as A,k as O,l as T,a as f,c as v,b as t,d as E,m as u,v as d,f as k,u as h,D as R,i as w,t as j,w as H,j as M,n as s,g as W,h as B}from"./index-CvXApbVC.js";import{u as $}from"./projects-BvLADGKx.js";import{P as J}from"./InputWithButton-CHHcpF4I.js";import{a as L}from"./ApiClient-DfbJwzpz.js";const q={class:"container"},z={class:"form-group"},Y={class:"form-group"},G={class:"advanced-settings"},K={class:"form-group"},Q={class:"input-with-button"},X=["disabled"],Z={class:"form-group"},ee={class:"form-label",for:"systemPrompt"},te={class:"form-group"},oe={class:"form-group"},se={key:0,class:"error-message"},le={class:"form-actions"},ae=["disabled"],re={key:0,class:"loading-spinner"},ne={__name:"ProjectNewView",setup(ie,{expose:_}){const x=B(),N=$(),U=O(),c=R,n=s(""),a=s(""),i=s(""),r=s(R),S=s(""),b=s(""),m=s(!1),p=s(null),y=s(!1),I=s(!0),C=s(!0);T(a,l=>{if(l&&I.value){const e=l.replace(/\/+$/,"").split("/");n.value=e[e.length-1]||""}l&&C.value&&D()});function g(){I.value=!1}function P(){C.value=!1}async function D(){if(a.value){y.value=!0;try{const l=await L.detectWorktreePath(a.value);i.value=l.worktreePath,C.value=!0}catch{}finally{y.value=!1}}}_({name:n,workingDirectory:a,worktreePath:i,onNameInput:g,onWorktreePathInput:P});async function V(){m.value=!0,p.value=null;try{const l=await N.createProject({name:n.value,workingDirectory:a.value,systemPrompt:r.value===c?null:r.value,onSessionCreated:S.value||void 0,onSessionDeleted:b.value||void 0,worktreePath:i.value||null});U.success("Repository added"),x.push(`/projects/${l.id}/sessions`)}catch(l){p.value=l.message}finally{m.value=!1}}return(l,e)=>{const F=W("router-link");return f(),v("div",q,[e[21]||(e[21]=t("h1",null,"Add a Repository",-1)),t("form",{class:"form card",onSubmit:M(V,["prevent"])},[t("div",z,[e[7]||(e[7]=t("label",{class:"form-label",for:"workingDirectory"},"Repository Folder",-1)),E(J,{modelValue:a.value,"onUpdate:modelValue":e[0]||(e[0]=o=>a.value=o)},null,8,["modelValue"]),e[8]||(e[8]=t("p",{class:"form-help"}," The root of your codebase — typically a git repository. ",-1))]),t("div",Y,[e[9]||(e[9]=t("label",{class:"form-label",for:"name"},"Display Name",-1)),u(t("input",{id:"name","onUpdate:modelValue":e[1]||(e[1]=o=>n.value=o),type:"text",class:"form-input",placeholder:"my-app",required:"",onInput:g},null,544),[[d,n.value]])]),t("details",G,[e[18]||(e[18]=t("summary",null,"Advanced Settings",-1)),t("div",K,[e[10]||(e[10]=t("label",{class:"form-label",for:"worktreePath"},"Worktree Path",-1)),t("div",Q,[u(t("input",{id:"worktreePath","onUpdate:modelValue":e[2]||(e[2]=o=>i.value=o),type:"text",class:"form-input",placeholder:"/path/to/.worktrees",onInput:P},null,544),[[d,i.value]]),t("button",{type:"button",class:"btn btn-secondary btn-sm",disabled:!a.value||y.value,onClick:D}," Detect ",8,X)]),e[11]||(e[11]=t("p",{class:"form-help"}," Directory where git worktrees will be created for sessions. Leave empty to use the default. ",-1))]),t("div",Z,[t("label",ee,[e[12]||(e[12]=k(" System Prompt ",-1)),r.value!==h(c)?(f(),v("button",{key:0,type:"button",class:"btn-link",onClick:e[3]||(e[3]=o=>r.value=h(c))}," Reset to Default ")):w("",!0)]),u(t("textarea",{id:"systemPrompt","onUpdate:modelValue":e[4]||(e[4]=o=>r.value=o),class:"form-input form-textarea",rows:"8"},null,512),[[d,r.value]]),e[13]||(e[13]=t("p",{class:"form-help"}," Customize the system prompt for the AI agent. The default prompt is pre-filled above. ",-1))]),t("div",te,[e[14]||(e[14]=t("label",{class:"form-label",for:"onSessionCreated"},"On Session Created",-1)),u(t("textarea",{id:"onSessionCreated","onUpdate:modelValue":e[5]||(e[5]=o=>S.value=o),class:"form-input form-textarea-small",rows:"3",placeholder:"Shell command to run when a session is created..."},null,512),[[d,S.value]]),e[15]||(e[15]=t("p",{class:"form-help"}," Runs in the background after session creation. Environment variables: CIRCUSCHIEF_SESSION_ID, CIRCUSCHIEF_PROJECT_ID, CIRCUSCHIEF_SESSION_NAME ",-1))]),t("div",oe,[e[16]||(e[16]=t("label",{class:"form-label",for:"onSessionDeleted"},"On Session Deleted",-1)),u(t("textarea",{id:"onSessionDeleted","onUpdate:modelValue":e[6]||(e[6]=o=>b.value=o),class:"form-input form-textarea-small",rows:"3",placeholder:"Shell command to run when a session is deleted..."},null,512),[[d,b.value]]),e[17]||(e[17]=t("p",{class:"form-help"}," Runs in the background after session deletion. Environment variables: CIRCUSCHIEF_SESSION_ID, CIRCUSCHIEF_PROJECT_ID, CIRCUSCHIEF_SESSION_NAME ",-1))])]),p.value?(f(),v("div",se,j(p.value),1)):w("",!0),t("div",le,[E(F,{to:"/",class:"btn"},{default:H(()=>[...e[19]||(e[19]=[k(" Cancel ",-1)])]),_:1}),t("button",{type:"submit",class:"btn btn-primary",disabled:m.value},[m.value?(f(),v("span",re)):w("",!0),e[20]||(e[20]=k(" Add Repository ",-1))],8,ae)])],32)])}}},fe=A(ne,[["__scopeId","data-v-3fea4262"]]);export{fe as default};
@@ -0,0 +1 @@
1
+ .models-section[data-v-3aa7217a]{margin-bottom:1.25rem;border:1px solid var(--color-border);border-radius:.25rem;overflow:hidden}.models-header[data-v-3aa7217a]{display:flex;align-items:baseline;gap:.75rem;padding:.75rem 1rem;background:var(--color-background-soft);border-bottom:1px solid var(--color-border)}.models-title[data-v-3aa7217a]{font-weight:500;font-size:.875rem;color:var(--color-text)}.models-hint[data-v-3aa7217a]{font-size:.8125rem;color:var(--color-text-soft)}.models-list[data-v-3aa7217a]{padding:.5rem .75rem}.model-row[data-v-3aa7217a]{display:grid;grid-template-columns:1fr 10rem 6.5rem 2rem;gap:.5rem;align-items:center;margin-bottom:.375rem}.model-row-header[data-v-3aa7217a]{font-size:.75rem;font-weight:500;color:var(--color-text-soft);margin-bottom:.25rem}.model-row-header span[data-v-3aa7217a]{padding:0 .25rem}.model-input[data-v-3aa7217a]{padding:.4rem .6rem;background:var(--color-background-soft);border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-size:.8125rem}.model-input[data-v-3aa7217a]:focus{outline:none;border-color:var(--color-primary)}.tier-select[data-v-3aa7217a]{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto;cursor:pointer}.remove-model-btn[data-v-3aa7217a]{background:none;border:1px solid var(--color-border);color:var(--color-text-soft);font-size:1.125rem;cursor:pointer;padding:.2rem .4rem;line-height:1;border-radius:.25rem;text-align:center}.remove-model-btn[data-v-3aa7217a]:hover{color:var(--color-danger, #ef4444);border-color:var(--color-danger, #ef4444)}.models-empty[data-v-3aa7217a]{padding:.75rem 1rem;font-size:.8125rem;color:var(--color-text-soft);font-style:italic}.add-model-btn[data-v-3aa7217a]{margin:.5rem .75rem .75rem}.btn[data-v-3aa7217a]{padding:.5rem 1rem;border-radius:.25rem;font-size:.875rem;font-weight:500;cursor:pointer;transition:all .15s}.btn-sm[data-v-3aa7217a]{padding:.375rem .75rem;font-size:.8125rem}.btn-secondary[data-v-3aa7217a]{background:var(--color-background);border:1px solid var(--color-border);color:var(--color-text)}.btn-secondary[data-v-3aa7217a]:hover:not(:disabled){border-color:var(--color-primary);background:var(--color-background-soft)}.modal-overlay[data-v-7104819f]{position:fixed;top:0;left:0;right:0;bottom:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:1000}.modal[data-v-7104819f]{background:var(--color-background);border:1px solid var(--color-border);border-radius:.5rem;width:100%;max-width:680px;max-height:90vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 8px 32px #0000004d}.modal-header[data-v-7104819f]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid var(--color-border)}.modal-header h2[data-v-7104819f]{margin:0;font-size:1.125rem;font-weight:600}.close-btn[data-v-7104819f]{background:none;border:none;color:var(--color-text-soft);font-size:1.5rem;cursor:pointer;padding:.25rem;line-height:1;border-radius:.25rem}.close-btn[data-v-7104819f]:hover{color:var(--color-text);background:var(--color-background-soft)}.modal-body[data-v-7104819f]{padding:1.25rem;overflow-y:auto}.form-group[data-v-7104819f]{margin-bottom:1.25rem}.form-group label[data-v-7104819f]{display:block;margin-bottom:.5rem;font-weight:500;font-size:.875rem;color:var(--color-text)}.label-hint[data-v-7104819f]{font-weight:400;color:var(--color-text-soft);font-size:.8125rem}.form-group input[type=text][data-v-7104819f],.form-group input[type=url][data-v-7104819f],.form-group input[type=password][data-v-7104819f],.form-group input[type=number][data-v-7104819f],.form-group textarea[data-v-7104819f],.form-group select.kind-select[data-v-7104819f]{width:100%;padding:.5rem .75rem;background:var(--color-background-soft);border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-size:.875rem}.form-group textarea[data-v-7104819f]{min-height:4.75rem;resize:vertical;line-height:1.45}.form-group input[data-v-7104819f]:focus,.form-group textarea[data-v-7104819f]:focus,.form-group select.kind-select[data-v-7104819f]:focus{outline:none;border-color:var(--color-primary)}.form-group select.kind-select[data-v-7104819f]:disabled{opacity:.6;cursor:not-allowed}.field-note[data-v-7104819f]{margin:.375rem 0 0;font-size:.75rem;color:var(--color-text-soft);font-style:italic}.field-error[data-v-7104819f]{margin:.375rem 0 0;font-size:.75rem;color:var(--color-danger)}.token-input-wrapper[data-v-7104819f]{display:flex;gap:.5rem}.token-input-wrapper input[data-v-7104819f]{flex:1}.toggle-visibility-btn[data-v-7104819f]{padding:.5rem 1rem;background:var(--color-background);border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-size:.8125rem;cursor:pointer;white-space:nowrap}.toggle-visibility-btn[data-v-7104819f]:hover{background:var(--color-background-soft)}.expandable-section[data-v-7104819f]{margin-bottom:1.25rem;border:1px solid var(--color-border);border-radius:.25rem}.section-header[data-v-7104819f]{padding:.75rem 1rem;background:var(--color-background-soft);cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:500;font-size:.875rem;color:var(--color-text)}.section-header[data-v-7104819f]:hover{background:var(--color-background-mute)}.section-content[data-v-7104819f]{padding:1rem}.env-vars-list[data-v-7104819f]{display:flex;flex-direction:column;gap:.5rem}.env-var-row[data-v-7104819f]{display:flex;gap:.5rem}.env-key[data-v-7104819f],.env-value[data-v-7104819f]{padding:.5rem .75rem;background:var(--color-background-soft);border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-size:.875rem;font-family:var(--font-mono)}.env-key[data-v-7104819f]{flex:0 0 150px}.env-value[data-v-7104819f]{flex:1}.env-key[data-v-7104819f]:focus,.env-value[data-v-7104819f]:focus{outline:none;border-color:var(--color-primary)}.remove-env-btn[data-v-7104819f]{background:none;border:1px solid var(--color-border);color:var(--color-text-soft);font-size:1.25rem;cursor:pointer;padding:.25rem .5rem;line-height:1;border-radius:.25rem}.remove-env-btn[data-v-7104819f]:hover{color:var(--color-danger, #ef4444);border-color:var(--color-danger, #ef4444)}.error-message[data-v-7104819f]{margin-top:1rem;padding:.75rem;background:#ef44441a;border:1px solid rgba(239,68,68,.3);border-radius:.25rem;color:var(--color-danger, #ef4444);font-size:.875rem}.test-result[data-v-7104819f]{margin-top:1rem;padding:.75rem;border-radius:.25rem;font-size:.875rem}.test-result.success[data-v-7104819f]{background:#22c55e1a;border:1px solid rgba(34,197,94,.3);color:var(--color-success, #22c55e)}.test-result.failure[data-v-7104819f]{background:#ef44441a;border:1px solid rgba(239,68,68,.3);color:var(--color-danger, #ef4444)}.test-result-header[data-v-7104819f]{display:flex;align-items:center;gap:.5rem;font-weight:500}.test-icon[data-v-7104819f]{font-size:1.125rem}.test-details[data-v-7104819f]{margin-top:.5rem;padding-top:.5rem;border-top:1px solid currentColor;opacity:.8}.test-detail[data-v-7104819f]{margin-top:.25rem}.test-detail code[data-v-7104819f]{font-family:var(--font-mono);font-size:.8125rem}.modal-footer[data-v-7104819f]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-top:1px solid var(--color-border);background:var(--color-background-soft)}.footer-actions[data-v-7104819f]{display:flex;gap:.75rem}.btn[data-v-7104819f]{padding:.5rem 1rem;border-radius:.25rem;font-size:.875rem;font-weight:500;cursor:pointer;transition:all .15s}.btn[data-v-7104819f]:disabled{opacity:.5;cursor:not-allowed}.btn-sm[data-v-7104819f]{padding:.375rem .75rem;font-size:.8125rem}.btn-secondary[data-v-7104819f]{background:var(--color-background);border:1px solid var(--color-border);color:var(--color-text)}.btn-secondary[data-v-7104819f]:hover:not(:disabled){border-color:var(--color-primary);background:var(--color-background-soft)}.btn-primary[data-v-7104819f]{background:var(--color-primary);border:1px solid var(--color-primary);color:#fff}.btn-primary[data-v-7104819f]:hover:not(:disabled){filter:brightness(1.1)}@media (max-width: 520px){.modal-overlay[data-v-7104819f]{align-items:stretch;justify-content:stretch}.modal[data-v-7104819f]{max-width:none;max-height:none;min-height:100vh;border-radius:0;border-left:0;border-right:0}.modal-body[data-v-7104819f]{padding:1rem}.modal-footer[data-v-7104819f]{align-items:stretch;flex-direction:column;gap:.75rem}.footer-actions[data-v-7104819f]{justify-content:space-between;width:100%}.footer-actions .btn[data-v-7104819f],.modal-footer>.btn[data-v-7104819f]{flex:1}.env-var-row[data-v-7104819f],.token-input-wrapper[data-v-7104819f]{flex-direction:column}.env-key[data-v-7104819f]{flex:1}}.page-header[data-v-6c0ab9d0]{display:flex;justify-content:flex-end;align-items:center;margin-bottom:.5rem}.page-description[data-v-6c0ab9d0]{color:var(--color-text-soft);margin:0 0 1.5rem;font-size:.875rem;line-height:1.5}.skeleton-list[data-v-6c0ab9d0]{display:flex;flex-direction:column;gap:1rem}.error-message[data-v-6c0ab9d0]{color:var(--color-error);padding:1rem;background-color:#f851491a;border-radius:var(--border-radius)}.provider-list[data-v-6c0ab9d0]{display:flex;flex-direction:column;gap:1rem}.provider-card[data-v-6c0ab9d0]{padding:1.25rem}.provider-header[data-v-6c0ab9d0]{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.75rem;gap:1rem}.provider-title h3[data-v-6c0ab9d0]{margin:0;font-size:1rem;display:flex;align-items:center;gap:.5rem}.built-in-badge[data-v-6c0ab9d0]{display:inline-block;padding:.125rem .5rem;background:var(--color-background-soft);border:1px solid var(--color-border);border-radius:.25rem;font-size:.75rem;font-weight:500;text-transform:uppercase;letter-spacing:0;color:var(--color-text-soft)}.provider-actions[data-v-6c0ab9d0]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.provider-details[data-v-6c0ab9d0]{display:flex;flex-direction:column;gap:.5rem}.provider-detail[data-v-6c0ab9d0]{display:flex;gap:.5rem;font-size:.875rem}.detail-label[data-v-6c0ab9d0]{color:var(--color-text-soft);font-weight:500}.detail-value[data-v-6c0ab9d0]{color:var(--color-text);font-family:var(--font-mono);font-size:.8125rem;overflow-wrap:anywhere}.btn-sm[data-v-6c0ab9d0]{padding:.375rem .75rem;font-size:.8125rem}.btn-danger[data-v-6c0ab9d0]{background:var(--color-danger, #ef4444);border:1px solid var(--color-danger, #ef4444);color:#fff}.btn-danger[data-v-6c0ab9d0]:hover:not(:disabled){filter:brightness(1.1)}.modal-overlay[data-v-6c0ab9d0]{position:fixed;top:0;left:0;right:0;bottom:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:1000}.modal[data-v-6c0ab9d0]{background:var(--color-background);border:1px solid var(--color-border);border-radius:.5rem;width:100%;max-width:450px;max-height:90vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 8px 32px #0000004d}.confirm-modal[data-v-6c0ab9d0]{max-width:400px}.modal-header[data-v-6c0ab9d0]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid var(--color-border)}.modal-header h2[data-v-6c0ab9d0]{margin:0;font-size:1.125rem;font-weight:600}.close-btn[data-v-6c0ab9d0]{background:none;border:none;color:var(--color-text-soft);font-size:1.5rem;cursor:pointer;padding:.25rem;line-height:1;border-radius:.25rem}.close-btn[data-v-6c0ab9d0]:hover{color:var(--color-text);background:var(--color-background-soft)}.modal-body[data-v-6c0ab9d0]{padding:1.25rem}.modal-body p[data-v-6c0ab9d0]{margin:0 0 .75rem}.warning-text[data-v-6c0ab9d0]{color:var(--color-warning, #f59e0b);font-size:.875rem;font-weight:500}.modal-footer[data-v-6c0ab9d0]{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 1.25rem;border-top:1px solid var(--color-border);background:var(--color-background-soft)}@media (max-width: 520px){.provider-card[data-v-6c0ab9d0]{padding:1rem}.provider-header[data-v-6c0ab9d0],.provider-detail[data-v-6c0ab9d0]{flex-direction:column;align-items:stretch}.provider-actions[data-v-6c0ab9d0]{justify-content:flex-start}.modal-overlay[data-v-6c0ab9d0]{align-items:stretch}.modal[data-v-6c0ab9d0]{max-width:none;max-height:none;min-height:100vh;border-radius:0;border-left:0;border-right:0}.modal-footer[data-v-6c0ab9d0]{justify-content:space-between}}
@@ -0,0 +1 @@
1
+ import{k as se,l as ae,z as L,a8 as te,a9 as ie,n as C,_ as Z,a,c as d,b as e,e as de,F as j,r as z,m as E,v as N,q as oe,t as y,u as t,j as X,i as f,f as B,aa as re,x as ue,J as ce,U as Q,o as ve,d as me}from"./index-CvXApbVC.js";import{u as ne}from"./providers-DZ-fOa4G.js";import"./ApiClient-DfbJwzpz.js";const pe=Object.freeze(["anthropic","openai"]);function le(){return{name:"",kind:"anthropic",baseUrl:null,authToken:null,apiTimeoutMs:null,additionalEnvVars:{},commitAttributionOverride:null}}function be(u){const b={name:u.name,kind:u.kind||"anthropic",baseUrl:u.baseUrl,authToken:u.authToken==="••••••••"?null:u.authToken,apiTimeoutMs:u.apiTimeoutMs,additionalEnvVars:u.additionalEnvVars?{...u.additionalEnvVars}:{},commitAttributionOverride:u.commitAttributionOverride||null},m=Object.keys(b.additionalEnvVars),k=(u.models||[]).map(n=>({_serverId:n.id,modelId:n.modelId,displayName:n.displayName,tier:n.tier||"custom"}));return{formData:b,envKeys:m,models:k,authModified:!1}}function fe(){return{form:C(le()),localModels:C([]),envVarKeys:C([]),showAuthToken:C(!1),saving:C(!1),testing:C(!1),error:C(null),testResult:C(null),authTokenModified:C(!1)}}function ye(u,b,m,k={}){const n=ne(),_=se(),g=k.attributionOnlyRef,A=fe(),{form:l,localModels:M,envVarKeys:I,showAuthToken:V,saving:U,testing:O,error:$,testResult:w,authTokenModified:S}=A,D=L(()=>!!b.value),h=L(()=>{const s=te(l.value.commitAttributionOverride);return s.success?null:s.error}),i=L(()=>h.value?!1:g!=null&&g.value?!0:!(l.value.name.trim().length===0||!D.value&&!pe.includes(l.value.kind))),r=L(()=>l.value.baseUrl||l.value.authToken);ae(()=>[u.value,b.value],([s,c])=>{if(s){if(c){const p=be(c);l.value=p.formData,I.value=p.envKeys,M.value=p.models,S.value=p.authModified}else l.value=le(),I.value=[],M.value=[],S.value=!0;V.value=!1,$.value=null,w.value=null}},{deep:!0});function x(){M.value.push({modelId:"",displayName:"",tier:"custom"})}function H(s){M.value.splice(s,1)}function R(){const s=`ENV_VAR_${Object.keys(l.value.additionalEnvVars).length+1}`;l.value.additionalEnvVars[s]="",I.value.push(s)}function q(s){delete l.value.additionalEnvVars[s],I.value=I.value.filter(c=>c!==s)}function Y(s,c){const p=I.value[s];if(p!==c&&p.trim()){const P=l.value.additionalEnvVars[c];delete l.value.additionalEnvVars[c],l.value.additionalEnvVars[p]=P}}async function W(){O.value=!0,$.value=null,w.value=null;try{const s=M.value.find(p=>p.tier==="sonnet"),c={kind:l.value.kind||"anthropic",baseUrl:l.value.baseUrl||void 0,authToken:l.value.authToken||void 0,defaultSonnetModel:(s==null?void 0:s.modelId)||void 0,apiTimeoutMs:l.value.apiTimeoutMs||void 0};w.value=await n.testConnection(c)}catch(s){$.value=s.message}finally{O.value=!1}}function G(s,c){return s.modelId.trim()!==c.modelId||s.displayName.trim()!==c.displayName||s.tier!==c.tier}function J(s){return{modelId:s.modelId.trim(),displayName:s.displayName.trim()||s.modelId.trim(),tier:s.tier||"custom"}}async function o(s,c,p){if(!s._serverId&&s.modelId.trim()){await n.addModel(c,J(s));return}const P=p.get(s._serverId);P&&G(s,P)&&await n.updateModel(c,s._serverId,J(s))}async function v(s){var ee;const c=new Set(M.value.filter(T=>T._serverId).map(T=>T._serverId)),p=((ee=b.value)==null?void 0:ee.models)||[],P=new Map(p.map(T=>[T.id,T]));for(const T of p)c.has(T.id)||await n.removeModel(s,T.id);for(const T of M.value)await o(T,s,P);await n.fetchProviders()}function F(s){const c=te(s);if(!c.success)throw new Error(ie);return c.value}async function K(){var s,c;U.value=!0,$.value=null;try{const p={name:l.value.name.trim(),baseUrl:((s=l.value.baseUrl)==null?void 0:s.trim())||null,apiTimeoutMs:l.value.apiTimeoutMs||null,additionalEnvVars:Object.keys(l.value.additionalEnvVars).length>0?l.value.additionalEnvVars:null,commitAttributionOverride:F(l.value.commitAttributionOverride)};if(g!=null&&g.value){await n.updateProvider(b.value.id,{commitAttributionOverride:p.commitAttributionOverride}),_.success("Provider updated successfully"),m();return}S.value&&(p.authToken=((c=l.value.authToken)==null?void 0:c.trim())||null);let P;D.value?(P=await n.updateProvider(b.value.id,p),_.success("Provider updated successfully")):(p.kind=l.value.kind||"anthropic",P=await n.createProvider(p),_.success("Provider created successfully")),await v(P.id),m()}catch(p){$.value=p.message}finally{U.value=!1}}return{form:l,localModels:M,envVarKeys:I,showAuthToken:V,saving:U,testing:O,error:$,testResult:w,authTokenModified:S,isEditing:D,attributionValidationError:h,isValid:i,canTest:r,addLocalModel:x,removeLocalModel:H,addEnvVar:R,removeEnvVar:q,updateEnvVarKey:Y,testConnection:W,save:K}}const ke={class:"models-section"},he={key:0,class:"models-list"},_e=["onUpdate:modelValue"],ge=["onUpdate:modelValue"],Ce=["onUpdate:modelValue"],Ve=["onClick"],Me={key:1,class:"models-empty"},Ae={__name:"ProviderModelsList",props:{models:{type:Array,required:!0}},emits:["add","remove"],setup(u){return(b,m)=>(a(),d("div",ke,[m[3]||(m[3]=e("div",{class:"models-header"},[e("span",{class:"models-title"},"Models"),e("span",{class:"models-hint"},"Assign tiers to map provider models to Opus / Sonnet / Haiku roles")],-1)),u.models.length>0?(a(),d("div",he,[m[2]||(m[2]=de('<div class="model-row model-row-header" data-v-3aa7217a><span class="col-model-id" data-v-3aa7217a>Model ID</span><span class="col-display-name" data-v-3aa7217a>Display Name</span><span class="col-tier" data-v-3aa7217a>Tier</span><span class="col-actions" data-v-3aa7217a></span></div>',1)),(a(!0),d(j,null,z(u.models,(k,n)=>(a(),d("div",{key:n,class:"model-row"},[E(e("input",{"onUpdate:modelValue":_=>k.modelId=_,type:"text",placeholder:"anthropic.claude-3-sonnet-…",class:"col-model-id model-input"},null,8,_e),[[N,k.modelId]]),E(e("input",{"onUpdate:modelValue":_=>k.displayName=_,type:"text",placeholder:"My Sonnet",class:"col-display-name model-input"},null,8,ge),[[N,k.displayName]]),E(e("select",{"onUpdate:modelValue":_=>k.tier=_,class:"col-tier model-input tier-select"},[...m[1]||(m[1]=[e("option",{value:"opus"}," Opus ",-1),e("option",{value:"sonnet"}," Sonnet ",-1),e("option",{value:"haiku"}," Haiku ",-1),e("option",{value:"custom"}," Custom ",-1)])],8,Ce),[[oe,k.tier]]),e("button",{type:"button",class:"col-actions remove-model-btn",title:"Remove model",onClick:_=>b.$emit("remove",n)}," × ",8,Ve)]))),128))])):(a(),d("div",Me," No models added yet. ")),e("button",{type:"button",class:"btn btn-sm btn-secondary add-model-btn",onClick:m[0]||(m[0]=k=>b.$emit("add"))}," + Add Model ")]))}},Ie=Z(Ae,[["__scopeId","data-v-3aa7217a"]]),$e={class:"modal"},Te={class:"modal-header"},Ee={class:"modal-body"},Oe={key:0,class:"form-group"},Pe={key:1,class:"form-group"},Ue=["disabled","title"],we={key:0,class:"field-note"},Se={key:2,class:"form-group"},Ne={for:"base-url"},Be={class:"label-hint"},De=["placeholder"],Le={key:3,class:"form-group"},xe={for:"auth-token"},Re={class:"label-hint"},Fe={class:"token-input-wrapper"},Ke=["type"],Ge=["title"],He={class:"form-group"},je={key:0,class:"field-error"},ze={key:5,class:"expandable-section"},qe={class:"section-content"},Ye={class:"form-group"},We={class:"form-group"},Je={class:"env-vars-list"},Qe=["onUpdate:modelValue","onBlur"],Xe=["onUpdate:modelValue"],Ze=["onClick"],et={key:6,class:"error-message"},tt={class:"test-result-header"},st={class:"test-icon"},ot={class:"test-message"},nt={key:0,class:"test-details"},lt={key:0,class:"test-detail"},at={key:1,class:"test-detail"},it={class:"modal-footer"},dt=["disabled"],rt={class:"footer-actions"},ut=["disabled"],ct=["disabled"],vt={__name:"ProviderForm",props:{isOpen:{type:Boolean,default:!1},provider:{type:Object,default:null},attributionOnly:{type:Boolean,default:!1}},emits:["close","saved"],setup(u,{emit:b}){const m=u,k=b,{form:n,localModels:_,envVarKeys:g,showAuthToken:A,saving:l,testing:M,error:I,testResult:V,authTokenModified:U,isEditing:O,attributionValidationError:$,isValid:w,canTest:S,addLocalModel:D,removeLocalModel:h,addEnvVar:i,removeEnvVar:r,updateEnvVarKey:x,testConnection:H,save:R}=ye(Q(m,"isOpen"),Q(m,"provider"),()=>k("saved"),{attributionOnlyRef:Q(m,"attributionOnly")}),q=L(()=>n.value.kind==="openai"?"OPENAI_BASE_URL":n.value.kind==="google"?"Not used by Gemini CLI":"ANTHROPIC_BASE_URL"),Y=L(()=>n.value.kind==="openai"?"OPENAI_API_KEY":n.value.kind==="google"?"GEMINI_API_KEY":"ANTHROPIC_AUTH_TOKEN"),W=L(()=>n.value.kind==="openai"?"https://api.openai.com/v1":n.value.kind==="google"?"Leave blank — Gemini CLI uses its own endpoint":"https://bedrock-runtime.us-east-1.amazonaws.com");function G(){k("close")}return(J,o)=>u.isOpen?(a(),d("div",{key:0,class:"modal-overlay",onClick:X(G,["self"])},[e("div",$e,[e("div",Te,[e("h2",null,y(u.attributionOnly?"Commit Attribution":t(O)?"Edit Provider":"Add Provider"),1),e("button",{type:"button",class:"close-btn",title:"Close",onClick:G}," × ")]),e("div",Ee,[e("form",{onSubmit:o[9]||(o[9]=X((...v)=>t(R)&&t(R)(...v),["prevent"]))},[u.attributionOnly?f("",!0):(a(),d("div",Oe,[o[12]||(o[12]=e("label",{for:"provider-name"},"Provider Name*",-1)),E(e("input",{id:"provider-name","onUpdate:modelValue":o[0]||(o[0]=v=>t(n).name=v),type:"text",placeholder:"e.g., AWS Bedrock",required:"",maxlength:"100"},null,512),[[N,t(n).name]])])),u.attributionOnly?f("",!0):(a(),d("div",Pe,[o[14]||(o[14]=e("label",{for:"provider-kind"},[B(" Compatibility* "),e("span",{class:"label-hint"},"Wire protocol & env-var convention")],-1)),E(e("select",{id:"provider-kind","onUpdate:modelValue":o[1]||(o[1]=v=>t(n).kind=v),disabled:t(O),title:t(O)?"Compatibility cannot be changed after creation":void 0,class:"kind-select",required:""},[...o[13]||(o[13]=[e("option",{value:"anthropic"}," Anthropic (Claude Code) ",-1),e("option",{value:"openai"}," OpenAI / Codex ",-1),e("option",{value:"google"}," Google (Gemini CLI) ",-1)])],8,Ue),[[oe,t(n).kind]]),t(O)?(a(),d("p",we," Compatibility cannot be changed after creation. ")):f("",!0)])),u.attributionOnly?f("",!0):(a(),d("div",Se,[e("label",Ne,[o[15]||(o[15]=B(" Base URL ",-1)),e("span",Be,"("+y(q.value)+")",1)]),E(e("input",{id:"base-url","onUpdate:modelValue":o[2]||(o[2]=v=>t(n).baseUrl=v),type:"url",placeholder:W.value},null,8,De),[[N,t(n).baseUrl]])])),u.attributionOnly?f("",!0):(a(),d("div",Le,[e("label",xe,[o[16]||(o[16]=B(" Auth Token ",-1)),e("span",Re,"("+y(Y.value)+")",1)]),e("div",Fe,[E(e("input",{id:"auth-token","onUpdate:modelValue":o[3]||(o[3]=v=>t(n).authToken=v),type:t(A)?"text":"password",placeholder:"Your authentication token",onInput:o[4]||(o[4]=v=>U.value=!0)},null,40,Ke),[[re,t(n).authToken]]),e("button",{type:"button",class:"toggle-visibility-btn",title:t(A)?"Hide":"Show",onClick:o[5]||(o[5]=v=>A.value=!t(A))},y(t(A)?"Hide":"Show"),9,Ge)])])),e("div",He,[o[17]||(o[17]=e("label",{for:"commit-attribution-override"},"Commit attribution override",-1)),E(e("textarea",{id:"commit-attribution-override","onUpdate:modelValue":o[6]||(o[6]=v=>t(n).commitAttributionOverride=v),rows:"3",placeholder:"Blank uses agent default"},null,512),[[N,t(n).commitAttributionOverride]]),o[18]||(o[18]=e("p",{class:"field-note"}," Blank uses agent default. ",-1)),t($)?(a(),d("p",je,y(t($)),1)):f("",!0)]),u.attributionOnly?f("",!0):(a(),ue(Ie,{key:4,models:t(_),onAdd:t(D),onRemove:t(h)},null,8,["models","onAdd","onRemove"])),u.attributionOnly?f("",!0):(a(),d("details",ze,[o[21]||(o[21]=e("summary",{class:"section-header"}," Advanced Settings ",-1)),e("div",qe,[e("div",Ye,[o[19]||(o[19]=e("label",{for:"api-timeout"},"API Timeout (ms)",-1)),E(e("input",{id:"api-timeout","onUpdate:modelValue":o[7]||(o[7]=v=>t(n).apiTimeoutMs=v),type:"number",placeholder:"120000",min:"1000",step:"1000"},null,512),[[N,t(n).apiTimeoutMs,void 0,{number:!0}]])]),e("div",We,[o[20]||(o[20]=e("label",null,"Additional Environment Variables",-1)),e("div",Je,[(a(!0),d(j,null,z(t(n).additionalEnvVars,(v,F,K)=>(a(),d("div",{key:K,class:"env-var-row"},[E(e("input",{"onUpdate:modelValue":s=>t(g)[K]=s,type:"text",placeholder:"KEY",class:"env-key",onBlur:s=>t(x)(K,F)},null,40,Qe),[[N,t(g)[K]]]),E(e("input",{"onUpdate:modelValue":s=>t(n).additionalEnvVars[F]=s,type:"text",placeholder:"value",class:"env-value"},null,8,Xe),[[N,t(n).additionalEnvVars[F]]]),e("button",{type:"button",class:"remove-env-btn",title:"Remove",onClick:s=>t(r)(F)}," × ",8,Ze)]))),128)),e("button",{type:"button",class:"btn btn-sm btn-secondary",onClick:o[8]||(o[8]=(...v)=>t(i)&&t(i)(...v))}," + Add Variable ")])])])])),t(I)?(a(),d("div",et,y(t(I)),1)):f("",!0),t(V)?(a(),d("div",{key:7,class:ce(["test-result",t(V).success?"success":"failure"])},[e("div",tt,[e("span",st,y(t(V).success?"✓":"✗"),1),e("span",ot,y(t(V).message),1)]),t(V).details?(a(),d("div",nt,[t(V).details.model?(a(),d("div",lt,[o[22]||(o[22]=B(" Model: ",-1)),e("code",null,y(t(V).details.model),1)])):f("",!0),t(V).details.code?(a(),d("div",at,[o[23]||(o[23]=B(" Error Code: ",-1)),e("code",null,y(t(V).details.code),1)])):f("",!0)])):f("",!0)],2)):f("",!0)],32)]),e("div",it,[u.attributionOnly?f("",!0):(a(),d("button",{key:0,type:"button",class:"btn btn-secondary",disabled:t(l)||t(M)||!t(S),onClick:o[10]||(o[10]=(...v)=>t(H)&&t(H)(...v))},y(t(M)?"Testing...":"Test Connection"),9,dt)),e("div",rt,[e("button",{type:"button",class:"btn btn-secondary",disabled:t(l),onClick:G}," Cancel ",8,ut),e("button",{type:"button",class:"btn btn-primary",disabled:t(l)||!t(w),onClick:o[11]||(o[11]=(...v)=>t(R)&&t(R)(...v))},y(t(l)?"Saving...":"Save"),9,ct)])])])])):f("",!0)}},mt=Z(vt,[["__scopeId","data-v-7104819f"]]),pt={class:"container"},bt={key:0,class:"skeleton-list"},ft={key:1,class:"error-message"},yt={key:2,class:"provider-list"},kt={class:"provider-header"},ht={class:"provider-title"},_t={key:0,class:"built-in-badge"},gt={class:"provider-actions"},Ct=["disabled","onClick"],Vt=["onClick"],Mt=["onClick"],At={class:"provider-details"},It={class:"provider-detail"},$t={class:"detail-value"},Tt={key:0,class:"provider-detail"},Et={class:"detail-value"},Ot={key:1,class:"provider-detail"},Pt={class:"detail-value"},Ut={key:2,class:"provider-detail"},wt={class:"detail-value"},St={class:"modal confirm-modal"},Nt={class:"modal-header"},Bt={class:"modal-body"},Dt={class:"modal-footer"},Lt=["disabled"],xt={__name:"ProvidersView",setup(u){const b=ne(),m=se(),k=C(!1),n=C(null),_=C(!1),g=C(null),A=C(!1),l=C(null);ve(()=>{b.fetchProviders()});function M(){n.value=null,_.value=!1,k.value=!0}function I(h){n.value=h,_.value=!1,k.value=!0}function V(h){n.value=h,_.value=!0,k.value=!0}function U(){k.value=!1,n.value=null,_.value=!1}function O(){U(),b.fetchProviders()}function $(h){return h.kind==="openai"?"Uses official OpenAI API":h.kind==="google"?"Uses Google Gemini CLI":"Uses official Anthropic API"}async function w(h){l.value=h;try{const i=await b.testExistingProvider(h);i.success?m.success(`Connection successful (model: ${i.details.model})`):m.error(`Connection failed: ${i.message}`)}catch(i){m.error(`Test failed: ${i.message}`)}finally{l.value=null}}function S(h){g.value=h}async function D(){A.value=!0;try{await b.deleteProvider(g.value.id),m.success("Provider deleted"),g.value=null}catch(h){m.error(`Failed to delete provider: ${h.message}`)}finally{A.value=!1}}return(h,i)=>(a(),d("div",pt,[e("div",{class:"page-header"},[e("button",{class:"btn btn-primary",onClick:M},[...i[3]||(i[3]=[e("span",null,"+ Add Provider",-1)])])]),i[11]||(i[11]=e("p",{class:"page-description"}," Configure custom model providers to use the agent through alternative endpoints like AWS Bedrock, Google Vertex AI, or self-hosted proxies. ",-1)),t(b).loading?(a(),d("div",bt,[(a(),d(j,null,z(3,r=>e("div",{key:r,class:"skeleton card",style:{height:"120px"}})),64))])):t(b).error?(a(),d("div",ft,y(t(b).error),1)):(a(),d("div",yt,[(a(!0),d(j,null,z(t(b).providers,r=>(a(),d("div",{key:r.id,class:"provider-card card"},[e("div",kt,[e("div",ht,[e("h3",null,[B(y(r.name)+" ",1),r.isBuiltIn?(a(),d("span",_t,"Built-in")):f("",!0)])]),e("div",gt,[r.isBuiltIn?f("",!0):(a(),d("button",{key:0,class:"btn btn-sm",disabled:l.value===r.id,title:"Test Connection",onClick:x=>w(r.id)},y(l.value===r.id?"Testing...":"Test"),9,Ct)),e("button",{class:"btn btn-sm",onClick:x=>r.isBuiltIn?V(r):I(r)},y(r.isBuiltIn?"Settings":"Edit"),9,Vt),r.isBuiltIn?f("",!0):(a(),d("button",{key:1,class:"btn btn-sm btn-danger",onClick:x=>S(r)}," Delete ",8,Mt))])]),e("div",At,[e("div",It,[i[4]||(i[4]=e("span",{class:"detail-label"},"Commit attribution:",-1)),e("span",$t,y(r.commitAttributionOverride?"Custom attribution":"Agent default"),1)]),r.baseUrl?(a(),d("div",Tt,[i[5]||(i[5]=e("span",{class:"detail-label"},"Base URL:",-1)),e("code",Et,y(r.baseUrl),1)])):f("",!0),r.defaultSonnetModel?(a(),d("div",Ot,[i[6]||(i[6]=e("span",{class:"detail-label"},"Default Sonnet Model:",-1)),e("code",Pt,y(r.defaultSonnetModel),1)])):f("",!0),!r.baseUrl&&r.isBuiltIn?(a(),d("div",Ut,[e("span",wt,y($(r)),1)])):f("",!0)])]))),128))])),me(mt,{"is-open":k.value,provider:n.value,"attribution-only":_.value,onClose:U,onSaved:O},null,8,["is-open","provider","attribution-only"]),g.value?(a(),d("div",{key:3,class:"modal-overlay",onClick:i[2]||(i[2]=X(r=>g.value=null,["self"]))},[e("div",St,[e("div",Nt,[i[7]||(i[7]=e("h2",null,"Delete Provider",-1)),e("button",{type:"button",class:"close-btn",onClick:i[0]||(i[0]=r=>g.value=null)}," × ")]),e("div",Bt,[e("p",null,[i[8]||(i[8]=B("Are you sure you want to delete ",-1)),e("strong",null,y(g.value.name),1),i[9]||(i[9]=B("?",-1))]),i[10]||(i[10]=e("p",{class:"warning-text"}," This action cannot be undone. ",-1))]),e("div",Dt,[e("button",{type:"button",class:"btn btn-secondary",onClick:i[1]||(i[1]=r=>g.value=null)}," Cancel "),e("button",{type:"button",class:"btn btn-danger",disabled:A.value,onClick:D},y(A.value?"Deleting...":"Delete"),9,Lt)])])])):f("",!0)]))}},Gt=Z(xt,[["__scopeId","data-v-6c0ab9d0"]]);export{Gt as default};
@@ -1 +1 @@
1
- import{_ as T,a as l,c as a,b as e,i as p,F as B,r as D,t as b,j as d,n as y,h as I,m as M,s as q,z as F}from"./index-C2QFVD7d.js";import{u as N}from"./EffortLevelSelector-D2Hdzc_8.js";function pe(m){return function(c){c.key==="Enter"&&(c.metaKey||c.ctrlKey)&&(c.preventDefault(),m())}}const Q=["accept"],E={key:0,class:"drop-zone"},L={key:1,class:"attached-files"},P={class:"file-icon"},K=["title"],V={class:"file-size"},Z=["onClick"],O={__name:"FileAttachment",props:{maxFiles:{type:Number,default:10},maxSize:{type:Number,default:10*1024*1024},acceptTypes:{type:String,default:"image/*,text/*,.json,.md,.csv,.pdf,.js,.ts,.py,.java,.go,.rs,.c,.cpp,.h,.sh,.yaml,.yml,.xml,.html,.css"}},emits:["update:files"],setup(m,{expose:_,emit:c}){const f=m,h=c,o=y([]),u=y(!1),v=y(null);function x(){var t;(t=v.value)==null||t.click()}function $(t){const n=t.target;g(Array.from(n.files)),n.value=""}function w(){u.value=!0}function k(){u.value=!1}function C(t){u.value=!1,g(Array.from(t.dataTransfer.files))}function g(t){for(const n of t){if(o.value.length>=f.maxFiles){alert(`Maximum ${f.maxFiles} files allowed`);break}if(n.size>f.maxSize){alert(`File "${n.name}" exceeds maximum size of ${i(f.maxSize)}`);continue}o.value.some(r=>r.name===n.name&&r.size===n.size)||o.value.push(n)}h("update:files",o.value)}function S(t){o.value.splice(t,1),h("update:files",o.value)}function j(){o.value=[],h("update:files",[])}function s(t){const n=t.type||"";return n.startsWith("image/")?"🖼️":n.startsWith("text/")||n==="application/json"?"📄":n==="application/pdf"?"📕":n.includes("javascript")||n.includes("typescript")?"📜":"📎"}function i(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function z(t,n=25){if(t.length<=n)return t;const r=t.split(".").pop();return`${`${t.slice(0,t.length-r.length-1).slice(0,n-r.length-4)}...`}.${r}`}return _({clear:j,files:o,addFiles:g}),(t,n)=>(l(),a("div",{class:"file-attachments",onDragover:d(w,["prevent"]),onDragleave:d(k,["prevent"]),onDrop:d(C,["prevent"])},[e("input",{ref_key:"fileInput",ref:v,type:"file",multiple:"",accept:m.acceptTypes,class:"hidden-input",onChange:$},null,40,Q),e("button",{type:"button",class:"attach-btn",title:"Attach files (drag & drop supported)",onClick:x},[...n[0]||(n[0]=[e("span",{class:"attach-icon"},"📎",-1),e("span",{class:"attach-text"},"Attach",-1)])]),u.value?(l(),a("div",E,[...n[1]||(n[1]=[e("span",{class:"drop-text"},"Drop files here",-1)])])):p("",!0),o.value.length>0?(l(),a("div",L,[(l(!0),a(B,null,D(o.value,(r,R)=>(l(),a("div",{key:R,class:"file-chip"},[e("span",P,b(s(r)),1),e("span",{class:"file-name",title:r.name},b(z(r.name)),9,K),e("span",V,"("+b(i(r.size))+")",1),e("button",{type:"button",class:"remove-btn",title:"Remove file",onClick:A=>S(R)}," × ",8,Z)]))),128))])):p("",!0)],32))}},de=T(O,[["__scopeId","data-v-7f03e84b"]]),W={class:"panel-header"},G={class:"header-left"},H=["aria-expanded"],U={key:0,class:"header-actions"},J={key:0,class:"loading-state"},X={key:1,class:"empty-state"},Y={key:2,class:"responses-content"},ee={key:0,class:"response-section"},te={class:"responses-row"},se=["title","onClick"],ne={class:"button-label"},le={key:1,class:"response-section"},ae={class:"responses-row"},oe=["title","onClick"],ie={class:"button-label"},ue=Object.assign({name:"QuickResponsesPanel"},{__name:"QuickResponsesPanel",props:{showEmpty:{type:Boolean,default:!0},projectId:{type:String,default:null}},emits:["insert"],setup(m,{emit:_}){const c=m,f=_,h=I(),o=N(),u=y(!1),v=y(!0),x=F(()=>o.loading),$=F(()=>o.quickResponseTemplates.project),w=F(()=>o.quickResponseTemplates.global),k=F(()=>o.hasQuickResponseTemplates);function C(){u.value=!u.value}function g(j){f("insert",{content:j.prompt,autoSubmit:v.value}),u.value=!1}function S(){c.projectId&&h.push(`/projects/${c.projectId}/templates`)}return(j,s)=>k.value||m.showEmpty?(l(),a("div",{key:0,class:"quick-responses-panel cursor-pointer",onClick:C},[e("div",W,[e("div",G,[e("button",{type:"button",class:"toggle-button","aria-expanded":u.value,title:"Toggle quick responses panel","aria-label":"Toggle quick responses panel",onClick:d(C,["stop"])},[...s[3]||(s[3]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",class:"chevron-icon"},[e("path",{"fill-rule":"evenodd",d:"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 1 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"})],-1)])],8,H),s[4]||(s[4]=e("span",{class:"panel-title"},"Quick Responses",-1))]),u.value?(l(),a("div",U,[e("label",{class:"auto-submit-toggle",onClick:s[2]||(s[2]=d(()=>{},["stop"]))},[M(e("input",{"onUpdate:modelValue":s[0]||(s[0]=i=>v.value=i),type:"checkbox",onClick:s[1]||(s[1]=d(()=>{},["stop"]))},null,512),[[q,v.value]]),s[5]||(s[5]=e("span",null,"Auto-submit",-1))]),m.projectId?(l(),a("button",{key:0,type:"button",class:"settings-button",title:"Manage templates","aria-label":"Manage templates",onClick:d(S,["stop"])},[...s[6]||(s[6]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",class:"settings-icon"},[e("path",{"fill-rule":"evenodd",d:"M7.84 1.804A1 1 0 0 1 8.82 1h2.36a1 1 0 0 1 .98.804l.331 1.652a6.993 6.993 0 0 1 1.929 1.115l1.598-.54a1 1 0 0 1 1.186.447l1.18 2.044a1 1 0 0 1-.205 1.251l-1.267 1.113a7.047 7.047 0 0 1 0 2.228l1.267 1.113a1 1 0 0 1 .206 1.25l-1.18 2.045a1 1 0 0 1-1.187.447l-1.598-.54a6.993 6.993 0 0 1-1.929 1.115l-.33 1.652a1 1 0 0 1-.98.804H8.82a1 1 0 0 1-.98-.804l-.331-1.652a6.993 6.993 0 0 1-1.929-1.115l-1.598.54a1 1 0 0 1-1.186-.447l-1.18-2.044a1 1 0 0 1 .205-1.251l1.267-1.114a7.05 7.05 0 0 1 0-2.227L1.821 7.773a1 1 0 0 1-.206-1.25l1.18-2.045a1 1 0 0 1 1.187-.447l1.598.54A6.993 6.993 0 0 1 7.51 3.456l.33-1.652ZM10 13a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z","clip-rule":"evenodd"})],-1)])])):p("",!0)])):p("",!0)]),x.value&&u.value?(l(),a("div",J,[...s[7]||(s[7]=[e("span",{class:"loading-text"},"Loading...",-1)])])):!k.value&&u.value?(l(),a("div",X,[...s[8]||(s[8]=[e("span",{class:"empty-text"},"No quick response templates yet",-1)])])):p("",!0),u.value&&k.value&&!x.value?(l(),a("div",Y,[$.value.length>0?(l(),a("div",ee,[s[9]||(s[9]=e("span",{class:"section-label"},"Project",-1)),e("div",te,[(l(!0),a(B,null,D($.value,i=>(l(),a("button",{key:i.id,type:"button",class:"response-button project-response",title:i.prompt,onClick:d(z=>g(i),["stop"])},[e("span",ne,b(i.name),1)],8,se))),128))])])):p("",!0),w.value.length>0?(l(),a("div",le,[s[10]||(s[10]=e("span",{class:"section-label"},"Global",-1)),e("div",ae,[(l(!0),a(B,null,D(w.value,i=>(l(),a("button",{key:i.id,type:"button",class:"response-button global-response",title:i.prompt,onClick:d(z=>g(i),["stop"])},[e("span",ie,b(i.name),1)],8,oe))),128))])])):p("",!0)])):p("",!0)])):p("",!0)}}),me=T(ue,[["__scopeId","data-v-34a3db5e"]]);export{de as F,me as Q,pe as u};
1
+ import{_ as T,a as l,c as a,b as e,i as p,F as B,r as D,t as b,j as d,n as y,h as I,m as M,s as q,z as F}from"./index-CvXApbVC.js";import{u as N}from"./EffortLevelSelector-PaBpUveC.js";function pe(m){return function(c){c.key==="Enter"&&(c.metaKey||c.ctrlKey)&&(c.preventDefault(),m())}}const Q=["accept"],E={key:0,class:"drop-zone"},L={key:1,class:"attached-files"},P={class:"file-icon"},K=["title"],V={class:"file-size"},Z=["onClick"],O={__name:"FileAttachment",props:{maxFiles:{type:Number,default:10},maxSize:{type:Number,default:10*1024*1024},acceptTypes:{type:String,default:"image/*,text/*,.json,.md,.csv,.pdf,.js,.ts,.py,.java,.go,.rs,.c,.cpp,.h,.sh,.yaml,.yml,.xml,.html,.css"}},emits:["update:files"],setup(m,{expose:_,emit:c}){const f=m,h=c,o=y([]),u=y(!1),v=y(null);function x(){var t;(t=v.value)==null||t.click()}function $(t){const n=t.target;g(Array.from(n.files)),n.value=""}function w(){u.value=!0}function k(){u.value=!1}function C(t){u.value=!1,g(Array.from(t.dataTransfer.files))}function g(t){for(const n of t){if(o.value.length>=f.maxFiles){alert(`Maximum ${f.maxFiles} files allowed`);break}if(n.size>f.maxSize){alert(`File "${n.name}" exceeds maximum size of ${i(f.maxSize)}`);continue}o.value.some(r=>r.name===n.name&&r.size===n.size)||o.value.push(n)}h("update:files",o.value)}function S(t){o.value.splice(t,1),h("update:files",o.value)}function j(){o.value=[],h("update:files",[])}function s(t){const n=t.type||"";return n.startsWith("image/")?"🖼️":n.startsWith("text/")||n==="application/json"?"📄":n==="application/pdf"?"📕":n.includes("javascript")||n.includes("typescript")?"📜":"📎"}function i(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function z(t,n=25){if(t.length<=n)return t;const r=t.split(".").pop();return`${`${t.slice(0,t.length-r.length-1).slice(0,n-r.length-4)}...`}.${r}`}return _({clear:j,files:o,addFiles:g}),(t,n)=>(l(),a("div",{class:"file-attachments",onDragover:d(w,["prevent"]),onDragleave:d(k,["prevent"]),onDrop:d(C,["prevent"])},[e("input",{ref_key:"fileInput",ref:v,type:"file",multiple:"",accept:m.acceptTypes,class:"hidden-input",onChange:$},null,40,Q),e("button",{type:"button",class:"attach-btn",title:"Attach files (drag & drop supported)",onClick:x},[...n[0]||(n[0]=[e("span",{class:"attach-icon"},"📎",-1),e("span",{class:"attach-text"},"Attach",-1)])]),u.value?(l(),a("div",E,[...n[1]||(n[1]=[e("span",{class:"drop-text"},"Drop files here",-1)])])):p("",!0),o.value.length>0?(l(),a("div",L,[(l(!0),a(B,null,D(o.value,(r,R)=>(l(),a("div",{key:R,class:"file-chip"},[e("span",P,b(s(r)),1),e("span",{class:"file-name",title:r.name},b(z(r.name)),9,K),e("span",V,"("+b(i(r.size))+")",1),e("button",{type:"button",class:"remove-btn",title:"Remove file",onClick:A=>S(R)}," × ",8,Z)]))),128))])):p("",!0)],32))}},de=T(O,[["__scopeId","data-v-7f03e84b"]]),W={class:"panel-header"},G={class:"header-left"},H=["aria-expanded"],U={key:0,class:"header-actions"},J={key:0,class:"loading-state"},X={key:1,class:"empty-state"},Y={key:2,class:"responses-content"},ee={key:0,class:"response-section"},te={class:"responses-row"},se=["title","onClick"],ne={class:"button-label"},le={key:1,class:"response-section"},ae={class:"responses-row"},oe=["title","onClick"],ie={class:"button-label"},ue=Object.assign({name:"QuickResponsesPanel"},{__name:"QuickResponsesPanel",props:{showEmpty:{type:Boolean,default:!0},projectId:{type:String,default:null}},emits:["insert"],setup(m,{emit:_}){const c=m,f=_,h=I(),o=N(),u=y(!1),v=y(!0),x=F(()=>o.loading),$=F(()=>o.quickResponseTemplates.project),w=F(()=>o.quickResponseTemplates.global),k=F(()=>o.hasQuickResponseTemplates);function C(){u.value=!u.value}function g(j){f("insert",{content:j.prompt,autoSubmit:v.value}),u.value=!1}function S(){c.projectId&&h.push(`/projects/${c.projectId}/templates`)}return(j,s)=>k.value||m.showEmpty?(l(),a("div",{key:0,class:"quick-responses-panel cursor-pointer",onClick:C},[e("div",W,[e("div",G,[e("button",{type:"button",class:"toggle-button","aria-expanded":u.value,title:"Toggle quick responses panel","aria-label":"Toggle quick responses panel",onClick:d(C,["stop"])},[...s[3]||(s[3]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",class:"chevron-icon"},[e("path",{"fill-rule":"evenodd",d:"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 1 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"})],-1)])],8,H),s[4]||(s[4]=e("span",{class:"panel-title"},"Quick Responses",-1))]),u.value?(l(),a("div",U,[e("label",{class:"auto-submit-toggle",onClick:s[2]||(s[2]=d(()=>{},["stop"]))},[M(e("input",{"onUpdate:modelValue":s[0]||(s[0]=i=>v.value=i),type:"checkbox",onClick:s[1]||(s[1]=d(()=>{},["stop"]))},null,512),[[q,v.value]]),s[5]||(s[5]=e("span",null,"Auto-submit",-1))]),m.projectId?(l(),a("button",{key:0,type:"button",class:"settings-button",title:"Manage templates","aria-label":"Manage templates",onClick:d(S,["stop"])},[...s[6]||(s[6]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",class:"settings-icon"},[e("path",{"fill-rule":"evenodd",d:"M7.84 1.804A1 1 0 0 1 8.82 1h2.36a1 1 0 0 1 .98.804l.331 1.652a6.993 6.993 0 0 1 1.929 1.115l1.598-.54a1 1 0 0 1 1.186.447l1.18 2.044a1 1 0 0 1-.205 1.251l-1.267 1.113a7.047 7.047 0 0 1 0 2.228l1.267 1.113a1 1 0 0 1 .206 1.25l-1.18 2.045a1 1 0 0 1-1.187.447l-1.598-.54a6.993 6.993 0 0 1-1.929 1.115l-.33 1.652a1 1 0 0 1-.98.804H8.82a1 1 0 0 1-.98-.804l-.331-1.652a6.993 6.993 0 0 1-1.929-1.115l-1.598.54a1 1 0 0 1-1.186-.447l-1.18-2.044a1 1 0 0 1 .205-1.251l1.267-1.114a7.05 7.05 0 0 1 0-2.227L1.821 7.773a1 1 0 0 1-.206-1.25l1.18-2.045a1 1 0 0 1 1.187-.447l1.598.54A6.993 6.993 0 0 1 7.51 3.456l.33-1.652ZM10 13a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z","clip-rule":"evenodd"})],-1)])])):p("",!0)])):p("",!0)]),x.value&&u.value?(l(),a("div",J,[...s[7]||(s[7]=[e("span",{class:"loading-text"},"Loading...",-1)])])):!k.value&&u.value?(l(),a("div",X,[...s[8]||(s[8]=[e("span",{class:"empty-text"},"No quick response templates yet",-1)])])):p("",!0),u.value&&k.value&&!x.value?(l(),a("div",Y,[$.value.length>0?(l(),a("div",ee,[s[9]||(s[9]=e("span",{class:"section-label"},"Project",-1)),e("div",te,[(l(!0),a(B,null,D($.value,i=>(l(),a("button",{key:i.id,type:"button",class:"response-button project-response",title:i.prompt,onClick:d(z=>g(i),["stop"])},[e("span",ne,b(i.name),1)],8,se))),128))])])):p("",!0),w.value.length>0?(l(),a("div",le,[s[10]||(s[10]=e("span",{class:"section-label"},"Global",-1)),e("div",ae,[(l(!0),a(B,null,D(w.value,i=>(l(),a("button",{key:i.id,type:"button",class:"response-button global-response",title:i.prompt,onClick:d(z=>g(i),["stop"])},[e("span",ie,b(i.name),1)],8,oe))),128))])])):p("",!0)])):p("",!0)])):p("",!0)}}),me=T(ue,[["__scopeId","data-v-34a3db5e"]]);export{de as F,me as Q,pe as u};
@@ -0,0 +1 @@
1
+ import{_ as x,l as b,G as _,o as R,a as z,c as H,b as i,ab as y,n as k}from"./index-CvXApbVC.js";const w={class:"resizable-textarea-wrapper"},M=["value"],Y={__name:"ResizableTextarea",props:{modelValue:{type:String,default:""},minHeight:{type:Number,default:80},maxHeight:{type:Number,default:null}},emits:["update:modelValue","input","focus","blur"],setup(d,{expose:h,emit:f}){const s=d,o=f;function p(e){o("update:modelValue",e.target.value),o("input",e)}function v(e){o("focus",e)}function m(e){o("blur",e)}const t=k(null);let l=!1;b(()=>s.modelValue,e=>{t.value&&t.value.value!==e&&(t.value.value=e)});function E(e){if(!t.value)return;l=!0;const n=e.type.startsWith("touch")?e.touches[0].clientY:e.clientY,g=t.value.offsetHeight,r=c=>{if(!l)return;const L=c.type.startsWith("touch")?c.touches[0].clientY:c.clientY;let u=g+(L-n);u=Math.max(s.minHeight,u),s.maxHeight&&(u=Math.min(s.maxHeight,u)),t.value.style.height=`${u}px`},a=()=>{l=!1,document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",a),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",a),document.removeEventListener("touchcancel",a)};document.addEventListener("mousemove",r),document.addEventListener("mouseup",a),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",a),document.addEventListener("touchcancel",a)}return h({get value(){var e;return((e=t.value)==null?void 0:e.value)||""},set value(e){t.value&&(t.value.value=e)},focus(){var e;(e=t.value)==null||e.focus()},blur(){var e;(e=t.value)==null||e.blur()},select(){var e;(e=t.value)==null||e.select()},get selectionStart(){var e;return((e=t.value)==null?void 0:e.selectionStart)||0},set selectionStart(e){t.value&&(t.value.selectionStart=e)},get selectionEnd(){var e;return((e=t.value)==null?void 0:e.selectionEnd)||0},set selectionEnd(e){t.value&&(t.value.selectionEnd=e)},dispatchEvent(e){var n;return(n=t.value)==null?void 0:n.dispatchEvent(e)}}),_(()=>{var e,n;l=!1,(e=t.value)==null||e.removeEventListener("focus",v),(n=t.value)==null||n.removeEventListener("blur",m)}),R(()=>{var e,n;(e=t.value)==null||e.addEventListener("focus",v),(n=t.value)==null||n.addEventListener("blur",m)}),(e,n)=>(z(),H("div",w,[i("textarea",y({ref_key:"textareaRef",ref:t},e.$attrs,{value:d.modelValue,onInput:p}),null,16,M),i("div",{class:"resize-handle","aria-hidden":"true",onMousedown:E},[...n[0]||(n[0]=[i("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none"},[i("path",{d:"M14 10L10 14M14 6L6 14",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"})],-1)])],32)]))}},S=x(Y,[["__scopeId","data-v-c4cb4147"]]);export{S as R};
@@ -0,0 +1 @@
1
+ .resizable-textarea-wrapper[data-v-c4cb4147]{position:relative;display:flex;flex-direction:column}.resizable-textarea-wrapper textarea[data-v-c4cb4147]{resize:none;padding-bottom:24px;width:100%;box-sizing:border-box}.resize-handle[data-v-c4cb4147]{position:absolute;bottom:4px;right:4px;width:24px;height:24px;cursor:ns-resize;display:flex;align-items:center;justify-content:center;color:var(--color-text-soft, #6b7280);opacity:.5;transition:opacity .15s;user-select:none;-webkit-user-select:none;border-radius:4px}.resize-handle[data-v-c4cb4147]:hover,.resize-handle[data-v-c4cb4147]:active{opacity:1;background:#ffffff0d}@media (pointer: coarse){.resize-handle[data-v-c4cb4147]{display:none}}
@@ -1 +1 @@
1
- import{_ as j,o as H,a as e,c as o,b as t,t as b,i as c,j as k,n as E,u as q,e as z,z as y,g as W,d as U,w as J,f as K,x as C,F as D,r as G,J as R}from"./index-C2QFVD7d.js";import{u as Q}from"./sessions-Nq5VafSf.js";import{u as X}from"./commandButtons-CoU3G4zK.js";import{u as Y,P as Z,S as _,B as ss,g as ts,f as es,b as ns}from"./SessionLogStream-5NfVr9pF.js";import{a as os}from"./ApiClient-DfbJwzpz.js";const as={key:0,class:"session-summary"},is={class:"summary-text"},rs={class:"summary-meta"},ls={key:0,class:"summary-files"},us={key:1,class:"session-summary session-summary-loading"},ds={key:2,class:"session-summary session-summary-error"},cs={__name:"SessionCardSummary",props:{sessionId:{type:String,required:!0},summary:{type:Object,default:null},summaryLoading:{type:Boolean,default:!1},summaryError:{type:Boolean,default:!1}},emits:["retrySummary"],setup(s){const g=s,m=E(0);return H(async()=>{var f,r;try{const l=await os.getSessionFilesCount(g.sessionId);m.value=l.count||0}catch(l){console.warn("Failed to fetch files count:",l),(r=(f=g.summary)==null?void 0:f.filesModified)!=null&&r.length&&(m.value=g.summary.filesModified.length)}}),(f,r)=>s.summary?(e(),o("div",as,[t("p",is,b(s.summary.shortSummary),1),t("div",rs,[m.value>0?(e(),o("span",ls,b(m.value)+" "+b(m.value===1?"file":"files")+" modified ",1)):c("",!0)])])):s.summaryLoading?(e(),o("div",us,[...r[1]||(r[1]=[t("span",{class:"loading-spinner-small"},null,-1),t("span",null,"Loading summary...",-1)])])):s.summaryError?(e(),o("div",ds,[r[2]||(r[2]=t("span",{class:"error-icon"},"!",-1)),r[3]||(r[3]=t("span",null,"Summary unavailable",-1)),t("button",{class:"retry-btn",onClick:r[0]||(r[0]=k(l=>f.$emit("retrySummary"),["prevent"]))}," Retry ")])):c("",!0)}},ms=j(cs,[["__scopeId","data-v-a9b445b6"]]);function hs(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}const vs={class:"session-header-actions"},ys=["title"],fs={key:0,class:"archive-actions"},ws=["title"],gs={key:0,xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},ks={key:1,xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},bs={__name:"SessionCardHeaderActions",props:{dateToShow:{type:String,default:null},isChild:{type:Boolean,default:!1},isOnBoard:{type:Boolean,default:!1},kanbanEnabled:{type:Boolean,default:!0},showArchive:{type:Boolean,default:!1},showUnarchive:{type:Boolean,default:!1},sessionStatus:{type:String,default:""},starred:{type:Boolean,default:!1}},emits:["archive","unarchive","star","addToBoard"],setup(s,{emit:g}){const m=s,f=g,r=y(()=>m.sessionStatus!=="running"&&m.sessionStatus!=="starting"),l=()=>{f("archive")},u=()=>{confirm("Restore this session to active?")&&f("unarchive")};return(S,i)=>(e(),o("div",vs,[t("div",{class:"session-date",title:s.dateToShow?"Last activity":"No activity yet"},b(s.dateToShow?q(hs)(s.dateToShow):"—"),9,ys),s.isChild?c("",!0):(e(),o("div",fs,[s.kanbanEnabled&&!s.isOnBoard?(e(),o("button",{key:0,class:"add-to-board-btn",title:"Add to kanban board",onClick:i[0]||(i[0]=k(B=>S.$emit("addToBoard"),["stop","prevent"]))},[...i[2]||(i[2]=[t("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[t("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",ry:"2"}),t("line",{x1:"9",y1:"3",x2:"9",y2:"21"}),t("line",{x1:"15",y1:"3",x2:"15",y2:"21"})],-1)])])):c("",!0),s.showArchive&&r.value?(e(),o("button",{key:1,class:"archive-btn",title:"Archive session",onClick:k(l,["stop","prevent"])},[...i[3]||(i[3]=[t("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[t("rect",{x:"2",y:"4",width:"20",height:"5",rx:"1",ry:"1"}),t("path",{d:"M4 9v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9"}),t("path",{d:"M10 13h4"})],-1)])])):c("",!0),s.showUnarchive?(e(),o("button",{key:2,class:"archive-btn",title:"Unarchive session",onClick:k(u,["stop","prevent"])},[...i[4]||(i[4]=[z('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-07b0375c><rect x="2" y="4" width="20" height="5" rx="1" ry="1" data-v-07b0375c></rect><path d="M4 9v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9" data-v-07b0375c></path><path d="M12 11v6" data-v-07b0375c></path><path d="M9 14l3-3 3 3" data-v-07b0375c></path></svg>',1)])])):c("",!0),t("button",{class:"star-btn star-btn-mobile",title:s.starred?"Unstar session":"Star session",onClick:i[1]||(i[1]=k(B=>S.$emit("star"),["stop","prevent"]))},[s.starred?(e(),o("svg",gs,[...i[5]||(i[5]=[t("polygon",{points:"12 2 15.09 10.26 24 10.5 17.18 16.34 19.34 24.5 12 18.92 4.66 24.5 6.82 16.34 0 10.5 8.91 10.26 12 2"},null,-1)])])):(e(),o("svg",ks,[...i[6]||(i[6]=[t("polygon",{points:"12 2 15.09 10.26 24 10.5 17.18 16.34 19.34 24.5 12 18.92 4.66 24.5 6.82 16.34 0 10.5 8.91 10.26 12 2"},null,-1)])]))],8,ws)]))]))}},Ss=j(bs,[["__scopeId","data-v-07b0375c"]]),ps={class:"workflow-card-wrapper"},Cs={class:"session-header-row"},Bs=["title"],xs={key:0,xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},$s={key:1,xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},js={class:"session-info"},As={class:"session-name"},Is={class:"session-meta"},Ts={key:0,class:"status-badge status-running"},Ms={key:1,class:"status-badge status-scheduled"},Ls=["title"],Us=["title","aria-label","onClick","innerHTML"],Ds={key:0,class:"session-project"},Rs={class:"project-name"},Es={__name:"SessionCard",props:{session:{type:Object,required:!0},showSummary:{type:Boolean,default:!1},showProject:{type:Boolean,default:!1},summary:{type:Object,default:null},summaryLoading:{type:Boolean,default:!1},summaryError:{type:Boolean,default:!1},isChild:{type:Boolean,default:!1},showArchive:{type:Boolean,default:!1},showUnarchive:{type:Boolean,default:!1},prUrl:{type:String,default:null},prSummary:{type:Object,default:null},kanbanEnabled:{type:Boolean,default:!0}},emits:["retrySummary","archive","unarchive","addToBoard"],setup(s,{emit:g}){const m=Q(),f=X(),r=Y(),l=E(null),u=s,S=g,i=y(()=>r.isSessionOnBoard(u.session.id)),B=()=>{S("addToBoard",u.session)},O=y(()=>u.session.lastActivityAt??null);function x(){return m.getWorkflowSessions(u.session.id)}const A=y(()=>{const d=x(),n=["running","starting"];let h=0,a=0;for(const w of d)n.includes(w.status)&&h++,w.status==="scheduled"&&a++;return{runningCount:h,scheduledCount:a,totalCount:d.length,effectiveStatus:u.session.status}}),I=y(()=>{const d=["running","starting"];return x().filter(n=>d.includes(n.status)).map(n=>n.id)}),N=y(()=>I.value.length>0),p=y(()=>{const d=Date.now();if(u.session.status==="scheduled"&&u.session.scheduledAt)return u.session.scheduledAt;const n=x();let h=null;for(const a of n)if(a.id!==u.session.id&&a.status==="scheduled"&&a.scheduledAt){const w=new Date(a.scheduledAt).getTime();w>=d&&(h===null||w<h)&&(h=w)}return h}),T=y(()=>p.value?es(new Date(p.value),{addSuffix:!0}):null),V=y(()=>p.value?ns(new Date(p.value),"MMM d, h:mm a"):null),F=y(()=>{const d=u.session.projectId;if(!d)return[];m.commandRunVersion;const n=f.getButtonsByProjectId(d),h=Object.fromEntries(n.map(v=>[v.id,v])),a=u.session.id,$=m.sessions.find(v=>v.id===a);return(($==null?void 0:$.latestCommandRuns)||u.session.latestCommandRuns||[]).filter(v=>{var L;return(L=h[v.buttonId])==null?void 0:L.showOnList}).map(v=>({buttonId:v.buttonId,label:h[v.buttonId].label,command:h[v.buttonId].command,status:v.status,latestRun:v}))}),P=d=>ts(d),M=()=>{m.toggleSessionStar(u.session.id)};return(d,n)=>{const h=W("router-link");return e(),o(D,null,[t("div",ps,[U(h,{to:`/sessions/${s.session.id}`,class:R(["session-card card",{"is-child":s.isChild}])},{default:J(()=>[t("div",Cs,[s.isChild?c("",!0):(e(),o("button",{key:0,class:"star-btn",title:s.session.starred?"Unstar session":"Star session",onClick:k(M,["stop","prevent"])},[s.session.starred?(e(),o("svg",xs,[...n[4]||(n[4]=[t("polygon",{points:"12 2 15.09 10.26 24 10.5 17.18 16.34 19.34 24.5 12 18.92 4.66 24.5 6.82 16.34 0 10.5 8.91 10.26 12 2"},null,-1)])])):(e(),o("svg",$s,[...n[5]||(n[5]=[t("polygon",{points:"12 2 15.09 10.26 24 10.5 17.18 16.34 19.34 24.5 12 18.92 4.66 24.5 6.82 16.34 0 10.5 8.91 10.26 12 2"},null,-1)])]))],8,Bs)),t("div",js,[t("h3",As,b(s.session.name),1),t("p",Is,[A.value.runningCount>0?(e(),o("span",Ts," ● running ")):c("",!0),A.value.scheduledCount>0?(e(),o("span",Ms,[...n[6]||(n[6]=[t("svg",{class:"schedule-icon-inline",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[t("circle",{cx:"12",cy:"12",r:"10"}),t("polyline",{points:"12 6 12 12 16 14"})],-1),K(" scheduled ",-1)])])):c("",!0),T.value?(e(),o("span",{key:2,class:"scheduled-time",title:V.value},b(T.value),9,Ls)):c("",!0),s.prUrl&&!s.isChild?(e(),C(Z,{key:3,"pr-url":s.prUrl,summary:s.prSummary,"data-testid":"session-card-pr-indicators"},null,8,["pr-url","summary"])):c("",!0),(e(!0),o(D,null,G(F.value,a=>(e(),o("span",{key:a.buttonId,class:R(["button-status-indicator",`button-status-${a.status}`]),title:a.label,"aria-label":a.status,onClick:k(w=>l.value=a,["stop","prevent"]),innerHTML:P(a.status)},null,10,Us))),128))]),s.showProject&&s.session.projectName?(e(),o("p",Ds,[t("span",Rs,b(s.session.projectName),1)])):c("",!0)]),U(Ss,{"date-to-show":O.value,"is-child":s.isChild,"is-on-board":i.value,"kanban-enabled":s.kanbanEnabled,"show-archive":s.showArchive,"show-unarchive":s.showUnarchive,"session-status":s.session.status,starred:!!s.session.starred,onArchive:n[0]||(n[0]=a=>d.$emit("archive",s.session.id)),onUnarchive:n[1]||(n[1]=a=>d.$emit("unarchive",s.session.id)),onStar:M,onAddToBoard:B},null,8,["date-to-show","is-child","is-on-board","kanban-enabled","show-archive","show-unarchive","session-status","starred"])]),s.showSummary?(e(),C(ms,{key:0,"session-id":s.session.id,summary:s.summary,"summary-loading":s.summaryLoading,"summary-error":s.summaryError,onRetrySummary:n[2]||(n[2]=a=>d.$emit("retrySummary",s.session.id))},null,8,["session-id","summary","summary-loading","summary-error"])):c("",!0),N.value?(e(),C(_,{key:1,"session-ids":I.value,"data-testid":"session-log-stream"},null,8,["session-ids"])):c("",!0)]),_:1},8,["to","class"])]),l.value?(e(),C(ss,{key:0,button:{id:l.value.buttonId,label:l.value.label,command:l.value.command},"latest-run":l.value.latestRun,"is-open":!!l.value,"session-id":s.session.id,onClose:n[3]||(n[3]=a=>l.value=null)},null,8,["button","latest-run","is-open","session-id"])):c("",!0)],64)}}},qs=j(Es,[["__scopeId","data-v-eef8bbf3"]]);export{qs as S};
1
+ import{_ as j,o as H,a as e,c as o,b as t,t as b,i as c,j as k,n as E,u as q,e as z,z as y,g as W,d as U,w as J,f as K,x as C,F as D,r as G,J as R}from"./index-CvXApbVC.js";import{u as Q}from"./sessions-DETEyjPI.js";import{u as X}from"./commandButtons-DejH0rVN.js";import{u as Y,P as Z,S as _,B as ss,g as ts,f as es,b as ns}from"./SessionLogStream-BvXUNNBZ.js";import{a as os}from"./ApiClient-DfbJwzpz.js";const as={key:0,class:"session-summary"},is={class:"summary-text"},rs={class:"summary-meta"},ls={key:0,class:"summary-files"},us={key:1,class:"session-summary session-summary-loading"},ds={key:2,class:"session-summary session-summary-error"},cs={__name:"SessionCardSummary",props:{sessionId:{type:String,required:!0},summary:{type:Object,default:null},summaryLoading:{type:Boolean,default:!1},summaryError:{type:Boolean,default:!1}},emits:["retrySummary"],setup(s){const g=s,m=E(0);return H(async()=>{var f,r;try{const l=await os.getSessionFilesCount(g.sessionId);m.value=l.count||0}catch(l){console.warn("Failed to fetch files count:",l),(r=(f=g.summary)==null?void 0:f.filesModified)!=null&&r.length&&(m.value=g.summary.filesModified.length)}}),(f,r)=>s.summary?(e(),o("div",as,[t("p",is,b(s.summary.shortSummary),1),t("div",rs,[m.value>0?(e(),o("span",ls,b(m.value)+" "+b(m.value===1?"file":"files")+" modified ",1)):c("",!0)])])):s.summaryLoading?(e(),o("div",us,[...r[1]||(r[1]=[t("span",{class:"loading-spinner-small"},null,-1),t("span",null,"Loading summary...",-1)])])):s.summaryError?(e(),o("div",ds,[r[2]||(r[2]=t("span",{class:"error-icon"},"!",-1)),r[3]||(r[3]=t("span",null,"Summary unavailable",-1)),t("button",{class:"retry-btn",onClick:r[0]||(r[0]=k(l=>f.$emit("retrySummary"),["prevent"]))}," Retry ")])):c("",!0)}},ms=j(cs,[["__scopeId","data-v-a9b445b6"]]);function hs(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}const vs={class:"session-header-actions"},ys=["title"],fs={key:0,class:"archive-actions"},ws=["title"],gs={key:0,xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},ks={key:1,xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},bs={__name:"SessionCardHeaderActions",props:{dateToShow:{type:String,default:null},isChild:{type:Boolean,default:!1},isOnBoard:{type:Boolean,default:!1},kanbanEnabled:{type:Boolean,default:!0},showArchive:{type:Boolean,default:!1},showUnarchive:{type:Boolean,default:!1},sessionStatus:{type:String,default:""},starred:{type:Boolean,default:!1}},emits:["archive","unarchive","star","addToBoard"],setup(s,{emit:g}){const m=s,f=g,r=y(()=>m.sessionStatus!=="running"&&m.sessionStatus!=="starting"),l=()=>{f("archive")},u=()=>{confirm("Restore this session to active?")&&f("unarchive")};return(S,i)=>(e(),o("div",vs,[t("div",{class:"session-date",title:s.dateToShow?"Last activity":"No activity yet"},b(s.dateToShow?q(hs)(s.dateToShow):"—"),9,ys),s.isChild?c("",!0):(e(),o("div",fs,[s.kanbanEnabled&&!s.isOnBoard?(e(),o("button",{key:0,class:"add-to-board-btn",title:"Add to kanban board",onClick:i[0]||(i[0]=k(B=>S.$emit("addToBoard"),["stop","prevent"]))},[...i[2]||(i[2]=[t("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[t("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",ry:"2"}),t("line",{x1:"9",y1:"3",x2:"9",y2:"21"}),t("line",{x1:"15",y1:"3",x2:"15",y2:"21"})],-1)])])):c("",!0),s.showArchive&&r.value?(e(),o("button",{key:1,class:"archive-btn",title:"Archive session",onClick:k(l,["stop","prevent"])},[...i[3]||(i[3]=[t("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[t("rect",{x:"2",y:"4",width:"20",height:"5",rx:"1",ry:"1"}),t("path",{d:"M4 9v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9"}),t("path",{d:"M10 13h4"})],-1)])])):c("",!0),s.showUnarchive?(e(),o("button",{key:2,class:"archive-btn",title:"Unarchive session",onClick:k(u,["stop","prevent"])},[...i[4]||(i[4]=[z('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-07b0375c><rect x="2" y="4" width="20" height="5" rx="1" ry="1" data-v-07b0375c></rect><path d="M4 9v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9" data-v-07b0375c></path><path d="M12 11v6" data-v-07b0375c></path><path d="M9 14l3-3 3 3" data-v-07b0375c></path></svg>',1)])])):c("",!0),t("button",{class:"star-btn star-btn-mobile",title:s.starred?"Unstar session":"Star session",onClick:i[1]||(i[1]=k(B=>S.$emit("star"),["stop","prevent"]))},[s.starred?(e(),o("svg",gs,[...i[5]||(i[5]=[t("polygon",{points:"12 2 15.09 10.26 24 10.5 17.18 16.34 19.34 24.5 12 18.92 4.66 24.5 6.82 16.34 0 10.5 8.91 10.26 12 2"},null,-1)])])):(e(),o("svg",ks,[...i[6]||(i[6]=[t("polygon",{points:"12 2 15.09 10.26 24 10.5 17.18 16.34 19.34 24.5 12 18.92 4.66 24.5 6.82 16.34 0 10.5 8.91 10.26 12 2"},null,-1)])]))],8,ws)]))]))}},Ss=j(bs,[["__scopeId","data-v-07b0375c"]]),ps={class:"workflow-card-wrapper"},Cs={class:"session-header-row"},Bs=["title"],xs={key:0,xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},$s={key:1,xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},js={class:"session-info"},As={class:"session-name"},Is={class:"session-meta"},Ts={key:0,class:"status-badge status-running"},Ms={key:1,class:"status-badge status-scheduled"},Ls=["title"],Us=["title","aria-label","onClick","innerHTML"],Ds={key:0,class:"session-project"},Rs={class:"project-name"},Es={__name:"SessionCard",props:{session:{type:Object,required:!0},showSummary:{type:Boolean,default:!1},showProject:{type:Boolean,default:!1},summary:{type:Object,default:null},summaryLoading:{type:Boolean,default:!1},summaryError:{type:Boolean,default:!1},isChild:{type:Boolean,default:!1},showArchive:{type:Boolean,default:!1},showUnarchive:{type:Boolean,default:!1},prUrl:{type:String,default:null},prSummary:{type:Object,default:null},kanbanEnabled:{type:Boolean,default:!0}},emits:["retrySummary","archive","unarchive","addToBoard"],setup(s,{emit:g}){const m=Q(),f=X(),r=Y(),l=E(null),u=s,S=g,i=y(()=>r.isSessionOnBoard(u.session.id)),B=()=>{S("addToBoard",u.session)},O=y(()=>u.session.lastActivityAt??null);function x(){return m.getWorkflowSessions(u.session.id)}const A=y(()=>{const d=x(),n=["running","starting"];let h=0,a=0;for(const w of d)n.includes(w.status)&&h++,w.status==="scheduled"&&a++;return{runningCount:h,scheduledCount:a,totalCount:d.length,effectiveStatus:u.session.status}}),I=y(()=>{const d=["running","starting"];return x().filter(n=>d.includes(n.status)).map(n=>n.id)}),N=y(()=>I.value.length>0),p=y(()=>{const d=Date.now();if(u.session.status==="scheduled"&&u.session.scheduledAt)return u.session.scheduledAt;const n=x();let h=null;for(const a of n)if(a.id!==u.session.id&&a.status==="scheduled"&&a.scheduledAt){const w=new Date(a.scheduledAt).getTime();w>=d&&(h===null||w<h)&&(h=w)}return h}),T=y(()=>p.value?es(new Date(p.value),{addSuffix:!0}):null),V=y(()=>p.value?ns(new Date(p.value),"MMM d, h:mm a"):null),F=y(()=>{const d=u.session.projectId;if(!d)return[];m.commandRunVersion;const n=f.getButtonsByProjectId(d),h=Object.fromEntries(n.map(v=>[v.id,v])),a=u.session.id,$=m.sessions.find(v=>v.id===a);return(($==null?void 0:$.latestCommandRuns)||u.session.latestCommandRuns||[]).filter(v=>{var L;return(L=h[v.buttonId])==null?void 0:L.showOnList}).map(v=>({buttonId:v.buttonId,label:h[v.buttonId].label,command:h[v.buttonId].command,status:v.status,latestRun:v}))}),P=d=>ts(d),M=()=>{m.toggleSessionStar(u.session.id)};return(d,n)=>{const h=W("router-link");return e(),o(D,null,[t("div",ps,[U(h,{to:`/sessions/${s.session.id}`,class:R(["session-card card",{"is-child":s.isChild}])},{default:J(()=>[t("div",Cs,[s.isChild?c("",!0):(e(),o("button",{key:0,class:"star-btn",title:s.session.starred?"Unstar session":"Star session",onClick:k(M,["stop","prevent"])},[s.session.starred?(e(),o("svg",xs,[...n[4]||(n[4]=[t("polygon",{points:"12 2 15.09 10.26 24 10.5 17.18 16.34 19.34 24.5 12 18.92 4.66 24.5 6.82 16.34 0 10.5 8.91 10.26 12 2"},null,-1)])])):(e(),o("svg",$s,[...n[5]||(n[5]=[t("polygon",{points:"12 2 15.09 10.26 24 10.5 17.18 16.34 19.34 24.5 12 18.92 4.66 24.5 6.82 16.34 0 10.5 8.91 10.26 12 2"},null,-1)])]))],8,Bs)),t("div",js,[t("h3",As,b(s.session.name),1),t("p",Is,[A.value.runningCount>0?(e(),o("span",Ts," ● running ")):c("",!0),A.value.scheduledCount>0?(e(),o("span",Ms,[...n[6]||(n[6]=[t("svg",{class:"schedule-icon-inline",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[t("circle",{cx:"12",cy:"12",r:"10"}),t("polyline",{points:"12 6 12 12 16 14"})],-1),K(" scheduled ",-1)])])):c("",!0),T.value?(e(),o("span",{key:2,class:"scheduled-time",title:V.value},b(T.value),9,Ls)):c("",!0),s.prUrl&&!s.isChild?(e(),C(Z,{key:3,"pr-url":s.prUrl,summary:s.prSummary,"data-testid":"session-card-pr-indicators"},null,8,["pr-url","summary"])):c("",!0),(e(!0),o(D,null,G(F.value,a=>(e(),o("span",{key:a.buttonId,class:R(["button-status-indicator",`button-status-${a.status}`]),title:a.label,"aria-label":a.status,onClick:k(w=>l.value=a,["stop","prevent"]),innerHTML:P(a.status)},null,10,Us))),128))]),s.showProject&&s.session.projectName?(e(),o("p",Ds,[t("span",Rs,b(s.session.projectName),1)])):c("",!0)]),U(Ss,{"date-to-show":O.value,"is-child":s.isChild,"is-on-board":i.value,"kanban-enabled":s.kanbanEnabled,"show-archive":s.showArchive,"show-unarchive":s.showUnarchive,"session-status":s.session.status,starred:!!s.session.starred,onArchive:n[0]||(n[0]=a=>d.$emit("archive",s.session.id)),onUnarchive:n[1]||(n[1]=a=>d.$emit("unarchive",s.session.id)),onStar:M,onAddToBoard:B},null,8,["date-to-show","is-child","is-on-board","kanban-enabled","show-archive","show-unarchive","session-status","starred"])]),s.showSummary?(e(),C(ms,{key:0,"session-id":s.session.id,summary:s.summary,"summary-loading":s.summaryLoading,"summary-error":s.summaryError,onRetrySummary:n[2]||(n[2]=a=>d.$emit("retrySummary",s.session.id))},null,8,["session-id","summary","summary-loading","summary-error"])):c("",!0),N.value?(e(),C(_,{key:1,"session-ids":I.value,"data-testid":"session-log-stream"},null,8,["session-ids"])):c("",!0)]),_:1},8,["to","class"])]),l.value?(e(),C(ss,{key:0,button:{id:l.value.buttonId,label:l.value.label,command:l.value.command},"latest-run":l.value.latestRun,"is-open":!!l.value,"session-id":s.session.id,onClose:n[3]||(n[3]=a=>l.value=null)},null,8,["button","latest-run","is-open","session-id"])):c("",!0)],64)}}},qs=j(Es,[["__scopeId","data-v-eef8bbf3"]]);export{qs as S};