from __future__ import annotations from html import escape from typing import Iterable from urllib.parse import quote from api_server.html5 import _page, _project_link, _topbar def render_html5_ai_structure_page(*, project_id: str, projects: Iterable[object], result: dict | None = None) -> str: project_nav = "\n".join(_project_link(project, project_id) for project in projects) return _page( f"SFERA AI Structure - {project_id}", f"""
{_topbar(project_id, project_nav)}
Подготовка структуры
{render_html5_ai_structure_form(project_id)}
{render_html5_ai_structure_result(result)}
""", ) def render_html5_ai_structure_form(project_id: str) -> str: return f"""
""" def render_html5_ai_structure_result(result: dict | None) -> str: if result is None: return '

Укажите входную и выходную папку. Файлы будут созданы сервером в указанном каталоге.

' diagnostics = list(result.get("diagnostics") or []) artifacts = list(result.get("artifacts") or []) snapshot = result.get("snapshot") or {} normalized = result.get("normalized") or {} return f"""
{escape(str(result.get("status", "")))} {escape(str(result.get("codex_package_folder") or result.get("output_path", "")))}

Папка для переноса в Codex: {escape(str(result.get("codex_package_path", "")))}

Файлы
{escape(str(result.get("files_count", 0)))}
Nodes
{escape(str(snapshot.get("nodes", 0)))}
Edges
{escape(str(snapshot.get("edges", 0)))}
Objects
{escape(str(normalized.get("objects", 0)))}
Артефакты
{''.join(f'
{escape(str(item))}AI structure package
' for item in artifacts)}
{_diagnostics(diagnostics)}
""" def _diagnostics(items: list[object]) -> str: if not items: return "" return f"""
Диагностика
"""