feat: replace corrections/tuner with dashboard module

Replace the corrections/adaptive-prompt-tuner feature with a new
dashboard module providing server stats and user profile overview.

Backend:
- Add dashboard module (routes, service, repository) with stats + user list + user detail endpoints
- Remove corrections module entirely
- Wire dashboard router in app.ts

Frontend:
- Add dashboard feature (DashboardStats, UserSummaryList, UserProfileDetail components + useDashboard hook)
- Remove tuner feature (CorrectionStats, CorrectionHistory, SubmitCorrection, useCorrections)
- Update API client from corrections → dashboard types/fns
- Rename tab 'tuner' → 'dashboard'
- Update MobileTabBar, Header, Sidebar links

Tests:
- Expand backend placeholder test with dashboard assertions
- Expand discord-gateway placeholder test with config/channel assertions

AI moderation:
- llmModerationClient: improve status/reply detection, expand safety categories, fix timer reset
- userProfileLearner: fix isReply refinement
- userProfileStore: add pending cache check
- messageMetadata: add crosspost type mapping
- migrate.ts: improve partial-index safety in schema push

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
MythEclipse
2026-06-13 11:24:42 +07:00
co-authored by Claude
parent e3249edb6c
commit 30f8d7cce3
32 changed files with 1409 additions and 1219 deletions
@@ -170,9 +170,20 @@ export async function runMigrations(): Promise<void> {
const originalQuery = client.query;
client.query = (async (...args: any[]) => {
const queryText = args[0];
const text = typeof queryText === "string" ? queryText : queryText?.text;
if (text && typeof text === "string" && text.includes('CREATE SCHEMA IF NOT EXISTS "public"')) {
return { rows: [], command: "CREATE", rowCount: 0, oid: 0, fields: [] };
const text =
typeof queryText === "string" ? queryText : queryText?.text;
if (
text &&
typeof text === "string" &&
text.includes('CREATE SCHEMA IF NOT EXISTS "public"')
) {
return {
rows: [],
command: "CREATE",
rowCount: 0,
oid: 0,
fields: [],
};
}
return Function.prototype.apply.call(originalQuery, client, args);
}) as typeof client.query;