mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-16 20:32:00 +08:00
159 lines
4.9 KiB
TypeScript
159 lines
4.9 KiB
TypeScript
import express from 'express';
|
|
|
|
import { browserUseService } from '@/modules/browser-use/browser-use.service.js';
|
|
|
|
const router = express.Router();
|
|
|
|
type AuthenticatedRequest = express.Request & {
|
|
user?: {
|
|
id?: string | number;
|
|
};
|
|
};
|
|
|
|
function requireUser(req: AuthenticatedRequest): { id: string | number } {
|
|
const userId = req.user?.id;
|
|
if (userId === undefined || userId === null) {
|
|
throw new Error('Authenticated user is required.');
|
|
}
|
|
return { id: userId };
|
|
}
|
|
|
|
function readParam(value: string | string[] | undefined): string {
|
|
return Array.isArray(value) ? value[0] || '' : value || '';
|
|
}
|
|
|
|
router.get('/status', async (_req, res) => {
|
|
try {
|
|
res.json({ success: true, data: await browserUseService.getStatus() });
|
|
} catch (error) {
|
|
res.status(500).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to load Browser Use status.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.get('/settings', async (_req, res) => {
|
|
try {
|
|
res.json({ success: true, data: { settings: await browserUseService.getSettings() } });
|
|
} catch (error) {
|
|
res.status(500).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to load Browser Use settings.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.put('/settings', async (req, res) => {
|
|
try {
|
|
const settings = await browserUseService.updateSettings(req.body || {});
|
|
res.json({ success: true, data: { settings } });
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to save Browser Use settings.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.post('/agent-tools/register', async (_req, res) => {
|
|
try {
|
|
const result = await browserUseService.registerAgentMcp();
|
|
res.status(201).json({ success: true, data: result });
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to register Browser Use MCP.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.post('/runtime/install', async (_req, res) => {
|
|
try {
|
|
const result = await browserUseService.installRuntime();
|
|
res.status(result.success ? 200 : 500).json({
|
|
success: result.success,
|
|
data: result,
|
|
error: result.success ? undefined : result.message,
|
|
});
|
|
} catch (error) {
|
|
res.status(500).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to install Browser Use runtime.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.get('/sessions', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
res.json({ success: true, data: { sessions: await browserUseService.listSessions(requireUser(req)) } });
|
|
} catch (error) {
|
|
res.status(401).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to list browser sessions.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.post('/sessions', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const session = await browserUseService.createSession(requireUser(req));
|
|
res.status(session.status === 'unavailable' ? 202 : 201).json({ success: true, data: { session } });
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to create browser session.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.post('/sessions/:sessionId/navigate', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const session = await browserUseService.navigate(requireUser(req), readParam(req.params.sessionId), String(req.body?.url || ''));
|
|
res.json({ success: true, data: { session } });
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to navigate browser session.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.post('/sessions/:sessionId/agent-access/grant', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const session = await browserUseService.grantAgentAccess(requireUser(req), readParam(req.params.sessionId));
|
|
res.json({ success: true, data: { session } });
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to grant agent access.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.post('/sessions/:sessionId/agent-access/revoke', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const session = await browserUseService.revokeAgentAccess(requireUser(req), readParam(req.params.sessionId));
|
|
res.json({ success: true, data: { session } });
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to revoke agent access.',
|
|
});
|
|
}
|
|
});
|
|
|
|
router.post('/sessions/:sessionId/stop', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const result = await browserUseService.stopSession(requireUser(req), readParam(req.params.sessionId));
|
|
res.json({ success: true, data: result });
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to stop browser session.',
|
|
});
|
|
}
|
|
});
|
|
|
|
export default router;
|