Перейти к содержимому

Приложение ​

Принятая архитектура · 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.
  • Продакшн-сборка и хостинг.