Add a full-featured gateway dashboard UI built on Lit web components. Shell & plumbing: - App shell with router, controllers, and dependency wiring - Login gate, i18n keys, and base layout scaffolding Styles & theming: - Base styles, chat styles, and responsive layout CSS - 6-theme glassmorphism system (Obsidian, Aurora, Solar, etc.) - Glass card, glass panel, and glass input components - Favicon logo in expanded sidebar header Views & features: - Overview with attention cards, event log, quick actions, and log tail - Chat view with markdown rendering, tool-call collapse, and delete support - Command palette with fuzzy search - Agent overview with config display, slash commands, and sidebar filtering - Session list navigation and agent selector Privacy & polish: - Redact toggle with stream-mode default - Blur host/IP in Connected Instances with reveal toggle - Sensitive config value masking with count badge - Card accent borders, hover lift effects, and responsive grid
50 lines
953 B
TypeScript
50 lines
953 B
TypeScript
const MAX = 50;
|
|
|
|
export class InputHistory {
|
|
private items: string[] = [];
|
|
private cursor = -1;
|
|
|
|
push(text: string): void {
|
|
const trimmed = text.trim();
|
|
if (!trimmed) {
|
|
return;
|
|
}
|
|
if (this.items[this.items.length - 1] === trimmed) {
|
|
return;
|
|
}
|
|
this.items.push(trimmed);
|
|
if (this.items.length > MAX) {
|
|
this.items.shift();
|
|
}
|
|
this.cursor = -1;
|
|
}
|
|
|
|
up(): string | null {
|
|
if (this.items.length === 0) {
|
|
return null;
|
|
}
|
|
if (this.cursor < 0) {
|
|
this.cursor = this.items.length - 1;
|
|
} else if (this.cursor > 0) {
|
|
this.cursor--;
|
|
}
|
|
return this.items[this.cursor] ?? null;
|
|
}
|
|
|
|
down(): string | null {
|
|
if (this.cursor < 0) {
|
|
return null;
|
|
}
|
|
this.cursor++;
|
|
if (this.cursor >= this.items.length) {
|
|
this.cursor = -1;
|
|
return null;
|
|
}
|
|
return this.items[this.cursor] ?? null;
|
|
}
|
|
|
|
reset(): void {
|
|
this.cursor = -1;
|
|
}
|
|
}
|