Files
Assistant/cmd/creator-web/static/index.html
T
m 6d1d68e406
CI / test (push) Successful in 27s
CI / test (pull_request) Successful in 26s
feat: expose agent worker capability status
2026-08-22 17:08:09 +03:00

385 lines
28 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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/console.css?v=20260821-context">
</head>
<body>
<a class="skip-link" href="#overview">К содержимому</a>
<div class="grain" aria-hidden="true"></div>
<main id="login-view" class="login-shell">
<section class="login-panel" aria-labelledby="login-title">
<div class="brand-mark" aria-hidden="true">Д</div>
<p class="eyebrow">защищённый вход · creator</p>
<h1 id="login-title">Домовой</h1>
<p class="login-copy">Личная операторская консоль. Учётные данные используются только для выпуска ограниченной сессии и не сохраняются браузером.</p>
<form id="login-form" class="login-form">
<label for="creator-username">Логин</label>
<input id="creator-username" name="username" type="text" autocomplete="username" required autofocus>
<label for="creator-password">Пароль</label>
<div class="secret-row">
<input id="creator-password" name="password" type="password" autocomplete="current-password" required>
<button class="icon-button" id="toggle-secret" type="button" aria-label="Показать пароль" title="Показать пароль">
<span aria-hidden="true">◉</span>
</button>
</div>
<button id="login-button" class="primary-button" type="submit">
<span>Открыть консоль</span><span aria-hidden="true">→</span>
</button>
<p id="login-error" class="form-error" role="alert"></p>
</form>
<div class="trust-line"><span></span>Сессия действует 8 часов<span></span></div>
</section>
</main>
<div id="console-view" class="console" hidden>
<header class="topbar">
<a class="wordmark" href="/" aria-label="Домовой, главная">
<span class="wordmark-symbol">Д</span>
<span><strong>Домовой</strong><small>консоль создателя</small></span>
</a>
<div class="topbar-actions">
<a class="chat-return-link" href="/">← Чат с Домовым</a>
<span id="connection-state" class="connection"><i></i>система доступна</span>
<nav class="topbar-nav" aria-label="Разделы кабинета">
<a href="#overview">Обзор</a>
<a href="#diagnostics">Проверки</a>
<a href="#operations">Операции</a>
<a href="#learning">Опыт</a>
<a href="#settings">Настройки</a>
</nav>
<button id="refresh-all" class="text-button" type="button">Обновить</button>
<button id="logout" class="icon-button" type="button" aria-label="Завершить сессию" title="Выйти">↗</button>
</div>
</header>
<aside class="context-rail">
<div>
<p class="rail-index">01 / КОНТЕКСТ</p>
<h2>Точка внимания</h2>
<p class="rail-copy">Укажите рабочий контекст. Он сохраняется только в этом браузере и не даёт дополнительных полномочий.</p>
</div>
<form id="context-form" class="context-form">
<div class="context-status-row">
<span class="context-status-label">ТЕКУЩИЙ КОНТЕКСТ</span>
<strong id="context-state" data-state="empty">не выбран</strong>
</div>
<div class="context-presets">
<label for="context-preset">Недавние наборы</label>
<select id="context-preset">
<option value="">Выберите сохранённый набор…</option>
</select>
<small>Сохраняются только в этом браузере.</small>
</div>
<div class="context-field">
<label for="session-id">Идентификатор сессии <span>обязательно</span></label>
<div class="context-input-row"><input id="session-id" autocomplete="off" spellcheck="false" placeholder="Вставьте session-id"><button class="copy-context" data-copy-context="session-id" type="button" aria-label="Скопировать идентификатор сессии" title="Скопировать">⧉</button></div>
</div>
<div class="context-field">
<label for="workspace-id">Рабочая область <span>обязательно</span></label>
<div class="context-input-row"><input id="workspace-id" autocomplete="off" spellcheck="false" placeholder="Вставьте workspace-id"><button class="copy-context" data-copy-context="workspace-id" type="button" aria-label="Скопировать рабочую область" title="Скопировать">⧉</button></div>
</div>
<p class="context-hint">Для «Состояния» нужны только эти два значения. Задача, ожидание и возможность находятся ниже в расширенных полях.</p>
<details class="advanced-context">
<summary>Расширенные идентификаторы</summary>
<div>
<label for="task-id">Задача</label>
<input id="task-id" autocomplete="off" placeholder="task-id">
<label for="prospective-id">Выбранное ожидание</label>
<input id="prospective-id" autocomplete="off" placeholder="prospective-item-id">
<label for="capability-id">Возможность</label>
<input id="capability-id" autocomplete="off" value="cognitive-proposal">
<label for="delegation-id">Delegation / агентская работа</label>
<input id="delegation-id" autocomplete="off" placeholder="delegation-id из чата">
</div>
</details>
<div class="context-actions"><button class="secondary-button" type="submit">Загрузить контекст</button><button id="reset-context" class="text-button" type="button">Сбросить</button></div>
</form>
<nav class="section-nav" aria-label="Навигация по кабинету">
<a class="section-nav-link active" aria-current="location" href="#overview"><span>01</span><b>Состояние</b><small>фокус и сигналы</small></a>
<a class="section-nav-link" href="#diagnostics"><span>02</span><b>Проверки</b><small>доступность и границы</small></a>
<a class="section-nav-link" href="#operations"><span>03</span><b>Операции</b><small>ожидания и действия</small></a>
<a class="section-nav-link" href="#learning"><span>04</span><b>Опыт</b><small>reflection и навыки</small></a>
<a class="section-nav-link" href="#settings"><span>05</span><b>Настройки</b><small>интерфейс и обновление</small></a>
</nav>
<div class="session-stamp">
<span>ACTOR</span>
<strong id="session-actor">—</strong>
<span>СЕССИЯ ДО</span>
<strong id="session-expiry">—</strong>
</div>
</aside>
<main class="workspace">
<section id="overview" class="workspace-head" data-page="overview">
<div>
<p class="eyebrow">операционная картина</p>
<h1>Состояние сейчас</h1>
</div>
<p id="last-update" class="last-update">Данные ещё не запрошены</p>
</section>
<section class="signal-strip" aria-label="Сводка состояния" data-page="overview">
<div><span>ФОКУС</span><strong id="focus-signal" data-state="idle">ожидает</strong></div>
<div><span>ЗАДАЧА</span><strong id="task-signal" data-state="idle">ожидает</strong></div>
<div><span>CONTINUITY</span><strong id="prospective-signal" data-state="idle">ожидает</strong></div>
<div><span>ВОЗМОЖНОСТЬ</span><strong id="capability-signal" data-state="idle">ожидает</strong></div>
</section>
<section id="diagnostics" class="diagnostics-panel" aria-labelledby="diagnostics-title" data-page="diagnostics">
<header class="panel-heading">
<div><p>Проверяемая система</p><h2 id="diagnostics-title">Диагностика кабинета</h2></div>
<div class="panel-heading-tools"><span id="diagnostic-summary">Проверка ещё не запускалась</span><button id="run-diagnostics" class="secondary-button compact-button" type="button">Проверить всё</button></div>
</header>
<div class="diagnostic-intro">
<span class="diagnostic-pulse" aria-hidden="true"></span>
<p>Здесь видны только ответы текущей авторизованной сессии. Проверка не меняет данные и помогает отличить отсутствие контекста от недоступности сервиса.</p>
</div>
<div id="diagnostic-list" class="diagnostic-list" aria-live="polite" aria-busy="false">
<p class="register-empty">Нажмите «Проверить всё», чтобы получить актуальный снимок.</p>
</div>
</section>
<section class="advisor-panel" aria-labelledby="advisor-title" data-page="diagnostics">
<div class="advisor-intro">
<p>COGNITIVE / ADVISORY V1</p>
<h2 id="advisor-title">Спросить Домового</h2>
<span>Ответ — только совет. Он не сохраняется, не создаёт задач и не запускает действий.</span>
</div>
<form id="advisory-form" class="advisor-form">
<label for="advisory-message">Ваш вопрос</label>
<textarea id="advisory-message" rows="3" maxlength="16384" placeholder="Что стоит проверить в выбранном контексте?" required></textarea>
<div id="advisory-egress" class="advisor-egress" hidden>
<p class="advisor-egress-kicker">ВНЕШНИЙ КОГНИТИВНЫЙ ПРОВАЙДЕР</p>
<p id="advisory-disclosure">Текст вопроса будет передан согласно активной политике данных.</p>
<label for="advisory-egress-ack">
<input id="advisory-egress-ack" type="checkbox">
<span>Подтверждаю передачу этого вопроса внешнему провайдеру</span>
</label>
</div>
<div class="advisor-controls">
<span id="advisory-privacy"><i></i> локальный детерминированный режим</span>
<button id="advisory-submit" class="primary-button" type="submit"><span>Получить совет</span><span aria-hidden="true">→</span></button>
</div>
</form>
<div id="advisory-result" class="advisor-result" aria-live="polite" hidden>
<div><span>СТАТУС</span><strong id="advisory-state">—</strong></div>
<p id="advisory-text"></p>
</div>
</section>
<section id="operations" class="register-panel" aria-labelledby="register-title" data-page="operations">
<header>
<div><p>Continuity / ближайшие</p><h2 id="register-title">Реестр ожиданий</h2></div>
<span id="prospective-count">0 ЗАПИСЕЙ</span>
</header>
<div id="prospective-list" class="register-list">
<p class="register-empty">Реестр ещё не загружен.</p>
</div>
</section>
<section class="fleet-panel" aria-labelledby="fleet-title" data-page="operations">
<header>
<div><p>Cognitive / capability health</p><h2 id="fleet-title">Модели и fallback</h2></div>
<div class="activity-tools"><span id="fleet-summary">СОСТОЯНИЕ НЕ ЗАГРУЖЕНО</span><button id="refresh-fleet" class="icon-button" type="button" aria-label="Обновить состояние моделей" title="Обновить состояние моделей">↻</button></div>
</header>
<div class="fleet-overview"><div><span>Выбранный tier</span><strong id="fleet-selected">—</strong></div><p id="fleet-explanation">Проверка доступности провайдеров ещё не выполнялась.</p></div>
<div id="fleet-list" class="fleet-list" aria-live="polite" aria-busy="false"><p class="register-empty">Состояние fleet ещё не загружено.</p></div>
</section>
<section class="agent-panel" aria-labelledby="agent-title" data-page="operations">
<header>
<div><p>Work / durable execution</p><h2 id="agent-title">Агентская работа</h2></div>
<div class="activity-tools"><span id="agent-summary">DELEGATION НЕ ВЫБРАНА</span><button id="refresh-agent" class="icon-button" type="button" aria-label="Обновить агентскую работу" title="Обновить агентскую работу">↻</button></div>
</header>
<div id="agent-empty" class="agent-empty">Укажите delegation ID в расширенных идентификаторах, чтобы прочитать durable state.</div>
<div id="agent-details" class="agent-details" hidden>
<div><span>Состояние delegation</span><strong id="agent-delegation-state">—</strong></div>
<div><span>Run / implementation</span><strong id="agent-run-state">—</strong></div>
<div><span>Последний blocker</span><strong id="agent-blocker">—</strong></div>
<p id="agent-next-step">—</p>
</div>
<div class="agent-worker-status"><span>Executor capability</span><strong id="agent-worker-state">ПРОВЕРКА НЕ ВЫПОЛНЯЛАСЬ</strong><p id="agent-worker-message">Статус worker виден только в авторизованной диагностике.</p></div>
</section>
<section class="activity-panel" aria-labelledby="activity-title" data-page="operations">
<header>
<div><p>Commit / владелец</p><h2 id="activity-title">Журнал действий</h2></div>
<div class="activity-tools">
<span id="action-count">0 ЗАПИСЕЙ</span>
<button id="refresh-actions" class="icon-button" type="button" aria-label="Обновить журнал действий" title="Обновить журнал действий">↻</button>
</div>
</header>
<div id="action-history" class="activity-list" aria-live="polite" aria-busy="false">
<p class="register-empty">Журнал ещё не загружен.</p>
</div>
</section>
<section id="learning" class="learning-panel" aria-labelledby="learning-title" data-page="learning">
<header>
<div><p>Learning / evidence</p><h2 id="learning-title">Опыт и reflection</h2></div>
<div class="activity-tools">
<span id="learning-count">0 СИГНАЛОВ</span>
<button id="refresh-learning" class="icon-button" type="button" aria-label="Обновить опыт" title="Обновить опыт">↻</button>
</div>
</header>
<div class="learning-grid">
<article>
<h3>Experience</h3>
<div id="experience-list" class="learning-list" aria-live="polite" aria-busy="false"><p class="register-empty">Опыт ещё не загружен.</p></div>
</article>
<article>
<h3>Reflection</h3>
<div id="reflection-list" class="learning-list" aria-live="polite" aria-busy="false"><p class="register-empty">Reflection ещё не загружен.</p></div>
</article>
<article>
<h3>Skills</h3>
<div id="skill-list" class="learning-list" aria-live="polite" aria-busy="false"><p class="register-empty">Skill profile ещё не загружен.</p></div>
</article>
</div>
</section>
<section id="settings" class="settings-panel" aria-labelledby="settings-title" data-page="settings">
<header class="panel-heading">
<div><p>Локальные предпочтения</p><h2 id="settings-title">Настройки рабочего кабинета</h2></div>
<span id="settings-saved" class="settings-saved">Сохраняются в этом браузере</span>
</header>
<form id="settings-form" class="settings-grid">
<label class="setting-field"><span>Плотность данных</span><small>Выберите, сколько строк помещается на экране.</small><select id="setting-density"><option value="comfortable">Комфортная</option><option value="compact">Компактная</option></select></label>
<label class="setting-field"><span>Автообновление</span><small>Повторная проверка состояния без изменения данных.</small><select id="setting-refresh"><option value="off">Выключено</option><option value="30">Каждые 30 секунд</option><option value="60">Каждую минуту</option><option value="300">Каждые 5 минут</option></select></label>
<label class="setting-check"><input id="setting-motion" type="checkbox"><span><b>Сократить анимацию</b><small>Оставить спокойный режим для длительной работы.</small></span></label>
<div class="settings-actions"><button id="save-settings" class="primary-button compact-button" type="submit"><span>Сохранить настройки</span><span aria-hidden="true">→</span></button><button id="reset-settings" class="text-button" type="button">Сбросить</button></div>
</form>
</section>
<section class="data-grid" data-page="overview">
<article class="data-card focus-card">
<header><span class="card-number">01</span><div><p>Situation</p><h2>Активный фокус</h2></div><span id="focus-badge" class="status-badge neutral">НЕ ЗАГРУЖЕН</span></header>
<dl>
<div><dt>Проект</dt><dd id="focus-project">—</dd></div>
<div><dt>Цель</dt><dd id="focus-goal">—</dd></div>
<div><dt>Область</dt><dd id="focus-scope">—</dd></div>
<div><dt>Привязка</dt><dd id="focus-binding">—</dd></div>
</dl>
<p id="focus-message" class="card-message">Введите идентификаторы сессии и рабочей области.</p>
</article>
<article class="data-card task-card">
<header><span class="card-number">02</span><div><p>Work</p><h2>Задача в фокусе</h2></div><span id="task-badge" class="status-badge neutral">НЕ ЗАГРУЖЕНА</span></header>
<dl>
<div><dt>Задача</dt><dd id="task-value">—</dd></div>
<div><dt>Цель</dt><dd id="task-goal">—</dd></div>
<div><dt>Область</dt><dd id="task-scope">—</dd></div>
<div><dt>Ревизия</dt><dd id="task-revision">—</dd></div>
</dl>
<p id="task-message" class="card-message">Укажите задачу для проверки относительно активного фокуса.</p>
<div class="id-actions"><button class="id-action" data-use-value="task-value" data-target-id="task-id" type="button">Использовать ID задачи</button><button class="id-action icon-id-action" data-copy-value="task-value" type="button" aria-label="Скопировать ID задачи" title="Скопировать ID">⧉</button></div>
</article>
<article class="data-card prospective-card">
<header><span class="card-number">03</span><div><p>Continuity</p><h2>Будущая значимость</h2></div><span id="prospective-badge" class="status-badge neutral">НЕ ЗАГРУЖЕНА</span></header>
<div class="prospective-core">
<div><span>СОСТОЯНИЕ</span><strong id="prospective-state">—</strong></div>
<div class="time-marker"><i aria-hidden="true"></i><span>СРАБОТАЕТ</span><time id="prospective-trigger">—</time></div>
</div>
<dl class="compact-list">
<div><dt>Ожидание</dt><dd id="prospective-value">—</dd></div>
<div><dt>Обязательство</dt><dd id="prospective-commitment">—</dd></div>
<div><dt>Цель</dt><dd id="prospective-goal">—</dd></div>
<div><dt>Область</dt><dd id="prospective-scope">—</dd></div>
<div><dt>Principal</dt><dd id="prospective-owner">—</dd></div>
<div><dt>Ревизия</dt><dd id="prospective-revision">—</dd></div>
</dl>
<p id="prospective-message" class="card-message">Укажите идентификатор ProspectiveItem для проверки владельца и состояния.</p>
<div class="id-actions"><button class="id-action" data-use-value="prospective-value" data-target-id="prospective-id" type="button">Использовать ID ожидания</button><button class="id-action icon-id-action" data-copy-value="prospective-value" type="button" aria-label="Скопировать ID ожидания" title="Скопировать ID">⧉</button></div>
<section class="commit-zone" aria-labelledby="commit-zone-title">
<div class="commit-zone-copy">
<p>Commit / контролируемый переход</p>
<h3 id="commit-zone-title">Подтвердить исполнение</h3>
<span id="action-readiness">Доступно только для доставленного ожидания с проверенной Work-задачей.</span>
</div>
<label for="satisfaction-evidence">Ссылка на подтверждение</label>
<textarea id="satisfaction-evidence" rows="2" maxlength="512" placeholder="artifact://… или краткая ссылка на результат"></textarea>
<button id="prepare-satisfaction" class="commit-button" type="button" disabled>
<span>Отметить исполненным</span><span aria-hidden="true">→</span>
</button>
<div class="notification-command">
<div><strong>Windows-напоминание</strong><span id="notification-readiness">Доступно для доставленного ожидания с проверенной Work-задачей.</span></div>
<button id="prepare-notification" class="secondary-button" type="button" disabled>Отправить уведомление</button>
</div>
<div id="action-result" class="action-result" hidden>
<div><span>ИСХОД</span><strong id="action-state">—</strong></div>
<div><span>ACTION</span><code id="action-id">—</code></div>
<div><span>ATTEMPT</span><code id="attempt-id">—</code></div>
<button id="reconcile-action" class="secondary-button" type="button" hidden>Проверить исход</button>
</div>
</section>
</article>
<article class="data-card capability-card">
<header><span class="card-number">04</span><div><p>Capability</p><h2>Готовность</h2></div><span id="capability-badge" class="status-badge neutral">НЕИЗВЕСТНО</span></header>
<div class="capability-core">
<div class="radar" aria-hidden="true"><span></span><i></i></div>
<div><span>ТЕКУЩЕЕ СОСТОЯНИЕ</span><strong id="capability-state">—</strong><small id="capability-reason">Причина не получена</small></div>
</div>
<dl class="compact-list">
<div><dt>Возможность</dt><dd id="capability-value">—</dd></div>
<div><dt>Ревизия</dt><dd id="capability-revision">—</dd></div>
<div><dt>Наблюдалось</dt><dd id="capability-observed">—</dd></div>
</dl>
<div class="id-actions"><button class="id-action" data-use-value="capability-value" data-target-id="capability-id" type="button">Использовать ID возможности</button><button class="id-action icon-id-action" data-copy-value="capability-value" type="button" aria-label="Скопировать ID возможности" title="Скопировать ID">⧉</button></div>
</article>
</section>
</main>
</div>
<dialog id="satisfaction-dialog" class="confirmation-dialog" aria-labelledby="confirmation-title">
<form method="dialog">
<p class="eyebrow">commit / явное подтверждение</p>
<h2 id="confirmation-title">Зафиксировать исполнение?</h2>
<p class="confirmation-copy">Домовой создаст авторизованное действие и передаст его Continuity Executor. Этот переход меняет каноническое состояние.</p>
<dl class="confirmation-grid">
<div><dt>Ожидание</dt><dd id="confirm-prospective">—</dd></div>
<div><dt>Ревизия</dt><dd id="confirm-prospective-revision">—</dd></div>
<div><dt>Work-задача</dt><dd id="confirm-task">—</dd></div>
<div><dt>Ревизия Work</dt><dd id="confirm-task-revision">—</dd></div>
<div class="wide"><dt>Подтверждение</dt><dd id="confirm-evidence">—</dd></div>
</dl>
<p id="confirmation-error" class="form-error" role="alert"></p>
<div class="confirmation-actions">
<button id="cancel-satisfaction" class="text-button" type="button">Отмена</button>
<button id="confirm-satisfaction" class="commit-button" type="button">Подтверждаю переход</button>
</div>
</form>
</dialog>
<dialog id="notification-dialog" class="confirmation-dialog" aria-labelledby="notification-confirmation-title">
<form method="dialog">
<p class="eyebrow">commit / внешнее действие</p>
<h2 id="notification-confirmation-title">Отправить напоминание?</h2>
<p class="confirmation-copy">Домовой создаст неизменяемое авторизованное действие и передаст типизированное уведомление в закреплённый receiver. Состояние Continuity не изменится; доставка не означает прочтение.</p>
<dl class="confirmation-grid">
<div><dt>Ожидание</dt><dd id="notify-confirm-prospective">—</dd></div>
<div><dt>Ревизия</dt><dd id="notify-confirm-prospective-revision">—</dd></div>
<div><dt>Work-задача</dt><dd id="notify-confirm-task">—</dd></div>
<div><dt>Ревизия Work</dt><dd id="notify-confirm-task-revision">—</dd></div>
<div class="wide"><dt>Канал</dt><dd>Локальное уведомление Windows · закреплённый receiver</dd></div>
</dl>
<p id="notification-confirmation-error" class="form-error" role="alert"></p>
<div class="confirmation-actions">
<button id="cancel-notification" class="text-button" type="button">Отмена</button>
<button id="confirm-notification" class="commit-button" type="button">Подтверждаю отправку</button>
</div>
</form>
</dialog>
<div id="toast" class="toast" role="status" aria-live="polite" hidden></div>
<script src="/assets/console.js?v=20260821-context" defer></script>
</body>
</html>