cognova 0.2.13 → 0.2.15

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 (386) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/-mGU8_Hv.js +1 -0
  3. package/.output/public/_nuxt/0GqCtQ9S.js +1 -0
  4. package/.output/public/_nuxt/{DFpmIy6J.js → 1wCoXZ14.js} +1 -1
  5. package/.output/public/_nuxt/2J1KxdHv.js +1 -0
  6. package/.output/public/_nuxt/6VDUZECX.js +1 -0
  7. package/.output/public/_nuxt/{C7m9zGMG.js → 8WMJQbWG.js} +1 -1
  8. package/.output/public/_nuxt/9Rw88G6h.js +1 -0
  9. package/.output/public/_nuxt/{BjsKx597.js → B-yW4SD3.js} +1 -1
  10. package/.output/public/_nuxt/B20jNAhm.js +1 -0
  11. package/.output/public/_nuxt/B3OpTH_e.js +1 -0
  12. package/.output/public/_nuxt/B9Y3_B5G.js +1 -0
  13. package/.output/public/_nuxt/B9_vmatf.js +1 -0
  14. package/.output/public/_nuxt/B9o6sFST.js +1 -0
  15. package/.output/public/_nuxt/{CseYuM6E.js → BAY3_Hrq.js} +1 -1
  16. package/.output/public/_nuxt/{B_9zJTqe.js → BD5rPkc2.js} +3 -3
  17. package/.output/public/_nuxt/BGYoW3kO.js +1 -0
  18. package/.output/public/_nuxt/BHUy5EAj.js +1 -0
  19. package/.output/public/_nuxt/BLdMRpJD.js +1 -0
  20. package/.output/public/_nuxt/{D6tVZcRs.js → BOCn_SGf.js} +12 -12
  21. package/.output/public/_nuxt/BQi8LIrn.js +1 -0
  22. package/.output/public/_nuxt/BS1t375R.js +1 -0
  23. package/.output/public/_nuxt/BTGeP1bA.js +1 -0
  24. package/.output/public/_nuxt/{pdYvpiud.js → BVYYP4eQ.js} +5 -5
  25. package/.output/public/_nuxt/BWQ7zE01.js +1 -0
  26. package/.output/public/_nuxt/BWqJInD3.js +1 -0
  27. package/.output/public/_nuxt/BXdQ9ASJ.js +1 -0
  28. package/.output/public/_nuxt/{DQhm-UPG.js → BXxZokD_.js} +2 -2
  29. package/.output/public/_nuxt/BZ7DAtPi.js +1 -0
  30. package/.output/public/_nuxt/BZm9w7en.js +1 -0
  31. package/.output/public/_nuxt/B_hNqC64.js +1 -0
  32. package/.output/public/_nuxt/Be47YE2L.js +1 -0
  33. package/.output/public/_nuxt/BgIS9_ti.js +39 -0
  34. package/.output/public/_nuxt/BgavRUl_.js +1 -0
  35. package/.output/public/_nuxt/Bh0yGTzr.js +1 -0
  36. package/.output/public/_nuxt/BhhMUror.js +1 -0
  37. package/.output/public/_nuxt/Bj5e7QPz.js +1 -0
  38. package/.output/public/_nuxt/{9kAKMaPC.js → Bnn59-FS.js} +1 -1
  39. package/.output/public/_nuxt/BoCU3mWu.js +1 -0
  40. package/.output/public/_nuxt/Br6epbzY.js +1 -0
  41. package/.output/public/_nuxt/Br81Sr2R.js +1 -0
  42. package/.output/public/_nuxt/BrkEOLHu.js +9 -0
  43. package/.output/public/_nuxt/BtrNCc2S.js +1 -0
  44. package/.output/public/_nuxt/BxsQlbgl.js +1 -0
  45. package/.output/public/_nuxt/BzrhNhdT.js +1 -0
  46. package/.output/public/_nuxt/{B-DMcEU9.js → C-78dDNd.js} +1 -1
  47. package/.output/public/_nuxt/C1oaoi1p.js +1 -0
  48. package/.output/public/_nuxt/C2-_hcwB.js +1 -0
  49. package/.output/public/_nuxt/{TxMdabnL.js → C2Gh3qqr.js} +1 -1
  50. package/.output/public/_nuxt/C2OHaW6l.js +1 -0
  51. package/.output/public/_nuxt/C3szZmvA.js +1 -0
  52. package/.output/public/_nuxt/C3xzleKP.js +1 -0
  53. package/.output/public/_nuxt/C4sG6rdW.js +1 -0
  54. package/.output/public/_nuxt/C5Cu9Fx6.js +1 -0
  55. package/.output/public/_nuxt/{LRO7YHoH.js → C5gfF7J1.js} +1 -1
  56. package/.output/public/_nuxt/C6Eoiclo.js +1 -0
  57. package/.output/public/_nuxt/C7hFztZL.js +1 -0
  58. package/.output/public/_nuxt/CAVUAxNU.js +2 -0
  59. package/.output/public/_nuxt/{CiNxIhaq.js → CCeM5lW2.js} +1 -1
  60. package/.output/public/_nuxt/CDcQ31Eh.js +1 -0
  61. package/.output/public/_nuxt/CHbHVtCy.js +1 -0
  62. package/.output/public/_nuxt/CHnVFnBW.js +1 -0
  63. package/.output/public/_nuxt/CLNcmNQS.js +1 -0
  64. package/.output/public/_nuxt/{D7N3EZ-I.js → CPwCTHun.js} +1 -1
  65. package/.output/public/_nuxt/{CFmvNggn.js → CS8SdmH2.js} +1 -1
  66. package/.output/public/_nuxt/CTGm_mc8.js +1 -0
  67. package/.output/public/_nuxt/{DNcOC5zj.js → CTQFGHjS.js} +1 -1
  68. package/.output/public/_nuxt/{B0nzD8Sk.js → CVVtVzXC.js} +1 -1
  69. package/.output/public/_nuxt/CZNOaqeX.js +1 -0
  70. package/.output/public/_nuxt/C_A_NkeC.js +2 -0
  71. package/.output/public/_nuxt/{CGplHfmR.js → C_doutX-.js} +1 -1
  72. package/.output/public/_nuxt/{BrX-PnSK.js → CbDLhrNA.js} +2 -2
  73. package/.output/public/_nuxt/CePKCqSb.js +1 -0
  74. package/.output/public/_nuxt/Cet4T_yO.js +1 -0
  75. package/.output/public/_nuxt/{C6OSRpRd.js → CjJPkhbc.js} +1 -1
  76. package/.output/public/_nuxt/CkZT4LGq.js +1 -0
  77. package/.output/public/_nuxt/CkrW8sGL.js +1 -0
  78. package/.output/public/_nuxt/Co0UxVsx.js +1 -0
  79. package/.output/public/_nuxt/CqS0zXYQ.js +1 -0
  80. package/.output/public/_nuxt/CskGv_Km.js +1 -0
  81. package/.output/public/_nuxt/{DuzpliIL.js → CuvkTsqs.js} +1 -1
  82. package/.output/public/_nuxt/{B2wI_pYg.js → CxMuZEwX.js} +1 -1
  83. package/.output/public/_nuxt/{9O1MXkck.js → CxSijT71.js} +8 -8
  84. package/.output/public/_nuxt/Cywo6tZI.js +1 -0
  85. package/.output/public/_nuxt/D1reIfpX.js +1 -0
  86. package/.output/public/_nuxt/D1uV2uir.js +1 -0
  87. package/.output/public/_nuxt/{BWuL2CzO.js → D2edadpd.js} +1 -1
  88. package/.output/public/_nuxt/D3cEeQh7.js +1 -0
  89. package/.output/public/_nuxt/D41A2mE2.js +1 -0
  90. package/.output/public/_nuxt/D49P2RhG.js +1 -0
  91. package/.output/public/_nuxt/D867g6Ds.js +1 -0
  92. package/.output/public/_nuxt/DEFWIjWl.js +1 -0
  93. package/.output/public/_nuxt/DFTEBTzZ.js +1 -0
  94. package/.output/public/_nuxt/{-HePz7lp.js → DHRexj9X.js} +2 -2
  95. package/.output/public/_nuxt/DL4EpgqQ.js +1 -0
  96. package/.output/public/_nuxt/DLHnP6tw.js +1 -0
  97. package/.output/public/_nuxt/DM20WaLq.js +1 -0
  98. package/.output/public/_nuxt/{B8DFEjxA.js → DNAMjHbb.js} +1 -1
  99. package/.output/public/_nuxt/{CLkkdThv.js → DP8t9VWs.js} +24 -24
  100. package/.output/public/_nuxt/DTR31rjp.js +1 -0
  101. package/.output/public/_nuxt/{Bc8bTnkd.js → DTlSLSo1.js} +3 -3
  102. package/.output/public/_nuxt/{DowkFZ2V.js → DVdnhfXT.js} +1 -1
  103. package/.output/public/_nuxt/{DvHS7_h2.js → DZikIgHK.js} +1 -1
  104. package/.output/public/_nuxt/D_YGqvw_.js +1 -0
  105. package/.output/public/_nuxt/D_k1YwXm.js +1 -0
  106. package/.output/public/_nuxt/Daf2MbWG.js +7 -0
  107. package/.output/public/_nuxt/DcJ0GstJ.js +1 -0
  108. package/.output/public/_nuxt/DcYKh6QA.js +1 -0
  109. package/.output/public/_nuxt/DhN3_DYH.js +1 -0
  110. package/.output/public/_nuxt/DhSvBSt3.js +1 -0
  111. package/.output/public/_nuxt/DhlIWT8K.js +1 -0
  112. package/.output/public/_nuxt/DjsqyRqt.js +1 -0
  113. package/.output/public/_nuxt/DpSM97eH.js +1 -0
  114. package/.output/public/_nuxt/DqR9SdeU.js +1 -0
  115. package/.output/public/_nuxt/DqmQtg6Y.js +1 -0
  116. package/.output/public/_nuxt/Dsuag_iW.js +1 -0
  117. package/.output/public/_nuxt/Dtr_0IbE.js +1 -0
  118. package/.output/public/_nuxt/DwrmFEZN.js +1 -0
  119. package/.output/public/_nuxt/DxE8r3r4.js +1 -0
  120. package/.output/public/_nuxt/G_CsVlOR.js +1 -0
  121. package/.output/public/_nuxt/Gyw_2f6x.js +1 -0
  122. package/.output/public/_nuxt/HStC1ZyE.js +1 -0
  123. package/.output/public/_nuxt/Hh9mv0Ek.js +1 -0
  124. package/.output/public/_nuxt/LR0kCjbe.js +1 -0
  125. package/.output/public/_nuxt/MYeLvJGV.js +1 -0
  126. package/.output/public/_nuxt/NKs0EGrh.js +1 -0
  127. package/.output/public/_nuxt/PY5EGujn.js +1 -0
  128. package/.output/public/_nuxt/PamJNol9.js +1 -0
  129. package/.output/public/_nuxt/RlvwEbHv.js +1 -0
  130. package/.output/public/_nuxt/{BghuwIGa.js → TNpdJOlc.js} +1 -1
  131. package/.output/public/_nuxt/TSYrPbLR.js +1 -0
  132. package/.output/public/_nuxt/U-eBrbR4.js +1 -0
  133. package/.output/public/_nuxt/UuqXScSw.js +1 -0
  134. package/.output/public/_nuxt/V04-MrLN.js +1 -0
  135. package/.output/public/_nuxt/X0o5GcBb.js +1 -0
  136. package/.output/public/_nuxt/XQNzmQy9.js +1 -0
  137. package/.output/public/_nuxt/Y59XKprr.js +1 -0
  138. package/.output/public/_nuxt/YZQjZgsH.js +1 -0
  139. package/.output/public/_nuxt/_-TGPiLQ.js +1 -0
  140. package/.output/public/_nuxt/builds/latest.json +1 -1
  141. package/.output/public/_nuxt/builds/meta/7c42ae85-1cae-45f0-8cb9-ad3a10165c2c.json +1 -0
  142. package/.output/public/_nuxt/dashboard.ByJQ-Wzh.css +1 -0
  143. package/.output/public/_nuxt/entry.ZJxWCrU6.css +1 -0
  144. package/.output/public/_nuxt/{D12qPplu.js → hCeWb_38.js} +1 -1
  145. package/.output/public/_nuxt/{sBzyvWMJ.js → hrPTRWjM.js} +1 -1
  146. package/.output/public/_nuxt/jC4pIK1p.js +1 -0
  147. package/.output/public/_nuxt/jTT1R-Vz.js +1 -0
  148. package/.output/public/_nuxt/{CRRw0Thu.js → kkAMoB43.js} +1 -1
  149. package/.output/public/_nuxt/{h_bXa-f2.js → mzM4BGtv.js} +1 -1
  150. package/.output/public/_nuxt/o-s8JBm2.js +1 -0
  151. package/.output/public/_nuxt/pwJTkIQ4.js +1 -0
  152. package/.output/public/_nuxt/{BL1mkqgd.js → rIgg2Arf.js} +3 -3
  153. package/.output/public/_nuxt/subdxgSQ.js +1 -0
  154. package/.output/public/_nuxt/t8B72leH.js +1 -0
  155. package/.output/public/_nuxt/vCFAHwdt.js +1 -0
  156. package/.output/public/_nuxt/z-MP0bB7.js +1 -0
  157. package/.output/server/chunks/build/CodeIcon-CWD5HcV7.mjs +1 -1
  158. package/.output/server/chunks/build/DropdownMenu-BBrV9nXz.mjs +1 -1
  159. package/.output/server/chunks/build/{EditorToolbar-DIfb5arC.mjs → EditorToolbar-B9OwSI5e.mjs} +3 -3
  160. package/.output/server/chunks/build/{EditorToolbar-DIfb5arC.mjs.map → EditorToolbar-B9OwSI5e.mjs.map} +1 -1
  161. package/.output/server/chunks/build/Img-CWLmvN1t.mjs +1 -1
  162. package/.output/server/chunks/build/MDC-Dx0YPDhe.mjs +1 -1
  163. package/.output/server/chunks/build/Select-BB1oLrCD.mjs +1 -1
  164. package/.output/server/chunks/build/SelectMenu-DPssg6zD.mjs +1 -1
  165. package/.output/server/chunks/build/Table-DCwTlhCj.mjs +1 -1
  166. package/.output/server/chunks/build/Tooltip-TRyl6dje.mjs +1 -1
  167. package/.output/server/chunks/build/Tree-DUhXKd8y.mjs +1 -1
  168. package/.output/server/chunks/build/{_id_-DN00UDdO.mjs → _id_-CwBeklIM.mjs} +296 -430
  169. package/.output/server/chunks/build/_id_-CwBeklIM.mjs.map +1 -0
  170. package/.output/server/chunks/build/{_name_-BnS_KEfX.mjs → _name_-D7MtW4Vu.mjs} +2 -2
  171. package/.output/server/chunks/build/{_name_-BnS_KEfX.mjs.map → _name_-D7MtW4Vu.mjs.map} +1 -1
  172. package/.output/server/chunks/build/{_uuid_-DfJaumTE.mjs → _uuid_-lvG92ein.mjs} +4 -4
  173. package/.output/server/chunks/build/{_uuid_-DfJaumTE.mjs.map → _uuid_-lvG92ein.mjs.map} +1 -1
  174. package/.output/server/chunks/build/account-LDZ4TL6x.mjs +513 -0
  175. package/.output/server/chunks/build/account-LDZ4TL6x.mjs.map +1 -0
  176. package/.output/server/chunks/build/app-CGhRZPNT.mjs +252 -0
  177. package/.output/server/chunks/build/app-CGhRZPNT.mjs.map +1 -0
  178. package/.output/server/chunks/build/{chat-m4-n9vC6.mjs → chat-BphuYhvA.mjs} +18 -27
  179. package/.output/server/chunks/build/chat-BphuYhvA.mjs.map +1 -0
  180. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  181. package/.output/server/chunks/build/cookie-C_iulBi6.mjs +1 -1
  182. package/.output/server/chunks/build/{dashboard-CiVTAZuF.mjs → dashboard-nDujDyOg.mjs} +55 -16
  183. package/.output/server/chunks/build/{dashboard-CiVTAZuF.mjs.map → dashboard-nDujDyOg.mjs.map} +1 -1
  184. package/.output/server/chunks/build/{docs-ChGwOPg5.mjs → docs-Bwucwp0r.mjs} +664 -592
  185. package/.output/server/chunks/build/docs-Bwucwp0r.mjs.map +1 -0
  186. package/.output/server/chunks/build/fetch-BB7Qzkwe.mjs +1 -1
  187. package/.output/server/chunks/build/{hooks-D328DcO6.mjs → hooks-D6PmTth8.mjs} +19 -29
  188. package/.output/server/chunks/build/hooks-D6PmTth8.mjs.map +1 -0
  189. package/.output/server/chunks/build/{index-CAnGTRlu.mjs → index-CJkn2jiM.mjs} +2 -2
  190. package/.output/server/chunks/build/{index-CAnGTRlu.mjs.map → index-CJkn2jiM.mjs.map} +1 -1
  191. package/.output/server/chunks/build/index-CxDxc9fm.mjs +1 -1
  192. package/.output/server/chunks/build/index-Cz9Y6NwN.mjs +723 -0
  193. package/.output/server/chunks/build/index-Cz9Y6NwN.mjs.map +1 -0
  194. package/.output/server/chunks/build/index-hwhuKhuZ.mjs +76 -0
  195. package/.output/server/chunks/build/index-hwhuKhuZ.mjs.map +1 -0
  196. package/.output/server/chunks/build/integrations-D5JWURiJ.mjs +1499 -0
  197. package/.output/server/chunks/build/integrations-D5JWURiJ.mjs.map +1 -0
  198. package/.output/server/chunks/build/{library-Aeg7_Lsb.mjs → library-DxRdgP6X.mjs} +2 -2
  199. package/.output/server/chunks/build/{library-Aeg7_Lsb.mjs.map → library-DxRdgP6X.mjs.map} +1 -1
  200. package/.output/server/chunks/build/{login-DnnElTl2.mjs → login-BmER_VoU.mjs} +2 -2
  201. package/.output/server/chunks/build/{login-DnnElTl2.mjs.map → login-BmER_VoU.mjs.map} +1 -1
  202. package/.output/server/chunks/build/manage-secrets-BWzqc_-f.mjs +669 -0
  203. package/.output/server/chunks/build/manage-secrets-BWzqc_-f.mjs.map +1 -0
  204. package/.output/server/chunks/build/server.mjs +65 -34
  205. package/.output/server/chunks/build/server.mjs.map +1 -1
  206. package/.output/server/chunks/build/settings-neokAVE5.mjs +154 -0
  207. package/.output/server/chunks/build/settings-neokAVE5.mjs.map +1 -0
  208. package/.output/server/chunks/build/styles.mjs +2 -2
  209. package/.output/server/chunks/build/{tasks-DnAFqbtt.mjs → tasks-CnpIQNpS.mjs} +27 -37
  210. package/.output/server/chunks/build/tasks-CnpIQNpS.mjs.map +1 -0
  211. package/.output/server/chunks/build/{useAgents-DHEXiFSc.mjs → useAgents-nmbkB9-_.mjs} +5 -26
  212. package/.output/server/chunks/build/useAgents-nmbkB9-_.mjs.map +1 -0
  213. package/.output/server/chunks/build/{view-n2sYa4Zh.mjs → view-mb0ISqfM.mjs} +3 -3
  214. package/.output/server/chunks/build/{view-n2sYa4Zh.mjs.map → view-mb0ISqfM.mjs.map} +1 -1
  215. package/.output/server/chunks/nitro/nitro.mjs +1000 -858
  216. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  217. package/.output/server/chunks/routes/api/index.get.mjs +17 -2
  218. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  219. package/.output/server/chunks/routes/api/index.get3.mjs +21 -3
  220. package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
  221. package/.output/server/chunks/routes/api/index.get4.mjs +10 -9
  222. package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
  223. package/.output/server/chunks/routes/api/index.get9.mjs +10 -8
  224. package/.output/server/chunks/routes/api/index.get9.mjs.map +1 -1
  225. package/.output/server/chunks/routes/api/memory/search.get.mjs +10 -5
  226. package/.output/server/chunks/routes/api/memory/search.get.mjs.map +1 -1
  227. package/.output/server/chunks/routes/renderer.mjs +1 -1
  228. package/.output/server/index.mjs +1 -1
  229. package/.output/server/package.json +1 -1
  230. package/app/components/AssistantPanel.client.vue +16 -314
  231. package/app/components/agents/AgentCard.vue +111 -0
  232. package/app/components/agents/AgentInfoCard.vue +54 -0
  233. package/app/components/agents/AgentRunHistory.vue +103 -0
  234. package/app/components/agents/AgentRunModal.vue +1 -24
  235. package/app/components/agents/AgentStatsCards.vue +1 -26
  236. package/app/components/assistant/AssistantChat.vue +156 -0
  237. package/app/components/assistant/AssistantTerminal.client.vue +178 -0
  238. package/app/components/chat/ConversationList.vue +2 -12
  239. package/app/components/files/FileTree.vue +23 -202
  240. package/app/components/files/FileTreeModals.vue +226 -0
  241. package/app/components/hooks/HookStatsCards.vue +1 -6
  242. package/app/components/hooks/ToolBreakdownTable.vue +1 -6
  243. package/app/components/search/DashboardSearch.vue +38 -1
  244. package/app/components/tasks/TaskCard.vue +2 -7
  245. package/app/components/tasks/TaskDetail.vue +4 -9
  246. package/app/composables/useSearch.ts +21 -11
  247. package/app/layouts/dashboard.vue +1 -1
  248. package/app/pages/agents/[id].vue +6 -197
  249. package/app/pages/agents/index.vue +9 -142
  250. package/app/pages/settings/account.vue +243 -0
  251. package/app/pages/settings/app.vue +230 -0
  252. package/app/pages/settings/index.vue +12 -0
  253. package/app/pages/settings/integrations.vue +794 -0
  254. package/app/pages/settings/manage-secrets.vue +295 -0
  255. package/app/pages/settings.vue +20 -1581
  256. package/dist/cli/index.js +676 -212
  257. package/package.json +1 -1
  258. package/server/api/agents/index.get.ts +20 -1
  259. package/server/api/conversations/index.get.ts +23 -5
  260. package/server/api/documents/index.get.ts +11 -9
  261. package/server/api/memory/search.get.ts +11 -6
  262. package/server/api/tasks/index.get.ts +11 -9
  263. package/server/drizzle/migrations/0016_full_text_search.sql +127 -0
  264. package/server/drizzle/migrations/meta/_journal.json +7 -0
  265. package/shared/types/index.ts +7 -1
  266. package/shared/utils/formatting.ts +105 -0
  267. package/.output/public/_nuxt/4ALIM-zZ.js +0 -1
  268. package/.output/public/_nuxt/5sUbkh_6.js +0 -16
  269. package/.output/public/_nuxt/6bB8Ev7a.js +0 -1
  270. package/.output/public/_nuxt/7rT1DCe2.js +0 -1
  271. package/.output/public/_nuxt/B2PqR2Vu.js +0 -1
  272. package/.output/public/_nuxt/B5FuOh7E.js +0 -1
  273. package/.output/public/_nuxt/B6om4MW2.js +0 -1
  274. package/.output/public/_nuxt/B7ikW4eF.js +0 -1
  275. package/.output/public/_nuxt/B9kWNcU7.js +0 -1
  276. package/.output/public/_nuxt/BAZ8sewA.js +0 -1
  277. package/.output/public/_nuxt/BCPwL4ma.js +0 -1
  278. package/.output/public/_nuxt/BCrlmHh_.js +0 -1
  279. package/.output/public/_nuxt/BD-AFJWW.js +0 -1
  280. package/.output/public/_nuxt/BGcQMReV.js +0 -1
  281. package/.output/public/_nuxt/BNJJSRKh.js +0 -1
  282. package/.output/public/_nuxt/BNeeERBt.js +0 -1
  283. package/.output/public/_nuxt/BSJb5amZ.js +0 -1
  284. package/.output/public/_nuxt/BSsaE9Db.js +0 -1
  285. package/.output/public/_nuxt/BVO3XpHT.js +0 -1
  286. package/.output/public/_nuxt/B_Lr1vlV.js +0 -1
  287. package/.output/public/_nuxt/Bl0qBhCG.js +0 -1
  288. package/.output/public/_nuxt/Bl43dkDq.js +0 -1
  289. package/.output/public/_nuxt/BnMTFF5R.js +0 -1
  290. package/.output/public/_nuxt/BtV7oNn3.js +0 -1
  291. package/.output/public/_nuxt/BvFYnRMR.js +0 -1
  292. package/.output/public/_nuxt/BvTUBUNN.js +0 -1
  293. package/.output/public/_nuxt/ByLsRRoQ.js +0 -1
  294. package/.output/public/_nuxt/C1LcEMwB.js +0 -1
  295. package/.output/public/_nuxt/C2IiXp9N.js +0 -2
  296. package/.output/public/_nuxt/C796kFT9.js +0 -1
  297. package/.output/public/_nuxt/C8AtdrMH.js +0 -1
  298. package/.output/public/_nuxt/CAWbHTgy.js +0 -1
  299. package/.output/public/_nuxt/CJPrV25_.js +0 -1
  300. package/.output/public/_nuxt/CKKEWapF.js +0 -1
  301. package/.output/public/_nuxt/CNjv28J2.js +0 -1
  302. package/.output/public/_nuxt/CT8s4rqa.js +0 -1
  303. package/.output/public/_nuxt/CZSOrxUy.js +0 -1
  304. package/.output/public/_nuxt/CaNEL9JC.js +0 -39
  305. package/.output/public/_nuxt/CbTLg9oX.js +0 -1
  306. package/.output/public/_nuxt/CfCXpVn5.js +0 -1
  307. package/.output/public/_nuxt/ChmNlvWR.js +0 -1
  308. package/.output/public/_nuxt/Ck0QYdxe.js +0 -1
  309. package/.output/public/_nuxt/Ckb0pu4-.js +0 -1
  310. package/.output/public/_nuxt/CkwPRs1D.js +0 -1
  311. package/.output/public/_nuxt/CmEJg8C6.js +0 -2
  312. package/.output/public/_nuxt/CmL_vMJD.js +0 -1
  313. package/.output/public/_nuxt/Cq8zPxkT.js +0 -1
  314. package/.output/public/_nuxt/CxRnB4NC.js +0 -1
  315. package/.output/public/_nuxt/D0zMyG8n.js +0 -1
  316. package/.output/public/_nuxt/D1XYB283.js +0 -1
  317. package/.output/public/_nuxt/D2NxqyzW.js +0 -1
  318. package/.output/public/_nuxt/D5xyrvFu.js +0 -1
  319. package/.output/public/_nuxt/D8iBB0Py.js +0 -1
  320. package/.output/public/_nuxt/D8oIH8m1.js +0 -1
  321. package/.output/public/_nuxt/DB2zZev7.js +0 -1
  322. package/.output/public/_nuxt/DBrOAqkm.js +0 -1
  323. package/.output/public/_nuxt/DDXDFweK.js +0 -1
  324. package/.output/public/_nuxt/DFZkCmLQ.js +0 -1
  325. package/.output/public/_nuxt/DKZmgHNU.js +0 -1
  326. package/.output/public/_nuxt/DR8tGJhL.js +0 -1
  327. package/.output/public/_nuxt/DVAEVTjy.js +0 -1
  328. package/.output/public/_nuxt/DVqrPkCJ.js +0 -1
  329. package/.output/public/_nuxt/DWZ9ieYa.js +0 -1
  330. package/.output/public/_nuxt/DWj6VsZv.js +0 -1
  331. package/.output/public/_nuxt/DXJ9PxCv.js +0 -1
  332. package/.output/public/_nuxt/D_ziPROx.js +0 -1
  333. package/.output/public/_nuxt/Da2vwoYG.js +0 -1
  334. package/.output/public/_nuxt/Ddz3HcBB.js +0 -1
  335. package/.output/public/_nuxt/DgYei0bK.js +0 -1
  336. package/.output/public/_nuxt/Di_3GV_R.js +0 -1
  337. package/.output/public/_nuxt/Djog1f_e.js +0 -1
  338. package/.output/public/_nuxt/Dkap2-Pj.js +0 -7
  339. package/.output/public/_nuxt/DlJe_sHk.js +0 -1
  340. package/.output/public/_nuxt/DlPOQpH_.js +0 -1
  341. package/.output/public/_nuxt/DmYWMtVA.js +0 -1
  342. package/.output/public/_nuxt/DmxKU7sH.js +0 -1
  343. package/.output/public/_nuxt/DsodHRrQ.js +0 -1
  344. package/.output/public/_nuxt/DwSY6_2U.js +0 -1
  345. package/.output/public/_nuxt/DypJaSm-.js +0 -1
  346. package/.output/public/_nuxt/DzKaXH6P.js +0 -1
  347. package/.output/public/_nuxt/FK-jSuOT.js +0 -1
  348. package/.output/public/_nuxt/Fc2JsQt4.js +0 -1
  349. package/.output/public/_nuxt/IYCBGuRS.js +0 -1
  350. package/.output/public/_nuxt/NrRzUJNY.js +0 -1
  351. package/.output/public/_nuxt/OeVS0Rsb.js +0 -1
  352. package/.output/public/_nuxt/OlF0QnKF.js +0 -1
  353. package/.output/public/_nuxt/QuAoqY7t.js +0 -1
  354. package/.output/public/_nuxt/RlXHkmOd.js +0 -9
  355. package/.output/public/_nuxt/WZnvL9Dh.js +0 -1
  356. package/.output/public/_nuxt/ZvG7a1W3.js +0 -1
  357. package/.output/public/_nuxt/aPNZBVrG.js +0 -1
  358. package/.output/public/_nuxt/builds/meta/495aca73-bfa5-456e-b96a-f02e009c72d3.json +0 -1
  359. package/.output/public/_nuxt/dashboard.BxCOkJwt.css +0 -1
  360. package/.output/public/_nuxt/entry.C_udkZt9.css +0 -1
  361. package/.output/public/_nuxt/evY81hM3.js +0 -1
  362. package/.output/public/_nuxt/i6QBzaEi.js +0 -1
  363. package/.output/public/_nuxt/iTVKJ1kw.js +0 -1
  364. package/.output/public/_nuxt/j92uR3uR.js +0 -1
  365. package/.output/public/_nuxt/jdUkeAj_.js +0 -1
  366. package/.output/public/_nuxt/jeRvcMHU.js +0 -1
  367. package/.output/public/_nuxt/kuv0zpKq.js +0 -1
  368. package/.output/public/_nuxt/l3lKQs7b.js +0 -1
  369. package/.output/public/_nuxt/qIgZ7OXa.js +0 -1
  370. package/.output/public/_nuxt/qcVwZv8e.js +0 -1
  371. package/.output/public/_nuxt/ru8fqqWs.js +0 -1
  372. package/.output/public/_nuxt/sgmhgpCS.js +0 -1
  373. package/.output/public/_nuxt/y2jv0da-.js +0 -1
  374. package/.output/public/_nuxt/yyS4-kAX.js +0 -1
  375. package/.output/public/_nuxt/zIoBLBHF.js +0 -1
  376. package/.output/public/_nuxt/zpazwPgx.js +0 -1
  377. package/.output/server/chunks/build/_id_-DN00UDdO.mjs.map +0 -1
  378. package/.output/server/chunks/build/chat-m4-n9vC6.mjs.map +0 -1
  379. package/.output/server/chunks/build/docs-ChGwOPg5.mjs.map +0 -1
  380. package/.output/server/chunks/build/hooks-D328DcO6.mjs.map +0 -1
  381. package/.output/server/chunks/build/index-C9PuieXh.mjs +0 -820
  382. package/.output/server/chunks/build/index-C9PuieXh.mjs.map +0 -1
  383. package/.output/server/chunks/build/settings-B2KXoGcz.mjs +0 -3232
  384. package/.output/server/chunks/build/settings-B2KXoGcz.mjs.map +0 -1
  385. package/.output/server/chunks/build/tasks-DnAFqbtt.mjs.map +0 -1
  386. package/.output/server/chunks/build/useAgents-DHEXiFSc.mjs.map +0 -1
