agentstudio 0.1.8 → 0.1.10
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/README.md +481 -37
- package/README.zh-CN.md +525 -0
- package/{dist → backend/dist}/bin/agentstudio.js +7 -5
- package/backend/dist/bin/agentstudio.js.map +1 -0
- package/backend/dist/index.d.ts +3 -0
- package/backend/dist/index.d.ts.map +1 -0
- package/{dist → backend/dist}/index.js +9 -28
- package/{dist → backend/dist}/index.js.map +1 -1
- package/{dist → backend/dist}/routes/settings.js +1 -1
- package/{dist → backend/dist}/routes/settings.js.map +1 -1
- package/package.json +35 -43
- package/.cc-sessions/ppt-editor/session_1756253549429_uau1hm6lh.json +0 -665
- package/.cc-sessions/ppt-editor/session_1756257240855_v0wa26mde.json +0 -394
- package/.env +0 -15
- package/dist/bin/agentstudio.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/docs/chat-clean-1.svg +0 -1
- package/docs/chat-clean.md +0 -60
- package/docs/chat-comprehensive-1.svg +0 -1
- package/docs/chat-comprehensive.md +0 -166
- package/docs/chat_api_sequence_diagram.md +0 -58
- package/docs/command-detection-logic.md +0 -306
- package/docs/command-detection-sequence.md +0 -186
- package/frontend/dist/assets/AgentsPage-Dqb_aqAA.js +0 -1
- package/frontend/dist/assets/ChatPage-BvQmXfcP.css +0 -1
- package/frontend/dist/assets/ChatPage-L8Paywyc.js +0 -91
- package/frontend/dist/assets/CommandForm-DLl7EIMS.js +0 -7
- package/frontend/dist/assets/CommandsPage-Bzavq0Ec.js +0 -1
- package/frontend/dist/assets/DashboardPage-B3o4AYFT.js +0 -15
- package/frontend/dist/assets/FileBrowser-DL3ayaqb.js +0 -1
- package/frontend/dist/assets/GeneralSettingsPage-CBN_de-V.js +0 -1
- package/frontend/dist/assets/LandingPage-Dl4ioKos.js +0 -1
- package/frontend/dist/assets/LoginPage-4QqRdiSi.js +0 -12
- package/frontend/dist/assets/McpPage-CY3tYiqj.js +0 -39
- package/frontend/dist/assets/MemorySettingsPage-DGxrok5K.js +0 -1
- package/frontend/dist/assets/ProjectSelector-hgmGYVFh.js +0 -1
- package/frontend/dist/assets/ProjectsPage-D399IM0c.js +0 -14
- package/frontend/dist/assets/SettingsLayout-CL_K-lzJ.js +0 -1
- package/frontend/dist/assets/SubagentForm-DXtTTIKg.js +0 -7
- package/frontend/dist/assets/SubagentsPage-Chbhj8p2.js +0 -1
- package/frontend/dist/assets/ToastTestPage-DT4wuN5C.js +0 -1
- package/frontend/dist/assets/UnifiedToolSelector-CsM9qBvs.js +0 -1
- package/frontend/dist/assets/VersionSettingsPage-74Q-LVgA.js +0 -5
- package/frontend/dist/assets/agents-ClAzIJTw.js +0 -1
- package/frontend/dist/assets/agents-DwCY2K8p.css +0 -1
- package/frontend/dist/assets/authFetch-BATQyPG5.js +0 -1
- package/frontend/dist/assets/data-structures-DLJedtzx.js +0 -27
- package/frontend/dist/assets/dateFormat-CXa8VnEC.js +0 -1
- package/frontend/dist/assets/index-B9YHa7XT.css +0 -1
- package/frontend/dist/assets/index-B_CTNvca.js +0 -268
- package/frontend/dist/assets/monaco-editor-C7Z4sOhS.js +0 -19
- package/frontend/dist/assets/syntax-highlighting-YWvMU4Hm.js +0 -24
- package/frontend/dist/assets/tabManager-DV8urRBM.js +0 -30
- package/frontend/dist/assets/table-D6q1rytw.js +0 -1
- package/frontend/dist/assets/tools-C4EPanYi.js +0 -1
- package/frontend/dist/assets/ui-components-Cw21Epuw.js +0 -481
- package/frontend/dist/assets/useAgents-DwnOE1_k.js +0 -2
- package/frontend/dist/assets/useClaudeVersions-CQdGnCqv.js +0 -1
- package/frontend/dist/assets/useCommands-CCVaurbt.js +0 -1
- package/frontend/dist/cc-studio.png +0 -0
- package/frontend/dist/index.html +0 -70
- package/frontend/dist/vite.svg +0 -1
- package/scripts/README.md +0 -76
- package/scripts/fix-project-names.js +0 -113
- package/scripts/migrate-projects.js +0 -159
- package/shared/index.d.ts +0 -6
- package/shared/index.d.ts.map +0 -1
- package/shared/index.js +0 -7
- package/shared/types/agents.d.ts +0 -80
- package/shared/types/agents.d.ts.map +0 -1
- package/shared/types/agents.js +0 -145
- package/shared/types/claude-history.d.ts +0 -61
- package/shared/types/claude-history.d.ts.map +0 -1
- package/shared/types/claude-history.js +0 -2
- package/shared/types/claude-versions.d.ts +0 -40
- package/shared/types/claude-versions.d.ts.map +0 -1
- package/shared/types/claude-versions.js +0 -1
- package/shared/types/commands.d.ts +0 -48
- package/shared/types/commands.d.ts.map +0 -1
- package/shared/types/commands.js +0 -19
- package/shared/types/projects.d.ts +0 -35
- package/shared/types/projects.d.ts.map +0 -1
- package/shared/types/projects.js +0 -2
- package/shared/types/subagents.d.ts +0 -26
- package/shared/types/subagents.d.ts.map +0 -1
- package/shared/types/subagents.js +0 -1
- package/shared/utils/agentStorage.d.ts +0 -27
- package/shared/utils/agentStorage.d.ts.map +0 -1
- package/shared/utils/agentStorage.js +0 -392
- package/shared/utils/claudeVersionStorage.d.ts +0 -16
- package/shared/utils/claudeVersionStorage.d.ts.map +0 -1
- package/shared/utils/claudeVersionStorage.js +0 -230
- package/shared/utils/projectMetadataStorage.d.ts +0 -94
- package/shared/utils/projectMetadataStorage.d.ts.map +0 -1
- package/shared/utils/projectMetadataStorage.js +0 -422
- package/shared/utils/toolMapping.d.ts +0 -56
- package/shared/utils/toolMapping.d.ts.map +0 -1
- package/shared/utils/toolMapping.js +0 -71
- package/src/bin/agentstudio.ts +0 -130
- package/src/index.ts +0 -183
- package/src/middleware/auth.ts +0 -26
- package/src/routes/agents.ts +0 -884
- package/src/routes/auth.ts +0 -73
- package/src/routes/commands.ts +0 -441
- package/src/routes/files.ts +0 -352
- package/src/routes/mcp.ts +0 -751
- package/src/routes/media.ts +0 -140
- package/src/routes/projects.ts +0 -601
- package/src/routes/sessions.ts +0 -809
- package/src/routes/settings.ts +0 -718
- package/src/routes/slides.ts +0 -170
- package/src/routes/subagents.ts +0 -364
- package/src/services/claudeSession.ts +0 -293
- package/src/services/messageQueue.ts +0 -71
- package/src/services/sessionManager.ts +0 -532
- package/src/utils/jwt.ts +0 -36
- package/tsconfig.json +0 -27
- /package/{dist → backend/dist}/bin/agentstudio.d.ts +0 -0
- /package/{dist → backend/dist}/bin/agentstudio.d.ts.map +0 -0
- /package/{dist → backend/dist}/middleware/auth.d.ts +0 -0
- /package/{dist → backend/dist}/middleware/auth.d.ts.map +0 -0
- /package/{dist → backend/dist}/middleware/auth.js +0 -0
- /package/{dist → backend/dist}/middleware/auth.js.map +0 -0
- /package/{dist → backend/dist}/routes/agents.d.ts +0 -0
- /package/{dist → backend/dist}/routes/agents.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/agents.js +0 -0
- /package/{dist → backend/dist}/routes/agents.js.map +0 -0
- /package/{dist → backend/dist}/routes/auth.d.ts +0 -0
- /package/{dist → backend/dist}/routes/auth.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/auth.js +0 -0
- /package/{dist → backend/dist}/routes/auth.js.map +0 -0
- /package/{dist → backend/dist}/routes/commands.d.ts +0 -0
- /package/{dist → backend/dist}/routes/commands.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/commands.js +0 -0
- /package/{dist → backend/dist}/routes/commands.js.map +0 -0
- /package/{dist → backend/dist}/routes/files.d.ts +0 -0
- /package/{dist → backend/dist}/routes/files.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/files.js +0 -0
- /package/{dist → backend/dist}/routes/files.js.map +0 -0
- /package/{dist → backend/dist}/routes/mcp.d.ts +0 -0
- /package/{dist → backend/dist}/routes/mcp.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/mcp.js +0 -0
- /package/{dist → backend/dist}/routes/mcp.js.map +0 -0
- /package/{dist → backend/dist}/routes/media.d.ts +0 -0
- /package/{dist → backend/dist}/routes/media.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/media.js +0 -0
- /package/{dist → backend/dist}/routes/media.js.map +0 -0
- /package/{dist → backend/dist}/routes/projects.d.ts +0 -0
- /package/{dist → backend/dist}/routes/projects.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/projects.js +0 -0
- /package/{dist → backend/dist}/routes/projects.js.map +0 -0
- /package/{dist → backend/dist}/routes/sessions.d.ts +0 -0
- /package/{dist → backend/dist}/routes/sessions.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/sessions.js +0 -0
- /package/{dist → backend/dist}/routes/sessions.js.map +0 -0
- /package/{dist → backend/dist}/routes/settings.d.ts +0 -0
- /package/{dist → backend/dist}/routes/settings.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/slides.d.ts +0 -0
- /package/{dist → backend/dist}/routes/slides.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/slides.js +0 -0
- /package/{dist → backend/dist}/routes/slides.js.map +0 -0
- /package/{dist → backend/dist}/routes/subagents.d.ts +0 -0
- /package/{dist → backend/dist}/routes/subagents.d.ts.map +0 -0
- /package/{dist → backend/dist}/routes/subagents.js +0 -0
- /package/{dist → backend/dist}/routes/subagents.js.map +0 -0
- /package/{dist → backend/dist}/services/claudeSession.d.ts +0 -0
- /package/{dist → backend/dist}/services/claudeSession.d.ts.map +0 -0
- /package/{dist → backend/dist}/services/claudeSession.js +0 -0
- /package/{dist → backend/dist}/services/claudeSession.js.map +0 -0
- /package/{dist → backend/dist}/services/messageQueue.d.ts +0 -0
- /package/{dist → backend/dist}/services/messageQueue.d.ts.map +0 -0
- /package/{dist → backend/dist}/services/messageQueue.js +0 -0
- /package/{dist → backend/dist}/services/messageQueue.js.map +0 -0
- /package/{dist → backend/dist}/services/sessionManager.d.ts +0 -0
- /package/{dist → backend/dist}/services/sessionManager.d.ts.map +0 -0
- /package/{dist → backend/dist}/services/sessionManager.js +0 -0
- /package/{dist → backend/dist}/services/sessionManager.js.map +0 -0
- /package/{dist → backend/dist}/utils/jwt.d.ts +0 -0
- /package/{dist → backend/dist}/utils/jwt.d.ts.map +0 -0
- /package/{dist → backend/dist}/utils/jwt.js +0 -0
- /package/{dist → backend/dist}/utils/jwt.js.map +0 -0
package/src/bin/agentstudio.ts
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { program } from 'commander';
|
|
3
|
-
import { startServer } from '../index.js';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
|
-
|
|
7
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
-
const __dirname = path.dirname(__filename);
|
|
9
|
-
|
|
10
|
-
program
|
|
11
|
-
.name('agentstudio')
|
|
12
|
-
.description('AgentStudio - AI-powered presentation editor with Claude integration')
|
|
13
|
-
.version('0.1.0');
|
|
14
|
-
|
|
15
|
-
// Start both frontend and backend
|
|
16
|
-
program
|
|
17
|
-
.command('start')
|
|
18
|
-
.description('Start both frontend and backend servers')
|
|
19
|
-
.option('-p, --port <port>', 'backend server port', '4936')
|
|
20
|
-
.option('-f, --frontend-port <port>', 'frontend server port', '3000')
|
|
21
|
-
.option('-h, --host <host>', 'server host', 'localhost')
|
|
22
|
-
.option('-c, --config <path>', 'path to config file')
|
|
23
|
-
.option('--env <path>', 'path to .env file')
|
|
24
|
-
.option('--no-auth', 'disable authentication (development only)')
|
|
25
|
-
.action(async (options: any) => {
|
|
26
|
-
console.log('🚀 Starting AgentStudio...');
|
|
27
|
-
|
|
28
|
-
// Start backend
|
|
29
|
-
process.env.PORT = options.port;
|
|
30
|
-
process.env.HOST = options.host;
|
|
31
|
-
|
|
32
|
-
if (options.env) {
|
|
33
|
-
process.env.ENV_PATH = options.env;
|
|
34
|
-
}
|
|
35
|
-
if (options.config) {
|
|
36
|
-
process.env.CONFIG_PATH = options.config;
|
|
37
|
-
}
|
|
38
|
-
if (options.noAuth) {
|
|
39
|
-
process.env.NO_AUTH = 'true';
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
try {
|
|
43
|
-
// Start backend server
|
|
44
|
-
await startServer(options.port);
|
|
45
|
-
console.log(`✅ Backend running on http://${options.host}:${options.port}`);
|
|
46
|
-
|
|
47
|
-
// Serve frontend static files
|
|
48
|
-
console.log(`✅ Frontend available at http://${options.host}:${options.port}`);
|
|
49
|
-
console.log('📖 Open your browser to start using AgentStudio');
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.error('❌ Failed to start AgentStudio:', error);
|
|
52
|
-
process.exit(1);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// Start backend only
|
|
57
|
-
program
|
|
58
|
-
.command('backend')
|
|
59
|
-
.description('Start backend server only')
|
|
60
|
-
.option('-p, --port <port>', 'server port', '4936')
|
|
61
|
-
.option('-h, --host <host>', 'server host', 'localhost')
|
|
62
|
-
.option('-c, --config <path>', 'path to config file')
|
|
63
|
-
.option('--env <path>', 'path to .env file')
|
|
64
|
-
.option('--no-auth', 'disable authentication (development only)')
|
|
65
|
-
.action(async (options: any) => {
|
|
66
|
-
console.log('🚀 Starting AgentStudio Backend...');
|
|
67
|
-
|
|
68
|
-
process.env.PORT = options.port;
|
|
69
|
-
process.env.HOST = options.host;
|
|
70
|
-
|
|
71
|
-
if (options.env) {
|
|
72
|
-
process.env.ENV_PATH = options.env;
|
|
73
|
-
}
|
|
74
|
-
if (options.config) {
|
|
75
|
-
process.env.CONFIG_PATH = options.config;
|
|
76
|
-
}
|
|
77
|
-
if (options.noAuth) {
|
|
78
|
-
process.env.NO_AUTH = 'true';
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
try {
|
|
82
|
-
await startServer();
|
|
83
|
-
console.log(`✅ Backend running on http://${options.host}:${options.port}`);
|
|
84
|
-
} catch (error) {
|
|
85
|
-
console.error('❌ Failed to start backend:', error);
|
|
86
|
-
process.exit(1);
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// Initialize configuration
|
|
91
|
-
program
|
|
92
|
-
.command('init')
|
|
93
|
-
.description('Initialize AgentStudio configuration')
|
|
94
|
-
.option('--env <path>', 'path to create .env file', '.env')
|
|
95
|
-
.action(async (options: any) => {
|
|
96
|
-
console.log('🔧 Initializing AgentStudio configuration...');
|
|
97
|
-
|
|
98
|
-
const fs = await import('fs-extra');
|
|
99
|
-
const path = await import('path');
|
|
100
|
-
|
|
101
|
-
const envPath = path.default.resolve(options.env);
|
|
102
|
-
const envContent = `# AgentStudio Configuration
|
|
103
|
-
# AI Provider (choose one)
|
|
104
|
-
OPENAI_API_KEY=your_openai_api_key_here
|
|
105
|
-
ANTHROPIC_API_KEY=your_anthropic_api_key_here
|
|
106
|
-
|
|
107
|
-
# Server Configuration
|
|
108
|
-
PORT=4936
|
|
109
|
-
NODE_ENV=production
|
|
110
|
-
|
|
111
|
-
# File System
|
|
112
|
-
SLIDES_DIR=./slides
|
|
113
|
-
|
|
114
|
-
# CORS Configuration (optional)
|
|
115
|
-
# Add custom origins for production deployments
|
|
116
|
-
CORS_ORIGINS=https://your-frontend.vercel.app,https://custom-domain.com
|
|
117
|
-
`;
|
|
118
|
-
|
|
119
|
-
try {
|
|
120
|
-
await fs.default.ensureFile(envPath);
|
|
121
|
-
await fs.default.writeFile(envPath, envContent);
|
|
122
|
-
console.log(`✅ Configuration file created: ${envPath}`);
|
|
123
|
-
console.log('📝 Please edit the .env file with your API keys and settings');
|
|
124
|
-
} catch (error) {
|
|
125
|
-
console.error('❌ Failed to create configuration file:', error);
|
|
126
|
-
process.exit(1);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
program.parse();
|
package/src/index.ts
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
import cors from 'cors';
|
|
3
|
-
import helmet from 'helmet';
|
|
4
|
-
import dotenv from 'dotenv';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
|
-
import { dirname, join } from 'path';
|
|
7
|
-
|
|
8
|
-
import filesRouter from './routes/files.js';
|
|
9
|
-
import agentsRouter from './routes/agents.js';
|
|
10
|
-
import mcpRouter from './routes/mcp.js';
|
|
11
|
-
import sessionsRouter from './routes/sessions.js';
|
|
12
|
-
import mediaRouter from './routes/media.js';
|
|
13
|
-
import settingsRouter from './routes/settings.js';
|
|
14
|
-
import commandsRouter from './routes/commands.js';
|
|
15
|
-
import subagentsRouter from './routes/subagents.js';
|
|
16
|
-
import projectsRouter from './routes/projects.js';
|
|
17
|
-
import authRouter from './routes/auth.js';
|
|
18
|
-
import { authMiddleware } from './middleware/auth.js';
|
|
19
|
-
|
|
20
|
-
dotenv.config();
|
|
21
|
-
|
|
22
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
23
|
-
const __dirname = dirname(__filename);
|
|
24
|
-
|
|
25
|
-
const app = express();
|
|
26
|
-
const PORT = process.env.PORT || 4936;
|
|
27
|
-
|
|
28
|
-
// Middleware
|
|
29
|
-
app.use(helmet({
|
|
30
|
-
contentSecurityPolicy: {
|
|
31
|
-
directives: {
|
|
32
|
-
defaultSrc: ["'self'"],
|
|
33
|
-
scriptSrc: ["'self'", "'unsafe-inline'"],
|
|
34
|
-
styleSrc: ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com", "https://cdn.jsdelivr.net"],
|
|
35
|
-
fontSrc: ["'self'", "https://fonts.gstatic.com", "https://cdn.jsdelivr.net"],
|
|
36
|
-
imgSrc: ["'self'", "data:", "https:"],
|
|
37
|
-
connectSrc: ["'self'", "ws:", "wss:"],
|
|
38
|
-
frameAncestors: ["'self'", "http://localhost:3000", "https://localhost:3000", "http://localhost:3001"] // Allow iframe embedding
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}));
|
|
42
|
-
// Configure CORS origins
|
|
43
|
-
const getAllowedOrigins = () => {
|
|
44
|
-
const defaultOrigins = [
|
|
45
|
-
'http://localhost:3000',
|
|
46
|
-
'http://127.0.0.1:3000',
|
|
47
|
-
'http://localhost:3001',
|
|
48
|
-
'https://localhost:3000',
|
|
49
|
-
'https://localhost:3001'
|
|
50
|
-
];
|
|
51
|
-
|
|
52
|
-
// Add custom origins from environment variable
|
|
53
|
-
const customOrigins = process.env.CORS_ORIGINS ?
|
|
54
|
-
process.env.CORS_ORIGINS.split(',').map(origin => origin.trim()) : [];
|
|
55
|
-
|
|
56
|
-
return [...defaultOrigins, ...customOrigins];
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
app.use(cors({
|
|
60
|
-
origin: (origin, callback) => {
|
|
61
|
-
const allowedOrigins = getAllowedOrigins();
|
|
62
|
-
|
|
63
|
-
// Allow requests with no origin (like mobile apps or curl requests)
|
|
64
|
-
if (!origin) return callback(null, true);
|
|
65
|
-
|
|
66
|
-
// Check if the origin is allowed
|
|
67
|
-
if (allowedOrigins.includes(origin)) {
|
|
68
|
-
return callback(null, true);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Allow Vercel preview URLs (*.vercel.app)
|
|
72
|
-
if (origin.endsWith('.vercel.app')) {
|
|
73
|
-
return callback(null, true);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Allow agentstudio.cc and its subdomains (*.agentstudio.cc) - hardcoded
|
|
77
|
-
if (origin === 'https://agentstudio.cc' || origin.endsWith('.agentstudio.cc')) {
|
|
78
|
-
return callback(null, true);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Allow custom domains from environment variable (CORS_ALLOWED_DOMAINS)
|
|
82
|
-
const customDomains = process.env.CORS_ALLOWED_DOMAINS ?
|
|
83
|
-
process.env.CORS_ALLOWED_DOMAINS.split(',').map(domain => domain.trim()) : [];
|
|
84
|
-
|
|
85
|
-
for (const domain of customDomains) {
|
|
86
|
-
// Match exact domain (https://example.com)
|
|
87
|
-
if (origin === `https://${domain}` || origin === `http://${domain}`) {
|
|
88
|
-
return callback(null, true);
|
|
89
|
-
}
|
|
90
|
-
// Match subdomains (https://*.example.com)
|
|
91
|
-
if (origin.endsWith(`.${domain}`)) {
|
|
92
|
-
return callback(null, true);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Allow any localhost with any port for development
|
|
97
|
-
if (origin.match(/^https?:\/\/localhost(:\d+)?$/)) {
|
|
98
|
-
return callback(null, true);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Allow 127.0.0.1 with any port for development
|
|
102
|
-
if (origin.match(/^https?:\/\/127\.0\.0\.1(:\d+)?$/)) {
|
|
103
|
-
return callback(null, true);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const msg = `The CORS policy for this site does not allow access from the specified Origin: ${origin}`;
|
|
107
|
-
return callback(new Error(msg), false);
|
|
108
|
-
},
|
|
109
|
-
credentials: true,
|
|
110
|
-
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'],
|
|
111
|
-
allowedHeaders: ['Content-Type', 'Authorization', 'Cache-Control', 'X-Requested-With'],
|
|
112
|
-
exposedHeaders: ['Content-Range', 'X-Content-Range']
|
|
113
|
-
}));
|
|
114
|
-
app.use(express.json({ limit: '10mb' }));
|
|
115
|
-
app.use(express.urlencoded({ extended: true, limit: '10mb' }));
|
|
116
|
-
|
|
117
|
-
// Static files - serve slides directory
|
|
118
|
-
const slidesDir = join(__dirname, '../..', process.env.SLIDES_DIR || 'slides');
|
|
119
|
-
app.use('/slides', express.static(slidesDir));
|
|
120
|
-
|
|
121
|
-
// Serve frontend static files in production
|
|
122
|
-
const frontendDir = join(__dirname, '../frontend/dist');
|
|
123
|
-
if (process.env.NODE_ENV === 'production') {
|
|
124
|
-
app.use(express.static(frontendDir));
|
|
125
|
-
|
|
126
|
-
// Handle SPA routing - serve index.html for all other routes
|
|
127
|
-
app.get('*', (req, res) => {
|
|
128
|
-
res.sendFile(join(frontendDir, 'index.html'));
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Routes - Public routes
|
|
133
|
-
app.use('/api/auth', authRouter);
|
|
134
|
-
|
|
135
|
-
// Protected routes - Require authentication
|
|
136
|
-
app.use('/api/files', authMiddleware, filesRouter);
|
|
137
|
-
app.use('/api/agents', authMiddleware, agentsRouter);
|
|
138
|
-
app.use('/api/mcp', authMiddleware, mcpRouter);
|
|
139
|
-
app.use('/api/sessions', authMiddleware, sessionsRouter);
|
|
140
|
-
app.use('/api/settings', authMiddleware, settingsRouter);
|
|
141
|
-
app.use('/api/commands', authMiddleware, commandsRouter);
|
|
142
|
-
app.use('/api/subagents', authMiddleware, subagentsRouter);
|
|
143
|
-
app.use('/api/projects', authMiddleware, projectsRouter);
|
|
144
|
-
app.use('/media', authMiddleware, mediaRouter);
|
|
145
|
-
|
|
146
|
-
// Health check
|
|
147
|
-
app.get('/api/health', (req, res) => {
|
|
148
|
-
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
// Error handling
|
|
152
|
-
app.use((err: any, req: express.Request, res: express.Response, next: express.NextFunction) => {
|
|
153
|
-
console.error('Error:', err);
|
|
154
|
-
res.status(500).json({
|
|
155
|
-
error: 'Internal server error',
|
|
156
|
-
message: process.env.NODE_ENV === 'development' ? err.message : 'Something went wrong'
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
// 404 handler - only for API routes in production
|
|
161
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
162
|
-
app.use('*', (req, res) => {
|
|
163
|
-
res.status(404).json({ error: 'Route not found' });
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export function startServer(port?: string | number) {
|
|
168
|
-
return new Promise((resolve, reject) => {
|
|
169
|
-
const serverPort = port || PORT;
|
|
170
|
-
const server = app.listen(serverPort, () => {
|
|
171
|
-
console.log(`AI PPT Editor backend running on http://localhost:${serverPort}`);
|
|
172
|
-
console.log(`Serving slides from: ${slidesDir}`);
|
|
173
|
-
resolve(server);
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
server.on('error', reject);
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Start server if this file is run directly
|
|
181
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
182
|
-
startServer().catch(console.error);
|
|
183
|
-
}
|
package/src/middleware/auth.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Request, Response, NextFunction } from 'express';
|
|
2
|
-
import { verifyToken } from '../utils/jwt.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Middleware to authenticate requests using JWT token
|
|
6
|
-
* Expects token in Authorization header as "Bearer <token>"
|
|
7
|
-
*/
|
|
8
|
-
export function authMiddleware(req: Request, res: Response, next: NextFunction): void {
|
|
9
|
-
const authHeader = req.headers.authorization;
|
|
10
|
-
|
|
11
|
-
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
12
|
-
res.status(401).json({ error: 'Unauthorized: No token provided' });
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const token = authHeader.substring(7); // Remove "Bearer " prefix
|
|
17
|
-
const payload = verifyToken(token);
|
|
18
|
-
|
|
19
|
-
if (!payload) {
|
|
20
|
-
res.status(401).json({ error: 'Unauthorized: Invalid or expired token' });
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Token is valid, proceed to next middleware
|
|
25
|
-
next();
|
|
26
|
-
}
|