tarsk 0.5.73 → 0.5.74

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 (110) hide show
  1. package/dist/index.js +145120 -178397
  2. package/dist/public/assets/{Combination-lwI_j-mU.js → Combination-BdvBzSm4.js} +1 -1
  3. package/dist/public/assets/{account-view-DKQdyGPK.js → account-view-c-UG0JKH.js} +1 -1
  4. package/dist/public/assets/{alert-dialog-Cb1PEgra.js → alert-dialog-DAHkynVZ.js} +1 -1
  5. package/dist/public/assets/api-D1GxdEEp.js +2 -0
  6. package/dist/public/assets/{async-error-boundary-J8P6NVvc.js → async-error-boundary-DNJqC4BV.js} +1 -1
  7. package/dist/public/assets/{async-loading-fallback-B_JNgWJR.js → async-loading-fallback-D2X0o4Qa.js} +1 -1
  8. package/dist/public/assets/browser-tab-BKQJKTg8.js +12 -0
  9. package/dist/public/assets/{button-DeNw35VZ.js → button-B6HDsfd5.js} +1 -1
  10. package/dist/public/assets/{card-B4eI0NI-.js → card-DZGd45nw.js} +1 -1
  11. package/dist/public/assets/chat-dock-context-8_5G30KG.js +1 -0
  12. package/dist/public/assets/{commit-dialog-DDLaQVzY.js → commit-dialog-OQFa4W6i.js} +1 -1
  13. package/dist/public/assets/{commit-error-dialog-Cp0Aic7I.js → commit-error-dialog-BFByxoUG.js} +1 -1
  14. package/dist/public/assets/{commit-method-fields-CD3PTIox.js → commit-method-fields-BihSf23f.js} +1 -1
  15. package/dist/public/assets/context-menu-e5jeH0Jl.js +1 -0
  16. package/dist/public/assets/{conversation-history-view-JymxZFJ2.js → conversation-history-view-BUlO9oJ6.js} +1 -1
  17. package/dist/public/assets/create-project-dialog-CY5wIGQV.js +2 -0
  18. package/dist/public/assets/{create-project-workspace-BcIx6FNf.js → create-project-workspace-ClILToZd.js} +1 -1
  19. package/dist/public/assets/{create-repo-dialog-DcvSMy3g.js → create-repo-dialog-CKUQoOaX.js} +1 -1
  20. package/dist/public/assets/{delete-confirm-dialog-C9NASyh6.js → delete-confirm-dialog-3DX1u0Dg.js} +1 -1
  21. package/dist/public/assets/{dialog-Do98zzAW.js → dialog--0foS3aw.js} +1 -1
  22. package/dist/public/assets/{diff-view-ePD0sdsW.js → diff-view-DLPu21IR.js} +2 -2
  23. package/dist/public/assets/{dist-CWnEmdyL.js → dist-Bxyh1Ml_.js} +1 -1
  24. package/dist/public/assets/{dist-BZvmHCxP.js → dist-CFXDhuA_.js} +1 -1
  25. package/dist/public/assets/{dist-DIjomljy.js → dist-CNOCRPxn.js} +1 -1
  26. package/dist/public/assets/{dist-DiMgghKn.js → dist-Cda_ffeR.js} +1 -1
  27. package/dist/public/assets/{dist-CWq9XRXF.js → dist-CkQILg8A.js} +1 -1
  28. package/dist/public/assets/{dist-DjKXDRW7.js → dist-CqGsum35.js} +1 -1
  29. package/dist/public/assets/dist-DjiNKpTV.js +2 -0
  30. package/dist/public/assets/{dist-CjhvxqFU.js → dist-eMdiO0P3.js} +1 -1
  31. package/dist/public/assets/{dist-mdooLpmq.js → dist-rO95BjzU.js} +1 -1
  32. package/dist/public/assets/explorer-tab-view-nzl0M0Vm.js +2 -0
  33. package/dist/public/assets/explorer-tree-Bkb6dzmf.js +1 -0
  34. package/dist/public/assets/explorer-view-NcArt0_H.js +75 -0
  35. package/dist/public/assets/{git-history-dialog-DWhJ1-ba.js → git-history-dialog-rWkjoaR5.js} +1 -1
  36. package/dist/public/assets/index-BOB3ZUQs.js +3386 -0
  37. package/dist/public/assets/index-BdGMz8sL.css +1 -0
  38. package/dist/public/assets/{markdown-renderer-qLede1zH.js → markdown-renderer-BkKibNMs.js} +3 -3
  39. package/dist/public/assets/{mcp-server-card-zm-ss-7h.js → mcp-server-card-DFT7uyRh.js} +1 -1
  40. package/dist/public/assets/{merged-pr-dialog-Due9WdB4.js → merged-pr-dialog-BOrFaYk6.js} +1 -1
  41. package/dist/public/assets/model-list-controls-CpQjn6i7.js +1 -0
  42. package/dist/public/assets/onboarding-dialog-HJpyzVWa.js +1 -0
  43. package/dist/public/assets/{project-env-vars-view-N1Io1Pau.js → project-env-vars-view-C9VTTfTo.js} +1 -1
  44. package/dist/public/assets/project-model-aliases-view-DKRoV7Gc.js +1 -0
  45. package/dist/public/assets/{project-settings-view-BalZ6Fe1.js → project-settings-view-BDYqpibk.js} +1 -1
  46. package/dist/public/assets/{project-tools-view-OnCN0jKz.js → project-tools-view-9WUc4Yca.js} +1 -1
  47. package/dist/public/assets/providers-list-view-BgvIWP_0.js +1 -0
  48. package/dist/public/assets/pull-request-dialog-BM1dkFpK.js +1 -0
  49. package/dist/public/assets/{pull-with-changes-dialog-B9y2_lt_.js → pull-with-changes-dialog-Bjl_esir.js} +1 -1
  50. package/dist/public/assets/{push-before-pr-dialog-D3pMFe9A.js → push-before-pr-dialog-Cbc_zaI8.js} +1 -1
  51. package/dist/public/assets/{radio-group-CU59hGiA.js → radio-group-CMW5ku-w.js} +1 -1
  52. package/dist/public/assets/{scroll-area-nbNFO91g.js → scroll-area-BMQFeWmq.js} +1 -1
  53. package/dist/public/assets/settings-general-view-BaMVw6kD.js +1 -0
  54. package/dist/public/assets/{settings-instructions-view-GjQivhLy.js → settings-instructions-view-BRE87H2U.js} +1 -1
  55. package/dist/public/assets/{settings-list-DU82HNPX.js → settings-list-BpPbGcpS.js} +1 -1
  56. package/dist/public/assets/{settings-logs-view-DnQ_4O9b.js → settings-logs-view-Bbue8ZOn.js} +4 -4
  57. package/dist/public/assets/settings-mcp-servers-view-BiMCy8sH.js +5 -0
  58. package/dist/public/assets/{settings-models-view-CTjnBd74.js → settings-models-view-BkZtGcUP.js} +1 -1
  59. package/dist/public/assets/{settings-rules-view-DiTC-cBE.js → settings-rules-view-TK7LEC-0.js} +3 -3
  60. package/dist/public/assets/settings-skills-view-Bv9Kn55r.js +3 -0
  61. package/dist/public/assets/{settings-slack-view-CiuJZ-9i.js → settings-slack-view-Dy2bFJqU.js} +1 -1
  62. package/dist/public/assets/{settings-slash-commands-view-CnXff39A.js → settings-slash-commands-view-DiR1IyMF.js} +1 -1
  63. package/dist/public/assets/{settings-statistics-view-D8SvAGE_.js → settings-statistics-view-DX1UVeCJ.js} +1 -1
  64. package/dist/public/assets/settings-storage-view-D8tHP8XT.js +1 -0
  65. package/dist/public/assets/{settings-subagents-view-B4HugfzU.js → settings-subagents-view-Bz7jBhbB.js} +2 -2
  66. package/dist/public/assets/{settings-system-prompt-view-DNQKxcFg.js → settings-system-prompt-view-VHGAqfQk.js} +1 -1
  67. package/dist/public/assets/settings-view-QBOhYAyv.js +2 -0
  68. package/dist/public/assets/store-CHF6tOp2.js +9 -0
  69. package/dist/public/assets/{switch-pIBaqatj.js → switch-P5m18oUl.js} +1 -1
  70. package/dist/public/assets/{table-B3fLagUj.js → table-MUx4ZxvS.js} +1 -1
  71. package/dist/public/assets/tasks-view-l00Nc2fV.js +2 -0
  72. package/dist/public/assets/terminal-panel-DHDoOXAH.js +38 -0
  73. package/dist/public/assets/{toggle-group-5tREtjoW.js → toggle-group-DMR7z3pz.js} +1 -1
  74. package/dist/public/assets/{tooltip-B6ziVyTv.js → tooltip-BtJG5fZl.js} +1 -1
  75. package/dist/public/assets/{use-active-dock-panel-instance-BSch6-Fx.js → use-active-dock-panel-instance-cO_DR87G.js} +1 -1
  76. package/dist/public/assets/use-installed-ai-files-CJr_PVcY.js +1 -0
  77. package/dist/public/assets/{use-open-chat-dock-panel-Cr1bQYOH.js → use-open-chat-dock-panel-B31lwcQF.js} +1 -1
  78. package/dist/public/assets/{web-BKpP7kYB.js → web-C7jr0n2X.js} +1 -1
  79. package/dist/public/assets/{web-DaiDQ9WA.js → web-D0nlJHDu.js} +1 -1
  80. package/dist/public/assets/{web-W5CC9Cq4.js → web-DPW3m0cL.js} +1 -1
  81. package/dist/public/assets/{web-CtDn8Ggo.js → web-jJ1krOD-.js} +1 -1
  82. package/dist/public/index.html +24 -24
  83. package/dist/recommended-models.txt +1 -1
  84. package/package.json +4 -3
  85. package/dist/public/assets/api-BMo_Lz8f.js +0 -2
  86. package/dist/public/assets/browser-tab-D_GXZ93G.js +0 -12
  87. package/dist/public/assets/chat-dock-context-BXoAs38w.js +0 -1
  88. package/dist/public/assets/context-menu-Dx5Jy21w.js +0 -1
  89. package/dist/public/assets/create-project-dialog-qbwqSqGU.js +0 -6
  90. package/dist/public/assets/dist-BWuYHVi8.js +0 -2
  91. package/dist/public/assets/explorer-tab-view-D6hsKrXY.js +0 -2
  92. package/dist/public/assets/explorer-tree-BG8ShRwn.js +0 -1
  93. package/dist/public/assets/explorer-view-BZcNnLd9.js +0 -75
  94. package/dist/public/assets/index-DhOeeft5.css +0 -1
  95. package/dist/public/assets/index-DjaVbFDB.js +0 -3386
  96. package/dist/public/assets/is-macos-client-BIb4ZSEa.js +0 -1
  97. package/dist/public/assets/model-list-controls-D86_87E4.js +0 -1
  98. package/dist/public/assets/onboarding-dialog-DlqbPvG0.js +0 -1
  99. package/dist/public/assets/project-model-aliases-view-B4FEze4g.js +0 -1
  100. package/dist/public/assets/providers-list-view-DXvcxXDM.js +0 -1
  101. package/dist/public/assets/pull-request-dialog-BeeTNIN_.js +0 -1
  102. package/dist/public/assets/settings-general-view-CAYlYs3J.js +0 -1
  103. package/dist/public/assets/settings-mcp-servers-view-C6OZHR3K.js +0 -5
  104. package/dist/public/assets/settings-skills-view-DHoSorOw.js +0 -3
  105. package/dist/public/assets/settings-storage-view-CUsa7Lwv.js +0 -1
  106. package/dist/public/assets/settings-view-DoZmXguf.js +0 -2
  107. package/dist/public/assets/store-BaMSfYoJ.js +0 -9
  108. package/dist/public/assets/tasks-view-BaMd8ZM0.js +0 -2
  109. package/dist/public/assets/terminal-panel-BjD6z-3y.js +0 -38
  110. package/dist/public/assets/use-installed-ai-files-E4BAFIPG.js +0 -1
