AI Sana
Платформа, где бизнес с помощью GPT превращает описание задачи в структурированную карточку для студентов, а студенческие команды откликаются из…
О проекте
Команда: Maranello
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Платформа, где бизнес с помощью GPT превращает описание задачи в структурированную карточку для студентов, а студенческие команды откликаются из каталога. Есть веб-версия на Cloudflare и Android APK (WebView), плюс альтернативная реализация «Практика» на FastAPI+React.
Как устроено
Бизнес описывает задачу, GPT (OpenAI Responses API, gpt-4.1-mini, строгая JSON Schema) предлагает структуру и уточняющие вопросы. Фактические поля заполняются только найденными цитатами из исходного текста, сервер проверяет эти цитаты. Правила качества дают объяснимый рейтинг полноты 0–100 с проверкой заглушек и повторов; он считается одинаково на клиенте и сервере и влияет на позицию в каталоге. Студенты откликаются командами из 3–5 человек, бизнес выбирает команду вручную. Данные хранятся в Cloudflare D1 через Drizzle.
Ключевые решения
- strict JSON Schema
- проверка цитат-источников
- rule-based рейтинг полноты
- Drizzle migrations
- optimistic concurrency (контроль версии)
Особенности
Предложения ИИ показываются рядом с цитатами из исходного описания, а фактические разделы заполняются только найденными цитатами. Так снижается риск галлюцинаций. Команды не назначаются автоматически, решение остаётся за бизнесом. Помимо веба собран Android APK (WebView-оболочка). В репозитории много дублирующих папок-снимков.
Стек
React · TypeScript · Next.js · Vite · Cloudflare Workers · Cloudflare D1 · SQLite · Drizzle · Zod · Java · Android · FastAPI · SQLAlchemy · Playwright
Модели
gpt-4.1-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-53976dc5-maranello.
README
README.mdAI Sana — бизнес-задачи и студенческие команды
Бизнес формулирует. Студенты выбирают.
Скачать APK · Открыть веб-версию · Исходники Android · Исходники веб-приложения
Навигация по репозиторию
| Папка | Назначение |
|---|---|
| айсана апк 2 | Актуальная поставка: APK 1.1, SHA-256, исходники Android и обновлённого веб-приложения в ZIP, подробный README |
| ai-sana | Более ранние исходники веб-платформы |
| ai sana 2 | Отдельный сохранённый снимок веб-проекта |
| ai sana apk | Предыдущая Android-поставка |
| test2 | Самостоятельная реализация «Практика — Business × Students» на FastAPI и React |
| service-desk | «Поток»: пример решения студенческой задачи — панель клиентских заявок |
| тестирование сайта | Отчёты QA, тестовые сценарии, фикстуры и результаты |
Для демонстрации основной версии используйте опубликованный сайт или APK из «айсана апк 2». Для воспроизведения последнего обновления распакуйте именно её web-source.zip. Старые папки сохранены как предыдущие варианты. Приложения имеют отдельные хранилища и запускаются независимо; единой команды запуска из корня нет.
1. Название проекта
AI Sana — MVP для практического хакатона HackAlem AI. Актуальная поставка в папке «айсана апк 2» содержит Android-приложение версии 1.1, versionCode 2, пакет kz.aisana.practice. Требуется Android 8.0 или новее и интернет.
2. Проблема и аудитория
Первоначальное описание бизнес-задачи часто не объясняет проблему, результат и условия работы. Студентам трудно оценить объём задачи и предложить подходящее решение.
AI Sana помогает представителю бизнеса подготовить понятную карточку и увидеть пробелы в описании. Студенческие команды самостоятельно выбирают проекты из открытого каталога и отправляют предложения. Бизнес решает, с какой командой продолжить работу.
3. Что реализовано
- Карточка задачи с тремя этапами заполнения, черновиком и публикацией.
- Объяснимый рейтинг полноты описания 0–100; подробные задачи выше в каталоге.
- Проверка заглушек, однообразных повторов и почти одинакового текста в ключевых полях.
- Поиск, фильтры по навыкам и статусу; кабинеты бизнеса и студента.
- Отклик команды из 3–5 разных участников, просмотр предложений владельцем и ручной выбор команды.
- Сохранение в базе данных, разграничение доступа и контроль версии при редактировании.
- Парольные аккаунты бизнеса и студента; в браузере также предусмотрен вход через ChatGPT.
- GPT-помощник с просмотром и выборочным применением предложений. Заполненные поля бизнеса сохраняются.
- Цитаты из исходного описания рядом с предложениями ИИ. Фактические разделы заполняются найденными цитатами; ИИ предлагает название, резюме и навыки.
- Резервная копия несохранённых полей в текущей вкладке и восстановление после перезагрузки.
- Автоматическое обновление откликов и статуса выбора; безопасный повтор одинаковой отправки после обрыва связи.
Android-приложение — WebView-оболочка опубликованного сайта с кнопками «Назад», обновления и открытия в браузере, индикатором загрузки и экраном повторной попытки при сетевой ошибке. Для обновления веб-функций переустановка APK не требуется.
Другие приложения в репозитории
- test2 / «Практика»: описание → три уточняющих вопроса → карточка из 10 полей → рейтинг → подтверждение и публикация; каталог с фильтрами и пагинацией; предложения с идеей, планом, сроком и контактом; принятие или отклонение команды. Переключение ролей демонстрационное, без настоящей авторизации.
- service-desk / «Поток»: таблица клиентских заявок, статусы и ответственные, поиск и фильтры, сводка нагрузки, импорт и экспорт CSV. Начальные данные — 50 обезличенных заявок из
example.csv.
4. Как работает решение
- Бизнес входит и описывает потребность своими словами.
- По желанию отправляет описание GPT. Помощник предлагает структуру и уточняющие вопросы.
- Бизнес проверяет предложения, отмечает нужные поля и дополняет условия. Рейтинг пересчитывается по одним правилам на клиенте и сервере.
- Карточка сохраняется как черновик или публикуется в каталоге.
- Студент входит под своим аккаунтом, выбирает задачу и отправляет название команды, участников и план работы.
- Владелец задачи видит предложение и подтверждает выбор команды. Приём новых откликов завершается.
Команды не назначаются автоматически. Рейтинг описания не оценивает людей и не подтверждает ценность идеи.
5. Технологии
| Компонент | Реализация |
|---|---|
| Android | Java, Android Activity и WebView; min SDK 26, compile/target SDK 35 |
| Конфигурация Android | Android Gradle Plugin 8.13.2, Java 8 source compatibility |
| Интерфейс | React 19, TypeScript, Lucide, CSS |
| Веб-сборка | Vinext, Vite, маршруты Next App Router |
| Сервер | Cloudflare Workers |
| Данные | Cloudflare D1 / SQLite, Drizzle для схемы и миграций |
| Проверка данных | Zod, общая функция расчёта рейтинга |
| ИИ | OpenAI Responses API, строгая JSON Schema; модель по умолчанию gpt-4.1-mini, переопределяется OPENAI_MODEL |
Дополнительные приложения:
| Папка | Технологии |
|---|---|
test2 | Python, FastAPI 0.115.14, SQLAlchemy 2.0.41, SQLite, Pydantic; React 19, TypeScript, React Router 7, Vite 7, Lucide; pytest и Playwright |
service-desk | HTML, CSS, JavaScript, localStorage; статический сервер Node.js и встроенный node:test |
6. Архитектура
Android Activity → WebView → опубликованный React-интерфейс
↓
Браузер → тот же интерфейс → серверные маршруты API
├─ сессия, роль, владелец, проверка данных
├─ правила качества → рейтинг
├─ подготовленные SQL-запросы → D1
└─ описание и черновик → OpenAI → проверка цитат
В архиве web-source.zip: app/components/ — экраны; app/api/ — API; lib/assistant.ts — GPT и проверка источников; lib/quality.ts — рейтинг; lib/repository.ts — операции базы; lib/draft-recovery.ts — восстановление; db/ и drizzle/ — схема и миграции.
Ключ OpenAI используется на сервере. APK и клиентский JavaScript не содержат ключа. Парольные сессии используют HttpOnly cookie; сервер хранит хэш токена. Резервная копия формы хранится в sessionStorage, отдельно для пользователя и задачи.
В test2 React обращается к FastAPI через прокси Vite /api; сервер сохраняет данные в SQLite. В service-desk обработка CSV и хранение выполняются в браузере; Node.js только раздаёт файлы. Эти приложения не подключены к базе основной AI Sana.
7. Установка и запуск
Установить APK
- Скачайте
AI-Sana.apkна Android 8.0+. - Откройте файл и разрешите установку из выбранного источника, если Android попросит.
- Запустите AI Sana при подключённом интернете.
- Войдите в предоставленный аккаунт бизнеса или студента. Пароли передаются отдельно.
Версия 1.1 подписана тем же ключом, что и ранее выложенная 1.0, и имеет более высокий код версии. При обычной установке она предназначена для обновления поверх прежнего приложения. Обновление на физическом устройстве пока не проверено.
Через Android Platform Tools:
adb install -r AI-Sana.apk
Контрольная сумма находится в AI-Sana.apk.sha256.
Запустить веб-приложение локально
Распакуйте web-source.zip, откройте каталог ai-sana. Требуются Node.js 22.13+ и npm; проверки выполнены на Node.js 24.20.
npm ci
npm run build
node --import ./scripts/sites-env.mjs ./node_modules/wrangler/bin/wrangler.js d1 execute DB --local --config dist/server/wrangler.json --persist-to .wrangler/state --file drizzle/0000_friendly_crusher_hogan.sql
node --import ./scripts/sites-env.mjs ./node_modules/wrangler/bin/wrangler.js d1 execute DB --local --config dist/server/wrangler.json --persist-to .wrangler/state --file drizzle/0001_concerned_may_parker.sql
node --import ./scripts/sites-env.mjs ./node_modules/wrangler/bin/wrangler.js d1 execute DB --local --config dist/server/wrangler.json --persist-to .wrangler/state --file drizzle/0002_kind_tarantula.sql
node scripts/create-demo-accounts.mjs ../private-accounts.json
Эти команды миграций предназначены для новой локальной базы. Скрипт создаст локальные аккаунты и запишет случайные пароли в ../private-accounts.json, а конфигурацию аккаунтов — в .dev.vars. Сохраните файл с паролями вне репозитория. Не запускайте создание аккаунтов поверх уже настроенных.
npm run dev
npm test
npm run typecheck
npm run build
При отсутствии OPENAI_API_KEY ручное заполнение, рейтинг, публикация и отклики работают. Для реального ИИ задайте ключ в серверном окружении; не добавляйте .dev.vars в Git.
Пересобрать Android
Распакуйте android-source.zip, установите JDK 17+, Android SDK Platform 35 и совместимый Gradle. Укажите SDK в ANDROID_HOME или local.properties, затем из каталога проекта выполните:
gradle assembleDebug
Gradle Wrapper в архив не включён. Debug-сборка будет подписана локальным debug-ключом и не является заменой опубликованного APK для установки поверх него. Поставленный APK собран средствами aapt2, javac, D8 и подписан библиотекой apksig; приватный ключ подписи не распространяется.
Запустить test2
Из корня репозитория; требуется Python 3.9+ и Node.js 22.12+ (либо 20.19+). Пример для macOS/Linux:
cd test2
python3 -m venv .venv
.venv/bin/python -m pip install -r backend/requirements.txt
npm --prefix frontend ci
.venv/bin/python -m database.seed
.venv/bin/python -m uvicorn backend.main:app --host 127.0.0.1 --port 8000
Во втором терминале из test2:
cd frontend
npm run dev
Windows: используйте .venv\Scripts\python.exe вместо .venv/bin/python. Интерфейс: http://127.0.0.1:5173, документация API: http://127.0.0.1:8000/docs. По умолчанию работает локальный mock-провайдер ИИ без ключа. Для OpenAI нужны AI_PROVIDER=openai, OPENAI_API_KEY; модель по умолчанию gpt-4o-mini. Подробности: test2/README.md.
Запустить service-desk
Требуется Node.js 20+, сторонних npm-зависимостей нет:
cd service-desk
npm start
Откройте http://127.0.0.1:4173. Проверки: npm test. Подробности: service-desk/README.md.
8. Как проверить решение
- Откройте сайт или APK, войдите как бизнес и создайте задачу с пометкой
[ТЕСТ]. - Введите: «У нас сервисная компания. Менеджеры ведут заявки в нескольких таблицах, теряют обращения и забывают отвечать клиентам. Хотим видеть статус, ответственного и срок ответа в одном месте. Срок проекта пока не определён».
- Нажмите «Помочь с описанием», проверьте цитаты, снимите отметку с одного поля и примените выбранное. Снятое поле должно остаться пустым.
- Дополните проблему, желаемый результат, данные, аудиторию, результат передачи, сроки и критерии проверки. Сохраните черновик.
- Измените название без сохранения, перезагрузите страницу и нажмите «Восстановить». Новое название должно вернуться. Сохраните его.
- Опубликуйте задачу, затем войдите как студент. Отправьте предложение команды из трёх участников с конкретным планом.
- Войдите как бизнес, откройте свою задачу в «Мои задачи» и выберите команду. Перезагрузите страницу — решение должно сохраниться.
- Под студентом проверьте результат в «Мои отклики» или карточке задачи.
Проверено для этой версии: 19 автоматических тестов логики; 16 локальных API-проверок с двумя отдельными аккаунтами; TypeScript и production build; реальные ответы OpenAI; выборочное применение в браузере; восстановление после первого сохранения, редактирования и перезагрузки; экран шириной 390 px без горизонтального переполнения. Проверены подпись APK и метаданные версии. На эмуляторе и физическом Android APK не запускался.
Для test2 повторите сценарий через демонстрационное переключение ролей; backend-тесты запускаются из этой папки командой .venv/bin/python -m pytest backend/tests -q. Для «Потока» измените статус заявки, перезагрузите страницу, экспортируйте CSV и импортируйте его обратно. Отчёты в папке тестирования относятся к указанным в них этапам; они не заменяют проверку текущей версии.
9. Данные и интеграции
Источник бизнес-задач — пользовательский ввод. Карточки, отклики, сессии и лимиты хранятся в D1. Владелец видит отклики на свои задачи; студент — свои предложения.
OpenAI получает описание и текущий черновик только по нажатию кнопки. Используются store: false, таймаут 45 секунд и лимит 10 попыток на пользователя в час. Это не обещание полного отсутствия хранения данных у провайдера. Не отправляйте секретные сведения.
Учебные примеры обозначены как примеры. Внешнего датасета, RAG, обучения собственной модели, CRM-интеграции и импорта CSV в самой платформе нет. Контактная почта открывается через mailto:; адреса тестовых аккаунтов @demo.invalid вымышленные.
В test2 данные хранятся в локальной SQLite (database/app.db), демонстрационная роль — в localStorage. OpenAI используется опционально; при недоступности провайдера включаются локальные правила. Подтверждённый живой GPT-вызов для этого отдельного варианта не заявляется.
В «Потоке» данные хранятся в localStorage; CSV переносит их между браузерами. При поддержке браузером WebMCP регистрируются инструменты list_requests и update_request. Собственных вызовов GPT в этом приложении нет.
10. Ограничения
- Для APK нужен интернет; это оболочка веб-приложения, а не отдельный офлайн-клиент.
- Приложение не опубликовано в Google Play и не испытано на физическом Android.
- Вход через ChatGPT в APK открывает внешний браузер; сессия не переносится в WebView. Внутри APK используйте парольные аккаунты.
- Нет самостоятельной регистрации, восстановления пароля, чата, push/email-уведомлений, загрузки файлов и удаления задач через интерфейс.
- Рейтинг проверяет полноту текста; он не доказывает достоверность, полезность или выполнимость задачи.
- ИИ может ошибиться в названии, резюме, навыках или выборе раздела для цитаты. Бизнес проверяет итоговую карточку.
- Резервная копия действует в той же вкладке до 24 часов; после её закрытия и на другом устройстве нужен серверный черновик. История изменений не ведётся.
- Один отклик студента на задачу; участники команды записываются текстом. Выбор команды нельзя отменить через интерфейс.
- Каталог ограничен 500 свежими записями. Нет пагинации и рекомендаций по профилю.
- Нет подтверждённых метрик внедрения у реальных компаний. Победа на хакатоне не гарантируется.
Ограничения отдельных приложений:
- test2: отсутствуют настоящая авторизация и проверка владельца, загрузка файлов, антиспам и контроль одновременных правок. После принятия команды новые предложения всё ещё разрешены. Рейтинг оценивает заполненность; низкая оценка не запрещает публикацию.
- service-desk: нет сервера данных, аккаунтов и синхронизации между устройствами; данные привязаны к браузеру. Между вкладками побеждает последняя запись. CRM и отправка сообщений не реализованы.
11. Ссылки и состав поставки
- Опубликованный сервис
- Вход
- Репозиторий команды
AI-Sana.apk— версия 1.1;AI-Sana.apk.sha256— SHA-256.android-source.zip— исходники оболочки;web-source.zip— исходники соответствующего обновления сервиса.
Описание основано на коде и выполненных проверках. APK открывает актуальную опубликованную версию сайта: дальнейшее обновление сайта может изменить его поведение без изменения APK.
Подтверждённая публичная версия указана для основной AI Sana. Для test2 и service-desk подтверждённые deployed-ссылки в просмотренных исходниках не указаны.
Авторы коммитов
История коммитов
- 2026-09-23 17:56Publish AI Sana Android 1.1 and repository-wide Russian READMEamiko32
- 2026-09-23 17:17docs: link AI Sana stage 3 QA resultsYume-Haruu
- 2026-09-23 17:16Delete README.mdamiko32
- 2026-09-23 17:16test: publish AI Sana stage 3 QA report and fixturesYume-Haruu
- 2026-09-23 17:15Delete Инструкция_для_участников_HackAlem_AI.pdfamiko32
- 2026-09-23 17:15Delete тест первый directoryamiko32
- 2026-09-23 17:14Delete test1 directoryamiko32
- 2026-09-23 17:14Delete образование directoryamiko32
Все коммиты (43)
- 2026-09-23 17:14Delete Новая папка/Новая папка directoryamiko32
- 2026-09-23 17:14Delete Новая папка (2) directoryamiko32
- 2026-09-23 16:54Add ai sana apk package with Russian hackathon READMEAmir
- 2026-09-23 16:49test: publish QA materials in тестирование сайтаYume-Haruu
- 2026-09-23 16:49docs: create тестирование сайта folderYume-Haruu
- 2026-09-23 16:44Upload installable AI Sana Android APKAmir
- 2026-09-23 16:44Remove completed one-time ownership transfer operationAmir
- 2026-09-23 16:42test: record browser import and persistence QAYume-Haruu
- 2026-09-23 16:39Clarify task ownership, show AI quality gains, add Android app and demo guideAmir
- 2026-09-23 16:00test: add service desk CSV boundary coverage and deadline bug reproductionYume-Haruu
- 2026-09-23 15:56Add current MVP as separate ai sana 2 folderAmir
- 2026-09-23 15:49Add business and student password accounts with isolated rolesAmir
- 2026-09-23 15:39feat: add service desk prototype with CSV import and persistenceYume-Haruu
- 2026-09-23 15:38docs: record service desk acceptance resultsYume-Haruu
- 2026-09-23 15:31Add files via uploadYume-Haruu
- 2026-09-23 15:23Re-upload AI Sana web MVP with refined UIAmir
- 2026-09-23 15:21Delete ai-sana directoryamiko32
- 2026-09-23 15:14Refine AI Sana interface and responsive task flowsAmir
- 2026-09-23 14:57Restore AI Sana web MVP and update public demo linksAmir
- 2026-09-23 14:51Delete ai-sana directoryamiko32
- 2026-09-23 14:37Add AI Sana web MVP and hackathon documentationAmir
- 2026-09-23 14:30Add files via uploadamiko32
- 2026-09-23 14:28Добавить папку тест первыйAmir
- 2026-09-23 14:28Add files via uploadYume-Haruu
- 2026-09-23 10:12Добавить папку образованиеAmir
- 2026-09-23 17:25Improve Praktika UX and reliability in test2Temirlan0947
- 2026-09-23 16:53docs(test2): align README with hackathon judging criteriaТемирлан
- 2026-09-23 16:51docs(test2): prepare final handoff and five-minute demoТемирлан
- 2026-09-23 16:29Complete integration QA and seed team profiles in test2Temirlan0947
- 2026-09-23 16:03Add complete demo frontend and handoff to test2Temirlan0947
- 2026-09-23 15:19Add completed backend MVP under test2Temirlan0947
- 2026-09-23 15:06Set page configuration for AI Sana appTemirlan0947
- 2026-09-23 14:51Update ai_helper.pyTemirlan0947
- 2026-09-23 14:15Add AI Sana MVP to test1Темирлан
- 2026-09-23 10:22Create test1 folderTemirlan0947
Структура репозитория (402 файлов)
README.md ai sana 2/.dev.vars.example ai sana 2/.env.example ai sana 2/.gitignore ai sana 2/.npmrc ai sana 2/DEMO.md ai sana 2/DESIGN.md ai sana 2/PRODUCT.md ai sana 2/README.md ai sana 2/ROADMAP.md ai sana 2/android/.gitignore ai sana 2/android/AndroidManifest.xml ai sana 2/android/README.md ai sana 2/android/build.gradle ai sana 2/android/releases/AI-Sana.apk ai sana 2/android/releases/AI-Sana.apk.sha256 ai sana 2/android/res/drawable/ic_launcher.xml ai sana 2/android/settings.gradle ai sana 2/android/src/kz/aisana/practice/MainActivity.java ai sana 2/app/api/assistant/route.ts ai sana 2/app/api/auth/chatgpt/route.ts ai sana 2/app/api/auth/login/route.ts ai sana 2/app/api/auth/logout/route.ts ai sana 2/app/api/responses/[id]/route.ts ai sana 2/app/api/responses/route.ts ai sana 2/app/api/tasks/[id]/responses/route.ts ai sana 2/app/api/tasks/[id]/route.ts ai sana 2/app/api/tasks/route.ts ai sana 2/app/chatgpt-auth.ts ai sana 2/app/components/catalog.tsx ai sana 2/app/components/editor.tsx ai sana 2/app/components/task-detail.tsx ai sana 2/app/globals.css ai sana 2/app/layout.tsx ai sana 2/app/login/login-form.tsx ai sana 2/app/login/page.tsx ai sana 2/app/page.tsx ai sana 2/app/workspace.tsx ai sana 2/cloudflare-env.d.ts ai sana 2/components.json ai sana 2/components/ui/accordion.tsx ai sana 2/components/ui/alert-dialog.tsx ai sana 2/components/ui/alert.tsx ai sana 2/components/ui/aspect-ratio.tsx ai sana 2/components/ui/attachment.tsx ai sana 2/components/ui/avatar.tsx ai sana 2/components/ui/badge.tsx ai sana 2/components/ui/breadcrumb.tsx ai sana 2/components/ui/bubble.tsx ai sana 2/components/ui/button-group.tsx ai sana 2/components/ui/button.tsx ai sana 2/components/ui/calendar.tsx ai sana 2/components/ui/card.tsx ai sana 2/components/ui/carousel.tsx ai sana 2/components/ui/chart.tsx ai sana 2/components/ui/checkbox.tsx ai sana 2/components/ui/collapsible.tsx ai sana 2/components/ui/combobox.tsx ai sana 2/components/ui/command.tsx ai sana 2/components/ui/context-menu.tsx ai sana 2/components/ui/dialog.tsx ai sana 2/components/ui/direction.tsx ai sana 2/components/ui/drawer.tsx ai sana 2/components/ui/dropdown-menu.tsx ai sana 2/components/ui/empty.tsx ai sana 2/components/ui/field.tsx ai sana 2/components/ui/form.tsx ai sana 2/components/ui/hover-card.tsx ai sana 2/components/ui/input-group.tsx ai sana 2/components/ui/input-otp.tsx ai sana 2/components/ui/input.tsx ai sana 2/components/ui/item.tsx ai sana 2/components/ui/kbd.tsx ai sana 2/components/ui/label.tsx ai sana 2/components/ui/marker.tsx ai sana 2/components/ui/menubar.tsx ai sana 2/components/ui/message-scroller.tsx ai sana 2/components/ui/message.tsx ai sana 2/components/ui/native-select.tsx ai sana 2/components/ui/navigation-menu.tsx ai sana 2/components/ui/pagination.tsx ai sana 2/components/ui/popover.tsx ai sana 2/components/ui/progress.tsx ai sana 2/components/ui/radio-group.tsx ai sana 2/components/ui/resizable.tsx ai sana 2/components/ui/scroll-area.tsx ai sana 2/components/ui/select.tsx ai sana 2/components/ui/separator.tsx ai sana 2/components/ui/sheet.tsx ai sana 2/components/ui/sidebar.tsx ai sana 2/components/ui/skeleton.tsx ai sana 2/components/ui/slider.tsx ai sana 2/components/ui/sonner.tsx ai sana 2/components/ui/spinner.tsx ai sana 2/components/ui/switch.tsx ai sana 2/components/ui/table.tsx ai sana 2/components/ui/tabs.tsx ai sana 2/components/ui/textarea.tsx ai sana 2/components/ui/toggle-group.tsx ai sana 2/components/ui/toggle.tsx ai sana 2/components/ui/tooltip.tsx ai sana 2/db/index.ts ai sana 2/db/schema.ts ai sana 2/drizzle.config.ts ai sana 2/drizzle/0000_friendly_crusher_hogan.sql ai sana 2/drizzle/0001_concerned_may_parker.sql ai sana 2/drizzle/0002_kind_tarantula.sql ai sana 2/drizzle/meta/0000_snapshot.json ai sana 2/drizzle/meta/0001_snapshot.json ai sana 2/drizzle/meta/0002_snapshot.json ai sana 2/drizzle/meta/_journal.json ai sana 2/eslint.config.mjs ai sana 2/examples/d1/app/api/notes/route.ts ai sana 2/examples/d1/db/schema.ts ai sana 2/hooks/use-mobile.ts ai sana 2/lib/api.ts ai sana 2/lib/app-auth.ts ai sana 2/lib/assistant.ts ai sana 2/lib/auth-crypto.test.ts ai sana 2/lib/auth-crypto.ts ai sana 2/lib/behavior.test.ts ai sana 2/lib/client.ts ai sana 2/lib/example.ts ai sana 2/lib/fields.ts ai sana 2/lib/merge-assistant.test.ts ai sana 2/lib/merge-assistant.ts ai sana 2/lib/quality.test.ts ai sana 2/lib/quality.ts ai sana 2/lib/repository.ts ai sana 2/lib/server-tasks.ts ai sana 2/lib/task-payload.ts ai sana 2/lib/types.ts ai sana 2/lib/utils.ts ai sana 2/next.config.ts ai sana 2/package-lock.json ai sana 2/package.json ai sana 2/postcss.config.mjs ai sana 2/public/favicon.svg ai sana 2/public/file.svg ai sana 2/public/globe.svg ai sana 2/public/window.svg ai sana 2/scripts/build-verified.sh ai sana 2/scripts/create-demo-accounts.mjs ai sana 2/scripts/execution-profile.mjs ai sana 2/scripts/install-ci.mjs ai sana 2/scripts/install-ci.sh ai sana 2/scripts/install-pnpm.sh ai sana 2/scripts/npm-install.mjs ai sana 2/scripts/pnpm-install.mjs ai sana 2/scripts/run-framework.mjs ai sana 2/scripts/sites-env.mjs ai sana 2/scripts/sites-env.sh ai sana 2/scripts/verify-accounts.mjs ai sana 2/scripts/verify-local.mjs ai sana 2/tsconfig.json ai sana 2/vite.config.ts ai sana apk/AI-Sana.apk ai sana apk/AI-Sana.apk.sha256 ai sana apk/README.md ai-sana/.dev.vars.example ai-sana/.env.example ai-sana/.gitignore ai-sana/.npmrc ai-sana/.openai/hosting.json ai-sana/DEMO.md ai-sana/DESIGN.md ai-sana/PRODUCT.md ai-sana/README.md ai-sana/ROADMAP.md ai-sana/app/api/assistant/route.ts ai-sana/app/api/auth/chatgpt/route.ts ai-sana/app/api/auth/login/route.ts ai-sana/app/api/auth/logout/route.ts ai-sana/app/api/responses/[id]/route.ts ai-sana/app/api/responses/route.ts ai-sana/app/api/tasks/[id]/responses/route.ts ai-sana/app/api/tasks/[id]/route.ts ai-sana/app/api/tasks/route.ts ai-sana/app/chatgpt-auth.ts ai-sana/app/components/catalog.tsx ai-sana/app/components/editor.tsx ai-sana/app/components/task-detail.tsx ai-sana/app/globals.css ai-sana/app/layout.tsx ai-sana/app/login/login-form.tsx ai-sana/app/login/page.tsx ai-sana/app/page.tsx ai-sana/app/workspace.tsx ai-sana/cloudflare-env.d.ts ai-sana/components.json ai-sana/components/ui/accordion.tsx ai-sana/components/ui/alert-dialog.tsx ai-sana/components/ui/alert.tsx ai-sana/components/ui/aspect-ratio.tsx ai-sana/components/ui/attachment.tsx ai-sana/components/ui/avatar.tsx ai-sana/components/ui/badge.tsx ai-sana/components/ui/breadcrumb.tsx ai-sana/components/ui/bubble.tsx ai-sana/components/ui/button-group.tsx ai-sana/components/ui/button.tsx ai-sana/components/ui/calendar.tsx ai-sana/components/ui/card.tsx ai-sana/components/ui/carousel.tsx ai-sana/components/ui/chart.tsx ai-sana/components/ui/checkbox.tsx ai-sana/components/ui/collapsible.tsx ai-sana/components/ui/combobox.tsx ai-sana/components/ui/command.tsx ai-sana/components/ui/context-menu.tsx ai-sana/components/ui/dialog.tsx ai-sana/components/ui/direction.tsx ai-sana/components/ui/drawer.tsx ai-sana/components/ui/dropdown-menu.tsx ai-sana/components/ui/empty.tsx ai-sana/components/ui/field.tsx ai-sana/components/ui/form.tsx ai-sana/components/ui/hover-card.tsx ai-sana/components/ui/input-group.tsx ai-sana/components/ui/input-otp.tsx ai-sana/components/ui/input.tsx ai-sana/components/ui/item.tsx ai-sana/components/ui/kbd.tsx ai-sana/components/ui/label.tsx ai-sana/components/ui/marker.tsx ai-sana/components/ui/menubar.tsx ai-sana/components/ui/message-scroller.tsx ai-sana/components/ui/message.tsx ai-sana/components/ui/native-select.tsx ai-sana/components/ui/navigation-menu.tsx ai-sana/components/ui/pagination.tsx ai-sana/components/ui/popover.tsx ai-sana/components/ui/progress.tsx ai-sana/components/ui/radio-group.tsx ai-sana/components/ui/resizable.tsx ai-sana/components/ui/scroll-area.tsx ai-sana/components/ui/select.tsx ai-sana/components/ui/separator.tsx ai-sana/components/ui/sheet.tsx ai-sana/components/ui/sidebar.tsx ai-sana/components/ui/skeleton.tsx ai-sana/components/ui/slider.tsx ai-sana/components/ui/sonner.tsx ai-sana/components/ui/spinner.tsx ai-sana/components/ui/switch.tsx ai-sana/components/ui/table.tsx ai-sana/components/ui/tabs.tsx ai-sana/components/ui/textarea.tsx ai-sana/components/ui/toggle-group.tsx ai-sana/components/ui/toggle.tsx ai-sana/components/ui/tooltip.tsx ai-sana/db/index.ts ai-sana/db/schema.ts ai-sana/drizzle.config.ts ai-sana/drizzle/0000_friendly_crusher_hogan.sql ai-sana/drizzle/0001_concerned_may_parker.sql ai-sana/drizzle/0002_kind_tarantula.sql ai-sana/drizzle/meta/0000_snapshot.json ai-sana/drizzle/meta/0001_snapshot.json ai-sana/drizzle/meta/0002_snapshot.json ai-sana/drizzle/meta/_journal.json ai-sana/eslint.config.mjs ai-sana/examples/d1/app/api/notes/route.ts ai-sana/examples/d1/db/schema.ts ai-sana/hooks/use-mobile.ts ai-sana/lib/api.ts ai-sana/lib/app-auth.ts ai-sana/lib/assistant.ts ai-sana/lib/auth-crypto.test.ts ai-sana/lib/auth-crypto.ts ai-sana/lib/behavior.test.ts ai-sana/lib/client.ts ai-sana/lib/example.ts ai-sana/lib/fields.ts ai-sana/lib/merge-assistant.test.ts ai-sana/lib/merge-assistant.ts ai-sana/lib/quality.test.ts ai-sana/lib/quality.ts ai-sana/lib/repository.ts ai-sana/lib/server-tasks.ts ai-sana/lib/task-payload.ts ai-sana/lib/types.ts ai-sana/lib/utils.ts ai-sana/next.config.ts ai-sana/package-lock.json ai-sana/package.json ai-sana/postcss.config.mjs ai-sana/public/favicon.svg ai-sana/public/file.svg ai-sana/public/globe.svg ai-sana/public/window.svg ai-sana/scripts/build-verified.sh ai-sana/scripts/create-demo-accounts.mjs ai-sana/scripts/execution-profile.mjs ai-sana/scripts/install-ci.mjs ai-sana/scripts/install-ci.sh ai-sana/scripts/install-pnpm.sh ai-sana/scripts/npm-install.mjs ai-sana/scripts/pnpm-install.mjs ai-sana/scripts/run-framework.mjs ai-sana/scripts/sites-env.mjs ai-sana/scripts/sites-env.sh ai-sana/scripts/verify-accounts.mjs ai-sana/scripts/verify-local.mjs ai-sana/tsconfig.json ai-sana/vite.config.ts service-desk/README.md service-desk/TEST-RESULTS.md service-desk/app.js service-desk/core.js service-desk/core.test.mjs service-desk/example.csv service-desk/index.html service-desk/package.json service-desk/server.mjs service-desk/style.css test2/.env.example test2/.gitignore test2/.impeccable/critique/2026-09-23T12-11-12Z__frontend-src-pages-explore-tsx.md test2/.impeccable/design.json test2/.impeccable/review/assessment-b-detector.json test2/.impeccable/review/catalog.png test2/.impeccable/review/clarification.png test2/.impeccable/review/create.png test2/.impeccable/review/design-polish.md test2/.impeccable/review/desktop.png test2/.impeccable/review/details.png test2/.impeccable/review/editor.png test2/.impeccable/review/finish-review.md test2/.impeccable/review/mobile.png test2/.impeccable/review/proposal-form.png test2/.impeccable/review/proposals.png test2/.impeccable/surfaces/frontend-src-app-tsx.md test2/DESIGN.md test2/PRODUCT.md test2/README.md test2/backend/app/__init__.py test2/backend/app/ai/__init__.py test2/backend/app/ai/providers.py test2/backend/app/ai/schemas.py test2/backend/app/ai/service.py test2/backend/app/database.py test2/backend/app/main.py test2/backend/app/models.py test2/backend/app/schemas.py test2/backend/app/services.py test2/backend/main.py test2/backend/requirements.txt test2/backend/tests/conftest.py test2/backend/tests/test_ai.py test2/backend/tests/test_api.py test2/backend/tests/test_integration_qa.py test2/backend/tests/test_migration.py test2/backend/tests/test_scenario_v2.py test2/database/migrate.py test2/database/seed.py test2/database/seed_data.json test2/database/team_profiles.json test2/docs/API_CONTRACT.md test2/docs/DEMO.md test2/docs/HANDOFF.md test2/docs/SPEC.md test2/frontend/.env.example test2/frontend/.gitignore test2/frontend/index.html test2/frontend/package-lock.json test2/frontend/package.json test2/frontend/playwright.config.ts test2/frontend/public/favicon.svg test2/frontend/src/App.tsx test2/frontend/src/api.ts test2/frontend/src/components.tsx test2/frontend/src/content.ts test2/frontend/src/hooks.ts test2/frontend/src/main.tsx test2/frontend/src/pages/Explore.tsx test2/frontend/src/pages/Intake.tsx test2/frontend/src/pages/Task.tsx test2/frontend/src/styles.css test2/frontend/src/types.ts test2/frontend/src/workspace.tsx test2/frontend/tests/demo.spec.ts test2/frontend/tests/integration.spec.ts test2/frontend/tests/refinements.spec.ts test2/frontend/tests/robustness.spec.ts test2/frontend/tsconfig.json test2/frontend/vite.config.ts айсана апк 2/AI-Sana.apk айсана апк 2/AI-Sana.apk.sha256 айсана апк 2/README.md айсана апк 2/android-source.zip айсана апк 2/web-source.zip тестирование сайта/QA-STAGE-01.md тестирование сайта/QA-STAGE-02.md тестирование сайта/QA-STAGE-03.md тестирование сайта/README.md тестирование сайта/qa-hour-01.test.mjs тестирование сайта/qa-known-bugs.test.mjs тестирование сайта/qa-stage-02-fixtures.mjs тестирование сайта/qa-stage-02-results.json тестирование сайта/qa-stage-03-fixture.json тестирование сайта/qa-stage-03-results.json
Ветки (2)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.