@cosmicstack/mercury-agent 1.1.9 → 1.1.12

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 (114) hide show
  1. package/README.md +101 -1
  2. package/README.zh-CN.md +265 -140
  3. package/dist/index.js +4473 -1842
  4. package/dist/index.js.map +1 -1
  5. package/dist/web/ui/assets/{Chat-DCFkzIwn.js → Chat-DXSn2dY8.js} +2 -2
  6. package/dist/web/ui/assets/{Chat-DCFkzIwn.js.map → Chat-DXSn2dY8.js.map} +1 -1
  7. package/dist/web/ui/assets/{Dashboard-B81ollv8.js → Dashboard-1rlAqQ-Y.js} +2 -2
  8. package/dist/web/ui/assets/{Dashboard-B81ollv8.js.map → Dashboard-1rlAqQ-Y.js.map} +1 -1
  9. package/dist/web/ui/assets/{Goals-D0cR8yIP.js → Goals-CgSUAXLH.js} +2 -2
  10. package/dist/web/ui/assets/{Goals-D0cR8yIP.js.map → Goals-CgSUAXLH.js.map} +1 -1
  11. package/dist/web/ui/assets/{Graph-C3eHp3_J.js → Graph-DnlOWkay.js} +2 -2
  12. package/dist/web/ui/assets/{Graph-C3eHp3_J.js.map → Graph-DnlOWkay.js.map} +1 -1
  13. package/dist/web/ui/assets/{Kanban-DrkTRyni.js → Kanban-DRlNiNRF.js} +2 -2
  14. package/dist/web/ui/assets/{Kanban-DrkTRyni.js.map → Kanban-DRlNiNRF.js.map} +1 -1
  15. package/dist/web/ui/assets/{Login-GRQ-LjgN.js → Login-BP5524pC.js} +2 -2
  16. package/dist/web/ui/assets/{Login-GRQ-LjgN.js.map → Login-BP5524pC.js.map} +1 -1
  17. package/dist/web/ui/assets/{MarkdownRenderer-Dvh1jwyj.js → MarkdownRenderer-B9KGVD0X.js} +2 -2
  18. package/dist/web/ui/assets/{MarkdownRenderer-Dvh1jwyj.js.map → MarkdownRenderer-B9KGVD0X.js.map} +1 -1
  19. package/dist/web/ui/assets/{Memory-dAZsKmWz.js → Memory-BOQEY0H8.js} +2 -2
  20. package/dist/web/ui/assets/{Memory-dAZsKmWz.js.map → Memory-BOQEY0H8.js.map} +1 -1
  21. package/dist/web/ui/assets/{Permissions-DCiyUUfI.js → Permissions-jbFH-toa.js} +2 -2
  22. package/dist/web/ui/assets/{Permissions-DCiyUUfI.js.map → Permissions-jbFH-toa.js.map} +1 -1
  23. package/dist/web/ui/assets/{PersonDetail-iZgApJog.js → PersonDetail-Ca8B9io8.js} +2 -2
  24. package/dist/web/ui/assets/{PersonDetail-iZgApJog.js.map → PersonDetail-Ca8B9io8.js.map} +1 -1
  25. package/dist/web/ui/assets/{Persons-Bs_HhYjC.js → Persons-epdmUeBM.js} +2 -2
  26. package/dist/web/ui/assets/{Persons-Bs_HhYjC.js.map → Persons-epdmUeBM.js.map} +1 -1
  27. package/dist/web/ui/assets/{Providers-CL6wMWni.js → Providers-Bm8sZNZo.js} +2 -2
  28. package/dist/web/ui/assets/{Providers-CL6wMWni.js.map → Providers-Bm8sZNZo.js.map} +1 -1
  29. package/dist/web/ui/assets/{Schedules-BQwE1hP5.js → Schedules-BZKhm9R7.js} +2 -2
  30. package/dist/web/ui/assets/{Schedules-BQwE1hP5.js.map → Schedules-BZKhm9R7.js.map} +1 -1
  31. package/dist/web/ui/assets/{Settings-26SF-okR.js → Settings-Hii-5oku.js} +2 -2
  32. package/dist/web/ui/assets/{Settings-26SF-okR.js.map → Settings-Hii-5oku.js.map} +1 -1
  33. package/dist/web/ui/assets/Skills-BHJp2CgD.js +17 -0
  34. package/dist/web/ui/assets/Skills-BHJp2CgD.js.map +1 -0
  35. package/dist/web/ui/assets/{Tasks-DbwRozzx.js → Tasks-D36pqkro.js} +2 -2
  36. package/dist/web/ui/assets/{Tasks-DbwRozzx.js.map → Tasks-D36pqkro.js.map} +1 -1
  37. package/dist/web/ui/assets/{Usage-i_q6Ri4s.js → Usage-CmjaYrsT.js} +2 -2
  38. package/dist/web/ui/assets/{Usage-i_q6Ri4s.js.map → Usage-CmjaYrsT.js.map} +1 -1
  39. package/dist/web/ui/assets/{Workspace-ZR5syf-9.js → Workspace-BYLf-wTJ.js} +2 -2
  40. package/dist/web/ui/assets/{Workspace-ZR5syf-9.js.map → Workspace-BYLf-wTJ.js.map} +1 -1
  41. package/dist/web/ui/assets/{activity-CIP1IzSg.js → activity-MOTqH8zM.js} +2 -2
  42. package/dist/web/ui/assets/{activity-CIP1IzSg.js.map → activity-MOTqH8zM.js.map} +1 -1
  43. package/dist/web/ui/assets/{alert-dialog-CW-j2nG4.js → alert-dialog-MbYSbZx5.js} +2 -2
  44. package/dist/web/ui/assets/{alert-dialog-CW-j2nG4.js.map → alert-dialog-MbYSbZx5.js.map} +1 -1
  45. package/dist/web/ui/assets/{arrow-left-D2YO-iMS.js → arrow-left-CtqQsBC6.js} +2 -2
  46. package/dist/web/ui/assets/{arrow-left-D2YO-iMS.js.map → arrow-left-CtqQsBC6.js.map} +1 -1
  47. package/dist/web/ui/assets/{avatar-BLsf3GhK.js → avatar-BIYaY7pR.js} +2 -2
  48. package/dist/web/ui/assets/{avatar-BLsf3GhK.js.map → avatar-BIYaY7pR.js.map} +1 -1
  49. package/dist/web/ui/assets/{badge-DfDJNUtd.js → badge-CUJiWF1y.js} +2 -2
  50. package/dist/web/ui/assets/{badge-DfDJNUtd.js.map → badge-CUJiWF1y.js.map} +1 -1
  51. package/dist/web/ui/assets/{button-TaFPR-zy.js → button-CNasMlFE.js} +2 -2
  52. package/dist/web/ui/assets/{button-TaFPR-zy.js.map → button-CNasMlFE.js.map} +1 -1
  53. package/dist/web/ui/assets/{card-DAYo4Zl5.js → card-BdsEOP7t.js} +2 -2
  54. package/dist/web/ui/assets/{card-DAYo4Zl5.js.map → card-BdsEOP7t.js.map} +1 -1
  55. package/dist/web/ui/assets/{chevron-down-CQi0yuay.js → chevron-down-CB9J_vvZ.js} +2 -2
  56. package/dist/web/ui/assets/{chevron-down-CQi0yuay.js.map → chevron-down-CB9J_vvZ.js.map} +1 -1
  57. package/dist/web/ui/assets/{circle-check-DweDcOkA.js → circle-check-DvGSe1uZ.js} +2 -2
  58. package/dist/web/ui/assets/{circle-check-DweDcOkA.js.map → circle-check-DvGSe1uZ.js.map} +1 -1
  59. package/dist/web/ui/assets/{circle-x-BmL20etA.js → circle-x-CyaGJ_BM.js} +2 -2
  60. package/dist/web/ui/assets/{circle-x-BmL20etA.js.map → circle-x-CyaGJ_BM.js.map} +1 -1
  61. package/dist/web/ui/assets/{dialog-DovgkMhT.js → dialog-Bd1rELXb.js} +2 -2
  62. package/dist/web/ui/assets/{dialog-DovgkMhT.js.map → dialog-Bd1rELXb.js.map} +1 -1
  63. package/dist/web/ui/assets/{download-_QBatDio.js → download-C8RvlFqO.js} +2 -2
  64. package/dist/web/ui/assets/{download-_QBatDio.js.map → download-C8RvlFqO.js.map} +1 -1
  65. package/dist/web/ui/assets/{eye-Wpgtfmgw.js → eye-BJ0NucMz.js} +2 -2
  66. package/dist/web/ui/assets/{eye-Wpgtfmgw.js.map → eye-BJ0NucMz.js.map} +1 -1
  67. package/dist/web/ui/assets/{file-text-2EGFNyc1.js → file-text-BWWBuD_N.js} +2 -2
  68. package/dist/web/ui/assets/{file-text-2EGFNyc1.js.map → file-text-BWWBuD_N.js.map} +1 -1
  69. package/dist/web/ui/assets/{folder-open-C-OiZn9P.js → folder-open-BwjemFy7.js} +2 -2
  70. package/dist/web/ui/assets/{folder-open-C-OiZn9P.js.map → folder-open-BwjemFy7.js.map} +1 -1
  71. package/dist/web/ui/assets/{git-branch-BT9gCKgG.js → git-branch-D9JVASpC.js} +2 -2
  72. package/dist/web/ui/assets/{git-branch-BT9gCKgG.js.map → git-branch-D9JVASpC.js.map} +1 -1
  73. package/dist/web/ui/assets/{index-BhxU0YlT.js → index-C3YiF4qv.js} +6 -6
  74. package/dist/web/ui/assets/index-C3YiF4qv.js.map +1 -0
  75. package/dist/web/ui/assets/{index-CUT6Fr2C.js → index-CaqLZNof.js} +2 -2
  76. package/dist/web/ui/assets/{index-CUT6Fr2C.js.map → index-CaqLZNof.js.map} +1 -1
  77. package/dist/web/ui/assets/index-CuhiuVab.css +1 -0
  78. package/dist/web/ui/assets/{input-L1uz5xAQ.js → input-CH3dmo9r.js} +2 -2
  79. package/dist/web/ui/assets/{input-L1uz5xAQ.js.map → input-CH3dmo9r.js.map} +1 -1
  80. package/dist/web/ui/assets/{loader-circle-BTFgt3hG.js → loader-circle-DbYKk0_Q.js} +2 -2
  81. package/dist/web/ui/assets/{loader-circle-BTFgt3hG.js.map → loader-circle-DbYKk0_Q.js.map} +1 -1
  82. package/dist/web/ui/assets/{pencil-uxK07iYy.js → pencil-gNDEMhav.js} +2 -2
  83. package/dist/web/ui/assets/{pencil-uxK07iYy.js.map → pencil-gNDEMhav.js.map} +1 -1
  84. package/dist/web/ui/assets/{plus-DcWFYr4m.js → plus-7rbHkByr.js} +2 -2
  85. package/dist/web/ui/assets/{plus-DcWFYr4m.js.map → plus-7rbHkByr.js.map} +1 -1
  86. package/dist/web/ui/assets/{power-DVIqVIMj.js → power-BS7gCDWs.js} +2 -2
  87. package/dist/web/ui/assets/{power-DVIqVIMj.js.map → power-BS7gCDWs.js.map} +1 -1
  88. package/dist/web/ui/assets/{progress-DMwOdxli.js → progress-ZzhsBV2v.js} +2 -2
  89. package/dist/web/ui/assets/{progress-DMwOdxli.js.map → progress-ZzhsBV2v.js.map} +1 -1
  90. package/dist/web/ui/assets/{search-D1OOxb1X.js → search-BZsbhO0B.js} +2 -2
  91. package/dist/web/ui/assets/{search-D1OOxb1X.js.map → search-BZsbhO0B.js.map} +1 -1
  92. package/dist/web/ui/assets/{select-Dnx_bUgy.js → select-vRSgBrHz.js} +2 -2
  93. package/dist/web/ui/assets/{select-Dnx_bUgy.js.map → select-vRSgBrHz.js.map} +1 -1
  94. package/dist/web/ui/assets/{send-D4uxqmyH.js → send-BkyTIUtJ.js} +2 -2
  95. package/dist/web/ui/assets/{send-D4uxqmyH.js.map → send-BkyTIUtJ.js.map} +1 -1
  96. package/dist/web/ui/assets/{sparkles-DLSJA4xU.js → sparkles-DcP24GEL.js} +2 -2
  97. package/dist/web/ui/assets/{sparkles-DLSJA4xU.js.map → sparkles-DcP24GEL.js.map} +1 -1
  98. package/dist/web/ui/assets/{switch-CvDDbCUA.js → switch-LRN9wWy2.js} +2 -2
  99. package/dist/web/ui/assets/{switch-CvDDbCUA.js.map → switch-LRN9wWy2.js.map} +1 -1
  100. package/dist/web/ui/assets/{terminal-DI3J3W_z.js → terminal-CWG62zdD.js} +2 -2
  101. package/dist/web/ui/assets/{terminal-DI3J3W_z.js.map → terminal-CWG62zdD.js.map} +1 -1
  102. package/dist/web/ui/assets/{textarea-CXLsr8tf.js → textarea-CXh3tmJ1.js} +2 -2
  103. package/dist/web/ui/assets/{textarea-CXLsr8tf.js.map → textarea-CXh3tmJ1.js.map} +1 -1
  104. package/dist/web/ui/assets/{zap-C-0oH5gt.js → zap-BEfqVtvZ.js} +2 -2
  105. package/dist/web/ui/assets/{zap-C-0oH5gt.js.map → zap-BEfqVtvZ.js.map} +1 -1
  106. package/dist/web/ui/index.html +2 -2
  107. package/package.json +9 -4
  108. package/dist/web/ui/assets/Skills-DANyYK_d.js +0 -7
  109. package/dist/web/ui/assets/Skills-DANyYK_d.js.map +0 -1
  110. package/dist/web/ui/assets/index-BhxU0YlT.js.map +0 -1
  111. package/dist/web/ui/assets/index-DOw1nKre.css +0 -1
  112. package/dist/web/ui/sw.js.map +0 -1
  113. package/dist/web/ui/workbox-0bb07689.js +0 -3
  114. package/dist/web/ui/workbox-0bb07689.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import{j as e,m as g,A as ie}from"./vendor-motion-Dwx3-JO5.js";import{r as a}from"./vendor-react-C7pctHW3.js";import{e as $,u as le,a as x,i as oe,n as y,o as V,j as me,p as ue,c as G}from"./index-BhxU0YlT.js";import{C as d,c,a as p}from"./card-DAYo4Zl5.js";import{I as r}from"./input-L1uz5xAQ.js";import{B as h}from"./button-TaFPR-zy.js";import{C as J}from"./circle-x-BmL20etA.js";import{S as xe}from"./sparkles-DLSJA4xU.js";import{L as w}from"./loader-circle-BTFgt3hG.js";import{C as he}from"./circle-check-DweDcOkA.js";import"./vendor-syntax-xZUI6Op9.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CUT6Fr2C.js";/**
1
+ import{j as e,m as g,A as ie}from"./vendor-motion-Dwx3-JO5.js";import{r as a}from"./vendor-react-C7pctHW3.js";import{e as $,u as le,a as x,i as oe,n as y,o as V,j as me,p as ue,c as G}from"./index-C3YiF4qv.js";import{C as d,c,a as p}from"./card-BdsEOP7t.js";import{I as r}from"./input-CH3dmo9r.js";import{B as h}from"./button-CNasMlFE.js";import{C as J}from"./circle-x-CyaGJ_BM.js";import{S as xe}from"./sparkles-DcP24GEL.js";import{L as w}from"./loader-circle-DbYKk0_Q.js";import{C as he}from"./circle-check-DvGSe1uZ.js";import"./vendor-syntax-xZUI6Op9.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CaqLZNof.js";/**
2
2
  * @license lucide-react v0.511.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -9,4 +9,4 @@ import{j as e,m as g,A as ie}from"./vendor-motion-Dwx3-JO5.js";import{r as a}fro
9
9
  * This source code is licensed under the ISC license.
10
10
  * See the LICENSE file in the root directory of this source tree.
11
11
  */const fe=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]],X=$("user",fe);function k({feedback:t}){return e.jsx(ie,{children:t&&e.jsx(g.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},className:"overflow-hidden",children:e.jsxs("div",{className:G("flex items-center gap-2 rounded-md px-3 py-2 text-sm",t.type==="success"?"bg-emerald-500/10 text-emerald-400":"bg-destructive/10 text-destructive"),children:[t.type==="success"?e.jsx(he,{className:"h-4 w-4 shrink-0"}):e.jsx(J,{className:"h-4 w-4 shrink-0"}),t.message]})})})}function C(){return e.jsxs(d,{className:"border-border/50 bg-card/60 backdrop-blur",children:[e.jsxs(p,{children:[e.jsx("div",{className:"h-5 w-32 animate-pulse rounded bg-muted"}),e.jsx("div",{className:"h-3.5 w-56 animate-pulse rounded bg-muted mt-1"})]}),e.jsx(c,{className:"space-y-4",children:[1,2,3].map(t=>e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"h-3.5 w-20 animate-pulse rounded bg-muted"}),e.jsx("div",{className:"h-9 w-full animate-pulse rounded-md bg-muted"})]},t))})]})}function S(){const[t,i]=a.useState(null),l=a.useCallback(o=>{i(o),setTimeout(()=>i(null),4e3)},[]);return[t,l]}const n={initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.35}};function Be(){const[t,i]=a.useState(!0),[l,o]=a.useState(null),[K,Q]=a.useState(""),[P,U]=a.useState(""),[E,F]=a.useState(0),[B,I]=a.useState(!1),[W,D]=S(),[f,L]=a.useState(""),[j,z]=a.useState(""),[A,M]=a.useState(!1),[Y,b]=S(),[N,T]=a.useState(""),[m,_]=a.useState(""),[q,H]=a.useState(""),[R,O]=a.useState(!1),[Z,u]=S(),{theme:ee,setTheme:se}=le(),v=a.useCallback(async()=>{try{const s=await x.config.get();Q(s.identity),U(s.defaultProvider),F(s.tokenBudget),o(null)}catch(s){o(s instanceof Error?s.message:"Failed to load settings")}finally{i(!1)}},[]);a.useEffect(()=>{v()},[v]);const ae=async()=>{I(!0);try{await x.config.update({identity:K,defaultProvider:P,tokenBudget:E}),D({type:"success",message:"Settings saved"})}catch(s){D({type:"error",message:s instanceof Error?s.message:"Save failed"})}finally{I(!1)}},te=async()=>{if(!f||!j){b({type:"error",message:"Both fields are required"});return}M(!0);try{await x.auth.changeUsername(f,j),b({type:"success",message:"Username updated"}),L(""),z("")}catch(s){b({type:"error",message:s instanceof Error?s.message:"Update failed"})}finally{M(!1)}},re=async()=>{if(!N||!m){u({type:"error",message:"All fields are required"});return}if(m!==q){u({type:"error",message:"Passwords do not match"});return}O(!0);try{await x.auth.changePassword(N,m),u({type:"success",message:"Password updated"}),T(""),_(""),H("")}catch(s){u({type:"error",message:s instanceof Error?s.message:"Update failed"})}finally{O(!1)}},ne=[{value:"light",label:"Light",icon:V},{value:"dark",label:"Dark",icon:me},{value:"system",label:"System",icon:ue}];return t?e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"h-10 w-10 animate-pulse rounded-xl bg-muted"}),e.jsxs("div",{children:[e.jsx("div",{className:"h-6 w-24 animate-pulse rounded bg-muted"}),e.jsx("div",{className:"h-4 w-48 animate-pulse rounded bg-muted mt-1"})]})]}),e.jsx(C,{}),e.jsx(C,{}),e.jsx(C,{})]}):e.jsxs("div",{className:"space-y-6 p-6 max-w-3xl",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-[#00d4ff]/20 to-[#a78bfa]/20 ring-1 ring-[#00d4ff]/30",children:e.jsx(oe,{className:"h-5 w-5 text-[#00d4ff]"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold text-foreground",children:"Settings"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Manage agent identity, credentials, and preferences"})]})]}),l&&e.jsx(d,{className:"border-destructive/50 bg-destructive/5",children:e.jsxs(c,{className:"flex items-center gap-3 py-4",children:[e.jsx(J,{className:"h-5 w-5 text-destructive"}),e.jsx("p",{className:"text-sm text-destructive",children:l}),e.jsx(h,{variant:"outline",size:"sm",className:"ml-auto",onClick:v,children:"Retry"})]})}),e.jsx(g.div,{...n,transition:{...n.transition,delay:0},children:e.jsxs(d,{className:"border-border/50 bg-card/60 backdrop-blur",children:[e.jsxs(p,{className:"pb-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(xe,{className:"h-4 w-4 text-[#a78bfa]"}),e.jsx("h2",{className:"text-lg font-medium text-foreground",children:"Defaults"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Default provider and daily token budget"})]}),e.jsxs(c,{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",children:"Default Provider"}),e.jsx(r,{placeholder:"openai",value:P,onChange:s=>U(s.target.value),className:"bg-background/50"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",children:"Daily Token Budget"}),e.jsx(r,{type:"number",min:0,placeholder:"100000",value:E||"",onChange:s=>F(Number(s.target.value)),className:"bg-background/50"})]})]}),e.jsx(k,{feedback:W}),e.jsx("div",{className:"pt-1",children:e.jsxs(h,{size:"sm",onClick:ae,disabled:B,className:"bg-gradient-to-r from-[#00d4ff] to-[#a78bfa] text-white hover:opacity-90 transition-opacity",children:[B&&e.jsx(w,{className:"mr-1.5 h-3.5 w-3.5 animate-spin"}),"Save"]})})]})]})}),e.jsx(y,{className:"bg-border/40"}),e.jsx(g.div,{...n,transition:{...n.transition,delay:.1},children:e.jsxs(d,{className:"border-border/50 bg-card/60 backdrop-blur",children:[e.jsxs(p,{className:"pb-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(X,{className:"h-4 w-4 text-[#00d4ff]"}),e.jsx("h2",{className:"text-lg font-medium text-foreground",children:"Account"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Update your login credentials"})]}),e.jsxs(c,{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(X,{className:"h-3.5 w-3.5 text-muted-foreground"}),e.jsx("span",{className:"text-sm font-medium text-foreground",children:"Change Username"})]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",children:"Current Password"}),e.jsx(r,{type:"password",placeholder:"Enter current password",value:f,onChange:s=>L(s.target.value),className:"bg-background/50"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",children:"New Username"}),e.jsx(r,{placeholder:"Enter new username",value:j,onChange:s=>z(s.target.value),className:"bg-background/50"})]})]}),e.jsx(k,{feedback:Y}),e.jsxs(h,{size:"sm",variant:"outline",onClick:te,disabled:A,children:[A&&e.jsx(w,{className:"mr-1.5 h-3.5 w-3.5 animate-spin"}),"Update Username"]})]}),e.jsx(y,{className:"bg-border/30"}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(pe,{className:"h-3.5 w-3.5 text-muted-foreground"}),e.jsx("span",{className:"text-sm font-medium text-foreground",children:"Change Password"})]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",children:"Current Password"}),e.jsx(r,{type:"password",placeholder:"Current",value:N,onChange:s=>T(s.target.value),className:"bg-background/50"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",children:"New Password"}),e.jsx(r,{type:"password",placeholder:"New",value:m,onChange:s=>_(s.target.value),className:"bg-background/50"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",children:"Confirm Password"}),e.jsx(r,{type:"password",placeholder:"Confirm",value:q,onChange:s=>H(s.target.value),className:"bg-background/50"})]})]}),e.jsx(k,{feedback:Z}),e.jsxs(h,{size:"sm",variant:"outline",onClick:re,disabled:R,children:[R&&e.jsx(w,{className:"mr-1.5 h-3.5 w-3.5 animate-spin"}),"Update Password"]})]})]})]})}),e.jsx(y,{className:"bg-border/40"}),e.jsx(g.div,{...n,transition:{...n.transition,delay:.2},children:e.jsxs(d,{className:"border-border/50 bg-card/60 backdrop-blur",children:[e.jsxs(p,{className:"pb-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(V,{className:"h-4 w-4 text-[#00d4ff]"}),e.jsx("h2",{className:"text-lg font-medium text-foreground",children:"Appearance"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Choose your preferred theme"})]}),e.jsx(c,{children:e.jsx("div",{className:"flex gap-2",children:ne.map(({value:s,label:de,icon:ce})=>e.jsxs("button",{onClick:()=>se(s),className:G("flex items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-all",ee===s?"border-[#00d4ff]/50 bg-[#00d4ff]/10 text-[#00d4ff] ring-1 ring-[#00d4ff]/20":"border-border/50 bg-background/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[e.jsx(ce,{className:"h-4 w-4"}),de]},s))})})]})})]})}export{Be as SettingsPage};
12
- //# sourceMappingURL=Settings-26SF-okR.js.map
12
+ //# sourceMappingURL=Settings-Hii-5oku.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Settings-26SF-okR.js","sources":["../../node_modules/lucide-react/dist/esm/icons/lock.js","../../node_modules/lucide-react/dist/esm/icons/user.js","../../src/pages/Settings.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n];\nconst User = createLucideIcon(\"user\", __iconNode);\n\nexport { __iconNode, User as default };\n//# sourceMappingURL=user.js.map\n","import { useCallback, useEffect, useState } from \"react\";\nimport {\n Settings,\n Loader2,\n CheckCircle2,\n XCircle,\n Sun,\n Moon,\n Monitor,\n User,\n Lock,\n Sparkles,\n} from \"lucide-react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport api, { type AppConfig } from \"@/lib/api\";\nimport { cn } from \"@/lib/utils\";\nimport { Card, CardHeader, CardContent } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { useThemeStore } from \"@/stores/theme\";\n\n/* ── Feedback toast inline ── */\ninterface Feedback {\n type: \"success\" | \"error\";\n message: string;\n}\n\nfunction FeedbackBanner({ feedback }: { feedback: Feedback | null }) {\n return (\n <AnimatePresence>\n {feedback && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-md px-3 py-2 text-sm\",\n feedback.type === \"success\"\n ? \"bg-emerald-500/10 text-emerald-400\"\n : \"bg-destructive/10 text-destructive\"\n )}\n >\n {feedback.type === \"success\" ? (\n <CheckCircle2 className=\"h-4 w-4 shrink-0\" />\n ) : (\n <XCircle className=\"h-4 w-4 shrink-0\" />\n )}\n {feedback.message}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\n/* ── Skeleton ── */\nfunction SectionSkeleton() {\n return (\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader>\n <div className=\"h-5 w-32 animate-pulse rounded bg-muted\" />\n <div className=\"h-3.5 w-56 animate-pulse rounded bg-muted mt-1\" />\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"h-3.5 w-20 animate-pulse rounded bg-muted\" />\n <div className=\"h-9 w-full animate-pulse rounded-md bg-muted\" />\n </div>\n ))}\n </CardContent>\n </Card>\n );\n}\n\n/* ── Hook: auto-dismiss feedback ── */\nfunction useFeedback(): [Feedback | null, (f: Feedback) => void] {\n const [fb, setFb] = useState<Feedback | null>(null);\n const show = useCallback((f: Feedback) => {\n setFb(f);\n setTimeout(() => setFb(null), 4000);\n }, []);\n return [fb, show];\n}\n\n/* ── Fade wrapper ── */\nconst fadeIn = {\n initial: { opacity: 0, y: 16 },\n animate: { opacity: 1, y: 0 },\n transition: { duration: 0.35 },\n};\n\nexport function SettingsPage() {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n /* Identity state */\n const [identity, setIdentity] = useState(\"\");\n const [defaultProvider, setDefaultProvider] = useState(\"\");\n const [tokenBudget, setTokenBudget] = useState(0);\n const [identitySaving, setIdentitySaving] = useState(false);\n const [identityFb, showIdentityFb] = useFeedback();\n\n /* Account state */\n const [unCurrent, setUnCurrent] = useState(\"\");\n const [newUsername, setNewUsername] = useState(\"\");\n const [unSaving, setUnSaving] = useState(false);\n const [unFb, showUnFb] = useFeedback();\n\n const [pwCurrent, setPwCurrent] = useState(\"\");\n const [newPassword, setNewPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [pwSaving, setPwSaving] = useState(false);\n const [pwFb, showPwFb] = useFeedback();\n\n /* Theme */\n const { theme, setTheme } = useThemeStore();\n\n const fetchConfig = useCallback(async () => {\n try {\n const cfg: AppConfig = await api.config.get();\n setIdentity(cfg.identity);\n setDefaultProvider(cfg.defaultProvider);\n setTokenBudget(cfg.tokenBudget);\n setError(null);\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to load settings\");\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n /* Handlers */\n const saveIdentity = async () => {\n setIdentitySaving(true);\n try {\n await api.config.update({ identity, defaultProvider, tokenBudget });\n showIdentityFb({ type: \"success\", message: \"Settings saved\" });\n } catch (e) {\n showIdentityFb({\n type: \"error\",\n message: e instanceof Error ? e.message : \"Save failed\",\n });\n } finally {\n setIdentitySaving(false);\n }\n };\n\n const changeUsername = async () => {\n if (!unCurrent || !newUsername) {\n showUnFb({ type: \"error\", message: \"Both fields are required\" });\n return;\n }\n setUnSaving(true);\n try {\n await api.auth.changeUsername(unCurrent, newUsername);\n showUnFb({ type: \"success\", message: \"Username updated\" });\n setUnCurrent(\"\");\n setNewUsername(\"\");\n } catch (e) {\n showUnFb({\n type: \"error\",\n message: e instanceof Error ? e.message : \"Update failed\",\n });\n } finally {\n setUnSaving(false);\n }\n };\n\n const changePassword = async () => {\n if (!pwCurrent || !newPassword) {\n showPwFb({ type: \"error\", message: \"All fields are required\" });\n return;\n }\n if (newPassword !== confirmPassword) {\n showPwFb({ type: \"error\", message: \"Passwords do not match\" });\n return;\n }\n setPwSaving(true);\n try {\n await api.auth.changePassword(pwCurrent, newPassword);\n showPwFb({ type: \"success\", message: \"Password updated\" });\n setPwCurrent(\"\");\n setNewPassword(\"\");\n setConfirmPassword(\"\");\n } catch (e) {\n showPwFb({\n type: \"error\",\n message: e instanceof Error ? e.message : \"Update failed\",\n });\n } finally {\n setPwSaving(false);\n }\n };\n\n const themeOptions: { value: \"dark\" | \"light\" | \"system\"; label: string; icon: typeof Sun }[] = [\n { value: \"light\", label: \"Light\", icon: Sun },\n { value: \"dark\", label: \"Dark\", icon: Moon },\n { value: \"system\", label: \"System\", icon: Monitor },\n ];\n\n if (loading) {\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-10 w-10 animate-pulse rounded-xl bg-muted\" />\n <div>\n <div className=\"h-6 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-4 w-48 animate-pulse rounded bg-muted mt-1\" />\n </div>\n </div>\n <SectionSkeleton />\n <SectionSkeleton />\n <SectionSkeleton />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6 max-w-3xl\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-[#00d4ff]/20 to-[#a78bfa]/20 ring-1 ring-[#00d4ff]/30\">\n <Settings className=\"h-5 w-5 text-[#00d4ff]\" />\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Settings</h1>\n <p className=\"text-sm text-muted-foreground\">\n Manage agent identity, credentials, and preferences\n </p>\n </div>\n </div>\n\n {error && (\n <Card className=\"border-destructive/50 bg-destructive/5\">\n <CardContent className=\"flex items-center gap-3 py-4\">\n <XCircle className=\"h-5 w-5 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n <Button variant=\"outline\" size=\"sm\" className=\"ml-auto\" onClick={fetchConfig}>\n Retry\n </Button>\n </CardContent>\n </Card>\n )}\n\n {/* ── Defaults Section ── */}\n <motion.div {...fadeIn} transition={{ ...fadeIn.transition, delay: 0 }}>\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"h-4 w-4 text-[#a78bfa]\" />\n <h2 className=\"text-lg font-medium text-foreground\">Defaults</h2>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Default provider and daily token budget\n </p>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Default Provider\n </label>\n <Input\n placeholder=\"openai\"\n value={defaultProvider}\n onChange={(e) => setDefaultProvider(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Daily Token Budget\n </label>\n <Input\n type=\"number\"\n min={0}\n placeholder=\"100000\"\n value={tokenBudget || \"\"}\n onChange={(e) => setTokenBudget(Number(e.target.value))}\n className=\"bg-background/50\"\n />\n </div>\n </div>\n\n <FeedbackBanner feedback={identityFb} />\n\n <div className=\"pt-1\">\n <Button\n size=\"sm\"\n onClick={saveIdentity}\n disabled={identitySaving}\n className=\"bg-gradient-to-r from-[#00d4ff] to-[#a78bfa] text-white hover:opacity-90 transition-opacity\"\n >\n {identitySaving && (\n <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />\n )}\n Save\n </Button>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n\n <Separator className=\"bg-border/40\" />\n\n {/* ── Account Section ── */}\n <motion.div {...fadeIn} transition={{ ...fadeIn.transition, delay: 0.1 }}>\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <User className=\"h-4 w-4 text-[#00d4ff]\" />\n <h2 className=\"text-lg font-medium text-foreground\">Account</h2>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Update your login credentials\n </p>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {/* Change Username */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <User className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Change Username\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Current Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"Enter current password\"\n value={unCurrent}\n onChange={(e) => setUnCurrent(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n New Username\n </label>\n <Input\n placeholder=\"Enter new username\"\n value={newUsername}\n onChange={(e) => setNewUsername(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n </div>\n <FeedbackBanner feedback={unFb} />\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={changeUsername}\n disabled={unSaving}\n >\n {unSaving && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n Update Username\n </Button>\n </div>\n\n <Separator className=\"bg-border/30\" />\n\n {/* Change Password */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Lock className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Change Password\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-3\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Current Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"Current\"\n value={pwCurrent}\n onChange={(e) => setPwCurrent(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n New Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"New\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Confirm Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"Confirm\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n </div>\n <FeedbackBanner feedback={pwFb} />\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={changePassword}\n disabled={pwSaving}\n >\n {pwSaving && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n Update Password\n </Button>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n\n <Separator className=\"bg-border/40\" />\n\n {/* ── Appearance Section ── */}\n <motion.div {...fadeIn} transition={{ ...fadeIn.transition, delay: 0.2 }}>\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <Sun className=\"h-4 w-4 text-[#00d4ff]\" />\n <h2 className=\"text-lg font-medium text-foreground\">Appearance</h2>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Choose your preferred theme\n </p>\n </CardHeader>\n <CardContent>\n <div className=\"flex gap-2\">\n {themeOptions.map(({ value, label, icon: Icon }) => (\n <button\n key={value}\n onClick={() => setTheme(value)}\n className={cn(\n \"flex items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-all\",\n theme === value\n ? \"border-[#00d4ff]/50 bg-[#00d4ff]/10 text-[#00d4ff] ring-1 ring-[#00d4ff]/20\"\n : \"border-border/50 bg-background/50 text-muted-foreground hover:text-foreground hover:border-border\"\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </div>\n </CardContent>\n </Card>\n </motion.div>\n </div>\n );\n}\n"],"names":["__iconNode","Lock","createLucideIcon","User","FeedbackBanner","feedback","jsx","AnimatePresence","motion","jsxs","cn","CheckCircle2","XCircle","SectionSkeleton","Card","CardHeader","CardContent","i","useFeedback","fb","setFb","useState","show","useCallback","f","fadeIn","SettingsPage","loading","setLoading","error","setError","identity","setIdentity","defaultProvider","setDefaultProvider","tokenBudget","setTokenBudget","identitySaving","setIdentitySaving","identityFb","showIdentityFb","unCurrent","setUnCurrent","newUsername","setNewUsername","unSaving","setUnSaving","unFb","showUnFb","pwCurrent","setPwCurrent","newPassword","setNewPassword","confirmPassword","setConfirmPassword","pwSaving","setPwSaving","pwFb","showPwFb","theme","setTheme","useThemeStore","fetchConfig","cfg","api","e","useEffect","saveIdentity","changeUsername","changePassword","themeOptions","Sun","Moon","Monitor","Settings","Button","Sparkles","Input","Loader2","Separator","value","label","Icon"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"Settings-Hii-5oku.js","sources":["../../node_modules/lucide-react/dist/esm/icons/lock.js","../../node_modules/lucide-react/dist/esm/icons/user.js","../../src/pages/Settings.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n];\nconst User = createLucideIcon(\"user\", __iconNode);\n\nexport { __iconNode, User as default };\n//# sourceMappingURL=user.js.map\n","import { useCallback, useEffect, useState } from \"react\";\nimport {\n Settings,\n Loader2,\n CheckCircle2,\n XCircle,\n Sun,\n Moon,\n Monitor,\n User,\n Lock,\n Sparkles,\n} from \"lucide-react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport api, { type AppConfig } from \"@/lib/api\";\nimport { cn } from \"@/lib/utils\";\nimport { Card, CardHeader, CardContent } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { useThemeStore } from \"@/stores/theme\";\n\n/* ── Feedback toast inline ── */\ninterface Feedback {\n type: \"success\" | \"error\";\n message: string;\n}\n\nfunction FeedbackBanner({ feedback }: { feedback: Feedback | null }) {\n return (\n <AnimatePresence>\n {feedback && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-md px-3 py-2 text-sm\",\n feedback.type === \"success\"\n ? \"bg-emerald-500/10 text-emerald-400\"\n : \"bg-destructive/10 text-destructive\"\n )}\n >\n {feedback.type === \"success\" ? (\n <CheckCircle2 className=\"h-4 w-4 shrink-0\" />\n ) : (\n <XCircle className=\"h-4 w-4 shrink-0\" />\n )}\n {feedback.message}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\n/* ── Skeleton ── */\nfunction SectionSkeleton() {\n return (\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader>\n <div className=\"h-5 w-32 animate-pulse rounded bg-muted\" />\n <div className=\"h-3.5 w-56 animate-pulse rounded bg-muted mt-1\" />\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"h-3.5 w-20 animate-pulse rounded bg-muted\" />\n <div className=\"h-9 w-full animate-pulse rounded-md bg-muted\" />\n </div>\n ))}\n </CardContent>\n </Card>\n );\n}\n\n/* ── Hook: auto-dismiss feedback ── */\nfunction useFeedback(): [Feedback | null, (f: Feedback) => void] {\n const [fb, setFb] = useState<Feedback | null>(null);\n const show = useCallback((f: Feedback) => {\n setFb(f);\n setTimeout(() => setFb(null), 4000);\n }, []);\n return [fb, show];\n}\n\n/* ── Fade wrapper ── */\nconst fadeIn = {\n initial: { opacity: 0, y: 16 },\n animate: { opacity: 1, y: 0 },\n transition: { duration: 0.35 },\n};\n\nexport function SettingsPage() {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n /* Identity state */\n const [identity, setIdentity] = useState(\"\");\n const [defaultProvider, setDefaultProvider] = useState(\"\");\n const [tokenBudget, setTokenBudget] = useState(0);\n const [identitySaving, setIdentitySaving] = useState(false);\n const [identityFb, showIdentityFb] = useFeedback();\n\n /* Account state */\n const [unCurrent, setUnCurrent] = useState(\"\");\n const [newUsername, setNewUsername] = useState(\"\");\n const [unSaving, setUnSaving] = useState(false);\n const [unFb, showUnFb] = useFeedback();\n\n const [pwCurrent, setPwCurrent] = useState(\"\");\n const [newPassword, setNewPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [pwSaving, setPwSaving] = useState(false);\n const [pwFb, showPwFb] = useFeedback();\n\n /* Theme */\n const { theme, setTheme } = useThemeStore();\n\n const fetchConfig = useCallback(async () => {\n try {\n const cfg: AppConfig = await api.config.get();\n setIdentity(cfg.identity);\n setDefaultProvider(cfg.defaultProvider);\n setTokenBudget(cfg.tokenBudget);\n setError(null);\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to load settings\");\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n /* Handlers */\n const saveIdentity = async () => {\n setIdentitySaving(true);\n try {\n await api.config.update({ identity, defaultProvider, tokenBudget });\n showIdentityFb({ type: \"success\", message: \"Settings saved\" });\n } catch (e) {\n showIdentityFb({\n type: \"error\",\n message: e instanceof Error ? e.message : \"Save failed\",\n });\n } finally {\n setIdentitySaving(false);\n }\n };\n\n const changeUsername = async () => {\n if (!unCurrent || !newUsername) {\n showUnFb({ type: \"error\", message: \"Both fields are required\" });\n return;\n }\n setUnSaving(true);\n try {\n await api.auth.changeUsername(unCurrent, newUsername);\n showUnFb({ type: \"success\", message: \"Username updated\" });\n setUnCurrent(\"\");\n setNewUsername(\"\");\n } catch (e) {\n showUnFb({\n type: \"error\",\n message: e instanceof Error ? e.message : \"Update failed\",\n });\n } finally {\n setUnSaving(false);\n }\n };\n\n const changePassword = async () => {\n if (!pwCurrent || !newPassword) {\n showPwFb({ type: \"error\", message: \"All fields are required\" });\n return;\n }\n if (newPassword !== confirmPassword) {\n showPwFb({ type: \"error\", message: \"Passwords do not match\" });\n return;\n }\n setPwSaving(true);\n try {\n await api.auth.changePassword(pwCurrent, newPassword);\n showPwFb({ type: \"success\", message: \"Password updated\" });\n setPwCurrent(\"\");\n setNewPassword(\"\");\n setConfirmPassword(\"\");\n } catch (e) {\n showPwFb({\n type: \"error\",\n message: e instanceof Error ? e.message : \"Update failed\",\n });\n } finally {\n setPwSaving(false);\n }\n };\n\n const themeOptions: { value: \"dark\" | \"light\" | \"system\"; label: string; icon: typeof Sun }[] = [\n { value: \"light\", label: \"Light\", icon: Sun },\n { value: \"dark\", label: \"Dark\", icon: Moon },\n { value: \"system\", label: \"System\", icon: Monitor },\n ];\n\n if (loading) {\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-10 w-10 animate-pulse rounded-xl bg-muted\" />\n <div>\n <div className=\"h-6 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-4 w-48 animate-pulse rounded bg-muted mt-1\" />\n </div>\n </div>\n <SectionSkeleton />\n <SectionSkeleton />\n <SectionSkeleton />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6 max-w-3xl\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-[#00d4ff]/20 to-[#a78bfa]/20 ring-1 ring-[#00d4ff]/30\">\n <Settings className=\"h-5 w-5 text-[#00d4ff]\" />\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Settings</h1>\n <p className=\"text-sm text-muted-foreground\">\n Manage agent identity, credentials, and preferences\n </p>\n </div>\n </div>\n\n {error && (\n <Card className=\"border-destructive/50 bg-destructive/5\">\n <CardContent className=\"flex items-center gap-3 py-4\">\n <XCircle className=\"h-5 w-5 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n <Button variant=\"outline\" size=\"sm\" className=\"ml-auto\" onClick={fetchConfig}>\n Retry\n </Button>\n </CardContent>\n </Card>\n )}\n\n {/* ── Defaults Section ── */}\n <motion.div {...fadeIn} transition={{ ...fadeIn.transition, delay: 0 }}>\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"h-4 w-4 text-[#a78bfa]\" />\n <h2 className=\"text-lg font-medium text-foreground\">Defaults</h2>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Default provider and daily token budget\n </p>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Default Provider\n </label>\n <Input\n placeholder=\"openai\"\n value={defaultProvider}\n onChange={(e) => setDefaultProvider(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Daily Token Budget\n </label>\n <Input\n type=\"number\"\n min={0}\n placeholder=\"100000\"\n value={tokenBudget || \"\"}\n onChange={(e) => setTokenBudget(Number(e.target.value))}\n className=\"bg-background/50\"\n />\n </div>\n </div>\n\n <FeedbackBanner feedback={identityFb} />\n\n <div className=\"pt-1\">\n <Button\n size=\"sm\"\n onClick={saveIdentity}\n disabled={identitySaving}\n className=\"bg-gradient-to-r from-[#00d4ff] to-[#a78bfa] text-white hover:opacity-90 transition-opacity\"\n >\n {identitySaving && (\n <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />\n )}\n Save\n </Button>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n\n <Separator className=\"bg-border/40\" />\n\n {/* ── Account Section ── */}\n <motion.div {...fadeIn} transition={{ ...fadeIn.transition, delay: 0.1 }}>\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <User className=\"h-4 w-4 text-[#00d4ff]\" />\n <h2 className=\"text-lg font-medium text-foreground\">Account</h2>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Update your login credentials\n </p>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {/* Change Username */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <User className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Change Username\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Current Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"Enter current password\"\n value={unCurrent}\n onChange={(e) => setUnCurrent(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n New Username\n </label>\n <Input\n placeholder=\"Enter new username\"\n value={newUsername}\n onChange={(e) => setNewUsername(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n </div>\n <FeedbackBanner feedback={unFb} />\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={changeUsername}\n disabled={unSaving}\n >\n {unSaving && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n Update Username\n </Button>\n </div>\n\n <Separator className=\"bg-border/30\" />\n\n {/* Change Password */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Lock className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Change Password\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-3\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Current Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"Current\"\n value={pwCurrent}\n onChange={(e) => setPwCurrent(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n New Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"New\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Confirm Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"Confirm\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n </div>\n <FeedbackBanner feedback={pwFb} />\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={changePassword}\n disabled={pwSaving}\n >\n {pwSaving && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n Update Password\n </Button>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n\n <Separator className=\"bg-border/40\" />\n\n {/* ── Appearance Section ── */}\n <motion.div {...fadeIn} transition={{ ...fadeIn.transition, delay: 0.2 }}>\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <Sun className=\"h-4 w-4 text-[#00d4ff]\" />\n <h2 className=\"text-lg font-medium text-foreground\">Appearance</h2>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Choose your preferred theme\n </p>\n </CardHeader>\n <CardContent>\n <div className=\"flex gap-2\">\n {themeOptions.map(({ value, label, icon: Icon }) => (\n <button\n key={value}\n onClick={() => setTheme(value)}\n className={cn(\n \"flex items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-all\",\n theme === value\n ? \"border-[#00d4ff]/50 bg-[#00d4ff]/10 text-[#00d4ff] ring-1 ring-[#00d4ff]/20\"\n : \"border-border/50 bg-background/50 text-muted-foreground hover:text-foreground hover:border-border\"\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </div>\n </CardContent>\n </Card>\n </motion.div>\n </div>\n );\n}\n"],"names":["__iconNode","Lock","createLucideIcon","User","FeedbackBanner","feedback","jsx","AnimatePresence","motion","jsxs","cn","CheckCircle2","XCircle","SectionSkeleton","Card","CardHeader","CardContent","i","useFeedback","fb","setFb","useState","show","useCallback","f","fadeIn","SettingsPage","loading","setLoading","error","setError","identity","setIdentity","defaultProvider","setDefaultProvider","tokenBudget","setTokenBudget","identitySaving","setIdentitySaving","identityFb","showIdentityFb","unCurrent","setUnCurrent","newUsername","setNewUsername","unSaving","setUnSaving","unFb","showUnFb","pwCurrent","setPwCurrent","newPassword","setNewPassword","confirmPassword","setConfirmPassword","pwSaving","setPwSaving","pwFb","showPwFb","theme","setTheme","useThemeStore","fetchConfig","cfg","api","e","useEffect","saveIdentity","changeUsername","changePassword","themeOptions","Sun","Moon","Monitor","Settings","Button","Sparkles","Input","Loader2","Separator","value","label","Icon"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -0,0 +1,17 @@
1
+ import{j as e,m as d,A as L}from"./vendor-motion-Dwx3-JO5.js";import{r as i}from"./vendor-react-C7pctHW3.js";import{C as f,c as g}from"./card-BdsEOP7t.js";import{B as u}from"./button-CNasMlFE.js";import{I as S}from"./input-CH3dmo9r.js";import{B as U}from"./badge-CUJiWF1y.js";import{A as z,h as q,T as V,a as O,b as H,c as X,d as G,e as J,f as K,g as Q}from"./alert-dialog-MbYSbZx5.js";import{e as w,a as c,c as M}from"./index-C3YiF4qv.js";import{S as W}from"./sparkles-DcP24GEL.js";import{L as b}from"./loader-circle-DbYKk0_Q.js";import{D as Y}from"./download-C8RvlFqO.js";import{F as Z}from"./folder-open-BwjemFy7.js";import{a as ee,P as se}from"./power-BS7gCDWs.js";import{C as te}from"./circle-check-DvGSe1uZ.js";import{C as ae}from"./circle-x-CyaGJ_BM.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CaqLZNof.js";import"./vendor-syntax-xZUI6Op9.js";/**
2
+ * @license lucide-react v0.511.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const ie=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],re=w("external-link",ie);/**
7
+ * @license lucide-react v0.511.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const le=[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]],ne=w("package",le);/**
12
+ * @license lucide-react v0.511.0 - ISC
13
+ *
14
+ * This source code is licensed under the ISC license.
15
+ * See the LICENSE file in the root directory of this source tree.
16
+ */const ce=[["path",{d:"m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7",key:"ztvudi"}],["path",{d:"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8",key:"1b2hhj"}],["path",{d:"M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4",key:"2ebpfo"}],["path",{d:"M2 7h20",key:"1fcdvo"}],["path",{d:"M22 7v3a2 2 0 0 1-2 2a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 16 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 12 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 8 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 4 12a2 2 0 0 1-2-2V7",key:"6c3vgh"}]],oe=w("store",ce),de={hidden:{opacity:0,y:12},visible:r=>({opacity:1,y:0,transition:{delay:r*.06,duration:.35,ease:"easeOut"}}),exit:{opacity:0,y:-8,transition:{duration:.2}}},me={visible:{transition:{staggerChildren:.06}}};function xe({toasts:r}){return e.jsx("div",{className:"fixed bottom-6 right-6 z-50 flex flex-col gap-2",children:e.jsx(L,{children:r.map(l=>e.jsxs(d.div,{initial:{opacity:0,x:40},animate:{opacity:1,x:0},exit:{opacity:0,x:40},className:M("flex items-center gap-2 rounded-lg border px-4 py-3 text-sm shadow-lg backdrop-blur-sm",l.type==="success"?"border-emerald-500/30 bg-emerald-500/10 text-emerald-400":"border-destructive/30 bg-destructive/10 text-destructive"),children:[l.type==="success"?e.jsx(te,{className:"h-4 w-4"}):e.jsx(ae,{className:"h-4 w-4"}),l.message]},l.id))})})}function o({className:r}){return e.jsx("div",{className:M("animate-pulse rounded-lg bg-muted",r)})}function he(){return e.jsx(f,{children:e.jsxs(g,{className:"p-5 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(o,{className:"h-5 w-32"}),e.jsx(o,{className:"h-5 w-16 rounded-md"})]}),e.jsx(o,{className:"h-4 w-full"}),e.jsx(o,{className:"h-3 w-48"}),e.jsxs("div",{className:"flex gap-2 pt-1",children:[e.jsx(o,{className:"h-8 w-24"}),e.jsx(o,{className:"h-8 w-20"})]})]})})}function Re(){const[r,l]=i.useState([]),[R,E]=i.useState(!0),[m,k]=i.useState(""),[p,A]=i.useState(!1),[j,C]=i.useState(""),[y,D]=i.useState(!1),[v,x]=i.useState({}),[T,I]=i.useState([]),a=i.useCallback((s,t)=>{const h=Date.now();I(N=>[...N,{id:h,type:s,message:t}]),setTimeout(()=>{I(N=>N.filter(P=>P.id!==h))},3500)},[]),n=i.useCallback(async()=>{try{const s=await c.skills.list();l(s.skills)}catch(s){a("error",s instanceof Error?s.message:"Failed to load skills")}finally{E(!1)}},[a]);i.useEffect(()=>{n()},[n]);const F=async()=>{if(m.trim()){A(!0);try{const s=await c.skills.install(m.trim());a("success",`Installed "${s.name}" successfully`),k(""),await n()}catch(s){a("error",s instanceof Error?s.message:"Installation failed")}finally{A(!1)}}},$=async()=>{const s=j.trim();if(s){D(!0);try{const t=await c.skills.installFromRegistry(s),h=t.status==="already-installed"?"Already installed":t.status==="updated"?"Updated":t.status==="reinstalled"?"Reinstalled":"Installed";a("success",`${h} "${t.id}" (v${t.version})`),C(""),await n()}catch(t){a("error",t instanceof Error?t.message:"Registry install failed")}finally{D(!1)}}},_=async s=>{x(t=>({...t,[s.name]:!0}));try{s.active?(await c.skills.deactivate(s.name),a("success",`Deactivated "${s.name}"`)):(await c.skills.activate(s.name),a("success",`Activated "${s.name}"`)),await n()}catch(t){a("error",t instanceof Error?t.message:"Toggle failed")}finally{x(t=>({...t,[s.name]:!1}))}},B=async s=>{x(t=>({...t,[s]:!0}));try{await c.skills.delete(s),a("success",`Deleted "${s}"`),await n()}catch(t){a("error",t instanceof Error?t.message:"Delete failed")}finally{x(t=>({...t,[s]:!1}))}};return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx(d.div,{initial:{opacity:0,y:-8},animate:{opacity:1,y:0},transition:{duration:.3},children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-[#00d4ff]/10",children:e.jsx(W,{className:"h-5 w-5 text-[#00d4ff]"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold text-foreground",children:"Skills"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Extend Mercury with installable capabilities"})]})]})}),e.jsx(d.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},transition:{delay:.1,duration:.3},children:e.jsx(f,{children:e.jsxs(g,{className:"p-5 space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between gap-3 mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(oe,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm font-medium text-foreground",children:"Install from registry"})]}),e.jsxs("a",{href:"https://skills.mercuryagent.sh",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-[#00d4ff] transition-colors",children:["Browse skills.mercuryagent.sh",e.jsx(re,{className:"h-3 w-3"})]})]}),e.jsxs("form",{onSubmit:s=>{s.preventDefault(),$()},className:"flex gap-3",children:[e.jsx(S,{placeholder:"category/skill-slug e.g. finance-legal/contract-review",value:j,onChange:s=>C(s.target.value),disabled:y,className:"flex-1 font-mono text-sm"}),e.jsx(u,{type:"submit",disabled:y||!j.trim(),children:y?e.jsxs(e.Fragment,{children:[e.jsx(b,{className:"h-4 w-4 animate-spin"}),"Installing"]}):"Install"})]}),e.jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:"Review any skill on the registry before installing — they execute with your agent's privileges."})]}),e.jsx("div",{className:"h-px bg-border"}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsx(Y,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm font-medium text-foreground",children:"Install from URL"})]}),e.jsxs("form",{onSubmit:s=>{s.preventDefault(),F()},className:"flex gap-3",children:[e.jsx(S,{placeholder:"https://github.com/user/skill-package",value:m,onChange:s=>k(s.target.value),disabled:p,className:"flex-1"}),e.jsx(u,{type:"submit",variant:"outline",disabled:p||!m.trim(),children:p?e.jsxs(e.Fragment,{children:[e.jsx(b,{className:"h-4 w-4 animate-spin"}),"Installing"]}):"Install"})]})]})]})})}),R?e.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:Array.from({length:3}).map((s,t)=>e.jsx(he,{},t))}):r.length===0?e.jsx(d.div,{initial:{opacity:0},animate:{opacity:1},transition:{delay:.2},children:e.jsx(f,{children:e.jsxs(g,{className:"flex flex-col items-center justify-center py-16 text-center",children:[e.jsx("div",{className:"flex h-14 w-14 items-center justify-center rounded-full bg-muted mb-4",children:e.jsx(ne,{className:"h-7 w-7 text-muted-foreground"})}),e.jsx("h3",{className:"text-base font-medium text-foreground mb-1",children:"No skills installed"}),e.jsx("p",{className:"text-sm text-muted-foreground max-w-sm",children:"Install skills from a URL above to extend Mercury's capabilities with new tools, workflows, and integrations."})]})})}):e.jsx(d.div,{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",variants:me,initial:"hidden",animate:"visible",children:e.jsx(L,{mode:"popLayout",children:r.map((s,t)=>e.jsx(d.div,{custom:t,variants:de,initial:"hidden",animate:"visible",exit:"exit",layout:!0,children:e.jsx(f,{className:"h-full",children:e.jsxs(g,{className:"p-5 flex flex-col gap-3 h-full",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsx("h3",{className:"text-sm font-semibold text-foreground leading-tight",children:s.name}),e.jsx(U,{variant:s.active?"success":"secondary",children:s.active?"Active":"Inactive"})]}),s.description&&e.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:s.description}),e.jsxs("div",{className:"flex items-center gap-1.5 mt-auto",children:[e.jsx(Z,{className:"h-3 w-3 text-muted-foreground/60 shrink-0"}),e.jsx("span",{className:"text-xs text-muted-foreground/60 truncate font-mono",children:s.path})]}),e.jsxs("div",{className:"flex items-center gap-2 pt-1 border-t border-border",children:[e.jsx(u,{size:"sm",variant:s.active?"outline":"default",disabled:!!v[s.name],onClick:()=>_(s),className:"flex-1",children:v[s.name]?e.jsx(b,{className:"h-3.5 w-3.5 animate-spin"}):s.active?e.jsxs(e.Fragment,{children:[e.jsx(ee,{className:"h-3.5 w-3.5"}),"Deactivate"]}):e.jsxs(e.Fragment,{children:[e.jsx(se,{className:"h-3.5 w-3.5"}),"Activate"]})}),e.jsxs(z,{children:[e.jsx(q,{asChild:!0,children:e.jsx(u,{size:"sm",variant:"ghost",disabled:!!v[s.name],className:"text-muted-foreground hover:text-destructive",children:e.jsx(V,{className:"h-3.5 w-3.5"})})}),e.jsxs(O,{children:[e.jsxs(H,{children:[e.jsx(X,{children:"Delete Skill"}),e.jsxs(G,{children:["Are you sure you want to delete “",s.name,"”? This will remove the skill and all its data permanently."]})]}),e.jsxs(J,{children:[e.jsx(K,{children:"Cancel"}),e.jsx(Q,{onClick:()=>B(s.name),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"Delete"})]})]})]})]})]})})},s.name))})}),e.jsx(xe,{toasts:T})]})}export{Re as SkillsPage};
17
+ //# sourceMappingURL=Skills-BHJp2CgD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Skills-BHJp2CgD.js","sources":["../../node_modules/lucide-react/dist/esm/icons/external-link.js","../../node_modules/lucide-react/dist/esm/icons/package.js","../../node_modules/lucide-react/dist/esm/icons/store.js","../../src/pages/Skills.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n];\nconst ExternalLink = createLucideIcon(\"external-link\", __iconNode);\n\nexport { __iconNode, ExternalLink as default };\n//# sourceMappingURL=external-link.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\",\n key: \"1a0edw\"\n }\n ],\n [\"path\", { d: \"M12 22V12\", key: \"d0xqtd\" }],\n [\"polyline\", { points: \"3.29 7 12 12 20.71 7\", key: \"ousv84\" }],\n [\"path\", { d: \"m7.5 4.27 9 5.15\", key: \"1c824w\" }]\n];\nconst Package = createLucideIcon(\"package\", __iconNode);\n\nexport { __iconNode, Package as default };\n//# sourceMappingURL=package.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7\", key: \"ztvudi\" }],\n [\"path\", { d: \"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\", key: \"1b2hhj\" }],\n [\"path\", { d: \"M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4\", key: \"2ebpfo\" }],\n [\"path\", { d: \"M2 7h20\", key: \"1fcdvo\" }],\n [\n \"path\",\n {\n d: \"M22 7v3a2 2 0 0 1-2 2a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 16 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 12 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 8 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 4 12a2 2 0 0 1-2-2V7\",\n key: \"6c3vgh\"\n }\n ]\n];\nconst Store = createLucideIcon(\"store\", __iconNode);\n\nexport { __iconNode, Store as default };\n//# sourceMappingURL=store.js.map\n","import { useEffect, useState, useCallback } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Sparkles,\n Download,\n Loader2,\n Trash2,\n Power,\n PowerOff,\n Package,\n FolderOpen,\n CheckCircle2,\n XCircle,\n ExternalLink,\n Store,\n} from \"lucide-react\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@/components/ui/alert-dialog\";\nimport { cn } from \"@/lib/utils\";\nimport api, { type Skill } from \"@/lib/api\";\n\n/* ── Animations ─────────────────────────────────────────────── */\n\nconst fadeUp = {\n hidden: { opacity: 0, y: 12 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: { delay: i * 0.06, duration: 0.35, ease: \"easeOut\" as const },\n }),\n exit: { opacity: 0, y: -8, transition: { duration: 0.2 } },\n};\n\nconst stagger = {\n visible: { transition: { staggerChildren: 0.06 } },\n};\n\n/* ── Toast-style Feedback ───────────────────────────────────── */\n\ninterface Toast {\n id: number;\n type: \"success\" | \"error\";\n message: string;\n}\n\nfunction ToastBar({ toasts }: { toasts: Toast[] }) {\n return (\n <div className=\"fixed bottom-6 right-6 z-50 flex flex-col gap-2\">\n <AnimatePresence>\n {toasts.map((t) => (\n <motion.div\n key={t.id}\n initial={{ opacity: 0, x: 40 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 40 }}\n className={cn(\n \"flex items-center gap-2 rounded-lg border px-4 py-3 text-sm shadow-lg backdrop-blur-sm\",\n t.type === \"success\"\n ? \"border-emerald-500/30 bg-emerald-500/10 text-emerald-400\"\n : \"border-destructive/30 bg-destructive/10 text-destructive\"\n )}\n >\n {t.type === \"success\" ? (\n <CheckCircle2 className=\"h-4 w-4\" />\n ) : (\n <XCircle className=\"h-4 w-4\" />\n )}\n {t.message}\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n );\n}\n\n/* ── Skeleton ───────────────────────────────────────────────── */\n\nfunction Skeleton({ className }: { className?: string }) {\n return (\n <div className={cn(\"animate-pulse rounded-lg bg-muted\", className)} />\n );\n}\n\nfunction SkillCardSkeleton() {\n return (\n <Card>\n <CardContent className=\"p-5 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-5 w-32\" />\n <Skeleton className=\"h-5 w-16 rounded-md\" />\n </div>\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-3 w-48\" />\n <div className=\"flex gap-2 pt-1\">\n <Skeleton className=\"h-8 w-24\" />\n <Skeleton className=\"h-8 w-20\" />\n </div>\n </CardContent>\n </Card>\n );\n}\n\n/* ── Main Page ──────────────────────────────────────────────── */\n\nexport function SkillsPage() {\n const [skills, setSkills] = useState<Skill[]>([]);\n const [loading, setLoading] = useState(true);\n const [installUrl, setInstallUrl] = useState(\"\");\n const [installing, setInstalling] = useState(false);\n const [registryId, setRegistryId] = useState(\"\");\n const [installingRegistry, setInstallingRegistry] = useState(false);\n const [actionLoading, setActionLoading] = useState<Record<string, boolean>>({});\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const toast = useCallback((type: \"success\" | \"error\", message: string) => {\n const id = Date.now();\n setToasts((prev) => [...prev, { id, type, message }]);\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 3500);\n }, []);\n\n const fetchSkills = useCallback(async () => {\n try {\n const res = await api.skills.list();\n setSkills(res.skills);\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Failed to load skills\");\n } finally {\n setLoading(false);\n }\n }, [toast]);\n\n useEffect(() => {\n fetchSkills();\n }, [fetchSkills]);\n\n const handleInstall = async () => {\n if (!installUrl.trim()) return;\n setInstalling(true);\n try {\n const res = await api.skills.install(installUrl.trim());\n toast(\"success\", `Installed \"${res.name}\" successfully`);\n setInstallUrl(\"\");\n await fetchSkills();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Installation failed\");\n } finally {\n setInstalling(false);\n }\n };\n\n const handleRegistryInstall = async () => {\n const id = registryId.trim();\n if (!id) return;\n setInstallingRegistry(true);\n try {\n const res = await api.skills.installFromRegistry(id);\n const verb =\n res.status === \"already-installed\"\n ? \"Already installed\"\n : res.status === \"updated\"\n ? \"Updated\"\n : res.status === \"reinstalled\"\n ? \"Reinstalled\"\n : \"Installed\";\n toast(\"success\", `${verb} \"${res.id}\" (v${res.version})`);\n setRegistryId(\"\");\n await fetchSkills();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Registry install failed\");\n } finally {\n setInstallingRegistry(false);\n }\n };\n\n const handleToggle = async (skill: Skill) => {\n setActionLoading((prev) => ({ ...prev, [skill.name]: true }));\n try {\n if (skill.active) {\n await api.skills.deactivate(skill.name);\n toast(\"success\", `Deactivated \"${skill.name}\"`);\n } else {\n await api.skills.activate(skill.name);\n toast(\"success\", `Activated \"${skill.name}\"`);\n }\n await fetchSkills();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Toggle failed\");\n } finally {\n setActionLoading((prev) => ({ ...prev, [skill.name]: false }));\n }\n };\n\n const handleDelete = async (name: string) => {\n setActionLoading((prev) => ({ ...prev, [name]: true }));\n try {\n await api.skills.delete(name);\n toast(\"success\", `Deleted \"${name}\"`);\n await fetchSkills();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Delete failed\");\n } finally {\n setActionLoading((prev) => ({ ...prev, [name]: false }));\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-[#00d4ff]/10\">\n <Sparkles className=\"h-5 w-5 text-[#00d4ff]\" />\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Skills</h1>\n <p className=\"text-sm text-muted-foreground\">\n Extend Mercury with installable capabilities\n </p>\n </div>\n </div>\n </motion.div>\n\n {/* Install Section */}\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: 0.1, duration: 0.3 }}\n >\n <Card>\n <CardContent className=\"p-5 space-y-5\">\n {/* Registry install */}\n <div>\n <div className=\"flex items-center justify-between gap-3 mb-3\">\n <div className=\"flex items-center gap-2\">\n <Store className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Install from registry\n </span>\n </div>\n <a\n href=\"https://skills.mercuryagent.sh\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-[#00d4ff] transition-colors\"\n >\n Browse skills.mercuryagent.sh\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </div>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n handleRegistryInstall();\n }}\n className=\"flex gap-3\"\n >\n <Input\n placeholder=\"category/skill-slug e.g. finance-legal/contract-review\"\n value={registryId}\n onChange={(e) => setRegistryId(e.target.value)}\n disabled={installingRegistry}\n className=\"flex-1 font-mono text-sm\"\n />\n <Button\n type=\"submit\"\n disabled={installingRegistry || !registryId.trim()}\n >\n {installingRegistry ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Installing\n </>\n ) : (\n \"Install\"\n )}\n </Button>\n </form>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n Review any skill on the registry before installing — they execute\n with your agent&apos;s privileges.\n </p>\n </div>\n\n <div className=\"h-px bg-border\" />\n\n {/* URL install */}\n <div>\n <div className=\"flex items-center gap-2 mb-3\">\n <Download className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Install from URL\n </span>\n </div>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n handleInstall();\n }}\n className=\"flex gap-3\"\n >\n <Input\n placeholder=\"https://github.com/user/skill-package\"\n value={installUrl}\n onChange={(e) => setInstallUrl(e.target.value)}\n disabled={installing}\n className=\"flex-1\"\n />\n <Button\n type=\"submit\"\n variant=\"outline\"\n disabled={installing || !installUrl.trim()}\n >\n {installing ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Installing\n </>\n ) : (\n \"Install\"\n )}\n </Button>\n </form>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n\n {/* Skills List */}\n {loading ? (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <SkillCardSkeleton key={i} />\n ))}\n </div>\n ) : skills.length === 0 ? (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.2 }}\n >\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"flex h-14 w-14 items-center justify-center rounded-full bg-muted mb-4\">\n <Package className=\"h-7 w-7 text-muted-foreground\" />\n </div>\n <h3 className=\"text-base font-medium text-foreground mb-1\">\n No skills installed\n </h3>\n <p className=\"text-sm text-muted-foreground max-w-sm\">\n Install skills from a URL above to extend Mercury&apos;s capabilities\n with new tools, workflows, and integrations.\n </p>\n </CardContent>\n </Card>\n </motion.div>\n ) : (\n <motion.div\n className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\"\n variants={stagger}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <AnimatePresence mode=\"popLayout\">\n {skills.map((skill, i) => (\n <motion.div\n key={skill.name}\n custom={i}\n variants={fadeUp}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n layout\n >\n <Card className=\"h-full\">\n <CardContent className=\"p-5 flex flex-col gap-3 h-full\">\n {/* Name + Status */}\n <div className=\"flex items-start justify-between gap-3\">\n <h3 className=\"text-sm font-semibold text-foreground leading-tight\">\n {skill.name}\n </h3>\n <Badge variant={skill.active ? \"success\" : \"secondary\"}>\n {skill.active ? \"Active\" : \"Inactive\"}\n </Badge>\n </div>\n\n {/* Description */}\n {skill.description && (\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {skill.description}\n </p>\n )}\n\n {/* Path */}\n <div className=\"flex items-center gap-1.5 mt-auto\">\n <FolderOpen className=\"h-3 w-3 text-muted-foreground/60 shrink-0\" />\n <span className=\"text-xs text-muted-foreground/60 truncate font-mono\">\n {skill.path}\n </span>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-2 pt-1 border-t border-border\">\n <Button\n size=\"sm\"\n variant={skill.active ? \"outline\" : \"default\"}\n disabled={!!actionLoading[skill.name]}\n onClick={() => handleToggle(skill)}\n className=\"flex-1\"\n >\n {actionLoading[skill.name] ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : skill.active ? (\n <>\n <PowerOff className=\"h-3.5 w-3.5\" />\n Deactivate\n </>\n ) : (\n <>\n <Power className=\"h-3.5 w-3.5\" />\n Activate\n </>\n )}\n </Button>\n\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!!actionLoading[skill.name]}\n className=\"text-muted-foreground hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Skill</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete &ldquo;{skill.name}&rdquo;?\n This will remove the skill and all its data permanently.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => handleDelete(skill.name)}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n ))}\n </AnimatePresence>\n </motion.div>\n )}\n\n <ToastBar toasts={toasts} />\n </div>\n );\n}\n"],"names":["__iconNode","ExternalLink","createLucideIcon","Package","Store","fadeUp","i","stagger","ToastBar","toasts","jsx","AnimatePresence","t","jsxs","motion","cn","CheckCircle2","XCircle","Skeleton","className","SkillCardSkeleton","Card","CardContent","SkillsPage","skills","setSkills","useState","loading","setLoading","installUrl","setInstallUrl","installing","setInstalling","registryId","setRegistryId","installingRegistry","setInstallingRegistry","actionLoading","setActionLoading","setToasts","toast","useCallback","type","message","id","prev","fetchSkills","res","api","err","useEffect","handleInstall","handleRegistryInstall","verb","handleToggle","skill","handleDelete","name","Sparkles","e","Input","Button","Fragment","Loader2","Download","_","Badge","FolderOpen","PowerOff","Power","AlertDialog","AlertDialogTrigger","Trash2","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1,7 +1,7 @@
1
- import{j as e}from"./vendor-motion-Dwx3-JO5.js";import{C as s,c as t}from"./card-DAYo4Zl5.js";import{e as a}from"./index-BhxU0YlT.js";import"./vendor-react-C7pctHW3.js";import"./vendor-syntax-xZUI6Op9.js";import"./vendor-radix-3UdfCgs_.js";/**
1
+ import{j as e}from"./vendor-motion-Dwx3-JO5.js";import{C as s,c as t}from"./card-BdsEOP7t.js";import{e as a}from"./index-C3YiF4qv.js";import"./vendor-react-C7pctHW3.js";import"./vendor-syntax-xZUI6Op9.js";import"./vendor-radix-3UdfCgs_.js";/**
2
2
  * @license lucide-react v0.511.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const r=[["path",{d:"M21 10.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.5",key:"1uzm8b"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]],o=a("square-check-big",r);function l(){return e.jsxs("div",{className:"space-y-4 p-6",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(o,{className:"h-6 w-6 text-muted-foreground"}),e.jsx("h1",{className:"text-2xl font-semibold text-foreground",children:"Tasks"})]}),e.jsx(s,{children:e.jsx(t,{className:"py-8 text-center text-muted-foreground",children:"Task management coming soon."})})]})}export{l as TasksPage};
7
- //# sourceMappingURL=Tasks-DbwRozzx.js.map
7
+ //# sourceMappingURL=Tasks-D36pqkro.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tasks-DbwRozzx.js","sources":["../../node_modules/lucide-react/dist/esm/icons/square-check-big.js","../../src/pages/Tasks.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21 10.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.5\", key: \"1uzm8b\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n];\nconst SquareCheckBig = createLucideIcon(\"square-check-big\", __iconNode);\n\nexport { __iconNode, SquareCheckBig as default };\n//# sourceMappingURL=square-check-big.js.map\n","import { CheckSquare } from \"lucide-react\";\nimport { Card, CardContent } from \"@/components/ui/card\";\n\nexport function TasksPage() {\n return (\n <div className=\"space-y-4 p-6\">\n <div className=\"flex items-center gap-2\">\n <CheckSquare className=\"h-6 w-6 text-muted-foreground\" />\n <h1 className=\"text-2xl font-semibold text-foreground\">Tasks</h1>\n </div>\n <Card>\n <CardContent className=\"py-8 text-center text-muted-foreground\">\n Task management coming soon.\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"names":["__iconNode","SquareCheckBig","createLucideIcon","TasksPage","jsxs","jsx","CheckSquare","Card","CardContent"],"mappings":"gPAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,iEAAkE,IAAK,QAAQ,CAAE,EAC/F,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,EACMC,EAAiBC,EAAiB,mBAAoBF,CAAU,ECV/D,SAASG,GAAY,CAC1B,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAY,UAAU,+BAAA,CAAgC,EACvDD,EAAAA,IAAC,KAAA,CAAG,UAAU,yCAAyC,SAAA,OAAA,CAAK,CAAA,EAC9D,QACCE,EAAA,CACC,SAAAF,MAACG,GAAY,UAAU,yCAAyC,wCAEhE,CAAA,CACF,CAAA,EACF,CAEJ","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"Tasks-D36pqkro.js","sources":["../../node_modules/lucide-react/dist/esm/icons/square-check-big.js","../../src/pages/Tasks.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21 10.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.5\", key: \"1uzm8b\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n];\nconst SquareCheckBig = createLucideIcon(\"square-check-big\", __iconNode);\n\nexport { __iconNode, SquareCheckBig as default };\n//# sourceMappingURL=square-check-big.js.map\n","import { CheckSquare } from \"lucide-react\";\nimport { Card, CardContent } from \"@/components/ui/card\";\n\nexport function TasksPage() {\n return (\n <div className=\"space-y-4 p-6\">\n <div className=\"flex items-center gap-2\">\n <CheckSquare className=\"h-6 w-6 text-muted-foreground\" />\n <h1 className=\"text-2xl font-semibold text-foreground\">Tasks</h1>\n </div>\n <Card>\n <CardContent className=\"py-8 text-center text-muted-foreground\">\n Task management coming soon.\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"names":["__iconNode","SquareCheckBig","createLucideIcon","TasksPage","jsxs","jsx","CheckSquare","Card","CardContent"],"mappings":"gPAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,iEAAkE,IAAK,QAAQ,CAAE,EAC/F,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,EACMC,EAAiBC,EAAiB,mBAAoBF,CAAU,ECV/D,SAASG,GAAY,CAC1B,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAY,UAAU,+BAAA,CAAgC,EACvDD,EAAAA,IAAC,KAAA,CAAG,UAAU,yCAAyC,SAAA,OAAA,CAAK,CAAA,EAC9D,QACCE,EAAA,CACC,SAAAF,MAACG,GAAY,UAAU,yCAAyC,wCAEhE,CAAA,CACF,CAAA,EACF,CAEJ","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import{j as e,m as r}from"./vendor-motion-Dwx3-JO5.js";import{r as f}from"./vendor-react-C7pctHW3.js";import{C as i,a as l,b as n,c as d}from"./card-DAYo4Zl5.js";import{P as O}from"./progress-DMwOdxli.js";import{B as p}from"./badge-DfDJNUtd.js";import{e as y,a as P,b as c,m as E,h as U,c as R,M as S}from"./index-BhxU0YlT.js";import{Z as _}from"./zap-C-0oH5gt.js";import{A as g}from"./activity-CIP1IzSg.js";import{T as B}from"./terminal-DI3J3W_z.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CUT6Fr2C.js";import"./vendor-syntax-xZUI6Op9.js";/**
1
+ import{j as e,m as r}from"./vendor-motion-Dwx3-JO5.js";import{r as f}from"./vendor-react-C7pctHW3.js";import{C as i,a as l,b as n,c as d}from"./card-BdsEOP7t.js";import{P as O}from"./progress-ZzhsBV2v.js";import{B as p}from"./badge-CUJiWF1y.js";import{e as y,a as P,b as c,m as E,h as U,c as R,M as S}from"./index-C3YiF4qv.js";import{Z as _}from"./zap-BEfqVtvZ.js";import{A as g}from"./activity-MOTqH8zM.js";import{T as B}from"./terminal-CWG62zdD.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CaqLZNof.js";import"./vendor-syntax-xZUI6Op9.js";/**
2
2
  * @license lucide-react v0.511.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -9,4 +9,4 @@ import{j as e,m as r}from"./vendor-motion-Dwx3-JO5.js";import{r as f}from"./vend
9
9
  * This source code is licensed under the ISC license.
10
10
  * See the LICENSE file in the root directory of this source tree.
11
11
  */const I=[["path",{d:"M16 17h6v-6",key:"t6n2it"}],["path",{d:"m22 17-8.5-8.5-5 5L2 7",key:"x473p"}]],$=y("trending-down",I),o={hidden:{opacity:0,y:12},visible:t=>({opacity:1,y:0,transition:{delay:t*.07,duration:.35,ease:"easeOut"}})};function m({className:t}){return e.jsx("div",{className:R("animate-pulse rounded-lg bg-muted",t)})}const z={openai:"#10b981",anthropic:"#f59e0b",google:"#3b82f6",groq:"#ef4444",ollama:"#8b5cf6",openrouter:"#ec4899"},A={web:w,telegram:S,cli:B};function H(t){return z[t.toLowerCase()]??"#6b7280"}function Z(t){return A[t.toLowerCase()]??g}function ae(){const[t,C]=f.useState(null),[N,k]=f.useState("");if(f.useEffect(()=>{P.usage.get().then(C).catch(s=>k(s.message))},[]),N)return e.jsx("div",{className:"flex h-full items-center justify-center p-8",children:e.jsx("p",{className:"text-sm text-destructive",children:N})});if(!t)return e.jsxs("div",{className:"space-y-6 p-6 lg:p-8",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(m,{className:"h-8 w-32"}),e.jsx(m,{className:"h-4 w-64"})]}),e.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:Array.from({length:3}).map((s,a)=>e.jsx(m,{className:"h-[130px]"},a))}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsx(m,{className:"h-[240px]"}),e.jsx(m,{className:"h-[240px]"})]}),e.jsx(m,{className:"h-[320px]"})]});const b=t.dailyBudget?Math.min(Math.round(t.dailyUsed/t.dailyBudget*100),100):0,h=Object.entries(t.byProvider),T=h.reduce((s,[,a])=>s+a,0)||1,j=Object.entries(t.byChannel),L=j.reduce((s,[,a])=>s+a,0)||1;return e.jsxs("div",{className:"space-y-6 p-6 lg:p-8",children:[e.jsxs(r.div,{initial:{opacity:0,y:-8},animate:{opacity:1,y:0},transition:{duration:.3},children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Usage"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Token consumption and budget tracking"})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[e.jsx(r.div,{custom:0,variants:o,initial:"hidden",animate:"visible",children:e.jsxs(i,{className:"mercury-glow-sm",children:[e.jsxs(l,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(n,{className:"text-sm font-medium text-muted-foreground",children:"Daily Used / Budget"}),e.jsx(_,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(d,{children:[e.jsxs("p",{className:"text-2xl font-bold tabular-nums",children:[c(t.dailyUsed),e.jsxs("span",{className:"ml-1 text-sm font-normal text-muted-foreground",children:["/ ",c(t.dailyBudget)]})]}),e.jsx(O,{value:b,className:"mt-3"}),e.jsxs("p",{className:"mt-1.5 text-xs text-muted-foreground tabular-nums",children:[b,"% consumed"]})]})]})}),e.jsx(r.div,{custom:1,variants:o,initial:"hidden",animate:"visible",children:e.jsxs(i,{children:[e.jsxs(l,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(n,{className:"text-sm font-medium text-muted-foreground",children:"Remaining"}),e.jsx($,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(d,{children:[e.jsx("p",{className:"text-2xl font-bold tabular-nums",children:c(t.remaining)}),e.jsx("p",{className:"mt-1.5 text-xs text-muted-foreground",children:"tokens left today"})]})]})}),e.jsx(r.div,{custom:2,variants:o,initial:"hidden",animate:"visible",children:e.jsxs(i,{children:[e.jsxs(l,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(n,{className:"text-sm font-medium text-muted-foreground",children:"Total Requests"}),e.jsx(g,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(d,{children:[e.jsx("p",{className:"text-2xl font-bold tabular-nums",children:t.requestLog.length.toLocaleString()}),e.jsx("p",{className:"mt-1.5 text-xs text-muted-foreground",children:"requests today"})]})]})})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsx(r.div,{custom:3,variants:o,initial:"hidden",animate:"visible",children:e.jsxs(i,{children:[e.jsx(l,{children:e.jsxs(n,{className:"flex items-center gap-2 text-base",children:[e.jsx(E,{className:"h-4 w-4"}),"Usage by Provider"]})}),e.jsx(d,{children:h.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"No provider usage recorded yet."}):e.jsx("div",{className:"flex flex-col gap-4",children:h.sort(([,s],[,a])=>a-s).map(([s,a])=>{const x=Math.round(a/T*100),u=H(s);return e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{variant:"secondary",className:"capitalize",children:s}),e.jsxs("span",{className:"text-sm font-medium tabular-nums text-muted-foreground",children:[c(a)," ",e.jsxs("span",{className:"text-xs",children:["(",x,"%)"]})]})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full bg-muted",children:e.jsx(r.div,{className:"h-full rounded-full",style:{backgroundColor:u},initial:{width:0},animate:{width:`${x}%`},transition:{duration:.6,ease:"easeOut",delay:.3}})})]},s)})})})]})}),e.jsx(r.div,{custom:4,variants:o,initial:"hidden",animate:"visible",children:e.jsxs(i,{children:[e.jsx(l,{children:e.jsxs(n,{className:"flex items-center gap-2 text-base",children:[e.jsx(w,{className:"h-4 w-4"}),"Usage by Channel"]})}),e.jsx(d,{children:j.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"No channel usage recorded yet."}):e.jsx("div",{className:"flex flex-col gap-4",children:j.sort(([,s],[,a])=>a-s).map(([s,a],x)=>{const u=Math.round(a/L*100),q=Z(s),v=["#00d4ff","#8b5cf6","#f59e0b","#10b981"],M=v[x%v.length];return e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(q,{className:"h-3.5 w-3.5 text-muted-foreground"}),e.jsx(p,{variant:"secondary",className:"capitalize",children:s})]}),e.jsxs("span",{className:"text-sm font-medium tabular-nums text-muted-foreground",children:[c(a)," ",e.jsxs("span",{className:"text-xs",children:["(",u,"%)"]})]})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full bg-muted",children:e.jsx(r.div,{className:"h-full rounded-full",style:{backgroundColor:M},initial:{width:0},animate:{width:`${u}%`},transition:{duration:.6,ease:"easeOut",delay:.35}})})]},s)})})})]})})]}),e.jsx(r.div,{custom:5,variants:o,initial:"hidden",animate:"visible",children:e.jsxs(i,{children:[e.jsx(l,{children:e.jsxs(n,{className:"flex items-center gap-2 text-base",children:[e.jsx(g,{className:"h-4 w-4"}),"Request Log"]})}),e.jsx(d,{children:t.requestLog.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"No requests recorded yet."}):e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-border text-left",children:[e.jsx("th",{className:"pb-3 pr-4 font-medium text-muted-foreground",children:"Time"}),e.jsx("th",{className:"pb-3 pr-4 font-medium text-muted-foreground",children:"Provider"}),e.jsx("th",{className:"pb-3 text-right font-medium text-muted-foreground",children:"Tokens"})]})}),e.jsx("tbody",{children:t.requestLog.slice().reverse().slice(0,50).map((s,a)=>e.jsxs(r.tr,{className:"border-b border-border/50 last:border-0",initial:{opacity:0},animate:{opacity:1},transition:{delay:.4+a*.02,duration:.2},children:[e.jsx("td",{className:"py-2.5 pr-4 tabular-nums text-muted-foreground",children:U(s.timestamp)}),e.jsx("td",{className:"py-2.5 pr-4",children:e.jsx(p,{variant:"outline",className:"capitalize",children:s.provider})}),e.jsx("td",{className:"py-2.5 text-right font-medium tabular-nums",children:c(s.totalTokens)})]},`${s.timestamp}-${a}`))})]})})})]})})]})}export{ae as UsagePage};
12
- //# sourceMappingURL=Usage-i_q6Ri4s.js.map
12
+ //# sourceMappingURL=Usage-CmjaYrsT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Usage-i_q6Ri4s.js","sources":["../../node_modules/lucide-react/dist/esm/icons/globe.js","../../node_modules/lucide-react/dist/esm/icons/trending-down.js","../../src/pages/Usage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n];\nconst Globe = createLucideIcon(\"globe\", __iconNode);\n\nexport { __iconNode, Globe as default };\n//# sourceMappingURL=globe.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 17h6v-6\", key: \"t6n2it\" }],\n [\"path\", { d: \"m22 17-8.5-8.5-5 5L2 7\", key: \"x473p\" }]\n];\nconst TrendingDown = createLucideIcon(\"trending-down\", __iconNode);\n\nexport { __iconNode, TrendingDown as default };\n//# sourceMappingURL=trending-down.js.map\n","import { useEffect, useState } from \"react\";\nimport { motion } from \"framer-motion\";\nimport {\n BarChart3,\n Zap,\n TrendingDown,\n Activity,\n Globe,\n Terminal,\n MessageSquare,\n} from \"lucide-react\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn, formatDate, formatTokens } from \"@/lib/utils\";\nimport api, { type UsageData } from \"@/lib/api\";\n\nconst fadeUp = {\n hidden: { opacity: 0, y: 12 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: { delay: i * 0.07, duration: 0.35, ease: \"easeOut\" as const },\n }),\n};\n\nfunction Skeleton({ className }: { className?: string }) {\n return (\n <div\n className={cn(\"animate-pulse rounded-lg bg-muted\", className)}\n />\n );\n}\n\nconst PROVIDER_COLORS: Record<string, string> = {\n openai: \"#10b981\",\n anthropic: \"#f59e0b\",\n google: \"#3b82f6\",\n groq: \"#ef4444\",\n ollama: \"#8b5cf6\",\n openrouter: \"#ec4899\",\n};\n\nconst CHANNEL_ICONS: Record<string, React.ElementType> = {\n web: Globe,\n telegram: MessageSquare,\n cli: Terminal,\n};\n\nfunction getProviderColor(provider: string): string {\n return PROVIDER_COLORS[provider.toLowerCase()] ?? \"#6b7280\";\n}\n\nfunction getChannelIcon(channel: string): React.ElementType {\n return CHANNEL_ICONS[channel.toLowerCase()] ?? Activity;\n}\n\nexport function UsagePage() {\n const [data, setData] = useState<UsageData | null>(null);\n const [error, setError] = useState(\"\");\n\n useEffect(() => {\n api.usage\n .get()\n .then(setData)\n .catch((err: Error) => setError(err.message));\n }, []);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-8\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n );\n }\n\n if (!data) {\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n <div className=\"space-y-1\">\n <Skeleton className=\"h-8 w-32\" />\n <Skeleton className=\"h-4 w-64\" />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-[130px]\" />\n ))}\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Skeleton className=\"h-[240px]\" />\n <Skeleton className=\"h-[240px]\" />\n </div>\n <Skeleton className=\"h-[320px]\" />\n </div>\n );\n }\n\n const budgetPct = data.dailyBudget\n ? Math.min(Math.round((data.dailyUsed / data.dailyBudget) * 100), 100)\n : 0;\n\n const providerEntries = Object.entries(data.byProvider);\n const providerTotal = providerEntries.reduce((s, [, v]) => s + v, 0) || 1;\n\n const channelEntries = Object.entries(data.byChannel);\n const channelTotal = channelEntries.reduce((s, [, v]) => s + v, 0) || 1;\n\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n {/* Header */}\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n >\n <h1 className=\"text-2xl font-bold tracking-tight\">Usage</h1>\n <p className=\"text-sm text-muted-foreground\">\n Token consumption and budget tracking\n </p>\n </motion.div>\n\n {/* Hero Stat Cards */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {/* Daily Used / Budget */}\n <motion.div custom={0} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card className=\"mercury-glow-sm\">\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n Daily Used / Budget\n </CardTitle>\n <Zap className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatTokens(data.dailyUsed)}\n <span className=\"ml-1 text-sm font-normal text-muted-foreground\">\n / {formatTokens(data.dailyBudget)}\n </span>\n </p>\n <Progress value={budgetPct} className=\"mt-3\" />\n <p className=\"mt-1.5 text-xs text-muted-foreground tabular-nums\">\n {budgetPct}% consumed\n </p>\n </CardContent>\n </Card>\n </motion.div>\n\n {/* Remaining */}\n <motion.div custom={1} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n Remaining\n </CardTitle>\n <TrendingDown className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatTokens(data.remaining)}\n </p>\n <p className=\"mt-1.5 text-xs text-muted-foreground\">\n tokens left today\n </p>\n </CardContent>\n </Card>\n </motion.div>\n\n {/* Total Requests */}\n <motion.div custom={2} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n Total Requests\n </CardTitle>\n <Activity className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-2xl font-bold tabular-nums\">\n {data.requestLog.length.toLocaleString()}\n </p>\n <p className=\"mt-1.5 text-xs text-muted-foreground\">\n requests today\n </p>\n </CardContent>\n </Card>\n </motion.div>\n </div>\n\n {/* Breakdown Section */}\n <div className=\"grid gap-4 md:grid-cols-2\">\n {/* By Provider */}\n <motion.div custom={3} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <BarChart3 className=\"h-4 w-4\" />\n Usage by Provider\n </CardTitle>\n </CardHeader>\n <CardContent>\n {providerEntries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No provider usage recorded yet.\n </p>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {providerEntries\n .sort(([, a], [, b]) => b - a)\n .map(([provider, tokens]) => {\n const pct = Math.round((tokens / providerTotal) * 100);\n const color = getProviderColor(provider);\n return (\n <div key={provider} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"secondary\" className=\"capitalize\">\n {provider}\n </Badge>\n <span className=\"text-sm font-medium tabular-nums text-muted-foreground\">\n {formatTokens(tokens)}{\" \"}\n <span className=\"text-xs\">({pct}%)</span>\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <motion.div\n className=\"h-full rounded-full\"\n style={{ backgroundColor: color }}\n initial={{ width: 0 }}\n animate={{ width: `${pct}%` }}\n transition={{ duration: 0.6, ease: \"easeOut\", delay: 0.3 }}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n\n {/* By Channel */}\n <motion.div custom={4} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Globe className=\"h-4 w-4\" />\n Usage by Channel\n </CardTitle>\n </CardHeader>\n <CardContent>\n {channelEntries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No channel usage recorded yet.\n </p>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {channelEntries\n .sort(([, a], [, b]) => b - a)\n .map(([channel, tokens], idx) => {\n const pct = Math.round((tokens / channelTotal) * 100);\n const ChannelIcon = getChannelIcon(channel);\n const colors = [\"#00d4ff\", \"#8b5cf6\", \"#f59e0b\", \"#10b981\"];\n const color = colors[idx % colors.length];\n return (\n <div key={channel} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5\">\n <ChannelIcon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <Badge variant=\"secondary\" className=\"capitalize\">\n {channel}\n </Badge>\n </div>\n <span className=\"text-sm font-medium tabular-nums text-muted-foreground\">\n {formatTokens(tokens)}{\" \"}\n <span className=\"text-xs\">({pct}%)</span>\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <motion.div\n className=\"h-full rounded-full\"\n style={{ backgroundColor: color }}\n initial={{ width: 0 }}\n animate={{ width: `${pct}%` }}\n transition={{ duration: 0.6, ease: \"easeOut\", delay: 0.35 }}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n </div>\n\n {/* Request Log */}\n <motion.div custom={5} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Activity className=\"h-4 w-4\" />\n Request Log\n </CardTitle>\n </CardHeader>\n <CardContent>\n {data.requestLog.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No requests recorded yet.\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border text-left\">\n <th className=\"pb-3 pr-4 font-medium text-muted-foreground\">\n Time\n </th>\n <th className=\"pb-3 pr-4 font-medium text-muted-foreground\">\n Provider\n </th>\n <th className=\"pb-3 text-right font-medium text-muted-foreground\">\n Tokens\n </th>\n </tr>\n </thead>\n <tbody>\n {data.requestLog\n .slice()\n .reverse()\n .slice(0, 50)\n .map((entry, idx) => (\n <motion.tr\n key={`${entry.timestamp}-${idx}`}\n className=\"border-b border-border/50 last:border-0\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.4 + idx * 0.02, duration: 0.2 }}\n >\n <td className=\"py-2.5 pr-4 tabular-nums text-muted-foreground\">\n {formatDate(entry.timestamp)}\n </td>\n <td className=\"py-2.5 pr-4\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {entry.provider}\n </Badge>\n </td>\n <td className=\"py-2.5 text-right font-medium tabular-nums\">\n {formatTokens(entry.totalTokens)}\n </td>\n </motion.tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n </div>\n );\n}\n"],"names":["__iconNode","Globe","createLucideIcon","TrendingDown","fadeUp","i","Skeleton","className","jsx","cn","PROVIDER_COLORS","CHANNEL_ICONS","MessageSquare","Terminal","getProviderColor","provider","getChannelIcon","channel","Activity","UsagePage","data","setData","useState","error","setError","useEffect","api","err","jsxs","_","budgetPct","providerEntries","providerTotal","v","channelEntries","channelTotal","motion","Card","CardHeader","CardTitle","Zap","CardContent","formatTokens","Progress","BarChart3","a","b","tokens","pct","color","Badge","idx","ChannelIcon","colors","entry","formatDate"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"Usage-CmjaYrsT.js","sources":["../../node_modules/lucide-react/dist/esm/icons/globe.js","../../node_modules/lucide-react/dist/esm/icons/trending-down.js","../../src/pages/Usage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n];\nconst Globe = createLucideIcon(\"globe\", __iconNode);\n\nexport { __iconNode, Globe as default };\n//# sourceMappingURL=globe.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 17h6v-6\", key: \"t6n2it\" }],\n [\"path\", { d: \"m22 17-8.5-8.5-5 5L2 7\", key: \"x473p\" }]\n];\nconst TrendingDown = createLucideIcon(\"trending-down\", __iconNode);\n\nexport { __iconNode, TrendingDown as default };\n//# sourceMappingURL=trending-down.js.map\n","import { useEffect, useState } from \"react\";\nimport { motion } from \"framer-motion\";\nimport {\n BarChart3,\n Zap,\n TrendingDown,\n Activity,\n Globe,\n Terminal,\n MessageSquare,\n} from \"lucide-react\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn, formatDate, formatTokens } from \"@/lib/utils\";\nimport api, { type UsageData } from \"@/lib/api\";\n\nconst fadeUp = {\n hidden: { opacity: 0, y: 12 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: { delay: i * 0.07, duration: 0.35, ease: \"easeOut\" as const },\n }),\n};\n\nfunction Skeleton({ className }: { className?: string }) {\n return (\n <div\n className={cn(\"animate-pulse rounded-lg bg-muted\", className)}\n />\n );\n}\n\nconst PROVIDER_COLORS: Record<string, string> = {\n openai: \"#10b981\",\n anthropic: \"#f59e0b\",\n google: \"#3b82f6\",\n groq: \"#ef4444\",\n ollama: \"#8b5cf6\",\n openrouter: \"#ec4899\",\n};\n\nconst CHANNEL_ICONS: Record<string, React.ElementType> = {\n web: Globe,\n telegram: MessageSquare,\n cli: Terminal,\n};\n\nfunction getProviderColor(provider: string): string {\n return PROVIDER_COLORS[provider.toLowerCase()] ?? \"#6b7280\";\n}\n\nfunction getChannelIcon(channel: string): React.ElementType {\n return CHANNEL_ICONS[channel.toLowerCase()] ?? Activity;\n}\n\nexport function UsagePage() {\n const [data, setData] = useState<UsageData | null>(null);\n const [error, setError] = useState(\"\");\n\n useEffect(() => {\n api.usage\n .get()\n .then(setData)\n .catch((err: Error) => setError(err.message));\n }, []);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-8\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n );\n }\n\n if (!data) {\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n <div className=\"space-y-1\">\n <Skeleton className=\"h-8 w-32\" />\n <Skeleton className=\"h-4 w-64\" />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-[130px]\" />\n ))}\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Skeleton className=\"h-[240px]\" />\n <Skeleton className=\"h-[240px]\" />\n </div>\n <Skeleton className=\"h-[320px]\" />\n </div>\n );\n }\n\n const budgetPct = data.dailyBudget\n ? Math.min(Math.round((data.dailyUsed / data.dailyBudget) * 100), 100)\n : 0;\n\n const providerEntries = Object.entries(data.byProvider);\n const providerTotal = providerEntries.reduce((s, [, v]) => s + v, 0) || 1;\n\n const channelEntries = Object.entries(data.byChannel);\n const channelTotal = channelEntries.reduce((s, [, v]) => s + v, 0) || 1;\n\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n {/* Header */}\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n >\n <h1 className=\"text-2xl font-bold tracking-tight\">Usage</h1>\n <p className=\"text-sm text-muted-foreground\">\n Token consumption and budget tracking\n </p>\n </motion.div>\n\n {/* Hero Stat Cards */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {/* Daily Used / Budget */}\n <motion.div custom={0} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card className=\"mercury-glow-sm\">\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n Daily Used / Budget\n </CardTitle>\n <Zap className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatTokens(data.dailyUsed)}\n <span className=\"ml-1 text-sm font-normal text-muted-foreground\">\n / {formatTokens(data.dailyBudget)}\n </span>\n </p>\n <Progress value={budgetPct} className=\"mt-3\" />\n <p className=\"mt-1.5 text-xs text-muted-foreground tabular-nums\">\n {budgetPct}% consumed\n </p>\n </CardContent>\n </Card>\n </motion.div>\n\n {/* Remaining */}\n <motion.div custom={1} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n Remaining\n </CardTitle>\n <TrendingDown className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatTokens(data.remaining)}\n </p>\n <p className=\"mt-1.5 text-xs text-muted-foreground\">\n tokens left today\n </p>\n </CardContent>\n </Card>\n </motion.div>\n\n {/* Total Requests */}\n <motion.div custom={2} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n Total Requests\n </CardTitle>\n <Activity className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-2xl font-bold tabular-nums\">\n {data.requestLog.length.toLocaleString()}\n </p>\n <p className=\"mt-1.5 text-xs text-muted-foreground\">\n requests today\n </p>\n </CardContent>\n </Card>\n </motion.div>\n </div>\n\n {/* Breakdown Section */}\n <div className=\"grid gap-4 md:grid-cols-2\">\n {/* By Provider */}\n <motion.div custom={3} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <BarChart3 className=\"h-4 w-4\" />\n Usage by Provider\n </CardTitle>\n </CardHeader>\n <CardContent>\n {providerEntries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No provider usage recorded yet.\n </p>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {providerEntries\n .sort(([, a], [, b]) => b - a)\n .map(([provider, tokens]) => {\n const pct = Math.round((tokens / providerTotal) * 100);\n const color = getProviderColor(provider);\n return (\n <div key={provider} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"secondary\" className=\"capitalize\">\n {provider}\n </Badge>\n <span className=\"text-sm font-medium tabular-nums text-muted-foreground\">\n {formatTokens(tokens)}{\" \"}\n <span className=\"text-xs\">({pct}%)</span>\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <motion.div\n className=\"h-full rounded-full\"\n style={{ backgroundColor: color }}\n initial={{ width: 0 }}\n animate={{ width: `${pct}%` }}\n transition={{ duration: 0.6, ease: \"easeOut\", delay: 0.3 }}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n\n {/* By Channel */}\n <motion.div custom={4} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Globe className=\"h-4 w-4\" />\n Usage by Channel\n </CardTitle>\n </CardHeader>\n <CardContent>\n {channelEntries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No channel usage recorded yet.\n </p>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {channelEntries\n .sort(([, a], [, b]) => b - a)\n .map(([channel, tokens], idx) => {\n const pct = Math.round((tokens / channelTotal) * 100);\n const ChannelIcon = getChannelIcon(channel);\n const colors = [\"#00d4ff\", \"#8b5cf6\", \"#f59e0b\", \"#10b981\"];\n const color = colors[idx % colors.length];\n return (\n <div key={channel} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5\">\n <ChannelIcon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <Badge variant=\"secondary\" className=\"capitalize\">\n {channel}\n </Badge>\n </div>\n <span className=\"text-sm font-medium tabular-nums text-muted-foreground\">\n {formatTokens(tokens)}{\" \"}\n <span className=\"text-xs\">({pct}%)</span>\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <motion.div\n className=\"h-full rounded-full\"\n style={{ backgroundColor: color }}\n initial={{ width: 0 }}\n animate={{ width: `${pct}%` }}\n transition={{ duration: 0.6, ease: \"easeOut\", delay: 0.35 }}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n </div>\n\n {/* Request Log */}\n <motion.div custom={5} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Activity className=\"h-4 w-4\" />\n Request Log\n </CardTitle>\n </CardHeader>\n <CardContent>\n {data.requestLog.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No requests recorded yet.\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border text-left\">\n <th className=\"pb-3 pr-4 font-medium text-muted-foreground\">\n Time\n </th>\n <th className=\"pb-3 pr-4 font-medium text-muted-foreground\">\n Provider\n </th>\n <th className=\"pb-3 text-right font-medium text-muted-foreground\">\n Tokens\n </th>\n </tr>\n </thead>\n <tbody>\n {data.requestLog\n .slice()\n .reverse()\n .slice(0, 50)\n .map((entry, idx) => (\n <motion.tr\n key={`${entry.timestamp}-${idx}`}\n className=\"border-b border-border/50 last:border-0\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.4 + idx * 0.02, duration: 0.2 }}\n >\n <td className=\"py-2.5 pr-4 tabular-nums text-muted-foreground\">\n {formatDate(entry.timestamp)}\n </td>\n <td className=\"py-2.5 pr-4\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {entry.provider}\n </Badge>\n </td>\n <td className=\"py-2.5 text-right font-medium tabular-nums\">\n {formatTokens(entry.totalTokens)}\n </td>\n </motion.tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n </div>\n );\n}\n"],"names":["__iconNode","Globe","createLucideIcon","TrendingDown","fadeUp","i","Skeleton","className","jsx","cn","PROVIDER_COLORS","CHANNEL_ICONS","MessageSquare","Terminal","getProviderColor","provider","getChannelIcon","channel","Activity","UsagePage","data","setData","useState","error","setError","useEffect","api","err","jsxs","_","budgetPct","providerEntries","providerTotal","v","channelEntries","channelTotal","motion","Card","CardHeader","CardTitle","Zap","CardContent","formatTokens","Progress","BarChart3","a","b","tokens","pct","color","Badge","idx","ChannelIcon","colors","entry","formatDate"],"mappings":"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","x_google_ignoreList":[0,1]}