@@ -1,5 +1,5 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,o as n,t as r}from"./react-vendor-Ee0-5T4I.js";import{l as i}from"./chunk-QFMPRPBF-COsSkB7x.js";import{C as a,b as o,ot as s,y as c}from"./dist-BWuYHVi8.js";import{An as l,Et as u,yn as d}from"./dist-DIjomljy.js";import{t as f}from"./utils-CT-Dw22R.js";import{t as p}from"./button-DeNw35VZ.js";import{Cr as m,d as h,kn as g}from"./api-BMo_Lz8f.js";import{i as _,n as v,r as y,t as b}from"./tooltip-B6ziVyTv.js";import{r as x}from"./scroll-area-nbNFO91g.js";import{t as S}from"./use-toast-xpb5jNtN.js";import{Ft as C,Ln as w,kn as T,mn as E}from"./index-DjaVbFDB.js";import{n as D,t as O}from"./toggle-group-5tREtjoW.js";var k=t(),A=e(n(),1),j=r(),M=1e3,N=[o.INFO,o.WARN,o.ERROR],P=[...N],ee=`inline-flex h-11 shrink-0 rounded-full border bg-muted/40 p-2`,te=f(s.compact,`h-7 min-w-0 rounded-full border-0 px-2.5 data-[state=on]:bg-foreground data-[state=on]:text-background data-[state=on]:shadow-sm`);function ne(e,t){return t?[e.event,e.message,I(e.level),e.data===void 0?``:R(e.data)].join(` `).toLowerCase().includes(t):!0}function F(e){let t=typeof e==`number`?e:Number(e);return t===o.DEBUG||t===o.INFO||t===o.WARN||t===o.ERROR?t:null}function I(e){let t=F(e);return t===null?String(e):a(t)}function L(e,t){let n=F(e.level);return n!==null&&t.has(n)}function R(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function z(e){switch(F(e)??e){case o.ERROR:return`text-destructive`;case o.WARN:return`text-amber-600 dark:text-amber-400`;case o.INFO:return`text-foreground`;default:return`text-muted-foreground`}}function B(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}function V(e){let t=[`${e.ts} ${I(e.level)} ${e.event}`,e.message];return e.data!==void 0&&t.push(R(e.data)),t.join(`
2
- `)}var H=(0,A.memo)(function(e){let t=(0,k.c)(40),{entry:n,copied:r,onCopy:i}=e,a;t[0]!==n||t[1]!==i?(a=()=>i(n),t[0]=n,t[1]=i,t[2]=a):a=t[2];let o;t[3]===r?o=t[4]:(o=r?(0,j.jsx)(l,{className:`h-3.5 w-3.5 text-green-500`}):(0,j.jsx)(d,{className:`h-3.5 w-3.5`}),t[3]=r,t[4]=o);let s;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(s=(0,j.jsx)(`span`,{className:`sr-only`,children:`Copy log entry`}),t[5]=s):s=t[5];let c;t[6]!==a||t[7]!==o?(c=(0,j.jsx)(_,{asChild:!0,children:(0,j.jsxs)(`button`,{type:`button`,onClick:a,className:`flex h-7 w-7 items-center justify-center rounded-md border border-border bg-background/90 text-foreground shadow-sm hover:bg-background`,children:[o,s]})}),t[6]=a,t[7]=o,t[8]=c):c=t[8];let u=r?`Copied!`:`Copy to clipboard`,p;t[9]===u?p=t[10]:(p=(0,j.jsx)(v,{children:u}),t[9]=u,t[10]=p);let m;t[11]!==c||t[12]!==p?(m=(0,j.jsx)(`div`,{className:`absolute top-2 right-2 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100`,children:(0,j.jsxs)(b,{children:[c,p]})}),t[11]=c,t[12]=p,t[13]=m):m=t[13];let h;t[14]===n.ts?h=t[15]:(h=B(n.ts),t[14]=n.ts,t[15]=h);let g;t[16]===h?g=t[17]:(g=(0,j.jsx)(`span`,{className:`text-muted-foreground tabular-nums`,children:h}),t[16]=h,t[17]=g);let y;t[18]===n.level?y=t[19]:(y=f(`font-semibold`,z(n.level)),t[18]=n.level,t[19]=y);let x;t[20]===n.level?x=t[21]:(x=I(n.level),t[20]=n.level,t[21]=x);let S;t[22]!==y||t[23]!==x?(S=(0,j.jsx)(`span`,{className:y,children:x}),t[22]=y,t[23]=x,t[24]=S):S=t[24];let C;t[25]===n.event?C=t[26]:(C=(0,j.jsx)(`span`,{className:`text-muted-foreground`,children:n.event}),t[25]=n.event,t[26]=C);let w;t[27]!==S||t[28]!==C||t[29]!==g?(w=(0,j.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-0.5`,children:[g,S,C]}),t[27]=S,t[28]=C,t[29]=g,t[30]=w):w=t[30];let T;t[31]===n.message?T=t[32]:(T=(0,j.jsx)(`p`,{className:`mt-0.5 whitespace-pre-wrap break-words text-foreground`,children:n.message}),t[31]=n.message,t[32]=T);let E;t[33]===n.data?E=t[34]:(E=n.data===void 0?null:(0,j.jsx)(`pre`,{className:`mt-1 max-h-40 overflow-auto whitespace-pre-wrap break-words text-muted-foreground`,children:R(n.data)}),t[33]=n.data,t[34]=E);let D;return t[35]!==w||t[36]!==T||t[37]!==E||t[38]!==m?(D=(0,j.jsxs)(`li`,{className:`group relative min-w-0 px-3 py-2 pr-10 hover:bg-muted/40 select-text`,children:[m,w,T,E]}),t[35]=w,t[36]=T,t[37]=E,t[38]=m,t[39]=D):D=t[39],D});function U(){let[e]=i(),t=e.get(`q`)??``,[n,r]=(0,A.useState)([]),[o,k]=(0,A.useState)(t),[F,I]=(0,A.useState)(P),[R,z]=(0,A.useState)(!0),[B,U]=(0,A.useState)(!1),[W,G]=(0,A.useState)(null),[K,q]=(0,A.useState)(!1),[J,re]=(0,A.useState)(null),Y=(0,A.useRef)(null),X=(0,A.useRef)(null);(0,A.useEffect)(()=>{t&&k(t)},[t]),(0,A.useEffect)(()=>{let e=!1,t=null,n=null,i=new AbortController,a=!1,o=!1;function s(){e||n||(z(!0),n=setTimeout(()=>{n=null,l()},M))}async function l(){if(!e){z(!0);try{let n=await g({signal:i.signal});if(!n||e){n&&e&&n.cancel().catch(()=>{});return}t=n.getReader();let o=new TextDecoder,l=``;for(a=!0,z(!1);!e;){let{done:e,value:n}=await t.read();if(e)break;l+=o.decode(n,{stream:!0});let i=l.split(`
3
- `);l=i.pop()??``;for(let e of i){let t=e.trim();if(!t)continue;let n;try{n=JSON.parse(t)}catch{continue}if(n.type!==`ping`){if(n.type===`snapshot`){r(n.entries);continue}if(n.type===`cleared`){r([]);continue}r(e=>{let t=[...e,n.entry];return t.length>5e3?t.slice(t.length-c):t})}}}e||s()}catch(t){if(e||i.signal.aborted)return;let n=t instanceof Error?t.message:String(t);if(m(n)||a){s();return}z(!1),o||(o=!0,S({title:`Failed to connect to log feed`,description:n,variant:`destructive`})),s()}}}return l(),()=>{e=!0,i.abort(),n&&clearTimeout(n),t?.cancel().catch(()=>{})}},[]),(0,A.useEffect)(()=>()=>{Y.current&&clearTimeout(Y.current),X.current&&clearTimeout(X.current)},[]);let Z=(0,A.useCallback)(async e=>{try{await navigator.clipboard.writeText(V(e)),G(e.id),Y.current&&clearTimeout(Y.current),Y.current=setTimeout(()=>{G(null),Y.current=null},1500)}catch(e){S({title:`Failed to copy log entry`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}},[]);async function ie(e){if(e.length!==0)try{await navigator.clipboard.writeText(e.map(e=>V(e)).join(`
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,o as n,t as r}from"./react-vendor-Ee0-5T4I.js";import{l as i}from"./chunk-QFMPRPBF-COsSkB7x.js";import{C as a,b as o,ot as s,y as c}from"./dist-DjiNKpTV.js";import{Et as l,jn as u,vn as d}from"./dist-CNOCRPxn.js";import{t as f}from"./utils-CT-Dw22R.js";import{t as p}from"./button-B6HDsfd5.js";import{An as m,Tr as h,d as g}from"./api-D1GxdEEp.js";import{i as _,n as v,r as y,t as b}from"./tooltip-BtJG5fZl.js";import{r as x}from"./scroll-area-BMQFeWmq.js";import{t as S}from"./use-toast-xpb5jNtN.js";import{It as C,gn as w,kn as T,xn as E}from"./index-BOB3ZUQs.js";import{n as D,t as O}from"./toggle-group-DMR7z3pz.js";var k=t(),A=e(n(),1),j=r(),M=1e3,N=[o.INFO,o.WARN,o.ERROR],ee=[...N],te=`inline-flex h-11 shrink-0 rounded-full border bg-muted/40 p-2`,ne=f(s.compact,`h-7 min-w-0 rounded-full border-0 px-2.5 data-[state=on]:bg-foreground data-[state=on]:text-background data-[state=on]:shadow-sm`);function P(e,t){return t?[e.event,e.message,I(e.level),e.data===void 0?``:R(e.data)].join(` `).toLowerCase().includes(t):!0}function F(e){let t=typeof e==`number`?e:Number(e);return t===o.DEBUG||t===o.INFO||t===o.WARN||t===o.ERROR?t:null}function I(e){let t=F(e);return t===null?String(e):a(t)}function L(e,t){let n=F(e.level);return n!==null&&t.has(n)}function R(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function z(e){switch(F(e)??e){case o.ERROR:return`text-destructive`;case o.WARN:return`text-amber-600 dark:text-amber-400`;case o.INFO:return`text-foreground`;default:return`text-muted-foreground`}}function B(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}function V(e){let t=[`${e.ts} ${I(e.level)} ${e.event}`,e.message];return e.data!==void 0&&t.push(R(e.data)),t.join(`
2
+ `)}var H=(0,A.memo)(function(e){let t=(0,k.c)(40),{entry:n,copied:r,onCopy:i}=e,a;t[0]!==n||t[1]!==i?(a=()=>i(n),t[0]=n,t[1]=i,t[2]=a):a=t[2];let o;t[3]===r?o=t[4]:(o=r?(0,j.jsx)(u,{className:`h-3.5 w-3.5 text-green-500`}):(0,j.jsx)(d,{className:`h-3.5 w-3.5`}),t[3]=r,t[4]=o);let s;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(s=(0,j.jsx)(`span`,{className:`sr-only`,children:`Copy log entry`}),t[5]=s):s=t[5];let c;t[6]!==a||t[7]!==o?(c=(0,j.jsx)(_,{asChild:!0,children:(0,j.jsxs)(`button`,{type:`button`,onClick:a,className:`flex h-7 w-7 items-center justify-center rounded-md border border-border bg-background/90 text-foreground shadow-sm hover:bg-background`,children:[o,s]})}),t[6]=a,t[7]=o,t[8]=c):c=t[8];let l=r?`Copied!`:`Copy to clipboard`,p;t[9]===l?p=t[10]:(p=(0,j.jsx)(v,{children:l}),t[9]=l,t[10]=p);let m;t[11]!==c||t[12]!==p?(m=(0,j.jsx)(`div`,{className:`absolute top-2 right-2 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100`,children:(0,j.jsxs)(b,{children:[c,p]})}),t[11]=c,t[12]=p,t[13]=m):m=t[13];let h;t[14]===n.ts?h=t[15]:(h=B(n.ts),t[14]=n.ts,t[15]=h);let g;t[16]===h?g=t[17]:(g=(0,j.jsx)(`span`,{className:`text-muted-foreground tabular-nums`,children:h}),t[16]=h,t[17]=g);let y;t[18]===n.level?y=t[19]:(y=f(`font-semibold`,z(n.level)),t[18]=n.level,t[19]=y);let x;t[20]===n.level?x=t[21]:(x=I(n.level),t[20]=n.level,t[21]=x);let S;t[22]!==y||t[23]!==x?(S=(0,j.jsx)(`span`,{className:y,children:x}),t[22]=y,t[23]=x,t[24]=S):S=t[24];let C;t[25]===n.event?C=t[26]:(C=(0,j.jsx)(`span`,{className:`text-muted-foreground`,children:n.event}),t[25]=n.event,t[26]=C);let w;t[27]!==S||t[28]!==C||t[29]!==g?(w=(0,j.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-0.5`,children:[g,S,C]}),t[27]=S,t[28]=C,t[29]=g,t[30]=w):w=t[30];let T;t[31]===n.message?T=t[32]:(T=(0,j.jsx)(`p`,{className:`mt-0.5 whitespace-pre-wrap break-words text-foreground`,children:n.message}),t[31]=n.message,t[32]=T);let E;t[33]===n.data?E=t[34]:(E=n.data===void 0?null:(0,j.jsx)(`pre`,{className:`mt-1 max-h-40 overflow-auto whitespace-pre-wrap break-words text-muted-foreground`,children:R(n.data)}),t[33]=n.data,t[34]=E);let D;return t[35]!==w||t[36]!==T||t[37]!==E||t[38]!==m?(D=(0,j.jsxs)(`li`,{className:`group relative min-w-0 px-3 py-2 pr-10 hover:bg-muted/40 select-text`,children:[m,w,T,E]}),t[35]=w,t[36]=T,t[37]=E,t[38]=m,t[39]=D):D=t[39],D});function U(){let[e]=i(),t=e.get(`q`)??``,[n,r]=(0,A.useState)([]),[o,k]=(0,A.useState)(t),[F,I]=(0,A.useState)(ee),[R,z]=(0,A.useState)(!0),[B,U]=(0,A.useState)(!1),[W,G]=(0,A.useState)(null),[K,q]=(0,A.useState)(!1),[J,re]=(0,A.useState)(null),Y=(0,A.useRef)(null),X=(0,A.useRef)(null);(0,A.useEffect)(()=>{t&&k(t)},[t]),(0,A.useEffect)(()=>{let e=!1,t=null,n=null,i=new AbortController,a=!1,o=!1;function s(){e||n||(z(!0),n=setTimeout(()=>{n=null,l()},M))}async function l(){if(!e){z(!0);try{let n=await m({signal:i.signal});if(!n||e){n&&e&&n.cancel().catch(()=>{});return}t=n.getReader();let o=new TextDecoder,l=``;for(a=!0,z(!1);!e;){let{done:e,value:n}=await t.read();if(e)break;l+=o.decode(n,{stream:!0});let i=l.split(`
3
+ `);l=i.pop()??``;for(let e of i){let t=e.trim();if(!t)continue;let n;try{n=JSON.parse(t)}catch{continue}if(n.type!==`ping`){if(n.type===`snapshot`){r(n.entries);continue}if(n.type===`cleared`){r([]);continue}r(e=>{let t=[...e,n.entry];return t.length>5e3?t.slice(t.length-c):t})}}}e||s()}catch(t){if(e||i.signal.aborted)return;let n=t instanceof Error?t.message:String(t);if(h(n)||a){s();return}z(!1),o||(o=!0,S({title:`Failed to connect to log feed`,description:n,variant:`destructive`})),s()}}}return l(),()=>{e=!0,i.abort(),n&&clearTimeout(n),t?.cancel().catch(()=>{})}},[]),(0,A.useEffect)(()=>()=>{Y.current&&clearTimeout(Y.current),X.current&&clearTimeout(X.current)},[]);let Z=(0,A.useCallback)(async e=>{try{await navigator.clipboard.writeText(V(e)),G(e.id),Y.current&&clearTimeout(Y.current),Y.current=setTimeout(()=>{G(null),Y.current=null},1500)}catch(e){S({title:`Failed to copy log entry`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}},[]);async function ie(e){if(e.length!==0)try{await navigator.clipboard.writeText(e.map(e=>V(e)).join(`
4
4
 
5
- `)),q(!0),X.current&&clearTimeout(X.current),X.current=setTimeout(()=>{q(!1),X.current=null},1500)}catch(e){S({title:`Failed to copy logs`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}}async function ae(){U(!0);try{await h()}catch(e){S({title:`Failed to clear logs`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{U(!1)}}let Q=o.trim().toLowerCase(),oe=new Set(F),$=n.filter(e=>L(e,oe)&&ne(e,Q)),se=(0,A.useCallback)((e,t)=>(0,j.jsx)(H,{entry:t,copied:W===t.id,onCopy:Z}),[W,Z]);function ce(){return n.length===0?`No logs in the buffer yet.`:F.length===0?`No log levels selected.`:Q?`No logs match this search.`:`No logs match the selected levels.`}return(0,j.jsx)(`div`,{className:`flex h-full min-h-0 w-full min-w-0 flex-1 flex-col`,children:(0,j.jsxs)(w,{className:`flex w-full max-w-none min-w-0 min-h-0 flex-1 flex-col pb-0 pt-0`,children:[(0,j.jsx)(T,{title:`Logs`,description:`Live in memory feed of events`,action:(0,j.jsx)(p,{type:`button`,onClick:()=>void ae(),disabled:B||n.length===0,children:B?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(u,{className:`mr-2 h-4 w-4 animate-spin`}),`Clearing...`]}):`Clear`})}),(0,j.jsxs)(`div`,{className:`mb-4 mt-4 flex w-full min-w-0 items-center gap-3 electrobun-webkit-app-region-no-drag`,children:[(0,j.jsx)(C,{value:o,onChange:e=>k(e.target.value),placeholder:`Search`,className:`min-w-0 flex-1`,"aria-label":`Search logs`}),(0,j.jsx)(O,{type:`multiple`,value:F.map(e=>a(e)),onValueChange:e=>{I(N.filter(t=>e.includes(a(t))))},"aria-label":`Log levels`,variant:`outline`,size:`sm`,className:ee,children:N.map(e=>(0,j.jsx)(D,{value:a(e),"aria-label":a(e),className:te,children:a(e)},e))}),(0,j.jsx)(y,{children:(0,j.jsxs)(b,{children:[(0,j.jsx)(_,{asChild:!0,children:(0,j.jsxs)(p,{type:`button`,variant:`ghost`,size:`icon`,className:`h-8 w-8 shrink-0`,onClick:()=>void ie($),disabled:$.length===0,children:[K?(0,j.jsx)(l,{className:`h-3.5 w-3.5 text-green-500`}):(0,j.jsx)(d,{className:`h-3.5 w-3.5`}),(0,j.jsx)(`span`,{className:`sr-only`,children:`Copy visible logs`})]})}),(0,j.jsx)(v,{children:K?`Copied!`:`Copy visible logs to clipboard`})]})})]}),(0,j.jsx)(x,{viewportRef:re,className:`mb-6 w-full min-h-0 min-w-0 flex-1 rounded-md border bg-background font-mono text-xs`,children:R&&n.length===0?(0,j.jsxs)(`div`,{className:`flex items-center gap-2 p-4 text-muted-foreground`,children:[(0,j.jsx)(u,{className:`h-4 w-4 animate-spin`}),`Connecting…`]}):$.length===0?(0,j.jsx)(`p`,{className:f(s.bodyMuted,`p-4 font-sans`),children:ce()}):(0,j.jsx)(y,{children:(0,j.jsx)(E,{data:$,computeItemKey:(e,t)=>t.id,customScrollParent:J??void 0,itemContent:se,followOutput:e=>e?`auto`:!1,overscan:500,className:`w-full min-w-0`})})})]})})}export{U as default};
5
+ `)),q(!0),X.current&&clearTimeout(X.current),X.current=setTimeout(()=>{q(!1),X.current=null},1500)}catch(e){S({title:`Failed to copy logs`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}}async function ae(){U(!0);try{await g()}catch(e){S({title:`Failed to clear logs`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{U(!1)}}let Q=o.trim().toLowerCase(),oe=new Set(F),$=n.filter(e=>L(e,oe)&&P(e,Q)),se=(0,A.useCallback)((e,t)=>(0,j.jsx)(H,{entry:t,copied:W===t.id,onCopy:Z}),[W,Z]);function ce(){return n.length===0?`No logs in the buffer yet.`:F.length===0?`No log levels selected.`:Q?`No logs match this search.`:`No logs match the selected levels.`}return(0,j.jsx)(`div`,{className:`flex h-full min-h-0 w-full min-w-0 flex-1 flex-col`,children:(0,j.jsxs)(T,{className:`flex w-full max-w-none min-w-0 min-h-0 flex-1 flex-col pb-0 pt-0`,children:[(0,j.jsx)(E,{title:`Logs`,description:`Live in memory feed of events`,action:(0,j.jsx)(p,{type:`button`,onClick:()=>void ae(),disabled:B||n.length===0,children:B?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(l,{className:`mr-2 h-4 w-4 animate-spin`}),`Clearing...`]}):`Clear`})}),(0,j.jsxs)(`div`,{className:`mb-4 mt-4 flex w-full min-w-0 items-center gap-3 electrobun-webkit-app-region-no-drag`,children:[(0,j.jsx)(C,{value:o,onChange:e=>k(e.target.value),placeholder:`Search`,className:`min-w-0 flex-1`,"aria-label":`Search logs`}),(0,j.jsx)(O,{type:`multiple`,value:F.map(e=>a(e)),onValueChange:e=>{I(N.filter(t=>e.includes(a(t))))},"aria-label":`Log levels`,variant:`outline`,size:`sm`,className:te,children:N.map(e=>(0,j.jsx)(D,{value:a(e),"aria-label":a(e),className:ne,children:a(e)},e))}),(0,j.jsx)(y,{children:(0,j.jsxs)(b,{children:[(0,j.jsx)(_,{asChild:!0,children:(0,j.jsxs)(p,{type:`button`,variant:`ghost`,size:`icon`,className:`h-8 w-8 shrink-0`,onClick:()=>void ie($),disabled:$.length===0,children:[K?(0,j.jsx)(u,{className:`h-3.5 w-3.5 text-green-500`}):(0,j.jsx)(d,{className:`h-3.5 w-3.5`}),(0,j.jsx)(`span`,{className:`sr-only`,children:`Copy visible logs`})]})}),(0,j.jsx)(v,{children:K?`Copied!`:`Copy visible logs to clipboard`})]})})]}),(0,j.jsx)(x,{viewportRef:re,className:`mb-6 w-full min-h-0 min-w-0 flex-1 rounded-md border bg-background font-mono text-xs`,children:R&&n.length===0?(0,j.jsxs)(`div`,{className:`flex items-center gap-2 p-4 text-muted-foreground`,children:[(0,j.jsx)(l,{className:`h-4 w-4 animate-spin`}),`Connecting…`]}):$.length===0?(0,j.jsx)(`p`,{className:f(s.bodyMuted,`p-4 font-sans`),children:ce()}):(0,j.jsx)(y,{children:(0,j.jsx)(w,{data:$,computeItemKey:(e,t)=>t.id,customScrollParent:J??void 0,itemContent:se,followOutput:e=>e?`auto`:!1,overscan:500,className:`w-full min-w-0`})})})]})})}export{U as default};
@@ -0,0 +1,5 @@
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,o as n,t as r}from"./react-vendor-Ee0-5T4I.js";import{ot as i}from"./dist-DjiNKpTV.js";import{r as a}from"./store-CHF6tOp2.js";import{$ as o,An as s,D as c,G as l,ct as u,jn as d,rt as f,un as p,y as m}from"./dist-CNOCRPxn.js";import{t as h}from"./utils-CT-Dw22R.js";import{t as g}from"./button-B6HDsfd5.js";import{Xt as _,a as v,ft as y,un as b}from"./api-D1GxdEEp.js";import{i as x,n as S,r as C,t as ee}from"./tooltip-BtJG5fZl.js";import{t as w}from"./use-toast-xpb5jNtN.js";import{r as T,t as E}from"./dialog--0foS3aw.js";import{n as D}from"./explorer-tab-context-BxUVwWQQ.js";import{t as O}from"./use-open-chat-dock-panel-B31lwcQF.js";import{A as k,At as A,Bn as j,D as M,E as N,Hn as P,I as F,In as I,It as L,L as R,Ln as z,Mn as B,Nt as V,O as te,On as H,Pn as ne,Pt as U,R as W,Tn as re,Un as G,Vn as ie,X as K,j as q,jn as ae,jt as oe,k as se,kn as ce,kt as le,vn as ue,xn as de,yn as J,z as fe,zn as pe}from"./index-BOB3ZUQs.js";import{t as me}from"./delete-confirm-dialog-3DX1u0Dg.js";import{t as he}from"./use-settings-page-loading-BTySlInF.js";import{n as ge}from"./settings-list-BpPbGcpS.js";import{t as _e}from"./switch-P5m18oUl.js";var Y=t(),X=e(n(),1),Z=r(),ve={key:``,value:``},ye={serverType:`local`,name:``,command:``,argsText:``,serverUrl:``,transport:`sse`,oauthClientId:``,oauthClientSecret:``,oauthCallbackPort:``,defer:!0},be=[e=>e.name,e=>e.command,e=>e.argsText,e=>e.serverUrl,e=>e.oauthClientId,e=>e.oauthClientSecret,e=>e.oauthCallbackPort];function Q(e,t){return e??t}function $(e){return e?.url?`remote`:`local`}function xe(e){return Object.entries(e??{}).map(([e,t])=>({key:e,value:t}))}function Se(e){let t={};for(let{key:n,value:r}of e)n.trim()&&(t[n.trim()]=r);return Object.keys(t).length>0?t:void 0}function Ce(e){return(e??[]).join(`
2
+ `)}function we(e){return e.split(`
3
+ `).map(e=>e.trim()).filter(Boolean)}function Te(e){return e===void 0?``:String(e)}function Ee(e){return{oauthClientId:Q(e?.clientId,``),oauthClientSecret:Q(e?.clientSecret,``),oauthCallbackPort:Te(e?.callbackPort)}}function De(e,t){return{...ye,name:e,serverType:$(t),command:Q(t.command,``),argsText:Ce(t.args),serverUrl:Q(t.url,``),transport:Q(t.transport,`sse`),...Ee(t.oauth),defer:t.defer!==!1}}function Oe(e,t,n){return JSON.stringify({name:e,type:t,config:n})}function ke(e){if(!e)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}function Ae(e){let t={};for(let[n,r]of Object.entries(e))r!==``&&r!==void 0&&(t[n]=r);return t}function je(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}function Me(e,t,n){return e!==``||t!==``||n!==void 0}function Ne(e){let t=e.oauthClientId.trim(),n=e.oauthClientSecret.trim(),r=ke(e.oauthCallbackPort.trim());if(!Me(t,n,r))return;let i=Ae({clientId:t,clientSecret:n,callbackPort:r});if(Object.keys(i).length!==0)return i}function Pe(e,t,n){return je({url:e.serverUrl.trim(),transport:e.transport,headers:Se(n),env:Se(t),oauth:Ne(e),defer:e.defer?void 0:!1})}function Fe(e,t){return je({command:e.command.trim(),args:we(e.argsText),env:Se(t),defer:e.defer?void 0:!1})}function Ie(e,t,n){return e.serverType===`remote`?Pe(e,t,n):Fe(e,t)}function Le(e){let t=e.trim();if(!t)return`Server URL is required`;try{new URL(t)}catch{return`Server URL must be a valid URL`}return null}function Re(e){if(!e.trim())return null;let t=Number.parseInt(e.trim(),10);return Number.isInteger(t)&&t>0?null:`OAuth callback port must be a positive integer`}function ze(e){return e.oauthClientSecret.trim()&&!e.oauthClientId.trim()?`OAuth client ID is required when a client secret is set`:null}function Be(e){return Le(e.serverUrl)??Re(e.oauthCallbackPort)??ze(e)}function Ve(e){return e.trim()?null:`Command is required`}function He(e,t){return t.name.trim()?e===`remote`?Be(t):Ve(t.command):`Server name is required`}function Ue(e,t,n){return be.some(t=>t(e).trim()!==``)||t.length>0||n.length>0||!e.defer}function We(e){return e.isEditing?e.currentSnapshot!==e.originalSnapshot:Ue(e.form,e.envEntries,e.headerEntries)}function Ge(e){if(e.isEditing&&e.serverName)return e.installedServers.find(t=>t.name===e.serverName);if(e.initialConfig)return{name:Q(e.initialName,``),config:e.initialConfig}}function Ke(e,t){return e instanceof Error?e.message:t}function qe(e,t){return e?t?`Saving...`:`Adding...`:t?`Save`:`Add`}function Je(e,t){return e?`MCP server saved · ${M(t.catalog)}`:`MCP server added · ${M(t.catalog)}`}function Ye(e,t){return{title:e?t:`Add MCP Server`,description:e?`Edit MCP Server configuration.`:`Configure a new MCP Server.`}}function Xe(){let e=(0,Y.c)(7),t;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t={env:[],header:[]},e[0]=t):t=e[0];let[n,r]=(0,X.useState)(t),i;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(i=function(e,t){r(n=>({...n,[e]:t(n[e])}))},e[1]=i):i=e[1];let a=i,o;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(o=function(e){a(e,Ze)},e[2]=o):o=e[2];let s=o,c;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(c=function(e,t){a(e,e=>e.filter((e,n)=>n!==t))},e[3]=c):c=e[3];let l=c,u;e[4]===Symbol.for(`react.memo_cache_sentinel`)?(u=function(e,t,n){a(e,e=>e.map((e,r)=>r===t?{...e,...n}:e))},e[4]=u):u=e[4];let d=u,f;return e[5]===n?f=e[6]:(f={lists:n,setEntryLists:r,addEntry:s,removeEntry:l,updateEntry:d},e[5]=n,e[6]=f),f}function Ze(e){return[...e,ve]}function Qe(e){async function t(){if(!e.projectPath)throw Error(`No project path`);let t=await se(e.projectPath,e.originalName||e.form.name.trim(),Ie(e.form,e.envEntries,e.headerEntries));w({title:`Success`,description:Je(e.isEditing,t)}),e.onBack()}async function n(){e.setError(null);let n=He(e.form.serverType,e.form);if(n){e.setError(n);return}e.setSaving(!0);try{await t()}catch(t){e.setError(Ke(t,`Failed to save server`))}finally{e.setSaving(!1)}}async function r(){if(e.projectPath){e.setDeleting(!0);try{await N(e.projectPath,e.originalName),w({title:`Success`,description:`MCP server removed`}),e.onBack()}catch(t){e.setError(Ke(t,`Failed to delete server`))}finally{e.setDeleting(!1)}}}return{handleSave:n,handleDelete:r}}function $e(e){let{installedServers:t}=q(e.projectPath),n=!!e.serverName,[r,i]=(0,X.useState)(ye),{lists:a,setEntryLists:o,addEntry:s,removeEntry:c,updateEntry:l}=Xe(),[u,d]=(0,X.useState)({name:``,snapshot:``}),[f,p]=(0,X.useState)(!1),[m,h]=(0,X.useState)(!1),[g,_]=(0,X.useState)(null),[v,y]=(0,X.useState)(n);(0,X.useEffect)(()=>{let r=Ge({isEditing:n,serverName:e.serverName,initialName:e.initialName,initialConfig:e.initialConfig,installedServers:t});r&&(i(De(r.name,r.config)),o({env:xe(r.config.env),header:xe(r.config.headers)}),d({name:r.name,snapshot:Oe(r.name,$(r.config),r.config)})),(!n||r)&&y(!1)},[t,e.serverName,e.initialName,e.initialConfig,o,n]);function b(e){i(t=>({...t,...e}))}return{form:r,patchForm:b,lists:a,addEntry:s,removeEntry:c,updateEntry:l,original:u,saving:f,deleting:m,error:g,loading:v,actions:Qe({projectPath:e.projectPath,isEditing:n,form:r,envEntries:a.env,headerEntries:a.header,originalName:u.name,onBack:e.onBack,setError:_,setSaving:p,setDeleting:h})}}function et(){let e=(0,Y.c)(1),t;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=(0,Z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,Z.jsx)(`p`,{className:i.bodyMuted,children:`Loading server configuration...`})}),e[0]=t):t=e[0],t}function tt(e){let t=(0,Y.c)(9),{isEditing:n,name:r,onNameChange:i}=e,a=n?`Server name cannot be changed`:void 0,o;t[0]===i?o=t[1]:(o=e=>i(e.target.value),t[0]=i,t[1]=o);let s;t[2]!==n||t[3]!==r||t[4]!==o?(s=(0,Z.jsx)(L,{id:`server-name`,placeholder:`e.g. filesystem`,value:r,onChange:o,disabled:n}),t[2]=n,t[3]=r,t[4]=o,t[5]=s):s=t[5];let c;return t[6]!==a||t[7]!==s?(c=(0,Z.jsx)(J,{title:`Server name`,description:a,controlLayout:`stack`,className:`pt-6`,children:s}),t[6]=a,t[7]=s,t[8]=c):c=t[8],c}function nt(e){let t=(0,Y.c)(13),{form:n,onFormChange:r}=e,i;t[0]===r?i=t[1]:(i=e=>r({command:e.target.value}),t[0]=r,t[1]=i);let a;t[2]!==n.command||t[3]!==i?(a=(0,Z.jsx)(J,{title:`Command`,controlLayout:`stack`,className:`pt-6`,children:(0,Z.jsx)(L,{id:`server-command`,placeholder:`e.g. npx`,value:n.command,onChange:i})}),t[2]=n.command,t[3]=i,t[4]=a):a=t[4];let o;t[5]===r?o=t[6]:(o=e=>r({argsText:e.target.value}),t[5]=r,t[6]=o);let s;t[7]!==n.argsText||t[8]!==o?(s=(0,Z.jsx)(J,{title:`Arguments`,description:`One argument per line`,controlLayout:`stack`,className:`pt-6`,children:(0,Z.jsx)(K,{id:`server-args`,placeholder:`-y
4
+ @modelcontextprotocol/server-filesystem
5
+ /path/to/dir`,value:n.argsText,onChange:o,className:`font-mono min-h-[80px] resize-none`})}),t[7]=n.argsText,t[8]=o,t[9]=s):s=t[9];let c;return t[10]!==a||t[11]!==s?(c=(0,Z.jsxs)(Z.Fragment,{children:[a,s]}),t[10]=a,t[11]=s,t[12]=c):c=t[12],c}function rt(e){let t=(0,Y.c)(19),{form:n,onFormChange:r}=e,i;t[0]===r?i=t[1]:(i=e=>r({oauthClientId:e.target.value}),t[0]=r,t[1]=i);let a;t[2]!==n.oauthClientId||t[3]!==i?(a=(0,Z.jsx)(L,{id:`oauth-client-id`,placeholder:`Client ID`,value:n.oauthClientId,onChange:i,className:`font-mono`}),t[2]=n.oauthClientId,t[3]=i,t[4]=a):a=t[4];let o;t[5]===r?o=t[6]:(o=e=>r({oauthClientSecret:e.target.value}),t[5]=r,t[6]=o);let s;t[7]!==n.oauthClientSecret||t[8]!==o?(s=(0,Z.jsx)(L,{id:`oauth-client-secret`,placeholder:`Client secret`,type:`password`,value:n.oauthClientSecret,onChange:o,className:`font-mono`}),t[7]=n.oauthClientSecret,t[8]=o,t[9]=s):s=t[9];let c;t[10]===r?c=t[11]:(c=e=>r({oauthCallbackPort:e.target.value}),t[10]=r,t[11]=c);let l;t[12]!==n.oauthCallbackPort||t[13]!==c?(l=(0,Z.jsx)(L,{id:`oauth-callback-port`,placeholder:`Callback port (e.g. 3118)`,value:n.oauthCallbackPort,onChange:c,className:`font-mono`}),t[12]=n.oauthCallbackPort,t[13]=c,t[14]=l):l=t[14];let u;return t[15]!==a||t[16]!==s||t[17]!==l?(u=(0,Z.jsx)(J,{title:`OAuth client`,description:`Required for servers without dynamic client registration (e.g. GitHub Copilot MCP). Create an OAuth App, set callback to http://localhost:<port>/callback, then Sign in.`,controlLayout:`stack`,className:`pt-6`,children:(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[a,s,l]})}),t[15]=a,t[16]=s,t[17]=l,t[18]=u):u=t[18],u}function it(e){let t=(0,Y.c)(15),{entries:n,emptyMessage:r,keyPlaceholder:a,valuePlaceholder:o,onUpdate:s,onRemove:c}=e;if(n.length===0){let e;return t[0]===r?e=t[1]:(e=(0,Z.jsx)(`p`,{className:i.caption,children:r}),t[0]=r,t[1]=e),e}let l;if(t[2]!==n||t[3]!==a||t[4]!==c||t[5]!==s||t[6]!==o){let e;t[8]!==a||t[9]!==c||t[10]!==s||t[11]!==o?(e=(e,t)=>(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(L,{placeholder:a,value:e.key,onChange:e=>s(t,{key:e.target.value}),className:`font-mono w-[35%]`}),(0,Z.jsx)(L,{placeholder:o,value:e.value,onChange:e=>s(t,{value:e.target.value}),className:`font-mono flex-1`}),(0,Z.jsx)(g,{variant:`ghost`,size:`icon`,onClick:()=>c(t),className:`h-9 w-9 flex-shrink-0`,children:(0,Z.jsx)(m,{className:`h-3.5 w-3.5`})})]},t),t[8]=a,t[9]=c,t[10]=s,t[11]=o,t[12]=e):e=t[12],l=n.map(e),t[2]=n,t[3]=a,t[4]=c,t[5]=s,t[6]=o,t[7]=l}else l=t[7];let u;return t[13]===l?u=t[14]:(u=(0,Z.jsx)(`div`,{className:`flex flex-col gap-2`,children:l}),t[13]=l,t[14]=u),u}function at(e){let t=(0,Y.c)(16),{title:n,description:r,actionLabel:i,emptyMessage:a,keyPlaceholder:o,valuePlaceholder:s,entries:c,onAdd:l,onRemove:u,onUpdate:d}=e,p;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(p=(0,Z.jsx)(f,{className:`h-3 w-3 mr-1`}),t[0]=p):p=t[0];let m;t[1]!==i||t[2]!==l?(m=(0,Z.jsxs)(g,{variant:`ghost`,size:`sm`,onClick:l,children:[p,i]}),t[1]=i,t[2]=l,t[3]=m):m=t[3];let h;t[4]!==a||t[5]!==c||t[6]!==o||t[7]!==u||t[8]!==d||t[9]!==s?(h=(0,Z.jsx)(it,{entries:c,emptyMessage:a,keyPlaceholder:o,valuePlaceholder:s,onUpdate:d,onRemove:u}),t[4]=a,t[5]=c,t[6]=o,t[7]=u,t[8]=d,t[9]=s,t[10]=h):h=t[10];let _;return t[11]!==r||t[12]!==m||t[13]!==h||t[14]!==n?(_=(0,Z.jsx)(J,{title:n,description:r,controlLayout:`stack`,className:`pt-6`,action:m,children:h}),t[11]=r,t[12]=m,t[13]=h,t[14]=n,t[15]=_):_=t[15],_}function ot(e){let t=(0,Y.c)(6),{serverType:n,entries:r,onAdd:i,onRemove:a,onUpdate:o}=e,s=n===`remote`?`Optional metadata for local tooling.`:void 0,c;return t[0]!==r||t[1]!==i||t[2]!==a||t[3]!==o||t[4]!==s?(c=(0,Z.jsx)(at,{title:`Environment variables`,description:s,actionLabel:`Add variable`,emptyMessage:`No environment variables configured`,keyPlaceholder:`KEY`,valuePlaceholder:`value`,entries:r,onAdd:i,onRemove:a,onUpdate:o}),t[0]=r,t[1]=i,t[2]=a,t[3]=o,t[4]=s,t[5]=c):c=t[5],c}function st(e){let t=(0,Y.c)(6),{defer:n,onDeferChange:r}=e,i=n?`Tool definitions load on demand via tool_search to keep the initial prompt small.`:`Tool definitions are always injected into the initial prompt, even when not used. Useful when this server's tools are needed in nearly every conversation, but they consume context.`,a;t[0]!==n||t[1]!==r?(a=(0,Z.jsx)(_e,{id:`defer-tools`,checked:n,onCheckedChange:r,"aria-label":`Deferred`}),t[0]=n,t[1]=r,t[2]=a):a=t[2];let o;return t[3]!==i||t[4]!==a?(o=(0,Z.jsx)(J,{title:`Deferred`,description:i,controlLayout:`stack`,className:`pt-6`,action:a}),t[3]=i,t[4]=a,t[5]=o):o=t[5],o}function ct(e){let t=(0,Y.c)(25),{form:n,onFormChange:r,headerEntries:i,onHeaderAdd:a,onHeaderRemove:o,onHeaderUpdate:s}=e,c;t[0]===r?c=t[1]:(c=e=>r({serverUrl:e.target.value}),t[0]=r,t[1]=c);let l;t[2]!==n.serverUrl||t[3]!==c?(l=(0,Z.jsx)(J,{title:`Server URL`,description:`Paste the MCP endpoint URL from your provider.`,controlLayout:`stack`,className:`pt-6`,children:(0,Z.jsx)(L,{id:`server-url`,placeholder:`https://example.com/mcp`,value:n.serverUrl,onChange:c,className:`font-mono`})}),t[2]=n.serverUrl,t[3]=c,t[4]=l):l=t[4];let u;t[5]===r?u=t[6]:(u=e=>r({transport:e}),t[5]=r,t[6]=u);let d;t[7]===Symbol.for(`react.memo_cache_sentinel`)?(d=(0,Z.jsx)(V,{children:(0,Z.jsx)(U,{})}),t[7]=d):d=t[7];let f;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(f=(0,Z.jsxs)(A,{children:[(0,Z.jsx)(oe,{value:`sse`,children:`SSE (Server-Sent Events)`}),(0,Z.jsx)(oe,{value:`streamableHttp`,children:`Streamable HTTP`})]}),t[8]=f):f=t[8];let p;t[9]!==n.transport||t[10]!==u?(p=(0,Z.jsx)(J,{title:`Transport`,controlLayout:`stack`,className:`pt-6`,children:(0,Z.jsxs)(le,{value:n.transport,onValueChange:u,children:[d,f]})}),t[9]=n.transport,t[10]=u,t[11]=p):p=t[11];let m;t[12]!==n||t[13]!==r?(m=(0,Z.jsx)(rt,{form:n,onFormChange:r}),t[12]=n,t[13]=r,t[14]=m):m=t[14];let h;t[15]!==i||t[16]!==a||t[17]!==o||t[18]!==s?(h=(0,Z.jsx)(at,{title:`HTTP headers`,description:`Optional headers for authentication.`,actionLabel:`Add header`,emptyMessage:`No headers configured`,keyPlaceholder:`Authorization`,valuePlaceholder:`Bearer ...`,entries:i,onAdd:a,onRemove:o,onUpdate:s}),t[15]=i,t[16]=a,t[17]=o,t[18]=s,t[19]=h):h=t[19];let g;return t[20]!==l||t[21]!==p||t[22]!==m||t[23]!==h?(g=(0,Z.jsxs)(Z.Fragment,{children:[l,p,m,h]}),t[20]=l,t[21]=p,t[22]=m,t[23]=h,t[24]=g):g=t[24],g}function lt(e){let t=(0,Y.c)(18),{form:n,onFormChange:r,headerEntries:i,onHeaderAdd:a,onHeaderRemove:o,onHeaderUpdate:s}=e,c;t[0]===r?c=t[1]:(c=e=>r({serverType:e}),t[0]=r,t[1]=c);let l;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,Z.jsxs)(W,{className:`grid w-full grid-cols-2`,children:[(0,Z.jsx)(fe,{value:`local`,children:`Local (stdio)`}),(0,Z.jsx)(fe,{value:`remote`,children:`Remote (HTTP/SSE)`})]}),t[2]=l):l=t[2];let u;t[3]!==n||t[4]!==r?(u=(0,Z.jsx)(R,{value:`local`,children:(0,Z.jsx)(nt,{form:n,onFormChange:r})}),t[3]=n,t[4]=r,t[5]=u):u=t[5];let d;t[6]!==n||t[7]!==i||t[8]!==r||t[9]!==a||t[10]!==o||t[11]!==s?(d=(0,Z.jsx)(R,{value:`remote`,children:(0,Z.jsx)(ct,{form:n,onFormChange:r,headerEntries:i,onHeaderAdd:a,onHeaderRemove:o,onHeaderUpdate:s})}),t[6]=n,t[7]=i,t[8]=r,t[9]=a,t[10]=o,t[11]=s,t[12]=d):d=t[12];let f;return t[13]!==n.serverType||t[14]!==c||t[15]!==u||t[16]!==d?(f=(0,Z.jsxs)(F,{value:n.serverType,onValueChange:c,className:`w-full pt-6`,children:[l,u,d]}),t[13]=n.serverType,t[14]=c,t[15]=u,t[16]=d,t[17]=f):f=t[17],f}function ut(e){let t=(0,Y.c)(5),{isEditing:n,busy:r,deleting:i,onDelete:a}=e;if(!n){let e;return t[0]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Z.jsx)(`div`,{}),t[0]=e):e=t[0],e}let o=i?`Removing...`:`Remove`,s;return t[1]!==r||t[2]!==a||t[3]!==o?(s=(0,Z.jsx)(g,{variant:`destructive`,onClick:a,disabled:r,children:o}),t[1]=r,t[2]=a,t[3]=o,t[4]=s):s=t[4],s}function dt(e){let t=(0,Y.c)(7),{busy:n,hasChanges:r,saving:i,isEditing:a,onSave:o}=e,s=n||!r,c;t[0]!==a||t[1]!==i?(c=qe(i,a),t[0]=a,t[1]=i,t[2]=c):c=t[2];let l;return t[3]!==o||t[4]!==s||t[5]!==c?(l=(0,Z.jsx)(g,{onClick:o,disabled:s,children:c}),t[3]=o,t[4]=s,t[5]=c,t[6]=l):l=t[6],l}function ft(e){let t=(0,Y.c)(14),{isEditing:n,busy:r,saving:i,deleting:a,hasChanges:o,onSave:s,onDelete:c}=e,l;t[0]!==r||t[1]!==a||t[2]!==n||t[3]!==c?(l=(0,Z.jsx)(ut,{isEditing:n,busy:r,deleting:a,onDelete:c}),t[0]=r,t[1]=a,t[2]=n,t[3]=c,t[4]=l):l=t[4];let u;t[5]!==r||t[6]!==o||t[7]!==n||t[8]!==s||t[9]!==i?(u=(0,Z.jsx)(dt,{busy:r,hasChanges:o,saving:i,isEditing:n,onSave:s}),t[5]=r,t[6]=o,t[7]=n,t[8]=s,t[9]=i,t[10]=u):u=t[10];let d;return t[11]!==l||t[12]!==u?(d=(0,Z.jsxs)(`div`,{className:`mt-6 border-t pt-4 flex items-center justify-between`,children:[l,u]}),t[11]=l,t[12]=u,t[13]=d):d=t[13],d}function pt(e){let t=(0,Y.c)(74),{projectPath:n,serverName:r,initialName:a,initialConfig:o,onBack:s}=e,c;t[0]!==o||t[1]!==a||t[2]!==s||t[3]!==n||t[4]!==r?(c={projectPath:n,serverName:r,initialName:a,initialConfig:o,onBack:s},t[0]=o,t[1]=a,t[2]=s,t[3]=n,t[4]=r,t[5]=c):c=t[5];let{form:l,patchForm:u,lists:d,addEntry:f,removeEntry:p,updateEntry:m,original:h,saving:g,deleting:_,error:v,loading:y,actions:b}=$e(c),x=!!r,S=g||_,C;t[6]!==l||t[7]!==x||t[8]!==d.env||t[9]!==d.header||t[10]!==h.snapshot?(C=We({isEditing:x,currentSnapshot:Oe(l.name.trim(),l.serverType,Ie(l,d.env,d.header)),originalSnapshot:h.snapshot,form:l,envEntries:d.env,headerEntries:d.header}),t[6]=l,t[7]=x,t[8]=d.env,t[9]=d.header,t[10]=h.snapshot,t[11]=C):C=t[11];let ee=C;if(y){let e;return t[12]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Z.jsx)(et,{}),t[12]=e):e=t[12],e}let w;t[13]!==l.name||t[14]!==x?(w=Ye(x,l.name),t[13]=l.name,t[14]=x,t[15]=w):w=t[15];let T;t[16]===w?T=t[17]:(T=(0,Z.jsx)(de,{...w,sticky:!0,className:`pr-10`}),t[16]=w,t[17]=T);let E;t[18]===u?E=t[19]:(E=e=>u({name:e}),t[18]=u,t[19]=E);let D;t[20]!==l.name||t[21]!==x||t[22]!==E?(D=(0,Z.jsx)(tt,{isEditing:x,name:l.name,onNameChange:E}),t[20]=l.name,t[21]=x,t[22]=E,t[23]=D):D=t[23];let O;t[24]===f?O=t[25]:(O=()=>f(`header`),t[24]=f,t[25]=O);let k;t[26]===p?k=t[27]:(k=e=>p(`header`,e),t[26]=p,t[27]=k);let A;t[28]===m?A=t[29]:(A=(e,t)=>m(`header`,e,t),t[28]=m,t[29]=A);let j;t[30]!==l||t[31]!==d.header||t[32]!==u||t[33]!==O||t[34]!==k||t[35]!==A?(j=(0,Z.jsx)(lt,{form:l,onFormChange:u,headerEntries:d.header,onHeaderAdd:O,onHeaderRemove:k,onHeaderUpdate:A}),t[30]=l,t[31]=d.header,t[32]=u,t[33]=O,t[34]=k,t[35]=A,t[36]=j):j=t[36];let M;t[37]===u?M=t[38]:(M=e=>u({defer:e}),t[37]=u,t[38]=M);let N;t[39]!==l.defer||t[40]!==M?(N=(0,Z.jsx)(st,{defer:l.defer,onDeferChange:M}),t[39]=l.defer,t[40]=M,t[41]=N):N=t[41];let P;t[42]===f?P=t[43]:(P=()=>f(`env`),t[42]=f,t[43]=P);let F;t[44]===p?F=t[45]:(F=e=>p(`env`,e),t[44]=p,t[45]=F);let I;t[46]===m?I=t[47]:(I=(e,t)=>m(`env`,e,t),t[46]=m,t[47]=I);let L;t[48]!==l.serverType||t[49]!==d.env||t[50]!==P||t[51]!==F||t[52]!==I?(L=(0,Z.jsx)(ot,{serverType:l.serverType,entries:d.env,onAdd:P,onRemove:F,onUpdate:I}),t[48]=l.serverType,t[49]=d.env,t[50]=P,t[51]=F,t[52]=I,t[53]=L):L=t[53];let R;t[54]===v?R=t[55]:(R=v&&(0,Z.jsx)(`p`,{className:i.error,children:v}),t[54]=v,t[55]=R);let z;t[56]!==b.handleDelete||t[57]!==b.handleSave||t[58]!==S||t[59]!==_||t[60]!==ee||t[61]!==x||t[62]!==g?(z=(0,Z.jsx)(ft,{isEditing:x,busy:S,saving:g,deleting:_,hasChanges:ee,onSave:b.handleSave,onDelete:b.handleDelete}),t[56]=b.handleDelete,t[57]=b.handleSave,t[58]=S,t[59]=_,t[60]=ee,t[61]=x,t[62]=g,t[63]=z):z=t[63];let B;t[64]!==j||t[65]!==N||t[66]!==L||t[67]!==R||t[68]!==z||t[69]!==D?(B=(0,Z.jsxs)(`div`,{children:[D,j,N,L,R,z]}),t[64]=j,t[65]=N,t[66]=L,t[67]=R,t[68]=z,t[69]=D,t[70]=B):B=t[70];let V;return t[71]!==B||t[72]!==T?(V=(0,Z.jsx)(ae,{children:(0,Z.jsxs)(ue,{children:[T,B]})}),t[71]=B,t[72]=T,t[73]=V):V=t[73],V}function mt(e){if(!e)return null;let t=new Date(e).getTime();if(Number.isNaN(t))return null;let n=Math.max(0,Math.round((Date.now()-t)/1e3));if(n<60)return`just now`;let r=Math.round(n/60);if(r<60)return`${r}m ago`;let i=Math.round(r/60);return i<24?`${i}h ago`:new Date(e).toLocaleDateString()}function ht(e){if(!e||e.state===`missing`||e.state===`stale`)return`Refresh to load tools`;if(e.state===`needs_auth`)return`Sign in required`;if(e.state===`error`)return e.error??`Could not load tools`;let t=e.tools.length,n=t===1?`1 tool`:`${t} tools`,r=mt(e.refreshedAt);return r?`${n} · refreshed ${r}`:n}function gt(e){let t=(0,Y.c)(69),{name:n,config:r,catalog:a,remote:l,authorized:u,oauthBusy:d,refreshing:f,onEdit:p,onRefresh:m,onDelete:_,onSignIn:v,onSignOut:y}=e,[b,w]=(0,X.useState)(!1),T;if(t[0]!==u||t[1]!==a||t[2]!==r.args||t[3]!==r.command||t[4]!==r.url||t[5]!==b||t[6]!==n||t[7]!==d||t[8]!==_||t[9]!==p||t[10]!==m||t[11]!==v||t[12]!==y||t[13]!==f||t[14]!==l){let e=a?.state===`ok`?a.tools.map(yt):[],E;t[16]!==r.args||t[17]!==r.command||t[18]!==r.url?(E=r.url?r.url:`${r.command??``} ${r.args?.join(` `)??``}`.trim(),t[16]=r.args,t[17]=r.command,t[18]=r.url,t[19]=E):E=t[19];let D=E,O;t[20]===Symbol.for(`react.memo_cache_sentinel`)?(O=h(i.body,`truncate`),t[20]=O):O=t[20];let k;t[21]===n?k=t[22]:(k=(0,Z.jsx)(`div`,{className:O,children:n}),t[21]=n,t[22]=k);let A;t[23]===Symbol.for(`react.memo_cache_sentinel`)?(A=h(i.compact,`truncate text-muted-foreground font-mono`),t[23]=A):A=t[23];let j;t[24]===D?j=t[25]:(j=(0,Z.jsx)(`div`,{className:A,children:D}),t[24]=D,t[25]=j);let M;t[26]===Symbol.for(`react.memo_cache_sentinel`)?(M=h(i.caption,`truncate text-muted-foreground`),t[26]=M):M=t[26];let N;t[27]===a?N=t[28]:(N=ht(a),t[27]=a,t[28]=N);let P;t[29]===N?P=t[30]:(P=(0,Z.jsx)(`div`,{className:M,children:N}),t[29]=N,t[30]=P);let F;t[31]!==p||t[32]!==k||t[33]!==j||t[34]!==P?(F=(0,Z.jsxs)(`button`,{type:`button`,onClick:p,className:`min-w-0 text-left`,children:[k,j,P]}),t[31]=p,t[32]=k,t[33]=j,t[34]=P,t[35]=F):F=t[35];let I;t[36]!==u||t[37]!==d||t[38]!==v||t[39]!==y||t[40]!==l?(I=l&&(0,Z.jsx)(g,{type:`button`,variant:u?`outline`:`secondary`,size:`sm`,disabled:d,onClick:()=>{u?y():v()},children:d?`Working…`:u?`Sign out`:`Sign in`}),t[36]=u,t[37]=d,t[38]=v,t[39]=y,t[40]=l,t[41]=I):I=t[41];let L=`Refresh ${n} tools`,R=f&&`animate-spin`,z;t[42]===R?z=t[43]:(z=h(`h-4 w-4`,R),t[42]=R,t[43]=z);let B;t[44]===z?B=t[45]:(B=(0,Z.jsx)(o,{className:z}),t[44]=z,t[45]=B);let V;t[46]!==m||t[47]!==f||t[48]!==L||t[49]!==B?(V=(0,Z.jsx)(x,{asChild:!0,children:(0,Z.jsx)(g,{type:`button`,variant:`ghost`,size:`icon-sm`,disabled:f,onClick:m,"aria-label":L,children:B})}),t[46]=m,t[47]=f,t[48]=L,t[49]=B,t[50]=V):V=t[50];let te;t[51]===Symbol.for(`react.memo_cache_sentinel`)?(te=(0,Z.jsx)(S,{children:`Refresh tools`}),t[51]=te):te=t[51];let H;t[52]===V?H=t[53]:(H=(0,Z.jsx)(C,{children:(0,Z.jsxs)(ee,{children:[V,te]})}),t[52]=V,t[53]=H);let ne=e.length>0&&(0,Z.jsx)(g,{type:`button`,variant:`ghost`,size:`icon-sm`,"aria-expanded":b,"aria-label":b?`Hide tools`:`Show tools`,onClick:()=>w(vt),children:(0,Z.jsx)(s,{className:h(`h-4 w-4 transition-transform`,b&&`rotate-180`)})}),U;t[54]!==I||t[55]!==H||t[56]!==ne?(U=(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[I,H,ne]}),t[54]=I,t[55]=H,t[56]=ne,t[57]=U):U=t[57];let W=`Delete ${n}`,re;t[58]===Symbol.for(`react.memo_cache_sentinel`)?(re=(0,Z.jsx)(c,{className:`h-4 w-4`}),t[58]=re):re=t[58];let G;t[59]!==_||t[60]!==W?(G=(0,Z.jsx)(x,{asChild:!0,children:(0,Z.jsx)(g,{type:`button`,variant:`ghost`,size:`icon-sm`,className:`shrink-0 items-center justify-center text-muted-foreground opacity-0 pointer-events-none can-hover:group-hover:opacity-100 can-hover:group-hover:pointer-events-auto can-hover:hover:bg-destructive can-hover:hover:text-destructive-foreground transition-[opacity,color,background-color]`,onClick:_,"aria-label":W,children:re})}),t[59]=_,t[60]=W,t[61]=G):G=t[61];let ie;t[62]===Symbol.for(`react.memo_cache_sentinel`)?(ie=(0,Z.jsx)(S,{children:`Remove this MCP server from the project`}),t[62]=ie):ie=t[62];let K;t[63]===G?K=t[64]:(K=(0,Z.jsx)(C,{children:(0,Z.jsxs)(ee,{children:[G,ie]})}),t[63]=G,t[64]=K);let q;t[65]!==F||t[66]!==U||t[67]!==K?(q=(0,Z.jsxs)(`div`,{className:`grid min-h-13 grid-cols-[minmax(0,1fr)_auto_1.75rem] items-center gap-3`,children:[F,U,K]}),t[65]=F,t[66]=U,t[67]=K,t[68]=q):q=t[68],T=(0,Z.jsxs)(`div`,{className:`group px-3 py-3 hover:bg-muted/30`,children:[q,b&&e.length>0&&(0,Z.jsx)(`ul`,{className:h(i.caption,`mt-2 space-y-1 pl-1 text-muted-foreground`),children:e.map(_t)})]}),t[0]=u,t[1]=a,t[2]=r.args,t[3]=r.command,t[4]=r.url,t[5]=b,t[6]=n,t[7]=d,t[8]=_,t[9]=p,t[10]=m,t[11]=v,t[12]=y,t[13]=f,t[14]=l,t[15]=T}else T=t[15];return T}function _t(e){return(0,Z.jsx)(`li`,{className:`font-mono truncate`,children:e},e)}function vt(e){return!e}function yt(e){return e.name}var bt=`https://tarsk.io/skills/mcp/`;function xt(e){return e.name.toLowerCase().replace(/\s+/g,`-`)}function St(e){return typeof e.url==`string`&&e.url.trim().length>0}function Ct(){let e=a(e=>e.selectedProjectId),t=a(e=>e.projects).find(t=>t.projectId===e)?.projectPath,{installedServers:n,catalog:r,loadingConfig:c,loadInstalledServers:f}=q(t),{popularServers:m,loadingPopular:A}=k(),{openChatDockPanel:F}=O(),{setPendingExplorerPath:L,triggerExplorerRefresh:R}=D(),[V,U]=(0,X.useState)(!1),[W,K]=(0,X.useState)(null),[ae,oe]=(0,X.useState)(null),[le,ue]=(0,X.useState)(null),[J,fe]=(0,X.useState)(!1),[_e,Y]=(0,X.useState)({}),[ve,ye]=(0,X.useState)(null),[be,Q]=(0,X.useState)(null),$=(0,X.useCallback)(async()=>{if(!t){Y({});return}let e=n.filter(e=>St(e.config));if(e.length===0){Y({});return}let r=await Promise.all(e.map(async e=>{try{let n=await y(t,e.name);return[e.name,n.authorized]}catch{return[e.name,!1]}}));Y(Object.fromEntries(r))},[t,n]);(0,X.useEffect)(()=>{$()},[$]);let xe=(0,X.useCallback)(async e=>{if(t){fe(!0);try{await N(t,e),await f(),R(),w({title:`MCP server removed`,description:e}),ue(null)}catch(e){w({title:`Error`,description:e instanceof Error?e.message:`Failed to remove server`,variant:`destructive`})}finally{fe(!1)}}},[t,f,R]),Se=(0,X.useCallback)(async e=>{if(t){ye(e);try{let n=await v(t,e);await $(),await f(),w({title:`Signed in`,description:n.catalog?`${e} · ${M(n.catalog)}`:`Connected to ${e}`})}catch(e){w({title:`Sign in failed`,description:e instanceof Error?e.message:`OAuth authorization failed`,variant:`destructive`})}finally{ye(null)}}},[t,$,f]),Ce=(0,X.useCallback)(async e=>{if(t){ye(e);try{await b(t,e),await $(),await f(),w({title:`Signed out`,description:e})}catch(e){w({title:`Sign out failed`,description:e instanceof Error?e.message:`Failed to revoke OAuth credentials`,variant:`destructive`})}finally{ye(null)}}},[t,$,f]),we=(0,X.useCallback)(async e=>{if(t){Q(e??`all`);try{let n=await te(t,e);await f();let r=Object.values(n.catalog),[i]=r;if(i)w({title:`Tools refreshed`,description:`${i.serverName} · ${M(i)}`});else{let e=r.filter(e=>e.state===`ok`).length;w({title:`Tools refreshed`,description:`${e}/${r.length} servers loaded`})}}catch(e){w({title:`Refresh failed`,description:e instanceof Error?e.message:`Could not refresh MCP tools`,variant:`destructive`})}finally{Q(null)}}},[t,f]),Te=(0,X.useCallback)(()=>{L(`.agents/mcp.json`),F(`explorer`)},[L,F]),Ee=(0,X.useCallback)(async e=>{if(!t)return;let r=xt(e);if(!n.some(t=>t.name===r||t.name===e.id)){if(e.url!==void 0){if(!e.url.trim()){K({name:r,config:{url:``,transport:e.transport??`sse`,...Object.keys(e.env??{}).length>0?{env:e.env}:{}}}),U(!0);return}try{let n=await se(t,r,{url:e.url,transport:e.transport??`sse`,...Object.keys(e.env??{}).length>0?{env:e.env}:{}});await f(),R(),w({title:`MCP server installed`,description:`${e.name} · ${M(n.catalog)}`})}catch(e){w({title:`Error`,description:e instanceof Error?e.message:`Failed to install server`,variant:`destructive`})}return}if(!e.command){w({title:`Error`,description:`This server is missing install configuration.`,variant:`destructive`});return}try{let n=await se(t,r,{command:e.command,args:e.args??[],...Object.keys(e.env??{}).length>0?{env:e.env}:{}});await f(),R(),w({title:`MCP server installed`,description:`${e.name} · ${M(n.catalog)}`})}catch(e){w({title:`Error`,description:e instanceof Error?e.message:`Failed to install server`,variant:`destructive`})}}},[t,n,f,R]),De=he(e,[c,A]);return e?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(re,{loading:De,children:(0,Z.jsxs)(B,{className:`shrink-0`,children:[(0,Z.jsx)(de,{title:`Installed MCP Servers`,description:`MCP servers configured for this project.`,action:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(g,{variant:`ghost`,onClick:Te,children:`Config`}),n.length>=2&&(0,Z.jsxs)(g,{variant:`ghost`,className:`gap-1`,disabled:be!==null,onClick:()=>void we(),children:[(0,Z.jsx)(o,{className:h(`h-4 w-4`,be===`all`&&`animate-spin`)}),`Refresh all`]}),(0,Z.jsxs)(ne,{children:[(0,Z.jsx)(G,{asChild:!0,children:(0,Z.jsxs)(g,{className:`gap-1`,children:[`Add Server`,(0,Z.jsx)(s,{className:`h-4 w-4 opacity-70`})]})}),(0,Z.jsxs)(I,{align:`end`,className:`w-56`,children:[(0,Z.jsxs)(z,{className:h(i.body,`gap-2`),onSelect:()=>U(!0),children:[(0,Z.jsx)(u,{className:`h-4 w-4 shrink-0`}),`Manual Entry`]}),(0,Z.jsxs)(j,{children:[(0,Z.jsxs)(P,{className:h(i.body,`gap-2`),children:[(0,Z.jsx)(l,{className:`h-4 w-4 shrink-0`}),`Popular`]}),(0,Z.jsx)(ie,{className:`w-80 max-h-80 overflow-y-auto`,children:A?(0,Z.jsx)(z,{disabled:!0,className:i.bodyMuted,children:`Loading…`}):m.length===0?(0,Z.jsx)(z,{disabled:!0,className:i.bodyMuted,children:`No available servers`}):[...m].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>{let t=xt(e),r=n.some(n=>n.name===t||n.name===e.id);return(0,Z.jsx)(C,{children:(0,Z.jsxs)(ee,{children:[(0,Z.jsx)(x,{asChild:!0,children:(0,Z.jsxs)(z,{className:h(i.body,`gap-2`,r&&`opacity-50 cursor-not-allowed`),onSelect:()=>{r||Ee(e)},children:[(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e.name}),r&&(0,Z.jsx)(d,{className:`h-4 w-4 shrink-0 text-muted-foreground`})]})}),(0,Z.jsx)(S,{side:`right`,className:`max-w-64`,children:e.description})]})},e.id)})})]}),(0,Z.jsx)(pe,{}),(0,Z.jsxs)(z,{className:h(i.body,`gap-2`),onSelect:()=>void _(bt),children:[(0,Z.jsx)(p,{className:`h-4 w-4 shrink-0`}),`Marketplace`]})]})]})]}),sticky:!1}),(0,Z.jsx)(ce,{className:`pt-6`,children:n.length===0?(0,Z.jsx)(ge,{icon:l,title:`Connect your agent to tools, APIs, and data sources`,bordered:!1}):(0,Z.jsx)(`div`,{className:`divide-y divide-table-border`,children:n.map(e=>(0,Z.jsx)(gt,{name:e.name,config:e.config,catalog:r[e.name],remote:St(e.config),authorized:_e[e.name]===!0,oauthBusy:ve===e.name,refreshing:be===e.name||be===`all`,onEdit:()=>oe(e.name),onRefresh:()=>void we(e.name),onDelete:()=>ue(e.name),onSignIn:()=>void Se(e.name),onSignOut:()=>void Ce(e.name)},e.name))})})]})}),(0,Z.jsx)(E,{open:V,onOpenChange:e=>{U(e),e||K(null)},children:(0,Z.jsx)(T,{className:`max-w-2xl max-h-[90vh] overflow-y-auto p-0`,children:(0,Z.jsx)(pt,{projectPath:t,initialName:W?.name,initialConfig:W?.config,onBack:()=>{U(!1),K(null),f(),R()}})})}),(0,Z.jsx)(E,{open:ae!==null,onOpenChange:e=>{e||oe(null)},children:(0,Z.jsx)(T,{className:`max-w-2xl max-h-[90vh] overflow-y-auto p-0`,children:(0,Z.jsx)(pt,{projectPath:t,serverName:ae??void 0,onBack:()=>{oe(null),f(),R()}})})}),(0,Z.jsx)(me,{open:le!==null,onOpenChange:e=>!e&&ue(null),title:`Delete MCP Server`,description:`Are you sure you want to delete the server "${le}"? This action cannot be undone.`,onConfirm:()=>{le&&xe(le)},confirming:J})]}):(0,Z.jsx)(H,{children:`Select a project to manage MCP servers.`})}export{Ct as SettingsMCPServersView,Ct as default};
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,o as n,t as r}from"./react-vendor-Ee0-5T4I.js";import{ot as i}from"./dist-BWuYHVi8.js";import{Q as a,n as o}from"./store-BaMSfYoJ.js";import{n as s,t as c}from"./utils-CT-Dw22R.js";import{t as l}from"./button-DeNw35VZ.js";import{B as u,L as d,R as f,U as p,V as m,kt as h}from"./api-BMo_Lz8f.js";import{r as g}from"./tooltip-B6ziVyTv.js";import{n as _}from"./async-loading-fallback-B_JNgWJR.js";import{t as v}from"./suspense-resource-DnYnmTbs.js";import{t as y}from"./use-suspense-resource-Dkz6ddFN.js";import{Bn as b,Et as x,I as S,In as C,L as w,Ln as ee,Nn as T,On as E,kn as D,o as O,pn as te}from"./index-DjaVbFDB.js";import{a as k,i as A,n as j,r as M,t as N}from"./table-B3fLagUj.js";import{n as P,t as ne}from"./toggle-group-5tREtjoW.js";import{n as F,t as I}from"./commit-method-fields-CD3PTIox.js";import{t as L}from"./async-error-boundary-J8P6NVvc.js";import{t as re}from"./sorting-DqwxPMRN.js";import{o as ie,s as R}from"./settings-list-DU82HNPX.js";import{t as ae}from"./use-deferred-search-Dgxosq55.js";import{n as oe,r as z,t as B}from"./model-list-controls-D86_87E4.js";var V=e(n(),1),H=t();function U(e){return`settings-models:coding:${e}`}function W(e){return`settings-models:image:${e}`}async function G(){let e=(await h()).filter(e=>e.apiKey),t=await p(`coding`),n={},r={};for(let i of e){let e=t[i.slug];n[i.slug]=e?.models??[],r[i.slug]=new Set(e?.enabledModelIds??[])}return{providers:e,allModels:n,enabledModelIds:r}}async function K(e){let t=e.filter(e=>e.name.toLowerCase()===`openrouter`),n=await p(`image`),r={},i={};for(let e of t){let t=n[e.slug];r[e.slug]=t?.models??[],i[e.slug]=new Set(t?.enabledModelIds??[])}return{allImageModels:r,enabledImageModelIds:i}}var q=r(),J=`table-fixed`,se=`h-9`,ce=c(i.body,`py-1.5`),le=`w-10 py-1.5`,ue=`w-24 py-1.5 text-right`,de=c(i.body,`w-20 py-1.5 text-right text-muted-foreground tabular-nums`),fe=c(i.body,`w-48 py-1.5 text-right text-muted-foreground whitespace-nowrap tabular-nums`),pe=`h-9 w-24 bg-transparent py-2 text-right`,me=`h-9 w-20 bg-transparent py-2 text-right`,he=`h-9 w-48 bg-transparent py-2 text-right`;function Y(e){return!e||(e.prompt??0)===0&&(e.completion??0)===0?``:`$${s(e.prompt??0)} in | $${s(e.completion??0)} out`}function ge(e){return e==null||!Number.isFinite(e)||e<=0?``:e>=100?Math.round(e).toLocaleString():e.toFixed(1)}function X(e){let t=(0,H.c)(9),{showIntelligence:n}=e,r;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(r=c(`w-full caption-bottom`,J,i.body),t[0]=r):r=t[0];let a,o;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,q.jsx)(A,{className:`h-9 w-10 bg-transparent py-2`}),o=(0,q.jsx)(A,{className:`h-9 bg-transparent py-2`,children:`Model`}),t[1]=a,t[2]=o):(a=t[1],o=t[2]);let s;t[3]===n?s=t[4]:(s=n?(0,q.jsx)(A,{className:pe,children:`Intelligence`}):null,t[3]=n,t[4]=s);let l,u;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,q.jsx)(A,{className:me,children:`TPS`}),u=(0,q.jsx)(A,{className:he,children:`Pricing`}),t[5]=l,t[6]=u):(l=t[5],u=t[6]);let d;return t[7]===s?d=t[8]:(d=(0,q.jsx)(`table`,{className:r,children:(0,q.jsx)(`thead`,{className:`[&_tr]:border-b [&_tr]:border-table-border`,children:(0,q.jsxs)(`tr`,{children:[a,o,s,l,u]})})}),t[7]=s,t[8]=d),d}function Z(e){let t=(0,H.c)(15),{models:n,enabledIds:r,checkboxIdPrefix:a,showIntelligence:o,getModelDisplayName:s,onToggleModel:l}=e,u;if(t[0]!==a||t[1]!==r||t[2]!==s||t[3]!==n||t[4]!==l||t[5]!==o){let e;t[7]!==a||t[8]!==r||t[9]!==s||t[10]!==l||t[11]!==o?(e=e=>{let t=`${a}${e.id}`;return(0,q.jsxs)(k,{className:se,children:[(0,q.jsx)(M,{className:le,children:(0,q.jsx)(O,{id:t,checked:r.has(e.id),onCheckedChange:()=>l(e.id),className:`mt-0`})}),(0,q.jsx)(M,{className:ce,children:(0,q.jsx)(`label`,{htmlFor:t,className:c(i.body,`cursor-pointer truncate peer-disabled:cursor-not-allowed peer-disabled:opacity-70`),children:s(e)})}),o?(0,q.jsx)(M,{className:ue,children:(0,q.jsx)(`div`,{className:`flex justify-end`,children:(0,q.jsx)(z,{codingIndex:e.coding_index,modelName:s(e)})})}):null,(0,q.jsx)(M,{className:de,children:ge(e.avgTPS)}),(0,q.jsx)(M,{className:fe,children:Y(e.pricing)})]},e.id)},t[7]=a,t[8]=r,t[9]=s,t[10]=l,t[11]=o,t[12]=e):e=t[12],u=n.map(e),t[0]=a,t[1]=r,t[2]=s,t[3]=n,t[4]=l,t[5]=o,t[6]=u}else u=t[6];let d;return t[13]===u?d=t[14]:(d=(0,q.jsx)(N,{className:J,children:(0,q.jsx)(j,{children:u})}),t[13]=u,t[14]=d),d}function Q(e){let t=(0,H.c)(25),{providerName:n,providerSlug:r,action:a,tableHeader:o,children:s}=e,l;t[0]!==n||t[1]!==r?(l=(0,q.jsx)(x,{provider:{name:n,slug:r}}),t[0]=n,t[1]=r,t[2]=l):l=t[2];let u;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(u=c(i.pageTitle,`truncate`),t[3]=u):u=t[3];let d;t[4]===n?d=t[5]:(d=(0,q.jsx)(`h2`,{className:u,children:n}),t[4]=n,t[5]=d);let f;t[6]!==l||t[7]!==d?(f=(0,q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3`,children:[l,d]}),t[6]=l,t[7]=d,t[8]=f):f=t[8];let p;t[9]===a?p=t[10]:(p=a?(0,q.jsx)(`div`,{className:`electrobun-webkit-app-region-no-drag shrink-0`,children:a}):null,t[9]=a,t[10]=p);let m;t[11]!==f||t[12]!==p?(m=(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-b border-divider px-6 py-4 electrobun-webkit-app-region-drag`,children:[f,p]}),t[11]=f,t[12]=p,t[13]=m):m=t[13];let h;t[14]===o?h=t[15]:(h=o?(0,q.jsx)(`div`,{className:`electrobun-webkit-app-region-no-drag px-6 pb-2 pt-4`,children:o}):null,t[14]=o,t[15]=h);let g=o?`pt-0`:`pt-6`,_;t[16]===g?_=t[17]:(_=c(`px-6 pb-6`,g),t[16]=g,t[17]=_);let v;t[18]!==s||t[19]!==_?(v=(0,q.jsx)(`div`,{className:_,children:s}),t[18]=s,t[19]=_,t[20]=v):v=t[20];let y;return t[21]!==v||t[22]!==m||t[23]!==h?(y=(0,q.jsxs)(b,{className:`shrink-0`,children:[m,h,v]}),t[21]=v,t[22]=m,t[23]=h,t[24]=y):y=t[24],y}function _e({providers:e,globalSearchQuery:t,modelSortBy:n,filterAndSortModels:r,getModelDisplayName:i,onSaveStatus:s}){let c=o(),l=y(W(0),()=>K(e)),[f]=(0,V.useState)(l.allImageModels),[p,m]=(0,V.useState)(l.enabledImageModelIds);async function h(e,t){try{p[e]?.has(t)?(await d(e,t),m(n=>{let r=new Set(n[e]??[]);return r.delete(t),{...n,[e]:r}})):(await u(e,t),m(n=>({...n,[e]:new Set([...n[e]||[],t])}))),c({type:a.ConfigUpdated}),s(`Model preferences saved successfully`)}catch(e){s(e instanceof Error?e.message:`Failed to save model changes`)}}async function _(e,t){let n=f[e],r=p[e];if(n)for(let i of n)r?.has(i.id)!==t&&await h(e,i.id)}return(0,q.jsx)(q.Fragment,{children:e.filter(e=>e.name.toLowerCase()===`openrouter`).map(e=>{let a=f[e.slug]||[],o=p[e.slug]||new Set,s=r(a,o,n);return s.length===0&&t?null:(0,q.jsx)(Q,{providerName:e.name,providerSlug:e.slug,action:s.length>0?(0,q.jsx)(B,{id:`select-all-image-${e.slug}`,checked:s.every(e=>o.has(e.id)),onChange:t=>void _(e.slug,t)}):null,tableHeader:s.length>0?(0,q.jsx)(X,{showIntelligence:!1}):void 0,children:s.length===0?(0,q.jsx)(R,{message:t?`No models matching your search.`:`No image models available for this provider.`}):(0,q.jsx)(g,{children:(0,q.jsx)(Z,{models:s,enabledIds:o,checkboxIdPrefix:`image-`,showIntelligence:!1,getModelDisplayName:i,onToggleModel:t=>void h(e.slug,t)})})},e.slug)})})}function ve({loadVersion:e}){let t=o(),n=y(U(e),()=>G()),r=n.providers,[s]=(0,V.useState)(n.allModels),[l,u]=(0,V.useState)(n.enabledModelIds),[d,p]=(0,V.useState)(`coding`),{query:h,setQuery:v,deferredQuery:x}=ae(),[O,k]=(0,V.useState)(`alphabetical`),[A,j]=(0,V.useState)(``),M=e=>te(e.id),N=async(e,n)=>{try{l[e]?.has(n)?(await f(e,n),u(t=>{let r=new Set(t[e]??[]);return r.delete(n),{...t,[e]:r}})):(await m(e,n),u(t=>({...t,[e]:new Set([...t[e]||[],n])}))),t({type:a.ConfigUpdated}),j(`Model preferences saved successfully`),setTimeout(()=>j(``),3e3)}catch(e){j(e instanceof Error?e.message:`Failed to save model changes`)}},L=async(e,t)=>{let n=s[e],r=l[e];if(n)for(let i of n)r?.has(i.id)!==t&&await N(e,i.id)},z=(e,t,n)=>re({models:e,query:x,sortBy:n,getDisplayName:M,getPriority:e=>+!t.has(e.id)});if(r.length===0)return(0,q.jsx)(C,{title:`No providers configured`,children:`Configure a provider with an API key to view available models.`});let H=r.some(e=>e.name.toLowerCase()===`openrouter`);return(0,q.jsx)(T,{loading:!1,children:(0,q.jsxs)(S,{value:d,className:`flex flex-col gap-2.5`,children:[(0,q.jsxs)(b,{className:`shrink-0`,children:[(0,q.jsx)(D,{title:`Models`,description:`View and manage available models from your configured providers.`,action:(0,q.jsx)(ie,{placeholder:`Search`,value:h,onChange:v,className:`mb-0 w-64`}),sticky:!1}),(0,q.jsx)(ee,{className:`max-w-none pt-6`,children:(0,q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[H?(0,q.jsxs)(ne,{type:`single`,value:d,onValueChange:e=>{(e===`coding`||e===`image`)&&(p(e),v(``))},"aria-label":`Model type`,className:c(I,`shrink-0`),children:[(0,q.jsx)(P,{value:`coding`,"aria-label":`Coding`,className:c(i.body,F),children:`Coding`}),(0,q.jsx)(P,{value:`image`,"aria-label":`Image`,className:c(i.body,F),children:`Image`})]}):null,A?(0,q.jsx)(E,{variant:A.includes(`error`)||A.includes(`Failed`)?`error`:`success`,className:`mb-0 shrink-0`,children:A}):null,(0,q.jsx)(`div`,{className:`ml-auto shrink-0`,children:(0,q.jsx)(oe,{sortBy:O,showCodingIndex:d===`coding`,showIntelligenceByPrice:d===`coding`,onSortByChange:k})})]})})]}),(0,q.jsx)(w,{value:`coding`,className:`mt-0 flex flex-col gap-2.5`,children:r.map(e=>{let t=s[e.slug]||[],n=l[e.slug]||new Set,r=z(t,n,O);return r.length===0&&h?null:(0,q.jsx)(Q,{providerName:e.name,providerSlug:e.slug,action:r.length>0?(0,q.jsx)(B,{id:`select-all-${e.slug}`,checked:r.every(e=>n.has(e.id)),onChange:t=>void L(e.slug,t)}):null,tableHeader:r.length>0?(0,q.jsx)(X,{showIntelligence:O===`coding-index`||O===`intelligence-by-price`}):void 0,children:r.length===0?(0,q.jsx)(R,{message:h?`No models matching your search.`:`No models available for this provider.`}):(0,q.jsx)(g,{children:(0,q.jsx)(Z,{models:r,enabledIds:n,checkboxIdPrefix:``,showIntelligence:O===`coding-index`||O===`intelligence-by-price`,getModelDisplayName:M,onToggleModel:t=>void N(e.slug,t)})})},e.slug)})}),(0,q.jsx)(w,{value:`image`,className:`mt-0 flex flex-col gap-2.5`,children:d===`image`?(0,q.jsx)(V.Suspense,{fallback:(0,q.jsx)(_,{className:`py-12`,size:`sm`}),children:(0,q.jsx)(_e,{providers:r,globalSearchQuery:h,modelSortBy:O,filterAndSortModels:z,getModelDisplayName:M,onSaveStatus:e=>{j(e),e.includes(`Failed`)||setTimeout(()=>j(``),3e3)}})}):null})]})})}function $(){let e=(0,H.c)(8),[t,n]=(0,V.useState)(0),r;e[0]===t?r=e[1]:(r=function(){v(U(t)),n(be)},e[0]=t,e[1]=r);let i=r,a;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,q.jsx)(_,{label:`Loading models...`,size:`lg`}),e[2]=a):a=e[2];let o;e[3]===t?o=e[4]:(o=(0,q.jsx)(V.Suspense,{fallback:a,children:(0,q.jsx)(ve,{loadVersion:t},t)}),e[3]=t,e[4]=o);let s;return e[5]!==i||e[6]!==o?(s=(0,q.jsx)(`div`,{className:`h-full min-h-0`,children:(0,q.jsx)(L,{fallbackTitle:`Failed to load models`,onRetry:i,renderFallback:ye,children:o})}),e[5]=i,e[6]=o,e[7]=s):s=e[7],s}function ye(e,t){return(0,q.jsx)(C,{title:`Failed to load models`,action:(0,q.jsx)(l,{variant:`outline`,onClick:t,children:`Retry`}),children:e.message})}function be(e){return e+1}export{$ as SettingsModelsView,$ as default};
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,o as n,t as r}from"./react-vendor-Ee0-5T4I.js";import{ot as i}from"./dist-DjiNKpTV.js";import{Q as a,n as o}from"./store-CHF6tOp2.js";import{n as s,t as c}from"./utils-CT-Dw22R.js";import{t as l}from"./button-B6HDsfd5.js";import{B as u,L as d,R as f,U as p,V as m,kt as h}from"./api-D1GxdEEp.js";import{r as g}from"./tooltip-BtJG5fZl.js";import{n as _}from"./async-loading-fallback-D2X0o4Qa.js";import{t as v}from"./suspense-resource-DnYnmTbs.js";import{t as y}from"./use-suspense-resource-Dkz6ddFN.js";import{Dt as b,I as x,L as S,Mn as C,On as w,Tn as ee,bn as T,hn as E,kn as D,o as O,xn as te}from"./index-BOB3ZUQs.js";import{a as k,i as A,n as j,r as M,t as N}from"./table-MUx4ZxvS.js";import{n as P,t as ne}from"./toggle-group-DMR7z3pz.js";import{n as F,t as I}from"./commit-method-fields-BihSf23f.js";import{t as L}from"./async-error-boundary-DNJqC4BV.js";import{t as re}from"./sorting-DqwxPMRN.js";import{o as ie,s as R}from"./settings-list-BpPbGcpS.js";import{t as ae}from"./use-deferred-search-Dgxosq55.js";import{n as oe,r as z,t as B}from"./model-list-controls-CpQjn6i7.js";var V=e(n(),1),H=t();function U(e){return`settings-models:coding:${e}`}function W(e){return`settings-models:image:${e}`}async function G(){let e=(await h()).filter(e=>e.apiKey),t=await p(`coding`),n={},r={};for(let i of e){let e=t[i.slug];n[i.slug]=e?.models??[],r[i.slug]=new Set(e?.enabledModelIds??[])}return{providers:e,allModels:n,enabledModelIds:r}}async function K(e){let t=e.filter(e=>e.name.toLowerCase()===`openrouter`),n=await p(`image`),r={},i={};for(let e of t){let t=n[e.slug];r[e.slug]=t?.models??[],i[e.slug]=new Set(t?.enabledModelIds??[])}return{allImageModels:r,enabledImageModelIds:i}}var q=r(),J=`table-fixed`,se=`h-9`,ce=c(i.body,`py-1.5`),le=`w-10 py-1.5`,ue=`w-24 py-1.5 text-right`,de=c(i.body,`w-20 py-1.5 text-right text-muted-foreground tabular-nums`),fe=c(i.body,`w-48 py-1.5 text-right text-muted-foreground whitespace-nowrap tabular-nums`),pe=`h-9 w-24 bg-transparent py-2 text-right`,me=`h-9 w-20 bg-transparent py-2 text-right`,he=`h-9 w-48 bg-transparent py-2 text-right`;function Y(e){return!e||(e.prompt??0)===0&&(e.completion??0)===0?``:`$${s(e.prompt??0)} in | $${s(e.completion??0)} out`}function ge(e){return e==null||!Number.isFinite(e)||e<=0?``:e>=100?Math.round(e).toLocaleString():e.toFixed(1)}function X(e){let t=(0,H.c)(9),{showIntelligence:n}=e,r;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(r=c(`w-full caption-bottom`,J,i.body),t[0]=r):r=t[0];let a,o;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,q.jsx)(A,{className:`h-9 w-10 bg-transparent py-2`}),o=(0,q.jsx)(A,{className:`h-9 bg-transparent py-2`,children:`Model`}),t[1]=a,t[2]=o):(a=t[1],o=t[2]);let s;t[3]===n?s=t[4]:(s=n?(0,q.jsx)(A,{className:pe,children:`Intelligence`}):null,t[3]=n,t[4]=s);let l,u;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,q.jsx)(A,{className:me,children:`TPS`}),u=(0,q.jsx)(A,{className:he,children:`Pricing`}),t[5]=l,t[6]=u):(l=t[5],u=t[6]);let d;return t[7]===s?d=t[8]:(d=(0,q.jsx)(`table`,{className:r,children:(0,q.jsx)(`thead`,{className:`[&_tr]:border-b [&_tr]:border-table-border`,children:(0,q.jsxs)(`tr`,{children:[a,o,s,l,u]})})}),t[7]=s,t[8]=d),d}function Z(e){let t=(0,H.c)(15),{models:n,enabledIds:r,checkboxIdPrefix:a,showIntelligence:o,getModelDisplayName:s,onToggleModel:l}=e,u;if(t[0]!==a||t[1]!==r||t[2]!==s||t[3]!==n||t[4]!==l||t[5]!==o){let e;t[7]!==a||t[8]!==r||t[9]!==s||t[10]!==l||t[11]!==o?(e=e=>{let t=`${a}${e.id}`;return(0,q.jsxs)(k,{className:se,children:[(0,q.jsx)(M,{className:le,children:(0,q.jsx)(O,{id:t,checked:r.has(e.id),onCheckedChange:()=>l(e.id),className:`mt-0`})}),(0,q.jsx)(M,{className:ce,children:(0,q.jsx)(`label`,{htmlFor:t,className:c(i.body,`cursor-pointer truncate peer-disabled:cursor-not-allowed peer-disabled:opacity-70`),children:s(e)})}),o?(0,q.jsx)(M,{className:ue,children:(0,q.jsx)(`div`,{className:`flex justify-end`,children:(0,q.jsx)(z,{codingIndex:e.coding_index,modelName:s(e)})})}):null,(0,q.jsx)(M,{className:de,children:ge(e.avgTPS)}),(0,q.jsx)(M,{className:fe,children:Y(e.pricing)})]},e.id)},t[7]=a,t[8]=r,t[9]=s,t[10]=l,t[11]=o,t[12]=e):e=t[12],u=n.map(e),t[0]=a,t[1]=r,t[2]=s,t[3]=n,t[4]=l,t[5]=o,t[6]=u}else u=t[6];let d;return t[13]===u?d=t[14]:(d=(0,q.jsx)(N,{className:J,children:(0,q.jsx)(j,{children:u})}),t[13]=u,t[14]=d),d}function Q(e){let t=(0,H.c)(25),{providerName:n,providerSlug:r,action:a,tableHeader:o,children:s}=e,l;t[0]!==n||t[1]!==r?(l=(0,q.jsx)(b,{provider:{name:n,slug:r}}),t[0]=n,t[1]=r,t[2]=l):l=t[2];let u;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(u=c(i.pageTitle,`truncate`),t[3]=u):u=t[3];let d;t[4]===n?d=t[5]:(d=(0,q.jsx)(`h2`,{className:u,children:n}),t[4]=n,t[5]=d);let f;t[6]!==l||t[7]!==d?(f=(0,q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3`,children:[l,d]}),t[6]=l,t[7]=d,t[8]=f):f=t[8];let p;t[9]===a?p=t[10]:(p=a?(0,q.jsx)(`div`,{className:`electrobun-webkit-app-region-no-drag shrink-0`,children:a}):null,t[9]=a,t[10]=p);let m;t[11]!==f||t[12]!==p?(m=(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-b border-divider px-6 py-4 electrobun-webkit-app-region-drag`,children:[f,p]}),t[11]=f,t[12]=p,t[13]=m):m=t[13];let h;t[14]===o?h=t[15]:(h=o?(0,q.jsx)(`div`,{className:`electrobun-webkit-app-region-no-drag px-6 pb-2 pt-4`,children:o}):null,t[14]=o,t[15]=h);let g=o?`pt-0`:`pt-6`,_;t[16]===g?_=t[17]:(_=c(`px-6 pb-6`,g),t[16]=g,t[17]=_);let v;t[18]!==s||t[19]!==_?(v=(0,q.jsx)(`div`,{className:_,children:s}),t[18]=s,t[19]=_,t[20]=v):v=t[20];let y;return t[21]!==v||t[22]!==m||t[23]!==h?(y=(0,q.jsxs)(C,{className:`shrink-0`,children:[m,h,v]}),t[21]=v,t[22]=m,t[23]=h,t[24]=y):y=t[24],y}function _e({providers:e,globalSearchQuery:t,modelSortBy:n,filterAndSortModels:r,getModelDisplayName:i,onSaveStatus:s}){let c=o(),l=y(W(0),()=>K(e)),[f]=(0,V.useState)(l.allImageModels),[p,m]=(0,V.useState)(l.enabledImageModelIds);async function h(e,t){try{p[e]?.has(t)?(await d(e,t),m(n=>{let r=new Set(n[e]??[]);return r.delete(t),{...n,[e]:r}})):(await u(e,t),m(n=>({...n,[e]:new Set([...n[e]||[],t])}))),c({type:a.ConfigUpdated}),s(`Model preferences saved successfully`)}catch(e){s(e instanceof Error?e.message:`Failed to save model changes`)}}async function _(e,t){let n=f[e],r=p[e];if(n)for(let i of n)r?.has(i.id)!==t&&await h(e,i.id)}return(0,q.jsx)(q.Fragment,{children:e.filter(e=>e.name.toLowerCase()===`openrouter`).map(e=>{let a=f[e.slug]||[],o=p[e.slug]||new Set,s=r(a,o,n);return s.length===0&&t?null:(0,q.jsx)(Q,{providerName:e.name,providerSlug:e.slug,action:s.length>0?(0,q.jsx)(B,{id:`select-all-image-${e.slug}`,checked:s.every(e=>o.has(e.id)),onChange:t=>void _(e.slug,t)}):null,tableHeader:s.length>0?(0,q.jsx)(X,{showIntelligence:!1}):void 0,children:s.length===0?(0,q.jsx)(R,{message:t?`No models matching your search.`:`No image models available for this provider.`}):(0,q.jsx)(g,{children:(0,q.jsx)(Z,{models:s,enabledIds:o,checkboxIdPrefix:`image-`,showIntelligence:!1,getModelDisplayName:i,onToggleModel:t=>void h(e.slug,t)})})},e.slug)})})}function ve({loadVersion:e}){let t=o(),n=y(U(e),()=>G()),r=n.providers,[s]=(0,V.useState)(n.allModels),[l,u]=(0,V.useState)(n.enabledModelIds),[d,p]=(0,V.useState)(`coding`),{query:h,setQuery:v,deferredQuery:b}=ae(),[O,k]=(0,V.useState)(`alphabetical`),[A,j]=(0,V.useState)(``),M=e=>E(e.id),N=async(e,n)=>{try{l[e]?.has(n)?(await f(e,n),u(t=>{let r=new Set(t[e]??[]);return r.delete(n),{...t,[e]:r}})):(await m(e,n),u(t=>({...t,[e]:new Set([...t[e]||[],n])}))),t({type:a.ConfigUpdated}),j(`Model preferences saved successfully`),setTimeout(()=>j(``),3e3)}catch(e){j(e instanceof Error?e.message:`Failed to save model changes`)}},L=async(e,t)=>{let n=s[e],r=l[e];if(n)for(let i of n)r?.has(i.id)!==t&&await N(e,i.id)},z=(e,t,n)=>re({models:e,query:b,sortBy:n,getDisplayName:M,getPriority:e=>+!t.has(e.id)});if(r.length===0)return(0,q.jsx)(w,{title:`No providers configured`,children:`Configure a provider with an API key to view available models.`});let H=r.some(e=>e.name.toLowerCase()===`openrouter`);return(0,q.jsx)(ee,{loading:!1,children:(0,q.jsxs)(x,{value:d,className:`flex flex-col gap-2.5`,children:[(0,q.jsxs)(C,{className:`shrink-0`,children:[(0,q.jsx)(te,{title:`Models`,description:`View and manage available models from your configured providers.`,action:(0,q.jsx)(ie,{placeholder:`Search`,value:h,onChange:v,className:`mb-0 w-64`}),sticky:!1}),(0,q.jsx)(D,{className:`max-w-none pt-6`,children:(0,q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[H?(0,q.jsxs)(ne,{type:`single`,value:d,onValueChange:e=>{(e===`coding`||e===`image`)&&(p(e),v(``))},"aria-label":`Model type`,className:c(I,`shrink-0`),children:[(0,q.jsx)(P,{value:`coding`,"aria-label":`Coding`,className:c(i.body,F),children:`Coding`}),(0,q.jsx)(P,{value:`image`,"aria-label":`Image`,className:c(i.body,F),children:`Image`})]}):null,A?(0,q.jsx)(T,{variant:A.includes(`error`)||A.includes(`Failed`)?`error`:`success`,className:`mb-0 shrink-0`,children:A}):null,(0,q.jsx)(`div`,{className:`ml-auto shrink-0`,children:(0,q.jsx)(oe,{sortBy:O,showCodingIndex:d===`coding`,showIntelligenceByPrice:d===`coding`,onSortByChange:k})})]})})]}),(0,q.jsx)(S,{value:`coding`,className:`mt-0 flex flex-col gap-2.5`,children:r.map(e=>{let t=s[e.slug]||[],n=l[e.slug]||new Set,r=z(t,n,O);return r.length===0&&h?null:(0,q.jsx)(Q,{providerName:e.name,providerSlug:e.slug,action:r.length>0?(0,q.jsx)(B,{id:`select-all-${e.slug}`,checked:r.every(e=>n.has(e.id)),onChange:t=>void L(e.slug,t)}):null,tableHeader:r.length>0?(0,q.jsx)(X,{showIntelligence:O===`coding-index`||O===`intelligence-by-price`}):void 0,children:r.length===0?(0,q.jsx)(R,{message:h?`No models matching your search.`:`No models available for this provider.`}):(0,q.jsx)(g,{children:(0,q.jsx)(Z,{models:r,enabledIds:n,checkboxIdPrefix:``,showIntelligence:O===`coding-index`||O===`intelligence-by-price`,getModelDisplayName:M,onToggleModel:t=>void N(e.slug,t)})})},e.slug)})}),(0,q.jsx)(S,{value:`image`,className:`mt-0 flex flex-col gap-2.5`,children:d===`image`?(0,q.jsx)(V.Suspense,{fallback:(0,q.jsx)(_,{className:`py-12`,size:`sm`}),children:(0,q.jsx)(_e,{providers:r,globalSearchQuery:h,modelSortBy:O,filterAndSortModels:z,getModelDisplayName:M,onSaveStatus:e=>{j(e),e.includes(`Failed`)||setTimeout(()=>j(``),3e3)}})}):null})]})})}function $(){let e=(0,H.c)(8),[t,n]=(0,V.useState)(0),r;e[0]===t?r=e[1]:(r=function(){v(U(t)),n(be)},e[0]=t,e[1]=r);let i=r,a;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,q.jsx)(_,{label:`Loading models...`,size:`lg`}),e[2]=a):a=e[2];let o;e[3]===t?o=e[4]:(o=(0,q.jsx)(V.Suspense,{fallback:a,children:(0,q.jsx)(ve,{loadVersion:t},t)}),e[3]=t,e[4]=o);let s;return e[5]!==i||e[6]!==o?(s=(0,q.jsx)(`div`,{className:`h-full min-h-0`,children:(0,q.jsx)(L,{fallbackTitle:`Failed to load models`,onRetry:i,renderFallback:ye,children:o})}),e[5]=i,e[6]=o,e[7]=s):s=e[7],s}function ye(e,t){return(0,q.jsx)(w,{title:`Failed to load models`,action:(0,q.jsx)(l,{variant:`outline`,onClick:t,children:`Retry`}),children:e.message})}function be(e){return e+1}export{$ as SettingsModelsView,$ as default};
@@ -1,8 +1,8 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-BWuYHVi8.js";import{J as i}from"./dist-DIjomljy.js";import{t as a}from"./utils-CT-Dw22R.js";import{t as o}from"./button-DeNw35VZ.js";import{Yn as s,bn as c,nr as l}from"./api-BMo_Lz8f.js";import{t as u}from"./use-toast-xpb5jNtN.js";import{r as d,t as f}from"./dialog-Do98zzAW.js";import{Bn as p,Dn as m,En as h,Ft as g,In as _,Ln as v,Nn as y,On as b,Y as x,kn as S,zn as C}from"./index-DjaVbFDB.js";import{t as w}from"./delete-confirm-dialog-C9NASyh6.js";import{t as T}from"./use-settings-page-loading-BTySlInF.js";import{a as E,i as D,o as O,r as k}from"./settings-list-DU82HNPX.js";import{t as A}from"./use-deferred-search-Dgxosq55.js";import{t as j}from"./switch-pIBaqatj.js";import{a as M,i as N,n as P,r as F,t as I}from"./mcp-server-card-zm-ss-7h.js";import{t as L}from"./use-installed-ai-files-E4BAFIPG.js";var R=e(t(),1),z=n();function B({threadId:e,onRuleCreated:t}){let[n,i]=(0,R.useState)(``),[o,s]=(0,R.useState)(``),[l,d]=(0,R.useState)(!1),[f,p]=(0,R.useState)(!1),v=N(n),y=F(v),b=async()=>{if(!(!y||!e)){p(!0);try{let n=`---
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-DjiNKpTV.js";import{J as i}from"./dist-CNOCRPxn.js";import{t as a}from"./utils-CT-Dw22R.js";import{t as o}from"./button-B6HDsfd5.js";import{Xn as s,bn as c,rr as l}from"./api-D1GxdEEp.js";import{t as u}from"./use-toast-xpb5jNtN.js";import{r as d,t as f}from"./dialog--0foS3aw.js";import{It as p,Mn as m,On as h,Tn as g,X as _,bn as v,jn as y,kn as b,vn as x,xn as S,yn as C}from"./index-BOB3ZUQs.js";import{t as w}from"./delete-confirm-dialog-3DX1u0Dg.js";import{t as T}from"./use-settings-page-loading-BTySlInF.js";import{a as E,i as D,o as O,r as k}from"./settings-list-BpPbGcpS.js";import{t as A}from"./use-deferred-search-Dgxosq55.js";import{t as j}from"./switch-P5m18oUl.js";import{a as M,i as N,n as P,r as F,t as I}from"./mcp-server-card-DFT7uyRh.js";import{t as L}from"./use-installed-ai-files-CJr_PVcY.js";var R=e(t(),1),z=n();function B({threadId:e,onRuleCreated:t}){let[n,i]=(0,R.useState)(``),[o,s]=(0,R.useState)(``),[l,d]=(0,R.useState)(!1),[f,m]=(0,R.useState)(!1),g=N(n),v=F(g),b=async()=>{if(!(!v||!e)){m(!0);try{let n=`---
2
2
  description: ${o.trim()}
