Career Quest
AI-навигатор карьеры в виде 3D-города. Сотрудник получает до трёх рекомендованных активностей с причинами выбора, выполняет практику и видит рост…
О проекте
Команда: Uniqs
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Рабочий MVP
Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития
Суть
AI-навигатор карьеры в виде 3D-города. Сотрудник получает до трёх рекомендованных активностей с причинами выбора, выполняет практику и видит рост навыков. HR анализирует разрывы компетенций команды и составляет планы обучения.
Как устроено
Данные организаторов (employees.json, events.json, skills.json, activity_history.csv) загружаются в Node.js. Расчётный движок по профилю, завершённым после ревью активностям, требованиям следующего грейда и истории выбирает кандидатов и факторы выбора. LLM (GPT-6 Sol через OpenAI Responses API) одним вызовом упорядочивает допустимых кандидатов и формулирует ответ наставника. Уровни навыков модель не считает, в офлайн-режиме ответ собирается из локальной базы знаний. Интерфейс построен на React Three Fiber: город с офисами отделов, юрта наставника, практические задачи по коду на сервере, XP и уровни. Есть HR-панель и импорт профилей.
Ключевые решения
- rule-based рекомендации по skill gap
- structured LLM output
- офлайн-fallback
- 3D open world (three.js / R3F)
- геймификация XP/уровни
Особенности
Карьерная навигация сделана как 3D-игра: город с CC0-моделями KayKit, интерьеры офисов по грейдам, наставник за дастарханом в юрте, практика по коду в Node.js. При этом решение о рекомендации принимает отдельный расчётный движок, а не LLM. Персональные данные (имя, ID, руководитель) не отправляются в модель.
Стек
TypeScript · Next.js 16 · React 19 · three.js · React Three Fiber · OpenAI Responses API · Node.js 24
Модели
GPT-6 Sol
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-88197554-uniqs.
README
README.md
Понятный следующий шаг в карьере — от рекомендации до результата.
Запустить локально · Деплой на сервер · Проверить за 5 минут · Соответствие ТЗ · Как устроено
Career Quest связывает обучение с карьерной целью сотрудника. Профиль, завершённые активности после ревью, требования следующего грейда и история участия определяют подходящие шаги. Сотрудник видит причины выбора, выполняет практику и получает измеримый прирост навыков. HR изучает разрывы команды и составляет планы обучения.
Интерфейс — 3D-город карьеры: офисы отделов, площадки обучения, юрта наставника, герой с личным прогрессом. Город помогает исследовать возможности; решение о рекомендации принимает отдельный расчётный движок. Названия компаний на зданиях и в заданиях используются как оформление демонстрационного сценария.
Развёртывание: проект запускается на Node.js-хостинге или VPS. Команды сборки и запуска ↓ · Полная инструкция деплоя.
Для жюри
| Проверка | Где посмотреть |
|---|---|
| Роль, грейд, карьерная цель, навыки и история | Лобби → «Исследовать город» → лист героя C |
| До трёх подходящих активностей и причины выбора | «Наставник» → запрос следующего шага; факторы на карточках |
| Изменение навыков после выполнения | «Мой план» J / площадка обучения → практика → «Засчитать выполнение» |
| Импорт проверочных профилей и истории | /upload |
| Компетенции команды и планы обучения | /hr, демо-вход ниже |
| Сравнение карьерных направлений | «Примерить роль» |
| Проверяемый расчёт без LLM и 3D | GET /api/profile/E0028, GET /api/recommend/E0028 |
Пошаговый сценарий и ожидаемые результаты →
Чек-лист ТЗ с источниками в коде →
Статусы в чек-листе отражают реализацию. Основной цикл сотрудника, импорт и обязательные срезы HR реализованы. Сквозное разграничение доступа остаётся частичным. Реальный AI доступен при подключении ключа; без ключа работает явно обозначенный офлайн-режим.
Быстрый запуск
Что понадобится
- Node.js 24 и npm. Документация проверена на Node 24.11.0, npm 11.6.1. Минимум Next.js — 20.9, но для TypeScript-практики используется API трансформации типов из более нового Node; для воспроизводимости выбирайте указанную версию.
- Git; Bash и
unzip, если данные распаковываются скриптом. Для Windows используйте WSL или Git Bash. - Стартовый архив
career_quest_dataset.zip, выданный организаторами, либо четыре извлечённых файла из него. - Браузер с WebGL; основной демонстрационный размер — десктоп 1440 px.
База данных и ключ LLM для локального запуска не нужны. Python устанавливать не требуется: учебное подмножество языка обрабатывается внутри Node.js. TypeScript/JavaScript-практика также выполняется сервером Node.
1. Получить проект
git clone https://github.com/BAITC-Hacks/hack-88197554-uniqs.git
cd hack-88197554-uniqs
2. Установить зависимости и запустить одной командой
Замените путь к архиву на свой; кавычки сохраняйте, если в пути есть пробелы:
npm ci && DATASET_ZIP="/полный/путь/career_quest_dataset.zip" npm run dev -- --port 3000
Откройте http://localhost:3000. При первом запуске Next.js компилирует страницы и браузер загружает модели; дождитесь появления профиля и активной кнопки входа.
predev извлекает данные из case_1/career_quest_dataset/ внутри стартового архива. Если все четыре файла уже есть в data/, распаковка пропускается.
Данные уже распакованы / повторный запуск
Разместите файлы непосредственно в корне папки data/:
data/
├── employees.json
├── events.json
├── skills.json
└── activity_history.csv
Затем:
npm ci && npm run dev -- --port 3000
После установки зависимостей достаточно npm run dev -- --port 3000.
DATASET_ZIP задавайте в окружении команды: Bash-скрипт predev сам не загружает .env.local. Автоматический резервный путь ../Варианты/карьера/career_quest_dataset.zip удобен для рабочей папки команды, но в чистом клоне его может не быть.
Почему данных нет в репозитории: по условиям кейса стартовый набор синтетический и не выносится за пределы хакатона. Жюри использует выданный организаторами архив. Папка data/ и .env* исключены из Git. В репозитории нет реальных персональных данных.
Production-сборка локально
Предварительно подготовьте data/ по инструкции выше. В отличие от npm run dev, команда build архив не распаковывает.
npm ci
DATASET_ZIP="/полный/путь/career_quest_dataset.zip" bash scripts/setup-data.sh --if-missing
npm run build
npm run start -- --port 3000
Перед start остановите dev-сервер, использующий тот же порт.
Деплой
Приложение можно разместить на VPS или управляемом Node.js Web Service. Для текущего демо используйте Node 24, один постоянно работающий процесс и файловую систему с возможностью записи. Статический хостинг не запускает API; serverless-размещение без изменения хранения не обеспечивает общий прогресс и HR-сессии.
| Настройка сервиса | Значение |
|---|---|
| Репозиторий / ветка | Этот репозиторий, main |
| Рабочая папка | Корень репозитория |
| Runtime | Node.js 24 |
| Install | npm ci --include=dev |
| Build | npm run build |
| Start | bash scripts/setup-data.sh --if-missing && npm run start -- --hostname 0.0.0.0 |
| Environment | NODE_ENV=production; PORT задаёт платформа, Next.js читает его автоматически |
| Данные | Четыре файла в data/ или доступный на сервере архив и DATASET_ZIP |
| Экземпляры | 1 процесс / 1 реплика |
Команда Start рассчитана на shell с Bash. Для распаковки архива нужен unzip; если data/ уже заполнена, распаковка пропускается. Датасет не входит в Git и должен быть подготовлен в runtime-окружении, а не только на компьютере разработчика. Ключ AI необязателен; переменные приведены ниже.
Пошаговый деплой: данные, переменные, диск, домен и проверка →
Это инструкция размещения, а не ссылка на уже опубликованный сервис. Подтверждённый публичный адрес пока не указан.
Режимы наставника
| Режим | Как включить | Что происходит |
|---|---|---|
| Офлайн | Не задавать ключ либо LLM_PROVIDER=mock | Движок рассчитывает кандидатов и факторы, справка и ответ собираются из локальной базы знаний; без вызова модели |
| OpenAI | OPENAI_API_KEY и при необходимости OPENAI_MODEL | Один вызов модели выбирает/упорядочивает допустимых кандидатов и формулирует ответ |
| Fallback при ошибке API | Автоматически | Ошибка инструмента отображается, остаётся расчётный ответ |
Для онлайн-режима создайте локальный файл .env.local и перезапустите сервер:
OPENAI_API_KEY=your_api_key_here
LLM_PROVIDER=openai
# По умолчанию в коде — gpt-6-sol; можно указать доступную вашему аккаунту модель.
OPENAI_MODEL=gpt-6-sol
Без явного LLM_PROVIDER наличие ключа автоматически выбирает OpenAI. Для воспроизводимой проверки без сети используйте LLM_PROVIDER=mock. Ключ нужен только серверу; префикс NEXT_PUBLIC_ не используется.
Модель не рассчитывает уровни навыков и не добавляет события за пределами подготовленного списка. В запрос уходят карьерные характеристики, навыки, история и сообщения диалога; имя, ID сотрудника и руководитель исключаются из профиля. Онлайн-режим требует доступа к API и подходящей модели. Подробности и границы AI →
Экраны и управление
| Адрес | Назначение |
|---|---|
/ | Лобби: сотрудник, герой и цель → город → профиль, наставник, план, практика |
/hr | Компетенции, планы обучения, доступ и роли |
/upload | Импорт employees.json и/или activity_history.csv для проверки жюри |
Подробные обязательные метрики находятся на вкладке «Обзор компетенций», в раскрываемом блоке «Подробный HR-отчёт · навыки и участие в обучении».
Демо-доступ HR: логин admin, пароль admin — оба значения латиницей, также указаны на форме входа. Это открытые демонстрационные реквизиты.
| Управление | Действие |
|---|---|
| WASD / стрелки | Передвижение; в первом лице относительно направления взгляда |
| Shift | Бег |
| E / Enter | Войти в здание или взаимодействовать с ближайшим объектом |
| C / J | Лист героя / мой план |
| V | Обзор ↔ вид от первого лица |
| Зажатая мышь и движение | Осмотреться в первом лице |
| Колесо мыши | Приблизить/отдалить в режиме обзора |
| Esc | Закрыть панель, встать или выйти из здания — в зависимости от контекста |
| «Карта» | Быстро перейти к нужному месту |
Панели открываются кнопками, поэтому для проверки бизнес-сценария не нужно вручную обходить весь город. Физические этажи офисов — гостевой, рабочие команды, разработка и управление; карьерный грейд и готовность к нему считаются отдельно в профиле.
Что сохраняется
| Данные | Хранение и поведение после перезапуска |
|---|---|
| Стартовые профили, события, навыки, история | Читаются из data/ |
| Импорт, новые выполнения, отказы и карьерные цели | Память одного Node.js-процесса; сбрасываются при его перезапуске |
| HR-аккаунты и планы | Локальный файл src/features/hr/.local/workspace.json; нужна записываемая файловая система |
| HR-сессии | Память процесса, срок 8 часов |
| Ник и выбор экипировки | localStorage браузера |
| Принятые в городе квесты и черновики практики | Память вкладки; не заменяют серверную историю |
Для повторной проверки импортированных сотрудников после рестарта повторите импорт. HR-планы сохраняются отдельно от профилей, поэтому прежний план может ссылаться на ещё не загруженного сотрудника.
Проверки и документация
./scripts/check.sh
Команда выполняет генерацию типов маршрутов, TypeScript и ESLint. Предупреждение о window.location.assign() на странице импорта известно; ошибок typecheck/lint при подготовке документации нет.
- DEPLOYMENT.md — развёртывание на Node.js-хостинге или VPS, runtime-данные, переменные и проверка.
- DEMO.md — сценарий жюри, ожидаемые значения, импорт, API-команды и частые проблемы.
- REQUIREMENTS.md — требования ТЗ, подтверждение в коде и ограничения.
- ARCHITECTURE.md — архитектура, формула ранжирования, обновление навыков, AI и API.
- VISION.md — исходные продуктовые приоритеты; это план, а не подтверждение готовности.
- DECISIONS.md — история решений и контрактов; актуальное поведение описано в документах выше.
- Отдельный прототип офиса — эксперимент с совместным присутствием; основной город не является многопользовательским.
Границы демо
Роли ограничивают HR-модуль, но публичные API города и импорта остаются демонстрационными. Нет долговременного хранения общего прогресса, автоматического присвоения грейда и подтверждённого замера SLA на хостинге. Эти пункты явно выделены в чек-листе.
3D-модели KayKit сопровождаются лицензиями в public/models/; основной стек — Next.js, React, TypeScript, Tailwind, shadcn/Base UI и React Three Fiber.
Авторы коммитов
История коммитов
- 2026-09-23 17:59Merge remote-tracking branch 'origin/main' into codex/officeYelnur
- 2026-09-23 17:57Use company names consistently across city and office interiorsYelnur
- 2026-09-23 17:53docs: add prominent deployment guide for Node hosting and VPSBexul
- 2026-09-23 17:41Merge remote-tracking branch 'origin/main' into codex/officeYelnur
- 2026-09-23 17:40Add upload and HR navigation to lobbyYelnur
- 2026-09-23 17:40Merge remote-tracking branch 'origin/main' into worktree-agent-ab55e81c9ca50d667Bexul
- 2026-09-23 17:40feat(intro): интро-роадмап продукта и чат-гид перед лоббиBexul
- 2026-09-23 17:39Merge remote-tracking branch 'origin/main' into codex/officeYelnur
Все коммиты (77)
- 2026-09-23 17:39feat(hr): edit published learning plans and preserve completed stepsYelnur
- 2026-09-23 17:38docs: add jury launch guide, verification walkthrough and requirements matrixBexul
- 2026-09-23 17:36feat: ground mentor and profile guidance in ecosystem knowledgeBexul
- 2026-09-23 17:29Merge remote-tracking branch 'origin/main' into feat/practice-tasksBexul
- 2026-09-23 17:29Merge origin/main into feat/practice-tasksBexul
- 2026-09-23 17:27Merge remote-tracking branch 'origin/main' into codex/officeYelnur
- 2026-09-23 17:27Merge remote-tracking branch 'origin/main' into HEADYelnur
- 2026-09-23 17:27Merge latest HR reconciliation from mainYelnur
- 2026-09-23 17:26chore: preserve current profile import before main integrationYelnur
- 2026-09-23 17:26feat(venues): per-activity practice tasks with server-side code runners and solution scoreBexul
- 2026-09-23 17:25feat(hr): add learning templates and personalized plans for every employeeYelnur
- 2026-09-23 17:25feat(city): add switchable first-person camera and relative movementBexul
- 2026-09-23 17:24Merge origin/main into docs/banner-companiesBexul
- 2026-09-23 17:24Merge office features and HR demo access into mainYelnur
- 2026-09-23 17:24docs: detailed banner towers with company signs, README refreshBexul
- 2026-09-23 17:21Merge remote-tracking branch 'origin/main' into codex/interactive-activitiesBexul
- 2026-09-23 17:20Integrate HR plans and reconcile skills with the current engineBexul
- 2026-09-23 17:20fix(hr): use admin as the demo passwordYelnur
- 2026-09-23 17:19fix(character): Esc and C close hero sheet while controls are lockedBexul
- 2026-09-23 17:17feat(hr): show demo login and set requested admin passwordYelnur
- 2026-09-23 17:16Merge remote-tracking branch 'origin/main' into worktree-agent-aa6bc31ac649e16b4Bexul
- 2026-09-23 17:16feat(character): full-screen hero sheet with 3D hero, gear, trophies and nicknameBexul
- 2026-09-23 17:13fix(hr): restrict employee search and clarify plan suggestionsYelnur
- 2026-09-23 17:12Merge remote-tracking branch 'origin/main' into codex/interior-lifeBexul
- 2026-09-23 17:12feat(city): bring interiors closer and add activities and colleaguesBexul
- 2026-09-23 17:11fix(hud): glow mentor card instead of spawning followerBexul
- 2026-09-23 17:10chore(hr): save current access and learning-plan implementationYelnur
- 2026-09-23 17:07Integrate career comparison and remaining published changesBexul
- 2026-09-23 17:07Integrate recommendation engine, HR dashboard, and profile uploadBexul
- 2026-09-23 17:03Merge origin/main into feat/xp-levelsBexul
- 2026-09-23 17:03feat(character): XP and levels for voluntary steps, reward overlayBexul
- 2026-09-23 17:03feat(city): department towers branded as company officesBexul
- 2026-09-23 17:03Merge remote-tracking branch 'origin/main' into codex/officeYelnur
- 2026-09-23 17:02feat(career): compare role paths and explain personal venue recommendationsYelnur
- 2026-09-23 16:56Merge remote-tracking branch 'origin/main' into worktree-agent-a4cf79d6daf705729Bexul
- 2026-09-23 16:56feat(venues): practice tasks come from a sponsor companyBexul
- 2026-09-23 16:53Merge remote-tracking branch 'origin/main' into codex/officeYelnur
- 2026-09-23 16:52feat(hud): mentor guide glows, appears and vanishes in a beam of lightBexul
- 2026-09-23 16:52Merge remote-tracking branch 'origin/main' into codex/officeYelnur
- 2026-09-23 16:52feat(city): share four-floor office layout across office towersYelnur
- 2026-09-23 16:45feat(city): add four-floor Backend office from reference planYelnur
- 2026-09-23 16:44docs: eye-catching README header with city banner, badges and pitchBexul
- 2026-09-23 16:43feat(hud): mentor greets on the street and guides a goal-based city tourBexul
- 2026-09-23 16:39Merge remote-tracking branch 'origin/main' into codex/officeYelnur
- 2026-09-23 16:38feat(city): add three-floor Frontend office from reference planYelnur
- 2026-09-23 16:32feat(hud): two-step lobby with career goal, POST /api/goal updates engine targetBexul
- 2026-09-23 16:29fix(mentor): enforce structured AI replies and distinguish fallback statusBexul
- 2026-09-23 16:27feat(venues): add guided coding exercises and practical activity casesBexul
- 2026-09-23 16:23feat(mentor): add conversational chat with inline activity cardsBexul
- 2026-09-23 16:21feat(hud): 3D character select in lobby, chosen hero walks the cityBexul
- 2026-09-23 16:16feat(mentor): automatically suggest actionable development cardsBexul
- 2026-09-23 16:12feat(mentor): connect GPT-6 Sol through OpenAI Responses APIBexul
- 2026-09-23 16:04feat(hud): add career lobby, focused navigation and next stepBexul
- 2026-09-23 15:56Merge remote-tracking branch 'origin/main' into codex/officeYelnur
- 2026-09-23 15:52Merge office layouts with current city interiorsBexul
- 2026-09-23 15:50city: quest markers over venues, +skill popup with cheer after progress, wider interior camera; decisions note on CC0 packsBexul
- 2026-09-23 15:50feat(city): adapt Yelnur office interiors with distinct building layoutsBexul
- 2026-09-23 15:48city: yurt interior with mentor at the dastarkhan (floor sitting, greeting by language), Academy auditorium, mentors' café with barista and chandelierBexul
- 2026-09-23 15:43city: interiors — tower lobby with reception and elevator, 4 grade floors per department (Backend racks, Frontend studio, Data dashboards, QA device lab, Product roadmap, HR lounge, Sales trophies, SuBexul
- 2026-09-23 15:36Add multiplayer office prototype and implementation specificationYelnur
- 2026-09-23 15:34feat(hr): aggregate career gaps and participation from storeBexul
- 2026-09-23 15:34city: open world on CC0 models — 8 distinct towers with signs, roads with sidewalks and markings, KayKit venues/homes, street props, cars, pedestrians, sky and env; interior entry with fadeBexul
- 2026-09-23 15:33feat(upload): import employee profiles and historyBexul
- 2026-09-23 15:32Fix skill reconciliation and explainable activity recommendationsBexul
- 2026-09-23 15:18city: CC0 KayKit character with idle/walk/run/sit animations, Shift run, closer cameraBexul
- 2026-09-23 15:03Merge remote-tracking branch 'origin/main' into feat/open-worldBexul
- 2026-09-23 15:03skeleton: Next.js app, data contract, API stubs, 3D city shell and HUDBexul
- 2026-09-23 14:29docs: add quick start instructionsYe1nurN
- 2026-09-23 14:16docs: outline Career Quest direction and demo milestonesBexul
Структура репозитория (513 файлов)
.claude/commands/check.md .claude/commands/demo.md .claude/commands/handoff.md .claude/commands/integrate.md .claude/commands/sync.md .claude/commands/task.md .claude/hooks/stop-check.sh .claude/launch.json .claude/settings.json .gitignore AGENTS.md CLAUDE.md README.md components.json docs/ARCHITECTURE.md docs/DECISIONS.md docs/DEMO.md docs/DEPLOYMENT.md docs/INTEGRATOR.md docs/OFFICE_SPEC.ru.md docs/PLAYBOOK.md docs/REQUIREMENTS.md docs/TODO.md docs/VISION.md docs/assets/banner.svg docs/concept/START.md eslint.config.mjs next.config.ts package-lock.json package.json postcss.config.mjs prompts/skeleton.md prototypes/office/.gitignore prototypes/office/DELIVERY.md prototypes/office/README.md prototypes/office/build.mjs prototypes/office/lib/dataset.mjs prototypes/office/licenses/models.txt prototypes/office/licenses/three.txt prototypes/office/package-lock.json prototypes/office/package.json prototypes/office/server.mjs prototypes/office/shared/world.mjs prototypes/office/src/app.js prototypes/office/src/index.html prototypes/office/src/scene.js prototypes/office/src/style.css prototypes/office/test/world.test.mjs prototypes/office/world.html public/models/adventurers/Barbarian.glb public/models/adventurers/Knight.glb public/models/adventurers/License.txt public/models/adventurers/Mage.glb public/models/adventurers/Rogue.glb public/models/city/License.txt public/models/city/base.bin public/models/city/base.gltf public/models/city/bench.bin public/models/city/bench.gltf public/models/city/box_A.bin public/models/city/box_A.gltf public/models/city/box_B.bin public/models/city/box_B.gltf public/models/city/building_A.bin public/models/city/building_A.gltf public/models/city/building_A_withoutBase.bin public/models/city/building_A_withoutBase.gltf public/models/city/building_B.bin public/models/city/building_B.gltf public/models/city/building_B_withoutBase.bin public/models/city/building_B_withoutBase.gltf public/models/city/building_C.bin public/models/city/building_C.gltf public/models/city/building_C_withoutBase.bin public/models/city/building_C_withoutBase.gltf public/models/city/building_D.bin public/models/city/building_D.gltf public/models/city/building_D_withoutBase.bin public/models/city/building_D_withoutBase.gltf public/models/city/building_E.bin public/models/city/building_E.gltf public/models/city/building_E_withoutBase.bin public/models/city/building_E_withoutBase.gltf public/models/city/building_F.bin public/models/city/building_F.gltf public/models/city/building_F_withoutBase.bin public/models/city/building_F_withoutBase.gltf public/models/city/building_G.bin public/models/city/building_G.gltf public/models/city/building_G_withoutBase.bin public/models/city/building_G_withoutBase.gltf public/models/city/building_H.bin public/models/city/building_H.gltf public/models/city/building_H_withoutBase.bin public/models/city/building_H_withoutBase.gltf public/models/city/bush.bin public/models/city/bush.gltf public/models/city/car_hatchback.bin public/models/city/car_hatchback.gltf public/models/city/car_police.bin public/models/city/car_police.gltf public/models/city/car_sedan.bin public/models/city/car_sedan.gltf public/models/city/car_stationwagon.bin public/models/city/car_stationwagon.gltf public/models/city/car_taxi.bin public/models/city/car_taxi.gltf public/models/city/citybits_texture.png public/models/city/dumpster.bin public/models/city/dumpster.gltf public/models/city/firehydrant.bin public/models/city/firehydrant.gltf public/models/city/road_corner.bin public/models/city/road_corner.gltf public/models/city/road_corner_curved.bin public/models/city/road_corner_curved.gltf public/models/city/road_junction.bin public/models/city/road_junction.gltf public/models/city/road_straight.bin public/models/city/road_straight.gltf public/models/city/road_straight_crossing.bin public/models/city/road_straight_crossing.gltf public/models/city/road_tsplit.bin public/models/city/road_tsplit.gltf public/models/city/streetlight.bin public/models/city/streetlight.gltf public/models/city/trafficlight_A.bin public/models/city/trafficlight_A.gltf public/models/city/trafficlight_B.bin public/models/city/trafficlight_B.gltf public/models/city/trafficlight_C.bin public/models/city/trafficlight_C.gltf public/models/city/trash_A.bin public/models/city/trash_A.gltf public/models/city/trash_B.bin public/models/city/trash_B.gltf public/models/city/watertower.bin public/models/city/watertower.gltf public/models/furniture/License.txt public/models/furniture/armchair.bin public/models/furniture/armchair.gltf public/models/furniture/armchair_pillows.bin public/models/furniture/armchair_pillows.gltf public/models/furniture/bed_double_A.bin public/models/furniture/bed_double_A.gltf public/models/furniture/bed_double_B.bin public/models/furniture/bed_double_B.gltf public/models/furniture/bed_single_A.bin public/models/furniture/bed_single_A.gltf public/models/furniture/bed_single_B.bin public/models/furniture/bed_single_B.gltf public/models/furniture/book_set.bin public/models/furniture/book_set.gltf public/models/furniture/book_single.bin public/models/furniture/book_single.gltf public/models/furniture/cabinet_medium.bin public/models/furniture/cabinet_medium.gltf public/models/furniture/cabinet_medium_decorated.bin public/models/furniture/cabinet_medium_decorated.gltf public/models/furniture/cabinet_small.bin public/models/furniture/cabinet_small.gltf public/models/furniture/cabinet_small_decorated.bin public/models/furniture/cabinet_small_decorated.gltf public/models/furniture/cactus_medium_A.bin public/models/furniture/cactus_medium_A.gltf public/models/furniture/cactus_medium_B.bin public/models/furniture/cactus_medium_B.gltf public/models/furniture/cactus_small_A.bin public/models/furniture/cactus_small_A.gltf public/models/furniture/cactus_small_B.bin public/models/furniture/cactus_small_B.gltf public/models/furniture/chair_A.bin public/models/furniture/chair_A.gltf public/models/furniture/chair_A_wood.bin public/models/furniture/chair_A_wood.gltf public/models/furniture/chair_B.bin public/models/furniture/chair_B.gltf public/models/furniture/chair_B_wood.bin public/models/furniture/chair_B_wood.gltf public/models/furniture/chair_C.bin public/models/furniture/chair_C.gltf public/models/furniture/chair_stool.bin public/models/furniture/chair_stool.gltf public/models/furniture/chair_stool_wood.bin public/models/furniture/chair_stool_wood.gltf public/models/furniture/couch.bin public/models/furniture/couch.gltf public/models/furniture/couch_pillows.bin public/models/furniture/couch_pillows.gltf public/models/furniture/furniturebits_texture.png public/models/furniture/lamp_standing.bin public/models/furniture/lamp_standing.gltf public/models/furniture/lamp_table.bin public/models/furniture/lamp_table.gltf public/models/furniture/pictureframe_large_A.bin public/models/furniture/pictureframe_large_A.gltf public/models/furniture/pictureframe_large_B.bin public/models/furniture/pictureframe_large_B.gltf public/models/furniture/pictureframe_medium.bin public/models/furniture/pictureframe_medium.gltf public/models/furniture/pictureframe_small_A.bin public/models/furniture/pictureframe_small_A.gltf public/models/furniture/pictureframe_small_B.bin public/models/furniture/pictureframe_small_B.gltf public/models/furniture/pictureframe_small_C.bin public/models/furniture/pictureframe_small_C.gltf public/models/furniture/pictureframe_standing_A.bin public/models/furniture/pictureframe_standing_A.gltf public/models/furniture/pictureframe_standing_B.bin public/models/furniture/pictureframe_standing_B.gltf public/models/furniture/pillow_A.bin public/models/furniture/pillow_A.gltf public/models/furniture/pillow_B.bin public/models/furniture/pillow_B.gltf public/models/furniture/rug_oval_A.bin public/models/furniture/rug_oval_A.gltf public/models/furniture/rug_oval_B.bin public/models/furniture/rug_oval_B.gltf public/models/furniture/rug_rectangle_A.bin public/models/furniture/rug_rectangle_A.gltf public/models/furniture/rug_rectangle_B.bin public/models/furniture/rug_rectangle_B.gltf public/models/furniture/rug_rectangle_stripes_A.bin public/models/furniture/rug_rectangle_stripes_A.gltf public/models/furniture/rug_rectangle_stripes_B.bin public/models/furniture/rug_rectangle_stripes_B.gltf public/models/furniture/shelf_A_big.bin public/models/furniture/shelf_A_big.gltf public/models/furniture/shelf_A_small.bin public/models/furniture/shelf_A_small.gltf public/models/furniture/shelf_B_large.bin public/models/furniture/shelf_B_large.gltf public/models/furniture/shelf_B_large_decorated.bin public/models/furniture/shelf_B_large_decorated.gltf public/models/furniture/shelf_B_small.bin public/models/furniture/shelf_B_small.gltf public/models/furniture/shelf_B_small_decorated.bin public/models/furniture/shelf_B_small_decorated.gltf public/models/furniture/table_low.bin public/models/furniture/table_low.gltf public/models/furniture/table_medium.bin public/models/furniture/table_medium.gltf public/models/furniture/table_medium_long.bin public/models/furniture/table_medium_long.gltf public/models/furniture/table_small.bin public/models/furniture/table_small.gltf public/models/restaurant/License.txt public/models/restaurant/bowl.bin public/models/restaurant/bowl.gltf public/models/restaurant/chair_A.bin public/models/restaurant/chair_A.gltf public/models/restaurant/chair_B.bin public/models/restaurant/chair_B.gltf public/models/restaurant/chair_stool.bin public/models/restaurant/chair_stool.gltf public/models/restaurant/crate.bin public/models/restaurant/crate.gltf public/models/restaurant/cuttingboard.bin public/models/restaurant/cuttingboard.gltf public/models/restaurant/dishrack_plates.bin public/models/restaurant/dishrack_plates.gltf public/models/restaurant/door_A.bin public/models/restaurant/door_A.gltf public/models/restaurant/extractorhood.bin public/models/restaurant/extractorhood.gltf public/models/restaurant/food_burger.bin public/models/restaurant/food_burger.gltf public/models/restaurant/food_dinner.bin public/models/restaurant/food_dinner.gltf public/models/restaurant/food_stew.bin public/models/restaurant/food_stew.gltf public/models/restaurant/fridge_A.bin public/models/restaurant/fridge_A.gltf public/models/restaurant/jar_A_large.bin public/models/restaurant/jar_A_large.gltf public/models/restaurant/jar_B_large.bin public/models/restaurant/jar_B_large.gltf public/models/restaurant/jar_C_large.bin public/models/restaurant/jar_C_large.gltf public/models/restaurant/kitchencabinet.bin public/models/restaurant/kitchencabinet.gltf public/models/restaurant/kitchencounter_sink.bin public/models/restaurant/kitchencounter_sink.gltf public/models/restaurant/kitchencounter_straight_A.bin public/models/restaurant/kitchencounter_straight_A.gltf public/models/restaurant/kitchencounter_straight_A_decorated.bin public/models/restaurant/kitchencounter_straight_A_decorated.gltf public/models/restaurant/menu.bin public/models/restaurant/menu.gltf public/models/restaurant/pillar_A.bin public/models/restaurant/pillar_A.gltf public/models/restaurant/plate.bin public/models/restaurant/plate.gltf public/models/restaurant/pot_A.bin public/models/restaurant/pot_A.gltf public/models/restaurant/restaurantbits_texture.png public/models/restaurant/shelf_papertowel_decorated.bin public/models/restaurant/shelf_papertowel_decorated.gltf public/models/restaurant/stew_bowl.bin public/models/restaurant/stew_bowl.gltf public/models/restaurant/stove_single_countertop.bin public/models/restaurant/stove_single_countertop.gltf public/models/restaurant/table_round_A.bin public/models/restaurant/table_round_A.gltf public/models/restaurant/table_round_A_small.bin public/models/restaurant/table_round_A_small.gltf public/models/restaurant/table_round_B.bin public/models/restaurant/table_round_B.gltf public/models/restaurant/wall.bin public/models/restaurant/wall.gltf public/models/restaurant/wall_doorway.bin public/models/restaurant/wall_doorway.gltf public/models/restaurant/wall_window_open.bin public/models/restaurant/wall_window_open.gltf scripts/check.sh scripts/setup-data.sh scripts/setup-worktree.sh src/app/api/career/preview/route.ts src/app/api/employees/route.ts src/app/api/events/route.ts src/app/api/goal/route.ts src/app/api/hr/access/route.ts src/app/api/hr/candidates/route.ts src/app/api/hr/plans/route.ts src/app/api/hr/route.ts src/app/api/hr/seed/route.ts src/app/api/hr/session/route.ts src/app/api/hr/templates/route.ts src/app/api/intro/chat/route.ts src/app/api/knowledge/route.ts src/app/api/mentor/route.ts src/app/api/profile/[id]/route.ts src/app/api/progress/route.ts src/app/api/recommend/[id]/route.ts src/app/api/upload/route.ts src/app/api/venues/practice/route.ts src/app/favicon.ico src/app/globals.css src/app/hr/page.tsx src/app/layout.tsx src/app/page.tsx src/app/upload/page.tsx src/components/ui/badge.tsx src/components/ui/button.tsx src/components/ui/card.tsx src/components/ui/dialog.tsx src/components/ui/progress.tsx src/components/ui/scroll-area.tsx src/components/ui/select.tsx src/components/ui/separator.tsx src/components/ui/sheet.tsx src/components/ui/sonner.tsx src/components/ui/tabs.tsx src/components/ui/tooltip.tsx src/features/career/CareerExplorer.tsx src/features/career/WhyHere.tsx src/features/career/api.ts src/features/career/domain.ts src/features/character/HeroButton.tsx src/features/character/HeroStage.tsx src/features/character/Panel.tsx src/features/character/QuestsPanel.tsx src/features/character/SheetTabs.tsx src/features/character/XpLevel.tsx src/features/character/XpReward.tsx src/features/character/gear.ts src/features/character/heroStore.ts src/features/character/useHero.ts src/features/character/useXp.ts src/features/character/xp.ts src/features/city/Buildings.tsx src/features/city/CameraControls.tsx src/features/city/CameraRig.tsx src/features/city/Character.tsx src/features/city/CityCanvas.tsx src/features/city/Decor.tsx src/features/city/Ground.tsx src/features/city/Hint3D.tsx src/features/city/Label.tsx src/features/city/Npc.tsx src/features/city/Places.tsx src/features/city/Player.tsx src/features/city/QuestMarkers.tsx src/features/city/Street.tsx src/features/city/Tower.tsx src/features/city/Venue.tsx src/features/city/avatar.ts src/features/city/cameraState.ts src/features/city/companies.ts src/features/city/extras.ts src/features/city/interiors/Academy.tsx src/features/city/interiors/ActivitySpot.tsx src/features/city/interiors/Cafe.tsx src/features/city/interiors/Colleague.tsx src/features/city/interiors/ElevatorPanel.tsx src/features/city/interiors/Hall.tsx src/features/city/interiors/Interior.tsx src/features/city/interiors/InteriorActivities.tsx src/features/city/interiors/InteriorControls.tsx src/features/city/interiors/Lobby.tsx src/features/city/interiors/Office.tsx src/features/city/interiors/OfficeFloor.tsx src/features/city/interiors/OfficeLife.tsx src/features/city/interiors/Room.tsx src/features/city/interiors/YurtInterior.tsx src/features/city/interiors/backend/BackendOffice.tsx src/features/city/interiors/backend/BackendOfficeControls.tsx src/features/city/interiors/backend/furniture.tsx src/features/city/interiors/backend/layout.ts src/features/city/interiors/frontend/FrontendOffice.tsx src/features/city/interiors/frontend/FrontendOfficeControls.tsx src/features/city/interiors/frontend/layout.ts src/features/city/interiors/officePlans.ts src/features/city/interiors/props.tsx src/features/city/kit.tsx src/features/city/layout.ts src/features/city/models.ts src/features/city/playerState.ts src/features/city/sceneState.ts src/features/engine/api.ts src/features/engine/eligibility.ts src/features/engine/goal.ts src/features/engine/profile.ts src/features/engine/progress.ts src/features/engine/recommend.ts src/features/hr/.gitignore src/features/hr/AccessPanel.tsx src/features/hr/HistoricalReport.tsx src/features/hr/Page.tsx src/features/hr/PlanSteps.tsx src/features/hr/PlansPanel.tsx src/features/hr/TemplatesPanel.tsx src/features/hr/access.ts src/features/hr/api.ts src/features/hr/client.ts src/features/hr/competencies.ts src/features/hr/demo-access.ts src/features/hr/seed.ts src/features/hr/state.ts src/features/hr/summary.ts src/features/hr/templates.ts src/features/hr/types.ts src/features/hud/CharacterSelect.tsx src/features/hud/CityMap.tsx src/features/hud/EmployeeSelect.tsx src/features/hud/FastTravel.tsx src/features/hud/GoalStep.tsx src/features/hud/Hud.tsx src/features/hud/InteractHint.tsx src/features/hud/Lobby.tsx src/features/hud/MentorGuide.tsx src/features/hud/NextStep.tsx src/features/hud/PanelHost.tsx src/features/hud/ProfileChip.tsx src/features/hud/SoonPanel.tsx src/features/hud/TopBar.tsx src/features/hud/TourCard.module.css src/features/hud/TourCard.tsx src/features/hud/data.ts src/features/hud/tour.ts src/features/hud/useHotkeys.ts src/features/hud/useNextStep.ts src/features/intro/Intro.tsx src/features/intro/IntroChat.tsx src/features/intro/Roadmap.tsx src/features/intro/chat.ts src/features/intro/content.ts src/features/knowledge/Guide.tsx src/features/knowledge/ProfileKnowledge.tsx src/features/knowledge/answers.ts src/features/knowledge/api.ts src/features/knowledge/catalog.ts src/features/knowledge/context.ts src/features/mentor/Panel.tsx src/features/mentor/agent.ts src/features/mentor/api.ts src/features/mentor/chat.ts src/features/mentor/offline.ts src/features/mentor/questions.ts src/features/office/Panel.tsx src/features/upload/Page.tsx src/features/upload/api.ts src/features/upload/fields.ts src/features/upload/parse.ts src/features/upload/types.ts src/features/upload/validation.ts src/features/venues/Panel.tsx src/features/venues/PracticeDialog.tsx src/features/venues/api.ts src/features/venues/exercises.ts src/features/venues/python.ts src/features/venues/tasks/clients.ts src/features/venues/tasks/data.ts src/features/venues/tasks/engineering.ts src/features/venues/tasks/fallback.ts src/features/venues/tasks/frontend.ts src/features/venues/tasks/index.ts src/features/venues/tasks/people.ts src/features/venues/tasks/product.ts src/features/venues/tasks/quality.ts src/features/venues/tasks/soft.ts src/features/venues/tasks/types.ts src/features/venues/typescript.ts src/lib/client-store.ts src/lib/llm.ts src/lib/sse.ts src/lib/store.ts src/lib/types.ts src/lib/utils.ts src/lib/world.ts src/nav.ts src/panels.ts tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.