Ship Assistent 0.10: settings panel and UserPrefs with prompt weight.

Separate About-the-user memory (global + per-persona) from craft RAG, add tabbed settings with persona export/import and craft clear APIs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-22 02:05:12 +03:00
co-authored by Cursor
parent cf89348f85
commit fa73158e1c
18 changed files with 2081 additions and 191 deletions
+136 -25
View File
@@ -73,33 +73,144 @@
</div>
</header>
<div class="sa-settings" id="sa_settings" hidden>
<label>Ollama URL <input type="text" id="sa_base_url" value="http://127.0.0.1:11434" /></label>
<label>Модель памяти
<select id="sa_embed_model" class="sa-select" title="Хранение и группировка памяти (use: memory)">
<option value="nomic-embed-text">nomic-embed-text</option>
</select>
</label>
<button type="button" class="basic-button" id="sa_btn_refresh_models">Обновить модели</button>
<button type="button" class="basic-button" id="sa_btn_refresh_inventory">Обновить inventory</button>
<div class="sa-skills-label">Скилы (процедуры)</div>
<div class="sa-skills-box" id="sa_skills_box"></div>
<div class="sa-mem-head">
<span class="sa-skills-label">Память</span>
<select id="sa_mem_kind" class="sa-select sa-mem-kind" title="Фильтр по типу">
<option value="all">Все типы</option>
</select>
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_mem_refresh" title="Перечитать память и очередь wanted"></button>
<div class="sa-settings-head">
<strong>Настройки</strong>
<button type="button" class="basic-button sa-icon-btn" id="sa_settings_close" title="Закрыть" aria-label="Закрыть"></button>
</div>
<div class="sa-mem-list" id="sa_mem_list"></div>
<div class="sa-mem-foot">
<span class="sa-mem-total" id="sa_mem_total">Всего: —</span>
<span class="sa-mem-wanted" id="sa_mem_wanted" title="Модели в очереди на следующий gpu-rent up">Очередь wanted: —</span>
<div class="sa-settings-tabs" role="tablist" aria-label="Разделы настроек">
<button type="button" class="sa-stab sa-stab-active" data-stab="behavior" role="tab" aria-selected="true">Поведение</button>
<button type="button" class="sa-stab" data-stab="models" role="tab" aria-selected="false">Модели</button>
<button type="button" class="sa-stab" data-stab="personas" role="tab" aria-selected="false">Личности</button>
<button type="button" class="sa-stab" data-stab="user" role="tab" aria-selected="false">О пользователе</button>
<button type="button" class="sa-stab" data-stab="craft" role="tab" aria-selected="false">Крафт</button>
<button type="button" class="sa-stab" data-stab="more" role="tab" aria-selected="false">Ещё</button>
</div>
<div class="sa-settings-panes">
<div class="sa-spane" data-spane="behavior">
<p class="sa-settings-hint">Автодействия после ответа модели и скилы текущей личности.</p>
<label class="sa-check"><input type="checkbox" id="sa_auto_vision" /> Авто-прикреплять Generate к чату</label>
<label class="sa-check"><input type="checkbox" id="sa_auto_apply" checked /> Авто-применять патч</label>
<label class="sa-check"><input type="checkbox" id="sa_auto_generate" checked /> Авто-Generate после патча</label>
<label class="sa-check"><input type="checkbox" id="sa_auto_critique" /> Авто-критика после Generate</label>
<label class="sa-check sa-danger" title="Опасно — скачивает без Confirm"><input type="checkbox" id="sa_auto_download" /> Авто-скачивание Civitai (выкл)</label>
<div class="sa-skills-label">Скилы (процедуры)</div>
<div class="sa-skills-box" id="sa_skills_box"></div>
</div>
<div class="sa-spane" data-spane="models" hidden>
<p class="sa-settings-hint">Ollama и модель эмбеддингов для крафт-памяти.</p>
<label>Ollama URL <input type="text" id="sa_base_url" value="http://127.0.0.1:11434" /></label>
<label>Модель чата
<select id="sa_settings_chat_model" class="sa-select" title="Синхрон с шапкой">
<option value=""></option>
</select>
</label>
<label>Модель памяти (embed)
<select id="sa_embed_model" class="sa-select" title="Хранение и группировка памяти (use: memory)">
<option value="nomic-embed-text">nomic-embed-text</option>
</select>
</label>
<div class="sa-settings-row">
<button type="button" class="basic-button" id="sa_btn_refresh_models">Обновить модели</button>
<button type="button" class="basic-button" id="sa_btn_refresh_inventory">Обновить inventory</button>
<button type="button" class="basic-button" id="sa_btn_settings_health">Проверить Ollama</button>
</div>
<div class="sa-settings-health" id="sa_settings_health_line">Ollama · …</div>
</div>
<div class="sa-spane" data-spane="personas" hidden>
<p class="sa-settings-hint">Встроенные личности нельзя удалить. Свои — экспорт / импорт / удаление.</p>
<div class="sa-persona-panel">
<div class="sa-persona-list" id="sa_persona_list"></div>
<div class="sa-persona-preview" id="sa_persona_preview">
<div class="sa-mem-empty">Выбери личность слева</div>
</div>
</div>
<div class="sa-settings-row">
<button type="button" class="basic-button" id="sa_btn_persona_export">Экспорт</button>
<button type="button" class="basic-button" id="sa_btn_persona_import">Импорт…</button>
<button type="button" class="basic-button" id="sa_btn_persona_clone">Клонировать</button>
<button type="button" class="basic-button sa-danger-btn" id="sa_btn_persona_delete_panel" disabled title="Только overlay">Удалить</button>
<input type="file" id="sa_persona_import_file" accept=".json,.assistent-persona.json,application/json" hidden />
</div>
</div>
<div class="sa-spane" data-spane="user" hidden>
<p class="sa-settings-hint">Факты о тебе: общие для всех агентов и личные для текущей личности. Вес управляет силой в промпте.</p>
<label>Вес в промпте <span id="sa_user_prefs_weight_val">1.0</span>
<input type="range" id="sa_user_prefs_weight" min="0" max="1.5" step="0.1" value="1" />
</label>
<p class="sa-settings-hint">0 = выкл · 0.5 = кратко · 1 = полный список · &gt;1 = жёстко соблюдать</p>
<div class="sa-user-prefs-cols">
<div>
<div class="sa-mem-head">
<span class="sa-skills-label">Общие</span>
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_pref_add_global" title="Добавить">+</button>
</div>
<div class="sa-mem-list" id="sa_prefs_global"></div>
</div>
<div>
<div class="sa-mem-head">
<span class="sa-skills-label">Для этой личности</span>
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_pref_add_persona" title="Добавить">+</button>
</div>
<div class="sa-mem-list" id="sa_prefs_persona"></div>
</div>
</div>
<div class="sa-settings-row">
<button type="button" class="basic-button" id="sa_btn_prefs_refresh">Обновить</button>
<button type="button" class="basic-button" id="sa_btn_prefs_clear_global">Очистить общие</button>
<button type="button" class="basic-button" id="sa_btn_prefs_clear_persona">Очистить личность</button>
<button type="button" class="basic-button sa-danger-btn" id="sa_btn_prefs_clear_all">Очистить всё</button>
</div>
</div>
<div class="sa-spane" data-spane="craft" hidden>
<p class="sa-settings-hint">Крафт-RAG: LoRA, карточки, pitfalls. Не путать с «О пользователе».</p>
<div class="sa-mem-head">
<span class="sa-skills-label">Крафт-память</span>
<select id="sa_mem_scope" class="sa-select sa-mem-kind" title="Слой">
<option value="all">Все слои</option>
<option value="shared">Общая</option>
<option value="personal">Эта личность</option>
</select>
<select id="sa_mem_kind" class="sa-select sa-mem-kind" title="Фильтр по типу">
<option value="all">Все типы</option>
</select>
<input type="search" id="sa_mem_search" class="sa-mem-search" placeholder="Поиск…" autocomplete="off" />
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_mem_refresh" title="Перечитать память и очередь wanted"></button>
</div>
<div class="sa-mem-list" id="sa_mem_list"></div>
<div class="sa-mem-foot">
<span class="sa-mem-total" id="sa_mem_total">Всего: —</span>
<span class="sa-mem-wanted" id="sa_mem_wanted" title="Модели в очереди на следующий gpu-rent up">Очередь wanted: —</span>
</div>
<label>memory_top_k <input type="number" id="sa_memory_top_k" min="1" max="30" step="1" value="10" /></label>
<div class="sa-settings-row">
<button type="button" class="basic-button" id="sa_btn_mem_clear_kind">Очистить тип</button>
<button type="button" class="basic-button" id="sa_btn_mem_clear_persona">Очистить личность</button>
<button type="button" class="basic-button" id="sa_btn_mem_clear_shared">Очистить общую</button>
<button type="button" class="basic-button sa-danger-btn" id="sa_btn_mem_clear_all">Очистить всё крафт</button>
</div>
</div>
<div class="sa-spane" data-spane="more" hidden>
<p class="sa-settings-hint">Контекст Ollama и Exact Turbo/RAW (пишется в overlay).</p>
<label>num_ctx <input type="number" id="sa_num_ctx" min="2048" max="131072" step="1024" value="16384" /></label>
<label>history_keep_turns <input type="number" id="sa_history_keep" min="1" max="32" step="1" value="4" /></label>
<div class="sa-skills-label">Exact · Turbo</div>
<div class="sa-settings-row sa-knob-row">
<label>steps <input type="number" id="sa_exact_turbo_steps" min="1" max="64" step="1" /></label>
<label>cfg <input type="number" id="sa_exact_turbo_cfg" min="0.1" max="30" step="0.1" /></label>
<label>σ <input type="number" id="sa_exact_turbo_sigma" min="0.1" max="10" step="0.05" /></label>
</div>
<div class="sa-skills-label">Exact · RAW</div>
<div class="sa-settings-row sa-knob-row">
<label>steps <input type="number" id="sa_exact_raw_steps" min="1" max="64" step="1" /></label>
<label>cfg <input type="number" id="sa_exact_raw_cfg" min="0.1" max="30" step="0.1" /></label>
<label>σ <input type="number" id="sa_exact_raw_sigma" min="0.1" max="10" step="0.05" /></label>
</div>
<div class="sa-settings-row">
<button type="button" class="basic-button sa-primary" id="sa_btn_knobs_save">Сохранить knobs</button>
<button type="button" class="basic-button" id="sa_btn_reset_ui">Сброс UI-state</button>
</div>
</div>
</div>
<label class="sa-check"><input type="checkbox" id="sa_auto_vision" /> Авто-прикреплять Generate к чату</label>
<label class="sa-check"><input type="checkbox" id="sa_auto_apply" checked /> Авто-применять патч</label>
<label class="sa-check"><input type="checkbox" id="sa_auto_generate" checked /> Авто-Generate после патча</label>
<label class="sa-check"><input type="checkbox" id="sa_auto_critique" /> Авто-критика после Generate</label>
<label class="sa-check sa-danger" title="Опасно — скачивает без Confirm"><input type="checkbox" id="sa_auto_download" /> Авто-скачивание Civitai (выкл)</label>
</div>
<div class="sa-view" id="sa_view_chat">