@yejiming/dsh-data-agent 0.0.10 → 0.0.11

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/README.en.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [中文](README.md) | **English**
4
4
 
5
5
  <p align="center">
6
- <img src="assets/dsh-data-agent-banner.png" alt="dsh-data-agent hero banner" width="100%">
6
+ <img src="assets/dsh-data-agent-banner.webp" alt="dsh-data-agent hero banner" width="100%">
7
7
  </p>
8
8
  <p align="center">
9
9
  <img src="https://img.shields.io/github/v/release/omdsh-dev/dsh-data-agent?style=flat-square" alt="Version">
@@ -34,7 +34,7 @@
34
34
 
35
35
  dsh-data-agent is a data analysis plugin for DeepSeek Harness (DSH). Connect a database and ask a business question; DSH inspects schemas, writes and runs SQL, continues the analysis from real results, and returns clear conclusions and business insights. The plugin supports both the Web UI and dsh-tui without modifying the DSH source code.
36
36
 
37
- ![Data analysis charts](assets/charts.png)
37
+ ![Data analysis charts](assets/charts.webp)
38
38
 
39
39
  ## Features
40
40
 
@@ -49,30 +49,26 @@ dsh-data-agent is a data analysis plugin for DeepSeek Harness (DSH). Connect a d
49
49
 
50
50
  The Web UI also includes an on-demand database workbench. Click the database button in the top-right of the composer to configure the connection, browse schemas, inspect columns, or run SQL in one Modal. Before and after the conversation starts, it no longer occupies the area above the composer or a left sidebar.
51
51
 
52
- ![Database workbench](assets/tables.png)
52
+ ![Database workbench](assets/tables.webp)
53
53
 
54
54
  Choose “Data Mode” when creating a session, and DSH will use the data-analysis workflow for everything that follows.
55
55
 
56
- ![Data Mode preset](assets/settings.png)
56
+ ![Data Mode preset](assets/settings.webp)
57
57
 
58
58
  ## Quick Install
59
59
 
60
- The Web UI, DSH Desktop, and dsh-tui use separate DSH profiles. Install the plugin into every profile you actually use.
60
+ The commands below install the plugin into the Web profile.
61
61
 
62
62
  ### Method 1: npm (recommended)
63
63
 
64
64
  ```sh
65
65
  dsh plugin --profile web add @yejiming/dsh-data-agent
66
- dsh plugin --profile desktop add @yejiming/dsh-data-agent
67
- dsh plugin --profile dsh-tui add @yejiming/dsh-data-agent
68
66
  ```
69
67
 
70
68
  ### Method 2: GitHub
71
69
 
72
70
  ```sh
73
71
  dsh plugin --profile web add github:omdsh-dev/dsh-data-agent
74
- dsh plugin --profile desktop add github:omdsh-dev/dsh-data-agent
75
- dsh plugin --profile dsh-tui add github:omdsh-dev/dsh-data-agent
76
72
  ```
77
73
 
78
74
  The plugin installs the Data Mode preset automatically and preloads its database tools and command when the profile starts. Selecting the preset no longer performs dynamic package-subpath imports. No local build is required.
@@ -131,8 +127,6 @@ After connecting, return to the chat input and ask a business question. Other us
131
127
 
132
128
  When you reopen the connection form in the same session, it restores the latest database type, host, port, user, database, and read-only mode. The password always remains masked and is never restored.
133
129
 
134
- ![Data analysis in dsh-tui](assets/tui.png)
135
-
136
130
  ## How to Ask Better Analysis Questions
137
131
 
138
132
  For more valuable results, include the business goal, time range, and dimensions you care about. For example:
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  **中文** | [English](README.en.md)
4
4
 
5
5
  <p align="center">
6
- <img src="assets/dsh-data-agent-banner.png" alt="dsh-data-agent HERO图" width="100%">
6
+ <img src="assets/dsh-data-agent-banner.webp" alt="dsh-data-agent HERO图" width="100%">
7
7
  </p>
8
8
  <p align="center">
9
9
  <img src="https://img.shields.io/github/v/release/omdsh-dev/dsh-data-agent?style=flat-square" alt="Version">
@@ -34,7 +34,7 @@
34
34
 