3
3
  alwaysApply: ${l}
4
4
  ---
5
5
 
6
6
  Place your rule instructions here as markdown.
7
- `;await c(e,`.agents/rules/${v}.md`,n),u({title:`Rule created`,description:`Rule '${v}' was created successfully.`}),i(``),s(``),d(!1),t?.(v)}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Failed to create rule`,variant:`destructive`})}finally{p(!1)}}};return e?(0,z.jsx)(C,{children:(0,z.jsxs)(h,{children:[(0,z.jsx)(S,{title:`Add Rule`,description:`Saved as a .md file in .agents/rules.`,sticky:!0,className:`pr-10`}),(0,z.jsxs)(`div`,{children:[(0,z.jsxs)(m,{title:`Rule Name`,controlLayout:`stack`,className:`pt-6`,children:[(0,z.jsx)(g,{id:`ruleName`,value:n,onChange:e=>i(e.target.value),placeholder:`e.g. Code Style Guide`,disabled:f}),n?(0,z.jsxs)(`p`,{className:a(r.caption,`mt-2`),children:[`File name: `,(0,z.jsxs)(`span`,{className:`font-mono`,children:[v||`...`,`.md`]})]}):null]}),(0,z.jsx)(m,{title:`Description`,controlLayout:`stack`,className:`pt-6`,children:(0,z.jsx)(x,{id:`ruleDescription`,value:o,onChange:e=>s(e.target.value),placeholder:`Describe when Tarsk should apply this rule...`,className:`resize-none min-h-[120px]`,disabled:f})}),(0,z.jsx)(m,{title:`Always Apply`,description:l?`This rule will be automatically added to context for all conversations.`:`Only the rule description will be added to context, allowing the agent to read the rule file when needed.`,controlLayout:`stack`,className:`pt-6`,action:(0,z.jsx)(j,{id:`alwaysApply`,checked:l,onCheckedChange:d,disabled:f})}),(0,z.jsx)(M,{onContinue:()=>void b(),disabled:!y||!o.trim(),creating:f})]})]})}):(0,z.jsx)(_,{title:`No thread selected`,children:`Please select a thread to add a rule.`})}function V(e){let t=[];for(let n of e)n.type===`file`&&n.path.startsWith(`.agents/rules/`)&&t.push(n),n.children&&n.children.length>0&&t.push(...V(n.children));return t}function H(){let{selectedProjectId:e,selectedThreadId:t,items:n,loading:m,deleteConfirm:h,setDeleteConfirm:g,deleting:x,installedFilePaths:C,setInstalledFilePaths:j,loadItems:M,handleDelete:N,handleOpenInExplorer:F,triggerExplorerRefresh:H}=L({findItems:V,removedToastTitle:`Rule removed`}),[U,W]=(0,R.useState)(!1),[G,K]=(0,R.useState)([]),[q,J]=(0,R.useState)(!0),{query:Y,setQuery:X,deferredQuery:Z}=A();(0,R.useEffect)(()=>{J(!0),s().then(K).catch(()=>K([])).finally(()=>J(!1))},[]);let Q=T(e?`${e}:${t??``}`:null,[m,q]);async function ee(e){let n=`.agents/rules/${e.name}.md`;if(!(!t||C.has(n)))try{e.gitHubRepo&&e.gitHubFolder?await l(t,e.gitHubRepo,e.gitHubFolder,`.agents/rules`):await c(t,n,[`---`,`description: ${e.description}`,`alwaysApply: ${e.alwaysApply??!1}`,`---`,``,e.content].join(`
8
- `)),j(e=>new Set(e).add(n)),H(),M(),u({title:`Rule installed`,description:e.name})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Failed to install rule`,variant:`destructive`})}}let $=(0,R.useMemo)(()=>Z.trim()?G.filter(e=>e.name.toLowerCase().includes(Z.toLowerCase())||e.description.toLowerCase().includes(Z.toLowerCase())):G,[G,Z]);return e?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(y,{loading:Q,children:[(0,z.jsxs)(p,{className:`shrink-0`,children:[(0,z.jsx)(S,{title:`Installed Rules`,description:`Coding standards and project-wide guidelines for this project.`,action:(0,z.jsx)(o,{onClick:()=>W(!0),disabled:!t,children:`Add Rule`}),sticky:!1}),(0,z.jsxs)(v,{className:`pt-6`,children:[!t&&(0,z.jsx)(b,{children:`Select a thread to add or install rules.`}),(0,z.jsx)(k,{showHeader:!1,compact:!0,loading:!1,items:n,emptyState:{icon:i,title:`No rules installed`,description:`Add rules to enforce coding standards and project conventions.`},getKey:e=>e.id,renderContent:e=>(0,z.jsx)(`span`,{className:a(r.body,`truncate text-left`),children:e.name.replace(/\.mdc$/i,``)}),onItemClick:e=>F(e.path),itemClickLabel:e=>`Open ${e.name.replace(/\.mdc$/i,``)} in Files`,onDelete:g,deleteAriaLabel:e=>`Delete ${e.name.replace(/\.mdc$/i,``)}`,deleteTooltip:`Remove this rule from the project`})]})]}),(0,z.jsxs)(p,{className:`shrink-0`,children:[(0,z.jsx)(S,{title:`Available Rules`,description:`Browse and install rules from the catalog.`,action:(0,z.jsx)(O,{placeholder:`Search`,value:Y,onChange:X,className:`mb-0 w-64`}),sticky:!1}),(0,z.jsx)(v,{className:`pt-6`,children:$.length===0?(0,z.jsx)(E,{searchQuery:Y,emptyLabel:`No available rules found.`}):(0,z.jsx)(D,{children:$.map(e=>{let t=`.agents/rules/${e.name}.md`,n=C.has(t);return(0,z.jsx)(I,{className:`bg-background hover:bg-background`,name:P(e.name),description:e.description,installed:n,onClick:()=>{n||ee(e)},showInstalledControls:!1},e.id)})})})]})]}),(0,z.jsx)(f,{open:U,onOpenChange:W,children:(0,z.jsx)(d,{className:`max-w-2xl max-h-[90vh] overflow-y-auto p-0`,children:(0,z.jsx)(B,{threadId:t,onRuleCreated:()=>{W(!1),M(),H()}})})}),(0,z.jsx)(w,{open:h!==null,onOpenChange:e=>!e&&g(null),title:`Delete Rule`,description:`Are you sure you want to delete the rule "${h?.name}"? This action cannot be undone.`,onConfirm:()=>{h&&N(h)},confirming:x})]}):(0,z.jsx)(_,{children:`Select a project to manage rules.`})}export{H as SettingsRulesView,H as default};
7
+ `;await c(e,`.agents/rules/${g}.md`,n),u({title:`Rule created`,description:`Rule '${g}' was created successfully.`}),i(``),s(``),d(!1),t?.(g)}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Failed to create rule`,variant:`destructive`})}finally{m(!1)}}};return e?(0,z.jsx)(y,{children:(0,z.jsxs)(x,{children:[(0,z.jsx)(S,{title:`Add Rule`,description:`Saved as a .md file in .agents/rules.`,sticky:!0,className:`pr-10`}),(0,z.jsxs)(`div`,{children:[(0,z.jsxs)(C,{title:`Rule Name`,controlLayout:`stack`,className:`pt-6`,children:[(0,z.jsx)(p,{id:`ruleName`,value:n,onChange:e=>i(e.target.value),placeholder:`e.g. Code Style Guide`,disabled:f}),n?(0,z.jsxs)(`p`,{className:a(r.caption,`mt-2`),children:[`File name: `,(0,z.jsxs)(`span`,{className:`font-mono`,children:[g||`...`,`.md`]})]}):null]}),(0,z.jsx)(C,{title:`Description`,controlLayout:`stack`,className:`pt-6`,children:(0,z.jsx)(_,{id:`ruleDescription`,value:o,onChange:e=>s(e.target.value),placeholder:`Describe when Tarsk should apply this rule...`,className:`resize-none min-h-[120px]`,disabled:f})}),(0,z.jsx)(C,{title:`Always Apply`,description:l?`This rule will be automatically added to context for all conversations.`:`Only the rule description will be added to context, allowing the agent to read the rule file when needed.`,controlLayout:`stack`,className:`pt-6`,action:(0,z.jsx)(j,{id:`alwaysApply`,checked:l,onCheckedChange:d,disabled:f})}),(0,z.jsx)(M,{onContinue:()=>void b(),disabled:!v||!o.trim(),creating:f})]})]})}):(0,z.jsx)(h,{title:`No thread selected`,children:`Please select a thread to add a rule.`})}function V(e){let t=[];for(let n of e)n.type===`file`&&n.path.startsWith(`.agents/rules/`)&&t.push(n),n.children&&n.children.length>0&&t.push(...V(n.children));return t}function H(){let{selectedProjectId:e,selectedThreadId:t,items:n,loading:p,deleteConfirm:_,setDeleteConfirm:y,deleting:x,installedFilePaths:C,setInstalledFilePaths:j,loadItems:M,handleDelete:N,handleOpenInExplorer:F,triggerExplorerRefresh:H}=L({findItems:V,removedToastTitle:`Rule removed`}),[U,W]=(0,R.useState)(!1),[G,K]=(0,R.useState)([]),[q,J]=(0,R.useState)(!0),{query:Y,setQuery:X,deferredQuery:Z}=A();(0,R.useEffect)(()=>{J(!0),s().then(K).catch(()=>K([])).finally(()=>J(!1))},[]);let Q=T(e?`${e}:${t??``}`:null,[p,q]);async function ee(e){let n=`.agents/rules/${e.name}.md`;if(!(!t||C.has(n)))try{e.gitHubRepo&&e.gitHubFolder?await l(t,e.gitHubRepo,e.gitHubFolder,`.agents/rules`):await c(t,n,[`---`,`description: ${e.description}`,`alwaysApply: ${e.alwaysApply??!1}`,`---`,``,e.content].join(`
8
+ `)),j(e=>new Set(e).add(n)),H(),M(),u({title:`Rule installed`,description:e.name})}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Failed to install rule`,variant:`destructive`})}}let $=(0,R.useMemo)(()=>Z.trim()?G.filter(e=>e.name.toLowerCase().includes(Z.toLowerCase())||e.description.toLowerCase().includes(Z.toLowerCase())):G,[G,Z]);return e?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(g,{loading:Q,children:[(0,z.jsxs)(m,{className:`shrink-0`,children:[(0,z.jsx)(S,{title:`Installed Rules`,description:`Coding standards and project-wide guidelines for this project.`,action:(0,z.jsx)(o,{onClick:()=>W(!0),disabled:!t,children:`Add Rule`}),sticky:!1}),(0,z.jsxs)(b,{className:`pt-6`,children:[!t&&(0,z.jsx)(v,{children:`Select a thread to add or install rules.`}),(0,z.jsx)(k,{showHeader:!1,compact:!0,loading:!1,items:n,emptyState:{icon:i,title:`No rules installed`,description:`Add rules to enforce coding standards and project conventions.`},getKey:e=>e.id,renderContent:e=>(0,z.jsx)(`span`,{className:a(r.body,`truncate text-left`),children:e.name.replace(/\.mdc$/i,``)}),onItemClick:e=>F(e.path),itemClickLabel:e=>`Open ${e.name.replace(/\.mdc$/i,``)} in Files`,onDelete:y,deleteAriaLabel:e=>`Delete ${e.name.replace(/\.mdc$/i,``)}`,deleteTooltip:`Remove this rule from the project`})]})]}),(0,z.jsxs)(m,{className:`shrink-0`,children:[(0,z.jsx)(S,{title:`Available Rules`,description:`Browse and install rules from the catalog.`,action:(0,z.jsx)(O,{placeholder:`Search`,value:Y,onChange:X,className:`mb-0 w-64`}),sticky:!1}),(0,z.jsx)(b,{className:`pt-6`,children:$.length===0?(0,z.jsx)(E,{searchQuery:Y,emptyLabel:`No available rules found.`}):(0,z.jsx)(D,{children:$.map(e=>{let t=`.agents/rules/${e.name}.md`,n=C.has(t);return(0,z.jsx)(I,{className:`bg-background hover:bg-background`,name:P(e.name),description:e.description,installed:n,onClick:()=>{n||ee(e)},showInstalledControls:!1},e.id)})})})]})]}),(0,z.jsx)(f,{open:U,onOpenChange:W,children:(0,z.jsx)(d,{className:`max-w-2xl max-h-[90vh] overflow-y-auto p-0`,children:(0,z.jsx)(B,{threadId:t,onRuleCreated:()=>{W(!1),M(),H()}})})}),(0,z.jsx)(w,{open:_!==null,onOpenChange:e=>!e&&y(null),title:`Delete Rule`,description:`Are you sure you want to delete the rule "${_?.name}"? This action cannot be undone.`,onConfirm:()=>{_&&N(_)},confirming:x})]}):(0,z.jsx)(h,{children:`Select a project to manage rules.`})}export{H as SettingsRulesView,H as default};
@@ -0,0 +1,3 @@
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,o as n,t as r}from"./react-vendor-Ee0-5T4I.js";import{t as i}from"./markdown-renderer-BkKibNMs.js";import{ot as a,w as o}from"./dist-DjiNKpTV.js";import{r as s}from"./store-CHF6tOp2.js";import{An as c,At as l,Et as u,ot as d,qt as f,rt as p,st as m,un as h,x as g}from"./dist-CNOCRPxn.js";import{a as _,t as v}from"./utils-CT-Dw22R.js";import{t as y}from"./button-B6HDsfd5.js";import{$n as b,$r as x,Ii as S,Jn as C,Kn as w,Ni as T,Qr as E,T as D,Xt as O,Zn as k,_i as A,ar as j,bn as M,er as N,ir as ee,mi as te,nr as ne,qn as P,si as F,tr as I}from"./api-D1GxdEEp.js";import{i as re,n as ie,r as ae,t as oe}from"./tooltip-BtJG5fZl.js";import{n as L}from"./async-loading-fallback-D2X0o4Qa.js";import{t as R}from"./use-toast-xpb5jNtN.js";import{a as z,i as B,o as V,r as H,s as U,t as W}from"./dialog--0foS3aw.js";import{a as se,c as ce,i as le,n as ue,o as de,r as fe,s as pe,t as me}from"./alert-dialog-DAHkynVZ.js";import{At as he,Ft as G,In as ge,It as K,Ln as q,Mn as _e,Nt as ve,On as ye,Ot as be,Pn as xe,Pt as Se,Tn as Ce,Un as we,X as Te,a as Ee,bn as De,jn as Oe,jt as ke,kn as J,kt as Ae,vn as je,xn as Y,yn as Me,zn as Ne}from"./index-BOB3ZUQs.js";import{t as Pe}from"./delete-confirm-dialog-3DX1u0Dg.js";import{t as Fe}from"./use-settings-page-loading-BTySlInF.js";import{a as Ie,i as Le,o as Re,r as ze}from"./settings-list-BpPbGcpS.js";import{t as Be}from"./use-deferred-search-Dgxosq55.js";import{a as Ve,i as He,n as Ue,r as We,t as Ge}from"./mcp-server-card-DFT7uyRh.js";import{t as Ke}from"./use-installed-ai-files-CJr_PVcY.js";var X=t(),Z=e(n(),1),Q=r();function qe({threadId:e,onSkillCreated:t}){let[n,r]=(0,Z.useState)(``),[i,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(!1),l=He(n),u=We(l),d=async()=>{if(!(!u||!i.trim()||!e)){c(!0);try{let n=await D(e,l,i.trim());R({title:`Skill created`,description:`Skill '${l}' was created successfully.`}),r(``),o(``),t?.(n.path,`SKILL.md`)}catch(e){R({title:`Error`,description:e instanceof Error?e.message:`Failed to create skill`,variant:`destructive`})}finally{c(!1)}}};return e?(0,Q.jsx)(Oe,{children:(0,Q.jsxs)(je,{children:[(0,Q.jsx)(Y,{title:`Add Skill`,description:`Saved as SKILL.md in .agents/skills.`,sticky:!0,className:`pr-10`}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(Me,{title:`Skill Name`,controlLayout:`stack`,className:`pt-6`,children:[(0,Q.jsx)(K,{id:`skillName`,value:n,onChange:e=>r(e.target.value),placeholder:`e.g. Code Review`,disabled:s}),n?(0,Q.jsxs)(`p`,{className:v(a.caption,`mt-2`),children:[`Folder name: `,(0,Q.jsx)(`span`,{className:`font-mono`,children:l||`...`})]}):null]}),(0,Q.jsx)(Me,{title:`Description`,controlLayout:`stack`,className:`pt-6`,children:(0,Q.jsx)(Te,{id:`skillDescription`,value:i,onChange:e=>o(e.target.value),placeholder:`Describe when Tarsk should apply this skill`,className:`resize-none min-h-[120px]`,disabled:s})}),(0,Q.jsx)(Ve,{onContinue:()=>void d(),disabled:!u||!i.trim(),creating:s})]})]})}):(0,Q.jsx)(ye,{title:`No thread selected`,children:`Please select a thread to add a skill.`})}function Je(e){let t=[`---`,`name: ${e.id}`,`description: ${e.description}`];return e.allowedTools&&t.push(`allowed-tools: ${e.allowedTools}`),e.license&&t.push(`license: ${e.license}`),t.push(`---`,``,e.instructions??``),t.join(`
2
+ `)}function Ye(e){return e.endsWith(`.md`)||e.endsWith(`.mdx`)}function Xe(e){return e.includes(`SKILL.md`)?`SKILL.md`:e[0]??`SKILL.md`}function Ze(e,t){let n=e?.sourceId??t;if(!(!n||n==="default"))return n}function Qe({open:e,onOpenChange:t,skill:n,catalogSourceId:r,onInstall:o}){let[s,c]=(0,Z.useState)([]),[l,u]=(0,Z.useState)(null),[d,p]=(0,Z.useState)(``),[m,h]=(0,Z.useState)(!1),[g,_]=(0,Z.useState)(!1),[b,x]=(0,Z.useState)(null),[S,w]=(0,Z.useState)(!1),T=Ze(n,r),E=!!T;(0,Z.useEffect)(()=>{if(!e||!n)return;let t=n,i=Ze(t,r),a=!1;async function o(){h(!0),x(null),c([]),u(null),p(``);try{if(i){let e=await C(i,t.id);if(a)return;c(e.files),u(Xe(e.files))}else{if(a)return;c([`SKILL.md`]),u(`SKILL.md`),p(Je(t))}}catch(e){if(a)return;x(e instanceof Error?e.message:`Failed to load skill files`)}finally{a||h(!1)}}return o(),()=>{a=!0}},[e,n,r]),(0,Z.useEffect)(()=>{if(!e||!n||!l||!E||!T)return;let t=n,r=l,i=!1;async function a(){_(!0),x(null);try{let e=await P(T,t.id,r);if(i)return;p(e.content)}catch(e){if(i)return;x(e instanceof Error?e.message:`Failed to load file`),p(``)}finally{i||_(!1)}}return a(),()=>{i=!0}},[e,n,l,E,T]);let D=(0,Z.useCallback)(async()=>{if(!n)return;let e=T?{...n,sourceId:T}:n;w(!0);try{await o(e),t(!1)}finally{w(!1)}},[n,T,o,t]),O=m||E&&g,k=l?Ye(l):!1,A=(0,Z.useMemo)(()=>s.map(e=>(0,Q.jsxs)(be,{selected:e===l,onClick:()=>u(e),className:`gap-2 cursor-pointer`,children:[(0,Q.jsx)(f,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:v(a.caption,`truncate`),children:e})]},e)),[s,l]);return(0,Q.jsx)(W,{open:e,onOpenChange:t,children:(0,Q.jsxs)(H,{className:`flex max-h-[90vh] max-w-5xl flex-col gap-0 overflow-hidden p-0`,children:[(0,Q.jsxs)(V,{className:`border-b border-border px-6 py-4`,children:[(0,Q.jsx)(U,{children:n?.name??`Review skill`}),n?.description?(0,Q.jsx)(B,{children:n.description}):null]}),(0,Q.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col sm:flex-row`,children:[(0,Q.jsxs)(`div`,{className:`flex max-h-40 shrink-0 flex-col border-b border-border sm:max-h-none sm:w-56 sm:border-b-0 sm:border-r`,children:[(0,Q.jsx)(`div`,{className:v(a.labelMuted,`px-3 py-2`),children:`Files`}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-1 pb-2`,children:m?(0,Q.jsx)(L,{className:`py-8`,label:`Loading files...`}):s.length===0?(0,Q.jsx)(`p`,{className:v(a.caption,`px-3 py-2 text-muted-foreground`),children:`No files found.`}):A})]}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-6 py-4`,children:b?(0,Q.jsx)(`p`,{className:v(a.body,`text-destructive`),children:b}):O?(0,Q.jsx)(L,{className:`py-12`,label:`Loading preview...`}):k?(0,Q.jsx)(i,{content:d,enableMermaid:!1}):(0,Q.jsx)(`pre`,{className:v(a.caption,`overflow-x-auto whitespace-pre-wrap font-mono`),children:d})})]}),(0,Q.jsxs)(z,{className:`border-t border-border px-6 py-4 sm:justify-between`,children:[(0,Q.jsx)(y,{type:`button`,variant:`outline`,onClick:()=>t(!1),children:`Cancel`}),(0,Q.jsx)(y,{type:`button`,onClick:()=>void D(),disabled:S||!n,children:S?`Installing...`:`Install`})]})]})})}var $=new Map;function $e(e){let t=$.get(e);if(t)return t;let n=b(e).finally(()=>{$.delete(e)});return $.set(e,n),n}function et(e,t){return t.map(t=>({...t,sourceId:t.sourceId??e}))}function tt(){let e=(0,X.c)(18),t;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=[],e[0]=t):t=e[0];let[n,r]=(0,Z.useState)(t),[i,a]=(0,Z.useState)(te),o;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(o=[],e[1]=o):o=e[1];let[s,c]=(0,Z.useState)(o),[l,u]=(0,Z.useState)(!1),[d,f]=(0,Z.useState)(!1),p;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(p=async()=>{try{r(await N())}catch{r([])}},e[2]=p):p=e[2];let m=p,h,g;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(h=()=>{(async function(){let e=F();if(e.length>0)try{await I(e),E()}catch{}await m()})()},g=[m],e[3]=h,e[4]=g):(h=e[3],g=e[4]),(0,Z.useEffect)(h,g);let _;e[5]===Symbol.for(`react.memo_cache_sentinel`)?(_=e=>{a(e),T(e)},e[5]=_):_=e[5];let v=_,y;e[6]===Symbol.for(`react.memo_cache_sentinel`)?(y=e=>{r(t=>[...t.filter(t=>t.id!==e.id),e].sort(rt)),v(e.id)},e[6]=y):y=e[6];let b=y,C;e[7]===Symbol.for(`react.memo_cache_sentinel`)?(C=e=>{r(t=>t.map(t=>t.id===e.id?e:t).sort(nt)),x(e.id)},e[7]=C):C=e[7];let w=C,D;e[8]===Symbol.for(`react.memo_cache_sentinel`)?(D=e=>{r(t=>t.filter(t=>t.id!==e)),x(e),a(t=>t===e?(T(`default`),`default`):t)},e[8]=D):D=e[8];let O=D,k,j;e[9]===i?(k=e[10],j=e[11]):(j=()=>{if(i==="default"){c([]),u(!1),f(!1);return}let e=A(i);e?.skills?(c(et(i,e.skills)),u(!1)):(c([]),u(!0));let t=!1;return f(!!e?.skills),$e(i).then(e=>{if(t)return;let n=et(i,e);c(n),S(i,{fetchedAt:Date.now(),skills:n})}).catch(n=>{t||(e?.skills||c([]),R({title:`Error`,description:n instanceof Error?n.message:`Failed to load skill catalog`,variant:`destructive`}))}).finally(()=>{t||(u(!1),f(!1))}),()=>{t=!0}},k=[i],e[9]=i,e[10]=k,e[11]=j),(0,Z.useEffect)(j,k);let M;return e[12]!==s||e[13]!==l||e[14]!==d||e[15]!==i||e[16]!==n?(M={sources:n,selectedSourceId:i,setSelectedSourceId:v,addSource:b,updateSource:w,removeSource:O,reloadSources:m,catalogSkills:s,isLoadingCatalog:l,isRefreshingCatalog:d},e[12]=s,e[13]=l,e[14]=d,e[15]=i,e[16]=n,e[17]=M):M=e[17],M}function nt(e,t){return e.title.localeCompare(t.title)}function rt(e,t){return e.title.localeCompare(t.title)}function it({open:e,onOpenChange:t,editingSource:n,onSourceAdded:r,onSourceUpdated:i,onSourceDeleted:o}){let[s,c]=(0,Z.useState)(``),[l,d]=(0,Z.useState)(``),[f,p]=(0,Z.useState)(null),[m,h]=(0,Z.useState)(!1),[g,_]=(0,Z.useState)(!1),[b,x]=(0,Z.useState)(!1),S=n!=null;function C(){c(``),d(``),p(null),h(!1),_(!1),x(!1)}function T(e){e||C(),t(e)}(0,Z.useEffect)(()=>{if(e){if(n){c(n.title),d(n.url),p(null);return}c(``),d(``),p(null)}},[e,n]);async function E(){let e=s.trim(),t=l.trim();if(!e||!t){p(`Title and URL are required.`);return}h(!0),p(null);try{if(S&&n){let r=await ee(n.id,e,t);i?.(r.source)}else r((await j(e,t)).source);T(!1)}catch(e){p(e instanceof Error?e.message:`Failed to verify skill source`)}finally{h(!1)}}async function D(){if(n){_(!0),p(null);try{await w(n.id),o?.(n.id),x(!1),T(!1)}catch(e){p(e instanceof Error?e.message:`Failed to delete skill source`),x(!1)}finally{_(!1)}}}return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(W,{open:e,onOpenChange:T,children:(0,Q.jsxs)(H,{className:`sm:max-w-lg`,children:[(0,Q.jsxs)(V,{children:[(0,Q.jsx)(U,{children:S?`Edit Skill Source`:`Add Skill Source`}),(0,Q.jsx)(B,{children:S?`Update the title or GitHub skills folder URL for this custom source.`:`Add a GitHub skills folder URL. The source is verified by loading at least one skill from the repository.`})]}),(0,Q.jsxs)(`div`,{className:`grid gap-4 py-2`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)(G,{htmlFor:`skill-source-title`,children:`Title`}),(0,Q.jsx)(K,{id:`skill-source-title`,placeholder:`e.g. My Team Skills`,value:s,onChange:e=>c(e.target.value),disabled:m||g,autoFocus:!0})]}),(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)(G,{htmlFor:`skill-source-url`,children:`URL`}),(0,Q.jsx)(K,{id:`skill-source-url`,placeholder:`https://github.com/org/repo or .../tree/main/skills`,value:l,onChange:e=>d(e.target.value),disabled:m||g})]}),f?(0,Q.jsx)(`p`,{className:v(a.caption,`text-destructive`),children:f}):null]}),(0,Q.jsxs)(z,{className:`flex-col-reverse gap-2 sm:flex-row sm:justify-between`,children:[S?(0,Q.jsx)(y,{type:`button`,variant:`destructive`,onClick:()=>x(!0),disabled:m||g,children:`Delete`}):(0,Q.jsx)(`div`,{className:`hidden sm:block`}),(0,Q.jsxs)(`div`,{className:`flex w-full flex-col-reverse gap-2 sm:w-auto sm:flex-row`,children:[(0,Q.jsx)(y,{variant:`outline`,onClick:()=>T(!1),disabled:m||g,children:`Cancel`}),(0,Q.jsx)(y,{onClick:()=>void E(),disabled:m||g||!s.trim()||!l.trim(),children:m?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(u,{className:`mr-2 h-4 w-4 animate-spin`}),`Verifying...`]}):S?`Save Changes`:`Add Source`})]})]})]})}),(0,Q.jsx)(me,{open:b,onOpenChange:x,children:(0,Q.jsxs)(le,{children:[(0,Q.jsxs)(pe,{children:[(0,Q.jsx)(ce,{children:`Delete Skill Source`}),(0,Q.jsxs)(se,{children:[`Are you sure you want to delete "`,n?.title,`"? This removes the source from your list but does not uninstall skills you already added.`]})]}),(0,Q.jsxs)(de,{children:[(0,Q.jsx)(fe,{disabled:g,children:`Cancel`}),(0,Q.jsx)(ue,{onClick:()=>void D(),disabled:g,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:g?`Deleting...`:`Delete`})]})]})})]})}var at=`https://tarsk.io/skills/list/`;function ot(e){let t=(0,X.c)(20),{onSelectMode:n,manualDisabled:r}=e,i;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(i=(0,Q.jsx)(we,{asChild:!0,children:(0,Q.jsxs)(y,{className:`gap-1`,children:[`Add Skill`,(0,Q.jsx)(c,{className:`h-4 w-4 opacity-70`})]})}),t[0]=i):i=t[0];let o;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(o=v(a.body,`gap-2`),t[1]=o):o=t[1];let s;t[2]===n?s=t[3]:(s=()=>n(`manual`),t[2]=n,t[3]=s);let u;t[4]===Symbol.for(`react.memo_cache_sentinel`)?(u=(0,Q.jsx)(m,{className:`h-4 w-4 shrink-0`}),t[4]=u):u=t[4];let d;t[5]!==r||t[6]!==s?(d=(0,Q.jsxs)(q,{className:o,disabled:r,onSelect:s,children:[u,`Manually Enter`]}),t[5]=r,t[6]=s,t[7]=d):d=t[7];let f;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(f=v(a.body,`gap-2`),t[8]=f):f=t[8];let p;t[9]===n?p=t[10]:(p=()=>n(`url`),t[9]=n,t[10]=p);let g;t[11]===Symbol.for(`react.memo_cache_sentinel`)?(g=(0,Q.jsx)(l,{className:`h-4 w-4 shrink-0`}),t[11]=g):g=t[11];let _;t[12]===p?_=t[13]:(_=(0,Q.jsxs)(q,{className:f,onSelect:p,children:[g,`Via URL`]}),t[12]=p,t[13]=_);let b;t[14]===Symbol.for(`react.memo_cache_sentinel`)?(b=(0,Q.jsx)(Ne,{}),t[14]=b):b=t[14];let x;t[15]===Symbol.for(`react.memo_cache_sentinel`)?(x=v(a.body,`gap-2`),t[15]=x):x=t[15];let S;t[16]===Symbol.for(`react.memo_cache_sentinel`)?(S=(0,Q.jsxs)(q,{className:x,onSelect:st,children:[(0,Q.jsx)(h,{className:`h-4 w-4 shrink-0`}),`Marketplace`]}),t[16]=S):S=t[16];let C;return t[17]!==d||t[18]!==_?(C=(0,Q.jsxs)(xe,{children:[i,(0,Q.jsxs)(ge,{align:`end`,className:`w-44`,children:[d,_,b,S]})]}),t[17]=d,t[18]=_,t[19]=C):C=t[19],C}function st(){O(at)}function ct(e){let t=e.trim();if(!t)return null;if(/^https?:\/\//i.test(t))try{return new URL(t),t}catch{return null}if(t.startsWith(`tarsk://`))try{let e=new URL(`https://tarsk.invalid/${t.slice(8)}`);if(e.pathname===`/skill-install`&&e.searchParams.get(`url`))return e.searchParams.get(`url`)}catch{return null}return null}function lt(e){let t=(0,X.c)(40),{open:n,onOpenChange:r,onSubmit:i}=e,[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(null),u;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(u=function(){s(``),l(null)},t[0]=u):u=t[0];let d=u,f;t[1]===r?f=t[2]:(f=function(e){e||d(),r(e)},t[1]=r,t[2]=f);let p=f,m,h;t[3]===n?(m=t[4],h=t[5]):(m=()=>{n&&d()},h=[n],t[3]=n,t[4]=m,t[5]=h),(0,Z.useEffect)(m,h);let g;t[6]!==p||t[7]!==i||t[8]!==o?(g=function(){let e=ct(o);if(!e){l(`Enter a valid http(s) URL for the plugin archive or paste a tarsk:// install link.`);return}i(e),p(!1)},t[6]=p,t[7]=i,t[8]=o,t[9]=g):g=t[9];let _=g,b;t[10]===Symbol.for(`react.memo_cache_sentinel`)?(b=(0,Q.jsxs)(V,{children:[(0,Q.jsx)(U,{children:`Add Skill via URL`}),(0,Q.jsx)(B,{children:`Paste the URL of a plugin archive. Its skills and MCP servers are installed into this project.`})]}),t[10]=b):b=t[10];let x;t[11]===Symbol.for(`react.memo_cache_sentinel`)?(x=(0,Q.jsx)(G,{htmlFor:`add-skill-url`,children:`URL`}),t[11]=x):x=t[11];let S;t[12]===Symbol.for(`react.memo_cache_sentinel`)?(S=e=>s(e.target.value),t[12]=S):S=t[12];let C;t[13]===_?C=t[14]:(C=e=>{e.key===`Enter`&&(e.preventDefault(),_())},t[13]=_,t[14]=C);let w;t[15]!==C||t[16]!==o?(w=(0,Q.jsx)(K,{id:`add-skill-url`,placeholder:`https://example.com/my-plugin.zip`,value:o,onChange:S,autoFocus:!0,onKeyDown:C}),t[15]=C,t[16]=o,t[17]=w):w=t[17];let T;t[18]===c?T=t[19]:(T=c?(0,Q.jsx)(`p`,{className:v(a.caption,`text-destructive`),children:c}):null,t[18]=c,t[19]=T);let E;t[20]!==w||t[21]!==T?(E=(0,Q.jsx)(`div`,{className:`grid gap-4 py-2`,children:(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[x,w,T]})}),t[20]=w,t[21]=T,t[22]=E):E=t[22];let D;t[23]===p?D=t[24]:(D=(0,Q.jsx)(y,{variant:`outline`,onClick:()=>p(!1),children:`Cancel`}),t[23]=p,t[24]=D);let O;t[25]===o?O=t[26]:(O=o.trim(),t[25]=o,t[26]=O);let k=!O,A;t[27]!==_||t[28]!==k?(A=(0,Q.jsx)(y,{onClick:_,disabled:k,children:`Continue`}),t[27]=_,t[28]=k,t[29]=A):A=t[29];let j;t[30]!==D||t[31]!==A?(j=(0,Q.jsxs)(z,{children:[D,A]}),t[30]=D,t[31]=A,t[32]=j):j=t[32];let M;t[33]!==E||t[34]!==j?(M=(0,Q.jsxs)(H,{className:`sm:max-w-lg`,children:[b,E,j]}),t[33]=E,t[34]=j,t[35]=M):M=t[35];let N;return t[36]!==p||t[37]!==n||t[38]!==M?(N=(0,Q.jsx)(W,{open:n,onOpenChange:p,children:M}),t[36]=p,t[37]=n,t[38]=M,t[39]=N):N=t[39],N}function ut(e){let t=[];for(let n of e){if(n.path===`.agents/skills`&&n.type===`folder`&&n.children)for(let e of n.children)e.type===`folder`&&t.push(e);n.children&&n.children.length>0&&t.push(...ut(n.children))}return t}function dt(e){return`.agents/skills/${e}/SKILL.md`}function ft(e,t){let n=t.trim();if(!n)return e;let r=n.toLowerCase();return e.filter(e=>e.name.toLowerCase().includes(r)||e.description.toLowerCase().includes(r))}function pt(e){let t=(0,X.c)(9),{items:n,installedFilePaths:r,onPreview:i}=e,a;if(t[0]!==r||t[1]!==n||t[2]!==i){let e;t[4]!==r||t[5]!==i?(e=e=>{let t=dt(e.id),n=r.has(t);return(0,Q.jsx)(Ge,{className:`bg-background hover:bg-background`,name:Ue(e.name),description:e.description,installed:n,onClick:()=>{n||i(e)},showInstalledControls:!1},e.id)},t[4]=r,t[5]=i,t[6]=e):e=t[6],a=n.map(e),t[0]=r,t[1]=n,t[2]=i,t[3]=a}else a=t[3];let o;return t[7]===a?o=t[8]:(o=(0,Q.jsx)(Le,{children:a}),t[7]=a,t[8]=o),o}function mt(e){let t=(0,X.c)(21),{skills:n,threadId:r,onOpenSkill:i,onDelete:a,onAddManual:o,onAddUrl:s}=e,c=!r,l;t[0]!==o||t[1]!==s?(l=e=>{e===`manual`?o():s()},t[0]=o,t[1]=s,t[2]=l):l=t[2];let u;t[3]!==c||t[4]!==l?(u=(0,Q.jsx)(Y,{title:`Installed Skills`,description:`Reusable instruction sets that guide agent behavior in this project.`,action:(0,Q.jsx)(ot,{manualDisabled:c,onSelectMode:l}),sticky:!1}),t[3]=c,t[4]=l,t[5]=u):u=t[5];let d;t[6]===r?d=t[7]:(d=!r&&(0,Q.jsx)(De,{children:`Select a thread to add or install skills.`}),t[6]=r,t[7]=d);let f;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(f={icon:g,title:`No skills installed`,description:`Add skills to extend agent capabilities with reusable instructions.`},t[8]=f):f=t[8];let p;t[9]===i?p=t[10]:(p=e=>i(e.path),t[9]=i,t[10]=p);let m;t[11]!==a||t[12]!==n||t[13]!==p?(m=(0,Q.jsx)(ze,{showHeader:!1,compact:!0,loading:!1,items:n,emptyState:f,getKey:vt,renderContent:_t,onItemClick:p,itemClickLabel:gt,onDelete:a,deleteAriaLabel:ht,deleteTooltip:`Remove this skill from the project`}),t[11]=a,t[12]=n,t[13]=p,t[14]=m):m=t[14];let h;t[15]!==d||t[16]!==m?(h=(0,Q.jsxs)(J,{className:`pt-6`,children:[d,m]}),t[15]=d,t[16]=m,t[17]=h):h=t[17];let _;return t[18]!==u||t[19]!==h?(_=(0,Q.jsxs)(_e,{className:`shrink-0`,children:[u,h]}),t[18]=u,t[19]=h,t[20]=_):_=t[20],_}function ht(e){return`Delete ${e.name}`}function gt(e){return`Open ${e.name} in Files`}function _t(e){return(0,Q.jsx)(`span`,{className:v(a.body,`truncate text-left`),children:e.name})}function vt(e){return e.id}function yt(e){let t=(0,X.c)(40),{availableSearch:n,onSearchChange:r,selectedSourceId:i,onSourceChange:a,sources:o,selectedCustomSource:s,availableCatalogLoading:c,isDefaultSource:l,filteredPopular:u,filteredCatalog:f,installedFilePaths:m,onPreviewPopular:h,onPreviewCatalog:g,onAddSource:_}=e,v;t[0]!==n||t[1]!==r?(v=(0,Q.jsx)(Re,{placeholder:`Search`,value:n,onChange:r,className:`mb-0 w-64`}),t[0]=n,t[1]=r,t[2]=v):v=t[2];let b;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(b=(0,Q.jsx)(ve,{className:`w-40`,"aria-label":`Skill source`,children:(0,Q.jsx)(Se,{placeholder:`Default`})}),t[3]=b):b=t[3];let x;t[4]===Symbol.for(`react.memo_cache_sentinel`)?(x=(0,Q.jsx)(ke,{value:`default`,children:`Default`}),t[4]=x):x=t[4];let S;t[5]===o?S=t[6]:(S=o.map(bt),t[5]=o,t[6]=S);let C;t[7]===S?C=t[8]:(C=(0,Q.jsxs)(he,{children:[x,S]}),t[7]=S,t[8]=C);let w;t[9]!==a||t[10]!==i||t[11]!==C?(w=(0,Q.jsxs)(Ae,{value:i,onValueChange:a,children:[b,C]}),t[9]=a,t[10]=i,t[11]=C,t[12]=w):w=t[12];let T=s?`Edit skill source`:`Add skill source`,E;t[13]===s?E=t[14]:(E=s?(0,Q.jsx)(d,{className:`h-4 w-4`}):(0,Q.jsx)(p,{className:`h-4 w-4`}),t[13]=s,t[14]=E);let D;t[15]!==_||t[16]!==T||t[17]!==E?(D=(0,Q.jsx)(re,{asChild:!0,children:(0,Q.jsx)(y,{type:`button`,variant:`outline`,size:`icon`,className:`shrink-0`,onClick:_,"aria-label":T,children:E})}),t[15]=_,t[16]=T,t[17]=E,t[18]=D):D=t[18];let O=s?`Edit this custom skill source`:`Add a custom skill source`,k;t[19]===O?k=t[20]:(k=(0,Q.jsx)(ie,{children:O}),t[19]=O,t[20]=k);let A;t[21]!==k||t[22]!==D?(A=(0,Q.jsx)(ae,{children:(0,Q.jsxs)(oe,{children:[D,k]})}),t[21]=k,t[22]=D,t[23]=A):A=t[23];let j;t[24]!==v||t[25]!==A||t[26]!==w?(j=(0,Q.jsx)(Y,{title:`Available Skills`,description:`Browse and install skills from the catalog.`,action:(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[v,w,A]}),sticky:!1}),t[24]=v,t[25]=A,t[26]=w,t[27]=j):j=t[27];let M;t[28]!==c||t[29]!==n||t[30]!==f||t[31]!==u||t[32]!==m||t[33]!==l||t[34]!==g||t[35]!==h?(M=(0,Q.jsx)(J,{className:`pt-6`,children:c?(0,Q.jsx)(L,{className:`py-12`,label:`Loading skills...`}):l?u.length===0?(0,Q.jsx)(Ie,{searchQuery:n,emptyLabel:`No available skills found.`}):(0,Q.jsx)(pt,{items:u,installedFilePaths:m,onPreview:h}):f.length===0?(0,Q.jsx)(Ie,{searchQuery:n,emptyLabel:`No available skills found.`}):(0,Q.jsx)(pt,{items:f,installedFilePaths:m,onPreview:g})}),t[28]=c,t[29]=n,t[30]=f,t[31]=u,t[32]=m,t[33]=l,t[34]=g,t[35]=h,t[36]=M):M=t[36];let N;return t[37]!==j||t[38]!==M?(N=(0,Q.jsxs)(_e,{className:`shrink-0`,children:[j,M]}),t[37]=j,t[38]=M,t[39]=N):N=t[39],N}function bt(e){return(0,Q.jsx)(ke,{value:e.id,children:e.title},e.id)}function xt(){let{selectedProjectId:e,selectedThreadId:t,items:n,loading:r,deleteConfirm:i,setDeleteConfirm:a,deleting:c,installedFilePaths:l,setInstalledFilePaths:u,loadItems:d,handleDelete:f,handleOpenInExplorer:p,triggerExplorerRefresh:m}=Ke({findItems:ut,installedPathSuffix:`/SKILL.md`,explorerPathSuffix:`/SKILL.md`,sortByName:!0,removedToastTitle:`Skill removed`}),h=s(e=>e.projects),g=(0,Z.useMemo)(()=>h.find(t=>t.projectId===e)??null,[h,e]),[v,y]=(0,Z.useState)(!1),[b,x]=(0,Z.useState)(!1),[S,C]=(0,Z.useState)(null),[w,T]=(0,Z.useState)([]),[E,D]=(0,Z.useState)(!0),[O,A]=(0,Z.useState)(null),[j,N]=(0,Z.useState)(!1),{query:ee,setQuery:te,deferredQuery:P}=Be(),{sources:F,selectedSourceId:I,setSelectedSourceId:re,addSource:ie,updateSource:ae,removeSource:oe,catalogSkills:L,isLoadingCatalog:z}=tt(),B=I==="default",V=(0,Z.useMemo)(()=>o(I)?F.find(e=>e.id===I)??null:null,[I,F]);(0,Z.useEffect)(()=>{D(!0),k().then(T).catch(()=>T([])).finally(()=>D(!1))},[]);let U=Fe(e?`${e}:${t??``}`:null,[r,E]),se=(0,Z.useCallback)(async e=>{let n=`.agents/skills/${e.id}/SKILL.md`;if(!t||l.has(n))return;let r=e.sourceId??(I==="default"?void 0:I);try{if(r)await ne(t,r,e.id,`.agents/skills/${e.id}`);else{let r=[`---`,`name: ${e.id}`,`description: ${e.description}`];e.allowedTools&&r.push(`allowed-tools: ${e.allowedTools}`),e.license&&r.push(`license: ${e.license}`),r.push(`---`,``,e.instructions??``),await M(t,n,r.join(`
3
+ `))}u(e=>new Set(e).add(n)),m(),d(),R({title:`Skill installed`,description:e.name})}catch(e){throw R({title:`Error`,description:e instanceof Error?e.message:`Failed to install skill`,variant:`destructive`}),e}},[t,I,l,m,d]),ce=(0,Z.useMemo)(()=>ft(w,P),[w,P]),le=(0,Z.useMemo)(()=>ft(L,P),[L,P]),ue=!B&&z&&L.length===0;return e?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(Ce,{loading:U,children:[(0,Q.jsx)(mt,{skills:n,threadId:t,onOpenSkill:p,onDelete:a,onAddManual:()=>y(!0),onAddUrl:()=>x(!0)}),(0,Q.jsx)(yt,{availableSearch:ee,onSearchChange:te,selectedSourceId:I,onSourceChange:re,sources:F,selectedCustomSource:V,availableCatalogLoading:ue,isDefaultSource:B,filteredPopular:ce,filteredCatalog:le,installedFilePaths:l,onPreviewPopular:e=>A(e),onPreviewCatalog:e=>A({...e,sourceId:e.sourceId??I}),onAddSource:()=>N(!0)})]}),(0,Q.jsx)(Qe,{open:O!==null,onOpenChange:e=>{e||A(null)},skill:O,catalogSourceId:B?void 0:I,onInstall:se}),(0,Q.jsx)(it,{open:j,onOpenChange:N,editingSource:V,onSourceAdded:e=>{ie(e),R({title:`Skill source added`,description:`${e.title} is now available in the source list.`})},onSourceUpdated:e=>{ae(e),R({title:`Skill source updated`,description:`${e.title} has been saved.`})},onSourceDeleted:e=>{oe(e),R({title:`Skill source removed`,description:`The custom source has been deleted.`})}}),(0,Q.jsx)(W,{open:v,onOpenChange:y,children:(0,Q.jsx)(H,{className:`max-w-2xl max-h-[90vh] overflow-y-auto p-0`,children:(0,Q.jsx)(qe,{threadId:t,onSkillCreated:()=>{y(!1),d(),m()}})})}),(0,Q.jsx)(lt,{open:b,onOpenChange:x,onSubmit:e=>C(e)}),(0,Q.jsx)(Ee,{url:S,projectId:e,projectName:g?_(g):null,projects:h,onSelectProject:()=>{},onClose:()=>C(null),onInstalled:({mcpOnly:e})=>{d(),m(),R({title:e?`MCP server installed`:`Plugin installed`,description:e?`Its MCP servers were added to this project.`:`Its skills and MCP servers were added to this project.`})}}),(0,Q.jsx)(Pe,{open:i!==null,onOpenChange:e=>!e&&a(null),title:`Delete Skill`,description:`Are you sure you want to delete the skill "${i?.name}"? This action cannot be undone.`,onConfirm:()=>{i&&f(i)},confirming:c})]}):(0,Q.jsx)(ye,{children:`Select a project to manage skills.`})}export{xt as SettingsSkillsView,xt as default};
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-BWuYHVi8.js";import{D as i,Et as a,mn as o,yn as s}from"./dist-DIjomljy.js";import{t as c}from"./utils-CT-Dw22R.js";import{t as l}from"./button-DeNw35VZ.js";import{Ft as u,M as d,Pt as f,Tt as p,p as m,wn as h,x as g}from"./api-BMo_Lz8f.js";import{t as _}from"./use-toast-xpb5jNtN.js";import{An as v,At as y,Dn as b,Fn as x,Ft as S,Mt as C,Nt as w,Ot as T,Rn as E,kt as D}from"./index-DjaVbFDB.js";var O=e(t(),1),k=n();function A(){let[e,t]=(0,O.useState)(null),[n,A]=(0,O.useState)([]),[j,M]=(0,O.useState)(``),[N,P]=(0,O.useState)(``),[F,I]=(0,O.useState)(``),[L,R]=(0,O.useState)(``),[z,B]=(0,O.useState)(``),[V,H]=(0,O.useState)(!0),[U,W]=(0,O.useState)(!1),[G,K]=(0,O.useState)(!1),q=(0,O.useCallback)(async()=>{let[e,n]=await Promise.all([u(),p()]);t(e),A(n.projects)},[]);(0,O.useEffect)(()=>{let e=!1;async function n(){H(!0);try{let[n,r,i]=await Promise.all([u(),p(),f()]);e||(t(n),A(r.projects),B(i.manifest),r.projects[0]&&!L&&R(r.projects[0].projectId))}catch(e){_({title:`Failed to load Slack settings`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{e||H(!1)}}return n(),()=>{e=!0}},[]);async function J(){if(!(!j.trim()||!N.trim())){W(!0);try{await h({botToken:j.trim(),appToken:N.trim()}),M(``),P(``),await q(),_({title:`Slack tokens saved`})}catch(e){_({title:`Failed to save tokens`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{W(!1)}}}async function Y(){W(!0);try{await m(),await q(),_({title:`Slack tokens cleared`})}catch(e){_({title:`Failed to clear tokens`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{W(!1)}}async function X(){let t=F.trim();if(!(!t||!L)){K(!0);try{let n=e?.channels.find(e=>e.id===t);await g({slackChannelId:t,projectId:L,...n?{slackChannelName:n.name}:{}}),I(``),await q(),_({title:`Channel bound`})}catch(e){_({title:`Failed to bind channel`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{K(!1)}}}async function Z(e){try{await d(e.slackTeamId,e.slackChannelId),await q(),_({title:`Binding removed`})}catch(e){_({title:`Failed to remove binding`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}}async function Q(){try{await navigator.clipboard.writeText(z||(await f()).manifest),_({title:`Manifest copied`})}catch(e){_({title:`Failed to copy manifest`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}}if(V||!e)return(0,k.jsx)(E,{title:`Slack`,description:`Loading Slack settings…`,children:(0,k.jsxs)(`div`,{className:c(`flex items-center gap-2 text-muted-foreground`,r.compact),children:[(0,k.jsx)(a,{className:`h-4 w-4 animate-spin`}),`Loading Slack settings…`]})});let $=e.configured?[e.botUsername?`@${e.botUsername}`:e.botTokenPreview,`Bridge ${e.bridgeRunning?`running`:`stopped`}`,e.teamName].filter(Boolean).join(` · `):`Not configured`;return(0,k.jsx)(E,{title:`Slack`,description:`Connect a Slack app (Socket Mode) and bind channels to Tarsk projects.`,children:(0,k.jsxs)(`div`,{className:`flex flex-col gap-8`,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(v,{title:`Slack App`}),(0,k.jsxs)(x,{children:[(0,k.jsx)(b,{title:`App Manifest`,description:`Create a Slack app from this manifest, enable Socket Mode, then paste the Bot and App-Level tokens below. The Slack manifest cannot include an app icon — download the Tarsk logo and upload it under Basic Information after creating the app.`,controlLayout:`row-end`,action:(0,k.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,k.jsxs)(l,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>void Q(),children:[(0,k.jsx)(s,{className:`mr-2 h-4 w-4`}),`Copy app manifest`]}),(0,k.jsx)(l,{type:`button`,variant:`outline`,size:`sm`,asChild:!0,children:(0,k.jsxs)(`a`,{href:`/slack-app-icon.png`,download:`tarsk-slack-app-icon.png`,children:[(0,k.jsx)(o,{className:`mr-2 h-4 w-4`}),`Download app icon`]})})]})}),(0,k.jsx)(b,{title:`Status`,description:`Bot identity and Socket Mode bridge status.`,children:(0,k.jsx)(`span`,{className:c(`text-muted-foreground`,r.bodyMuted),children:$})}),(0,k.jsx)(b,{title:`Bot Token`,description:`Bot User OAuth Token from your Slack app (starts with xoxb-).`,children:(0,k.jsx)(S,{id:`slack-bot-token`,type:`password`,autoComplete:`off`,placeholder:e.botTokenPreview||`xoxb-…`,value:j,onChange:e=>M(e.target.value)})}),(0,k.jsx)(b,{title:`App-Level Token`,description:`App-Level Token with connections:write for Socket Mode (starts with xapp-).`,children:(0,k.jsx)(S,{id:`slack-app-token`,type:`password`,autoComplete:`off`,placeholder:e.appTokenPreview||`xapp-…`,value:N,onChange:e=>P(e.target.value)})}),(0,k.jsx)(b,{title:`Tokens`,description:`Save both tokens to start the bridge, or clear them to disconnect.`,controlLayout:`row-end`,action:(0,k.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,k.jsxs)(l,{type:`button`,onClick:()=>void J(),disabled:U||!j.trim()||!N.trim(),children:[U?(0,k.jsx)(a,{className:`mr-2 h-4 w-4 animate-spin`}):null,`Save`]}),e.configured?(0,k.jsx)(l,{type:`button`,variant:`outline`,onClick:()=>void Y(),disabled:U,children:`Clear`}):null]})})]})]}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(v,{title:`Channel Bindings`}),(0,k.jsxs)(x,{children:[(0,k.jsx)(b,{title:`Slack Channel`,description:`Invite the bot to the channel first. Only channels the bot can see are listed.`,children:e.channels.length>0?(0,k.jsxs)(T,{value:F||void 0,onValueChange:I,children:[(0,k.jsx)(C,{id:`slack-channel`,"aria-label":`Slack Channel`,children:(0,k.jsx)(w,{placeholder:`Select a channel…`})}),(0,k.jsx)(D,{children:e.channels.map(e=>(0,k.jsx)(y,{value:e.id,children:e.name},e.id))})]}):(0,k.jsx)(S,{id:`slack-channel`,placeholder:`Channel ID (C…)`,value:F,onChange:e=>I(e.target.value)})}),(0,k.jsx)(b,{title:`Tarsk Project`,description:`Each Slack channel maps to one Tarsk project.`,children:(0,k.jsxs)(T,{value:L||void 0,onValueChange:R,disabled:n.length===0,children:[(0,k.jsx)(C,{id:`slack-project`,"aria-label":`Tarsk Project`,children:(0,k.jsx)(w,{placeholder:n.length===0?`No projects`:`Select a project…`})}),(0,k.jsx)(D,{children:n.map(e=>(0,k.jsx)(y,{value:e.projectId,children:e.name},e.projectId))})]})}),(0,k.jsx)(b,{title:`Bind`,description:`Create a channel ↔ project binding.`,controlLayout:`row-end`,action:(0,k.jsxs)(l,{type:`button`,onClick:()=>void X(),disabled:G||!F.trim()||!L,children:[G?(0,k.jsx)(a,{className:`mr-2 h-4 w-4 animate-spin`}):null,`Bind channel`]})})]}),(0,k.jsx)(`div`,{className:`mt-4 flex flex-col gap-2`,children:e.bindings.length===0?(0,k.jsx)(`p`,{className:c(`text-muted-foreground`,r.compact),children:`No bindings yet.`}):e.bindings.map(e=>{let t=n.find(t=>t.projectId===e.projectId)?.name||e.projectId;return(0,k.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border px-3 py-2`,children:[(0,k.jsxs)(`div`,{className:c(r.compact),children:[(0,k.jsx)(`div`,{className:`font-medium`,children:e.slackChannelName||e.slackChannelId}),(0,k.jsx)(`div`,{className:`text-muted-foreground`,children:t})]}),(0,k.jsx)(l,{type:`button`,variant:`ghost`,size:`icon`,onClick:()=>void Z(e),"aria-label":`Remove binding`,children:(0,k.jsx)(i,{className:`h-4 w-4`})})]},`${e.slackTeamId}:${e.slackChannelId}`)})})]})]})})}export{A as default};
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-DjiNKpTV.js";import{D as i,Et as a,pn as o,vn as s}from"./dist-CNOCRPxn.js";import{t as c}from"./utils-CT-Dw22R.js";import{t as l}from"./button-B6HDsfd5.js";import{Ft as u,M as d,Pt as f,Tt as p,p as m,wn as h,x as g}from"./api-D1GxdEEp.js";import{t as _}from"./use-toast-xpb5jNtN.js";import{An as v,At as y,Dn as b,It as x,Nt as S,Pt as C,Sn as w,jt as T,kt as E,yn as D}from"./index-BOB3ZUQs.js";var O=e(t(),1),k=n();function A(){let[e,t]=(0,O.useState)(null),[n,A]=(0,O.useState)([]),[j,M]=(0,O.useState)(``),[N,P]=(0,O.useState)(``),[F,I]=(0,O.useState)(``),[L,R]=(0,O.useState)(``),[z,B]=(0,O.useState)(``),[V,H]=(0,O.useState)(!0),[U,W]=(0,O.useState)(!1),[G,K]=(0,O.useState)(!1),q=(0,O.useCallback)(async()=>{let[e,n]=await Promise.all([u(),p()]);t(e),A(n.projects)},[]);(0,O.useEffect)(()=>{let e=!1;async function n(){H(!0);try{let[n,r,i]=await Promise.all([u(),p(),f()]);e||(t(n),A(r.projects),B(i.manifest),r.projects[0]&&!L&&R(r.projects[0].projectId))}catch(e){_({title:`Failed to load Slack settings`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{e||H(!1)}}return n(),()=>{e=!0}},[]);async function J(){if(!(!j.trim()||!N.trim())){W(!0);try{await h({botToken:j.trim(),appToken:N.trim()}),M(``),P(``),await q(),_({title:`Slack tokens saved`})}catch(e){_({title:`Failed to save tokens`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{W(!1)}}}async function Y(){W(!0);try{await m(),await q(),_({title:`Slack tokens cleared`})}catch(e){_({title:`Failed to clear tokens`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{W(!1)}}async function X(){let t=F.trim();if(!(!t||!L)){K(!0);try{let n=e?.channels.find(e=>e.id===t);await g({slackChannelId:t,projectId:L,...n?{slackChannelName:n.name}:{}}),I(``),await q(),_({title:`Channel bound`})}catch(e){_({title:`Failed to bind channel`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{K(!1)}}}async function Z(e){try{await d(e.slackTeamId,e.slackChannelId),await q(),_({title:`Binding removed`})}catch(e){_({title:`Failed to remove binding`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}}async function Q(){try{await navigator.clipboard.writeText(z||(await f()).manifest),_({title:`Manifest copied`})}catch(e){_({title:`Failed to copy manifest`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}}if(V||!e)return(0,k.jsx)(v,{title:`Slack`,description:`Loading Slack settings…`,children:(0,k.jsxs)(`div`,{className:c(`flex items-center gap-2 text-muted-foreground`,r.compact),children:[(0,k.jsx)(a,{className:`h-4 w-4 animate-spin`}),`Loading Slack settings…`]})});let $=e.configured?[e.botUsername?`@${e.botUsername}`:e.botTokenPreview,`Bridge ${e.bridgeRunning?`running`:`stopped`}`,e.teamName].filter(Boolean).join(` · `):`Not configured`;return(0,k.jsx)(v,{title:`Slack`,description:`Connect a Slack app (Socket Mode) and bind channels to Tarsk projects.`,children:(0,k.jsxs)(`div`,{className:`flex flex-col gap-8`,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(w,{title:`Slack App`}),(0,k.jsxs)(b,{children:[(0,k.jsx)(D,{title:`App Manifest`,description:`Create a Slack app from this manifest, enable Socket Mode, then paste the Bot and App-Level tokens below. The Slack manifest cannot include an app icon — download the Tarsk logo and upload it under Basic Information after creating the app.`,controlLayout:`row-end`,action:(0,k.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,k.jsxs)(l,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>void Q(),children:[(0,k.jsx)(s,{className:`mr-2 h-4 w-4`}),`Copy app manifest`]}),(0,k.jsx)(l,{type:`button`,variant:`outline`,size:`sm`,asChild:!0,children:(0,k.jsxs)(`a`,{href:`/slack-app-icon.png`,download:`tarsk-slack-app-icon.png`,children:[(0,k.jsx)(o,{className:`mr-2 h-4 w-4`}),`Download app icon`]})})]})}),(0,k.jsx)(D,{title:`Status`,description:`Bot identity and Socket Mode bridge status.`,children:(0,k.jsx)(`span`,{className:c(`text-muted-foreground`,r.bodyMuted),children:$})}),(0,k.jsx)(D,{title:`Bot Token`,description:`Bot User OAuth Token from your Slack app (starts with xoxb-).`,children:(0,k.jsx)(x,{id:`slack-bot-token`,type:`password`,autoComplete:`off`,placeholder:e.botTokenPreview||`xoxb-…`,value:j,onChange:e=>M(e.target.value)})}),(0,k.jsx)(D,{title:`App-Level Token`,description:`App-Level Token with connections:write for Socket Mode (starts with xapp-).`,children:(0,k.jsx)(x,{id:`slack-app-token`,type:`password`,autoComplete:`off`,placeholder:e.appTokenPreview||`xapp-…`,value:N,onChange:e=>P(e.target.value)})}),(0,k.jsx)(D,{title:`Tokens`,description:`Save both tokens to start the bridge, or clear them to disconnect.`,controlLayout:`row-end`,action:(0,k.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,k.jsxs)(l,{type:`button`,onClick:()=>void J(),disabled:U||!j.trim()||!N.trim(),children:[U?(0,k.jsx)(a,{className:`mr-2 h-4 w-4 animate-spin`}):null,`Save`]}),e.configured?(0,k.jsx)(l,{type:`button`,variant:`outline`,onClick:()=>void Y(),disabled:U,children:`Clear`}):null]})})]})]}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(w,{title:`Channel Bindings`}),(0,k.jsxs)(b,{children:[(0,k.jsx)(D,{title:`Slack Channel`,description:`Invite the bot to the channel first. Only channels the bot can see are listed.`,children:e.channels.length>0?(0,k.jsxs)(E,{value:F||void 0,onValueChange:I,children:[(0,k.jsx)(S,{id:`slack-channel`,"aria-label":`Slack Channel`,children:(0,k.jsx)(C,{placeholder:`Select a channel…`})}),(0,k.jsx)(y,{children:e.channels.map(e=>(0,k.jsx)(T,{value:e.id,children:e.name},e.id))})]}):(0,k.jsx)(x,{id:`slack-channel`,placeholder:`Channel ID (C…)`,value:F,onChange:e=>I(e.target.value)})}),(0,k.jsx)(D,{title:`Tarsk Project`,description:`Each Slack channel maps to one Tarsk project.`,children:(0,k.jsxs)(E,{value:L||void 0,onValueChange:R,disabled:n.length===0,children:[(0,k.jsx)(S,{id:`slack-project`,"aria-label":`Tarsk Project`,children:(0,k.jsx)(C,{placeholder:n.length===0?`No projects`:`Select a project…`})}),(0,k.jsx)(y,{children:n.map(e=>(0,k.jsx)(T,{value:e.projectId,children:e.name},e.projectId))})]})}),(0,k.jsx)(D,{title:`Bind`,description:`Create a channel ↔ project binding.`,controlLayout:`row-end`,action:(0,k.jsxs)(l,{type:`button`,onClick:()=>void X(),disabled:G||!F.trim()||!L,children:[G?(0,k.jsx)(a,{className:`mr-2 h-4 w-4 animate-spin`}):null,`Bind channel`]})})]}),(0,k.jsx)(`div`,{className:`mt-4 flex flex-col gap-2`,children:e.bindings.length===0?(0,k.jsx)(`p`,{className:c(`text-muted-foreground`,r.compact),children:`No bindings yet.`}):e.bindings.map(e=>{let t=n.find(t=>t.projectId===e.projectId)?.name||e.projectId;return(0,k.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border px-3 py-2`,children:[(0,k.jsxs)(`div`,{className:c(r.compact),children:[(0,k.jsx)(`div`,{className:`font-medium`,children:e.slackChannelName||e.slackChannelId}),(0,k.jsx)(`div`,{className:`text-muted-foreground`,children:t})]}),(0,k.jsx)(l,{type:`button`,variant:`ghost`,size:`icon`,onClick:()=>void Z(e),"aria-label":`Remove binding`,children:(0,k.jsx)(i,{className:`h-4 w-4`})})]},`${e.slackTeamId}:${e.slackChannelId}`)})})]})]})})}export{A as default};
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-BWuYHVi8.js";import{r as i}from"./store-BaMSfYoJ.js";import{k as a}from"./dist-DIjomljy.js";import{t as o}from"./utils-CT-Dw22R.js";import{t as s}from"./button-DeNw35VZ.js";import{It as c,N as l,S as u,Zn as d,nr as f}from"./api-BMo_Lz8f.js";import{t as p}from"./use-toast-xpb5jNtN.js";import{r as m,t as h}from"./dialog-Do98zzAW.js";import{n as g}from"./explorer-tab-context-BxUVwWQQ.js";import{t as _}from"./use-open-chat-dock-panel-Cr1bQYOH.js";import{Bn as v,Dn as y,En as b,Ft as x,In as S,Ln as C,Nn as w,On as ee,Pt as T,kn as E,zn as D}from"./index-DjaVbFDB.js";import{t as O}from"./delete-confirm-dialog-C9NASyh6.js";import{n as k,t as A}from"./radio-group-CU59hGiA.js";import{t as j}from"./use-settings-page-loading-BTySlInF.js";import{a as M,i as N,o as te,r as P}from"./settings-list-DU82HNPX.js";import{a as F,i as I,r as L,t as R}from"./mcp-server-card-zm-ss-7h.js";var z=e(t(),1),B=n();function V({projectId:e,threadId:t,onCommandCreated:n}){let[i,a]=(0,z.useState)(``),[s,c]=(0,z.useState)(``),[l,d]=(0,z.useState)(``),[f,m]=(0,z.useState)(`default`),[h,g]=(0,z.useState)(!1),_=I(i),v=L(_),C=async()=>{if(!(!v||!e)){g(!0);try{await u(_,``,{description:s.trim()||void 0,argumentHint:l.trim()||void 0,mode:f===`plan`?`plan`:void 0},`project`,t??void 0),p({title:`Command created`,description:`Command '/${_}' was created successfully.`}),a(``),c(``),d(``),m(`default`),n?.(_)}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to create command`,variant:`destructive`})}finally{g(!1)}}};return e?(0,B.jsx)(D,{children:(0,B.jsxs)(b,{children:[(0,B.jsx)(E,{title:`Add Slash Command`,description:`Saved as a .md file in ~/.agents/commands.`,sticky:!0,className:`pr-10`}),(0,B.jsxs)(`div`,{children:[(0,B.jsxs)(y,{title:`Command Name`,controlLayout:`stack`,className:`pt-6`,children:[(0,B.jsx)(x,{id:`commandName`,value:i,onChange:e=>a(e.target.value),placeholder:`e.g. review`,disabled:h}),i?(0,B.jsxs)(`p`,{className:o(r.caption,`mt-2`),children:[`Command: `,(0,B.jsxs)(`span`,{className:`font-mono`,children:[`/`,_||`...`]})]}):null]}),(0,B.jsx)(y,{title:`Description`,controlLayout:`stack`,className:`pt-6`,children:(0,B.jsx)(x,{id:`commandDescription`,value:s,onChange:e=>c(e.target.value),placeholder:`Brief description shown in autocomplete`,disabled:h})}),(0,B.jsx)(y,{title:`Argument Hint`,description:`Shows after the command name to guide users what to type`,controlLayout:`stack`,className:`pt-6`,children:(0,B.jsx)(x,{id:`argumentHint`,value:l,onChange:e=>d(e.target.value),placeholder:`e.g. <focus-area> or <branch-name>`,disabled:h})}),(0,B.jsx)(y,{title:`Mode`,description:f==="default"?`Standard chat mode`:`Activates plan mode when this command is used`,controlLayout:`stack`,className:`pt-6`,children:(0,B.jsxs)(A,{value:f,onValueChange:e=>m(e),className:`flex gap-4`,disabled:h,children:[(0,B.jsxs)(`div`,{className:`flex items-center space-x-2`,children:[(0,B.jsx)(k,{value:`default`,id:`mode-default`}),(0,B.jsx)(T,{htmlFor:`mode-default`,className:o(r.labelNormal,`cursor-pointer`),children:`Default`})]}),(0,B.jsxs)(`div`,{className:`flex items-center space-x-2`,children:[(0,B.jsx)(k,{value:`plan`,id:`mode-plan`}),(0,B.jsx)(T,{htmlFor:`mode-plan`,className:o(r.labelNormal,`cursor-pointer`),children:`Plan`})]})]})}),(0,B.jsx)(F,{onContinue:()=>void C(),disabled:!v,creating:h})]})]})}):(0,B.jsx)(S,{title:`No project selected`,children:`Please select a project to add a slash command.`})}function H(){let e=i(e=>e.selectedProjectId),t=i(e=>e.selectedThreadId),{openChatDockPanel:n}=_(),{setPendingExplorerPath:y,triggerExplorerRefresh:b,setExplorerClearPath:x}=g(),[T,D]=(0,z.useState)([]),[k,A]=(0,z.useState)(!0),[F,I]=(0,z.useState)(!1),[L,H]=(0,z.useState)(null),[U,W]=(0,z.useState)(!1),[G,K]=(0,z.useState)([]),[q,J]=(0,z.useState)(!0),[Y,X]=(0,z.useState)(new Map),[Z,ne]=(0,z.useState)(``),Q=(0,z.useCallback)(async()=>{if(!t){A(!1),D([]),X(new Map);return}A(!0);try{let e=await c(t);D(e.filter(e=>!e.isBuiltIn)),X(new Map(e.map(e=>[e.name,e.filePath])))}catch{D([]),X(new Map)}finally{A(!1)}},[t]);(0,z.useLayoutEffect)(()=>{t&&A(!0)},[e,t]),(0,z.useEffect)(()=>{Q()},[Q]),(0,z.useEffect)(()=>{J(!0),d().then(K).catch(()=>K([])).finally(()=>J(!1))},[]);let re=j(e?`${e}:${t??``}`:null,[k,q]),ie=(0,z.useCallback)(async e=>{W(!0);try{await l(e.filePath),x(e.filePath),b(),X(t=>{let n=new Map(t);return n.delete(e.name),n}),p({title:`Command removed`,description:`/${e.name}`}),H(null),await Q()}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to remove command`,variant:`destructive`})}finally{W(!1)}},[Q,b,x]),ae=(0,z.useCallback)(e=>{y(e),n(`explorer`)},[y,n]),oe=(0,z.useCallback)(e=>{let t=e.metadata?.description?.trim();return t&&t.length>0?t:`No description`},[]),se=(0,z.useCallback)(async e=>{if(!(!t||Y.has(e.name)))try{if(e.gitHubRepo&&e.gitHubFolder){let n=`.agents/commands`;await f(t,e.gitHubRepo,e.gitHubFolder,n);let r=`${n}/${e.name}.md`;X(t=>new Map(t).set(e.name,r))}else{let n=await u(e.name,e.content,{description:e.description,argumentHint:e.argumentHint},`project`,t);X(t=>new Map(t).set(e.name,n.filePath))}b(),Q(),p({title:`Command installed`,description:`/${e.name}`})}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to install command`,variant:`destructive`})}},[t,Y,b,Q]),$=Z.trim()?G.filter(e=>e.name.toLowerCase().includes(Z.toLowerCase())||e.description.toLowerCase().includes(Z.toLowerCase())):G;return e?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(w,{loading:re,children:[(0,B.jsxs)(v,{className:`shrink-0`,children:[(0,B.jsx)(E,{title:`Installed Slash Commands`,description:`Project slash commands you run with / in chat.`,action:(0,B.jsx)(s,{onClick:()=>I(!0),disabled:!t,children:`Add Command`}),sticky:!1}),(0,B.jsxs)(C,{className:`pt-6`,children:[!t&&(0,B.jsx)(ee,{children:`Select a thread to add or install slash commands.`}),(0,B.jsx)(P,{showHeader:!1,loading:!1,items:T,emptyState:{icon:a,title:`No slash commands installed`,description:`Add slash commands to create quick actions in chat.`},getKey:e=>e.filePath,columnsClassName:`grid-cols-[minmax(0,1fr)_auto_1.75rem]`,renderContent:e=>(0,B.jsxs)(`div`,{className:`min-w-0 text-left`,children:[(0,B.jsxs)(`div`,{className:o(r.body,`truncate`),children:[`/`,e.name]}),(0,B.jsx)(`div`,{className:o(r.compact,`truncate text-muted-foreground`),children:oe(e)})]}),renderMiddle:e=>e.metadata?.mode?(0,B.jsx)(`span`,{className:o(r.compact,`bg-muted px-1.5 py-0.5 rounded flex-shrink-0`),children:e.metadata.mode}):(0,B.jsx)(`div`,{}),onItemClick:e=>ae(e.filePath),itemClickLabel:e=>`Open /${e.name} in Files`,onDelete:H,deleteAriaLabel:e=>`Delete /${e.name}`,deleteTooltip:`Remove this slash command from the project`})]})]}),(0,B.jsxs)(v,{className:`shrink-0`,children:[(0,B.jsx)(E,{title:`Available Slash Commands`,description:`Browse and install slash commands from the catalog.`,action:(0,B.jsx)(te,{placeholder:`Search`,value:Z,onChange:ne,className:`mb-0 w-64`}),sticky:!1}),(0,B.jsx)(C,{className:`pt-6`,children:$.length===0?(0,B.jsx)(M,{searchQuery:Z,emptyLabel:`No available commands found.`}):(0,B.jsx)(N,{children:$.map(e=>{let t=Y.has(e.name);return(0,B.jsx)(R,{className:`bg-background hover:bg-background`,name:`/${e.name}`,description:e.description,installed:t,onClick:()=>{t||se(e)},showInstalledControls:!1},e.id)})})})]})]}),(0,B.jsx)(h,{open:F,onOpenChange:I,children:(0,B.jsx)(m,{className:`max-w-2xl max-h-[90vh] overflow-y-auto p-0`,children:(0,B.jsx)(V,{projectId:e,threadId:t,onCommandCreated:()=>{I(!1),Q(),b()}})})}),(0,B.jsx)(O,{open:L!==null,onOpenChange:e=>!e&&H(null),title:`Delete Slash Command`,description:`Are you sure you want to delete "/${L?.name}"? This action cannot be undone.`,onConfirm:()=>{L&&ie(L)},confirming:U})]}):(0,B.jsx)(S,{children:`Select a project to manage slash commands.`})}export{H as SettingsSlashCommandsView,H as default};
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-DjiNKpTV.js";import{r as i}from"./store-CHF6tOp2.js";import{k as a}from"./dist-CNOCRPxn.js";import{t as o}from"./utils-CT-Dw22R.js";import{t as s}from"./button-B6HDsfd5.js";import{It as c,N as l,Qn as u,S as d,rr as f}from"./api-D1GxdEEp.js";import{t as p}from"./use-toast-xpb5jNtN.js";import{r as m,t as h}from"./dialog--0foS3aw.js";import{n as g}from"./explorer-tab-context-BxUVwWQQ.js";import{t as _}from"./use-open-chat-dock-panel-B31lwcQF.js";import{Ft as v,It as y,Mn as b,On as x,Tn as S,bn as ee,jn as C,kn as w,vn as T,xn as E,yn as D}from"./index-BOB3ZUQs.js";import{t as O}from"./delete-confirm-dialog-3DX1u0Dg.js";import{n as k,t as A}from"./radio-group-CMW5ku-w.js";import{t as j}from"./use-settings-page-loading-BTySlInF.js";import{a as M,i as N,o as te,r as P}from"./settings-list-BpPbGcpS.js";import{a as F,i as I,r as L,t as R}from"./mcp-server-card-DFT7uyRh.js";var z=e(t(),1),B=n();function V({projectId:e,threadId:t,onCommandCreated:n}){let[i,a]=(0,z.useState)(``),[s,c]=(0,z.useState)(``),[l,u]=(0,z.useState)(``),[f,m]=(0,z.useState)(`default`),[h,g]=(0,z.useState)(!1),_=I(i),b=L(_),S=async()=>{if(!(!b||!e)){g(!0);try{await d(_,``,{description:s.trim()||void 0,argumentHint:l.trim()||void 0,mode:f===`plan`?`plan`:void 0},`project`,t??void 0),p({title:`Command created`,description:`Command '/${_}' was created successfully.`}),a(``),c(``),u(``),m(`default`),n?.(_)}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to create command`,variant:`destructive`})}finally{g(!1)}}};return e?(0,B.jsx)(C,{children:(0,B.jsxs)(T,{children:[(0,B.jsx)(E,{title:`Add Slash Command`,description:`Saved as a .md file in ~/.agents/commands.`,sticky:!0,className:`pr-10`}),(0,B.jsxs)(`div`,{children:[(0,B.jsxs)(D,{title:`Command Name`,controlLayout:`stack`,className:`pt-6`,children:[(0,B.jsx)(y,{id:`commandName`,value:i,onChange:e=>a(e.target.value),placeholder:`e.g. review`,disabled:h}),i?(0,B.jsxs)(`p`,{className:o(r.caption,`mt-2`),children:[`Command: `,(0,B.jsxs)(`span`,{className:`font-mono`,children:[`/`,_||`...`]})]}):null]}),(0,B.jsx)(D,{title:`Description`,controlLayout:`stack`,className:`pt-6`,children:(0,B.jsx)(y,{id:`commandDescription`,value:s,onChange:e=>c(e.target.value),placeholder:`Brief description shown in autocomplete`,disabled:h})}),(0,B.jsx)(D,{title:`Argument Hint`,description:`Shows after the command name to guide users what to type`,controlLayout:`stack`,className:`pt-6`,children:(0,B.jsx)(y,{id:`argumentHint`,value:l,onChange:e=>u(e.target.value),placeholder:`e.g. <focus-area> or <branch-name>`,disabled:h})}),(0,B.jsx)(D,{title:`Mode`,description:f==="default"?`Standard chat mode`:`Activates plan mode when this command is used`,controlLayout:`stack`,className:`pt-6`,children:(0,B.jsxs)(A,{value:f,onValueChange:e=>m(e),className:`flex gap-4`,disabled:h,children:[(0,B.jsxs)(`div`,{className:`flex items-center space-x-2`,children:[(0,B.jsx)(k,{value:`default`,id:`mode-default`}),(0,B.jsx)(v,{htmlFor:`mode-default`,className:o(r.labelNormal,`cursor-pointer`),children:`Default`})]}),(0,B.jsxs)(`div`,{className:`flex items-center space-x-2`,children:[(0,B.jsx)(k,{value:`plan`,id:`mode-plan`}),(0,B.jsx)(v,{htmlFor:`mode-plan`,className:o(r.labelNormal,`cursor-pointer`),children:`Plan`})]})]})}),(0,B.jsx)(F,{onContinue:()=>void S(),disabled:!b,creating:h})]})]})}):(0,B.jsx)(x,{title:`No project selected`,children:`Please select a project to add a slash command.`})}function H(){let e=i(e=>e.selectedProjectId),t=i(e=>e.selectedThreadId),{openChatDockPanel:n}=_(),{setPendingExplorerPath:v,triggerExplorerRefresh:y,setExplorerClearPath:C}=g(),[T,D]=(0,z.useState)([]),[k,A]=(0,z.useState)(!0),[F,I]=(0,z.useState)(!1),[L,H]=(0,z.useState)(null),[U,W]=(0,z.useState)(!1),[G,K]=(0,z.useState)([]),[q,J]=(0,z.useState)(!0),[Y,X]=(0,z.useState)(new Map),[Z,ne]=(0,z.useState)(``),Q=(0,z.useCallback)(async()=>{if(!t){A(!1),D([]),X(new Map);return}A(!0);try{let e=await c(t);D(e.filter(e=>!e.isBuiltIn)),X(new Map(e.map(e=>[e.name,e.filePath])))}catch{D([]),X(new Map)}finally{A(!1)}},[t]);(0,z.useLayoutEffect)(()=>{t&&A(!0)},[e,t]),(0,z.useEffect)(()=>{Q()},[Q]),(0,z.useEffect)(()=>{J(!0),u().then(K).catch(()=>K([])).finally(()=>J(!1))},[]);let re=j(e?`${e}:${t??``}`:null,[k,q]),ie=(0,z.useCallback)(async e=>{W(!0);try{await l(e.filePath),C(e.filePath),y(),X(t=>{let n=new Map(t);return n.delete(e.name),n}),p({title:`Command removed`,description:`/${e.name}`}),H(null),await Q()}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to remove command`,variant:`destructive`})}finally{W(!1)}},[Q,y,C]),ae=(0,z.useCallback)(e=>{v(e),n(`explorer`)},[v,n]),oe=(0,z.useCallback)(e=>{let t=e.metadata?.description?.trim();return t&&t.length>0?t:`No description`},[]),se=(0,z.useCallback)(async e=>{if(!(!t||Y.has(e.name)))try{if(e.gitHubRepo&&e.gitHubFolder){let n=`.agents/commands`;await f(t,e.gitHubRepo,e.gitHubFolder,n);let r=`${n}/${e.name}.md`;X(t=>new Map(t).set(e.name,r))}else{let n=await d(e.name,e.content,{description:e.description,argumentHint:e.argumentHint},`project`,t);X(t=>new Map(t).set(e.name,n.filePath))}y(),Q(),p({title:`Command installed`,description:`/${e.name}`})}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to install command`,variant:`destructive`})}},[t,Y,y,Q]),$=Z.trim()?G.filter(e=>e.name.toLowerCase().includes(Z.toLowerCase())||e.description.toLowerCase().includes(Z.toLowerCase())):G;return e?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(S,{loading:re,children:[(0,B.jsxs)(b,{className:`shrink-0`,children:[(0,B.jsx)(E,{title:`Installed Slash Commands`,description:`Project slash commands you run with / in chat.`,action:(0,B.jsx)(s,{onClick:()=>I(!0),disabled:!t,children:`Add Command`}),sticky:!1}),(0,B.jsxs)(w,{className:`pt-6`,children:[!t&&(0,B.jsx)(ee,{children:`Select a thread to add or install slash commands.`}),(0,B.jsx)(P,{showHeader:!1,loading:!1,items:T,emptyState:{icon:a,title:`No slash commands installed`,description:`Add slash commands to create quick actions in chat.`},getKey:e=>e.filePath,columnsClassName:`grid-cols-[minmax(0,1fr)_auto_1.75rem]`,renderContent:e=>(0,B.jsxs)(`div`,{className:`min-w-0 text-left`,children:[(0,B.jsxs)(`div`,{className:o(r.body,`truncate`),children:[`/`,e.name]}),(0,B.jsx)(`div`,{className:o(r.compact,`truncate text-muted-foreground`),children:oe(e)})]}),renderMiddle:e=>e.metadata?.mode?(0,B.jsx)(`span`,{className:o(r.compact,`bg-muted px-1.5 py-0.5 rounded flex-shrink-0`),children:e.metadata.mode}):(0,B.jsx)(`div`,{}),onItemClick:e=>ae(e.filePath),itemClickLabel:e=>`Open /${e.name} in Files`,onDelete:H,deleteAriaLabel:e=>`Delete /${e.name}`,deleteTooltip:`Remove this slash command from the project`})]})]}),(0,B.jsxs)(b,{className:`shrink-0`,children:[(0,B.jsx)(E,{title:`Available Slash Commands`,description:`Browse and install slash commands from the catalog.`,action:(0,B.jsx)(te,{placeholder:`Search`,value:Z,onChange:ne,className:`mb-0 w-64`}),sticky:!1}),(0,B.jsx)(w,{className:`pt-6`,children:$.length===0?(0,B.jsx)(M,{searchQuery:Z,emptyLabel:`No available commands found.`}):(0,B.jsx)(N,{children:$.map(e=>{let t=Y.has(e.name);return(0,B.jsx)(R,{className:`bg-background hover:bg-background`,name:`/${e.name}`,description:e.description,installed:t,onClick:()=>{t||se(e)},showInstalledControls:!1},e.id)})})})]})]}),(0,B.jsx)(h,{open:F,onOpenChange:I,children:(0,B.jsx)(m,{className:`max-w-2xl max-h-[90vh] overflow-y-auto p-0`,children:(0,B.jsx)(V,{projectId:e,threadId:t,onCommandCreated:()=>{I(!1),Q(),y()}})})}),(0,B.jsx)(O,{open:L!==null,onOpenChange:e=>!e&&H(null),title:`Delete Slash Command`,description:`Are you sure you want to delete "/${L?.name}"? This action cannot be undone.`,onConfirm:()=>{L&&ie(L)},confirming:U})]}):(0,B.jsx)(x,{children:`Select a project to manage slash commands.`})}export{H as SettingsSlashCommandsView,H as default};
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,o as n,t as r}from"./react-vendor-Ee0-5T4I.js";import{S as i,ot as a}from"./dist-BWuYHVi8.js";import{t as o}from"./utils-CT-Dw22R.js";import{ut as s}from"./api-BMo_Lz8f.js";import{Rn as c}from"./index-DjaVbFDB.js";import{a as l,i as u,n as d,r as f,t as p}from"./table-B3fLagUj.js";import{n as m,t as h}from"./toggle-group-5tREtjoW.js";var g=t(),_=e(n(),1),v=i(`app.use-latency-stats.hook`),y={tools:[],models:[]};function b(){let[e,t]=(0,_.useState)([]),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)(!0),[o,c]=(0,_.useState)(null),l=(0,_.useCallback)(async function(){try{c(null);let e=await s();t(e.tools??y.tools),r(e.models??y.models)}catch(e){v.error(`Failed to load latency statistics`,e),c(e instanceof Error?e.message:`Failed to load statistics`)}finally{a(!1)}},[]);return(0,_.useEffect)(()=>{l()},[l]),{tools:e,models:n,isLoading:i,error:o,refresh:l}}var x=r(),S=[{value:`tools`,label:`Tools`},{value:`models`,label:`Models`}],C=`inline-flex rounded-full border bg-muted/40 p-1`,w=`rounded-full border-0 px-4 data-[state=on]:bg-foreground data-[state=on]:text-background data-[state=on]:shadow-sm`,T=`h-9`,E=`table-fixed`,D=o(a.body,`py-1.5`),O=o(a.body,`w-28 py-1.5 text-right tabular-nums`),k=o(a.body,`w-32 py-1.5 text-right tabular-nums`),A=`h-9 w-28 bg-transparent py-2 text-right`,j=`h-9 w-32 bg-transparent py-2 text-right`;function M(e){if(!Number.isFinite(e)||e<0)return`—`;if(e<1e3)return`${Math.round(e)}ms`;let t=e/1e3;return t<10?`${t.toFixed(1)}s`:`${Math.round(t)}s`}function N(e){let t=(0,g.c)(3),{view:n}=e,r;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(r=o(`w-full caption-bottom`,E,a.body),t[0]=r):r=t[0];let i;return t[1]===n?i=t[2]:(i=(0,x.jsx)(`table`,{className:r,children:(0,x.jsx)(`thead`,{className:`[&_tr]:border-b [&_tr]:border-table-border`,children:(0,x.jsx)(`tr`,{children:n===`tools`?(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(u,{className:`h-9 bg-transparent py-2`,children:`Tool`}),(0,x.jsx)(u,{className:A,children:`Calls`}),(0,x.jsx)(u,{className:j,children:`Latency`})]}):(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(u,{className:`h-9 bg-transparent py-2`,children:`Model`}),(0,x.jsx)(u,{className:A,children:`Requests`}),(0,x.jsx)(u,{className:j,children:`Latency`})]})})})}),t[1]=n,t[2]=i),i}function P(){let e=(0,g.c)(19),{tools:t,models:n,isLoading:r,error:i}=b(),[s,l]=(0,_.useState)(`tools`),u=s===`tools`&&!r&&t.length>0,f=s===`models`&&!r&&n.length>0,m=u||f,v;e[0]!==m||e[1]!==s?(v=m?(0,x.jsx)(N,{view:s}):void 0,e[0]=m,e[1]=s,e[2]=v):v=e[2];let y;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(y=e=>{(e===`tools`||e===`models`)&&l(e)},e[3]=y):y=e[3];let w;e[4]===Symbol.for(`react.memo_cache_sentinel`)?(w=S.map(L),e[4]=w):w=e[4];let T;e[5]===s?T=e[6]:(T=(0,x.jsx)(h,{type:`single`,value:s,onValueChange:y,"aria-label":`Statistics view`,variant:`outline`,className:C,children:w}),e[5]=s,e[6]=T);let D;e[7]===i?D=e[8]:(D=i?(0,x.jsx)(`p`,{className:o(a.bodyMuted,`mb-6 text-destructive`),children:i}):null,e[7]=i,e[8]=D);let O;e[9]!==r||e[10]!==n||e[11]!==t||e[12]!==s?(O=s===`tools`?r?(0,x.jsx)(`p`,{className:a.bodyMuted,children:`Loading…`}):t.length===0?(0,x.jsx)(`p`,{className:a.bodyMuted,children:`No tool call timings recorded yet. Stats appear after agent tool calls complete.`}):(0,x.jsx)(p,{className:E,children:(0,x.jsx)(d,{children:t.map(I)})}):r?(0,x.jsx)(`p`,{className:a.bodyMuted,children:`Loading…`}):n.length===0?(0,x.jsx)(`p`,{className:a.bodyMuted,children:`No model timings recorded yet. Stats appear after assistant responses complete.`}):(0,x.jsx)(p,{className:E,children:(0,x.jsx)(d,{children:n.map(F)})}),e[9]=r,e[10]=n,e[11]=t,e[12]=s,e[13]=O):O=e[13];let k;return e[14]!==v||e[15]!==T||e[16]!==D||e[17]!==O?(k=(0,x.jsxs)(c,{title:`Statistics`,description:`Average latency and request counts for tool calls and model responses.`,tableHeader:v,action:T,children:[D,O]}),e[14]=v,e[15]=T,e[16]=D,e[17]=O,e[18]=k):k=e[18],k}function F(e){return(0,x.jsxs)(l,{className:T,children:[(0,x.jsx)(f,{className:D,children:e.modelId}),(0,x.jsx)(f,{className:O,children:e.requestCount.toLocaleString()}),(0,x.jsx)(f,{className:k,children:M(e.averageDurationMs)})]},e.modelId)}function I(e){return(0,x.jsxs)(l,{className:T,children:[(0,x.jsx)(f,{className:D,children:e.toolName}),(0,x.jsx)(f,{className:O,children:e.callCount.toLocaleString()}),(0,x.jsx)(f,{className:k,children:M(e.averageDurationMs)})]},e.toolName)}function L(e){return(0,x.jsx)(m,{value:e.value,"aria-label":e.label,className:w,children:e.label},e.value)}export{P as default};
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,o as n,t as r}from"./react-vendor-Ee0-5T4I.js";import{S as i,ot as a}from"./dist-DjiNKpTV.js";import{t as o}from"./utils-CT-Dw22R.js";import{ut as s}from"./api-D1GxdEEp.js";import{An as c}from"./index-BOB3ZUQs.js";import{a as l,i as u,n as d,r as f,t as p}from"./table-MUx4ZxvS.js";import{n as m,t as h}from"./toggle-group-DMR7z3pz.js";var g=t(),_=e(n(),1),v=i(`app.use-latency-stats.hook`),y={tools:[],models:[]};function b(){let[e,t]=(0,_.useState)([]),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)(!0),[o,c]=(0,_.useState)(null),l=(0,_.useCallback)(async function(){try{c(null);let e=await s();t(e.tools??y.tools),r(e.models??y.models)}catch(e){v.error(`Failed to load latency statistics`,e),c(e instanceof Error?e.message:`Failed to load statistics`)}finally{a(!1)}},[]);return(0,_.useEffect)(()=>{l()},[l]),{tools:e,models:n,isLoading:i,error:o,refresh:l}}var x=r(),S=[{value:`tools`,label:`Tools`},{value:`models`,label:`Models`}],C=`inline-flex rounded-full border bg-muted/40 p-1`,w=`rounded-full border-0 px-4 data-[state=on]:bg-foreground data-[state=on]:text-background data-[state=on]:shadow-sm`,T=`h-9`,E=`table-fixed`,D=o(a.body,`py-1.5`),O=o(a.body,`w-28 py-1.5 text-right tabular-nums`),k=o(a.body,`w-32 py-1.5 text-right tabular-nums`),A=`h-9 w-28 bg-transparent py-2 text-right`,j=`h-9 w-32 bg-transparent py-2 text-right`;function M(e){if(!Number.isFinite(e)||e<0)return`—`;if(e<1e3)return`${Math.round(e)}ms`;let t=e/1e3;return t<10?`${t.toFixed(1)}s`:`${Math.round(t)}s`}function N(e){let t=(0,g.c)(3),{view:n}=e,r;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(r=o(`w-full caption-bottom`,E,a.body),t[0]=r):r=t[0];let i;return t[1]===n?i=t[2]:(i=(0,x.jsx)(`table`,{className:r,children:(0,x.jsx)(`thead`,{className:`[&_tr]:border-b [&_tr]:border-table-border`,children:(0,x.jsx)(`tr`,{children:n===`tools`?(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(u,{className:`h-9 bg-transparent py-2`,children:`Tool`}),(0,x.jsx)(u,{className:A,children:`Calls`}),(0,x.jsx)(u,{className:j,children:`Latency`})]}):(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(u,{className:`h-9 bg-transparent py-2`,children:`Model`}),(0,x.jsx)(u,{className:A,children:`Requests`}),(0,x.jsx)(u,{className:j,children:`Latency`})]})})})}),t[1]=n,t[2]=i),i}function P(){let e=(0,g.c)(19),{tools:t,models:n,isLoading:r,error:i}=b(),[s,l]=(0,_.useState)(`tools`),u=s===`tools`&&!r&&t.length>0,f=s===`models`&&!r&&n.length>0,m=u||f,v;e[0]!==m||e[1]!==s?(v=m?(0,x.jsx)(N,{view:s}):void 0,e[0]=m,e[1]=s,e[2]=v):v=e[2];let y;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(y=e=>{(e===`tools`||e===`models`)&&l(e)},e[3]=y):y=e[3];let w;e[4]===Symbol.for(`react.memo_cache_sentinel`)?(w=S.map(L),e[4]=w):w=e[4];let T;e[5]===s?T=e[6]:(T=(0,x.jsx)(h,{type:`single`,value:s,onValueChange:y,"aria-label":`Statistics view`,variant:`outline`,className:C,children:w}),e[5]=s,e[6]=T);let D;e[7]===i?D=e[8]:(D=i?(0,x.jsx)(`p`,{className:o(a.bodyMuted,`mb-6 text-destructive`),children:i}):null,e[7]=i,e[8]=D);let O;e[9]!==r||e[10]!==n||e[11]!==t||e[12]!==s?(O=s===`tools`?r?(0,x.jsx)(`p`,{className:a.bodyMuted,children:`Loading…`}):t.length===0?(0,x.jsx)(`p`,{className:a.bodyMuted,children:`No tool call timings recorded yet. Stats appear after agent tool calls complete.`}):(0,x.jsx)(p,{className:E,children:(0,x.jsx)(d,{children:t.map(I)})}):r?(0,x.jsx)(`p`,{className:a.bodyMuted,children:`Loading…`}):n.length===0?(0,x.jsx)(`p`,{className:a.bodyMuted,children:`No model timings recorded yet. Stats appear after assistant responses complete.`}):(0,x.jsx)(p,{className:E,children:(0,x.jsx)(d,{children:n.map(F)})}),e[9]=r,e[10]=n,e[11]=t,e[12]=s,e[13]=O):O=e[13];let k;return e[14]!==v||e[15]!==T||e[16]!==D||e[17]!==O?(k=(0,x.jsxs)(c,{title:`Statistics`,description:`Average latency and request counts for tool calls and model responses.`,tableHeader:v,action:T,children:[D,O]}),e[14]=v,e[15]=T,e[16]=D,e[17]=O,e[18]=k):k=e[18],k}function F(e){return(0,x.jsxs)(l,{className:T,children:[(0,x.jsx)(f,{className:D,children:e.modelId}),(0,x.jsx)(f,{className:O,children:e.requestCount.toLocaleString()}),(0,x.jsx)(f,{className:k,children:M(e.averageDurationMs)})]},e.modelId)}function I(e){return(0,x.jsxs)(l,{className:T,children:[(0,x.jsx)(f,{className:D,children:e.toolName}),(0,x.jsx)(f,{className:O,children:e.callCount.toLocaleString()}),(0,x.jsx)(f,{className:k,children:M(e.averageDurationMs)})]},e.toolName)}function L(e){return(0,x.jsx)(m,{value:e.value,"aria-label":e.label,className:w,children:e.label},e.value)}export{P as default};
@@ -0,0 +1 @@
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{n as t,o as n,t as r}from"./react-vendor-Ee0-5T4I.js";import{o as i,ot as a}from"./dist-DjiNKpTV.js";import{J as o,U as s,r as c}from"./store-CHF6tOp2.js";import{Bn as l,D as u,Et as d,Ln as f}from"./dist-CNOCRPxn.js";import{a as p,t as m}from"./utils-CT-Dw22R.js";import{t as h}from"./button-B6HDsfd5.js";import{i as g,n as _,t as v}from"./tooltip-BtJG5fZl.js";import{n as y}from"./async-loading-fallback-D2X0o4Qa.js";import{n as ee}from"./use-toast-xpb5jNtN.js";import{U as te,_n as ne,et as re,kn as ie,pt as ae,xn as oe}from"./index-BOB3ZUQs.js";import{t as se}from"./delete-confirm-dialog-3DX1u0Dg.js";import{i as ce,r as b}from"./table-MUx4ZxvS.js";import{t as le}from"./settings-list-BpPbGcpS.js";var x=t(),S=e(n(),1),C=r(),ue=36,de=`table-fixed`,fe=`h-9 w-48 bg-transparent py-2`,pe=`h-9 bg-transparent py-2`,me=`h-9 w-32 bg-transparent py-2`,he=`h-9 w-10 bg-transparent py-2`,ge=m(a.bodyMuted,`w-48 truncate py-1.5`),_e=m(a.body,`truncate py-1.5`),ve=m(a.bodyMuted,`w-32 truncate py-1.5`),ye=`w-10 py-1.5`,be={column:`project`,direction:`asc`};function xe(e){let t=(0,x.c)(4),n;if(t[0]!==e){let{style:r,...i}=e,o;t[2]===r?o=t[3]:(o={...r,width:`100%`},t[2]=r,t[3]=o),n=(0,C.jsx)(`table`,{...i,style:o,className:m(`w-full caption-bottom`,de,a.body,i.className)}),t[0]=e,t[1]=n}else n=t[1];return n}function Se(e){let t=(0,x.c)(5),n;t[0]===e.className?n=t[1]:(n=m(`hidden`,e.className),t[0]=e.className,t[1]=n);let r;return t[2]!==e||t[3]!==n?(r=(0,C.jsx)(`thead`,{...e,className:n}),t[2]=e,t[3]=n,t[4]=r):r=t[4],r}function Ce(e){let t=(0,x.c)(5),n;t[0]===e.className?n=t[1]:(n=m(`[&_tr:last-child]:border-0`,e.className),t[0]=e.className,t[1]=n);let r;return t[2]!==e||t[3]!==n?(r=(0,C.jsx)(`tbody`,{...e,className:n}),t[2]=e,t[3]=n,t[4]=r):r=t[4],r}function we(e){let t=(0,x.c)(5),n;t[0]===e.className?n=t[1]:(n=m(`frosted-scrollbar`,e.className),t[0]=e.className,t[1]=n);let r;return t[2]!==e||t[3]!==n?(r=(0,C.jsx)(`div`,{...e,className:n}),t[2]=e,t[3]=n,t[4]=r):r=t[4],r}function w(e,t){return t?i(t,e):e}function T(e,t,n){switch(t){case`project`:return e.projectName;case`path`:return w(e.path,n);case`branch`:return e.branch}}function Te(e){let t=[];for(let n of e){let e=p(n);for(let r of n.threads)t.push({threadId:r.threadId,projectId:n.projectId,projectName:e,path:r.path,branch:r.currentBranch||r.title})}return t}function Ee(e,t,n,r){return[...e].sort((e,i)=>{let a=T(e,t,r).localeCompare(T(i,t,r),void 0,{sensitivity:`base`});return n===`asc`?a:-a})}function E(e){let t=(0,x.c)(17),{label:n,column:r,sortColumn:i,sortDirection:a,className:o,onSort:s}=e,c=i===r,u=a===`asc`?f:l,d=c?`text-foreground`:`text-muted-foreground`,p;t[0]===d?p=t[1]:(p=m(`inline-flex items-center gap-1 transition-colors hover:text-foreground`,d),t[0]=d,t[1]=p);let h;t[2]!==r||t[3]!==s?(h=()=>s(r),t[2]=r,t[3]=s,t[4]=h):h=t[4];let g=c?a===`asc`?`ascending`:`descending`:`none`,_;t[5]!==u||t[6]!==c?(_=c?(0,C.jsx)(u,{className:`h-3.5 w-3.5 shrink-0`,"aria-hidden":`true`}):null,t[5]=u,t[6]=c,t[7]=_):_=t[7];let v;t[8]!==n||t[9]!==p||t[10]!==h||t[11]!==g||t[12]!==_?(v=(0,C.jsxs)(`button`,{type:`button`,className:p,onClick:h,"aria-sort":g,children:[n,_]}),t[8]=n,t[9]=p,t[10]=h,t[11]=g,t[12]=_,t[13]=v):v=t[13];let y;return t[14]!==o||t[15]!==v?(y=(0,C.jsx)(ce,{className:o,children:v}),t[14]=o,t[15]=v,t[16]=y):y=t[16],y}function D(){let e=(0,x.c)(55),t=c(Fe),n=c(Pe),r=c(Ne),i=c(Me),s=c(je),l=c(Ae),f=c(ke),p=c(Oe),{handleDeleteThread:T,refreshWorkspaces:D}=re(),{toast:O}=ee(),[k,Ie]=(0,S.useState)(null),[A,Le]=(0,S.useState)(be),Re=te()?`Finder`:`Explorer`,j,M;e[0]===D?(j=e[1],M=e[2]):(j=()=>{D()},M=[D],e[0]=D,e[1]=j,e[2]=M),(0,S.useEffect)(j,M);let N;e[3]!==n||e[4]!==t||e[5]!==A.column||e[6]!==A.direction?(N=Ee(Te(t),A.column,A.direction,n),e[3]=n,e[4]=t,e[5]=A.column,e[6]=A.direction,e[7]=N):N=e[7];let P=N,F;e[8]===Symbol.for(`react.memo_cache_sentinel`)?(F=function(e){Le(t=>t.column===e?{column:e,direction:t.direction===`asc`?`desc`:`asc`}:{column:e,direction:`asc`})},e[8]=F):F=e[8];let ze=F,I;e[9]===Symbol.for(`react.memo_cache_sentinel`)?(I=function(e){let{...t}=e;return(0,C.jsx)(`tr`,{...t,className:m(`group border-0 transition-colors hover:bg-muted/50`,t.className)})},e[9]=I):I=e[9];let Be=I,L;e[10]===Symbol.for(`react.memo_cache_sentinel`)?(L={Table:xe,TableHead:Se,TableBody:Ce,TableRow:Be,Scroller:we},e[10]=L):L=e[10];let Ve=L,R;e[11]!==T||e[12]!==k?(R=function(){if(!k)return;let{projectId:e,threadId:t}=k;Ie(null),T(e,t)},e[11]=T,e[12]=k,e[13]=R):R=e[13];let He=R,z;e[14]===O?z=e[15]:(z=async function(e){try{await ae(e.threadId,`.`)}catch{O({title:`Error`,description:`Failed to open folder in ${Re}.`,variant:`destructive`})}},e[14]=O,e[15]=z);let Ue=z,B;e[16]!==n||e[17]!==l||e[18]!==i||e[19]!==Ue||e[20]!==p||e[21]!==s||e[22]!==f?(B=function(e,t){let r=i.includes(t.threadId),c=o(t.threadId,s,f,p),y=l.includes(t.threadId),ee=!c&&!r&&!y,te=w(t.path,n);return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(b,{className:ge,children:t.projectName}),(0,C.jsx)(b,{className:_e,children:(0,C.jsx)(`button`,{type:`button`,className:m(a.body,`block w-full truncate text-left hover:underline`),title:`${t.path}\nOpen in ${Re}`,onClick:()=>void Ue(t),children:te})}),(0,C.jsx)(b,{className:ve,children:t.branch}),(0,C.jsx)(b,{className:ye,children:(0,C.jsx)(`div`,{className:`ml-auto flex h-7 w-7 items-center justify-center`,children:r?(0,C.jsx)(d,{className:`h-4 w-4 animate-spin text-muted-foreground`,"aria-label":`Deleting`}):ee?(0,C.jsxs)(v,{children:[(0,C.jsx)(g,{asChild:!0,children:(0,C.jsxs)(h,{variant:`ghost`,size:`icon-sm`,className:le,onClick:e=>{e.stopPropagation(),Ie(t)},children:[(0,C.jsx)(u,{}),(0,C.jsx)(`span`,{className:`sr-only`,children:`Delete workspace`})]})}),(0,C.jsx)(_,{side:`left`,children:`Delete branch and files from the repo`})]}):null})})]})},e[16]=n,e[17]=l,e[18]=i,e[19]=Ue,e[20]=p,e[21]=s,e[22]=f,e[23]=B):B=e[23];let We=B,V;e[24]===Symbol.for(`react.memo_cache_sentinel`)?(V=m(`w-full caption-bottom`,de,a.body),e[24]=V):V=e[24];let H,U,W;e[25]!==A.column||e[26]!==A.direction?(H=(0,C.jsx)(E,{label:`Project`,column:`project`,sortColumn:A.column,sortDirection:A.direction,className:fe,onSort:ze}),U=(0,C.jsx)(E,{label:`Path`,column:`path`,sortColumn:A.column,sortDirection:A.direction,className:pe,onSort:ze}),W=(0,C.jsx)(E,{label:`Branch`,column:`branch`,sortColumn:A.column,sortDirection:A.direction,className:me,onSort:ze}),e[25]=A.column,e[26]=A.direction,e[27]=H,e[28]=U,e[29]=W):(H=e[27],U=e[28],W=e[29]);let G;e[30]===Symbol.for(`react.memo_cache_sentinel`)?(G=(0,C.jsx)(ce,{className:he,children:(0,C.jsx)(`span`,{className:`sr-only`,children:`Actions`})}),e[30]=G):G=e[30];let K;e[31]!==H||e[32]!==U||e[33]!==W?(K=(0,C.jsx)(`table`,{className:V,children:(0,C.jsx)(`thead`,{className:`[&_tr]:border-b [&_tr]:border-table-border`,children:(0,C.jsxs)(`tr`,{children:[H,U,W,G]})})}),e[31]=H,e[32]=U,e[33]=W,e[34]=K):K=e[34];let Ge=K,Ke=P.length>0?Ge:void 0,q;e[35]===Ke?q=e[36]:(q=(0,C.jsx)(oe,{title:`Storage`,description:`Workspaces and branches stored on disk across all projects.`,tableHeader:Ke}),e[35]=Ke,e[36]=q);let J;e[37]!==r||e[38]!==We||e[39]!==P?(J=(0,C.jsx)(`div`,{className:`min-h-0 flex-1 overflow-hidden`,children:r&&P.length===0?(0,C.jsx)(y,{label:`Loading workspaces...`,size:`lg`}):P.length===0?(0,C.jsx)(`div`,{className:`flex h-full items-center justify-center p-6`,children:(0,C.jsxs)(`div`,{className:`max-w-md space-y-2 text-center`,children:[(0,C.jsx)(`h3`,{className:a.emptyStateTitle,children:`No workspaces`}),(0,C.jsx)(`p`,{className:a.bodyMuted,children:`No branches or workspaces found yet.`})]})}):(0,C.jsx)(ne,{style:{height:`100%`},data:P,computeItemKey:De,itemContent:We,defaultItemHeight:ue,increaseViewportBy:ue*5,components:Ve})}),e[37]=r,e[38]=We,e[39]=P,e[40]=J):J=e[40];let Y;e[41]!==q||e[42]!==J?(Y=(0,C.jsxs)(ie,{className:`flex w-full max-w-none min-w-0 min-h-0 flex-1 flex-col pb-0 pt-0`,children:[q,J]}),e[41]=q,e[42]=J,e[43]=Y):Y=e[43];let qe=k!==null,X;e[44]===Symbol.for(`react.memo_cache_sentinel`)?(X=e=>{e||Ie(null)},e[44]=X):X=e[44];let Z;e[45]!==n||e[46]!==k?(Z=k?`Are you sure you want to delete the workspace at "${w(k.path,n)}"? This removes the branch and all its files. This action cannot be undone.`:``,e[45]=n,e[46]=k,e[47]=Z):Z=e[47];let Q;e[48]!==He||e[49]!==qe||e[50]!==Z?(Q=(0,C.jsx)(se,{open:qe,onOpenChange:X,title:`Delete workspace?`,description:Z,onConfirm:He,confirmLabel:`Delete`,confirmingLabel:`Deleting...`}),e[48]=He,e[49]=qe,e[50]=Z,e[51]=Q):Q=e[51];let $;return e[52]!==Y||e[53]!==Q?($=(0,C.jsxs)(`div`,{className:`flex h-full min-h-0 w-full min-w-0 flex-1 flex-col`,children:[Y,Q]}),e[52]=Y,e[53]=Q,e[54]=$):$=e[54],$}function De(e,t){return t.threadId}function Oe(e){return e.pendingChatMessage}function ke(e){return s(e.threadStreamingStates)}function Ae(e){return e.completedThreadIds}function je(e){return e.processingThreadIds}function Me(e){return e.deletingThreadIds}function Ne(e){return e.projectsLoading}function Pe(e){return e.cloneRootPath}function Fe(e){return e.projects}export{D as default};
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-BWuYHVi8.js";import{S as i}from"./dist-DIjomljy.js";import{t as a}from"./utils-CT-Dw22R.js";import{t as o}from"./button-DeNw35VZ.js";import{Jn as s,bn as c,nr as l,w as u}from"./api-BMo_Lz8f.js";import{t as d}from"./use-toast-xpb5jNtN.js";import{r as f,t as p}from"./dialog-Do98zzAW.js";import{Bn as m,Dn as h,En as g,Ft as _,In as v,Ln as y,Nn as b,On as x,Y as S,kn as C,zn as w}from"./index-DjaVbFDB.js";import{t as T}from"./delete-confirm-dialog-C9NASyh6.js";import{t as E}from"./use-settings-page-loading-BTySlInF.js";import{a as D,i as O,o as k,r as A}from"./settings-list-DU82HNPX.js";import{a as j,i as M,r as N,t as P}from"./mcp-server-card-zm-ss-7h.js";import{t as F}from"./use-installed-ai-files-E4BAFIPG.js";var I=e(t(),1),L=n();function R({threadId:e,onAgentCreated:t}){let[n,i]=(0,I.useState)(``),[o,s]=(0,I.useState)(``),[c,l]=(0,I.useState)(``),[f,p]=(0,I.useState)(!1),m=M(n),y=N(m),b=async()=>{if(!(!y||!o.trim()||!e)){p(!0);try{let n=await u(e,m,o.trim(),c.trim()||void 0);d({title:`Agent created`,description:`Agent '${m}' was created successfully.`}),i(``),s(``),l(``),t?.(n.path,`AGENTS.md`)}catch(e){d({title:`Error`,description:e instanceof Error?e.message:`Failed to create agent`,variant:`destructive`})}finally{p(!1)}}};return e?(0,L.jsx)(w,{children:(0,L.jsxs)(g,{children:[(0,L.jsx)(C,{title:`Add Agent`,description:`Saved as AGENT.md in .agents/agents.`,sticky:!0,className:`pr-10`}),(0,L.jsxs)(`div`,{children:[(0,L.jsxs)(h,{title:`Agent Name`,controlLayout:`stack`,className:`pt-6`,children:[(0,L.jsx)(_,{id:`agentName`,value:n,onChange:e=>i(e.target.value),placeholder:`e.g. Code Reviewer`,disabled:f}),n?(0,L.jsxs)(`p`,{className:a(r.caption,`mt-2`),children:[`Folder name: `,(0,L.jsx)(`span`,{className:`font-mono`,children:m||`...`})]}):null]}),(0,L.jsx)(h,{title:`Description`,controlLayout:`stack`,className:`pt-6`,children:(0,L.jsx)(S,{id:`agentDescription`,value:o,onChange:e=>s(e.target.value),placeholder:`Describe the agent's purpose and behavior...`,className:`resize-none min-h-[120px]`,disabled:f})}),(0,L.jsx)(h,{title:`Tools`,description:`Optional space-separated list of tools this agent can use`,controlLayout:`stack`,className:`pt-6`,children:(0,L.jsx)(_,{id:`agentTools`,value:c,onChange:e=>l(e.target.value),placeholder:`e.g. read grep glob`,disabled:f})}),(0,L.jsx)(j,{onContinue:()=>void b(),disabled:!y||!o.trim(),creating:f})]})]})}):(0,L.jsx)(v,{title:`No thread selected`,children:`Please select a thread to add an agent.`})}function z(e){let t=[];for(let n of e)n.path.startsWith(`.agents/agents/`)&&n.type===`folder`&&t.push(n),n.children&&n.children.length>0&&t.push(...z(n.children));return t}function B(){let{selectedProjectId:e,selectedThreadId:t,items:n,loading:u,deleteConfirm:h,setDeleteConfirm:g,deleting:_,installedFilePaths:S,setInstalledFilePaths:w,loadItems:j,handleDelete:M,handleOpenInExplorer:N,triggerExplorerRefresh:B}=F({findItems:z,installedPathSuffix:`/AGENT.md`,explorerPathSuffix:`/AGENT.md`,sortByName:!0,removedToastTitle:`Agent removed`}),[V,H]=(0,I.useState)(!1),[U,W]=(0,I.useState)([]),[G,K]=(0,I.useState)(!0),[q,J]=(0,I.useState)(``);(0,I.useEffect)(()=>{K(!0),s().then(W).catch(()=>W([])).finally(()=>K(!1))},[]);let Y=E(e?`${e}:${t??``}`:null,[u,G]),X=(0,I.useCallback)(async e=>{let n=`.agents/agents/${e.id}/AGENT.md`;if(!(!t||S.has(n)))try{if(e.gitHubRepo&&e.gitHubFolder)await l(t,e.gitHubRepo,e.gitHubFolder,`.agents/agents/${e.id}`);else{let r=[`---`,`name: ${e.id}`,`description: ${e.description}`];e.tools&&r.push(`tools: ${e.tools}`),r.push(`---`,``,e.systemPrompt),await c(t,n,r.join(`
2
- `))}w(e=>new Set(e).add(n)),B(),j(),d({title:`Agent installed`,description:e.name})}catch(e){d({title:`Error`,description:e instanceof Error?e.message:`Failed to install agent`,variant:`destructive`})}},[t,S,B,j]),Z=q.trim()?U.filter(e=>e.name.toLowerCase().includes(q.toLowerCase())||e.description.toLowerCase().includes(q.toLowerCase())):U;return e?(0,L.jsxs)(L.Fragment,{children:[(0,L.jsxs)(b,{loading:Y,children:[(0,L.jsxs)(m,{className:`shrink-0`,children:[(0,L.jsx)(C,{title:`Installed Subagents`,description:`Specialized agents for focused tasks in this project.`,action:(0,L.jsx)(o,{onClick:()=>H(!0),disabled:!t,children:`Add Subagent`}),sticky:!1}),(0,L.jsxs)(y,{className:`pt-6`,children:[!t&&(0,L.jsx)(x,{children:`Select a thread to add or install subagents.`}),(0,L.jsx)(A,{showHeader:!1,compact:!0,loading:!1,items:n,emptyState:{icon:i,title:`No subagents installed`,description:`Add subagents for specialized, focused tasks.`,bordered:!1},getKey:e=>e.id,renderContent:e=>(0,L.jsx)(`span`,{className:a(r.body,`truncate text-left`),children:e.name}),onItemClick:e=>N(e.path),itemClickLabel:e=>`Open ${e.name} in Files`,onDelete:g,deleteAriaLabel:e=>`Delete ${e.name}`,deleteTooltip:`Remove this subagent from the project`})]})]}),(0,L.jsxs)(m,{className:`shrink-0`,children:[(0,L.jsx)(C,{title:`Available Subagents`,description:`Browse and install subagents from the catalog.`,action:(0,L.jsx)(k,{placeholder:`Search`,value:q,onChange:J,className:`mb-0 w-64`}),sticky:!1}),(0,L.jsx)(y,{className:`pt-6`,children:Z.length===0?(0,L.jsx)(D,{searchQuery:q,emptyLabel:`No available subagents found.`}):(0,L.jsx)(O,{children:Z.map(e=>{let t=`.agents/agents/${e.id}/AGENT.md`,n=S.has(t);return(0,L.jsx)(P,{className:`bg-background hover:bg-background`,name:e.name,description:e.description,installed:n,onClick:()=>{n||X(e)},showInstalledControls:!1},e.id)})})})]})]}),(0,L.jsx)(p,{open:V,onOpenChange:H,children:(0,L.jsx)(f,{className:`max-w-2xl max-h-[90vh] overflow-y-auto p-0`,children:(0,L.jsx)(R,{threadId:t,onAgentCreated:()=>{H(!1),j(),B()}})})}),(0,L.jsx)(T,{open:h!==null,onOpenChange:e=>!e&&g(null),title:`Delete Subagent`,description:`Are you sure you want to delete the subagent "${h?.name}"? This action cannot be undone.`,onConfirm:()=>{h&&M(h)},confirming:_})]}):(0,L.jsx)(v,{children:`Select a project to manage subagents.`})}export{B as SettingsSubagentsView,B as default};
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-DjiNKpTV.js";import{S as i}from"./dist-CNOCRPxn.js";import{t as a}from"./utils-CT-Dw22R.js";import{t as o}from"./button-B6HDsfd5.js";import{Yn as s,bn as c,rr as l,w as u}from"./api-D1GxdEEp.js";import{t as d}from"./use-toast-xpb5jNtN.js";import{r as f,t as p}from"./dialog--0foS3aw.js";import{It as m,Mn as h,On as g,Tn as _,X as v,bn as y,jn as b,kn as x,vn as S,xn as C,yn as w}from"./index-BOB3ZUQs.js";import{t as T}from"./delete-confirm-dialog-3DX1u0Dg.js";import{t as E}from"./use-settings-page-loading-BTySlInF.js";import{a as D,i as O,o as k,r as A}from"./settings-list-BpPbGcpS.js";import{a as j,i as M,r as N,t as P}from"./mcp-server-card-DFT7uyRh.js";import{t as F}from"./use-installed-ai-files-CJr_PVcY.js";var I=e(t(),1),L=n();function R({threadId:e,onAgentCreated:t}){let[n,i]=(0,I.useState)(``),[o,s]=(0,I.useState)(``),[c,l]=(0,I.useState)(``),[f,p]=(0,I.useState)(!1),h=M(n),_=N(h),y=async()=>{if(!(!_||!o.trim()||!e)){p(!0);try{let n=await u(e,h,o.trim(),c.trim()||void 0);d({title:`Agent created`,description:`Agent '${h}' was created successfully.`}),i(``),s(``),l(``),t?.(n.path,`AGENTS.md`)}catch(e){d({title:`Error`,description:e instanceof Error?e.message:`Failed to create agent`,variant:`destructive`})}finally{p(!1)}}};return e?(0,L.jsx)(b,{children:(0,L.jsxs)(S,{children:[(0,L.jsx)(C,{title:`Add Agent`,description:`Saved as AGENT.md in .agents/agents.`,sticky:!0,className:`pr-10`}),(0,L.jsxs)(`div`,{children:[(0,L.jsxs)(w,{title:`Agent Name`,controlLayout:`stack`,className:`pt-6`,children:[(0,L.jsx)(m,{id:`agentName`,value:n,onChange:e=>i(e.target.value),placeholder:`e.g. Code Reviewer`,disabled:f}),n?(0,L.jsxs)(`p`,{className:a(r.caption,`mt-2`),children:[`Folder name: `,(0,L.jsx)(`span`,{className:`font-mono`,children:h||`...`})]}):null]}),(0,L.jsx)(w,{title:`Description`,controlLayout:`stack`,className:`pt-6`,children:(0,L.jsx)(v,{id:`agentDescription`,value:o,onChange:e=>s(e.target.value),placeholder:`Describe the agent's purpose and behavior...`,className:`resize-none min-h-[120px]`,disabled:f})}),(0,L.jsx)(w,{title:`Tools`,description:`Optional space-separated list of tools this agent can use`,controlLayout:`stack`,className:`pt-6`,children:(0,L.jsx)(m,{id:`agentTools`,value:c,onChange:e=>l(e.target.value),placeholder:`e.g. read grep glob`,disabled:f})}),(0,L.jsx)(j,{onContinue:()=>void y(),disabled:!_||!o.trim(),creating:f})]})]})}):(0,L.jsx)(g,{title:`No thread selected`,children:`Please select a thread to add an agent.`})}function z(e){let t=[];for(let n of e)n.path.startsWith(`.agents/agents/`)&&n.type===`folder`&&t.push(n),n.children&&n.children.length>0&&t.push(...z(n.children));return t}function B(){let{selectedProjectId:e,selectedThreadId:t,items:n,loading:u,deleteConfirm:m,setDeleteConfirm:v,deleting:b,installedFilePaths:S,setInstalledFilePaths:w,loadItems:j,handleDelete:M,handleOpenInExplorer:N,triggerExplorerRefresh:B}=F({findItems:z,installedPathSuffix:`/AGENT.md`,explorerPathSuffix:`/AGENT.md`,sortByName:!0,removedToastTitle:`Agent removed`}),[V,H]=(0,I.useState)(!1),[U,W]=(0,I.useState)([]),[G,K]=(0,I.useState)(!0),[q,J]=(0,I.useState)(``);(0,I.useEffect)(()=>{K(!0),s().then(W).catch(()=>W([])).finally(()=>K(!1))},[]);let Y=E(e?`${e}:${t??``}`:null,[u,G]),X=(0,I.useCallback)(async e=>{let n=`.agents/agents/${e.id}/AGENT.md`;if(!(!t||S.has(n)))try{if(e.gitHubRepo&&e.gitHubFolder)await l(t,e.gitHubRepo,e.gitHubFolder,`.agents/agents/${e.id}`);else{let r=[`---`,`name: ${e.id}`,`description: ${e.description}`];e.tools&&r.push(`tools: ${e.tools}`),r.push(`---`,``,e.systemPrompt),await c(t,n,r.join(`
2
+ `))}w(e=>new Set(e).add(n)),B(),j(),d({title:`Agent installed`,description:e.name})}catch(e){d({title:`Error`,description:e instanceof Error?e.message:`Failed to install agent`,variant:`destructive`})}},[t,S,B,j]),Z=q.trim()?U.filter(e=>e.name.toLowerCase().includes(q.toLowerCase())||e.description.toLowerCase().includes(q.toLowerCase())):U;return e?(0,L.jsxs)(L.Fragment,{children:[(0,L.jsxs)(_,{loading:Y,children:[(0,L.jsxs)(h,{className:`shrink-0`,children:[(0,L.jsx)(C,{title:`Installed Subagents`,description:`Specialized agents for focused tasks in this project.`,action:(0,L.jsx)(o,{onClick:()=>H(!0),disabled:!t,children:`Add Subagent`}),sticky:!1}),(0,L.jsxs)(x,{className:`pt-6`,children:[!t&&(0,L.jsx)(y,{children:`Select a thread to add or install subagents.`}),(0,L.jsx)(A,{showHeader:!1,compact:!0,loading:!1,items:n,emptyState:{icon:i,title:`No subagents installed`,description:`Add subagents for specialized, focused tasks.`,bordered:!1},getKey:e=>e.id,renderContent:e=>(0,L.jsx)(`span`,{className:a(r.body,`truncate text-left`),children:e.name}),onItemClick:e=>N(e.path),itemClickLabel:e=>`Open ${e.name} in Files`,onDelete:v,deleteAriaLabel:e=>`Delete ${e.name}`,deleteTooltip:`Remove this subagent from the project`})]})]}),(0,L.jsxs)(h,{className:`shrink-0`,children:[(0,L.jsx)(C,{title:`Available Subagents`,description:`Browse and install subagents from the catalog.`,action:(0,L.jsx)(k,{placeholder:`Search`,value:q,onChange:J,className:`mb-0 w-64`}),sticky:!1}),(0,L.jsx)(x,{className:`pt-6`,children:Z.length===0?(0,L.jsx)(D,{searchQuery:q,emptyLabel:`No available subagents found.`}):(0,L.jsx)(O,{children:Z.map(e=>{let t=`.agents/agents/${e.id}/AGENT.md`,n=S.has(t);return(0,L.jsx)(P,{className:`bg-background hover:bg-background`,name:e.name,description:e.description,installed:n,onClick:()=>{n||X(e)},showInstalledControls:!1},e.id)})})})]})]}),(0,L.jsx)(p,{open:V,onOpenChange:H,children:(0,L.jsx)(f,{className:`max-w-2xl max-h-[90vh] overflow-y-auto p-0`,children:(0,L.jsx)(R,{threadId:t,onAgentCreated:()=>{H(!1),j(),B()}})})}),(0,L.jsx)(T,{open:m!==null,onOpenChange:e=>!e&&v(null),title:`Delete Subagent`,description:`Are you sure you want to delete the subagent "${m?.name}"? This action cannot be undone.`,onConfirm:()=>{m&&M(m)},confirming:b})]}):(0,L.jsx)(g,{children:`Select a project to manage subagents.`})}export{B as SettingsSubagentsView,B as default};
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-BWuYHVi8.js";import{r as i}from"./store-BaMSfYoJ.js";import{Et as a}from"./dist-DIjomljy.js";import{t as o}from"./utils-CT-Dw22R.js";import{t as s}from"./button-DeNw35VZ.js";import{Ct as c,qt as l,zn as ee}from"./api-BMo_Lz8f.js";import{i as u,n as d,t as f}from"./tooltip-B6ziVyTv.js";import{t as p}from"./use-toast-xpb5jNtN.js";import{a as m,c as h,i as g,n as _,o as v,r as y,s as b,t as x}from"./alert-dialog-Cb1PEgra.js";import{In as S,Ln as C,Mn as w,Y as T,jn as E,kn as D,vt as O}from"./index-DjaVbFDB.js";import{t as k}from"./use-settings-page-loading-BTySlInF.js";var A=e(t(),1),j=n();function M(){let e=i(e=>e.selectedProjectId),[t,n]=(0,A.useState)(``),[M,N]=(0,A.useState)(``),[P,F]=(0,A.useState)(!0),[I,L]=(0,A.useState)(!1),[R,z]=(0,A.useState)(``),[B,V]=(0,A.useState)(!0),[H,U]=(0,A.useState)(!1),[W,G]=(0,A.useState)(!1);(0,A.useLayoutEffect)(()=>{e&&V(!0)},[e]),(0,A.useEffect)(()=>{if(!e){V(!1);return}V(!0),c(e).then(e=>{let t=e.useCustomSystemPrompt;n(e.generatedPrompt),L(t),z(e.customSystemPrompt),F(!t),N(t?e.customSystemPrompt:e.generatedPrompt)}).catch(()=>{n(``),N(``),F(!0),L(!1),z(``)}).finally(()=>V(!1))},[e]);let K=k(e,[B]);function q(){return P?I:M.trim()!==R.trim()}function J(e){N(e),P&&F(!1)}function Y(){N(t),F(!0)}function X(e){if(!e){F(!1);return}if(M===t){Y();return}G(!0)}function Z(){Y(),G(!1)}function Q(){G(!1)}async function $(){if(e){if(!P&&!M.trim()){p({title:`System prompt required`,description:`Enter a system prompt or enable Generated.`,variant:`destructive`});return}U(!0);try{await ee(e,{customSystemPrompt:P?null:M.trim(),useCustomSystemPrompt:!P}),l(),L(!P),z(P?``:M.trim()),p({title:`System prompt settings saved`})}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to save system prompt settings`,variant:`destructive`})}finally{U(!1)}}}return e?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(w,{loading:K,children:(0,j.jsx)(E,{children:(0,j.jsxs)(C,{className:`w-full flex-1 flex flex-col min-h-0 pt-0`,children:[(0,j.jsx)(D,{title:`System Prompt`,description:`View the default system prompt or override it for this project.`,sticky:!1,action:(0,j.jsx)(s,{onClick:$,disabled:H||!q(),children:H?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(a,{className:`mr-2 h-4 w-4 animate-spin`}),`Saving...`]}):`Save`})}),(0,j.jsxs)(`div`,{className:`mb-4 flex w-full items-center justify-end gap-2`,children:[(0,j.jsxs)(f,{children:[(0,j.jsx)(u,{asChild:!0,children:(0,j.jsx)(`span`,{tabIndex:0,className:o(r.label,`cursor-help`),children:`Generated`})}),(0,j.jsx)(d,{side:`top`,className:`max-w-xs`,children:`Use the auto-generated system prompt instead of a custom override.`})]}),(0,j.jsx)(O,{value:P,onChange:X,disabled:H,ariaLabel:`Generated system prompt`})]}),(0,j.jsx)(T,{value:M,onChange:e=>J(e.target.value),className:o(r.mono,`flex-1 min-h-0 resize-none`),placeholder:`System prompt will appear here...`,disabled:H})]})})}),(0,j.jsx)(x,{open:W,onOpenChange:G,children:(0,j.jsxs)(g,{children:[(0,j.jsxs)(b,{children:[(0,j.jsx)(h,{children:`Overwrite custom system prompt?`}),(0,j.jsx)(m,{children:`This will replace your custom system prompt with the generated default. You can save the change after confirming.`})]}),(0,j.jsxs)(v,{children:[(0,j.jsx)(y,{onClick:Q,children:`No`}),(0,j.jsx)(_,{onClick:Z,children:`Yes`})]})]})})]}):(0,j.jsx)(S,{children:`Select a project to edit the system prompt.`})}export{M as SettingsSystemPromptView,M as default};
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{o as t,t as n}from"./react-vendor-Ee0-5T4I.js";import{ot as r}from"./dist-DjiNKpTV.js";import{r as i}from"./store-CHF6tOp2.js";import{Et as a}from"./dist-CNOCRPxn.js";import{t as o}from"./utils-CT-Dw22R.js";import{t as s}from"./button-B6HDsfd5.js";import{Bn as c,Ct as l,qt as ee}from"./api-D1GxdEEp.js";import{i as u,n as d,t as f}from"./tooltip-BtJG5fZl.js";import{t as p}from"./use-toast-xpb5jNtN.js";import{a as m,c as h,i as g,n as _,o as v,r as y,s as b,t as x}from"./alert-dialog-DAHkynVZ.js";import{Cn as S,On as C,X as w,kn as T,wn as E,xn as D,yt as O}from"./index-BOB3ZUQs.js";import{t as k}from"./use-settings-page-loading-BTySlInF.js";var A=e(t(),1),j=n();function M(){let e=i(e=>e.selectedProjectId),[t,n]=(0,A.useState)(``),[M,N]=(0,A.useState)(``),[P,F]=(0,A.useState)(!0),[I,L]=(0,A.useState)(!1),[R,z]=(0,A.useState)(``),[B,V]=(0,A.useState)(!0),[H,U]=(0,A.useState)(!1),[W,G]=(0,A.useState)(!1);(0,A.useLayoutEffect)(()=>{e&&V(!0)},[e]),(0,A.useEffect)(()=>{if(!e){V(!1);return}V(!0),l(e).then(e=>{let t=e.useCustomSystemPrompt;n(e.generatedPrompt),L(t),z(e.customSystemPrompt),F(!t),N(t?e.customSystemPrompt:e.generatedPrompt)}).catch(()=>{n(``),N(``),F(!0),L(!1),z(``)}).finally(()=>V(!1))},[e]);let K=k(e,[B]);function q(){return P?I:M.trim()!==R.trim()}function J(e){N(e),P&&F(!1)}function Y(){N(t),F(!0)}function X(e){if(!e){F(!1);return}if(M===t){Y();return}G(!0)}function Z(){Y(),G(!1)}function Q(){G(!1)}async function $(){if(e){if(!P&&!M.trim()){p({title:`System prompt required`,description:`Enter a system prompt or enable Generated.`,variant:`destructive`});return}U(!0);try{await c(e,{customSystemPrompt:P?null:M.trim(),useCustomSystemPrompt:!P}),ee(),L(!P),z(P?``:M.trim()),p({title:`System prompt settings saved`})}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to save system prompt settings`,variant:`destructive`})}finally{U(!1)}}}return e?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(E,{loading:K,children:(0,j.jsx)(S,{children:(0,j.jsxs)(T,{className:`w-full flex-1 flex flex-col min-h-0 pt-0`,children:[(0,j.jsx)(D,{title:`System Prompt`,description:`View the default system prompt or override it for this project.`,sticky:!1,action:(0,j.jsx)(s,{onClick:$,disabled:H||!q(),children:H?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(a,{className:`mr-2 h-4 w-4 animate-spin`}),`Saving...`]}):`Save`})}),(0,j.jsxs)(`div`,{className:`mb-4 flex w-full items-center justify-end gap-2`,children:[(0,j.jsxs)(f,{children:[(0,j.jsx)(u,{asChild:!0,children:(0,j.jsx)(`span`,{tabIndex:0,className:o(r.label,`cursor-help`),children:`Generated`})}),(0,j.jsx)(d,{side:`top`,className:`max-w-xs`,children:`Use the auto-generated system prompt instead of a custom override.`})]}),(0,j.jsx)(O,{value:P,onChange:X,disabled:H,ariaLabel:`Generated system prompt`})]}),(0,j.jsx)(w,{value:M,onChange:e=>J(e.target.value),className:o(r.mono,`flex-1 min-h-0 resize-none`),placeholder:`System prompt will appear here...`,disabled:H})]})})}),(0,j.jsx)(x,{open:W,onOpenChange:G,children:(0,j.jsxs)(g,{children:[(0,j.jsxs)(b,{children:[(0,j.jsx)(h,{children:`Overwrite custom system prompt?`}),(0,j.jsx)(m,{children:`This will replace your custom system prompt with the generated default. You can save the change after confirming.`})]}),(0,j.jsxs)(v,{children:[(0,j.jsx)(y,{onClick:Q,children:`No`}),(0,j.jsx)(_,{onClick:Z,children:`Yes`})]})]})})]}):(0,j.jsx)(C,{children:`Select a project to edit the system prompt.`})}export{M as SettingsSystemPromptView,M as default};