From f70985362dfa25d3c0feeae5b52ff48c0bd73064 Mon Sep 17 00:00:00 2001 From: Richard Palethorpe Date: Mon, 31 Mar 2025 22:10:04 +0100 Subject: [PATCH] chore(ui): Remove original UI/API routes --- webui/app.go | 2 + .../PromptsGoalsSection.jsx | 1 - webui/react-ui/src/utils/api.js | 2 +- webui/react-ui/src/utils/config.js | 10 +- webui/routes.go | 146 +++++++++--------- 5 files changed, 79 insertions(+), 82 deletions(-) diff --git a/webui/app.go b/webui/app.go index 9ffc4cf..1509b87 100644 --- a/webui/app.go +++ b/webui/app.go @@ -214,12 +214,14 @@ func (a *App) ImportAgent(pool *state.AgentPool) func(c *fiber.Ctx) error { os.MkdirAll("./uploads", os.ModePerm) + // Safely save the file to prevent path traversal destination := fmt.Sprintf("./uploads/%s", file.Filename) if err := c.SaveFile(file, destination); err != nil { // Handle error return err } + // Safely read the file data, err := os.ReadFile(destination) if err != nil { return err diff --git a/webui/react-ui/src/components/agent-form-sections/PromptsGoalsSection.jsx b/webui/react-ui/src/components/agent-form-sections/PromptsGoalsSection.jsx index d10ea23..bc48798 100644 --- a/webui/react-ui/src/components/agent-form-sections/PromptsGoalsSection.jsx +++ b/webui/react-ui/src/components/agent-form-sections/PromptsGoalsSection.jsx @@ -1,7 +1,6 @@ import React from 'react'; import FormFieldDefinition from '../common/FormFieldDefinition'; import DynamicPromptForm from '../DynamicPromptForm'; -import DynamicPromptForm from '../DynamicPromptForm'; /** * Prompts & Goals section of the agent form diff --git a/webui/react-ui/src/utils/api.js b/webui/react-ui/src/utils/api.js index efb3ebf..36fd7eb 100644 --- a/webui/react-ui/src/utils/api.js +++ b/webui/react-ui/src/utils/api.js @@ -176,7 +176,7 @@ export const agentApi = { export const chatApi = { // Send a message to an agent using the JSON-based API sendMessage: async (name, message) => { - const response = await fetch(buildUrl(API_CONFIG.endpoints.chatApi(name)), { + const response = await fetch(buildUrl(API_CONFIG.endpoints.chat(name)), { method: 'POST', headers: API_CONFIG.headers, body: JSON.stringify({ message }), diff --git a/webui/react-ui/src/utils/config.js b/webui/react-ui/src/utils/config.js index 2a9f861..9f20064 100644 --- a/webui/react-ui/src/utils/config.js +++ b/webui/react-ui/src/utils/config.js @@ -21,10 +21,11 @@ export const API_CONFIG = { agents: '/api/agents', agentConfig: (name) => `/api/agent/${name}/config`, agentConfigMetadata: '/api/meta/agent/config', - createAgent: '/create', + createAgent: '/api/agent/create', deleteAgent: (name) => `/api/agent/${name}`, pauseAgent: (name) => `/api/agent/${name}/pause`, startAgent: (name) => `/api/agent/${name}/start`, + exportAgent: (name) => `/settings/export/${name}`, importAgent: '/settings/import', @@ -33,8 +34,7 @@ export const API_CONFIG = { createGroup: '/api/agent/group/create', // Chat endpoints - chat: (name) => `/chat/${name}`, - chatApi: (name) => `/api/chat/${name}`, + chat: (name) => `/api/chat/${name}`, notify: (name) => `/notify/${name}`, responses: '/v1/responses', @@ -42,8 +42,8 @@ export const API_CONFIG = { sse: (name) => `/sse/${name}`, // Action endpoints - listActions: '/actions', - executeAction: (name) => `/action/${name}/run`, + listActions: '/api/actions', + executeAction: (name) => `/api/action/${name}/run`, // Status endpoint status: (name) => `/status/${name}`, diff --git a/webui/routes.go b/webui/routes.go index 2fadc86..af90364 100644 --- a/webui/routes.go +++ b/webui/routes.go @@ -37,12 +37,12 @@ func (app *App) registerRoutes(pool *state.AgentPool, webapp *fiber.App) { Browse: true, })) - webapp.Use("/public", filesystem.New(filesystem.Config{ - Root: http.FS(embeddedFiles), - PathPrefix: "public", - Browse: true, - })) - + /* webapp.Use("/public", filesystem.New(filesystem.Config{ + Root: http.FS(embeddedFiles), + PathPrefix: "public", + Browse: true, + })) + */ if len(app.config.ApiKeys) > 0 { kaConfig, err := GetKeyAuthConfig(app.config.ApiKeys) if err != nil || kaConfig == nil { @@ -51,15 +51,15 @@ func (app *App) registerRoutes(pool *state.AgentPool, webapp *fiber.App) { webapp.Use(v2keyauth.New(*kaConfig)) } - webapp.Get("/", func(c *fiber.Ctx) error { - return c.Render("views/index", fiber.Map{ - "Agents": pool.List(), - "AgentCount": len(pool.List()), - "Actions": len(services.AvailableActions), - "Connectors": len(services.AvailableConnectors), - }) - }) - + /* webapp.Get("/", func(c *fiber.Ctx) error { + return c.Render("views/index", fiber.Map{ + "Agents": pool.List(), + "AgentCount": len(pool.List()), + "Actions": len(services.AvailableActions), + "Connectors": len(services.AvailableConnectors), + }) + }) + */ webapp.Use("/app", filesystem.New(filesystem.Config{ Root: http.FS(reactUI), PathPrefix: "react-ui/dist", @@ -75,30 +75,30 @@ func (app *App) registerRoutes(pool *state.AgentPool, webapp *fiber.App) { return c.Send(indexHTML) }) - webapp.Get("/agents", func(c *fiber.Ctx) error { - statuses := map[string]bool{} - for _, a := range pool.List() { - agent := pool.GetAgent(a) - if agent == nil { - xlog.Error("Agent not found", "name", a) - continue - } - statuses[a] = !agent.Paused() - } - return c.Render("views/agents", fiber.Map{ - "Agents": pool.List(), - "Status": statuses, - }) - }) - - webapp.Get("/create", func(c *fiber.Ctx) error { + /* webapp.Get("/agents", func(c *fiber.Ctx) error { + statuses := map[string]bool{} + for _, a := range pool.List() { + agent := pool.GetAgent(a) + if agent == nil { + xlog.Error("Agent not found", "name", a) + continue + } + statuses[a] = !agent.Paused() + } + return c.Render("views/agents", fiber.Map{ + "Agents": pool.List(), + "Status": statuses, + }) + }) + */ + /* webapp.Get("/api/create", func(c *fiber.Ctx) error { return c.Render("views/create", fiber.Map{ "Actions": services.AvailableActions, "Connectors": services.AvailableConnectors, "PromptBlocks": services.AvailableBlockPrompts, }) }) - + */ // Define a route for the GET method on the root path '/' webapp.Get("/sse/:name", func(c *fiber.Ctx) error { m := pool.GetManager(c.Params("name")) @@ -110,7 +110,7 @@ func (app *App) registerRoutes(pool *state.AgentPool, webapp *fiber.App) { return nil }) - webapp.Get("/status/:name", func(c *fiber.Ctx) error { + /*webapp.Get("/status/:name", func(c *fiber.Ctx) error { history := pool.GetStatusHistory(c.Params("name")) if history == nil { history = &state.Status{ActionResults: []types.ActionState{}} @@ -125,57 +125,53 @@ func (app *App) registerRoutes(pool *state.AgentPool, webapp *fiber.App) { webapp.Get("/notify/:name", app.Notify(pool)) webapp.Post("/chat/:name", app.Chat(pool)) - webapp.Post("/create", app.Create(pool)) - webapp.Delete("/delete/:name", app.Delete(pool)) - webapp.Put("/pause/:name", app.Pause(pool)) - webapp.Put("/start/:name", app.Start(pool)) - - // JSON API endpoints for agent operations + */ + webapp.Post("/api/agent/create", app.Create(pool)) webapp.Delete("/api/agent/:name", app.Delete(pool)) webapp.Put("/api/agent/:name/pause", app.Pause(pool)) webapp.Put("/api/agent/:name/start", app.Start(pool)) - + // Add JSON-based chat API endpoint webapp.Post("/api/chat/:name", app.ChatAPI(pool)) webapp.Post("/v1/responses", app.Responses(pool)) - webapp.Get("/talk/:name", func(c *fiber.Ctx) error { - return c.Render("views/chat", fiber.Map{ - // "Character": agent.Character, - "Name": c.Params("name"), - }) - }) + /* webapp.Get("/talk/:name", func(c *fiber.Ctx) error { + return c.Render("views/chat", fiber.Map{ + // "Character": agent.Character, + "Name": c.Params("name"), + }) + }) - webapp.Get("/settings/:name", func(c *fiber.Ctx) error { - status := false - for _, a := range pool.List() { - if a == c.Params("name") { - status = !pool.GetAgent(a).Paused() - } - } + webapp.Get("/settings/:name", func(c *fiber.Ctx) error { + status := false + for _, a := range pool.List() { + if a == c.Params("name") { + status = !pool.GetAgent(a).Paused() + } + } - return c.Render("views/settings", fiber.Map{ - "Name": c.Params("name"), - "Status": status, - "Actions": services.AvailableActions, - "Connectors": services.AvailableConnectors, - "PromptBlocks": services.AvailableBlockPrompts, - }) - }) + return c.Render("views/settings", fiber.Map{ + "Name": c.Params("name"), + "Status": status, + "Actions": services.AvailableActions, + "Connectors": services.AvailableConnectors, + "PromptBlocks": services.AvailableBlockPrompts, + }) + }) - webapp.Get("/actions-playground", func(c *fiber.Ctx) error { - return c.Render("views/actions", fiber.Map{}) - }) - - webapp.Get("/group-create", func(c *fiber.Ctx) error { - return c.Render("views/group-create", fiber.Map{ - "Actions": services.AvailableActions, - "Connectors": services.AvailableConnectors, - "PromptBlocks": services.AvailableBlockPrompts, - }) - }) + webapp.Get("/actions-playground", func(c *fiber.Ctx) error { + return c.Render("views/actions", fiber.Map{}) + }) + webapp.Get("/group-create", func(c *fiber.Ctx) error { + return c.Render("views/group-create", fiber.Map{ + "Actions": services.AvailableActions, + "Connectors": services.AvailableConnectors, + "PromptBlocks": services.AvailableBlockPrompts, + }) + }) + */ // New API endpoints for getting and updating agent configuration webapp.Get("/api/agent/:name/config", app.GetAgentConfig(pool)) webapp.Put("/api/agent/:name/config", app.UpdateAgentConfig(pool)) @@ -183,8 +179,8 @@ func (app *App) registerRoutes(pool *state.AgentPool, webapp *fiber.App) { // Add endpoint for getting agent config metadata webapp.Get("/api/meta/agent/config", app.GetAgentConfigMeta()) - webapp.Post("/action/:name/run", app.ExecuteAction(pool)) - webapp.Get("/actions", app.ListActions()) + webapp.Post("/api/action/:name/run", app.ExecuteAction(pool)) + webapp.Get("/api/actions", app.ListActions()) webapp.Post("/api/agent/group/generateProfiles", app.GenerateGroupProfiles(pool)) webapp.Post("/api/agent/group/create", app.CreateGroup(pool))