chore(usage): drop Hermes Agent tracking integration

Hermes aggregates all in-process API calls into a single sessions row
with the `model` field locked to the initial model, so the usage
dashboard cannot cleanly surface per-call billing context. Two rounds
of UI workarounds (raw mapping, then `<model> @ <host>` display) did
not resolve the user-facing confusion, so the whole tracking
integration is dropped for now.

Removes session_usage_hermes service (and its 17 tests), sync wiring
in commands/usage.rs and lib.rs, _hermes_session/hermes_session
entries in usage_stats SQL (provider_name_coalesce CASE and
effective_usage_log_filter IN clause), frontend Tab/banner/dropdown/
icon entries, and four i18n keys per locale.

Hermes app integration outside usage tracking (proxy routing,
session manager, config) is preserved. Pre-existing hermes rows in
proxy_request_logs are left as orphans — filtered out by the
updated SQL and never surfaced in the UI.
This commit is contained in:
Jason
2026-04-30 09:16:18 +08:00
parent 7b667f7a44
commit 518d945eb8
12 changed files with 8 additions and 932 deletions
-1
View File
@@ -17,7 +17,6 @@ const DATA_SOURCE_ICONS: Record<string, React.ReactNode> = {
codex_db: <Database className="h-3.5 w-3.5" />,
codex_session: <FileText className="h-3.5 w-3.5" />,
gemini_session: <FileText className="h-3.5 w-3.5" />,
hermes_session: <Database className="h-3.5 w-3.5" />,
};
export function DataSourceBar({ refreshIntervalMs }: DataSourceBarProps) {
-1
View File
@@ -141,7 +141,6 @@ export function RequestLogTable({
<SelectItem value="claude">Claude</SelectItem>
<SelectItem value="codex">Codex</SelectItem>
<SelectItem value="gemini">Gemini</SelectItem>
<SelectItem value="hermes">Hermes</SelectItem>
</SelectContent>
</Select>
-1
View File
@@ -35,7 +35,6 @@ const APP_FILTER_OPTIONS: AppTypeFilter[] = [
"claude",
"codex",
"gemini",
"hermes",
];
export function UsageDashboard() {
+2 -4
View File
@@ -1121,8 +1121,7 @@
"all": "All",
"claude": "Claude Code",
"codex": "Codex",
"gemini": "Gemini",
"hermes": "Hermes"
"gemini": "Gemini"
},
"dataSources": "Data Sources",
"dataSource": {
@@ -1130,8 +1129,7 @@
"session_log": "Session Log",
"codex_db": "Codex DB",
"codex_session": "Codex Session",
"gemini_session": "Gemini Session",
"hermes_session": "Hermes Session"
"gemini_session": "Gemini Session"
},
"sessionSync": {
"trigger": "Sync session logs",
+2 -4
View File
@@ -1121,8 +1121,7 @@
"all": "すべて",
"claude": "Claude Code",
"codex": "Codex",
"gemini": "Gemini",
"hermes": "Hermes"
"gemini": "Gemini"
},
"dataSources": "データソース",
"dataSource": {
@@ -1130,8 +1129,7 @@
"session_log": "セッションログ",
"codex_db": "Codex DB",
"codex_session": "Codex セッション",
"gemini_session": "Gemini セッション",
"hermes_session": "Hermes セッション"
"gemini_session": "Gemini セッション"
},
"sessionSync": {
"trigger": "セッションログを同期",
+2 -4
View File
@@ -1121,8 +1121,7 @@
"all": "全部",
"claude": "Claude Code",
"codex": "Codex",
"gemini": "Gemini",
"hermes": "Hermes"
"gemini": "Gemini"
},
"dataSources": "数据来源",
"dataSource": {
@@ -1130,8 +1129,7 @@
"session_log": "会话日志",
"codex_db": "Codex 数据库",
"codex_session": "Codex 会话日志",
"gemini_session": "Gemini 会话日志",
"hermes_session": "Hermes 会话日志"
"gemini_session": "Gemini 会话日志"
},
"sessionSync": {
"trigger": "同步会话日志",
+1 -1
View File
@@ -129,7 +129,7 @@ export interface UsageRangeSelection {
customEndDate?: number;
}
export type AppTypeFilter = "all" | "claude" | "codex" | "gemini" | "hermes";
export type AppTypeFilter = "all" | "claude" | "codex" | "gemini";
export interface StatsFilters {
timeRange: UsageRangePreset;