351c861777
- Migrate source to packages/client and packages/server directories - Namespace all Hermes-specific code under hermes/ subdirectories (api/hermes/, components/hermes/, views/hermes/, stores/hermes/) - Add hermes.* route names and /hermes/* path prefixes - Upgrade @koa/router to v15, adapt path-to-regexp v8 syntax - Fix proxy path rewriting: /api/hermes/v1/* → /v1/*, /api/hermes/* → /api/* - Fix frontend API paths to match backend /api/hermes/* routes - Fix WebSocket terminal path to /api/hermes/terminal - Add proxyMiddleware for reliable unmatched route proxying - Add profiles route module and hermes-cli profile commands - Update CLAUDE.md development guide with new architecture - Add Chinese README (README_zh.md) - Add Web Terminal feature to README Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
37 lines
1022 B
TypeScript
37 lines
1022 B
TypeScript
import { request } from '../client'
|
|
|
|
export interface LogFileInfo {
|
|
name: string
|
|
size: string
|
|
modified: string
|
|
}
|
|
|
|
export interface LogEntry {
|
|
timestamp: string
|
|
level: string
|
|
logger: string
|
|
message: string
|
|
raw: string
|
|
}
|
|
|
|
export async function fetchLogFiles(): Promise<LogFileInfo[]> {
|
|
const res = await request<{ files: LogFileInfo[] }>('/api/hermes/logs')
|
|
return res.files
|
|
}
|
|
|
|
export async function fetchLogs(name: string, params?: {
|
|
lines?: number
|
|
level?: string
|
|
session?: string
|
|
since?: string
|
|
}): Promise<LogEntry[]> {
|
|
const query = new URLSearchParams()
|
|
if (params?.lines) query.set('lines', String(params.lines))
|
|
if (params?.level) query.set('level', params.level)
|
|
if (params?.session) query.set('session', params.session)
|
|
if (params?.since) query.set('since', params.since)
|
|
const qs = query.toString()
|
|
const res = await request<{ entries: (LogEntry | null)[] }>(`/api/hermes/logs/${name}${qs ? `?${qs}` : ''}`)
|
|
return res.entries.filter((e): e is LogEntry => e !== null)
|
|
}
|