diff --git a/package-lock.json b/package-lock.json index 6d13845..b0b0195 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.5", "dependencies": { "@google/genai": "^2.4.0", + "@vercel/analytics": "^2.0.1", "d3": "^7.9.0", "dotenv": "^17.2.3", "express": "^4.21.2", @@ -1987,6 +1988,48 @@ "@types/node": "*" } }, + "node_modules/@vercel/analytics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-2.0.1.tgz", + "integrity": "sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g==", + "license": "MIT", + "peerDependencies": { + "@remix-run/react": "^2", + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "nuxt": ">= 3", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "nuxt": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, "node_modules/@vitejs/plugin-react": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", diff --git a/package.json b/package.json index 735b559..f5a9bff 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ }, "dependencies": { "@google/genai": "^2.4.0", + "@vercel/analytics": "^2.0.1", "d3": "^7.9.0", "dotenv": "^17.2.3", "express": "^4.21.2", @@ -23,17 +24,17 @@ "react-dom": "^19.0.1" }, "devDependencies": { + "@tailwindcss/vite": "^4.1.14", "@types/d3": "^7.4.3", "@types/express": "^4.17.21", "@types/node": "^22.14.0", + "@vitejs/plugin-react": "^5.0.4", "autoprefixer": "^10.4.21", "esbuild": "^0.25.0", "tailwindcss": "^4.1.14", "tsx": "^4.21.0", "typescript": "~5.8.2", - "vite": "^6.2.3", - "@tailwindcss/vite": "^4.1.14", - "@vitejs/plugin-react": "^5.0.4" + "vite": "^6.2.3" }, "description": "AI-native terminal-based software development workspace with autonomous planner, builder, designer, debugger, and deployment agents." } diff --git a/src/App.tsx b/src/App.tsx index 3bc695d..bf3c429 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -48,6 +48,7 @@ import { Package } from "lucide-react"; import { Project, WorkspaceFile, Agent, TerminalLine, Deployment, GitCommit } from "./types"; +import { Analytics } from "@vercel/analytics/react"; import { readJsonStorage, readNumberStorage, readStringStorage, writeStorage } from "./utils/storage"; import { PRESET_PROJECTS } from "./data/presets"; import DashboardOverview from "./components/DashboardOverview"; @@ -385,7 +386,7 @@ export default function App() { // Simulate multi-user collaborator reactions based on user text keywords setTimeout(() => { let replyText = "Đã rõ! Tôi nghĩ cấu trúc này khá phù hợp. Hãy kiểm tra biên dịch và chạy thử nhé."; - let responder = activeCollaborators[Math.floor(Math.random() * activeCollaborators.length)] || { name: "Nguyên Văn Hùng", role: "Lead Architect" }; + let responder = activeCollaborators[Math.floor(Math.random() * activeCollaborators.length)] || { name: "Nguy��n Văn Hùng", role: "Lead Architect" }; if (textClean.toLowerCase().includes("css") || textClean.toLowerCase().includes("style") || textClean.toLowerCase().includes("màu") || textClean.toLowerCase().includes("giao diện")) { responder = activeCollaborators.find(c => c.role?.includes("Designer") || c.role?.includes("Artisan") || c.name.includes("Mai")) || { name: "Trần Thị Mai", role: "Designer Agent" }; @@ -2162,6 +2163,7 @@ export default function App() { + ); }