When accessing from VPN/Tailscale (e.g., 100.78.182.28), frontend was trying
to reach backend on that same IP, but backend listens on SERVER_IP instead.
Now uses SERVER_IP from network.json config, ensuring remote clients connect
to the correct server address regardless of their access network.
- Add ItemDetailModal component for viewing item details and replacing photos
- Add photo replacement/deletion endpoints to API layer (PUT/DELETE /items/{id}/photo)
- Update InventoryTable to open detail modal on item click
- Show current photo thumbnail with Replace/Delete buttons
- Support uploading new photo with ItemPhotoUpload component
- Delete old photo on backend when replacing (no orphaned files)
- Full test coverage: 18 tests for ItemDetailModal component
- All 393 tests passing, zero TypeScript errors
- Build verified successfully
- Changed AI endpoints from /admin/db/settings/ai to /admin/ai/settings
- Changed AI prompt endpoints from /admin/db/settings/prompt to /admin/ai/settings/prompt
- Changed AI keys endpoint from /admin/db/settings/ai-keys to /admin/ai/settings/keys
- Changed AI test endpoint from /admin/db/settings/test-ai-key to /admin/ai/settings/test-key
- DB endpoints remain unchanged under /admin/db/...
- Frontend tests: 291/291 passing
- Backend tests: 41/41 passing
- Log when saveToken is called with token details
- Log when request interceptor checks for token
- Log when Authorization header is set or token is missing
- Helps diagnose 401 Unauthorized issues after login