| import { Server, Socket } from 'socket.io';
|
| import { Project, Video, User } from '../models';
|
|
|
|
|
|
|
|
|
|
|
| export function setupMCPServer(io: Server) {
|
|
|
| const agentNamespace = io.of('/mcp');
|
| const browserNamespace = io.of('/browser');
|
|
|
| agentNamespace.on('connection', (socket: Socket) => {
|
| console.log(`[MCP Server] AI Agent connected: ${socket.id}`);
|
|
|
|
|
| socket.on('mcp:read_state', async (callback) => {
|
| try {
|
| const projects = await Project.find().lean();
|
|
|
| callback({ status: 'success', data: { projects, count: projects.length } });
|
| } catch (error: any) {
|
| callback({ status: 'error', message: error.message });
|
| }
|
| });
|
|
|
|
|
| socket.on('mcp:navigate', (data: { path: string }, callback) => {
|
| console.log(`[MCP Server] Agent forcing navigation to: ${data.path}`);
|
|
|
| browserNamespace.emit('agent:navigate', data.path);
|
| callback({ status: 'success' });
|
| });
|
|
|
|
|
| socket.on('mcp:create_project', async (data: { name: string, defaultPlatform: string, defaultFormat: string }, callback) => {
|
| try {
|
|
|
| const defaultUser = await User.findOne();
|
| if (!defaultUser) {
|
| throw new Error('No users found in database to associate project with.');
|
| }
|
|
|
| const project = await Project.create({
|
| userId: defaultUser._id,
|
| name: data.name,
|
| defaultPlatform: data.defaultPlatform,
|
| defaultFormat: data.defaultFormat,
|
| });
|
|
|
|
|
| browserNamespace.emit('agent:project_created', project);
|
|
|
|
|
| browserNamespace.emit('agent:navigate', `/project/${project._id}`);
|
|
|
| callback({ status: 'success', data: project });
|
| } catch (error: any) {
|
| callback({ status: 'error', message: error.message });
|
| }
|
| });
|
|
|
|
|
| socket.on('mcp:update_video_draft', (data: { projectId: string, script?: string, voiceType?: string }, callback) => {
|
|
|
| browserNamespace.emit('agent:video_draft_updated', data);
|
| callback({ status: 'success' });
|
| });
|
|
|
|
|
| socket.on('mcp:activity_log', (data: { message: string, type?: 'info' | 'success' | 'warning' | 'error' }) => {
|
|
|
| browserNamespace.emit('agent:activity_log', {
|
| message: data.message,
|
| type: data.type || 'info',
|
| timestamp: new Date().toISOString()
|
| });
|
| });
|
|
|
| socket.on('disconnect', () => {
|
| console.log(`[MCP Server] AI Agent disconnected: ${socket.id}`);
|
| browserNamespace.emit('agent:activity_log', {
|
| message: 'Google Antigravity CLI disconnected from workspace.',
|
| type: 'error',
|
| timestamp: new Date().toISOString()
|
| });
|
| });
|
| });
|
|
|
| browserNamespace.on('connection', (socket: Socket) => {
|
| console.log(`[Browser] Human connected to workspace viewport: ${socket.id}`);
|
|
|
|
|
| socket.on('browser:activity_log', (data) => {
|
| browserNamespace.emit('agent:activity_log', {
|
| message: `User typed: ${data.message}`,
|
| type: 'info',
|
| timestamp: new Date().toISOString()
|
| });
|
| });
|
| });
|
| }
|
|
|