mirror of
https://github.com/R0m1k3/EveFlow.git
synced 2026-10-11 17:29:03 +02:00
Serveur MCP local - Endpoint /mcp (JSON-RPC 2.0, Streamable HTTP, réponses JSON) sur le serveur webhook : initialize, tools/list, tools/call, ping. Même secret que le webhook. 14 outils : capture_screen (image MCP), lock_session, open_app, open_url, media_key, clipboard_get/set, find_files, speak_text, notify_user, set_hud_state, get_app_status, get_conversation_history, show_message. Les outils UI transitent par IPC vers le renderer. - Les mêmes actions système sont proposées au modèle en chat completions. Notifications - Heures calmes (plage horaire, franchissement de minuit), mots prioritaires, échecs de crons toujours lus, résumé vocal des messages entrants (n premières phrases), thème nuit automatique, compteur de non-lus. Conversation - Mode mission : bouton dans la barre de commande, second modèle Hermes (hermes.missionModel) pour les tâches longues. - Barge-in : la parole de l'utilisateur coupe la voix ; seuil d'énergie et ratio relevés pendant la synthèse pour ignorer l'écho. Widget compact - Bandeau glanceable : état, dernière phrase, non-lus, indicateurs heures calmes et mission. Tests : 28 tests unitaires (heures calmes, priorité, résumé), e2e Electron sous Xvfb : MCP initialize/tools/list/tools/call (presse-papiers, capture en image, état et message via le renderer), bandeau compact, aucune erreur. Claude-Session: https://claude.ai/code/session_017Wn5VX9HNbJ7N54hR24u9Y Co-authored-by: Claude <noreply@anthropic.com>
121 lines
2.5 KiB
CSS
121 lines
2.5 KiB
CSS
.compact-root {
|
|
height: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
border-radius: 18px;
|
|
overflow: hidden;
|
|
background: linear-gradient(180deg, rgba(5, 12, 22, var(--compact-opacity, 0.92)), rgba(2, 6, 12, var(--compact-opacity, 0.92)));
|
|
border: 1px solid rgba(var(--accent-rgb), 0.3);
|
|
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6), 0 0 30px rgba(var(--accent-rgb), 0.12);
|
|
}
|
|
.compact-body .panel {
|
|
background: transparent;
|
|
border: none;
|
|
border-radius: 0;
|
|
}
|
|
.compact-body .panel.bracket::before,
|
|
.compact-body .panel.bracket::after {
|
|
display: none;
|
|
}
|
|
.compact-head {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
padding: 8px 8px 8px 14px;
|
|
-webkit-app-region: drag;
|
|
font-family: var(--font-display);
|
|
font-size: 11px;
|
|
letter-spacing: 0.3em;
|
|
color: var(--ink-0);
|
|
}
|
|
.compact-head > * {
|
|
-webkit-app-region: no-drag;
|
|
}
|
|
.compact-head .title {
|
|
flex: 1;
|
|
-webkit-app-region: drag;
|
|
}
|
|
.compact-core {
|
|
position: relative;
|
|
height: clamp(140px, 38vh, 220px);
|
|
flex-shrink: 0;
|
|
}
|
|
.compact-core canvas {
|
|
width: 100%;
|
|
height: 100%;
|
|
display: block;
|
|
}
|
|
.compact-core .core-caption {
|
|
bottom: 6px;
|
|
}
|
|
.compact-body {
|
|
flex: 1;
|
|
min-height: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
border-top: 1px solid var(--line);
|
|
}
|
|
.compact-body .command-bar {
|
|
padding: 8px 10px 10px;
|
|
}
|
|
.compact-body .command-input {
|
|
min-height: 40px;
|
|
font-size: 14px;
|
|
padding: 9px 12px;
|
|
}
|
|
.compact-body .bubble {
|
|
font-size: 13px;
|
|
padding: 8px 11px;
|
|
}
|
|
|
|
/* Glanceable strip: state, unread badge, last sentence. */
|
|
.compact-glance {
|
|
display: grid;
|
|
grid-template-columns: auto 1fr auto;
|
|
align-items: center;
|
|
gap: 8px;
|
|
padding: 4px 12px 8px;
|
|
font-family: var(--font-mono);
|
|
font-size: 10.5px;
|
|
letter-spacing: 0.12em;
|
|
text-transform: uppercase;
|
|
color: var(--ink-2);
|
|
}
|
|
.compact-glance .state {
|
|
color: var(--accent);
|
|
}
|
|
.compact-glance .state.alert {
|
|
color: var(--danger);
|
|
}
|
|
.compact-glance .last {
|
|
font-family: var(--font-body);
|
|
font-size: 12.5px;
|
|
letter-spacing: 0;
|
|
text-transform: none;
|
|
color: var(--ink-1);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
.compact-glance .badges {
|
|
display: flex;
|
|
gap: 6px;
|
|
align-items: center;
|
|
}
|
|
.compact-glance .unread {
|
|
min-width: 18px;
|
|
height: 18px;
|
|
padding: 0 5px;
|
|
border-radius: 9px;
|
|
background: var(--accent);
|
|
color: #03101c;
|
|
font-weight: 700;
|
|
font-size: 11px;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
.compact-glance .mission {
|
|
color: var(--warn, #f5c451);
|
|
}
|