Author SHA1 Message Date
jared 3edb2da174 Merge pull request 'fix: handle mysql2 >=3.23 returning JSON columns pre-parsed (Gandalf relay regression)' (#36) from hotfix/mysql2-json-columns into main
Lint / JS (eslint) (push) Successful in 10s
Lint / Notify on failure (push) Skipped
Security / JS Security (npm audit) (push) Successful in 11s
Test / JS Tests (jest) (push) Successful in 12s
Lint / Deploy (push) Successful in 3s
fix: handle mysql2 >=3.23 returning JSON columns pre-parsed (#36)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01HamVMDrA8RqhyxmUHgiqRp
2026-09-08 22:41:26 -04:00
jaredandClaude Fable 5.1 2173b5ab8f fix: handle mysql2 >=3.23 returning JSON columns pre-parsed
Lint / JS (eslint) (pull_request) Successful in 11s
Lint / Notify on failure (pull_request) Skipped
Lint / Deploy (pull_request) Skipped
Security / JS Security (npm audit) (pull_request) Successful in 10s
Test / JS Tests (jest) (pull_request) Successful in 10s
Lint / JS (eslint) (push) Successful in 11s
Lint / Notify on failure (push) Skipped
Lint / Deploy (push) Skipped
Security / JS Security (npm audit) (push) Successful in 11s
Test / JS Tests (jest) (push) Successful in 11s
mysql2 3.24 (pulled in by the audit fix in #35) returns MariaDB JSON columns as
JS objects. GET /api/internal/executions/:id and GET /api/workflows/:id still
called JSON.parse on the value, threw, and silently returned [] / {}. This broke
Gandalf's relay checks (false 'PBS unreachable' ticket) and the workflow edit
modal. Guard both sites with the same typeof check already used by
GET /api/executions/:id.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HamVMDrA8RqhyxmUHgiqRp
2026-09-08 22:39:59 -04:00
jared e13bdd00d1 Merge pull request 'Redesign the Pulse UI onto the LotusGuild Terminal Design System' (#35) from feature/tds-redesign into main
Lint / JS (eslint) (push) Successful in 11s
Lint / Notify on failure (push) Skipped
Security / JS Security (npm audit) (push) Successful in 16s
Test / JS Tests (jest) (push) Successful in 19s
Lint / Deploy (push) Successful in 4s
Redesign the Pulse UI onto the LotusGuild Terminal Design System (#35)

Closes #2

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01HamVMDrA8RqhyxmUHgiqRp
2026-09-08 22:23:24 -04:00
+10 -2
View File
@@ -1194,7 +1194,11 @@ app.get('/api/workflows/:id', authenticateSSO, async (req, res) => {
if (rows.length === 0) return res.status(404).json({ error: 'Not found' });
const wf = rows[0];
let definition = {};
try { definition = JSON.parse(wf.definition || '{}'); } catch { /* corrupt definition — return empty */ }
try {
definition = typeof wf.definition === 'string'
? JSON.parse(wf.definition || '{}')
: (wf.definition || {});
} catch { /* corrupt definition — return empty */ }
res.json({ ...wf, definition });
} catch (error) {
console.error('[API] GET /api/workflows/:id error:', error);
@@ -1659,7 +1663,11 @@ app.get('/api/internal/executions/:id', authenticateGandalf, async (req, res) =>
}
const execution = rows[0];
let logs = [];
try { logs = JSON.parse(execution.logs || '[]'); } catch { logs = []; }
try {
logs = typeof execution.logs === 'string'
? JSON.parse(execution.logs || '[]')
: (execution.logs || []);
} catch { logs = []; }
res.json({ ...execution, logs });
} catch (error) {
console.error('[API] GET /api/internal/executions/:id error:', error);