cognova 0.2.0 → 0.2.3
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.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/-AsXrBBy.js +1 -0
- package/.output/public/_nuxt/2W1RPpXM.js +71 -0
- package/.output/public/_nuxt/{C4pxqdgg.js → 5UFq_rDn.js} +1 -1
- package/.output/public/_nuxt/5Zh-9l8_.js +1 -0
- package/.output/public/_nuxt/{DK9jxJ0g.js → 90UksHlj.js} +1 -1
- package/.output/public/_nuxt/{9IQmsEjr.js → 9QKmiSP_.js} +1 -1
- package/.output/public/_nuxt/{BOj6t-oo.js → ARbTpeGy.js} +1 -1
- package/.output/public/_nuxt/{DyRelyfs.js → ApfLnl06.js} +1 -1
- package/.output/public/_nuxt/{DznawRFW.js → B-2BuR5g.js} +1 -1
- package/.output/public/_nuxt/B4u7Mczo.js +1 -0
- package/.output/public/_nuxt/{DAQhmSv4.js → B5dI_yLq.js} +1 -1
- package/.output/public/_nuxt/{Bm9LyG4F.js → B6fnZcA6.js} +1 -1
- package/.output/public/_nuxt/{9QnH0xQM.js → B7uMSBlN.js} +1 -1
- package/.output/public/_nuxt/BBiRyPlN.js +1 -0
- package/.output/public/_nuxt/{iBGCpHdw.js → BF7413u4.js} +2 -2
- package/.output/public/_nuxt/{4MiwzAAt.js → BGtUoCgi.js} +2 -2
- package/.output/public/_nuxt/{CxuZBC8n.js → BHe4VLtR.js} +1 -1
- package/.output/public/_nuxt/{D3RiUGdz.js → BIMBp1Tj.js} +1 -1
- package/.output/public/_nuxt/{g20UHUCv.js → BIvPdoE3.js} +1 -1
- package/.output/public/_nuxt/BKaRtCjP.js +1 -0
- package/.output/public/_nuxt/BLmc9T7l.js +1 -0
- package/.output/public/_nuxt/BMdnU6BF.js +1 -0
- package/.output/public/_nuxt/{CKkC3Ptm.js → BOgdaA_8.js} +1 -1
- package/.output/public/_nuxt/{BffWCM73.js → BQZfTrUg.js} +1 -1
- package/.output/public/_nuxt/BQnublTW.js +1 -0
- package/.output/public/_nuxt/BSsvedap.js +1 -0
- package/.output/public/_nuxt/{Ci7UEZQh.js → BVypxKRT.js} +1 -1
- package/.output/public/_nuxt/{CYP_MLH8.js → BWqJFnZy.js} +1 -1
- package/.output/public/_nuxt/BXxYdXMr.js +1 -0
- package/.output/public/_nuxt/{D_3Rq1BS.js → B_17gAr_.js} +1 -1
- package/.output/public/_nuxt/B_qzFVK_.js +1 -0
- package/.output/public/_nuxt/{BqKFIuRj.js → BbRPwpIX.js} +1 -1
- package/.output/public/_nuxt/BhrzKbv9.js +1 -0
- package/.output/public/_nuxt/{Cqy_L_ip.js → Bl6LNGlA.js} +1 -1
- package/.output/public/_nuxt/{Fukkqjkf.js → BlPToGni.js} +1 -1
- package/.output/public/_nuxt/{DHKLCQRG.js → BlwHr46F.js} +1 -1
- package/.output/public/_nuxt/{C6aqGHu1.js → BnmwiZbF.js} +1 -1
- package/.output/public/_nuxt/BqtxLJaf.js +1 -0
- package/.output/public/_nuxt/{eko-0FUm.js → BrEXdify.js} +1 -1
- package/.output/public/_nuxt/{D3e44mCL.js → BtNnS4m3.js} +1 -1
- package/.output/public/_nuxt/{BCtfQCzC.js → BtVIBBUN.js} +1 -1
- package/.output/public/_nuxt/Bw5h4Jaf.js +1 -0
- package/.output/public/_nuxt/{FvlxxmNk.js → Bwcpy7gC.js} +2 -2
- package/.output/public/_nuxt/{Db2v8O7O.js → C0TUK31m.js} +1 -1
- package/.output/public/_nuxt/C1T4GK6c.js +1 -0
- package/.output/public/_nuxt/C2ANDZen.js +1 -0
- package/.output/public/_nuxt/{CqU2XbzO.js → C2RZSTuy.js} +1 -1
- package/.output/public/_nuxt/C3dYlP5x.js +1 -0
- package/.output/public/_nuxt/{m5kGCDpI.js → C3sh_tLi.js} +3 -3
- package/.output/public/_nuxt/{BjjCvHLT.js → C4zyxZG7.js} +1 -1
- package/.output/public/_nuxt/{C3FxIITy.js → C5I-XBZT.js} +1 -1
- package/.output/public/_nuxt/{yuf23kh9.js → CC4Goztu.js} +1 -1
- package/.output/public/_nuxt/CC77iplr.js +1 -0
- package/.output/public/_nuxt/{xuzLdW-o.js → CFyD2NHP.js} +1 -1
- package/.output/public/_nuxt/{CsJ9KhQ4.js → CGQDTeaO.js} +1 -1
- package/.output/public/_nuxt/{DnjGH3SQ.js → CHpwuMSk.js} +1 -1
- package/.output/public/_nuxt/CLzcRUcs.js +1 -0
- package/.output/public/_nuxt/CM2phu_3.js +1 -0
- package/.output/public/_nuxt/{Cr8ixbr1.js → CQpYRq61.js} +1 -1
- package/.output/public/_nuxt/{C0JKNMDO.js → CUN4bYcg.js} +1 -1
- package/.output/public/_nuxt/{CmzH6R-N.js → CXoITXft.js} +19 -19
- package/.output/public/_nuxt/CYjcQPl-.js +1 -0
- package/.output/public/_nuxt/{DGX0tzL8.js → CZ32KfaS.js} +1 -1
- package/.output/public/_nuxt/CclZMdca.js +1 -0
- package/.output/public/_nuxt/{C69W7k2j.js → CdpT_Vb6.js} +1 -1
- package/.output/public/_nuxt/CflRLvFC.js +1 -0
- package/.output/public/_nuxt/{gBC9k4Qj.js → CkqNv7sq.js} +2 -2
- package/.output/public/_nuxt/ClXDAYjE.js +1 -0
- package/.output/public/_nuxt/CrZGoMo_.js +1 -0
- package/.output/public/_nuxt/{BZXMQuYP.js → CvJtd2Af.js} +1 -1
- package/.output/public/_nuxt/{DKZxeXDQ.js → Cwtd8e-P.js} +1 -1
- package/.output/public/_nuxt/{nIU2F7ia.js → Cx44SSNp.js} +3 -3
- package/.output/public/_nuxt/{BzOqrmGa.js → CxEVzuCn.js} +3 -3
- package/.output/public/_nuxt/{Dy_Cq5LQ.js → CzIMQevQ.js} +1 -1
- package/.output/public/_nuxt/{D6t3dcTl.js → D0P9llU7.js} +1 -1
- package/.output/public/_nuxt/{JJ3634gV.js → D1DYuOOm.js} +1 -1
- package/.output/public/_nuxt/{BAIz-dEB.js → D1dDc8Vw.js} +1 -1
- package/.output/public/_nuxt/{DSRrg8JT.js → D1r0uqf3.js} +1 -1
- package/.output/public/_nuxt/{CNnJrDvu.js → D3a8R1T6.js} +1 -1
- package/.output/public/_nuxt/{B1X4Bzcy.js → D5EZbuub.js} +1 -1
- package/.output/public/_nuxt/D9V13KTK.js +1 -0
- package/.output/public/_nuxt/DAE2hbP7.js +1 -0
- package/.output/public/_nuxt/{Cvp7FI3T.js → DAIbdyS6.js} +1 -1
- package/.output/public/_nuxt/{EuOqK1A6.js → DAvlXjt0.js} +1 -1
- package/.output/public/_nuxt/DBKzwexZ.js +1 -0
- package/.output/public/_nuxt/{wCGVE8_e.js → DEATxnaF.js} +1 -1
- package/.output/public/_nuxt/{cABRLVee.js → DFg8PvHV.js} +1 -1
- package/.output/public/_nuxt/DM4MyqI-.js +1 -0
- package/.output/public/_nuxt/{Cdt3I3Go.js → DNE7kw9s.js} +1 -1
- package/.output/public/_nuxt/DO0oG4fG.js +1 -0
- package/.output/public/_nuxt/{B6S_ob86.js → DPFugPaB.js} +1 -1
- package/.output/public/_nuxt/{DJjDvbZE.js → DQlXU6_H.js} +1 -1
- package/.output/public/_nuxt/DQvuQpwh.js +1 -0
- package/.output/public/_nuxt/{sf57orEk.js → DRlG_bnX.js} +1 -1
- package/.output/public/_nuxt/{C6RC3lA1.js → DSQj-oMk.js} +1 -1
- package/.output/public/_nuxt/{CeIVm4A3.js → DU6ewLkE.js} +1 -1
- package/.output/public/_nuxt/{Cp2MA0cm.js → DWhzQg7B.js} +1 -1
- package/.output/public/_nuxt/{DJMS2og1.js → D_vK6VPK.js} +1 -1
- package/.output/public/_nuxt/{CihWZmJe.js → DaBp0Gba.js} +2 -2
- package/.output/public/_nuxt/DaH2FbAy.js +1 -0
- package/.output/public/_nuxt/{CtYFj7k1.js → DaJo0CeV.js} +1 -1
- package/.output/public/_nuxt/DauLdT7p.js +1 -0
- package/.output/public/_nuxt/{DG-T44jj.js → DdPA4eTX.js} +1 -1
- package/.output/public/_nuxt/{YuTZB7sD.js → DeAGWdWK.js} +1 -1
- package/.output/public/_nuxt/{CitkKxhw.js → DfF1qofg.js} +1 -1
- package/.output/public/_nuxt/{Daz4MeL6.js → DiGBA-aA.js} +1 -1
- package/.output/public/_nuxt/DiJxF69i.js +1 -0
- package/.output/public/_nuxt/{DIoI0uJm.js → DkBIU-1F.js} +1 -1
- package/.output/public/_nuxt/DmAM6bZ0.js +1 -0
- package/.output/public/_nuxt/DmeAKr3J.js +1 -0
- package/.output/public/_nuxt/DmmTnMzZ.js +1 -0
- package/.output/public/_nuxt/{Lwdv_RKd.js → DqsUSndS.js} +1 -1
- package/.output/public/_nuxt/Dvw-hR3Y.js +1 -0
- package/.output/public/_nuxt/{CVgTJeSq.js → Dz6sfh81.js} +1 -1
- package/.output/public/_nuxt/{BYjadNrw.js → FNhYm5FX.js} +1 -1
- package/.output/public/_nuxt/{Nb2jBtYT.js → HOeKUnra.js} +1 -1
- package/.output/public/_nuxt/{CtchsY6e.js → IR1jkN7B.js} +1 -1
- package/.output/public/_nuxt/{DCzfkCGa.js → MpTk6K7N.js} +1 -1
- package/.output/public/_nuxt/NZ7Wz6LP.js +1 -0
- package/.output/public/_nuxt/{DfQu3kEw.js → PqWbiAD2.js} +1 -1
- package/.output/public/_nuxt/{Jez9DHn7.js → Tu4FhMRc.js} +1 -1
- package/.output/public/_nuxt/{B3y_Qqox.js → UKPXYG4z.js} +1 -1
- package/.output/public/_nuxt/{BlAZO7nq.js → UO2Y9Nve.js} +1 -1
- package/.output/public/_nuxt/{KKK6HVeG.js → XHiJSquP.js} +1 -1
- package/.output/public/_nuxt/YGWAImQo.js +1 -0
- package/.output/public/_nuxt/{ghuJ76mD.js → ZR87XvwB.js} +1 -1
- package/.output/public/_nuxt/{yNrp2XvX.js → _E89BQAO.js} +1 -1
- package/.output/public/_nuxt/{C_BdYLzz.js → aiXk7zRt.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/91727fcc-bf7f-407f-9b1e-092017fcfee0.json +1 -0
- package/.output/public/_nuxt/cL7whuPe.js +1 -0
- package/.output/public/_nuxt/{BasgsT_S.js → ct6_k5IW.js} +1 -1
- package/.output/public/_nuxt/entry._7ZkP07A.css +1 -0
- package/.output/public/_nuxt/{DTDgHTuh.js → fEUQvmn8.js} +2 -2
- package/.output/public/_nuxt/{FNC8XZTk.js → gGlaVUMD.js} +1 -1
- package/.output/public/_nuxt/gjmGkVlL.js +1 -0
- package/.output/public/_nuxt/{IRSbVPIu.js → m5001Uvl.js} +1 -1
- package/.output/public/_nuxt/{_CYZi8HN.js → mQkFCz_M.js} +1 -1
- package/.output/public/_nuxt/{BxXOsXrM.js → p9l1LjVc.js} +10 -10
- package/.output/public/_nuxt/{BsEZoHd1.js → qR_K5W8V.js} +1 -1
- package/.output/public/_nuxt/{BrNqhp1a.js → t_9QQ4MF.js} +7 -7
- package/.output/public/_nuxt/{pcUI-zuY.js → uc4c4mfb.js} +1 -1
- package/.output/public/_nuxt/{usage.vakN1lvi.css → usage.BDeyCZwW.css} +1 -1
- package/.output/public/_nuxt/wPSLEMBw.js +1 -0
- package/.output/public/_nuxt/xKRwul0f.js +1 -0
- package/.output/public/_nuxt/{BWhMnjID.js → xgpiGSxb.js} +1 -1
- package/.output/public/_nuxt/xxnk7j0F.js +1 -0
- package/.output/public/favicon.svg +1 -0
- package/.output/server/chunks/build/A-BWukSPjS.mjs +1 -0
- package/.output/server/chunks/build/Accordion-BaJYea6e.mjs +1 -0
- package/.output/server/chunks/build/AccordionItem-DdG2zgcN.mjs +1 -0
- package/.output/server/chunks/build/Badge-BrU9UkCv.mjs +1 -0
- package/.output/server/chunks/build/Blockquote-DND8wTkU.mjs +1 -0
- package/.output/server/chunks/build/Callout-1halpaEg.mjs +1 -0
- package/.output/server/chunks/build/Card-BHCSDKDt.mjs +1 -0
- package/.output/server/chunks/build/CardGroup-BOuJcNGp.mjs +1 -0
- package/.output/server/chunks/build/Caution-BP3y-TcC.mjs +1 -0
- package/.output/server/chunks/build/Code-B1xkAS5a.mjs +1 -0
- package/.output/server/chunks/build/CodeCollapse-BIhaNa22.mjs +1 -0
- package/.output/server/chunks/build/CodeGroup-BviYyCuo.mjs +1 -0
- package/.output/server/chunks/build/CodeIcon-CWD5HcV7.mjs +2 -1
- package/.output/server/chunks/build/CodePreview-D8PsCQ6m.mjs +1 -0
- package/.output/server/chunks/build/CodeTree-BUTLupmL.mjs +1 -0
- package/.output/server/chunks/build/Collapsible-BIvXNaSq.mjs +1 -0
- package/.output/server/chunks/build/DropdownMenu-BBrV9nXz.mjs +1 -1
- package/.output/server/chunks/build/EditorToolbar-DIfb5arC.mjs +1 -1
- package/.output/server/chunks/build/Em-DsIz_BnD.mjs +1 -0
- package/.output/server/chunks/build/Field-cwwmSQDT.mjs +1 -0
- package/.output/server/chunks/build/FieldGroup-CAIpQv8s.mjs +1 -0
- package/.output/server/chunks/build/H1-BbFNsPyP.mjs +1 -0
- package/.output/server/chunks/build/H2-vHTl_pWr.mjs +1 -0
- package/.output/server/chunks/build/H3-7eTcfO3s.mjs +1 -0
- package/.output/server/chunks/build/H4-C89p_PKO.mjs +1 -0
- package/.output/server/chunks/build/Hr-Bm8RlL3O.mjs +1 -0
- package/.output/server/chunks/build/Icon-Dp9iy0BI.mjs +1 -0
- package/.output/server/chunks/build/Img-CWLmvN1t.mjs +2 -1
- package/.output/server/chunks/build/Kbd-CQG6I_Ch.mjs +1 -0
- package/.output/server/chunks/build/Li-Bw1QUaGv.mjs +1 -0
- package/.output/server/chunks/build/MDC-Dx0YPDhe.mjs +1 -1
- package/.output/server/chunks/build/Note-CHkjm9jm.mjs +1 -0
- package/.output/server/chunks/build/Ol-D-fPnfFM.mjs +1 -0
- package/.output/server/chunks/build/P-B5YI1V9y.mjs +1 -0
- package/.output/server/chunks/build/Pre-ChiJcf3C.mjs +1 -0
- package/.output/server/chunks/build/ProseH5-DahJyv8h.mjs +1 -0
- package/.output/server/chunks/build/ProseH6-C4Is5h6c.mjs +1 -0
- package/.output/server/chunks/build/Select-BB1oLrCD.mjs +1 -1
- package/.output/server/chunks/build/SelectMenu-DPssg6zD.mjs +1 -1
- package/.output/server/chunks/build/Steps-BZpvXfzb.mjs +1 -0
- package/.output/server/chunks/build/Strong-DXJqOWL3.mjs +1 -0
- package/.output/server/chunks/build/Table-BSrLZ7dt.mjs +1 -0
- package/.output/server/chunks/build/Table-DCwTlhCj.mjs +1 -1
- package/.output/server/chunks/build/Tabs-Dk3nvOFF.mjs +1 -0
- package/.output/server/chunks/build/TabsItem-CDhyuBtJ.mjs +1 -0
- package/.output/server/chunks/build/Tbody-CjMT5oH-.mjs +1 -0
- package/.output/server/chunks/build/Td-ZBVaEjFN.mjs +1 -0
- package/.output/server/chunks/build/Th-D317icbd.mjs +1 -0
- package/.output/server/chunks/build/Thead-Ca_ZESTK.mjs +1 -0
- package/.output/server/chunks/build/Tip-CP3oTARR.mjs +1 -0
- package/.output/server/chunks/build/Tooltip-TRyl6dje.mjs +1 -1
- package/.output/server/chunks/build/Tr-6jI8j9gD.mjs +1 -0
- package/.output/server/chunks/build/{docs-Dk2JnYq3.mjs → Tree-DUhXKd8y.mjs} +46 -2235
- package/.output/server/chunks/build/Tree-DUhXKd8y.mjs.map +1 -0
- package/.output/server/chunks/build/Ul-BUGj_CPb.mjs +1 -0
- package/.output/server/chunks/build/Warning-BJ8G6cxC.mjs +1 -0
- package/.output/server/chunks/build/_id_-DN00UDdO.mjs +1 -0
- package/.output/server/chunks/build/_id_-DN00UDdO.mjs.map +1 -1
- package/.output/server/chunks/build/_name_-BnS_KEfX.mjs +1592 -0
- package/.output/server/chunks/build/_name_-BnS_KEfX.mjs.map +1 -0
- package/.output/server/chunks/build/{_uuid_-0UgdUhfY.mjs → _uuid_-DfJaumTE.mjs} +5 -4
- package/.output/server/chunks/build/{_uuid_-0UgdUhfY.mjs.map → _uuid_-DfJaumTE.mjs.map} +1 -1
- package/.output/server/chunks/build/auth-BGPNH2QJ.mjs +20 -0
- package/.output/server/chunks/build/auth-BGPNH2QJ.mjs.map +1 -0
- package/.output/server/chunks/build/auth-CvD7MqKW.mjs +1 -0
- package/.output/server/chunks/build/auth-CvD7MqKW.mjs.map +1 -1
- package/.output/server/chunks/build/chat-CZMiB68R.mjs +1 -0
- package/.output/server/chunks/build/chat-CZMiB68R.mjs.map +1 -1
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/cookie-C_iulBi6.mjs +1 -1
- package/.output/server/chunks/build/{dashboard-YEscLBQN.mjs → dashboard-CLk1NlbR.mjs} +15 -4
- package/.output/server/chunks/build/dashboard-CLk1NlbR.mjs.map +1 -0
- package/.output/server/chunks/build/{dashboard-CpMVYnDV.mjs → dashboard-CiVTAZuF.mjs} +12 -4
- package/.output/server/chunks/build/{dashboard-CpMVYnDV.mjs.map → dashboard-CiVTAZuF.mjs.map} +1 -1
- package/.output/server/chunks/build/docs-ChGwOPg5.mjs +2204 -0
- package/.output/server/chunks/build/docs-ChGwOPg5.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-BzbcNcdU.mjs +1 -0
- package/.output/server/chunks/build/error-500-uCDjGRW8.mjs +1 -0
- package/.output/server/chunks/build/fetch-BB7Qzkwe.mjs +1 -1
- package/.output/server/chunks/build/{hooks-DP8WoUPS.mjs → hooks-D328DcO6.mjs} +3 -2
- package/.output/server/chunks/build/hooks-D328DcO6.mjs.map +1 -0
- package/.output/server/chunks/build/{index-DVx-QlhP.mjs → index-Byt-3Yq6.mjs} +3 -2
- package/.output/server/chunks/build/{index-DVx-QlhP.mjs.map → index-Byt-3Yq6.mjs.map} +1 -1
- package/.output/server/chunks/build/{index-Ba_bPJgk.mjs → index-C9PuieXh.mjs} +3 -2
- package/.output/server/chunks/build/index-C9PuieXh.mjs.map +1 -0
- package/.output/server/chunks/build/index-C_LcBBgO.mjs +1508 -0
- package/.output/server/chunks/build/index-C_LcBBgO.mjs.map +1 -0
- package/.output/server/chunks/build/index-CxDxc9fm.mjs +1 -1
- package/.output/server/chunks/build/index-DzdvIi8V.mjs +1 -0
- package/.output/server/chunks/build/library-CbWcF5wT.mjs +601 -0
- package/.output/server/chunks/build/library-CbWcF5wT.mjs.map +1 -0
- package/.output/server/chunks/build/{login-BAysbpyX.mjs → login-DnnElTl2.mjs} +15 -7
- package/.output/server/chunks/build/{login-BAysbpyX.mjs.map → login-DnnElTl2.mjs.map} +1 -1
- package/.output/server/chunks/build/memories-BqA719O1.mjs +1 -0
- package/.output/server/chunks/build/memories-BqA719O1.mjs.map +1 -1
- package/.output/server/chunks/build/server.mjs +62 -34
- package/.output/server/chunks/build/server.mjs.map +1 -1
- package/.output/server/chunks/build/settings-DdkKCJ00.mjs +1 -0
- package/.output/server/chunks/build/settings-DdkKCJ00.mjs.map +1 -1
- package/.output/server/chunks/build/styles.mjs +2 -2
- package/.output/server/chunks/build/{tasks-DiOi1HG_.mjs → tasks-DnAFqbtt.mjs} +3 -2
- package/.output/server/chunks/build/tasks-DnAFqbtt.mjs.map +1 -0
- package/.output/server/chunks/build/{usage-H_mcd_fz.mjs → usage-CSrBh4Or.mjs} +159 -44
- package/.output/server/chunks/build/{usage-H_mcd_fz.mjs.map → usage-CSrBh4Or.mjs.map} +1 -1
- package/.output/server/chunks/build/{usePreferences-CzC8fRzd.mjs → usePreferences-DH1QjxOj.mjs} +7 -1
- package/.output/server/chunks/build/usePreferences-DH1QjxOj.mjs.map +1 -0
- package/.output/server/chunks/build/{view-Dc8mvzCB.mjs → view-n2sYa4Zh.mjs} +4 -3
- package/.output/server/chunks/build/{view-Dc8mvzCB.mjs.map → view-n2sYa4Zh.mjs.map} +1 -1
- package/.output/server/chunks/build/virtual_nuxt__Users_tony_Documents_GitHub_second-brain_node_modules_.cache_nuxt_.nuxt_mdc-imports-PtwWlZ2H.mjs +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +1247 -824
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/_ws/chat.mjs +2 -1
- package/.output/server/chunks/routes/_ws/chat.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id/cancel.post.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id/cancel.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id/run.post.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id/run.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id/runs.get.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id/runs.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id/stats.get.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/stats.get.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/_...all_.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/_...all_.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/conversations/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/conversations/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/dashboard/overview.get.mjs +1 -0
- package/.output/server/chunks/routes/api/dashboard/overview.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/_id/public.get.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/_id/public.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/_id/restore.post.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/_id/restore.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/by-path.post.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/by-path.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/index.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/index.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/index.put.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/index.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/delete.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/delete.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/list.get.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/list.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/mkdir.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/mkdir.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/move.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/move.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/read.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/read.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/rename.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/rename.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/write.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/write.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -0
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/home.get.mjs +1 -0
- package/.output/server/chunks/routes/api/home.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/hooks/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/hooks/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/hooks/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/hooks/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/hooks/stats.get.mjs +1 -0
- package/.output/server/chunks/routes/api/hooks/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get6.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get6.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get7.mjs +40 -38
- package/.output/server/chunks/routes/api/index.get7.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get8.mjs +33 -38
- package/.output/server/chunks/routes/api/index.get8.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get9.mjs +83 -0
- package/.output/server/chunks/routes/api/index.get9.mjs.map +1 -0
- package/.output/server/chunks/routes/api/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +1 -0
- package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +1 -0
- package/.output/server/chunks/routes/api/index.post3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +1 -0
- package/.output/server/chunks/routes/api/index.post4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.put.mjs +1 -0
- package/.output/server/chunks/routes/api/index.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/memory/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/context.get.mjs +1 -0
- package/.output/server/chunks/routes/api/memory/context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/extract.post.mjs +2 -1
- package/.output/server/chunks/routes/api/memory/extract.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/search.get.mjs +1 -0
- package/.output/server/chunks/routes/api/memory/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/store.post.mjs +1 -0
- package/.output/server/chunks/routes/api/memory/store.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/index.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/index.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/index.put.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/index.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/secrets/_key_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/secrets/_key_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/secrets/_key_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/secrets/_key_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/secrets/_key_.put.mjs +1 -0
- package/.output/server/chunks/routes/api/secrets/_key_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/skills/_name/export.get.mjs +72 -0
- package/.output/server/chunks/routes/api/skills/_name/export.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/files/create.post.mjs +73 -0
- package/.output/server/chunks/routes/api/skills/_name/files/create.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/files/delete.post.mjs +71 -0
- package/.output/server/chunks/routes/api/skills/_name/files/delete.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/files/read.post.mjs +69 -0
- package/.output/server/chunks/routes/api/skills/_name/files/read.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/files/write.post.mjs +69 -0
- package/.output/server/chunks/routes/api/skills/_name/files/write.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/index.get.mjs +60 -0
- package/.output/server/chunks/routes/api/skills/_name/index.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/rename.post.mjs +87 -0
- package/.output/server/chunks/routes/api/skills/_name/rename.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/toggle.post.mjs +62 -0
- package/.output/server/chunks/routes/api/skills/_name/toggle.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/create.post.mjs +79 -0
- package/.output/server/chunks/routes/api/skills/create.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/generate.post.mjs +143 -0
- package/.output/server/chunks/routes/api/skills/generate.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/import.post.mjs +96 -0
- package/.output/server/chunks/routes/api/skills/import.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/index.get.mjs +82 -0
- package/.output/server/chunks/routes/api/skills/index.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/index.get2.mjs +83 -0
- package/.output/server/chunks/routes/api/skills/index.get2.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/library/check-updates.get.mjs +72 -0
- package/.output/server/chunks/routes/api/skills/library/check-updates.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/library/install.post.mjs +90 -0
- package/.output/server/chunks/routes/api/skills/library/install.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/tasks/_id/restore.post.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/_id/restore.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tasks/index.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/index.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tasks/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tasks/index.put.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/index.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tasks/tags.get.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/tags.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/usage/stats.get.mjs +4 -1
- package/.output/server/chunks/routes/api/usage/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/user/email.patch.mjs +2 -1
- package/.output/server/chunks/routes/api/user/email.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/notifications.mjs +2 -1
- package/.output/server/chunks/routes/notifications.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/routes/terminal.mjs +2 -1
- package/.output/server/chunks/routes/terminal.mjs.map +1 -1
- package/.output/server/index.mjs +2 -1
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/node_modules/adm-zip/adm-zip.js +949 -0
- package/.output/server/node_modules/adm-zip/headers/entryHeader.js +374 -0
- package/.output/server/node_modules/adm-zip/headers/index.js +2 -0
- package/.output/server/node_modules/adm-zip/headers/mainHeader.js +130 -0
- package/.output/server/node_modules/adm-zip/methods/deflater.js +33 -0
- package/.output/server/node_modules/adm-zip/methods/index.js +3 -0
- package/.output/server/node_modules/adm-zip/methods/inflater.js +34 -0
- package/.output/server/node_modules/adm-zip/methods/zipcrypto.js +175 -0
- package/.output/server/node_modules/adm-zip/package.json +49 -0
- package/.output/server/node_modules/adm-zip/util/constants.js +142 -0
- package/.output/server/node_modules/adm-zip/util/decoder.js +5 -0
- package/.output/server/node_modules/adm-zip/util/errors.js +63 -0
- package/.output/server/node_modules/adm-zip/util/fattr.js +76 -0
- package/.output/server/node_modules/adm-zip/util/index.js +5 -0
- package/.output/server/node_modules/adm-zip/util/utils.js +336 -0
- package/.output/server/node_modules/adm-zip/zipEntry.js +405 -0
- package/.output/server/node_modules/adm-zip/zipFile.js +446 -0
- package/.output/server/package.json +2 -1
- package/Claude/CLAUDE.md +9 -4
- package/Claude/skills/environment/SKILL.md +6 -0
- package/Claude/skills/memory/SKILL.md +6 -0
- package/Claude/skills/project/SKILL.md +6 -0
- package/Claude/skills/secret/SKILL.md +85 -0
- package/Claude/skills/secret/secret.py +146 -0
- package/Claude/skills/skill-creator/SKILL.md +30 -0
- package/Claude/skills/task/SKILL.md +6 -0
- package/README.md +3 -0
- package/app/app.vue +1 -1
- package/app/components/dashboard/StatCards.vue +21 -2
- package/app/components/skills/Card.vue +82 -0
- package/app/components/skills/CreateModal.vue +156 -0
- package/app/components/skills/Editor.vue +135 -0
- package/app/components/skills/FileTree.vue +336 -0
- package/app/components/skills/LibraryCard.vue +122 -0
- package/app/components/skills/RenameModal.vue +84 -0
- package/app/components/usage/UsageCostChart.client.vue +59 -23
- package/app/components/usage/UsageCostChart.server.vue +1 -0
- package/app/components/usage/UsageSourceDonut.client.vue +17 -5
- package/app/components/usage/UsageSourceDonut.server.vue +1 -0
- package/app/components/usage/UsageTopConsumers.vue +13 -3
- package/app/composables/usePreferences.ts +9 -1
- package/app/layouts/auth.vue +0 -10
- package/app/layouts/dashboard.vue +7 -0
- package/app/pages/login.vue +18 -8
- package/app/pages/skills/[name].vue +210 -0
- package/app/pages/skills/index.vue +204 -0
- package/app/pages/skills/library.vue +209 -0
- package/app/pages/usage.vue +43 -16
- package/dist/cli/index.js +35 -36
- package/nuxt.config.ts +9 -0
- package/package.json +5 -3
- package/server/api/skills/[name]/export.get.ts +45 -0
- package/server/api/skills/[name]/files/create.post.ts +45 -0
- package/server/api/skills/[name]/files/delete.post.ts +45 -0
- package/server/api/skills/[name]/files/index.get.ts +28 -0
- package/server/api/skills/[name]/files/read.post.ts +41 -0
- package/server/api/skills/[name]/files/write.post.ts +42 -0
- package/server/api/skills/[name]/index.get.ts +54 -0
- package/server/api/skills/[name]/rename.post.ts +64 -0
- package/server/api/skills/[name]/toggle.post.ts +32 -0
- package/server/api/skills/create.post.ts +51 -0
- package/server/api/skills/generate.post.ts +126 -0
- package/server/api/skills/import.post.ts +87 -0
- package/server/api/skills/index.get.ts +57 -0
- package/server/api/skills/library/check-updates.get.ts +46 -0
- package/server/api/skills/library/index.get.ts +56 -0
- package/server/api/skills/library/install.post.ts +73 -0
- package/server/api/usage/stats.get.ts +4 -2
- package/server/db/schema.ts +17 -0
- package/server/drizzle/migrations/0012_good_deadpool.sql +12 -0
- package/server/drizzle/migrations/0013_swift_snowbird.sql +1 -0
- package/server/drizzle/migrations/meta/0012_snapshot.json +1713 -0
- package/server/drizzle/migrations/meta/0013_snapshot.json +1720 -0
- package/server/drizzle/migrations/meta/_journal.json +14 -0
- package/server/middleware/auth.ts +0 -1
- package/server/plugins/05.skills-catalog.ts +105 -0
- package/server/utils/skills-path.ts +197 -0
- package/shared/types/index.ts +65 -1
- package/.output/public/_nuxt/5ZXA0Ckq.js +0 -1
- package/.output/public/_nuxt/BIIJhjQO.js +0 -1
- package/.output/public/_nuxt/BIckl6wA.js +0 -1
- package/.output/public/_nuxt/BJ3o57WW.js +0 -1
- package/.output/public/_nuxt/BNetzZzF.js +0 -1
- package/.output/public/_nuxt/BS0ofHJK.js +0 -1
- package/.output/public/_nuxt/B_3_hrpn.js +0 -1
- package/.output/public/_nuxt/BaBZjmMC.js +0 -1
- package/.output/public/_nuxt/BaMqDm5u.js +0 -1
- package/.output/public/_nuxt/BhzMoffi.js +0 -1
- package/.output/public/_nuxt/BlhFigLL.js +0 -1
- package/.output/public/_nuxt/BoIxv-gM.js +0 -1
- package/.output/public/_nuxt/Br19oYkq.js +0 -1
- package/.output/public/_nuxt/C0kh_F7v.js +0 -1
- package/.output/public/_nuxt/C61KgSco.js +0 -1
- package/.output/public/_nuxt/CJUdYEdO.js +0 -1
- package/.output/public/_nuxt/CVJQGP1Q.js +0 -1
- package/.output/public/_nuxt/CWMUi89H.js +0 -1
- package/.output/public/_nuxt/Cdu2qGgq.js +0 -1
- package/.output/public/_nuxt/CeIu7z4p.js +0 -1
- package/.output/public/_nuxt/D2689qk4.js +0 -1
- package/.output/public/_nuxt/D31L7Ks6.js +0 -1
- package/.output/public/_nuxt/DB359q8R.js +0 -1
- package/.output/public/_nuxt/DHG66LPS.js +0 -1
- package/.output/public/_nuxt/DJ5V-y_x.js +0 -1
- package/.output/public/_nuxt/DLETdGFL.js +0 -1
- package/.output/public/_nuxt/DOICd-Ld.js +0 -1
- package/.output/public/_nuxt/DPEcH-gi.js +0 -65
- package/.output/public/_nuxt/Db8-_gO7.js +0 -1
- package/.output/public/_nuxt/DgV-EDJ9.js +0 -1
- package/.output/public/_nuxt/Dp2X5R2m.js +0 -1
- package/.output/public/_nuxt/DqB723Z0.js +0 -1
- package/.output/public/_nuxt/Q8Ps7oN5.js +0 -1
- package/.output/public/_nuxt/SXTDhzp6.js +0 -1
- package/.output/public/_nuxt/Sg2Lwc46.js +0 -1
- package/.output/public/_nuxt/_J_7XIn-.js +0 -1
- package/.output/public/_nuxt/builds/meta/a1e9100c-1a4f-4f7e-bb53-9dbe0d07effb.json +0 -1
- package/.output/public/_nuxt/entry.CGxIBGAf.css +0 -1
- package/.output/public/_nuxt/inmzPrjz.js +0 -1
- package/.output/public/_nuxt/oIX-ZDN6.js +0 -1
- package/.output/server/chunks/build/auth-CDHRohj4.mjs +0 -77
- package/.output/server/chunks/build/auth-CDHRohj4.mjs.map +0 -1
- package/.output/server/chunks/build/dashboard-YEscLBQN.mjs.map +0 -1
- package/.output/server/chunks/build/docs-Dk2JnYq3.mjs.map +0 -1
- package/.output/server/chunks/build/hooks-DP8WoUPS.mjs.map +0 -1
- package/.output/server/chunks/build/index-Ba_bPJgk.mjs.map +0 -1
- package/.output/server/chunks/build/tasks-DiOi1HG_.mjs.map +0 -1
- package/.output/server/chunks/build/usePreferences-CzC8fRzd.mjs.map +0 -1
- /package/.output/public/_nuxt/{useCopyToClipboard.Be_IvFWy.css → CodeEditor.Be_IvFWy.css} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { VisSingleContainer, VisDonut } from '@unovis/vue'
|
|
3
|
-
import type { TokenUsageSource } from '~~/shared/types'
|
|
3
|
+
import type { TokenUsageSource, UsageDisplayMode } from '~~/shared/types'
|
|
4
4
|
|
|
5
5
|
interface SourceData {
|
|
6
6
|
source: TokenUsageSource
|
|
@@ -12,6 +12,7 @@ interface SourceData {
|
|
|
12
12
|
const props = defineProps<{
|
|
13
13
|
data: SourceData[]
|
|
14
14
|
title?: string
|
|
15
|
+
displayMode?: UsageDisplayMode
|
|
15
16
|
}>()
|
|
16
17
|
|
|
17
18
|
const sourceLabels: Record<TokenUsageSource, string> = {
|
|
@@ -26,10 +27,19 @@ const sourceColors: Record<TokenUsageSource, string> = {
|
|
|
26
27
|
memory_extraction: 'var(--ui-info)'
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
const
|
|
30
|
+
const isTokens = computed(() => props.displayMode === 'tokens')
|
|
31
|
+
const value = (d: SourceData) => isTokens.value ? d.tokens : d.cost
|
|
30
32
|
const color = (d: SourceData) => sourceColors[d.source] || 'var(--ui-neutral)'
|
|
31
33
|
|
|
32
|
-
const
|
|
34
|
+
const total = computed(() =>
|
|
35
|
+
props.data.reduce((sum, d) => sum + (isTokens.value ? d.tokens : d.cost), 0)
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
function formatTokens(v: number): string {
|
|
39
|
+
if (v >= 1_000_000) return `${(v / 1_000_000).toFixed(1)}M`
|
|
40
|
+
if (v >= 1_000) return `${(v / 1_000).toFixed(1)}K`
|
|
41
|
+
return String(v)
|
|
42
|
+
}
|
|
33
43
|
</script>
|
|
34
44
|
|
|
35
45
|
<template>
|
|
@@ -81,9 +91,11 @@ const totalCost = computed(() => props.data.reduce((sum, d) => sum + d.cost, 0))
|
|
|
81
91
|
<span class="text-sm font-medium">{{ sourceLabels[item.source] }}</span>
|
|
82
92
|
</div>
|
|
83
93
|
<div class="text-right">
|
|
84
|
-
<span class="text-sm font-semibold"
|
|
94
|
+
<span class="text-sm font-semibold">
|
|
95
|
+
{{ isTokens ? formatTokens(item.tokens) : `$${item.cost.toFixed(2)}` }}
|
|
96
|
+
</span>
|
|
85
97
|
<span class="text-xs text-muted ml-2">
|
|
86
|
-
{{
|
|
98
|
+
{{ total > 0 ? Math.round(((isTokens ? item.tokens : item.cost) / total) * 100) : 0 }}%
|
|
87
99
|
</span>
|
|
88
100
|
</div>
|
|
89
101
|
</div>
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import type { TokenUsageSource } from '~~/shared/types'
|
|
2
|
+
import type { TokenUsageSource, UsageDisplayMode } from '~~/shared/types'
|
|
3
3
|
|
|
4
4
|
interface Consumer {
|
|
5
5
|
name: string
|
|
6
6
|
source: TokenUsageSource
|
|
7
7
|
cost: number
|
|
8
8
|
calls: number
|
|
9
|
+
tokens: number
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
defineProps<{
|
|
12
|
+
const props = defineProps<{
|
|
12
13
|
data: Consumer[]
|
|
13
14
|
title?: string
|
|
15
|
+
displayMode?: UsageDisplayMode
|
|
14
16
|
}>()
|
|
15
17
|
|
|
16
18
|
const sourceLabels: Record<TokenUsageSource, string> = {
|
|
@@ -25,10 +27,18 @@ const sourceColors = {
|
|
|
25
27
|
memory_extraction: 'info'
|
|
26
28
|
} as const
|
|
27
29
|
|
|
30
|
+
const isTokens = computed(() => props.displayMode === 'tokens')
|
|
31
|
+
|
|
28
32
|
function formatCurrency(value: number): string {
|
|
29
33
|
if (value < 0.01 && value > 0) return '<$0.01'
|
|
30
34
|
return `$${value.toFixed(4)}`
|
|
31
35
|
}
|
|
36
|
+
|
|
37
|
+
function formatTokens(value: number): string {
|
|
38
|
+
if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`
|
|
39
|
+
if (value >= 1_000) return `${(value / 1_000).toFixed(1)}K`
|
|
40
|
+
return String(value)
|
|
41
|
+
}
|
|
32
42
|
</script>
|
|
33
43
|
|
|
34
44
|
<template>
|
|
@@ -77,7 +87,7 @@ function formatCurrency(value: number): string {
|
|
|
77
87
|
|
|
78
88
|
<div class="text-right shrink-0 ml-4">
|
|
79
89
|
<p class="text-sm font-semibold">
|
|
80
|
-
{{ formatCurrency(item.cost) }}
|
|
90
|
+
{{ isTokens ? formatTokens(item.tokens) : formatCurrency(item.cost) }}
|
|
81
91
|
</p>
|
|
82
92
|
<p class="text-xs text-muted">
|
|
83
93
|
{{ item.calls }} {{ item.calls === 1 ? 'call' : 'calls' }}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TaskStatus } from '~~/shared/types'
|
|
1
|
+
import type { TaskStatus, UsageDisplayMode } from '~~/shared/types'
|
|
2
2
|
|
|
3
3
|
interface Preferences {
|
|
4
4
|
// Editor preferences
|
|
@@ -24,6 +24,7 @@ interface Preferences {
|
|
|
24
24
|
|
|
25
25
|
// Usage stats
|
|
26
26
|
usageStatsPeriod: '24h' | '7d' | '30d'
|
|
27
|
+
usageDisplayMode: UsageDisplayMode
|
|
27
28
|
|
|
28
29
|
// Onboarding
|
|
29
30
|
onboardingDismissed: boolean
|
|
@@ -45,6 +46,7 @@ const defaults: Preferences = {
|
|
|
45
46
|
taskProjectFilter: null,
|
|
46
47
|
agentStatsPeriod: '7d',
|
|
47
48
|
usageStatsPeriod: '7d',
|
|
49
|
+
usageDisplayMode: 'tokens',
|
|
48
50
|
onboardingDismissed: false
|
|
49
51
|
}
|
|
50
52
|
|
|
@@ -123,6 +125,11 @@ export function usePreferences() {
|
|
|
123
125
|
set: v => set('usageStatsPeriod', v)
|
|
124
126
|
})
|
|
125
127
|
|
|
128
|
+
const usageDisplayMode = computed({
|
|
129
|
+
get: () => get('usageDisplayMode'),
|
|
130
|
+
set: v => set('usageDisplayMode', v)
|
|
131
|
+
})
|
|
132
|
+
|
|
126
133
|
const onboardingDismissed = computed({
|
|
127
134
|
get: () => get('onboardingDismissed'),
|
|
128
135
|
set: v => set('onboardingDismissed', v)
|
|
@@ -146,6 +153,7 @@ export function usePreferences() {
|
|
|
146
153
|
taskProjectFilter,
|
|
147
154
|
agentStatsPeriod,
|
|
148
155
|
usageStatsPeriod,
|
|
156
|
+
usageDisplayMode,
|
|
149
157
|
onboardingDismissed
|
|
150
158
|
}
|
|
151
159
|
}
|
package/app/layouts/auth.vue
CHANGED
|
@@ -4,16 +4,6 @@
|
|
|
4
4
|
<template>
|
|
5
5
|
<div class="min-h-screen flex items-center justify-center bg-default">
|
|
6
6
|
<div class="w-full max-w-md px-4">
|
|
7
|
-
<div class="flex flex-col items-center gap-6 mb-8">
|
|
8
|
-
<div class="flex items-center gap-3">
|
|
9
|
-
<UIcon
|
|
10
|
-
name="i-lucide-brain"
|
|
11
|
-
class="size-10 text-primary"
|
|
12
|
-
/>
|
|
13
|
-
<span class="font-bold text-2xl">Cognova</span>
|
|
14
|
-
</div>
|
|
15
|
-
</div>
|
|
16
|
-
|
|
17
7
|
<slot />
|
|
18
8
|
</div>
|
|
19
9
|
</div>
|
package/app/pages/login.vue
CHANGED
|
@@ -49,12 +49,22 @@ async function handleSubmit(event: { data: { email: string, password: string } }
|
|
|
49
49
|
</script>
|
|
50
50
|
|
|
51
51
|
<template>
|
|
52
|
-
<
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
<div>
|
|
53
|
+
<div class="flex flex-col items-center gap-6 mb-8">
|
|
54
|
+
<div class="flex items-center gap-3">
|
|
55
|
+
<UIcon
|
|
56
|
+
name="i-lucide-brain"
|
|
57
|
+
class="size-10 text-primary"
|
|
58
|
+
/>
|
|
59
|
+
<span class="font-bold text-2xl">Cognova</span>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
<UAuthForm
|
|
63
|
+
title="Sign In"
|
|
64
|
+
description="Enter your credentials to access your account"
|
|
65
|
+
:fields="fields"
|
|
66
|
+
:submit="{ label: 'Sign In', loading }"
|
|
67
|
+
@submit="handleSubmit"
|
|
68
|
+
/>
|
|
69
|
+
</div>
|
|
60
70
|
</template>
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { SkillDetail } from '~~/shared/types'
|
|
3
|
+
|
|
4
|
+
definePageMeta({
|
|
5
|
+
layout: 'dashboard',
|
|
6
|
+
middleware: 'auth'
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
const route = useRoute()
|
|
10
|
+
const router = useRouter()
|
|
11
|
+
const toast = useToast()
|
|
12
|
+
|
|
13
|
+
const skillName = computed(() => route.params.name as string)
|
|
14
|
+
const skill = ref<SkillDetail | null>(null)
|
|
15
|
+
const loading = ref(true)
|
|
16
|
+
const selectedFile = ref('')
|
|
17
|
+
const renameOpen = ref(false)
|
|
18
|
+
|
|
19
|
+
async function loadSkill() {
|
|
20
|
+
loading.value = true
|
|
21
|
+
try {
|
|
22
|
+
const res = await $fetch<{ data: SkillDetail }>(`/api/skills/${skillName.value}`)
|
|
23
|
+
skill.value = res.data
|
|
24
|
+
|
|
25
|
+
// Auto-select SKILL.md if exists
|
|
26
|
+
if (!selectedFile.value) {
|
|
27
|
+
const skillMd = res.data.files.find(f => f.name === 'SKILL.md')
|
|
28
|
+
if (skillMd) selectedFile.value = skillMd.path
|
|
29
|
+
}
|
|
30
|
+
} catch {
|
|
31
|
+
toast.add({ title: 'Skill not found', color: 'error' })
|
|
32
|
+
router.push('/skills')
|
|
33
|
+
} finally {
|
|
34
|
+
loading.value = false
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function handleToggle() {
|
|
39
|
+
if (!skill.value || skill.value.core) return
|
|
40
|
+
try {
|
|
41
|
+
const res = await $fetch<{ data: { active: boolean } }>(`/api/skills/${skillName.value}/toggle`, {
|
|
42
|
+
method: 'POST'
|
|
43
|
+
})
|
|
44
|
+
skill.value.active = res.data.active
|
|
45
|
+
toast.add({
|
|
46
|
+
title: `${skillName.value} ${res.data.active ? 'enabled' : 'disabled'}`,
|
|
47
|
+
color: 'success'
|
|
48
|
+
})
|
|
49
|
+
} catch {
|
|
50
|
+
toast.add({ title: 'Failed to toggle skill', color: 'error' })
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function handleRenamed(newName: string) {
|
|
55
|
+
router.replace(`/skills/${newName}`)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function handleExport() {
|
|
59
|
+
window.open(`/api/skills/${skillName.value}/export`, '_blank')
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
onMounted(() => loadSkill())
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<template>
|
|
66
|
+
<div class="flex flex-1 min-w-0">
|
|
67
|
+
<!-- File tree sidebar -->
|
|
68
|
+
<UDashboardPanel
|
|
69
|
+
id="skill-filetree"
|
|
70
|
+
collapsible
|
|
71
|
+
resizable
|
|
72
|
+
:min-size="12"
|
|
73
|
+
:default-size="16"
|
|
74
|
+
:max-size="24"
|
|
75
|
+
class="hidden lg:flex"
|
|
76
|
+
>
|
|
77
|
+
<template #header>
|
|
78
|
+
<UDashboardNavbar>
|
|
79
|
+
<template #title>
|
|
80
|
+
<span class="text-sm font-medium truncate">Files</span>
|
|
81
|
+
</template>
|
|
82
|
+
</UDashboardNavbar>
|
|
83
|
+
</template>
|
|
84
|
+
|
|
85
|
+
<template #body>
|
|
86
|
+
<div
|
|
87
|
+
v-if="loading"
|
|
88
|
+
class="p-4 space-y-2"
|
|
89
|
+
>
|
|
90
|
+
<USkeleton
|
|
91
|
+
v-for="i in 4"
|
|
92
|
+
:key="i"
|
|
93
|
+
class="h-6 w-full"
|
|
94
|
+
/>
|
|
95
|
+
</div>
|
|
96
|
+
<SkillsFileTree
|
|
97
|
+
v-else-if="skill"
|
|
98
|
+
:skill-name="skillName"
|
|
99
|
+
:files="skill.files"
|
|
100
|
+
:selected-path="selectedFile"
|
|
101
|
+
@select="selectedFile = $event"
|
|
102
|
+
@refresh="loadSkill"
|
|
103
|
+
/>
|
|
104
|
+
</template>
|
|
105
|
+
</UDashboardPanel>
|
|
106
|
+
|
|
107
|
+
<!-- Editor panel -->
|
|
108
|
+
<UDashboardPanel
|
|
109
|
+
id="skill-editor"
|
|
110
|
+
grow
|
|
111
|
+
:ui="{ body: '!p-0' }"
|
|
112
|
+
>
|
|
113
|
+
<template #header>
|
|
114
|
+
<UDashboardNavbar>
|
|
115
|
+
<template #title>
|
|
116
|
+
<NuxtLink
|
|
117
|
+
to="/skills"
|
|
118
|
+
class="text-muted hover:text-default transition-colors"
|
|
119
|
+
>
|
|
120
|
+
<UIcon
|
|
121
|
+
name="i-lucide-arrow-left"
|
|
122
|
+
class="size-4"
|
|
123
|
+
/>
|
|
124
|
+
</NuxtLink>
|
|
125
|
+
<span class="font-medium">{{ skillName }}</span>
|
|
126
|
+
<UBadge
|
|
127
|
+
v-if="skill?.core"
|
|
128
|
+
variant="subtle"
|
|
129
|
+
color="primary"
|
|
130
|
+
size="xs"
|
|
131
|
+
>
|
|
132
|
+
Core
|
|
133
|
+
</UBadge>
|
|
134
|
+
<UBadge
|
|
135
|
+
v-if="skill && !skill.active"
|
|
136
|
+
variant="subtle"
|
|
137
|
+
color="neutral"
|
|
138
|
+
size="xs"
|
|
139
|
+
>
|
|
140
|
+
Disabled
|
|
141
|
+
</UBadge>
|
|
142
|
+
</template>
|
|
143
|
+
<template #right>
|
|
144
|
+
<USwitch
|
|
145
|
+
v-if="skill && !skill.core"
|
|
146
|
+
:model-value="skill.active"
|
|
147
|
+
size="sm"
|
|
148
|
+
@update:model-value="handleToggle"
|
|
149
|
+
/>
|
|
150
|
+
<UButton
|
|
151
|
+
v-if="skill && !skill.core"
|
|
152
|
+
icon="i-lucide-pencil"
|
|
153
|
+
variant="ghost"
|
|
154
|
+
color="neutral"
|
|
155
|
+
size="sm"
|
|
156
|
+
@click="renameOpen = true"
|
|
157
|
+
/>
|
|
158
|
+
<UButton
|
|
159
|
+
v-if="skill"
|
|
160
|
+
icon="i-lucide-download"
|
|
161
|
+
variant="ghost"
|
|
162
|
+
color="neutral"
|
|
163
|
+
size="sm"
|
|
164
|
+
@click="handleExport"
|
|
165
|
+
/>
|
|
166
|
+
</template>
|
|
167
|
+
</UDashboardNavbar>
|
|
168
|
+
</template>
|
|
169
|
+
|
|
170
|
+
<template #body>
|
|
171
|
+
<div
|
|
172
|
+
v-if="loading"
|
|
173
|
+
class="flex-1 flex items-center justify-center h-full"
|
|
174
|
+
>
|
|
175
|
+
<UIcon
|
|
176
|
+
name="i-lucide-loader-2"
|
|
177
|
+
class="size-6 animate-spin text-dimmed"
|
|
178
|
+
/>
|
|
179
|
+
</div>
|
|
180
|
+
<div
|
|
181
|
+
v-else-if="!selectedFile"
|
|
182
|
+
class="flex-1 flex items-center justify-center h-full text-dimmed"
|
|
183
|
+
>
|
|
184
|
+
<div class="text-center">
|
|
185
|
+
<UIcon
|
|
186
|
+
name="i-lucide-file-code"
|
|
187
|
+
class="size-12 mx-auto mb-4 opacity-50"
|
|
188
|
+
/>
|
|
189
|
+
<p>Select a file to edit</p>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
<SkillsEditor
|
|
193
|
+
v-else
|
|
194
|
+
:key="selectedFile"
|
|
195
|
+
:skill-name="skillName"
|
|
196
|
+
:file-path="selectedFile"
|
|
197
|
+
@saved="loadSkill"
|
|
198
|
+
/>
|
|
199
|
+
</template>
|
|
200
|
+
</UDashboardPanel>
|
|
201
|
+
|
|
202
|
+
<SkillsRenameModal
|
|
203
|
+
v-if="skill"
|
|
204
|
+
:open="renameOpen"
|
|
205
|
+
:current-name="skillName"
|
|
206
|
+
@update:open="renameOpen = $event"
|
|
207
|
+
@renamed="handleRenamed"
|
|
208
|
+
/>
|
|
209
|
+
</div>
|
|
210
|
+
</template>
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { SkillListItem } from '~~/shared/types'
|
|
3
|
+
|
|
4
|
+
definePageMeta({
|
|
5
|
+
layout: 'dashboard',
|
|
6
|
+
middleware: 'auth'
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
const toast = useToast()
|
|
10
|
+
const skills = ref<SkillListItem[]>([])
|
|
11
|
+
const loading = ref(true)
|
|
12
|
+
const search = ref('')
|
|
13
|
+
const createOpen = ref(false)
|
|
14
|
+
const importing = ref(false)
|
|
15
|
+
const fileInput = ref<HTMLInputElement | null>(null)
|
|
16
|
+
|
|
17
|
+
const filteredSkills = computed(() => {
|
|
18
|
+
if (!search.value.trim()) return skills.value
|
|
19
|
+
const q = search.value.toLowerCase()
|
|
20
|
+
return skills.value.filter(s =>
|
|
21
|
+
s.name.toLowerCase().includes(q)
|
|
22
|
+
|| s.description.toLowerCase().includes(q)
|
|
23
|
+
)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
async function loadSkills() {
|
|
27
|
+
loading.value = true
|
|
28
|
+
try {
|
|
29
|
+
const res = await $fetch<{ data: SkillListItem[] }>('/api/skills')
|
|
30
|
+
skills.value = res.data
|
|
31
|
+
} catch {
|
|
32
|
+
toast.add({ title: 'Failed to load skills', color: 'error' })
|
|
33
|
+
} finally {
|
|
34
|
+
loading.value = false
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function handleImport(event: Event) {
|
|
39
|
+
const input = event.target as HTMLInputElement
|
|
40
|
+
const file = input.files?.[0]
|
|
41
|
+
if (!file) return
|
|
42
|
+
|
|
43
|
+
importing.value = true
|
|
44
|
+
try {
|
|
45
|
+
const formData = new FormData()
|
|
46
|
+
formData.append('file', file)
|
|
47
|
+
const res = await $fetch<{ data: { name: string, fileCount: number } }>('/api/skills/import', {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
body: formData
|
|
50
|
+
})
|
|
51
|
+
toast.add({
|
|
52
|
+
title: `Imported ${res.data.name}`,
|
|
53
|
+
description: `${res.data.fileCount} file${res.data.fileCount === 1 ? '' : 's'}`,
|
|
54
|
+
color: 'success'
|
|
55
|
+
})
|
|
56
|
+
navigateTo(`/skills/${res.data.name}`)
|
|
57
|
+
} catch (err: unknown) {
|
|
58
|
+
const message = err instanceof Error ? err.message : 'Import failed'
|
|
59
|
+
toast.add({ title: 'Import failed', description: message, color: 'error' })
|
|
60
|
+
} finally {
|
|
61
|
+
importing.value = false
|
|
62
|
+
input.value = ''
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function handleToggle(name: string) {
|
|
67
|
+
try {
|
|
68
|
+
const res = await $fetch<{ data: { name: string, active: boolean } }>(`/api/skills/${name}/toggle`, {
|
|
69
|
+
method: 'POST'
|
|
70
|
+
})
|
|
71
|
+
const skill = skills.value.find(s => s.name === name)
|
|
72
|
+
if (skill) skill.active = res.data.active
|
|
73
|
+
toast.add({
|
|
74
|
+
title: `${name} ${res.data.active ? 'enabled' : 'disabled'}`,
|
|
75
|
+
color: 'success'
|
|
76
|
+
})
|
|
77
|
+
} catch {
|
|
78
|
+
toast.add({ title: `Failed to toggle ${name}`, color: 'error' })
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
onMounted(() => loadSkills())
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<template>
|
|
86
|
+
<div class="flex flex-1 min-w-0">
|
|
87
|
+
<UDashboardPanel
|
|
88
|
+
id="skills-main"
|
|
89
|
+
grow
|
|
90
|
+
>
|
|
91
|
+
<template #header>
|
|
92
|
+
<UDashboardNavbar title="Skills">
|
|
93
|
+
<template #right>
|
|
94
|
+
<UInput
|
|
95
|
+
v-model="search"
|
|
96
|
+
icon="i-lucide-search"
|
|
97
|
+
placeholder="Search skills..."
|
|
98
|
+
size="sm"
|
|
99
|
+
class="w-48"
|
|
100
|
+
/>
|
|
101
|
+
<NuxtLink to="/skills/library">
|
|
102
|
+
<UButton
|
|
103
|
+
icon="i-lucide-library"
|
|
104
|
+
variant="ghost"
|
|
105
|
+
color="neutral"
|
|
106
|
+
size="sm"
|
|
107
|
+
>
|
|
108
|
+
Library
|
|
109
|
+
</UButton>
|
|
110
|
+
</NuxtLink>
|
|
111
|
+
<UButton
|
|
112
|
+
icon="i-lucide-upload"
|
|
113
|
+
variant="ghost"
|
|
114
|
+
color="neutral"
|
|
115
|
+
size="sm"
|
|
116
|
+
:loading="importing"
|
|
117
|
+
@click="fileInput?.click()"
|
|
118
|
+
>
|
|
119
|
+
Import
|
|
120
|
+
</UButton>
|
|
121
|
+
<input
|
|
122
|
+
ref="fileInput"
|
|
123
|
+
type="file"
|
|
124
|
+
accept=".zip"
|
|
125
|
+
class="hidden"
|
|
126
|
+
@change="handleImport"
|
|
127
|
+
>
|
|
128
|
+
<UButton
|
|
129
|
+
icon="i-lucide-plus"
|
|
130
|
+
size="sm"
|
|
131
|
+
@click="createOpen = true"
|
|
132
|
+
>
|
|
133
|
+
Create Skill
|
|
134
|
+
</UButton>
|
|
135
|
+
</template>
|
|
136
|
+
</UDashboardNavbar>
|
|
137
|
+
</template>
|
|
138
|
+
|
|
139
|
+
<template #body>
|
|
140
|
+
<div class="p-4">
|
|
141
|
+
<!-- Loading -->
|
|
142
|
+
<div
|
|
143
|
+
v-if="loading"
|
|
144
|
+
class="grid gap-4 sm:grid-cols-2 lg:grid-cols-3"
|
|
145
|
+
>
|
|
146
|
+
<div
|
|
147
|
+
v-for="i in 6"
|
|
148
|
+
:key="i"
|
|
149
|
+
class="p-4 rounded-lg border border-default bg-elevated/50"
|
|
150
|
+
>
|
|
151
|
+
<USkeleton class="h-4 w-24 mb-2" />
|
|
152
|
+
<USkeleton class="h-3 w-full mb-1" />
|
|
153
|
+
<USkeleton class="h-3 w-2/3" />
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
|
|
157
|
+
<!-- Empty -->
|
|
158
|
+
<div
|
|
159
|
+
v-else-if="skills.length === 0"
|
|
160
|
+
class="flex flex-col items-center justify-center py-16 text-dimmed"
|
|
161
|
+
>
|
|
162
|
+
<UIcon
|
|
163
|
+
name="i-lucide-puzzle"
|
|
164
|
+
class="size-12 mb-4"
|
|
165
|
+
/>
|
|
166
|
+
<p class="text-lg font-medium">
|
|
167
|
+
No skills found
|
|
168
|
+
</p>
|
|
169
|
+
<p class="text-sm mt-1">
|
|
170
|
+
Skills are loaded from ~/.claude/skills/
|
|
171
|
+
</p>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<!-- No results -->
|
|
175
|
+
<div
|
|
176
|
+
v-else-if="filteredSkills.length === 0"
|
|
177
|
+
class="text-center py-12 text-muted text-sm"
|
|
178
|
+
>
|
|
179
|
+
No skills matching "{{ search }}"
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
<!-- Grid -->
|
|
183
|
+
<div
|
|
184
|
+
v-else
|
|
185
|
+
class="grid gap-4 sm:grid-cols-2 lg:grid-cols-3"
|
|
186
|
+
>
|
|
187
|
+
<SkillsCard
|
|
188
|
+
v-for="skill in filteredSkills"
|
|
189
|
+
:key="skill.name"
|
|
190
|
+
:skill="skill"
|
|
191
|
+
@toggle="handleToggle"
|
|
192
|
+
/>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
</template>
|
|
196
|
+
</UDashboardPanel>
|
|
197
|
+
|
|
198
|
+
<SkillsCreateModal
|
|
199
|
+
:open="createOpen"
|
|
200
|
+
@update:open="createOpen = $event"
|
|
201
|
+
@created="loadSkills"
|
|
202
|
+
/>
|
|
203
|
+
</div>
|
|
204
|
+
</template>
|