@yejiming/dsh-data-agent 0.0.2 → 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 CHANGED
@@ -64,7 +64,7 @@ window.__ModuleLoader__.load({
64
64
  }
65
65
  //#endregion
66
66
  //#region \0dsh-css:/Users/yejiming/Desktop/OpenSource/dsh-data-agent/src/client/DataAgentWorkbench.module.css.mjs
67
- const css = ".Sv3uVW_workbench{box-sizing:border-box;font-family:var(--dsw-font-family,-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif);color:var(--dsw-alias-label-primary,inherit);flex-direction:column;gap:10px;font-size:13px;line-height:1.5;display:flex}.Sv3uVW_strip{width:100%}.Sv3uVW_docked{width:100%;max-height:55vh;overflow-y:auto}.Sv3uVW_rail{z-index:8;border-right:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-specific-sidebar-fill,var(--dsw-alias-bg-layer-1,#ffffff08));padding:12px;overflow-y:auto}html.Sv3uVW_da-split [data-phase=active] [data-conversation-scroll]>:first-child{margin-left:380px}html.Sv3uVW_da-split [data-phase=active] [data-composer-seat]{padding-left:380px}.Sv3uVW_sections{flex-direction:column;gap:12px;display:flex}.Sv3uVW_card{border:1px solid var(--dsw-alias-border-l2,#80808059);border-radius:12px;flex-direction:column;gap:10px;padding:12px 14px;display:flex}.Sv3uVW_cardTitle{text-transform:uppercase;letter-spacing:.06em;color:var(--dsw-alias-label-tertiary,#808080b3);align-items:center;gap:6px;font-size:11px;font-weight:600;display:flex}.Sv3uVW_titleIcon{width:14px;height:14px;color:var(--dsw-alias-label-secondary,#808080cc);flex:none}.Sv3uVW_fieldGrid{flex-direction:column;gap:10px;display:flex}.Sv3uVW_fieldRow2{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;display:grid}.Sv3uVW_field{flex-direction:column;gap:4px;min-width:0;display:flex}.Sv3uVW_label{color:var(--dsw-alias-label-secondary,#808080b3);font-size:11px;font-weight:500}.Sv3uVW_rememberRow{color:var(--dsw-alias-label-primary,inherit);cursor:pointer;user-select:none;align-items:center;gap:6px;font-size:12px;display:flex}.Sv3uVW_rememberRow input[type=checkbox]{width:14px;height:14px;accent-color:var(--dsw-alias-button-info-fill,#3b82f6);cursor:pointer;flex:none;margin:0}.Sv3uVW_rememberHint{color:var(--dsw-alias-label-caption,#80808080);font-size:11px}.Sv3uVW_input{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-alias-bg-layer-2,#ffffff0a);width:100%;height:32px;color:var(--dsw-alias-label-primary,inherit);font:inherit;border-radius:8px;padding:0 10px;font-size:13px;transition:border-color .15s ease-out,box-shadow .15s ease-out}.Sv3uVW_input::placeholder{color:var(--dsw-alias-label-caption,#80808080)}.Sv3uVW_input:focus-visible,.Sv3uVW_input:focus{border-color:var(--dsw-alias-button-info-fill,#3b82f6);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-button-info-fill,#3b82f6) 18%, transparent);outline:none}.Sv3uVW_input:disabled{opacity:.55}select.Sv3uVW_input{-webkit-appearance:none;appearance:none;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' fill='none' stroke='%23777' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 10px center;background-repeat:no-repeat;padding-right:28px}.Sv3uVW_actions{align-items:center;gap:8px;margin-top:2px;display:flex}.Sv3uVW_actions>.Sv3uVW_primary,.Sv3uVW_actions>.Sv3uVW_ghost{flex:1}.Sv3uVW_primary,.Sv3uVW_ghost{height:32px;font:inherit;cursor:pointer;border:1px solid #0000;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:13px;font-weight:500;transition:background-color .15s ease-out,border-color .15s ease-out,opacity .15s ease-out;display:inline-flex}.Sv3uVW_primary{background:var(--dsw-alias-button-info-fill,#3b82f6);color:#fff}.Sv3uVW_primary:hover:not(:disabled){background:var(--dsw-alias-button-info-hover,#3573e0)}.Sv3uVW_primary:active:not(:disabled){background:var(--dsw-static-deepseek-600,#2f5fc0)}.Sv3uVW_ghost{border-color:var(--dsw-alias-border-l2,#80808059);color:var(--dsw-alias-label-primary,inherit);background:0 0}.Sv3uVW_ghost:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#80808014)}.Sv3uVW_ghost:active:not(:disabled){background:var(--dsw-alias-interactive-bg-active,#80808024)}.Sv3uVW_primary:focus-visible,.Sv3uVW_ghost:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-button-info-fill,#3b82f6) 25%, transparent);outline:none}.Sv3uVW_primary:disabled,.Sv3uVW_ghost:disabled{opacity:.45;cursor:default}.Sv3uVW_small{border-radius:6px;height:24px;padding:0 10px;font-size:12px}.Sv3uVW_hint{color:var(--dsw-alias-label-tertiary,#80808099);font-size:12px}.Sv3uVW_summaryRow{align-items:center;gap:8px;min-height:28px;display:flex}.Sv3uVW_statusOk{color:var(--dsw-alias-state-success-primary,#22c55e);flex:none;align-items:center;gap:5px;font-size:12px;font-weight:500;display:inline-flex}.Sv3uVW_summaryType{border:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-alias-bg-layer-2,#ffffff0a);font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);color:var(--dsw-alias-label-secondary,#808080cc);border-radius:999px;flex:none;padding:2px 8px;font-size:11px}.Sv3uVW_summaryDb{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);flex:1;font-size:12px;overflow:hidden}.Sv3uVW_summaryActions{flex:none;gap:6px;display:flex}.Sv3uVW_browseRow{border:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-alias-bg-layer-2,#ffffff0a);width:100%;height:36px;color:var(--dsw-alias-label-primary,inherit);font:inherit;text-align:left;cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:0 12px;font-size:13px;font-weight:500;transition:background-color .15s ease-out,border-color .15s ease-out;display:flex}.Sv3uVW_browseRow:hover{background:var(--dsw-alias-interactive-bg-hover,#80808014);border-color:var(--dsw-alias-border-l3,#80808080)}.Sv3uVW_browseRow:focus-visible{border-color:var(--dsw-alias-button-info-fill,#3b82f6);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-button-info-fill,#3b82f6) 18%, transparent);outline:none}.Sv3uVW_browseIcon{width:14px;height:14px;color:var(--dsw-alias-button-info-fill,#3b82f6);flex:none}.Sv3uVW_browseChevron{width:12px;height:12px;color:var(--dsw-alias-label-tertiary,#80808099);flex:none;margin-left:auto}.Sv3uVW_sqlInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-alias-bg-layer-2,#ffffff0a);width:100%;min-height:190px;color:var(--dsw-alias-label-primary,inherit);font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);resize:vertical;border-radius:10px;padding:10px 12px;font-size:12.5px;line-height:1.6;transition:border-color .15s ease-out,box-shadow .15s ease-out}.Sv3uVW_sqlInput::placeholder{color:var(--dsw-alias-label-caption,#80808080)}.Sv3uVW_sqlInput:focus-visible,.Sv3uVW_sqlInput:focus{border-color:var(--dsw-alias-button-info-fill,#3b82f6);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-button-info-fill,#3b82f6) 18%, transparent);outline:none}.Sv3uVW_sqlInput:disabled{opacity:.55}.Sv3uVW_sqlActions{justify-content:flex-end;align-items:center;gap:10px;display:flex}.Sv3uVW_sqlActions .Sv3uVW_primary{flex:none;min-width:92px}.Sv3uVW_shortcutHint{color:var(--dsw-alias-label-caption,#80808080);font-size:11.5px}.Sv3uVW_sqlResult{border:1px solid var(--dsw-alias-border-l1,#80808033);background:var(--dsw-alias-markdown-code-block,#ffffff0a);font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);white-space:pre-wrap;word-break:break-word;border-radius:8px;max-height:200px;margin:0;padding:10px 12px;font-size:11.5px;line-height:1.55;overflow-y:auto}.Sv3uVW_errorBar{border:1px solid var(--dsw-alias-state-error-secondary,#ef444480);background:var(--dsw-alias-interactive-bg-hover-danger,#ef444414);border-radius:10px;flex-direction:column;gap:3px;padding:10px 12px;display:flex}.Sv3uVW_errorHead{color:var(--dsw-alias-state-error-primary,#ef4444);align-items:center;gap:6px;font-size:12px;font-weight:600;display:flex}.Sv3uVW_errorIcon{flex:none;width:14px;height:14px}.Sv3uVW_errorText{white-space:pre-wrap;word-break:break-word;font-size:12px}.Sv3uVW_schemaModal{width:min(900px,94vw)}.Sv3uVW_modalBody{align-items:stretch;gap:20px;height:min(540px,58vh);display:flex}.Sv3uVW_modalCol{flex-direction:column;flex:1;gap:8px;min-width:0;min-height:0;display:flex}.Sv3uVW_modalColTitle{text-transform:uppercase;letter-spacing:.06em;color:var(--dsw-alias-label-tertiary,#808080b3);flex:none;align-items:center;gap:6px;font-size:11px;font-weight:600;display:flex}.Sv3uVW_colCount{border:1px solid var(--dsw-alias-border-l1,#80808033);background:var(--dsw-alias-bg-layer-2,#ffffff0a);color:var(--dsw-alias-label-secondary,#808080cc);border-radius:999px;flex:none;padding:1px 7px;font-size:10px;font-weight:500}.Sv3uVW_treeScroll{flex:1;min-height:0;padding-right:4px;overflow-y:auto}.Sv3uVW_tree{flex-direction:column;gap:1px;margin:0;padding:0;list-style:none;display:flex}.Sv3uVW_treeNode{flex-direction:column;display:flex}.Sv3uVW_treeItem{width:100%;min-height:28px;color:var(--dsw-alias-label-primary,inherit);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:7px;align-items:center;gap:6px;padding:0 8px;font-size:12.5px;display:flex}.Sv3uVW_treeItem:hover{background:var(--dsw-alias-interactive-bg-hover,#80808014)}.Sv3uVW_treeItem.Sv3uVW_active,.Sv3uVW_treeItem.Sv3uVW_active:hover{background:var(--dsw-alias-interactive-bg-active,#3b82f62e)}.Sv3uVW_treeChevron{width:12px;height:12px;color:var(--dsw-alias-label-tertiary,#80808099);flex:none;transition:transform .15s ease-out}.Sv3uVW_treeChevron.Sv3uVW_open{transform:rotate(90deg)}.Sv3uVW_treeIcon{width:14px;height:14px;color:var(--dsw-alias-label-secondary,#808080cc);flex:none}.Sv3uVW_treeItem.Sv3uVW_active .Sv3uVW_treeIcon{color:var(--dsw-alias-button-info-fill,#3b82f6)}.Sv3uVW_treeName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);flex:1;font-size:12px;overflow:hidden}.Sv3uVW_treeCount{border:1px solid var(--dsw-alias-border-l1,#80808033);background:var(--dsw-alias-bg-layer-2,#ffffff0a);color:var(--dsw-alias-label-secondary,#808080cc);border-radius:999px;flex:none;padding:0 6px;font-size:10px}.Sv3uVW_treeChildren{border-left:1px solid var(--dsw-alias-border-l2,#80808059);flex-direction:column;gap:1px;margin-left:12px;padding-left:10px;display:flex}.Sv3uVW_colScroll{border:1px solid var(--dsw-alias-border-l1,#80808033);border-radius:8px;flex:1;min-height:0;overflow:auto}.Sv3uVW_columnsTable{border-collapse:collapse;width:100%;font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-size:12px}.Sv3uVW_columnsTable th{z-index:1;text-align:left;text-transform:uppercase;letter-spacing:.05em;color:var(--dsw-alias-label-tertiary,#808080b3);background:var(--dsw-alias-bg-layer-2,#ffffff0a);border-bottom:1px solid var(--dsw-alias-border-l2,#80808059);padding:7px 10px;font-size:10.5px;font-weight:600;position:sticky;top:0}.Sv3uVW_columnsTable td{border-bottom:1px solid var(--dsw-alias-border-l1,#80808033);color:var(--dsw-alias-label-primary,inherit);padding:5px 10px}.Sv3uVW_columnsTable tbody tr:hover td{background:var(--dsw-alias-interactive-bg-hover,#80808014)}.Sv3uVW_typeCell{color:var(--dsw-alias-label-secondary,#808080cc)}.Sv3uVW_nullCell{color:var(--dsw-alias-label-caption,#80808080);font-size:11px}.Sv3uVW_emptyState{border:1px dashed var(--dsw-alias-border-l2,#80808059);min-height:0;color:var(--dsw-alias-label-tertiary,#808080b3);border-radius:8px;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;display:flex}.Sv3uVW_emptyStateIcon{width:20px;height:20px;color:var(--dsw-alias-label-dimmed,#80808066)}.Sv3uVW_emptyStateText{font-size:12px}.Sv3uVW_modalHint{color:var(--dsw-alias-label-caption,#80808080);flex:none;align-items:center;gap:6px;margin-top:2px;font-size:11.5px;display:flex}@media (width<=640px){.Sv3uVW_modalBody{flex-direction:column;height:auto}.Sv3uVW_treeScroll{flex:none;height:300px}.Sv3uVW_colScroll{flex:none;height:240px}.Sv3uVW_emptyState{flex:none;height:120px}}";
67
+ const css = ".Sv3uVW_workbench{box-sizing:border-box;font-family:var(--dsw-font-family,-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif);color:var(--dsw-alias-label-primary,inherit);flex-direction:column;gap:10px;font-size:13px;line-height:1.5;display:flex}.Sv3uVW_strip{width:100%}.Sv3uVW_docked{width:100%;max-height:55vh;overflow-y:auto}.Sv3uVW_rail{z-index:8;border-right:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-specific-sidebar-fill,var(--dsw-alias-bg-layer-1,#ffffff08));padding:12px;overflow-y:auto}html.Sv3uVW_da-split [data-phase=active] [data-conversation-scroll]>:first-child,html.Sv3uVW_da-split [data-phase=active] [data-conversation-scroll]>[data-slot=conversation\\.session]>*{margin-left:380px}html.Sv3uVW_da-split [data-phase=active] [data-composer-seat]{padding-left:380px}.Sv3uVW_sections{flex-direction:column;gap:12px;display:flex}.Sv3uVW_card{border:1px solid var(--dsw-alias-border-l2,#80808059);border-radius:12px;flex-direction:column;gap:10px;padding:12px 14px;display:flex}.Sv3uVW_cardTitle{text-transform:uppercase;letter-spacing:.06em;color:var(--dsw-alias-label-tertiary,#808080b3);align-items:center;gap:6px;font-size:11px;font-weight:600;display:flex}.Sv3uVW_titleIcon{width:14px;height:14px;color:var(--dsw-alias-label-secondary,#808080cc);flex:none}.Sv3uVW_fieldGrid{flex-direction:column;gap:10px;display:flex}.Sv3uVW_fieldRow2{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;display:grid}.Sv3uVW_field{flex-direction:column;gap:4px;min-width:0;display:flex}.Sv3uVW_label{color:var(--dsw-alias-label-secondary,#808080b3);font-size:11px;font-weight:500}.Sv3uVW_rememberRow{color:var(--dsw-alias-label-primary,inherit);cursor:pointer;user-select:none;align-items:center;gap:6px;font-size:12px;display:flex}.Sv3uVW_rememberRow input[type=checkbox]{width:14px;height:14px;accent-color:var(--dsw-alias-button-info-fill,#3b82f6);cursor:pointer;flex:none;margin:0}.Sv3uVW_rememberHint{color:var(--dsw-alias-label-caption,#80808080);font-size:11px}.Sv3uVW_input{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-alias-bg-layer-2,#ffffff0a);width:100%;height:32px;color:var(--dsw-alias-label-primary,inherit);font:inherit;border-radius:8px;padding:0 10px;font-size:13px;transition:border-color .15s ease-out,box-shadow .15s ease-out}.Sv3uVW_input::placeholder{color:var(--dsw-alias-label-caption,#80808080)}.Sv3uVW_input:focus-visible,.Sv3uVW_input:focus{border-color:var(--dsw-alias-button-info-fill,#3b82f6);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-button-info-fill,#3b82f6) 18%, transparent);outline:none}.Sv3uVW_input:disabled{opacity:.55}select.Sv3uVW_input{-webkit-appearance:none;appearance:none;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' fill='none' stroke='%23777' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 10px center;background-repeat:no-repeat;padding-right:28px}.Sv3uVW_actions{align-items:center;gap:8px;margin-top:2px;display:flex}.Sv3uVW_actions>.Sv3uVW_primary,.Sv3uVW_actions>.Sv3uVW_ghost{flex:1}.Sv3uVW_primary,.Sv3uVW_ghost{height:32px;font:inherit;cursor:pointer;border:1px solid #0000;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:13px;font-weight:500;transition:background-color .15s ease-out,border-color .15s ease-out,opacity .15s ease-out;display:inline-flex}.Sv3uVW_primary{background:var(--dsw-alias-button-info-fill,#3b82f6);color:#fff}.Sv3uVW_primary:hover:not(:disabled){background:var(--dsw-alias-button-info-hover,#3573e0)}.Sv3uVW_primary:active:not(:disabled){background:var(--dsw-static-deepseek-600,#2f5fc0)}.Sv3uVW_ghost{border-color:var(--dsw-alias-border-l2,#80808059);color:var(--dsw-alias-label-primary,inherit);background:0 0}.Sv3uVW_ghost:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#80808014)}.Sv3uVW_ghost:active:not(:disabled){background:var(--dsw-alias-interactive-bg-active,#80808024)}.Sv3uVW_primary:focus-visible,.Sv3uVW_ghost:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-button-info-fill,#3b82f6) 25%, transparent);outline:none}.Sv3uVW_primary:disabled,.Sv3uVW_ghost:disabled{opacity:.45;cursor:default}.Sv3uVW_small{border-radius:6px;height:24px;padding:0 10px;font-size:12px}.Sv3uVW_hint{color:var(--dsw-alias-label-tertiary,#80808099);font-size:12px}.Sv3uVW_summaryRow{align-items:center;gap:8px;min-height:28px;display:flex}.Sv3uVW_statusOk{color:var(--dsw-alias-state-success-primary,#22c55e);flex:none;align-items:center;gap:5px;font-size:12px;font-weight:500;display:inline-flex}.Sv3uVW_summaryType{border:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-alias-bg-layer-2,#ffffff0a);font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);color:var(--dsw-alias-label-secondary,#808080cc);border-radius:999px;flex:none;padding:2px 8px;font-size:11px}.Sv3uVW_summaryDb{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);flex:1;font-size:12px;overflow:hidden}.Sv3uVW_summaryActions{flex:none;gap:6px;display:flex}.Sv3uVW_heroConnect{border:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-alias-bg-layer-2,#ffffff0a);width:100%;color:var(--dsw-alias-label-primary,inherit);font:inherit;text-align:left;cursor:pointer;border-radius:10px;align-items:center;gap:12px;padding:14px 16px;transition:background-color .15s ease-out,border-color .15s ease-out;display:flex}.Sv3uVW_heroConnect:hover{background:var(--dsw-alias-interactive-bg-hover,#80808014);border-color:var(--dsw-alias-border-l3,#80808080)}.Sv3uVW_heroConnect:focus-visible{border-color:var(--dsw-alias-button-info-fill,#3b82f6);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-button-info-fill,#3b82f6) 18%, transparent);outline:none}.Sv3uVW_heroIcon{width:22px;height:22px;color:var(--dsw-alias-button-info-fill,#3b82f6);flex:none}.Sv3uVW_heroText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.Sv3uVW_heroTitle{color:var(--dsw-alias-label-primary,inherit);font-size:13px;font-weight:600}.Sv3uVW_heroHint{color:var(--dsw-alias-label-caption,#80808080);font-size:11.5px;line-height:1.5}.Sv3uVW_heroChevron{width:12px;height:12px;color:var(--dsw-alias-label-tertiary,#80808099);flex:none}.Sv3uVW_browseRow{border:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-alias-bg-layer-2,#ffffff0a);width:100%;height:36px;color:var(--dsw-alias-label-primary,inherit);font:inherit;text-align:left;cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:0 12px;font-size:13px;font-weight:500;transition:background-color .15s ease-out,border-color .15s ease-out;display:flex}.Sv3uVW_browseRow:hover{background:var(--dsw-alias-interactive-bg-hover,#80808014);border-color:var(--dsw-alias-border-l3,#80808080)}.Sv3uVW_browseRow:focus-visible{border-color:var(--dsw-alias-button-info-fill,#3b82f6);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-button-info-fill,#3b82f6) 18%, transparent);outline:none}.Sv3uVW_browseIcon{width:14px;height:14px;color:var(--dsw-alias-button-info-fill,#3b82f6);flex:none}.Sv3uVW_browseChevron{width:12px;height:12px;color:var(--dsw-alias-label-tertiary,#80808099);flex:none;margin-left:auto}.Sv3uVW_sqlInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#80808059);background:var(--dsw-alias-bg-layer-2,#ffffff0a);width:100%;min-height:190px;color:var(--dsw-alias-label-primary,inherit);font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);resize:vertical;border-radius:10px;padding:10px 12px;font-size:12.5px;line-height:1.6;transition:border-color .15s ease-out,box-shadow .15s ease-out}.Sv3uVW_sqlInput::placeholder{color:var(--dsw-alias-label-caption,#80808080)}.Sv3uVW_sqlInput:focus-visible,.Sv3uVW_sqlInput:focus{border-color:var(--dsw-alias-button-info-fill,#3b82f6);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-button-info-fill,#3b82f6) 18%, transparent);outline:none}.Sv3uVW_sqlInput:disabled{opacity:.55}.Sv3uVW_sqlActions{justify-content:flex-end;align-items:center;gap:10px;display:flex}.Sv3uVW_sqlActions .Sv3uVW_primary{flex:none;min-width:92px}.Sv3uVW_shortcutHint{color:var(--dsw-alias-label-caption,#80808080);font-size:11.5px}.Sv3uVW_sqlResult{border:1px solid var(--dsw-alias-border-l1,#80808033);background:var(--dsw-alias-markdown-code-block,#ffffff0a);font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);white-space:pre-wrap;word-break:break-word;border-radius:8px;max-height:200px;margin:0;padding:10px 12px;font-size:11.5px;line-height:1.55;overflow-y:auto}.Sv3uVW_errorBar{border:1px solid var(--dsw-alias-state-error-secondary,#ef444480);background:var(--dsw-alias-interactive-bg-hover-danger,#ef444414);border-radius:10px;flex-direction:column;gap:3px;padding:10px 12px;display:flex}.Sv3uVW_errorHead{color:var(--dsw-alias-state-error-primary,#ef4444);align-items:center;gap:6px;font-size:12px;font-weight:600;display:flex}.Sv3uVW_errorIcon{flex:none;width:14px;height:14px}.Sv3uVW_errorText{white-space:pre-wrap;word-break:break-word;font-size:12px}.Sv3uVW_connectModal{width:min(440px,92vw)}.Sv3uVW_connectModalBody{flex-direction:column;gap:14px;display:flex}.Sv3uVW_schemaModal{width:min(900px,94vw)}.Sv3uVW_modalBody{align-items:stretch;gap:20px;height:min(540px,58vh);display:flex}.Sv3uVW_modalCol{flex-direction:column;flex:1;gap:8px;min-width:0;min-height:0;display:flex}.Sv3uVW_modalColTitle{text-transform:uppercase;letter-spacing:.06em;color:var(--dsw-alias-label-tertiary,#808080b3);flex:none;align-items:center;gap:6px;font-size:11px;font-weight:600;display:flex}.Sv3uVW_colCount{border:1px solid var(--dsw-alias-border-l1,#80808033);background:var(--dsw-alias-bg-layer-2,#ffffff0a);color:var(--dsw-alias-label-secondary,#808080cc);border-radius:999px;flex:none;padding:1px 7px;font-size:10px;font-weight:500}.Sv3uVW_treeScroll{flex:1;min-height:0;padding-right:4px;overflow-y:auto}.Sv3uVW_tree{flex-direction:column;gap:1px;margin:0;padding:0;list-style:none;display:flex}.Sv3uVW_treeNode{flex-direction:column;display:flex}.Sv3uVW_treeItem{width:100%;min-height:28px;color:var(--dsw-alias-label-primary,inherit);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:7px;align-items:center;gap:6px;padding:0 8px;font-size:12.5px;display:flex}.Sv3uVW_treeItem:hover{background:var(--dsw-alias-interactive-bg-hover,#80808014)}.Sv3uVW_treeItem.Sv3uVW_active,.Sv3uVW_treeItem.Sv3uVW_active:hover{background:var(--dsw-alias-interactive-bg-active,#3b82f62e)}.Sv3uVW_treeChevron{width:12px;height:12px;color:var(--dsw-alias-label-tertiary,#80808099);flex:none;transition:transform .15s ease-out}.Sv3uVW_treeChevron.Sv3uVW_open{transform:rotate(90deg)}.Sv3uVW_treeIcon{width:14px;height:14px;color:var(--dsw-alias-label-secondary,#808080cc);flex:none}.Sv3uVW_treeItem.Sv3uVW_active .Sv3uVW_treeIcon{color:var(--dsw-alias-button-info-fill,#3b82f6)}.Sv3uVW_treeName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);flex:1;font-size:12px;overflow:hidden}.Sv3uVW_treeCount{border:1px solid var(--dsw-alias-border-l1,#80808033);background:var(--dsw-alias-bg-layer-2,#ffffff0a);color:var(--dsw-alias-label-secondary,#808080cc);border-radius:999px;flex:none;padding:0 6px;font-size:10px}.Sv3uVW_treeChildren{border-left:1px solid var(--dsw-alias-border-l2,#80808059);flex-direction:column;gap:1px;margin-left:12px;padding-left:10px;display:flex}.Sv3uVW_colScroll{border:1px solid var(--dsw-alias-border-l1,#80808033);border-radius:8px;flex:1;min-height:0;overflow:auto}.Sv3uVW_columnsTable{border-collapse:collapse;width:100%;font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-size:12px}.Sv3uVW_columnsTable th{z-index:1;text-align:left;text-transform:uppercase;letter-spacing:.05em;color:var(--dsw-alias-label-tertiary,#808080b3);background:var(--dsw-alias-bg-layer-2,#ffffff0a);border-bottom:1px solid var(--dsw-alias-border-l2,#80808059);padding:7px 10px;font-size:10.5px;font-weight:600;position:sticky;top:0}.Sv3uVW_columnsTable td{border-bottom:1px solid var(--dsw-alias-border-l1,#80808033);color:var(--dsw-alias-label-primary,inherit);padding:5px 10px}.Sv3uVW_columnsTable tbody tr:hover td{background:var(--dsw-alias-interactive-bg-hover,#80808014)}.Sv3uVW_typeCell{color:var(--dsw-alias-label-secondary,#808080cc)}.Sv3uVW_nullCell{color:var(--dsw-alias-label-caption,#80808080);font-size:11px}.Sv3uVW_emptyState{border:1px dashed var(--dsw-alias-border-l2,#80808059);min-height:0;color:var(--dsw-alias-label-tertiary,#808080b3);border-radius:8px;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;display:flex}.Sv3uVW_emptyStateIcon{width:20px;height:20px;color:var(--dsw-alias-label-dimmed,#80808066)}.Sv3uVW_emptyStateText{font-size:12px}.Sv3uVW_modalHint{color:var(--dsw-alias-label-caption,#80808080);flex:none;align-items:center;gap:6px;margin-top:2px;font-size:11.5px;display:flex}@media (width<=640px){.Sv3uVW_modalBody{flex-direction:column;height:auto}.Sv3uVW_treeScroll{flex:none;height:300px}.Sv3uVW_colScroll{flex:none;height:240px}.Sv3uVW_emptyState{flex:none;height:120px}}";
68
68
  const tagId = "@yejiming/dsh-data-agent/DataAgentWorkbench.module.css";
69
69
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
70
70
  const tag = document.createElement("style");
@@ -74,67 +74,75 @@ window.__ModuleLoader__.load({
74
74
  document.head.appendChild(tag);
75
75
  }
76
76
  var DataAgentWorkbench_module_css_default = {
77
- "da-split": "Sv3uVW_da-split",
78
- "treeCount": "Sv3uVW_treeCount",
79
- "treeName": "Sv3uVW_treeName",
80
- "treeNode": "Sv3uVW_treeNode",
81
- "rememberRow": "Sv3uVW_rememberRow",
77
+ "nullCell": "Sv3uVW_nullCell",
78
+ "fieldGrid": "Sv3uVW_fieldGrid",
79
+ "small": "Sv3uVW_small",
80
+ "summaryDb": "Sv3uVW_summaryDb",
81
+ "heroIcon": "Sv3uVW_heroIcon",
82
82
  "summaryType": "Sv3uVW_summaryType",
83
+ "heroChevron": "Sv3uVW_heroChevron",
84
+ "primary": "Sv3uVW_primary",
85
+ "tree": "Sv3uVW_tree",
86
+ "label": "Sv3uVW_label",
87
+ "workbench": "Sv3uVW_workbench",
83
88
  "rail": "Sv3uVW_rail",
89
+ "titleIcon": "Sv3uVW_titleIcon",
90
+ "active": "Sv3uVW_active",
84
91
  "open": "Sv3uVW_open",
92
+ "ghost": "Sv3uVW_ghost",
85
93
  "treeChevron": "Sv3uVW_treeChevron",
86
- "label": "Sv3uVW_label",
87
- "browseRow": "Sv3uVW_browseRow",
88
- "titleIcon": "Sv3uVW_titleIcon",
89
- "columnsTable": "Sv3uVW_columnsTable",
90
- "colCount": "Sv3uVW_colCount",
94
+ "statusOk": "Sv3uVW_statusOk",
91
95
  "emptyStateIcon": "Sv3uVW_emptyStateIcon",
92
- "input": "Sv3uVW_input",
93
- "browseChevron": "Sv3uVW_browseChevron",
94
- "fieldGrid": "Sv3uVW_fieldGrid",
96
+ "colCount": "Sv3uVW_colCount",
97
+ "rememberRow": "Sv3uVW_rememberRow",
98
+ "treeName": "Sv3uVW_treeName",
99
+ "errorHead": "Sv3uVW_errorHead",
100
+ "connectModalBody": "Sv3uVW_connectModalBody",
95
101
  "sqlInput": "Sv3uVW_sqlInput",
96
- "modalColTitle": "Sv3uVW_modalColTitle",
97
- "primary": "Sv3uVW_primary",
98
- "treeScroll": "Sv3uVW_treeScroll",
99
- "treeItem": "Sv3uVW_treeItem",
100
- "treeIcon": "Sv3uVW_treeIcon",
101
102
  "typeCell": "Sv3uVW_typeCell",
102
- "tree": "Sv3uVW_tree",
103
- "emptyStateText": "Sv3uVW_emptyStateText",
104
- "small": "Sv3uVW_small",
103
+ "treeItem": "Sv3uVW_treeItem",
104
+ "heroConnect": "Sv3uVW_heroConnect",
105
+ "actions": "Sv3uVW_actions",
106
+ "da-split": "Sv3uVW_da-split",
105
107
  "sqlActions": "Sv3uVW_sqlActions",
106
- "active": "Sv3uVW_active",
107
- "summaryDb": "Sv3uVW_summaryDb",
108
- "errorIcon": "Sv3uVW_errorIcon",
108
+ "schemaModal": "Sv3uVW_schemaModal",
109
+ "docked": "Sv3uVW_docked",
110
+ "treeCount": "Sv3uVW_treeCount",
109
111
  "cardTitle": "Sv3uVW_cardTitle",
110
- "treeChildren": "Sv3uVW_treeChildren",
111
- "browseIcon": "Sv3uVW_browseIcon",
112
- "sections": "Sv3uVW_sections",
113
- "modalHint": "Sv3uVW_modalHint",
114
- "statusOk": "Sv3uVW_statusOk",
115
- "summaryActions": "Sv3uVW_summaryActions",
116
- "rememberHint": "Sv3uVW_rememberHint",
112
+ "modalBody": "Sv3uVW_modalBody",
113
+ "treeNode": "Sv3uVW_treeNode",
114
+ "emptyState": "Sv3uVW_emptyState",
117
115
  "colScroll": "Sv3uVW_colScroll",
118
- "ghost": "Sv3uVW_ghost",
116
+ "modalHint": "Sv3uVW_modalHint",
119
117
  "card": "Sv3uVW_card",
120
- "nullCell": "Sv3uVW_nullCell",
121
- "errorText": "Sv3uVW_errorText",
118
+ "emptyStateText": "Sv3uVW_emptyStateText",
119
+ "summaryActions": "Sv3uVW_summaryActions",
122
120
  "field": "Sv3uVW_field",
123
- "emptyState": "Sv3uVW_emptyState",
124
- "modalBody": "Sv3uVW_modalBody",
125
- "actions": "Sv3uVW_actions",
126
- "schemaModal": "Sv3uVW_schemaModal",
127
- "errorBar": "Sv3uVW_errorBar",
128
- "workbench": "Sv3uVW_workbench",
121
+ "treeIcon": "Sv3uVW_treeIcon",
129
122
  "fieldRow2": "Sv3uVW_fieldRow2",
130
- "hint": "Sv3uVW_hint",
131
- "summaryRow": "Sv3uVW_summaryRow",
132
- "errorHead": "Sv3uVW_errorHead",
123
+ "input": "Sv3uVW_input",
124
+ "browseChevron": "Sv3uVW_browseChevron",
125
+ "browseRow": "Sv3uVW_browseRow",
133
126
  "strip": "Sv3uVW_strip",
127
+ "heroText": "Sv3uVW_heroText",
128
+ "treeChildren": "Sv3uVW_treeChildren",
129
+ "browseIcon": "Sv3uVW_browseIcon",
130
+ "modalColTitle": "Sv3uVW_modalColTitle",
131
+ "heroTitle": "Sv3uVW_heroTitle",
132
+ "modalCol": "Sv3uVW_modalCol",
133
+ "columnsTable": "Sv3uVW_columnsTable",
134
+ "hint": "Sv3uVW_hint",
135
+ "heroHint": "Sv3uVW_heroHint",
136
+ "errorBar": "Sv3uVW_errorBar",
137
+ "errorIcon": "Sv3uVW_errorIcon",
138
+ "errorText": "Sv3uVW_errorText",
139
+ "connectModal": "Sv3uVW_connectModal",
134
140
  "shortcutHint": "Sv3uVW_shortcutHint",
141
+ "summaryRow": "Sv3uVW_summaryRow",
142
+ "treeScroll": "Sv3uVW_treeScroll",
135
143
  "sqlResult": "Sv3uVW_sqlResult",
136
- "docked": "Sv3uVW_docked",
137
- "modalCol": "Sv3uVW_modalCol"
144
+ "rememberHint": "Sv3uVW_rememberHint",
145
+ "sections": "Sv3uVW_sections"
138
146
  };
139
147
  //#endregion
140
148
  //#region src/client/DataAgentWorkbench.tsx
@@ -395,7 +403,7 @@ window.__ModuleLoader__.load({
395
403
  const [busy, setBusy] = (0, react.useState)(false);
396
404
  const [error, setError] = (0, react.useState)(null);
397
405
  const [connected, setConnected] = (0, react.useState)(false);
398
- const [configOpen, setConfigOpen] = (0, react.useState)(false);
406
+ const [connectModalOpen, setConnectModalOpen] = (0, react.useState)(false);
399
407
  const [restoring, setRestoring] = (0, react.useState)(false);
400
408
  const [schemaModalOpen, setSchemaModalOpen] = (0, react.useState)(false);
401
409
  const [schemas, setSchemas] = (0, react.useState)([]);
@@ -406,38 +414,55 @@ window.__ModuleLoader__.load({
406
414
  const [sql, setSql] = (0, react.useState)("");
407
415
  const [sqlBusy, setSqlBusy] = (0, react.useState)(false);
408
416
  const [sqlResult, setSqlResult] = (0, react.useState)(null);
409
- (0, react.useEffect)(() => {
410
- const column = rootRef.current?.closest("[data-phase]") ?? null;
411
- if (column === null) return;
417
+ (0, react.useLayoutEffect)(() => {
418
+ let column = rootRef.current?.closest("[data-phase]") ?? null;
419
+ const refreshPhase = () => {
420
+ if (column === null) return;
421
+ setPhase((prev) => {
422
+ const next = isHeroPhase(column) ? "hero" : "active";
423
+ return next === prev ? prev : next;
424
+ });
425
+ };
412
426
  const measure = () => {
427
+ if (column === null) return;
413
428
  const rect = column.getBoundingClientRect();
414
- setRailRect({
429
+ const bottom = window.innerHeight - rect.bottom;
430
+ setRailRect((prev) => prev !== null && prev.left === rect.left && prev.top === rect.top && prev.bottom === bottom ? prev : {
415
431
  left: rect.left,
416
432
  top: rect.top,
417
- bottom: window.innerHeight - rect.bottom
433
+ bottom
418
434
  });
419
435
  };
420
- const refreshPhase = () => {
421
- setPhase(isHeroPhase(column) ? "hero" : "active");
422
- };
423
- refreshPhase();
424
- measure();
425
436
  const observer = new MutationObserver(refreshPhase);
426
- observer.observe(column, {
427
- attributes: true,
428
- attributeFilter: ["data-phase"]
429
- });
430
437
  const resizer = new ResizeObserver(measure);
431
- resizer.observe(column);
438
+ const sync = () => {
439
+ const next = rootRef.current?.closest("[data-phase]") ?? null;
440
+ if (next === null) return;
441
+ if (next !== column) {
442
+ observer.disconnect();
443
+ resizer.disconnect();
444
+ column = next;
445
+ observer.observe(column, {
446
+ attributes: true,
447
+ attributeFilter: ["data-phase"]
448
+ });
449
+ resizer.observe(column);
450
+ }
451
+ refreshPhase();
452
+ measure();
453
+ };
454
+ sync();
432
455
  window.addEventListener("resize", measure);
456
+ const poll = window.setInterval(sync, 1e3);
433
457
  return () => {
458
+ window.clearInterval(poll);
434
459
  observer.disconnect();
435
460
  resizer.disconnect();
436
461
  window.removeEventListener("resize", measure);
437
462
  };
438
- }, []);
463
+ }, [isDataAgent]);
439
464
  const split = phase === "active" && railRect !== null;
440
- (0, react.useEffect)(() => {
465
+ (0, react.useLayoutEffect)(() => {
441
466
  const root = document.documentElement;
442
467
  const splitClass = DataAgentWorkbench_module_css_default["da-split"];
443
468
  if (split && splitClass !== void 0) root.classList.add(splitClass);
@@ -500,7 +525,7 @@ window.__ModuleLoader__.load({
500
525
  if (cancelled) return;
501
526
  if (result.ok) {
502
527
  setConnected(true);
503
- setConfigOpen(false);
528
+ setConnectModalOpen(false);
504
529
  const schemasBody = await (await fetch(`/plugins/data-agent/schemas?sessionId=${encodeURIComponent(sessionId)}`)).json();
505
530
  if (!cancelled && schemasBody.ok) setSchemas(schemasBody.schemas ?? []);
506
531
  } else setError(`连接恢复失败:${result.error ?? "unknown error"}`);
@@ -538,7 +563,7 @@ window.__ModuleLoader__.load({
538
563
  const result = await performConnect(sessionId, body);
539
564
  if (result.ok) {
540
565
  setConnected(true);
541
- setConfigOpen(false);
566
+ setConnectModalOpen(false);
542
567
  const schemasBody = await (await fetch(`/plugins/data-agent/schemas?sessionId=${encodeURIComponent(sessionId)}`)).json();
543
568
  if (schemasBody.ok) setSchemas(schemasBody.schemas ?? []);
544
569
  } else setError(result.error ?? "unknown error");
@@ -558,7 +583,6 @@ window.__ModuleLoader__.load({
558
583
  body: JSON.stringify({ sessionId })
559
584
  });
560
585
  setConnected(false);
561
- setConfigOpen(false);
562
586
  setReadonly(false);
563
587
  setSchemaModalOpen(false);
564
588
  setSchemas([]);
@@ -655,7 +679,7 @@ window.__ModuleLoader__.load({
655
679
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
656
680
  className: DataAgentWorkbench_module_css_default.sections,
657
681
  children: [
658
- connected && !configOpen ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
682
+ connected ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
659
683
  className: DataAgentWorkbench_module_css_default.card,
660
684
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
661
685
  className: DataAgentWorkbench_module_css_default.summaryRow,
@@ -683,7 +707,7 @@ window.__ModuleLoader__.load({
683
707
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
684
708
  type: "button",
685
709
  className: `${DataAgentWorkbench_module_css_default.ghost} ${DataAgentWorkbench_module_css_default.small}`,
686
- onClick: () => setConfigOpen(true),
710
+ onClick: () => setConnectModalOpen(true),
687
711
  children: t("action.config")
688
712
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
689
713
  type: "button",
@@ -697,191 +721,27 @@ window.__ModuleLoader__.load({
697
721
  })
698
722
  ]
699
723
  })
700
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
724
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
701
725
  className: DataAgentWorkbench_module_css_default.card,
702
- children: [
703
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
704
- className: DataAgentWorkbench_module_css_default.cardTitle,
705
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DatabaseIcon, { className: DataAgentWorkbench_module_css_default.titleIcon }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("form.title") })]
706
- }),
707
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
708
- className: DataAgentWorkbench_module_css_default.fieldGrid,
709
- children: [
710
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
711
- className: DataAgentWorkbench_module_css_default.field,
712
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
713
- className: DataAgentWorkbench_module_css_default.label,
714
- children: t("form.type")
715
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
716
- className: DataAgentWorkbench_module_css_default.input,
717
- value: type,
718
- disabled: formDisabled,
719
- onChange: (event) => {
720
- const next = event.target.value;
721
- setType(next);
722
- setPort(next === "postgres" ? "5432" : next === "mysql" ? "3306" : next === "oracle" ? "1521" : next === "hive" ? "10000" : next === "impala" ? "21050" : "");
723
- },
724
- children: [
725
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
726
- value: "mysql",
727
- children: t("type.mysql")
728
- }),
729
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
730
- value: "postgres",
731
- children: t("type.postgres")
732
- }),
733
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
734
- value: "sqlite",
735
- children: t("type.sqlite")
736
- }),
737
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
738
- value: "oracle",
739
- children: t("type.oracle")
740
- }),
741
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
742
- value: "hive",
743
- children: t("type.hive")
744
- }),
745
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
746
- value: "impala",
747
- children: t("type.impala")
748
- })
749
- ]
750
- })]
751
- }),
752
- !sqlite && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
753
- className: DataAgentWorkbench_module_css_default.fieldRow2,
754
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
755
- className: DataAgentWorkbench_module_css_default.field,
756
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
757
- className: DataAgentWorkbench_module_css_default.label,
758
- children: t("form.host")
759
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
760
- className: DataAgentWorkbench_module_css_default.input,
761
- type: "text",
762
- value: host,
763
- disabled: formDisabled,
764
- onChange: (event) => setHost(event.target.value)
765
- })]
766
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
767
- className: DataAgentWorkbench_module_css_default.field,
768
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
769
- className: DataAgentWorkbench_module_css_default.label,
770
- children: t("form.port")
771
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
772
- className: DataAgentWorkbench_module_css_default.input,
773
- type: "number",
774
- min: 1,
775
- max: 65535,
776
- value: port,
777
- disabled: formDisabled,
778
- onChange: (event) => setPort(event.target.value)
779
- })]
780
- })]
781
- }),
782
- !sqlite && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
783
- className: DataAgentWorkbench_module_css_default.fieldRow2,
784
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
785
- className: DataAgentWorkbench_module_css_default.field,
786
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
787
- className: DataAgentWorkbench_module_css_default.label,
788
- children: t("form.user")
789
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
790
- className: DataAgentWorkbench_module_css_default.input,
791
- type: "text",
792
- value: user,
793
- disabled: formDisabled,
794
- onChange: (event) => setUser(event.target.value)
795
- })]
796
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
797
- className: DataAgentWorkbench_module_css_default.field,
798
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
799
- className: DataAgentWorkbench_module_css_default.label,
800
- children: t("form.password")
801
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
802
- className: DataAgentWorkbench_module_css_default.input,
803
- type: "password",
804
- value: password,
805
- autoComplete: "new-password",
806
- disabled: formDisabled,
807
- onChange: (event) => setPassword(event.target.value)
808
- })]
809
- })]
810
- }),
811
- !sqlite && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
812
- className: DataAgentWorkbench_module_css_default.rememberRow,
813
- children: [
814
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
815
- type: "checkbox",
816
- checked: rememberPassword,
817
- disabled: formDisabled,
818
- onChange: (event) => setRememberPassword(event.target.checked)
819
- }),
820
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("form.rememberPassword") }),
821
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
822
- className: DataAgentWorkbench_module_css_default.rememberHint,
823
- children: t("form.rememberPassword.hint")
824
- })
825
- ]
826
- }),
827
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
828
- className: DataAgentWorkbench_module_css_default.rememberRow,
829
- children: [
830
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
831
- type: "checkbox",
832
- checked: readonly,
833
- disabled: formDisabled,
834
- onChange: (event) => setReadonly(event.target.checked)
835
- }),
836
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("form.readonly") }),
837
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
838
- className: DataAgentWorkbench_module_css_default.rememberHint,
839
- children: t("form.readonly.hint")
840
- })
841
- ]
842
- }),
843
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
844
- className: DataAgentWorkbench_module_css_default.field,
845
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
846
- className: DataAgentWorkbench_module_css_default.label,
847
- children: databaseLabel
848
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
849
- className: DataAgentWorkbench_module_css_default.input,
850
- type: "text",
851
- value: database,
852
- placeholder: sqlite ? t("form.database.sqlite.placeholder") : void 0,
853
- disabled: formDisabled,
854
- onChange: (event) => setDatabase(event.target.value)
855
- })]
856
- })
857
- ]
858
- }),
859
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
860
- className: DataAgentWorkbench_module_css_default.actions,
861
- children: !connected ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
862
- type: "button",
863
- className: DataAgentWorkbench_module_css_default.primary,
864
- disabled: busy || database === "" || !sqlite && host === "",
865
- onClick: () => {
866
- connect();
867
- },
868
- children: restoring ? t("state.reconnecting") : busy ? t("state.checking") : t("action.connect")
869
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
870
- type: "button",
871
- className: DataAgentWorkbench_module_css_default.ghost,
872
- onClick: () => setConfigOpen(false),
873
- children: t("action.collapse")
874
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
875
- type: "button",
876
- className: DataAgentWorkbench_module_css_default.ghost,
877
- disabled: busy,
878
- onClick: () => {
879
- disconnect();
880
- },
881
- children: t("action.disconnect")
882
- })] })
883
- })
884
- ]
726
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
727
+ type: "button",
728
+ className: DataAgentWorkbench_module_css_default.heroConnect,
729
+ onClick: () => setConnectModalOpen(true),
730
+ children: [
731
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DatabaseIcon, { className: DataAgentWorkbench_module_css_default.heroIcon }),
732
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
733
+ className: DataAgentWorkbench_module_css_default.heroText,
734
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
735
+ className: DataAgentWorkbench_module_css_default.heroTitle,
736
+ children: t("form.hero.title")
737
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
738
+ className: DataAgentWorkbench_module_css_default.heroHint,
739
+ children: t("form.hero.hint")
740
+ })]
741
+ }),
742
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronIcon, { className: DataAgentWorkbench_module_css_default.heroChevron })
743
+ ]
744
+ })
885
745
  }),
