feat: Public-Flag für Agents + verfügbare Agents/Bots Endpoints erweitert

- AgentRecord: neues IsPublic-Feld mit DB-Migration
- GET /api/agents/available: eigene + public Agents (alle Properties + isOwner)
- GET /api/telegram/bots/available: alle Properties außer Token/Secret + sessionCount
- Agent-Page: Public-Checkbox (andere User können Agent in Sessions verwenden)
- Dashboard: agentMap aus availableAgents gebaut (public Agents fremder User auflösbar)
- Session-Page + Cronjob-Page: Agent-Picker nutzt /available statt /agents
- Agent-Cards: Public- und Fremd-Badges
- Fix: Chat-Button bei Sessions mit public Agent eines anderen Users nicht mehr disabled
This commit is contained in:
Meleki committed 2026-03-08 20:25:52 +01:00
1 parent ec73ccd71e
commit b0d8bef5ea
11 files changed
+90 -10

No files matched your search

+54 -1
View File
@@ -16,6 +16,7 @@ public static class AgentEndpoint
public static void MapAgentEndpoints(this IEndpointRouteBuilder app)
{
app.MapGet("/api/agents", HandleList);
app.MapGet("/api/agents/available", HandleListAvailable);
app.MapGet("/api/agents/{agentId}", HandleGet);
app.MapPost("/api/agents", HandleCreate);
app.MapPut("/api/agents/{agentId}", HandleUpdate);
@@ -59,6 +60,7 @@ public static class AgentEndpoint
a.AvatarScale,
a.AvatarOffsetX,
a.AvatarOffsetY,
a.IsPublic,
a.IsDeleted,
a.CreatedAt,
a.UpdatedAt,
@@ -69,6 +71,55 @@ public static class AgentEndpoint
await ctx.Response.WriteAsJsonAsync(results);
}
private static async Task HandleListAvailable(HttpContext ctx, DatabaseService db, SkillService skillService)
{
var userId = ctx.GetUserId();
var agents = await db.GetAvailableAgents(userId);
var allSkills = skillService.GetAllSkills();
var skillMap = allSkills.ToDictionary(s => s.Slug);
var results = new List<object>();
foreach (var a in agents)
{
var agentSkillSlugs = await db.GetAgentSkills(a.AgentId);
var skills = agentSkillSlugs
.Where(slug => skillMap.ContainsKey(slug))
.Select(slug => new { slug, name = skillMap[slug].Name, description = skillMap[slug].Description })
.ToList();
results.Add(new
{
a.AgentId,
a.Name,
Avatar = a.AvatarSmall ?? a.Avatar,
a.Description,
a.Model,
a.ToolChoice,
a.CustomCommands,
a.AutoCommit,
a.UseSoul,
a.UseIdentity,
a.UseUserInfo,
a.UseMemory,
a.UseWebSearch,
a.WebSearchVersion,
a.AllowUserChoice,
a.TaskInstruction,
a.AvatarScale,
a.AvatarOffsetX,
a.AvatarOffsetY,
a.IsPublic,
a.IsDeleted,
a.CreatedAt,
a.UpdatedAt,
IsOwner = a.UserId == userId,
Skills = skills
});
}
await ctx.Response.WriteAsJsonAsync(results);
}
private static async Task HandleGet(HttpContext ctx, DatabaseService db)
{
var agentId = ctx.Request.RouteValues["agentId"]?.ToString();
@@ -112,7 +163,8 @@ public static class AgentEndpoint
TaskInstruction = body.TryGetProperty("taskInstruction", out var ti) ? ti.GetString() : null,
AvatarScale = body.TryGetProperty("avatarScale", out var asc) ? asc.GetDouble() : 1.0,
AvatarOffsetX = body.TryGetProperty("avatarOffsetX", out var aox) ? aox.GetDouble() : 0,
AvatarOffsetY = body.TryGetProperty("avatarOffsetY", out var aoy) ? aoy.GetDouble() : 0
AvatarOffsetY = body.TryGetProperty("avatarOffsetY", out var aoy) ? aoy.GetDouble() : 0,
IsPublic = body.TryGetProperty("isPublic", out var ip) && ip.GetBoolean()
};
agent = await db.CreateAgent(agent);
@@ -157,6 +209,7 @@ public static class AgentEndpoint
if (body.TryGetProperty("avatarScale", out var asc)) agent.AvatarScale = asc.GetDouble();
if (body.TryGetProperty("avatarOffsetX", out var aox)) agent.AvatarOffsetX = aox.GetDouble();
if (body.TryGetProperty("avatarOffsetY", out var aoy)) agent.AvatarOffsetY = aoy.GetDouble();
if (body.TryGetProperty("isPublic", out var ip)) agent.IsPublic = ip.GetBoolean();
await db.UpdateAgent(agent);
memoryService.InitializeAgentFiles(agentId, agent.Name);
+3 -2
View File
@@ -250,15 +250,16 @@ public static class TelegramEndpoint
foreach (var bot in bots)
{
var isOwner = bot.UserId == userId;
var sessionCount = await db.GetTelegramBotSessionCount(bot.BotId);
result.Add(new
{
botId = bot.BotId,
name = bot.Name,
isOwner,
isPublic = bot.IsPublic,
sessionCount,
createdAt = bot.CreatedAt,
// Token nur für eigene Bots anzeigen
botToken = isOwner ? bot.BotToken : null
updatedAt = bot.UpdatedAt
});
}
await res.WriteAsJsonAsync(result);