import { invoke } from "@tauri-apps/api/core"; import { startTransition, useDeferredValue, useEffect, useRef, useState, type ChangeEvent, type FormEvent, type ReactElement, } from "react"; import { Activity, CircleAlert, ClipboardList, Copy, Database, KeyRound, PanelLeft, Plus, 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 { buildInspectorReadabilitySummary, type InspectorFact, } from "./lib/inspector-readability"; 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 { buildDatabaseSwitcherLabels } from "./lib/database-switcher"; import { applyConnectionTestFailure, applyConnectionTestSuccess, buildConnectionSessionSummary, formatConnectionCardDetailLabel, formatConnectionStatusLabel, markConnectionTesting, } from "./lib/connection-session"; import { createDemoKeyRecord, findDuplicateKeyName, parseOptionalTtlMillis, validateAddKeyDraft, type AddKeyDraft, } from "./lib/add-key-draft"; import { buildMutationGuardDialogContent, canRemoveTtl, hasMeaningfulStringChange, hasMeaningfulTtlChange, type ComparableTtlState, type MutationGuardRuntimeMode, } from "./lib/mutation-guardrails"; 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 RedisValueCreateRequest = { connection: RedisConnectionRequest; key: string; value: { kind: "string"; value: string; }; ttl_millis: number | null; }; type RedisValueCreateResult = { record: RedisValueRecord; }; type PendingMutationGuard = | { kind: "value_write"; runtimeMode: MutationGuardRuntimeMode; connection: RedisConnectionRequest; connectionName: string; databaseLabel: string; keyName: string; currentValue: string; nextValue: string; } | { kind: "ttl_update"; runtimeMode: MutationGuardRuntimeMode; connection: RedisConnectionRequest; connectionName: string; databaseLabel: string; keyName: string; currentTtl: string; nextTtl: string; nextTtlMillis: number; } | { kind: "ttl_remove"; runtimeMode: MutationGuardRuntimeMode; connection: RedisConnectionRequest; connectionName: string; databaseLabel: string; keyName: string; currentTtl: string; }; type PendingStringWrite = Extract; type PendingTtlUpdate = Extract; type PendingTtlRemoval = Extract; 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 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", }, ]; const initialAddKeyDraft: AddKeyDraft = { name: "", value: "", ttlMillis: "", }; function App() { const [connections, setConnections] = useState(initialConnections); const [demoKeys, setDemoKeys] = useState(initialDemoKeys); const [activeConnectionId, setActiveConnectionId] = useState(initialConnections[0].id); const [activeDb, setActiveDb] = useState("db0"); 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 [addKeyDialogOpen, setAddKeyDialogOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [pendingMutation, setPendingMutation] = useState(null); const [connectionTestState, setConnectionTestState] = useState<{ connectionId: string } | null>( null, ); const [isCommandRunning, setIsCommandRunning] = useState(false); const [isBrowseLoading, setIsBrowseLoading] = useState(false); const [isInspectorLoading, setIsInspectorLoading] = useState(false); const [isSaveRunning, setIsSaveRunning] = useState(false); const [isCreateKeyRunning, setIsCreateKeyRunning] = 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 [addKeyDraft, setAddKeyDraft] = useState(initialAddKeyDraft); 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 activeConnectionIdRef = useRef(activeConnectionId); const activeConnectionNameRef = useRef(activeConnection.name); const activeDbRef = useRef(activeDb); const databaseOptions = buildDatabaseSwitcherLabels(parseDatabaseLabel(activeDb)); 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 addKeyDraftErrors = validateAddKeyDraft(addKeyDraft); const addKeyDraftErrorList = Object.values(addKeyDraftErrors); 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 ttlWriteSupported = tauriAvailable ? selectedValueRecord?.ttl_write_supported === true : selectedKey !== null; const selectedStringValue = selectedKey === null ? null : tauriAvailable ? selectedValueRecord?.data.kind === "string" ? formatRedisValueContent(selectedValueRecord.data.value) : null : selectedKey.value; const currentTtlState: ComparableTtlState | null = selectedKey === null ? null : tauriAvailable ? (selectedValueRecord?.metadata.ttl ?? null) : { kind: "display", value: selectedKey.ttl }; const inspectorReadability = buildInspectorReadabilitySummary({ databaseLabel: activeDb, runtimeMode: tauriAvailable ? "live" : "demo", selectedKey: selectedKey === null ? null : { name: selectedKey.name, type: selectedKey.type, ttl: selectedKey.ttl, }, record: selectedValueRecord, isLoading: isInspectorLoading, isEditable, ttlWriteSupported, }); const localSmokeFixtureActive = isLocalSmokeFixtureConnection(activeConnection); const isConnectionTestRunning = connectionTestState !== null; const activeConnectionTestRunning = connectionTestState?.connectionId === activeConnection.id; const otherTestingConnectionName = connectionTestState !== null && connectionTestState.connectionId !== activeConnection.id ? connections.find((connection) => connection.id === connectionTestState.connectionId)?.name ?? "another connection" : null; const connectionSessionSummary = buildConnectionSessionSummary({ connection: activeConnection, databaseLabel: activeDb, tauriAvailable, activeTestRunning: activeConnectionTestRunning, otherTestingConnectionName, }); const localSmokeFilterActive = search.trim() === localSmokeFixtureSearchText; const ttlDraftError = ttlDraft.trim() ? validateTtlDraft(ttlDraft) : null; const nextTtlMillis = ttlDraft.trim() !== "" && ttlDraftError === null ? Number.parseInt(ttlDraft, 10) : null; const nextTtlLabel = nextTtlMillis === null ? null : formatDurationFromMillis(nextTtlMillis); const hasPendingStringChanges = selectedStringValue !== null && hasMeaningfulStringChange(selectedStringValue, draftValue); const hasPendingTtlChanges = currentTtlState !== null && nextTtlMillis !== null && hasMeaningfulTtlChange(currentTtlState, nextTtlMillis); const canSubmitTtlUpdate = selectedKey !== null && ttlWriteSupported && nextTtlMillis !== null && !isTtlUpdateRunning && hasPendingTtlChanges; const canPersistTtl = selectedKey !== null && ttlWriteSupported && !isTtlUpdateRunning && currentTtlState !== null && canRemoveTtl(currentTtlState); 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 pendingMutationDialog = pendingMutation ? buildMutationGuardDialogContent(pendingMutation) : null; const pendingMutationRunning = pendingMutation === null ? false : pendingMutation.kind === "value_write" ? isSaveRunning : isTtlUpdateRunning; 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(() => { activeConnectionIdRef.current = activeConnectionId; activeConnectionNameRef.current = activeConnection.name; activeDbRef.current = activeDb; }, [activeConnectionId, activeConnection.name, activeDb]); 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 handleAddKeyDraftChange = (field: keyof AddKeyDraft) => (event: ChangeEvent) => { const value = event.target.value; setAddKeyDraft((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 handleCreateKey = async () => { const nextKeyName = addKeyDraft.name.trim(); const createContext: BackendErrorContext = { operation: "key_create", connectionName: activeConnection.name, databaseLabel: activeDb, keyName: nextKeyName || "the requested key", }; if (addKeyDraftErrorList.length > 0) { showBackendErrorBanner( { code: "invalid_connection_config", message: addKeyDraftErrorList[0], detail: null, }, createContext, ); return; } const ttlMillis = parseOptionalTtlMillis(addKeyDraft.ttlMillis); if (!tauriAvailable) { if (findDuplicateKeyName(demoKeys, nextKeyName)) { showBackendErrorBanner( { code: "already_exists", message: "Redis key creation does not overwrite an existing key.", detail: `key \`${nextKeyName}\` already exists`, }, createContext, ); return; } const nextRecord = createDemoKeyRecord({ ...addKeyDraft, name: nextKeyName, }); startTransition(() => { setDemoKeys((current) => [nextRecord, ...current]); setSearch(nextRecord.name); setSelectedKeyId(nextRecord.id); setDraftValue(nextRecord.value); setTtlDraft(ttlMillis === null ? "" : String(ttlMillis)); setAddKeyDraft(initialAddKeyDraft); setAddKeyDialogOpen(false); showAccentBanner( `Created session-local demo key ${nextRecord.name} in ${activeDb} and focused the browser on the new string entry.`, ); }); return; } startTransition(() => { setIsCreateKeyRunning(true); }); try { const result = await invoke("create_redis_value", { request: { connection: toRedisConnectionRequest(activeConnection, activeDb), key: nextKeyName, value: { kind: "string", value: addKeyDraft.value, }, ttl_millis: ttlMillis, } satisfies RedisValueCreateRequest, }); const nextRecord = toLiveKeyRecordFromValue(result.record); startTransition(() => { setSelectedValueRecord(result.record); setLiveKeys((current) => replaceWorkspaceKeyRecord(current, nextRecord)); setSearch(nextRecord.name); setSelectedKeyId(nextRecord.id); setDraftValue( result.record.data.kind === "string" ? formatRedisValueContent(result.record.data.value) : formatRedisValueData(result.record.data), ); setTtlDraft( result.record.metadata.ttl.kind === "expires_in_millis" ? String(result.record.metadata.ttl.value) : "", ); setAddKeyDraft(initialAddKeyDraft); setAddKeyDialogOpen(false); setIsCreateKeyRunning(false); showAccentBanner( `Created live string key ${nextRecord.name} in ${activeDb} and focused the browser on the new record.`, ); }); } catch (error) { startTransition(() => { setIsCreateKeyRunning(false); if (isMissingTauriCommand(error, "create_redis_value")) { showNeutralBanner( "The checked-out desktop bridge does not expose create_redis_value yet. Form state was preserved so this flow can be retried after the backend slice lands.", ); return; } showBackendErrorBanner(error, createContext); }); } }; const executeStringSave = async (mutation: PendingStringWrite) => { if (mutation.runtimeMode === "demo") { startTransition(() => { setDemoKeys((current) => updateDemoStringValue(current, mutation.keyName, mutation.nextValue), ); showNeutralBanner( `Saved session-local mock string value for ${mutation.keyName} in ${mutation.databaseLabel}. Backend persistence is still unavailable in browser demo mode.`, ); }); return; } startTransition(() => { setIsSaveRunning(true); }); try { const result = await invoke("write_redis_value", { request: { connection: mutation.connection, key: mutation.keyName, value: { kind: "string", value: mutation.nextValue, }, } 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 ${mutation.keyName} in ${mutation.databaseLabel} and preserved the current TTL boundary.`, ); }); } catch (error) { startTransition(() => { setIsSaveRunning(false); showBackendErrorBanner(error, { operation: "value_write", connectionName: mutation.connectionName, databaseLabel: mutation.databaseLabel, keyName: mutation.keyName, }); }); } }; const handleRequestSaveString = () => { if (!selectedKey) { showNeutralBanner(`Select a key in ${activeDb} before attempting a shell-level save.`); return; } if (selectedStringValue === null || !isEditable) { showNeutralBanner( `The selected key in ${activeDb} is not currently on an editable string path.`, ); return; } if (!hasPendingStringChanges) { showNeutralBanner( `No string changes are pending for ${selectedKey.name} in ${activeDb}; the draft already matches the current value.`, ); return; } startTransition(() => { setPendingMutation({ kind: "value_write", runtimeMode: tauriAvailable ? "live" : "demo", connection: toRedisConnectionRequest(activeConnection, activeDb), connectionName: activeConnection.name, databaseLabel: activeDb, keyName: selectedKey.name, currentValue: selectedStringValue, nextValue: draftValue, }); }); }; 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 executeTtlUpdate = async (mutation: PendingTtlUpdate) => { if (mutation.runtimeMode === "demo") { startTransition(() => { setDemoKeys((current) => updateDemoKeyTtl(current, mutation.keyName, mutation.nextTtlMillis), ); showNeutralBanner( `Updated session-local mock TTL for ${mutation.keyName} in ${mutation.databaseLabel}. Use desktop runtime for a live TTL change.`, ); }); return; } startTransition(() => { setIsTtlUpdateRunning(true); }); try { const result = await invoke("update_redis_key_ttl", { request: { connection: mutation.connection, key: mutation.keyName, operation: { kind: "expires_in_millis", value: mutation.nextTtlMillis, }, } 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 ${mutation.keyName} to ${formatRedisKeyTtl(result.metadata.ttl)} in ${mutation.databaseLabel}.`, ); }); } catch (error) { startTransition(() => { setIsTtlUpdateRunning(false); showBackendErrorBanner(error, { operation: "ttl_update", connectionName: mutation.connectionName, databaseLabel: mutation.databaseLabel, keyName: mutation.keyName, }); }); } }; const handleRequestTtlUpdate = () => { 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 (currentTtlState === null || nextTtlMillis === null || nextTtlLabel === null) { showNeutralBanner( `TTL state is not ready for ${selectedKey.name} in ${activeDb}. Refresh the inspector before retrying.`, ); return; } if (!hasPendingTtlChanges) { showNeutralBanner( `TTL for ${selectedKey.name} in ${activeDb} already resolves to ${nextTtlLabel}; no update was sent.`, ); return; } startTransition(() => { setPendingMutation({ kind: "ttl_update", runtimeMode: tauriAvailable ? "live" : "demo", connection: toRedisConnectionRequest(activeConnection, activeDb), connectionName: activeConnection.name, databaseLabel: activeDb, keyName: selectedKey.name, currentTtl: selectedKey.ttl, nextTtl: nextTtlLabel, nextTtlMillis, }); }); }; const executeTtlRemoval = async (mutation: PendingTtlRemoval) => { if (mutation.runtimeMode === "demo") { startTransition(() => { setDemoKeys((current) => persistDemoKeyTtl(current, mutation.keyName)); setTtlDraft(""); showNeutralBanner( `Removed session-local mock TTL for ${mutation.keyName} in ${mutation.databaseLabel}. Use desktop runtime for a live TTL change.`, ); }); return; } startTransition(() => { setIsTtlUpdateRunning(true); }); try { const result = await invoke("update_redis_key_ttl", { request: { connection: mutation.connection, key: mutation.keyName, operation: { kind: "persist", }, } satisfies RedisKeyTtlUpdateRequest, }); startTransition(() => { syncUpdatedMetadata(result.metadata); setTtlDraft(""); setIsTtlUpdateRunning(false); showAccentBanner( `Removed TTL for ${mutation.keyName}; the key is now ${formatRedisKeyTtl(result.metadata.ttl)}.`, ); }); } catch (error) { startTransition(() => { setIsTtlUpdateRunning(false); showBackendErrorBanner(error, { operation: "ttl_remove", connectionName: mutation.connectionName, databaseLabel: mutation.databaseLabel, keyName: mutation.keyName, }); }); } }; const handleRequestPersistTtl = () => { if (!selectedKey) { showNeutralBanner(`Select a key in ${activeDb} before attempting to remove TTL.`); return; } if (currentTtlState === null) { showNeutralBanner( `TTL state is not ready for ${selectedKey.name} in ${activeDb}. Refresh the inspector before retrying.`, ); return; } if (!canRemoveTtl(currentTtlState)) { showNeutralBanner( `${selectedKey.name} in ${activeDb} is already persistent; no TTL removal was sent.`, ); return; } startTransition(() => { setPendingMutation({ kind: "ttl_remove", runtimeMode: tauriAvailable ? "live" : "demo", connection: toRedisConnectionRequest(activeConnection, activeDb), connectionName: activeConnection.name, databaseLabel: activeDb, keyName: selectedKey.name, currentTtl: selectedKey.ttl, }); }); }; const handleConfirmPendingMutation = async () => { if (!pendingMutation) { return; } const mutation = pendingMutation; setPendingMutation(null); switch (mutation.kind) { case "value_write": await executeStringSave(mutation); return; case "ttl_update": await executeTtlUpdate(mutation); return; case "ttl_remove": await executeTtlRemoval(mutation); return; default: return; } }; 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 databaseLabel = activeDb; const request = toRedisConnectionRequest(connection, databaseLabel); startTransition(() => { setConnectionTestState({ connectionId: connection.id }); setConnections((current) => markConnectionTesting(current, connection.id)); showNeutralBanner( `Testing ${connection.name} against ${databaseLabel} 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}.`, ); setConnectionTestState(null); }); return; } try { const result = await invoke("test_redis_connection", { request, }); startTransition(() => { setConnections((current) => applyConnectionTestSuccess(current, connection.id, { roundTripStatus: result.round_trip_status, selectedDatabase: result.selected_database, authenticatedAs: result.authenticated_as, }), ); setConnectionTestState(null); if (activeConnectionIdRef.current === connection.id) { setActiveDb(formatDatabaseLabel(result.selected_database)); setSelectedKeyId(null); showAccentBanner( `Live Redis test passed for ${connection.name} on ${formatDatabaseLabel(result.selected_database)}. Round-trip status: ${result.round_trip_status}.`, ); return; } showNeutralBanner( `Live Redis test passed for ${connection.name}; current workspace stayed on ${activeConnectionNameRef.current} / ${activeDbRef.current}.`, ); }); } catch (error) { const errorCode = formatBackendErrorCodeLabel(toBackendError(error).code); startTransition(() => { setConnections((current) => applyConnectionTestFailure(current, connection.id, errorCode)); setConnectionTestState(null); if (activeConnectionIdRef.current === connection.id) { showBackendErrorBanner(error, { operation: "connection_test", connectionName: connection.name, databaseLabel, }); return; } showNeutralBanner( `Live Redis test failed for ${connection.name}. The current workspace stayed on ${activeConnectionNameRef.current} / ${activeDbRef.current}; reopen ${connection.name} to retry after reviewing its card status.`, ); }); } }; 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={formatConnectionStatusLabel(activeConnection)} /> } label="Build" value={`v${appVersion}`} />

{banner.message}