6.3 KiB
Container Health Fixes - Implementation Summary
Overview
This PR addresses three critical issues that were causing container health failures and functionality problems.
Issues Fixed
1. Tracking Error: "uniqueVisitors.add is not a function" ✅
Problem: The application was logging repeated errors:
[2026-01-12T08:26:20.032Z] Tracking error {"error":"TypeError: trackingData.summary.dailyVisits[dateKey].uniqueVisitors.add is not a function"}
Root Cause:
When tracking data was persisted to JSON and loaded back, the dailyVisits[dateKey].uniqueVisitors Sets were serialized as arrays. On reload, they remained as arrays instead of being converted back to Sets, causing .add() method calls to fail.
Solution:
- Modified
loadTrackingData()(lines 1055-1098) to iterate throughdailyVisitsand convertuniqueVisitorsarrays back to Sets - Modified
persistTrackingData()(lines 1100-1124) to explicitly serialize Sets to arrays before JSON stringification - Simplified conditional logic per code review feedback
Files Changed:
chat/server.js(lines 1055-1124)
2. Invalid URL Error: "TypeError: Invalid URL" ✅
Problem: The application was crashing with errors:
TypeError: Invalid URL
at new URL (node:internal/url:806:29)
at route (/opt/webchat/server.js:6853:15)
code: 'ERR_INVALID_URL',
input: '//?author=1',
Root Cause:
Malformed HTTP requests with URLs like //?author=1 (double leading slashes) caused the native URL constructor to throw unhandled exceptions, crashing request handlers.
Solution:
- Created
sanitizeUrl()utility function (lines 1136-1145) to detect and fix URLs starting with// - Updated
route()function (lines 6887-6910) to:- Use sanitizeUrl before URL parsing
- Catch URL parsing errors and return 400 Bad Request
- Log invalid URLs for monitoring
- Updated
trackVisit()function (lines 1137-1153) to:- Use sanitizeUrl before URL parsing
- Gracefully skip tracking on invalid URLs
- Log skipped tracking attempts
Files Changed:
chat/server.js(lines 1136-1145, 1147-1153, 6887-6910)
3. Model Dropdown Not Showing Up ✅
Problem:
Users reported that the model dropdown in the builder (/builder) was not displaying any options.
Root Cause:
The model dropdown functionality was working correctly, but the system only had 2 test models configured with outdated model identifiers. The dropdown requires properly configured models in admin-models.json to display options.
Solution: Added comprehensive default model configurations with 5 modern, widely-available models:
- GPT-4o Mini (free tier) - Fast, cost-effective OpenAI model
- GPT-4o (plus tier) - Latest flagship OpenAI model
- Claude 3.5 Sonnet (plus tier) - High-performance Anthropic model
- Claude 3.5 Haiku (free tier) - Fast, efficient Anthropic model
- Gemini 2.0 Flash (free tier) - Latest Google experimental model
Each model is properly configured with:
- Unique ID and name
- Display label
- CLI type (opencode)
- Provider mapping (openai, anthropic, google)
- Usage tier (free, plus, pro)
Files Changed:
.data/.opencode-chat/admin-models.json
Testing
Manual Testing
Created /tmp/test-fixes.js script that validates:
- ✅ Tracking data serialization/deserialization
- ✅ Set operations after deserialization
- ✅ URL sanitization for various edge cases
All tests passed successfully.
Syntax Validation
node -c chat/server.js # ✅ Passed
Code Review
- Addressed all code review feedback
- Extracted duplicated URL sanitization into shared utility function (DRY principle)
- Simplified conditional logic in loadTrackingData
- Improved documentation and comments
Security Check
codeql_checker # ✅ No alerts found
Impact
Before:
- Container health checks failing due to repeated tracking errors
- Application crashes on malformed URL requests
- Model dropdown showing no options for users
- Poor user experience and system instability
After:
- ✅ Tracking system working correctly with proper Set serialization
- ✅ Robust URL handling preventing crashes from malformed requests
- ✅ Model dropdown populated with 5 modern, widely-available models
- ✅ Improved stability and user experience
Code Quality Improvements
- DRY Principle: Extracted duplicated URL sanitization logic into shared
sanitizeUrl()utility - Error Handling: Added comprehensive try-catch blocks and graceful degradation
- Logging: Enhanced logging for debugging and monitoring
- Documentation: Added clear comments explaining the purpose of each fix
- Maintainability: Simplified conditional logic and improved code readability
Deployment Notes
Configuration Requirements
- Models are configured in
.data/.opencode-chat/admin-models.json - File is loaded at server startup via
loadAdminModelStore() - No environment variables need to be changed
Backward Compatibility
- ✅ All changes are backward compatible
- ✅ Existing tracking data will be properly migrated on load
- ✅ No breaking changes to API endpoints
Monitoring
Watch for these log messages to confirm fixes are working:
Loaded tracking data- Confirms tracking data loaded with Sets intactInvalid URL- Confirms malformed URLs are being handled gracefullyTracking skipped - invalid URL- Confirms tracking gracefully handles bad URLsModels loaded successfully- Confirms model dropdown will populate
Related Documentation
BUILDER_MODEL_DROPDOWN_FIX.md- Detailed investigation of dropdown functionality- Model configuration schema documented in
BUILDER_MODEL_DROPDOWN_FIX.md
Security Summary
Vulnerabilities Discovered: 0 Vulnerabilities Fixed: 0 Security Scan Results: ✅ Clean (CodeQL found no alerts)
Security Improvements:
- Added input validation for URLs to prevent crashes
- Proper error handling prevents information leakage
- Sanitization applied before URL parsing
Conclusion
All three issues have been successfully resolved with minimal, surgical changes to the codebase. The fixes improve system stability, enhance error handling, and provide a better user experience. No security vulnerabilities were introduced, and all code quality standards have been maintained.