35
35
  dsh-data-agent是DeepSeek Harness(DSH)的数据分析插件。连接数据库后,直接提出业务问题,DSH会自动查看库表、编写并执行SQL、根据真实结果继续分析,最终给出清晰的数据结论和商业洞察。插件同时支持Web UI与dsh-tui,无需修改DSH源码。
36
36
 
37
- ![数据分析图表](assets/charts.png)
37
+ ![数据分析图表](assets/charts.webp)
38
38
 
39
39
  ## 主要功能
40
40
 
@@ -49,30 +49,26 @@ dsh-data-agent是DeepSeek Harness(DSH)的数据分析插件。连接数据
49
49
 
50
50
  Web UI还提供按需数据库工作台:点击输入框右上角的数据库按钮,即可在同一个Modal中配置连接、浏览库表、查看字段结构或临时运行SQL。开始对话前后都不占用输入框上方或左侧的对话空间。
51
51
 
52
- ![数据库工作台](assets/tables.png)
52
+ ![数据库工作台](assets/tables.webp)
53
53
 
54
54
  创建会话时选择“数据模式”,DSH就会以数据分析工作流处理后续问题。
55
55
 
56
- ![数据模式预设](assets/settings.png)
56
+ ![数据模式预设](assets/settings.webp)
57
57
 
58
58
  ## 快速安装
59
59
 
60
- Web UI、DSH Desktop和dsh-tui使用独立的DSH profile。请把插件安装到实际使用的profile;同时使用多个界面时,分别执行对应命令。
60
+ 以下命令将插件安装到Web profile
61
61
 
62
62
  ### 方式一:npm安装(推荐)
63
63
 
64
64
  ```sh
65
65
  dsh plugin --profile web add @yejiming/dsh-data-agent
66
- dsh plugin --profile desktop add @yejiming/dsh-data-agent
67
- dsh plugin --profile dsh-tui add @yejiming/dsh-data-agent
68
66
  ```
69
67
 
70
68
  ### 方式二:从GitHub安装
71
69
 
72
70
  ```sh
73
71
  dsh plugin --profile web add github:omdsh-dev/dsh-data-agent
74
- dsh plugin --profile desktop add github:omdsh-dev/dsh-data-agent
75
- dsh plugin --profile dsh-tui add github:omdsh-dev/dsh-data-agent
76
72
  ```
77
73
 
78
74
  插件会自动安装“数据模式”预设,并在profile启动时预加载该预设的数据库工具与命令;选择预设时不再动态导入插件子路径,无需本地构建。
@@ -131,8 +127,6 @@ dsh --profile dsh-tui
131
127
 
132
128
  同一会话再次打开连接表单时,会恢复最近填写的数据库类型、地址、端口、用户、数据库和只读模式。密码始终隐藏且不会恢复。
133
129
 
134
- ![dsh-tui数据分析](assets/tui.png)
135
-
136
130
  ## 推荐的提问方式
137
131
 
138
132
  为了获得更有价值的分析,可以在问题中补充业务目标、时间范围和关注维度。例如:
