upfynai-code 3.0.2 → 3.0.4

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 (42) hide show
  1. package/client/dist/api-docs.html +838 -838
  2. package/client/dist/assets/{AppContent-Bvg0CPCO.js → AppContent-CwrTP6TW.js} +43 -43
  3. package/client/dist/assets/BrowserPanel-0TLEl-IC.js +2 -0
  4. package/client/dist/assets/{CanvasFullScreen-BdiJ35aq.js → CanvasFullScreen-D1GWQsGL.js} +1 -1
  5. package/client/dist/assets/{CanvasWorkspace-Bk9R9_e0.js → CanvasWorkspace-D7ORj358.js} +1 -1
  6. package/client/dist/assets/DashboardPanel-BV7ybUDe.js +1 -0
  7. package/client/dist/assets/FileTree-5qfhBqdE.js +1 -0
  8. package/client/dist/assets/{GitPanel-RtyZUIWS.js → GitPanel-C_xFM-N2.js} +1 -1
  9. package/client/dist/assets/{LoginModal-BWep8a6g.js → LoginModal-CImJHRjX.js} +3 -3
  10. package/client/dist/assets/{MarkdownPreview-DHmk3qzu.js → MarkdownPreview-CESjI261.js} +1 -1
  11. package/client/dist/assets/{MermaidBlock-BuBc_G-F.js → MermaidBlock-BFM21cwe.js} +2 -2
  12. package/client/dist/assets/Onboarding-B3cteLu2.js +1 -0
  13. package/client/dist/assets/SetupForm-P6dsYgHO.js +1 -0
  14. package/client/dist/assets/WorkflowsPanel-CBoN80kc.js +1 -0
  15. package/client/dist/assets/index-46kkVu2i.css +1 -0
  16. package/client/dist/assets/{index-C5ptjuTl.js → index-HaY-3pK1.js} +20 -20
  17. package/client/dist/assets/{vendor-canvas-D39yWul6.js → vendor-canvas-DvHJ_Pn2.js} +1 -1
  18. package/client/dist/assets/{vendor-codemirror-CbtmxxaB.js → vendor-codemirror-D2ALgpaX.js} +1 -1
  19. package/client/dist/assets/{vendor-icons-BaD0x9SL.js → vendor-icons-GyYE35HP.js} +178 -138
  20. package/client/dist/assets/{vendor-mermaid-CH7SGc99.js → vendor-mermaid-DucWyDEe.js} +3 -3
  21. package/client/dist/assets/{vendor-syntax-DuHI9Ok6.js → vendor-syntax-LS_Nt30I.js} +1 -1
  22. package/client/dist/clear-cache.html +85 -85
  23. package/client/dist/index.html +17 -17
  24. package/client/dist/manifest.json +3 -3
  25. package/client/dist/mcp-docs.html +108 -108
  26. package/client/dist/offline.html +84 -84
  27. package/client/dist/sw.js +82 -82
  28. package/package.json +136 -136
  29. package/server/browser.js +131 -0
  30. package/server/database/db.js +108 -10
  31. package/server/index.js +27 -28
  32. package/server/middleware/auth.js +5 -2
  33. package/server/routes/browser.js +419 -0
  34. package/server/routes/projects.js +118 -19
  35. package/server/routes/vapi-chat.js +1 -1
  36. package/server/services/browser-ai.js +154 -0
  37. package/client/dist/assets/DashboardPanel-CblJfTGi.js +0 -1
  38. package/client/dist/assets/FileTree-BDUnBheV.js +0 -1
  39. package/client/dist/assets/Onboarding-Drnlt75a.js +0 -1
  40. package/client/dist/assets/SetupForm-CtCKitZG.js +0 -1
  41. package/client/dist/assets/WorkflowsPanel-B2mIXDvD.js +0 -1
  42. package/client/dist/assets/index-BFuqS0tY.css +0 -1
