refactor(web): move session source config to SessionsPage_sources sibling; satisfy code-health ratchet

This commit is contained in:
Austin Pickett
2026-10-06 12:17:46 -04:00
parent d199cc2465
commit ef0c635f33
2 changed files with 113 additions and 95 deletions

View File

@@ -15,14 +15,11 @@ import {
ChevronRight,
Database,
ListFilter,
MessageSquare,
Search,
Trash2,
Clock,
Terminal,
Globe,
MessageCircle,
Hash,
X,
Play,
Eraser,
@@ -48,6 +45,16 @@ import type {
} from "@/lib/api";
import { timeAgo } from "@/lib/utils";
import { Markdown } from "@/components/Markdown";
import {
AUTOMATION_SESSION_SOURCES,
NO_MATCHING_SESSION_SOURCE,
SOURCE_CONFIG,
SessionFilterCategory,
SourceSelectionsByCategory,
isAutomationSource,
sourceBelongsToCategory,
sourceLabel,
} from "./SessionsPage_sources";
import { StructuredReasoning } from "@/components/StructuredReasoning";
import { PlatformsCard } from "@/components/PlatformsCard";
import { shouldRenderStructuredReasoning } from "@/lib/reasoning-markup";
@@ -78,98 +85,6 @@ import { PluginSlot } from "@/plugins";
import { isDashboardEmbeddedChatEnabled } from "@/lib/dashboard-flags";
import { apiErrorFromResponse, errorMessage } from "@/lib/api-error";
const SOURCE_CONFIG: Record<string, { icon: typeof Terminal; color: string }> =
{
cli: { icon: Terminal, color: "text-primary" },
tui: { icon: Terminal, color: "text-primary" },
telegram: { icon: MessageCircle, color: "text-[oklch(0.65_0.15_250)]" },
discord: { icon: Hash, color: "text-[oklch(0.65_0.15_280)]" },
slack: { icon: MessageSquare, color: "text-[oklch(0.7_0.15_155)]" },
whatsapp: { icon: Globe, color: "text-success" },
whatsapp_cloud: { icon: Globe, color: "text-success" },
signal: { icon: MessageCircle, color: "text-success" },
matrix: { icon: MessageCircle, color: "text-[oklch(0.65_0.15_250)]" },
email: { icon: MessageSquare, color: "text-[oklch(0.7_0.15_155)]" },
sms: { icon: MessageCircle, color: "text-success" },
cron: { icon: Clock, color: "text-warning" },
tool: { icon: Play, color: "text-warning" },
oneshot: { icon: Terminal, color: "text-warning" },
api_server: { icon: Globe, color: "text-muted-foreground" },
acp: { icon: Database, color: "text-muted-foreground" },
hermes_flow: { icon: Play, color: "text-warning" },
vulcan_delegate: { icon: Play, color: "text-warning" },
webhook: { icon: Globe, color: "text-warning" },
};
const AUTOMATION_SESSION_SOURCES = [
"cron",
"tool",
"oneshot",
"api_server",
"acp",
"hermes_flow",
"vulcan_delegate",
"webhook",
];
const AUTOMATION_SESSION_SOURCE_SET = new Set(AUTOMATION_SESSION_SOURCES);
const NO_MATCHING_SESSION_SOURCE = "__hermes_dashboard_no_matching_source__";
type SessionFilterCategory = "chats" | "automation" | "all";
type SourceSelectionsByCategory = Record<SessionFilterCategory, string[] | null>;
function isAutomationSource(source: string): boolean {
return AUTOMATION_SESSION_SOURCE_SET.has(source);
}
function sourceBelongsToCategory(
source: string,
category: SessionFilterCategory,
): boolean {
if (category === "all") return true;
if (category === "automation") return isAutomationSource(source);
return !isAutomationSource(source);
}
function sourceLabel(source: string): string {
switch (source) {
case "api_server":
return "API server";
case "acp":
return "ACP";
case "cli":
return "CLI";
case "tui":
return "TUI";
case "telegram":
return "Telegram";
case "discord":
return "Discord";
case "slack":
return "Slack";
case "whatsapp":
return "WhatsApp";
case "whatsapp_cloud":
return "WhatsApp Cloud";
case "sms":
return "SMS";
case "cron":
return "Cron";
case "tool":
return "Tool";
case "hermes_flow":
return "Hermes Flow";
case "vulcan_delegate":
return "Vulcan delegate";
case "webhook":
return "Webhook";
default:
return source
.split("_")
.filter(Boolean)
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
.join(" ");
}
}
/** Render an FTS5 snippet with highlighted matches.
* The backend wraps matches in >>> and <<< delimiters. */

View File

@@ -0,0 +1,103 @@
import {
Clock,
Database,
Globe,
Hash,
MessageCircle,
MessageSquare,
Play,
Terminal,
} from "lucide-react";
export const SOURCE_CONFIG: Record<string, { icon: typeof Terminal; color: string }> =
{
cli: { icon: Terminal, color: "text-primary" },
tui: { icon: Terminal, color: "text-primary" },
telegram: { icon: MessageCircle, color: "text-[oklch(0.65_0.15_250)]" },
discord: { icon: Hash, color: "text-[oklch(0.65_0.15_280)]" },
slack: { icon: MessageSquare, color: "text-[oklch(0.7_0.15_155)]" },
whatsapp: { icon: Globe, color: "text-success" },
whatsapp_cloud: { icon: Globe, color: "text-success" },
signal: { icon: MessageCircle, color: "text-success" },
matrix: { icon: MessageCircle, color: "text-[oklch(0.65_0.15_250)]" },
email: { icon: MessageSquare, color: "text-[oklch(0.7_0.15_155)]" },
sms: { icon: MessageCircle, color: "text-success" },
cron: { icon: Clock, color: "text-warning" },
tool: { icon: Play, color: "text-warning" },
oneshot: { icon: Terminal, color: "text-warning" },
api_server: { icon: Globe, color: "text-muted-foreground" },
acp: { icon: Database, color: "text-muted-foreground" },
hermes_flow: { icon: Play, color: "text-warning" },
vulcan_delegate: { icon: Play, color: "text-warning" },
webhook: { icon: Globe, color: "text-warning" },
};
export const AUTOMATION_SESSION_SOURCES = [
"cron",
"tool",
"oneshot",
"api_server",
"acp",
"hermes_flow",
"vulcan_delegate",
"webhook",
];
const AUTOMATION_SESSION_SOURCE_SET = new Set(AUTOMATION_SESSION_SOURCES);
export const NO_MATCHING_SESSION_SOURCE = "__hermes_dashboard_no_matching_source__";
export type SessionFilterCategory = "chats" | "automation" | "all";
export type SourceSelectionsByCategory = Record<SessionFilterCategory, string[] | null>;
export function isAutomationSource(source: string): boolean {
return AUTOMATION_SESSION_SOURCE_SET.has(source);
}
export function sourceBelongsToCategory(
source: string,
category: SessionFilterCategory,
): boolean {
if (category === "all") return true;
if (category === "automation") return isAutomationSource(source);
return !isAutomationSource(source);
}
export function sourceLabel(source: string): string {
switch (source) {
case "api_server":
return "API server";
case "acp":
return "ACP";
case "cli":
return "CLI";
case "tui":
return "TUI";
case "telegram":
return "Telegram";
case "discord":
return "Discord";
case "slack":
return "Slack";
case "whatsapp":
return "WhatsApp";
case "whatsapp_cloud":
return "WhatsApp Cloud";
case "sms":
return "SMS";
case "cron":
return "Cron";
case "tool":
return "Tool";
case "hermes_flow":
return "Hermes Flow";
case "vulcan_delegate":
return "Vulcan delegate";
case "webhook":
return "Webhook";
default:
return source
.split("_")
.filter(Boolean)
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
.join(" ");
}
}