886
746
  connected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
887
747
  className: DataAgentWorkbench_module_css_default.card,
@@ -896,7 +756,7 @@ window.__ModuleLoader__.load({
896
756
  ]
897
757
  })
898
758
  }),
899
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
759
+ connected && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
900
760
  className: DataAgentWorkbench_module_css_default.card,
901
761
  children: [
902
762
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -940,7 +800,7 @@ window.__ModuleLoader__.load({
940
800
  })
941
801
  ]
942
802
  }),
943
- error !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
803
+ error !== null && !connectModalOpen && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
944
804
  className: DataAgentWorkbench_module_css_default.errorBar,
945
805
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
946
806
  className: DataAgentWorkbench_module_css_default.errorHead,
@@ -1054,6 +914,200 @@ window.__ModuleLoader__.load({
1054
914
  })]
1055
915
  })]
1056
916
  })
917
+ }),
918
+ connectModalOpen && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
919
+ open: connectModalOpen,
920
+ onClose: () => setConnectModalOpen(false),
921
+ title: t("form.title"),
922
+ closeLabel: t("action.close"),
923
+ className: DataAgentWorkbench_module_css_default.connectModal,
924
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
925
+ className: DataAgentWorkbench_module_css_default.connectModalBody,
926
+ children: [
927
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
928
+ className: DataAgentWorkbench_module_css_default.fieldGrid,
929
+ children: [
930
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
931
+ className: DataAgentWorkbench_module_css_default.field,
932
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
933
+ className: DataAgentWorkbench_module_css_default.label,
934
+ children: t("form.type")
935
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
936
+ className: DataAgentWorkbench_module_css_default.input,
937
+ value: type,
938
+ disabled: formDisabled,
939
+ onChange: (event) => {
940
+ const next = event.target.value;
941
+ setType(next);
942
+ setPort(next === "postgres" ? "5432" : next === "mysql" ? "3306" : next === "oracle" ? "1521" : next === "hive" ? "10000" : next === "impala" ? "21050" : "");
943
+ },
944
+ children: [
945
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
946
+ value: "mysql",
947
+ children: t("type.mysql")
948
+ }),
949
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
950
+ value: "postgres",
951
+ children: t("type.postgres")
952
+ }),
953
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
954
+ value: "sqlite",
955
+ children: t("type.sqlite")
956
+ }),
957
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
958
+ value: "oracle",
959
+ children: t("type.oracle")
960
+ }),
961
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
962
+ value: "hive",
963
+ children: t("type.hive")
964
+ }),
965
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
966
+ value: "impala",
967
+ children: t("type.impala")
968
+ })
969
+ ]
970
+ })]
971
+ }),
972
+ !sqlite && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
973
+ className: DataAgentWorkbench_module_css_default.fieldRow2,
974
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
975
+ className: DataAgentWorkbench_module_css_default.field,
976
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
977
+ className: DataAgentWorkbench_module_css_default.label,
978
+ children: t("form.host")
979
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
980
+ className: DataAgentWorkbench_module_css_default.input,
981
+ type: "text",
982
+ value: host,
983
+ disabled: formDisabled,
984
+ onChange: (event) => setHost(event.target.value)
985
+ })]
986
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
987
+ className: DataAgentWorkbench_module_css_default.field,
988
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
989
+ className: DataAgentWorkbench_module_css_default.label,
990
+ children: t("form.port")
991
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
992
+ className: DataAgentWorkbench_module_css_default.input,
993
+ type: "number",
994
+ min: 1,
995
+ max: 65535,
996
+ value: port,
997
+ disabled: formDisabled,
998
+ onChange: (event) => setPort(event.target.value)
999
+ })]
1000
+ })]
1001
+ }),
1002
+ !sqlite && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1003
+ className: DataAgentWorkbench_module_css_default.fieldRow2,
1004
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1005
+ className: DataAgentWorkbench_module_css_default.field,
1006
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1007
+ className: DataAgentWorkbench_module_css_default.label,
1008
+ children: t("form.user")
1009
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1010
+ className: DataAgentWorkbench_module_css_default.input,
1011
+ type: "text",
1012
+ value: user,
1013
+ disabled: formDisabled,
1014
+ onChange: (event) => setUser(event.target.value)
1015
+ })]
1016
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1017
+ className: DataAgentWorkbench_module_css_default.field,
1018
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1019
+ className: DataAgentWorkbench_module_css_default.label,
1020
+ children: t("form.password")
1021
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1022
+ className: DataAgentWorkbench_module_css_default.input,
1023
+ type: "password",
1024
+ value: password,
1025
+ autoComplete: "new-password",
1026
+ disabled: formDisabled,
1027
+ onChange: (event) => setPassword(event.target.value)
1028
+ })]
1029
+ })]
1030
+ }),
1031
+ !sqlite && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1032
+ className: DataAgentWorkbench_module_css_default.rememberRow,
1033
+ children: [
1034
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1035
+ type: "checkbox",
1036
+ checked: rememberPassword,
1037
+ disabled: formDisabled,
1038
+ onChange: (event) => setRememberPassword(event.target.checked)
1039
+ }),
1040
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("form.rememberPassword") }),
1041
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1042
+ className: DataAgentWorkbench_module_css_default.rememberHint,
1043
+ children: t("form.rememberPassword.hint")
1044
+ })
1045
+ ]
1046
+ }),
1047
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1048
+ className: DataAgentWorkbench_module_css_default.rememberRow,
1049
+ children: [
1050
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1051
+ type: "checkbox",
1052
+ checked: readonly,
1053
+ disabled: formDisabled,
1054
+ onChange: (event) => setReadonly(event.target.checked)
1055
+ }),
1056
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("form.readonly") }),
1057
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1058
+ className: DataAgentWorkbench_module_css_default.rememberHint,
1059
+ children: t("form.readonly.hint")
1060
+ })
1061
+ ]
1062
+ }),
1063
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1064
+ className: DataAgentWorkbench_module_css_default.field,
1065
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1066
+ className: DataAgentWorkbench_module_css_default.label,
1067
+ children: databaseLabel
1068
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1069
+ className: DataAgentWorkbench_module_css_default.input,
1070
+ type: "text",
1071
+ value: database,
1072
+ placeholder: sqlite ? t("form.database.sqlite.placeholder") : void 0,
1073
+ disabled: formDisabled,
1074
+ onChange: (event) => setDatabase(event.target.value)
1075
+ })]
1076
+ })
1077
+ ]
1078
+ }),
1079
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1080
+ className: DataAgentWorkbench_module_css_default.actions,
1081
+ children: !connected ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1082
+ type: "button",
1083
+ className: DataAgentWorkbench_module_css_default.primary,
1084
+ disabled: busy || database === "" || !sqlite && host === "",
1085
+ onClick: () => {
1086
+ connect();
1087
+ },
1088
+ children: restoring ? t("state.reconnecting") : busy ? t("state.checking") : t("action.connect")
1089
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1090
+ type: "button",
1091
+ className: DataAgentWorkbench_module_css_default.ghost,
1092
+ disabled: busy,
1093
+ onClick: () => {
1094
+ disconnect();
1095
+ },
1096
+ children: t("action.disconnect")
1097
+ })
1098
+ }),
1099
+ error !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1100
+ className: DataAgentWorkbench_module_css_default.errorBar,
1101
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1102
+ className: DataAgentWorkbench_module_css_default.errorHead,
1103
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertIcon, { className: DataAgentWorkbench_module_css_default.errorIcon }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("error.title") })]
1104
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1105
+ className: DataAgentWorkbench_module_css_default.errorText,
1106
+ children: error
1107
+ })]
1108
+ })
1109
+ ]
1110
+ })
1057
1111
  })
