From e6ec9c901b640c49d69f109e9f0dce471594397f Mon Sep 17 00:00:00 2001 From: Krystie Date: Thu, 13 Aug 2026 03:38:46 -0700 Subject: [PATCH] feat: Jellyfin/Emby recommendations + piracy disclaimer + TOTP fix + AI chat --- dashcaddy-api/routes/ai-intent.js | 5 ++++- status/js/ai-chat.js | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/dashcaddy-api/routes/ai-intent.js b/dashcaddy-api/routes/ai-intent.js index 8d23316..f39be3a 100644 --- a/dashcaddy-api/routes/ai-intent.js +++ b/dashcaddy-api/routes/ai-intent.js @@ -53,11 +53,14 @@ const INTENT_PATTERNS = [ message: 'For media streaming, I recommend:', recommendations: [ { app: 'plex', reason: 'Stream movies and TV shows to any device' }, + { app: 'jellyfin', reason: 'Free open-source alternative to Plex, no premium features locked' }, + { app: 'emby', reason: 'Media server with live TV and parental controls' }, { app: 'sonarr', reason: 'Automatically download TV shows' }, { app: 'radarr', reason: 'Automatically download movies' }, { app: 'qbittorrent', reason: 'Download client for media files' }, ], question: 'Would you like me to deploy any of these?', + disclaimer: 'DashCaddy provides deployment tools only. Users are responsible for complying with all applicable copyright and intellectual property laws. Always stream content you own or have rights to access.', }), }, @@ -334,4 +337,4 @@ module.exports = function({ asyncHandler }) { return router; }; -module.exports.routeIntent = routeIntent; +module.exports.routeIntent = routeIntent; \ No newline at end of file diff --git a/status/js/ai-chat.js b/status/js/ai-chat.js index aeb078c..3e7ef44 100644 --- a/status/js/ai-chat.js +++ b/status/js/ai-chat.js @@ -71,6 +71,12 @@ if (extra) { const extraDiv = document.createElement('div'); extraDiv.style.cssText = 'align-self:flex-start; max-width:85%; margin-top:4px;'; + if (extra.disclaimer) { + const disc = document.createElement('div'); + disc.style.cssText = 'font-size:0.7rem; color:var(--text-muted,#666); padding:6px 8px; line-height:1.4; margin-top:4px;'; + disc.textContent = '⚠️ ' + extra.disclaimer; + extraDiv.appendChild(disc); + } if (extra.recommendations) { extra.recommendations.forEach(rec => { const btn = document.createElement('button');