@@ -1,84 +1,84 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
- <title>Upfyn-Code — Offline</title>
7
- <meta name="theme-color" content="#0a0f1e" />
8
- <style>
9
- * { margin: 0; padding: 0; box-sizing: border-box; }
10
- body {
11
- background: #0a0f1e;
12
- color: #e2e8f0;
13
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
14
- min-height: 100vh;
15
- display: flex;
16
- align-items: center;
17
- justify-content: center;
18
- padding: 2rem;
19
- }
20
- .container {
21
- text-align: center;
22
- max-width: 400px;
23
- }
24
- .icon {
25
- width: 64px;
26
- height: 64px;
27
- margin: 0 auto 1.5rem;
28
- background: #0d1117;
29
- border-radius: 16px;
30
- display: flex;
31
- align-items: center;
32
- justify-content: center;
33
- border: 1px solid rgba(59, 130, 246, 0.2);
34
- box-shadow: 0 4px 24px rgba(59, 130, 246, 0.15);
35
- }
36
- .icon svg {
37
- width: 32px;
38
- height: 32px;
39
- color: #3b82f6;
40
- }
41
- h1 {
42
- font-size: 1.5rem;
43
- font-weight: 700;
44
- margin-bottom: 0.75rem;
45
- }
46
- p {
47
- color: #94a3b8;
48
- font-size: 0.9rem;
49
- line-height: 1.5;
50
- margin-bottom: 1.5rem;
51
- }
52
- .retry-btn {
53
- display: inline-block;
54
- padding: 12px 32px;
55
- background: #3b82f6;
56
- color: #fff;
57
- border: none;
58
- border-radius: 10px;
59
- font-size: 0.95rem;
60
- font-weight: 600;
61
- cursor: pointer;
62
- transition: background 0.2s;
63
- }
64
- .retry-btn:hover {
65
- background: #2563eb;
66
- }
67
- .retry-btn:active {
68
- transform: scale(0.97);
69
- }
70
- </style>
71
- </head>
72
- <body>
73
- <div class="container">
74
- <div class="icon">
75
- <svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
76
- <path stroke-linecap="round" stroke-linejoin="round" d="M18.364 5.636a9 9 0 010 12.728M5.636 18.364a9 9 0 010-12.728m2.828 9.9a5 5 0 010-7.072m7.072 0a5 5 0 010 7.072M13 12a1 1 0 11-2 0 1 1 0 012 0z" />
77
- </svg>
78
- </div>
79
- <h1>You're offline</h1>
80
- <p>Check your internet connection and try again. Upfyn-Code needs a network connection to work.</p>
81
- <button class="retry-btn" onclick="location.reload()">Retry</button>
82
- </div>
83
- </body>
84
- </html>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
+ <title>UpfynAI — Offline</title>
7
+ <meta name="theme-color" content="#0a0f1e" />
8
+ <style>
9
+ * { margin: 0; padding: 0; box-sizing: border-box; }
10
+ body {
11
+ background: #0a0f1e;
12
+ color: #e2e8f0;
13
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
14
+ min-height: 100vh;
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ padding: 2rem;
19
+ }
20
+ .container {
21
+ text-align: center;
22
+ max-width: 400px;
23
+ }
24
+ .icon {
25
+ width: 64px;
26
+ height: 64px;
27
+ margin: 0 auto 1.5rem;
28
+ background: #0d1117;
29
+ border-radius: 16px;
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ border: 1px solid rgba(59, 130, 246, 0.2);
34
+ box-shadow: 0 4px 24px rgba(59, 130, 246, 0.15);
35
+ }
36
+ .icon svg {
37
+ width: 32px;
38
+ height: 32px;
39
+ color: #3b82f6;
40
+ }
41
+ h1 {
42
+ font-size: 1.5rem;
43
+ font-weight: 700;
44
+ margin-bottom: 0.75rem;
45
+ }
46
+ p {
47
+ color: #94a3b8;
48
+ font-size: 0.9rem;
49
+ line-height: 1.5;
50
+ margin-bottom: 1.5rem;
51
+ }
52
+ .retry-btn {
53
+ display: inline-block;
54
+ padding: 12px 32px;
55
+ background: #3b82f6;
56
+ color: #fff;
57
+ border: none;
58
+ border-radius: 10px;
59
+ font-size: 0.95rem;
60
+ font-weight: 600;
61
+ cursor: pointer;
62
+ transition: background 0.2s;
63
+ }
64
+ .retry-btn:hover {
65
+ background: #2563eb;
66
+ }
67
+ .retry-btn:active {
68
+ transform: scale(0.97);
69
+ }
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <div class="container">
74
+ <div class="icon">
75
+ <svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
76
+ <path stroke-linecap="round" stroke-linejoin="round" d="M18.364 5.636a9 9 0 010 12.728M5.636 18.364a9 9 0 010-12.728m2.828 9.9a5 5 0 010-7.072m7.072 0a5 5 0 010 7.072M13 12a1 1 0 11-2 0 1 1 0 012 0z" />
77
+ </svg>
78
+ </div>
79
+ <h1>You're offline</h1>
80
+ <p>Check your internet connection and try again. UpfynAI needs a network connection to work.</p>
81
+ <button class="retry-btn" onclick="location.reload()">Retry</button>
82
+ </div>
83
+ </body>
84
+ </html>
package/client/dist/sw.js CHANGED
@@ -1,82 +1,82 @@
1
- // Service Worker for Upfyn-Code
2
- // v4 — proper caching: cache-first for static assets, network-first for navigation
3
-
4
- const CACHE_NAME = 'upfyn-v4';
5
- const PRECACHE_ASSETS = [
6
- '/offline.html',
7
- '/favicon.svg',
8
- '/favicon.png',
9
- '/manifest.json',
10
- ];
11
-
12
- self.addEventListener('install', (event) => {
13
- event.waitUntil(
14
- caches.open(CACHE_NAME).then((cache) => cache.addAll(PRECACHE_ASSETS))
15
- );
16
- self.skipWaiting();
17
- });
18
-
19
- self.addEventListener('activate', (event) => {
20
- event.waitUntil(
21
- caches.keys().then((names) =>
22
- Promise.all(
23
- names
24
- .filter((n) => n !== CACHE_NAME)
25
- .map((n) => caches.delete(n))
26
- )
27
- )
28
- );
29
- self.clients.claim();
30
- });
31
-
32
- self.addEventListener('fetch', (event) => {
33
- const { request } = event;
34
- const url = new URL(request.url);
35
-
36
- // API calls and WebSocket: pass through, no caching
37
- if (
38
- url.pathname.startsWith('/api/') ||
39
- url.pathname.startsWith('/ws') ||
40
- url.pathname.startsWith('/shell') ||
41
- url.pathname.startsWith('/mcp')
42
- ) {
43
- return;
44
- }
45
-
46
- // Static assets (JS, CSS, images, fonts): cache-first
47
- if (
48
- request.destination === 'script' ||
49
- request.destination === 'style' ||
50
- request.destination === 'image' ||
51
- request.destination === 'font' ||
52
- url.pathname.startsWith('/icons/') ||
53
- url.pathname.startsWith('/assets/')
54
- ) {
55
- event.respondWith(
56
- caches.match(request).then((cached) => {
57
- if (cached) return cached;
58
- return fetch(request).then((response) => {
59
- if (response.ok) {
60
- const clone = response.clone();
61
- caches.open(CACHE_NAME).then((cache) => cache.put(request, clone));
62
- }
63
- return response;
64
- }).catch(() => caches.match(request));
65
- })
66
- );
67
- return;
68
- }
69
-
70
- // Navigation requests (HTML): network-first, offline fallback
71
- if (request.mode === 'navigate') {
72
- event.respondWith(
73
- fetch(request).catch(() => caches.match('/offline.html'))
74
- );
75
- return;
76
- }
77
-
78
- // Everything else: network with cache fallback
79
- event.respondWith(
80
- fetch(request).catch(() => caches.match(request))
81
- );
82
- });
1
+ // Service Worker for UpfynAI
2
+ // v4 — proper caching: cache-first for static assets, network-first for navigation
3
+
4
+ const CACHE_NAME = 'upfyn-v4';
5
+ const PRECACHE_ASSETS = [
6
+ '/offline.html',
7
+ '/favicon.svg',
8
+ '/favicon.png',
9
+ '/manifest.json',
10
+ ];
11
+
12
+ self.addEventListener('install', (event) => {
13
+ event.waitUntil(
14
+ caches.open(CACHE_NAME).then((cache) => cache.addAll(PRECACHE_ASSETS))
15
+ );
16
+ self.skipWaiting();
17
+ });
18
+
19
+ self.addEventListener('activate', (event) => {
20
+ event.waitUntil(
21
+ caches.keys().then((names) =>
22
+ Promise.all(
23
+ names
24
+ .filter((n) => n !== CACHE_NAME)
25
+ .map((n) => caches.delete(n))
26
+ )
27
+ )
28
+ );
29
+ self.clients.claim();
30
+ });
31
+
32
+ self.addEventListener('fetch', (event) => {
33
+ const { request } = event;
34
+ const url = new URL(request.url);
35
+
36
+ // API calls and WebSocket: pass through, no caching
37
+ if (
38
+ url.pathname.startsWith('/api/') ||
39
+ url.pathname.startsWith('/ws') ||
40
+ url.pathname.startsWith('/shell') ||
41
+ url.pathname.startsWith('/mcp')
42
+ ) {
43
+ return;
44
+ }
45
+
46
+ // Static assets (JS, CSS, images, fonts): cache-first
47
+ if (
48
+ request.destination === 'script' ||
49
+ request.destination === 'style' ||
50
+ request.destination === 'image' ||
51
+ request.destination === 'font' ||
52
+ url.pathname.startsWith('/icons/') ||
53
+ url.pathname.startsWith('/assets/')
54
+ ) {
55
+ event.respondWith(
56
+ caches.match(request).then((cached) => {
57
+ if (cached) return cached;
58
+ return fetch(request).then((response) => {
59
+ if (response.ok) {
60
+ const clone = response.clone();
61
+ caches.open(CACHE_NAME).then((cache) => cache.put(request, clone));
62
+ }
63
+ return response;
64
+ }).catch(() => caches.match(request));
65
+ })
66
+ );
67
+ return;
68
+ }
69
+
70
+ // Navigation requests (HTML): network-first, offline fallback
71
+ if (request.mode === 'navigate') {
72
+ event.respondWith(
73
+ fetch(request).catch(() => caches.match('/offline.html'))
74
+ );
75
+ return;
76
+ }
77
+
78
+ // Everything else: network with cache fallback
79
+ event.respondWith(
80
+ fetch(request).catch(() => caches.match(request))
81
+ );
82
+ });
package/package.json CHANGED
@@ -1,136 +1,136 @@
1
- {
2
- "name": "upfynai-code",
3
- "version": "3.0.2",
4
- "description": "Visual AI coding interface for Claude Code, Cursor & Codex. Canvas whiteboard, multi-agent chat, terminal, git, voice assistant. Self-host locally or connect to cli.upfyn.com for remote access.",
5
- "type": "module",
6
- "main": "server/index.js",
7
- "bin": {
8
- "upfynai-code": "server/cli.js",
9
- "uc": "server/cli.js"
10
- },
11
- "files": [
12
- "server/",
13
- "shared/",
14
- "client/dist/",
15
- "scripts/",
16
- "commands/",
17
- "README.md"
18
- ],
19
- "scripts": {
20
- "start": "node server/index.js",
21
- "build": "node scripts/build-client.js",
22
- "test": "node --test --test-force-exit server/tests/sessions.test.js server/tests/relay-flow.test.js",
23
- "typecheck": "npx tsc --noEmit -p client/tsconfig.json",
24
- "postinstall": "node scripts/fix-node-pty.js || true && node scripts/install-commands.js"
25
- },
26
- "keywords": [
27
- "ai",
28
- "ai-coding",
29
- "claude-code",
30
- "cursor",
31
- "codex",
32
- "coding-assistant",
33
- "canvas",
34
- "whiteboard",
35
- "visual-coding",
36
- "terminal",
37
- "git",
38
- "mcp",
39
- "relay",
40
- "byok",
41
- "voice-assistant",
42
- "upfynai",
43
- "thinqmesh"
44
- ],
45
- "author": "Thinqmesh Technologies <hello@thinqmesh.com>",
46
- "license": "GPL-3.0",
47
- "homepage": "https://thinqmesh.com",
48
- "repository": {
49
- "type": "git",
50
- "url": "git+https://github.com/AnitChaudhry/UpfynAI-Code.git"
51
- },
52
- "bugs": {
53
- "url": "https://github.com/AnitChaudhry/UpfynAI-Code/issues"
54
- },
55
- "dependencies": {
56
- "@anthropic-ai/claude-agent-sdk": "^0.1.71",
57
- "@anthropic-ai/sdk": "^0.78.0",
58
- "@iarna/toml": "^2.2.5",
59
- "@modelcontextprotocol/sdk": "^1.26.0",
60
- "@openai/codex-sdk": "^0.101.0",
61
- "bcryptjs": "^3.0.3",
62
- "chokidar": "^4.0.3",
63
- "cookie-parser": "^1.4.7",
64
- "cors": "^2.8.5",
65
- "cross-spawn": "^7.0.3",
66
- "edge-tts-universal": "^1.3.3",
67
- "express": "^4.18.2",
68
- "form-data": "^4.0.5",
69
- "gray-matter": "^4.0.3",
70
- "js-yaml": "^4.1.0",
71
- "jsonwebtoken": "^9.0.2",
72
- "mime-types": "^3.0.1",
73
- "multer": "^2.0.2",
74
- "ws": "^8.14.2",
75
- "zod": "^3.25.76"
76
- },
77
- "optionalDependencies": {
78
- "libsql": "^0.5.22",
79
- "node-pty": "^1.1.0-beta34"
80
- },
81
- "devDependencies": {
82
- "@codemirror/lang-css": "^6.3.1",
83
- "@codemirror/lang-html": "^6.4.9",
84
- "@codemirror/lang-javascript": "^6.2.4",
85
- "@codemirror/lang-json": "^6.0.1",
86
- "@codemirror/lang-markdown": "^6.3.3",
87
- "@codemirror/lang-python": "^6.2.1",
88
- "@codemirror/merge": "^6.11.1",
89
- "@codemirror/theme-one-dark": "^6.1.2",
90
- "@replit/codemirror-minimap": "^0.5.2",
91
- "@tailwindcss/typography": "^0.5.16",
92
- "@types/node": "^22.19.7",
93
- "@types/react": "^18.2.43",
94
- "@types/react-dom": "^18.2.17",
95
- "@uiw/react-codemirror": "^4.23.13",
96
- "@vapi-ai/web": "^2.5.2",
97
- "@vitejs/plugin-react": "^4.5.2",
98
- "@xterm/addon-clipboard": "^0.1.0",
99
- "@xterm/addon-fit": "^0.10.0",
100
- "@xterm/addon-web-links": "^0.11.0",
101
- "@xterm/addon-webgl": "^0.18.0",
102
- "@xterm/xterm": "^5.5.0",
103
- "@xyflow/react": "^12.10.1",
104
- "autoprefixer": "^10.4.16",
105
- "class-variance-authority": "^0.7.1",
106
- "clsx": "^2.1.1",
107
- "dagre": "^0.8.5",
108
- "elkjs": "^0.11.0",
109
- "fuse.js": "^7.0.0",
110
- "i18next": "^25.7.4",
111
- "i18next-browser-languagedetector": "^8.2.0",
112
- "katex": "^0.16.25",
113
- "lightningcss": "^1.31.1",
114
- "lucide-react": "^0.515.0",
115
- "mermaid": "^11.12.3",
116
- "pdfjs-dist": "^5.4.624",
117
- "postcss": "^8.4.32",
118
- "react": "^18.2.0",
119
- "react-diff-viewer-continued": "^4.1.2",
120
- "react-dom": "^18.2.0",
121
- "react-dropzone": "^14.2.3",
122
- "react-i18next": "^16.5.3",
123
- "react-markdown": "^10.1.0",
124
- "react-router-dom": "^6.8.1",
125
- "react-syntax-highlighter": "^15.6.1",
126
- "rehype-katex": "^7.0.1",
127
- "rehype-raw": "^7.0.0",
128
- "remark-gfm": "^4.0.0",
129
- "remark-math": "^6.0.0",
130
- "tailwind-merge": "^3.3.1",
131
- "tailwindcss": "^3.4.0",
132
- "typescript": "^5.9.3",
133
- "vite": "~6.3.5",
134
- "zustand": "^5.0.11"
135
- }
136
- }
1
+ {
2
+ "name": "upfynai-code",
3
+ "version": "3.0.4",
4
+ "description": "Visual AI coding interface for Claude Code, Cursor & Codex. Canvas whiteboard, multi-agent chat, terminal, git, voice assistant. Self-host locally or connect to cli.upfyn.com for remote access.",
5
+ "type": "module",
6
+ "main": "server/index.js",
7
+ "bin": {
8
+ "upfynai-code": "server/cli.js",
9
+ "uc": "server/cli.js"
10
+ },
11
+ "files": [
12
+ "server/",
13
+ "shared/",
14
+ "client/dist/",
15
+ "scripts/",
16
+ "commands/",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "start": "node server/index.js",
21
+ "build": "node scripts/build-client.js",
22
+ "test": "node --test --test-force-exit server/tests/sessions.test.js server/tests/relay-flow.test.js",
23
+ "typecheck": "npx tsc --noEmit -p client/tsconfig.json",
24
+ "postinstall": "node scripts/fix-node-pty.js || true && node scripts/install-commands.js"
25
+ },
26
+ "keywords": [
27
+ "ai",
28
+ "ai-coding",
29
+ "claude-code",
30
+ "cursor",
31
+ "codex",
32
+ "coding-assistant",
33
+ "canvas",
34
+ "whiteboard",
35
+ "visual-coding",
36
+ "terminal",
37
+ "git",
38
+ "mcp",
39
+ "relay",
40
+ "byok",
41
+ "voice-assistant",
42
+ "upfynai",
43
+ "thinqmesh"
44
+ ],
45
+ "author": "Thinqmesh Technologies <hello@thinqmesh.com>",
46
+ "license": "GPL-3.0",
47
+ "homepage": "https://thinqmesh.com",
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/AnitChaudhry/UpfynAI-Code.git"
51
+ },
52
+ "bugs": {
53
+ "url": "https://github.com/AnitChaudhry/UpfynAI-Code/issues"
54
+ },
55
+ "dependencies": {
56
+ "@anthropic-ai/claude-agent-sdk": "^0.1.71",
57
+ "@anthropic-ai/sdk": "^0.78.0",
58
+ "@iarna/toml": "^2.2.5",
59
+ "@modelcontextprotocol/sdk": "^1.26.0",
60
+ "@openai/codex-sdk": "^0.101.0",
61
+ "bcryptjs": "^3.0.3",
62
+ "chokidar": "^4.0.3",
63
+ "cookie-parser": "^1.4.7",
64
+ "cors": "^2.8.5",
65
+ "cross-spawn": "^7.0.3",
66
+ "edge-tts-universal": "^1.3.3",
67
+ "express": "^4.18.2",
68
+ "form-data": "^4.0.5",
69
+ "gray-matter": "^4.0.3",
70
+ "js-yaml": "^4.1.0",
71
+ "jsonwebtoken": "^9.0.2",
72
+ "mime-types": "^3.0.1",
73
+ "multer": "^2.0.2",
74
+ "ws": "^8.14.2",
75
+ "zod": "^3.25.76"
76
+ },
77
+ "optionalDependencies": {
78
+ "libsql": "^0.5.22",
79
+ "node-pty": "^1.1.0-beta34"
80
+ },
81
+ "devDependencies": {
82
+ "@codemirror/lang-css": "^6.3.1",
83
+ "@codemirror/lang-html": "^6.4.9",
84
+ "@codemirror/lang-javascript": "^6.2.4",
85
+ "@codemirror/lang-json": "^6.0.1",
86
+ "@codemirror/lang-markdown": "^6.3.3",
87
+ "@codemirror/lang-python": "^6.2.1",
88
+ "@codemirror/merge": "^6.11.1",
89
+ "@codemirror/theme-one-dark": "^6.1.2",
90
+ "@replit/codemirror-minimap": "^0.5.2",
91
+ "@tailwindcss/typography": "^0.5.16",
92
+ "@types/node": "^22.19.7",
93
+ "@types/react": "^18.2.43",
94
+ "@types/react-dom": "^18.2.17",
95
+ "@uiw/react-codemirror": "^4.23.13",
96
+ "@vapi-ai/web": "^2.5.2",
97
+ "@vitejs/plugin-react": "^4.5.2",
98
+ "@xterm/addon-clipboard": "^0.1.0",
99
+ "@xterm/addon-fit": "^0.10.0",
100
+ "@xterm/addon-web-links": "^0.11.0",
101
+ "@xterm/addon-webgl": "^0.18.0",
102
+ "@xterm/xterm": "^5.5.0",
103
+ "@xyflow/react": "^12.10.1",
104
+ "autoprefixer": "^10.4.16",
105
+ "class-variance-authority": "^0.7.1",
106
+ "clsx": "^2.1.1",
107
+ "dagre": "^0.8.5",
108
+ "elkjs": "^0.11.0",
109
+ "fuse.js": "^7.0.0",
110
+ "i18next": "^25.7.4",
111
+ "i18next-browser-languagedetector": "^8.2.0",
112
+ "katex": "^0.16.25",
113
+ "lightningcss": "^1.31.1",
114
+ "lucide-react": "^0.515.0",
115
+ "mermaid": "^11.12.3",
116
+ "pdfjs-dist": "^5.4.624",
117
+ "postcss": "^8.4.32",
118
+ "react": "^18.2.0",
119
+ "react-diff-viewer-continued": "^4.1.2",
120
+ "react-dom": "^18.2.0",
121
+ "react-dropzone": "^14.2.3",
122
+ "react-i18next": "^16.5.3",
123
+ "react-markdown": "^10.1.0",
124
+ "react-router-dom": "^6.8.1",
125
+ "react-syntax-highlighter": "^15.6.1",
126
+ "rehype-katex": "^7.0.1",
127
+ "rehype-raw": "^7.0.0",
128
+ "remark-gfm": "^4.0.0",
129
+ "remark-math": "^6.0.0",
130
+ "tailwind-merge": "^3.3.1",
131
+ "tailwindcss": "^3.4.0",
132
+ "typescript": "^5.9.3",
133
+ "vite": "~6.3.5",
134
+ "zustand": "^5.0.11"
135
+ }
136
+ }