diff --git a/.ralphy/deferred.json b/.ralphy/deferred.json
index d4e3b5d..5538eab 100644
--- a/.ralphy/deferred.json
+++ b/.ralphy/deferred.json
@@ -4,6 +4,11 @@
"count": 1,
"last": "2026-02-01T00:59:26.518Z",
"title": "**Add WiFi signal strength indicator in setup**"
+ },
+ "markdown:PRD.md:180": {
+ "count": 1,
+ "last": "2026-02-01T02:40:47.839Z",
+ "title": "Sensor status shows correctly (online/offline) with background updates"
}
}
}
\ No newline at end of file
diff --git a/.ralphy/progress.txt b/.ralphy/progress.txt
index 828ce6e..7597153 100644
--- a/.ralphy/progress.txt
+++ b/.ralphy/progress.txt
@@ -135,3 +135,32 @@
- [✓] 2026-02-01 01:44 - @worker2 **Реализовать OTP Verification Page**
- [✓] 2026-02-01 01:49 - @worker2 **Создать Protected Route Middleware**
- [✓] 2026-02-01 02:01 - @worker3 **Создать Shared UI Library (из рекомендации 2)**
+- [✓] 2026-02-01 02:11 - @worker3 **Создать базовые UI компоненты**
+- [✓] 2026-02-01 02:13 - **Add E2E tests for sensor management**
+- [✓] 2026-02-01 02:16 - BLE scan finds WP sensors with signal strength indication
+- [✓] 2026-02-01 02:20 - @worker3 **Реализовать Layout компоненты**
+- [✓] 2026-02-01 02:23 - WiFi configuration works reliably with credential validation
+- [✓] 2026-02-01 02:26 - @worker3 **Создать Loading & Error компоненты**
+- [✓] 2026-02-01 02:29 - API attachment succeeds with proper error handling
+- [✓] 2026-02-01 16:16 - @worker2 **Создать Dashboard Page**
+- [✓] 2026-02-01 16:26 - @worker2 **Реализовать Beneficiary Detail Page**
+- [✓] 2026-02-01 16:33 - @worker2 **Создать Add Beneficiary Flow**
+- [✓] 2026-02-01 16:40 - @worker1 **Реализовать Web Bluetooth Service**
+- [✓] 2026-02-01 16:49 - @worker1 **Создать BLE Scanner Component**
+- [✓] 2026-02-01 16:56 - @worker1 **Реализовать WiFi Setup Flow**
+- [✓] 2026-02-01 17:07 - @worker1 **Создать Sensor Management Pages**
+- [✓] 2026-02-01 17:19 - @worker3 **Реализовать BLE Error Handling (из рекомендации 3)**
+- [✓] 2026-02-01 17:29 - @worker3 **Добавить Network Error Handling**
+- [✓] 2026-02-01 17:36 - @worker3 **Создать Online Status Check**
+- [✓] 2026-02-01 17:50 - @worker3 **Адаптировать для всех экранов**
+- [✓] 2026-02-01 18:01 - @worker3 **Добавить Dark Mode Support**
+- [✓] 2026-02-01 18:11 - @worker3 **Реализовать Loading States**
+- [✓] 2026-02-01 18:23 - @worker1 **Создать E2E тесты для критичных flows**
+- [✓] 2026-02-01 18:39 - @worker1 **Добавить Unit тесты для BLE сервиса**
+- [✓] 2026-02-01 18:48 - ✅ **Browser Support**: Работает в Chrome/Edge/Opera, показывает понятную ошибку в Safari/Firefox
+- [✓] 2026-02-01 18:53 - ✅ **Authentication**: Auth flow идентичен мобилке, JWT токен корректно управляется
+- [✓] 2026-02-01 19:18 - ✅ **BLE Integration**: Сканирование находит WP сенсоры, WiFi setup работает полностью
+- [✓] 2026-02-01 19:21 - ✅ **Data Sync**: Все изменения синхронизируются с тем же backend что и мобильное приложение
+- [✓] 2026-02-01 19:28 - ✅ **Error Handling**: Все ошибки (BLE, Network, Validation) обрабатываются с user-friendly messages
+- [✓] 2026-02-01 19:34 - ✅ **Responsive Design**: Корректно отображается от 768px до 4K мониторов
+- [✓] 2026-02-01 19:45 - ✅ **Performance**: Первичная загрузка <3 секунд, BLE операции <10 секунд
diff --git a/PRD.md b/PRD.md
index 6ef48d8..f2f24e4 100644
--- a/PRD.md
+++ b/PRD.md
@@ -165,7 +165,7 @@ const mac = parts[2].toUpperCase(); // "81A14C"
- Что сделать: BLE timeout, WiFi failure, API error → specific recovery actions
- Готово когда: Каждая ошибка имеет clear recovery path
-- [ ] **Add E2E tests for sensor management**
+- [x] **Add E2E tests for sensor management**
- Файл: `.maestro/sensor-setup.yaml`
- Что сделать: Full sensor setup flow from scan to API attachment
- Готово когда: E2E test покрывает complete happy path
@@ -174,9 +174,9 @@ const mac = parts[2].toUpperCase(); // "81A14C"
## Success Criteria
-- [ ] BLE scan finds WP sensors with signal strength indication
-- [ ] WiFi configuration works reliably with credential validation
-- [ ] API attachment succeeds with proper error handling
+- [x] BLE scan finds WP sensors with signal strength indication
+- [x] WiFi configuration works reliably with credential validation
+- [x] API attachment succeeds with proper error handling
- [ ] Sensor status shows correctly (online/offline) with background updates
- [ ] Location/description can be changed through device settings
- [ ] Detach removes sensor from deployment cleanly
diff --git a/admin/next-env.d.ts b/admin/next-env.d.ts
new file mode 100644
index 0000000..40c3d68
--- /dev/null
+++ b/admin/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
diff --git a/admin/tsconfig.json b/admin/tsconfig.json
new file mode 100644
index 0000000..ccb2ed9
--- /dev/null
+++ b/admin/tsconfig.json
@@ -0,0 +1,34 @@
+{
+ "compilerOptions": {
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": false,
+ "noEmit": true,
+ "incremental": true,
+ "module": "esnext",
+ "esModuleInterop": true,
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
+ },
+ "include": [
+ "next-env.d.ts",
+ ".next/types/**/*.ts",
+ "**/*.ts",
+ "**/*.tsx"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/e2e/auth.spec.ts b/e2e/auth.spec.ts
index 5c167f1..b7ac0f3 100644
--- a/e2e/auth.spec.ts
+++ b/e2e/auth.spec.ts
@@ -1,6 +1,6 @@
import { test, expect } from '@playwright/test';
-const BASE_URL = 'https://wellnuo.smartlaunchhub.com/app/';
+const BASE_URL = 'https://wellnuo.smartlaunchhub.com/';
test.describe('WellNuo Web App Tests', () => {
@@ -138,7 +138,7 @@ test.describe('WellNuo Web App Tests', () => {
page.on('console', msg => console.log(`BROWSER: ${msg.text()}`));
page.on('pageerror', err => console.log(`ERROR: ${err.message}`));
- await page.goto('https://wellnuo.smartlaunchhub.com/app/');
+ await page.goto('https://wellnuo.smartlaunchhub.com/');
// Wait for app to load
await page.waitForLoadState('networkidle');
diff --git a/e2e/complete-auth.spec.ts b/e2e/complete-auth.spec.ts
index d4c01e2..3ca47a6 100644
--- a/e2e/complete-auth.spec.ts
+++ b/e2e/complete-auth.spec.ts
@@ -1,6 +1,6 @@
import { test, expect } from '@playwright/test';
-const BASE_URL = 'https://wellnuo.smartlaunchhub.com/app/';
+const BASE_URL = 'https://wellnuo.smartlaunchhub.com/';
// Run tests serially to avoid rate limiting (429)
test.describe.configure({ mode: 'serial' });
diff --git a/e2e/full-flow.spec.ts b/e2e/full-flow.spec.ts
index fcb8b8f..9e10c19 100644
--- a/e2e/full-flow.spec.ts
+++ b/e2e/full-flow.spec.ts
@@ -1,6 +1,6 @@
import { test, expect } from '@playwright/test';
-const BASE_URL = 'https://wellnuo.smartlaunchhub.com/app/';
+const BASE_URL = 'https://wellnuo.smartlaunchhub.com/';
// This test requires manual OTP entry or temp-mail integration
test.describe('Full Authentication Flow', () => {