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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cognova",
3
3
  "type": "module",
4
- "version": "0.2.13",
4
+ "version": "0.2.15",
5
5
  "description": "Personal knowledge management system with Claude Code integration",
6
6
  "repository": {
7
7
  "type": "git",
@@ -1,12 +1,31 @@
1
- import { getDb } from '~~/server/db'
1
+ import { inArray, sql } from 'drizzle-orm'
2
+ import { getDb, schema } from '~~/server/db'
2
3
  import { requireDb } from '~~/server/utils/db-guard'
3
4
 
4
5
  export default defineEventHandler(async (event) => {
5
6
  requireDb(event)
6
7
 
8
+ const query = getQuery(event)
9
+ const search = query.search as string | undefined
10
+
7
11
  const db = getDb()
8
12
 
13
+ // Full-text search via tsvector + GIN index
14
+ let where
15
+ if (search) {
16
+ const ftsResult = await db.execute<{ id: string }>(sql`
17
+ SELECT id FROM cron_agents
18
+ WHERE search_vector @@ plainto_tsquery('english', ${search})
19
+ ORDER BY ts_rank(search_vector, plainto_tsquery('english', ${search})) DESC
20
+ LIMIT 50
21
+ `)
22
+ const ids = ftsResult.map(r => r.id)
23
+ if (ids.length === 0) return { data: [] }
24
+ where = inArray(schema.cronAgents.id, ids)
25
+ }
26
+
9
27
  const agents = await db.query.cronAgents.findMany({
28
+ where,
10
29
  with: { creator: true },
11
30
  orderBy: (agents, { asc }) => [asc(agents.name)]
12
31
  })
@@ -1,4 +1,4 @@
1
- import { desc } from 'drizzle-orm'
1
+ import { desc, inArray, sql } from 'drizzle-orm'
2
2
  import { getDb } from '~~/server/db'
3
3
  import * as schema from '~~/server/db/schema'
4
4
  import { requireDb } from '~~/server/utils/db-guard'
@@ -6,13 +6,31 @@ import { requireDb } from '~~/server/utils/db-guard'
6
6
  export default defineEventHandler(async (event) => {
7
7
  requireDb(event)
8
8
 
9
+ const query = getQuery(event)
10
+ const search = query.search as string | undefined
11
+
9
12
  const db = getDb()
10
13
 
14
+ // Full-text search via tsvector + GIN index
15
+ let where
16
+ if (search) {
17
+ const ftsResult = await db.execute<{ id: string }>(sql`
18
+ SELECT id FROM conversations
19
+ WHERE search_vector @@ plainto_tsquery('english', ${search})
20
+ ORDER BY ts_rank(search_vector, plainto_tsquery('english', ${search})) DESC
21
+ LIMIT 50
22
+ `)
23
+ const ids = ftsResult.map(r => r.id)
24
+ if (ids.length === 0) return { data: [] }
25
+ where = inArray(schema.conversations.id, ids)
26
+ }
27
+
11
28
  // Main Chat always first, then by most recent
12
- const conversations = await db.select()
13
- .from(schema.conversations)
14
- .orderBy(desc(schema.conversations.isMain), desc(schema.conversations.startedAt))
15
- .limit(50)
29
+ const conversations = await db.query.conversations.findMany({
30
+ where,
31
+ orderBy: [desc(schema.conversations.isMain), desc(schema.conversations.startedAt)],
32
+ limit: 50
33
+ })
16
34
 
17
35
  return { data: conversations }
18
36
  })
@@ -1,4 +1,4 @@
1
- import { eq, isNull, ilike, and, or } from 'drizzle-orm'
1
+ import { eq, isNull, inArray, and, sql } from 'drizzle-orm'
2
2
  import { getDb } from '~~/server/db'
3
3
  import * as schema from '~~/server/db/schema'
4
4
  import { requireDb } from '~~/server/utils/db-guard'
@@ -24,15 +24,17 @@ export default defineEventHandler(async (event) => {
24
24
  if (fileType)
25
25
  conditions.push(eq(schema.documents.fileType, fileType))
26
26
 
27
+ // Full-text search via tsvector + GIN index
27
28
  if (search) {
28
- const pattern = `%${search}%`
29
- conditions.push(
30
- or(
31
- ilike(schema.documents.title, pattern),
32
- ilike(schema.documents.content, pattern),
33
- ilike(schema.documents.path, pattern)
34
- )
35
- )
29
+ const ftsResult = await db.execute<{ id: string }>(sql`
30
+ SELECT id FROM documents
31
+ WHERE search_vector @@ plainto_tsquery('english', ${search})
32
+ ORDER BY ts_rank(search_vector, plainto_tsquery('english', ${search})) DESC
33
+ LIMIT 50
34
+ `)
35
+ const ids = ftsResult.map(r => r.id)
36
+ if (ids.length === 0) return { data: [] }
37
+ conditions.push(inArray(schema.documents.id, ids))
36
38
  }
37
39
 
38
40
  const documents = await db.query.documents.findMany({
@@ -1,4 +1,4 @@
1
- import { sql, desc, eq, and, gte, ilike, or } from 'drizzle-orm'
1
+ import { sql, desc, eq, and, gte, inArray } from 'drizzle-orm'
2
2
  import { getDb, schema } from '~~/server/db'
3
3
  import { requireDb } from '~~/server/utils/db-guard'
4
4
  import type { MemoryChunk, MemoryChunkType } from '~~/shared/types'
@@ -29,12 +29,17 @@ export default defineEventHandler(async (event) => {
29
29
  if (minRelevance !== undefined)
30
30
  conditions.push(gte(schema.memoryChunks.relevanceScore, minRelevance))
31
31
 
32
- // Text search (simple ILIKE for now, will upgrade to tsvector)
32
+ // Full-text search via tsvector + GIN index
33
33
  if (searchQuery) {
34
- conditions.push(or(
35
- ilike(schema.memoryChunks.content, `%${searchQuery}%`),
36
- ilike(schema.memoryChunks.sourceExcerpt, `%${searchQuery}%`)
37
- ))
34
+ const ftsResult = await db.execute<{ id: string }>(sql`
35
+ SELECT id FROM memory_chunks
36
+ WHERE search_vector @@ plainto_tsquery('english', ${searchQuery})
37
+ ORDER BY ts_rank(search_vector, plainto_tsquery('english', ${searchQuery})) DESC
38
+ LIMIT ${limit}
39
+ `)
40
+ const ids = ftsResult.map(r => r.id)
41
+ if (ids.length === 0) return { data: [] as MemoryChunk[] }
42
+ conditions.push(inArray(schema.memoryChunks.id, ids))
38
43
  }
39
44
 
40
45
  let dbQuery = db.select()
@@ -1,4 +1,4 @@
1
- import { eq, isNull, ilike, inArray, and, or } from 'drizzle-orm'
1
+ import { eq, isNull, inArray, and, sql } from 'drizzle-orm'
2
2
  import { getDb, schema } from '~~/server/db'
3
3
  import { requireDb } from '~~/server/utils/db-guard'
4
4
 
@@ -29,15 +29,17 @@ export default defineEventHandler(async (event) => {
29
29
  if (projectId)
30
30
  conditions.push(eq(schema.tasks.projectId, projectId))
31
31
 
32
- // Search filter (title and description)
32
+ // Full-text search via tsvector + GIN index
33
33
  if (search) {
34
- const searchPattern = `%${search}%`
35
- conditions.push(
36
- or(
37
- ilike(schema.tasks.title, searchPattern),
38
- ilike(schema.tasks.description, searchPattern)
39
- )
40
- )
34
+ const ftsResult = await db.execute<{ id: string }>(sql`
35
+ SELECT id FROM tasks
36
+ WHERE search_vector @@ plainto_tsquery('english', ${search})
37
+ ORDER BY ts_rank(search_vector, plainto_tsquery('english', ${search})) DESC
38
+ LIMIT 50
39
+ `)
40
+ const ids = ftsResult.map(r => r.id)
41
+ if (ids.length === 0) return { data: [] }
42
+ conditions.push(inArray(schema.tasks.id, ids))
41
43
  }
42
44
 
43
45
  const tasks = await db.query.tasks.findMany({
@@ -0,0 +1,127 @@
1
+ -- Full-Text Search: Add tsvector columns, GIN indexes, and auto-update triggers
2
+ -- This migration enables PostgreSQL full-text search across 5 tables.
3
+
4
+ -- =============================================================================
5
+ -- TASKS
6
+ -- =============================================================================
7
+
8
+ ALTER TABLE tasks ADD COLUMN search_vector tsvector;
9
+
10
+ CREATE INDEX idx_tasks_search ON tasks USING GIN (search_vector);
11
+
12
+ CREATE OR REPLACE FUNCTION tasks_search_vector_update() RETURNS trigger AS $$
13
+ BEGIN
14
+ NEW.search_vector := to_tsvector('english',
15
+ coalesce(NEW.title, '') || ' ' || coalesce(NEW.description, '')
16
+ );
17
+ RETURN NEW;
18
+ END;
19
+ $$ LANGUAGE plpgsql;
20
+
21
+ CREATE TRIGGER tasks_search_vector_trigger
22
+ BEFORE INSERT OR UPDATE OF title, description ON tasks
23
+ FOR EACH ROW EXECUTE FUNCTION tasks_search_vector_update();
24
+
25
+ UPDATE tasks SET search_vector = to_tsvector('english',
26
+ coalesce(title, '') || ' ' || coalesce(description, '')
27
+ );
28
+
29
+ -- =============================================================================
30
+ -- DOCUMENTS
31
+ -- =============================================================================
32
+
33
+ ALTER TABLE documents ADD COLUMN search_vector tsvector;
34
+
35
+ CREATE INDEX idx_documents_search ON documents USING GIN (search_vector);
36
+
37
+ CREATE OR REPLACE FUNCTION documents_search_vector_update() RETURNS trigger AS $$
38
+ BEGIN
39
+ NEW.search_vector := to_tsvector('english',
40
+ coalesce(NEW.title, '') || ' ' || coalesce(NEW.content, '') || ' ' || coalesce(NEW.path, '')
41
+ );
42
+ RETURN NEW;
43
+ END;
44
+ $$ LANGUAGE plpgsql;
45
+
46
+ CREATE TRIGGER documents_search_vector_trigger
47
+ BEFORE INSERT OR UPDATE OF title, content, path ON documents
48
+ FOR EACH ROW EXECUTE FUNCTION documents_search_vector_update();
49
+
50
+ UPDATE documents SET search_vector = to_tsvector('english',
51
+ coalesce(title, '') || ' ' || coalesce(content, '') || ' ' || coalesce(path, '')
52
+ );
53
+
54
+ -- =============================================================================
55
+ -- MEMORY CHUNKS
56
+ -- =============================================================================
57
+
58
+ ALTER TABLE memory_chunks ADD COLUMN search_vector tsvector;
59
+
60
+ CREATE INDEX idx_memory_chunks_search ON memory_chunks USING GIN (search_vector);
61
+
62
+ CREATE OR REPLACE FUNCTION memory_chunks_search_vector_update() RETURNS trigger AS $$
63
+ BEGIN
64
+ NEW.search_vector := to_tsvector('english',
65
+ coalesce(NEW.content, '') || ' ' || coalesce(NEW.source_excerpt, '')
66
+ );
67
+ RETURN NEW;
68
+ END;
69
+ $$ LANGUAGE plpgsql;
70
+
71
+ CREATE TRIGGER memory_chunks_search_vector_trigger
72
+ BEFORE INSERT OR UPDATE OF content, source_excerpt ON memory_chunks
73
+ FOR EACH ROW EXECUTE FUNCTION memory_chunks_search_vector_update();
74
+
75
+ UPDATE memory_chunks SET search_vector = to_tsvector('english',
76
+ coalesce(content, '') || ' ' || coalesce(source_excerpt, '')
77
+ );
78
+
79
+ -- =============================================================================
80
+ -- CRON AGENTS
81
+ -- =============================================================================
82
+
83
+ ALTER TABLE cron_agents ADD COLUMN search_vector tsvector;
84
+
85
+ CREATE INDEX idx_cron_agents_search ON cron_agents USING GIN (search_vector);
86
+
87
+ CREATE OR REPLACE FUNCTION cron_agents_search_vector_update() RETURNS trigger AS $$
88
+ BEGIN
89
+ NEW.search_vector := to_tsvector('english',
90
+ coalesce(NEW.name, '') || ' ' || coalesce(NEW.description, '') || ' ' || coalesce(NEW.prompt, '')
91
+ );
92
+ RETURN NEW;
93
+ END;
94
+ $$ LANGUAGE plpgsql;
95
+
96
+ CREATE TRIGGER cron_agents_search_vector_trigger
97
+ BEFORE INSERT OR UPDATE OF name, description, prompt ON cron_agents
98
+ FOR EACH ROW EXECUTE FUNCTION cron_agents_search_vector_update();
99
+
100
+ UPDATE cron_agents SET search_vector = to_tsvector('english',
101
+ coalesce(name, '') || ' ' || coalesce(description, '') || ' ' || coalesce(prompt, '')
102
+ );
103
+
104
+ -- =============================================================================
105
+ -- CONVERSATIONS
106
+ -- =============================================================================
107
+
108
+ ALTER TABLE conversations ADD COLUMN search_vector tsvector;
109
+
110
+ CREATE INDEX idx_conversations_search ON conversations USING GIN (search_vector);
111
+
112
+ CREATE OR REPLACE FUNCTION conversations_search_vector_update() RETURNS trigger AS $$
113
+ BEGIN
114
+ NEW.search_vector := to_tsvector('english',
115
+ coalesce(NEW.title, '') || ' ' || coalesce(NEW.summary, '')
116
+ );
117
+ RETURN NEW;
118
+ END;
119
+ $$ LANGUAGE plpgsql;
120
+
121
+ CREATE TRIGGER conversations_search_vector_trigger
122
+ BEFORE INSERT OR UPDATE OF title, summary ON conversations
123
+ FOR EACH ROW EXECUTE FUNCTION conversations_search_vector_update();
124
+
125
+ UPDATE conversations SET search_vector = to_tsvector('english',
126
+ coalesce(title, '') || ' ' || coalesce(summary, '')
127
+ );
@@ -113,6 +113,13 @@
113
113
  "when": 1771736174854,
114
114
  "tag": "0015_great_mephistopheles",
115
115
  "breakpoints": true
116
+ },
117
+ {
118
+ "idx": 16,
119
+ "version": "7",
120
+ "when": 1772006400000,
121
+ "tag": "0016_full_text_search",
122
+ "breakpoints": true
116
123
  }
117
124
  ]
118
125
  }
@@ -207,10 +207,16 @@ export interface PublicDocumentResponse {
207
207
 
208
208
  export interface Conversation {
209
209
  id: string
210
+ sessionId: string
211
+ sdkSessionId?: string
212
+ title?: string
213
+ summary?: string
214
+ status: 'idle' | 'streaming' | 'interrupted' | 'error'
215
+ totalCostUsd: number
216
+ isMain: boolean
210
217
  startedAt: Date
211
218
  endedAt?: Date
212
219
  messageCount: number
213
- summary?: string
214
220
  }
215
221
 
216
222
  export interface ConversationDetail extends Conversation {
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Shared formatting utilities used across pages and components.
3
+ * Eliminates duplication of common date, duration, and status formatting.
4
+ */
5
+
6
+ /** Format a cron expression to a human-readable string */
7
+ export function formatSchedule(schedule: string): string {
8
+ const parts = schedule.split(' ')
9
+ if (parts.length !== 5) return schedule
10
+
11
+ const min = parts[0]!
12
+ const hour = parts[1]!
13
+ const dayOfMonth = parts[2]!
14
+ const month = parts[3]!
15
+ const dayOfWeek = parts[4]!
16
+
17
+ if (min === '0' && hour === '*' && dayOfMonth === '*' && month === '*' && dayOfWeek === '*')
18
+ return 'Every hour'
19
+ if (min === '*/5' && hour === '*' && dayOfMonth === '*' && month === '*' && dayOfWeek === '*')
20
+ return 'Every 5 minutes'
21
+ if (dayOfMonth === '*' && month === '*' && dayOfWeek === '*' && hour !== '*')
22
+ return `Daily at ${hour}:${min.padStart(2, '0')}`
23
+ if (dayOfWeek === '0' && dayOfMonth === '*' && month === '*')
24
+ return `Weekly on Sunday at ${hour}:${min.padStart(2, '0')}`
25
+
26
+ return schedule
27
+ }
28
+
29
+ /** Format a date to a relative time string (e.g. "5m ago", "3h ago") */
30
+ export function formatRelativeTime(date?: Date | string | null): string {
31
+ if (!date) return 'Never'
32
+ const d = new Date(date)
33
+ const now = new Date()
34
+ const diff = now.getTime() - d.getTime()
35
+ const minutes = Math.floor(diff / 60000)
36
+ const hours = Math.floor(diff / 3600000)
37
+ const days = Math.floor(diff / 86400000)
38
+
39
+ if (minutes < 1) return 'Just now'
40
+ if (minutes < 60) return `${minutes}m ago`
41
+ if (hours < 24) return `${hours}h ago`
42
+ return `${days}d ago`
43
+ }
44
+
45
+ /** Format milliseconds to a human-readable duration (e.g. "1.2s", "3.5m") */
46
+ export function formatDuration(ms?: number | null): string {
47
+ if (!ms) return '-'
48
+ if (ms < 1000) return `${ms}ms`
49
+ if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`
50
+ return `${(ms / 60000).toFixed(1)}m`
51
+ }
52
+
53
+ /** Format a date to a locale string (e.g. "Feb 23, 2026, 10:30:00 AM") */
54
+ export function formatDateTime(date?: Date | string | null): string {
55
+ if (!date) return '-'
56
+ return new Date(date).toLocaleString()
57
+ }
58
+
59
+ /** Format a date as short date (e.g. "Feb 23, 2026") */
60
+ export function formatDate(date?: Date | string | null): string {
61
+ if (!date) return ''
62
+ return new Date(date).toLocaleDateString('en-US', {
63
+ month: 'short',
64
+ day: 'numeric',
65
+ year: 'numeric'
66
+ })
67
+ }
68
+
69
+ /** Format a date as short (no year) for compact displays (e.g. "Feb 23") */
70
+ export function formatDateShort(date?: Date | string | null): string {
71
+ if (!date) return ''
72
+ return new Date(date).toLocaleDateString('en-US', {
73
+ month: 'short',
74
+ day: 'numeric'
75
+ })
76
+ }
77
+
78
+ /** Format a date with weekday for detail views (e.g. "Sun, Feb 23, 2026") */
79
+ export function formatDateLong(date?: Date | string | null): string {
80
+ if (!date) return ''
81
+ return new Date(date).toLocaleDateString('en-US', {
82
+ weekday: 'short',
83
+ month: 'short',
84
+ day: 'numeric',
85
+ year: 'numeric'
86
+ })
87
+ }
88
+
89
+ /** Format a currency value (e.g. "$1.23" or "<$0.01") */
90
+ export function formatCurrency(value: number): string {
91
+ if (value < 0.01) return '<$0.01'
92
+ return `$${value.toFixed(2)}`
93
+ }
94
+
95
+ /** Map agent/run status to a UI badge color */
96
+ export function getStatusColor(status?: string): 'success' | 'error' | 'warning' | 'info' | 'neutral' {
97
+ switch (status) {
98
+ case 'success': return 'success'
99
+ case 'error': return 'error'
100
+ case 'budget_exceeded': return 'warning'
101
+ case 'running': return 'info'
102
+ case 'cancelled': return 'neutral'
103
+ default: return 'neutral'
104
+ }
105
+ }
@@ -1 +0,0 @@
1
- import{P as r,c,G as n,T as p,a4 as u,W as i,am as s}from"./D6tVZcRs.js";const m={base:"list-disc ps-6 my-5 marker:text-(--ui-border-accented)"},_={__name:"ProseUl",props:{class:{type:null,required:!1}},setup(e){const a=e,t=r(),o=c(()=>s({extend:s(m),...t.ui?.prose?.ul||{}}));return(l,d)=>(p(),n("ul",{class:i(o.value({class:a.class}))},[u(l.$slots,"default")],2))}};export{_ as default};