Feature: Claude Assistent Chat in TaskMate

Neuer Tab "Assistent" mit interaktiver Claude Code Session:
- Chat-UI mit Session-Verwaltung (History, neue/alte Sessions)
- Claude CLI als Child-Process auf dem Host (interaktiv, mit Rueckfragen)
- Streaming-Output per Socket.io
- Nur fuer autorisierte User (Hendrik, Monami)
- 30 Min Inaktivitaets-Timeout
- Task-Uebergabe: Button im Task-Modal sendet Aufgabe an Assistenten
- Chat-Verlauf wird in DB gespeichert

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
Server Deploy
2026-03-19 22:04:49 +01:00
Ursprung 71f59b276b
Commit c4304a4f88
11 geänderte Dateien mit 1574 neuen und 5 gelöschten Zeilen

Datei anzeigen

@@ -38,6 +38,7 @@
<link rel="stylesheet" href="css/knowledge.css">
<link rel="stylesheet" href="css/reminders.css">
<link rel="stylesheet" href="css/contacts.css">
<link rel="stylesheet" href="css/assistant.css">
<link rel="stylesheet" href="css/responsive.css">
<link rel="stylesheet" href="css/mobile.css">
<link rel="stylesheet" href="css/pwa.css">
@@ -310,6 +311,12 @@
</svg>
Kontakte
</button>
<button class="view-tab" data-view="assistant">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/>
</svg>
Assistent
</button>
</nav>
<div class="filter-bar-actions">
<button id="btn-filter-toggle" class="btn btn-outline filter-toggle-btn">
@@ -687,6 +694,48 @@
</div>
<!-- Assistant View -->
<div id="view-assistant" class="view view-assistant hidden">
<div class="assistant-layout">
<aside class="assistant-sidebar">
<div class="assistant-sidebar-header">
<button id="btn-new-session" class="btn btn-primary btn-block">
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 5v14M5 12h14"/>
</svg>
Neue Session
</button>
</div>
<div id="assistant-sessions-list" class="assistant-sessions-list"></div>
</aside>
<main class="assistant-chat">
<div class="assistant-chat-header">
<h3 id="assistant-chat-title">Assistent</h3>
<span id="assistant-status-badge" class="assistant-status-badge"></span>
</div>
<div id="assistant-messages" class="assistant-messages"></div>
<div class="assistant-input-bar">
<textarea id="assistant-input" class="assistant-input" placeholder="Nachricht eingeben..." rows="1"></textarea>
<button id="btn-send-message" class="btn btn-primary assistant-send-btn" title="Senden">
<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<line x1="22" y1="2" x2="11" y2="13"/>
<polygon points="22 2 15 22 11 13 2 9 22 2"/>
</svg>
</button>
</div>
<div id="assistant-empty" class="assistant-empty">
<div class="assistant-empty-icon">
<svg viewBox="0 0 24 24" width="64" height="64" fill="none" stroke="currentColor" stroke-width="1.5">
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/>
</svg>
</div>
<h3>Claude Assistent</h3>
<p>Starte eine neue Session oder waehle eine bestehende aus.</p>
</div>
</main>
</div>
</div>
<!-- Contacts View -->
<div id="view-contacts" class="view view-contacts hidden">
<div class="view-wrapper">
@@ -935,6 +984,10 @@
</div>
<div class="modal-footer">
<div class="modal-footer-left">
<button type="button" id="btn-task-to-assistant" class="btn btn-text hidden">
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
An Assistent
</button>
<button type="button" id="btn-duplicate-task" class="btn btn-text hidden">Duplizieren</button>
<button type="button" id="btn-archive-task" class="btn btn-text hidden">Archivieren</button>
<button type="button" id="btn-restore-task" class="btn btn-text hidden">Wiederherstellen</button>
@@ -1973,6 +2026,10 @@
<svg viewBox="0 0 24 24" width="20" height="20"><path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" stroke="currentColor" stroke-width="2" fill="none"/><circle cx="8.5" cy="7" r="4" stroke="currentColor" stroke-width="2" fill="none"/><line x1="20" y1="8" x2="20" y2="14" stroke="currentColor" stroke-width="2"/><line x1="23" y1="11" x2="17" y2="11" stroke="currentColor" stroke-width="2"/></svg>
<span>Kontakte</span>
</button>
<button class="mobile-nav-item" data-view="assistant">
<svg viewBox="0 0 24 24" width="20" height="20"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" stroke="currentColor" stroke-width="2" fill="none"/></svg>
<span>Assistent</span>
</button>
</div>
</div>