@@ -61,72 +61,6 @@ const showDeleteConfirm = ref(false)
61
61
  const selectedRun = ref<CronAgentRun | null>(null)
62
62
  const showRunModal = ref(false)
63
63
 
64
- // Format cron expression to human readable
65
- function formatSchedule(schedule: string) {
66
- const parts = schedule.split(' ')
67
- if (parts.length !== 5) return schedule
68
-
69
- const min = parts[0]!
70
- const hour = parts[1]!
71
- const dayOfMonth = parts[2]!
72
- const month = parts[3]!
73
- const dayOfWeek = parts[4]!
74
-
75
- if (min === '0' && hour === '*' && dayOfMonth === '*' && month === '*' && dayOfWeek === '*')
76
- return 'Every hour'
77
- if (min === '*/5' && hour === '*' && dayOfMonth === '*' && month === '*' && dayOfWeek === '*')
78
- return 'Every 5 minutes'
79
- if (dayOfMonth === '*' && month === '*' && dayOfWeek === '*' && hour !== '*')
80
- return `Daily at ${hour}:${min.padStart(2, '0')}`
81
- if (dayOfWeek === '0' && dayOfMonth === '*' && month === '*')
82
- return `Weekly on Sunday at ${hour}:${min.padStart(2, '0')}`
83
-
84
- return schedule
85
- }
86
-
87
- // Format relative time
88
- function formatRelativeTime(date?: Date | string) {
89
- if (!date) return 'Never'
90
- const d = new Date(date)
91
- const now = new Date()
92
- const diff = now.getTime() - d.getTime()
93
- const minutes = Math.floor(diff / 60000)
94
- const hours = Math.floor(diff / 3600000)
95
- const days = Math.floor(diff / 86400000)
96
-
97
- if (minutes < 1) return 'Just now'
98
- if (minutes < 60) return `${minutes}m ago`
99
- if (hours < 24) return `${hours}h ago`
100
- return `${days}d ago`
101
- }
102
-
103
- // Format duration
104
- function formatDuration(ms?: number) {
105
- if (!ms) return '-'
106
- if (ms < 1000) return `${ms}ms`
107
- if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`
108
- return `${(ms / 60000).toFixed(1)}m`
109
- }
110
-
111
- // Format date time
112
- function formatDateTime(date?: Date | string) {
113
- if (!date) return '-'
114
- const d = new Date(date)
115
- return d.toLocaleString()
116
- }
117
-
118
- // Status badge color
119
- function getStatusColor(status?: string) {
120
- switch (status) {
121
- case 'success': return 'success'
122
- case 'error': return 'error'
123
- case 'budget_exceeded': return 'warning'
124
- case 'running': return 'info'
125
- case 'cancelled': return 'neutral'
126
- default: return 'neutral'
127
- }
128
- }
129
-
130
64
  // Load stats
131
65
  async function loadStats() {
132
66
  statsLoading.value = true
@@ -256,13 +190,6 @@ function openRunModal(run: CronAgentRun) {
256
190
  showRunModal.value = true
257
191
  }
258
192
 
259
- // Truncate output for list display
260
- function truncateOutput(output?: string, maxLength = 100) {
261
- if (!output) return '-'
262
- if (output.length <= maxLength) return output
263
- return output.substring(0, maxLength) + '...'
264
- }
265
-
266
193
  // Watch period changes
267
194
  watch(period, () => {
268
195
  loadStats()
@@ -392,49 +319,7 @@ onMounted(() => {
392
319
  class="p-4 space-y-6"
393
320
  >
394
321
  <!-- Agent Info -->
395
- <UCard>
396
- <div class="space-y-3">
397
- <div v-if="agent.description">
398
- <p class="text-sm text-muted uppercase mb-1">
399
- Description
400
- </p>
401
- <p>{{ agent.description }}</p>
402
- </div>
403
-
404
- <div class="flex flex-wrap gap-6">
405
- <div>
406
- <p class="text-sm text-muted uppercase mb-1">
407
- Schedule
408
- </p>
409
- <p class="flex items-center gap-2">
410
- <UIcon name="i-lucide-clock" />
411
- {{ formatSchedule(agent.schedule) }}
412
- <span class="text-sm text-muted">({{ agent.schedule }})</span>
413
- </p>
414
- </div>
415
-
416
- <div v-if="agent.maxBudgetUsd">
417
- <p class="text-sm text-muted uppercase mb-1">
418
- Budget Limit
419
- </p>
420
- <p class="flex items-center gap-2">
421
- <UIcon name="i-lucide-dollar-sign" />
422
- ${{ agent.maxBudgetUsd }} per run
423
- </p>
424
- </div>
425
-
426
- <div v-if="agent.lastRunAt">
427
- <p class="text-sm text-muted uppercase mb-1">
428
- Last Run
429
- </p>
430
- <p class="flex items-center gap-2">
431
- <UIcon name="i-lucide-activity" />
432
- {{ formatRelativeTime(agent.lastRunAt) }}
433
- </p>
434
- </div>
435
- </div>
436
- </div>
437
- </UCard>
322
+ <AgentsAgentInfoCard :agent="agent" />
438
323
 
439
324
  <!-- Stats Cards -->
440
325
  <AgentsAgentStatsCards
@@ -451,87 +336,11 @@ onMounted(() => {
451
336
  />
452
337
 
453
338
  <!-- Run History -->
454
- <div class="space-y-4">
455
- <h2 class="text-lg font-semibold">
456
- Run History
457
- </h2>
458
-
459
- <!-- Loading runs -->
460
- <div
461
- v-if="runsLoading"
462
- class="flex items-center justify-center h-32"
463
- >
464
- <UIcon
465
- name="i-lucide-loader-2"
466
- class="w-6 h-6 animate-spin text-neutral-400"
467
- />
468
- </div>
469
-
470
- <!-- Empty state -->
471
- <div
472
- v-else-if="runs.length === 0"
473
- class="flex flex-col items-center justify-center h-32 text-neutral-500"
474
- >
475
- <UIcon
476
- name="i-lucide-history"
477
- class="w-8 h-8 mb-2"
478
- />
479
- <p>No runs yet</p>
480
- </div>
481
-
482
- <!-- Run list -->
483
- <div
484
- v-else
485
- class="space-y-2"
486
- >
487
- <UCard
488
- v-for="run in runs"
489
- :key="run.id"
490
- class="cursor-pointer transition-all hover:ring-2 hover:ring-primary/50"
491
- @click="openRunModal(run)"
492
- >
493
- <div class="flex items-start justify-between gap-4">
494
- <div class="flex-1 min-w-0">
495
- <div class="flex items-center gap-2 mb-1">
496
- <UBadge
497
- v-if="run.status === 'running'"
498
- color="info"
499
- variant="subtle"
500
- size="sm"
501
- >
502
- <UIcon
503
- name="i-lucide-loader-2"
504
- class="w-3 h-3 animate-spin mr-1"
505
- />
506
- Running
507
- </UBadge>
508
- <UBadge
509
- v-else
510
- :color="getStatusColor(run.status)"
511
- size="sm"
512
- >
513
- {{ run.status }}
514
- </UBadge>
515
- <span class="text-sm text-muted">
516
- {{ formatDateTime(run.startedAt) }}
517
- </span>
518
- </div>
519
-
520
- <p class="text-sm text-muted truncate">
521
- {{ run.error ? truncateOutput(run.error) : truncateOutput(run.output) }}
522
- </p>
523
- </div>
524
-
525
- <div class="text-right text-sm text-muted shrink-0">
526
- <p>{{ formatDuration(run.durationMs) }}</p>
527
- <p v-if="run.costUsd">
528
- ${{ run.costUsd.toFixed(4) }}
529
- </p>
530
- </div>
531
- </div>
532
- </UCard>
533
- </div>
534
- </div>
339
+ <AgentsAgentRunHistory
340
+ :runs="runs"
341
+ :loading="runsLoading"
342
+ @select="openRunModal"
343
+ />
535
344
  </div>
536
345
  </template>
537
346
  </UDashboardPanel>
@@ -36,45 +36,6 @@ const periodOptions = [
36
36
  { label: '30d', value: '30d' as StatsPeriod }
37
37
  ]
38
38
 
39
- // Format cron expression to human readable
40
- function formatSchedule(schedule: string) {
41
- const parts = schedule.split(' ')
42
- if (parts.length !== 5) return schedule
43
-
44
- const min = parts[0]!
45
- const hour = parts[1]!
46
- const dayOfMonth = parts[2]!
47
- const month = parts[3]!
48
- const dayOfWeek = parts[4]!
49
-
50
- if (min === '0' && hour === '*' && dayOfMonth === '*' && month === '*' && dayOfWeek === '*')
51
- return 'Every hour'
52
- if (min === '*/5' && hour === '*' && dayOfMonth === '*' && month === '*' && dayOfWeek === '*')
53
- return 'Every 5 minutes'
54
- if (dayOfMonth === '*' && month === '*' && dayOfWeek === '*' && hour !== '*')
55
- return `Daily at ${hour}:${min.padStart(2, '0')}`
56
- if (dayOfWeek === '0' && dayOfMonth === '*' && month === '*')
57
- return `Weekly on Sunday at ${hour}:${min.padStart(2, '0')}`
58
-
59
- return schedule
60
- }
61
-
62
- // Format relative time
63
- function formatRelativeTime(date?: Date | string) {
64
- if (!date) return 'Never'
65
- const d = new Date(date)
66
- const now = new Date()
67
- const diff = now.getTime() - d.getTime()
68
- const minutes = Math.floor(diff / 60000)
69
- const hours = Math.floor(diff / 3600000)
70
- const days = Math.floor(diff / 86400000)
71
-
72
- if (minutes < 1) return 'Just now'
73
- if (minutes < 60) return `${minutes}m ago`
74
- if (hours < 24) return `${hours}h ago`
75
- return `${days}d ago`
76
- }
77
-
78
39
  // Open form for new agent
79
40
  function openNewAgentForm() {
80
41
  editingAgent.value = null
@@ -171,18 +132,6 @@ async function handleCancel(id: string, event: Event) {
171
132
  }
172
133
  }
173
134
 
174
- // Status badge color
175
- function getStatusColor(status?: string) {
176
- switch (status) {
177
- case 'success': return 'success'
178
- case 'error': return 'error'
179
- case 'budget_exceeded': return 'warning'
180
- case 'running': return 'info'
181
- case 'cancelled': return 'neutral'
182
- default: return 'neutral'
183
- }
184
- }
185
-
186
135
  // Load stats
187
136
  async function loadStats() {
188
137
  statsLoading.value = true
@@ -296,99 +245,17 @@ onMounted(async () => {
296
245
  <h2 class="text-lg font-semibold">
297
246
  Agents
298
247
  </h2>
299
- <UCard
248
+ <AgentsAgentCard
300
249
  v-for="agent in agents"
301
250
  :key="agent.id"
302
- class="cursor-pointer transition-all hover:ring-2 hover:ring-primary/50"
303
- @click="navigateToAgent(agent)"
304
- >
305
- <div class="flex items-start justify-between gap-4">
306
- <div class="flex-1 min-w-0">
307
- <div class="flex items-center gap-2">
308
- <h3 class="font-medium truncate">
309
- {{ agent.name }}
310
- </h3>
311
- <UBadge
312
- v-if="checkAgentRunning(agent.id)"
313
- color="info"
314
- variant="subtle"
315
- size="sm"
316
- >
317
- <UIcon
318
- name="i-lucide-loader-2"
319
- class="w-3 h-3 animate-spin mr-1"
320
- />
321
- Running
322
- </UBadge>
323
- <UBadge
324
- v-else-if="agent.lastStatus"
325
- :color="getStatusColor(agent.lastStatus)"
326
- size="sm"
327
- >
328
- {{ agent.lastStatus }}
329
- </UBadge>
330
- </div>
331
-
332
- <p
333
- v-if="agent.description"
334
- class="text-sm text-muted truncate mt-1"
335
- >
336
- {{ agent.description }}
337
- </p>
338
-
339
- <div class="flex items-center gap-4 mt-2 text-sm text-muted">
340
- <span class="flex items-center gap-1">
341
- <UIcon name="i-lucide-clock" />
342
- {{ formatSchedule(agent.schedule) }}
343
- </span>
344
- <span
345
- v-if="agent.lastRunAt"
346
- class="flex items-center gap-1"
347
- >
348
- <UIcon name="i-lucide-activity" />
349
- {{ formatRelativeTime(agent.lastRunAt) }}
350
- </span>
351
- <span
352
- v-if="agent.maxBudgetUsd"
353
- class="flex items-center gap-1"
354
- >
355
- <UIcon name="i-lucide-dollar-sign" />
356
- ${{ agent.maxBudgetUsd }} limit
357
- </span>
358
- </div>
359
- </div>
360
-
361
- <div class="flex items-center gap-2">
362
- <USwitch
363
- :model-value="agent.enabled"
364
- @click.stop
365
- @update:model-value="handleToggle(agent.id)"
366
- />
367
- <UButton
368
- v-if="checkAgentRunning(agent.id)"
369
- icon="i-lucide-square"
370
- variant="ghost"
371
- size="sm"
372
- color="error"
373
- @click.stop="handleCancel(agent.id, $event)"
374
- />
375
- <UButton
376
- v-else
377
- icon="i-lucide-play"
378
- variant="ghost"
379
- size="sm"
380
- :disabled="!agent.enabled"
381
- @click.stop="handleRun(agent.id, $event)"
382
- />
383
- <UButton
384
- icon="i-lucide-pencil"
385
- variant="ghost"
386
- size="sm"
387
- @click.stop="openEditForm(agent, $event)"
388
- />
389
- </div>
390
- </div>
391
- </UCard>
251
+ :agent="agent"
252
+ :running="checkAgentRunning(agent.id)"
253
+ @toggle="handleToggle"
254
+ @run="handleRun"
255
+ @cancel="handleCancel"
256
+ @edit="openEditForm"
257
+ @navigate="navigateToAgent"
258
+ />
392
259
  </div>
393
260
  </div>
394
261
  </template>
@@ -0,0 +1,243 @@
1
+ <script setup lang="ts">
2
+ const { user, updateProfile, changeEmail, changePassword } = useAuth()
3
+ const toast = useToast()
4
+
5
+ // Profile form state
6
+ const profileState = reactive({
7
+ name: ''
8
+ })
9
+ const profileLoading = ref(false)
10
+
11
+ // Email form state
12
+ const emailState = reactive({
13
+ newEmail: ''
14
+ })
15
+ const emailLoading = ref(false)
16
+
17
+ // Password form state
18
+ const passwordState = reactive({
19
+ currentPassword: '',
20
+ newPassword: '',
21
+ confirmPassword: ''
22
+ })
23
+ const passwordLoading = ref(false)
24
+
25
+ // Initialize forms with current user data
26
+ watch(() => user.value, (u) => {
27
+ if (u) {
28
+ profileState.name = u.name || ''
29
+ emailState.newEmail = u.email || ''
30
+ }
31
+ }, { immediate: true })
32
+
33
+ async function handleProfileSubmit() {
34
+ profileLoading.value = true
35
+ const result = await updateProfile({
36
+ name: profileState.name
37
+ })
38
+
39
+ if (result.error) {
40
+ toast.add({
41
+ title: 'Update failed',
42
+ description: result.error.message,
43
+ color: 'error'
44
+ })
45
+ } else {
46
+ toast.add({
47
+ title: 'Profile updated',
48
+ description: 'Your name has been updated successfully.',
49
+ color: 'success'
50
+ })
51
+ }
52
+ profileLoading.value = false
53
+ }
54
+
55
+ async function handleEmailSubmit() {
56
+ if (!emailState.newEmail) {
57
+ toast.add({
58
+ title: 'Email required',
59
+ description: 'Please enter a new email address.',
60
+ color: 'error'
61
+ })
62
+ return
63
+ }
64
+
65
+ emailLoading.value = true
66
+ const result = await changeEmail(emailState.newEmail)
67
+
68
+ if (result.error) {
69
+ toast.add({
70
+ title: 'Email change failed',
71
+ description: result.error.message,
72
+ color: 'error'
73
+ })
74
+ } else {
75
+ toast.add({
76
+ title: 'Email updated',
77
+ description: 'Your email has been changed successfully.',
78
+ color: 'success'
79
+ })
80
+ }
81
+ emailLoading.value = false
82
+ }
83
+
84
+ async function handlePasswordSubmit() {
85
+ if (passwordState.newPassword !== passwordState.confirmPassword) {
86
+ toast.add({
87
+ title: 'Passwords do not match',
88
+ description: 'Please make sure your new passwords match.',
89
+ color: 'error'
90
+ })
91
+ return
92
+ }
93
+
94
+ if (!passwordState.currentPassword || !passwordState.newPassword) {
95
+ toast.add({
96
+ title: 'Missing fields',
97
+ description: 'Please fill in all password fields.',
98
+ color: 'error'
99
+ })
100
+ return
101
+ }
102
+
103
+ passwordLoading.value = true
104
+ const result = await changePassword({
105
+ currentPassword: passwordState.currentPassword,
106
+ newPassword: passwordState.newPassword
107
+ })
108
+
109
+ if (result.error) {
110
+ toast.add({
111
+ title: 'Password change failed',
112
+ description: result.error.message,
113
+ color: 'error'
114
+ })
115
+ } else {
116
+ toast.add({
117
+ title: 'Password changed',
118
+ description: 'Your password has been changed successfully.',
119
+ color: 'success'
120
+ })
121
+ passwordState.currentPassword = ''
122
+ passwordState.newPassword = ''
123
+ passwordState.confirmPassword = ''
124
+ }
125
+ passwordLoading.value = false
126
+ }
127
+ </script>
128
+
129
+ <template>
130
+ <div class="space-y-8 max-w-2xl mx-auto py-6">
131
+ <!-- Profile Section -->
132
+ <div>
133
+ <h3 class="text-lg font-semibold mb-4">
134
+ Profile
135
+ </h3>
136
+ <UForm
137
+ :state="profileState"
138
+ class="space-y-4"
139
+ @submit="handleProfileSubmit"
140
+ >
141
+ <UFormField
142
+ label="Name"
143
+ name="name"
144
+ >
145
+ <UInput
146
+ v-model="profileState.name"
147
+ placeholder="Your name"
148
+ class="w-full"
149
+ />
150
+ </UFormField>
151
+ <UButton
152
+ type="submit"
153
+ :loading="profileLoading"
154
+ >
155
+ Save Name
156
+ </UButton>
157
+ </UForm>
158
+ </div>
159
+
160
+ <USeparator />
161
+
162
+ <!-- Email Section -->
163
+ <div>
164
+ <h3 class="text-lg font-semibold mb-4">
165
+ Email Address
166
+ </h3>
167
+ <UForm
168
+ :state="emailState"
169
+ class="space-y-4"
170
+ @submit="handleEmailSubmit"
171
+ >
172
+ <UFormField
173
+ label="Email"
174
+ name="newEmail"
175
+ >
176
+ <UInput
177
+ v-model="emailState.newEmail"
178
+ type="email"
179
+ placeholder="your@email.com"
180
+ class="w-full"
181
+ />
182
+ </UFormField>
183
+ <UButton
184
+ type="submit"
185
+ :loading="emailLoading"
186
+ >
187
+ Change Email
188
+ </UButton>
189
+ </UForm>
190
+ </div>
191
+
192
+ <USeparator />
193
+
194
+ <!-- Password Section -->
195
+ <div>
196
+ <h3 class="text-lg font-semibold mb-4">
197
+ Change Password
198
+ </h3>
199
+ <UForm
200
+ :state="passwordState"
201
+ class="space-y-4"
202
+ @submit="handlePasswordSubmit"
203
+ >
204
+ <UFormField
205
+ label="Current Password"
206
+ name="currentPassword"
207
+ >
208
+ <UInput
209
+ v-model="passwordState.currentPassword"
210
+ type="password"
211
+ class="w-full"
212
+ />
213
+ </UFormField>
214
+ <UFormField
215
+ label="New Password"
216
+ name="newPassword"
217
+ >
218
+ <UInput
219
+ v-model="passwordState.newPassword"
220
+ type="password"
221
+ class="w-full"
222
+ />
223
+ </UFormField>
224
+ <UFormField
225
+ label="Confirm New Password"
226
+ name="confirmPassword"
227
+ >
228
+ <UInput
229
+ v-model="passwordState.confirmPassword"
230
+ type="password"
231
+ class="w-full"
232
+ />
233
+ </UFormField>
234
+ <UButton
235
+ type="submit"
236
+ :loading="passwordLoading"
237
+ >
238
+ Change Password
239
+ </UButton>
240
+ </UForm>
241
+ </div>
242
+ </div>
243
+ </template>