Add keyboard shortcuts system with reusable hint components

- Implement centralized keyboard registry with 20+ shortcuts
- Add instance navigation (Cmd+[1-9], Cmd+[/])
- Add session navigation (Cmd+Shift+[1-9], Cmd+Shift+[/])
- Add agent/model cycling (Tab, Cmd+Shift+M)
- Add input shortcuts (Cmd+P focus, Cmd+K clear, ↑↓ history)
- Add command palette (Cmd+Shift+P) with 8 MVP commands
- Implement message history per folder in IndexedDB (max 100)
- Create reusable Kbd and HintRow components
- Replace all keyboard hint rendering with consistent components
- Use text-based shortcuts (Cmd+Shift+M) for clarity
This commit is contained in:
Shantur Rathore
2025-10-23 20:18:45 +01:00
parent 3c5c4755b8
commit 4c98a3df06
21 changed files with 1302 additions and 143 deletions

View File

@@ -0,0 +1,17 @@
import { createSignal } from "solid-js"
const [isOpen, setIsOpen] = createSignal(false)
export function showCommandPalette() {
setIsOpen(true)
}
export function hideCommandPalette() {
setIsOpen(false)
}
export function toggleCommandPalette() {
setIsOpen(!isOpen())
}
export { isOpen }

View File

@@ -0,0 +1,51 @@
import { saveHistory, loadHistory, deleteHistory } from "../lib/db"
const MAX_HISTORY = 100
const instanceHistories = new Map<string, string[]>()
const historyLoaded = new Set<string>()
export async function addToHistory(instanceId: string, text: string): Promise<void> {
await ensureHistoryLoaded(instanceId)
const history = instanceHistories.get(instanceId) || []
history.unshift(text)
if (history.length > MAX_HISTORY) {
history.length = MAX_HISTORY
}
instanceHistories.set(instanceId, history)
saveHistory(instanceId, history).catch((err) => {
console.warn("Failed to persist message history:", err)
})
}
export async function getHistory(instanceId: string): Promise<string[]> {
await ensureHistoryLoaded(instanceId)
return instanceHistories.get(instanceId) || []
}
export async function clearHistory(instanceId: string): Promise<void> {
instanceHistories.delete(instanceId)
historyLoaded.delete(instanceId)
await deleteHistory(instanceId)
}
async function ensureHistoryLoaded(instanceId: string): Promise<void> {
if (historyLoaded.has(instanceId)) {
return
}
try {
const history = await loadHistory(instanceId)
instanceHistories.set(instanceId, history)
historyLoaded.add(instanceId)
} catch (error) {
console.warn("Failed to load history:", error)
instanceHistories.set(instanceId, [])
historyLoaded.add(instanceId)
}
}