';
+ out += '
' + esc(q) + '
';
+ out += '
';
+ for (var i = 0; i < choices.length; i++) {
+ out += '';
+ }
+ out += '
';
+ return out;
+ });
+
return html;
}
diff --git a/wwwroot/js/stream-ui.js b/wwwroot/js/stream-ui.js
index 138fc3e..481eb5c 100644
--- a/wwwroot/js/stream-ui.js
+++ b/wwwroot/js/stream-ui.js
@@ -15,7 +15,16 @@ function startStreamBubble() {
function appendToStream(text) {
if (!_streamDiv) startStreamBubble();
_streamText += text;
- _streamDiv.innerHTML = renderMarkdown(_streamText);
+
+ // Wenn ein :::ASK_USER_CHOICE::: Block begonnen aber noch nicht abgeschlossen wurde,
+ // nur den Text VOR dem Marker rendern (Marker-Block verstecken bis er komplett ist)
+ var displayText = _streamText;
+ var choiceStart = displayText.indexOf(':::ASK_USER_CHOICE:::');
+ if (choiceStart >= 0 && displayText.indexOf(':::END_ASK_USER_CHOICE:::') < 0) {
+ displayText = displayText.substring(0, choiceStart);
+ }
+
+ _streamDiv.innerHTML = renderMarkdown(displayText);
// Cursor ins letzte Inline/Text-Element einfügen, damit er nicht auf eine neue Zeile rutscht
const cursor = document.createElement('span');
cursor.className = 'cursor';
diff --git a/wwwroot/js/tool-ui.js b/wwwroot/js/tool-ui.js
index 9131bde..d60e33c 100644
--- a/wwwroot/js/tool-ui.js
+++ b/wwwroot/js/tool-ui.js
@@ -10,12 +10,19 @@ const CLI_TOOL_NAME_MAP = {
'WebSearch': 'web_search',
'WebFetch': 'web_fetch',
'NotebookEdit': 'notebook_edit',
- 'ToolSearch': 'tool_search'
+ 'ToolSearch': 'tool_search',
+ 'mcp__gott-remote__remote_execute': 'remote_execute'
};
/** Normalize CLI tool name to gott convention (Edit → edit_file, etc.) */
function normalizeToolName(name) {
- return CLI_TOOL_NAME_MAP[name] || name;
+ if (CLI_TOOL_NAME_MAP[name]) return CLI_TOOL_NAME_MAP[name];
+ // Generisch: mcp__server__tool → tool
+ if (name && name.startsWith('mcp__')) {
+ var parts = name.split('__');
+ return parts[parts.length - 1] || name;
+ }
+ return name;
}
/** Normalize CLI tool input fields (file_path → path, old_string → old_text, etc.) */