fixed time out aria-core
This commit is contained in:
@@ -79,7 +79,7 @@ android {
|
|||||||
applicationId "com.ariacockpit"
|
applicationId "com.ariacockpit"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 1
|
versionCode 107
|
||||||
versionName "0.0.1.7"
|
versionName "0.0.1.7"
|
||||||
// Fallback fuer Libraries mit Product Flavors
|
// Fallback fuer Libraries mit Product Flavors
|
||||||
missingDimensionStrategy 'react-native-camera', 'general'
|
missingDimensionStrategy 'react-native-camera', 'general'
|
||||||
|
|||||||
@@ -601,7 +601,7 @@ const SettingsScreen: React.FC = () => {
|
|||||||
<Text style={styles.sectionTitle}>{'\u00DC'}ber</Text>
|
<Text style={styles.sectionTitle}>{'\u00DC'}ber</Text>
|
||||||
<View style={styles.card}>
|
<View style={styles.card}>
|
||||||
<Text style={styles.aboutTitle}>ARIA Cockpit</Text>
|
<Text style={styles.aboutTitle}>ARIA Cockpit</Text>
|
||||||
<Text style={styles.aboutVersion}>Version 0.0.1.6 </Text>
|
<Text style={styles.aboutVersion}>Version 0.0.1.7</Text>
|
||||||
<Text style={styles.aboutInfo}>
|
<Text style={styles.aboutInfo}>
|
||||||
Stefans Kommandozentrale f{'\u00FC'}r ARIA.{'\n'}
|
Stefans Kommandozentrale f{'\u00FC'}r ARIA.{'\n'}
|
||||||
Gebaut mit React Native + TypeScript.
|
Gebaut mit React Native + TypeScript.
|
||||||
|
|||||||
@@ -1216,8 +1216,10 @@ class ARIABridge:
|
|||||||
logger.info("Keine Sprache erkannt — ignoriert")
|
logger.info("Keine Sprache erkannt — ignoriert")
|
||||||
|
|
||||||
except sd.PortAudioError:
|
except sd.PortAudioError:
|
||||||
logger.error("Audio-Geraet nicht verfuegbar — warte 5 Sekunden")
|
if not hasattr(self, '_audio_warned'):
|
||||||
await asyncio.sleep(5)
|
logger.warning("Audio-Geraet nicht verfuegbar — lokales Mikrofon deaktiviert (kein Spam mehr)")
|
||||||
|
self._audio_warned = True
|
||||||
|
await asyncio.sleep(60) # 60s statt 5s — spart Log-Spam
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception("Fehler in der Audio-Schleife")
|
logger.exception("Fehler in der Audio-Schleife")
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
|||||||
@@ -201,6 +201,9 @@
|
|||||||
<button class="btn secondary" onclick="toggleChatFullscreen()" id="btn-chat-fs" style="padding:4px 10px;font-size:11px;">Vollbild</button>
|
<button class="btn secondary" onclick="toggleChatFullscreen()" id="btn-chat-fs" style="padding:4px 10px;font-size:11px;">Vollbild</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="chat-box" id="chat-box"></div>
|
<div class="chat-box" id="chat-box"></div>
|
||||||
|
<div id="thinking-indicator" style="display:none;padding:6px 10px;font-size:12px;color:#FFD60A;background:#1E1E2E;border-radius:0 0 6px 6px;margin-top:-8px;margin-bottom:8px;">
|
||||||
|
<span style="animation:pulse 1s infinite;">💭</span> <span id="thinking-text">ARIA denkt...</span>
|
||||||
|
</div>
|
||||||
<div class="input-row">
|
<div class="input-row">
|
||||||
<input type="text" id="chat-input" placeholder="Nachricht an ARIA...">
|
<input type="text" id="chat-input" placeholder="Nachricht an ARIA...">
|
||||||
<button class="btn" id="btn-gw" onclick="testGateway()">Gateway senden</button>
|
<button class="btn" id="btn-gw" onclick="testGateway()">Gateway senden</button>
|
||||||
@@ -216,6 +219,9 @@
|
|||||||
<button class="btn secondary" onclick="toggleChatFullscreen()" style="padding:6px 14px;">Schliessen</button>
|
<button class="btn secondary" onclick="toggleChatFullscreen()" style="padding:6px 14px;">Schliessen</button>
|
||||||
</div>
|
</div>
|
||||||
<div id="chat-box-fs" class="chat-box" style="flex:1;max-height:none;min-height:0;overflow-y:auto;"></div>
|
<div id="chat-box-fs" class="chat-box" style="flex:1;max-height:none;min-height:0;overflow-y:auto;"></div>
|
||||||
|
<div id="thinking-indicator-fs" style="display:none;padding:6px 10px;font-size:12px;color:#FFD60A;background:#1E1E2E;border-radius:6px;margin-top:4px;">
|
||||||
|
<span style="animation:pulse 1s infinite;">💭</span> <span id="thinking-text-fs">ARIA denkt...</span>
|
||||||
|
</div>
|
||||||
<div class="input-row" style="margin-top:8px;">
|
<div class="input-row" style="margin-top:8px;">
|
||||||
<input type="text" id="chat-input-fs" placeholder="Nachricht an ARIA..." onkeydown="if(event.key==='Enter'){testRVSFS();event.preventDefault();}">
|
<input type="text" id="chat-input-fs" placeholder="Nachricht an ARIA..." onkeydown="if(event.key==='Enter'){testRVSFS();event.preventDefault();}">
|
||||||
<button class="btn" onclick="testGatewayFS()">Gateway senden</button>
|
<button class="btn" onclick="testGatewayFS()">Gateway senden</button>
|
||||||
@@ -507,6 +513,11 @@
|
|||||||
if (msg.type === 'state') { updateState(msg.state); return; }
|
if (msg.type === 'state') { updateState(msg.state); return; }
|
||||||
if (msg.type === 'log') { addLog(msg.entry.level, msg.entry.source, msg.entry.message, msg.entry.ts); return; }
|
if (msg.type === 'log') { addLog(msg.entry.level, msg.entry.source, msg.entry.message, msg.entry.ts); return; }
|
||||||
|
|
||||||
|
if (msg.type === 'agent_activity') {
|
||||||
|
updateThinkingIndicator(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (msg.type === 'chat_final') {
|
if (msg.type === 'chat_final') {
|
||||||
addChat('received', msg.text, 'chat:final');
|
addChat('received', msg.text, 'chat:final');
|
||||||
return;
|
return;
|
||||||
@@ -883,6 +894,10 @@
|
|||||||
return `<a href="${match}" target="_blank">${match}</a><img src="${match}" class="chat-media" onclick="openLightbox('image','${match}')" onerror="this.style.display='none'">`;
|
return `<a href="${match}" target="_blank">${match}</a><img src="${match}" class="chat-media" onclick="openLightbox('image','${match}')" onerror="this.style.display='none'">`;
|
||||||
});
|
});
|
||||||
const html = `${linked}<div class="meta">${escapeHtml(meta)} — ${new Date().toLocaleTimeString('de-DE')}</div>`;
|
const html = `${linked}<div class="meta">${escapeHtml(meta)} — ${new Date().toLocaleTimeString('de-DE')}</div>`;
|
||||||
|
|
||||||
|
// Thinking-Indikator ausblenden bei neuer Nachricht
|
||||||
|
updateThinkingIndicator({ activity: 'idle' });
|
||||||
|
|
||||||
// In beide Chat-Boxen schreiben (normal + Vollbild)
|
// In beide Chat-Boxen schreiben (normal + Vollbild)
|
||||||
for (const box of [chatBox, document.getElementById('chat-box-fs')]) {
|
for (const box of [chatBox, document.getElementById('chat-box-fs')]) {
|
||||||
if (!box) continue;
|
if (!box) continue;
|
||||||
@@ -930,6 +945,52 @@
|
|||||||
if (e.key === 'Escape' && chatFullscreen) toggleChatFullscreen();
|
if (e.key === 'Escape' && chatFullscreen) toggleChatFullscreen();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ── Thinking-Indikator ─────────────────────────────
|
||||||
|
let thinkingTimeout = null;
|
||||||
|
const TOOL_LABELS = {
|
||||||
|
'Bash': '\uD83D\uDDA5\uFE0F Shell-Befehl',
|
||||||
|
'WebFetch': '\uD83C\uDF10 Webseite abrufen',
|
||||||
|
'WebSearch': '\uD83D\uDD0D Suche',
|
||||||
|
'Read': '\uD83D\uDCC4 Datei lesen',
|
||||||
|
'Write': '\u270D\uFE0F Datei schreiben',
|
||||||
|
'Edit': '\u270D\uFE0F Datei bearbeiten',
|
||||||
|
'Grep': '\uD83D\uDD0D Code durchsuchen',
|
||||||
|
'Glob': '\uD83D\uDCC1 Dateien suchen',
|
||||||
|
'Agent': '\uD83E\uDD16 Sub-Agent',
|
||||||
|
};
|
||||||
|
function updateThinkingIndicator(msg) {
|
||||||
|
const indicators = [
|
||||||
|
document.getElementById('thinking-indicator'),
|
||||||
|
document.getElementById('thinking-indicator-fs'),
|
||||||
|
];
|
||||||
|
const texts = [
|
||||||
|
document.getElementById('thinking-text'),
|
||||||
|
document.getElementById('thinking-text-fs'),
|
||||||
|
];
|
||||||
|
|
||||||
|
if (msg.activity === 'idle') {
|
||||||
|
indicators.forEach(el => { if (el) el.style.display = 'none'; });
|
||||||
|
if (thinkingTimeout) { clearTimeout(thinkingTimeout); thinkingTimeout = null; }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let label = 'ARIA denkt...';
|
||||||
|
if (msg.activity === 'tool' && msg.tool) {
|
||||||
|
label = TOOL_LABELS[msg.tool] || `\uD83D\uDD27 ${msg.tool}`;
|
||||||
|
} else if (msg.activity === 'assistant') {
|
||||||
|
label = 'ARIA schreibt...';
|
||||||
|
}
|
||||||
|
|
||||||
|
indicators.forEach(el => { if (el) el.style.display = 'block'; });
|
||||||
|
texts.forEach(el => { if (el) el.textContent = label; });
|
||||||
|
|
||||||
|
// Auto-Hide nach 2min (falls idle Event verpasst wird — ARIA arbeitet max 15min)
|
||||||
|
if (thinkingTimeout) clearTimeout(thinkingTimeout);
|
||||||
|
thinkingTimeout = setTimeout(() => {
|
||||||
|
indicators.forEach(el => { if (el) el.style.display = 'none'; });
|
||||||
|
}, 120000);
|
||||||
|
});
|
||||||
|
|
||||||
function openLightbox(mediaType, url) {
|
function openLightbox(mediaType, url) {
|
||||||
const lb = document.getElementById('lightbox');
|
const lb = document.getElementById('lightbox');
|
||||||
if (mediaType === 'video') {
|
if (mediaType === 'video') {
|
||||||
|
|||||||
+18
-4
@@ -74,8 +74,8 @@ function pipelineStart(method, text) {
|
|||||||
pipelineStartTime = Date.now();
|
pipelineStartTime = Date.now();
|
||||||
if (pipelineTimeout) clearTimeout(pipelineTimeout);
|
if (pipelineTimeout) clearTimeout(pipelineTimeout);
|
||||||
pipelineTimeout = setTimeout(() => {
|
pipelineTimeout = setTimeout(() => {
|
||||||
if (pipelineActive) pipelineEnd(false, "Timeout — keine Antwort nach 60s");
|
if (pipelineActive) pipelineEnd(false, "Timeout — keine Antwort nach 10min");
|
||||||
}, 60000);
|
}, 600000);
|
||||||
plog(`━━━ Pipeline Start: ${method} ━━━`);
|
plog(`━━━ Pipeline Start: ${method} ━━━`);
|
||||||
plog(`Nachricht: "${text}"`);
|
plog(`Nachricht: "${text}"`);
|
||||||
}
|
}
|
||||||
@@ -319,10 +319,23 @@ function handleGatewayMessage(msg) {
|
|||||||
if (event === "agent") {
|
if (event === "agent") {
|
||||||
const data = payload.data || {};
|
const data = payload.data || {};
|
||||||
const delta = data.delta || "";
|
const delta = data.delta || "";
|
||||||
if (delta && payload.stream === "assistant") {
|
const stream = payload.stream || "";
|
||||||
|
|
||||||
|
if (delta && stream === "assistant") {
|
||||||
broadcast({ type: "chat_delta", delta, payload });
|
broadcast({ type: "chat_delta", delta, payload });
|
||||||
}
|
}
|
||||||
// agent Events nicht einzeln loggen (zu viele)
|
|
||||||
|
// Tool-Nutzung erkennen und broadcasten
|
||||||
|
if (stream === "tool_use" || data.type === "tool_use") {
|
||||||
|
const toolName = data.name || data.tool || payload.tool || "";
|
||||||
|
if (toolName) {
|
||||||
|
broadcast({ type: "agent_activity", activity: "tool", tool: toolName, data });
|
||||||
|
log("info", "gateway", `Tool: ${toolName}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Genereller Activity-Heartbeat (ARIA denkt)
|
||||||
|
broadcast({ type: "agent_activity", activity: stream || "thinking" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -338,6 +351,7 @@ function handleGatewayMessage(msg) {
|
|||||||
log("info", "gateway", `ANTWORT: "${text.slice(0, 200)}"`);
|
log("info", "gateway", `ANTWORT: "${text.slice(0, 200)}"`);
|
||||||
if (pipelineActive) pipelineEnd(true, `"${text.slice(0, 120)}"`);
|
if (pipelineActive) pipelineEnd(true, `"${text.slice(0, 120)}"`);
|
||||||
broadcast({ type: "chat_final", text, payload });
|
broadcast({ type: "chat_final", text, payload });
|
||||||
|
broadcast({ type: "agent_activity", activity: "idle" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ cache leeren, bilder werden nicht neu geladen beim antippen.
|
|||||||
autoload geht nicht
|
autoload geht nicht
|
||||||
wenn man auf das ohr zum hören klickt stürzt ab
|
wenn man auf das ohr zum hören klickt stürzt ab
|
||||||
aria liest die nachrichten nicht vor
|
aria liest die nachrichten nicht vor
|
||||||
|
autoscroll geht doch noch nicht zur letzten nachricht
|
||||||
|
|||||||
+9
-7
@@ -58,17 +58,19 @@ echo -e "${GREEN}[1/5] Versionsnummern auf $VERSION setzen...${NC}"
|
|||||||
sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"$VERSION\"/" android/package.json
|
sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"$VERSION\"/" android/package.json
|
||||||
echo -e " ${GREEN}✓${NC} package.json → $VERSION"
|
echo -e " ${GREEN}✓${NC} package.json → $VERSION"
|
||||||
|
|
||||||
# build.gradle: versionName + versionCode (aus Major.Minor.Patch berechnen)
|
# build.gradle: versionName + versionCode (aus Version berechnen)
|
||||||
MAJOR=$(echo "$VERSION" | cut -d. -f1)
|
# Unterstuetzt 3-stellig (1.2.3) und 4-stellig (0.0.1.7)
|
||||||
MINOR=$(echo "$VERSION" | cut -d. -f2)
|
IFS='.' read -ra VER_PARTS <<< "$VERSION"
|
||||||
PATCH=$(echo "$VERSION" | cut -d. -f3)
|
V1=${VER_PARTS[0]:-0}; V2=${VER_PARTS[1]:-0}; V3=${VER_PARTS[2]:-0}; V4=${VER_PARTS[3]:-0}
|
||||||
VERSION_CODE=$((MAJOR * 10000 + MINOR * 100 + PATCH))
|
VERSION_CODE=$((V1 * 1000000 + V2 * 10000 + V3 * 100 + V4))
|
||||||
|
# Mindestens 1 (Android erfordert versionCode >= 1)
|
||||||
|
[ "$VERSION_CODE" -lt 1 ] && VERSION_CODE=1
|
||||||
sed -i "s/versionName \"[^\"]*\"/versionName \"$VERSION\"/" android/android/app/build.gradle
|
sed -i "s/versionName \"[^\"]*\"/versionName \"$VERSION\"/" android/android/app/build.gradle
|
||||||
sed -i "s/versionCode [0-9]*/versionCode $VERSION_CODE/" android/android/app/build.gradle
|
sed -i "s/versionCode [0-9]*/versionCode $VERSION_CODE/" android/android/app/build.gradle
|
||||||
echo -e " ${GREEN}✓${NC} build.gradle → versionName $VERSION, versionCode $VERSION_CODE"
|
echo -e " ${GREEN}✓${NC} build.gradle → versionName $VERSION, versionCode $VERSION_CODE"
|
||||||
|
|
||||||
# SettingsScreen: Anzeige-Version
|
# SettingsScreen: Anzeige-Version (beliebiges Versionsformat)
|
||||||
sed -i "s/Version [0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]* [^<]*/Version $VERSION /" android/src/screens/SettingsScreen.tsx
|
sed -i "s/Version [0-9][0-9.]*[^<]*/Version $VERSION /" android/src/screens/SettingsScreen.tsx
|
||||||
echo -e " ${GREEN}✓${NC} SettingsScreen → Version $VERSION"
|
echo -e " ${GREEN}✓${NC} SettingsScreen → Version $VERSION"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
Reference in New Issue
Block a user