@siteboon/claude-code-ui 1.8.2 → 1.8.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.
- package/dist/assets/index-CeR_JfKq.js +895 -0
- package/dist/assets/index-Co7ALK3i.css +32 -0
- package/{index.html → dist/index.html} +2 -1
- package/package.json +6 -1
- package/server/database/auth.db +0 -0
- package/.env.example +0 -12
- package/.nvmrc +0 -1
- package/postcss.config.js +0 -6
- package/src/App.jsx +0 -751
- package/src/components/ChatInterface.jsx +0 -3485
- package/src/components/ClaudeLogo.jsx +0 -11
- package/src/components/ClaudeStatus.jsx +0 -107
- package/src/components/CodeEditor.jsx +0 -422
- package/src/components/CreateTaskModal.jsx +0 -88
- package/src/components/CursorLogo.jsx +0 -9
- package/src/components/DarkModeToggle.jsx +0 -35
- package/src/components/DiffViewer.jsx +0 -41
- package/src/components/ErrorBoundary.jsx +0 -73
- package/src/components/FileTree.jsx +0 -480
- package/src/components/GitPanel.jsx +0 -1283
- package/src/components/ImageViewer.jsx +0 -54
- package/src/components/LoginForm.jsx +0 -110
- package/src/components/MainContent.jsx +0 -577
- package/src/components/MicButton.jsx +0 -272
- package/src/components/MobileNav.jsx +0 -88
- package/src/components/NextTaskBanner.jsx +0 -695
- package/src/components/PRDEditor.jsx +0 -871
- package/src/components/ProtectedRoute.jsx +0 -44
- package/src/components/QuickSettingsPanel.jsx +0 -262
- package/src/components/Settings.jsx +0 -2023
- package/src/components/SetupForm.jsx +0 -135
- package/src/components/Shell.jsx +0 -663
- package/src/components/Sidebar.jsx +0 -1665
- package/src/components/StandaloneShell.jsx +0 -106
- package/src/components/TaskCard.jsx +0 -210
- package/src/components/TaskDetail.jsx +0 -406
- package/src/components/TaskIndicator.jsx +0 -108
- package/src/components/TaskList.jsx +0 -1054
- package/src/components/TaskMasterSetupWizard.jsx +0 -603
- package/src/components/TaskMasterStatus.jsx +0 -86
- package/src/components/TodoList.jsx +0 -91
- package/src/components/Tooltip.jsx +0 -91
- package/src/components/ui/badge.jsx +0 -31
- package/src/components/ui/button.jsx +0 -46
- package/src/components/ui/input.jsx +0 -19
- package/src/components/ui/scroll-area.jsx +0 -23
- package/src/contexts/AuthContext.jsx +0 -158
- package/src/contexts/TaskMasterContext.jsx +0 -324
- package/src/contexts/TasksSettingsContext.jsx +0 -95
- package/src/contexts/ThemeContext.jsx +0 -94
- package/src/contexts/WebSocketContext.jsx +0 -29
- package/src/hooks/useAudioRecorder.js +0 -109
- package/src/hooks/useVersionCheck.js +0 -39
- package/src/index.css +0 -822
- package/src/lib/utils.js +0 -6
- package/src/main.jsx +0 -10
- package/src/utils/api.js +0 -141
- package/src/utils/websocket.js +0 -109
- package/src/utils/whisper.js +0 -37
- package/tailwind.config.js +0 -63
- package/vite.config.js +0 -29
- /package/{public → dist}/convert-icons.md +0 -0
- /package/{public → dist}/favicon.png +0 -0
- /package/{public → dist}/favicon.svg +0 -0
- /package/{public → dist}/generate-icons.js +0 -0
- /package/{public → dist}/icons/claude-ai-icon.svg +0 -0
- /package/{public → dist}/icons/cursor.svg +0 -0
- /package/{public → dist}/icons/generate-icons.md +0 -0
- /package/{public → dist}/icons/icon-128x128.png +0 -0
- /package/{public → dist}/icons/icon-128x128.svg +0 -0
- /package/{public → dist}/icons/icon-144x144.png +0 -0
- /package/{public → dist}/icons/icon-144x144.svg +0 -0
- /package/{public → dist}/icons/icon-152x152.png +0 -0
- /package/{public → dist}/icons/icon-152x152.svg +0 -0
- /package/{public → dist}/icons/icon-192x192.png +0 -0
- /package/{public → dist}/icons/icon-192x192.svg +0 -0
- /package/{public → dist}/icons/icon-384x384.png +0 -0
- /package/{public → dist}/icons/icon-384x384.svg +0 -0
- /package/{public → dist}/icons/icon-512x512.png +0 -0
- /package/{public → dist}/icons/icon-512x512.svg +0 -0
- /package/{public → dist}/icons/icon-72x72.png +0 -0
- /package/{public → dist}/icons/icon-72x72.svg +0 -0
- /package/{public → dist}/icons/icon-96x96.png +0 -0
- /package/{public → dist}/icons/icon-96x96.svg +0 -0
- /package/{public → dist}/icons/icon-template.svg +0 -0
- /package/{public → dist}/logo.svg +0 -0
- /package/{public → dist}/manifest.json +0 -0
- /package/{public → dist}/screenshots/cli-selection.png +0 -0
- /package/{public → dist}/screenshots/desktop-main.png +0 -0
- /package/{public → dist}/screenshots/mobile-chat.png +0 -0
- /package/{public → dist}/screenshots/tools-modal.png +0 -0
- /package/{public → dist}/sw.js +0 -0
package/src/lib/utils.js
DELETED
package/src/main.jsx
DELETED
package/src/utils/api.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
// Utility function for authenticated API calls
|
|
2
|
-
export const authenticatedFetch = (url, options = {}) => {
|
|
3
|
-
const token = localStorage.getItem('auth-token');
|
|
4
|
-
|
|
5
|
-
const defaultHeaders = {
|
|
6
|
-
'Content-Type': 'application/json',
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
if (token) {
|
|
10
|
-
defaultHeaders['Authorization'] = `Bearer ${token}`;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
return fetch(url, {
|
|
14
|
-
...options,
|
|
15
|
-
headers: {
|
|
16
|
-
...defaultHeaders,
|
|
17
|
-
...options.headers,
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
// API endpoints
|
|
23
|
-
export const api = {
|
|
24
|
-
// Auth endpoints (no token required)
|
|
25
|
-
auth: {
|
|
26
|
-
status: () => fetch('/api/auth/status'),
|
|
27
|
-
login: (username, password) => fetch('/api/auth/login', {
|
|
28
|
-
method: 'POST',
|
|
29
|
-
headers: { 'Content-Type': 'application/json' },
|
|
30
|
-
body: JSON.stringify({ username, password }),
|
|
31
|
-
}),
|
|
32
|
-
register: (username, password) => fetch('/api/auth/register', {
|
|
33
|
-
method: 'POST',
|
|
34
|
-
headers: { 'Content-Type': 'application/json' },
|
|
35
|
-
body: JSON.stringify({ username, password }),
|
|
36
|
-
}),
|
|
37
|
-
user: () => authenticatedFetch('/api/auth/user'),
|
|
38
|
-
logout: () => authenticatedFetch('/api/auth/logout', { method: 'POST' }),
|
|
39
|
-
},
|
|
40
|
-
|
|
41
|
-
// Protected endpoints
|
|
42
|
-
config: () => authenticatedFetch('/api/config'),
|
|
43
|
-
projects: () => authenticatedFetch('/api/projects'),
|
|
44
|
-
sessions: (projectName, limit = 5, offset = 0) =>
|
|
45
|
-
authenticatedFetch(`/api/projects/${projectName}/sessions?limit=${limit}&offset=${offset}`),
|
|
46
|
-
sessionMessages: (projectName, sessionId, limit = null, offset = 0) => {
|
|
47
|
-
const params = new URLSearchParams();
|
|
48
|
-
if (limit !== null) {
|
|
49
|
-
params.append('limit', limit);
|
|
50
|
-
params.append('offset', offset);
|
|
51
|
-
}
|
|
52
|
-
const queryString = params.toString();
|
|
53
|
-
const url = `/api/projects/${projectName}/sessions/${sessionId}/messages${queryString ? `?${queryString}` : ''}`;
|
|
54
|
-
return authenticatedFetch(url);
|
|
55
|
-
},
|
|
56
|
-
renameProject: (projectName, displayName) =>
|
|
57
|
-
authenticatedFetch(`/api/projects/${projectName}/rename`, {
|
|
58
|
-
method: 'PUT',
|
|
59
|
-
body: JSON.stringify({ displayName }),
|
|
60
|
-
}),
|
|
61
|
-
deleteSession: (projectName, sessionId) =>
|
|
62
|
-
authenticatedFetch(`/api/projects/${projectName}/sessions/${sessionId}`, {
|
|
63
|
-
method: 'DELETE',
|
|
64
|
-
}),
|
|
65
|
-
deleteProject: (projectName) =>
|
|
66
|
-
authenticatedFetch(`/api/projects/${projectName}`, {
|
|
67
|
-
method: 'DELETE',
|
|
68
|
-
}),
|
|
69
|
-
createProject: (path) =>
|
|
70
|
-
authenticatedFetch('/api/projects/create', {
|
|
71
|
-
method: 'POST',
|
|
72
|
-
body: JSON.stringify({ path }),
|
|
73
|
-
}),
|
|
74
|
-
readFile: (projectName, filePath) =>
|
|
75
|
-
authenticatedFetch(`/api/projects/${projectName}/file?filePath=${encodeURIComponent(filePath)}`),
|
|
76
|
-
saveFile: (projectName, filePath, content) =>
|
|
77
|
-
authenticatedFetch(`/api/projects/${projectName}/file`, {
|
|
78
|
-
method: 'PUT',
|
|
79
|
-
body: JSON.stringify({ filePath, content }),
|
|
80
|
-
}),
|
|
81
|
-
getFiles: (projectName) =>
|
|
82
|
-
authenticatedFetch(`/api/projects/${projectName}/files`),
|
|
83
|
-
transcribe: (formData) =>
|
|
84
|
-
authenticatedFetch('/api/transcribe', {
|
|
85
|
-
method: 'POST',
|
|
86
|
-
body: formData,
|
|
87
|
-
headers: {}, // Let browser set Content-Type for FormData
|
|
88
|
-
}),
|
|
89
|
-
|
|
90
|
-
// TaskMaster endpoints
|
|
91
|
-
taskmaster: {
|
|
92
|
-
// Initialize TaskMaster in a project
|
|
93
|
-
init: (projectName) =>
|
|
94
|
-
authenticatedFetch(`/api/taskmaster/init/${projectName}`, {
|
|
95
|
-
method: 'POST',
|
|
96
|
-
}),
|
|
97
|
-
|
|
98
|
-
// Add a new task
|
|
99
|
-
addTask: (projectName, { prompt, title, description, priority, dependencies }) =>
|
|
100
|
-
authenticatedFetch(`/api/taskmaster/add-task/${projectName}`, {
|
|
101
|
-
method: 'POST',
|
|
102
|
-
body: JSON.stringify({ prompt, title, description, priority, dependencies }),
|
|
103
|
-
}),
|
|
104
|
-
|
|
105
|
-
// Parse PRD to generate tasks
|
|
106
|
-
parsePRD: (projectName, { fileName, numTasks, append }) =>
|
|
107
|
-
authenticatedFetch(`/api/taskmaster/parse-prd/${projectName}`, {
|
|
108
|
-
method: 'POST',
|
|
109
|
-
body: JSON.stringify({ fileName, numTasks, append }),
|
|
110
|
-
}),
|
|
111
|
-
|
|
112
|
-
// Get available PRD templates
|
|
113
|
-
getTemplates: () =>
|
|
114
|
-
authenticatedFetch('/api/taskmaster/prd-templates'),
|
|
115
|
-
|
|
116
|
-
// Apply a PRD template
|
|
117
|
-
applyTemplate: (projectName, { templateId, fileName, customizations }) =>
|
|
118
|
-
authenticatedFetch(`/api/taskmaster/apply-template/${projectName}`, {
|
|
119
|
-
method: 'POST',
|
|
120
|
-
body: JSON.stringify({ templateId, fileName, customizations }),
|
|
121
|
-
}),
|
|
122
|
-
|
|
123
|
-
// Update a task
|
|
124
|
-
updateTask: (projectName, taskId, updates) =>
|
|
125
|
-
authenticatedFetch(`/api/taskmaster/update-task/${projectName}/${taskId}`, {
|
|
126
|
-
method: 'PUT',
|
|
127
|
-
body: JSON.stringify(updates),
|
|
128
|
-
}),
|
|
129
|
-
},
|
|
130
|
-
|
|
131
|
-
// Browse filesystem for project suggestions
|
|
132
|
-
browseFilesystem: (dirPath = null) => {
|
|
133
|
-
const params = new URLSearchParams();
|
|
134
|
-
if (dirPath) params.append('path', dirPath);
|
|
135
|
-
|
|
136
|
-
return authenticatedFetch(`/api/browse-filesystem?${params}`);
|
|
137
|
-
},
|
|
138
|
-
|
|
139
|
-
// Generic GET method for any endpoint
|
|
140
|
-
get: (endpoint) => authenticatedFetch(`/api${endpoint}`),
|
|
141
|
-
};
|
package/src/utils/websocket.js
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { useState, useEffect, useRef } from 'react';
|
|
2
|
-
|
|
3
|
-
export function useWebSocket() {
|
|
4
|
-
const [ws, setWs] = useState(null);
|
|
5
|
-
const [messages, setMessages] = useState([]);
|
|
6
|
-
const [isConnected, setIsConnected] = useState(false);
|
|
7
|
-
const reconnectTimeoutRef = useRef(null);
|
|
8
|
-
|
|
9
|
-
useEffect(() => {
|
|
10
|
-
connect();
|
|
11
|
-
|
|
12
|
-
return () => {
|
|
13
|
-
if (reconnectTimeoutRef.current) {
|
|
14
|
-
clearTimeout(reconnectTimeoutRef.current);
|
|
15
|
-
}
|
|
16
|
-
if (ws) {
|
|
17
|
-
ws.close();
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
}, []); // Keep dependency array but add proper cleanup
|
|
21
|
-
|
|
22
|
-
const connect = async () => {
|
|
23
|
-
try {
|
|
24
|
-
// Get authentication token
|
|
25
|
-
const token = localStorage.getItem('auth-token');
|
|
26
|
-
if (!token) {
|
|
27
|
-
console.warn('No authentication token found for WebSocket connection');
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Fetch server configuration to get the correct WebSocket URL
|
|
32
|
-
let wsBaseUrl;
|
|
33
|
-
try {
|
|
34
|
-
const configResponse = await fetch('/api/config', {
|
|
35
|
-
headers: {
|
|
36
|
-
'Authorization': `Bearer ${token}`
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
const config = await configResponse.json();
|
|
40
|
-
wsBaseUrl = config.wsUrl;
|
|
41
|
-
|
|
42
|
-
// If the config returns localhost but we're not on localhost, use current host but with API server port
|
|
43
|
-
if (wsBaseUrl.includes('localhost') && !window.location.hostname.includes('localhost')) {
|
|
44
|
-
console.warn('Config returned localhost, using current host with API server port instead');
|
|
45
|
-
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
46
|
-
// For development, API server is typically on port 3002 when Vite is on 3001
|
|
47
|
-
const apiPort = window.location.port === '3001' ? '3002' : window.location.port;
|
|
48
|
-
wsBaseUrl = `${protocol}//${window.location.hostname}:${apiPort}`;
|
|
49
|
-
}
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.warn('Could not fetch server config, falling back to current host with API server port');
|
|
52
|
-
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
53
|
-
// For development, API server is typically on port 3002 when Vite is on 3001
|
|
54
|
-
const apiPort = window.location.port === '3001' ? '3002' : window.location.port;
|
|
55
|
-
wsBaseUrl = `${protocol}//${window.location.hostname}:${apiPort}`;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Include token in WebSocket URL as query parameter
|
|
59
|
-
const wsUrl = `${wsBaseUrl}/ws?token=${encodeURIComponent(token)}`;
|
|
60
|
-
const websocket = new WebSocket(wsUrl);
|
|
61
|
-
|
|
62
|
-
websocket.onopen = () => {
|
|
63
|
-
setIsConnected(true);
|
|
64
|
-
setWs(websocket);
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
websocket.onmessage = (event) => {
|
|
68
|
-
try {
|
|
69
|
-
const data = JSON.parse(event.data);
|
|
70
|
-
setMessages(prev => [...prev, data]);
|
|
71
|
-
} catch (error) {
|
|
72
|
-
console.error('Error parsing WebSocket message:', error);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
websocket.onclose = () => {
|
|
77
|
-
setIsConnected(false);
|
|
78
|
-
setWs(null);
|
|
79
|
-
|
|
80
|
-
// Attempt to reconnect after 3 seconds
|
|
81
|
-
reconnectTimeoutRef.current = setTimeout(() => {
|
|
82
|
-
connect();
|
|
83
|
-
}, 3000);
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
websocket.onerror = (error) => {
|
|
87
|
-
console.error('WebSocket error:', error);
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
} catch (error) {
|
|
91
|
-
console.error('Error creating WebSocket connection:', error);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
const sendMessage = (message) => {
|
|
96
|
-
if (ws && isConnected) {
|
|
97
|
-
ws.send(JSON.stringify(message));
|
|
98
|
-
} else {
|
|
99
|
-
console.warn('WebSocket not connected');
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
ws,
|
|
105
|
-
sendMessage,
|
|
106
|
-
messages,
|
|
107
|
-
isConnected
|
|
108
|
-
};
|
|
109
|
-
}
|
package/src/utils/whisper.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { api } from './api';
|
|
2
|
-
|
|
3
|
-
export async function transcribeWithWhisper(audioBlob, onStatusChange) {
|
|
4
|
-
const formData = new FormData();
|
|
5
|
-
const fileName = `recording_${Date.now()}.webm`;
|
|
6
|
-
const file = new File([audioBlob], fileName, { type: audioBlob.type });
|
|
7
|
-
|
|
8
|
-
formData.append('audio', file);
|
|
9
|
-
|
|
10
|
-
const whisperMode = window.localStorage.getItem('whisperMode') || 'default';
|
|
11
|
-
formData.append('mode', whisperMode);
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
// Start with transcribing state
|
|
15
|
-
if (onStatusChange) {
|
|
16
|
-
onStatusChange('transcribing');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const response = await api.transcribe(formData);
|
|
20
|
-
|
|
21
|
-
if (!response.ok) {
|
|
22
|
-
const errorData = await response.json().catch(() => ({}));
|
|
23
|
-
throw new Error(
|
|
24
|
-
errorData.error ||
|
|
25
|
-
`Transcription error: ${response.status} ${response.statusText}`
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const data = await response.json();
|
|
30
|
-
return data.text || '';
|
|
31
|
-
} catch (error) {
|
|
32
|
-
if (error.name === 'TypeError' && error.message.includes('fetch')) {
|
|
33
|
-
throw new Error('Cannot connect to server. Please ensure the backend is running.');
|
|
34
|
-
}
|
|
35
|
-
throw error;
|
|
36
|
-
}
|
|
37
|
-
}
|
package/tailwind.config.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/** @type {import('tailwindcss').Config} */
|
|
2
|
-
export default {
|
|
3
|
-
darkMode: ["class"],
|
|
4
|
-
content: [
|
|
5
|
-
"./index.html",
|
|
6
|
-
"./src/**/*.{js,ts,jsx,tsx}",
|
|
7
|
-
],
|
|
8
|
-
theme: {
|
|
9
|
-
container: {
|
|
10
|
-
center: true,
|
|
11
|
-
padding: "2rem",
|
|
12
|
-
screens: {
|
|
13
|
-
"2xl": "1400px",
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
extend: {
|
|
17
|
-
colors: {
|
|
18
|
-
border: "hsl(var(--border))",
|
|
19
|
-
input: "hsl(var(--input))",
|
|
20
|
-
ring: "hsl(var(--ring))",
|
|
21
|
-
background: "hsl(var(--background))",
|
|
22
|
-
foreground: "hsl(var(--foreground))",
|
|
23
|
-
primary: {
|
|
24
|
-
DEFAULT: "hsl(var(--primary))",
|
|
25
|
-
foreground: "hsl(var(--primary-foreground))",
|
|
26
|
-
},
|
|
27
|
-
secondary: {
|
|
28
|
-
DEFAULT: "hsl(var(--secondary))",
|
|
29
|
-
foreground: "hsl(var(--secondary-foreground))",
|
|
30
|
-
},
|
|
31
|
-
destructive: {
|
|
32
|
-
DEFAULT: "hsl(var(--destructive))",
|
|
33
|
-
foreground: "hsl(var(--destructive-foreground))",
|
|
34
|
-
},
|
|
35
|
-
muted: {
|
|
36
|
-
DEFAULT: "hsl(var(--muted))",
|
|
37
|
-
foreground: "hsl(var(--muted-foreground))",
|
|
38
|
-
},
|
|
39
|
-
accent: {
|
|
40
|
-
DEFAULT: "hsl(var(--accent))",
|
|
41
|
-
foreground: "hsl(var(--accent-foreground))",
|
|
42
|
-
},
|
|
43
|
-
popover: {
|
|
44
|
-
DEFAULT: "hsl(var(--popover))",
|
|
45
|
-
foreground: "hsl(var(--popover-foreground))",
|
|
46
|
-
},
|
|
47
|
-
card: {
|
|
48
|
-
DEFAULT: "hsl(var(--card))",
|
|
49
|
-
foreground: "hsl(var(--card-foreground))",
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
borderRadius: {
|
|
53
|
-
lg: "var(--radius)",
|
|
54
|
-
md: "calc(var(--radius) - 2px)",
|
|
55
|
-
sm: "calc(var(--radius) - 4px)",
|
|
56
|
-
},
|
|
57
|
-
spacing: {
|
|
58
|
-
'safe-area-inset-bottom': 'env(safe-area-inset-bottom)',
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
plugins: [require('@tailwindcss/typography')],
|
|
63
|
-
}
|
package/vite.config.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { defineConfig, loadEnv } from 'vite'
|
|
2
|
-
import react from '@vitejs/plugin-react'
|
|
3
|
-
|
|
4
|
-
export default defineConfig(({ command, mode }) => {
|
|
5
|
-
// Load env file based on `mode` in the current working directory.
|
|
6
|
-
const env = loadEnv(mode, process.cwd(), '')
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return {
|
|
10
|
-
plugins: [react()],
|
|
11
|
-
server: {
|
|
12
|
-
port: parseInt(env.VITE_PORT) || 5173,
|
|
13
|
-
proxy: {
|
|
14
|
-
'/api': `http://localhost:${env.PORT || 3001}`,
|
|
15
|
-
'/ws': {
|
|
16
|
-
target: `ws://localhost:${env.PORT || 3001}`,
|
|
17
|
-
ws: true
|
|
18
|
-
},
|
|
19
|
-
'/shell': {
|
|
20
|
-
target: `ws://localhost:${env.PORT || 3002}`,
|
|
21
|
-
ws: true
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
build: {
|
|
26
|
-
outDir: 'dist'
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
})
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{public → dist}/sw.js
RENAMED
|
File without changes
|