From 0cc5150f9c73144cdd5a8df0e5505f37fd141b20 Mon Sep 17 00:00:00 2001 From: xds Date: Wed, 18 Feb 2026 16:34:11 +0300 Subject: [PATCH] fixes --- package-lock.json | 1 + package.json | 1 + src/components/AppSidebar.vue | 19 ++ src/services/aiService.js | 17 ++ src/views/CharacterDetailView.vue | 25 ++- src/views/FlexibleGenerationView.vue | 19 +- src/views/IdeaDetailView.vue | 70 +++++++- src/views/IdeasView.vue | 101 +++++++++-- src/views/ImageGenerationView.vue | 22 ++- src/views/ImageToPromptView.vue | 14 +- src/views/ProjectDetailView.vue | 251 +++++++++++++++++++-------- src/views/ProjectsView.vue | 67 +++++-- 12 files changed, 489 insertions(+), 118 deletions(-) diff --git a/package-lock.json b/package-lock.json index 288f723..3e011fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@tailwindcss/postcss": "^4.1.18", "@vitejs/plugin-vue": "^6.0.3", "autoprefixer": "^10.4.24", + "baseline-browser-mapping": "^2.9.19", "postcss": "^8.5.6", "tailwindcss": "^4.1.18", "vite": "^7.3.1", diff --git a/package.json b/package.json index 4a80fe5..022792e 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@tailwindcss/postcss": "^4.1.18", "@vitejs/plugin-vue": "^6.0.3", "autoprefixer": "^10.4.24", + "baseline-browser-mapping": "^2.9.19", "postcss": "^8.5.6", "tailwindcss": "^4.1.18", "vite": "^7.3.1", diff --git a/src/components/AppSidebar.vue b/src/components/AppSidebar.vue index 6a2e6b8..7c7c45f 100644 --- a/src/components/AppSidebar.vue +++ b/src/components/AppSidebar.vue @@ -3,6 +3,7 @@ import { computed, onMounted, ref, watch } from 'vue' import { useRouter, useRoute } from 'vue-router' import { useAuthStore } from '@/stores/auth' import { useProjectsStore } from '@/stores/projectsStore' +import { aiService } from '@/services/aiService' import { storeToRefs } from 'pinia' @@ -13,6 +14,17 @@ const projectsStore = useProjectsStore() const { projects, currentProject } = storeToRefs(projectsStore) const selectedProject = ref(null) +const usageCost = ref(0) + +const fetchUsage = async () => { + try { + // Fetch current context usage (user or project depending on header) + const report = await aiService.getUsageReport() + usageCost.value = report.summary?.total_cost || 0 + } catch (e) { + console.error("Failed to fetch sidebar usage", e) + } +} onMounted(async () => { // Ensure we have projects @@ -23,6 +35,7 @@ onMounted(async () => { if (currentProject.value) { selectedProject.value = currentProject.value.id } + fetchUsage() }) // Watch for external changes (like selecting from the list view) @@ -160,6 +173,12 @@ const navItems = computed(() => {
+ + +
diff --git a/src/services/aiService.js b/src/services/aiService.js index 2a6ead9..bc7c969 100644 --- a/src/services/aiService.js +++ b/src/services/aiService.js @@ -66,5 +66,22 @@ export const aiService = { linked_assets: linkedAssets }) return response.data + }, + + // Get usage statistics (runs, tokens, cost) + async getUsageReport(breakdown = null, projectId = null) { + const params = {} + if (breakdown) params.breakdown = breakdown + + const config = { params, headers: {} } + if (projectId) { + config.headers['X-Project-ID'] = projectId + } else if (projectId === false) { + // Explicitly ignore current active project header + config.headers['X-Project-ID'] = '' + } + + const response = await api.get('/generations/usage', config) + return response.data } } diff --git a/src/views/CharacterDetailView.vue b/src/views/CharacterDetailView.vue index 389bbe1..5ea5aff 100644 --- a/src/views/CharacterDetailView.vue +++ b/src/views/CharacterDetailView.vue @@ -1,15 +1,13 @@ @@ -124,11 +133,14 @@ const copyToClipboard = () => {
-
+
+