Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 415706036b | |||
| e2dd47255e | |||
| 3497aa23f8 |
@@ -860,7 +860,7 @@ docker exec aria-brain curl localhost:8080/memory/stats
|
||||
- [x] **Phase B Punkt 3:** Brain Conversation-Loop (Single-Chat UI, Rolling Window 50 Turns, Schwelle 60 → automatisches Destillat, manueller Trigger)
|
||||
- [x] **Phase B Punkt 4:** Skills-System (Python-only via local-venv, skill_create als Tool, dynamische run_<skill> Tools, Diagnostic Skills-Tab mit Logs/Toggle/Export/Import, skill_created Live-Notification in App+Diagnostic, harte Schwelle "pip → Skill")
|
||||
- [x] Sprachmodell-Setting wieder funktional (brainModel in runtime.json statt aria-core)
|
||||
- [x] App-Chat-Sync: verpasste Nachrichten beim Reconnect + chat_cleared Live-Update
|
||||
- [x] App-Chat-Sync: kompletter Server-Sync bei Reconnect (Server = Source of Truth) + chat_cleared Live-Update. Lokal-only Bubbles (Skill-Notifications, laufende Voice ohne STT) bleiben erhalten.
|
||||
- [x] App: Chat-Suche mit Next/Prev Navigation statt Filter
|
||||
- [x] Token/Call-Metrics + Subscription-Quota-Tracking (Pro / Max 5x / Max 20x / Custom)
|
||||
- [x] Datei-Manager Multi-Select: Bulk-Download als ZIP + Bulk-Delete (Diagnostic + App)
|
||||
|
||||
@@ -79,8 +79,8 @@ android {
|
||||
applicationId "com.ariacockpit"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 10203
|
||||
versionName "0.1.2.3"
|
||||
versionCode 10204
|
||||
versionName "0.1.2.4"
|
||||
// Fallback fuer Libraries mit Product Flavors
|
||||
missingDimensionStrategy 'react-native-camera', 'general'
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "aria-cockpit",
|
||||
"version": "0.1.2.3",
|
||||
"version": "0.1.2.4",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"android": "react-native run-android",
|
||||
|
||||
@@ -407,15 +407,17 @@ const ChatScreen: React.FC = () => {
|
||||
return;
|
||||
}
|
||||
|
||||
// chat_history_response: verpasste Nachrichten nachladen (bei Reconnect)
|
||||
// chat_history_response: kompletter Server-Stand. App ersetzt ihre
|
||||
// persistierte Chat-History damit. Lokal-only Bubbles (laufende
|
||||
// Voice-Aufnahmen ohne STT-Result, Skill-Created-Events ohne
|
||||
// text) bleiben erhalten — die sind durch fehlendes 'text' oder
|
||||
// skillCreated/audioRequestId klar als "lokal" erkennbar.
|
||||
if (message.type === 'chat_history_response') {
|
||||
const p = (message.payload || {}) as any;
|
||||
const incoming = (p.messages || []) as Array<any>;
|
||||
if (!incoming.length) return;
|
||||
console.log(`[Chat] ${incoming.length} verpasste Nachrichten nachgeladen`);
|
||||
const toAdd: ChatMessage[] = incoming.map(m => {
|
||||
console.log(`[Chat] Server-Sync: ${incoming.length} Nachrichten vom Server`);
|
||||
const fromServer: ChatMessage[] = incoming.map(m => {
|
||||
const role = m.role === 'user' ? 'user' : 'aria';
|
||||
// ARIA-File-Marker aus dem Backup als attachments rekonstruieren
|
||||
const files = Array.isArray(m.files) ? m.files : [];
|
||||
const attachments = files.map((f: any) => ({
|
||||
type: (typeof f.mimeType === 'string' && f.mimeType.startsWith('image/')) ? 'image' : 'file',
|
||||
@@ -434,12 +436,24 @@ const ChatScreen: React.FC = () => {
|
||||
});
|
||||
const maxTs = incoming.reduce((mx: number, m: any) => Math.max(mx, m.ts || 0), 0);
|
||||
setMessages(prev => {
|
||||
// Dedup auf ts-basis: nicht erneut adden wenn schon was bei +/- 1s vorhanden
|
||||
const existingTs = new Set(prev.map(m => m.timestamp));
|
||||
const newOnes = toAdd.filter(m => !existingTs.has(m.timestamp));
|
||||
return capMessages([...prev, ...newOnes]);
|
||||
// Lokal-only Bubbles erkennen + behalten:
|
||||
// - Skill-Created-Notifications (skillCreated gesetzt)
|
||||
// - Laufende Sprachnachrichten ohne STT-Result (audioRequestId
|
||||
// gesetzt UND text leer/Placeholder)
|
||||
const localOnly = prev.filter(m =>
|
||||
m.skillCreated ||
|
||||
(m.audioRequestId && (!m.text || m.text === '🎙 Aufnahme...' || m.text === 'Aufnahme...'))
|
||||
);
|
||||
// Server-Stand + lokal-only (chronologisch sortiert)
|
||||
const merged = [...fromServer, ...localOnly].sort((a, b) => a.timestamp - b.timestamp);
|
||||
return capMessages(merged);
|
||||
});
|
||||
if (maxTs > 0) AsyncStorage.setItem('aria_chat_last_sync', String(maxTs)).catch(() => {});
|
||||
if (maxTs > 0) {
|
||||
AsyncStorage.setItem('aria_chat_last_sync', String(maxTs)).catch(() => {});
|
||||
} else {
|
||||
// Server leer → unsere lastSync auch zuruecksetzen
|
||||
AsyncStorage.removeItem('aria_chat_last_sync').catch(() => {});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -701,14 +715,13 @@ const ChatScreen: React.FC = () => {
|
||||
|
||||
const unsubState = rvs.onStateChange((state) => {
|
||||
setConnectionState(state);
|
||||
// Bei (re)connect: verpasste Chat-Eintraege seit der letzten gesehenen
|
||||
// Nachricht abholen. lastChatSync wird beim Eingang von Nachrichten
|
||||
// hochgezaehlt; default 0 = alle (gecappt auf Server-Limit).
|
||||
// Bei (re)connect: KOMPLETTEN Server-Stand holen. Server ist die
|
||||
// Source-of-Truth — wenn er leer ist (z.B. nach "Konversation
|
||||
// zuruecksetzen"), soll die App das spiegeln, auch wenn sie offline
|
||||
// war als das passiert ist. since=0 + limit=200 → die letzten 200
|
||||
// Nachrichten vom Server, oder leeres Array wenn Server leer.
|
||||
if (state === 'connected') {
|
||||
AsyncStorage.getItem('aria_chat_last_sync').then(stored => {
|
||||
const since = stored ? parseInt(stored, 10) || 0 : 0;
|
||||
rvs.send('chat_history_request' as any, { since, limit: 100 });
|
||||
}).catch(() => {});
|
||||
rvs.send('chat_history_request' as any, { since: 0, limit: 200 });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -239,7 +239,8 @@ Skills mit Tool-Use.
|
||||
- [x] Memory-Destillat: bei >60 Turns automatisch 30 aelteste → fact-Memories via Claude-Call
|
||||
- [x] Hot Memory (pinned) + Cold Memory (Top-5 semantisch) im System-Prompt
|
||||
- [x] Manueller Destillat-Trigger + Konversation-Reset (Brain + Diagnostic chat_backup gleichzeitig)
|
||||
- [x] App-Chat-Sync: verpasste Nachrichten beim Reconnect + chat_cleared Live-Update
|
||||
- [x] Bridge schreibt chat_backup.jsonl bei jedem Turn (User + ARIA + ARIA-Files)
|
||||
- [x] App-Chat-Sync: kompletter Server-Sync bei Reconnect (Server = Source of Truth). Wenn Server leer → App leert auch. Lokal-only Bubbles (Skill-Notifications, laufende Voice ohne STT) bleiben erhalten. Plus chat_cleared Live-Update wenn Diagnostic die History wiped.
|
||||
|
||||
### Skills-System (Phase B Punkt 4)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user