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:
1 parent
ec73ccd71e
commit
b0d8bef5ea
11 files changed
+90
-10
No files matched your search
@@ -247,6 +247,10 @@
|
||||
<button type="button" id="agentAddCommandBtn" class="add-cmd-btn">+ Befehl hinzufügen</button>
|
||||
</div>
|
||||
</div>
|
||||
<label class="checkbox-label">
|
||||
<input type="checkbox" id="agentIsPublic">
|
||||
Public <span class="checkbox-hint">(andere User können diesen Agent in ihren Sessions verwenden)</span>
|
||||
</label>
|
||||
<div class="form-actions">
|
||||
<button id="agentSaveBtn">Speichern</button>
|
||||
<button id="agentCancelBtn">Abbrechen</button>
|
||||
|
||||
@@ -68,6 +68,12 @@ async function apiGetAgents() {
|
||||
return resp.json();
|
||||
}
|
||||
|
||||
async function apiGetAvailableAgents() {
|
||||
const resp = await fetch('/api/agents/available');
|
||||
if (!resp.ok) return [];
|
||||
return resp.json();
|
||||
}
|
||||
|
||||
async function apiGetAgent(agentId) {
|
||||
const resp = await fetch(`/api/agents/${agentId}`);
|
||||
if (!resp.ok) return null;
|
||||
|
||||
@@ -113,6 +113,9 @@ function buildAgentCard(agent, skills) {
|
||||
badges.push(`<span class="badge badge-feature" title="Web-Suche - ${wsYear}"><i class="fa fa-search"></i> Web-Suche</span>`);
|
||||
}
|
||||
|
||||
if (agent.isPublic) badges.push('<span class="badge badge-feature" title="Public – für alle User verfügbar"><i class="fa fa-globe"></i> Public</span>');
|
||||
if (agent.isOwner === false) badges.push('<span class="badge badge-other" title="Gehört einem anderen User"><i class="fa fa-user-o"></i> Fremd</span>');
|
||||
|
||||
if (skills) {
|
||||
for (const skill of skills) {
|
||||
badges.push(`<span class="badge badge-skill" title="${esc(skill.description || skill.slug)}"><i class="fa fa-puzzle-piece"></i> ${esc(skill.name)}</span>`);
|
||||
|
||||
@@ -34,6 +34,7 @@ registerPage('agent', {
|
||||
const addCommandBtn = document.getElementById('agentAddCommandBtn');
|
||||
const skillsSection = document.getElementById('agentSkillsSection');
|
||||
const skillList = document.getElementById('agentSkillList');
|
||||
const isPublicEl = document.getElementById('agentIsPublic');
|
||||
const more = document.querySelector('.more');
|
||||
|
||||
// Avatar Editor initialisieren
|
||||
@@ -66,6 +67,7 @@ registerPage('agent', {
|
||||
useUserInfoEl.checked = agent.useUserInfo !== false;
|
||||
useMemoryEl.checked = agent.useMemory !== false;
|
||||
webSearchVersionEl.value = agent.webSearchVersion || '';
|
||||
isPublicEl.checked = agent.isPublic || false;
|
||||
deleteBtn.hidden = false;
|
||||
|
||||
// Custom Commands laden
|
||||
@@ -112,7 +114,8 @@ registerPage('agent', {
|
||||
avatarOffsetX: _agentAvatarEditor.getOffsetX(),
|
||||
avatarOffsetY: _agentAvatarEditor.getOffsetY(),
|
||||
customCommands: getCommandsFromUI(commandsList),
|
||||
taskInstruction: _agentTaskMde ? _agentTaskMde.value().trim() || null : null
|
||||
taskInstruction: _agentTaskMde ? _agentTaskMde.value().trim() || null : null,
|
||||
isPublic: isPublicEl.checked
|
||||
};
|
||||
|
||||
if (isNew) {
|
||||
|
||||
@@ -20,7 +20,7 @@ registerPage('cronjob', {
|
||||
|
||||
// Sessions + Agents laden
|
||||
const sessions = await apiGetSessions();
|
||||
const agents = await apiGetAgents();
|
||||
const agents = await apiGetAvailableAgents();
|
||||
const agentMap = {};
|
||||
for (const a of agents) agentMap[a.agentId] = a;
|
||||
const sessionMap = {};
|
||||
|
||||
@@ -35,11 +35,11 @@ registerPage('dashboard', {
|
||||
|
||||
// Telegram-Config parallel pro Session laden (sessions werden gleich geladen)
|
||||
|
||||
const [agents, sessions, cronjobs, shares, telegramBots] = await Promise.all([
|
||||
apiGetAgents(), apiGetSessions(), apiGetCronjobs(), apiListShares(), apiGetTelegramBots()
|
||||
const [agents, availableAgents, sessions, cronjobs, shares, telegramBots] = await Promise.all([
|
||||
apiGetAgents(), apiGetAvailableAgents(), apiGetSessions(), apiGetCronjobs(), apiListShares(), apiGetTelegramBots()
|
||||
]);
|
||||
const agentMap = {};
|
||||
for (const a of agents) agentMap[a.agentId] = a;
|
||||
for (const a of availableAgents) agentMap[a.agentId] = a;
|
||||
|
||||
// Sessions
|
||||
const grid = document.getElementById('sessionCards');
|
||||
|
||||
@@ -75,7 +75,7 @@ registerPage('session', {
|
||||
}
|
||||
|
||||
// Agents laden + Skills parallel
|
||||
const agents = await apiGetAgents();
|
||||
const agents = await apiGetAvailableAgents();
|
||||
const agentMap = {};
|
||||
for (const a of agents) agentMap[a.agentId] = a;
|
||||
|
||||
|
||||
Reference in new issue
Block a user