import { invoke } from "@tauri-apps/api/core"; import { startTransition, useDeferredValue, useEffect, useState, type ChangeEvent, type FormEvent, type ReactElement, } from "react"; import { Activity, CircleAlert, ClipboardList, Copy, Database, KeyRound, PanelLeft, PlugZap, Search, ShieldAlert, TerminalSquare, TimerReset, Trash2, } from "lucide-react"; import { Badge } from "./components/ui/badge"; import { Button } from "./components/ui/button"; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "./components/ui/dialog"; import { Input } from "./components/ui/input"; import { Textarea } from "./components/ui/textarea"; import { cn } from "./lib/utils"; declare const __APP_VERSION__: string; type RedisKeyType = string; type TlsMode = "disabled" | "preferred" | "required"; type ConnectionStatus = "healthy" | "idle" | "checking" | "error"; type ConsoleEntryStatus = "ok" | "blocked" | "error"; type ConsoleEntrySource = "live" | "mock"; type RedisValueWriteCapability = "none" | "replace_string"; type ConnectionProfile = { id: string; name: string; environment: "dev" | "test" | "local"; detail: string; status: ConnectionStatus; password: string; target: { host: string; port: number; database: number; username: string | null; tls_mode: TlsMode; }; }; type KeyRecord = { id: string; name: string; type: RedisKeyType; ttl: string; preview: string; editable: boolean; value: string; summary: string; }; type ConsoleEntry = { command: string; output: string; status: ConsoleEntryStatus; source: ConsoleEntrySource; }; type ConnectionDraft = { name: string; host: string; port: string; database: string; user: string; password: string; }; type ConnectionDraftErrors = Partial< Record<"name" | "host" | "port" | "database", string> >; type BackendBootstrap = { app_name: string; surface: string; persistence: { connection_catalog: string; secrets: string; }; command_execution: string; key_browsing: string; next_backend_milestone: string; }; type BackendError = { code: string; message: string; detail: string | null; }; type RedisConnectionRequest = { target: ConnectionProfile["target"]; password: string | null; }; type ConnectionTestResult = { selected_database: number; authenticated_as: string | null; round_trip_status: string; }; type RedisCommandRequest = { connection: RedisConnectionRequest; command: string; arguments: string[]; }; type RedisKeyTtl = | { kind: "persistent" } | { kind: "missing" } | { kind: "expires_in_millis"; value: number }; type RedisKeyMetadata = { name: string; database: number; exists: boolean; key_type: string; ttl: RedisKeyTtl; }; type RedisKeyBrowseRequest = { connection: RedisConnectionRequest; cursor: string; pattern: string | null; page_size: number; }; type RedisKeyBrowseResult = { database: number; submitted_cursor: string; next_cursor: string; has_more: boolean; page_size: number; pattern: string | null; keys: RedisKeyMetadata[]; }; type RedisValueContent = | { kind: "string"; value: string } | { kind: "binary"; bytes: number[] }; type RedisFieldValueEntry = { field: RedisValueContent; value: RedisValueContent; }; type RedisSortedSetEntry = { member: RedisValueContent; score: string; }; type RedisStreamEntry = { id: string; fields: RedisFieldValueEntry[]; }; type RedisValueData = | { kind: "missing" } | { kind: "string"; value: RedisValueContent } | { kind: "hash"; entries: RedisFieldValueEntry[] } | { kind: "list"; items: RedisValueContent[] } | { kind: "set"; members: RedisValueContent[] } | { kind: "sorted_set"; entries: RedisSortedSetEntry[] } | { kind: "stream"; entries: RedisStreamEntry[] }; type RedisValueRecord = { metadata: RedisKeyMetadata; data: RedisValueData; write_capability: RedisValueWriteCapability; ttl_write_supported: boolean; }; type RedisValueReadRequest = { connection: RedisConnectionRequest; key: string; }; type RedisValueWriteRequest = { connection: RedisConnectionRequest; key: string; value: { kind: "string"; value: string; }; }; type RedisKeyTtlUpdate = | { kind: "persist" } | { kind: "expires_in_millis"; value: number }; type RedisKeyTtlUpdateRequest = { connection: RedisConnectionRequest; key: string; operation: RedisKeyTtlUpdate; }; type RedisKeyTtlUpdateResult = { metadata: RedisKeyMetadata; }; type RedisResponse = | { kind: "null" } | { kind: "integer"; value: number } | { kind: "string"; value: string } | { kind: "binary"; bytes: number[] } | { kind: "array"; items: RedisResponse[] }; type CommandExecutionResult = { command: string; arguments: string[]; database: number; response: RedisResponse; }; const browsePageSize = 50; const initialConnections: ConnectionProfile[] = [ { id: "redis-dev-eu-1", name: "redis-dev-eu-1", environment: "dev", detail: "13 ms", status: "healthy", password: "", target: { host: "127.0.0.1", port: 6379, database: 0, username: null, tls_mode: "disabled", }, }, { id: "redis-test-audit", name: "redis-test-audit", environment: "test", detail: "28 ms", status: "healthy", password: "", target: { host: "10.42.2.19", port: 6379, database: 0, username: "readonly", tls_mode: "disabled", }, }, { id: "redis-local-fixture", name: "redis-local-fixture", environment: "local", detail: "Fixture profile", status: "idle", password: "", target: { host: "127.0.0.1", port: 6380, database: 0, username: null, tls_mode: "disabled", }, }, ]; const keyData: KeyRecord[] = [ { id: "session:42", name: "session:42", type: "hash", ttl: "13m", preview: "user profile and auth state", editable: false, value: "userId=42, role=editor, featureFlag=beta", summary: "Read-only in V1. Structured hash inspection ships before editing support to avoid unsafe partial writes.", }, { id: "cache:homepage", name: "cache:homepage", type: "string", ttl: "48s", preview: "serialized landing payload", editable: true, value: "{\"hero\":\"Redis GUI\",\"updatedAt\":\"2026-03-27T12:00:00Z\"}", summary: "String keys are editable in V1 and should refresh browser metadata after save without reconnecting.", }, { id: "jobs:failed", name: "jobs:failed", type: "list", ttl: "persistent", preview: "3 queued failure payloads", editable: false, value: "[payload-1, payload-2, payload-3]", summary: "Lists remain inspectable but read only in the first visible shell.", }, { id: "feature:enabled", name: "feature:enabled", type: "set", ttl: "1h", preview: "5 active feature flags", editable: false, value: "{search_v2, audit_log, compact_ui, qa_mode, canary_cli}", summary: "Collections keep structural hints visible so support work stays fast without raw CLI fallback.", }, ]; const databases = ["db0", "db1", "db2", "db5"]; const fallbackBootstrap: BackendBootstrap = { app_name: "Redis GUI Foundation", surface: "desktop", persistence: { connection_catalog: "not_configured", secrets: "memory_only", }, command_execution: "single_instance_enabled", key_browsing: "scan_metadata_enabled", next_backend_milestone: "value_surface_and_catalog_persistence", }; const initialConsoleHistory: ConsoleEntry[] = [ { command: "TTL cache:homepage", output: "(integer) 48", status: "ok", source: "mock", }, { command: "TYPE session:42", output: "hash", status: "ok", source: "mock", }, { command: "FLUSHALL", output: "Blocked in V1. Dangerous administrative commands are intentionally unavailable.", status: "blocked", source: "mock", }, ]; function App() { const [connections, setConnections] = useState(initialConnections); const [activeConnectionId, setActiveConnectionId] = useState(initialConnections[0].id); const [activeDb, setActiveDb] = useState(databases[0]); const [search, setSearch] = useState(""); const [selectedKeyId, setSelectedKeyId] = useState(keyData[1].id); const [draftValue, setDraftValue] = useState(keyData[1].value); const [consoleInput, setConsoleInput] = useState("GET cache:homepage"); const [consoleHistory, setConsoleHistory] = useState(initialConsoleHistory); const [bootstrap, setBootstrap] = useState(fallbackBootstrap); const [banner, setBanner] = useState("String edits stay local to the shell until the backend write contract is wired."); const [connectionDialogOpen, setConnectionDialogOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [isConnectionTestRunning, setIsConnectionTestRunning] = useState(false); const [isCommandRunning, setIsCommandRunning] = useState(false); const [isBrowseLoading, setIsBrowseLoading] = useState(false); const [isInspectorLoading, setIsInspectorLoading] = useState(false); const [isSaveRunning, setIsSaveRunning] = useState(false); const [isTtlUpdateRunning, setIsTtlUpdateRunning] = useState(false); const [copyFeedback, setCopyFeedback] = useState<"idle" | "copied" | "unavailable">("idle"); const [liveKeys, setLiveKeys] = useState([]); const [liveNextCursor, setLiveNextCursor] = useState("0"); const [liveHasMore, setLiveHasMore] = useState(false); const [selectedValueRecord, setSelectedValueRecord] = useState(null); const [ttlDraft, setTtlDraft] = useState(""); const [connectionDraft, setConnectionDraft] = useState({ name: "redis-staging-preview", host: "10.42.8.12", port: "6379", database: "0", user: "readonly", password: "", }); const deferredSearch = useDeferredValue(search); const tauriAvailable = isTauriRuntimeAvailable(); const appVersion = __APP_VERSION__; const buildMode = import.meta.env.DEV ? "dev" : "production"; const runtimeMode = tauriAvailable ? "live desktop bridge" : "browser demo fallback"; const activeConnection = connections.find((connection) => connection.id === activeConnectionId) ?? connections[0]; const demoQuery = deferredSearch.trim().toLowerCase(); const demoKeys = !demoQuery ? keyData : keyData.filter((item) => item.name.toLowerCase().includes(demoQuery)); const filteredKeys = tauriAvailable ? liveKeys : demoKeys; const draftErrors = validateConnectionDraft(connectionDraft, connections); const draftErrorList = Object.values(draftErrors); const selectedKey = filteredKeys.length === 0 ? null : filteredKeys.find((item) => item.id === selectedKeyId) ?? filteredKeys[0]; const isEditable = tauriAvailable ? selectedValueRecord?.write_capability === "replace_string" && selectedValueRecord.data.kind === "string" : selectedKey?.editable === true && selectedKey.type === "string"; const inspectorText = tauriAvailable ? formatInspectorValue(selectedValueRecord, selectedKey, isInspectorLoading) : (selectedKey?.value ?? ""); const supportNote = tauriAvailable ? buildLiveSupportNote(selectedValueRecord, selectedKey) : (selectedKey?.summary ?? `Search currently returns zero keys in ${activeDb}. This is an intentional empty state, not a backend failure.`); const ttlWriteSupported = tauriAvailable ? selectedValueRecord?.ttl_write_supported === true : selectedKey !== null; const ttlDraftError = ttlDraft.trim() ? validateTtlDraft(ttlDraft) : null; const canSubmitTtlUpdate = selectedKey !== null && ttlWriteSupported && ttlDraft.trim() !== "" && ttlDraftError === null && !isTtlUpdateRunning; const canPersistTtl = selectedKey !== null && ttlWriteSupported && !isTtlUpdateRunning && (tauriAvailable ? selectedValueRecord?.metadata.ttl.kind !== "persistent" : selectedKey?.ttl !== "persistent"); const latestConsoleEntry = consoleHistory[0] ?? null; const qaSnapshot = [ `app=${bootstrap.app_name}`, `version=${appVersion}`, `runtime=${runtimeMode}`, `build=${buildMode}`, `connection=${activeConnection.name}`, `endpoint=${formatEndpoint(activeConnection.target)}`, `database=${activeDb}`, `selectedKey=${selectedKey?.name ?? "none"}`, `selectedType=${selectedKey?.type ?? "none"}`, `selectedTtl=${selectedKey?.ttl ?? "none"}`, `browseVisible=${filteredKeys.length}${tauriAvailable && liveHasMore ? "+" : ""}`, `latestCommand=${latestConsoleEntry?.command ?? "none"}`, `latestCommandSource=${latestConsoleEntry?.source ?? "none"}`, `latestCommandStatus=${latestConsoleEntry?.status ?? "none"}`, `banner=${banner}`, ].join("\n"); useEffect(() => { if (!tauriAvailable) { startTransition(() => { setBootstrap(fallbackBootstrap); }); return; } let active = true; invoke("backend_bootstrap") .then((result) => { if (!active) { return; } startTransition(() => { setBootstrap(result); }); }) .catch(() => { if (!active) { return; } startTransition(() => { setBootstrap(fallbackBootstrap); }); }); return () => { active = false; }; }, [tauriAvailable]); useEffect(() => { if (!tauriAvailable) { startTransition(() => { setLiveKeys([]); setLiveNextCursor("0"); setLiveHasMore(false); setSelectedValueRecord(null); setDraftValue(selectedKey?.value ?? ""); setTtlDraft(""); }); return; } let active = true; const request: RedisKeyBrowseRequest = { connection: toRedisConnectionRequest(activeConnection, activeDb), cursor: "0", pattern: toRedisSearchPattern(deferredSearch), page_size: browsePageSize, }; startTransition(() => { setIsBrowseLoading(true); setLiveKeys([]); setLiveNextCursor("0"); setLiveHasMore(false); setSelectedValueRecord(null); setDraftValue(""); setTtlDraft(""); }); invoke("browse_redis_keys", { request }) .then((result) => { if (!active) { return; } const nextKeys = result.keys.map(toLiveKeyRecordFromMetadata); startTransition(() => { setLiveKeys(nextKeys); setLiveNextCursor(result.next_cursor); setLiveHasMore(result.has_more); setSelectedKeyId((current) => nextKeys.some((item) => item.id === current) ? current : (nextKeys[0]?.id ?? null), ); setIsBrowseLoading(false); }); }) .catch((error) => { if (!active) { return; } const backendError = toBackendError(error); startTransition(() => { setLiveKeys([]); setLiveNextCursor("0"); setLiveHasMore(false); setSelectedKeyId(null); setSelectedValueRecord(null); setDraftValue(""); setTtlDraft(""); setIsBrowseLoading(false); setBanner(`Live key browse failed on ${activeConnection.name} / ${activeDb}: ${formatBackendError(backendError)}.`); }); }); return () => { active = false; }; }, [activeConnectionId, activeDb, deferredSearch, tauriAvailable]); useEffect(() => { if (!tauriAvailable) { startTransition(() => { setSelectedValueRecord(null); setDraftValue(selectedKey?.value ?? ""); setTtlDraft(""); }); return; } if (!selectedKey) { startTransition(() => { setSelectedValueRecord(null); setDraftValue(""); setTtlDraft(""); setIsInspectorLoading(false); }); return; } let active = true; const request: RedisValueReadRequest = { connection: toRedisConnectionRequest(activeConnection, activeDb), key: selectedKey.name, }; startTransition(() => { setSelectedValueRecord(null); setDraftValue(""); setTtlDraft(""); setIsInspectorLoading(true); }); invoke("read_redis_value", { request }) .then((record) => { if (!active) { return; } const nextRecord = toLiveKeyRecordFromValue(record); startTransition(() => { setSelectedValueRecord(record); setLiveKeys((current) => replaceKeyRecord(current, nextRecord)); setDraftValue( record.data.kind === "string" && record.write_capability === "replace_string" ? formatRedisValueContent(record.data.value) : formatRedisValueData(record.data), ); setTtlDraft(record.metadata.ttl.kind === "expires_in_millis" ? String(record.metadata.ttl.value) : ""); setIsInspectorLoading(false); }); }) .catch((error) => { if (!active) { return; } const backendError = toBackendError(error); startTransition(() => { setSelectedValueRecord(null); setDraftValue(""); setTtlDraft(""); setIsInspectorLoading(false); setBanner(`Live value read failed for ${selectedKey.name} on ${activeConnection.name}: ${formatBackendError(backendError)}.`); }); }); return () => { active = false; }; }, [activeConnectionId, activeDb, selectedKey?.id, tauriAvailable]); const handleConnectionDraftChange = (field: keyof typeof connectionDraft) => (event: ChangeEvent) => { const value = event.target.value; setConnectionDraft((current) => ({ ...current, [field]: value, })); }; const handleSelectConnection = (connection: ConnectionProfile) => { startTransition(() => { setActiveConnectionId(connection.id); setActiveDb(formatDatabaseLabel(connection.target.database)); setSelectedKeyId(null); setBanner(`Switched workspace context to ${connection.name} on ${formatDatabaseLabel(connection.target.database)}.`); }); }; const handleSelectDatabase = (database: string) => { const nextDatabase = parseDatabaseLabel(database); startTransition(() => { setActiveDb(database); setSelectedKeyId(null); setConnections((current) => current.map((connection) => connection.id === activeConnectionId ? { ...connection, target: { ...connection.target, database: nextDatabase, }, } : connection, ), ); setBanner(`Scoped the workspace to ${database} for ${activeConnection.name}.`); }); }; const handleCreateDraftConnection = () => { if (draftErrorList.length > 0) { setBanner(`Connection draft is incomplete: ${draftErrorList[0]}`); return; } const nextDatabase = parseDatabaseInput(connectionDraft.database); const nextName = connectionDraft.name.trim(); const nextConnection: ConnectionProfile = { id: nextName, name: nextName, environment: "dev", detail: "Draft profile", status: "idle", password: connectionDraft.password, target: { host: connectionDraft.host.trim() || "127.0.0.1", port: parsePortInput(connectionDraft.port), database: nextDatabase, username: normalizeOptionalString(connectionDraft.user), tls_mode: "disabled", }, }; startTransition(() => { setConnections((current) => [nextConnection, ...current]); setActiveConnectionId(nextConnection.id); setActiveDb(formatDatabaseLabel(nextDatabase)); setSelectedKeyId(null); setBanner("A draft connection profile was added to the shell. Credentials remain memory-only."); setConnectionDialogOpen(false); }); }; const handleSaveString = async () => { if (!selectedKey) { setBanner(`Select a key in ${activeDb} before attempting a shell-level save.`); return; } if (!tauriAvailable) { setBanner(`Saved mock string value for ${selectedKey.name} in ${activeDb}. Backend persistence is not wired yet.`); return; } startTransition(() => { setIsSaveRunning(true); }); try { const result = await invoke("write_redis_value", { request: { connection: toRedisConnectionRequest(activeConnection, activeDb), key: selectedKey.name, value: { kind: "string", value: draftValue, }, } satisfies RedisValueWriteRequest, }); const nextRecord = toLiveKeyRecordFromValue(result); startTransition(() => { setSelectedValueRecord(result); setLiveKeys((current) => replaceKeyRecord(current, nextRecord)); setDraftValue( result.data.kind === "string" ? formatRedisValueContent(result.data.value) : formatRedisValueData(result.data), ); setIsSaveRunning(false); setBanner(`Saved live string value for ${selectedKey.name} in ${activeDb} and preserved the current TTL boundary.`); }); } catch (error) { const backendError = toBackendError(error); startTransition(() => { setIsSaveRunning(false); setBanner(`Live string save failed for ${selectedKey.name}: ${formatBackendError(backendError)}.`); }); } }; const handleDeleteKey = () => { if (!selectedKey) { return; } setDeleteDialogOpen(false); setBanner(`Delete confirmation completed for ${selectedKey.name} in ${activeDb}. Mutation stays mocked until a delete contract is approved.`); }; const handleApplyTtl = async () => { if (!selectedKey) { setBanner(`Select a key in ${activeDb} before attempting a TTL update.`); return; } const validationError = validateTtlDraft(ttlDraft); if (validationError) { setBanner(`TTL update is invalid: ${validationError}`); return; } if (!tauriAvailable) { setBanner(`Browser dev mode keeps TTL changes in demo fallback for ${selectedKey.name}. Use desktop runtime for a live TTL update.`); return; } startTransition(() => { setIsTtlUpdateRunning(true); }); try { const result = await invoke("update_redis_key_ttl", { request: { connection: toRedisConnectionRequest(activeConnection, activeDb), key: selectedKey.name, operation: { kind: "expires_in_millis", value: Number.parseInt(ttlDraft, 10), }, } satisfies RedisKeyTtlUpdateRequest, }); startTransition(() => { syncUpdatedMetadata(result.metadata); setTtlDraft( result.metadata.ttl.kind === "expires_in_millis" ? String(result.metadata.ttl.value) : "", ); setIsTtlUpdateRunning(false); setBanner(`Updated live TTL for ${selectedKey.name} to ${formatRedisKeyTtl(result.metadata.ttl)} in ${activeDb}.`); }); } catch (error) { const backendError = toBackendError(error); startTransition(() => { setIsTtlUpdateRunning(false); setBanner(`Live TTL update failed for ${selectedKey.name}: ${formatBackendError(backendError)}.`); }); } }; const handlePersistTtl = async () => { if (!selectedKey) { setBanner(`Select a key in ${activeDb} before attempting to remove TTL.`); return; } if (!tauriAvailable) { setBanner(`Browser dev mode keeps TTL removal in demo fallback for ${selectedKey.name}. Use desktop runtime for a live TTL change.`); return; } startTransition(() => { setIsTtlUpdateRunning(true); }); try { const result = await invoke("update_redis_key_ttl", { request: { connection: toRedisConnectionRequest(activeConnection, activeDb), key: selectedKey.name, operation: { kind: "persist", }, } satisfies RedisKeyTtlUpdateRequest, }); startTransition(() => { syncUpdatedMetadata(result.metadata); setTtlDraft(""); setIsTtlUpdateRunning(false); setBanner(`Removed TTL for ${selectedKey.name}; the key is now ${formatRedisKeyTtl(result.metadata.ttl)}.`); }); } catch (error) { const backendError = toBackendError(error); startTransition(() => { setIsTtlUpdateRunning(false); setBanner(`Removing TTL failed for ${selectedKey.name}: ${formatBackendError(backendError)}.`); }); } }; const handleRefreshInspector = async () => { if (!selectedKey) { setBanner(`No key is selected in ${activeDb}. Adjust or clear the current search pattern first.`); return; } if (!tauriAvailable) { setBanner(`Refreshed shell metadata for ${selectedKey.name} in ${activeDb}. Live value reload remains downstream of backend browse contracts.`); return; } startTransition(() => { setIsInspectorLoading(true); setSelectedValueRecord(null); setDraftValue(""); }); try { const result = await invoke("read_redis_value", { request: { connection: toRedisConnectionRequest(activeConnection, activeDb), key: selectedKey.name, } satisfies RedisValueReadRequest, }); const nextRecord = toLiveKeyRecordFromValue(result); startTransition(() => { setSelectedValueRecord(result); setLiveKeys((current) => replaceKeyRecord(current, nextRecord)); setDraftValue( result.data.kind === "string" && result.write_capability === "replace_string" ? formatRedisValueContent(result.data.value) : formatRedisValueData(result.data), ); setTtlDraft(result.metadata.ttl.kind === "expires_in_millis" ? String(result.metadata.ttl.value) : ""); setIsInspectorLoading(false); setBanner(`Refreshed live metadata and value surface for ${selectedKey.name} in ${activeDb}.`); }); } catch (error) { const backendError = toBackendError(error); startTransition(() => { setIsInspectorLoading(false); setBanner(`Live metadata refresh failed for ${selectedKey.name}: ${formatBackendError(backendError)}.`); }); } }; const handleCopyQaSnapshot = async () => { if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) { setCopyFeedback("unavailable"); setBanner("Clipboard export is unavailable in this runtime. Copy the QA snapshot text manually from the side rail."); return; } try { await navigator.clipboard.writeText(qaSnapshot); setCopyFeedback("copied"); setBanner("Copied the current QA snapshot to the clipboard for smoke evidence."); } catch { setCopyFeedback("unavailable"); setBanner("Clipboard export failed in this runtime. Copy the QA snapshot text manually from the side rail."); } }; const syncUpdatedMetadata = (metadata: RedisKeyMetadata) => { if (selectedValueRecord) { const nextRecord = { ...selectedValueRecord, metadata, }; setSelectedValueRecord(nextRecord); setLiveKeys((current) => replaceKeyRecord(current, toLiveKeyRecordFromValue(nextRecord))); return; } setLiveKeys((current) => replaceKeyRecord(current, toLiveKeyRecordFromMetadata(metadata))); }; const handleLoadMoreKeys = async () => { if (!tauriAvailable || !liveHasMore || isBrowseLoading) { return; } startTransition(() => { setIsBrowseLoading(true); }); try { const result = await invoke("browse_redis_keys", { request: { connection: toRedisConnectionRequest(activeConnection, activeDb), cursor: liveNextCursor, pattern: toRedisSearchPattern(deferredSearch), page_size: browsePageSize, } satisfies RedisKeyBrowseRequest, }); const nextKeys = result.keys.map(toLiveKeyRecordFromMetadata); startTransition(() => { setLiveKeys((current) => appendKeyRecords(current, nextKeys)); setLiveNextCursor(result.next_cursor); setLiveHasMore(result.has_more); setIsBrowseLoading(false); }); } catch (error) { const backendError = toBackendError(error); startTransition(() => { setIsBrowseLoading(false); setBanner(`Loading more keys failed on ${activeConnection.name} / ${activeDb}: ${formatBackendError(backendError)}.`); }); } }; const handleTestConnection = async () => { const connection = activeConnection; const request = toRedisConnectionRequest(connection, activeDb); startTransition(() => { setIsConnectionTestRunning(true); setConnections((current) => current.map((item) => item.id === connection.id ? { ...item, status: "checking", detail: "Live test in progress", } : item, ), ); setBanner(`Testing ${connection.name} against ${activeDb} using the current desktop contract.`); }); if (!tauriAvailable) { startTransition(() => { setConnections((current) => current.map((item) => item.id === connection.id ? { ...item, status: "idle", detail: "Demo fallback", } : item, ), ); setBanner(`Tauri runtime is unavailable in browser dev mode, so connection testing stayed in demo fallback for ${connection.name}.`); setIsConnectionTestRunning(false); }); return; } try { const result = await invoke("test_redis_connection", { request, }); startTransition(() => { setConnections((current) => current.map((item) => item.id === connection.id ? { ...item, status: "healthy", detail: result.round_trip_status, target: { ...item.target, database: result.selected_database, username: result.authenticated_as ?? item.target.username, }, } : item, ), ); setActiveDb(formatDatabaseLabel(result.selected_database)); setBanner(`Live Redis test passed for ${connection.name} on ${formatDatabaseLabel(result.selected_database)}. Round-trip status: ${result.round_trip_status}.`); setIsConnectionTestRunning(false); }); } catch (error) { const backendError = toBackendError(error); startTransition(() => { setConnections((current) => current.map((item) => item.id === connection.id ? { ...item, status: "error", detail: backendError.code, } : item, ), ); setBanner(`Live Redis test failed for ${connection.name}: ${formatBackendError(backendError)}.`); setIsConnectionTestRunning(false); }); } }; const handleConsoleSubmit = async (event: FormEvent) => { event.preventDefault(); const trimmed = consoleInput.trim(); if (!trimmed) { return; } const tokens = tokenizeCommand(trimmed); if (tokens.length === 0) { return; } const [command, ...argumentsList] = tokens; const upper = command.toUpperCase(); const blocked = upper.includes("FLUSH") || upper.includes("CONFIG") || upper.includes("SHUTDOWN"); if (blocked) { startTransition(() => { setConsoleHistory((current) => [ { command: trimmed, output: "Blocked in V1. Destructive or administrative commands remain outside the visible shell.", status: "blocked", source: "mock", }, ...current.slice(0, 4), ]); setBanner(`Blocked ${command.toUpperCase()} in ${activeDb}. Administrative commands remain outside the visible shell.`); }); return; } startTransition(() => { setIsCommandRunning(true); }); if (!tauriAvailable) { startTransition(() => { setConsoleHistory((current) => [ { command: trimmed, output: buildMockCommandOutput(command, selectedKey), status: "ok", source: "mock", }, ...current.slice(0, 4), ]); setBanner(`Tauri runtime is unavailable in browser dev mode, so ${command.toUpperCase()} ran against the visible demo data only.`); setConsoleInput(trimmed); setIsCommandRunning(false); }); return; } try { const result = await invoke("execute_redis_command", { request: { connection: toRedisConnectionRequest(activeConnection, activeDb), command, arguments: argumentsList, } satisfies RedisCommandRequest, }); startTransition(() => { setConsoleHistory((current) => [ { command: [result.command, ...result.arguments].join(" "), output: formatRedisResponse(result.response), status: "ok", source: "live", }, ...current.slice(0, 4), ]); setBanner(`Live Redis command completed on ${activeConnection.name} / ${formatDatabaseLabel(result.database)}.`); setConsoleInput(trimmed); setIsCommandRunning(false); }); } catch (error) { const backendError = toBackendError(error); startTransition(() => { setConsoleHistory((current) => [ { command: trimmed, output: formatBackendError(backendError), status: "error", source: "live", }, ...current.slice(0, 4), ]); setBanner(`Live Redis command failed on ${activeConnection.name} / ${activeDb}: ${backendError.message}.`); setConsoleInput(trimmed); setIsCommandRunning(false); }); } }; return (

{bootstrap.app_name}

Quiet desktop workspace for Redis inspection and low-risk edits

v{appVersion} {runtimeMode} {buildMode}
} label="Connection" value={activeConnection.name} /> } label="Database" value={activeDb} /> } label="Status" value={formatConnectionStatus(activeConnection)} /> } label="Build" value={`v${appVersion}`} />

{banner}