Приложение
Принятая архитектура · 1 октября 2026, вариант 2
Agentfy содержит harness; API Store Deputy предоставляет единый MCP; OpenCart-модуль — защищённый REST/JSON API. Store Deputy проверяет подключения, контекст сотрудника/покупателя, права, согласования и аудит, не создавая второй harness. Connect → вход/регистрация → безопасное подключение → автоматическое создание агента в Agentfy с MCP Store Deputy → возврат в модуль. В app: команды, агенты, аккаунт, биллинг и чат с каждым агентом.
Это заменяет предыдущее решение того же дня про MCP непосредственно в модуле. Код и прототипы ниже ещё не реализуют новую интеграцию. Сессии покупателей и настоящая корзина OpenCart имеют отдельную проверяемую привязку; cookie остаётся в магазине. См. решение о едином MCP: границы, этапы и оставшаяся работа над контрактом.
Сделано; работает на машине разработчика · 1 октября 2026. Только на английском. Оно выполняет от начала до конца одну задачу — подключение магазина, — и это делалось только с двумя локальными тестовыми магазинами.
Приложение — это место, где владелец магазина входит и говорит: «да, подключить этот магазин к моей команде». Чата, каталога и экранов с ценами в нём пока нет.
О названиях: в других файлах репозитория эту часть называют «сайтом». В этом разделе приложение — это приложение для вошедших пользователей в папке app/, а сайт — публичные страницы, отдельная часть.
Что человек может сделать сегодня
- Создать аккаунт или войти.
- Подключить магазин. Владелец приходит по кнопке Connect из своего модуля OpenCart, выбирает команду, если он владелец или админ в нескольких, и подтверждает. Его возвращают на страницу модуля, с которой он пришёл.
- Увидеть, что пошло не так. Если ссылка неполная, уже использована, просрочена или магазин недоступен, владелец видит объяснение. Ссылка назад в магазин показывается, только когда адрес возврата принадлежит тому же магазину.
- Увидеть свои команды и подключённые магазины на главной странице.
Как устроен код
app/slices/
setup/
theme/ Tailwind с токенами дизайна и базовые компоненты интерфейса
pinia/ управление состоянием
api/ клиент API, сгенерированный из описания API
error/ превращает ошибку API в сообщение, понятное человеку
i18n/ переводы; пока только английский
user/
auth/ страницы входа и регистрации, сессия, проверка «вошёл ли»
store/
connect/ страница подтверждения подключения магазина
common/ шапка страницы, макет и главная страницаКаждый слайс — это слой Nuxt: папка со своей конфигурацией, страницами, компонентами, состоянием и переводами. Папка становится частью приложения, как только в ней появляется файл конфигурации; общего списка, который нужно обновлять, нет. Служебные слайсы загружаются первыми.
Внутри слайса функции:
- Страницы тонкие. Страница задаёт маршрут и отображает один компонент.
- Данные получает компонент
Provider. Он есть в каждой группе компонентов. Он читает то, что нужно, обращается к API и решает, какой компонент отображения показать. - Компоненты отображения только отображают. Они получают данные и сообщают, что сделал человек.
- Состояние живёт в хранилище. Сессия — это хранилище Pinia, а не набор разрозненных вспомогательных функций.
Страница подключения показывает этот приём. Страница отображает один провайдер. Провайдер читает ссылку, с которой пришёл владелец, просит API подключить магазин и показывает либо компонент подтверждения, либо компонент ошибки.
Как приложение общается с API
- Клиент генерируется, а не пишется. API описывает свои маршруты; клиент приложения собирается из этого описания при каждом запуске приложения в разработке.
- Сессия переживает перезагрузку страницы без сохранения токена. Короткоживущий токен доступа хранится только в памяти. Долгоживущий — это cookie, которую скрипты страницы прочитать не могут и которая отправляется только на маршруты входа. После перезагрузки приложение просит у API свежий токен доступа.
- Просроченный токен доступа обновляется один раз, и запрос повторяется.
- Страница, требующая входа, отправляет невошедшего человека на вход и потом возвращает его — только на страницу самого приложения, никогда на другой сайт.
- Приложение целиком работает в браузере. Серверного рендеринга нет; API — отдельный сервис.
- Ссылка подключения никуда не передаётся. В ней есть адрес страницы админки магазина, поэтому приложение запрещает браузеру сообщать свой адрес другим сайтам.
Правила для каждого слайса
- Весь код лежит внутри
slices/. В корневых папках компонентов или страниц ничего нет. - Папки слайсов — в единственном числе.
- Состояние — в хранилищах, а не в composables.
- Группы компонентов — один уровень вложенности.
- Цвета, шрифты и формы берутся из принятой дизайн-системы через слайс темы, а не из стилей отдельных страниц.
- Каждый слайс держит свой файл переводов рядом со своими страницами и компонентами.
Места, где приложение сознательно отходит от CleanSlice, перечислены в обзоре.
Ещё не сделано
- Чат, экран «Сегодня», таблицы проверки и отчёты, описанные в концепции.
- Экраны управления командой. API умеет приглашать людей и менять роли; страниц для этого в приложении нет.
- Украинский и русский языки. Переводы подключены, но существует только английский.
- Сброс пароля и подтверждение email.
- Продакшн-сборка и хостинг.