1058
1112
  ]
1059
1113
  });
@@ -1066,6 +1120,8 @@ window.__ModuleLoader__.load({
1066
1120
  /** Simplified Chinese dictionary (the key-set source of truth). */
1067
1121
  const zh = {
1068
1122
  "form.title": "数据库连接",
1123
+ "form.hero.title": "连接数据库",
1124
+ "form.hero.hint": "连接 MySQL / PostgreSQL / SQLite 等,开始与数据 Agent 对话",
1069
1125
  "form.type": "数据库类型",
1070
1126
  "type.mysql": "MySQL",
1071
1127
  "type.postgres": "PostgreSQL",
@@ -1109,12 +1165,13 @@ window.__ModuleLoader__.load({
1109
1165
  "action.config": "连接配置",
1110
1166
  "action.browse": "库表",
1111
1167
  "action.close": "关闭",
1112
- "action.collapse": "收起",
1113
1168
  "error.title": "操作失败"
1114
1169
  };
1115
1170
  /** English dictionary, checked complete against the zh key set. */
1116
1171
  const en = {
1117
1172
  "form.title": "Database connection",
1173
+ "form.hero.title": "Connect database",
1174
+ "form.hero.hint": "Connect MySQL / PostgreSQL / SQLite and start chatting with the data agent",
1118
1175
  "form.type": "Database type",
1119
1176
  "type.mysql": "MySQL",
1120
1177
  "type.postgres": "PostgreSQL",
@@ -1158,7 +1215,6 @@ window.__ModuleLoader__.load({
1158
1215
  "action.config": "Connection settings",
1159
1216
  "action.browse": "Tables",
1160
1217
  "action.close": "Close",
1161
- "action.collapse": "Collapse",
1162
1218
  "error.title": "Operation failed"
1163
1219
  };
1164
1220
  //#endregion