package/lib/client.js CHANGED
@@ -55,7 +55,7 @@ window.__ModuleLoader__.load({
55
55
  saved.credentialMode = "reference";
56
56
  return saved;
57
57
  }
58
- if (candidate.credentialMode === "password") saved.credentialMode = "password";
58
+ if (candidate.credentialMode === "password" || candidate.credentialMode === "none") saved.credentialMode = candidate.credentialMode;
59
59
  const persistPassword = candidate.persistPassword === true;
60
60
  if (persistPassword) saved.persistPassword = true;
61
61
  if (persistPassword && typeof candidate.password === "string") saved.password = candidate.password;
@@ -72,7 +72,10 @@ window.__ModuleLoader__.load({
72
72
  toWrite.credentialMode = "reference";
73
73
  } else {
74
74
  delete toWrite.passwordRef;
75
- if (toWrite.persistPassword !== true) delete toWrite.password;
75
+ if (toWrite.credentialMode === "none") {
76
+ delete toWrite.password;
77
+ delete toWrite.persistPassword;
78
+ } else if (toWrite.persistPassword !== true) delete toWrite.password;
76
79
  }
77
80
  storage.setItem(CONNECTION_STORAGE_KEY, JSON.stringify(toWrite));
78
81
  } catch {}
@@ -100,64 +103,64 @@ window.__ModuleLoader__.load({
100
103
  document.head.appendChild(tag);
101
104
  }
102
105
  var DataAgentWorkbench_module_css_default = {
103
- "errorText": "Sv3uVW_errorText",
104
- "tabPanel": "Sv3uVW_tabPanel",
105
- "tabs": "Sv3uVW_tabs",
106
+ "triggerActive": "Sv3uVW_triggerActive",
107
+ "tab": "Sv3uVW_tab",
106
108
  "modalColTitle": "Sv3uVW_modalColTitle",
107
- "errorHead": "Sv3uVW_errorHead",
108
- "input": "Sv3uVW_input",
109
- "treeNode": "Sv3uVW_treeNode",
110
- "hint": "Sv3uVW_hint",
111
109
  "triggerDot": "Sv3uVW_triggerDot",
112
- "tree": "Sv3uVW_tree",
113
- "nullCell": "Sv3uVW_nullCell",
114
- "fieldGrid": "Sv3uVW_fieldGrid",
110
+ "sqlPanel": "Sv3uVW_sqlPanel",
111
+ "errorText": "Sv3uVW_errorText",
112
+ "connectionState": "Sv3uVW_connectionState",
115
113
  "modalCol": "Sv3uVW_modalCol",
116
- "rememberRow": "Sv3uVW_rememberRow",
117
- "label": "Sv3uVW_label",
114
+ "treeItem": "Sv3uVW_treeItem",
115
+ "input": "Sv3uVW_input",
118
116
  "summaryType": "Sv3uVW_summaryType",
117
+ "typeCell": "Sv3uVW_typeCell",
118
+ "workbench": "Sv3uVW_workbench",
119
119
  "treeChildren": "Sv3uVW_treeChildren",
120
- "sqlInput": "Sv3uVW_sqlInput",
121
- "tabActive": "Sv3uVW_tabActive",
122
- "primary": "Sv3uVW_primary",
123
- "emptyStateIcon": "Sv3uVW_emptyStateIcon",
124
- "treeIcon": "Sv3uVW_treeIcon",
125
- "open": "Sv3uVW_open",
126
- "fieldRow2": "Sv3uVW_fieldRow2",
127
- "errorIcon": "Sv3uVW_errorIcon",
128
- "modalHint": "Sv3uVW_modalHint",
129
- "connectionState": "Sv3uVW_connectionState",
130
- "columnsTable": "Sv3uVW_columnsTable",
120
+ "treeName": "Sv3uVW_treeName",
121
+ "nullCell": "Sv3uVW_nullCell",
122
+ "treeNode": "Sv3uVW_treeNode",
123
+ "shortcutHint": "Sv3uVW_shortcutHint",
131
124
  "active": "Sv3uVW_active",
132
- "colCount": "Sv3uVW_colCount",
125
+ "tabPanel": "Sv3uVW_tabPanel",
133
126
  "sqlResult": "Sv3uVW_sqlResult",
134
- "treeCount": "Sv3uVW_treeCount",
135
- "sqlPanel": "Sv3uVW_sqlPanel",
136
- "tab": "Sv3uVW_tab",
127
+ "columnsTable": "Sv3uVW_columnsTable",
128
+ "errorIcon": "Sv3uVW_errorIcon",
129
+ "sqlActions": "Sv3uVW_sqlActions",
130
+ "errorHead": "Sv3uVW_errorHead",
131
+ "emptyStateIcon": "Sv3uVW_emptyStateIcon",
132
+ "treeChevron": "Sv3uVW_treeChevron",
133
+ "primary": "Sv3uVW_primary",
137
134
  "connectionSummary": "Sv3uVW_connectionSummary",
138
- "typeCell": "Sv3uVW_typeCell",
139
- "treeScroll": "Sv3uVW_treeScroll",
140
- "emptyStateText": "Sv3uVW_emptyStateText",
141
- "workbench": "Sv3uVW_workbench",
135
+ "trigger": "Sv3uVW_trigger",
136
+ "modalHint": "Sv3uVW_modalHint",
137
+ "fieldRow2": "Sv3uVW_fieldRow2",
138
+ "tree": "Sv3uVW_tree",
142
139
  "errorBar": "Sv3uVW_errorBar",
143
- "treeItem": "Sv3uVW_treeItem",
144
- "actions": "Sv3uVW_actions",
140
+ "tabActive": "Sv3uVW_tabActive",
141
+ "treeCount": "Sv3uVW_treeCount",
145
142
  "rememberHint": "Sv3uVW_rememberHint",
143
+ "workbenchModalContent": "Sv3uVW_workbenchModalContent",
144
+ "emptyStateText": "Sv3uVW_emptyStateText",
145
+ "summaryDb": "Sv3uVW_summaryDb",
146
+ "label": "Sv3uVW_label",
147
+ "sqlInput": "Sv3uVW_sqlInput",
148
+ "ghost": "Sv3uVW_ghost",
149
+ "tabs": "Sv3uVW_tabs",
150
+ "actions": "Sv3uVW_actions",
146
151
  "colScroll": "Sv3uVW_colScroll",
152
+ "hint": "Sv3uVW_hint",
147
153
  "workbenchModal": "Sv3uVW_workbenchModal",
148
- "sqlActions": "Sv3uVW_sqlActions",
149
- "emptyState": "Sv3uVW_emptyState",
150
- "shortcutHint": "Sv3uVW_shortcutHint",
151
- "treeChevron": "Sv3uVW_treeChevron",
154
+ "field": "Sv3uVW_field",
155
+ "rememberRow": "Sv3uVW_rememberRow",
152
156
  "schemaPanel": "Sv3uVW_schemaPanel",
157
+ "treeScroll": "Sv3uVW_treeScroll",
158
+ "emptyState": "Sv3uVW_emptyState",
159
+ "fieldGrid": "Sv3uVW_fieldGrid",
160
+ "open": "Sv3uVW_open",
153
161
  "triggerSlot": "Sv3uVW_triggerSlot",
154
- "ghost": "Sv3uVW_ghost",
155
- "trigger": "Sv3uVW_trigger",
156
- "workbenchModalContent": "Sv3uVW_workbenchModalContent",
157
- "treeName": "Sv3uVW_treeName",
158
- "summaryDb": "Sv3uVW_summaryDb",
159
- "triggerActive": "Sv3uVW_triggerActive",
160
- "field": "Sv3uVW_field"
162
+ "colCount": "Sv3uVW_colCount",
163
+ "treeIcon": "Sv3uVW_treeIcon"
161
164
  };
162
165
  //#endregion
163
166
  //#region src/client/DataAgentWorkbench.tsx
@@ -391,6 +394,18 @@ window.__ModuleLoader__.load({
391
394
  else if (saved.password !== void 0 && saved.password !== "") body.password = saved.password;
392
395
  return body;
393
396
  }
397
+ /** Whether localStorage contains enough information for a safe automatic retry. */
398
+ function canAutoReconnect(saved) {
399
+ if (saved.type === "sqlite" || saved.credentialMode === "none") return true;
400
+ if (saved.passwordRef !== void 0 && saved.passwordRef !== "") return true;
401
+ return saved.persistPassword === true && saved.password !== void 0 && saved.password !== "";
402
+ }
403
+ /** Avoid replaying the last browser credential into a different server-side profile. */
404
+ function savedMatchesSummary(saved, summary) {
405
+ if (saved.type !== summary.type || saved.database !== summary.database) return false;
406
+ if (saved.type === "sqlite") return true;
407
+ return (saved.host ?? "") === (summary.host ?? "") && (saved.port ?? void 0) === (summary.port ?? void 0) && (saved.user ?? "") === (summary.user ?? "");
408
+ }
394
409
  /** The database workbench body. */
395
410
  function DataAgentWorkbench({ sessionId, useSessions, t }) {
396
411
  const isDataAgent = useSessions((snapshot) => snapshot).byId[sessionId]?.agentPreset === DATA_AGENT_PRESET;
@@ -410,6 +425,7 @@ window.__ModuleLoader__.load({
410
425
  const [busy, setBusy] = (0, react.useState)(false);
411
426
  const [error, setError] = (0, react.useState)(null);
412
427
  const [connected, setConnected] = (0, react.useState)(false);
428
+ const [reconnectRequired, setReconnectRequired] = (0, react.useState)(false);
413
429
  const [workbenchOpen, setWorkbenchOpen] = (0, react.useState)(false);
414
430
  const [activeTab, setActiveTab] = (0, react.useState)("connection");
415
431
  const [restoring, setRestoring] = (0, react.useState)(false);
@@ -467,28 +483,35 @@ window.__ModuleLoader__.load({
467
483
  setBusy(true);
468
484
  fetch(`/plugins/data-agent/status?sessionId=${encodeURIComponent(sessionId)}`, { signal: controller.signal }).then((response) => parseJsonResponse(response)).then(async (body) => {
469
485
  if (cancelled) return;
470
- if (body.connected) {
471
- setConnected(true);
472
- if (body.summary !== void 0) {
473
- setType(body.summary.type);
474
- setHost(body.summary.host ?? "");
475
- setPort(body.summary.port !== void 0 ? String(body.summary.port) : "");
476
- setUser(body.summary.user ?? "");
477
- setDatabase(body.summary.database);
478
- setReadonly(body.summary.readonly === true);
479
- setPasswordRef(body.summary.passwordRef ?? "");
480
- if (body.summary.passwordRef !== void 0) setCredentialMode("reference");
481
- setCredentialStatus(body.summary.credential);
486
+ const summary = body.summary;
487
+ const matchesSaved = saved !== null && summary !== void 0 && savedMatchesSummary(saved, summary);
488
+ if (summary !== void 0) {
489
+ setType(summary.type);
490
+ setHost(summary.host ?? "");
491
+ setPort(summary.port !== void 0 ? String(summary.port) : "");
492
+ setUser(summary.user ?? "");
493
+ setDatabase(summary.database);
494
+ setReadonly(summary.readonly === true);
495
+ setPasswordRef(summary.passwordRef ?? "");
496
+ setCredentialMode(summary.credentialMode === "reference" || summary.passwordRef !== void 0 ? "reference" : "password");
497
+ setCredentialStatus(summary.credential);
498
+ if (!matchesSaved) {
499
+ setPassword("");
500
+ setRememberPassword(false);
482
501
  }
483
- return;
484
502
  }
485
- if (saved !== null && saved.database !== "") {
503
+ setConnected(body.connected);
504
+ setReconnectRequired(body.reconnectRequired === true);
505
+ if (body.connected) return;
506
+ const referenceUnavailable = summary?.credentialMode === "reference" && summary.credential?.configured === false;
507
+ if (saved !== null && saved.database !== "" && canAutoReconnect(saved) && (summary === void 0 || matchesSaved) && !referenceUnavailable) {
486
508
  setRestoring(true);
487
509
  try {
488
510
  const result = await performConnect(sessionId, payloadFromSaved(saved), controller.signal);
489
511
  if (cancelled) return;
490
512
  if (result.ok) {
491
513
  setConnected(true);
514
+ setReconnectRequired(false);
492
515
  setCredentialStatus(result.summary?.credential);
493
516
  } else setError(`连接恢复失败:${result.error ?? "unknown error"}`);
494
517
  } catch (cause) {
@@ -549,7 +572,18 @@ window.__ModuleLoader__.load({
549
572
  const result = await performConnect(sessionId, body);
550
573
  if (result.ok) {
551
574
  setConnected(true);
575
+ setReconnectRequired(false);
552
576
  setCredentialStatus(result.summary?.credential);
577
+ if (result.summary?.credentialMode === "none" && !sqlite) saveConnection({
578
+ type,
579
+ host,
580
+ ...port !== "" ? { port: Number(port) } : {},
581
+ user,
582
+ database,
583
+ readonly,
584
+ credentialMode: "none",
585
+ savedAt: (/* @__PURE__ */ new Date()).toISOString()
586
+ });
553
587
  setActiveTab("schema");
554
588
  schemasLoaded.current = false;
555
589
  await loadSchemas(true);
@@ -570,6 +604,7 @@ window.__ModuleLoader__.load({
570
604
  body: JSON.stringify({ sessionId })
571
605
  }));
572
606
  setConnected(false);
607
+ setReconnectRequired(false);
573
608
  setCredentialStatus(void 0);
574
609
  setReadonly(false);
575
610
  setActiveTab("connection");
@@ -650,7 +685,7 @@ window.__ModuleLoader__.load({
650
685
  setSqlBusy(false);
651
686
  }
652
687
  };
653
- const composerPlaceholder = connected ? t("composer.placeholder.connected") : t("composer.placeholder.disconnected");
688
+ const composerPlaceholder = connected ? t("composer.placeholder.connected") : reconnectRequired ? t("composer.placeholder.reconnectRequired") : t("composer.placeholder.disconnected");
654
689
  (0, react.useLayoutEffect)(() => {
655
690
  if (!isDataAgent) return;
656
691
  const textarea = (triggerSlotRef.current?.closest("[data-composer-card]"))?.querySelector("textarea");
@@ -667,7 +702,7 @@ window.__ModuleLoader__.load({
667
702
  const databaseLabel = sqlite ? t("form.database.sqlite") : type === "oracle" ? t("form.database.oracle") : type === "hive" || type === "impala" ? t("form.database.hive") : t("form.database");
668
703
  const formDisabled = busy || connected;
669
704
  const triggerState = error !== null ? "error" : busy || restoring ? "ongoing" : connected ? "done" : "warning";
670
- const triggerLabel = error !== null ? t("workbench.open.error") : busy || restoring ? t("workbench.open.checking") : connected ? t("workbench.open.connected") : t("workbench.open.disconnected");
705
+ const triggerLabel = error !== null ? t("workbench.open.error") : busy || restoring ? t("workbench.open.checking") : connected ? t("workbench.open.connected") : reconnectRequired ? t("workbench.open.reconnectRequired") : t("workbench.open.disconnected");
671
706
  const tabs = [
672
707
  {
673
708
  id: "connection",
@@ -727,9 +762,9 @@ window.__ModuleLoader__.load({
727
762
  }),
728
763
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
729
764
  className: DataAgentWorkbench_module_css_default.connectionState,
730
- children: error !== null ? t("error.title") : restoring ? t("state.reconnecting") : busy ? t("state.checking") : connected ? t("state.connected") : t("state.disconnected")
765
+ children: error !== null ? t("error.title") : restoring ? t("state.reconnecting") : busy ? t("state.checking") : connected ? t("state.connected") : reconnectRequired ? t("state.reconnectRequired") : t("state.disconnected")
731
766
  }),
732
- connected && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
767
+ (connected || reconnectRequired) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
733
768
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
734
769
  className: DataAgentWorkbench_module_css_default.summaryType,
735
770
  children: t(`type.${type}`)
@@ -42499,40 +42534,40 @@ window.__ModuleLoader__.load({
42499
42534
  document.head.appendChild(tag);
42500
42535
  }
42501
42536
  var AnalysisDashboard_module_css_default = {
42502
- "metricBand": "_1tppBG_metricBand",
42503
- "emptyText": "_1tppBG_emptyText",
42504
- "modalSummary": "_1tppBG_modalSummary",
42505
- "modalTitleWrap": "_1tppBG_modalTitleWrap",
42506
- "empty": "_1tppBG_empty",
42507
- "modalBody": "_1tppBG_modalBody",
42508
- "metric": "_1tppBG_metric",
42537
+ "view": "_1tppBG_view",
42509
42538
  "modalTitle": "_1tppBG_modalTitle",
42539
+ "modalHeader": "_1tppBG_modalHeader",
42540
+ "emptyText": "_1tppBG_emptyText",
42541
+ "rowTitle": "_1tppBG_rowTitle",
42542
+ "modalClose": "_1tppBG_modalClose",
42543
+ "modal": "_1tppBG_modal",
42544
+ "metricLabel": "_1tppBG_metricLabel",
42545
+ "grid": "_1tppBG_grid",
42510
42546
  "rowActions": "_1tppBG_rowActions",
42511
- "rowButton": "_1tppBG_rowButton",
42512
- "modalShell": "_1tppBG_modalShell",
42513
- "table": "_1tppBG_table",
42514
- "rowInterrupted": "_1tppBG_rowInterrupted",
42515
- "visuallyHidden": "_1tppBG_visuallyHidden",
42516
- "rowHead": "_1tppBG_rowHead",
42547
+ "viewHalf": "_1tppBG_viewHalf",
42517
42548
  "chartCanvas": "_1tppBG_chartCanvas",
42518
- "modal": "_1tppBG_modal",
42549
+ "chart": "_1tppBG_chart",
42519
42550
  "tableWrap": "_1tppBG_tableWrap",
42520
- "viewHalf": "_1tppBG_viewHalf",
42551
+ "table": "_1tppBG_table",
42552
+ "preview": "_1tppBG_preview",
42553
+ "visuallyHidden": "_1tppBG_visuallyHidden",
42554
+ "modalTitleWrap": "_1tppBG_modalTitleWrap",
42555
+ "metric": "_1tppBG_metric",
42521
42556
  "modalCount": "_1tppBG_modalCount",
42557
+ "modalBody": "_1tppBG_modalBody",
42558
+ "row": "_1tppBG_row",
42559
+ "rowButton": "_1tppBG_rowButton",
42560
+ "metricBand": "_1tppBG_metricBand",
42522
42561
  "metricValue": "_1tppBG_metricValue",
42523
- "rowTitle": "_1tppBG_rowTitle",
42562
+ "rowError": "_1tppBG_rowError",
42563
+ "rowInterrupted": "_1tppBG_rowInterrupted",
42524
42564
  "viewFull": "_1tppBG_viewFull",
42525
- "modalClose": "_1tppBG_modalClose",
42526
- "metricLabel": "_1tppBG_metricLabel",
42527
- "row": "_1tppBG_row",
42528
- "view": "_1tppBG_view",
42529
42565
  "viewTitle": "_1tppBG_viewTitle",
42566
+ "empty": "_1tppBG_empty",
42567
+ "modalSummary": "_1tppBG_modalSummary",
42568
+ "rowHead": "_1tppBG_rowHead",
42530
42569
  "rowSummary": "_1tppBG_rowSummary",
42531
- "chart": "_1tppBG_chart",
42532
- "grid": "_1tppBG_grid",
42533
- "preview": "_1tppBG_preview",
42534
- "rowError": "_1tppBG_rowError",
42535
- "modalHeader": "_1tppBG_modalHeader"
42570
+ "modalShell": "_1tppBG_modalShell"
42536
42571
  };
42537
42572
  //#endregion
42538
42573
  //#region src/client/AnalysisChart.tsx
@@ -42984,12 +43019,15 @@ window.__ModuleLoader__.load({
42984
43019
  "state.disconnected": "未连接",
42985
43020
  "state.checking": "正在检查连接…",
42986
43021
  "state.reconnecting": "正在恢复连接…",
43022
+ "state.reconnectRequired": "需要重新认证",
42987
43023
  "workbench.open.connected": "数据库工作台:已连接",
42988
43024
  "workbench.open.disconnected": "数据库工作台:未连接",
42989
43025
  "workbench.open.checking": "数据库工作台:正在检查连接",
42990
43026
  "workbench.open.error": "数据库工作台:连接异常",
43027
+ "workbench.open.reconnectRequired": "数据库工作台:需要重新认证",
42991
43028
  "composer.placeholder.disconnected": "数据库未连接,请点击输入框右上角的配置按钮",
42992
43029
  "composer.placeholder.connected": "数据库连接成功,请描述分析内容",
43030
+ "composer.placeholder.reconnectRequired": "数据库需要重新认证,请点击输入框右上角的配置按钮",
42993
43031
  "wb.workbench.title": "数据库工作台",
42994
43032
  "wb.workbench.description": "管理连接、浏览库表并运行 SQL",
42995
43033
  "wb.workbench.tabs": "数据库工作台功能",
@@ -43067,12 +43105,15 @@ window.__ModuleLoader__.load({
43067
43105
  "state.disconnected": "Not connected",
43068
43106
  "state.checking": "Checking connection…",
43069
43107
  "state.reconnecting": "Restoring connection…",
43108
+ "state.reconnectRequired": "Authentication required",
43070
43109
  "workbench.open.connected": "Database workbench: connected",
43071
43110
  "workbench.open.disconnected": "Database workbench: not connected",
43072
43111
  "workbench.open.checking": "Database workbench: checking connection",
43073
43112
  "workbench.open.error": "Database workbench: connection error",
43113
+ "workbench.open.reconnectRequired": "Database workbench: authentication required",
43074
43114
  "composer.placeholder.disconnected": "Database not connected. Click the configuration button at the top right of the input box.",
43075
43115
  "composer.placeholder.connected": "Database connected. Describe what you want to analyze.",
43116
+ "composer.placeholder.reconnectRequired": "Database authentication required. Click the configuration button at the top right of the input box.",
43076
43117
  "wb.workbench.title": "Database workbench",
43077
43118
  "wb.workbench.description": "Manage connections, browse schemas, and run SQL",
43078
43119
  "wb.workbench.tabs": "Database workbench sections",