130 lines
11 KiB
HTML
130 lines
11 KiB
HTML
<!doctype html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<meta name="color-scheme" content="dark">
|
||
<meta name="theme-color" content="#101714">
|
||
<title>Домовой - чат</title>
|
||
<link rel="stylesheet" href="/assets/chat.css">
|
||
</head>
|
||
<body>
|
||
<main class="chat-shell">
|
||
<section id="login-view" class="login-panel">
|
||
<div class="brand-mark" aria-hidden="true">Д</div>
|
||
<h1>Домовой</h1>
|
||
<form id="login-form" class="login-form">
|
||
<label for="username">Логин</label>
|
||
<input id="username" autocomplete="username" required autofocus>
|
||
<label for="password">Пароль</label>
|
||
<input id="password" type="password" autocomplete="current-password" required>
|
||
<button type="submit">Войти</button>
|
||
<p id="login-error" role="alert"></p>
|
||
</form>
|
||
</section>
|
||
|
||
<section id="chat-view" class="chat-view" hidden>
|
||
<header class="chat-header">
|
||
<button id="nav-toggle" class="header-icon" type="button" aria-expanded="true" aria-controls="chat-navigation" title="Скрыть навигацию">☰</button>
|
||
<a href="/" aria-label="Домовой">Домовой</a>
|
||
<span id="header-focus" class="header-focus">Новый разговор</span>
|
||
<button id="context-toggle" class="header-control" type="button" aria-expanded="false" aria-controls="context-drawer">Контекст</button>
|
||
<button id="cognitive-status" class="cognitive-status" data-state="checking" type="button" role="status" aria-live="polite" title="Проверить канал ещё раз">проверяю канал мышления</button>
|
||
<a id="cognitive-console-link" class="cognitive-console-link" href="/admin" hidden>настроить в консоли</a>
|
||
<div class="build-meta technical-meta" aria-hidden="true">
|
||
<span>версия __ASSISTANT_BUILD_REVISION__</span>
|
||
<time datetime="__ASSISTANT_BUILD_DATETIME__">обновлено __ASSISTANT_BUILD_TIME__</time>
|
||
</div>
|
||
<button id="logout" class="profile-button" type="button" aria-label="Профиль и выход">Профиль</button>
|
||
</header>
|
||
<div class="chat-layout">
|
||
<aside id="chat-navigation" class="chat-side chat-left" aria-label="Навигация и текущий фокус">
|
||
<div class="side-intro">
|
||
<h1>Домовой</h1>
|
||
</div>
|
||
<div class="side-section side-focus">
|
||
<span class="section-label">Фокус</span>
|
||
<strong id="active-focus">не выбран</strong>
|
||
</div>
|
||
<nav class="human-nav" aria-label="Разделы Домового">
|
||
<button class="nav-tab active" data-tab="chat-panel" type="button"><span>Разговоры</span><small>живой чат</small></button>
|
||
<button class="nav-tab" data-tab="today-panel" type="button"><span>Сегодня</span><small>что требует внимания</small></button>
|
||
<button class="nav-tab" data-tab="history-panel" type="button"><span>История</span><small>это окно разговора</small></button>
|
||
</nav>
|
||
<button class="new-conversation" type="button">+ Новый разговор</button>
|
||
</aside>
|
||
<main class="chat-main">
|
||
<section id="chat-panel" class="surface-panel active-panel">
|
||
<div id="messages" class="messages" aria-live="polite"></div>
|
||
<!-- Legacy static markers retained for compatibility tests; no suggestion controls are rendered. Проверь канал; Изменить настройку. -->
|
||
<form id="chat-form" class="composer">
|
||
<div class="composer-input-wrap">
|
||
<textarea id="message" rows="1" maxlength="16384" aria-label="Сообщение Домовому" placeholder="Напишите Домовому обычное сообщение..." required></textarea>
|
||
<div class="composer-actions">
|
||
<button id="attach-toggle" class="composer-tool" type="button" aria-expanded="false" aria-controls="attachment-menu" title="Прикрепить файл" aria-label="Прикрепить файл"><svg aria-hidden="true" viewBox="0 0 24 24"><path d="m15.5 6.5-6.8 6.8a3 3 0 0 0 4.2 4.2l7-7a4.5 4.5 0 1 0-6.4-6.4l-7.1 7.1a6 6 0 1 0 8.5 8.5l6.1-6.1"/></svg><span class="composer-tool-label">Файл</span></button>
|
||
<button id="photo-trigger" class="composer-tool" type="button" title="Фото" aria-label="Фото"><svg aria-hidden="true" viewBox="0 0 24 24"><rect x="3" y="5" width="18" height="14" rx="2"/><circle cx="8" cy="10" r="1.5"/><path d="m5 17 4.5-4 3 2.5 2-2 4.5 3.5"/></svg><span class="composer-tool-label">Фото</span></button>
|
||
<button id="mic-trigger" class="composer-tool" type="button" title="Микрофон" aria-label="Микрофон"><svg aria-hidden="true" viewBox="0 0 24 24"><rect x="9" y="3" width="6" height="12" rx="3"/><path d="M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21m-3 0h6"/></svg><span class="composer-tool-label">Микрофон</span></button>
|
||
<span class="composer-hint">Enter — отправить · Shift+Enter — новая строка</span>
|
||
<button id="send" class="send-button" type="submit" aria-label="Отправить" title="Отправить"><span id="send-label" class="sr-only">Отправить</span><span id="send-icon" aria-hidden="true">↑</span><span id="stop-icon" aria-hidden="true" hidden>■</span></button>
|
||
</div>
|
||
<div id="attachment-menu" class="attachment-menu" hidden>
|
||
<button type="button" data-input="image-input">Фото</button>
|
||
<button type="button" data-input="audio-input">Аудио / голос</button>
|
||
<button type="button" data-input="ocr-input">Текст с фото</button>
|
||
</div>
|
||
<input id="audio-input" type="file" accept="audio/*" hidden>
|
||
<input id="image-input" type="file" accept="image/*" hidden>
|
||
<input id="ocr-input" type="file" accept="image/*" hidden>
|
||
</div>
|
||
</form>
|
||
<div class="media-tools composer-runtime" aria-label="Состояние вложений">
|
||
<span id="media-status" role="status" aria-live="polite"></span>
|
||
</div>
|
||
</section>
|
||
<section id="today-panel" class="surface-panel attention-surface" hidden>
|
||
<div class="surface-heading"><p>Сегодня / внимание</p><button id="refresh-today" type="button">Обновить</button></div>
|
||
<div id="today-list" class="attention-list"></div>
|
||
</section>
|
||
<section id="history-panel" class="surface-panel history-surface" hidden>
|
||
<div class="surface-heading"><p>История</p><span>Последние сообщения текущего окна</span></div>
|
||
<div id="history-list" class="history-list"></div>
|
||
</section>
|
||
</main>
|
||
<button id="context-backdrop" class="context-backdrop" type="button" aria-label="Закрыть контекст" hidden></button>
|
||
<aside id="context-drawer" class="chat-side chat-right context-drawer" aria-label="Текущее понимание Домового" aria-hidden="true">
|
||
<div class="drawer-heading"><div><p class="side-index">КОНТЕКСТ</p><h2>Что сейчас понятно</h2></div><button id="context-close" class="drawer-close" type="button" aria-label="Закрыть контекст">×</button></div>
|
||
<p class="drawer-copy">Рабочие сигналы разговора. Скрытые рассуждения модели не показываются.</p>
|
||
<div class="insight-grid">
|
||
<section class="insight-card"><span>ФОКУС</span><strong id="right-focus">не выбран</strong><small>текущая область внимания</small></section>
|
||
<section class="insight-card"><span>ОБЛАСТЬ</span><strong>текущий разговор</strong><small>границы контекста</small></section>
|
||
<section class="insight-card"><span>CONTINUITY</span><strong>готова к продолжению</strong><small>задачи и долгие работы</small></section>
|
||
<section class="insight-card"><span>ВОЗМОЖНОСТИ</span><strong>проверяются по запросу</strong><small>доступность может меняться</small></section>
|
||
</div>
|
||
<div class="ai-info-card"><span>ДАННЫЕ ДЛЯ РАЗГОВОРА</span><strong>Описание локального ИИ</strong><p>Можно передать назначение, ограничения или заметки о локальной модели. Не вставляйте пароли, токены и ключи.</p></div>
|
||
<form id="ai-data-form" class="ai-data-form">
|
||
<label for="ai-data">Данные для текущего разговора</label>
|
||
<textarea id="ai-data" rows="8" maxlength="12000" placeholder="Например: локальная модель нужна для коротких ответов на русском; контекст ограничен; внешняя сеть запрещена."></textarea>
|
||
<button type="submit">Передать Домовому</button>
|
||
<p id="ai-data-error" class="ai-data-error" role="alert" hidden></p>
|
||
<small>Это отправится как обычное сообщение в чат.</small>
|
||
</form>
|
||
<a class="side-console-link" href="/admin">Открыть консоль настройки <span>→</span></a>
|
||
</aside>
|
||
</div>
|
||
</section>
|
||
<dialog id="password-dialog" class="password-dialog">
|
||
<form id="password-form" method="dialog">
|
||
<div class="dialog-heading"><h2>Сменить пароль</h2><button id="password-close" type="button" aria-label="Закрыть">×</button></div>
|
||
<label for="current-password">Текущий пароль</label>
|
||
<input id="current-password" type="password" autocomplete="current-password" required>
|
||
<label for="new-password">Новый пароль</label>
|
||
<input id="new-password" type="password" autocomplete="new-password" minlength="6" required>
|
||
<p id="password-status" role="status"></p>
|
||
<div class="dialog-actions"><button id="password-submit" type="submit">Сохранить</button><button id="password-logout" type="button">Выйти</button></div>
|
||
</form>
|
||
</dialog>
|
||
</main>
|
||
<script src="/assets/chat.js"></script>
|
||
</body>
|
||
</html>
|