feat: Anweisungen-Feld für Agents mit EasyMDE-Editor

- AgentRecord: TaskInstruction (string, nullable)
- DB-Migration: task_instruction TEXT Spalte
- AgentEndpoint: Create/Update lesen taskInstruction
- SystemPromptBuilder: '## Anweisungen' Block nach Soul, nur wenn nicht leer
- HTML: Textarea #agentTaskInstruction nach Rückfragen-Checkbox
- agent-page.js: EasyMDE-Editor mit Init, Laden, Speichern, Destroy
This commit is contained in:
Meleki committed 2026-03-07 17:20:38 +01:00
1 parent 14e721f95b
commit 4f027360fd
6 files changed
+39 -5

No files matched your search

+3 -1
View File
@@ -199,9 +199,11 @@
Tool-Nutzung erzwingen <span class="checkbox-hint">(tool_choice: any)</span>
</label>
<label class="checkbox-label">
<input type="checkbox" id="agentAllowUserChoice">
<input type="checkbox" id="agentAllowUserChoice" checked>
Rückfragen erlauben <span class="checkbox-hint">(ask_user_choice Tool)</span>
</label>
<label>Anweisungen <small>(optional)</small></label>
<textarea id="agentTaskInstruction" rows="4" placeholder="Spezifische Anweisungen für diesen Agent (Markdown, optional)"></textarea>
<label>Git-Commit-Verhalten</label>
<select id="agentAutoCommit">
<option value="">Nicht erwähnen</option>
+23 -1
View File
@@ -1,6 +1,7 @@
// ── Agent Page ──
let _agentAvatarEditor = null;
let _agentTaskMde = null;
registerPage('agent', {
async init(params) {
@@ -44,6 +45,21 @@ registerPage('agent', {
initialOffsetY: (agent && agent.avatarOffsetY) || 0
});
// EasyMDE für Task-Instruction
const taskEl = document.getElementById('agentTaskInstruction');
_agentTaskMde = new EasyMDE({
element: taskEl,
toolbar: ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'code', '|', 'preview', 'guide'],
status: false,
autofocus: false,
spellChecker: false,
autoDownloadFontAwesome: false,
placeholder: 'Spezifische Anweisungen für diesen Agent (Markdown, optional)',
minHeight: '120px'
});
_agentTaskMde.codemirror.setOption('theme', 'default');
_agentTaskMde.codemirror.getWrapperElement().closest('.EasyMDEContainer').classList.add('fe-mde-wrap');
if (agent) {
title.textContent = agent.name;
nameEl.value = agent.name || '';
@@ -51,6 +67,7 @@ registerPage('agent', {
modelEl.value = agent.model || 'sonnet';
toolChoiceEl.checked = (agent.toolChoice || 'any') === 'any';
allowUserChoiceEl.checked = agent.allowUserChoice !== false;
_agentTaskMde.value(agent.taskInstruction || '');
autoCommitEl.value = agent.autoCommit || '';
useSoulEl.checked = agent.useSoul !== false;
useIdentityEl.checked = agent.useIdentity !== false;
@@ -107,7 +124,8 @@ registerPage('agent', {
avatarScale: _agentAvatarEditor.getScale(),
avatarOffsetX: _agentAvatarEditor.getOffsetX(),
avatarOffsetY: _agentAvatarEditor.getOffsetY(),
customCommands: getCommandsFromUI(commandsList)
customCommands: getCommandsFromUI(commandsList),
taskInstruction: _agentTaskMde ? _agentTaskMde.value().trim() || null : null
};
if (isNew) {
@@ -137,6 +155,10 @@ registerPage('agent', {
});
},
destroy() {
if (_agentTaskMde) {
try { _agentTaskMde.toTextArea(); } catch (_) {}
_agentTaskMde = null;
}
if (_agentAvatarEditor) {
_agentAvatarEditor.destroy();
_agentAvatarEditor = null;