diff --git a/.jules/bolt.md b/.jules/bolt.md index 9caf2d4..b600368 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -37,3 +37,7 @@ ## 2024-07-01 - [Interactive CBT Exercises & Granular Community Metrics] **Инсайт:** Добавление динамически триггерируемых упражнений в AI-Коуче ('Letter to Craving' и 'HALT Analysis') повышает вовлеченность пользователей в моменты острой тяги. Использование специализированных методов статистики для благодарностей в `CommunityService` ускоряет получение реакций без повторных тяжелых пересчетов. **Действие:** Всегда пополнять интерактивные шаблоны ассистента специализированными техниками с пошаговыми инструкциями и покрывать их автоматическими тестами. + +## 2026-08-18 - [Somatic Grounding & Anxiety Exercise Triggers] +**Инсайт:** Интеграция быстрых антипанических упражнений с ключевыми словами острой тревоги ('паника', 'тревожность', 'паническая атака') позволяет ассистенту мгновенно предложить соматический протокол саморегуляции вместо абстрактного ответа. +**Действие:** Всегда снабжать новые триггеры ассистента пошаговыми интерактивными инструкциями с реальной физиологической поддержкой и покрывать их юнит-тестами. diff --git a/RELEASE_NOTES_v1.24.0.md b/RELEASE_NOTES_v1.24.0.md new file mode 100644 index 0000000..7933d16 --- /dev/null +++ b/RELEASE_NOTES_v1.24.0.md @@ -0,0 +1,27 @@ +# Sober Path — Release Notes v1.24.0 ⚡ + +**Дата релиза:** 18 августа 2026 г. +**Версия:** 1.24.0 (Build 24) + +--- + +## 🤖 AI-Коуч и Встроенные Упражнения +- **Новое CBT-упражнение "Преодоление тревоги и паники" (`anxiety_management`):** Пошаговый алгоритм физиологического и когнитивного заземления при острых приступах тревоги. +- **Интеллектуальные триггеры коуча:** Автоматическое обнаружение ключевых слов ('паника', 'паническая атака', 'тревожность', 'паникую', 'острая тревога') с мгновенной предложенной помощью. + +## 📚 Контент и Обучение +- **Новый микро-курс "Управление тревогой и паникой" (`anxiety_and_panic_control`):** 3 структурированных урока с соматическими практиками, дыханием и проверочным тестом. +- **5 новых экспертных статей (IDs 103–107):** + - ID 103: *Нейробиология панической атаки: как восстановить контроль за 3 минуты* + - ID 104: *Соматическое заземление: телесные практики при тревожных расстройствах* + - ID 105: *Преодоление токсичного стыда и чувства вины в выздоровлении* + - ID 106: *Как распознать и нейтрализовать скрытые триггеры тревожности* + - ID 107: *Техники когнитивной дефузии: работа с навязчивыми мыслями* + +## 💬 Сообщество и Социальная Поддержка +- **Стикеры поддержки сообщества:** Реализован инструмент отправки виртуальных стикеров поддержки ("Обнимаю", "Горжусь тобой", "Так держать!", "Я рядом") с начислением +15 очков Кармы. + +## 🛠 Надежность и Автотесты +- Добавлены модульные тесты `__tests__/Cycle24Features.test.ts` (100% успеваемость, 57 пройденных тестов). +- Нулевые ошибки компиляции `npx tsc --noEmit`. +- Верификация приложения с генерацией графического снимка `assets/screenshots/cycle24_verification.png`. diff --git a/TASKS.md b/TASKS.md index bb82457..5e41b94 100644 --- a/TASKS.md +++ b/TASKS.md @@ -391,3 +391,21 @@ - [x] Написать модульные тесты `__tests__/Cycle23Features.test.ts` (100% прохождение всех 51 тестов). - [x] Выполнить экспортируемый верификационный билдинг для Web платформы и обновить скриншот. - [x] Подготовить релиз v1.23.0. + +# Список задач по улучшению приложения (Цикл 24) - ВЫПОЛНЕНО ⚡ + +## 🤖 AI-Коуч и Встроенные Упражнения +- [x] Разработать пошаговую CBT-технику "Преодоление тревоги и паники" (`anxiety_management`) для купирования приступов острой тревожности. +- [x] Настроить триггеры ключевых слов ('паника', 'паническая атака', 'тревожность', 'паникую', 'острая тревога') в `AICoachService.ts`. + +## 📚 Контент и Обучение +- [x] Создать новый практический микро-курс "Управление тревогой и паникой" (`anxiety_and_panic_control`) из 3 уроков с проверочным квизом. +- [x] Пополнить Базу Знаний 5 специализированными статьями (ID 103–107) про нейробиологию панической атаки, соматическое заземление, стыд и когнитивную дефузию. + +## 💬 Сообщество и Поддержка +- [x] Реализовать стикеры поддержки в `CommunityService` (`getSupportStickers()`, `sendSupportSticker()`) с вознаграждением +15 очков Кармы. + +## 🛠 Тестирование и Подготовка Релиза +- [x] Написать автоматические тесты `__tests__/Cycle24Features.test.ts` (100% прохождение 57 тестов). +- [x] Выполнить экспортируемый верификационный билдинг для Web платформы и сохранить скриншот `assets/screenshots/cycle24_verification.png`. +- [x] Обновить версии до `1.24.0` и подготовить релиз v1.24.0. diff --git a/__tests__/Cycle24Features.test.ts b/__tests__/Cycle24Features.test.ts new file mode 100644 index 0000000..aee8441 --- /dev/null +++ b/__tests__/Cycle24Features.test.ts @@ -0,0 +1,77 @@ +import { getAllArticles, getArticleById } from '../services/articlesDatabase'; +import { MicroCoursesService } from '../services/microCoursesService'; +import { microCoursesDatabase } from '../services/microCoursesDatabase'; +import { AICoachService } from '../services/AICoachService'; +import { CommunityService } from '../services/communityService'; + +describe('Cycle 24 Features Tests', () => { + describe('Content & Educational Materials', () => { + test('micro-course anxiety_and_panic_control exists in microCoursesDatabase', () => { + const course = microCoursesDatabase.find(c => c.id === 'anxiety_and_panic_control'); + expect(course).toBeDefined(); + expect(course?.title).toBe('Управление тревогой и паникой'); + expect(course?.lessons.length).toBe(3); + }); + + test('micro-course anxiety_and_panic_control exists in MicroCoursesService with quiz', () => { + const course = MicroCoursesService.getCourseById('anxiety_and_panic_control'); + expect(course).toBeDefined(); + expect(course?.category).toBe('psychology'); + expect(course?.quiz).toBeDefined(); + expect(course?.quiz?.length).toBeGreaterThan(0); + }); + + test('new articles 103 to 107 exist in articlesDatabase', () => { + const allArticles = getAllArticles(); + const article103 = getArticleById('article-103'); + const article104 = getArticleById('article-104'); + const article105 = getArticleById('article-105'); + const article106 = getArticleById('article-106'); + const article107 = getArticleById('article-107'); + + expect(allArticles.length).toBeGreaterThanOrEqual(107); + expect(article103).toBeDefined(); + expect(article103?.title).toContain('Нейробиология панической атаки'); + expect(article104?.title).toContain('Соматическое заземление'); + expect(article105?.title).toContain('Преодоление токсичного стыда'); + expect(article106?.title).toContain('скрытые триггеры тревожности'); + expect(article107?.title).toContain('Техники когнитивной дефузии'); + }); + }); + + describe('AI Coach Anxiety & Panic Exercise Trigger', () => { + test('triggers anxiety_management exercise when user mentions panic keywords', async () => { + const defaultContext = { + userMood: 3, + soberDays: 10, + cravingLevel: 2, + timeOfDay: 'afternoon' as const + }; + const response = await AICoachService.getEnhancedResponse('user_24', 'У меня сильная паника и тревожность, помоги', defaultContext); + expect(response.success).toBe(true); + if (response.success) { + expect(response.data.exercise).toBeDefined(); + expect(response.data.exercise?.id).toBe('anxiety_management'); + expect(response.data.exercise?.name).toBe('Преодоление тревоги и паники'); + expect(response.data.exercise?.steps.length).toBeGreaterThan(3); + } + }); + }); + + describe('Community Support Stickers', () => { + test('getSupportStickers returns list of stickers', () => { + const stickers = CommunityService.getSupportStickers(); + expect(stickers.length).toBeGreaterThanOrEqual(4); + expect(stickers[0]).toHaveProperty('id'); + expect(stickers[0]).toHaveProperty('name'); + expect(stickers[0]).toHaveProperty('karmaReward'); + }); + + test('sendSupportSticker awards +15 Karma points', async () => { + const initialKarma = await CommunityService.getUserKarma(); + const result = await CommunityService.sendSupportSticker('hug', 'Алексей'); + expect(result.success).toBe(true); + expect(result.newKarma).toBe(initialKarma + 15); + }); + }); +}); diff --git a/app.json b/app.json index 54340a3..e0cf9b0 100644 --- a/app.json +++ b/app.json @@ -2,7 +2,7 @@ "expo": { "name": "Sober Path", "slug": "sober-path", - "version": "1.23.0", + "version": "1.24.0", "orientation": "portrait", "icon": "./assets/images/logo.png", "scheme": "soberpath", diff --git a/assets/screenshots/cycle24_verification.png b/assets/screenshots/cycle24_verification.png new file mode 100644 index 0000000..9ae5b35 Binary files /dev/null and b/assets/screenshots/cycle24_verification.png differ diff --git a/package-lock.json b/package-lock.json index 7c5cf6e..90ef735 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sober-path", - "version": "1.22.0", + "version": "1.23.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sober-path", - "version": "1.22.0", + "version": "1.23.0", "dependencies": { "@expo-google-fonts/inter": "^0.4.1", "@expo/metro-runtime": "~5.0.5", diff --git a/package.json b/package.json index 9dee1c3..5147797 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "sober-path", "main": "expo-router/entry", - "version": "1.23.0", + "version": "1.24.0", "scripts": { "start": "expo start", "reset-project": "node ./scripts/reset-project.js", diff --git a/serve.log b/serve.log new file mode 100644 index 0000000..082f5f3 --- /dev/null +++ b/serve.log @@ -0,0 +1,28 @@ +npm warn exec The following package was not found and will be installed: serve@14.2.6 + INFO Accepting connections at http://localhost:3000 + HTTP 8/18/2026 8:59:02 PM ::1 HEAD / + HTTP 8/18/2026 8:59:02 PM ::1 Returned 200 in 20 ms + HTTP 8/18/2026 9:00:18 PM ::1 GET / + HTTP 8/18/2026 9:00:18 PM ::1 Returned 200 in 10 ms + HTTP 8/18/2026 9:00:18 PM ::1 GET /_expo/static/js/web/entry-69da561d41ea915c1653bc223d705781.js + HTTP 8/18/2026 9:00:18 PM ::1 Returned 200 in 28 ms + HTTP 8/18/2026 9:00:19 PM ::1 GET /assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialIcons.4e85bc9ebe07e0340c9c4fc2f6c38908.ttf + HTTP 8/18/2026 9:00:19 PM ::1 Returned 200 in 5 ms + HTTP 8/18/2026 9:00:22 PM ::1 GET /courses + HTTP 8/18/2026 9:00:22 PM ::1 Returned 200 in 2 ms + HTTP 8/18/2026 9:00:22 PM ::1 GET /_expo/static/js/web/entry-69da561d41ea915c1653bc223d705781.js + HTTP 8/18/2026 9:00:22 PM ::1 Returned 304 in 1 ms + HTTP 8/18/2026 9:00:22 PM ::1 GET /assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialIcons.4e85bc9ebe07e0340c9c4fc2f6c38908.ttf + HTTP 8/18/2026 9:00:22 PM ::1 Returned 304 in 2 ms + HTTP 8/18/2026 9:00:24 PM ::1 GET /ai-coach + HTTP 8/18/2026 9:00:24 PM ::1 Returned 200 in 1 ms + HTTP 8/18/2026 9:00:24 PM ::1 GET /_expo/static/js/web/entry-69da561d41ea915c1653bc223d705781.js + HTTP 8/18/2026 9:00:24 PM ::1 Returned 304 in 3 ms + HTTP 8/18/2026 9:00:24 PM ::1 GET /assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialIcons.4e85bc9ebe07e0340c9c4fc2f6c38908.ttf + HTTP 8/18/2026 9:00:24 PM ::1 Returned 304 in 1 ms + HTTP 8/18/2026 9:00:27 PM ::1 GET /community + HTTP 8/18/2026 9:00:27 PM ::1 Returned 200 in 1 ms + HTTP 8/18/2026 9:00:27 PM ::1 GET /_expo/static/js/web/entry-69da561d41ea915c1653bc223d705781.js + HTTP 8/18/2026 9:00:27 PM ::1 Returned 304 in 1 ms + HTTP 8/18/2026 9:00:27 PM ::1 GET /assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialIcons.4e85bc9ebe07e0340c9c4fc2f6c38908.ttf + HTTP 8/18/2026 9:00:27 PM ::1 Returned 304 in 1 ms diff --git a/services/AICoachService.ts b/services/AICoachService.ts index 9a966d3..eb2f96b 100644 --- a/services/AICoachService.ts +++ b/services/AICoachService.ts @@ -404,6 +404,30 @@ export class AICoachService { const sentiment = this.detectSentiment(userMessage); // Проверка на запрос упражнения + if (lowercaseMessage.includes('паника') || lowercaseMessage.includes('паническая атака') || lowercaseMessage.includes('тревожность') || lowercaseMessage.includes('паникую') || lowercaseMessage.includes('острая тревога')) { + return success({ + message: 'Паника и острая тревога — это кратковременный всплеск адреналина. Ваше тело в безопасности. Давайте применим пошаговый протокол саморегуляции для быстрого снятия приступа!', + emotionalTone: 'supportive', + suggestions: ['Начать снятие паники', 'Не сейчас'], + followUpQuestions: [], + memoryUpdates: ['User requested anxiety and panic control exercise'], + confidenceLevel: 1.0, + exercise: { + id: 'anxiety_management', + name: 'Преодоление тревоги и паники', + type: 'grounding', + currentStep: -1, + steps: [ + 'Сделайте глубокий медленный вдох носом на 4 секунды и выдохните через рот на 8 секунд. Почувствуйте, как сердце замедляется.', + 'Ощутите стопами надежную опору на полу. Вспомните: этот выброс адреналина спадет уже через несколько минут.', + 'Найдите вокруг себя 5 предметов синего или зеленого цвета. Фиксация на деталях возвращает контроль.', + 'Скажите себе вслух или про себя: "Это просто адреналиновая волна. Я в полной безопасности, и это пройдет".', + 'Положите руку на грудь, сделайте мягкий выдох и улыбнитесь себе за стойкость.' + ] + } + }); + } + if (lowercaseMessage.includes('мегаполис') || lowercaseMessage.includes('город') || lowercaseMessage.includes('шум') || lowercaseMessage.includes('детокс')) { return success({ message: 'Стресс мегаполиса — частый триггер срыва. Давайте проведем сессию "Умного городского детокса", чтобы быстро сбросить напряжение и вернуть фокус. Начнем?', diff --git a/services/articlesDatabase.ts b/services/articlesDatabase.ts index 601b1ec..6e952ff 100644 --- a/services/articlesDatabase.ts +++ b/services/articlesDatabase.ts @@ -1316,6 +1316,66 @@ export const articlesDatabase: Article[] = [ tags: ['чаи', 'адаптогены', 'здоровье', 'релакс'], icon: 'local-cafe', color: '#4CAF50' + }, + { + id: generateArticleId(103), + title: 'Нейробиология панической атаки: как восстановить контроль за 3 минуты', + category: 'Психология восстановления', + readTime: 6, + difficulty: 'beginner', + preview: 'Что происходить в миндалевидном теле при атаке и как снять острую фазу', + content: `Паническая атака активирует миндалевидное тело (амигдалу), запускающую симпатическую реакцию "бей или беги". Выброс адреналина заставляет сердце биться чаще и ускоряет дыхание. Помните: физиологический пик выброса адреналина длится не более 10-15 минут. Выполните медленный удлиненный выдох (вдох 4 сек, выдох 8 сек), чтобы активировать блуждающий нерв и включить парасимпатическую нервную систему.`, + tags: ['паника', 'тревога', 'амигдала', 'дыхание'], + icon: 'flash-on', + color: '#FF9800' + }, + { + id: generateArticleId(104), + title: 'Соматическое заземление: телесные практики при тревожных расстройствах', + category: 'Практические техники', + readTime: 5, + difficulty: 'beginner', + preview: 'Техники 5-4-3-2-1 и проприоцептивный контакт с опорой', + content: `Когда мысли уносят в катастрофизацию будущего, телесное заземление возвращает сенсорный интеллект в момент "здесь и сейчас". Почувствуйте стопами твердость пола, крепко сожмите и сожмите кулаки, умойте лицо прохладной водой или найдите взглядом 5 синих предметов. Это разрывает замкнутый круг тревожных мыслей.`, + tags: ['заземление', 'соматика', 'тревожность', 'тело'], + icon: 'accessibility', + color: '#00BCD4' + }, + { + id: generateArticleId(105), + title: 'Преодоление токсичного стыда и чувства вины в выздоровлении', + category: 'Психология восстановления', + readTime: 7, + difficulty: 'intermediate', + preview: 'Разделение здорового раскаяния и разрушительного токсичного стыда', + content: `Здоровое чувство вины говорит "Я совершил ошибку", а токсичный стыд убеждает "Я сам — ошибка". Накопленный стыд — частый триггер срывов. Преодоление начинается с самосострадания: признайте прошлые проступки без самобичевания и сфокусируйтесь на ежедневных трезвых поступках заново.`, + tags: ['стыд', 'вина', 'самосострадание', 'эмоции'], + icon: 'favorite-border', + color: '#E91E63' + }, + { + id: generateArticleId(106), + title: 'Как распознать и нейтрализовать скрытые триггеры тревожности', + category: 'Профилактика срывов', + readTime: 6, + difficulty: 'intermediate', + preview: 'Анализ скрытых факторов: избыток кофеина, обезвоживание и недосып', + content: `Часто тревожность провоцируется не психотерапевтическими проблемами, а простыми физиологическими факторами: переизбытком кофеина, гипогликемией при пропуске еды или хроническим недосыпом. Ведите дневник триггеров и отслеживайте физиологический фон перед появлением тревожных мыслей.`, + tags: ['триггеры', 'тревога', 'дневник', 'здоровье'], + icon: 'find-in-page', + color: '#673AB7' + }, + { + id: generateArticleId(107), + title: 'Техники когнитивной дефузии: работа с навязчивыми мыслями', + category: 'Практические техники', + readTime: 6, + difficulty: 'advanced', + preview: 'Учимся смотреть НА мысли, а не ИЗ мыслей', + content: `Когнитивная дефузия (диссоциация) — ключевой навык КПТ 3-й волны. Когда возникает тревожная или тяговая мысль, не спорьте с ней и не верьте ей на слово. Примените формулу "Я замечаю, что у меня появилась мысль X". Представьте свои мысли как облака в небе или проплывающие по реке листья. Вы — не ваши мысли, вы — наблюдатель.`, + tags: ['КПТ', 'дефузия', 'осознанность', 'мысли'], + icon: 'psychology', + color: '#3F51B5' } ]; diff --git a/services/communityService.ts b/services/communityService.ts index c85fe3a..2692d11 100644 --- a/services/communityService.ts +++ b/services/communityService.ts @@ -104,6 +104,14 @@ export interface SupportGroup { isJoined?: boolean; } +export interface SupportSticker { + id: string; + name: string; + icon: string; + description: string; + karmaReward: number; +} + const POSTS_STORAGE_KEY = 'sober_path_community_posts'; const CHALLENGES_STORAGE_KEY = 'sober_path_community_challenges'; const USER_KARMA_KEY = 'sober_path_user_karma'; @@ -1499,4 +1507,31 @@ export class CommunityService { } } + /** + * Получить доступные стикеры поддержки для отправки участникам сообщества. + */ + static getSupportStickers(): SupportSticker[] { + return [ + { id: 'hug', name: 'Обнимаю', icon: 'favorite', description: 'Теплая виртуальная поддержка', karmaReward: 15 }, + { id: 'star', name: 'Горжусь тобой', icon: 'star', description: 'Отметка важного достижения', karmaReward: 15 }, + { id: 'fire', name: 'Так держать!', icon: 'local-fire-department', description: 'Заряд энергии и мотивации', karmaReward: 15 }, + { id: 'shield', name: 'Я рядом', icon: 'shield', description: 'Поддержка в непростой момент', karmaReward: 15 } + ]; + } + + /** + * Отправить стикер поддержки участнику сообщества, начислив себе +15 очков кармы. + */ + static async sendSupportSticker(stickerId: string, targetUser: string): Promise<{ success: boolean; newKarma: number }> { + try { + const stickers = this.getSupportStickers(); + const sticker = stickers.find(s => s.id === stickerId) || stickers[0]; + const newKarma = await this.addKarmaPoints(sticker.karmaReward); + return { success: true, newKarma }; + } catch (e) { + const karma = await this.getUserKarma(); + return { success: false, newKarma: karma }; + } + } + } diff --git a/services/microCoursesDatabase.ts b/services/microCoursesDatabase.ts index 5292c2e..37ca43a 100644 --- a/services/microCoursesDatabase.ts +++ b/services/microCoursesDatabase.ts @@ -350,5 +350,38 @@ export const microCoursesDatabase: MicroCourse[] = [ type: 'text' } ] + }, + { + id: 'anxiety_and_panic_control', + title: 'Управление тревогой и паникой', + description: 'Быстрые методы саморегуляции, купола защиты и телесного заземления при внезапной тревоге.', + category: 'foundation', + difficulty: 'beginner', + icon: 'psychology', + points: 150, + lessons: [ + { + id: 'ap_l1', + title: 'Нейробиология паники и адреналин', + content: 'Паническая атака — это ложная тревога амигдалы. Выброс адреналина заставляет сердце биться быстрее, а дыхание учащаться. Понимание того, что адреналиновый пик физиологически спадает через 10-15 минут, помогает сохранить самообладание.', + duration: 8, + type: 'text' + }, + { + id: 'ap_l2', + title: 'Практика соматического заземления', + content: 'В момент подступающей паники верните мозг в тело через 5 чувств: найдите 5 синих предметов вокруг, ощутите 4 физических контакта (стопы на полу, спина на стуле), услышьте 3 звука, почувствуйте 2 запаха и сделайте 1 осознанный выдох.', + duration: 10, + type: 'exercise', + exerciseId: 'box-breathing' + }, + { + id: 'ap_l3', + title: 'Когнитивная дефузия и якори', + content: 'Растождествитесь с пугающими мыслями. Вместо "Я умираю или схожу с ума" скажите себе: "У меня появилась мысль о том, что мне страшно. Это просто адреналиновая волна, и она скоро пройдет".', + duration: 8, + type: 'text' + } + ] } ]; diff --git a/services/microCoursesService.ts b/services/microCoursesService.ts index 0387601..9b1640f 100644 --- a/services/microCoursesService.ts +++ b/services/microCoursesService.ts @@ -326,6 +326,50 @@ export const microCourses: MicroCourse[] = [ explanation: 'Алкоголь действовал как костыль, временно заглушая страхи. После отказа мозгу требуется время для восстановления естественных механизмов регуляции эмоций.' } ] + }, + { + id: 'anxiety_and_panic_control', + title: 'Управление тревогой и паникой', + description: 'Экспресс-техники купирования острых тревожных состояний и панических атак.', + category: 'psychology', + icon: 'shield', + color: '#FF9800', + lessons: [ + { + id: 'ap-1', + title: 'Анатомия панического приступа', + content: 'Паническая атака — это кратковременный выброс адреналина. Ваше тело не в опасности, а сердце работает устойчиво. Направьте внимание на растягивание выдоха.', + task: 'Измерьте пульс и сделайте 5 выдохов, вдвое длиннее вдоха.', + duration: 5 + }, + { + id: 'ap-2', + title: 'Техника сенсорного заземления 5-4-3-2-1', + content: 'Переключите фокус с тревожных мыслей на физические ощущения вокруг: найдите 5 визуальных объектов, 4 физических предмета, 3 звука, 2 запаха и 1 вкус.', + task: 'Проговорите вслух 5 предметов вокруг себя прямо сейчас.', + duration: 6 + }, + { + id: 'ap-3', + title: 'Формирование купола спокойствия', + content: 'Паника ослабевает, когда вы разрешаете эмоциям проследовать мимо без попытки с ними воевать. Визуализируйте прозрачный купол защиты от внешнего шума.', + task: 'Примените технику дыхания по квадрату 4x4 секунды при первой тревожной мысли.', + duration: 5 + } + ], + quiz: [ + { + id: 'q_ap_1', + question: 'Сколько времени в среднем длится пик адреналинового приступа при панике?', + options: [ + '10-15 минут', + 'Несколько часов подряд', + 'Целый день без перерыва' + ], + correctAnswerIndex: 0, + explanation: 'Физиологический пик выброса адреналина спадает естественным образом через 10-15 минут, если не подпитывать его катастрофическими мыслями.' + } + ] } ];