From c1bc16dfdd758b2aaa7e711917f752d34e59ebf4 Mon Sep 17 00:00:00 2001 From: Cameron Pfiffer Date: Wed, 7 Jan 2026 18:34:57 -0800 Subject: [PATCH] Fix View button syntax error and handle undefined messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed two critical issues: 1. Syntax Error Fix - Changed from encoding JSON in onclick (caused parse errors) - Now stores schedules in CURRENT_SCHEDULES array - Passes array index to viewSchedule() instead - Much cleaner and no quote escaping issues 2. Undefined Messages Handling - Messages field is undefined in Letta API response - Added fallback to check: messages[], message, raw data - Shows full raw JSON if no message fields found (for debugging) - Added extensive console logging to see actual structure 3. Better Debug Logging - Logs full schedule object when viewing - Shows all possible message field locations - Helps identify correct API response structure Error: 'Uncaught SyntaxError: Unexpected end of input' Cause: JSON.stringify in template literal with quotes Fix: Store schedules globally, pass index instead 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta --- dashboard.html | 63 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/dashboard.html b/dashboard.html index b040182..0c27d15 100644 --- a/dashboard.html +++ b/dashboard.html @@ -565,6 +565,7 @@ const LETTA_API = 'https://api.letta.com/v1'; let API_KEY = sessionStorage.getItem('letta_api_key') || ''; let DEFAULT_AGENT_ID = sessionStorage.getItem('default_agent_id') || ''; + let CURRENT_SCHEDULES = []; // Store schedules for modal viewing // Initialize if (API_KEY) { @@ -704,30 +705,39 @@ console.log('Letta API response:', data); // Debug log const schedules = data.scheduled_messages || data.schedules || data || []; + // Store for modal viewing + CURRENT_SCHEDULES = schedules; + // Debug: Log first schedule if available if (schedules.length > 0) { console.log('First schedule:', schedules[0]); console.log('First schedule messages:', schedules[0].messages); + console.log('Full schedule object:', JSON.stringify(schedules[0], null, 2)); } // Split into one-time and recurring const onetime = schedules.filter(s => s.schedule?.type === 'one-time'); const recurring = schedules.filter(s => s.schedule?.type === 'recurring'); - onetimeBody.innerHTML = onetime.length ? onetime.map(s => ` + onetimeBody.innerHTML = onetime.length ? onetime.map((s, idx) => { + const globalIdx = CURRENT_SCHEDULES.indexOf(s); + return ` ${s.id?.substring(0, 8) || 'N/A'}... ${s.agent_id || 'N/A'} ${s.next_scheduled_at ? fromUnixMs(s.next_scheduled_at) : 'N/A'} ${truncate(getMessageContent(s), 30)} - + - `).join('') : 'No one-time schedules'; + `; + }).join('') : 'No one-time schedules'; - recurringBody.innerHTML = recurring.length ? recurring.map(s => ` + recurringBody.innerHTML = recurring.length ? recurring.map((s, idx) => { + const globalIdx = CURRENT_SCHEDULES.indexOf(s); + return ` ${s.id?.substring(0, 8) || 'N/A'}... ${s.agent_id || 'N/A'} @@ -736,11 +746,12 @@ ${truncate(getMessageContent(s), 30)} ${s.next_scheduled_at ? fromUnixMs(s.next_scheduled_at) : 'Never'} - + - `).join('') : 'No recurring schedules'; + `; + }).join('') : 'No recurring schedules'; } catch (error) { onetimeBody.innerHTML = `Error: ${error.message}`; recurringBody.innerHTML = `Error: ${error.message}`; @@ -882,8 +893,14 @@ return str.length > len ? str.substring(0, len) + '...' : str; } - function viewSchedule(scheduleData) { - const schedule = JSON.parse(decodeURIComponent(scheduleData)); + function viewSchedule(scheduleIndex) { + const schedule = CURRENT_SCHEDULES[scheduleIndex]; + if (!schedule) { + alert('Schedule not found'); + return; + } + + console.log('Viewing schedule:', schedule); // Debug document.getElementById('modal-id').textContent = schedule.id || 'N/A'; document.getElementById('modal-agent-id').textContent = schedule.agent_id || 'N/A'; @@ -898,19 +915,35 @@ `Cron: ${schedule.schedule.cron_expression}\nNext run: ${schedule.next_scheduled_at ? fromUnixMs(schedule.next_scheduled_at) : 'Never'}`; } - // Format messages + // Format messages - handle different formats const messagesEl = document.getElementById('modal-messages'); - if (schedule.messages && Array.isArray(schedule.messages)) { - messagesEl.innerHTML = schedule.messages.map((msg, idx) => ` + + // Check all possible message fields + console.log('Messages field:', schedule.messages); + console.log('Message field:', schedule.message); + console.log('Raw schedule:', JSON.stringify(schedule, null, 2)); + + if (schedule.messages && Array.isArray(schedule.messages) && schedule.messages.length > 0) { + messagesEl.innerHTML = schedule.messages.map((msg, idx) => { + const content = typeof msg === 'string' ? msg : + (msg.content || msg.text || JSON.stringify(msg)); + const role = typeof msg === 'object' ? (msg.role || 'user') : 'user'; + return `
Message ${idx + 1}
-
Role: ${msg.role || 'user'}
+
Role: ${role}
Content:
-
${typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content, null, 2)}
+
${typeof content === 'string' ? content : JSON.stringify(content, null, 2)}
- `).join(''); + `; + }).join(''); + } else if (schedule.message) { + // Single message field + const content = typeof schedule.message === 'string' ? schedule.message : JSON.stringify(schedule.message, null, 2); + messagesEl.innerHTML = `
${content}
`; } else { - messagesEl.textContent = getMessageContent(schedule); + // Show raw data for debugging + messagesEl.innerHTML = `
${JSON.stringify(schedule, null, 2)}
`; } document.getElementById('schedule-modal').classList.add('active'); -- 2.51.2