@yejiming/dsh-data-agent 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["useRef","useState","css","StateDot","Modal"],"sources":["../src/client/persistence.ts","../src/client/DataAgentWorkbench.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Connection-config persistence for the database workbench. The most recent\n * successful connection (type/host/port/user/database/password) is kept in\n * localStorage under one key so remounts and restarts can restore the form\n * and auto-reconnect (the server-side connection store stays in-memory).\n *\n * Security note: the password is persisted in PLAIN TEXT by explicit user\n * decision (local single-user scenario) — see README 安全说明. The storage\n * key is versioned so a future shape change can migrate or ignore old data.\n * @module @yejiming/dsh-data-agent/persistence\n */\n\nimport type { DatabaseType } from './DataAgentWorkbench.tsx'\n\n/** localStorage key holding the most recent connection configuration. */\nexport const CONNECTION_STORAGE_KEY = 'dsh-data-agent.connection.v1'\n\n/** The persisted connection configuration. */\nexport interface SavedConnection {\n type: DatabaseType\n host?: string\n port?: number\n user?: string\n database: string\n /** Present only when the user explicitly opted in to persist the password. */\n password?: string\n /** Opt-in flag; when true, {@link saveConnection} may write `password`. */\n persistPassword?: boolean\n /** Diagnostic timestamp of the save. */\n savedAt: string\n}\n\n/** Runtime storage face (injectable for tests). */\nexport interface StorageLike {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\n/** The default storage face (localStorage; unavailable → degraded no-op). */\nfunction defaultStorage(): StorageLike | undefined {\n try {\n if (typeof localStorage !== 'undefined') {\n const probe = '__dsh_probe__'\n localStorage.setItem(probe, '1')\n localStorage.removeItem(probe)\n return localStorage\n }\n } catch {\n // localStorage disabled (privacy mode, sandboxed frame): degrade silently.\n }\n return undefined\n}\n\n/** Validate one parsed storage value into a SavedConnection (or null). */\nfunction parseSaved(value: unknown): SavedConnection | null {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return null\n const candidate = value as Record<string, unknown>\n const type = candidate.type\n if (type !== 'mysql' && type !== 'postgres' && type !== 'sqlite'\n && type !== 'oracle' && type !== 'hive' && type !== 'impala') {\n return null\n }\n const database = candidate.database\n // 草稿语义:database 允许为空串(用户可能只填了部分字段就切换会话)。\n if (typeof database !== 'string') return null\n const saved: SavedConnection = { type, database, savedAt: typeof candidate.savedAt === 'string' ? candidate.savedAt : '' }\n if (typeof candidate.host === 'string') saved.host = candidate.host\n if (typeof candidate.port === 'number' && Number.isInteger(candidate.port)) saved.port = candidate.port\n if (typeof candidate.user === 'string') saved.user = candidate.user\n // Legacy records may carry a password; strip it unless the opt-in flag is set\n // (a persisted password only survives when persistPassword was explicitly true).\n const persistPassword = candidate.persistPassword === true\n if (persistPassword) saved.persistPassword = true\n if (persistPassword && typeof candidate.password === 'string') saved.password = candidate.password\n return saved\n}\n\n/** Save one connection configuration (best-effort; storage failures degrade silently). */\nexport function saveConnection(connection: SavedConnection, storage: StorageLike | undefined = defaultStorage()): void {\n if (storage === undefined) return\n try {\n const toWrite: SavedConnection = { ...connection }\n // Password is opt-in only; strip it unless persistPassword is explicitly set.\n if (toWrite.persistPassword !== true) delete toWrite.password\n storage.setItem(CONNECTION_STORAGE_KEY, JSON.stringify(toWrite))\n } catch {\n // Quota / serialization failure: degrade silently, the UI stays usable.\n }\n}\n\n/** Load the saved connection configuration; null when absent or malformed. */\nexport function loadConnection(storage: StorageLike | undefined = defaultStorage()): SavedConnection | null {\n if (storage === undefined) return null\n try {\n const raw = storage.getItem(CONNECTION_STORAGE_KEY)\n if (raw === null) return null\n return parseSaved(JSON.parse(raw))\n } catch {\n return null\n }\n}\n\n/** Remove the saved connection configuration. */\nexport function clearConnection(storage: StorageLike | undefined = defaultStorage()): void {\n if (storage === undefined) return\n try {\n storage.removeItem(CONNECTION_STORAGE_KEY)\n } catch {\n // Degrade silently.\n }\n}\n","/**\n * The database workbench: connection config (collapsible after connect),\n * a browse button that opens the schema explorer Modal, and the SQL command\n * box, rendered into the composer input dock (the strip ABOVE the input bar)\n * for data-agent sessions.\n *\n * Layout is phase-driven by the conversation root's `data-phase` attribute:\n * - hero (blank session): the workbench is a full-width stacked strip above\n * the input bar (which stays at the bottom);\n * - active (conversation started): the workbench becomes a fixed left rail\n * (measured from the conversation column), the chat records and the input\n * bar shift right via the `da-split` CSS rules; if measurement is\n * unavailable the workbench falls back to a docked bottom panel.\n *\n * Interaction model:\n * - after a successful connect the connection form collapses into a summary\n * row (click 连接配置 to expand the readonly form again);\n * - the schema explorer lives in a Modal (ui-primitives) opened by the\n * 库表 button; a single click on a database toggles its table list in a\n * file-explorer style tree (folder rows with chevrons, indented table rows\n * with guide lines, the whole tree scrolls inside the column);\n * - clicking a table loads its columns into the Modal's structure panel.\n *\n * Non-data-agent sessions render null — zero impact on ordinary sessions.\n * Connection state lives on the server (the dataAgentConnections store), so\n * remounts never lose it — this component mirrors `/status` on mount.\n */\nimport { useEffect, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { Modal, StateDot } from '@deepseek-ai/dsh-client-ui-primitives'\n// Type-only: pulls the ui-conversation slot declarations (conversation.input.dock)\n// and the framework-standard view props into this program.\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport {\n loadConnection,\n saveConnection,\n type SavedConnection,\n} from './persistence.ts'\nimport css from './DataAgentWorkbench.module.css'\n\n/** The plugin's preset id, matching the installed agent preset directory. */\nconst DATA_AGENT_PRESET = 'data-agent'\n\n/** 16×16 stroke icons drawn inline (the primitives package does not export icon atoms). */\nfunction Icon({ className, children, size = 14 }: { className?: string; children: ReactNode; size?: number }) {\n return (\n <svg className={className} width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n {children}\n </svg>\n )\n}\n\n/** Database cylinder: section header of the connection form. */\nfunction DatabaseIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <ellipse cx=\"8\" cy=\"4\" rx=\"5.5\" ry=\"2.1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M2.5 4V12C2.5 13.16 4.96 14.1 8 14.1C11.04 14.1 13.5 13.16 13.5 12V4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M2.5 8C2.5 9.16 4.96 10.1 8 10.1C11.04 10.1 13.5 9.16 13.5 8\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </Icon>\n )\n}\n\n/** Table grid: browse row + table rows in the tree. */\nfunction TableIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <rect x=\"2\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M2 6.5H14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M6.5 6.5V13\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </Icon>\n )\n}\n\n/** Folder: schema rows in the tree. */\nfunction FolderIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <path\n d=\"M1.8 4.6C1.8 4.05 2.25 3.6 2.8 3.6H5.9L7.1 5.1H13.2C13.75 5.1 14.2 5.55 14.2 6.1V11.4C14.2 11.95 13.75 12.4 13.2 12.4H2.8C2.25 12.4 1.8 11.95 1.8 11.4V4.6Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n />\n </Icon>\n )\n}\n\n/** Terminal prompt: section header of the SQL box. */\nfunction TerminalIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <rect x=\"1.5\" y=\"2.5\" width=\"13\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M4.5 6L6.5 8L4.5 10\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M8 10.5H11.2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </Icon>\n )\n}\n\n/** Chevron: tree expand indicator (rotates 90° when open). */\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4.5 2.5L8 6L4.5 9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/** Alert triangle: error bar heading. */\nfunction AlertIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <path d=\"M8 2.2L14.2 13H1.8L8 2.2Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.4V9.2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11\" r=\"0.9\" fill=\"currentColor\" />\n </Icon>\n )\n}\n\n/** Play triangle: SQL run button. */\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3.4 2.1C3.4 1.66 3.88 1.4 4.26 1.62L9.9 5.02C10.26 5.23 10.26 5.77 9.9 5.98L4.26 9.38C3.88 9.6 3.4 9.34 3.4 8.9V2.1Z\" />\n </svg>\n )\n}\n\n/** Database kinds offered by the connection form. */\nexport type DatabaseType = 'mysql' | 'postgres' | 'sqlite' | 'oracle' | 'hive' | 'impala'\n\n/** The sessions-list slice the workbench needs (structural; avoids a runtime import). */\nexport interface SessionListLike {\n byId: Record<string, { agentPreset?: string }>\n}\n\n/** One described column. */\ninterface ColumnInfo {\n name: string\n type: string\n nullable?: boolean\n}\n\n/** Wire shapes of the plugin routes. */\ninterface ConnectResponse { ok: boolean; tables?: string[]; error?: string }\ninterface StatusResponse {\n connected: boolean\n summary?: {\n type: DatabaseType\n host?: string\n port?: number\n user?: string\n database: string\n readonly?: boolean\n tables?: string[]\n }\n}\ninterface SchemasResponse { ok: boolean; schemas?: string[]; error?: string }\ninterface TablesResponse { ok: boolean; tables?: string[]; error?: string }\ninterface DescribeResponse { ok: boolean; columns?: ColumnInfo[]; error?: string }\ninterface QueryResponse {\n ok: boolean\n result?: { exitCode: number | null; stdout: string; stderr: string; truncated: boolean }\n error?: string\n}\n\n/** Registration-side business face: the sessions-list observable becomes `useSessions`. */\nexport interface DataAgentWorkbenchInjected {\n hooks: {\n sessions: {\n getSnapshot(): SessionListLike\n subscribe(fn: () => void): () => void\n }\n }\n}\n\n/** The workbench's full component props: the dock seat + the locale seat + the injected sessions hook. */\nexport type DataAgentWorkbenchProps =\n PropsRuntime<'conversation.input.dock'>\n & PropsLocale<'data-agent'>\n & InjectFace<DataAgentWorkbenchInjected>\n\n/** The conversation column's phase attribute value while the session is blank. */\nfunction isHeroPhase(element: HTMLElement | null): boolean {\n return element?.getAttribute('data-phase') === 'hero'\n}\n\n/**\n * 开始对话后(active 布局)左栏工作台相对会话列顶部的下移偏移(px):\n * 让工作台避开会话头部区域、整体往下沉一些,顶部露出对话记录。\n */\nconst RAIL_TOP_OFFSET = 96\n\n/** Default port per type (used to fill the form from a saved connection). */\nfunction defaultPortOf(type: DatabaseType): string {\n switch (type) {\n case 'postgres': return '5432'\n case 'oracle': return '1521'\n case 'hive': return '10000'\n case 'impala': return '21050'\n case 'sqlite': return ''\n case 'mysql': return '3306'\n }\n}\n\n/** Run one /connect request (shared by the form connect and mount auto-reconnect). */\nasync function performConnect(sessionId: string, body: Record<string, unknown>): Promise<ConnectResponse> {\n const response = await fetch('/plugins/data-agent/connect', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sessionId, ...body }),\n })\n return response.json() as Promise<ConnectResponse>\n}\n\n/** Build the /connect payload from a saved connection. */\nfunction payloadFromSaved(saved: SavedConnection): Record<string, unknown> {\n if (saved.type === 'sqlite') return { type: saved.type, database: saved.database }\n const body: Record<string, unknown> = {\n type: saved.type,\n host: saved.host ?? '127.0.0.1',\n user: saved.user ?? '',\n database: saved.database,\n }\n if (saved.port !== undefined) body.port = saved.port\n if (saved.password !== undefined && saved.password !== '') body.password = saved.password\n return body\n}\n\n/** The database workbench body. */\nexport function DataAgentWorkbench({ sessionId, useSessions, t }: DataAgentWorkbenchProps) {\n const list = useSessions(snapshot => snapshot)\n const isDataAgent = list.byId[sessionId as never]?.agentPreset === DATA_AGENT_PRESET\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n const [phase, setPhase] = useState<'hero' | 'active'>('hero')\n const [railRect, setRailRect] = useState<{ left: number; top: number; bottom: number } | null>(null)\n\n // 表单从已保存的连接配置(localStorage)惰性初始化:切换会话/刷新/重启后回填。\n const [initialSaved] = useState(loadConnection)\n const [type, setType] = useState<DatabaseType>(initialSaved?.type ?? 'mysql')\n const [host, setHost] = useState(initialSaved?.host ?? '127.0.0.1')\n const [port, setPort] = useState(\n initialSaved?.port !== undefined ? String(initialSaved.port) : defaultPortOf(initialSaved?.type ?? 'mysql'),\n )\n const [user, setUser] = useState(initialSaved?.user ?? '')\n const [password, setPassword] = useState(initialSaved?.password ?? '')\n const [rememberPassword, setRememberPassword] = useState(initialSaved?.persistPassword === true)\n const [readonly, setReadonly] = useState(false)\n const [database, setDatabase] = useState(initialSaved?.database ?? '')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [connected, setConnected] = useState(false)\n\n // Connection config Modal (form lives here now, not inline in the strip/rail).\n const [connectModalOpen, setConnectModalOpen] = useState(false)\n // Mount-time auto-reconnect in flight (from the saved connection).\n const [restoring, setRestoring] = useState(false)\n // Schema explorer Modal.\n const [schemaModalOpen, setSchemaModalOpen] = useState(false)\n\n const [schemas, setSchemas] = useState<string[]>([])\n const [activeSchema, setActiveSchema] = useState<string | null>(null)\n const [tables, setTables] = useState<string[]>([])\n const [activeTable, setActiveTable] = useState<string | null>(null)\n const [columns, setColumns] = useState<ColumnInfo[] | null>(null)\n\n const [sql, setSql] = useState('')\n const [sqlBusy, setSqlBusy] = useState(false)\n const [sqlResult, setSqlResult] = useState<string | null>(null)\n\n // Track the conversation column phase and its bounds for the left-rail\n // layout; toggle the da-split class that shifts chat + input to the right.\n useEffect(() => {\n const column = rootRef.current?.closest<HTMLElement>('[data-phase]') ?? null\n if (column === null) return\n const measure = (): void => {\n const rect = column.getBoundingClientRect()\n setRailRect({ left: rect.left, top: rect.top, bottom: window.innerHeight - rect.bottom })\n }\n const refreshPhase = (): void => { setPhase(isHeroPhase(column) ? 'hero' : 'active') }\n refreshPhase()\n measure()\n const observer = new MutationObserver(refreshPhase)\n observer.observe(column, { attributes: true, attributeFilter: ['data-phase'] })\n const resizer = new ResizeObserver(measure)\n resizer.observe(column)\n window.addEventListener('resize', measure)\n return () => {\n observer.disconnect()\n resizer.disconnect()\n window.removeEventListener('resize', measure)\n }\n }, [])\n\n // Split layout is active only for a live conversation (phase active) with\n // a measurable column; everything else stays stacked above the input.\n const split = phase === 'active' && railRect !== null\n useEffect(() => {\n const root = document.documentElement\n const splitClass = css['da-split']\n if (split && splitClass !== undefined) root.classList.add(splitClass)\n else if (splitClass !== undefined) root.classList.remove(splitClass)\n return () => { if (splitClass !== undefined) root.classList.remove(splitClass) }\n }, [split])\n\n // 草稿持久化:任何表单字段变化立即保存(含密码,用户已确认),\n // 使未连接的输入在切换会话/刷新后也能恢复。首轮跳过(初始化回填值\n // 无需重写,也避免从未输入时写入空配置)。\n const firstDraftRun = useRef(true)\n useEffect(() => {\n if (firstDraftRun.current) {\n firstDraftRun.current = false\n return\n }\n const draft: SavedConnection = {\n type,\n database,\n ...type !== 'sqlite' ? { host, user } : {},\n ...type !== 'sqlite' && port !== '' ? { port: Number(port) } : {},\n ...password !== '' ? { password } : {},\n ...rememberPassword ? { persistPassword: true } : {},\n savedAt: new Date().toISOString(),\n }\n saveConnection(draft)\n }, [type, host, port, user, database, password, rememberPassword])\n\n // Mirror the server-side connection on mount; auto-reconnect once when the\n // server store was lost (restart).\n useEffect(() => {\n let cancelled = false\n const saved = initialSaved\n setBusy(true)\n fetch(`/plugins/data-agent/status?sessionId=${encodeURIComponent(sessionId)}`)\n .then(response => response.json() as Promise<StatusResponse>)\n .then(async (body) => {\n if (cancelled) return\n if (body.connected) {\n setConnected(true)\n if (body.summary !== undefined) {\n setType(body.summary.type)\n setHost(body.summary.host ?? '')\n setPort(body.summary.port !== undefined ? String(body.summary.port) : '')\n setUser(body.summary.user ?? '')\n setDatabase(body.summary.database)\n setReadonly(body.summary.readonly === true)\n }\n const response = await fetch(`/plugins/data-agent/schemas?sessionId=${encodeURIComponent(sessionId)}`)\n const schemasBody = await response.json() as SchemasResponse\n if (!cancelled && schemasBody.ok) setSchemas(schemasBody.schemas ?? [])\n return\n }\n // Server connection lost (restart): restore with the saved config, once.\n // 草稿未完成(database 为空)时不自动重连,仅保留表单回填。\n if (saved !== null && saved.database !== '') {\n setRestoring(true)\n try {\n const result = await performConnect(sessionId, payloadFromSaved(saved))\n if (cancelled) return\n if (result.ok) {\n setConnected(true)\n setConnectModalOpen(false)\n const response = await fetch(`/plugins/data-agent/schemas?sessionId=${encodeURIComponent(sessionId)}`)\n const schemasBody = await response.json() as SchemasResponse\n if (!cancelled && schemasBody.ok) setSchemas(schemasBody.schemas ?? [])\n } else {\n setError(`连接恢复失败:${result.error ?? 'unknown error'}`)\n }\n } catch (cause) {\n if (!cancelled) {\n setError(`连接恢复失败:${cause instanceof Error ? cause.message : String(cause)}`)\n }\n } finally {\n if (!cancelled) setRestoring(false)\n }\n }\n })\n .catch(() => { /* the form stays usable; connect will surface errors */ })\n .finally(() => { if (!cancelled) setBusy(false) })\n return () => { cancelled = true }\n }, [sessionId])\n\n const sqlite = type === 'sqlite'\n\n const connect = async (): Promise<void> => {\n setBusy(true)\n setError(null)\n const body: Record<string, unknown> = { sessionId, type, readonly }\n if (sqlite) {\n body.database = database\n } else {\n body.host = host\n if (port !== '') body.port = Number(port)\n body.user = user\n body.database = database\n if (password !== '') body.password = password\n }\n try {\n const result = await performConnect(sessionId, body)\n if (result.ok) {\n setConnected(true)\n // Close the config Modal after a successful connect.\n setConnectModalOpen(false)\n const schemasResponse = await fetch(`/plugins/data-agent/schemas?sessionId=${encodeURIComponent(sessionId)}`)\n const schemasBody = await schemasResponse.json() as SchemasResponse\n if (schemasBody.ok) setSchemas(schemasBody.schemas ?? [])\n } else {\n setError(result.error ?? 'unknown error')\n }\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setBusy(false)\n }\n }\n\n const disconnect = async (): Promise<void> => {\n setBusy(true)\n setError(null)\n try {\n await fetch('/plugins/data-agent/disconnect', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sessionId }),\n })\n setConnected(false)\n setReadonly(false)\n setSchemaModalOpen(false)\n setSchemas([])\n setActiveSchema(null)\n setTables([])\n setActiveTable(null)\n setColumns(null)\n setSqlResult(null)\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setBusy(false)\n }\n }\n\n /** Toggle one schema's table list (single click; only one open at a time). */\n const toggleSchema = async (schema: string): Promise<void> => {\n if (activeSchema === schema) {\n setActiveSchema(null)\n setTables([])\n setActiveTable(null)\n setColumns(null)\n return\n }\n setActiveSchema(schema)\n setActiveTable(null)\n setColumns(null)\n setTables([])\n try {\n const response = await fetch(\n `/plugins/data-agent/tables?sessionId=${encodeURIComponent(sessionId)}&schema=${encodeURIComponent(schema)}`,\n )\n const result = await response.json() as TablesResponse\n if (result.ok) setTables(result.tables ?? [])\n else setError(result.error ?? 'unknown error')\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n }\n }\n\n const selectTable = async (table: string): Promise<void> => {\n setActiveTable(table)\n setColumns(null)\n const params = new URLSearchParams({ sessionId, table })\n if (activeSchema !== null) params.set('schema', activeSchema)\n try {\n const response = await fetch(`/plugins/data-agent/describe?${params.toString()}`)\n const result = await response.json() as DescribeResponse\n if (result.ok) setColumns(result.columns ?? [])\n else setError(result.error ?? 'unknown error')\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n }\n }\n\n const runSql = async (): Promise<void> => {\n if (sql.trim() === '') return\n setSqlBusy(true)\n setSqlResult(null)\n try {\n const response = await fetch('/plugins/data-agent/query', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sessionId, sql }),\n })\n const result = await response.json() as QueryResponse\n if (result.ok && result.result !== undefined) {\n const parts: string[] = []\n if (result.result.stdout !== '') parts.push(result.result.stdout)\n if (result.result.stderr !== '') parts.push(`[stderr]\\n${result.result.stderr}`)\n if (result.result.truncated) parts.push('… 输出超过上限,已截断')\n if (result.result.exitCode !== 0) parts.push(`[exit code: ${result.result.exitCode ?? 'signal'}]`)\n setSqlResult(parts.join('\\n'))\n } else {\n setSqlResult(`Error: ${result.error ?? 'unknown error'}`)\n }\n } catch (cause) {\n setSqlResult(`Error: ${cause instanceof Error ? cause.message : String(cause)}`)\n } finally {\n setSqlBusy(false)\n }\n }\n\n // A session not running the data-agent preset: nothing renders at all.\n if (!isDataAgent) return null\n\n const databaseLabel = sqlite\n ? t('form.database.sqlite')\n : type === 'oracle'\n ? t('form.database.oracle')\n : type === 'hive' || type === 'impala'\n ? t('form.database.hive')\n : t('form.database')\n\n const railStyle = split\n ? {\n position: 'fixed' as const,\n left: railRect!.left,\n top: railRect!.top + RAIL_TOP_OFFSET,\n bottom: railRect!.bottom,\n width: 380,\n }\n : undefined\n\n // Form fields are readonly while connected (edit requires disconnecting).\n const formDisabled = busy || connected\n\n return (\n <div\n ref={rootRef}\n className={`${css.workbench} ${split ? css.rail : phase === 'active' ? css.docked : css.strip}`}\n style={railStyle}\n >\n <div className={css.sections}>\n {connected ? (\n // ── connected summary row (config lives in a Modal now) ─────────\n <section className={css.card}>\n <div className={css.summaryRow}>\n <StateDot state=\"done\" size={8} className={css.dot} />\n <span className={css.statusOk}>{t('state.connected')}</span>\n <span className={css.summaryType}>{t(`type.${type}`)}</span>\n <span className={css.summaryDb} title={database}>{database}</span>\n <span className={css.summaryActions}>\n <button type=\"button\" className={`${css.ghost} ${css.small}`} onClick={() => setConnectModalOpen(true)}>\n {t('action.config')}\n </button>\n <button type=\"button\" className={`${css.ghost} ${css.small}`} disabled={busy} onClick={() => { void disconnect() }}>\n {t('action.disconnect')}\n </button>\n </span>\n </div>\n </section>\n ) : (\n // ── disconnected hero: a single connect entry, no inline form ────\n <section className={css.card}>\n <button type=\"button\" className={css.heroConnect} onClick={() => setConnectModalOpen(true)}>\n <DatabaseIcon className={css.heroIcon} />\n <span className={css.heroText}>\n <span className={css.heroTitle}>{t('form.hero.title')}</span>\n <span className={css.heroHint}>{t('form.hero.hint')}</span>\n </span>\n <ChevronIcon className={css.heroChevron} />\n </button>\n </section>\n )}\n\n {connected && (\n // ── schema explorer entry ───────────────────────────────────────\n <section className={css.card}>\n <button type=\"button\" className={css.browseRow} onClick={() => setSchemaModalOpen(true)}>\n <TableIcon className={css.browseIcon} />\n <span>{t('action.browse')}</span>\n <ChevronIcon className={css.browseChevron} />\n </button>\n </section>\n )}\n\n {connected && (\n <section className={css.card}>\n <div className={css.cardTitle}>\n <TerminalIcon className={css.titleIcon} />\n <span>{t('wb.sql')}</span>\n </div>\n <textarea\n className={css.sqlInput}\n value={sql}\n rows={8}\n spellCheck={false}\n placeholder={t('wb.sql.placeholder')}\n onChange={(event) => setSql(event.target.value)}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n void runSql()\n }\n }}\n />\n <div className={css.sqlActions}>\n <span className={css.shortcutHint}>{t('wb.sql.shortcut')}</span>\n <button\n type=\"button\"\n className={css.primary}\n disabled={sqlBusy || !connected || sql.trim() === ''}\n onClick={() => { void runSql() }}\n >\n <PlayIcon />\n {sqlBusy ? t('wb.sql.running') : t('wb.sql.run')}\n </button>\n </div>\n <pre className={css.sqlResult}>{sqlResult ?? t('wb.sql.empty')}</pre>\n </section>\n )}\n </div>\n\n {error !== null && !connectModalOpen && (\n <div className={css.errorBar}>\n <div className={css.errorHead}>\n <AlertIcon className={css.errorIcon} />\n <span>{t('error.title')}</span>\n </div>\n <span className={css.errorText}>{error}</span>\n </div>\n )}\n\n {schemaModalOpen && (\n <Modal\n open={schemaModalOpen}\n onClose={() => setSchemaModalOpen(false)}\n title={t('wb.modal.title')}\n closeLabel={t('action.close')}\n className={css.schemaModal}\n >\n <div className={css.modalBody}>\n <div className={css.modalCol}>\n <div className={css.modalColTitle}>\n <span>{t('wb.schemas')}</span>\n {schemas.length > 0 && <span className={css.colCount}>{schemas.length}</span>}\n </div>\n <div className={css.treeScroll}>\n {schemas.length === 0 && <div className={css.hint}>{t('wb.loading')}</div>}\n <ul className={css.tree}>\n {schemas.map(schema => (\n <li key={schema} className={css.treeNode}>\n <button\n type=\"button\"\n className={`${css.treeItem}${activeSchema === schema ? ` ${css.active}` : ''}`}\n onClick={() => { void toggleSchema(schema) }}\n >\n <ChevronIcon className={`${css.treeChevron}${activeSchema === schema ? ` ${css.open}` : ''}`} />\n <FolderIcon className={css.treeIcon} />\n <span className={css.treeName}>{schema}</span>\n {activeSchema === schema && tables.length > 0 && (\n <span className={css.treeCount}>{tables.length}</span>\n )}\n </button>\n {activeSchema === schema && (\n <div className={css.treeChildren}>\n {tables.length === 0 && <div className={css.hint}>{t('wb.empty')}</div>}\n {tables.map(table => (\n <button\n key={table}\n type=\"button\"\n className={`${css.treeItem}${activeTable === table ? ` ${css.active}` : ''}`}\n onClick={() => { void selectTable(table) }}\n >\n <TableIcon className={css.treeIcon} />\n <span className={css.treeName}>{table}</span>\n </button>\n ))}\n </div>\n )}\n </li>\n ))}\n </ul>\n </div>\n <div className={css.modalHint}>{t('wb.hint.click')}</div>\n </div>\n\n <div className={css.modalCol}>\n <div className={css.modalColTitle}>\n <span>{t('wb.columns')}{activeTable !== null && ` · ${activeTable}`}</span>\n </div>\n {columns === null ? (\n <div className={css.emptyState}>\n <TableIcon className={css.emptyStateIcon} />\n <span className={css.emptyStateText}>{t('wb.hint.click')}</span>\n </div>\n ) : (\n <div className={css.colScroll}>\n <table className={css.columnsTable}>\n <thead>\n <tr><th>name</th><th>type</th><th>null</th></tr>\n </thead>\n <tbody>\n {columns.map(column => (\n <tr key={column.name}>\n <td>{column.name}</td>\n <td className={css.typeCell}>{column.type}</td>\n <td className={css.nullCell}>{column.nullable === undefined ? '' : column.nullable ? 'YES' : 'NO'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n </div>\n </Modal>\n )}\n\n {connectModalOpen && (\n <Modal\n open={connectModalOpen}\n onClose={() => setConnectModalOpen(false)}\n title={t('form.title')}\n closeLabel={t('action.close')}\n className={css.connectModal}\n >\n <div className={css.connectModalBody}>\n <div className={css.fieldGrid}>\n <label className={css.field}>\n <span className={css.label}>{t('form.type')}</span>\n <select\n className={css.input}\n value={type}\n disabled={formDisabled}\n onChange={(event) => {\n const next = event.target.value as DatabaseType\n setType(next)\n setPort(next === 'postgres' ? '5432' : next === 'mysql' ? '3306' : next === 'oracle' ? '1521' : next === 'hive' ? '10000' : next === 'impala' ? '21050' : '')\n }}\n >\n <option value=\"mysql\">{t('type.mysql')}</option>\n <option value=\"postgres\">{t('type.postgres')}</option>\n <option value=\"sqlite\">{t('type.sqlite')}</option>\n <option value=\"oracle\">{t('type.oracle')}</option>\n <option value=\"hive\">{t('type.hive')}</option>\n <option value=\"impala\">{t('type.impala')}</option>\n </select>\n </label>\n\n {!sqlite && (\n <div className={css.fieldRow2}>\n <label className={css.field}>\n <span className={css.label}>{t('form.host')}</span>\n <input className={css.input} type=\"text\" value={host} disabled={formDisabled} onChange={(event) => setHost(event.target.value)} />\n </label>\n <label className={css.field}>\n <span className={css.label}>{t('form.port')}</span>\n <input className={css.input} type=\"number\" min={1} max={65535} value={port} disabled={formDisabled} onChange={(event) => setPort(event.target.value)} />\n </label>\n </div>\n )}\n\n {!sqlite && (\n <div className={css.fieldRow2}>\n <label className={css.field}>\n <span className={css.label}>{t('form.user')}</span>\n <input className={css.input} type=\"text\" value={user} disabled={formDisabled} onChange={(event) => setUser(event.target.value)} />\n </label>\n <label className={css.field}>\n <span className={css.label}>{t('form.password')}</span>\n <input className={css.input} type=\"password\" value={password} autoComplete=\"new-password\" disabled={formDisabled} onChange={(event) => setPassword(event.target.value)} />\n </label>\n </div>\n )}\n\n {!sqlite && (\n <label className={css.rememberRow}>\n <input\n type=\"checkbox\"\n checked={rememberPassword}\n disabled={formDisabled}\n onChange={(event) => setRememberPassword(event.target.checked)}\n />\n <span>{t('form.rememberPassword')}</span>\n <span className={css.rememberHint}>{t('form.rememberPassword.hint')}</span>\n </label>\n )}\n\n <label className={css.rememberRow}>\n <input\n type=\"checkbox\"\n checked={readonly}\n disabled={formDisabled}\n onChange={(event) => setReadonly(event.target.checked)}\n />\n <span>{t('form.readonly')}</span>\n <span className={css.rememberHint}>{t('form.readonly.hint')}</span>\n </label>\n\n <label className={css.field}>\n <span className={css.label}>{databaseLabel}</span>\n <input\n className={css.input}\n type=\"text\"\n value={database}\n placeholder={sqlite ? t('form.database.sqlite.placeholder') : undefined}\n disabled={formDisabled}\n onChange={(event) => setDatabase(event.target.value)}\n />\n </label>\n </div>\n\n <div className={css.actions}>\n {!connected ? (\n <button\n type=\"button\"\n className={css.primary}\n disabled={busy || database === '' || (!sqlite && host === '')}\n onClick={() => { void connect() }}\n >\n {restoring ? t('state.reconnecting') : busy ? t('state.checking') : t('action.connect')}\n </button>\n ) : (\n <button type=\"button\" className={css.ghost} disabled={busy} onClick={() => { void disconnect() }}>\n {t('action.disconnect')}\n </button>\n )}\n </div>\n\n {error !== null && (\n <div className={css.errorBar}>\n <div className={css.errorHead}>\n <AlertIcon className={css.errorIcon} />\n <span>{t('error.title')}</span>\n </div>\n <span className={css.errorText}>{error}</span>\n </div>\n )}\n </div>\n </Modal>\n )}\n </div>\n )\n}\n","/** `data-agent` namespace dictionaries for the database workbench. */\n\n/** Dictionary namespace owned by this plugin. */\nexport const NS = 'data-agent'\n\n/** Simplified Chinese dictionary (the key-set source of truth). */\nexport const zh = {\n 'form.title': '数据库连接',\n 'form.hero.title': '连接数据库',\n 'form.hero.hint': '连接 MySQL / PostgreSQL / SQLite 等,开始与数据 Agent 对话',\n 'form.type': '数据库类型',\n 'type.mysql': 'MySQL',\n 'type.postgres': 'PostgreSQL',\n 'type.sqlite': 'SQLite',\n 'type.oracle': 'Oracle',\n 'type.hive': 'Hive',\n 'type.impala': 'Impala',\n 'form.host': '主机',\n 'form.port': '端口',\n 'form.user': '用户名',\n 'form.password': '密码',\n 'form.rememberPassword': '记住密码',\n 'form.rememberPassword.hint': '仅勾选后才会在本机保存密码',\n 'form.readonly': '只读模式',\n 'form.readonly.hint': '仅放行查询语句,拒绝增删改、建表等写操作',\n 'form.database': '数据库名',\n 'form.database.oracle': '服务名 / SID',\n 'form.database.hive': '默认库',\n 'form.database.impala': '默认库',\n 'form.database.sqlite': '数据库文件路径',\n 'form.database.sqlite.placeholder': '/path/to/orders.db',\n 'action.connect': '连接',\n 'action.disconnect': '断开',\n 'state.connected': '已连接',\n 'state.disconnected': '未连接',\n 'state.checking': '正在检查连接…',\n 'state.reconnecting': '正在恢复连接…',\n 'wb.schemas': '库',\n 'wb.tables': '表',\n 'wb.columns': '表结构',\n 'wb.sql': 'SQL 命令',\n 'wb.sql.placeholder': '在此输入 SQL,例如 SELECT * FROM orders LIMIT 10;',\n 'wb.sql.run': '运行',\n 'wb.sql.running': '运行中…',\n 'wb.sql.shortcut': 'Ctrl / ⌘ + Enter 运行',\n 'wb.sql.empty': '-- 尚无输出 --',\n 'wb.loading': '加载中…',\n 'wb.empty': '(空)',\n 'wb.modal.title': '库表浏览',\n 'wb.hint.click': '单击库展开表 · 点击表查看结构',\n 'action.config': '连接配置',\n 'action.browse': '库表',\n 'action.close': '关闭',\n 'error.title': '操作失败',\n} satisfies Record<string, string>\n\n/** The data-agent namespace key union. */\nexport type DataAgentKey = keyof typeof zh\n\n/** English dictionary, checked complete against the zh key set. */\nexport const en = {\n 'form.title': 'Database connection',\n 'form.hero.title': 'Connect database',\n 'form.hero.hint': 'Connect MySQL / PostgreSQL / SQLite and start chatting with the data agent',\n 'form.type': 'Database type',\n 'type.mysql': 'MySQL',\n 'type.postgres': 'PostgreSQL',\n 'type.sqlite': 'SQLite',\n 'type.oracle': 'Oracle',\n 'type.hive': 'Hive',\n 'type.impala': 'Impala',\n 'form.host': 'Host',\n 'form.port': 'Port',\n 'form.user': 'User',\n 'form.password': 'Password',\n 'form.rememberPassword': 'Remember password',\n 'form.rememberPassword.hint': 'Saved locally only when checked',\n 'form.readonly': 'Read-only mode',\n 'form.readonly.hint': 'Allow read queries only; reject writes (INSERT/UPDATE/DELETE/DDL)',\n 'form.database': 'Database',\n 'form.database.oracle': 'Service name / SID',\n 'form.database.hive': 'Default database',\n 'form.database.impala': 'Default database',\n 'form.database.sqlite': 'Database file path',\n 'form.database.sqlite.placeholder': '/path/to/orders.db',\n 'action.connect': 'Connect',\n 'action.disconnect': 'Disconnect',\n 'state.connected': 'Connected',\n 'state.disconnected': 'Not connected',\n 'state.checking': 'Checking connection…',\n 'state.reconnecting': 'Restoring connection…',\n 'wb.schemas': 'Databases',\n 'wb.tables': 'Tables',\n 'wb.columns': 'Columns',\n 'wb.sql': 'SQL',\n 'wb.sql.placeholder': 'Write SQL here, e.g. SELECT * FROM orders LIMIT 10;',\n 'wb.sql.run': 'Run',\n 'wb.sql.running': 'Running…',\n 'wb.sql.shortcut': 'Ctrl / ⌘ + Enter to run',\n 'wb.sql.empty': '-- no output --',\n 'wb.loading': 'Loading…',\n 'wb.empty': '(empty)',\n 'wb.modal.title': 'Database explorer',\n 'wb.hint.click': 'Click a database to expand tables · click a table for columns',\n 'action.config': 'Connection settings',\n 'action.browse': 'Tables',\n 'action.close': 'Close',\n 'error.title': 'Operation failed',\n} satisfies Record<DataAgentKey, string>\n","/**\n * Data Agent browser half, plugin entry: registers the database workbench\n * into the composer input dock (the strip ABOVE the input bar) for\n * data-agent sessions, and the `data-agent` dictionaries. The old\n * conversation-view tab is gone — the workbench lives inside the session.\n * Connection state lives in the server-side connection store, so layout and\n * session switches never lose it — the view only mirrors what\n * `/plugins/data-agent/status` reports.\n * @module @yejiming/dsh-data-agent/client\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\n// Type-only: pulls the locale plugin's Context merge (ctx.locale) into this program.\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the ui-conversation slot declarations (conversation.input.dock)\n// and the session standard props (sessionId) into this program.\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { DataAgentWorkbench, type SessionListLike } from './DataAgentWorkbench.tsx'\nimport { NS, en, zh, type DataAgentKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** The database workbench copy. */\n 'data-agent': DataAgentKey\n }\n}\n\n/** Required services: the locale service, the slot registry, and the sessions list. */\nexport const inject = ['slots', 'locale', 'sessions']\n\n/**\n * Client plugin body: register the data-agent dictionaries and the database\n * workbench into the composer input dock. The registration rides the slot\n * service's effect wrapper, so plugin unload removes it.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'data-agent: dictionaries')\n const t = ctx.locale.bind(NS)\n ctx.inject(['slots', 'locale', 'sessions'], (scope: ClientContext) => {\n const list = scope.sessions.list\n // The sessions list is the agent-preset authority on the client: the\n // ui-agent-preset surface records `agentPreset` onto each session summary.\n const sessionsSource = {\n getSnapshot: (): SessionListLike => list.getSnapshot() as unknown as SessionListLike,\n subscribe: (fn: () => void): (() => void) => list.subscribe(fn),\n }\n // The workbench strip sits above the input bar (order 0, first entry);\n // it renders only for data-agent sessions and returns null elsewhere.\n scope.slots.inject('conversation.input.dock', () => scope.slots.register({\n name: 'conversation.input.dock',\n id: 'data-agent',\n order: 0,\n locale: NS,\n inject: () => ({ hooks: { sessions: sessionsSource } }),\n }, DataAgentWorkbench))\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["useRef","useState","css","StateDot","Modal"],"sources":["../src/client/persistence.ts","../src/client/DataAgentWorkbench.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Connection-config persistence for the database workbench. The most recent\n * successful connection (type/host/port/user/database/password) is kept in\n * localStorage under one key so remounts and restarts can restore the form\n * and auto-reconnect (the server-side connection store stays in-memory).\n *\n * Security note: the password is persisted in PLAIN TEXT by explicit user\n * decision (local single-user scenario) — see README 安全说明. The storage\n * key is versioned so a future shape change can migrate or ignore old data.\n * @module @yejiming/dsh-data-agent/persistence\n */\n\nimport type { DatabaseType } from './DataAgentWorkbench.tsx'\n\n/** localStorage key holding the most recent connection configuration. */\nexport const CONNECTION_STORAGE_KEY = 'dsh-data-agent.connection.v1'\n\n/** The persisted connection configuration. */\nexport interface SavedConnection {\n type: DatabaseType\n host?: string\n port?: number\n user?: string\n database: string\n /** Present only when the user explicitly opted in to persist the password. */\n password?: string\n /** Opt-in flag; when true, {@link saveConnection} may write `password`. */\n persistPassword?: boolean\n /** Diagnostic timestamp of the save. */\n savedAt: string\n}\n\n/** Runtime storage face (injectable for tests). */\nexport interface StorageLike {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\n/** The default storage face (localStorage; unavailable → degraded no-op). */\nfunction defaultStorage(): StorageLike | undefined {\n try {\n if (typeof localStorage !== 'undefined') {\n const probe = '__dsh_probe__'\n localStorage.setItem(probe, '1')\n localStorage.removeItem(probe)\n return localStorage\n }\n } catch {\n // localStorage disabled (privacy mode, sandboxed frame): degrade silently.\n }\n return undefined\n}\n\n/** Validate one parsed storage value into a SavedConnection (or null). */\nfunction parseSaved(value: unknown): SavedConnection | null {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return null\n const candidate = value as Record<string, unknown>\n const type = candidate.type\n if (type !== 'mysql' && type !== 'postgres' && type !== 'sqlite'\n && type !== 'oracle' && type !== 'hive' && type !== 'impala') {\n return null\n }\n const database = candidate.database\n // 草稿语义:database 允许为空串(用户可能只填了部分字段就切换会话)。\n if (typeof database !== 'string') return null\n const saved: SavedConnection = { type, database, savedAt: typeof candidate.savedAt === 'string' ? candidate.savedAt : '' }\n if (typeof candidate.host === 'string') saved.host = candidate.host\n if (typeof candidate.port === 'number' && Number.isInteger(candidate.port)) saved.port = candidate.port\n if (typeof candidate.user === 'string') saved.user = candidate.user\n // Legacy records may carry a password; strip it unless the opt-in flag is set\n // (a persisted password only survives when persistPassword was explicitly true).\n const persistPassword = candidate.persistPassword === true\n if (persistPassword) saved.persistPassword = true\n if (persistPassword && typeof candidate.password === 'string') saved.password = candidate.password\n return saved\n}\n\n/** Save one connection configuration (best-effort; storage failures degrade silently). */\nexport function saveConnection(connection: SavedConnection, storage: StorageLike | undefined = defaultStorage()): void {\n if (storage === undefined) return\n try {\n const toWrite: SavedConnection = { ...connection }\n // Password is opt-in only; strip it unless persistPassword is explicitly set.\n if (toWrite.persistPassword !== true) delete toWrite.password\n storage.setItem(CONNECTION_STORAGE_KEY, JSON.stringify(toWrite))\n } catch {\n // Quota / serialization failure: degrade silently, the UI stays usable.\n }\n}\n\n/** Load the saved connection configuration; null when absent or malformed. */\nexport function loadConnection(storage: StorageLike | undefined = defaultStorage()): SavedConnection | null {\n if (storage === undefined) return null\n try {\n const raw = storage.getItem(CONNECTION_STORAGE_KEY)\n if (raw === null) return null\n return parseSaved(JSON.parse(raw))\n } catch {\n return null\n }\n}\n\n/** Remove the saved connection configuration. */\nexport function clearConnection(storage: StorageLike | undefined = defaultStorage()): void {\n if (storage === undefined) return\n try {\n storage.removeItem(CONNECTION_STORAGE_KEY)\n } catch {\n // Degrade silently.\n }\n}\n","/**\n * The database workbench: connection config (collapsible after connect),\n * a browse button that opens the schema explorer Modal, and the SQL command\n * box, rendered into the composer input dock (the strip ABOVE the input bar)\n * for data-agent sessions.\n *\n * Layout is phase-driven by the conversation root's `data-phase` attribute:\n * - hero (blank session): the workbench is a full-width stacked strip above\n * the input bar (which stays at the bottom);\n * - active (conversation started): the workbench becomes a fixed left rail\n * (measured from the conversation column), the chat records and the input\n * bar shift right via the `da-split` CSS rules; if measurement is\n * unavailable the workbench falls back to a docked bottom panel.\n *\n * Interaction model:\n * - after a successful connect the connection form collapses into a summary\n * row (click 连接配置 to expand the readonly form again);\n * - the schema explorer lives in a Modal (ui-primitives) opened by the\n * 库表 button; a single click on a database toggles its table list in a\n * file-explorer style tree (folder rows with chevrons, indented table rows\n * with guide lines, the whole tree scrolls inside the column);\n * - clicking a table loads its columns into the Modal's structure panel.\n *\n * Non-data-agent sessions render null — zero impact on ordinary sessions.\n * Connection state lives on the server (the dataAgentConnections store), so\n * remounts never lose it — this component mirrors `/status` on mount.\n */\nimport { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { Modal, StateDot } from '@deepseek-ai/dsh-client-ui-primitives'\n// Type-only: pulls the ui-conversation slot declarations (conversation.input.dock)\n// and the framework-standard view props into this program.\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport {\n loadConnection,\n saveConnection,\n type SavedConnection,\n} from './persistence.ts'\nimport css from './DataAgentWorkbench.module.css'\n\n/** The plugin's preset id, matching the installed agent preset directory. */\nconst DATA_AGENT_PRESET = 'data-agent'\n\n/** 16×16 stroke icons drawn inline (the primitives package does not export icon atoms). */\nfunction Icon({ className, children, size = 14 }: { className?: string; children: ReactNode; size?: number }) {\n return (\n <svg className={className} width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n {children}\n </svg>\n )\n}\n\n/** Database cylinder: section header of the connection form. */\nfunction DatabaseIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <ellipse cx=\"8\" cy=\"4\" rx=\"5.5\" ry=\"2.1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M2.5 4V12C2.5 13.16 4.96 14.1 8 14.1C11.04 14.1 13.5 13.16 13.5 12V4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M2.5 8C2.5 9.16 4.96 10.1 8 10.1C11.04 10.1 13.5 9.16 13.5 8\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </Icon>\n )\n}\n\n/** Table grid: browse row + table rows in the tree. */\nfunction TableIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <rect x=\"2\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M2 6.5H14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M6.5 6.5V13\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </Icon>\n )\n}\n\n/** Folder: schema rows in the tree. */\nfunction FolderIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <path\n d=\"M1.8 4.6C1.8 4.05 2.25 3.6 2.8 3.6H5.9L7.1 5.1H13.2C13.75 5.1 14.2 5.55 14.2 6.1V11.4C14.2 11.95 13.75 12.4 13.2 12.4H2.8C2.25 12.4 1.8 11.95 1.8 11.4V4.6Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n />\n </Icon>\n )\n}\n\n/** Terminal prompt: section header of the SQL box. */\nfunction TerminalIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <rect x=\"1.5\" y=\"2.5\" width=\"13\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M4.5 6L6.5 8L4.5 10\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M8 10.5H11.2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </Icon>\n )\n}\n\n/** Chevron: tree expand indicator (rotates 90° when open). */\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4.5 2.5L8 6L4.5 9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/** Alert triangle: error bar heading. */\nfunction AlertIcon({ className }: { className?: string }) {\n return (\n <Icon className={className}>\n <path d=\"M8 2.2L14.2 13H1.8L8 2.2Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.4V9.2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11\" r=\"0.9\" fill=\"currentColor\" />\n </Icon>\n )\n}\n\n/** Play triangle: SQL run button. */\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg className={className} width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3.4 2.1C3.4 1.66 3.88 1.4 4.26 1.62L9.9 5.02C10.26 5.23 10.26 5.77 9.9 5.98L4.26 9.38C3.88 9.6 3.4 9.34 3.4 8.9V2.1Z\" />\n </svg>\n )\n}\n\n/** Database kinds offered by the connection form. */\nexport type DatabaseType = 'mysql' | 'postgres' | 'sqlite' | 'oracle' | 'hive' | 'impala'\n\n/** The sessions-list slice the workbench needs (structural; avoids a runtime import). */\nexport interface SessionListLike {\n byId: Record<string, { agentPreset?: string }>\n}\n\n/** One described column. */\ninterface ColumnInfo {\n name: string\n type: string\n nullable?: boolean\n}\n\n/** Wire shapes of the plugin routes. */\ninterface ConnectResponse { ok: boolean; tables?: string[]; error?: string }\ninterface StatusResponse {\n connected: boolean\n summary?: {\n type: DatabaseType\n host?: string\n port?: number\n user?: string\n database: string\n readonly?: boolean\n tables?: string[]\n }\n}\ninterface SchemasResponse { ok: boolean; schemas?: string[]; error?: string }\ninterface TablesResponse { ok: boolean; tables?: string[]; error?: string }\ninterface DescribeResponse { ok: boolean; columns?: ColumnInfo[]; error?: string }\ninterface QueryResponse {\n ok: boolean\n result?: { exitCode: number | null; stdout: string; stderr: string; truncated: boolean }\n error?: string\n}\n\n/** Registration-side business face: the sessions-list observable becomes `useSessions`. */\nexport interface DataAgentWorkbenchInjected {\n hooks: {\n sessions: {\n getSnapshot(): SessionListLike\n subscribe(fn: () => void): () => void\n }\n }\n}\n\n/** The workbench's full component props: the dock seat + the locale seat + the injected sessions hook. */\nexport type DataAgentWorkbenchProps =\n PropsRuntime<'conversation.input.dock'>\n & PropsLocale<'data-agent'>\n & InjectFace<DataAgentWorkbenchInjected>\n\n/** The conversation column's phase attribute value while the session is blank. */\nfunction isHeroPhase(element: HTMLElement | null): boolean {\n return element?.getAttribute('data-phase') === 'hero'\n}\n\n/**\n * 开始对话后(active 布局)左栏工作台相对会话列顶部的下移偏移(px):\n * 让工作台避开会话头部区域、整体往下沉一些,顶部露出对话记录。\n */\nconst RAIL_TOP_OFFSET = 96\n\n/** Default port per type (used to fill the form from a saved connection). */\nfunction defaultPortOf(type: DatabaseType): string {\n switch (type) {\n case 'postgres': return '5432'\n case 'oracle': return '1521'\n case 'hive': return '10000'\n case 'impala': return '21050'\n case 'sqlite': return ''\n case 'mysql': return '3306'\n }\n}\n\n/** Run one /connect request (shared by the form connect and mount auto-reconnect). */\nasync function performConnect(sessionId: string, body: Record<string, unknown>): Promise<ConnectResponse> {\n const response = await fetch('/plugins/data-agent/connect', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sessionId, ...body }),\n })\n return response.json() as Promise<ConnectResponse>\n}\n\n/** Build the /connect payload from a saved connection. */\nfunction payloadFromSaved(saved: SavedConnection): Record<string, unknown> {\n if (saved.type === 'sqlite') return { type: saved.type, database: saved.database }\n const body: Record<string, unknown> = {\n type: saved.type,\n host: saved.host ?? '127.0.0.1',\n user: saved.user ?? '',\n database: saved.database,\n }\n if (saved.port !== undefined) body.port = saved.port\n if (saved.password !== undefined && saved.password !== '') body.password = saved.password\n return body\n}\n\n/** The database workbench body. */\nexport function DataAgentWorkbench({ sessionId, useSessions, t }: DataAgentWorkbenchProps) {\n const list = useSessions(snapshot => snapshot)\n const isDataAgent = list.byId[sessionId as never]?.agentPreset === DATA_AGENT_PRESET\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n const [phase, setPhase] = useState<'hero' | 'active'>('hero')\n const [railRect, setRailRect] = useState<{ left: number; top: number; bottom: number } | null>(null)\n\n // 表单从已保存的连接配置(localStorage)惰性初始化:切换会话/刷新/重启后回填。\n const [initialSaved] = useState(loadConnection)\n const [type, setType] = useState<DatabaseType>(initialSaved?.type ?? 'mysql')\n const [host, setHost] = useState(initialSaved?.host ?? '127.0.0.1')\n const [port, setPort] = useState(\n initialSaved?.port !== undefined ? String(initialSaved.port) : defaultPortOf(initialSaved?.type ?? 'mysql'),\n )\n const [user, setUser] = useState(initialSaved?.user ?? '')\n const [password, setPassword] = useState(initialSaved?.password ?? '')\n const [rememberPassword, setRememberPassword] = useState(initialSaved?.persistPassword === true)\n const [readonly, setReadonly] = useState(false)\n const [database, setDatabase] = useState(initialSaved?.database ?? '')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [connected, setConnected] = useState(false)\n\n // Connection config Modal (form lives here now, not inline in the strip/rail).\n const [connectModalOpen, setConnectModalOpen] = useState(false)\n // Mount-time auto-reconnect in flight (from the saved connection).\n const [restoring, setRestoring] = useState(false)\n // Schema explorer Modal.\n const [schemaModalOpen, setSchemaModalOpen] = useState(false)\n\n const [schemas, setSchemas] = useState<string[]>([])\n const [activeSchema, setActiveSchema] = useState<string | null>(null)\n const [tables, setTables] = useState<string[]>([])\n const [activeTable, setActiveTable] = useState<string | null>(null)\n const [columns, setColumns] = useState<ColumnInfo[] | null>(null)\n\n const [sql, setSql] = useState('')\n const [sqlBusy, setSqlBusy] = useState(false)\n const [sqlResult, setSqlResult] = useState<string | null>(null)\n\n // Track the conversation column phase and its bounds for the left-rail\n // layout; toggle the da-split class that shifts chat + input to the right.\n //\n // Keyed on `isDataAgent` on purpose: the input dock mounts for every\n // session, and for non-data-agent sessions this component renders null\n // (see the gate below). A `[]` deps effect would run once on that null\n // render — rootRef.current is null, no `[data-phase]` ancestor is found,\n // and the observer never attaches, leaving the workbench stacked forever\n // even after the conversation goes active. A layout effect is used so the\n // observer attaches synchronously with the commit, and the poll below\n // self-heals against a replaced conversation root or a missed mutation.\n useLayoutEffect(() => {\n let column = rootRef.current?.closest<HTMLElement>('[data-phase]') ?? null\n const refreshPhase = (): void => {\n if (column === null) return\n setPhase((prev) => {\n const next = isHeroPhase(column) ? 'hero' : 'active'\n return next === prev ? prev : next\n })\n }\n const measure = (): void => {\n if (column === null) return\n const rect = column.getBoundingClientRect()\n const bottom = window.innerHeight - rect.bottom\n setRailRect((prev) =>\n prev !== null && prev.left === rect.left && prev.top === rect.top && prev.bottom === bottom\n ? prev\n : { left: rect.left, top: rect.top, bottom },\n )\n }\n const observer = new MutationObserver(refreshPhase)\n const resizer = new ResizeObserver(measure)\n const sync = (): void => {\n const next = rootRef.current?.closest<HTMLElement>('[data-phase]') ?? null\n if (next === null) return\n if (next !== column) {\n observer.disconnect()\n resizer.disconnect()\n column = next\n observer.observe(column, { attributes: true, attributeFilter: ['data-phase'] })\n resizer.observe(column)\n }\n refreshPhase()\n measure()\n }\n sync()\n window.addEventListener('resize', measure)\n // Self-healing poll: re-find the column (the host may replace the\n // [data-phase] node while the dock stays mounted) and re-sync the phase\n // and rail bounds even if a mutation was missed.\n const poll = window.setInterval(sync, 1000)\n return () => {\n window.clearInterval(poll)\n observer.disconnect()\n resizer.disconnect()\n window.removeEventListener('resize', measure)\n }\n }, [isDataAgent])\n\n // Split layout is active only for a live conversation (phase active) with\n // a measurable column; everything else stays stacked above the input.\n const split = phase === 'active' && railRect !== null\n // da-split toggling is layout work: flip it in the same commit that\n // switches to the rail, so chat and composer shift right synchronously.\n useLayoutEffect(() => {\n const root = document.documentElement\n const splitClass = css['da-split']\n if (split && splitClass !== undefined) root.classList.add(splitClass)\n else if (splitClass !== undefined) root.classList.remove(splitClass)\n return () => { if (splitClass !== undefined) root.classList.remove(splitClass) }\n }, [split])\n\n // 草稿持久化:任何表单字段变化立即保存(含密码,用户已确认),\n // 使未连接的输入在切换会话/刷新后也能恢复。首轮跳过(初始化回填值\n // 无需重写,也避免从未输入时写入空配置)。\n const firstDraftRun = useRef(true)\n useEffect(() => {\n if (firstDraftRun.current) {\n firstDraftRun.current = false\n return\n }\n const draft: SavedConnection = {\n type,\n database,\n ...type !== 'sqlite' ? { host, user } : {},\n ...type !== 'sqlite' && port !== '' ? { port: Number(port) } : {},\n ...password !== '' ? { password } : {},\n ...rememberPassword ? { persistPassword: true } : {},\n savedAt: new Date().toISOString(),\n }\n saveConnection(draft)\n }, [type, host, port, user, database, password, rememberPassword])\n\n // Mirror the server-side connection on mount; auto-reconnect once when the\n // server store was lost (restart).\n useEffect(() => {\n let cancelled = false\n const saved = initialSaved\n setBusy(true)\n fetch(`/plugins/data-agent/status?sessionId=${encodeURIComponent(sessionId)}`)\n .then(response => response.json() as Promise<StatusResponse>)\n .then(async (body) => {\n if (cancelled) return\n if (body.connected) {\n setConnected(true)\n if (body.summary !== undefined) {\n setType(body.summary.type)\n setHost(body.summary.host ?? '')\n setPort(body.summary.port !== undefined ? String(body.summary.port) : '')\n setUser(body.summary.user ?? '')\n setDatabase(body.summary.database)\n setReadonly(body.summary.readonly === true)\n }\n const response = await fetch(`/plugins/data-agent/schemas?sessionId=${encodeURIComponent(sessionId)}`)\n const schemasBody = await response.json() as SchemasResponse\n if (!cancelled && schemasBody.ok) setSchemas(schemasBody.schemas ?? [])\n return\n }\n // Server connection lost (restart): restore with the saved config, once.\n // 草稿未完成(database 为空)时不自动重连,仅保留表单回填。\n if (saved !== null && saved.database !== '') {\n setRestoring(true)\n try {\n const result = await performConnect(sessionId, payloadFromSaved(saved))\n if (cancelled) return\n if (result.ok) {\n setConnected(true)\n setConnectModalOpen(false)\n const response = await fetch(`/plugins/data-agent/schemas?sessionId=${encodeURIComponent(sessionId)}`)\n const schemasBody = await response.json() as SchemasResponse\n if (!cancelled && schemasBody.ok) setSchemas(schemasBody.schemas ?? [])\n } else {\n setError(`连接恢复失败:${result.error ?? 'unknown error'}`)\n }\n } catch (cause) {\n if (!cancelled) {\n setError(`连接恢复失败:${cause instanceof Error ? cause.message : String(cause)}`)\n }\n } finally {\n if (!cancelled) setRestoring(false)\n }\n }\n })\n .catch(() => { /* the form stays usable; connect will surface errors */ })\n .finally(() => { if (!cancelled) setBusy(false) })\n return () => { cancelled = true }\n }, [sessionId])\n\n const sqlite = type === 'sqlite'\n\n const connect = async (): Promise<void> => {\n setBusy(true)\n setError(null)\n const body: Record<string, unknown> = { sessionId, type, readonly }\n if (sqlite) {\n body.database = database\n } else {\n body.host = host\n if (port !== '') body.port = Number(port)\n body.user = user\n body.database = database\n if (password !== '') body.password = password\n }\n try {\n const result = await performConnect(sessionId, body)\n if (result.ok) {\n setConnected(true)\n // Close the config Modal after a successful connect.\n setConnectModalOpen(false)\n const schemasResponse = await fetch(`/plugins/data-agent/schemas?sessionId=${encodeURIComponent(sessionId)}`)\n const schemasBody = await schemasResponse.json() as SchemasResponse\n if (schemasBody.ok) setSchemas(schemasBody.schemas ?? [])\n } else {\n setError(result.error ?? 'unknown error')\n }\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setBusy(false)\n }\n }\n\n const disconnect = async (): Promise<void> => {\n setBusy(true)\n setError(null)\n try {\n await fetch('/plugins/data-agent/disconnect', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sessionId }),\n })\n setConnected(false)\n setReadonly(false)\n setSchemaModalOpen(false)\n setSchemas([])\n setActiveSchema(null)\n setTables([])\n setActiveTable(null)\n setColumns(null)\n setSqlResult(null)\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setBusy(false)\n }\n }\n\n /** Toggle one schema's table list (single click; only one open at a time). */\n const toggleSchema = async (schema: string): Promise<void> => {\n if (activeSchema === schema) {\n setActiveSchema(null)\n setTables([])\n setActiveTable(null)\n setColumns(null)\n return\n }\n setActiveSchema(schema)\n setActiveTable(null)\n setColumns(null)\n setTables([])\n try {\n const response = await fetch(\n `/plugins/data-agent/tables?sessionId=${encodeURIComponent(sessionId)}&schema=${encodeURIComponent(schema)}`,\n )\n const result = await response.json() as TablesResponse\n if (result.ok) setTables(result.tables ?? [])\n else setError(result.error ?? 'unknown error')\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n }\n }\n\n const selectTable = async (table: string): Promise<void> => {\n setActiveTable(table)\n setColumns(null)\n const params = new URLSearchParams({ sessionId, table })\n if (activeSchema !== null) params.set('schema', activeSchema)\n try {\n const response = await fetch(`/plugins/data-agent/describe?${params.toString()}`)\n const result = await response.json() as DescribeResponse\n if (result.ok) setColumns(result.columns ?? [])\n else setError(result.error ?? 'unknown error')\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n }\n }\n\n const runSql = async (): Promise<void> => {\n if (sql.trim() === '') return\n setSqlBusy(true)\n setSqlResult(null)\n try {\n const response = await fetch('/plugins/data-agent/query', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sessionId, sql }),\n })\n const result = await response.json() as QueryResponse\n if (result.ok && result.result !== undefined) {\n const parts: string[] = []\n if (result.result.stdout !== '') parts.push(result.result.stdout)\n if (result.result.stderr !== '') parts.push(`[stderr]\\n${result.result.stderr}`)\n if (result.result.truncated) parts.push('… 输出超过上限,已截断')\n if (result.result.exitCode !== 0) parts.push(`[exit code: ${result.result.exitCode ?? 'signal'}]`)\n setSqlResult(parts.join('\\n'))\n } else {\n setSqlResult(`Error: ${result.error ?? 'unknown error'}`)\n }\n } catch (cause) {\n setSqlResult(`Error: ${cause instanceof Error ? cause.message : String(cause)}`)\n } finally {\n setSqlBusy(false)\n }\n }\n\n // A session not running the data-agent preset: nothing renders at all.\n if (!isDataAgent) return null\n\n const databaseLabel = sqlite\n ? t('form.database.sqlite')\n : type === 'oracle'\n ? t('form.database.oracle')\n : type === 'hive' || type === 'impala'\n ? t('form.database.hive')\n : t('form.database')\n\n const railStyle = split\n ? {\n position: 'fixed' as const,\n left: railRect!.left,\n top: railRect!.top + RAIL_TOP_OFFSET,\n bottom: railRect!.bottom,\n width: 380,\n }\n : undefined\n\n // Form fields are readonly while connected (edit requires disconnecting).\n const formDisabled = busy || connected\n\n return (\n <div\n ref={rootRef}\n className={`${css.workbench} ${split ? css.rail : phase === 'active' ? css.docked : css.strip}`}\n style={railStyle}\n >\n <div className={css.sections}>\n {connected ? (\n // ── connected summary row (config lives in a Modal now) ─────────\n <section className={css.card}>\n <div className={css.summaryRow}>\n <StateDot state=\"done\" size={8} className={css.dot} />\n <span className={css.statusOk}>{t('state.connected')}</span>\n <span className={css.summaryType}>{t(`type.${type}`)}</span>\n <span className={css.summaryDb} title={database}>{database}</span>\n <span className={css.summaryActions}>\n <button type=\"button\" className={`${css.ghost} ${css.small}`} onClick={() => setConnectModalOpen(true)}>\n {t('action.config')}\n </button>\n <button type=\"button\" className={`${css.ghost} ${css.small}`} disabled={busy} onClick={() => { void disconnect() }}>\n {t('action.disconnect')}\n </button>\n </span>\n </div>\n </section>\n ) : (\n // ── disconnected hero: a single connect entry, no inline form ────\n <section className={css.card}>\n <button type=\"button\" className={css.heroConnect} onClick={() => setConnectModalOpen(true)}>\n <DatabaseIcon className={css.heroIcon} />\n <span className={css.heroText}>\n <span className={css.heroTitle}>{t('form.hero.title')}</span>\n <span className={css.heroHint}>{t('form.hero.hint')}</span>\n </span>\n <ChevronIcon className={css.heroChevron} />\n </button>\n </section>\n )}\n\n {connected && (\n // ── schema explorer entry ───────────────────────────────────────\n <section className={css.card}>\n <button type=\"button\" className={css.browseRow} onClick={() => setSchemaModalOpen(true)}>\n <TableIcon className={css.browseIcon} />\n <span>{t('action.browse')}</span>\n <ChevronIcon className={css.browseChevron} />\n </button>\n </section>\n )}\n\n {connected && (\n <section className={css.card}>\n <div className={css.cardTitle}>\n <TerminalIcon className={css.titleIcon} />\n <span>{t('wb.sql')}</span>\n </div>\n <textarea\n className={css.sqlInput}\n value={sql}\n rows={8}\n spellCheck={false}\n placeholder={t('wb.sql.placeholder')}\n onChange={(event) => setSql(event.target.value)}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n void runSql()\n }\n }}\n />\n <div className={css.sqlActions}>\n <span className={css.shortcutHint}>{t('wb.sql.shortcut')}</span>\n <button\n type=\"button\"\n className={css.primary}\n disabled={sqlBusy || !connected || sql.trim() === ''}\n onClick={() => { void runSql() }}\n >\n <PlayIcon />\n {sqlBusy ? t('wb.sql.running') : t('wb.sql.run')}\n </button>\n </div>\n <pre className={css.sqlResult}>{sqlResult ?? t('wb.sql.empty')}</pre>\n </section>\n )}\n </div>\n\n {error !== null && !connectModalOpen && (\n <div className={css.errorBar}>\n <div className={css.errorHead}>\n <AlertIcon className={css.errorIcon} />\n <span>{t('error.title')}</span>\n </div>\n <span className={css.errorText}>{error}</span>\n </div>\n )}\n\n {schemaModalOpen && (\n <Modal\n open={schemaModalOpen}\n onClose={() => setSchemaModalOpen(false)}\n title={t('wb.modal.title')}\n closeLabel={t('action.close')}\n className={css.schemaModal}\n >\n <div className={css.modalBody}>\n <div className={css.modalCol}>\n <div className={css.modalColTitle}>\n <span>{t('wb.schemas')}</span>\n {schemas.length > 0 && <span className={css.colCount}>{schemas.length}</span>}\n </div>\n <div className={css.treeScroll}>\n {schemas.length === 0 && <div className={css.hint}>{t('wb.loading')}</div>}\n <ul className={css.tree}>\n {schemas.map(schema => (\n <li key={schema} className={css.treeNode}>\n <button\n type=\"button\"\n className={`${css.treeItem}${activeSchema === schema ? ` ${css.active}` : ''}`}\n onClick={() => { void toggleSchema(schema) }}\n >\n <ChevronIcon className={`${css.treeChevron}${activeSchema === schema ? ` ${css.open}` : ''}`} />\n <FolderIcon className={css.treeIcon} />\n <span className={css.treeName}>{schema}</span>\n {activeSchema === schema && tables.length > 0 && (\n <span className={css.treeCount}>{tables.length}</span>\n )}\n </button>\n {activeSchema === schema && (\n <div className={css.treeChildren}>\n {tables.length === 0 && <div className={css.hint}>{t('wb.empty')}</div>}\n {tables.map(table => (\n <button\n key={table}\n type=\"button\"\n className={`${css.treeItem}${activeTable === table ? ` ${css.active}` : ''}`}\n onClick={() => { void selectTable(table) }}\n >\n <TableIcon className={css.treeIcon} />\n <span className={css.treeName}>{table}</span>\n </button>\n ))}\n </div>\n )}\n </li>\n ))}\n </ul>\n </div>\n <div className={css.modalHint}>{t('wb.hint.click')}</div>\n </div>\n\n <div className={css.modalCol}>\n <div className={css.modalColTitle}>\n <span>{t('wb.columns')}{activeTable !== null && ` · ${activeTable}`}</span>\n </div>\n {columns === null ? (\n <div className={css.emptyState}>\n <TableIcon className={css.emptyStateIcon} />\n <span className={css.emptyStateText}>{t('wb.hint.click')}</span>\n </div>\n ) : (\n <div className={css.colScroll}>\n <table className={css.columnsTable}>\n <thead>\n <tr><th>name</th><th>type</th><th>null</th></tr>\n </thead>\n <tbody>\n {columns.map(column => (\n <tr key={column.name}>\n <td>{column.name}</td>\n <td className={css.typeCell}>{column.type}</td>\n <td className={css.nullCell}>{column.nullable === undefined ? '' : column.nullable ? 'YES' : 'NO'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n </div>\n </Modal>\n )}\n\n {connectModalOpen && (\n <Modal\n open={connectModalOpen}\n onClose={() => setConnectModalOpen(false)}\n title={t('form.title')}\n closeLabel={t('action.close')}\n className={css.connectModal}\n >\n <div className={css.connectModalBody}>\n <div className={css.fieldGrid}>\n <label className={css.field}>\n <span className={css.label}>{t('form.type')}</span>\n <select\n className={css.input}\n value={type}\n disabled={formDisabled}\n onChange={(event) => {\n const next = event.target.value as DatabaseType\n setType(next)\n setPort(next === 'postgres' ? '5432' : next === 'mysql' ? '3306' : next === 'oracle' ? '1521' : next === 'hive' ? '10000' : next === 'impala' ? '21050' : '')\n }}\n >\n <option value=\"mysql\">{t('type.mysql')}</option>\n <option value=\"postgres\">{t('type.postgres')}</option>\n <option value=\"sqlite\">{t('type.sqlite')}</option>\n <option value=\"oracle\">{t('type.oracle')}</option>\n <option value=\"hive\">{t('type.hive')}</option>\n <option value=\"impala\">{t('type.impala')}</option>\n </select>\n </label>\n\n {!sqlite && (\n <div className={css.fieldRow2}>\n <label className={css.field}>\n <span className={css.label}>{t('form.host')}</span>\n <input className={css.input} type=\"text\" value={host} disabled={formDisabled} onChange={(event) => setHost(event.target.value)} />\n </label>\n <label className={css.field}>\n <span className={css.label}>{t('form.port')}</span>\n <input className={css.input} type=\"number\" min={1} max={65535} value={port} disabled={formDisabled} onChange={(event) => setPort(event.target.value)} />\n </label>\n </div>\n )}\n\n {!sqlite && (\n <div className={css.fieldRow2}>\n <label className={css.field}>\n <span className={css.label}>{t('form.user')}</span>\n <input className={css.input} type=\"text\" value={user} disabled={formDisabled} onChange={(event) => setUser(event.target.value)} />\n </label>\n <label className={css.field}>\n <span className={css.label}>{t('form.password')}</span>\n <input className={css.input} type=\"password\" value={password} autoComplete=\"new-password\" disabled={formDisabled} onChange={(event) => setPassword(event.target.value)} />\n </label>\n </div>\n )}\n\n {!sqlite && (\n <label className={css.rememberRow}>\n <input\n type=\"checkbox\"\n checked={rememberPassword}\n disabled={formDisabled}\n onChange={(event) => setRememberPassword(event.target.checked)}\n />\n <span>{t('form.rememberPassword')}</span>\n <span className={css.rememberHint}>{t('form.rememberPassword.hint')}</span>\n </label>\n )}\n\n <label className={css.rememberRow}>\n <input\n type=\"checkbox\"\n checked={readonly}\n disabled={formDisabled}\n onChange={(event) => setReadonly(event.target.checked)}\n />\n <span>{t('form.readonly')}</span>\n <span className={css.rememberHint}>{t('form.readonly.hint')}</span>\n </label>\n\n <label className={css.field}>\n <span className={css.label}>{databaseLabel}</span>\n <input\n className={css.input}\n type=\"text\"\n value={database}\n placeholder={sqlite ? t('form.database.sqlite.placeholder') : undefined}\n disabled={formDisabled}\n onChange={(event) => setDatabase(event.target.value)}\n />\n </label>\n </div>\n\n <div className={css.actions}>\n {!connected ? (\n <button\n type=\"button\"\n className={css.primary}\n disabled={busy || database === '' || (!sqlite && host === '')}\n onClick={() => { void connect() }}\n >\n {restoring ? t('state.reconnecting') : busy ? t('state.checking') : t('action.connect')}\n </button>\n ) : (\n <button type=\"button\" className={css.ghost} disabled={busy} onClick={() => { void disconnect() }}>\n {t('action.disconnect')}\n </button>\n )}\n </div>\n\n {error !== null && (\n <div className={css.errorBar}>\n <div className={css.errorHead}>\n <AlertIcon className={css.errorIcon} />\n <span>{t('error.title')}</span>\n </div>\n <span className={css.errorText}>{error}</span>\n </div>\n )}\n </div>\n </Modal>\n )}\n </div>\n )\n}\n","/** `data-agent` namespace dictionaries for the database workbench. */\n\n/** Dictionary namespace owned by this plugin. */\nexport const NS = 'data-agent'\n\n/** Simplified Chinese dictionary (the key-set source of truth). */\nexport const zh = {\n 'form.title': '数据库连接',\n 'form.hero.title': '连接数据库',\n 'form.hero.hint': '连接 MySQL / PostgreSQL / SQLite 等,开始与数据 Agent 对话',\n 'form.type': '数据库类型',\n 'type.mysql': 'MySQL',\n 'type.postgres': 'PostgreSQL',\n 'type.sqlite': 'SQLite',\n 'type.oracle': 'Oracle',\n 'type.hive': 'Hive',\n 'type.impala': 'Impala',\n 'form.host': '主机',\n 'form.port': '端口',\n 'form.user': '用户名',\n 'form.password': '密码',\n 'form.rememberPassword': '记住密码',\n 'form.rememberPassword.hint': '仅勾选后才会在本机保存密码',\n 'form.readonly': '只读模式',\n 'form.readonly.hint': '仅放行查询语句,拒绝增删改、建表等写操作',\n 'form.database': '数据库名',\n 'form.database.oracle': '服务名 / SID',\n 'form.database.hive': '默认库',\n 'form.database.impala': '默认库',\n 'form.database.sqlite': '数据库文件路径',\n 'form.database.sqlite.placeholder': '/path/to/orders.db',\n 'action.connect': '连接',\n 'action.disconnect': '断开',\n 'state.connected': '已连接',\n 'state.disconnected': '未连接',\n 'state.checking': '正在检查连接…',\n 'state.reconnecting': '正在恢复连接…',\n 'wb.schemas': '库',\n 'wb.tables': '表',\n 'wb.columns': '表结构',\n 'wb.sql': 'SQL 命令',\n 'wb.sql.placeholder': '在此输入 SQL,例如 SELECT * FROM orders LIMIT 10;',\n 'wb.sql.run': '运行',\n 'wb.sql.running': '运行中…',\n 'wb.sql.shortcut': 'Ctrl / ⌘ + Enter 运行',\n 'wb.sql.empty': '-- 尚无输出 --',\n 'wb.loading': '加载中…',\n 'wb.empty': '(空)',\n 'wb.modal.title': '库表浏览',\n 'wb.hint.click': '单击库展开表 · 点击表查看结构',\n 'action.config': '连接配置',\n 'action.browse': '库表',\n 'action.close': '关闭',\n 'error.title': '操作失败',\n} satisfies Record<string, string>\n\n/** The data-agent namespace key union. */\nexport type DataAgentKey = keyof typeof zh\n\n/** English dictionary, checked complete against the zh key set. */\nexport const en = {\n 'form.title': 'Database connection',\n 'form.hero.title': 'Connect database',\n 'form.hero.hint': 'Connect MySQL / PostgreSQL / SQLite and start chatting with the data agent',\n 'form.type': 'Database type',\n 'type.mysql': 'MySQL',\n 'type.postgres': 'PostgreSQL',\n 'type.sqlite': 'SQLite',\n 'type.oracle': 'Oracle',\n 'type.hive': 'Hive',\n 'type.impala': 'Impala',\n 'form.host': 'Host',\n 'form.port': 'Port',\n 'form.user': 'User',\n 'form.password': 'Password',\n 'form.rememberPassword': 'Remember password',\n 'form.rememberPassword.hint': 'Saved locally only when checked',\n 'form.readonly': 'Read-only mode',\n 'form.readonly.hint': 'Allow read queries only; reject writes (INSERT/UPDATE/DELETE/DDL)',\n 'form.database': 'Database',\n 'form.database.oracle': 'Service name / SID',\n 'form.database.hive': 'Default database',\n 'form.database.impala': 'Default database',\n 'form.database.sqlite': 'Database file path',\n 'form.database.sqlite.placeholder': '/path/to/orders.db',\n 'action.connect': 'Connect',\n 'action.disconnect': 'Disconnect',\n 'state.connected': 'Connected',\n 'state.disconnected': 'Not connected',\n 'state.checking': 'Checking connection…',\n 'state.reconnecting': 'Restoring connection…',\n 'wb.schemas': 'Databases',\n 'wb.tables': 'Tables',\n 'wb.columns': 'Columns',\n 'wb.sql': 'SQL',\n 'wb.sql.placeholder': 'Write SQL here, e.g. SELECT * FROM orders LIMIT 10;',\n 'wb.sql.run': 'Run',\n 'wb.sql.running': 'Running…',\n 'wb.sql.shortcut': 'Ctrl / ⌘ + Enter to run',\n 'wb.sql.empty': '-- no output --',\n 'wb.loading': 'Loading…',\n 'wb.empty': '(empty)',\n 'wb.modal.title': 'Database explorer',\n 'wb.hint.click': 'Click a database to expand tables · click a table for columns',\n 'action.config': 'Connection settings',\n 'action.browse': 'Tables',\n 'action.close': 'Close',\n 'error.title': 'Operation failed',\n} satisfies Record<DataAgentKey, string>\n","/**\n * Data Agent browser half, plugin entry: registers the database workbench\n * into the composer input dock (the strip ABOVE the input bar) for\n * data-agent sessions, and the `data-agent` dictionaries. The old\n * conversation-view tab is gone — the workbench lives inside the session.\n * Connection state lives in the server-side connection store, so layout and\n * session switches never lose it — the view only mirrors what\n * `/plugins/data-agent/status` reports.\n * @module @yejiming/dsh-data-agent/client\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\n// Type-only: pulls the locale plugin's Context merge (ctx.locale) into this program.\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the ui-conversation slot declarations (conversation.input.dock)\n// and the session standard props (sessionId) into this program.\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { DataAgentWorkbench, type SessionListLike } from './DataAgentWorkbench.tsx'\nimport { NS, en, zh, type DataAgentKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** The database workbench copy. */\n 'data-agent': DataAgentKey\n }\n}\n\n/** Required services: the locale service, the slot registry, and the sessions list. */\nexport const inject = ['slots', 'locale', 'sessions']\n\n/**\n * Client plugin body: register the data-agent dictionaries and the database\n * workbench into the composer input dock. The registration rides the slot\n * service's effect wrapper, so plugin unload removes it.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'data-agent: dictionaries')\n const t = ctx.locale.bind(NS)\n ctx.inject(['slots', 'locale', 'sessions'], (scope: ClientContext) => {\n const list = scope.sessions.list\n // The sessions list is the agent-preset authority on the client: the\n // ui-agent-preset surface records `agentPreset` onto each session summary.\n const sessionsSource = {\n getSnapshot: (): SessionListLike => list.getSnapshot() as unknown as SessionListLike,\n subscribe: (fn: () => void): (() => void) => list.subscribe(fn),\n }\n // The workbench strip sits above the input bar (order 0, first entry);\n // it renders only for data-agent sessions and returns null elsewhere.\n scope.slots.inject('conversation.input.dock', () => scope.slots.register({\n name: 'conversation.input.dock',\n id: 'data-agent',\n order: 0,\n locale: NS,\n inject: () => ({ hooks: { sessions: sessionsSource } }),\n }, DataAgentWorkbench))\n })\n}\n"],"mappings":"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"}