# Agent-To-Website **Опиши задачу → получи лендинг со встроенным AI-агентом** (чат-виджет на странице). Режим включается в UI переключателем рядом с **Generate landing**, в API полем `agent_to_website`, в CLI — флагом `--agent`. --- ## Что получается на выходе | Элемент | Описание | |--------|----------| | Лендинг | Обычный pipeline Architect → Developer (секции, hero, CTA) | | Виджет `#aicom-agent` | FAB внизу справа → панель чата | | Поведение по умолчанию | **Demo mode** — ответы считаются в браузере, **без запросов на сервер** и без внешних LLM API | | Язык | Строки агента в языке лендинга (`content_language` / промпт) | Если модель не добавила виджет, хост **вставляет проверенный fallback** (`lib/agentToWebsite.mjs`), если не задано `AICOM_LANDING_SKIP_AGENT_INJECT=true`. --- ## Использование ### Web UI 1. Введите промпт продукта. 2. Включите **Agent-To-Website**. 3. **Generate landing** → в превью откройте чат (кнопка в углу). ### API ```http POST /api/generate Content-Type: application/json Origin: https://your-host.example { "prompt": "Лендинг доставки роз — консультант помогает выбрать букет", "style": "blossom-pastel", "ui_locale": "ru", "agent_to_website": true } ``` Ответ: `{ "id", "styleId", "agent_to_website": true, "seconds" }`. ### CLI ```bash npx aicom-landing "AI coach for founders" --agent --out ./dist/index.html ``` --- ## Архитектура ``` user prompt + agent_to_website │ ▼ Architect (+ agent_widget в JSON) │ ▼ Developer (вёрстка + JS чата) │ ▼ ensureAgentWidget() ──► fallback / замена небезопасного кода │ ▼ applyBadgeToHtml() ──► «Powered by AI-Factory» (смещён влево от FAB) │ ▼ index.html в ZIP / preview ``` Промпты: блок `AGENT_TO_WEBSITE` в `llm/prompt.js`. --- ## Безопасность ### Модель угроз | Угроза | Контекст | Митигация | |--------|----------|-----------| | **XSS в чате** | Пользователь сайта вводит текст в виджет | Fallback: только `textContent`. В промпте: запрет `innerHTML` для user input | | **Вредоносный JS от LLM** | Developer вставил `fetch`, `eval`, куки | Аудит `hasRiskyAgentPatterns()`; при совпадении — **замена на fallback** (по умолчанию strict включён) | | **Утечка данных чата** | Ожидание «настоящего» AI | Demo mode: данные **не уходят** с страницы; в UI и доке это явно | | **Фишинг / ложные обещания** | Агент «живой ChatGPT» | Промпт: не заявлять live API без явного запроса в brief | | **Preview / ZIP** | Тот же HTML, что и на проде | iframe `sandbox` без `allow-same-origin`; CSP на `/preview/:id` — см. [SECURITY.md](../SECURITY.md) | | **Расход API ключей** | `POST /api/generate` | Rate limit, auth на деплое; режим agent **не** добавляет второй LLM-вызов на сообщения чата | ### Что делает fallback-виджет - Ответы — keyword-логика + краткий `user_brief` в closure (JSON-экранирование). - Нет `fetch`, `eval`, storage, cookie. - `input maxlength="500"`. - Сообщения пользователя в DOM через `textContent`. ### Что делает strict-режим (по умолчанию) Если в HTML есть `#aicom-agent` и обнаружены, например: - `eval(`, `new Function(` - `fetch("https://...")`, `XMLHttpRequest` - `document.cookie`, `localStorage.setItem` - внешний `