mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-01-06 08:12:30 +08:00
* feat(session): add chat session history with IndexedDB storage - Add session-storage.ts with IndexedDB wrapper using idb library - Add use-session-manager.ts hook for session state management - Add session-history-dropdown.tsx for session selection UI - Integrate session system into chat-panel.tsx - Auto-generate session titles from first user message - Auto-save sessions on message completion - Support session switching, deletion, and creation - Migrate existing localStorage data to IndexedDB - Add i18n translations for session history UI * feat(session): improve history dropdown and persist diagram history - Add time-based grouping (Today, Yesterday, This Week, Earlier) - Add thumbnail previews using Next.js Image component - Add staggered entrance animations with fade-in effects - Improve active session indicator with left border accent - Fix scrolling by using native overflow instead of ScrollArea - Persist diagram version history to IndexedDB sessions - Remove redundant diagram XML from localStorage - Add i18n strings for time group labels (en, ja, zh) * fix(session): prevent data loss on theme change and tab close - Add isDrawioReady effect to restore diagram after DrawIO remount - Add visibilitychange handler to save session when page becomes hidden - Fix missing currentSessionId in saveCurrentSession dependency array - Remove unused sanitizeMessages import from use-session-manager * fix(session): fix diagram save and migration data loss bugs - Add diagramHistory to save effect dependency array so diagram-only edits trigger saves (previously only message changes did) - Destructure stable sessionManager values to prevent unnecessary effect re-runs on every render - Add try-catch wrapper around debounced async save operation - Make saveSession() return boolean to indicate success/failure - Verify IndexedDB write succeeded before deleting localStorage data during migration (prevents data loss if write silently fails) - Keep localStorage data for retry if migration fails instead of marking as complete anyway * refactor(session): extract helpers to reduce code duplication - Add syncUIWithSession helper to consolidate 4 duplicate UI sync blocks - Add buildSessionData helper to consolidate 4 duplicate save logic blocks - Remove unused saveTimeoutRef and its cleanup effect - Net reduction of ~80 lines of duplicate code * style(ui): improve history dropdown and delete dialog styling - Change destructive color from coral to muted rose for refined look - Make session history panel taller (400px fixed height) - Fix popover alignment to prevent truncation - Style delete button with soft red outline instead of solid fill - Make delete dialog more compact (max-w-sm) * fix(session): reset refs on new chat and show recent sessions - Fix cached example diagrams not displaying after creating new session - Reset previousXML, lastProcessedXmlRef and processedToolCalls when messages become empty (new chat or session switch) - Add recent chats section in empty chat state with collapsible examples - Pass sessions and onSelectSession to ChatMessageDisplay - Add loadedMessageIdsRef to skip animations on session restore - Add debug console.log for diagram processing flow * feat(session): add search bar and improve history UI - Remove session history dropdown, use main panel instead - Add search bar to filter history chats by title - Show minutes (Xm ago) instead of "Just now" for recent sessions - Scroll to top when switching to new/empty chat - Remove title truncation limit for better searchability - Remove debug console.log statements * refactor: remove redundant code and fix nested button hydration error - Remove unused 'sessions' from deleteSession dependency array - Remove unused 'switchedTo' variable and simplify return type - Remove unused 'restoredMessageIdsRef' (always empty) - Fix nested button hydration error by using div with role=button - Simplify handleDeleteSession callback * fix(session): fix migration bug, improve metadata perf, truncate titles - Fix migration retry loop when localStorage has empty array - Use cursor-based iteration for getAllSessionMetadata - Truncate session titles to 100 chars with ellipsis * refactor: remove dead code and extract diagram length constant - Remove unused exports: getAllSessions, createNewSession, updateSessionTitle - Remove write-only CURRENT_SESSION_KEY and all localStorage calls - Remove dead messagesEndRef and unused scroll effect - Extract magic number 300 to MIN_REAL_DIAGRAM_LENGTH constant - Add isRealDiagram() helper function for semantic clarity
134 lines
5.5 KiB
JSON
134 lines
5.5 KiB
JSON
{
|
|
"name": "next-ai-draw-io",
|
|
"version": "0.4.8",
|
|
"license": "Apache-2.0",
|
|
"private": true,
|
|
"main": "dist-electron/main/index.js",
|
|
"scripts": {
|
|
"dev": "next dev --turbopack --port 6002",
|
|
"build": "next build",
|
|
"start": "next start --port 6001",
|
|
"lint": "biome lint .",
|
|
"format": "biome check --write .",
|
|
"check": "biome ci",
|
|
"prepare": "husky",
|
|
"preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview",
|
|
"deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy",
|
|
"upload": "opennextjs-cloudflare build && opennextjs-cloudflare upload",
|
|
"cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",
|
|
"electron:dev": "node scripts/electron-dev.mjs",
|
|
"electron:build": "npm run build && npm run electron:compile",
|
|
"electron:compile": "npx esbuild electron/main/index.ts electron/preload/index.ts electron/preload/settings.ts --bundle --platform=node --outdir=dist-electron --external:electron --sourcemap --packages=external && npx shx cp -r electron/settings dist-electron/",
|
|
"electron:start": "npx cross-env NODE_ENV=development npx electron .",
|
|
"electron:prepare": "node scripts/prepare-electron-build.mjs",
|
|
"dist": "npm run electron:build && npm run electron:prepare && npx electron-builder --config electron/electron-builder.yml",
|
|
"dist:mac": "npm run electron:build && npm run electron:prepare && npx electron-builder --config electron/electron-builder.yml --mac",
|
|
"dist:win": "npm run electron:build && npm run electron:prepare && npx electron-builder --config electron/electron-builder.yml --win",
|
|
"dist:linux": "npm run electron:build && npm run electron:prepare && npx electron-builder --config electron/electron-builder.yml --linux",
|
|
"dist:all": "npm run electron:build && npm run electron:prepare && npx electron-builder --config electron/electron-builder.yml --mac --win --linux"
|
|
},
|
|
"dependencies": {
|
|
"@ai-sdk/amazon-bedrock": "^4.0.1",
|
|
"@ai-sdk/anthropic": "^3.0.0",
|
|
"@ai-sdk/azure": "^3.0.0",
|
|
"@ai-sdk/deepseek": "^2.0.0",
|
|
"@ai-sdk/gateway": "^3.0.0",
|
|
"@ai-sdk/google": "^3.0.0",
|
|
"@ai-sdk/openai": "^3.0.0",
|
|
"@ai-sdk/react": "^3.0.1",
|
|
"@aws-sdk/client-dynamodb": "^3.957.0",
|
|
"@aws-sdk/credential-providers": "^3.943.0",
|
|
"@formatjs/intl-localematcher": "^0.7.2",
|
|
"@langfuse/client": "^4.4.9",
|
|
"@langfuse/otel": "^4.4.4",
|
|
"@langfuse/tracing": "^4.4.9",
|
|
"@next/third-parties": "^16.0.6",
|
|
"@opennextjs/cloudflare": "1.14.7",
|
|
"@openrouter/ai-sdk-provider": "^1.5.4",
|
|
"@opentelemetry/exporter-trace-otlp-http": "^0.208.0",
|
|
"@opentelemetry/sdk-trace-node": "^2.2.0",
|
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
"@radix-ui/react-collapsible": "^1.1.12",
|
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
"@radix-ui/react-label": "^2.1.8",
|
|
"@radix-ui/react-popover": "^1.1.15",
|
|
"@radix-ui/react-scroll-area": "^1.2.3",
|
|
"@radix-ui/react-select": "^2.2.6",
|
|
"@radix-ui/react-slot": "^1.2.4",
|
|
"@radix-ui/react-switch": "^1.2.6",
|
|
"@radix-ui/react-tooltip": "^1.1.8",
|
|
"@radix-ui/react-use-controllable-state": "^1.2.2",
|
|
"@xmldom/xmldom": "^0.9.8",
|
|
"ai": "^6.0.1",
|
|
"base-64": "^1.0.0",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"cmdk": "^1.1.1",
|
|
"idb": "^8.0.3",
|
|
"js-tiktoken": "^1.0.21",
|
|
"jsdom": "^27.0.0",
|
|
"jsonrepair": "^3.13.1",
|
|
"lucide-react": "^0.562.0",
|
|
"motion": "^12.23.25",
|
|
"negotiator": "^1.0.0",
|
|
"next": "^16.0.7",
|
|
"ollama-ai-provider-v2": "^2.0.0",
|
|
"pako": "^2.1.0",
|
|
"prism-react-renderer": "^2.4.1",
|
|
"react": "^19.1.2",
|
|
"react-dom": "^19.1.2",
|
|
"react-drawio": "^1.0.3",
|
|
"react-icons": "^5.5.0",
|
|
"react-markdown": "^10.1.0",
|
|
"react-resizable-panels": "^3.0.6",
|
|
"remark-gfm": "^4.0.1",
|
|
"server-only": "^0.0.1",
|
|
"sonner": "^2.0.7",
|
|
"tailwind-merge": "^3.0.2",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"unpdf": "^1.4.0",
|
|
"zod": "^4.1.12"
|
|
},
|
|
"optionalDependencies": {
|
|
"@tailwindcss/oxide-linux-x64-gnu": "^4.1.18",
|
|
"lightningcss": "^1.30.2",
|
|
"lightningcss-linux-x64-gnu": "^1.30.2"
|
|
},
|
|
"lint-staged": {
|
|
"*.{js,ts,jsx,tsx,json,css}": [
|
|
"biome check --write --no-errors-on-unmatched",
|
|
"biome check --no-errors-on-unmatched"
|
|
]
|
|
},
|
|
"devDependencies": {
|
|
"@anthropic-ai/tokenizer": "^0.0.4",
|
|
"@biomejs/biome": "^2.3.10",
|
|
"@tailwindcss/postcss": "^4",
|
|
"@tailwindcss/typography": "^0.5.19",
|
|
"@types/negotiator": "^0.6.4",
|
|
"@types/node": "^24.0.0",
|
|
"@types/pako": "^2.0.3",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"concurrently": "^9.2.1",
|
|
"cross-env": "^10.1.0",
|
|
"electron": "^39.2.7",
|
|
"electron-builder": "^26.0.12",
|
|
"esbuild": "^0.27.2",
|
|
"eslint": "9.39.2",
|
|
"eslint-config-next": "16.1.1",
|
|
"husky": "^9.1.7",
|
|
"lint-staged": "^16.2.7",
|
|
"shx": "^0.4.0",
|
|
"tailwindcss": "^4",
|
|
"typescript": "^5",
|
|
"wait-on": "^9.0.3",
|
|
"wrangler": "4.54.0"
|
|
},
|
|
"overrides": {
|
|
"@openrouter/ai-sdk-provider": {
|
|
"ai": "^6.0.1"
|
|
}
|
|
}
|
|
}
|