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 { isLocalSmokeFixtureConnection, localSmokeFixtureCommandPresets, localSmokeFixtureExpectedKeys, localSmokeFixtureProfileId, localSmokeFixtureSearchText, } from "./lib/local-smoke-fixture"; import { toBackendError, type BackendErrorContext, createAccentNotice, createNeutralNotice, toBackendErrorNotice, type OperatorNotice, } from "./lib/operator-notices"; import { buildQaSnapshot } from "./lib/qa-snapshot"; import { buildStructuredInspectorSections, type StructuredInspectorSection, } from "./lib/structured-inspector"; import { appendWorkspaceKeyRecords, filterWorkspaceKeys, replaceWorkspaceKeyRecord, resolveSelectedWorkspaceKey, resolveSelectedWorkspaceKeyId, } from "./lib/key-workspace-state"; import { buildInspectorEmptyStateMessage, buildKeyBrowserEmptyStateMessage, buildKeyBrowserStatusMessage, resolveKeyBrowserSearchState, } from "./lib/key-browser-search"; import { parseDemoTtlToSeconds, persistDemoKeyTtl, updateDemoKeyTtl, updateDemoStringValue, } from "./lib/demo-workspace"; 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 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 initialDemoKeys: 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 [demoKeys, setDemoKeys] = useState(initialDemoKeys); const [activeConnectionId, setActiveConnectionId] = useState(initialConnections[0].id); const [activeDb, setActiveDb] = useState(databases[0]); const [search, setSearch] = useState(""); const [selectedKeyId, setSelectedKeyId] = useState(initialDemoKeys[1].id); const [draftValue, setDraftValue] = useState(initialDemoKeys[1].value); const [consoleInput, setConsoleInput] = useState("GET cache:homepage"); const [consoleHistory, setConsoleHistory] = useState(initialConsoleHistory); const [bootstrap, setBootstrap] = useState(fallbackBootstrap); const [banner, setBanner] = useState( createNeutralNotice( "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 showNeutralBanner = (message: string) => setBanner(createNeutralNotice(message)); const showAccentBanner = (message: string) => setBanner(createAccentNotice(message)); const showBackendErrorBanner = (error: unknown, context: BackendErrorContext) => setBanner(toBackendErrorNotice(error, context)); const activeConnection = connections.find((connection) => connection.id === activeConnectionId) ?? connections[0]; const searchState = resolveKeyBrowserSearchState(search); const deferredSearchState = resolveKeyBrowserSearchState(deferredSearch); const filteredDemoKeys = filterWorkspaceKeys(demoKeys, deferredSearchState.trimmedQuery); const filteredKeys = tauriAvailable ? liveKeys : filteredDemoKeys; const draftErrors = validateConnectionDraft(connectionDraft, connections); const draftErrorList = Object.values(draftErrors); const selectedKey = resolveSelectedWorkspaceKey(filteredKeys, selectedKeyId); 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 structuredInspectorSections = tauriAvailable ? buildStructuredInspectorSections(selectedValueRecord) : []; const showStructuredInspector = selectedKey !== null && !isInspectorLoading && structuredInspectorSections.length > 0 && !isEditable; 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 localSmokeFixtureActive = isLocalSmokeFixtureConnection(activeConnection); const localSmokeFilterActive = search.trim() === localSmokeFixtureSearchText; 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 keyBrowserStatusMessage = buildKeyBrowserStatusMessage({ databaseLabel: activeDb, visibleCount: filteredKeys.length, hasMore: tauriAvailable && liveHasMore, isLoading: isBrowseLoading, search: deferredSearchState, }); const keyBrowserEmptyStateMessage = buildKeyBrowserEmptyStateMessage({ databaseLabel: activeDb, isLoading: isBrowseLoading, search: deferredSearchState, }); const inspectorEmptyStateMessage = buildInspectorEmptyStateMessage( activeDb, deferredSearchState, ); const qaSnapshot = buildQaSnapshot({ appName: bootstrap.app_name, appVersion, runtimeMode, buildMode, connectionName: activeConnection.name, endpoint: formatEndpoint(activeConnection.target), databaseLabel: activeDb, smokeFixtureActive: localSmokeFixtureActive, smokeFilter: localSmokeFilterActive ? localSmokeFixtureSearchText : search, selectedKeyName: selectedKey?.name ?? null, selectedKeyType: selectedKey?.type ?? null, selectedKeyTtl: selectedKey?.ttl ?? null, browseVisibleCount: `${filteredKeys.length}${tauriAvailable && liveHasMore ? "+" : ""}`, latestCommand: latestConsoleEntry?.command ?? null, latestCommandSource: latestConsoleEntry?.source ?? null, latestCommandStatus: latestConsoleEntry?.status ?? null, bannerMessage: banner.message, }); 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: deferredSearchState.requestPattern, 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) => resolveSelectedWorkspaceKeyId(nextKeys, current)); setIsBrowseLoading(false); }); }) .catch((error) => { if (!active) { return; } startTransition(() => { setLiveKeys([]); setLiveNextCursor("0"); setLiveHasMore(false); setSelectedKeyId(null); setSelectedValueRecord(null); setDraftValue(""); setTtlDraft(""); setIsBrowseLoading(false); showBackendErrorBanner(error, { operation: "key_browse", connectionName: activeConnection.name, databaseLabel: activeDb, }); }); }); return () => { active = false; }; }, [activeConnectionId, activeDb, deferredSearchState.requestPattern, 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) => replaceWorkspaceKeyRecord(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; } startTransition(() => { setSelectedValueRecord(null); setDraftValue(""); setTtlDraft(""); setIsInspectorLoading(false); showBackendErrorBanner(error, { operation: "value_read", connectionName: activeConnection.name, databaseLabel: activeDb, keyName: selectedKey.name, }); }); }); 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); showNeutralBanner( `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, ), ); showNeutralBanner(`Scoped the workspace to ${database} for ${activeConnection.name}.`); }); }; const handleUseLocalSmokeFixture = () => { const existingFixture = connections.find(isLocalSmokeFixtureConnection); const fixtureConnection = existingFixture ?? { id: localSmokeFixtureProfileId, name: localSmokeFixtureProfileId, environment: "local" as const, detail: "Fixture profile", status: "idle" as const, password: "", target: { host: "127.0.0.1", port: 6380, database: 0, username: null, tls_mode: "disabled" as const, }, }; startTransition(() => { if (!existingFixture) { setConnections((current) => [fixtureConnection, ...current]); } setActiveConnectionId(fixtureConnection.id); setActiveDb(formatDatabaseLabel(fixtureConnection.target.database)); setSelectedKeyId(null); setSearch(localSmokeFixtureSearchText); setConsoleInput(localSmokeFixtureCommandPresets[0].command); showAccentBanner( "Loaded the local smoke fixture profile, narrowed the browser to smoke:* keys, and primed the command tray with PING.", ); }); }; const handleFocusLocalSmokeKeys = () => { startTransition(() => { setSearch(localSmokeFixtureSearchText); setSelectedKeyId(null); showNeutralBanner( `Focused the browser on ${localSmokeFixtureSearchText} for local smoke verification in ${activeDb}.`, ); }); }; const handleApplyLocalSmokeCommandPreset = (command: string) => { startTransition(() => { setConsoleInput(command); showNeutralBanner( `Loaded ${command} into the command tray so QA can execute the next safe smoke step without retyping.`, ); }); }; const handleCreateDraftConnection = () => { if (draftErrorList.length > 0) { showNeutralBanner(`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); showAccentBanner( "A draft connection profile was added to the shell. Credentials remain memory-only.", ); setConnectionDialogOpen(false); }); }; const handleSaveString = async () => { if (!selectedKey) { showNeutralBanner(`Select a key in ${activeDb} before attempting a shell-level save.`); return; } if (!tauriAvailable) { startTransition(() => { setDemoKeys((current) => updateDemoStringValue(current, selectedKey.name, draftValue)); showNeutralBanner( `Saved session-local mock string value for ${selectedKey.name} in ${activeDb}. Backend persistence is still unavailable in browser demo mode.`, ); }); 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) => replaceWorkspaceKeyRecord(current, nextRecord)); setDraftValue( result.data.kind === "string" ? formatRedisValueContent(result.data.value) : formatRedisValueData(result.data), ); setIsSaveRunning(false); showAccentBanner( `Saved live string value for ${selectedKey.name} in ${activeDb} and preserved the current TTL boundary.`, ); }); } catch (error) { startTransition(() => { setIsSaveRunning(false); showBackendErrorBanner(error, { operation: "value_write", connectionName: activeConnection.name, databaseLabel: activeDb, keyName: selectedKey.name, }); }); } }; const handleDeleteKey = () => { if (!selectedKey) { return; } setDeleteDialogOpen(false); showNeutralBanner( `Delete confirmation completed for ${selectedKey.name} in ${activeDb}. Mutation stays mocked until a delete contract is approved.`, ); }; const handleApplyTtl = async () => { if (!selectedKey) { showNeutralBanner(`Select a key in ${activeDb} before attempting a TTL update.`); return; } const validationError = validateTtlDraft(ttlDraft); if (validationError) { showNeutralBanner(`TTL update is invalid: ${validationError}`); return; } if (!tauriAvailable) { startTransition(() => { setDemoKeys((current) => updateDemoKeyTtl(current, selectedKey.name, Number.parseInt(ttlDraft, 10)), ); showNeutralBanner( `Updated session-local mock TTL for ${selectedKey.name} in ${activeDb}. 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: "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); showAccentBanner( `Updated live TTL for ${selectedKey.name} to ${formatRedisKeyTtl(result.metadata.ttl)} in ${activeDb}.`, ); }); } catch (error) { startTransition(() => { setIsTtlUpdateRunning(false); showBackendErrorBanner(error, { operation: "ttl_update", connectionName: activeConnection.name, databaseLabel: activeDb, keyName: selectedKey.name, }); }); } }; const handlePersistTtl = async () => { if (!selectedKey) { showNeutralBanner(`Select a key in ${activeDb} before attempting to remove TTL.`); return; } if (!tauriAvailable) { startTransition(() => { setDemoKeys((current) => persistDemoKeyTtl(current, selectedKey.name)); setTtlDraft(""); showNeutralBanner( `Removed session-local mock TTL for ${selectedKey.name} in ${activeDb}. 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); showAccentBanner( `Removed TTL for ${selectedKey.name}; the key is now ${formatRedisKeyTtl(result.metadata.ttl)}.`, ); }); } catch (error) { startTransition(() => { setIsTtlUpdateRunning(false); showBackendErrorBanner(error, { operation: "ttl_remove", connectionName: activeConnection.name, databaseLabel: activeDb, keyName: selectedKey.name, }); }); } }; const handleRefreshInspector = async () => { if (!selectedKey) { showNeutralBanner( `No key is selected in ${activeDb}. Adjust or clear the current search pattern first.`, ); return; } if (!tauriAvailable) { showNeutralBanner( `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) => replaceWorkspaceKeyRecord(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); showAccentBanner( `Refreshed live metadata and value surface for ${selectedKey.name} in ${activeDb}.`, ); }); } catch (error) { startTransition(() => { setIsInspectorLoading(false); showBackendErrorBanner(error, { operation: "inspector_refresh", connectionName: activeConnection.name, databaseLabel: activeDb, keyName: selectedKey.name, }); }); } }; const handleCopyQaSnapshot = async () => { if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) { setCopyFeedback("unavailable"); showNeutralBanner( "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"); showAccentBanner("Copied the current QA snapshot to the clipboard for smoke evidence."); } catch { setCopyFeedback("unavailable"); showNeutralBanner( "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) => replaceWorkspaceKeyRecord(current, toLiveKeyRecordFromValue(nextRecord)), ); return; } setLiveKeys((current) => replaceWorkspaceKeyRecord(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: deferredSearchState.requestPattern, page_size: browsePageSize, } satisfies RedisKeyBrowseRequest, }); const nextKeys = result.keys.map(toLiveKeyRecordFromMetadata); startTransition(() => { setLiveKeys((current) => appendWorkspaceKeyRecords(current, nextKeys)); setLiveNextCursor(result.next_cursor); setLiveHasMore(result.has_more); setIsBrowseLoading(false); }); } catch (error) { startTransition(() => { setIsBrowseLoading(false); showBackendErrorBanner(error, { operation: "key_browse", connectionName: activeConnection.name, databaseLabel: activeDb, }); }); } }; 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, ), ); showNeutralBanner( `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, ), ); showNeutralBanner( `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)); showAccentBanner( `Live Redis test passed for ${connection.name} on ${formatDatabaseLabel(result.selected_database)}. Round-trip status: ${result.round_trip_status}.`, ); setIsConnectionTestRunning(false); }); } catch (error) { startTransition(() => { setConnections((current) => current.map((item) => item.id === connection.id ? { ...item, status: "error", detail: formatBackendErrorCodeLabel(toBackendError(error).code), } : item, ), ); showBackendErrorBanner(error, { operation: "connection_test", connectionName: connection.name, databaseLabel: activeDb, }); 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), ]); showNeutralBanner( `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), ]); showNeutralBanner( `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), ]); showAccentBanner( `Live Redis command completed on ${activeConnection.name} / ${formatDatabaseLabel(result.database)}.`, ); setConsoleInput(trimmed); setIsCommandRunning(false); }); } catch (error) { startTransition(() => { setConsoleHistory((current) => [ { command: trimmed, output: toBackendErrorNotice(error, { operation: "command_execution", connectionName: activeConnection.name, databaseLabel: activeDb, commandName: command, }).message, status: "error", source: "live", }, ...current.slice(0, 4), ]); showBackendErrorBanner(error, { operation: "command_execution", connectionName: activeConnection.name, databaseLabel: activeDb, commandName: command, }); 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.message}