Full Code of CodePhiliaX/Chat2DB for AI

main 15ec66005e92 cached
1633 files
4.7 MB
1.3M tokens
5801 symbols
1 requests
Download .txt
Showing preview only (5,375K chars total). Download the full file or copy to clipboard to get everything.
Repository: CodePhiliaX/Chat2DB
Branch: main
Commit: 15ec66005e92
Files: 1633
Total size: 4.7 MB

Directory structure:
gitextract_docf9pkb/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yml
│   │   ├── optimized.md
│   │   └── suggest.md
│   └── workflows/
│       ├── pushdocker.yml
│       ├── release.yml
│       ├── release_test.yml
│       └── release_test_2.yml
├── .gitignore
├── .vscode/
│   └── settings.json
├── CHANGELOG.md
├── CHANGELOG_CN.md
├── CHAT2DB_AI_SQL.md
├── Chat2DB_LICENSE
├── LICENSE
├── README.md
├── README_CN.md
├── README_JA.md
├── chat2db-client/
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .npmrc
│   ├── .prettierignore
│   ├── .prettierrc
│   ├── .umirc.prod.desktop.ts
│   ├── .umirc.prod.ts
│   ├── .umirc.ts
│   ├── .vscode/
│   │   └── settings.json
│   ├── mock/
│   │   └── sqlResult.json
│   ├── package.json
│   ├── readme.md
│   ├── src/
│   │   ├── assets/
│   │   │   ├── font/
│   │   │   │   ├── demo.css
│   │   │   │   ├── demo_index.html
│   │   │   │   ├── iconfont.css
│   │   │   │   ├── iconfont.js
│   │   │   │   └── iconfont.json
│   │   │   └── logo/
│   │   │       └── logo.icns
│   │   ├── blocks/
│   │   │   ├── AppTitleBar/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CreateConnection/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── DatabaseTableEditor/
│   │   │   │   ├── BaseInfo/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ColumnList/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── IncludeCol/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── IndexList/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── RealTimeSQL/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── SequenceEditor/
│   │   │   │   ├── BaseInfo/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── IncludeCol/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── RealTimeSQL/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Setting/
│   │   │   │   ├── About/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── AiSetting/
│   │   │   │   │   ├── aiTypeConfig.ts
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── BaseSetting/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ProxySetting/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── UpdateDetection/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   └── Tree/
│   │   │       ├── functions/
│   │   │       │   ├── deleteSequence.tsx
│   │   │       │   ├── deleteTable.less
│   │   │       │   ├── deleteTable.tsx
│   │   │       │   ├── openAsyncSql.ts
│   │   │       │   ├── pinTable.ts
│   │   │       │   ├── refresh.ts
│   │   │       │   ├── viewDDL.less
│   │   │       │   └── viewDDL.tsx
│   │   │       ├── hooks/
│   │   │       │   ├── useGetRightClickMenu.ts
│   │   │       │   └── useTreeNodeFocus.ts
│   │   │       ├── index.less
│   │   │       ├── index.tsx
│   │   │       ├── treeConfig.tsx
│   │   │       └── treeStore.ts
│   │   ├── components/
│   │   │   ├── BrandLogo/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CascaderDB/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ConnectionEdit/
│   │   │   │   ├── components/
│   │   │   │   │   └── Driver/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── config/
│   │   │   │   │   ├── dataSource.ts
│   │   │   │   │   ├── enum.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ConsoleEditor/
│   │   │   │   ├── components/
│   │   │   │   │   ├── ChatInput/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── OperationLine/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── SelectBoundInfo/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── hooks/
│   │   │   │   │   ├── useModuleData.ts
│   │   │   │   │   └── useSaveEditorData.ts
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CreateDatabase/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CustomLayout/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CustomSelect/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── DraggableContainer/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── EditDialog/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ExecuteSQL/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Iconfont/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ImportBlock/
│   │   │   │   └── index.tsx
│   │   │   ├── ImportConnection/
│   │   │   │   └── index.tsx
│   │   │   ├── LayoutBasic/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Loading/
│   │   │   │   ├── LazyLoading/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Loading/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── LoadingContent/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── LoadingGracile/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   └── LoadingLiquid/
│   │   │   │       ├── index.less
│   │   │   │       └── index.tsx
│   │   │   ├── MenuLabel/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Modal/
│   │   │   │   ├── BaseModal/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── MonacoEditorModal/
│   │   │   │   │   └── index.tsx
│   │   │   │   └── TriggeredModal/
│   │   │   │       ├── index.less
│   │   │   │       └── index.tsx
│   │   │   ├── MonacoEditor/
│   │   │   │   ├── index.less
│   │   │   │   ├── index.tsx
│   │   │   │   ├── monacoEditorConfig.ts
│   │   │   │   ├── syntax-parser/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lexer/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── token.ts
│   │   │   │   │   ├── parser/
│   │   │   │   │   │   ├── chain.ts
│   │   │   │   │   │   ├── define.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── match.ts
│   │   │   │   │   │   ├── scanner.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   └── plugin/
│   │   │   │   │       ├── monaco-plugin/
│   │   │   │   │       │   ├── default-opts.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   └── parser.worker.ts
│   │   │   │   │       └── sql-parser/
│   │   │   │   │           ├── base/
│   │   │   │   │           │   ├── define.ts
│   │   │   │   │           │   ├── four-operations.ts
│   │   │   │   │           │   ├── parser.ts
│   │   │   │   │           │   ├── reader.ts
│   │   │   │   │           │   ├── reserve-keys.ts
│   │   │   │   │           │   └── utils.ts
│   │   │   │   │           ├── index.tsx
│   │   │   │   │           └── mysql/
│   │   │   │   │               ├── index.ts
│   │   │   │   │               ├── lexer.ts
│   │   │   │   │               └── parser.ts
│   │   │   │   └── useMonacoTheme.ts
│   │   │   ├── MyNotification/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Output/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Popularize/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── RefreshLoadingButton/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ScrollLoading/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── SearchResult/
│   │   │   │   ├── components/
│   │   │   │   │   ├── OperationalDataBar/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Pagination/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── RightClickMenu/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── ScreeningResult/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── StatusBar/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── TableBox/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── hooks/
│   │   │   │   │   ├── useCurdTableData.ts
│   │   │   │   │   ├── useMultipleSelect.ts
│   │   │   │   │   └── usePasteData.ts
│   │   │   │   ├── index.less
│   │   │   │   ├── index.tsx
│   │   │   │   └── utils.tsx
│   │   │   ├── ShortcutKey/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── SingleFileMonacoEditor/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── StateIndicator/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Tabs/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── UploadDriver/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ViewDDL/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   └── XXXX_FN/
│   │   │       ├── index.less
│   │   │       └── index.tsx
│   │   ├── constants/
│   │   │   ├── IntelliSense/
│   │   │   │   ├── index.ts
│   │   │   │   ├── mysql.ts
│   │   │   │   ├── oracle.ts
│   │   │   │   ├── pgsql.ts
│   │   │   │   ├── redis.ts
│   │   │   │   └── sqlserver.ts
│   │   │   ├── appConfig.ts
│   │   │   ├── chat.ts
│   │   │   ├── common.ts
│   │   │   ├── console.ts
│   │   │   ├── database.ts
│   │   │   ├── editTable.ts
│   │   │   ├── environment.ts
│   │   │   ├── index.ts
│   │   │   ├── table.ts
│   │   │   ├── theme.ts
│   │   │   ├── tree.ts
│   │   │   └── workspace.ts
│   │   ├── hooks/
│   │   │   ├── getConnection.ts
│   │   │   ├── index.ts
│   │   │   ├── useClickAndDoubleClick.ts
│   │   │   ├── useEventSource.ts
│   │   │   ├── useFocusData.ts
│   │   │   ├── usePollRequestService.ts
│   │   │   ├── useTheme.ts
│   │   │   └── useUpdateEffect.ts
│   │   ├── i18n/
│   │   │   ├── en-us/
│   │   │   │   ├── chat.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── connection.ts
│   │   │   │   ├── dashboard.ts
│   │   │   │   ├── editSequence.ts
│   │   │   │   ├── editTable.ts
│   │   │   │   ├── editTableData.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── login.ts
│   │   │   │   ├── menu.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── sqlEditor.ts
│   │   │   │   ├── team.ts
│   │   │   │   └── workspace.ts
│   │   │   ├── index.tsx
│   │   │   ├── ja-jp/
│   │   │   │   ├── chat.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── connection.ts
│   │   │   │   ├── dashboard.ts
│   │   │   │   ├── editSequence.ts
│   │   │   │   ├── editTable.ts
│   │   │   │   ├── editTableData.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── login.ts
│   │   │   │   ├── menu.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── sqlEditor.ts
│   │   │   │   ├── team.ts
│   │   │   │   └── workspace.ts
│   │   │   ├── tr-tr/
│   │   │   │   ├── chat.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── connection.ts
│   │   │   │   ├── dashboard.ts
│   │   │   │   ├── editSequence.ts
│   │   │   │   ├── editTable.ts
│   │   │   │   ├── editTableData.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── login.ts
│   │   │   │   ├── menu.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── sqlEditor.ts
│   │   │   │   ├── team.ts
│   │   │   │   └── workspace.ts
│   │   │   └── zh-cn/
│   │   │       ├── chat.ts
│   │   │       ├── common.ts
│   │   │       ├── connection.ts
│   │   │       ├── dashboard.ts
│   │   │       ├── editSequence.ts
│   │   │       ├── editTable.ts
│   │   │       ├── editTableData.ts
│   │   │       ├── index.ts
│   │   │       ├── login.ts
│   │   │       ├── menu.ts
│   │   │       ├── setting.ts
│   │   │       ├── sqlEditor.ts
│   │   │       ├── team.ts
│   │   │       └── workspace.ts
│   │   ├── indexedDB/
│   │   │   ├── index.ts
│   │   │   └── table.ts
│   │   ├── layouts/
│   │   │   ├── GlobalLayout/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   └── init/
│   │   │       ├── GlobalComponent.tsx
│   │   │       ├── init.ts
│   │   │       ├── initIndexedDB.ts
│   │   │       ├── registerElectronApi.ts
│   │   │       ├── registerMessage.ts
│   │   │       └── registerNotification.ts
│   │   ├── main/
│   │   │   ├── analysis.js
│   │   │   ├── constants.js
│   │   │   ├── ga4.js
│   │   │   ├── i18n/
│   │   │   │   ├── en/
│   │   │   │   │   └── index.js
│   │   │   │   ├── index.js
│   │   │   │   └── zh-cn/
│   │   │   │       └── index.js
│   │   │   ├── index.js
│   │   │   ├── main.js
│   │   │   ├── main.js.LICENSE.txt
│   │   │   ├── menu.js
│   │   │   ├── package.json
│   │   │   ├── preload.js
│   │   │   ├── store.js
│   │   │   ├── utils.js
│   │   │   └── webpack.config.js
│   │   ├── pages/
│   │   │   ├── demo/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── document.ejs
│   │   │   ├── login/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── main/
│   │   │   │   ├── connection/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── dashboard/
│   │   │   │   │   ├── chart/
│   │   │   │   │   │   ├── bar/
│   │   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── line/
│   │   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   └── pie/
│   │   │   │   │   │       ├── index.less
│   │   │   │   │   │       └── index.tsx
│   │   │   │   │   ├── chart-item/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── index.less
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── left-block/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── functions/
│   │   │   │   │   └── getConnection.ts
│   │   │   │   ├── index.less
│   │   │   │   ├── index.tsx
│   │   │   │   ├── store/
│   │   │   │   │   ├── connection/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── main/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── monaco/
│   │   │   │   │       └── index.ts
│   │   │   │   ├── team/
│   │   │   │   │   ├── datasource-management/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── index.less
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── team-management/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── universal-add-modal/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── universal-drawer/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── user-management/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   └── workspace/
│   │   │   │       ├── components/
│   │   │   │       │   ├── OperationLine/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── SQLExecute/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── SaveList/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── TableList/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── ViewAllTable/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── WorkspaceExtend/
│   │   │   │       │   │   ├── GlobalExtendComponents/
│   │   │   │       │   │   │   ├── index.less
│   │   │   │       │   │   │   └── index.tsx
│   │   │   │       │   │   ├── WorkspaceExtendBody/
│   │   │   │       │   │   │   ├── index.less
│   │   │   │       │   │   │   └── index.tsx
│   │   │   │       │   │   ├── WorkspaceExtendNav/
│   │   │   │       │   │   │   ├── index.less
│   │   │   │       │   │   │   └── index.tsx
│   │   │   │       │   │   ├── config.tsx
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── WorkspaceLeft/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── WorkspaceLeftHeader/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── WorkspaceRight/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   └── WorkspaceTabs/
│   │   │   │       │       ├── index.less
│   │   │   │       │       └── index.tsx
│   │   │   │       ├── functions/
│   │   │   │       │   └── shortcutKeyCreateConsole.ts
│   │   │   │       ├── index.less
│   │   │   │       ├── index.tsx
│   │   │   │       └── store/
│   │   │   │           ├── common.ts
│   │   │   │           ├── config.ts
│   │   │   │           ├── console.ts
│   │   │   │           ├── index.ts
│   │   │   │           └── modal.ts
│   │   │   └── test/
│   │   │       ├── index.less
│   │   │       └── index.tsx
│   │   ├── service/
│   │   │   ├── ai.ts
│   │   │   ├── base.ts
│   │   │   ├── config.ts
│   │   │   ├── connection.ts
│   │   │   ├── dashboard.ts
│   │   │   ├── history.ts
│   │   │   ├── misc.tsx
│   │   │   ├── outside.ts
│   │   │   ├── sql.ts
│   │   │   ├── team.ts
│   │   │   └── user.ts
│   │   ├── store/
│   │   │   ├── common/
│   │   │   │   ├── appTitleBarConfig.ts
│   │   │   │   ├── components.ts
│   │   │   │   ├── copyFocusedContent.ts
│   │   │   │   └── index.ts
│   │   │   ├── config/
│   │   │   │   └── index.ts
│   │   │   ├── monaco/
│   │   │   │   └── index.ts
│   │   │   ├── setting/
│   │   │   │   └── index.ts
│   │   │   └── user/
│   │   │       └── index.ts
│   │   ├── styles/
│   │   │   ├── antd.less
│   │   │   ├── common.less
│   │   │   ├── global.less
│   │   │   └── var.less
│   │   ├── theme/
│   │   │   ├── abandon/
│   │   │   │   ├── demo/
│   │   │   │   │   ├── dark.less
│   │   │   │   │   └── light.less
│   │   │   │   └── primaryColor.less
│   │   │   ├── background/
│   │   │   │   ├── dark.ts
│   │   │   │   ├── darkDimmed.ts
│   │   │   │   └── light.ts
│   │   │   ├── common.ts
│   │   │   ├── custom/
│   │   │   │   ├── dark.less
│   │   │   │   ├── darkDimmed.less
│   │   │   │   └── light.less
│   │   │   └── index.ts
│   │   ├── typings/
│   │   │   ├── ai.ts
│   │   │   ├── common.ts
│   │   │   ├── connection.ts
│   │   │   ├── console.ts
│   │   │   ├── dashboard.ts
│   │   │   ├── database.ts
│   │   │   ├── editSequence.ts
│   │   │   ├── editTable.ts
│   │   │   ├── index.ts
│   │   │   ├── main.ts
│   │   │   ├── resultTable.ts
│   │   │   ├── setting.ts
│   │   │   ├── team.ts
│   │   │   ├── theme.ts
│   │   │   ├── tree.ts
│   │   │   ├── user.ts
│   │   │   └── workspace.ts
│   │   └── utils/
│   │       ├── IntelliSense/
│   │       │   ├── database.ts
│   │       │   ├── field.ts
│   │       │   ├── index.ts
│   │       │   ├── keyword.ts
│   │       │   ├── table.ts
│   │       │   └── view.ts
│   │       ├── check.ts
│   │       ├── database.ts
│   │       ├── date.ts
│   │       ├── eventSource.ts
│   │       ├── file.ts
│   │       ├── getTree.ts
│   │       ├── index.ts
│   │       ├── localStorage.ts
│   │       ├── lodash.ts
│   │       ├── sort.ts
│   │       ├── sql.ts
│   │       ├── timezone.ts
│   │       ├── url.ts
│   │       └── webpack.ts
│   ├── tsconfig.json
│   └── typings.d.ts
├── chat2db-server/
│   ├── .apifox-helper.properties
│   ├── .easy.api.config
│   ├── .gitignore
│   ├── README.md
│   ├── chat2db-plugins/
│   │   ├── chat2db-clickhouse/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── clickhouse/
│   │   │           │                   ├── ClickHouseDBManage.java
│   │   │           │                   ├── ClickHouseMetaData.java
│   │   │           │                   ├── ClickHousePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── ClickHouseSqlBuilder.java
│   │   │           │                   ├── clickhouse.json
│   │   │           │                   └── type/
│   │   │           │                       ├── ClickHouseColumnTypeEnum.java
│   │   │           │                       ├── ClickHouseEngineTypeEnum.java
│   │   │           │                       └── ClickHouseIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-db2/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── db2/
│   │   │           │                   ├── DB2DBManage.java
│   │   │           │                   ├── DB2MetaData.java
│   │   │           │                   ├── DB2Plugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── DB2SqlBuilder.java
│   │   │           │                   ├── constant/
│   │   │           │                   │   └── SQLConstant.java
│   │   │           │                   ├── db2.json
│   │   │           │                   └── type/
│   │   │           │                       ├── DB2ColumnTypeEnum.java
│   │   │           │                       ├── DB2DefaultValueEnum.java
│   │   │           │                       └── DB2IndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-dm/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── dm/
│   │   │           │                   ├── DMDBManage.java
│   │   │           │                   ├── DMMetaData.java
│   │   │           │                   ├── DMPlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── DMSqlBuilder.java
│   │   │           │                   ├── dm.json
│   │   │           │                   └── type/
│   │   │           │                       ├── DMColumnTypeEnum.java
│   │   │           │                       ├── DMDefaultValueEnum.java
│   │   │           │                       └── DMIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-h2/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── h2/
│   │   │           │                   ├── H2DBManage.java
│   │   │           │                   ├── H2Meta.java
│   │   │           │                   ├── H2Plugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── H2SqlBuilder.java
│   │   │           │                   └── h2.json
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-hive/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── hive/
│   │   │           │                   ├── HiveCommandExecutor.java
│   │   │           │                   ├── HiveDBManage.java
│   │   │           │                   ├── HiveMetaData.java
│   │   │           │                   ├── HivePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── HiveSqlBuilder.java
│   │   │           │                   ├── hive.json
│   │   │           │                   └── type/
│   │   │           │                       ├── HiveColumnTypeEnum.java
│   │   │           │                       └── HiveIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-kingbase/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── kingbase/
│   │   │           │                   ├── KingBaseDBManage.java
│   │   │           │                   ├── KingBaseMetaData.java
│   │   │           │                   ├── KingBasePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── KingBaseSqlBuilder.java
│   │   │           │                   ├── kingbase.json
│   │   │           │                   └── type/
│   │   │           │                       ├── KingBaseColumnTypeEnum.java
│   │   │           │                       ├── KingBaseDefaultValueEnum.java
│   │   │           │                       └── KingBaseIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-mariadb/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── mariadb/
│   │   │           │                   ├── MariaDBManage.java
│   │   │           │                   ├── MariaDBMetaData.java
│   │   │           │                   ├── MariaDBPlugin.java
│   │   │           │                   ├── mariadb.json
│   │   │           │                   └── value/
│   │   │           │                       ├── MariaDBValueProcessor.java
│   │   │           │                       ├── factory/
│   │   │           │                       │   └── MariaDBValueProcessorFactory.java
│   │   │           │                       └── sub/
│   │   │           │                           ├── MariaDBBitProcessor.java
│   │   │           │                           ├── MariaDBGeometryProcessor.java
│   │   │           │                           ├── MariaDBTimestampProcessor.java
│   │   │           │                           └── MariaDBYearProcessor.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-mongodb/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── mongodb/
│   │   │           │                   ├── MongodbCommandExecutor.java
│   │   │           │                   ├── MongodbManage.java
│   │   │           │                   ├── MongodbMetaData.java
│   │   │           │                   ├── MongodbPlugin.java
│   │   │           │                   └── mongodb.json
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-mysql/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── mysql/
│   │   │           │                   ├── MysqlDBManage.java
│   │   │           │                   ├── MysqlMetaData.java
│   │   │           │                   ├── MysqlPlugin.java
│   │   │           │                   ├── MysqlValueHandler.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   ├── MysqlSqlBuilder.java
│   │   │           │                   │   └── form.json
│   │   │           │                   ├── mysql.json
│   │   │           │                   ├── type/
│   │   │           │                   │   ├── MysqlCharsetEnum.java
│   │   │           │                   │   ├── MysqlCollationEnum.java
│   │   │           │                   │   ├── MysqlColumnTypeEnum.java
│   │   │           │                   │   ├── MysqlDefaultValueEnum.java
│   │   │           │                   │   └── MysqlIndexTypeEnum.java
│   │   │           │                   └── value/
│   │   │           │                       ├── GeometryValueHandler.java
│   │   │           │                       ├── MysqlValueProcessor.java
│   │   │           │                       ├── factory/
│   │   │           │                       │   └── MysqlValueProcessorFactory.java
│   │   │           │                       ├── sub/
│   │   │           │                       │   ├── MysqlBinaryProcessor.java
│   │   │           │                       │   ├── MysqlBitProcessor.java
│   │   │           │                       │   ├── MysqlDecimalProcessor.java
│   │   │           │                       │   ├── MysqlGeometryProcessor.java
│   │   │           │                       │   ├── MysqlTextProcessor.java
│   │   │           │                       │   ├── MysqlTimestampProcessor.java
│   │   │           │                       │   ├── MysqlVarBinaryProcessor.java
│   │   │           │                       │   └── MysqlYearProcessor.java
│   │   │           │                       └── template/
│   │   │           │                           └── MysqlDmlValueTemplate.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-oceanbase/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── oceanbase/
│   │   │           │                   ├── OceanBaseDBManage.java
│   │   │           │                   ├── OceanBaseMetaData.java
│   │   │           │                   ├── OceanBasePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── OceanBaseSqlBuilder.java
│   │   │           │                   ├── oceanbase.json
│   │   │           │                   └── type/
│   │   │           │                       ├── OceanBaseColumnTypeEnum.java
│   │   │           │                       └── OceanBaseIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-oracle/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── oracle/
│   │   │           │                   ├── OracleDBManage.java
│   │   │           │                   ├── OracleMetaData.java
│   │   │           │                   ├── OraclePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── OracleSqlBuilder.java
│   │   │           │                   ├── oracle.json
│   │   │           │                   ├── type/
│   │   │           │                   │   ├── OracleColumnTypeEnum.java
│   │   │           │                   │   ├── OracleDefaultValueEnum.java
│   │   │           │                   │   └── OracleIndexTypeEnum.java
│   │   │           │                   └── value/
│   │   │           │                       ├── OracleValueProcessor.java
│   │   │           │                       ├── factory/
│   │   │           │                       │   └── OracleValueProcessorFactory.java
│   │   │           │                       ├── sub/
│   │   │           │                       │   ├── OracleAnyDataProcessor.java
│   │   │           │                       │   ├── OracleBlobProcessor.java
│   │   │           │                       │   ├── OracleClobProcessor.java
│   │   │           │                       │   ├── OracleDateProcessor.java
│   │   │           │                       │   ├── OracleIntervalDSProcessor.java
│   │   │           │                       │   ├── OracleIntervalYMProcessor.java
│   │   │           │                       │   ├── OracleLongRawProcessor.java
│   │   │           │                       │   ├── OracleNumberProcessor.java
│   │   │           │                       │   ├── OracleRawValueProcessor.java
│   │   │           │                       │   ├── OracleTimeStampLTZProcessor.java
│   │   │           │                       │   ├── OracleTimeStampProcessor.java
│   │   │           │                       │   ├── OracleTimeStampTZProcessor.java
│   │   │           │                       │   └── OracleXmlValueProcessor.java
│   │   │           │                       └── template/
│   │   │           │                           └── OracleDmlValueTemplate.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-postgresql/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── postgresql/
│   │   │           │                   ├── PostgreSQLDBManage.java
│   │   │           │                   ├── PostgreSQLMetaData.java
│   │   │           │                   ├── PostgreSQLPlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── PostgreSQLSqlBuilder.java
│   │   │           │                   ├── consts/
│   │   │           │                   │   ├── SQLConst.java
│   │   │           │                   │   └── SequenceCommonConst.java
│   │   │           │                   ├── pg.json
│   │   │           │                   └── type/
│   │   │           │                       ├── PostgreSQLCharsetEnum.java
│   │   │           │                       ├── PostgreSQLCollationEnum.java
│   │   │           │                       ├── PostgreSQLColumnTypeEnum.java
│   │   │           │                       ├── PostgreSQLDefaultValueEnum.java
│   │   │           │                       └── PostgreSQLIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-presto/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── presto/
│   │   │           │                   ├── PrestoDBManage.java
│   │   │           │                   ├── PrestoMetaData.java
│   │   │           │                   ├── PrestoPlugin.java
│   │   │           │                   └── presto.json
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-sqlite/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── sqlite/
│   │   │           │                   ├── SqliteDBManage.java
│   │   │           │                   ├── SqliteMetaData.java
│   │   │           │                   ├── SqlitePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── SqliteBuilder.java
│   │   │           │                   ├── sqlite.json
│   │   │           │                   └── type/
│   │   │           │                       ├── SqliteCharsetEnum.java
│   │   │           │                       ├── SqliteCollationEnum.java
│   │   │           │                       ├── SqliteColumnTypeEnum.java
│   │   │           │                       ├── SqliteDefaultValueEnum.java
│   │   │           │                       └── SqliteIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-sqlserver/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── sqlserver/
│   │   │           │                   ├── SqlServerCommandExecutor.java
│   │   │           │                   ├── SqlServerDBManage.java
│   │   │           │                   ├── SqlServerMetaData.java
│   │   │           │                   ├── SqlServerPlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── SqlServerSqlBuilder.java
│   │   │           │                   ├── sqlserver.json
│   │   │           │                   └── type/
│   │   │           │                       ├── SqlServerColumnTypeEnum.java
│   │   │           │                       ├── SqlServerDefaultValueEnum.java
│   │   │           │                       └── SqlServerIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-timeplus/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── timeplus/
│   │   │           │                   ├── TimeplusDBManage.java
│   │   │           │                   ├── TimeplusMetaData.java
│   │   │           │                   ├── TimeplusPlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── TimeplusSqlBuilder.java
│   │   │           │                   ├── timeplus.json
│   │   │           │                   └── type/
│   │   │           │                       ├── TimeplusColumnTypeEnum.java
│   │   │           │                       ├── TimeplusEngineTypeEnum.java
│   │   │           │                       └── TimeplusIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   └── pom.xml
│   ├── chat2db-server-domain/
│   │   ├── README.md
│   │   ├── chat2db-server-domain-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── domain/
│   │   │                               └── api/
│   │   │                                   ├── chart/
│   │   │                                   │   ├── ChartCreateParam.java
│   │   │                                   │   ├── ChartListQueryParam.java
│   │   │                                   │   ├── ChartPageQueryParam.java
│   │   │                                   │   ├── ChartQueryParam.java
│   │   │                                   │   └── ChartUpdateParam.java
│   │   │                                   ├── enums/
│   │   │                                   │   ├── AccessObjectTypeEnum.java
│   │   │                                   │   ├── AiSqlSourceEnum.java
│   │   │                                   │   ├── DataSourceKindEnum.java
│   │   │                                   │   ├── DeletedTypeEnum.java
│   │   │                                   │   ├── EnvironmentEnum.java
│   │   │                                   │   ├── ExportFileSuffix.java
│   │   │                                   │   ├── ExportSizeEnum.java
│   │   │                                   │   ├── ExportTypeEnum.java
│   │   │                                   │   ├── OperationStatusEnum.java
│   │   │                                   │   ├── RoleCodeEnum.java
│   │   │                                   │   ├── TableVectorEnum.java
│   │   │                                   │   ├── TaskStatusEnum.java
│   │   │                                   │   ├── TaskTypeEnum.java
│   │   │                                   │   └── ValidStatusEnum.java
│   │   │                                   ├── model/
│   │   │                                   │   ├── AIConfig.java
│   │   │                                   │   ├── Chart.java
│   │   │                                   │   ├── ChatGptConfig.java
│   │   │                                   │   ├── Config.java
│   │   │                                   │   ├── Dashboard.java
│   │   │                                   │   ├── DataSource.java
│   │   │                                   │   ├── DataSourceAccess.java
│   │   │                                   │   ├── DataSourceAccessObject.java
│   │   │                                   │   ├── Environment.java
│   │   │                                   │   ├── IndexInfo.java
│   │   │                                   │   ├── Operation.java
│   │   │                                   │   ├── OperationLog.java
│   │   │                                   │   ├── TableParameter.java
│   │   │                                   │   ├── Task.java
│   │   │                                   │   ├── Team.java
│   │   │                                   │   ├── TeamUser.java
│   │   │                                   │   └── User.java
│   │   │                                   ├── param/
│   │   │                                   │   ├── ConsoleCloseParam.java
│   │   │                                   │   ├── ConsoleConnectParam.java
│   │   │                                   │   ├── ConsoleCreateParam.java
│   │   │                                   │   ├── DlCountParam.java
│   │   │                                   │   ├── DlExecuteParam.java
│   │   │                                   │   ├── DmlSqlCopyParam.java
│   │   │                                   │   ├── DropParam.java
│   │   │                                   │   ├── EnvironmentPageQueryParam.java
│   │   │                                   │   ├── GroupByParam.java
│   │   │                                   │   ├── MetaDataQueryParam.java
│   │   │                                   │   ├── OrderByParam.java
│   │   │                                   │   ├── PinTableParam.java
│   │   │                                   │   ├── SchemaOperationParam.java
│   │   │                                   │   ├── SchemaQueryParam.java
│   │   │                                   │   ├── SelectResultOperation.java
│   │   │                                   │   ├── SequencePageQueryParam.java
│   │   │                                   │   ├── SequenceQueryParam.java
│   │   │                                   │   ├── ShowCreateSequenceParam.java
│   │   │                                   │   ├── ShowCreateTableParam.java
│   │   │                                   │   ├── SqlAnalyseParam.java
│   │   │                                   │   ├── SystemConfigParam.java
│   │   │                                   │   ├── TablePageQueryParam.java
│   │   │                                   │   ├── TableQueryParam.java
│   │   │                                   │   ├── TableSelector.java
│   │   │                                   │   ├── TableVectorParam.java
│   │   │                                   │   ├── TaskCreateParam.java
│   │   │                                   │   ├── TaskPageParam.java
│   │   │                                   │   ├── TaskUpdateParam.java
│   │   │                                   │   ├── TypeQueryParam.java
│   │   │                                   │   ├── UpdateSelectResultParam.java
│   │   │                                   │   ├── dashboard/
│   │   │                                   │   │   ├── DashboardCreateParam.java
│   │   │                                   │   │   ├── DashboardPageQueryParam.java
│   │   │                                   │   │   ├── DashboardQueryParam.java
│   │   │                                   │   │   ├── DashboardSelector.java
│   │   │                                   │   │   └── DashboardUpdateParam.java
│   │   │                                   │   ├── datasource/
│   │   │                                   │   │   ├── DataSourceCloseParam.java
│   │   │                                   │   │   ├── DataSourceCreateParam.java
│   │   │                                   │   │   ├── DataSourcePageQueryParam.java
│   │   │                                   │   │   ├── DataSourcePreConnectParam.java
│   │   │                                   │   │   ├── DataSourceSelector.java
│   │   │                                   │   │   ├── DataSourceTestParam.java
│   │   │                                   │   │   ├── DataSourceUpdateParam.java
│   │   │                                   │   │   ├── DatabaseCreateParam.java
│   │   │                                   │   │   ├── DatabaseExportDataParam.java
│   │   │                                   │   │   ├── DatabaseExportParam.java
│   │   │                                   │   │   ├── DatabaseQueryAllParam.java
│   │   │                                   │   │   └── access/
│   │   │                                   │   │       ├── DataSourceAccessBatchCreatParam.java
│   │   │                                   │   │       ├── DataSourceAccessComprehensivePageQueryParam.java
│   │   │                                   │   │       ├── DataSourceAccessCreatParam.java
│   │   │                                   │   │       ├── DataSourceAccessObjectParam.java
│   │   │                                   │   │       ├── DataSourceAccessPageQueryParam.java
│   │   │                                   │   │       └── DataSourceAccessSelector.java
│   │   │                                   │   ├── message/
│   │   │                                   │   │   └── MessageCreateParam.java
│   │   │                                   │   ├── operation/
│   │   │                                   │   │   ├── OperationLogCreateParam.java
│   │   │                                   │   │   ├── OperationLogPageQueryParam.java
│   │   │                                   │   │   ├── OperationPageQueryParam.java
│   │   │                                   │   │   ├── OperationQueryParam.java
│   │   │                                   │   │   ├── OperationSavedParam.java
│   │   │                                   │   │   └── OperationUpdateParam.java
│   │   │                                   │   ├── team/
│   │   │                                   │   │   ├── TeamCreateParam.java
│   │   │                                   │   │   ├── TeamPageQueryParam.java
│   │   │                                   │   │   ├── TeamSelector.java
│   │   │                                   │   │   ├── TeamUpdateParam.java
│   │   │                                   │   │   └── user/
│   │   │                                   │   │       ├── TeamUserComprehensivePageQueryParam.java
│   │   │                                   │   │       ├── TeamUserCreatParam.java
│   │   │                                   │   │       ├── TeamUserPageQueryParam.java
│   │   │                                   │   │       └── TeamUserSelector.java
│   │   │                                   │   └── user/
│   │   │                                   │       ├── UserCreateParam.java
│   │   │                                   │       ├── UserPageQueryParam.java
│   │   │                                   │       ├── UserSelector.java
│   │   │                                   │       └── UserUpdateParam.java
│   │   │                                   └── service/
│   │   │                                       ├── ChartService.java
│   │   │                                       ├── ConfigService.java
│   │   │                                       ├── ConsoleService.java
│   │   │                                       ├── DashboardService.java
│   │   │                                       ├── DataSourceAccessBusinessService.java
│   │   │                                       ├── DataSourceAccessService.java
│   │   │                                       ├── DataSourceService.java
│   │   │                                       ├── DatabaseService.java
│   │   │                                       ├── DlTemplateService.java
│   │   │                                       ├── EnvironmentService.java
│   │   │                                       ├── FunctionService.java
│   │   │                                       ├── JdbcDriverService.java
│   │   │                                       ├── OperationLogService.java
│   │   │                                       ├── OperationService.java
│   │   │                                       ├── PinService.java
│   │   │                                       ├── ProcedureService.java
│   │   │                                       ├── SequenceService.java
│   │   │                                       ├── TableService.java
│   │   │                                       ├── TaskService.java
│   │   │                                       ├── TeamService.java
│   │   │                                       ├── TeamUserService.java
│   │   │                                       ├── TriggerService.java
│   │   │                                       ├── UserService.java
│   │   │                                       ├── ViewService.java
│   │   │                                       └── WebhookSender.java
│   │   ├── chat2db-server-domain-core/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── domain/
│   │   │                               └── core/
│   │   │                                   ├── cache/
│   │   │                                   │   ├── CacheKey.java
│   │   │                                   │   ├── CacheManage.java
│   │   │                                   │   └── MemoryCacheManage.java
│   │   │                                   ├── converter/
│   │   │                                   │   ├── ChartConverter.java
│   │   │                                   │   ├── CommandConverter.java
│   │   │                                   │   ├── ConfigConverter.java
│   │   │                                   │   ├── DashboardConverter.java
│   │   │                                   │   ├── DataSourceAccessConverter.java
│   │   │                                   │   ├── DataSourceConverter.java
│   │   │                                   │   ├── DriverConfigConverter.java
│   │   │                                   │   ├── EnvironmentConverter.java
│   │   │                                   │   ├── OperationConverter.java
│   │   │                                   │   ├── OperationLogConverter.java
│   │   │                                   │   ├── PinTableConverter.java
│   │   │                                   │   ├── TableConverter.java
│   │   │                                   │   ├── TaskConverter.java
│   │   │                                   │   ├── TeamConverter.java
│   │   │                                   │   ├── TeamUserConverter.java
│   │   │                                   │   └── UserConverter.java
│   │   │                                   ├── enums/
│   │   │                                   │   └── ExternalNotificationTypeEnum.java
│   │   │                                   ├── impl/
│   │   │                                   │   ├── ChartServiceImpl.java
│   │   │                                   │   ├── ConfigServiceImpl.java
│   │   │                                   │   ├── ConsoleServiceImpl.java
│   │   │                                   │   ├── DashboardServiceImpl.java
│   │   │                                   │   ├── DataSourceAccessBusinessServiceImpl.java
│   │   │                                   │   ├── DataSourceAccessServiceImpl.java
│   │   │                                   │   ├── DataSourceServiceImpl.java
│   │   │                                   │   ├── DatabaseServiceImpl.java
│   │   │                                   │   ├── DlTemplateServiceImpl.java
│   │   │                                   │   ├── EnvironmentServiceImpl.java
│   │   │                                   │   ├── FunctionServiceImpl.java
│   │   │                                   │   ├── JdbcDriverServiceImpl.java
│   │   │                                   │   ├── OperationLogServiceImpl.java
│   │   │                                   │   ├── OperationServiceImpl.java
│   │   │                                   │   ├── PinServiceImpl.java
│   │   │                                   │   ├── ProcedureServiceImpl.java
│   │   │                                   │   ├── SequenceServiceImpl.java
│   │   │                                   │   ├── TableServiceImpl.java
│   │   │                                   │   ├── TaskServiceImpl.java
│   │   │                                   │   ├── TeamServiceImpl.java
│   │   │                                   │   ├── TeamUserServiceImpl.java
│   │   │                                   │   ├── TriggerServiceImpl.java
│   │   │                                   │   ├── UserServiceImpl.java
│   │   │                                   │   └── ViewServiceImpl.java
│   │   │                                   ├── notification/
│   │   │                                   │   ├── BaseWebhookSender.java
│   │   │                                   │   ├── DingTalkWebhookSender.java
│   │   │                                   │   ├── LarkWebhookSender.java
│   │   │                                   │   └── WeComWebhookSender.java
│   │   │                                   └── util/
│   │   │                                       ├── DesUtil.java
│   │   │                                       ├── H2Functions.java
│   │   │                                       ├── H2Triggers.java
│   │   │                                       ├── MetaNameUtils.java
│   │   │                                       └── PermissionUtils.java
│   │   ├── chat2db-server-domain-repository/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── server/
│   │   │           │               └── domain/
│   │   │           │                   └── repository/
│   │   │           │                       ├── Dbutils.java
│   │   │           │                       ├── MapperUtils.java
│   │   │           │                       ├── entity/
│   │   │           │                       │   ├── ChartDO.java
│   │   │           │                       │   ├── DashboardChartRelationDO.java
│   │   │           │                       │   ├── DashboardDO.java
│   │   │           │                       │   ├── DataSourceAccessDO.java
│   │   │           │                       │   ├── DataSourceDO.java
│   │   │           │                       │   ├── DbhubUserDO.java
│   │   │           │                       │   ├── EnvironmentDO.java
│   │   │           │                       │   ├── JdbcDriverDO.java
│   │   │           │                       │   ├── OperationLogDO.java
│   │   │           │                       │   ├── OperationSavedDO.java
│   │   │           │                       │   ├── PinTableDO.java
│   │   │           │                       │   ├── SystemConfigDO.java
│   │   │           │                       │   ├── TableCacheDO.java
│   │   │           │                       │   ├── TableCacheVersionDO.java
│   │   │           │                       │   ├── TableVectorMappingDO.java
│   │   │           │                       │   ├── TaskDO.java
│   │   │           │                       │   ├── TeamDO.java
│   │   │           │                       │   └── TeamUserDO.java
│   │   │           │                       └── mapper/
│   │   │           │                           ├── ChartMapper.java
│   │   │           │                           ├── DashboardChartRelationMapper.java
│   │   │           │                           ├── DashboardMapper.java
│   │   │           │                           ├── DataSourceAccessCustomMapper.java
│   │   │           │                           ├── DataSourceAccessMapper.java
│   │   │           │                           ├── DataSourceCustomMapper.java
│   │   │           │                           ├── DataSourceMapper.java
│   │   │           │                           ├── DbhubUserMapper.java
│   │   │           │                           ├── EnvironmentMapper.java
│   │   │           │                           ├── JdbcDriverMapper.java
│   │   │           │                           ├── OperationLogMapper.java
│   │   │           │                           ├── OperationSavedMapper.java
│   │   │           │                           ├── PinTableMapper.java
│   │   │           │                           ├── SystemConfigMapper.java
│   │   │           │                           ├── TableCacheMapper.java
│   │   │           │                           ├── TableCacheVersionMapper.java
│   │   │           │                           ├── TableVectorMappingMapper.java
│   │   │           │                           ├── TaskMapper.java
│   │   │           │                           ├── TeamMapper.java
│   │   │           │                           ├── TeamUserCustomMapper.java
│   │   │           │                           └── TeamUserMapper.java
│   │   │           └── resources/
│   │   │               ├── db/
│   │   │               │   ├── migration/
│   │   │               │   │   ├── V1_0_0__初始化信息.sql
│   │   │               │   │   ├── V1_0_2__修改Console.sql
│   │   │               │   │   ├── V1_0_3__增加SSH.sql
│   │   │               │   │   ├── V1_0_4__增加报表.sql
│   │   │               │   │   ├── V1_0_5__增加置顶表.sql
│   │   │               │   │   ├── V1_0_6__初始化demo信息.sql
│   │   │               │   │   ├── V1_0_7__自定义驱动.sql
│   │   │               │   │   ├── V1_0_8__操作保存类型.sql
│   │   │               │   │   ├── V2_1_0__支持环境、用户权限.sql
│   │   │               │   │   ├── V2_1_10__REMOVEdEMO.sql
│   │   │               │   │   ├── V2_1_1__TableCache.sql
│   │   │               │   │   ├── V2_1_2__OPERATION.sql
│   │   │               │   │   ├── V2_1_4__OPERATION.sql
│   │   │               │   │   ├── V2_1_5__TableVector.sql
│   │   │               │   │   ├── V2_1_6__TableVectorUpdate.sql
│   │   │               │   │   ├── V2_1_7__DATASOURCE.sql
│   │   │               │   │   ├── V2_1_8__Chart.sql
│   │   │               │   │   └── V2_1_9__task.sql
│   │   │               │   └── temp/
│   │   │               │       └── V2_1_0__补充.sql
│   │   │               └── mapper/
│   │   │                   ├── ChartMapper.xml
│   │   │                   ├── DashboardChartRelationMapper.xml
│   │   │                   ├── DashboardMapper.xml
│   │   │                   ├── DataSourceAccessCustomMapper.xml
│   │   │                   ├── DataSourceAccessMapper.xml
│   │   │                   ├── DataSourceCustomMapper.xml
│   │   │                   ├── DataSourceMapper.xml
│   │   │                   ├── DbhubUserMapper.xml
│   │   │                   ├── EnvironmentMapper.xml
│   │   │                   ├── JdbcDriverMapper.xml
│   │   │                   ├── OperationLogMapper.xml
│   │   │                   ├── OperationSavedMapper.xml
│   │   │                   ├── PinTableMapper.xml
│   │   │                   ├── SystemConfigMapper.xml
│   │   │                   ├── TableCacheMapper.xml
│   │   │                   ├── TableCacheVersionMapper.xml
│   │   │                   ├── TableVectorMappingMapper.xml
│   │   │                   ├── TaskMapper.xml
│   │   │                   ├── TeamMapper.xml
│   │   │                   ├── TeamUserCustomMapper.xml
│   │   │                   └── TeamUserMapper.xml
│   │   └── pom.xml
│   ├── chat2db-server-start/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── ai/
│   │       │   │       └── chat2db/
│   │       │   │           └── server/
│   │       │   │               └── start/
│   │       │   │                   ├── Application.java
│   │       │   │                   ├── config/
│   │       │   │                   │   ├── config/
│   │       │   │                   │   │   ├── AsyncContextRefreshedListener.java
│   │       │   │                   │   │   ├── Chat2dbForestConfiguration.java
│   │       │   │                   │   │   ├── Chat2dbWebMvcConfigurer.java
│   │       │   │                   │   │   ├── JarDownloadTask.java
│   │       │   │                   │   │   └── WebLogConfiguration.java
│   │       │   │                   │   ├── i18n/
│   │       │   │                   │   │   └── I18nConfig.java
│   │       │   │                   │   ├── interceptor/
│   │       │   │                   │   │   └── CorsFilter.java
│   │       │   │                   │   ├── listener/
│   │       │   │                   │   │   ├── DbhubTomcatConnectorCustomizer.java
│   │       │   │                   │   │   ├── FailedEventApplicationListener.java
│   │       │   │                   │   │   ├── ManageApplicationListener.java
│   │       │   │                   │   │   └── manage/
│   │       │   │                   │   │       ├── ManageMessage.java
│   │       │   │                   │   │       └── MessageTypeEnum.java
│   │       │   │                   │   └── mybatis/
│   │       │   │                   │       └── MyBatisPlusConfig.java
│   │       │   │                   ├── controller/
│   │       │   │                   │   ├── oauth/
│   │       │   │                   │   │   ├── OauthController.java
│   │       │   │                   │   │   └── request/
│   │       │   │                   │   │       └── LoginRequest.java
│   │       │   │                   │   └── thymeleaf/
│   │       │   │                   │       └── ThymeleafController.java
│   │       │   │                   ├── exception/
│   │       │   │                   │   ├── EasyControllerExceptionHandler.java
│   │       │   │                   │   └── convertor/
│   │       │   │                   │       ├── BindExceptionConvertor.java
│   │       │   │                   │       ├── BusinessExceptionConvertor.java
│   │       │   │                   │       ├── DefaultExceptionConvertor.java
│   │       │   │                   │       ├── ExceptionConvertor.java
│   │       │   │                   │       ├── ExceptionConvertorUtils.java
│   │       │   │                   │       ├── MaxUploadSizeExceededExceptionConvertor.java
│   │       │   │                   │       ├── MethodArgumentNotValidExceptionConvertor.java
│   │       │   │                   │       ├── MethodArgumentTypeMismatchExceptionConvertor.java
│   │       │   │                   │       └── ParamExceptionConvertor.java
│   │       │   │                   └── log/
│   │       │   │                       ├── EasyLogSink.java
│   │       │   │                       ├── LogOncePerRequestFilter.java
│   │       │   │                       └── WebLog.java
│   │       │   └── resources/
│   │       │       ├── META-INF/
│   │       │       │   └── spring.factories
│   │       │       ├── application-dev.yml
│   │       │       ├── application-release.yml
│   │       │       ├── application-test.yml
│   │       │       ├── application.yml
│   │       │       ├── i18n/
│   │       │       │   ├── messages.properties
│   │       │       │   ├── messages_en_US.properties
│   │       │       │   └── messages_zh_CN.properties
│   │       │       ├── logback-spring.xml
│   │       │       └── thymeleaf/
│   │       │           └── template.html
│   │       └── test/
│   │           ├── java/
│   │           │   └── ai/
│   │           │       └── chat2db/
│   │           │           └── server/
│   │           │               └── start/
│   │           │                   └── test/
│   │           │                       ├── TestApplication.java
│   │           │                       ├── common/
│   │           │                       │   └── BaseTest.java
│   │           │                       ├── core/
│   │           │                       │   ├── ChartServiceTest.java
│   │           │                       │   ├── ConfigServiceTest.java
│   │           │                       │   ├── ConsoleServiceTest.java
│   │           │                       │   ├── DashboardServiceTest.java
│   │           │                       │   ├── DataSourceAccessBusinessServiceTest.java
│   │           │                       │   ├── DataSourceAccessServiceTest.java
│   │           │                       │   ├── DataSourceServiceTest.java
│   │           │                       │   ├── DatabaseServiceTest.java
│   │           │                       │   ├── DlTemplateServiceTest.java
│   │           │                       │   ├── EnvironmentServiceTest.java
│   │           │                       │   ├── FunctionServiceTest.java
│   │           │                       │   ├── JdbcDriverServiceTest.java
│   │           │                       │   ├── OperationLogServiceTest.java
│   │           │                       │   ├── OperationServiceTest.java
│   │           │                       │   ├── PinServiceTest.java
│   │           │                       │   ├── ProcedureServiceTest.java
│   │           │                       │   ├── TableServiceTest.java
│   │           │                       │   ├── TaskServiceTest.java
│   │           │                       │   ├── TeamServiceTest.java
│   │           │                       │   ├── TeamUserServiceTest.java
│   │           │                       │   ├── TriggerServiceTest.java
│   │           │                       │   ├── UserServiceTest.java
│   │           │                       │   ├── ViewServiceTest.java
│   │           │                       │   └── WebhookServiceTest.java
│   │           │                       ├── dialect/
│   │           │                       │   ├── DialectProperties.java
│   │           │                       │   ├── MariadbDialectProperties.java
│   │           │                       │   ├── MongodbDialectProperties.java
│   │           │                       │   ├── MysqlDialectProperties.java
│   │           │                       │   ├── OracleDialectProperties.java
│   │           │                       │   ├── PostgresqlDialectProperties.java
│   │           │                       │   └── TestUtils.java
│   │           │                       ├── druid/
│   │           │                       │   ├── SerializationUtilsTest.java
│   │           │                       │   ├── SqlUtilsTest.java
│   │           │                       │   └── SqlUtilsTest2.java
│   │           │                       ├── dto/
│   │           │                       │   └── TestDTO.java
│   │           │                       ├── mybatis/
│   │           │                       │   └── MybatisGeneratorTest.java
│   │           │                       └── sql/
│   │           │                           └── DbhubJdbcTemplateTest.java
│   │           └── resources/
│   │               └── logback-test-spring.xml
│   ├── chat2db-server-test/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── test/
│   │           ├── java/
│   │           │   └── ai/
│   │           │       └── chat2db/
│   │           │           └── server/
│   │           │               └── test/
│   │           │                   ├── common/
│   │           │                   │   └── BaseTest.java
│   │           │                   ├── domain/
│   │           │                   │   └── data/
│   │           │                   │       ├── service/
│   │           │                   │       │   ├── ConfigServiceTest.java
│   │           │                   │       │   ├── ConsoleOperationsTest.java
│   │           │                   │       │   ├── DatabaseOperationsTest.java
│   │           │                   │       │   ├── ExampleOperationsTest.java
│   │           │                   │       │   ├── JdbcOperationsTest.java
│   │           │                   │       │   ├── SQLExecutorOperationsTest.java
│   │           │                   │       │   ├── TableOperationsTest.java
│   │           │                   │       │   └── dialect/
│   │           │                   │       │       ├── ClickHouseDialectProperties.java
│   │           │                   │       │       ├── DialectProperties.java
│   │           │                   │       │       ├── H2DialectProperties.java
│   │           │                   │       │       ├── MysqlDialectProperties.java
│   │           │                   │       │       ├── OracleDialectProperties.java
│   │           │                   │       │       ├── PostgresqlDialectProperties.java
│   │           │                   │       │       ├── SQLITEDialectProperties.java
│   │           │                   │       │       └── SQLServerDialectProperties.java
│   │           │                   │       └── utils/
│   │           │                   │           └── TestUtils.java
│   │           │                   └── temp/
│   │           │                       ├── HttpTest.java
│   │           │                       ├── SQLParseTest.java
│   │           │                       ├── SqlTest.java
│   │           │                       ├── TempTest.java
│   │           │                       └── UserTest.java
│   │           └── resources/
│   │               ├── h2/
│   │               │   ├── init.sql
│   │               │   ├── init_close.sql
│   │               │   └── init_transaction.sql
│   │               └── logback-test-spring.xml
│   ├── chat2db-server-tools/
│   │   ├── chat2db-server-tools-base/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── tools/
│   │   │                               └── base/
│   │   │                                   ├── constant/
│   │   │                                   │   ├── EasyToolsConstant.java
│   │   │                                   │   └── SymbolConstant.java
│   │   │                                   ├── enums/
│   │   │                                   │   ├── BaseEnum.java
│   │   │                                   │   ├── DataSourceTypeEnum.java
│   │   │                                   │   ├── DeletedIdEnum.java
│   │   │                                   │   ├── OperationEnum.java
│   │   │                                   │   ├── OrderByDirectionEnum.java
│   │   │                                   │   ├── StatusEnum.java
│   │   │                                   │   ├── SystemEnvironmentEnum.java
│   │   │                                   │   ├── WhiteListTypeEnum.java
│   │   │                                   │   └── YesOrNoEnum.java
│   │   │                                   ├── excption/
│   │   │                                   │   ├── BusinessException.java
│   │   │                                   │   └── SystemException.java
│   │   │                                   ├── handler/
│   │   │                                   │   └── EasyCallBackHandler.java
│   │   │                                   └── wrapper/
│   │   │                                       ├── Result.java
│   │   │                                       ├── Traceable.java
│   │   │                                       ├── param/
│   │   │                                       │   ├── OrderBy.java
│   │   │                                       │   ├── OrderCondition.java
│   │   │                                       │   ├── PageQueryParam.java
│   │   │                                       │   └── QueryParam.java
│   │   │                                       ├── request/
│   │   │                                       │   └── PageQueryRequest.java
│   │   │                                       └── result/
│   │   │                                           ├── ActionResult.java
│   │   │                                           ├── DataResult.java
│   │   │                                           ├── ListResult.java
│   │   │                                           ├── PageResult.java
│   │   │                                           └── web/
│   │   │                                               └── WebPageResult.java
│   │   ├── chat2db-server-tools-common/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── tools/
│   │   │                               └── common/
│   │   │                                   ├── config/
│   │   │                                   │   ├── Chat2dbProperties.java
│   │   │                                   │   └── GlobalDict.java
│   │   │                                   ├── enums/
│   │   │                                   │   └── ModeEnum.java
│   │   │                                   ├── exception/
│   │   │                                   │   ├── ConnectionException.java
│   │   │                                   │   ├── DataAlreadyExistsBusinessException.java
│   │   │                                   │   ├── DataNotFoundException.java
│   │   │                                   │   ├── NeedLoggedInBusinessException.java
│   │   │                                   │   ├── ParamBusinessException.java
│   │   │                                   │   ├── PermissionDeniedBusinessException.java
│   │   │                                   │   └── RedirectBusinessException.java
│   │   │                                   ├── model/
│   │   │                                   │   ├── ConfigJson.java
│   │   │                                   │   ├── Context.java
│   │   │                                   │   ├── EasyLambdaQueryWrapper.java
│   │   │                                   │   ├── IntegerWrapper.java
│   │   │                                   │   └── LoginUser.java
│   │   │                                   └── util/
│   │   │                                       ├── ConfigUtils.java
│   │   │                                       ├── ContextUtils.java
│   │   │                                       ├── EasyBooleanUtils.java
│   │   │                                       ├── EasyCollectionUtils.java
│   │   │                                       ├── EasyEnumUtils.java
│   │   │                                       ├── EasyIntegerUtils.java
│   │   │                                       ├── EasyOptionalUtils.java
│   │   │                                       ├── EasySqlUtils.java
│   │   │                                       ├── EasyStringUtils.java
│   │   │                                       ├── I18nUtils.java
│   │   │                                       └── LogUtils.java
│   │   └── pom.xml
│   ├── chat2db-server-web/
│   │   ├── chat2db-server-admin-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── admin/
│   │   │                               └── api/
│   │   │                                   └── controller/
│   │   │                                       ├── common/
│   │   │                                       │   ├── CommonAdminController.java
│   │   │                                       │   ├── converter/
│   │   │                                       │   │   └── CommonAdminConverter.java
│   │   │                                       │   ├── request/
│   │   │                                       │   │   └── TeamUserPageQueryRequest.java
│   │   │                                       │   └── vo/
│   │   │                                       │       └── TeamUserListVO.java
│   │   │                                       ├── datasource/
│   │   │                                       │   ├── DataSourceAccessAdminController.java
│   │   │                                       │   ├── DataSourceAdminController.java
│   │   │                                       │   ├── converter/
│   │   │                                       │   │   ├── DataSourceAccessAdminConverter.java
│   │   │                                       │   │   └── DataSourceAdminConverter.java
│   │   │                                       │   ├── request/
│   │   │                                       │   │   ├── DataSourceAccessBatchCreateRequest.java
│   │   │                                       │   │   ├── DataSourceAccessObjectRequest.java
│   │   │                                       │   │   ├── DataSourceAccessPageQueryRequest.java
│   │   │                                       │   │   ├── DataSourceCloneRequest.java
│   │   │                                       │   │   ├── DataSourceCreateRequest.java
│   │   │                                       │   │   └── DataSourceUpdateRequest.java
│   │   │                                       │   └── vo/
│   │   │                                       │       ├── DataSourceAccessObjectVO.java
│   │   │                                       │       ├── DataSourceAccessPageQueryVO.java
│   │   │                                       │       ├── DataSourcePageQueryVO.java
│   │   │                                       │       └── SimpleDataSourceVO.java
│   │   │                                       ├── team/
│   │   │                                       │   ├── TeamAdminController.java
│   │   │                                       │   ├── TeamDataSourceAdminController.java
│   │   │                                       │   ├── TeamUserAdminController.java
│   │   │                                       │   ├── converter/
│   │   │                                       │   │   ├── TeamAdminConverter.java
│   │   │                                       │   │   ├── TeamDataSourcesAdminConverter.java
│   │   │                                       │   │   └── TeamUserAdminConverter.java
│   │   │                                       │   ├── request/
│   │   │                                       │   │   ├── TeamCreateRequest.java
│   │   │                                       │   │   ├── TeamDataSourceBatchCreateRequest.java
│   │   │                                       │   │   ├── TeamPageCommonQueryRequest.java
│   │   │                                       │   │   ├── TeamUpdateRequest.java
│   │   │                                       │   │   └── TeamUserBatchCreateRequest.java
│   │   │                                       │   └── vo/
│   │   │                                       │       ├── SimpleTeamVO.java
│   │   │                                       │       ├── TeamDataSourcePageQueryVO.java
│   │   │                                       │       ├── TeamPageQueryVO.java
│   │   │                                       │       └── TeamUserPageQueryVO.java
│   │   │                                       └── user/
│   │   │                                           ├── UserAdminController.java
│   │   │                                           ├── UserDataSourceAdminController.java
│   │   │                                           ├── UserTeamAdminController.java
│   │   │                                           ├── converter/
│   │   │                                           │   ├── UserAdminConverter.java
│   │   │                                           │   ├── UserDataSourcesAdminConverter.java
│   │   │                                           │   └── UserTeamAdminConverter.java
│   │   │                                           ├── request/
│   │   │                                           │   ├── UserCreateRequest.java
│   │   │                                           │   ├── UserDataSourceBatchCreateRequest.java
│   │   │                                           │   ├── UserPageCommonQueryRequest.java
│   │   │                                           │   ├── UserTeamBatchCreateRequest.java
│   │   │                                           │   └── UserUpdateRequest.java
│   │   │                                           └── vo/
│   │   │                                               ├── SimpleUserVO.java
│   │   │                                               ├── UserDataSourcePageQueryVO.java
│   │   │                                               ├── UserPageQueryVO.java
│   │   │                                               └── UserTeamPageQueryVO.java
│   │   ├── chat2db-server-common-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── common/
│   │   │                               └── api/
│   │   │                                   └── controller/
│   │   │                                       ├── CommonCommonController.java
│   │   │                                       ├── converter/
│   │   │                                       │   └── EnvironmentCommonConverter.java
│   │   │                                       ├── request/
│   │   │                                       │   ├── CommonPageQueryRequest.java
│   │   │                                       │   └── CommonQueryRequest.java
│   │   │                                       └── vo/
│   │   │                                           ├── SimpleEnvironmentVO.java
│   │   │                                           └── SimpleUserVO.java
│   │   ├── chat2db-server-web-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── server/
│   │   │           │               └── web/
│   │   │           │                   └── api/
│   │   │           │                       ├── aspect/
│   │   │           │                       │   ├── ConnectionInfoAspect.java
│   │   │           │                       │   └── ConnectionInfoHandler.java
│   │   │           │                       ├── controller/
│   │   │           │                       │   ├── PageController.java
│   │   │           │                       │   ├── ai/
│   │   │           │                       │   │   ├── AiConfigController.java
│   │   │           │                       │   │   ├── ChatController.java
│   │   │           │                       │   │   ├── DocParser/
│   │   │           │                       │   │   │   ├── AbstractParser.java
│   │   │           │                       │   │   │   └── PdfParse.java
│   │   │           │                       │   │   ├── EmbeddingController.java
│   │   │           │                       │   │   ├── KnowledgeController.java
│   │   │           │                       │   │   ├── TextGenerationController.java
│   │   │           │                       │   │   ├── azure/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── AzureOpenAIClient.java
│   │   │           │                       │   │   │   │   └── AzureOpenAiStreamClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── AzureHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── AzureOpenAIEventSourceListener.java
│   │   │           │                       │   │   │   ├── model/
│   │   │           │                       │   │   │   │   ├── AzureChatChoice.java
│   │   │           │                       │   │   │   │   ├── AzureChatCompletions.java
│   │   │           │                       │   │   │   │   ├── AzureChatCompletionsOptions.java
│   │   │           │                       │   │   │   │   ├── AzureChatMessage.java
│   │   │           │                       │   │   │   │   ├── AzureChatRole.java
│   │   │           │                       │   │   │   │   ├── AzureChoice.java
│   │   │           │                       │   │   │   │   ├── AzureCompletions.java
│   │   │           │                       │   │   │   │   ├── AzureCompletionsFinishReason.java
│   │   │           │                       │   │   │   │   ├── AzureCompletionsLogProbabilityModel.java
│   │   │           │                       │   │   │   │   ├── AzureCompletionsUsage.java
│   │   │           │                       │   │   │   │   └── AzureExpandableStringEnum.java
│   │   │           │                       │   │   │   └── util/
│   │   │           │                       │   │   │       └── AzureReflectionUtils.java
│   │   │           │                       │   │   ├── baichuan/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── BaichuanAIClient.java
│   │   │           │                       │   │   │   │   └── BaichuanAIStreamClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── BaichuanHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── BaichuanChatAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── BaichuanChatCompletions.java
│   │   │           │                       │   │   │       ├── BaichuanChatCompletionsOptions.java
│   │   │           │                       │   │   │       ├── BaichuanChatCompletionsUsage.java
│   │   │           │                       │   │   │       ├── BaichuanChatData.java
│   │   │           │                       │   │   │       └── BaichuanChatMessage.java
│   │   │           │                       │   │   ├── chat2db/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── Chat2DBAIStreamClient.java
│   │   │           │                       │   │   │   │   └── Chat2dbAIClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── Chat2dbHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   └── listener/
│   │   │           │                       │   │   │       └── Chat2dbAIEventSourceListener.java
│   │   │           │                       │   │   ├── claude/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── ClaudeAIClient.java
│   │   │           │                       │   │   │   │   └── ClaudeAiStreamClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── ClaudeHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── ClaudeAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── ClaudeChatCompletionsOptions.java
│   │   │           │                       │   │   │       ├── ClaudeChatMessage.java
│   │   │           │                       │   │   │       ├── ClaudeCompletionResponse.java
│   │   │           │                       │   │   │       └── ClaudeMessageLimit.java
│   │   │           │                       │   │   ├── config/
│   │   │           │                       │   │   │   └── LocalCache.java
│   │   │           │                       │   │   ├── converter/
│   │   │           │                       │   │   │   └── ChatConverter.java
│   │   │           │                       │   │   ├── enums/
│   │   │           │                       │   │   │   ├── GptVersionType.java
│   │   │           │                       │   │   │   └── PromptType.java
│   │   │           │                       │   │   ├── fastchat/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── FastChatAIClient.java
│   │   │           │                       │   │   │   │   ├── FastChatAIStreamClient.java
│   │   │           │                       │   │   │   │   └── FastChatOpenAiApi.java
│   │   │           │                       │   │   │   ├── embeddings/
│   │   │           │                       │   │   │   │   ├── FastChatEmbedding.java
│   │   │           │                       │   │   │   │   ├── FastChatEmbeddingResponse.java
│   │   │           │                       │   │   │   │   └── FastChatItem.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── FastChatHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── FastChatAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── FastChatChoice.java
│   │   │           │                       │   │   │       ├── FastChatCompletions.java
│   │   │           │                       │   │   │       ├── FastChatCompletionsFinishReason.java
│   │   │           │                       │   │   │       ├── FastChatCompletionsOptions.java
│   │   │           │                       │   │   │       ├── FastChatCompletionsUsage.java
│   │   │           │                       │   │   │       ├── FastChatExpandableStringEnum.java
│   │   │           │                       │   │   │       ├── FastChatMessage.java
│   │   │           │                       │   │   │       └── FastChatRole.java
│   │   │           │                       │   │   ├── openai/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   └── OpenAIClient.java
│   │   │           │                       │   │   │   └── listener/
│   │   │           │                       │   │   │       └── OpenAIEventSourceListener.java
│   │   │           │                       │   │   ├── request/
│   │   │           │                       │   │   │   ├── ChatQueryRequest.java
│   │   │           │                       │   │   │   └── ChatRequest.java
│   │   │           │                       │   │   ├── response/
│   │   │           │                       │   │   │   ├── ChatChoice.java
│   │   │           │                       │   │   │   └── ChatCompletionResponse.java
│   │   │           │                       │   │   ├── rest/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── RestAIClient.java
│   │   │           │                       │   │   │   │   └── RestAIStreamClient.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── RestAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── RestAIChatCompletions.java
│   │   │           │                       │   │   │       └── RestAiCompletion.java
│   │   │           │                       │   │   ├── tongyi/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── TongyiChatAIClient.java
│   │   │           │                       │   │   │   │   └── TongyiChatAIStreamClient.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── TongyiChatAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── TongyiChatCompletions.java
│   │   │           │                       │   │   │       ├── TongyiChatCompletionsOptions.java
│   │   │           │                       │   │   │       ├── TongyiChatCompletionsUsage.java
│   │   │           │                       │   │   │       ├── TongyiChatMessage.java
│   │   │           │                       │   │   │       └── TongyiChatOutput.java
│   │   │           │                       │   │   ├── wenxin/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── WenxinAIClient.java
│   │   │           │                       │   │   │   │   └── WenxinAIStreamClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── AccessTokenInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── WenxinAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       └── WenxinChatCompletions.java
│   │   │           │                       │   │   └── zhipu/
│   │   │           │                       │   │       ├── client/
│   │   │           │                       │   │       │   ├── ZhipuChatAIClient.java
│   │   │           │                       │   │       │   └── ZhipuChatAIStreamClient.java
│   │   │           │                       │   │       ├── interceptor/
│   │   │           │                       │   │       │   └── ZhipuChatHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │       ├── listener/
│   │   │           │                       │   │       │   └── ZhipuChatAIEventSourceListener.java
│   │   │           │                       │   │       ├── model/
│   │   │           │                       │   │       │   ├── ZhipuChatBody.java
│   │   │           │                       │   │       │   ├── ZhipuChatCompletions.java
│   │   │           │                       │   │       │   └── ZhipuChatCompletionsOptions.java
│   │   │           │                       │   │       └── util/
│   │   │           │                       │   │           └── ZhipuUtils.java
│   │   │           │                       │   ├── config/
│   │   │           │                       │   │   ├── ConfigController.java
│   │   │           │                       │   │   └── request/
│   │   │           │                       │   │       ├── AIConfigCreateRequest.java
│   │   │           │                       │   │       ├── AISystemConfigRequest.java
│   │   │           │                       │   │       └── SystemConfigRequest.java
│   │   │           │                       │   ├── dashboard/
│   │   │           │                       │   │   ├── ChartController.java
│   │   │           │                       │   │   ├── DashboardController.java
│   │   │           │                       │   │   ├── converter/
│   │   │           │                       │   │   │   ├── ChartWebConverter.java
│   │   │           │                       │   │   │   └── DashboardWebConverter.java
│   │   │           │                       │   │   ├── request/
│   │   │           │                       │   │   │   ├── ChartCreateRequest.java
│   │   │           │                       │   │   │   ├── ChartQueryRequest.java
│   │   │           │                       │   │   │   ├── ChartUpdateRequest.java
│   │   │           │                       │   │   │   ├── DashboardCreateRequest.java
│   │   │           │                       │   │   │   └── DashboardUpdateRequest.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       ├── ChartVO.java
│   │   │           │                       │   │       └── DashboardVO.java
│   │   │           │                       │   ├── data/
│   │   │           │                       │   │   └── source/
│   │   │           │                       │   │       ├── DataSourceController.java
│   │   │           │                       │   │       ├── converter/
│   │   │           │                       │   │       │   ├── DataSourceWebConverter.java
│   │   │           │                       │   │       │   └── SSHWebConverter.java
│   │   │           │                       │   │       ├── request/
│   │   │           │                       │   │       │   ├── ConsoleCloseRequest.java
│   │   │           │                       │   │       │   ├── ConsoleConnectRequest.java
│   │   │           │                       │   │       │   ├── DataSourceAttachRequest.java
│   │   │           │                       │   │       │   ├── DataSourceBaseRequest.java
│   │   │           │                       │   │       │   ├── DataSourceBaseRequestInfo.java
│   │   │           │                       │   │       │   ├── DataSourceCloneRequest.java
│   │   │           │                       │   │       │   ├── DataSourceCloseRequest.java
│   │   │           │                       │   │       │   ├── DataSourceConsoleRequestInfo.java
│   │   │           │                       │   │       │   ├── DataSourceCreateRequest.java
│   │   │           │                       │   │       │   ├── DataSourceQueryRequest.java
│   │   │           │                       │   │       │   ├── DataSourceTestRequest.java
│   │   │           │                       │   │       │   ├── DataSourceUpdateRequest.java
│   │   │           │                       │   │       │   └── SSHTestRequest.java
│   │   │           │                       │   │       └── vo/
│   │   │           │                       │   │           ├── DataSourceVO.java
│   │   │           │                       │   │           ├── DatabaseVO.java
│   │   │           │                       │   │           └── EnvVO.java
│   │   │           │                       │   ├── driver/
│   │   │           │                       │   │   ├── JdbcDriverController.java
│   │   │           │                       │   │   └── request/
│   │   │           │                       │   │       └── JdbcDriverRequest.java
│   │   │           │                       │   ├── ncx/
│   │   │           │                       │   │   ├── ConverterController.java
│   │   │           │                       │   │   ├── cipher/
│   │   │           │                       │   │   │   ├── CommonCipher.java
│   │   │           │                       │   │   │   ├── Navicat11Cipher.java
│   │   │           │                       │   │   │   └── Navicat12Cipher.java
│   │   │           │                       │   │   ├── dbeaver/
│   │   │           │                       │   │   │   ├── DBSValueEncryptor.java
│   │   │           │                       │   │   │   └── DefaultValueEncryptor.java
│   │   │           │                       │   │   ├── enums/
│   │   │           │                       │   │   │   ├── DataBaseType.java
│   │   │           │                       │   │   │   ├── ExportConstants.java
│   │   │           │                       │   │   │   └── VersionEnum.java
│   │   │           │                       │   │   ├── factory/
│   │   │           │                       │   │   │   └── CipherFactory.java
│   │   │           │                       │   │   ├── service/
│   │   │           │                       │   │   │   ├── ConverterService.java
│   │   │           │                       │   │   │   └── impl/
│   │   │           │                       │   │   │       └── ConverterServiceImpl.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       └── UploadVO.java
│   │   │           │                       │   ├── operation/
│   │   │           │                       │   │   ├── log/
│   │   │           │                       │   │   │   ├── OperationLogController.java
│   │   │           │                       │   │   │   ├── converter/
│   │   │           │                       │   │   │   │   └── OperationLogWebConverter.java
│   │   │           │                       │   │   │   ├── request/
│   │   │           │                       │   │   │   │   ├── OperationLogCreateRequest.java
│   │   │           │                       │   │   │   │   └── OperationLogQueryRequest.java
│   │   │           │                       │   │   │   └── vo/
│   │   │           │                       │   │   │       └── OperationLogVO.java
│   │   │           │                       │   │   └── saved/
│   │   │           │                       │   │       ├── OperationSavedController.java
│   │   │           │                       │   │       ├── converter/
│   │   │           │                       │   │       │   └── OperationWebConverter.java
│   │   │           │                       │   │       ├── request/
│   │   │           │                       │   │       │   ├── BatchTabCloseRequest.java
│   │   │           │                       │   │       │   ├── OperationCreateRequest.java
│   │   │           │                       │   │       │   ├── OperationQueryRequest.java
│   │   │           │                       │   │       │   └── OperationUpdateRequest.java
│   │   │           │                       │   │       └── vo/
│   │   │           │                       │   │           └── OperationVO.java
│   │   │           │                       │   ├── pin/
│   │   │           │                       │   │   ├── PinController.java
│   │   │           │                       │   │   ├── converter/
│   │   │           │                       │   │   │   └── PinWebConverter.java
│   │   │           │                       │   │   └── request/
│   │   │           │                       │   │       └── PinTableRequest.java
│   │   │           │                       │   ├── rdb/
│   │   │           │                       │   │   ├── DatabaseController.java
│   │   │           │                       │   │   ├── FunctionController.java
│   │   │           │                       │   │   ├── ProcedureController.java
│   │   │           │                       │   │   ├── RdbDdlController.java
│   │   │           │                       │   │   ├── RdbDmlController.java
│   │   │           │                       │   │   ├── RdbDmlExportController.java
│   │   │           │                       │   │   ├── RdbDocController.java
│   │   │           │                       │   │   ├── SchemaController.java
│   │   │           │                       │   │   ├── SequenceController.java
│   │   │           │                       │   │   ├── TableController.java
│   │   │           │                       │   │   ├── TriggerController.java
│   │   │           │                       │   │   ├── ViewController.java
│   │   │           │                       │   │   ├── converter/
│   │   │           │                       │   │   │   ├── DatabaseConverter.java
│   │   │           │                       │   │   │   ├── FunctionConverter.java
│   │   │           │                       │   │   │   ├── ProcedureConverter.java
│   │   │           │                       │   │   │   └── RdbWebConverter.java
│   │   │           │                       │   │   ├── data/
│   │   │           │                       │   │   │   ├── BaseDataExporter.java
│   │   │           │                       │   │   │   ├── BaseDataImporter.java
│   │   │           │                       │   │   │   ├── BaseExcelExporter.java
│   │   │           │                       │   │   │   ├── BaseExcelImporter.java
│   │   │           │                       │   │   │   ├── DataExportStrategy.java
│   │   │           │                       │   │   │   ├── DataImportStrategy.java
│   │   │           │                       │   │   │   ├── csv/
│   │   │           │                       │   │   │   │   ├── CsvDataExporter.java
│   │   │           │                       │   │   │   │   └── CsvDataImporter.java
│   │   │           │                       │   │   │   ├── factory/
│   │   │           │                       │   │   │   │   ├── DataExportFactory.java
│   │   │           │                       │   │   │   │   └── DataImportFactory.java
│   │   │           │                       │   │   │   ├── json/
│   │   │           │                       │   │   │   │   ├── JsonDataExporter.java
│   │   │           │                       │   │   │   │   └── JsonDataImporter.java
│   │   │           │                       │   │   │   ├── service/
│   │   │           │                       │   │   │   │   ├── DatabaseDataService.java
│   │   │           │                       │   │   │   │   └── impl/
│   │   │           │                       │   │   │   │       └── DatabaseDataImpl.java
│   │   │           │                       │   │   │   ├── sql/
│   │   │           │                       │   │   │   │   └── SqlDataExporter.java
│   │   │           │                       │   │   │   ├── task/
│   │   │           │                       │   │   │   │   ├── TaskManager.java
│   │   │           │                       │   │   │   │   └── TaskState.java
│   │   │           │                       │   │   │   ├── xls/
│   │   │           │                       │   │   │   │   ├── XlsDataExporter.java
│   │   │           │                       │   │   │   │   └── XlsDataImporter.java
│   │   │           │                       │   │   │   └── xlsx/
│   │   │           │                       │   │   │       ├── XlsxDataExporter.java
│   │   │           │                       │   │   │       └── XlsxDataImporter.java
│   │   │           │                       │   │   ├── doc/
│   │   │           │                       │   │   │   ├── DatabaseExportService.java
│   │   │           │                       │   │   │   ├── adaptive/
│   │   │           │                       │   │   │   │   ├── CustomCellWriteHeightConfig.java
│   │   │           │                       │   │   │   │   └── CustomCellWriteWidthConfig.java
│   │   │           │                       │   │   │   ├── conf/
│   │   │           │                       │   │   │   │   └── ExportOptions.java
│   │   │           │                       │   │   │   ├── constant/
│   │   │           │                       │   │   │   │   ├── CommonConstant.java
│   │   │           │                       │   │   │   │   └── PatternConstant.java
│   │   │           │                       │   │   │   ├── event/
│   │   │           │                       │   │   │   │   └── TemplateEvent.java
│   │   │           │                       │   │   │   ├── export/
│   │   │           │                       │   │   │   │   ├── ExportExcelService.java
│   │   │           │                       │   │   │   │   ├── ExportHtmlService.java
│   │   │           │                       │   │   │   │   ├── ExportMarkdownService.java
│   │   │           │                       │   │   │   │   ├── ExportPdfService.java
│   │   │           │                       │   │   │   │   └── ExportWordSuperService.java
│   │   │           │                       │   │   │   ├── merge/
│   │   │           │                       │   │   │   │   └── MyMergeExcel.java
│   │   │           │                       │   │   │   └── style/
│   │   │           │                       │   │   │       └── CustomExcelStyle.java
│   │   │           │                       │   │   ├── factory/
│   │   │           │                       │   │   │   └── ExportServiceFactory.java
│   │   │           │                       │   │   ├── request/
│   │   │           │                       │   │   │   ├── ColumnRequest.java
│   │   │           │                       │   │   │   ├── DataExportRequest.java
│   │   │           │                       │   │   │   ├── DatabaseCreateRequest.java
│   │   │           │                       │   │   │   ├── DatabaseExportDataRequest.java
│   │   │           │                       │   │   │   ├── DatabaseExportRequest.java
│   │   │           │                       │   │   │   ├── DdlCountRequest.java
│   │   │           │                       │   │   │   ├── DdlExportRequest.java
│   │   │           │                       │   │   │   ├── DdlRequest.java
│   │   │           │                       │   │   │   ├── DmlRequest.java
│   │   │           │                       │   │   │   ├── DmlSqlCopyRequest.java
│   │   │           │                       │   │   │   ├── DmlTableRequest.java
│   │   │           │                       │   │   │   ├── FunctionDetailRequest.java
│   │   │           │                       │   │   │   ├── FunctionPageRequest.java
│   │   │           │                       │   │   │   ├── FunctionUpdateRequest.java
│   │   │           │                       │   │   │   ├── GroupByRequest.java
│   │   │           │                       │   │   │   ├── IndexRequest.java
│   │   │           │                       │   │   │   ├── NewTableSqlRequest.java
│   │   │           │                       │   │   │   ├── OrderByRequest.java
│   │   │           │                       │   │   │   ├── ProcedureDetailRequest.java
│   │   │           │                       │   │   │   ├── ProcedurePageRequest.java
│   │   │           │                       │   │   │   ├── ProcedureUpdateRequest.java
│   │   │           │                       │   │   │   ├── SchemaCreateRequest.java
│   │   │           │                       │   │   │   ├── SchemaQueryRequest.java
│   │   │           │                       │   │   │   ├── SelectResultUpdateRequest.java
│   │   │           │                       │   │   │   ├── SequenceBriefQueryRequest.java
│   │   │           │                       │   │   │   ├── SequenceDeleteRequest.java
│   │   │           │                       │   │   │   ├── SequenceDetailQueryRequest.java
│   │   │           │                       │   │   │   ├── SequenceModifySqlRequest.java
│   │   │           │                       │   │   │   ├── SequenceRequest.java
│   │   │           │                       │   │   │   ├── TableBriefQueryRequest.java
│   │   │           │                       │   │   │   ├── TableCreateDdlQueryRequest.java
│   │   │           │                       │   │   │   ├── TableDeleteRequest.java
│   │   │           │                       │   │   │   ├── TableDetailQueryRequest.java
│   │   │           │                       │   │   │   ├── TableMilvusQueryRequest.java
│   │   │           │                       │   │   │   ├── TableModifySqlRequest.java
│   │   │           │                       │   │   │   ├── TableQueryRequest.java
│   │   │           │                       │   │   │   ├── TableRequest.java
│   │   │           │                       │   │   │   ├── TableUpdateDdlQueryRequest.java
│   │   │           │                       │   │   │   ├── TriggerDetailRequest.java
│   │   │           │                       │   │   │   ├── TriggerPageRequest.java
│   │   │           │                       │   │   │   ├── TypeQueryRequest.java
│   │   │           │                       │   │   │   ├── UpdateDatabaseRequest.java
│   │   │           │                       │   │   │   └── UpdateSchemaRequest.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       ├── ColumnVO.java
│   │   │           │                       │   │       ├── ExecuteResultVO.java
│   │   │           │                       │   │       ├── IndexColumnVO.java
│   │   │           │                       │   │       ├── IndexVO.java
│   │   │           │                       │   │       ├── KeyVO.java
│   │   │           │                       │   │       ├── MetaSchemaVO.java
│   │   │           │                       │   │       ├── SchemaVO.java
│   │   │           │                       │   │       ├── SequenceVO.java
│   │   │           │                       │   │       ├── SqlVO.java
│   │   │           │                       │   │       ├── TableVO.java
│   │   │           │                       │   │       └── ViewVO.java
│   │   │           │                       │   ├── redis/
│   │   │           │                       │   │   ├── RedisKeyManageController.java
│   │   │           │                       │   │   ├── RedisKeyValueManageController.java
│   │   │           │                       │   │   ├── request/
│   │   │           │                       │   │   │   ├── KeyCreateRequest.java
│   │   │           │                       │   │   │   ├── KeyDeleteRequest.java
│   │   │           │                       │   │   │   ├── KeyQueryRequest.java
│   │   │           │                       │   │   │   ├── KeyUpdateRequest.java
│   │   │           │                       │   │   │   ├── KeyValueManageRequest.java
│   │   │           │                       │   │   │   └── ValueUpdateRequest.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       └── KeyVO.java
│   │   │           │                       │   ├── sql/
│   │   │           │                       │   │   ├── SqlController.java
│   │   │           │                       │   │   └── request/
│   │   │           │                       │   │       └── SqlFormatRequest.java
│   │   │           │                       │   ├── system/
│   │   │           │                       │   │   ├── SystemController.java
│   │   │           │                       │   │   ├── util/
│   │   │           │                       │   │   │   └── SystemUtils.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       ├── AppVersionVO.java
│   │   │           │                       │   │       └── SystemVO.java
│   │   │           │                       │   ├── task/
│   │   │           │                       │   │   ├── ExportController.java
│   │   │           │                       │   │   ├── TaskController.java
│   │   │           │                       │   │   └── biz/
│   │   │           │                       │   │       └── TaskBizService.java
│   │   │           │                       │   └── user/
│   │   │           │                       │       ├── UserController.java
│   │   │           │                       │       ├── converter/
│   │   │           │                       │       │   └── UserWebConverter.java
│   │   │           │                       │       ├── request/
│   │   │           │                       │       │   ├── UserCreateRequest.java
│   │   │           │                       │       │   ├── UserQueryRequest.java
│   │   │           │                       │       │   └── UserUpdateRequest.java
│   │   │           │                       │       └── vo/
│   │   │           │                       │           └── UserVO.java
│   │   │           │                       ├── http/
│   │   │           │                       │   ├── GatewayClientService.java
│   │   │           │                       │   ├── model/
│   │   │           │                       │   │   ├── EsTableSchema.java
│   │   │           │                       │   │   ├── Knowledge.java
│   │   │           │                       │   │   └── TableSchema.java
│   │   │           │                       │   ├── request/
│   │   │           │                       │   │   ├── EsTableSchemaRequest.java
│   │   │           │                       │   │   ├── KnowledgeRequest.java
│   │   │           │                       │   │   ├── SqlExecuteHistoryCreateRequest.java
│   │   │           │                       │   │   ├── TableSchemaRequest.java
│   │   │           │                       │   │   └── WhiteListRequest.java
│   │   │           │                       │   └── response/
│   │   │           │                       │       ├── ApiKeyResponse.java
│   │   │           │                       │       ├── EsTableSchemaResponse.java
│   │   │           │                       │       ├── InviteQrCodeResponse.java
│   │   │           │                       │       ├── KnowledgeResponse.java
│   │   │           │                       │       ├── QrCodeResponse.java
│   │   │           │                       │       └── TableSchemaResponse.java
│   │   │           │                       ├── util/
│   │   │           │                       │   ├── AddToTopic.java
│   │   │           │                       │   ├── ApplicationContextUtil.java
│   │   │           │                       │   ├── FileUtils.java
│   │   │           │                       │   ├── StringUtils.java
│   │   │           │                       │   └── XMLUtils.java
│   │   │           │                       └── ws/
│   │   │           │                           ├── WsConfig.java
│   │   │           │                           ├── WsMessage.java
│   │   │           │                           ├── WsResult.java
│   │   │           │                           ├── WsServer.java
│   │   │           │                           └── WsService.java
│   │   │           └── resources/
│   │   │               └── template/
│   │   │                   ├── sub_template_diy.docx
│   │   │                   ├── template.html
│   │   │                   └── template_diy.docx
│   │   └── pom.xml
│   ├── chat2db-server-web-start/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── ai/
│   │           │       └── chat2db/
│   │           │           └── server/
│   │           │               └── web/
│   │           │                   └── start/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   ├── StdinReader.java
│   │           │                       │   ├── config/
│   │           │                       │   │   ├── AsyncContextRefreshedListener.java
│   │           │                       │   │   ├── Chat2dbForestConfiguration.java
│   │           │                       │   │   ├── Chat2dbWebMvcConfigurer.java
│   │           │                       │   │   ├── JarDownloadTask.java
│   │           │                       │   │   └── WebLogConfiguration.java
│   │           │                       │   ├── i18n/
│   │           │                       │   │   └── I18nConfig.java
│   │           │                       │   ├── interceptor/
│   │           │                       │   │   └── CorsFilter.java
│   │           │                       │   ├── listener/
│   │           │                       │   │   ├── DbhubTomcatConnectorCustomizer.java
│   │           │                       │   │   ├── FailedEventApplicationListener.java
│   │           │                       │   │   ├── ManageApplicationListener.java
│   │           │                       │   │   └── manage/
│   │           │                       │   │       ├── ManageMessage.java
│   │           │                       │   │       └── MessageTypeEnum.java
│   │           │                       │   ├── mybatis/
│   │           │                       │   │   └── MyBatisPlusConfig.java
│   │           │                       │   └── oauth/
│   │           │                       │       ├── SaLogForSlf4j.java
│   │           │                       │       └── SaTokenConfigure.java
│   │           │                       ├── controller/
│   │           │                       │   ├── oauth/
│   │           │                       │   │   ├── OauthController.java
│   │           │                       │   │   └── request/
│   │           │                       │   │       └── LoginRequest.java
│   │           │                       │   └── thymeleaf/
│   │           │                       │       └── ThymeleafController.java
│   │           │                       ├── exception/
│   │           │                       │   ├── EasyControllerExceptionHandler.java
│   │           │                       │   └── convertor/
│   │           │                       │       ├── BindExceptionConvertor.java
│   │           │                       │       ├── BusinessExceptionConvertor.java
│   │           │                       │       ├── DefaultExceptionConvertor.java
│   │           │                       │       ├── ExceptionConvertor.java
│   │           │                       │       ├── ExceptionConvertorUtils.java
│   │           │                       │       ├── MaxUploadSizeExceededExceptionConvertor.java
│   │           │                       │       ├── MethodArgumentNotValidExceptionConvertor.java
│   │           │                       │       ├── MethodArgumentTypeMismatchExceptionConvertor.java
│   │           │                       │       └── ParamExceptionConvertor.java
│   │           │                       └── log/
│   │           │                           ├── EasyLogSink.java
│   │           │                           ├── LogOncePerRequestFilter.java
│   │           │                           └── WebLog.java
│   │           └── resources/
│   │               ├── META-INF/
│   │               │   └── spring.factories
│   │               ├── application-dev.yml
│   │               ├── application-release.yml
│   │               ├── application-test.yml
│   │               ├── application.yml
│   │               ├── i18n/
│   │               │   ├── messages.properties
│   │               │   ├── messages_en_US.properties
│   │               │   └── messages_zh_CN.properties
│   │               ├── logback-spring.xml
│   │               └── thymeleaf/
│   │                   └── template.html
│   ├── chat2db-spi/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── ai/
│   │                   └── chat2db/
│   │                       └── spi/
│   │                           ├── ColumnBuilder.java
│   │                           ├── CommandExecutor.java
│   │                           ├── DBManage.java
│   │                           ├── MetaData.java
│   │                           ├── Plugin.java
│   │                           ├── SqlBuilder.java
│   │                           ├── ValueHandler.java
│   │                           ├── ValueProcessor.java
│   │                           ├── config/
│   │                           │   ├── DBConfig.java
│   │                           │   └── DriverConfig.java
│   │                           ├── enums/
│   │                           │   ├── CellTypeEnum.java
│   │                           │   ├── CollationEnum.java
│   │                           │   ├── DataTypeEnum.java
│   │                           │   ├── DmlType.java
│   │                           │   ├── EditStatus.java
│   │                           │   ├── IndexTypeEnum.java
│   │                           │   └── SqlTypeEnum.java
│   │                           ├── jdbc/
│   │                           │   ├── BaseValueProcessor.java
│   │                           │   ├── DefaultDBManage.java
│   │                           │   ├── DefaultMetaService.java
│   │                           │   ├── DefaultSqlBuilder.java
│   │                           │   ├── DefaultValueHandler.java
│   │                           │   └── DefaultValueProcessor.java
│   │                           ├── model/
│   │                           │   ├── AsyncCall.java
│   │                           │   ├── AsyncContext.java
│   │                           │   ├── Cell.java
│   │                           │   ├── Charset.java
│   │                           │   ├── Collation.java
│   │                           │   ├── ColumnType.java
│   │                           │   ├── Command.java
│   │                           │   ├── CreateTableSql.java
│   │                           │   ├── DataSourceConnect.java
│   │                           │   ├── DataType.java
│   │                           │   ├── Database.java
│   │                           │   ├── DefaultValue.java
│   │                           │   ├── DriverEntry.java
│   │                           │   ├── EngineType.java
│   │                           │   ├── ExecuteResult.java
│   │                           │   ├── Function.java
│   │                           │   ├── Header.java
│   │                           │   ├── IndexType.java
│   │                           │   ├── JDBCDataValue.java
│   │                           │   ├── KeyValue.java
│   │                           │   ├── MetaSchema.java
│   │                           │   ├── OrderBy.java
│   │                           │   ├── Procedure.java
│   │                           │   ├── QueryResult.java
│   │                           │   ├── ResultOperation.java
│   │                           │   ├── SQLDataValue.java
│   │                           │   ├── SSHInfo.java
│   │                           │   ├── SSLInfo.java
│   │                           │   ├── Schema.java
│   │                           │   ├── Sequence.java
│   │                           │   ├── ShowDatabaseResult.java
│   │                           │   ├── SimpleColumn.java
│   │                           │   ├── SimpleSequence.java
│   │                           │   ├── SimpleTable.java
│   │                           │   ├── Sql.java
│   │                           │   ├── Table.java
│   │                           │   ├── TableColumn.java
│   │                           │   ├── TableIndex.java
│   │                           │   ├── TableIndexColumn.java
│   │                           │   ├── TableMeta.java
│   │                           │   ├── Trigger.java
│   │                           │   └── Type.java
│   │                           ├── sql/
│   │                           │   ├── Chat2DBContext.java
│   │                           │   ├── ConnectInfo.java
│   │                           │   ├── ConnectionPool.java
│   │                           │   ├── DocumentUtils.java
│   │                           │   ├── IDriverManager.java
│   │                           │   ├── MongExtendedJsonObjectIdConverter.java
│   │                           │   ├── ResultSetConsumer.java
│   │                           │   ├── ResultSetFunction.java
│   │                           │   ├── SQLExecutor.java
│   │                           │   └── SqlParseUtils.java
│   │                           ├── ssh/
│   │                           │   ├── MyUserInfo.java
│   │                           │   └── SSHManager.java
│   │                           └── util/
│   │                               ├── ExceptionUtils.java
│   │                               ├── FileUtils.java
│   │                               ├── Holder.java
│   │                               ├── JdbcJarUtils.java
│   │                               ├── JdbcUtils.java
│   │                               ├── LexerFactories.java
│   │                               ├── LexerFactory.java
│   │                               ├── LexerTokenDefinition.java
│   │                               ├── LexerTokenDefinitions.java
│   │                               ├── OBOraclePLLexerDefinition.java
│   │                               ├── OBOraclePLLexerFactory.java
│   │                               ├── OracleLexerDefinition.java
│   │                               ├── OracleLexerFactory.java
│   │                               ├── ResultSetUtils.java
│   │                               ├── SortUtils.java
│   │                               ├── SplitSqlString.java
│   │                               ├── SqlSplitProcessor.java
│   │                               ├── SqlSplitter.java
│   │                               ├── SqlStatementIterator.java
│   │                               ├── SqlUtils.java
│   │                               └── TableUtils.java
│   ├── lombok.config
│   └── pom.xml
├── docker/
│   ├── Dockerfile
│   ├── docker-build.sh
│   ├── docker-compose-start.sh
│   ├── docker-compose.yml
│   ├── docker-start.sh
│   └── test/
│       ├── docker-compose.yml
│       ├── redis/
│       │   ├── data/
│       │   │   └── dump.rdb
│       │   └── redis.conf
│       ├── start.sh
│       └── stop.sh
├── document/
│   ├── git/
│   │   └── git.sh
│   ├── sql/
│   │   └── mysql.sql
│   └── style/
│       └── Alibaba_CodeStyle.xml
└── script/
    └── local-client-build.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.css linguist-language=java


================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: 💣 Bug
title: 'Bug: '
description: bug template
labels: bug
body:
  - type: input
    id: version
    attributes:
      label: Chat2DB Version
    validations:
      required: true
  - type: textarea
    id: description
    attributes:
      label: Describe the bug
      description: |
        If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem and error log.
        清晰的描述遇到的问题,并建议附上错误截图及错误日志。
    validations:
      required: true

================================================
FILE: .github/ISSUE_TEMPLATE/optimized.md
================================================
---
name: "💫 Optimized"
about: optimized template
title: '优化: '
labels: 'optimized'
---

================================================
FILE: .github/ISSUE_TEMPLATE/suggest.md
================================================
---
name: "💌 Suggest"
about: suggest template
title: 'suggest: '
labels: 'suggest'
---


================================================
FILE: .github/workflows/pushdocker.yml
================================================
# When tagging a release, do two things
# 1.
name: Push To Docker

# Workflow's trigger
on:
  release:
    types: [ published ]

# Workflow's jobs
jobs:
  docker:
    strategy:
      matrix:
        include:
          - arch: amd64
          - arch: arm64
            variant: v8
    runs-on: ubuntu-latest
    steps:
      - name: Check out git repository
        uses: actions/checkout@main

      # Unable to obtain version number. Since the workflow doesn't support it, we'll use a plugin
      - name: Create version
        id: chat2db_version
        uses: bhowell2/github-substring-action@1.0.1
        with:
          value: ${{ github.ref }}
          index_of_str: "refs/tags/v"


      # Outputting basic information
      - name: Print basic information
        run: |
          echo "current version: ${{ steps.chat2db_version.outputs.substring }}"

      # Install Node.js
      - name: Install Node.js
        uses: actions/setup-node@main
        with:
          node-version: 16
          cache: "yarn"
          cache-dependency-path: chat2db-client/yarn.lock

      # Build static file information
      - name: Yarn install & build & copy
        run: |
          cd chat2db-client
          yarn install 
          yarn run build:web:prod --app_version=${{ steps.chat2db_version.outputs.substring }}
          cp -r dist ../chat2db-server/chat2db-server-web-start/src/main/resources/static/front
          cp -r dist/index.html ../chat2db-server/chat2db-server-web-start/src/main/resources/thymeleaf/

      # Install java and maven
      - name: Install Java and Maven
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "adopt"
          cache: "maven"

      # Compile server-side Java version
      - name: Build Java
        run: mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml
      

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
        with:
          platforms: amd64,arm64
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      # Log in docker hub
      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      # Packaging and sending to Docker
      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          platforms: linux/amd64,linux/arm64/v8
          tags: chat2db/chat2db:${{ steps.chat2db_version.outputs.substring }},chat2db/chat2db:latest
          file: docker/Dockerfile

================================================
FILE: .github/workflows/release.yml
================================================
# Workflow's name
name: Build Client

# Workflow's trigger
# Pack when creating tags
on:
  push:
    tags:
      - v*

# Workflow's jobs
# A total of 3 computers are required to run
# windows
# macos-latest x86_64
# macos-latest arm64
jobs:
  release:
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: windows-latest
          - os: macos-latest
            arch: x86_64
          - os: macos-latest
            arch: arm64
          - os: ubuntu-latest
    runs-on: ${{ matrix.os }}

    steps:
      - name: Check out git repository
        uses: actions/checkout@main

      # Obtaining the version number is not supported by workflow, so a plug-in is used.
      - name: Create version
        id: chat2db_version
        uses: bhowell2/github-substring-action@1.0.1
        with:
          value: ${{ github.ref }}
          index_of_str: "refs/tags/v"

      # Output basic information
      - name: Print basic information
        run: |
          echo "current environment: ${{ env.CHAT2DB_ENVIRONMENT }}"
          echo "current version: ${{ steps.chat2db_version.outputs.substring }}"

      # Install jre Windows
      - name: Install Jre for Windows
        if: ${{ runner.os == 'Windows' }}
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "temurin"
          java-package: "jre"

      # Install jre MacOS X64
      - name: Install Jre MacOS X64
        if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "temurin"
          java-package: "jre"
          architecture: "x64"

      # Install jre MacOS arm64
      - name: Install Jre MacOS arm64
        if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "temurin"
          java-package: "jre"
          architecture: "aarch64"

          # Install jre Linux
      - name: Install Jre for Linux
        if: ${{ runner.os == 'Linux' }}
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "temurin"
          java-package: "jre"

      # java.security open tls1 Windows
      - name: Enable tls1
        if: ${{ runner.os == 'Windows' }}
        run: |
          # sed -i '' "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\( TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "${{ env.JAVA_HOME }}\conf\security\java.security"
          $filePath = "${{ env.JAVA_HOME }}\conf\security\java.security"
          $content = Get-Content $filePath -Raw
          $updatedContent = $content -replace '^(jdk.tls.disabledAlgorithms=)(.*)( TLSv1, TLSv1.1,)(.*)', '$1$2$4'
          $updatedContent | Set-Content $filePath
        shell: pwsh

      # java.security open tls1 macOS
      - name: Enable tls1
        if: ${{ runner.os == 'macOS' }}
        run: |
          sed -i '' "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\( TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" $JAVA_HOME/conf/security/java.security

      # Copy jre Windows
      - name: Copy Jre for Windows
        if: ${{ runner.os == 'Windows' }}
        run: |
          mkdir chat2db-client/static
          cp -r "${{ env.JAVA_HOME }}" chat2db-client/static/jre

      # Copy jre macOS
      - name: Copy Jre for macOS
        if: ${{ runner.os == 'macOS' }}
        run: |
          mkdir chat2db-client/static
          cp -r $JAVA_HOME chat2db-client/static/jre
          chmod -R 777 chat2db-client/static/jre/

      # Copy jre Linux
      - name: Copy Jre for Linux
        if: ${{ runner.os == 'Linux' }}
        run: |
          mkdir chat2db-client/static
          cp -r $JAVA_HOME chat2db-client/static/jre
          chmod -R 777 chat2db-client/static/jre/

      # Install node
      - name: Install Node.js
        uses: actions/setup-node@main
        with:
          node-version: 16
          cache: "yarn"
          cache-dependency-path: chat2db-client/yarn.lock

      # Install java
      - name: Install Java and Maven
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "temurin"
          cache: "maven"

      # Build static file information
      - name: Yarn install & build & copy
        run: |
          cd chat2db-client
          yarn 
          yarn run build:web:prod --app_version=${{ steps.chat2db_version.outputs.substring }}
          cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front
          cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf/
          cd src/main
          yarn
          yarn run build

      # Compile server-side java version
      - name: Build Java
        run: mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml

      # touch versions
      - name: touch versions
        run: |
          cd chat2db-client
          mkdir versions
          mkdir versions/${{ steps.chat2db_version.outputs.substring }}
          mkdir versions/${{ steps.chat2db_version.outputs.substring }}/static
          touch version
          echo -n ${{ steps.chat2db_version.outputs.substring }} > version
          cp -r version ./versions/

      # Copy server-side java to the specified location
      - name: Copy App
        run: |
          cp chat2db-server/chat2db-server-start/target/chat2db-server-start.jar chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/static/
      #    cp -r chat2db-server/chat2db-server-start/target/lib chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/static/lib

      - name: Prepare Build Electron
        run: |
          cd chat2db-client
          yarn run build:web:desktop --app_version=${{ steps.chat2db_version.outputs.substring }}
          cp -r dist ./versions/${{ steps.chat2db_version.outputs.substring }}/
          rm -r dist

      # windows
      - name: Build/release Electron app for Windows
        if: ${{ runner.os == 'Windows' }}
        uses: samuelmeuli/action-electron-builder@v1
        with:
          package_root: "chat2db-client/"
          GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
          mac_certs: ${{ secrets.mac_certs }}
          mac_certs_password: ${{ secrets.mac_certs_password }}
          skip_build: true
          args: "-c.extraMetadata.version=${{ steps.chat2db_version.outputs.substring }} --win --x64"
          release: true

      # macos x86_64
      - name: Build/release Electron app for MacOS X64
        if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
        uses: samuelmeuli/action-electron-builder@v1
        with:
          package_root: "chat2db-client/"
          GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
          mac_certs: ${{ secrets.mac_certs }}
          mac_certs_password: ${{ secrets.mac_certs_password }}
          skip_build: true
          args: "-c.extraMetadata.version=${{ steps.chat2db_version.outputs.substring }} --mac --x64"
          release: true

      # x86_64 notarization
      - name: Notarization x86_64 App
        if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
        run: |
          xcrun notarytool store-credentials "Chat2DB" --apple-id "${{secrets.MAC_APPLE_ID}}" --password "${{secrets.MAC_APPLE_PASSWORD}}" --team-id "${{secrets.MAC_TEAM_ID}}"
          xcrun notarytool submit chat2db-client/release/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.dmg --keychain-profile "Chat2DB"

      # macos arm64
      - name: Build/release Electron app for MacOS arm64
        if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
        uses: samuelmeuli/action-electron-builder@v1
        with:
          package_root: "chat2db-client/"
          GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
          mac_certs: ${{ secrets.mac_certs }}
          mac_certs_password: ${{ secrets.mac_certs_password }}
          skip_build: true
          args: "-c.extraMetadata.version=${{ steps.chat2db_version.outputs.substring }} --mac --arm64"
          release: true

      # arm notarization
      - name: Notarization arm64 App
        if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
        run: |
          xcrun notarytool store-credentials "Chat2DB" --apple-id "${{secrets.MAC_APPLE_ID}}" --password "${{secrets.MAC_APPLE_PASSWORD}}" --team-id "${{secrets.MAC_TEAM_ID}}"
          xcrun notarytool submit chat2db-client/release/Chat2DB-${{ steps.chat2db_version.outputs.substring }}-arm64.dmg --keychain-profile "Chat2DB"

      # Linux
      - name: Delete File
        if: ${{ runner.os == 'Linux' }}
        run: |
          cd chat2db-client/static/jre/
          ls -la
          rm -rf legal
          ls -la

      - name: Build/release Electron app for Linux
        if: ${{ runner.os == 'Linux' }}
        uses: samuelmeuli/action-electron-builder@v1
        with:
          package_root: "chat2db-client/"
          GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
          skip_build: true
          args: "-c.extraMetadata.version=${{ steps.chat2db_version.outputs.substring }} --linux"
          release: true

      # Prepare the required data Windows
      - name: Prepare upload for Windows
        if: runner.os == 'Windows'
        run: |
          mkdir oss_temp_file
          cp -r chat2db-client/release/*Setup*.exe ./oss_temp_file

      # Prepare the required data MacOS x86_64
      - name: Prepare upload for MacOS x86_64
        if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
        run: |
          mkdir oss_temp_file
          cp chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/static/chat2db-server-start.jar   ./oss_temp_file
          cp -r chat2db-client/release/*.dmg ./oss_temp_file
          cp -r chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/dist ./oss_temp_file/dist
          cd chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/ && zip -r ${{ steps.chat2db_version.outputs.substring }}.zip ./
          cp -r ${{ steps.chat2db_version.outputs.substring }}.zip ../../../oss_temp_file
          cd static/ && zip -r chat2db-server-start.zip ./ 
          cp -r chat2db-server-start.zip ../../../../oss_temp_file

      # Prepare the required data MacOS arm64
      - name: Prepare upload for MacOS arm64
        if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
        run: |
          mkdir oss_temp_file
          cp -r chat2db-client/release/*.dmg ./oss_temp_file

      # Prepare the required data Linux
      - name: Prepare upload for Linux
        if: runner.os == 'Linux'
        run: |
          mkdir oss_temp_file
          cp -r chat2db-client/release/*.AppImage ./oss_temp_file

      # Upload files to OSS for easy downloading
      - name: Set up oss utils
        uses: yizhoumo/setup-ossutil@v1
        with:
          endpoint: "oss-accelerate.aliyuncs.com"
          access-key-id: ${{ secrets.OSS_ACCESS_KEY_ID }}
          access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
          ossutil-version: "1.7.16"
      - name: Upload to oss
        run: |
          ossutil cp -rf --acl=public-read ./oss_temp_file/ oss://chat2db-client/release/${{ steps.chat2db_version.outputs.substring }}/

      # Build completion notification
      - name: Send dingtalk message for Windows
        if: ${{ runner.os == 'Windows' }}
        uses: ghostoy/dingtalk-action@master
        with:
          webhook: ${{ secrets.DINGTALK_WEBHOOK }}
          msgtype: markdown
          content: |
            {
              "title": "Windows-release-打包完成通知",
              "text": "# Windows-release-打包完成通知   \n ![bang](https://oss.sqlgpt.cn/static/happy100.jpg)   \n ###  任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }})   \n ### Windows下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB%20Setup%20${{ steps.chat2db_version.outputs.substring }}.exe](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB%20Setup%20${{ steps.chat2db_version.outputs.substring }}.exe) "
            }

      # Build completion notification
      - name: Send dingtalk message for MacOS x86_64
        if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
        uses: ghostoy/dingtalk-action@master
        with:
          webhook: ${{ secrets.DINGTALK_WEBHOOK }}
          msgtype: markdown
          content: |
            {
              "title": "MacOS-x86_64-release-构建完成通知",
              "text": "# MacOS-x86_64-release-打包完成通知   \n ![bang](https://oss.sqlgpt.cn/static/happy100.jpg)   \n ###  任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }})    \n ### Intel芯片下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.dmg](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.dmg)   \n ### jar包下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/chat2db-server-start.zip](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/chat2db-server-start.zip) "
            }

      # Build completion notification
      - name: Send dingtalk message for MacOS arm64
        if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
        uses: ghostoy/dingtalk-action@master
        with:
          webhook: ${{ secrets.DINGTALK_WEBHOOK }}
          msgtype: markdown
          content: |
            {
              "title": "MacOS-arm64-release-构建完成通知",
              "text": "# MacOS-arm64-release-打包完成通知   \n ![bang](https://oss.sqlgpt.cn/static/happy100.jpg)   \n ###  任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }})   \n ### Apple芯片下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}-arm64.dmg](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}-arm64.dmg) "
            }

      # Build completion notification
      - name: Send dingtalk message for Linux
        if: ${{ runner.os == 'Linux' }}
        uses: ghostoy/dingtalk-action@master
        with:
          webhook: ${{ secrets.DINGTALK_WEBHOOK }}
          msgtype: markdown
          content: |
            {
              "title": "Linux-test-打包完成通知",
              "text": "# Linux-test-打包完成通知   \n ![bang](https://oss.sqlgpt.cn/static/happy100.jpg)   \n ###  任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }})   \n ### Linux下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.AppImage](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.AppImage)"
            }

================================================
FILE: .github/workflows/release_test.yml
================================================
name: Build Test Client

on:
  push:
    branches:
    - "release_test"

jobs:
  release:
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: windows-latest
            file_extension: ".exe"
            file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test%20Setup%2099.0.${{ github.run_id }}-Test.exe"
            build_arg: "--win --x64"
          - os: macos-latest
            arch: x86_64
            file_name: "https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test.dmg"
            file_extension: ".dmg"
            build_arg: "--mac --x64"
          - os: macos-latest
            arch: arm64
            file_name: "https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test-arm64.dmg"
            file_extension: ".dmg"
            build_arg: "--mac --arm64"
          - os: ubuntu-latest
            file_name: "https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test.AppImage"
            file_extension: ".AppImage"
            build_arg: "--linux"
    runs-on: ${{ matrix.os }}

    steps:
      - name: Check out git repository
        uses: actions/checkout@main

      # Install JRE
      - name: Install JRE
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "temurin"
          java-package: "jre"
          # architecture: ${{ matrix.arch == 'arm64' && 'aarch64' || 'x64' }}

      # OpenTLS
      - name: Enable TLS 1.0 and 1.1 in java.security
        run: |
          if [ "$RUNNER_OS" = "Windows" ]; then
            sed -i "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
          elif [ "$RUNNER_OS" = "Linux" ]; then
            sed -i "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
          elif [ "$RUNNER_OS" = "macOS" ]; then
            sed -i '' "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
          fi
        shell: bash
        env:
          RUNNER_OS: ${{ runner.os }}
          JAVA_HOME: ${{ env.JAVA_HOME }}

      # Copy JRE to the front-end static directory
      - name: Copy JRE to static directory
        run: |
          mkdir -p chat2db-client/static
          cp -r "$JAVA_HOME"/ chat2db-client/static/jre
          if [ "${{ runner.os }}" != "Windows" ]; then
            chmod -R 777 chat2db-client/static/jre
          fi
        shell: bash
        env:
          JAVA_HOME: ${{ env.JAVA_HOME }}

      # Delete related files in jre in Linux
      - if: ${{ runner.os == 'Linux' }}
        name: Delete File on Linux
        run: |
          cd chat2db-client/static/jre/
          ls -la
          rm -rf legal
          ls -la

      # Install Node.js
      - name: Install Node.js
        uses: actions/setup-node@main
        with:
          node-version: "16"
          cache: "yarn"
          cache-dependency-path: chat2db-client/yarn.lock

      # Install Java
      - name: Install Java and Maven
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "temurin"
          cache: "maven"

      # Packaging web front-end resources
      - name: Build FE Static
        run: |
          cd chat2db-client
          yarn
          yarn run build:web:prod --app_version=99.0.${{ github.run_id }} --app_port=10822
          cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front
          cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf/
          cd src/main
          yarn
          yarn run build


      # Package backend project & send to frontend
      - name: Build BE Static
        run: |
          mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml
          mkdir -p chat2db-client/versions/99.0.${{ github.run_id }}/static
          echo -n 99.0.${{ github.run_id }} > chat2db-client/version
          cp -r chat2db-client/version chat2db-client/versions/
          cp chat2db-server/chat2db-server-start/target/chat2db-server-start.jar chat2db-client/versions/99.0.${{ github.run_id }}/static/

      # Packaging desktop front-end resources
      - name: Prepare Build Electron
        run: |
          cd chat2db-client
          yarn run build:web:desktop --app_version=99.0.${{ github.run_id }} --app_port=10822
          cp -r dist ./versions/99.0.${{ github.run_id }}/
          rm -r dist

      # Packaging Electron
      - name: Build/release Electron app
        uses: samuelmeuli/action-electron-builder@v1
        with:
          package_root: "chat2db-client/"
          GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
          mac_certs: ${{ secrets.mac_certs_temp }}
          mac_certs_password: ${{ secrets.mac_certs_password_temp }}
          skip_build: true
          args: >
            -c.appId=com.chat2db.test
            -c.productName=Chat2DB-Test
            -c.win.publisherName=Chat2DB-Test
            -c.nsis.shortcutName=Chat2DB-Test
            -c.extraMetadata.version=99.0.${{ github.run_id }}-Test
            ${{ matrix.build_arg}}

      # Notarization & Signature Mac App
      - name: Notarize MacOS x86_64 App
        if: matrix.os == 'macos-latest' && matrix.arch == 'x86_64'
        run: |
          xcrun notarytool store-credentials "Chat2DB" --apple-id "${{ secrets.MAC_APPLE_ID }}" --password "${{ secrets.MAC_APPLE_PASSWORD }}" --team-id "${{ secrets.MAC_TEAM_ID }}"
          xcrun notarytool submit chat2db-client/release/Chat2DB-Test-99.0.${{ github.run_id }}-Test.dmg --keychain-profile "Chat2DB"
      
      - name: Notarize MacOS ARM64 App
        if: matrix.os == 'macos-latest' && matrix.arch == 'arm64'
        run: |
          xcrun notarytool store-credentials "Chat2DB" --apple-id "${{ secrets.MAC_APPLE_ID }}" --password "${{ secrets.MAC_APPLE_PASSWORD }}" --team-id "${{ secrets.MAC_TEAM_ID }}"
          xcrun notarytool submit chat2db-client/release/Chat2DB-Test-99.0.${{ github.run_id }}-Test-arm64.dmg --keychain-profile "Chat2DB"
    
          
      

      # Build Jar
      - name: Prepare upload for Jar
        if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
        run: |
          mkdir -p oss_temp_file
          cp chat2db-client/versions/99.0.${{ github.run_id }}/static/chat2db-server-start.jar   ./oss_temp_file
          cp -r chat2db-client/release/*.dmg ./oss_temp_file
          cp -r chat2db-client/versions/99.0.${{ github.run_id }}/dist ./oss_temp_file/dist
          cd chat2db-client/versions/99.0.${{ github.run_id }}/ && zip -r 99.0.${{ github.run_id }}.zip ./
          cp -r 99.0.${{ github.run_id }}.zip ../../../oss_temp_file
          cd static/ && zip -r chat2db-server-start.zip ./ 
          cp -r chat2db-server-start.zip ../../../../oss_temp_file

      # Prepare files to be sent to OSS
      - name: Prepare upload for OSS
        run: |
          mkdir -p oss_temp_file
          cp -r chat2db-client/release/*${{ matrix.file_extension }} ./oss_temp_file

      # Set up OSS
      - name: Set up oss utils
        uses: yizhoumo/setup-ossutil@v1
        with:
          endpoint: "oss-accelerate.aliyuncs.com"
          access-key-id: ${{ secrets.OSS_ACCESS_KEY_ID }}
          access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
          ossutil-version: "1.7.16"

      # Upload to OSS
      - name: Upload to OSS
        run: |
          ossutil cp -rf --acl=public-read ./oss_temp_file/ oss://chat2db-client/test/99.0.${{ github.run_id }}/

      # Configure SSH to be uploaded to the server
      - name: Install ssh key
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SERVER_DOWNLOAD_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan -t rsa ${{ secrets.SERVER_DOWNLOAD_HOST }} >> ~/.ssh/known_hosts
          eval `ssh-agent -s`
          ssh-add ~/.ssh/id_rsa     
      # upload to server
      - name: Upload package
        run: |
          ssh -t ${{ secrets.SERVER_DOWNLOAD_USERNAME }}@${{ secrets.SERVER_DOWNLOAD_HOST }} "mkdir -p ${{ secrets.SERVER_DOWNLOAD_PATH }}/test//99.0.${{ github.run_id }}" 
          scp ./oss_temp_file/* ${{ secrets.SERVER_DOWNLOAD_USERNAME }}@${{ secrets.SERVER_DOWNLOAD_HOST }}:${{ secrets.SERVER_DOWNLOAD_PATH }}/test//99.0.${{ github.run_id }}/ 
              

      # Send to DingTalk
      - name: Send dingtalk message
        uses: ghostoy/dingtalk-action@master
        with:
          webhook: ${{ secrets.DINGTALK_WEBHOOK }}
          msgtype: markdown
          content: |
            {
              "title": "${{ matrix.os }}-test-打包完成通知",
              "text": "# ${{ matrix.os }}-test-打包完成通知\n !\n ###  任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }})\n ### 下载地址:[${{matrix.file_name}}](${{matrix.file_name}})"
            }

      # Send Jar package address to DingTalk
      - if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
        name: Send dingtalk message
        uses: ghostoy/dingtalk-action@master
        with:
          webhook: ${{ secrets.DINGTALK_WEBHOOK }}
          msgtype: markdown
          content: |
            {
              "title": "Jar-test-构建完成通知",
              "text": "### jar包下载地址:[https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/chat2db-server-start.zip](https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/chat2db-server-start.zip) "
            }


================================================
FILE: .github/workflows/release_test_2.yml
================================================
name: Build Test Client 2 

on:
  push:
    branches:
    - "release_test_2"

jobs:
  release:
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: windows-latest
            file_extension: ".exe"
            file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test%20Setup%2099.0.${{ github.run_id }}-Test.exe"
            build_arg: "--win --x64"
          - os: macos-latest
            arch: x86_64
            file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test.dmg"
            file_extension: ".dmg"
            build_arg: "--mac --x64"
          - os: macos-latest
            arch: arm64
            file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test-arm64.dmg"
            file_extension: ".dmg"
            build_arg: "--mac --arm64"
          - os: ubuntu-latest
            file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test.AppImage"
            file_extension: ".AppImage"
            build_arg: "--linux"
    runs-on: ${{ matrix.os }}

    steps:
      - name: Check out git repository
        uses: actions/checkout@main

      # Install JRE
      - name: Install JRE
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "temurin"
          java-package: "jre"
          # architecture: ${{ matrix.arch == 'arm64' && 'aarch64' || 'x64' }}

      # Open TLS
      - name: Enable TLS 1.0 and 1.1 in java.security
        run: |
          if [ "$RUNNER_OS" = "Windows" ]; then
            sed -i "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
          elif [ "$RUNNER_OS" = "Linux" ]; then
            sed -i "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
          elif [ "$RUNNER_OS" = "macOS" ]; then
            sed -i '' "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
          fi
        shell: bash
        env:
          RUNNER_OS: ${{ runner.os }}
          JAVA_HOME: ${{ env.JAVA_HOME }}

      # Copy JRE to the front-end static directory
      - name: Copy JRE to static directory
        run: |
          mkdir -p chat2db-client/static
          cp -r "$JAVA_HOME"/ chat2db-client/static/jre
          if [ "${{ runner.os }}" != "Windows" ]; then
            chmod -R 777 chat2db-client/static/jre
          fi
        shell: bash
        env:
          JAVA_HOME: ${{ env.JAVA_HOME }}

      # Delete related files in jre in Linux
      - if: ${{ runner.os == 'Linux' }}
        name: Delete File on Linux
        run: |
          cd chat2db-client/static/jre/
          ls -la
          rm -rf legal
          ls -la

      # Install Node.js
      - name: Install Node.js
        uses: actions/setup-node@main
        with:
          node-version: "16"
          cache: "yarn"
          cache-dependency-path: chat2db-client/yarn.lock

      # Install Java
      - name: Install Java and Maven
        uses: actions/setup-java@main
        with:
          java-version: "17"
          distribution: "temurin"
          cache: "maven"

      # Packaging web front-end resources
      - name: Build FE Static
        run: |
          cd chat2db-client
          yarn
          yarn run build:web:prod --app_version=99.0.${{ github.run_id }} --app_port=10822
          cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front
          cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf/
          cd src/main
          yarn
          yarn run build

      # Package backend project & send to frontend
      - name: Build BE Static
        run: |
          mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml
          mkdir -p chat2db-client/versions/99.0.${{ github.run_id }}/static
          echo -n 99.0.${{ github.run_id }} > chat2db-client/version
          cp -r chat2db-client/version chat2db-client/versions/
          cp chat2db-server/chat2db-server-start/target/chat2db-server-start.jar chat2db-client/versions/99.0.${{ github.run_id }}/static/

      # Packaging desktop front-end resources
      - name: Prepare Build Electron
        run: |
          cd chat2db-client
          yarn run build:web:desktop --app_version=99.0.${{ github.run_id }} --app_port=10822
          cp -r dist ./versions/99.0.${{ github.run_id }}/
          rm -r dist

      # Packing Electron
      - name: Build/release Electron app
        uses: samuelmeuli/action-electron-builder@v1
        with:
          package_root: "chat2db-client/"
          GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
          mac_certs: ${{ secrets.mac_certs }}
          mac_certs_password: ${{ secrets.mac_certs_password }}
          skip_build: true
          args: >
            -c.appId=com.chat2db.test
            -c.productName=Chat2DB-Test
            -c.win.publisherName=Chat2DB-Test
            -c.nsis.shortcutName=Chat2DB-Test
            -c.extraMetadata.version=99.0.${{ github.run_id }}-Test
            ${{ matrix.build_arg}}

      # Notarization & Signature Mac App
      - name: Notarize MacOS x86_64 App
        if: matrix.os == 'macos-latest' && matrix.arch == 'x86_64'
        run: |
          xcrun notarytool store-credentials "Chat2DB" --apple-id "${{ secrets.MAC_APPLE_ID }}" --password "${{ secrets.MAC_APPLE_PASSWORD }}" --team-id "${{ secrets.MAC_TEAM_ID }}"
          xcrun notarytool submit chat2db-client/release/Chat2DB-Test-99.0.${{ github.run_id }}-Test.dmg --keychain-profile "Chat2DB"

      # Build Jar
      - name: Prepare upload for Jar
        if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
        run: |
          mkdir -p oss_temp_file
          cp chat2db-client/versions/99.0.${{ github.run_id }}/static/chat2db-server-start.jar   ./oss_temp_file
          cp -r chat2db-client/release/*.dmg ./oss_temp_file
          cp -r chat2db-client/versions/99.0.${{ github.run_id }}/dist ./oss_temp_file/dist
          cd chat2db-client/versions/99.0.${{ github.run_id }}/ && zip -r 99.0.${{ github.run_id }}.zip ./
          cp -r 99.0.${{ github.run_id }}.zip ../../../oss_temp_file
          cd static/ && zip -r chat2db-server-start.zip ./ 
          cp -r chat2db-server-start.zip ../../../../oss_temp_file

      # Prepare files to be sent to OSS
      - name: Prepare upload for OSS
        run: |
          mkdir -p oss_temp_file
          cp -r chat2db-client/release/*${{ matrix.file_extension }} ./oss_temp_file

      # Set up OSS
      - name: Set up oss utils
        uses: yizhoumo/setup-ossutil@v1
        with:
          endpoint: "oss-accelerate.aliyuncs.com"
          access-key-id: ${{ secrets.OSS_ACCESS_KEY_ID }}
          access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
          ossutil-version: "1.7.16"

      # Upload to OSS
      - name: Upload to OSS
        run: |
          ossutil cp -rf --acl=public-read ./oss_temp_file/ oss://chat2db-client/test/99.0.${{ github.run_id }}/

      # Send to DingTalk
      - name: Send dingtalk message
        uses: ghostoy/dingtalk-action@master
        with:
          webhook: ${{ secrets.DINGTALK_WEBHOOK }}
          msgtype: markdown
          content: |
            {
              "title": "${{ matrix.os }}-test-打包完成通知",
              "text": "# ${{ matrix.os }}-test-打包完成通知\n ![bang](https://oss.sqlgpt.cn/static/bang100.gif)\n ###  任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }})\n ### 下载地址:[${{matrix.file_name}}](${{matrix.file_name}})"
            }

      # Send Jar address to DingTalk
      - if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
        name: Send dingtalk message
        uses: ghostoy/dingtalk-action@master
        with:
          webhook: ${{ secrets.DINGTALK_WEBHOOK }}
          msgtype: markdown
          content: |
            {
              "title": "Jar-test-构建完成通知",
              "text": "### jar包下载地址:[https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/chat2db-server-start.zip](https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/chat2db-server-start.zip) "
            }


================================================
FILE: .gitignore
================================================
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
.out

### Visual Studio Code ###
package-lock.json

### Mac
.DS_Store
/chat2db-server/ali-dbhub-server-start/src/main/resources/static/front/*
/chat2db-server/ali-dbhub-server-start/src/main/resources/thymeleaf

### docker 数据不用上传
/docker/redis/data/*
/docker/test/reds/*
/docker/test/mongodb/*
/chat2db-server/ali-dbhub-server-domain/ali-dbhub-server-domain-support/src/main/resources/lib/*
/chat2db-server/ali-dbhub-server-domain/ali-dbhub-server-domain-support/lib/*
/lib
/out/*

================================================
FILE: .vscode/settings.json
================================================
{
  "cSpell.words": [
    "aarch",
    "ahooks",
    "alicdn",
    "aliyuncs",
    "altool",
    "andale",
    "antd",
    "asar",
    "AZUREAI",
    "bgcolor",
    "blockmap",
    "cascader",
    "charsets",
    "chmod",
    "CLOB",
    "Consolas",
    "Datas",
    "datasource",
    "Datetime",
    "DBAI",
    "DBHUB",
    "Dchat",
    "dingtalk",
    "Dloader",
    "Dmaven",
    "Dproject",
    "Dserver",
    "Dspring",
    "echart",
    "echarts",
    "favicons",
    "fulltext",
    "ghostoy",
    "hljs",
    "iconfont",
    "indexs",
    "jdbc",
    "kingbase",
    "lucida",
    "macos",
    "Mddhhmmss",
    "Menlo",
    "mkdir",
    "monaco",
    "msgtype",
    "Navciat",
    "Navicat",
    "nsis",
    "OPENAI",
    "ossutil",
    "partialize",
    "pgsql",
    "plsql",
    "pnpm",
    "Popconfirm",
    "Prec",
    "quickinput",
    "redownload",
    "remaininguses",
    "RESTAI",
    "samuelmeuli",
    "scroller",
    "Sercurity",
    "singlestoredb",
    "sortablejs",
    "SQLSERVER",
    "temurin",
    "thymeleaf",
    "Tigger",
    "togglefullscreen",
    "transactsql",
    "trino",
    "umijs",
    "umirc",
    "USERANDPASSWORD",
    "uuidv",
    "VARCHAR",
    "VIEWCOLUMN",
    "VIEWCOLUMNS",
    "wechat",
    "wireframe",
    "Wppk",
    "xcrun",
    "yapi",
    "yizhoumo",
    "zustand"
  ],
  "java.compile.nullAnalysis.mode": "automatic"
}


================================================
FILE: CHANGELOG.md
================================================
## 3.1.19

`2024-1-3`

**Changelog**

- ⭐【New Features】Open table supports filtering sort
- ⚡️【Optimize】Optimize startup speed
- 🐞【Fixed】SQL error generated by modifying the table structure
- 🐞【Fixed】The problem of direct query table data error due to characters
- 🐞【Fixed】null point error


## 3.1.18

`2023-12-28`

**Changelog**

- 🐞【Fixed】 docker startup error

## 3.1.17

`2023-12-27`

**Changelog**

- ⭐【New Features】Connection replicable
- ⚡️【Optimize】Select the table to view the DDL of the table in Information on the right expansion bar
- 🐞【Fixed】 Modifying table sorting does not generate sorting SQL problems
- 🐞【Fixed】Home connection cannot switch pages
- 🐞【Fixed】Columns cannot be viewed or edited in some tables of the Oracle database

## 3.1.16

`2023-12-25`

**Changelog**

- ⭐【New Features】Execute the Record sql Add replication button
- ⭐【New Features】Execution records can be opened directly in the console
- ⭐【New Features】The SQL column on the right of execution record and save can be expanded and dragged
- 🐞【Fixed】Some databases could not display the Database/Schema structure
- 🐞【Fixed】During web deployment, a page error occurs after the page switching page is refreshed
- ⚡️【Optimize】The query result cancels in-cell scrolling and instead uses hover to view cell contents

## 3.1.15

`2023-12-20`

**Changelog**

- 🐞【Fixed】Every time I open the application, I occasionally cannot select the database problem
- 🐞【Fixed】Compatible with old data types can not show deletion problems
- 🐞【Fixed】Some databases cannot display the database /Schema structure

## 3.1.14

`2023-12-17`

**Changelog**

- 🐞【Fixed】Tree structure search for bugs
- 🐞【Fixed】Switching tab causes edit data reset problem
- 🐞【Fixed】Rename is reset after switching tab


## 3.1.12

`2023-12-15`

**Changelog**

- ⚡️【Optimize】Optimized tree structure search
- ⚡️【Optimize】Tree structure search box resident

## 3.1.11

`2023-12-13`

**Changelog**

- 🐞【Fixed】A chart with a Schema cannot be saved and executed
- 🐞【Fixed】Failure to start after the upgrade

## 3.1.1

`2023-12-13`

**Changelog**

- 🐞【Fixed】Table blank problem when switching Tabs
- 🐞【Fixed】DM or Oracle cannot display Schema
- 🐞【Fixed】The import connection is lost. Procedure

## 3.1.0

`2023-12-12`

**Changelog**

- 🔥🔥【Optimize】The first startup time has been increased by 65%
- 🔥🔥【Optimize】Changed the structure of the left tree 
- 🔥🔥【Optimize】Optimized the tab switchover problem 
- ⚡️ 【Optimize】All nodes are supported. The name of each node can be copied 
- ⚡️【Optimize】The sql console input box supports switching databases, and will not change when the left database is switched 
- ⭐ 【New Features】Save records moved to the right toolbar, you can directly modify the name in the list 
- ⭐【New Features】Support mongoDB 
- ⭐【New Features】Support for viewing all tables

## 3.0.14

`2023-11-20`

**Changelog**

- 🐞【Fixed】Team paging problem
- 🐞【Fixed】Oracle service name bug
- 🐞【Fixed】Oracle datatype error
- 🐞【Fixed】Fixed an issue where MySQL changed table structure without displaying comments.
- ⚡️【Optimize】Support database or schema
- 【Developer】Friends don't worry, the company has some things recently, and is preparing 3.1.0, be patient

## 3.0.13

`2023-11-15`

**Changelog**

- 🐞【Fixed】oracle datatype error
- 🐞【Fixed】DM index error


## 3.0.12

`2023-11-13`

**Changelog**

- 🐞【Fixed】Copy as insert first row lost problem
- 🐞【Fixed】DM database index bug
- 🐞【Fixed】Point Garbled code problem
- 🐞【Fixed】MariaDB connec database bug
- 🐞【Fixed】Issues 792 NullPointerException
- 🐞【Fixed】Kingbase8r6 error


## 3.0.11

`2023-11-08`

**Changelog**

- ⭐【New Features】Oracle connections support the Service name mode
- ⭐【New Features】【New function】 Edit table data to support batch copy, clone, delete (click 1X1 cell to select/cancel, hold down shift/ctrl/cmd to select multiple)
- ⚡️【Optimize】After the update is completed, click restart to close the problem that cannot be automatically opened (hot update cannot fix this problem, you need to download a new version to cover the client)
- 🐞【Fixed】database and schema searches support case ambiguity matching
- 🐞【Fixed】Where database was not displayed after being added
- 🐞【Fixed】sql formatting to ·now()· format error


## 3.0.10

`2023-11-06`

**Changelog**
- ⭐【New Features】Add multiple CN AI configurations Add multiple domestic AI configurations
  - Supports single-row replication of Insert, Update, table header fields, and row data 
  - Clone the selected row 
  - Replication of cell data is supported 
  - You can set the cell to Null or Default 
  - Row deletion is supported
  - Supports zooming in to view or modify data
- ⭐【New Features】Supports the ctrl/cmd+c shortcut to copy row data or cell data
- ⭐【New Features】Supports the shortcut key ctrl/cmd+v to paste and copy row data/cell data to row/cell
- ⭐【New Features】Edit table structure supports setting primary keys in columns
- ⭐【New Features】History is added to the foldable panel on the right
- ⭐【New Features】Edit data to support cell-level undo changes
- ⭐【New Features】The Table tree node operation menu on the left supports copying table, field, key, index, and function names
- ⭐【New Features】The node in the left Table tree supports ctrl/cmd+c to copy the node text
- ⭐【New Features】You can right-click to close tabs, close other tabs, or close all tabs
- ⭐【New Features】Top database and schema support search
- ⚡️【Optimize】Smart prompts for SQL editing
- ⚡️【Optimize】Edit the table structure to add loading
- ⚡️【Optimize】The tree node operation menu supports right-clicking
- 🐞【Fixed】Fixed table structure editing floating-point decimal Settings display exception
- 🐞【Fixed】Fixed switching the saved sql on the console will eliminate the problem
- 🐞【Fixed】After multiple tables are paged, the context cannot select a table other than the current page
- 🐞【Fixed】Console and resulting Tabs mouse wheel not scrolling

## 3.0.9

`2023-11-01`

**Changelog**
- ⭐【New Features】Query results can be refreshed
- ⚡️【Optimize】Console Tabs adaptive width
- 🐞【Fixed】console save bug
- 🐞【Fixed】sqlite can only retrieve one piece of data

## 3.0.5

`2023-10-23`

**Changelog**
- ⭐【New Features】Supports visual database creation
- ⭐【New Features】Support hot update
- ⭐【New Features】Double-click the table to open it directly
- ⚡️【Optimize】The search table supports size fuzzy matching
- ⚡️【Optimize】Sort Database and Schema at the top
- ⚡️【Optimize】The queried data supports editing and modification in the large popup window of the view
- ⚡️【Optimize】Example Query the page loading effect of data
- ⚡️【Optimize】Keep the top focused tab always in the viewable area
- ⚡️【Optimize】Query data cell does not have scroll bar problem

## 3.0.4

`2023-10-20`

**Changelog**
- 🐞【Fixed】Bugs are displayed when more than 100 data items are queried

## 3.0.1

`2023-10-19`

**Changelog**
- ⚡️【Optimize】Search result scroll bar
- ⚡️【Fixed】Oracle update result data bug

## 3.0.0

`2023-10-17`

**Changelog**
- 🔥【New Features】Support for team collaboration mode
- 🔥【New Features】Support for visual table structure creation, editing, and deletion
- 🔥【New Features】Support for editing, adding, and deleting query data results
- ⭐【New Features】Support the feature of importing Navicat/DBever data source links
- ⭐【New Features】Support for AI automatic sync table structure。
- ⭐【New Features】Support export table structure
- ⭐【New Features】Support importing SQL files
- ⭐【New Features】Support the connection supports adding an environment,better distinguishing between online and daily
- ⚡️【Optimize】Optimize Editor Intellisense
- ⚡️【Optimize】Optimize AI Input
- ⚡️【Optimize】Sql query support is stopped
- ⚡️【Optimize】Sql execution supports viewing the number of affected rows
- ⚡️【Optimize】Reclaiming non-administrator permissions to edit shared connections
- ⚡️【Optimize】`Cmd/Ctrl + R` Run SQL, `Cmd/Ctrl + Shift + R` Refresh Page
- 🐞【Fixed】Table operation columns are overridden by table comments
- 🐞【Fixed】The last Tab in the query result cannot be closed

## 2.1.0

## ⭐ New Features

- 🔥The team function is newly launched, supporting team collaboration. R&D does not require knowing the online database
  password, solving the security issue of enterprise database accounts. It is recommended to directly deploy the team
  function using 'docker'
- Added support for environment selection, better distinguishing between online and daily

## 2.0.14

## 🐞 Bug Fixes

- Fix the issue of 'Oracle' query 'Blob' reporting errors
- Modify the paging logic and fix some SQL queries that cannot be queried

## 2.0.13

## ⭐ New Features

## 🐞 Bug Fixes

- Fixed a bug where sql formatting was not selected
- Fixed open view lag issue
- Solve the white screen problem of connected non-relational databases (non-relational databases are not supported)

## 2.0.12

## ⭐ New Features

- 🔥Supports viewing views, functions, triggers, and procedures
- Support selected sql formatting
- Added new dark themes

## 🐞 Bug Fixes

- Fixed sql formatting failure issue
- Fixed an issue where locally stored theme colors and background colors are incompatible with the new version, causing
  page crashes
- Logs desensitize sensitive data
- Fix the issue of 'CLOB' not displaying specific content 【Issue #440】(https://github.com/chat2db/Chat2DB/issues/440)
- Fix the problem that non-Select does not display query results
- Fix the problem that Oracle cannot query without schema
- Fix the problem of special type of SQL execution error reporting
- Fix the problem that the test link is successful, but the error is reported when saving the link

## 2.0.11

## 🐞 Bug Fixes

- Fix the issue where SSH does not support older versions of encryption algorithms
- Fix the issue of SQL Server 2008 not being able to connect
- Fix the issue of not being able to view table name notes and field notes

## 2.0.10

## 🐞 Bug Fixes

- Activate the console for the latest operation when you create or start a console、Records the last console used
- The replication function of the browser, such as edge, is unavailable
- table Indicates an error when ddl is exported after the search
- Adds table comments and column field types and comments

## 2.0.9

## 🐞 Bug Fixes

-Fix the issue of Windows flash back

## 2.0.8

## 🐞 Bug Fixes

- Repair the Scientific notation in some databases 【Issue #378】(https://github.com/chat2db/Chat2DB/issues/378)
- Fix some cases where data is not displayed

## 🐞 问题修复

- 修复部分数据库出现科学计数法的情况 【Issue #378】(https://github.com/chat2db/Chat2DB/issues/378)
- 修复部分情况数据不展示

## 2.0.7

## ⭐ New Features

- Export query result as file is supported

## 🐞 Bug Fixes

- Fixed ai config issues 【Issue #346】(https://github.com/chat2db/Chat2DB/issues/346)

## 2.0.6

## 🐞 Bug Fixes

- Fixed: When there are too many tables under the selected library, the "New Console" button at the bottom
  disappears 【Issue #314】(https://github.com/chat2db/Chat2DB/issues/314)

## 2.0.5

## ⭐ New Features

- Supports 25 free uses of AIGC every day.
- Support for querying data pagination.
- Support switching between multiple databases in PostgreSQL.
- Support for hot updating of client-side code allows for rapid bug fixes.

## 🐞 Bug Fixes

- Default return alias for returned results 【Issue #270】(https://github.com/chat2db/Chat2DB/issues/270)
- Fixed around 100 bugs, of course, many were repetitive bugs.

## 2.0.4

## ⭐ New Features

- Support DB2 database
- Support renaming after console saving
- Support prompts during SQL execution

## 🐞 Bug Fixes

- Fix the bug that the database in sqlserver is all numbers
- Fix ssh connection bug

## 2.0.2

## ⭐ New Features

- Brand new AI binding process
- Support for custom drivers

## 🐞 Bug Fixes

- Optimized dataSource link editing
- Enhanced error messages
- Improved table selection interaction
- Enhanced table experience

## 2.0.1

## 🐞 Bug Fixes

- Fix bug where executing multiple SQL statements at once will prompt for exceptions
- Fix getJDBCDriver error: null 【Issue #123】(https://github.com/chat2db/Chat2DB/issues/123)
- Fixing the Hive connection and then viewing columns results in an
  error. 【Issue #136】(https://github.com/chat2db/Chat2DB/issues/136)


## 2.0.0

## What's Changed

- 🔥An intelligent solution that perfectly integrates SQL queries, AI assistant, and data analysis.
- 🔥New focused mode experience for advanced datasource management.
- AI integration of more LLM.
- Bilingual in Chinese and English support for client.

## 1.0.11

- fixed: SQL 有特殊字符时 AI 功能无法正常使用
- 增减版本信息检测

## 1.0.10

- fixed: The formatted SQL is abnormal 
- Optimized AI network connection exception message 
- Custom AI Adds a local example 
- Support OceanBase Presto DB2 Redis MongoDB Hive KingBase

## 1.0.9

- Fixed an issue where Open Ai could not connect 
 
- Support domestic Dameng database 
- Supports custom OPEN AI API_HOST 
- 🔥 Supports custom AI interfaces 
- Support theme color following system

## 1.0.6

- Fixed Oracle database character set issues 
- Fix mac installation prompts for security issues

## 1.0.5

- 🔥 Optimizes the boot speed of Apple chips 
- Rectify database connection problems on Windows 
- The database modification does not take effect 
- NullPointerException

## 1.0.4

- Fix ClickHouse jdbc issues 
- Restore the NPE managed by the connection pool 
- Fixed front-end edit data source error 
- Added default database properties

## 1.0.3

- 🔥 Supports SSH connection to the database 
- 🎉 Allows a client to view logs 
- 🎉 Supports chat sessions on the Console 
- Supports setting OPENAI agents on clients 
- An application that has been started will not be started again

## 1.0.1

- Fixed oracle connection configuration editing and connection query issues 
- Fix possible risks of Apikey output to logs 
- Fixed the login bug of web version

## 1.0.0

- Fixed oracle connection configuration editing and connection query issues 
- Fix possible risks of Apikey output to logs 
- repair bugChat2DB login web version 1.0.0 release come 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 
 
- 🌈 AI intelligent assistant, supports natural language to SQL, SQL to natural language, and SQL optimization suggestions 
- 👭 Support team collaboration, R & D does not need to know the online database password, to solve the security problem of enterprise database account 
- ⚙️ Provides powerful data management capabilities, including data tables, views, stored procedures, functions, triggers, indexes, sequences, users, roles, and authorization 
- 🔌 Powerful expansion ability, currently supports Mysql, PostgreSQL, Oracle, SQLServer, ClickHouse, Oceanbase, H2, SQLite and so on, the future will support more databases 
- 🛡 The front-end is developed using Electron, providing an integrated solution of Windows, Mac, Linux clients, and web versions 
- 🎁 Supports environment isolation and separation of online and daily data rights


## 0.0.0

`2023--`

**Changelog**
- ⭐【New Features】
- ⚡️【Optimize】
- 🐞【Fixed】






================================================
FILE: CHANGELOG_CN.md
================================================
## 3.1.19

`2024-1-3`

**更新日志**

- ⭐【新功能】打开表支持筛选排序
- ⚡️【优化】优化启动速度
- 🐞【修复】修改表结构生成SQL错误
- 🐞【修复】直接查询表因字符导致数据错误的问题
- 🐞【修复】null point error

## 3.1.18

`2023-12-28`

**更新日志**

- 🐞【修复】docker启动报错问题

## 3.1.17

`2023-12-27`

**更新日志**

- ⭐【新功能】连接可复制
- ⚡️【优化】选中表可直接在右侧拓展栏的“信息”中查看表DDL
- 🐞【修复】修改表排序无法生成排序SQL问题
- 🐞【修复】Oracle数据库部分表无法查看列、无法编辑问题
- 🐞【修复】团队管理归属连接无法切换分页


## 3.1.16

`2023-12-25`

**更新日志**

- ⭐【新功能】执行记录添加复制sql按钮
- ⭐【新功能】执行记录可直接在控制台打开
- ⭐【新功能】右侧执行记录、保存SQL栏展开大小可拖动
- 🐞【修复】部分数据库无法显示数据库/Schema结构的问题
- 🐞【修复】网页部署时,切换页面刷新后页面报错问题
- ⚡️【优化】查询结果取消单元格内滚动,改为hover查看单元格内容

## 3.1.15

`2023-12-20`

**更新日志**

- 🐞【修复】每次打开应用时,偶现无法选择数据库问题
- 🐞【修复】兼容老数据类型无法显示删除问题

## 3.1.14

`2023-12-17`

**更新日志**

- 🐞【修复】树结构搜索bug
- 🐞【修复】切换tab导致编辑数据重置问题
- 🐞【修复】切换tab后重命名被重置


## 3.1.12

`2023-12-15`

**更新日志**

- ⚡️【优化】优化树结构搜索
- ⚡️【优化】树结构搜索框常驻

## 3.1.11

`2023-12-13`

**更新日志**

- 🐞【修复】带Schema的图表无法保存和执行
- 🐞【修复】升级后无法启动问题

## 3.1.10

`2023-12-13`

**更新日志**

- 🐞【修复】切换Tabs时,表空白问题
- 🐞【修复】DM、Oracle无法显示Schema问题
- 🐞【修复】导入连接丢失问题

## 3.1.0

`2023-12-12`

**更新日志**

- 🔥🔥【优化】首次启动时间时间提升了65%
- 🔥🔥【优化】更改了左侧树的结构
- 🔥🔥【优化】优化切换tab卡顿问题
- ⚡️【优化】所有节点都支持选中,可以复制每个节点的名称
- ⚡️【优化】sql的console输入框支持切换数据库,不会在跟着左侧数据库的切换而改变了
- ⭐【新功能】保存记录移动到了右侧工具栏,可以直接在列表里修改名称
- ⭐【新功能】支持mongoDB
- ⭐【新功能】支持查看所有表

## 3.0.14

`2023-11-20`

**更新日志**

- 🐞【修复】团队分页问题
- 🐞【修复】Oracle服务名称错误
- 🐞【修复】Oracle数据类型错误
- 🐞【修复】修复MySQL修改表结构,不回显注释的问题。
- ⚡️【优化】支持数据库或模式
- 【开发者】友友们不要着急呀,最近公司有些事情,并且在准备3.1.0,耐心等待哦

## 3.0.13

`2023-11-15`

**更新日志**

- 🐞【修复】oracle datatype 错误
- 🐞【修复】DM index 错误

## 3.0.12

`2023-11-13`

**更新日志**

- 🐞【修复】复制为insert第一行丢失问题
- 🐞【修复】达梦数据库index问题
- 🐞【修复】Point 乱码问题
- 🐞【修复】MariaDB连接数据库错误
- 🐞【修复】#792 NullPointerException
- 🐞【修复】Kingbase8r6 错误


## 3.0.11

`2023-11-10`

**更新日志**

- ⭐【新功能】Oracle 连接支持 Service name 方式
- ⭐【新功能】编辑表数据支持批量复制、克隆、删除(点击1X1单元格全选/取消,按住shift/ctrl/cmd多选)
- ⚡️【优化】更新完成后点击重启关闭后无法自动打开问题(热更新无法修复该问题,需要下载新版版本覆盖客户端)
- 🐞【修复】database和schema搜索支持大小写模糊匹配
- 🐞【修复】添加database后不显示问题
- 🐞【修复】sql格式化对·now()·格式错误问题


## 3.0.10

`2023-11-06`

**更新日志**

- ⭐【新功能】增加多个国内 AI 配置
- ⭐【新功能】编辑数据支持右键操作
  - 支持单行复制 Insert、Update、表头字段、行数据
  - 支持克隆选中行
  - 支持复制单元格数据
  - 支持设置单元格为Null和Default
  - 支持删除行
  - 支持放大查看或修改数据
- ⭐【新功能】支持快捷键ctrl/cmd+c 复制行数据/单元格数据
- ⭐【新功能】支持快捷键ctrl/cmd+v 粘贴复制行数据/单元格数据到行/单元格
- ⭐【新功能】编辑表结构支持在列中设置主键
- ⭐【新功能】编辑数据支持单元格级别撤销修改
- ⭐【新功能】左侧Table树节点操作菜单支持复制表、字段、key、index、函数等名称
- ⭐【新功能】左侧Table树节点支持ctrl/cmd+c 复制节点文本
- ⭐【新功能】右侧可折叠面板中增加历史记录
- ⭐【新功能】支持右键关闭tab/关闭其他tab/关闭所有tab
- ⭐【新功能】顶部database和schema支持搜索
- ⚡️【优化】SQL 编辑时的智能提示
- ⚡️【优化】编辑表结构添加loading
- ⚡️【优化】树节点操作菜单支持右键唤出
- 🐞【修复】修复表结构编辑浮点数小数位设置显示异常
- 🐞【修复】修复切换控制台保存的sql会消失问题
- 🐞【修复】表多的分页后,上下文选不到当前分页以外的表
- 🐞【修复】console和结果的Tabs鼠标滚轮无法滚动的问题



## 3.0.9

`2023-11-01`

**更新日志**
- ⭐【新功能】查询结果支持刷新
- ⚡️【优化】控制台Tabs自适应宽度
- 🐞【修复】console保存bug
- 🐞【修复】sqlite只能查到一条数据问题

## 3.0.5

`2023-10-23`

**更新日志**
- ⭐【新功能】支持可视化创建数据库
- ⭐【新功能】支持热更新
- ⭐【新功能】双击表直接打开表
- ⚡️【优化】搜索表支持大小模糊匹配
- ⚡️【优化】Database 和 Schema 排序
- ⚡️【优化】查询的数据支持在查看的大的弹窗中编辑修改
- ⚡️【优化】查询数据翻页loading效果
- ⚡️【优化】保持顶部聚焦的tab永远在可视区域内
- ⚡️【优化】查询数据单元格没有滚动条问题


## 3.0.4

`2023-10-20`

**更新日志**
- 🐞【修复】查询数据超过100条时显示bug

## 3.0.1

`2023-10-19`

**更新日志**
- ⚡️【优化】查询结果滚动条
- 🐞【修复】Oracle更新结果数据错误

## 3.0.0

`2023-10-17`

**更新日志**
- 🔥【新功能】支持团队协作模式
- 🔥【新功能】支持可视化表结构新增、编辑、删除
- 🔥【新功能】支持查询数据结果编辑、新增、删除
- ⭐【新功能】支持导入Navicat/DBeaver数据源链接的功能
- ⭐【新功能】支持AI自动同步表结构
- ⭐【新功能】支持导出表结构
- ⭐【新功能】支持导入sql文件
- ⭐【新功能】连接支持添加环境标识,更好地区分在线和日常
- ⚡️【优化】优化编辑器提示功能
- ⚡️【优化】优化AI输入
- ⚡️【优化】sql查询支持停止
- ⚡️【优化】sql执行支持查看影响行数
- ⚡️【优化】回收非管理员编辑共享连接权限
- ⚡️【优化】`Cmd/Ctrl + R` 运行SQL, `Cmd/Ctrl + Shift + R` 刷新页面
- 🐞【修复】表操作列被表注释覆盖问题
- 🐞【修复】查询结果最后一个Tab无法关闭问题

## 2.1.0

## ⭐ 新特性

-🔥 新推出团队功能,支持团队协作。研发不需要知道在线数据库
密码,解决企业数据库帐号的安全问题。建议直接部署团队
使用'docker'的函数 -增加了环境选择的支持,更好地区分在线和日常

## 2.0.14

## ⭐ 新特性

- 🔥 团队功能全新上线,支持团队协作,研发无需知道线上数据库密码,解决企业数据库账号安全问题,团队功能建议直接使用 `docker` 部署
- 新增支持环境选择,更好的区分线上、日常环境

## 🐞 问题修复

- 修复 `Oracle` 查询 `Blob` 报错的问题
- 修改分页逻辑,修复部分 SQL 无法查询


## 2.0.13

## 🐞 问题修复

- 修复不选中 sql 格式化的 bug
- 修复打开视图卡顿问题
- 解决已连接的非关系型数据库打开白屏问题(暂不支持非关系性数据库)

## 2.0.12

## ⭐ 新特性

- 🔥 支持查看视图、函数、触发器、存储过程
- 支持选中 sql 格式化
- 增加新的暗色主题

## 🐞 问题修复

- 修复 sql 格式化会失败问题
- 修复本地存储的主题色、背景色与新版本不兼容时会导致页面崩溃问题
- 日志对敏感数据进行脱敏
- 修复 `CLOB` 不展示具体内容的问题 [Issue #440](https://github.com/chat2db/Chat2DB/issues/440)
- 修复非 Select 不展示查询结果的问题
- 修复 Oracle 不带 schema 无法查询的问题
- 修复特殊类型的 SQL 执行报错的问题
- 修复测试链接成功,但保存链接报错的问题

## 2.0.11

## 🐞 问题修复

- 修复 SSH 不支持老版本加密算法的问题
- 修复 SQLServer2008 无法连接的问题
- 修复无法查看表名备注、字段备注的问题

## 2.0.10

## 🐞 问题修复

- 新建、开打 console 时激活最新操作的 console、记录最后一次使用的 console
- edge 等浏览器复制功能无法正常使用
- table 搜索后导出 ddl 报错
- 增加表注释以及列字段类型和注释
- 当数据源添加了 database 默认选择第一个 database

## 2.0.9

## 🐞 问题修复

- 修复 windows 闪退的问题

## 2.0.8

## 🐞 问题修复

- 修复部分数据库出现科学计数法的情况 [Issue #378](https://github.com/chat2db/Chat2DB/issues/378)
- 修复部分情况数据不展示

## 2.0.7

## ⭐ 新特性

- 支持导出查询结果

## 🐞 问题修复

- 修复 ai 配置 [Issue #346](https://github.com/chat2db/Chat2DB/issues/346)

## 2.0.6

## 🐞 问题修复

- Fixed: 当选择的库下面表过多时最下面的“新建控制台”按钮消失 [Issue #314](https://github.com/chat2db/Chat2DB/issues/314)

## 2.0.5

## ⭐ 新特性

- 支持每天 25 次免费使用 AIGC
- 支持查询数据分页
- 支持 PostgreSQL 数据库多个 database 的切换
- 支持客户端代码热更新可以快速修复 bug
- 支持客户端字体放大缩小

## 🐞 问题修复

- 返回结果默认返回别名 [Issue #270](https://github.com/chat2db/Chat2DB/issues/270)
- 修复了 100 个左右的 bug,当然很多是重复 bug

## 2.0.4

## ⭐ 新特性

- 支持 DB2 数据库
- 支持控制台保存后重命名
- 支持 SQL 执行中提示

## 🐞 问题修复

- 修复 sqlserver 中 database 全是数字的 bug
- 修复 ssh 连接 bug

## 2.0.2

## ⭐ 新特性

- 全新的 AI 绑定流程
- 支持自定义驱动

## 🐞 问题修复

- 优化 dataSource 链接编辑
- 优化错误提示
- 优化选表交互
- 优化表格体验

## 2.0.1

## 🐞 问题修复

- 修复一次性执行多条 SQL 会提示异常的 BUG
- 修复 getJDBCDriver error: null [Issue #123](https://github.com/chat2db/Chat2DB/issues/123)
- 修复 hive 方式连接,然后查看 columns 报错 [Issue #136](https://github.com/chat2db/Chat2DB/issues/136)

## 2.0.0

## 更新内容

- 🔥SQL 查询、AI 查询和数据报表完美集成的一体化解决方案设计与实现
- 🔥 数据源连接和管理进阶为专注模式的全新体验设计与实现
- 🔥AI 对话 SQL 升级为极简模式的全新交互设计与实现
- 客户端 AI 体验重大升级,响应更多用户的诉求
- 集成更多 AI 模型
- 客户端双语支持
- SQL 查询基础功能优化
- Issue 问题修复

## 1.0.11

- fixed: SQL 有特殊字符时 AI 功能无法正常使用
- 增减版本信息检测

## 1.0.10

- fixed: 格式化 SQL 异常
- 优化 AI 网络连接异常提示
- 自定义 AI 添加本地样例
- Support OceanBase Presto DB2 Redis MongoDB Hive KingBase

## 1.0.9

- 修复 Open Ai 无法连接的问题

- 支持国产达梦数据库
- 支持自定义 OPEN AI API_HOST
- 🔥 支持自定义 AI 接口
- 支持主题色跟随系统

## 1.0.6

- 修复 Oracle 数据库字符集问题
- 修复 mac 安装提示的安全问题

## 1.0.5

- 🔥 优化 Apple 芯片的启动速度
- 修复 Windows 端数据库连接问题
- 修改 database 不生效
- NullPointerException

## 1.0.4

- 修复 ClickHouse jdbc 问题
- 修复连接池管理的 NPE
- 修复前端编辑数据源报错问题
- 增加数据库默认属性配置

## 1.0.3

- 🔥 支持 SSH 连接数据库
- 🎉 支持客户端查看日志
- 🎉 支持在 Console 中聊天对话
- 支持在客户端内设置 OPENAI 代理
- 已经启动过应用不会再重复启动

## 1.0.1

- 修复 oracle 连接配置编辑、以及连接查询问题
- 修复 Apikey 输出到日志可能存在的风险
- 修复 web 版本登录的 bug

## 1.0.0

Chat2DB 的 1.0.0 正式版来啦 🎉🎉🎉🎉🎉🎉🎉🎉🎉

- 🌈 AI 智能助手,支持自然语言转 SQL、SQL 转自然语言、SQL 优化建议
- 👭 支持团队协作,研发无需知道线上数据库密码,解决企业数据库账号安全问题
- ⚙️ 强大的数据管理能力,支持数据表、视图、存储过程、函数、触发器、索引、序列、用户、角色、授权等管理
- 🔌 强大的扩展能力,目前已经支持 Mysql、PostgreSQL、Oracle、SQLServer、ClickHouse、Oceanbase、H2、SQLite 等等,未来会支持更多的数据库
- 🛡 前端使用 Electron 开发,提供 Windows、Mac、Linux 客户端、网页版本一体化的解决方案
- 🎁 支持环境隔离、线上、日常数据权限分离


## 0.0.0

`2023--`

**更新日志**
- ⭐【新功能】
- ⚡️【优化】
- 🐞【修复】





================================================
FILE: CHAT2DB_AI_SQL.md
================================================
# Chat2DB AI SQL功能使用说明
Chat2DB包含一系列基于ChatGPT的AI SQL使用功能,主要包括自然语言转SQL、SQL解释、SQL优化和SQL转换。 使用这些AI功能,可以将自然语言转换成本地查询SQL,而不仅仅是SQL查询伪代码;可以将SQL解释成自然语言,帮助用户理解复杂的SQL;可以针对慢SQL提供全方位的优化建议,提升查询效率;可以转换不同数据库类型的SQL语言,降低数据库迁移难度等等。
## 使用配置
### 点击设置【UI旧】
<a><img src="https://img.alicdn.com/imgextra/i2/O1CN01hecdtO1acLegtiP9k_!!6000000003350-2-tps-2400-1600.png" width="100%"/></a>
### 配置AI
#### 配置OPENAI【UI旧】
使用OPENAI的ChatSql功能需要满足两个条件
- 配置OPENAI_API_KEY,如没有OPENAI_API_KEY可加入答疑群根据群公告指引获取chat2db自定义key
- 客户端网络可以连接到OPENAI官网,如果本地VPN未能全局生效,可以通过在客户端中设置网络代理HOST和PORT来保证网络连通性
<a><img src="https://img.alicdn.com/imgextra/i2/O1CN01anrJMI1FEtSBbmTau_!!6000000000456-0-tps-1594-964.jpg" width="100%"/></a>
#### 配置自定义AI【UI旧】
- 自定义AI可以是用户自己部署的任意AI模型,例如ChatGLM、ChatGPT、文心一言、通义千问等等,但是自定义的接口输入和输出需要符合自定义的协议规范才可快速使用,否则可能需要二次开发。代码中提供了两个DEMO,只需要配置自定义AI接口地址,以及接口是否流式输出即可查看。具体使用中可以参考DEMO接口来编写自定义接口,或者直接在DEMO接口中进行二次开发,封装自己的自定义接口
- 自定义的流式输出接口配置DEMO
<a><img src="https://img.alicdn.com/imgextra/i1/O1CN01xMqnRH1DlkdSekvSF_!!6000000000257-0-tps-591-508.jpg" width="100%"/></a>
- 自定义的非流式输出接口配置DEMO
<a><img src="https://img.alicdn.com/imgextra/i1/O1CN01JqmbGo1fW0GAQhRu4_!!6000000004013-0-tps-587-489.jpg" width="100%"/></a>
## 自然语言转SQL【UI旧】
### 功能描述
输入自然语言,选中执行并传入查询相关的表结构信息,则会返回相应的SQL
- 输入样例:查询学生小明的各科目成绩,并传入关联数据表course,score,student,student_course
- 输出样例:
```sql
SELECT score.score
FROM score
INNER JOIN student_course ON score.course_id = student_course.course_id
INNER JOIN student ON student_course.student_id = student.id
WHERE student.name = '小明'
```
## SQL解释
### 功能描述
输入SQL,选中执行并传入附加信息,附加信息可以添加希望解释《输入SQL》哪方面的信息,如SQL执行目标,则会返回此条SQL附加信息相关的解释
- 输入样例:SELECT department_name FROM departments WHERE department_id IN (SELECT department_id FROM employees GROUP BY department_id HAVING COUNT(*) > 10)
- 输出样例:这个SQL查询语句的意思是:从departments表中选择department_name列,其中department_id列的值在employees表中department_id列的值分组后,如果该组中的记录数大于10,则返回该department_id。换句话说,这个查询语句返回的是在employees表中有超过10个员工的部门名称。
## SQL优化
### 功能描述
输入SQL,选中执行并传入优化附加信息,附加信息可以添加希望具体优化方面和要求,则会返回此条SQL附加信息相关的优化建议
- 输入样例:SELECT * FROM department ORDER BY gmt_create DESC
- 输出样例:
  1. 尽量避免使用SELECT *,应该明确指定需要查询的列,以减少不必要的数据传输和提高查询效率。
  2. 对于ORDER BY语句,如果查询的结果集比较大,可以考虑添加LIMIT限制返回的行数,以减少排序的开销。
  3. 对于gmt_create字段,可以考虑添加索引以提高排序的效率。
  4. 如果查询的结果集经常被访问,可以考虑使用缓存技术,如Redis等,以减少数据库的访问次数。
## SQL转换
### 功能描述
输入SQL,选中执行并传入目标SQL类型和附加信息,附加信息中可以添加转换的自定义要求,则会返回目标SQL类型且符合附加要求的SQL语言
- 输入样例:SELECT IFNULL(NULL, "W3Schools.com"),目标SQL类型为Oracle SQL
- 输出样例:SELECT NVL(NULL, 'W3Schools.com') FROM dual;
## CHATBOT
### 功能描述
输入任意prompt,点击ChatRobot按钮即可根据prompt返回相应的结果,此处聊天对话默认支持上下文,默认上下文长度为4,可在application.yml文件中修改上下文长度
- 输入样例:针对第二条优化建议给出具体实现方法
- 输出样例:针对第二条优化建议,可以考虑在student表中添加一个索引,以加快查询速度。具体实现方法如下:

1. 查看student表中是否已经存在索引。可以使用以下命令查看:

   ```sql
   SHOW INDEX FROM student;
   ```

   如果已经存在索引,则可以跳过下一步。

2. 在student表中添加索引。可以使用以下命令添加:

   ```sql
   ALTER TABLE student ADD INDEX name_index (name);
   ```

   这里的name_index是索引的名称,name是需要建立索引的列名。

   注意:如果student表中的数据量很大,添加索引可能需要一些时间。

3. 重新执行原始SQL语句,查看查询速度是否有所提升。

   ```sql
   SELECT score.score FROM score INNER JOIN student ON score.student_id = student.id WHERE student.name = '小明';
   ```

   如果查询速度有所提升,则说明索引建立成功。


================================================
FILE: Chat2DB_LICENSE
================================================
The Chat2DB License

一、定义

“许可方”是指分发其软件的 Chat2DB 软件团队。

“软件”是指根据本许可提供的 Chat2DB 软件。

2. 许可授予

根据本许可的条款和条件,许可方特此授予您非排他性、全球性、不可转让、不可再许可、可撤销、免版税的版权许可,仅用于您的非商业研究目的。

上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。

3.限制

您不得出于任何商业、军事或非法目的使用、复制、修改、合并、发布、分发、复制或创建本软件的全部或部分衍生作品。

4.免责声明

本软件“按原样”提供,不提供任何明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和非侵权性的保证。 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为还是其他方面,由软件或软件的使用或其他交易引起、由软件引起或与之相关 软件。

5. 责任限制

除适用法律禁止的范围外,在任何情况下且根据任何法律理论,无论是基于侵权行为、疏忽、合同、责任或其他原因,任何许可方均不对您承担任何直接、间接、特殊、偶然、示范性、 或间接损害,或任何其他商业损失,即使许可人已被告知此类损害的可能性。

6.争议解决

本许可受中华人民共和国法律管辖并按其解释。 因本许可引起的或与本许可有关的任何争议应提交北京市海淀区人民法院。

请注意,许可证可能会更新到更全面的版本。 有关许可和版权的任何问题,请通过1558143046@qq.com 与我们联系。


1. Definitions

 "Licensor" refers to the Chat2DB software team that distributes its software.

 "Software" refers to the Chat2DB software provided under this license.

2. License Grant

Subject to the terms and conditions of this License, the Licensor hereby grants to you a non-exclusive, worldwide, non-transferable, non-sublicensable, revocable, royalty-free copyright license to use the Software solely for your non-commercial research purposes.

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

3. Restriction

You will not use, copy, modify, merge, publish, distribute, reproduce, or create derivative works of the Software, in whole or in part, for any commercial, military, or illegal purposes.

4. Disclaimer

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

5. Limitation of Liability

EXCEPT TO THE EXTENT PROHIBITED BY APPLICABLE LAW, IN NO EVENT AND UNDER NO LEGAL THEORY, WHETHER BASED IN TORT, NEGLIGENCE, CONTRACT, LIABILITY, OR OTHERWISE WILL ANY LICENSOR BE LIABLE TO YOU FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES, OR ANY OTHER COMMERCIAL LOSSES, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

6. Dispute Resolution

This license shall be governed and construed in accordance with the laws of People’s Republic of China. Any dispute arising from or in connection with this License shall be submitted to Haidian District People's Court in Beijing.

Note that the license is subject to update to a more comprehensive version.  For any questions related to the license and copyright, please contact us at 1558143046@qq.com.


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright Pengfei Ji

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
<div align="center">
  <h2>🚀 Zoer is Launching</h2>
  <p><strong>Powered by Chat2DB Team - AI-powered app builder that creates professional applications in minutes, no coding required</strong></p>
  
  <a href="https://zoer.ai/?utm_source=chat2db&utm_medium=banner&utm_campaign=github" target="_blank">
    <img width="1000" height="auto" alt="Zoer - AI App Builder" src="https://github.com/user-attachments/assets/2f2a682d-9cc0-4470-93d3-19b4f1f6589e" style="border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);" />
  </a>
  
  <br/><br/>
  
  ---
  
  <br/>
  
  <a href="https://trendshift.io/repositories/11808" target="_blank"><img src="https://trendshift.io/api/badge/repositories/11808" alt="CodePhiliaX%2FChat2DB | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/>
  </a>
</div>

<div align="center">
  
[![ReadmeX][readmex-image]][readmex-url]
[![Discord][discord-image]][discord-url]
[![Twitter][twitter-image]][twitter-url]
[![Telegram][telegram-image]][telegram-url]
[![Whatsapp][whatsapp-image]][whatsapp-url]
[![Reddit][reddit-image]][reddit-url]
[![Gmail][gmail-image]][gmail-url]

[readmex-image]: https://raw.githubusercontent.com/CodePhiliaX/resource-trusteeship/main/readmex.svg
[readmex-url]: https://readmex.com/CodePhiliaX/Chat2DB
[discord-image]: https://img.shields.io/badge/-Join%20us%20on%20Discord-%237289DA.svg?style=flat&logo=discord&logoColor=white
[discord-url]: https://discord.com/invite/uNjb3n5JVN
[twitter-image]: https://img.shields.io/twitter/follow/_Chat2DB?label=Chat2DB
[twitter-url]: https://twitter.com/intent/tweet?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB&hashtags=ChatGPT,AGI,SQL%20Client,Reporting%20tool
[telegram-image]: https://img.shields.io/twitter/url?label=Telegram&logo=Telegram&style=social&url=https://github.com/chat2db/Chat2DB
[telegram-url]: https://t.me/share/url?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB
[whatsapp-image]: https://img.shields.io/twitter/url?label=whatsapp&logo=whatsapp&style=social&url=https://github.com/chat2db/Chat2DB
[whatsapp-url]: https://api.whatsapp.com/send?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%20https://github.com/chat2db/Chat2DB
[reddit-image]: https://img.shields.io/twitter/url?label=Reddit&logo=Reddit&style=social&url=https://github.com/chat2db/Chat2DB
[reddit-url]: https://www.reddit.com/submit?url=https://github.com/chat2db/Chat2DB&title=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.
[gmail-image]: https://img.shields.io/twitter/url?label=Gmail&logo=Gmail&style=social&url=https://github.com/chat2db/Chat2DB
[gmail-url]: mailto:?subject=Check%20this%20GitHub%20repository%20out.&body=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%3A%0Ahttps://github.com/chat2db/Chat2DB

</div>

<div align="center">
  <a href="./README.md"><img alt="README in English" src="https://img.shields.io/badge/English-d9d9d9"></a>
  <a href="./README_CN.md"><img alt="简体中文版自述文件" src="https://img.shields.io/badge/简体中文-d9d9d9"></a>
  <a href="./README_JA.md"><img alt="日本語のREADME" src="https://img.shields.io/badge/日本語-d9d9d9"></a>

</div>

**1. Intelligent SQL Generation**:  
Chat2DB Pro supports AI-driven intelligent SQL development to help you write SQL queries faster.

**2. Database Management**:  
Supports more than 10 databases, including MySQL, PostgreSQL, H2, Oracle, SQLServer, SQLite, MariaDB, ClickHouse, DM, Presto, DB2, OceanBase, Hive, KingBase, MongoDB, Redis, Snowflake, and more.

**3. Intelligent Report Generation**:  
Chat2DB Pro supports AI-driven intelligent data reporting to help you generate dashboards faster.

**4. Data Structure Synchronization**:  
Chat2DB Pro supports database table structure synchronization to help you sync database table structures faster.

## Feature Comparison

<table style="width: 100%;">
  <tr>
    <th align="center">Feature</th>
    <th align="center">Community Open Source</th>
    <th align="center">Local</th>
    <th align="center">Pro </th>
  </tr>
  <tr>
    <td align="center">Database Types</td>
    <td align="center">16+</td>
    <td align="center">Target 100+</td>
    <td align="center">Target 100+</td>
  </tr>
  <tr>
    <td align="center">Supported AI</td>
    <td align="center">Requires AI Configuration</td>
    <td align="center">AI ready on installation</td>
    <td align="center">AI ready on installation</td>
  </tr>
  <tr>
    <td align="center">AI Capabilities</td>
    <td align="center">Basic</td>
    <td align="center">Varied</td>
    <td align="center">Varied</td>
  </tr>
  <tr>
    <td align="center">Visual Table Editor</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">SQL Console</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">SQL Formatting</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Save Query Records</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Theme Color Settings</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Data Structure Sync</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Database Grouping</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Database Structure Import/Export</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Data Import/Export</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Data Migration</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Copy/Clear Table</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Open and Run SQL Files</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">UML Diagram</td>
    <td align="center">❌</td>
    <td align="center">In Development</td>
    <td align="center">In Development</td>
  </tr>
  <tr>
    <td align="center">Generate Code</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Copy Results as Insert/Update</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Modify Query Results</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Intelligent SQL Editor</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">AI Table Creation</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">AI Data Sets</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Chat2Excel</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Intelligent Dashboard</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Editor Settings</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Custom Shortcuts</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Cross-device Usage</td>
    <td align="center">❌</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
  </tr>
</table>

## Download and Installation
Chat2DB is a cross-platform application that supports Windows, MacOS, and Linux. You can download Chat2DB from the following links:
- [Download Pro Version](https://chat2db.ai/download)
- [Download Local Version](https://chat2db.ai/download)
- [Download Open Source Version](https://github.com/CodePhiliaX/Chat2DB/releases/tag/v0.3.6)

## Community Edition Docker Installation

### System Requirements

Before installing Chat2DB, ensure your system meets the following requirements:
- Docker 19.03.0 or later
- Docker Compose 1.25.0 or later
- CPU >= 2 Cores
- RAM >= 4 GiB

```bash
  docker rm chat2db
  
  docker run --name=chat2db -ti -p 10824:10824 -v ~/.chat2db-docker:/root/.chat2db  chat2db/chat2db:latest

  docker start chat2db
  
```
## Code Debugging

## Runtime Environment

Note:
If local debugging is needed:

- Java runtime: <a href="https://adoptopenjdk.net/" target="_blank">Open JDK 17</a>
- Node.js runtime: Node 16 <a href="https://nodejs.org/" target="_blank">Node.js</a>.

**Clone the repository locally**

```bash
$ git clone git@github.com:chat2db/Chat2DB.git
```

**Frontend Debugging**

```bash
Node version must be 16 or higher  
Use yarn only, npm is not supported
$ cd Chat2DB/chat2db-client
$ yarn
$ yarn run start:web
```

**Backend Debugging**

```bash
$ cd ../chat2db-server
$ mvn clean install # Maven version 3.8 or higher is required
$ cd chat2db-server/chat2db-server-start/target/
$ java -jar -Dloader.path=./lib -Dchatgpt.apiKey=xxxxx chat2db-server-start.jar  # 需要安装java 17以上版本,启动应用 chatgpt.apiKey 需要输入ChatGPT的key,如果不输入无法使用AIGC功能
```
**Standalone Deployment**
```bash
# chat2db-client
$ npm run build:web:prod 
$ cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front 
$ cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf
```

##  Contact Us

- Email: Chat2DB@ch2db.com
- Discord: [Join our Discord server](https://discord.gg/JDkwB6JS8A)
- Twitter: [@Chat2DB](https://x.com/Chat2DB_AI)
- YouTube: [Chat2DB Channel](https://www.youtube.com/@chat2db.tutorial)
- GitHub: [Chat2DB GitHub](https://github.com/codePhiliaX/chat2db)


##  Acknowledgments


Thanks to everyone who has contributed to Chat2DB~~


<a href="https://github.com/chat2db/Chat2DB/graphs/contributors">
  <img src="https://contrib.rocks/image?repo=chat2db/Chat2DB" />
</a>

## Star History

<a href="https://star-history.com/#CodePhiliaX/chat2db&Date">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=CodePhiliaX/chat2db&type=Date&theme=dark" />
    <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=CodePhiliaX/chat2db&type=Date" />
    <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=CodePhiliaX/chat2db&type=Date" />
  </picture>
</a>

## License
The primary license used by this software is the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0), supplemented by the [Chat2DB License](./Chat2DB_LICENSE).



================================================
FILE: README_CN.md
================================================
<div align="center">
    <a href="https://trendshift.io/repositories/11808" target="_blank"><img src="https://trendshift.io/api/badge/repositories/11808" alt="CodePhiliaX%2FChat2DB | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/>
</div>
<br/>
        
<div align="center">
  
[![ReadmeX][readmex-image]][readmex-url]
[![Discord][discord-image]][discord-url]
[![Twitter][twitter-image]][twitter-url]
[![Telegram][telegram-image]][telegram-url]
[![Whatsapp][whatsapp-image]][whatsapp-url]
[![Reddit][reddit-image]][reddit-url]
[![Gmail][gmail-image]][gmail-url]

[readmex-image]: https://raw.githubusercontent.com/CodePhiliaX/resource-trusteeship/main/readmex.svg
[readmex-url]: https://readmex.com/CodePhiliaX/Chat2DB
[discord-image]: https://img.shields.io/badge/-Join%20us%20on%20Discord-%237289DA.svg?style=flat&logo=discord&logoColor=white
[discord-url]: https://discord.com/invite/uNjb3n5JVN
[twitter-image]: https://img.shields.io/twitter/follow/_Chat2DB?label=Chat2DB
[twitter-url]: https://twitter.com/intent/tweet?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB&hashtags=ChatGPT,AGI,SQL%20Client,Reporting%20tool
[telegram-image]: https://img.shields.io/twitter/url?label=Telegram&logo=Telegram&style=social&url=https://github.com/chat2db/Chat2DB
[telegram-url]: https://t.me/share/url?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB
[whatsapp-image]: https://img.shields.io/twitter/url?label=whatsapp&logo=whatsapp&style=social&url=https://github.com/chat2db/Chat2DB
[whatsapp-url]: https://api.whatsapp.com/send?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%20https://github.com/chat2db/Chat2DB
[reddit-image]: https://img.shields.io/twitter/url?label=Reddit&logo=Reddit&style=social&url=https://github.com/chat2db/Chat2DB
[reddit-url]: https://www.reddit.com/submit?url=https://github.com/chat2db/Chat2DB&title=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.
[gmail-image]: https://img.shields.io/twitter/url?label=Gmail&logo=Gmail&style=social&url=https://github.com/chat2db/Chat2DB
[gmail-url]: mailto:?subject=Check%20this%20GitHub%20repository%20out.&body=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%3A%0Ahttps://github.com/chat2db/Chat2DB

</div>

<div align="center">
  <a href="./README.md"><img alt="README in English" src="https://img.shields.io/badge/English-d9d9d9"></a>
  <a href="./README_CN.md"><img alt="简体中文版自述文件" src="https://img.shields.io/badge/简体中文-d9d9d9"></a>
  <a href="./README_JA.md"><img alt="日本語のREADME" src="https://img.shields.io/badge/日本語-d9d9d9"></a>
 
</div>




https://github.com/user-attachments/assets/3c857883-8153-4bda-92b8-d25c6adb5b13



# 
Chat2DB 是一个智能的通用SQL客户端和数据报表工具,它集成了AI的能力。Chat2DB可以帮助您更快地编写SQL查询、管理数据库、生成报告、探索数据、并且可以与多种数据库进行交互。Chat2DB是一个开源项目,我们欢迎您的贡献。

**1. 智能生成SQL**:
Chat2DB Pro支持AI驱动的智能SQL开发,可以帮助您更快地编写SQL查询。


**2. 数据库管理**:
 支持多种10+数据库,包括MySQL、PostgreSQL、H2、Oracle、SQLServer、SQLite、MariaDB、ClickHouse、DM、Presto、DB2、OceanBase、Hive、KingBase、MongoDB、Redis、Snowflake等。



**3. 智能生成报表**:
    Chat2DB Pro支持AI驱动的智能数据报表,可以帮助您更快地生成看板。

**4. 数据结构同步**:
    Chat2DB Pro支持数据库表结构同步,可以帮助您更快地同步数据库表结构。

## 功能比较

<table style="width: 100%;">
  <tr>
    <th align="center">功能</th>
    <th align="center">社区开源版</th>
    <th align="center">Local版(收费)</th>
    <th align="center">Pro版(收费)</th>
  </tr>
  <tr>
    <td align="center">数据库类型</td>
    <td align="center">16+</td>
    <td align="center">目标100+</td>
    <td align="center">目标100+</td>
  </tr>
  <tr>
    <td align="center">支持的 AI</td>
    <td align="center">需要配置AI</td>
    <td align="center">安装即可使用AI</td>
    <td align="center">安装即可使用AI</td>
  </tr>
  <tr>
    <td align="center">AI 能力</td>
    <td align="center">简单</td>
    <td align="center">多样</td>
    <td align="center">多样</td>
  </tr>
  <tr>
    <td align="center">可视化编辑表</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">SQL控制台</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
 <tr>
    <td align="center">SQL格式化</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
 <tr>
    <td align="center">保存查询记录</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
 <tr>
    <td align="center">主题颜色设置</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">数据结构同步</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">数据库分组</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">数据库结构导入导出</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">数据导入导出</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">数据迁移</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">复制/清空表</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">打开运行SQL文件</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">UML图</td>
    <td align="center">❌</td>
    <td align="center">开发中</td>
    <td align="center">开发中</td>
  </tr>
  <tr>
    <td align="center">生成代码</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">复制结果为
Insert/update
    </td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">修改查询结果</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">智能SQL编辑器</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">AI建表</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">AI数据集</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Chat2Excel</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
<tr>
    <td align="center">智能看板</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
<tr>
    <td align="center">编辑器设置</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
<tr>
    <td align="center">自定义快捷键</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
<tr>
    <td align="center">跨多设备使用</td>
    <td align="center">❌</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
  </tr>
</table>

## 下载安装
Chat2DB 是一个跨平台的应用程序,支持Windows、MacOS和Linux。您可以从以下链接下载Chat2DB。
- [下载 Pro 版](https://chat2db.ai/download)
- [下载 Local 版](https://chat2db.ai/download)
- [下载开源版](https://github.com/CodePhiliaX/Chat2DB/releases/tag/v0.3.6)

## 社区版 Docker 安装

### 系统要求

在安装 Chat2DB 之前,请确保您的系统满足以下要求:
- Docker 19.03.0 或更高版本
- Docker Compose 1.25.0 或更高版本
- CPU >= 2 Core
- RAM >= 4 GiB


```bash
  // 拉取最新客户端,然后运行docker,名字是 `chat2db` , 并且将 `/root/.chat2db` 挂载到 `~/.chat2db-docker`
  docker run --name=chat2db -ti -p 10824:10824 -v ~/.chat2db-docker:/root/.chat2db  chat2db/chat2db:latest
  // 这里正常会提示`Tomcat started on port(s): 10824 (http) with context path` 就可以结束了

  // 如果这里提示  `The container name "/chat2db" is already in use by container`, 代表已经存在容器了 运行
  docker start chat2db
  // 如果想更新chat2db 则需要先rm
  docker rm chat2db
```
## 代码调试


## 运行环境

注意:
如果需要本地调试

- java 运行 <a href="https://adoptopenjdk.net/" target="_blank">Open JDK 17</a>
- Node 运行环境 Node16 <a href="https://nodejs.org/" target="_blank">Node.js</a>.

**git clone 到本地**

```bash
$ git clone git@github.com:chat2db/Chat2DB.git
```

**前端调试**

```bash
node版本必须为16及以上 
一定要用yarn
$ cd Chat2DB/chat2db-client
$ yarn
$ yarn run start:web
```

**后端调试**

```bash
$ cd ../chat2db-server
$ mvn clean install # 需要安装maven 3.8以上版本
$ cd chat2db-server/chat2db-server-start/target/
$ java -jar -Dloader.path=./lib -Dchatgpt.apiKey=xxxxx chat2db-server-start.jar  # 需要安装java 17以上版本,启动应用 chatgpt.apiKey 需要输入ChatGPT的key,如果不输入无法使用AIGC功能
```
**独立部署**
```bash
# chat2db-client
$ npm run build:web:prod 
$ cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front 
$ cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf

# 再打包后端服务
```

##  联系我们

<a><img src="https://github.com/chat2db/Chat2DB/assets/22975773/81d13eff-c615-49f5-aee3-4107089593e0" width="25%"/></a>

- Email: Chat2DB@ch2db.com
- Discord: [Join our Discord server](https://discord.gg/JDkwB6JS8A)
- Twitter: [@Chat2DB](https://x.com/Chat2DB_AI)
- YouTube: [Chat2DB Channel](https://www.youtube.com/@chat2db.tutorial)
- GitHub: [Chat2DB GitHub](https://github.com/codePhiliaX/chat2db)


##  致谢

感谢所有为 Chat2DB 贡献力量的同学们~~

<a href="https://github.com/chat2db/Chat2DB/graphs/contributors">
  <img src="https://contrib.rocks/image?repo=chat2db/Chat2DB" />
</a>

## Star History

<a href="https://star-history.com/#CodePhiliaX/chat2db&Date">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=CodePhiliaX/chat2db&type=Date&theme=dark" />
    <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=CodePhiliaX/chat2db&type=Date" />
    <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=CodePhiliaX/chat2db&type=Date" />
  </picture>
</a>

## License
The primary license used by this software is the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0), supplemented by the [Chat2DB License](./Chat2DB_LICENSE).





================================================
FILE: README_JA.md
================================================



<div align="center">
    <a href="https://trendshift.io/repositories/11808" target="_blank"><img src="https://trendshift.io/api/badge/repositories/11808" alt="CodePhiliaX%2FChat2DB | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</div>
<br/>
<p align="center">
 <a href="https://discord.com/invite/uNjb3n5JVN" target="_blank">
    <img src="https://img.shields.io/badge/-Join%20us%20on%20Discord-%237289DA.svg?style=flat&logo=discord&logoColor=white"
            alt="chat on Discord"></a>
<a href="https://twitter.com/intent/tweet?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB&hashtags=ChatGPT,AGI,SQL%20Client,Reporting%20tool" target="blank" > <img src="https://img.shields.io/twitter/follow/_Chat2DB?label=Twitter&style=social" alt=""/> </a> 
<a href="https://t.me/share/url?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB" target="_blank"><img src="https://img.shields.io/twitter/url?label=Telegram&logo=Telegram&style=social&url=https://github.com/chat2db/Chat2DB" alt="Share on Telegram"/></a>
<a href="https://api.whatsapp.com/send?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%20https://github.com/chat2db/Chat2DB"><img src="https://img.shields.io/twitter/url?label=whatsapp&logo=whatsapp&style=social&url=https://github.com/chat2db/Chat2DB" /></a>
<a href="https://www.reddit.com/submit?url=https://github.com/chat2db/Chat2DB&title=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities." target="blank"><img src="https://img.shields.io/twitter/url?label=Reddit&logo=Reddit&style=social&url=https://github.com/chat2db/Chat2DB" alt="Share on Reddit"/></a>
<a href="mailto:?subject=Check%20this%20GitHub%20repository%20out.&body=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%3A%0Ahttps://github.com/chat2db/Chat2DB" target="_blank"><img src="https://img.shields.io/twitter/url?label=Gmail&logo=Gmail&style=social&url=https://github.com/chat2db/Chat2DB"/></a>

</p>
<div align="center">
  <a href="./README.md"><img alt="README in English" src="https://img.shields.io/badge/English-d9d9d9"></a>
  <a href="./README_CN.md"><img alt="简体中文版自述文件" src="https://img.shields.io/badge/简体中文-d9d9d9"></a>
  <a href="./README_JA.md"><img alt="日本語のREADME" src="https://img.shields.io/badge/日本語-d9d9d9"></a>
</div>



https://github.com/user-attachments/assets/bd5d5f64-540f-4793-a801-17fa96c4766e




Chat2DBはAI機能を統合したインテリジェントで汎用的なSQLクライアントおよびデータ報告ツールです。Chat2DBは、SQLクエリの作成を迅速化し、データベースの管理、レポートの生成、データの探索、および複数のデータベースとのインタラクションをサポートします。Chat2DBはオープンソースプロジェクトであり、皆様の貢献を歓迎します。

**1. インテリジェントSQL生成**:  
Chat2DB Proは、AI駆動によるインテリジェントなSQL開発をサポートし、SQLクエリをより速く作成する手助けをします。

**2. データベース管理**:  
MySQL、PostgreSQL、H2、Oracle、SQLServer、SQLite、MariaDB、ClickHouse、DM、Presto、DB2、OceanBase、Hive、KingBase、MongoDB、Redis、Snowflakeなど、10種類以上のデータベースをサポートしています。

**3. インテリジェントレポート生成**:  
Chat2DB Proは、AI駆動によるインテリジェントなデータ報告をサポートし、ダッシュボードの作成を迅速に行う手助けをします。

**4. データ構造の同期**:  
Chat2DB Proは、データベーステーブル構造の同期をサポートし、データベーステーブルの構造を迅速に同期する手助けをします。

## 機能比較

<table style="width: 100%;">
  <tr>
    <th align="center">機能</th>
    <th align="center">コミュニティ オープンソース</th>
    <th align="center">ローカル</th>
    <th align="center">Pro</th>
  </tr>
  <tr>
    <td align="center">データベースの種類</td>
    <td align="center">16種類以上</td>
    <td align="center">100種類以上を対象</td>
    <td align="center">100種類以上を対象</td>
  </tr>
  <tr>
    <td align="center">サポートされているAI</td>
    <td align="center">AI設定が必要</td>
    <td align="center">インストール時にAIが利用可能</td>
    <td align="center">インストール時にAIが利用可能</td>
  </tr>
  <tr>
    <td align="center">AI機能</td>
    <td align="center">基本的</td>
    <td align="center">多様</td>
    <td align="center">多様</td>
  </tr>
  <tr>
    <td align="center">視覚的テーブルエディタ</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">SQLコンソール</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">SQLフォーマット</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">クエリ記録の保存</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">テーマカラー設定</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">データ構造の同期</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">データベースのグループ化</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">データベース構造のインポート/エクスポート</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">データのインポート/エクスポート</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">データ移行</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">テーブルのコピー/削除</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">SQLファイルのオープンと実行</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">UMLダイアグラム</td>
    <td align="center">❌</td>
    <td align="center">開発中</td>
    <td align="center">開発中</td>
  </tr>
  <tr>
    <td align="center">コード生成</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">インサート/アップデートとして結果をコピー</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">クエリ結果の修正</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">インテリジェントSQLエディタ</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">AIによるテーブル作成</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">AIデータセット</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">Chat2Excel</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">インテリジェントダッシュボード</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">エディタ設定</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">カスタムショートカット</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
    <td align="center">✅</td>
  </tr>
  <tr>
    <td align="center">クロスデバイス使用</td>
    <td align="center">❌</td>
    <td align="center">❌</td>
    <td align="center">✅</td>
  </tr>
</table>


## ダウンロードとインストール
Chat2DBは、Windows、MacOS、Linuxをサポートするクロスプラットフォームアプリケーションです。以下のリンクからChat2DBをダウンロードできます:
- [Proバージョンのダウンロード](https://chat2db.ai/download)
- [ローカルバージョンのダウンロード](https://chat2db.ai/download)
- [オープンソースバージョンのダウンロード](https://github.com/CodePhiliaX/Chat2DB/releases/tag/v0.3.6)

## コミュニティエディションのDockerインストール

### システム要件

Chat2DBをインストールする前に、システムが以下の要件を満たしていることを確認してください:
- Docker 19.03.0以上
- Docker Compose 1.25.0以上
- CPU >= 2コア
- RAM >= 4 GiB

```bash
  docker rm chat2db
  
  docker run --name=chat2db -ti -p 10824:10824 -v ~/.chat2db-docker:/root/.chat2db  chat2db/chat2db:latest

  docker start chat2db
```
## コードデバッグ

## 実行環境

注意: ローカルデバッグが必要な場合:

- Java runtime: <a href="https://adoptopenjdk.net/" target="_blank">Open JDK 17</a>
- Node.js runtime: Node 16 <a href="https://nodejs.org/" target="_blank">Node.js</a>.

**リポジトリをローカルにクローン**

```bash
$ git clone git@github.com:chat2db/Chat2DB.git
```

**フロントエンドデバッグ**

```bash
Node version must be 16 or higher  
Use yarn only, npm is not supported
$ cd Chat2DB/chat2db-client
$ yarn
$ yarn run start:web
```

**バックエンドデバッグ**

```bash
$ cd ../chat2db-server
$ mvn clean install # Maven version 3.8 or higher is required
$ cd chat2db-server/chat2db-server-start/target/
$ java -jar -Dloader.path=./lib -Dchatgpt.apiKey=xxxxx chat2db-server-start.jar  # 需要安装java 17以上版本,启动应用 chatgpt.apiKey 需要输入ChatGPT的key,如果不输入无法使用AIGC功能
```
**スタンドアロンデプロイ**
```bash
# chat2db-client
$ npm run build:web:prod 
$ cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front 
$ cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf
```

## お問い合わせ

- メール: Chat2DB@ch2db.com
- Discord: [Discordサーバーに参加](https://discord.gg/JDkwB6JS8A)
- Twitter: [@Chat2DB](https://x.com/Chat2DB_AI)
- YouTube: [Chat2DB チャンネル](https://www.youtube.com/@chat2db.tutorial)
- GitHub: [Chat2DB GitHub](https://github.com/codePhiliaX/chat2db)

## 謝辞

Chat2DBに貢献してくださったすべての方々に感謝します~~



<a href="https://github.com/chat2db/Chat2DB/graphs/contributors">
  <img src="https://contrib.rocks/image?repo=chat2db/Chat2DB" />
</a>

## Star History

<a href="https://star-history.com/#CodePhiliaX/chat2db&Date">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=CodePhiliaX/chat2db&type=Date&theme=dark" />
    <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=CodePhiliaX/chat2db&type=Date" />
    <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=CodePhiliaX/chat2db&type=Date" />
  </picture>
</a>

## License
このソフトウェアで使用されている主なライセンスは[Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)であり、[Chat2DB License](./Chat2DB_LICENSE)が補完されています。




================================================
FILE: chat2db-client/.eslintrc.js
================================================
module.exports = {
  parser: '@typescript-eslint/parser',
  env: {
    browser: true,
    es2021: true,
  },
  plugins: ['@typescript-eslint', 'babel', 'react-hooks', 'react'],
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:react/recommended',
    // 'airbnb-base', // airbnb-base中已经包含了eslint-plugin-import
    // 'prettier', // 使得eslint中的样式规范失效,遵循prettier中的样式规范
    // 'prettier/@typescript-eslint', // 使得@typescript-eslint中的样式规范失效,遵循prettier中的样式规范
  ],
  overrides: [
    {
      env: {
        node: true,
      },
      files: ['.eslintrc.{js,cjs}'], //
      parserOptions: {
        sourceType: 'script',
      },
    },
  ],
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
  },
  ignorePatterns: ['src/main'],
  rules: {
    'func-names': 0, // 函数表达式必须有名字
    'one-var': [1, 'never'], // 连续声明
    'prefer-const': 1, // 首选const
    'no-unused-expressions': 0, // 禁止无用的表达式
    'new-cap': 2, // 构造函数首字母大写
    'prefer-arrow-callback': 2, // 首选箭头函数
    'arrow-body-style': 0, // 箭头函数体使用大括号
    'max-len': [
      // 一行最大长度
      1,
      {
        code: 120,
        ignoreStrings: true,
        ignoreUrls: true,
        ignoreRegExpLiterals: true,
      },
    ],
    'consistent-return': 'off', // return 后面是否允许省略
    'default-case': 2, // switch 语句必须有 default
    'prefer-rest-params': 2, // 必须使用解构 ...args 来代替 arguments
    'no-script-url': 0, // 禁止使用 javascript:void(0)
    // 'no-console': [ // 禁止使用 console
    //   2,
    //   {
    //     allow: ['info', 'error', 'warn'],
    //   },
    // ],
    'no-duplicate-imports': [2], // 禁止重复 import
    'newline-per-chained-call': 2, // 链式调用必须换行
    // 'no-underscore-dangle': 2, // 禁止标识符中有悬空下划线
    'eol-last': 2, // 文件以单一的换行符结束
    'no-useless-rename': 2, // 禁止无用的重命名
    'no-undef': 0, // 禁止使用未定义的变量
    'class-methods-use-this': 0, // class 的非静态方法必须包含 this
    'prefer-destructuring': 0, // 优先使用数组和对象解构
    'no-unused-vars': 0, // 禁止未使用过的变量
    '@typescript-eslint/no-unused-vars': 1, // 禁止未使用过的变量
    'react/self-closing-comp': 2, // 非单行 JSX 必须使用括号包裹
    'react/jsx-indent-props': [2, 2], // jsx props 缩进
    'no-plusplus': 0, // 禁止使用 ++,--
    'react/jsx-uses-vars': 1, // jsx 文件中禁止使用变量
    // 'react/no-multi-comp': [ // 禁止一个文件中定义多个组件
    //   2,
    //   {
    //     ignoreStateless: true,
    //   },
    // ],
    'react/jsx-uses-react': 2, // jsx 文件中禁止使用 React
    'react/react-in-jsx-scope': 2, // jsx 文件中禁止使用 React
    'react/sort-comp': 1, // 组件内方法顺序
    'react/jsx-tag-spacing': 2, // jsx 中的属性禁止使用空格
    'react/jsx-no-bind': 0, // jsx 中禁止使用 bind
    'react/jsx-closing-bracket-location': 2, // jsx 中的右括号必须换行
    'react/prefer-stateless-function': 0, // 优先使用无状态组件
    'react/display-name': 0, // 组件必须写 displayName
    'react/prop-types': 0, // 组件必须写 propTypes
    'import/prefer-default-export': 0, // 优先使用 export default
    '@typescript-eslint/no-var-requires': 2, // 禁止 require() 使用表达式
    'no-use-before-define': 0, // 禁止定义前使用
    '@typescript-eslint/no-use-before-define': [
      // 禁止定义前使用
      0,
      // {
      //   functions: false,
      // },
    ],
    '@typescript-eslint/explicit-function-return-type': 0, // 函数必须有返回值
    '@typescript-eslint/interface-name-prefix': 0, // 接口名称必须以 I 开头
    '@typescript-eslint/explicit-module-boundary-types': 0, // 导出函数和类的公共方法必须声明返回类型
    'no-shadow': 0, // 禁止变量名与上层作用域内的定义过的变量重复
    '@typescript-eslint/no-shadow': 1, // 禁止变量名与上层作用域内的定义过的变量重复TODO: 为2是不是好点?
    'no-invalid-this': 0, // 禁止 this 关键字出现在类和类对象之外
    'no-await-in-loop': 'off', // 禁止在循环中出现 await
    'array-callback-return': 'off', // 数组方法的回调函数中必须有 return 语句
    'no-restricted-syntax': 'off', // 禁止使用特定的语法
    '@typescript-eslint/no-explicit-any': 0, // 禁止使用 any
    'import/no-extraneous-dependencies': 0, // 禁止使用无关的 package
    'import/no-unresolved': 0, // 禁止使用无关的 package
    '@typescript-eslint/explicit-member-accessibility': 0, // 类的成员之间是否需要空行
    '@typescript-eslint/no-object-literal-type-assertion': 0, // 禁止使用 as Type
    'react/no-find-dom-node': 0, // 禁止使用 findDOMNode
    'no-param-reassign': [
      // 禁止对函数参数再赋值
      2,
      {
        props: false,
      },
    ],
    'arrow-parens': 0, // 箭头函数参数括号
    indent: 0, // 缩进
    'operator-linebreak': [0], // 换行符位置
    'max-classes-per-file': [2, 10], // 一个文件最多定义几个类
    '@typescript-eslint/no-empty-function': [0], // 禁止空函数
    'import/extensions': 0, // 禁止导入文件时带上文件后缀
  },
};


================================================
FILE: chat2db-client/.gitignore
================================================
/node_modules
/.env.local
/.umirc.local.ts
/config/config.local.ts
/src/.umi
/src/.umi-production
/src/.umi-test
/src/main/node_modules
/src/main/dist
/dist
.swc
./yarn-error.log


/release
/static
/versions

================================================
FILE: chat2db-client/.npmrc
================================================
registry=https://registry.npmmirror.com/



================================================
FILE: chat2db-client/.prettierignore
================================================
node_modules
.umi
.umi-production


================================================
FILE: chat2db-client/.prettierrc
================================================
{
  "printWidth": 120,
  "singleQuote": true,
  "trailingComma": "all",
  "proseWrap": "never",
  "overrides": [{ "files": ".prettierrc", "options": { "parser": "json" } }],
  "plugins": ["prettier-plugin-organize-imports", "prettier-plugin-packagejson"]
}

================================================
FILE: chat2db-client/.umirc.prod.desktop.ts
================================================
import { extractYarnConfig } from './src/utils/webpack';
import { defineConfig } from 'umi';
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');

const yarn_config = extractYarnConfig(process.argv);

const chainWebpack = (config: any, { webpack }: any) => {
  config.plugin('monaco-editor').use(MonacoWebpackPlugin, [
    {
      languages: ['mysql', 'pgsql', 'sql'],
    },
  ]);
};

export default defineConfig({
  history: {
    type: 'hash',
  },
  publicPath: './',
  chainWebpack,
  define: {
    'process.env.UMI_ENV': process.env.UMI_ENV,
  },
  headScripts: [
    `window.dataLayer = window.dataLayer || [];
    function gtag() {
      window.dataLayer.push(arguments);
    }
    gtag('js', new Date());
    gtag('config', 'G-V8M4E5SF61', {
      platform: 'DESKTOP',
      version: '${yarn_config['app_version']}'
    });`,
  ],
});


================================================
FILE: chat2db-client/.umirc.prod.ts
================================================
import { defineConfig } from 'umi';
import { extractYarnConfig } from './src/utils/webpack';
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
const yarn_config = extractYarnConfig(process.argv);
const publicPath = yarn_config.public_path || './static/front/';

const chainWebpack = (config: any, { webpack }: any) => {
  config.plugin('monaco-editor').use(MonacoWebpackPlugin, [
    {
      languages: ['mysql', 'pgsql', 'sql'],
    },
  ]);
};

export default defineConfig({
  publicPath: publicPath,
  chainWebpack,
  define: {
    'process.env.UMI_ENV': process.env.UMI_ENV,
  },
  headScripts: [
    `window.dataLayer = window.dataLayer || [];
    function gtag() {
      window.dataLayer.push(arguments);
    }
    gtag('js', new Date());
    gtag('config', 'G-V8M4E5SF61', {
      platform: 'WEB',
      version: '${yarn_config['app_version']}'
    });`,
  ],
});


================================================
FILE: chat2db-client/.umirc.ts
================================================
import { defineConfig } from 'umi';
import { extractYarnConfig, transitionTimezoneTimestamp } from './src/utils/webpack';

const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');

// yarn run build --app_port=xx 获取打包时命令行传入的参数
const yarn_config = extractYarnConfig(process.argv);

const chainWebpack = (config: any, { webpack }: any) => {
  config.plugin('monaco-editor').use(MonacoWebpackPlugin, [
    {
      languages: ['mysql', 'pgsql', 'sql'],
    },
  ]);
};

export default defineConfig({
  title: 'Chat2DB',
  base: '/',
  publicPath: '/',
  hash: true,
  routes: [
    {
      path: '/',
      component: '@/layouts/GlobalLayout',
      routes: [
        {
          path: '/login',
          component: '@/pages/login',
        },
        {
          path: '/demo',
          component: '@/pages/demo',
        },
        {
          path: '/connections',
          component: 'main',
        },
        {
          path: '/dashboard',
          component: 'main',
        },
        {
          path: '/team',
          component: 'main',
        },
        {
          path: '/workspace',
          component: 'main',
        },
        {
          path: '/',
          component: 'main',
        },
      ],
    },
  ],

  npmClient: 'yarn',
  dva: {},
  plugins: ['@umijs/plugins/dist/dva'],
  chainWebpack,
  proxy: {
    '/api': {
      target: 'http://127.0.0.1:10821',
      changeOrigin: true,
    },
    '/client/remaininguses/': {
      target: 'http://127.0.0.1:1889',
      changeOrigin: true,
    },
  },
  targets: {
    chrome: 80,
  },
  // links: [{
  //   rel: 'manifest',
  //   href: 'manifest.json',
  // }],
  links: [{ rel: 'icon', type: 'image/ico', sizes: '32x32', href: '/static/front/logo.ico' }],
  headScripts: [
    `if (localStorage.getItem('app-local-storage-versions') !== 'v4') {
      localStorage.clear();
      localStorage.setItem('app-local-storage-versions', 'v4');
    }`,
    // `if (window.electronApi) { window.electronApi.startServerForSpawn() }`,
    // `if ("serviceWorker" in navigator) {
    //   window.addEventListener("load", function () {
    //     navigator.serviceWorker
    //       .register("sw.js")
    //       .then(res => console.log("service worker registered"))
    //       .catch(err => console.log("service worker not registered", err));
    //   })
    // }`,
    // `var deferredPrompt = null;
    // window.addEventListener("beforeinstallprompt", e => {
    //   e.preventDefault();
    //   deferredPrompt = e;
    // });
    // window.addEventListener("appinstalled", () => {
    //   deferredPrompt = null;
    // })`,
    {
      src: 'https://www.googletagmanager.com/gtag/js?id=G-V8M4E5SF61',
      async: true,
    },
    // `window.dataLayer = window.dataLayer || [];
    // function gtag() {
    //   window.dataLayer.push(arguments);
    // }
    // gtag('js', new Date());
    // gtag('config', 'G-V8M4E5SF61', {
    //   platform: 'WEB',
    //   version: '1.0.0'
    // });`,
  ],
  favicons: ['logo.ico'],
  define: {
    __ENV__: process.env.UMI_ENV,
    __BUILD_TIME__: transitionTimezoneTimestamp(new Date().getTime()),
    __APP_VERSION__: yarn_config.app_version || '0.0.0',
    __APP_PORT__: yarn_config.app_port,
  },
  esbuildMinifyIIFE: true,
});


================================================
FILE: chat2db-client/.vscode/settings.json
================================================
{
  "workbench.colorTheme": "One Dark Pro",
  "workbench.iconTheme": "vscode-icons-mac",
  "editor.fontSize": 14,
  "editor.tabSize": 2,
  // 自动格式化
  "editor.formatOnType": true,
  "editor.formatOnSave": true,
  "prettier.bracketSpacing": true, // 在对象,数组括号与文字之间加空格 "{ foo: bar }"
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[less]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "explorer.confirmDelete": true,
  "emmet.includeLanguages": {
    "javascript": "javascriptreact"
  },
  "git.mergeEditor": false,
  "cSpell.words": [
    "ahooks",
    "antd",
    "Appstore",
    "asar",
    "AZUREAI",
    "bgcolor",
    "Cascader",
    "charsets",
    "chatgpt",
    "CLICKHOUSE",
    "Consolas",
    "datas",
    "datasource",
    "DATETIME",
    "DBAI",
    "dbhub",
    "Dmaven",
    "echart",
    "echarts",
    "favicons",
    "findstr",
    "fulltext",
    "gtag",
    "hexi",
    "hljs",
    "icns",
    "Iconfont",
    "IIFE",
    "indexs",
    "JDBC",
    "KEYPAIR",
    "KINGBASE",
    "linebreak",
    "lsof",
    "MARIADB",
    "Mddhhmmss",
    "Menlo",
    "netstat",
    "NOCASE",
    "nsis",
    "OCEANBASE",
    "OPENAI",
    "packagejson",
    "Parens",
    "partialize",
    "pgsql",
    "plusplus",
    "pnpm",
    "POSTGRESQL",
    "Prec",
    "remaininguses",
    "RESTAI",
    "RTRIM",
    "scrollbar",
    "Sercurity",
    "sortablejs",
    "SQLSERVER",
    "tailwindcss",
    "Tigger",
    "ueabe",
    "ueabf",
    "ueac",
    "umijs",
    "USERANDPASSWORD",
    "uuidv",
    "VARCHAR",
    "VIEWCOLUMN",
    "VIEWCOLUMNS",
    "webp",
    "wireframe",
    "Wppk",
    "yapi",
    "zustand"
  ],
  "typescript.tsdk": "/Users/wangjiaqi/Desktop/Chat2DB/chat2db-client/node_modules/typescript/lib"
}


================================================
FILE: chat2db-client/mock/sqlResult.json
================================================
{
  "success": true,
  "errorCode": null,
  "errorMessage": null,
  "data": [
    {
      "sql": "SELECT *\nFROM students\nLIMIT 500",
      "description": "执行成功",
      "message": null,
      "success": true,
      "headerList": [
        {
          "dataType": "NUMERIC",
          "name": "id"
        },
        {
          "dataType": "STRING",
          "name": "name"
        },
        {
          "dataType": "STRING",
          "name": "gender"
        },
        {
          "dataType": "DATETIME",
          "name": "birthday"
        },
        {
          "dataType": "STRING",
          "name": "address"
        },
        {
          "dataType": "STRING",
          "name": "phone"
        },
        {
          "dataType": "STRING",
          "name": "email"
        },
        {
          "dataType": "DATETIME",
          "name": "create_time"
        },
        {
          "dataType": "DATETIME",
          "name": "update_time"
        }
      ],
      "dataList": [
        [
          "1",
          "张三",
          "男",
          null,
          "北京市海淀区",
          "12345678901",
          "zhangsan@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ],
        [
          "2",
          "李四",
          "男",
          null,
          "上海市浦东新区",
          "12345678902",
          "lisi@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ],
        [
          "3",
          "王五",
          "女",
          null,
          "广州市天河区",
          "12345678903",
          "wangwu@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ],
        [
          "4",
          "赵六",
          "男",
          null,
          "深圳市南山区",
          "12345678904",
          "zhaoliu@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ],
        [
          "5",
          "陈七",
          "女",
          null,
          "武汉市江汉区",
          "12345678905",
          "chenqi@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ],
        [
          "6",
          "刘八",
          "男",
          null,
          "成都市高新区",
          "12345678906",
          "liuba@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ],
        [
          "7",
          "魏九",
          "女",
          null,
          "重庆市渝北区",
          "12345678907",
          "weijiu@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ],
        [
          "8",
          "孙十",
          "男",
          null,
          "南京市鼓楼区",
          "12345678908",
          "sunshi@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ],
        [
          "9",
          "郑十一",
          "男",
          null,
          "西安市雁塔区",
          "12345678909",
          "zhengshiyi@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ],
        [
          "10",
          "许十二",
          "女",
          null,
          "苏州市姑苏区",
          "12345678910",
          "xushier@example.com",
          "2023-05-31 10:41:56.000",
          "2023-05-31 10:41:56.000"
        ]
      ],
      "sqlType": "SELECT",
      "hasNextPage": false,
      "pageNo": 1,
      "pageSize": 500,
      "duration": 6
    }
  ],
  "traceId": null
}


================================================
FILE: chat2db-client/package.json
================================================
{
  "name": "chat2db",
  "version": "1.0.0",
  "private": true,
  "repository": {
    "type": "git",
    "url": "https://github.com/chat2db/Chat2DB"
  },
  "author": "fjy, hexi",
  "main": "src/main/main.js",
  "scripts": {
    "build": "npm run build:web && npm run build:main",
    "build:desktop": "npm run build:web:desktop && npm run build:main:prod",
    "build:main": "cross-env NODE_ENV=development electron-builder",
    "build:main:prod": "cross-env NODE_ENV=production electron-builder",
    "build:prod": "npm run build:web:prod && npm run build:main:prod",
    "build:web": "umi build",
    "build:web:desktop": "cross-env UMI_ENV=desktop cross-env APP_VERSION=${npm_config_app_version} cross-env APP_PORT=${npm_config_app_port} umi build",
    "build:web:prod": "cross-env UMI_ENV=prod cross-env APP_VERSION=${npm_config_app_version} cross-env APP_PORT=${npm_config_app_port} cross-env UMI_PublicPath=${npm_config_public_path} umi build",
    "postinstall": "umi setup",
    "lint": "umi lint",
    "start": "concurrently \"npm run start:web\" \"npm run start:main\"",
    "start:main": "cross-env NODE_ENV=development electron .",
    "start:main:prod": "cross-env NODE_ENV=production electron .",
    "start:web": "cross-env UMI_ENV=local HMR=none cross-env APP_VERSION=${npm_config_app_version} umi dev",
    "start:web:hot": "cross-env UMI_ENV=local cross-env APP_VERSION=${npm_config_app_version} umi dev"
  },
  "dependencies": {
    "@dnd-kit/modifiers": "^6.0.1",
    "ahooks": "^3.7.8",
    "ali-react-table": "^2.6.1",
    "antd": "^5.12.1",
    "copy-to-clipboard": "^3.3.3",
    "echarts": "^5.4.2",
    "echarts-for-react": "^3.0.2",
    "event-source-polyfill": "^1.0.31",
    "highlight.js": "^11.9.0",
    "lodash": "^4.17.21",
    "lucide-react": "^0.365.0",
    "markdown-it-link-attributes": "^4.0.1",
    "monaco-editor": "^0.44.0",
    "monaco-editor-esm-webpack-plugin": "^2.1.0",
    "monaco-editor-webpack-plugin": "^7.0.1",
    "react-monaco-editor": "^0.54.0",
    "react-sortablejs": "^6.1.4",
    "sql-formatter": "^13.0.4",
    "styled-components": "^6.0.1",
    "umi": "^4.0.87",
    "umi-request": "^1.4.0",
    "uuid": "^9.0.0",
    "zustand": "^4.4.4"
  },
  "devDependencies": {
    "@types/event-source-polyfill": "^1.0.1",
    "@types/lodash": "^4.14.195",
    "@types/react": "^18.0.33",
    "@types/react-dom": "^18.0.11",
    "@types/uuid": "^9.0.1",
    "@typescript-eslint/eslint-plugin": "^6.7.2",
    "@typescript-eslint/parser": "^6.7.2",
    "@umijs/plugins": "^4.0.55",
    "concurrently": "^8.1.0",
    "cross-env": "^7.0.3",
    "electron": "^22.3.0",
    "electron-builder": "^23.6.0",
    "electron-debug": "^3.2.0",
    "eslint": "^8.49.0",
    "eslint-config-airbnb-base": "^15.0.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-import-resolver-webpack": "^0.13.7",
    "eslint-plugin-babel": "^5.3.1",
    "eslint-plugin-import": "^2.28.1",
    "eslint-plugin-prettier": "^5.0.0",
    "eslint-plugin-react": "^7.33.2",
    "eslint-plugin-react-hooks": "^4.6.0",
    "is-electron": "^2.2.2",
    "prettier": "^2",
    "prettier-plugin-organize-imports": "^2",
    "prettier-plugin-packagejson": "^2",
    "tailwindcss": "^3",
    "typescript": "^5.0.3"
  },
  "peerDependencies": {
    "react": "^16.8.0",
    "react-dom": "^16.8.0"
  },
  "engines": {
    "node": ">=16"
  },
  "build": {
    "appId": "com.chat2db",
    "directories": {
      "output": "release/"
    },
    "productName": "Chat2DB",
    "asar": false,
    "files": [
      "dist/**/*",
      "src/main",
      "static/",
      "versions/**/*",
      "package.json",
      "!node_modules/**/*"
    ],
    "nsis": {
      "oneClick": false,
      "perMachine": false,
      "allowElevation": true,
      "allowToChangeInstallationDirectory": true,
      "createDesktopShortcut": true,
      "deleteAppDataOnUninstall": false,
      "shortcutName": "Chat2DB"
    },
    "mac": {
      "icon": "src/assets/logo/logo.icns",
      "target": [
        "zip",
        "dmg"
      ]
    },
    "win": {
      "target": [
        {
          "target": "nsis"
        }
      ],
      "publisherName": "Chat2DB",
      "icon": "src/assets/logo/logo.ico"
    },
    "linux": {
      "maintainer": "Chat2DB, huanyueyaoqin@qq.com",
      "category": "Network;",
      "target": [
        "AppImage"
      ]
    }
  }
}


================================================
FILE: chat2db-client/readme.md
================================================
## 技术选型

1. 脚手架:umi v4
2. 组件库:antd v5
3. 状态管理库 dva
4. 图表库
5. 国际化

目录结构 tree ./ -L 2 -I node_modules

## 启动项目


强制使用 yarn,因为环境变量、lock 文件只维护了 yarn,npm/pnpm 可能会产生意想不到的 bug node 版本要求 16 以上 `npm i -g yarn` `yarn` `yarn run build:web:prod` `cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front` (复制打包结果到指定目录。windows 可能命令不一样,可以手动复制下) 之后就可以启动后端了 `mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml`

启动前端项目调试 `yarn run start:web` 注意:因为 electron 包比较难下载,如果 yarn 时 electron 下载失败或超时,可以删除掉 chat2db-client/package.json 下的 electron,再次 yarn

## TS书写规范

  1. 所有的interface 与 type 必须已I开头
    `interface IState { name: string }` // good
    `interface State { name: string }` // bad

## 如何在 js 与 css 中使用颜色

具体转换在 /theme/index.ts 中的 injectThemeVar

- js 在 window.\_AppThemePack 中去取 eg:`window._AppThemePack.controlItemBgActive` // good
- css eg: `background: var(--control-item-bg-active)` // good
- css `color: #fff` // bad

## 如何使用国际化

所有 key 参考格式为 `模块名称.文案类型.文案描述`。若文案包含可变部分,可使用 `{1}`、`{2}`、`{3}` 代替。

`src/i18n/index.ts` 中默认导出 `i18n` 转换方法,可以将 key 转换为对应的实际文案。文案中的 `{1}` 将被替换为第二个入参,以此类推。例如:

```tsx
// 'home.tip.welcome': '欢迎您,{1}!'
i18n('home.tip.welcome', user.name); // => '欢迎您,张三!'
```

也可以使用 `src/i18n/index.ts` 中导出的 `i18nElement` 方法,可以将文案中的占位符替换为 JSX 元素。例如:

```tsx
i18nElement('home.tip.welcome', <b>{user.name}</b>); // => <>欢迎您,<b>张三</b>!</>'
```

```code
├── dist
│   ├── index.html
│   ├── layouts__index.async.js
│   ├── layouts__index.chunk.css
│   ├── p__docs.async.js
│   ├── p__index.async.js
│   └── umi.js
├── package.json
├── readme.md
├── release
│   ├── Chat2DB-1.0.0-arm64-mac.zip
│   ├── Chat2DB-1.0.0-arm64-mac.zip.blockmap
│   ├── Chat2DB-1.0.0-arm64.dmg
│   ├── Chat2DB-1.0.0-arm64.dmg.blockmap
│   ├── builder-debug.yml
│   ├── builder-effective-config.yaml
│   └── mac-arm64
├── src
│   ├── assets
│   ├── blocks
│   ├── components
│   ├── config
│   ├── constant
│   ├── layouts
│   ├── locales
│   ├── main
│   ├── models
│   ├── pages
│   ├── typings
│   └── utils
├── tsconfig.json
├── typings.d.ts
└── yarn.lock
```


================================================
FILE: chat2db-client/src/assets/font/demo.css
================================================
/* Logo 字体 */
@font-face {
  font-family: "iconfont logo";
  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}

.logo {
  font-family: "iconfont logo";
  font-size: 160px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* tabs */
.nav-tabs {
  position: relative;
}

.nav-tabs .nav-more {
  position: absolute;
  right: 0;
  bottom: 0;
  height: 42px;
  line-height: 42px;
  color: #666;
}

#tabs {
  border-bottom: 1px solid #eee;
}

#tabs li {
  cursor: pointer;
  width: 100px;
  height: 40px;
  line-height: 40px;
  text-align: center;
  font-size: 16px;
  border-bottom: 2px solid transparent;
  position: relative;
  z-index: 1;
  margin-bottom: -1px;
  color: #666;
}


#tabs .active {
  border-bottom-color: #f00;
  color: #222;
}

.tab-container .content {
  display: none;
}

/* 页面布局 */
.main {
  padding: 30px 100px;
  width: 960px;
  margin: 0 auto;
}

.main .logo {
  color: #333;
  text-align: left;
  margin-bottom: 30px;
  line-height: 1;
  height: 110px;
  margin-top: -50px;
  overflow: hidden;
  *zoom: 1;
}

.main .logo a {
  font-size: 160px;
  color: #333;
}

.helps {
  margin-top: 40px;
}

.helps pre {
  padding: 20px;
  margin: 10px 0;
  border: solid 1px #e7e1cd;
  background-color: #fffdef;
  overflow: auto;
}

.icon_lists {
  width: 100% !important;
  overflow: hidden;
  *zoom: 1;
}

.icon_lists li {
  width: 100px;
  margin-bottom: 10px;
  margin-right: 20px;
  text-align: center;
  list-style: none !important;
  cursor: default;
}

.icon_lists li .code-name {
  line-height: 1.2;
}

.icon_lists .icon {
  display: block;
  height: 100px;
  line-height: 100px;
  font-size: 42px;
  margin: 10px auto;
  color: #333;
  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
  -moz-transition: font-size 0.25s linear, width 0.25s linear;
  transition: font-size 0.25s linear, width 0.25s linear;
}

.icon_lists .icon:hover {
  font-size: 100px;
}

.icon_lists .svg-icon {
  /* 通过设置 font-size 来改变图标大小 */
  width: 1em;
  /* 图标和文字相邻时,垂直对齐 */
  vertical-align: -0.15em;
  /* 通过设置 color 来改变 SVG 的颜色/fill */
  fill: currentColor;
  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
      normalize.css 中也包含这行 */
  overflow: hidden;
}

.icon_lists li .name,
.icon_lists li .code-name {
  color: #666;
}

/* markdown 样式 */
.markdown {
  color: #666;
  font-size: 14px;
  line-height: 1.8;
}

.highlight {
  line-height: 1.5;
}

.markdown img {
  vertical-align: middle;
  max-width: 100%;
}

.markdown h1 {
  color: #404040;
  font-weight: 500;
  line-height: 40px;
  margin-bottom: 24px;
}

.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
  color: #404040;
  margin: 1.6em 0 0.6em 0;
  font-weight: 500;
  clear: both;
}

.markdown h1 {
  font-size: 28px;
}

.markdown h2 {
  font-size: 22px;
}

.markdown h3 {
  font-size: 16px;
}

.markdown h4 {
  font-size: 14px;
}

.markdown h5 {
  font-size: 12px;
}

.markdown h6 {
  font-size: 12px;
}

.markdown hr {
  height: 1px;
  border: 0;
  background: #e9e9e9;
  margin: 16px 0;
  clear: both;
}

.markdown p {
  margin: 1em 0;
}

.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
  width: 80%;
}

.markdown ul>li {
  list-style: circle;
}

.markdown>ul li,
.markdown blockquote ul>li {
  margin-left: 20px;
  padding-left: 4px;
}

.markdown>ul li p,
.markdown>ol li p {
  margin: 0.6em 0;
}

.markdown ol>li {
  list-style: decimal;
}

.markdown>ol li,
.markdown blockquote ol>li {
  margin-left: 20px;
  padding-left: 4px;
}

.markdown code {
  margin: 0 3px;
  padding: 0 5px;
  background: #eee;
  border-radius: 3px;
}

.markdown strong,
.markdown b {
  font-weight: 600;
}

.markdown>table {
  border-collapse: collapse;
  border-spacing: 0px;
  empty-cells: show;
  border: 1px solid #e9e9e9;
  width: 95%;
  margin-bottom: 24px;
}

.markdown>table th {
  white-space: nowrap;
  color: #333;
  font-weight: 600;
}

.markdown>table th,
.markdown>table td {
  border: 1px solid #e9e9e9;
  padding: 8px 16px;
  text-align: left;
}

.markdown>table th {
  background: #F7F7F7;
}

.markdown blockquote {
  font-size: 90%;
  color: #999;
  border-left: 4px solid #e9e9e9;
  padding-left: 0.8em;
  margin: 1em 0;
}

.markdown blockquote p {
  margin: 0;
}

.markdown .anchor {
  opacity: 0;
  transition: opacity 0.3s ease;
  margin-left: 8px;
}

.markdown .waiting {
  color: #ccc;
}

.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
  opacity: 1;
  display: inline-block;
}

.markdown>br,
.markdown>p>br {
  clear: both;
}


.hljs {
  display: block;
  background: white;
  padding: 0.5em;
  color: #333333;
  overflow-x: auto;
}

.hljs-comment,
.hljs-meta {
  color: #969896;
}

.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
  color: #df5000;
}

.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
  color: #a71d5d;
}

.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
  color: #0086b3;
}

.hljs-section,
.hljs-name {
  color: #63a35c;
}

.hljs-tag {
  color: #333333;
}

.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
  color: #795da3;
}

.hljs-addition {
  color: #55a532;
  background-color: #eaffea;
}

.hljs-deletion {
  color: #bd2c00;
  background-color: #ffecec;
}

.hljs-link {
  text-decoration: underline;
}

/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
 * prism.js default theme for JavaScript, CSS and HTML
 * Based on dabblet (http://dabblet.com)
 * @author Lea Verou
 */
code[class*="language-"],
pre[class*="language-"] {
  color: black;
  background: none;
  text-shadow: 0 1px white;
  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
  text-align: left;
  white-space: pre;
  word-spacing: normal;
  word-break: normal;
  word-wrap: normal;
  line-height: 1.5;

  -moz-tab-size: 4;
  -o-tab-size: 4;
  tab-size: 4;

  -webkit-hyphens: none;
  -moz-hyphens: none;
  -ms-hyphens: none;
  hyphens: none;
}

pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
  text-shadow: none;
  background: #b3d4fc;
}

pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
  text-shadow: none;
  background: #b3d4fc;
}

@media print {

  code[class*="language-"],
  pre[class*="language-"] {
    text-shadow: none;
  }
}

/* Code blocks */
pre[class*="language-"] {
  padding: 1em;
  margin: .5em 0;
  overflow: auto;
}

:not(pre)>code[class*="language-"],
pre[class*="language-"] {
  background: #f5f2f0;
}

/* Inline code */
:not(pre)>code[class*="language-"] {
  padding: .1em;
  border-radius: .3em;
  white-space: normal;
}

.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
  color: slategray;
}

.token.punctuation {
  color: #999;
}

.namespace {
  opacity: .7;
}

.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
  color: #905;
}

.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
  color: #690;
}

.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
  color: #9a6e3a;
  background: hsla(0, 0%, 100%, .5);
}

.token.atrule,
.token.attr-value,
.token.keyword {
  color: #07a;
}

.token.function,
.token.class-name {
  color: #DD4A68;
}

.token.regex,
.token.important,
.token.variable {
  color: #e90;
}

.token.important,
.token.bold {
  font-weight: bold;
}

.token.italic {
  font-style: italic;
}

.token.entity {
  cursor: help;
}


================================================
FILE: chat2db-client/src/assets/font/demo_index.html
================================================
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"/>
  <title>iconfont Demo</title>
  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
  <link rel="stylesheet" href="demo.css">
  <link rel="stylesheet" href="iconfont.css">
  <script src="iconfont.js"></script>
  <!-- jQuery -->
  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
  <!-- 代码高亮 -->
  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
  <style>
    .main .logo {
      margin-top: 0;
      height: auto;
    }

    .main .logo a {
      display: flex;
      align-items: center;
    }

    .main .logo .sub-title {
      margin-left: 0.5em;
      font-size: 22px;
      color: #fff;
      background: linear-gradient(-45deg, #3967FF, #B500FE);
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
    }
  </style>
</head>
<body>
  <div class="main">
    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
      
    </a></h1>
    <div class="nav-tabs">
      <ul id="tabs" class="dib-box">
        <li class="dib active"><span>Unicode</span></li>
        <li class="dib"><span>Font class</span></li>
        <li class="dib"><span>Symbol</span></li>
      </ul>
      
      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3633546" target="_blank" class="nav-more">查看项目</a>
      
    </div>
    <div class="tab-container">
      <div class="content unicode" style="display: block;">
          <ul class="icon_lists dib-box">
          
            <li class="dib">
              <span class="icon iconfont">&#xe672;</span>
                <div class="name">right_on_5</div>
                <div class="code-name">&amp;#xe672;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe673;</span>
                <div class="name">right_off_5-01</div>
                <div class="code-name">&amp;#xe673;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe674;</span>
                <div class="name">left_on_2</div>
                <div class="code-name">&amp;#xe674;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe670;</span>
                <div class="name">left_off</div>
                <div class="code-name">&amp;#xe670;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe671;</span>
                <div class="name">minimize21</div>
                <div class="code-name">&amp;#xe671;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe66b;</span>
                <div class="name">restore</div>
                <div class="code-name">&amp;#xe66b;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe66e;</span>
                <div class="name">resize</div>
                <div class="code-name">&amp;#xe66e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe66f;</span>
                <div class="name">close</div>
                <div class="code-name">&amp;#xe66f;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe66a;</span>
                <div class="name">筛选</div>
                <div class="code-name">&amp;#xe66a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe69a;</span>
                <div class="name">排序</div>
                <div class="code-name">&amp;#xe69a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe8e8;</span>
                <div class="name">305信息-线性圆框</div>
                <div class="code-name">&amp;#xe8e8;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe726;</span>
                <div class="name">加号</div>
                <div class="code-name">&amp;#xe726;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec6b;</span>
                <div class="name">列表</div>
                <div class="code-name">&amp;#xec6b;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe65d;</span>
                <div class="name">减去</div>
                <div class="code-name">&amp;#xe65d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe669;</span>
                <div class="name">database</div>
                <div class="code-name">&amp;#xe669;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe888;</span>
                <div class="name">筛选</div>
                <div class="code-name">&amp;#xe888;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe668;</span>
                <div class="name">刷新</div>
                <div class="code-name">&amp;#xe668;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xeb78;</span>
                <div class="name">加号_o</div>
                <div class="code-name">&amp;#xeb78;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6a9;</span>
                <div class="name">数据库_jurassic</div>
                <div class="code-name">&amp;#xe6a9;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe667;</span>
                <div class="name">权限</div>
                <div class="code-name">&amp;#xe667;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe816;</span>
                <div class="name">sharpicons_add-database</div>
                <div class="code-name">&amp;#xe816;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe663;</span>
                <div class="name">组织管理</div>
                <div class="code-name">&amp;#xe663;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe691;</span>
                <div class="name">空间</div>
                <div class="code-name">&amp;#xe691;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#x100be;</span>
                <div class="name">下箭头-copy</div>
                <div class="code-name">&amp;#x100be;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe788;</span>
                <div class="name">查看</div>
                <div class="code-name">&amp;#xe788;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe8db;</span>
                <div class="name">clone</div>
                <div class="code-name">&amp;#xe8db;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe687;</span>
                <div class="name">提交</div>
                <div class="code-name">&amp;#xe687;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe665;</span>
                <div class="name">查看</div>
                <div class="code-name">&amp;#xe665;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec7a;</span>
                <div class="name">复制</div>
                <div class="code-name">&amp;#xec7a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe686;</span>
                <div class="name">icon_answer</div>
                <div class="code-name">&amp;#xe686;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6a8;</span>
                <div class="name">icon_question</div>
                <div class="code-name">&amp;#xe6a8;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#x100bd;</span>
                <div class="name">发送</div>
                <div class="code-name">&amp;#x100bd;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe662;</span>
                <div class="name">重启</div>
                <div class="code-name">&amp;#xe662;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6cc;</span>
                <div class="name">提醒</div>
                <div class="code-name">&amp;#xe6cc;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe661;</span>
                <div class="name">提醒</div>
                <div class="code-name">&amp;#xe661;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe716;</span>
                <div class="name">提醒</div>
                <div class="code-name">&amp;#xe716;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe69c;</span>
                <div class="name">升级</div>
                <div class="code-name">&amp;#xe69c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe659;</span>
                <div class="name">全局_升级</div>
                <div class="code-name">&amp;#xe659;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe65c;</span>
                <div class="name">关于我们</div>
                <div class="code-name">&amp;#xe65c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe67d;</span>
                <div class="name">ico版本更新</div>
                <div class="code-name">&amp;#xe67d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe657;</span>
                <div class="name">对话气泡</div>
                <div class="code-name">&amp;#xe657;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe658;</span>
                <div class="name">角色权限</div>
                <div class="code-name">&amp;#xe658;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe654;</span>
                <div class="name">preview</div>
                <div class="code-name">&amp;#xe654;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe653;</span>
                <div class="name">导入</div>
                <div class="code-name">&amp;#xe653;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe652;</span>
                <div class="name">终止</div>
                <div class="code-name">&amp;#xe652;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6b2;</span>
                <div class="name">退出</div>
                <div class="code-name">&amp;#xe6b2;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6bb;</span>
                <div class="name">控桩终端</div>
                <div class="code-name">&amp;#xe6bb;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6e2;</span>
                <div class="name">撤销</div>
                <div class="code-name">&amp;#xe6e2;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe650;</span>
                <div class="name">向上</div>
                <div class="code-name">&amp;#xe650;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe651;</span>
                <div class="name">查看</div>
                <div class="code-name">&amp;#xe651;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6f2;</span>
                <div class="name">编辑数据_编辑录入操作_jurassic</div>
                <div class="code-name">&amp;#xe6f2;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6f3;</span>
                <div class="name">编辑表格_编辑录入操作_jurassic</div>
                <div class="code-name">&amp;#xe6f3;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe7b5;</span>
                <div class="name">报表数据录入</div>
                <div class="code-name">&amp;#xe7b5;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe656;</span>
                <div class="name">播放5</div>
                <div class="code-name">&amp;#xe656;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe64f;</span>
                <div class="name">清空@3x</div>
                <div class="code-name">&amp;#xe64f;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe64e;</span>
                <div class="name">删除</div>
                <div class="code-name">&amp;#xe64e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe792;</span>
                <div class="name">new-document-worksheet</div>
                <div class="code-name">&amp;#xe792;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe7b7;</span>
                <div class="name">file-excel</div>
                <div class="code-name">&amp;#xe7b7;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe7b8;</span>
                <div class="name">file-markdown</div>
                <div class="code-name">&amp;#xe7b8;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe7ba;</span>
                <div class="name">file-word</div>
                <div class="code-name">&amp;#xe7ba;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe87d;</span>
                <div class="name">HTML5</div>
                <div class="code-name">&amp;#xe87d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe64d;</span>
                <div class="name">HTML</div>
                <div class="code-name">&amp;#xe64d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe67a;</span>
                <div class="name">pdf</div>
                <div class="code-name">&amp;#xe67a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe64c;</span>
                <div class="name">个人用户</div>
                <div class="code-name">&amp;#xe64c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe64b;</span>
                <div class="name">后台管理</div>
                <div class="code-name">&amp;#xe64b;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec83;</span>
                <div class="name">字体代码</div>
                <div class="code-name">&amp;#xec83;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe70c;</span>
                <div class="name">版本</div>
                <div class="code-name">&amp;#xe70c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe73c;</span>
                <div class="name">车位管理</div>
                <div class="code-name">&amp;#xe73c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe64a;</span>
                <div class="name">dictate</div>
                <div class="code-name">&amp;#xe64a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe76a;</span>
                <div class="name">circle-f</div>
                <div class="code-name">&amp;#xe76a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6fd;</span>
                <div class="name">图表-函数</div>
                <div class="code-name">&amp;#xe6fd;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe647;</span>
                <div class="name">视图管理器</div>
                <div class="code-name">&amp;#xe647;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe643;</span>
                <div class="name">回车</div>
                <div class="code-name">&amp;#xe643;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe642;</span>
                <div class="name">缺省</div>
                <div class="code-name">&amp;#xe642;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe88e;</span>
                <div class="name">进入箭头</div>
                <div class="code-name">&amp;#xe88e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe641;</span>
                <div class="name">右箭头</div>
                <div class="code-name">&amp;#xe641;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe660;</span>
                <div class="name">向右箭头</div>
                <div class="code-name">&amp;#xe660;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe640;</span>
                <div class="name">数据源</div>
                <div class="code-name">&amp;#xe640;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe67c;</span>
                <div class="name">question</div>
                <div class="code-name">&amp;#xe67c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe63a;</span>
                <div class="name">星星-copy</div>
                <div class="code-name">&amp;#xe63a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe69f;</span>
                <div class="name">控制台</div>
                <div class="code-name">&amp;#xe69f;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe639;</span>
                <div class="name">星系</div>
                <div class="code-name">&amp;#xe639;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe638;</span>
                <div class="name">暂无数据 (1)</div>
                <div class="code-name">&amp;#xe638;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe637;</span>
                <div class="name">开始</div>
                <div class="code-name">&amp;#xe637;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe634;</span>
                <div class="name">关闭</div>
                <div class="code-name">&amp;#xe634;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xeb6d;</span>
                <div class="name">下箭头</div>
                <div class="code-name">&amp;#xeb6d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe633;</span>
                <div class="name">more</div>
                <div class="code-name">&amp;#xe633;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe630;</span>
                <div class="name">设置</div>
                <div class="code-name">&amp;#xe630;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe628;</span>
                <div class="name">对话-未选</div>
                <div class="code-name">&amp;#xe628;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe629;</span>
                <div class="name">图表-未选</div>
                <div class="code-name">&amp;#xe629;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe62b;</span>
                <div class="name">编组 13备份 3</div>
                <div class="code-name">&amp;#xe62b;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe616;</span>
                <div class="name">编组备份</div>
                <div class="code-name">&amp;#xe616;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe618;</span>
                <div class="name">表格</div>
                <div class="code-name">&amp;#xe618;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe61d;</span>
                <div class="name">收藏 (1)</div>
                <div class="code-name">&amp;#xe61d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe621;</span>
                <div class="name">guthub-未选</div>
                <div class="code-name">&amp;#xe621;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe622;</span>
                <div class="name">数据-未选</div>
                <div class="code-name">&amp;#xe622;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe624;</span>
                <div class="name">编组 4</div>
                <div class="code-name">&amp;#xe624;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe627;</span>
                <div class="name">编组 14备份</div>
                <div class="code-name">&amp;#xe627;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe615;</span>
                <div class="name">guthub-未选</div>
                <div class="code-name">&amp;#xe615;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xeabe;</span>
                <div class="name">24gl-folderMinus</div>
                <div class="code-name">&amp;#xeabe;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xeabf;</span>
                <div class="name">24gl-folderOpen</div>
                <div class="code-name">&amp;#xeabf;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xeac7;</span>
                <div class="name">24gf-folderOpen</div>
                <div class="code-name">&amp;#xeac7;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe744;</span>
                <div class="name">云数据库</div>
                <div class="code-name">&amp;#xe744;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe612;</span>
                <div class="name">报表</div>
                <div class="code-name">&amp;#xe612;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe614;</span>
                <div class="name">工作台</div>
                <div class="code-name">&amp;#xe614;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec21;</span>
                <div class="name">mongodb</div>
                <div class="code-name">&amp;#xec21;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6a2;</span>
                <div class="name">Redis</div>
                <div class="code-name">&amp;#xe6a2;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe60e;</span>
                <div class="name">HIVE_2</div>
                <div class="code-name">&amp;#xe60e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6a0;</span>
                <div class="name">Kingbase</div>
                <div class="code-name">&amp;#xe6a0;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe60d;</span>
                <div class="name">仪表盘</div>
                <div class="code-name">&amp;#xe60d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe60b;</span>
                <div class="name">presto</div>
                <div class="code-name">&amp;#xe60b;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe60a;</span>
                <div class="name">DB2</div>
                <div class="code-name">&amp;#xe60a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe982;</span>
                <div class="name">oceanbase</div>
                <div class="code-name">&amp;#xe982;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe655;</span>
                <div class="name">达梦</div>
                <div class="code-name">&amp;#xe655;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe63f;</span>
                <div class="name">proxy</div>
                <div class="code-name">&amp;#xe63f;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe646;</span>
                <div class="name">openai</div>
                <div class="code-name">&amp;#xe646;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe60c;</span>
                <div class="name">关于</div>
                <div class="code-name">&amp;#xe60c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe666;</span>
                <div class="name">衣服</div>
                <div class="code-name">&amp;#xe666;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe609;</span>
                <div class="name">数据库</div>
                <div class="code-name">&amp;#xe609;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe649;</span>
                <div class="name">数据源配置</div>
                <div class="code-name">&amp;#xe649;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6a6;</span>
                <div class="name">服务器_数据库_jurassic</div>
                <div class="code-name">&amp;#xe6a6;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe607;</span>
                <div class="name">数据库</div>
                <div class="code-name">&amp;#xe607;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe625;</span>
                <div class="name">数据库</div>
                <div class="code-name">&amp;#xe625;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe63c;</span>
                <div class="name">数据库数据</div>
                <div class="code-name">&amp;#xe63c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe636;</span>
                <div class="name">数据库</div>
                <div class="code-name">&amp;#xe636;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe62f;</span>
                <div class="name">配置数据源</div>
                <div class="code-name">&amp;#xe62f;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe80a;</span>
                <div class="name">SQL历史查询</div>
                <div class="code-name">&amp;#xe80a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe623;</span>
                <div class="name">重命名</div>
                <div class="code-name">&amp;#xe623;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe8ff;</span>
                <div class="name">ico_数据查询与统计_预约情况查询</div>
                <div class="code-name">&amp;#xe8ff;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe8f4;</span>
                <div class="name">clickhouse-云数据库ClickHouse</div>
                <div class="code-name">&amp;#xe8f4;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6f5;</span>
                <div class="name">rds_mariadb</div>
                <div class="code-name">&amp;#xe6f5;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe62a;</span>
                <div class="name">减少减去减号</div>
                <div class="code-name">&amp;#xe62a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe664;</span>
                <div class="name">sqlserver</div>
                <div class="code-name">&amp;#xe664;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe65a;</span>
                <div class="name">sqlite</div>
                <div class="code-name">&amp;#xe65a;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe760;</span>
                <div class="name">缺省页_暂无数据</div>
                <div class="code-name">&amp;#xe760;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe755;</span>
                <div class="name">未完成</div>
                <div class="code-name">&amp;#xe755;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe62e;</span>
                <div class="name">完成-01</div>
                <div class="code-name">&amp;#xe62e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe620;</span>
                <div class="name">成功</div>
                <div class="code-name">&amp;#xe620;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe70e;</span>
                <div class="name">机器人</div>
                <div class="code-name">&amp;#xe70e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe635;</span>
                <div class="name">换一换</div>
                <div class="code-name">&amp;#xe635;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe65b;</span>
                <div class="name">icon_infomation</div>
                <div class="code-name">&amp;#xe65b;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe775;</span>
                <div class="name">key</div>
                <div class="code-name">&amp;#xe775;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec6d;</span>
                <div class="name">mysql</div>
                <div class="code-name">&amp;#xec6d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec48;</span>
                <div class="name">oracle</div>
                <div class="code-name">&amp;#xec48;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec5d;</span>
                <div class="name">postgresql</div>
                <div class="code-name">&amp;#xec5d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe61c;</span>
                <div class="name">h2</div>
                <div class="code-name">&amp;#xe61c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe696;</span>
                <div class="name">cc-schema</div>
                <div class="code-name">&amp;#xe696;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6b6;</span>
                <div class="name">新建表格</div>
                <div class="code-name">&amp;#xe6b6;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe613;</span>
                <div class="name">export</div>
                <div class="code-name">&amp;#xe613;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe66d;</span>
                <div class="name">角色管理</div>
                <div class="code-name">&amp;#xe66d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe619;</span>
                <div class="name">console</div>
                <div class="code-name">&amp;#xe619;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xeac5;</span>
                <div class="name">24gf-folderMinus</div>
                <div class="code-name">&amp;#xeac5;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe606;</span>
                <div class="name">查看</div>
                <div class="code-name">&amp;#xe606;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xeb4e;</span>
                <div class="name">复制_o</div>
                <div class="code-name">&amp;#xeb4e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe626;</span>
                <div class="name">执行</div>
                <div class="code-name">&amp;#xe626;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe7f8;</span>
                <div class="name">m-格式化文字</div>
                <div class="code-name">&amp;#xe7f8;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe885;</span>
                <div class="name">github-fill</div>
                <div class="code-name">&amp;#xe885;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe645;</span>
                <div class="name">保存</div>
                <div class="code-name">&amp;#xe645;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xeb93;</span>
                <div class="name">箭头_向左两次_o</div>
                <div class="code-name">&amp;#xeb93;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe603;</span>
                <div class="name">新建窗口</div>
                <div class="code-name">&amp;#xe603;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6cd;</span>
                <div class="name">loading</div>
                <div class="code-name">&amp;#xe6cd;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6ca;</span>
                <div class="name">链接克隆</div>
                <div class="code-name">&amp;#xe6ca;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe63b;</span>
                <div class="name">SQL升级文件</div>
                <div class="code-name">&amp;#xe63b;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe610;</span>
                <div class="name">sql</div>
                <div class="code-name">&amp;#xe610;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec57;</span>
                <div class="name">连接流</div>
                <div class="code-name">&amp;#xec57;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe685;</span>
                <div class="name">跳转/退出</div>
                <div class="code-name">&amp;#xe685;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe648;</span>
                <div class="name">key</div>
                <div class="code-name">&amp;#xe648;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe8ad;</span>
                <div class="name">播放记录</div>
                <div class="code-name">&amp;#xe8ad;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe605;</span>
                <div class="name">成功</div>
                <div class="code-name">&amp;#xe605;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe87c;</span>
                <div class="name">失败</div>
                <div class="code-name">&amp;#xe87c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe790;</span>
                <div class="name">收回 上下</div>
                <div class="code-name">&amp;#xe790;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe7b1;</span>
                <div class="name">展开 上下</div>
                <div class="code-name">&amp;#xe7b1;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe62c;</span>
                <div class="name">数据库</div>
                <div class="code-name">&amp;#xe62c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe936;</span>
                <div class="name">保存</div>
                <div class="code-name">&amp;#xe936;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec4c;</span>
                <div class="name">查询</div>
                <div class="code-name">&amp;#xec4c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe61f;</span>
                <div class="name">对勾</div>
                <div class="code-name">&amp;#xe61f;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe617;</span>
                <div class="name">check</div>
                <div class="code-name">&amp;#xe617;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe632;</span>
                <div class="name">概览</div>
                <div class="code-name">&amp;#xe632;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe63d;</span>
                <div class="name">概览</div>
                <div class="code-name">&amp;#xe63d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe602;</span>
                <div class="name">编辑</div>
                <div class="code-name">&amp;#xe602;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec08;</span>
                <div class="name">刷新</div>
                <div class="code-name">&amp;#xec08;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe611;</span>
                <div class="name">菜单/列表</div>
                <div class="code-name">&amp;#xe611;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe63e;</span>
                <div class="name">表格</div>
                <div class="code-name">&amp;#xe63e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe65f;</span>
                <div class="name">展开</div>
                <div class="code-name">&amp;#xe65f;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe61e;</span>
                <div class="name">收起</div>
                <div class="code-name">&amp;#xe61e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xeb6f;</span>
                <div class="name">主题_o</div>
                <div class="code-name">&amp;#xeb6f;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe65e;</span>
                <div class="name">断开连接</div>
                <div class="code-name">&amp;#xe65e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe60f;</span>
                <div class="name">修改</div>
                <div class="code-name">&amp;#xe60f;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe604;</span>
                <div class="name">删除</div>
                <div class="code-name">&amp;#xe604;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe601;</span>
                <div class="name">更多</div>
                <div class="code-name">&amp;#xe601;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe644;</span>
                <div class="name">减少</div>
                <div class="code-name">&amp;#xe644;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe61b;</span>
                <div class="name">加</div>
                <div class="code-name">&amp;#xe61b;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe631;</span>
                <div class="name">加号</div>
                <div class="code-name">&amp;#xe631;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe608;</span>
                <div class="name">arrow drop down</div>
                <div class="code-name">&amp;#xe608;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe600;</span>
                <div class="name">search</div>
                <div class="code-name">&amp;#xe600;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe66c;</span>
                <div class="name">download</div>
                <div class="code-name">&amp;#xe66c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe79c;</span>
                <div class="name">向右箭头</div>
                <div class="code-name">&amp;#xe79c;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe6a7;</span>
                <div class="name">删除线型</div>
                <div class="code-name">&amp;#xe6a7;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xec8e;</span>
                <div class="name">cross</div>
                <div class="code-name">&amp;#xec8e;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe62d;</span>
                <div class="name">刷新</div>
                <div class="code-name">&amp;#xe62d;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe913;</span>
                <div class="name">提醒</div>
                <div class="code-name">&amp;#xe913;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe795;</span>
                <div class="name">138设置、系统设置、功能设置、属性</div>
                <div class="code-name">&amp;#xe795;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe759;</span>
                <div class="name">执行sql脚本</div>
                <div class="code-name">&amp;#xe759;</div>
              </li>
          
            <li class="dib">
              <span class="icon iconfont">&#xe61a;</span>
                <div class="name">虚拟数据库管理</div>
                <div class="code-name">&amp;#xe61a;</div>
              </li>
          
          </ul>
          <div class="article markdown">
          <h2 id="unicode-">Unicode 引用</h2>
          <hr>

          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
          <ul>
            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
          </ul>
          <blockquote>
            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
          </blockquote>
          <p>Unicode 使用步骤如下:</p>
          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
<pre><code class="language-css"
>@font-face {
  font-family: 'iconfont';
  src: url('iconfont.woff2?t=1704794525154') format('woff2'),
       url('iconfont.woff?t=1704794525154') format('woff'),
       url('iconfont.ttf?t=1704794525154') format('truetype');
}
</code></pre>
          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
<pre><code class="language-css"
>.iconfont {
  font-family: "iconfont" !important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
</code></pre>
          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
<pre>
<code class="language-html"
>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
</code></pre>
          <blockquote>
            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
          </blockquote>
          </div>
      </div>
      <div class="content font-class">
        <ul class="icon_lists dib-box">
          
          <li class="dib">
            <span class="icon iconfont icon-right_on_5"></span>
            <div class="name">
              right_on_5
            </div>
            <div class="code-name">.icon-right_on_5
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-right_off_5-01"></span>
            <div class="name">
              right_off_5-01
            </div>
            <div class="code-name">.icon-right_off_5-01
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-a-left_on_huaban11"></span>
            <div class="name">
              left_on_2
            </div>
            <div class="code-name">.icon-a-left_on_huaban11
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-a-left_off_huaban1"></span>
            <div class="name">
              left_off
            </div>
            <div class="code-name">.icon-a-left_off_huaban1
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-minimize21"></span>
            <div class="name">
              minimize21
            </div>
            <div class="code-name">.icon-minimize21
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-restore_button2"></span>
            <div class="name">
              restore
            </div>
            <div class="code-name">.icon-restore_button2
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-resize_button2"></span>
            <div class="name">
              resize
            </div>
            <div class="code-name">.icon-resize_button2
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-close_button2"></span>
            <div class="name">
              close
            </div>
            <div class="code-name">.icon-close_button2
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-shaixuan"></span>
            <div class="name">
              筛选
            </div>
            <div class="code-name">.icon-shaixuan
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-a-44tubiao-122"></span>
            <div class="name">
              排序
            </div>
            <div class="code-name">.icon-a-44tubiao-122
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-xinxi-xianxingyuankuang"></span>
            <div class="name">
              305信息-线性圆框
            </div>
            <div class="code-name">.icon-xinxi-xianxingyuankuang
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-jiahao"></span>
            <div class="name">
              加号
            </div>
            <div class="code-name">.icon-jiahao
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-liebiao"></span>
            <div class="name">
              列表
            </div>
            <div class="code-name">.icon-liebiao
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-jianqu"></span>
            <div class="name">
              减去
            </div>
            <div class="code-name">.icon-jianqu
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-database"></span>
            <div class="name">
              database
            </div>
            <div class="code-name">.icon-database
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-shaixuan1"></span>
            <div class="name">
              筛选
            </div>
            <div class="code-name">.icon-shaixuan1
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-shuaxin2"></span>
            <div class="name">
              刷新
            </div>
            <div class="code-name">.icon-shuaxin2
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-jiahao_o"></span>
            <div class="name">
              加号_o
            </div>
            <div class="code-name">.icon-jiahao_o
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-jurassic_data"></span>
            <div class="name">
              数据库_jurassic
            </div>
            <div class="code-name">.icon-jurassic_data
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-quanxian"></span>
            <div class="name">
              权限
            </div>
            <div class="code-name">.icon-quanxian
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-sharpicons_add-database"></span>
            <div class="name">
              sharpicons_add-database
            </div>
            <div class="code-name">.icon-sharpicons_add-database
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-zuzhiguanli-"></span>
            <div class="name">
              组织管理
            </div>
            <div class="code-name">.icon-zuzhiguanli-
            </div>
          </li>
          
          <li class="dib">
            <span class="icon iconfont icon-moxing-miaobian"></span>
            <div class="name">
              空间
            </div>
            <div class="code-name">.icon-moxing-miaobian
            </div>
          </li>
          
         
Download .txt
gitextract_docf9pkb/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yml
│   │   ├── optimized.md
│   │   └── suggest.md
│   └── workflows/
│       ├── pushdocker.yml
│       ├── release.yml
│       ├── release_test.yml
│       └── release_test_2.yml
├── .gitignore
├── .vscode/
│   └── settings.json
├── CHANGELOG.md
├── CHANGELOG_CN.md
├── CHAT2DB_AI_SQL.md
├── Chat2DB_LICENSE
├── LICENSE
├── README.md
├── README_CN.md
├── README_JA.md
├── chat2db-client/
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .npmrc
│   ├── .prettierignore
│   ├── .prettierrc
│   ├── .umirc.prod.desktop.ts
│   ├── .umirc.prod.ts
│   ├── .umirc.ts
│   ├── .vscode/
│   │   └── settings.json
│   ├── mock/
│   │   └── sqlResult.json
│   ├── package.json
│   ├── readme.md
│   ├── src/
│   │   ├── assets/
│   │   │   ├── font/
│   │   │   │   ├── demo.css
│   │   │   │   ├── demo_index.html
│   │   │   │   ├── iconfont.css
│   │   │   │   ├── iconfont.js
│   │   │   │   └── iconfont.json
│   │   │   └── logo/
│   │   │       └── logo.icns
│   │   ├── blocks/
│   │   │   ├── AppTitleBar/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CreateConnection/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── DatabaseTableEditor/
│   │   │   │   ├── BaseInfo/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ColumnList/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── IncludeCol/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── IndexList/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── RealTimeSQL/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── SequenceEditor/
│   │   │   │   ├── BaseInfo/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── IncludeCol/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── RealTimeSQL/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Setting/
│   │   │   │   ├── About/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── AiSetting/
│   │   │   │   │   ├── aiTypeConfig.ts
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── BaseSetting/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ProxySetting/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── UpdateDetection/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   └── Tree/
│   │   │       ├── functions/
│   │   │       │   ├── deleteSequence.tsx
│   │   │       │   ├── deleteTable.less
│   │   │       │   ├── deleteTable.tsx
│   │   │       │   ├── openAsyncSql.ts
│   │   │       │   ├── pinTable.ts
│   │   │       │   ├── refresh.ts
│   │   │       │   ├── viewDDL.less
│   │   │       │   └── viewDDL.tsx
│   │   │       ├── hooks/
│   │   │       │   ├── useGetRightClickMenu.ts
│   │   │       │   └── useTreeNodeFocus.ts
│   │   │       ├── index.less
│   │   │       ├── index.tsx
│   │   │       ├── treeConfig.tsx
│   │   │       └── treeStore.ts
│   │   ├── components/
│   │   │   ├── BrandLogo/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CascaderDB/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ConnectionEdit/
│   │   │   │   ├── components/
│   │   │   │   │   └── Driver/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── config/
│   │   │   │   │   ├── dataSource.ts
│   │   │   │   │   ├── enum.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ConsoleEditor/
│   │   │   │   ├── components/
│   │   │   │   │   ├── ChatInput/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── OperationLine/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── SelectBoundInfo/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── hooks/
│   │   │   │   │   ├── useModuleData.ts
│   │   │   │   │   └── useSaveEditorData.ts
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CreateDatabase/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CustomLayout/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── CustomSelect/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── DraggableContainer/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── EditDialog/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ExecuteSQL/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Iconfont/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ImportBlock/
│   │   │   │   └── index.tsx
│   │   │   ├── ImportConnection/
│   │   │   │   └── index.tsx
│   │   │   ├── LayoutBasic/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Loading/
│   │   │   │   ├── LazyLoading/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Loading/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── LoadingContent/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── LoadingGracile/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   └── LoadingLiquid/
│   │   │   │       ├── index.less
│   │   │   │       └── index.tsx
│   │   │   ├── MenuLabel/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Modal/
│   │   │   │   ├── BaseModal/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── MonacoEditorModal/
│   │   │   │   │   └── index.tsx
│   │   │   │   └── TriggeredModal/
│   │   │   │       ├── index.less
│   │   │   │       └── index.tsx
│   │   │   ├── MonacoEditor/
│   │   │   │   ├── index.less
│   │   │   │   ├── index.tsx
│   │   │   │   ├── monacoEditorConfig.ts
│   │   │   │   ├── syntax-parser/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lexer/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── token.ts
│   │   │   │   │   ├── parser/
│   │   │   │   │   │   ├── chain.ts
│   │   │   │   │   │   ├── define.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── match.ts
│   │   │   │   │   │   ├── scanner.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   └── plugin/
│   │   │   │   │       ├── monaco-plugin/
│   │   │   │   │       │   ├── default-opts.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   └── parser.worker.ts
│   │   │   │   │       └── sql-parser/
│   │   │   │   │           ├── base/
│   │   │   │   │           │   ├── define.ts
│   │   │   │   │           │   ├── four-operations.ts
│   │   │   │   │           │   ├── parser.ts
│   │   │   │   │           │   ├── reader.ts
│   │   │   │   │           │   ├── reserve-keys.ts
│   │   │   │   │           │   └── utils.ts
│   │   │   │   │           ├── index.tsx
│   │   │   │   │           └── mysql/
│   │   │   │   │               ├── index.ts
│   │   │   │   │               ├── lexer.ts
│   │   │   │   │               └── parser.ts
│   │   │   │   └── useMonacoTheme.ts
│   │   │   ├── MyNotification/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Output/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Popularize/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── RefreshLoadingButton/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ScrollLoading/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── SearchResult/
│   │   │   │   ├── components/
│   │   │   │   │   ├── OperationalDataBar/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Pagination/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── RightClickMenu/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── ScreeningResult/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── StatusBar/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── TableBox/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── hooks/
│   │   │   │   │   ├── useCurdTableData.ts
│   │   │   │   │   ├── useMultipleSelect.ts
│   │   │   │   │   └── usePasteData.ts
│   │   │   │   ├── index.less
│   │   │   │   ├── index.tsx
│   │   │   │   └── utils.tsx
│   │   │   ├── ShortcutKey/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── SingleFileMonacoEditor/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── StateIndicator/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── Tabs/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── UploadDriver/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── ViewDDL/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   └── XXXX_FN/
│   │   │       ├── index.less
│   │   │       └── index.tsx
│   │   ├── constants/
│   │   │   ├── IntelliSense/
│   │   │   │   ├── index.ts
│   │   │   │   ├── mysql.ts
│   │   │   │   ├── oracle.ts
│   │   │   │   ├── pgsql.ts
│   │   │   │   ├── redis.ts
│   │   │   │   └── sqlserver.ts
│   │   │   ├── appConfig.ts
│   │   │   ├── chat.ts
│   │   │   ├── common.ts
│   │   │   ├── console.ts
│   │   │   ├── database.ts
│   │   │   ├── editTable.ts
│   │   │   ├── environment.ts
│   │   │   ├── index.ts
│   │   │   ├── table.ts
│   │   │   ├── theme.ts
│   │   │   ├── tree.ts
│   │   │   └── workspace.ts
│   │   ├── hooks/
│   │   │   ├── getConnection.ts
│   │   │   ├── index.ts
│   │   │   ├── useClickAndDoubleClick.ts
│   │   │   ├── useEventSource.ts
│   │   │   ├── useFocusData.ts
│   │   │   ├── usePollRequestService.ts
│   │   │   ├── useTheme.ts
│   │   │   └── useUpdateEffect.ts
│   │   ├── i18n/
│   │   │   ├── en-us/
│   │   │   │   ├── chat.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── connection.ts
│   │   │   │   ├── dashboard.ts
│   │   │   │   ├── editSequence.ts
│   │   │   │   ├── editTable.ts
│   │   │   │   ├── editTableData.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── login.ts
│   │   │   │   ├── menu.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── sqlEditor.ts
│   │   │   │   ├── team.ts
│   │   │   │   └── workspace.ts
│   │   │   ├── index.tsx
│   │   │   ├── ja-jp/
│   │   │   │   ├── chat.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── connection.ts
│   │   │   │   ├── dashboard.ts
│   │   │   │   ├── editSequence.ts
│   │   │   │   ├── editTable.ts
│   │   │   │   ├── editTableData.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── login.ts
│   │   │   │   ├── menu.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── sqlEditor.ts
│   │   │   │   ├── team.ts
│   │   │   │   └── workspace.ts
│   │   │   ├── tr-tr/
│   │   │   │   ├── chat.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── connection.ts
│   │   │   │   ├── dashboard.ts
│   │   │   │   ├── editSequence.ts
│   │   │   │   ├── editTable.ts
│   │   │   │   ├── editTableData.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── login.ts
│   │   │   │   ├── menu.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── sqlEditor.ts
│   │   │   │   ├── team.ts
│   │   │   │   └── workspace.ts
│   │   │   └── zh-cn/
│   │   │       ├── chat.ts
│   │   │       ├── common.ts
│   │   │       ├── connection.ts
│   │   │       ├── dashboard.ts
│   │   │       ├── editSequence.ts
│   │   │       ├── editTable.ts
│   │   │       ├── editTableData.ts
│   │   │       ├── index.ts
│   │   │       ├── login.ts
│   │   │       ├── menu.ts
│   │   │       ├── setting.ts
│   │   │       ├── sqlEditor.ts
│   │   │       ├── team.ts
│   │   │       └── workspace.ts
│   │   ├── indexedDB/
│   │   │   ├── index.ts
│   │   │   └── table.ts
│   │   ├── layouts/
│   │   │   ├── GlobalLayout/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   └── init/
│   │   │       ├── GlobalComponent.tsx
│   │   │       ├── init.ts
│   │   │       ├── initIndexedDB.ts
│   │   │       ├── registerElectronApi.ts
│   │   │       ├── registerMessage.ts
│   │   │       └── registerNotification.ts
│   │   ├── main/
│   │   │   ├── analysis.js
│   │   │   ├── constants.js
│   │   │   ├── ga4.js
│   │   │   ├── i18n/
│   │   │   │   ├── en/
│   │   │   │   │   └── index.js
│   │   │   │   ├── index.js
│   │   │   │   └── zh-cn/
│   │   │   │       └── index.js
│   │   │   ├── index.js
│   │   │   ├── main.js
│   │   │   ├── main.js.LICENSE.txt
│   │   │   ├── menu.js
│   │   │   ├── package.json
│   │   │   ├── preload.js
│   │   │   ├── store.js
│   │   │   ├── utils.js
│   │   │   └── webpack.config.js
│   │   ├── pages/
│   │   │   ├── demo/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── document.ejs
│   │   │   ├── login/
│   │   │   │   ├── index.less
│   │   │   │   └── index.tsx
│   │   │   ├── main/
│   │   │   │   ├── connection/
│   │   │   │   │   ├── index.less
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── dashboard/
│   │   │   │   │   ├── chart/
│   │   │   │   │   │   ├── bar/
│   │   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── line/
│   │   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   └── pie/
│   │   │   │   │   │       ├── index.less
│   │   │   │   │   │       └── index.tsx
│   │   │   │   │   ├── chart-item/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── index.less
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── left-block/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── functions/
│   │   │   │   │   └── getConnection.ts
│   │   │   │   ├── index.less
│   │   │   │   ├── index.tsx
│   │   │   │   ├── store/
│   │   │   │   │   ├── connection/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── main/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── monaco/
│   │   │   │   │       └── index.ts
│   │   │   │   ├── team/
│   │   │   │   │   ├── datasource-management/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── index.less
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── team-management/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── universal-add-modal/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── universal-drawer/
│   │   │   │   │   │   ├── index.less
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── user-management/
│   │   │   │   │       ├── index.less
│   │   │   │   │       └── index.tsx
│   │   │   │   └── workspace/
│   │   │   │       ├── components/
│   │   │   │       │   ├── OperationLine/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── SQLExecute/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── SaveList/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── TableList/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── ViewAllTable/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── WorkspaceExtend/
│   │   │   │       │   │   ├── GlobalExtendComponents/
│   │   │   │       │   │   │   ├── index.less
│   │   │   │       │   │   │   └── index.tsx
│   │   │   │       │   │   ├── WorkspaceExtendBody/
│   │   │   │       │   │   │   ├── index.less
│   │   │   │       │   │   │   └── index.tsx
│   │   │   │       │   │   ├── WorkspaceExtendNav/
│   │   │   │       │   │   │   ├── index.less
│   │   │   │       │   │   │   └── index.tsx
│   │   │   │       │   │   ├── config.tsx
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── WorkspaceLeft/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── WorkspaceLeftHeader/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   ├── WorkspaceRight/
│   │   │   │       │   │   ├── index.less
│   │   │   │       │   │   └── index.tsx
│   │   │   │       │   └── WorkspaceTabs/
│   │   │   │       │       ├── index.less
│   │   │   │       │       └── index.tsx
│   │   │   │       ├── functions/
│   │   │   │       │   └── shortcutKeyCreateConsole.ts
│   │   │   │       ├── index.less
│   │   │   │       ├── index.tsx
│   │   │   │       └── store/
│   │   │   │           ├── common.ts
│   │   │   │           ├── config.ts
│   │   │   │           ├── console.ts
│   │   │   │           ├── index.ts
│   │   │   │           └── modal.ts
│   │   │   └── test/
│   │   │       ├── index.less
│   │   │       └── index.tsx
│   │   ├── service/
│   │   │   ├── ai.ts
│   │   │   ├── base.ts
│   │   │   ├── config.ts
│   │   │   ├── connection.ts
│   │   │   ├── dashboard.ts
│   │   │   ├── history.ts
│   │   │   ├── misc.tsx
│   │   │   ├── outside.ts
│   │   │   ├── sql.ts
│   │   │   ├── team.ts
│   │   │   └── user.ts
│   │   ├── store/
│   │   │   ├── common/
│   │   │   │   ├── appTitleBarConfig.ts
│   │   │   │   ├── components.ts
│   │   │   │   ├── copyFocusedContent.ts
│   │   │   │   └── index.ts
│   │   │   ├── config/
│   │   │   │   └── index.ts
│   │   │   ├── monaco/
│   │   │   │   └── index.ts
│   │   │   ├── setting/
│   │   │   │   └── index.ts
│   │   │   └── user/
│   │   │       └── index.ts
│   │   ├── styles/
│   │   │   ├── antd.less
│   │   │   ├── common.less
│   │   │   ├── global.less
│   │   │   └── var.less
│   │   ├── theme/
│   │   │   ├── abandon/
│   │   │   │   ├── demo/
│   │   │   │   │   ├── dark.less
│   │   │   │   │   └── light.less
│   │   │   │   └── primaryColor.less
│   │   │   ├── background/
│   │   │   │   ├── dark.ts
│   │   │   │   ├── darkDimmed.ts
│   │   │   │   └── light.ts
│   │   │   ├── common.ts
│   │   │   ├── custom/
│   │   │   │   ├── dark.less
│   │   │   │   ├── darkDimmed.less
│   │   │   │   └── light.less
│   │   │   └── index.ts
│   │   ├── typings/
│   │   │   ├── ai.ts
│   │   │   ├── common.ts
│   │   │   ├── connection.ts
│   │   │   ├── console.ts
│   │   │   ├── dashboard.ts
│   │   │   ├── database.ts
│   │   │   ├── editSequence.ts
│   │   │   ├── editTable.ts
│   │   │   ├── index.ts
│   │   │   ├── main.ts
│   │   │   ├── resultTable.ts
│   │   │   ├── setting.ts
│   │   │   ├── team.ts
│   │   │   ├── theme.ts
│   │   │   ├── tree.ts
│   │   │   ├── user.ts
│   │   │   └── workspace.ts
│   │   └── utils/
│   │       ├── IntelliSense/
│   │       │   ├── database.ts
│   │       │   ├── field.ts
│   │       │   ├── index.ts
│   │       │   ├── keyword.ts
│   │       │   ├── table.ts
│   │       │   └── view.ts
│   │       ├── check.ts
│   │       ├── database.ts
│   │       ├── date.ts
│   │       ├── eventSource.ts
│   │       ├── file.ts
│   │       ├── getTree.ts
│   │       ├── index.ts
│   │       ├── localStorage.ts
│   │       ├── lodash.ts
│   │       ├── sort.ts
│   │       ├── sql.ts
│   │       ├── timezone.ts
│   │       ├── url.ts
│   │       └── webpack.ts
│   ├── tsconfig.json
│   └── typings.d.ts
├── chat2db-server/
│   ├── .apifox-helper.properties
│   ├── .easy.api.config
│   ├── .gitignore
│   ├── README.md
│   ├── chat2db-plugins/
│   │   ├── chat2db-clickhouse/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── clickhouse/
│   │   │           │                   ├── ClickHouseDBManage.java
│   │   │           │                   ├── ClickHouseMetaData.java
│   │   │           │                   ├── ClickHousePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── ClickHouseSqlBuilder.java
│   │   │           │                   ├── clickhouse.json
│   │   │           │                   └── type/
│   │   │           │                       ├── ClickHouseColumnTypeEnum.java
│   │   │           │                       ├── ClickHouseEngineTypeEnum.java
│   │   │           │                       └── ClickHouseIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-db2/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── db2/
│   │   │           │                   ├── DB2DBManage.java
│   │   │           │                   ├── DB2MetaData.java
│   │   │           │                   ├── DB2Plugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── DB2SqlBuilder.java
│   │   │           │                   ├── constant/
│   │   │           │                   │   └── SQLConstant.java
│   │   │           │                   ├── db2.json
│   │   │           │                   └── type/
│   │   │           │                       ├── DB2ColumnTypeEnum.java
│   │   │           │                       ├── DB2DefaultValueEnum.java
│   │   │           │                       └── DB2IndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-dm/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── dm/
│   │   │           │                   ├── DMDBManage.java
│   │   │           │                   ├── DMMetaData.java
│   │   │           │                   ├── DMPlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── DMSqlBuilder.java
│   │   │           │                   ├── dm.json
│   │   │           │                   └── type/
│   │   │           │                       ├── DMColumnTypeEnum.java
│   │   │           │                       ├── DMDefaultValueEnum.java
│   │   │           │                       └── DMIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-h2/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── h2/
│   │   │           │                   ├── H2DBManage.java
│   │   │           │                   ├── H2Meta.java
│   │   │           │                   ├── H2Plugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── H2SqlBuilder.java
│   │   │           │                   └── h2.json
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-hive/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── hive/
│   │   │           │                   ├── HiveCommandExecutor.java
│   │   │           │                   ├── HiveDBManage.java
│   │   │           │                   ├── HiveMetaData.java
│   │   │           │                   ├── HivePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── HiveSqlBuilder.java
│   │   │           │                   ├── hive.json
│   │   │           │                   └── type/
│   │   │           │                       ├── HiveColumnTypeEnum.java
│   │   │           │                       └── HiveIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-kingbase/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── kingbase/
│   │   │           │                   ├── KingBaseDBManage.java
│   │   │           │                   ├── KingBaseMetaData.java
│   │   │           │                   ├── KingBasePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── KingBaseSqlBuilder.java
│   │   │           │                   ├── kingbase.json
│   │   │           │                   └── type/
│   │   │           │                       ├── KingBaseColumnTypeEnum.java
│   │   │           │                       ├── KingBaseDefaultValueEnum.java
│   │   │           │                       └── KingBaseIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-mariadb/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── mariadb/
│   │   │           │                   ├── MariaDBManage.java
│   │   │           │                   ├── MariaDBMetaData.java
│   │   │           │                   ├── MariaDBPlugin.java
│   │   │           │                   ├── mariadb.json
│   │   │           │                   └── value/
│   │   │           │                       ├── MariaDBValueProcessor.java
│   │   │           │                       ├── factory/
│   │   │           │                       │   └── MariaDBValueProcessorFactory.java
│   │   │           │                       └── sub/
│   │   │           │                           ├── MariaDBBitProcessor.java
│   │   │           │                           ├── MariaDBGeometryProcessor.java
│   │   │           │                           ├── MariaDBTimestampProcessor.java
│   │   │           │                           └── MariaDBYearProcessor.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-mongodb/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── mongodb/
│   │   │           │                   ├── MongodbCommandExecutor.java
│   │   │           │                   ├── MongodbManage.java
│   │   │           │                   ├── MongodbMetaData.java
│   │   │           │                   ├── MongodbPlugin.java
│   │   │           │                   └── mongodb.json
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-mysql/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── mysql/
│   │   │           │                   ├── MysqlDBManage.java
│   │   │           │                   ├── MysqlMetaData.java
│   │   │           │                   ├── MysqlPlugin.java
│   │   │           │                   ├── MysqlValueHandler.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   ├── MysqlSqlBuilder.java
│   │   │           │                   │   └── form.json
│   │   │           │                   ├── mysql.json
│   │   │           │                   ├── type/
│   │   │           │                   │   ├── MysqlCharsetEnum.java
│   │   │           │                   │   ├── MysqlCollationEnum.java
│   │   │           │                   │   ├── MysqlColumnTypeEnum.java
│   │   │           │                   │   ├── MysqlDefaultValueEnum.java
│   │   │           │                   │   └── MysqlIndexTypeEnum.java
│   │   │           │                   └── value/
│   │   │           │                       ├── GeometryValueHandler.java
│   │   │           │                       ├── MysqlValueProcessor.java
│   │   │           │                       ├── factory/
│   │   │           │                       │   └── MysqlValueProcessorFactory.java
│   │   │           │                       ├── sub/
│   │   │           │                       │   ├── MysqlBinaryProcessor.java
│   │   │           │                       │   ├── MysqlBitProcessor.java
│   │   │           │                       │   ├── MysqlDecimalProcessor.java
│   │   │           │                       │   ├── MysqlGeometryProcessor.java
│   │   │           │                       │   ├── MysqlTextProcessor.java
│   │   │           │                       │   ├── MysqlTimestampProcessor.java
│   │   │           │                       │   ├── MysqlVarBinaryProcessor.java
│   │   │           │                       │   └── MysqlYearProcessor.java
│   │   │           │                       └── template/
│   │   │           │                           └── MysqlDmlValueTemplate.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-oceanbase/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── oceanbase/
│   │   │           │                   ├── OceanBaseDBManage.java
│   │   │           │                   ├── OceanBaseMetaData.java
│   │   │           │                   ├── OceanBasePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── OceanBaseSqlBuilder.java
│   │   │           │                   ├── oceanbase.json
│   │   │           │                   └── type/
│   │   │           │                       ├── OceanBaseColumnTypeEnum.java
│   │   │           │                       └── OceanBaseIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-oracle/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── oracle/
│   │   │           │                   ├── OracleDBManage.java
│   │   │           │                   ├── OracleMetaData.java
│   │   │           │                   ├── OraclePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── OracleSqlBuilder.java
│   │   │           │                   ├── oracle.json
│   │   │           │                   ├── type/
│   │   │           │                   │   ├── OracleColumnTypeEnum.java
│   │   │           │                   │   ├── OracleDefaultValueEnum.java
│   │   │           │                   │   └── OracleIndexTypeEnum.java
│   │   │           │                   └── value/
│   │   │           │                       ├── OracleValueProcessor.java
│   │   │           │                       ├── factory/
│   │   │           │                       │   └── OracleValueProcessorFactory.java
│   │   │           │                       ├── sub/
│   │   │           │                       │   ├── OracleAnyDataProcessor.java
│   │   │           │                       │   ├── OracleBlobProcessor.java
│   │   │           │                       │   ├── OracleClobProcessor.java
│   │   │           │                       │   ├── OracleDateProcessor.java
│   │   │           │                       │   ├── OracleIntervalDSProcessor.java
│   │   │           │                       │   ├── OracleIntervalYMProcessor.java
│   │   │           │                       │   ├── OracleLongRawProcessor.java
│   │   │           │                       │   ├── OracleNumberProcessor.java
│   │   │           │                       │   ├── OracleRawValueProcessor.java
│   │   │           │                       │   ├── OracleTimeStampLTZProcessor.java
│   │   │           │                       │   ├── OracleTimeStampProcessor.java
│   │   │           │                       │   ├── OracleTimeStampTZProcessor.java
│   │   │           │                       │   └── OracleXmlValueProcessor.java
│   │   │           │                       └── template/
│   │   │           │                           └── OracleDmlValueTemplate.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-postgresql/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── postgresql/
│   │   │           │                   ├── PostgreSQLDBManage.java
│   │   │           │                   ├── PostgreSQLMetaData.java
│   │   │           │                   ├── PostgreSQLPlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── PostgreSQLSqlBuilder.java
│   │   │           │                   ├── consts/
│   │   │           │                   │   ├── SQLConst.java
│   │   │           │                   │   └── SequenceCommonConst.java
│   │   │           │                   ├── pg.json
│   │   │           │                   └── type/
│   │   │           │                       ├── PostgreSQLCharsetEnum.java
│   │   │           │                       ├── PostgreSQLCollationEnum.java
│   │   │           │                       ├── PostgreSQLColumnTypeEnum.java
│   │   │           │                       ├── PostgreSQLDefaultValueEnum.java
│   │   │           │                       └── PostgreSQLIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-presto/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── presto/
│   │   │           │                   ├── PrestoDBManage.java
│   │   │           │                   ├── PrestoMetaData.java
│   │   │           │                   ├── PrestoPlugin.java
│   │   │           │                   └── presto.json
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-sqlite/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── sqlite/
│   │   │           │                   ├── SqliteDBManage.java
│   │   │           │                   ├── SqliteMetaData.java
│   │   │           │                   ├── SqlitePlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── SqliteBuilder.java
│   │   │           │                   ├── sqlite.json
│   │   │           │                   └── type/
│   │   │           │                       ├── SqliteCharsetEnum.java
│   │   │           │                       ├── SqliteCollationEnum.java
│   │   │           │                       ├── SqliteColumnTypeEnum.java
│   │   │           │                       ├── SqliteDefaultValueEnum.java
│   │   │           │                       └── SqliteIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-sqlserver/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── sqlserver/
│   │   │           │                   ├── SqlServerCommandExecutor.java
│   │   │           │                   ├── SqlServerDBManage.java
│   │   │           │                   ├── SqlServerMetaData.java
│   │   │           │                   ├── SqlServerPlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── SqlServerSqlBuilder.java
│   │   │           │                   ├── sqlserver.json
│   │   │           │                   └── type/
│   │   │           │                       ├── SqlServerColumnTypeEnum.java
│   │   │           │                       ├── SqlServerDefaultValueEnum.java
│   │   │           │                       └── SqlServerIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   ├── chat2db-timeplus/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── plugin/
│   │   │           │               └── timeplus/
│   │   │           │                   ├── TimeplusDBManage.java
│   │   │           │                   ├── TimeplusMetaData.java
│   │   │           │                   ├── TimeplusPlugin.java
│   │   │           │                   ├── builder/
│   │   │           │                   │   └── TimeplusSqlBuilder.java
│   │   │           │                   ├── timeplus.json
│   │   │           │                   └── type/
│   │   │           │                       ├── TimeplusColumnTypeEnum.java
│   │   │           │                       ├── TimeplusEngineTypeEnum.java
│   │   │           │                       └── TimeplusIndexTypeEnum.java
│   │   │           └── resources/
│   │   │               └── META-INF/
│   │   │                   └── services/
│   │   │                       └── ai.chat2db.spi.Plugin
│   │   └── pom.xml
│   ├── chat2db-server-domain/
│   │   ├── README.md
│   │   ├── chat2db-server-domain-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── domain/
│   │   │                               └── api/
│   │   │                                   ├── chart/
│   │   │                                   │   ├── ChartCreateParam.java
│   │   │                                   │   ├── ChartListQueryParam.java
│   │   │                                   │   ├── ChartPageQueryParam.java
│   │   │                                   │   ├── ChartQueryParam.java
│   │   │                                   │   └── ChartUpdateParam.java
│   │   │                                   ├── enums/
│   │   │                                   │   ├── AccessObjectTypeEnum.java
│   │   │                                   │   ├── AiSqlSourceEnum.java
│   │   │                                   │   ├── DataSourceKindEnum.java
│   │   │                                   │   ├── DeletedTypeEnum.java
│   │   │                                   │   ├── EnvironmentEnum.java
│   │   │                                   │   ├── ExportFileSuffix.java
│   │   │                                   │   ├── ExportSizeEnum.java
│   │   │                                   │   ├── ExportTypeEnum.java
│   │   │                                   │   ├── OperationStatusEnum.java
│   │   │                                   │   ├── RoleCodeEnum.java
│   │   │                                   │   ├── TableVectorEnum.java
│   │   │                                   │   ├── TaskStatusEnum.java
│   │   │                                   │   ├── TaskTypeEnum.java
│   │   │                                   │   └── ValidStatusEnum.java
│   │   │                                   ├── model/
│   │   │                                   │   ├── AIConfig.java
│   │   │                                   │   ├── Chart.java
│   │   │                                   │   ├── ChatGptConfig.java
│   │   │                                   │   ├── Config.java
│   │   │                                   │   ├── Dashboard.java
│   │   │                                   │   ├── DataSource.java
│   │   │                                   │   ├── DataSourceAccess.java
│   │   │                                   │   ├── DataSourceAccessObject.java
│   │   │                                   │   ├── Environment.java
│   │   │                                   │   ├── IndexInfo.java
│   │   │                                   │   ├── Operation.java
│   │   │                                   │   ├── OperationLog.java
│   │   │                                   │   ├── TableParameter.java
│   │   │                                   │   ├── Task.java
│   │   │                                   │   ├── Team.java
│   │   │                                   │   ├── TeamUser.java
│   │   │                                   │   └── User.java
│   │   │                                   ├── param/
│   │   │                                   │   ├── ConsoleCloseParam.java
│   │   │                                   │   ├── ConsoleConnectParam.java
│   │   │                                   │   ├── ConsoleCreateParam.java
│   │   │                                   │   ├── DlCountParam.java
│   │   │                                   │   ├── DlExecuteParam.java
│   │   │                                   │   ├── DmlSqlCopyParam.java
│   │   │                                   │   ├── DropParam.java
│   │   │                                   │   ├── EnvironmentPageQueryParam.java
│   │   │                                   │   ├── GroupByParam.java
│   │   │                                   │   ├── MetaDataQueryParam.java
│   │   │                                   │   ├── OrderByParam.java
│   │   │                                   │   ├── PinTableParam.java
│   │   │                                   │   ├── SchemaOperationParam.java
│   │   │                                   │   ├── SchemaQueryParam.java
│   │   │                                   │   ├── SelectResultOperation.java
│   │   │                                   │   ├── SequencePageQueryParam.java
│   │   │                                   │   ├── SequenceQueryParam.java
│   │   │                                   │   ├── ShowCreateSequenceParam.java
│   │   │                                   │   ├── ShowCreateTableParam.java
│   │   │                                   │   ├── SqlAnalyseParam.java
│   │   │                                   │   ├── SystemConfigParam.java
│   │   │                                   │   ├── TablePageQueryParam.java
│   │   │                                   │   ├── TableQueryParam.java
│   │   │                                   │   ├── TableSelector.java
│   │   │                                   │   ├── TableVectorParam.java
│   │   │                                   │   ├── TaskCreateParam.java
│   │   │                                   │   ├── TaskPageParam.java
│   │   │                                   │   ├── TaskUpdateParam.java
│   │   │                                   │   ├── TypeQueryParam.java
│   │   │                                   │   ├── UpdateSelectResultParam.java
│   │   │                                   │   ├── dashboard/
│   │   │                                   │   │   ├── DashboardCreateParam.java
│   │   │                                   │   │   ├── DashboardPageQueryParam.java
│   │   │                                   │   │   ├── DashboardQueryParam.java
│   │   │                                   │   │   ├── DashboardSelector.java
│   │   │                                   │   │   └── DashboardUpdateParam.java
│   │   │                                   │   ├── datasource/
│   │   │                                   │   │   ├── DataSourceCloseParam.java
│   │   │                                   │   │   ├── DataSourceCreateParam.java
│   │   │                                   │   │   ├── DataSourcePageQueryParam.java
│   │   │                                   │   │   ├── DataSourcePreConnectParam.java
│   │   │                                   │   │   ├── DataSourceSelector.java
│   │   │                                   │   │   ├── DataSourceTestParam.java
│   │   │                                   │   │   ├── DataSourceUpdateParam.java
│   │   │                                   │   │   ├── DatabaseCreateParam.java
│   │   │                                   │   │   ├── DatabaseExportDataParam.java
│   │   │                                   │   │   ├── DatabaseExportParam.java
│   │   │                                   │   │   ├── DatabaseQueryAllParam.java
│   │   │                                   │   │   └── access/
│   │   │                                   │   │       ├── DataSourceAccessBatchCreatParam.java
│   │   │                                   │   │       ├── DataSourceAccessComprehensivePageQueryParam.java
│   │   │                                   │   │       ├── DataSourceAccessCreatParam.java
│   │   │                                   │   │       ├── DataSourceAccessObjectParam.java
│   │   │                                   │   │       ├── DataSourceAccessPageQueryParam.java
│   │   │                                   │   │       └── DataSourceAccessSelector.java
│   │   │                                   │   ├── message/
│   │   │                                   │   │   └── MessageCreateParam.java
│   │   │                                   │   ├── operation/
│   │   │                                   │   │   ├── OperationLogCreateParam.java
│   │   │                                   │   │   ├── OperationLogPageQueryParam.java
│   │   │                                   │   │   ├── OperationPageQueryParam.java
│   │   │                                   │   │   ├── OperationQueryParam.java
│   │   │                                   │   │   ├── OperationSavedParam.java
│   │   │                                   │   │   └── OperationUpdateParam.java
│   │   │                                   │   ├── team/
│   │   │                                   │   │   ├── TeamCreateParam.java
│   │   │                                   │   │   ├── TeamPageQueryParam.java
│   │   │                                   │   │   ├── TeamSelector.java
│   │   │                                   │   │   ├── TeamUpdateParam.java
│   │   │                                   │   │   └── user/
│   │   │                                   │   │       ├── TeamUserComprehensivePageQueryParam.java
│   │   │                                   │   │       ├── TeamUserCreatParam.java
│   │   │                                   │   │       ├── TeamUserPageQueryParam.java
│   │   │                                   │   │       └── TeamUserSelector.java
│   │   │                                   │   └── user/
│   │   │                                   │       ├── UserCreateParam.java
│   │   │                                   │       ├── UserPageQueryParam.java
│   │   │                                   │       ├── UserSelector.java
│   │   │                                   │       └── UserUpdateParam.java
│   │   │                                   └── service/
│   │   │                                       ├── ChartService.java
│   │   │                                       ├── ConfigService.java
│   │   │                                       ├── ConsoleService.java
│   │   │                                       ├── DashboardService.java
│   │   │                                       ├── DataSourceAccessBusinessService.java
│   │   │                                       ├── DataSourceAccessService.java
│   │   │                                       ├── DataSourceService.java
│   │   │                                       ├── DatabaseService.java
│   │   │                                       ├── DlTemplateService.java
│   │   │                                       ├── EnvironmentService.java
│   │   │                                       ├── FunctionService.java
│   │   │                                       ├── JdbcDriverService.java
│   │   │                                       ├── OperationLogService.java
│   │   │                                       ├── OperationService.java
│   │   │                                       ├── PinService.java
│   │   │                                       ├── ProcedureService.java
│   │   │                                       ├── SequenceService.java
│   │   │                                       ├── TableService.java
│   │   │                                       ├── TaskService.java
│   │   │                                       ├── TeamService.java
│   │   │                                       ├── TeamUserService.java
│   │   │                                       ├── TriggerService.java
│   │   │                                       ├── UserService.java
│   │   │                                       ├── ViewService.java
│   │   │                                       └── WebhookSender.java
│   │   ├── chat2db-server-domain-core/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── domain/
│   │   │                               └── core/
│   │   │                                   ├── cache/
│   │   │                                   │   ├── CacheKey.java
│   │   │                                   │   ├── CacheManage.java
│   │   │                                   │   └── MemoryCacheManage.java
│   │   │                                   ├── converter/
│   │   │                                   │   ├── ChartConverter.java
│   │   │                                   │   ├── CommandConverter.java
│   │   │                                   │   ├── ConfigConverter.java
│   │   │                                   │   ├── DashboardConverter.java
│   │   │                                   │   ├── DataSourceAccessConverter.java
│   │   │                                   │   ├── DataSourceConverter.java
│   │   │                                   │   ├── DriverConfigConverter.java
│   │   │                                   │   ├── EnvironmentConverter.java
│   │   │                                   │   ├── OperationConverter.java
│   │   │                                   │   ├── OperationLogConverter.java
│   │   │                                   │   ├── PinTableConverter.java
│   │   │                                   │   ├── TableConverter.java
│   │   │                                   │   ├── TaskConverter.java
│   │   │                                   │   ├── TeamConverter.java
│   │   │                                   │   ├── TeamUserConverter.java
│   │   │                                   │   └── UserConverter.java
│   │   │                                   ├── enums/
│   │   │                                   │   └── ExternalNotificationTypeEnum.java
│   │   │                                   ├── impl/
│   │   │                                   │   ├── ChartServiceImpl.java
│   │   │                                   │   ├── ConfigServiceImpl.java
│   │   │                                   │   ├── ConsoleServiceImpl.java
│   │   │                                   │   ├── DashboardServiceImpl.java
│   │   │                                   │   ├── DataSourceAccessBusinessServiceImpl.java
│   │   │                                   │   ├── DataSourceAccessServiceImpl.java
│   │   │                                   │   ├── DataSourceServiceImpl.java
│   │   │                                   │   ├── DatabaseServiceImpl.java
│   │   │                                   │   ├── DlTemplateServiceImpl.java
│   │   │                                   │   ├── EnvironmentServiceImpl.java
│   │   │                                   │   ├── FunctionServiceImpl.java
│   │   │                                   │   ├── JdbcDriverServiceImpl.java
│   │   │                                   │   ├── OperationLogServiceImpl.java
│   │   │                                   │   ├── OperationServiceImpl.java
│   │   │                                   │   ├── PinServiceImpl.java
│   │   │                                   │   ├── ProcedureServiceImpl.java
│   │   │                                   │   ├── SequenceServiceImpl.java
│   │   │                                   │   ├── TableServiceImpl.java
│   │   │                                   │   ├── TaskServiceImpl.java
│   │   │                                   │   ├── TeamServiceImpl.java
│   │   │                                   │   ├── TeamUserServiceImpl.java
│   │   │                                   │   ├── TriggerServiceImpl.java
│   │   │                                   │   ├── UserServiceImpl.java
│   │   │                                   │   └── ViewServiceImpl.java
│   │   │                                   ├── notification/
│   │   │                                   │   ├── BaseWebhookSender.java
│   │   │                                   │   ├── DingTalkWebhookSender.java
│   │   │                                   │   ├── LarkWebhookSender.java
│   │   │                                   │   └── WeComWebhookSender.java
│   │   │                                   └── util/
│   │   │                                       ├── DesUtil.java
│   │   │                                       ├── H2Functions.java
│   │   │                                       ├── H2Triggers.java
│   │   │                                       ├── MetaNameUtils.java
│   │   │                                       └── PermissionUtils.java
│   │   ├── chat2db-server-domain-repository/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── server/
│   │   │           │               └── domain/
│   │   │           │                   └── repository/
│   │   │           │                       ├── Dbutils.java
│   │   │           │                       ├── MapperUtils.java
│   │   │           │                       ├── entity/
│   │   │           │                       │   ├── ChartDO.java
│   │   │           │                       │   ├── DashboardChartRelationDO.java
│   │   │           │                       │   ├── DashboardDO.java
│   │   │           │                       │   ├── DataSourceAccessDO.java
│   │   │           │                       │   ├── DataSourceDO.java
│   │   │           │                       │   ├── DbhubUserDO.java
│   │   │           │                       │   ├── EnvironmentDO.java
│   │   │           │                       │   ├── JdbcDriverDO.java
│   │   │           │                       │   ├── OperationLogDO.java
│   │   │           │                       │   ├── OperationSavedDO.java
│   │   │           │                       │   ├── PinTableDO.java
│   │   │           │                       │   ├── SystemConfigDO.java
│   │   │           │                       │   ├── TableCacheDO.java
│   │   │           │                       │   ├── TableCacheVersionDO.java
│   │   │           │                       │   ├── TableVectorMappingDO.java
│   │   │           │                       │   ├── TaskDO.java
│   │   │           │                       │   ├── TeamDO.java
│   │   │           │                       │   └── TeamUserDO.java
│   │   │           │                       └── mapper/
│   │   │           │                           ├── ChartMapper.java
│   │   │           │                           ├── DashboardChartRelationMapper.java
│   │   │           │                           ├── DashboardMapper.java
│   │   │           │                           ├── DataSourceAccessCustomMapper.java
│   │   │           │                           ├── DataSourceAccessMapper.java
│   │   │           │                           ├── DataSourceCustomMapper.java
│   │   │           │                           ├── DataSourceMapper.java
│   │   │           │                           ├── DbhubUserMapper.java
│   │   │           │                           ├── EnvironmentMapper.java
│   │   │           │                           ├── JdbcDriverMapper.java
│   │   │           │                           ├── OperationLogMapper.java
│   │   │           │                           ├── OperationSavedMapper.java
│   │   │           │                           ├── PinTableMapper.java
│   │   │           │                           ├── SystemConfigMapper.java
│   │   │           │                           ├── TableCacheMapper.java
│   │   │           │                           ├── TableCacheVersionMapper.java
│   │   │           │                           ├── TableVectorMappingMapper.java
│   │   │           │                           ├── TaskMapper.java
│   │   │           │                           ├── TeamMapper.java
│   │   │           │                           ├── TeamUserCustomMapper.java
│   │   │           │                           └── TeamUserMapper.java
│   │   │           └── resources/
│   │   │               ├── db/
│   │   │               │   ├── migration/
│   │   │               │   │   ├── V1_0_0__初始化信息.sql
│   │   │               │   │   ├── V1_0_2__修改Console.sql
│   │   │               │   │   ├── V1_0_3__增加SSH.sql
│   │   │               │   │   ├── V1_0_4__增加报表.sql
│   │   │               │   │   ├── V1_0_5__增加置顶表.sql
│   │   │               │   │   ├── V1_0_6__初始化demo信息.sql
│   │   │               │   │   ├── V1_0_7__自定义驱动.sql
│   │   │               │   │   ├── V1_0_8__操作保存类型.sql
│   │   │               │   │   ├── V2_1_0__支持环境、用户权限.sql
│   │   │               │   │   ├── V2_1_10__REMOVEdEMO.sql
│   │   │               │   │   ├── V2_1_1__TableCache.sql
│   │   │               │   │   ├── V2_1_2__OPERATION.sql
│   │   │               │   │   ├── V2_1_4__OPERATION.sql
│   │   │               │   │   ├── V2_1_5__TableVector.sql
│   │   │               │   │   ├── V2_1_6__TableVectorUpdate.sql
│   │   │               │   │   ├── V2_1_7__DATASOURCE.sql
│   │   │               │   │   ├── V2_1_8__Chart.sql
│   │   │               │   │   └── V2_1_9__task.sql
│   │   │               │   └── temp/
│   │   │               │       └── V2_1_0__补充.sql
│   │   │               └── mapper/
│   │   │                   ├── ChartMapper.xml
│   │   │                   ├── DashboardChartRelationMapper.xml
│   │   │                   ├── DashboardMapper.xml
│   │   │                   ├── DataSourceAccessCustomMapper.xml
│   │   │                   ├── DataSourceAccessMapper.xml
│   │   │                   ├── DataSourceCustomMapper.xml
│   │   │                   ├── DataSourceMapper.xml
│   │   │                   ├── DbhubUserMapper.xml
│   │   │                   ├── EnvironmentMapper.xml
│   │   │                   ├── JdbcDriverMapper.xml
│   │   │                   ├── OperationLogMapper.xml
│   │   │                   ├── OperationSavedMapper.xml
│   │   │                   ├── PinTableMapper.xml
│   │   │                   ├── SystemConfigMapper.xml
│   │   │                   ├── TableCacheMapper.xml
│   │   │                   ├── TableCacheVersionMapper.xml
│   │   │                   ├── TableVectorMappingMapper.xml
│   │   │                   ├── TaskMapper.xml
│   │   │                   ├── TeamMapper.xml
│   │   │                   ├── TeamUserCustomMapper.xml
│   │   │                   └── TeamUserMapper.xml
│   │   └── pom.xml
│   ├── chat2db-server-start/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── ai/
│   │       │   │       └── chat2db/
│   │       │   │           └── server/
│   │       │   │               └── start/
│   │       │   │                   ├── Application.java
│   │       │   │                   ├── config/
│   │       │   │                   │   ├── config/
│   │       │   │                   │   │   ├── AsyncContextRefreshedListener.java
│   │       │   │                   │   │   ├── Chat2dbForestConfiguration.java
│   │       │   │                   │   │   ├── Chat2dbWebMvcConfigurer.java
│   │       │   │                   │   │   ├── JarDownloadTask.java
│   │       │   │                   │   │   └── WebLogConfiguration.java
│   │       │   │                   │   ├── i18n/
│   │       │   │                   │   │   └── I18nConfig.java
│   │       │   │                   │   ├── interceptor/
│   │       │   │                   │   │   └── CorsFilter.java
│   │       │   │                   │   ├── listener/
│   │       │   │                   │   │   ├── DbhubTomcatConnectorCustomizer.java
│   │       │   │                   │   │   ├── FailedEventApplicationListener.java
│   │       │   │                   │   │   ├── ManageApplicationListener.java
│   │       │   │                   │   │   └── manage/
│   │       │   │                   │   │       ├── ManageMessage.java
│   │       │   │                   │   │       └── MessageTypeEnum.java
│   │       │   │                   │   └── mybatis/
│   │       │   │                   │       └── MyBatisPlusConfig.java
│   │       │   │                   ├── controller/
│   │       │   │                   │   ├── oauth/
│   │       │   │                   │   │   ├── OauthController.java
│   │       │   │                   │   │   └── request/
│   │       │   │                   │   │       └── LoginRequest.java
│   │       │   │                   │   └── thymeleaf/
│   │       │   │                   │       └── ThymeleafController.java
│   │       │   │                   ├── exception/
│   │       │   │                   │   ├── EasyControllerExceptionHandler.java
│   │       │   │                   │   └── convertor/
│   │       │   │                   │       ├── BindExceptionConvertor.java
│   │       │   │                   │       ├── BusinessExceptionConvertor.java
│   │       │   │                   │       ├── DefaultExceptionConvertor.java
│   │       │   │                   │       ├── ExceptionConvertor.java
│   │       │   │                   │       ├── ExceptionConvertorUtils.java
│   │       │   │                   │       ├── MaxUploadSizeExceededExceptionConvertor.java
│   │       │   │                   │       ├── MethodArgumentNotValidExceptionConvertor.java
│   │       │   │                   │       ├── MethodArgumentTypeMismatchExceptionConvertor.java
│   │       │   │                   │       └── ParamExceptionConvertor.java
│   │       │   │                   └── log/
│   │       │   │                       ├── EasyLogSink.java
│   │       │   │                       ├── LogOncePerRequestFilter.java
│   │       │   │                       └── WebLog.java
│   │       │   └── resources/
│   │       │       ├── META-INF/
│   │       │       │   └── spring.factories
│   │       │       ├── application-dev.yml
│   │       │       ├── application-release.yml
│   │       │       ├── application-test.yml
│   │       │       ├── application.yml
│   │       │       ├── i18n/
│   │       │       │   ├── messages.properties
│   │       │       │   ├── messages_en_US.properties
│   │       │       │   └── messages_zh_CN.properties
│   │       │       ├── logback-spring.xml
│   │       │       └── thymeleaf/
│   │       │           └── template.html
│   │       └── test/
│   │           ├── java/
│   │           │   └── ai/
│   │           │       └── chat2db/
│   │           │           └── server/
│   │           │               └── start/
│   │           │                   └── test/
│   │           │                       ├── TestApplication.java
│   │           │                       ├── common/
│   │           │                       │   └── BaseTest.java
│   │           │                       ├── core/
│   │           │                       │   ├── ChartServiceTest.java
│   │           │                       │   ├── ConfigServiceTest.java
│   │           │                       │   ├── ConsoleServiceTest.java
│   │           │                       │   ├── DashboardServiceTest.java
│   │           │                       │   ├── DataSourceAccessBusinessServiceTest.java
│   │           │                       │   ├── DataSourceAccessServiceTest.java
│   │           │                       │   ├── DataSourceServiceTest.java
│   │           │                       │   ├── DatabaseServiceTest.java
│   │           │                       │   ├── DlTemplateServiceTest.java
│   │           │                       │   ├── EnvironmentServiceTest.java
│   │           │                       │   ├── FunctionServiceTest.java
│   │           │                       │   ├── JdbcDriverServiceTest.java
│   │           │                       │   ├── OperationLogServiceTest.java
│   │           │                       │   ├── OperationServiceTest.java
│   │           │                       │   ├── PinServiceTest.java
│   │           │                       │   ├── ProcedureServiceTest.java
│   │           │                       │   ├── TableServiceTest.java
│   │           │                       │   ├── TaskServiceTest.java
│   │           │                       │   ├── TeamServiceTest.java
│   │           │                       │   ├── TeamUserServiceTest.java
│   │           │                       │   ├── TriggerServiceTest.java
│   │           │                       │   ├── UserServiceTest.java
│   │           │                       │   ├── ViewServiceTest.java
│   │           │                       │   └── WebhookServiceTest.java
│   │           │                       ├── dialect/
│   │           │                       │   ├── DialectProperties.java
│   │           │                       │   ├── MariadbDialectProperties.java
│   │           │                       │   ├── MongodbDialectProperties.java
│   │           │                       │   ├── MysqlDialectProperties.java
│   │           │                       │   ├── OracleDialectProperties.java
│   │           │                       │   ├── PostgresqlDialectProperties.java
│   │           │                       │   └── TestUtils.java
│   │           │                       ├── druid/
│   │           │                       │   ├── SerializationUtilsTest.java
│   │           │                       │   ├── SqlUtilsTest.java
│   │           │                       │   └── SqlUtilsTest2.java
│   │           │                       ├── dto/
│   │           │                       │   └── TestDTO.java
│   │           │                       ├── mybatis/
│   │           │                       │   └── MybatisGeneratorTest.java
│   │           │                       └── sql/
│   │           │                           └── DbhubJdbcTemplateTest.java
│   │           └── resources/
│   │               └── logback-test-spring.xml
│   ├── chat2db-server-test/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── test/
│   │           ├── java/
│   │           │   └── ai/
│   │           │       └── chat2db/
│   │           │           └── server/
│   │           │               └── test/
│   │           │                   ├── common/
│   │           │                   │   └── BaseTest.java
│   │           │                   ├── domain/
│   │           │                   │   └── data/
│   │           │                   │       ├── service/
│   │           │                   │       │   ├── ConfigServiceTest.java
│   │           │                   │       │   ├── ConsoleOperationsTest.java
│   │           │                   │       │   ├── DatabaseOperationsTest.java
│   │           │                   │       │   ├── ExampleOperationsTest.java
│   │           │                   │       │   ├── JdbcOperationsTest.java
│   │           │                   │       │   ├── SQLExecutorOperationsTest.java
│   │           │                   │       │   ├── TableOperationsTest.java
│   │           │                   │       │   └── dialect/
│   │           │                   │       │       ├── ClickHouseDialectProperties.java
│   │           │                   │       │       ├── DialectProperties.java
│   │           │                   │       │       ├── H2DialectProperties.java
│   │           │                   │       │       ├── MysqlDialectProperties.java
│   │           │                   │       │       ├── OracleDialectProperties.java
│   │           │                   │       │       ├── PostgresqlDialectProperties.java
│   │           │                   │       │       ├── SQLITEDialectProperties.java
│   │           │                   │       │       └── SQLServerDialectProperties.java
│   │           │                   │       └── utils/
│   │           │                   │           └── TestUtils.java
│   │           │                   └── temp/
│   │           │                       ├── HttpTest.java
│   │           │                       ├── SQLParseTest.java
│   │           │                       ├── SqlTest.java
│   │           │                       ├── TempTest.java
│   │           │                       └── UserTest.java
│   │           └── resources/
│   │               ├── h2/
│   │               │   ├── init.sql
│   │               │   ├── init_close.sql
│   │               │   └── init_transaction.sql
│   │               └── logback-test-spring.xml
│   ├── chat2db-server-tools/
│   │   ├── chat2db-server-tools-base/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── tools/
│   │   │                               └── base/
│   │   │                                   ├── constant/
│   │   │                                   │   ├── EasyToolsConstant.java
│   │   │                                   │   └── SymbolConstant.java
│   │   │                                   ├── enums/
│   │   │                                   │   ├── BaseEnum.java
│   │   │                                   │   ├── DataSourceTypeEnum.java
│   │   │                                   │   ├── DeletedIdEnum.java
│   │   │                                   │   ├── OperationEnum.java
│   │   │                                   │   ├── OrderByDirectionEnum.java
│   │   │                                   │   ├── StatusEnum.java
│   │   │                                   │   ├── SystemEnvironmentEnum.java
│   │   │                                   │   ├── WhiteListTypeEnum.java
│   │   │                                   │   └── YesOrNoEnum.java
│   │   │                                   ├── excption/
│   │   │                                   │   ├── BusinessException.java
│   │   │                                   │   └── SystemException.java
│   │   │                                   ├── handler/
│   │   │                                   │   └── EasyCallBackHandler.java
│   │   │                                   └── wrapper/
│   │   │                                       ├── Result.java
│   │   │                                       ├── Traceable.java
│   │   │                                       ├── param/
│   │   │                                       │   ├── OrderBy.java
│   │   │                                       │   ├── OrderCondition.java
│   │   │                                       │   ├── PageQueryParam.java
│   │   │                                       │   └── QueryParam.java
│   │   │                                       ├── request/
│   │   │                                       │   └── PageQueryRequest.java
│   │   │                                       └── result/
│   │   │                                           ├── ActionResult.java
│   │   │                                           ├── DataResult.java
│   │   │                                           ├── ListResult.java
│   │   │                                           ├── PageResult.java
│   │   │                                           └── web/
│   │   │                                               └── WebPageResult.java
│   │   ├── chat2db-server-tools-common/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── tools/
│   │   │                               └── common/
│   │   │                                   ├── config/
│   │   │                                   │   ├── Chat2dbProperties.java
│   │   │                                   │   └── GlobalDict.java
│   │   │                                   ├── enums/
│   │   │                                   │   └── ModeEnum.java
│   │   │                                   ├── exception/
│   │   │                                   │   ├── ConnectionException.java
│   │   │                                   │   ├── DataAlreadyExistsBusinessException.java
│   │   │                                   │   ├── DataNotFoundException.java
│   │   │                                   │   ├── NeedLoggedInBusinessException.java
│   │   │                                   │   ├── ParamBusinessException.java
│   │   │                                   │   ├── PermissionDeniedBusinessException.java
│   │   │                                   │   └── RedirectBusinessException.java
│   │   │                                   ├── model/
│   │   │                                   │   ├── ConfigJson.java
│   │   │                                   │   ├── Context.java
│   │   │                                   │   ├── EasyLambdaQueryWrapper.java
│   │   │                                   │   ├── IntegerWrapper.java
│   │   │                                   │   └── LoginUser.java
│   │   │                                   └── util/
│   │   │                                       ├── ConfigUtils.java
│   │   │                                       ├── ContextUtils.java
│   │   │                                       ├── EasyBooleanUtils.java
│   │   │                                       ├── EasyCollectionUtils.java
│   │   │                                       ├── EasyEnumUtils.java
│   │   │                                       ├── EasyIntegerUtils.java
│   │   │                                       ├── EasyOptionalUtils.java
│   │   │                                       ├── EasySqlUtils.java
│   │   │                                       ├── EasyStringUtils.java
│   │   │                                       ├── I18nUtils.java
│   │   │                                       └── LogUtils.java
│   │   └── pom.xml
│   ├── chat2db-server-web/
│   │   ├── chat2db-server-admin-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── admin/
│   │   │                               └── api/
│   │   │                                   └── controller/
│   │   │                                       ├── common/
│   │   │                                       │   ├── CommonAdminController.java
│   │   │                                       │   ├── converter/
│   │   │                                       │   │   └── CommonAdminConverter.java
│   │   │                                       │   ├── request/
│   │   │                                       │   │   └── TeamUserPageQueryRequest.java
│   │   │                                       │   └── vo/
│   │   │                                       │       └── TeamUserListVO.java
│   │   │                                       ├── datasource/
│   │   │                                       │   ├── DataSourceAccessAdminController.java
│   │   │                                       │   ├── DataSourceAdminController.java
│   │   │                                       │   ├── converter/
│   │   │                                       │   │   ├── DataSourceAccessAdminConverter.java
│   │   │                                       │   │   └── DataSourceAdminConverter.java
│   │   │                                       │   ├── request/
│   │   │                                       │   │   ├── DataSourceAccessBatchCreateRequest.java
│   │   │                                       │   │   ├── DataSourceAccessObjectRequest.java
│   │   │                                       │   │   ├── DataSourceAccessPageQueryRequest.java
│   │   │                                       │   │   ├── DataSourceCloneRequest.java
│   │   │                                       │   │   ├── DataSourceCreateRequest.java
│   │   │                                       │   │   └── DataSourceUpdateRequest.java
│   │   │                                       │   └── vo/
│   │   │                                       │       ├── DataSourceAccessObjectVO.java
│   │   │                                       │       ├── DataSourceAccessPageQueryVO.java
│   │   │                                       │       ├── DataSourcePageQueryVO.java
│   │   │                                       │       └── SimpleDataSourceVO.java
│   │   │                                       ├── team/
│   │   │                                       │   ├── TeamAdminController.java
│   │   │                                       │   ├── TeamDataSourceAdminController.java
│   │   │                                       │   ├── TeamUserAdminController.java
│   │   │                                       │   ├── converter/
│   │   │                                       │   │   ├── TeamAdminConverter.java
│   │   │                                       │   │   ├── TeamDataSourcesAdminConverter.java
│   │   │                                       │   │   └── TeamUserAdminConverter.java
│   │   │                                       │   ├── request/
│   │   │                                       │   │   ├── TeamCreateRequest.java
│   │   │                                       │   │   ├── TeamDataSourceBatchCreateRequest.java
│   │   │                                       │   │   ├── TeamPageCommonQueryRequest.java
│   │   │                                       │   │   ├── TeamUpdateRequest.java
│   │   │                                       │   │   └── TeamUserBatchCreateRequest.java
│   │   │                                       │   └── vo/
│   │   │                                       │       ├── SimpleTeamVO.java
│   │   │                                       │       ├── TeamDataSourcePageQueryVO.java
│   │   │                                       │       ├── TeamPageQueryVO.java
│   │   │                                       │       └── TeamUserPageQueryVO.java
│   │   │                                       └── user/
│   │   │                                           ├── UserAdminController.java
│   │   │                                           ├── UserDataSourceAdminController.java
│   │   │                                           ├── UserTeamAdminController.java
│   │   │                                           ├── converter/
│   │   │                                           │   ├── UserAdminConverter.java
│   │   │                                           │   ├── UserDataSourcesAdminConverter.java
│   │   │                                           │   └── UserTeamAdminConverter.java
│   │   │                                           ├── request/
│   │   │                                           │   ├── UserCreateRequest.java
│   │   │                                           │   ├── UserDataSourceBatchCreateRequest.java
│   │   │                                           │   ├── UserPageCommonQueryRequest.java
│   │   │                                           │   ├── UserTeamBatchCreateRequest.java
│   │   │                                           │   └── UserUpdateRequest.java
│   │   │                                           └── vo/
│   │   │                                               ├── SimpleUserVO.java
│   │   │                                               ├── UserDataSourcePageQueryVO.java
│   │   │                                               ├── UserPageQueryVO.java
│   │   │                                               └── UserTeamPageQueryVO.java
│   │   ├── chat2db-server-common-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ai/
│   │   │                   └── chat2db/
│   │   │                       └── server/
│   │   │                           └── common/
│   │   │                               └── api/
│   │   │                                   └── controller/
│   │   │                                       ├── CommonCommonController.java
│   │   │                                       ├── converter/
│   │   │                                       │   └── EnvironmentCommonConverter.java
│   │   │                                       ├── request/
│   │   │                                       │   ├── CommonPageQueryRequest.java
│   │   │                                       │   └── CommonQueryRequest.java
│   │   │                                       └── vo/
│   │   │                                           ├── SimpleEnvironmentVO.java
│   │   │                                           └── SimpleUserVO.java
│   │   ├── chat2db-server-web-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ai/
│   │   │           │       └── chat2db/
│   │   │           │           └── server/
│   │   │           │               └── web/
│   │   │           │                   └── api/
│   │   │           │                       ├── aspect/
│   │   │           │                       │   ├── ConnectionInfoAspect.java
│   │   │           │                       │   └── ConnectionInfoHandler.java
│   │   │           │                       ├── controller/
│   │   │           │                       │   ├── PageController.java
│   │   │           │                       │   ├── ai/
│   │   │           │                       │   │   ├── AiConfigController.java
│   │   │           │                       │   │   ├── ChatController.java
│   │   │           │                       │   │   ├── DocParser/
│   │   │           │                       │   │   │   ├── AbstractParser.java
│   │   │           │                       │   │   │   └── PdfParse.java
│   │   │           │                       │   │   ├── EmbeddingController.java
│   │   │           │                       │   │   ├── KnowledgeController.java
│   │   │           │                       │   │   ├── TextGenerationController.java
│   │   │           │                       │   │   ├── azure/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── AzureOpenAIClient.java
│   │   │           │                       │   │   │   │   └── AzureOpenAiStreamClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── AzureHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── AzureOpenAIEventSourceListener.java
│   │   │           │                       │   │   │   ├── model/
│   │   │           │                       │   │   │   │   ├── AzureChatChoice.java
│   │   │           │                       │   │   │   │   ├── AzureChatCompletions.java
│   │   │           │                       │   │   │   │   ├── AzureChatCompletionsOptions.java
│   │   │           │                       │   │   │   │   ├── AzureChatMessage.java
│   │   │           │                       │   │   │   │   ├── AzureChatRole.java
│   │   │           │                       │   │   │   │   ├── AzureChoice.java
│   │   │           │                       │   │   │   │   ├── AzureCompletions.java
│   │   │           │                       │   │   │   │   ├── AzureCompletionsFinishReason.java
│   │   │           │                       │   │   │   │   ├── AzureCompletionsLogProbabilityModel.java
│   │   │           │                       │   │   │   │   ├── AzureCompletionsUsage.java
│   │   │           │                       │   │   │   │   └── AzureExpandableStringEnum.java
│   │   │           │                       │   │   │   └── util/
│   │   │           │                       │   │   │       └── AzureReflectionUtils.java
│   │   │           │                       │   │   ├── baichuan/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── BaichuanAIClient.java
│   │   │           │                       │   │   │   │   └── BaichuanAIStreamClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── BaichuanHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── BaichuanChatAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── BaichuanChatCompletions.java
│   │   │           │                       │   │   │       ├── BaichuanChatCompletionsOptions.java
│   │   │           │                       │   │   │       ├── BaichuanChatCompletionsUsage.java
│   │   │           │                       │   │   │       ├── BaichuanChatData.java
│   │   │           │                       │   │   │       └── BaichuanChatMessage.java
│   │   │           │                       │   │   ├── chat2db/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── Chat2DBAIStreamClient.java
│   │   │           │                       │   │   │   │   └── Chat2dbAIClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── Chat2dbHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   └── listener/
│   │   │           │                       │   │   │       └── Chat2dbAIEventSourceListener.java
│   │   │           │                       │   │   ├── claude/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── ClaudeAIClient.java
│   │   │           │                       │   │   │   │   └── ClaudeAiStreamClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── ClaudeHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── ClaudeAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── ClaudeChatCompletionsOptions.java
│   │   │           │                       │   │   │       ├── ClaudeChatMessage.java
│   │   │           │                       │   │   │       ├── ClaudeCompletionResponse.java
│   │   │           │                       │   │   │       └── ClaudeMessageLimit.java
│   │   │           │                       │   │   ├── config/
│   │   │           │                       │   │   │   └── LocalCache.java
│   │   │           │                       │   │   ├── converter/
│   │   │           │                       │   │   │   └── ChatConverter.java
│   │   │           │                       │   │   ├── enums/
│   │   │           │                       │   │   │   ├── GptVersionType.java
│   │   │           │                       │   │   │   └── PromptType.java
│   │   │           │                       │   │   ├── fastchat/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── FastChatAIClient.java
│   │   │           │                       │   │   │   │   ├── FastChatAIStreamClient.java
│   │   │           │                       │   │   │   │   └── FastChatOpenAiApi.java
│   │   │           │                       │   │   │   ├── embeddings/
│   │   │           │                       │   │   │   │   ├── FastChatEmbedding.java
│   │   │           │                       │   │   │   │   ├── FastChatEmbeddingResponse.java
│   │   │           │                       │   │   │   │   └── FastChatItem.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── FastChatHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── FastChatAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── FastChatChoice.java
│   │   │           │                       │   │   │       ├── FastChatCompletions.java
│   │   │           │                       │   │   │       ├── FastChatCompletionsFinishReason.java
│   │   │           │                       │   │   │       ├── FastChatCompletionsOptions.java
│   │   │           │                       │   │   │       ├── FastChatCompletionsUsage.java
│   │   │           │                       │   │   │       ├── FastChatExpandableStringEnum.java
│   │   │           │                       │   │   │       ├── FastChatMessage.java
│   │   │           │                       │   │   │       └── FastChatRole.java
│   │   │           │                       │   │   ├── openai/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   └── OpenAIClient.java
│   │   │           │                       │   │   │   └── listener/
│   │   │           │                       │   │   │       └── OpenAIEventSourceListener.java
│   │   │           │                       │   │   ├── request/
│   │   │           │                       │   │   │   ├── ChatQueryRequest.java
│   │   │           │                       │   │   │   └── ChatRequest.java
│   │   │           │                       │   │   ├── response/
│   │   │           │                       │   │   │   ├── ChatChoice.java
│   │   │           │                       │   │   │   └── ChatCompletionResponse.java
│   │   │           │                       │   │   ├── rest/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── RestAIClient.java
│   │   │           │                       │   │   │   │   └── RestAIStreamClient.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── RestAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── RestAIChatCompletions.java
│   │   │           │                       │   │   │       └── RestAiCompletion.java
│   │   │           │                       │   │   ├── tongyi/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── TongyiChatAIClient.java
│   │   │           │                       │   │   │   │   └── TongyiChatAIStreamClient.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── TongyiChatAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       ├── TongyiChatCompletions.java
│   │   │           │                       │   │   │       ├── TongyiChatCompletionsOptions.java
│   │   │           │                       │   │   │       ├── TongyiChatCompletionsUsage.java
│   │   │           │                       │   │   │       ├── TongyiChatMessage.java
│   │   │           │                       │   │   │       └── TongyiChatOutput.java
│   │   │           │                       │   │   ├── wenxin/
│   │   │           │                       │   │   │   ├── client/
│   │   │           │                       │   │   │   │   ├── WenxinAIClient.java
│   │   │           │                       │   │   │   │   └── WenxinAIStreamClient.java
│   │   │           │                       │   │   │   ├── interceptor/
│   │   │           │                       │   │   │   │   └── AccessTokenInterceptor.java
│   │   │           │                       │   │   │   ├── listener/
│   │   │           │                       │   │   │   │   └── WenxinAIEventSourceListener.java
│   │   │           │                       │   │   │   └── model/
│   │   │           │                       │   │   │       └── WenxinChatCompletions.java
│   │   │           │                       │   │   └── zhipu/
│   │   │           │                       │   │       ├── client/
│   │   │           │                       │   │       │   ├── ZhipuChatAIClient.java
│   │   │           │                       │   │       │   └── ZhipuChatAIStreamClient.java
│   │   │           │                       │   │       ├── interceptor/
│   │   │           │                       │   │       │   └── ZhipuChatHeaderAuthorizationInterceptor.java
│   │   │           │                       │   │       ├── listener/
│   │   │           │                       │   │       │   └── ZhipuChatAIEventSourceListener.java
│   │   │           │                       │   │       ├── model/
│   │   │           │                       │   │       │   ├── ZhipuChatBody.java
│   │   │           │                       │   │       │   ├── ZhipuChatCompletions.java
│   │   │           │                       │   │       │   └── ZhipuChatCompletionsOptions.java
│   │   │           │                       │   │       └── util/
│   │   │           │                       │   │           └── ZhipuUtils.java
│   │   │           │                       │   ├── config/
│   │   │           │                       │   │   ├── ConfigController.java
│   │   │           │                       │   │   └── request/
│   │   │           │                       │   │       ├── AIConfigCreateRequest.java
│   │   │           │                       │   │       ├── AISystemConfigRequest.java
│   │   │           │                       │   │       └── SystemConfigRequest.java
│   │   │           │                       │   ├── dashboard/
│   │   │           │                       │   │   ├── ChartController.java
│   │   │           │                       │   │   ├── DashboardController.java
│   │   │           │                       │   │   ├── converter/
│   │   │           │                       │   │   │   ├── ChartWebConverter.java
│   │   │           │                       │   │   │   └── DashboardWebConverter.java
│   │   │           │                       │   │   ├── request/
│   │   │           │                       │   │   │   ├── ChartCreateRequest.java
│   │   │           │                       │   │   │   ├── ChartQueryRequest.java
│   │   │           │                       │   │   │   ├── ChartUpdateRequest.java
│   │   │           │                       │   │   │   ├── DashboardCreateRequest.java
│   │   │           │                       │   │   │   └── DashboardUpdateRequest.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       ├── ChartVO.java
│   │   │           │                       │   │       └── DashboardVO.java
│   │   │           │                       │   ├── data/
│   │   │           │                       │   │   └── source/
│   │   │           │                       │   │       ├── DataSourceController.java
│   │   │           │                       │   │       ├── converter/
│   │   │           │                       │   │       │   ├── DataSourceWebConverter.java
│   │   │           │                       │   │       │   └── SSHWebConverter.java
│   │   │           │                       │   │       ├── request/
│   │   │           │                       │   │       │   ├── ConsoleCloseRequest.java
│   │   │           │                       │   │       │   ├── ConsoleConnectRequest.java
│   │   │           │                       │   │       │   ├── DataSourceAttachRequest.java
│   │   │           │                       │   │       │   ├── DataSourceBaseRequest.java
│   │   │           │                       │   │       │   ├── DataSourceBaseRequestInfo.java
│   │   │           │                       │   │       │   ├── DataSourceCloneRequest.java
│   │   │           │                       │   │       │   ├── DataSourceCloseRequest.java
│   │   │           │                       │   │       │   ├── DataSourceConsoleRequestInfo.java
│   │   │           │                       │   │       │   ├── DataSourceCreateRequest.java
│   │   │           │                       │   │       │   ├── DataSourceQueryRequest.java
│   │   │           │                       │   │       │   ├── DataSourceTestRequest.java
│   │   │           │                       │   │       │   ├── DataSourceUpdateRequest.java
│   │   │           │                       │   │       │   └── SSHTestRequest.java
│   │   │           │                       │   │       └── vo/
│   │   │           │                       │   │           ├── DataSourceVO.java
│   │   │           │                       │   │           ├── DatabaseVO.java
│   │   │           │                       │   │           └── EnvVO.java
│   │   │           │                       │   ├── driver/
│   │   │           │                       │   │   ├── JdbcDriverController.java
│   │   │           │                       │   │   └── request/
│   │   │           │                       │   │       └── JdbcDriverRequest.java
│   │   │           │                       │   ├── ncx/
│   │   │           │                       │   │   ├── ConverterController.java
│   │   │           │                       │   │   ├── cipher/
│   │   │           │                       │   │   │   ├── CommonCipher.java
│   │   │           │                       │   │   │   ├── Navicat11Cipher.java
│   │   │           │                       │   │   │   └── Navicat12Cipher.java
│   │   │           │                       │   │   ├── dbeaver/
│   │   │           │                       │   │   │   ├── DBSValueEncryptor.java
│   │   │           │                       │   │   │   └── DefaultValueEncryptor.java
│   │   │           │                       │   │   ├── enums/
│   │   │           │                       │   │   │   ├── DataBaseType.java
│   │   │           │                       │   │   │   ├── ExportConstants.java
│   │   │           │                       │   │   │   └── VersionEnum.java
│   │   │           │                       │   │   ├── factory/
│   │   │           │                       │   │   │   └── CipherFactory.java
│   │   │           │                       │   │   ├── service/
│   │   │           │                       │   │   │   ├── ConverterService.java
│   │   │           │                       │   │   │   └── impl/
│   │   │           │                       │   │   │       └── ConverterServiceImpl.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       └── UploadVO.java
│   │   │           │                       │   ├── operation/
│   │   │           │                       │   │   ├── log/
│   │   │           │                       │   │   │   ├── OperationLogController.java
│   │   │           │                       │   │   │   ├── converter/
│   │   │           │                       │   │   │   │   └── OperationLogWebConverter.java
│   │   │           │                       │   │   │   ├── request/
│   │   │           │                       │   │   │   │   ├── OperationLogCreateRequest.java
│   │   │           │                       │   │   │   │   └── OperationLogQueryRequest.java
│   │   │           │                       │   │   │   └── vo/
│   │   │           │                       │   │   │       └── OperationLogVO.java
│   │   │           │                       │   │   └── saved/
│   │   │           │                       │   │       ├── OperationSavedController.java
│   │   │           │                       │   │       ├── converter/
│   │   │           │                       │   │       │   └── OperationWebConverter.java
│   │   │           │                       │   │       ├── request/
│   │   │           │                       │   │       │   ├── BatchTabCloseRequest.java
│   │   │           │                       │   │       │   ├── OperationCreateRequest.java
│   │   │           │                       │   │       │   ├── OperationQueryRequest.java
│   │   │           │                       │   │       │   └── OperationUpdateRequest.java
│   │   │           │                       │   │       └── vo/
│   │   │           │                       │   │           └── OperationVO.java
│   │   │           │                       │   ├── pin/
│   │   │           │                       │   │   ├── PinController.java
│   │   │           │                       │   │   ├── converter/
│   │   │           │                       │   │   │   └── PinWebConverter.java
│   │   │           │                       │   │   └── request/
│   │   │           │                       │   │       └── PinTableRequest.java
│   │   │           │                       │   ├── rdb/
│   │   │           │                       │   │   ├── DatabaseController.java
│   │   │           │                       │   │   ├── FunctionController.java
│   │   │           │                       │   │   ├── ProcedureController.java
│   │   │           │                       │   │   ├── RdbDdlController.java
│   │   │           │                       │   │   ├── RdbDmlController.java
│   │   │           │                       │   │   ├── RdbDmlExportController.java
│   │   │           │                       │   │   ├── RdbDocController.java
│   │   │           │                       │   │   ├── SchemaController.java
│   │   │           │                       │   │   ├── SequenceController.java
│   │   │           │                       │   │   ├── TableController.java
│   │   │           │                       │   │   ├── TriggerController.java
│   │   │           │                       │   │   ├── ViewController.java
│   │   │           │                       │   │   ├── converter/
│   │   │           │                       │   │   │   ├── DatabaseConverter.java
│   │   │           │                       │   │   │   ├── FunctionConverter.java
│   │   │           │                       │   │   │   ├── ProcedureConverter.java
│   │   │           │                       │   │   │   └── RdbWebConverter.java
│   │   │           │                       │   │   ├── data/
│   │   │           │                       │   │   │   ├── BaseDataExporter.java
│   │   │           │                       │   │   │   ├── BaseDataImporter.java
│   │   │           │                       │   │   │   ├── BaseExcelExporter.java
│   │   │           │                       │   │   │   ├── BaseExcelImporter.java
│   │   │           │                       │   │   │   ├── DataExportStrategy.java
│   │   │           │                       │   │   │   ├── DataImportStrategy.java
│   │   │           │                       │   │   │   ├── csv/
│   │   │           │                       │   │   │   │   ├── CsvDataExporter.java
│   │   │           │                       │   │   │   │   └── CsvDataImporter.java
│   │   │           │                       │   │   │   ├── factory/
│   │   │           │                       │   │   │   │   ├── DataExportFactory.java
│   │   │           │                       │   │   │   │   └── DataImportFactory.java
│   │   │           │                       │   │   │   ├── json/
│   │   │           │                       │   │   │   │   ├── JsonDataExporter.java
│   │   │           │                       │   │   │   │   └── JsonDataImporter.java
│   │   │           │                       │   │   │   ├── service/
│   │   │           │                       │   │   │   │   ├── DatabaseDataService.java
│   │   │           │                       │   │   │   │   └── impl/
│   │   │           │                       │   │   │   │       └── DatabaseDataImpl.java
│   │   │           │                       │   │   │   ├── sql/
│   │   │           │                       │   │   │   │   └── SqlDataExporter.java
│   │   │           │                       │   │   │   ├── task/
│   │   │           │                       │   │   │   │   ├── TaskManager.java
│   │   │           │                       │   │   │   │   └── TaskState.java
│   │   │           │                       │   │   │   ├── xls/
│   │   │           │                       │   │   │   │   ├── XlsDataExporter.java
│   │   │           │                       │   │   │   │   └── XlsDataImporter.java
│   │   │           │                       │   │   │   └── xlsx/
│   │   │           │                       │   │   │       ├── XlsxDataExporter.java
│   │   │           │                       │   │   │       └── XlsxDataImporter.java
│   │   │           │                       │   │   ├── doc/
│   │   │           │                       │   │   │   ├── DatabaseExportService.java
│   │   │           │                       │   │   │   ├── adaptive/
│   │   │           │                       │   │   │   │   ├── CustomCellWriteHeightConfig.java
│   │   │           │                       │   │   │   │   └── CustomCellWriteWidthConfig.java
│   │   │           │                       │   │   │   ├── conf/
│   │   │           │                       │   │   │   │   └── ExportOptions.java
│   │   │           │                       │   │   │   ├── constant/
│   │   │           │                       │   │   │   │   ├── CommonConstant.java
│   │   │           │                       │   │   │   │   └── PatternConstant.java
│   │   │           │                       │   │   │   ├── event/
│   │   │           │                       │   │   │   │   └── TemplateEvent.java
│   │   │           │                       │   │   │   ├── export/
│   │   │           │                       │   │   │   │   ├── ExportExcelService.java
│   │   │           │                       │   │   │   │   ├── ExportHtmlService.java
│   │   │           │                       │   │   │   │   ├── ExportMarkdownService.java
│   │   │           │                       │   │   │   │   ├── ExportPdfService.java
│   │   │           │                       │   │   │   │   └── ExportWordSuperService.java
│   │   │           │                       │   │   │   ├── merge/
│   │   │           │                       │   │   │   │   └── MyMergeExcel.java
│   │   │           │                       │   │   │   └── style/
│   │   │           │                       │   │   │       └── CustomExcelStyle.java
│   │   │           │                       │   │   ├── factory/
│   │   │           │                       │   │   │   └── ExportServiceFactory.java
│   │   │           │                       │   │   ├── request/
│   │   │           │                       │   │   │   ├── ColumnRequest.java
│   │   │           │                       │   │   │   ├── DataExportRequest.java
│   │   │           │                       │   │   │   ├── DatabaseCreateRequest.java
│   │   │           │                       │   │   │   ├── DatabaseExportDataRequest.java
│   │   │           │                       │   │   │   ├── DatabaseExportRequest.java
│   │   │           │                       │   │   │   ├── DdlCountRequest.java
│   │   │           │                       │   │   │   ├── DdlExportRequest.java
│   │   │           │                       │   │   │   ├── DdlRequest.java
│   │   │           │                       │   │   │   ├── DmlRequest.java
│   │   │           │                       │   │   │   ├── DmlSqlCopyRequest.java
│   │   │           │                       │   │   │   ├── DmlTableRequest.java
│   │   │           │                       │   │   │   ├── FunctionDetailRequest.java
│   │   │           │                       │   │   │   ├── FunctionPageRequest.java
│   │   │           │                       │   │   │   ├── FunctionUpdateRequest.java
│   │   │           │                       │   │   │   ├── GroupByRequest.java
│   │   │           │                       │   │   │   ├── IndexRequest.java
│   │   │           │                       │   │   │   ├── NewTableSqlRequest.java
│   │   │           │                       │   │   │   ├── OrderByRequest.java
│   │   │           │                       │   │   │   ├── ProcedureDetailRequest.java
│   │   │           │                       │   │   │   ├── ProcedurePageRequest.java
│   │   │           │                       │   │   │   ├── ProcedureUpdateRequest.java
│   │   │           │                       │   │   │   ├── SchemaCreateRequest.java
│   │   │           │                       │   │   │   ├── SchemaQueryRequest.java
│   │   │           │                       │   │   │   ├── SelectResultUpdateRequest.java
│   │   │           │                       │   │   │   ├── SequenceBriefQueryRequest.java
│   │   │           │                       │   │   │   ├── SequenceDeleteRequest.java
│   │   │           │                       │   │   │   ├── SequenceDetailQueryRequest.java
│   │   │           │                       │   │   │   ├── SequenceModifySqlRequest.java
│   │   │           │                       │   │   │   ├── SequenceRequest.java
│   │   │           │                       │   │   │   ├── TableBriefQueryRequest.java
│   │   │           │                       │   │   │   ├── TableCreateDdlQueryRequest.java
│   │   │           │                       │   │   │   ├── TableDeleteRequest.java
│   │   │           │                       │   │   │   ├── TableDetailQueryRequest.java
│   │   │           │                       │   │   │   ├── TableMilvusQueryRequest.java
│   │   │           │                       │   │   │   ├── TableModifySqlRequest.java
│   │   │           │                       │   │   │   ├── TableQueryRequest.java
│   │   │           │                       │   │   │   ├── TableRequest.java
│   │   │           │                       │   │   │   ├── TableUpdateDdlQueryRequest.java
│   │   │           │                       │   │   │   ├── TriggerDetailRequest.java
│   │   │           │                       │   │   │   ├── TriggerPageRequest.java
│   │   │           │                       │   │   │   ├── TypeQueryRequest.java
│   │   │           │                       │   │   │   ├── UpdateDatabaseRequest.java
│   │   │           │                       │   │   │   └── UpdateSchemaRequest.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       ├── ColumnVO.java
│   │   │           │                       │   │       ├── ExecuteResultVO.java
│   │   │           │                       │   │       ├── IndexColumnVO.java
│   │   │           │                       │   │       ├── IndexVO.java
│   │   │           │                       │   │       ├── KeyVO.java
│   │   │           │                       │   │       ├── MetaSchemaVO.java
│   │   │           │                       │   │       ├── SchemaVO.java
│   │   │           │                       │   │       ├── SequenceVO.java
│   │   │           │                       │   │       ├── SqlVO.java
│   │   │           │                       │   │       ├── TableVO.java
│   │   │           │                       │   │       └── ViewVO.java
│   │   │           │                       │   ├── redis/
│   │   │           │                       │   │   ├── RedisKeyManageController.java
│   │   │           │                       │   │   ├── RedisKeyValueManageController.java
│   │   │           │                       │   │   ├── request/
│   │   │           │                       │   │   │   ├── KeyCreateRequest.java
│   │   │           │                       │   │   │   ├── KeyDeleteRequest.java
│   │   │           │                       │   │   │   ├── KeyQueryRequest.java
│   │   │           │                       │   │   │   ├── KeyUpdateRequest.java
│   │   │           │                       │   │   │   ├── KeyValueManageRequest.java
│   │   │           │                       │   │   │   └── ValueUpdateRequest.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       └── KeyVO.java
│   │   │           │                       │   ├── sql/
│   │   │           │                       │   │   ├── SqlController.java
│   │   │           │                       │   │   └── request/
│   │   │           │                       │   │       └── SqlFormatRequest.java
│   │   │           │                       │   ├── system/
│   │   │           │                       │   │   ├── SystemController.java
│   │   │           │                       │   │   ├── util/
│   │   │           │                       │   │   │   └── SystemUtils.java
│   │   │           │                       │   │   └── vo/
│   │   │           │                       │   │       ├── AppVersionVO.java
│   │   │           │                       │   │       └── SystemVO.java
│   │   │           │                       │   ├── task/
│   │   │           │                       │   │   ├── ExportController.java
│   │   │           │                       │   │   ├── TaskController.java
│   │   │           │                       │   │   └── biz/
│   │   │           │                       │   │       └── TaskBizService.java
│   │   │           │                       │   └── user/
│   │   │           │                       │       ├── UserController.java
│   │   │           │                       │       ├── converter/
│   │   │           │                       │       │   └── UserWebConverter.java
│   │   │           │                       │       ├── request/
│   │   │           │                       │       │   ├── UserCreateRequest.java
│   │   │           │                       │       │   ├── UserQueryRequest.java
│   │   │           │                       │       │   └── UserUpdateRequest.java
│   │   │           │                       │       └── vo/
│   │   │           │                       │           └── UserVO.java
│   │   │           │                       ├── http/
│   │   │           │                       │   ├── GatewayClientService.java
│   │   │           │                       │   ├── model/
│   │   │           │                       │   │   ├── EsTableSchema.java
│   │   │           │                       │   │   ├── Knowledge.java
│   │   │           │                       │   │   └── TableSchema.java
│   │   │           │                       │   ├── request/
│   │   │           │                       │   │   ├── EsTableSchemaRequest.java
│   │   │           │                       │   │   ├── KnowledgeRequest.java
│   │   │           │                       │   │   ├── SqlExecuteHistoryCreateRequest.java
│   │   │           │                       │   │   ├── TableSchemaRequest.java
│   │   │           │                       │   │   └── WhiteListRequest.java
│   │   │           │                       │   └── response/
│   │   │           │                       │       ├── ApiKeyResponse.java
│   │   │           │                       │       ├── EsTableSchemaResponse.java
│   │   │           │                       │       ├── InviteQrCodeResponse.java
│   │   │           │                       │       ├── KnowledgeResponse.java
│   │   │           │                       │       ├── QrCodeResponse.java
│   │   │           │                       │       └── TableSchemaResponse.java
│   │   │           │                       ├── util/
│   │   │           │                       │   ├── AddToTopic.java
│   │   │           │                       │   ├── ApplicationContextUtil.java
│   │   │           │                       │   ├── FileUtils.java
│   │   │           │                       │   ├── StringUtils.java
│   │   │           │                       │   └── XMLUtils.java
│   │   │           │                       └── ws/
│   │   │           │                           ├── WsConfig.java
│   │   │           │                           ├── WsMessage.java
│   │   │           │                           ├── WsResult.java
│   │   │           │                           ├── WsServer.java
│   │   │           │                           └── WsService.java
│   │   │           └── resources/
│   │   │               └── template/
│   │   │                   ├── sub_template_diy.docx
│   │   │                   ├── template.html
│   │   │                   └── template_diy.docx
│   │   └── pom.xml
│   ├── chat2db-server-web-start/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── ai/
│   │           │       └── chat2db/
│   │           │           └── server/
│   │           │               └── web/
│   │           │                   └── start/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   ├── StdinReader.java
│   │           │                       │   ├── config/
│   │           │                       │   │   ├── AsyncContextRefreshedListener.java
│   │           │                       │   │   ├── Chat2dbForestConfiguration.java
│   │           │                       │   │   ├── Chat2dbWebMvcConfigurer.java
│   │           │                       │   │   ├── JarDownloadTask.java
│   │           │                       │   │   └── WebLogConfiguration.java
│   │           │                       │   ├── i18n/
│   │           │                       │   │   └── I18nConfig.java
│   │           │                       │   ├── interceptor/
│   │           │                       │   │   └── CorsFilter.java
│   │           │                       │   ├── listener/
│   │           │                       │   │   ├── DbhubTomcatConnectorCustomizer.java
│   │           │                       │   │   ├── FailedEventApplicationListener.java
│   │           │                       │   │   ├── ManageApplicationListener.java
│   │           │                       │   │   └── manage/
│   │           │                       │   │       ├── ManageMessage.java
│   │           │                       │   │       └── MessageTypeEnum.java
│   │           │                       │   ├── mybatis/
│   │           │                       │   │   └── MyBatisPlusConfig.java
│   │           │                       │   └── oauth/
│   │           │                       │       ├── SaLogForSlf4j.java
│   │           │                       │       └── SaTokenConfigure.java
│   │           │                       ├── controller/
│   │           │                       │   ├── oauth/
│   │           │                       │   │   ├── OauthController.java
│   │           │                       │   │   └── request/
│   │           │                       │   │       └── LoginRequest.java
│   │           │                       │   └── thymeleaf/
│   │           │                       │       └── ThymeleafController.java
│   │           │                       ├── exception/
│   │           │                       │   ├── EasyControllerExceptionHandler.java
│   │           │                       │   └── convertor/
│   │           │                       │       ├── BindExceptionConvertor.java
│   │           │                       │       ├── BusinessExceptionConvertor.java
│   │           │                       │       ├── DefaultExceptionConvertor.java
│   │           │                       │       ├── ExceptionConvertor.java
│   │           │                       │       ├── ExceptionConvertorUtils.java
│   │           │                       │       ├── MaxUploadSizeExceededExceptionConvertor.java
│   │           │                       │       ├── MethodArgumentNotValidExceptionConvertor.java
│   │           │                       │       ├── MethodArgumentTypeMismatchExceptionConvertor.java
│   │           │                       │       └── ParamExceptionConvertor.java
│   │           │                       └── log/
│   │           │                           ├── EasyLogSink.java
│   │           │                           ├── LogOncePerRequestFilter.java
│   │           │                           └── WebLog.java
│   │           └── resources/
│   │               ├── META-INF/
│   │               │   └── spring.factories
│   │               ├── application-dev.yml
│   │               ├── application-release.yml
│   │               ├── application-test.yml
│   │               ├── application.yml
│   │               ├── i18n/
│   │               │   ├── messages.properties
│   │               │   ├── messages_en_US.properties
│   │               │   └── messages_zh_CN.properties
│   │               ├── logback-spring.xml
│   │               └── thymeleaf/
│   │                   └── template.html
│   ├── chat2db-spi/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── ai/
│   │                   └── chat2db/
│   │                       └── spi/
│   │                           ├── ColumnBuilder.java
│   │                           ├── CommandExecutor.java
│   │                           ├── DBManage.java
│   │                           ├── MetaData.java
│   │                           ├── Plugin.java
│   │                           ├── SqlBuilder.java
│   │                           ├── ValueHandler.java
│   │                           ├── ValueProcessor.java
│   │                           ├── config/
│   │                           │   ├── DBConfig.java
│   │                           │   └── DriverConfig.java
│   │                           ├── enums/
│   │                           │   ├── CellTypeEnum.java
│   │                           │   ├── CollationEnum.java
│   │                           │   ├── DataTypeEnum.java
│   │                           │   ├── DmlType.java
│   │                           │   ├── EditStatus.java
│   │                           │   ├── IndexTypeEnum.java
│   │                           │   └── SqlTypeEnum.java
│   │                           ├── jdbc/
│   │                           │   ├── BaseValueProcessor.java
│   │                           │   ├── DefaultDBManage.java
│   │                           │   ├── DefaultMetaService.java
│   │                           │   ├── DefaultSqlBuilder.java
│   │                           │   ├── DefaultValueHandler.java
│   │                           │   └── DefaultValueProcessor.java
│   │                           ├── model/
│   │                           │   ├── AsyncCall.java
│   │                           │   ├── AsyncContext.java
│   │                           │   ├── Cell.java
│   │                           │   ├── Charset.java
│   │                           │   ├── Collation.java
│   │                           │   ├── ColumnType.java
│   │                           │   ├── Command.java
│   │                           │   ├── CreateTableSql.java
│   │                           │   ├── DataSourceConnect.java
│   │                           │   ├── DataType.java
│   │                           │   ├── Database.java
│   │                           │   ├── DefaultValue.java
│   │                           │   ├── DriverEntry.java
│   │                           │   ├── EngineType.java
│   │                           │   ├── ExecuteResult.java
│   │                           │   ├── Function.java
│   │                           │   ├── Header.java
│   │                           │   ├── IndexType.java
│   │                           │   ├── JDBCDataValue.java
│   │                           │   ├── KeyValue.java
│   │                           │   ├── MetaSchema.java
│   │                           │   ├── OrderBy.java
│   │                           │   ├── Procedure.java
│   │                           │   ├── QueryResult.java
│   │                           │   ├── ResultOperation.java
│   │                           │   ├── SQLDataValue.java
│   │                           │   ├── SSHInfo.java
│   │                           │   ├── SSLInfo.java
│   │                           │   ├── Schema.java
│   │                           │   ├── Sequence.java
│   │                           │   ├── ShowDatabaseResult.java
│   │                           │   ├── SimpleColumn.java
│   │                           │   ├── SimpleSequence.java
│   │                           │   ├── SimpleTable.java
│   │                           │   ├── Sql.java
│   │                           │   ├── Table.java
│   │                           │   ├── TableColumn.java
│   │                           │   ├── TableIndex.java
│   │                           │   ├── TableIndexColumn.java
│   │                           │   ├── TableMeta.java
│   │                           │   ├── Trigger.java
│   │                           │   └── Type.java
│   │                           ├── sql/
│   │                           │   ├── Chat2DBContext.java
│   │                           │   ├── ConnectInfo.java
│   │                           │   ├── ConnectionPool.java
│   │                           │   ├── DocumentUtils.java
│   │                           │   ├── IDriverManager.java
│   │                           │   ├── MongExtendedJsonObjectIdConverter.java
│   │                           │   ├── ResultSetConsumer.java
│   │                           │   ├── ResultSetFunction.java
│   │                           │   ├── SQLExecutor.java
│   │                           │   └── SqlParseUtils.java
│   │                           ├── ssh/
│   │                           │   ├── MyUserInfo.java
│   │                           │   └── SSHManager.java
│   │                           └── util/
│   │                               ├── ExceptionUtils.java
│   │                               ├── FileUtils.java
│   │                               ├── Holder.java
│   │                               ├── JdbcJarUtils.java
│   │                               ├── JdbcUtils.java
│   │                               ├── LexerFactories.java
│   │                               ├── LexerFactory.java
│   │                               ├── LexerTokenDefinition.java
│   │                               ├── LexerTokenDefinitions.java
│   │                               ├── OBOraclePLLexerDefinition.java
│   │                               ├── OBOraclePLLexerFactory.java
│   │                               ├── OracleLexerDefinition.java
│   │                               ├── OracleLexerFactory.java
│   │                               ├── ResultSetUtils.java
│   │                               ├── SortUtils.java
│   │                               ├── SplitSqlString.java
│   │                               ├── SqlSplitProcessor.java
│   │                               ├── SqlSplitter.java
│   │                               ├── SqlStatementIterator.java
│   │                               ├── SqlUtils.java
│   │                               └── TableUtils.java
│   ├── lombok.config
│   └── pom.xml
├── docker/
│   ├── Dockerfile
│   ├── docker-build.sh
│   ├── docker-compose-start.sh
│   ├── docker-compose.yml
│   ├── docker-start.sh
│   └── test/
│       ├── docker-compose.yml
│       ├── redis/
│       │   ├── data/
│       │   │   └── dump.rdb
│       │   └── redis.conf
│       ├── start.sh
│       └── stop.sh
├── document/
│   ├── git/
│   │   └── git.sh
│   ├── sql/
│   │   └── mysql.sql
│   └── style/
│       └── Alibaba_CodeStyle.xml
└── script/
    └── local-client-build.sh
Download .txt
Showing preview only (678K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5801 symbols across 1199 files)

FILE: chat2db-client/src/assets/font/iconfont.js
  function p (line 1) | function p(){v||(v=!0,i())}
  function s (line 1) | function s(){try{o.documentElement.doScroll("left")}catch(a){return void...

FILE: chat2db-client/src/blocks/AppTitleBar/index.tsx
  type IProps (line 8) | interface IProps {

FILE: chat2db-client/src/blocks/CreateConnection/index.tsx
  type IEditConnectionDetail (line 15) | type IEditConnectionDetail = IConnectionDetails | null | Pick<IConnectio...
  type IProps (line 17) | interface IProps {
  function handleCreateConnections (line 36) | function handleCreateConnections(database: IDatabase) {

FILE: chat2db-client/src/blocks/DatabaseTableEditor/BaseInfo/index.tsx
  type IBaseInfoRef (line 10) | interface IBaseInfoRef {
  type IProps (line 14) | interface IProps {
  function getBaseInfo (line 33) | function getBaseInfo(): IBaseInfo {

FILE: chat2db-client/src/blocks/DatabaseTableEditor/ColumnList/index.tsx
  type RowProps (line 18) | interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
  type IProps (line 22) | interface IProps {}
  type IEditingConfig (line 25) | interface IEditingConfig extends IColumnTypes {
  type IColumnListRef (line 30) | interface IColumnListRef {
  function getColumnListInfo (line 465) | function getColumnListInfo(): IColumnItemNew[] {

FILE: chat2db-client/src/blocks/DatabaseTableEditor/IncludeCol/index.tsx
  type IProps (line 25) | interface IProps {
  type IIncludeColRef (line 51) | interface IIncludeColRef {

FILE: chat2db-client/src/blocks/DatabaseTableEditor/IndexList/index.tsx
  type IProps (line 28) | interface IProps {}
  type IIndexListInfo (line 30) | type IIndexListInfo = IIndexItem[];
  type IIndexListRef (line 32) | interface IIndexListRef {
  type RowProps (line 47) | interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
  function getIndexListInfo (line 174) | function getIndexListInfo(): IIndexListInfo {

FILE: chat2db-client/src/blocks/DatabaseTableEditor/RealTimeSQL/index.tsx
  type IProps (line 5) | interface IProps {

FILE: chat2db-client/src/blocks/DatabaseTableEditor/index.tsx
  type IProps (line 15) | interface IProps {
  type ITabItem (line 26) | interface ITabItem {
  type IContext (line 33) | interface IContext extends IProps {
  type IOption (line 43) | interface IOption {
  type IColumnTypesOption (line 49) | interface IColumnTypesOption extends IColumnTypes {
  type IDatabaseSupportField (line 53) | interface IDatabaseSupportField {
  function changeTab (line 111) | function changeTab(item: ITabItem) {
  function submit (line 206) | function submit() {

FILE: chat2db-client/src/blocks/SequenceEditor/BaseInfo/index.tsx
  type ISequenceInfoRef (line 10) | interface ISequenceInfoRef {
  type IProps (line 14) | interface IProps {
  function getSequenceInfo (line 49) | function getSequenceInfo(): ISequenceInfo {
  function onChange (line 53) | function onChange(checked: boolean) {
  function handleChange (line 59) | function handleChange(value: string) {
  function rolnameChange (line 64) | function rolnameChange(value: string) {

FILE: chat2db-client/src/blocks/SequenceEditor/IncludeCol/index.tsx
  type IProps (line 25) | interface IProps {
  type IIncludeColRef (line 51) | interface IIncludeColRef {

FILE: chat2db-client/src/blocks/SequenceEditor/RealTimeSQL/index.tsx
  type IProps (line 5) | interface IProps {

FILE: chat2db-client/src/blocks/SequenceEditor/index.tsx
  type IProps (line 14) | interface IProps {
  type IContext (line 25) | interface IContext extends IProps {
  type IOption (line 32) | interface IOption {
  type IColumnTypesOption (line 38) | interface IColumnTypesOption extends IColumnTypes {
  type IDatabaseSupportField (line 42) | interface IDatabaseSupportField {
  function submit (line 104) | function submit() {

FILE: chat2db-client/src/blocks/Setting/About/index.tsx
  type IProps (line 16) | interface IProps {
  function AboutUs (line 22) | function AboutUs(props: IProps) {

FILE: chat2db-client/src/blocks/Setting/AiSetting/aiTypeConfig.ts
  type IAiConfigBooleans (line 5) | type IAiConfigBooleans = {

FILE: chat2db-client/src/blocks/Setting/AiSetting/index.tsx
  type IProps (line 13) | interface IProps {
  function capitalizeFirstLetter (line 18) | function capitalizeFirstLetter(string) {
  function SettingAI (line 23) | function SettingAI(props: IProps) {

FILE: chat2db-client/src/blocks/Setting/BaseSetting/index.tsx
  function BaseSetting (line 94) | function BaseSetting() {

FILE: chat2db-client/src/blocks/Setting/ProxySetting/index.tsx
  function ProxyBody (line 9) | function ProxyBody() {

FILE: chat2db-client/src/blocks/Setting/UpdateDetection/index.tsx
  type UpdatedStatusEnum (line 10) | enum UpdatedStatusEnum {
  type IProps (line 23) | interface IProps {
  type IUpdateDetectionRef (line 29) | interface IUpdateDetectionRef {
  constant INTERVAL_TIME (line 34) | const INTERVAL_TIME = 5000;
  constant MAX_TIMES (line 36) | const MAX_TIMES = 200;
  function checkUpdate (line 51) | function checkUpdate() {
  function isUpdateSuccess (line 105) | function isUpdateSuccess(_updateDetectionData) {

FILE: chat2db-client/src/blocks/Setting/index.tsx
  type IProps (line 17) | interface IProps {
  type IUpdateDetectionData (line 24) | interface IUpdateDetectionData extends ILatestVersion {
  function Setting (line 29) | function Setting(props: IProps) {

FILE: chat2db-client/src/blocks/Tree/hooks/useGetRightClickMenu.ts
  type IProps (line 28) | interface IProps {
  type IOperationColumnConfigItem (line 33) | interface IOperationColumnConfigItem {
  type IRightClickMenu (line 41) | interface IRightClickMenu {
  function excludeSomeOperation (line 91) | function excludeSomeOperation() {
  function excludeSomeOperation (line 462) | function excludeSomeOperation() {

FILE: chat2db-client/src/blocks/Tree/index.tsx
  type IProps (line 19) | interface IProps {
  type TreeNodeIProps (line 25) | interface TreeNodeIProps {
  type IContext (line 30) | interface IContext {
  function tranListToTreeData (line 55) | function tranListToTreeData(list:ITreeNode[], rootValue) {
  function searchTree (line 76) | function searchTree(treeData: ITreeNode[], searchValue: string): ITreeNo...
  function loadData (line 213) | function loadData(_props?: { refresh: boolean; pageNo: number; treeNodeD...

FILE: chat2db-client/src/blocks/Tree/treeConfig.tsx
  type ITreeConfig (line 8) | type ITreeConfig = Partial<{ [key in TreeNodeType]: ITreeConfigItem }>;
  type ITreeConfigItem (line 89) | interface ITreeConfigItem {

FILE: chat2db-client/src/blocks/Tree/treeStore.ts
  type ITreeStore (line 7) | interface ITreeStore {

FILE: chat2db-client/src/components/BrandLogo/index.tsx
  type IProps (line 6) | interface IProps extends React.DetailedHTMLProps<React.HTMLAttributes<HT...

FILE: chat2db-client/src/components/CascaderDB/index.tsx
  type IProps (line 9) | interface IProps {
  type IOption (line 15) | interface IOption {
  function CascaderDB (line 20) | function CascaderDB(props: IProps) {

FILE: chat2db-client/src/components/ConnectionEdit/components/Driver/index.tsx
  type IProps (line 11) | interface IProps {
  type DownloadStatus (line 17) | enum DownloadStatus {
  function getDriverList (line 49) | function getDriverList() {
  function formChange (line 69) | function formChange(data: any) {
  function saveDriver (line 73) | function saveDriver() {
  function downloadDrive (line 80) | function downloadDrive() {
  function onValuesChange (line 93) | function onValuesChange(data: any) {

FILE: chat2db-client/src/components/ConnectionEdit/config/enum.ts
  type InputType (line 1) | enum InputType {
  type AuthenticationType (line 7) | enum AuthenticationType {
  type SSHAuthenticationType (line 12) | enum SSHAuthenticationType {

FILE: chat2db-client/src/components/ConnectionEdit/config/types.ts
  type ISelect (line 4) | type ISelect = {
  type IFormItem (line 14) | interface IFormItem {
  type IConnectionConfig (line 35) | type IConnectionConfig = {

FILE: chat2db-client/src/components/ConnectionEdit/index.tsx
  type ITabsType (line 22) | type ITabsType = 'ssh' | 'baseInfo' | 'driver';
  type submitType (line 24) | enum submitType {
  type IProps (line 30) | interface IProps {
  type ICreateConnectionFunction (line 36) | interface ICreateConnectionFunction {
  function driverFormChange (line 93) | function driverFormChange(data: any) {
  function getData (line 142) | function getData() {
  function saveConnection (line 172) | function saveConnection(type: submitType) {
  function onCancel (line 235) | function onCancel() {
  function testSSH (line 239) | function testSSH() {
  type IRenderFormProps (line 306) | interface IRenderFormProps {
  function RenderForm (line 314) | function RenderForm(props: IRenderFormProps) {
  type IRenderExtendTableProps (line 591) | interface IRenderExtendTableProps {
  type IExtendTable (line 597) | interface IExtendTable {
  function RenderExtendTable (line 603) | function RenderExtendTable(props: IRenderExtendTableProps) {

FILE: chat2db-client/src/components/ConsoleEditor/components/ChatInput/index.tsx
  type SyncModelType (line 9) | const enum SyncModelType {
  type IProps (line 14) | interface IProps {

FILE: chat2db-client/src/components/ConsoleEditor/components/OperationLine/index.tsx
  type IProps (line 11) | interface IProps {

FILE: chat2db-client/src/components/ConsoleEditor/components/SelectBoundInfo/index.tsx
  type IProps (line 24) | interface IProps {
  type IOption (line 29) | interface IOption<T> {

FILE: chat2db-client/src/components/ConsoleEditor/hooks/useModuleData.ts
  type IProps (line 5) | interface IProps {

FILE: chat2db-client/src/components/ConsoleEditor/hooks/useSaveEditorData.ts
  type IProps (line 11) | interface IProps {
  function timingAutoSave (line 46) | function timingAutoSave(_status?: ConsoleStatus) {

FILE: chat2db-client/src/components/ConsoleEditor/index.tsx
  type IPromptType (line 36) | enum IPromptType {
  type IAppendValue (line 44) | type IAppendValue = {
  type IProps (line 49) | interface IProps {
  type IConsoleRef (line 69) | interface IConsoleRef {
  type IIntelligentEditorContext (line 73) | interface IIntelligentEditorContext {
  function ConsoleEditor (line 83) | function ConsoleEditor(props: IProps, ref: ForwardedRef<IConsoleRef>) {

FILE: chat2db-client/src/components/CreateDatabase/index.tsx
  type IProps (line 13) | interface IProps {
  type CreateType (line 22) | type CreateType = 'database' | 'schema';
  type ICreateDatabase (line 24) | interface ICreateDatabase {

FILE: chat2db-client/src/components/CustomLayout/index.tsx
  type IProps (line 8) | interface IProps {

FILE: chat2db-client/src/components/CustomSelect/index.tsx
  type IOption (line 4) | interface IOption {
  type IProps (line 9) | interface IProps {

FILE: chat2db-client/src/components/DraggableContainer/index.tsx
  type IProps (line 5) | interface IProps {

FILE: chat2db-client/src/components/EditDialog/index.tsx
  type IProps (line 7) | interface IProps {

FILE: chat2db-client/src/components/ExecuteSQL/index.tsx
  type IProps (line 12) | interface IProps {

FILE: chat2db-client/src/components/Iconfont/index.tsx
  type IProps (line 23) | interface IProps extends React.HTMLAttributes<HTMLElement> {

FILE: chat2db-client/src/components/ImportBlock/index.tsx
  type IImportBlockProps (line 6) | interface IImportBlockProps {
  function ImportBlock (line 14) | function ImportBlock(props: IImportBlockProps) {

FILE: chat2db-client/src/components/ImportConnection/index.tsx
  type IImportConnectionProps (line 17) | interface IImportConnectionProps {

FILE: chat2db-client/src/components/LayoutBasic/index.tsx
  type IProps (line 4) | interface IProps{
  function LayoutBasic (line 8) | function LayoutBasic(props: IProps) {

FILE: chat2db-client/src/components/Loading/LazyLoading/index.tsx
  type IProps (line 6) | interface IProps {

FILE: chat2db-client/src/components/Loading/Loading/index.tsx
  type IProps (line 6) | interface IProps {

FILE: chat2db-client/src/components/Loading/LoadingContent/index.tsx
  type IProps (line 7) | interface IProps<T> extends React.HTMLAttributes<HTMLDivElement> {
  function LoadingContent (line 16) | function LoadingContent<T>(props: IProps<T>) {

FILE: chat2db-client/src/components/Loading/LoadingGracile/index.tsx
  type IProps (line 6) | interface IProps {

FILE: chat2db-client/src/components/Loading/LoadingLiquid/index.tsx
  type IProps (line 6) | interface IProps {

FILE: chat2db-client/src/components/MenuLabel/index.tsx
  type IProps (line 6) | interface IProps {

FILE: chat2db-client/src/components/Modal/BaseModal/index.tsx
  type IModalData (line 5) | type IModalData =

FILE: chat2db-client/src/components/Modal/TriggeredModal/index.tsx
  type ITriggeredModal (line 4) | interface ITriggeredModal extends React.ComponentProps<typeof Modal> {

FILE: chat2db-client/src/components/MonacoEditor/index.tsx
  type IEditorIns (line 11) | type IEditorIns = monaco.editor.IStandaloneCodeEditor;
  type IEditorOptions (line 12) | type IEditorOptions = monaco.editor.IStandaloneEditorConstructionOptions;
  type IEditorContentChangeEvent (line 13) | type IEditorContentChangeEvent = monaco.editor.IModelContentChangedEvent;
  type IAppendValue (line 15) | type IAppendValue = {
  type IProps (line 26) | interface IProps {
  type IExportRefFunction (line 40) | interface IExportRefFunction {
  function MonacoEditor (line 47) | function MonacoEditor(props: IProps, ref: ForwardedRef<IExportRefFunctio...
  type IRangeType (line 244) | type IRangeType = 'end' | 'front' | 'cover' | 'reset' | any;

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/lexer/index.ts
  type ILexerConfig (line 5) | interface ILexerConfig {
  class Tokenizer (line 14) | class Tokenizer {
    method constructor (line 16) | constructor(public lexerConfig: ILexerConfig[]) {
    method tokenize (line 20) | public tokenize(input: string) {
    method getNextToken (line 55) | private getNextToken(input: string) {
    method getTokenOnFirstMatch (line 71) | private getTokenOnFirstMatch({ input, type, regex }: { input: string; ...
  type Lexer (line 81) | type Lexer = (text: string) => IToken[];

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/lexer/token.ts
  type IToken (line 1) | interface IToken {

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/parser/chain.ts
  function getParser (line 126) | function getParser(root: ChainFunction) {
  function scannerAddCursorToken (line 136) | function scannerAddCursorToken(scanner: Scanner, cursorIndex: number, op...
  function newVisit (line 383) | function newVisit({
  function visitChildNode (line 458) | function visitChildNode({
  function noNextNode (line 534) | function noNextNode(node: Node, store: VisiterStore, visiterOption: Visi...
  function addChances (line 544) | function addChances({
  function hasParentNodeByFunctionName (line 568) | function hasParentNodeByFunctionName(node: Node, functionName: string): ...
  function tryChances (line 580) | function tryChances(node: Node, store: VisiterStore, visiterOption: Visi...
  function fail (line 594) | function fail(node: Node, store: VisiterStore, visiterOption: VisiterOpt...
  function findNextMatchNodes (line 601) | function findNextMatchNodes(node: Node, parser: Parser): MatchNode[] {
  function firstSetUnMatch (line 629) | function firstSetUnMatch(node: ChainNode, store: VisiterStore, visiterOp...
  function generateFirstSet (line 651) | function generateFirstSet(node: ChainNode, parser: Parser) {
  function getFirstOrFunctionSet (line 662) | function getFirstOrFunctionSet(node: Node, creatorFunction: ChainFunctio...
  function solveFirstSet (line 686) | function solveFirstSet(creatorFunction: ChainFunction, parser: Parser) {

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/parser/define.ts
  type IParseResult (line 7) | interface IParseResult {
  type FirstOrFunctionSet (line 27) | type FirstOrFunctionSet = MatchNode | ChainFunction;
  type IMatchFn (line 29) | type IMatchFn = (scanner: Scanner, isCostToken: boolean) => IMatch;
  type IAst (line 32) | type IAst = IToken | any;
  type Node (line 34) | type Node = MatchNode | FunctionNode | TreeNode | ChainNode;
  type ParentNode (line 36) | type ParentNode = TreeNode | ChainNode;
  type IMatching (line 38) | interface IMatching {
  type SingleElement (line 44) | type SingleElement = string | any;
  type IElement (line 46) | type IElement = SingleElement | SingleElement[];
  type IElements (line 48) | type IElements = IElement[];
  type ISolveAst (line 50) | type ISolveAst = (astResult: IAst[]) => IAst;
  type Chain (line 52) | type Chain = (...elements: IElements) => (solveAst?: ISolveAst) => Chain...
  type ChainNodeFactory (line 54) | type ChainNodeFactory = (
  type ChainFunction (line 62) | type ChainFunction = () => ChainNodeFactory;
  type IChance (line 64) | interface IChance {
  constant MAX_VISITER_CALL (line 73) | const MAX_VISITER_CALL = 1000000;
  class Parser (line 75) | class Parser {
  class VisiterStore (line 85) | class VisiterStore {
    method constructor (line 91) | constructor(public scanner: Scanner, public parser: Parser) {
  class VisiterOption (line 96) | class VisiterOption {
  class ChainNode (line 112) | class ChainNode {
    method constructor (line 128) | constructor(public parentIndex: number) {
  class TreeNode (line 133) | class TreeNode {
    method constructor (line 139) | constructor(public parentIndex: number) {
  class FunctionNode (line 144) | class FunctionNode {
    method constructor (line 148) | constructor(public chainFunction: ChainFunction, public parentIndex: n...
  class MatchNode (line 157) | class MatchNode {
    method constructor (line 161) | constructor(private matchFunction: IMatchFn, public matching: IMatchin...
  class CreateParserOptions (line 170) | class CreateParserOptions {

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/parser/match.ts
  type IMatch (line 6) | interface IMatch {
  function equalWordOrIncludeWords (line 11) | function equalWordOrIncludeWords(str: string, word: string | string[] | ...
  function judgeMatch (line 20) | function judgeMatch(source: string, target: string) {
  function matchToken (line 27) | function matchToken(scanner: Scanner, compare: (token: IToken) => boolea...
  function createMatch (line 51) | function createMatch<T>(fn: (scanner: Scanner, arg?: T, isCostToken?: bo...
  type IMatchTokenTypeOption (line 76) | interface IMatchTokenTypeOption {

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/parser/scanner.ts
  class Scanner (line 3) | class Scanner {
    method constructor (line 8) | constructor(tokens: IToken[], index = 0) {

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/parser/utils.ts
  function tailCallOptimize (line 18) | function tailCallOptimize<T>(f: T): T {
  function getPathByCursorIndexFromAst (line 37) | function getPathByCursorIndexFromAst(obj: any, cursorIndex: number, path...

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/monaco-plugin/default-opts.ts
  type IMonacoVersion (line 7) | type IMonacoVersion = '0.13.2' | '0.15.6';
  type IParserType (line 9) | type IParserType = 'mysql' | 'odps' | 'blink' | 'dsql' | 'grail' | 'emcs...
  class DefaultOpts (line 11) | class DefaultOpts {
    method constructor (line 18) | constructor(private monaco: any) {

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/monaco-plugin/index.ts
  function monacoSqlAutocomplete (line 19) | function monacoSqlAutocomplete(
  function returnCompletionItemsByVersion (line 311) | function returnCompletionItemsByVersion(
  function getSeverityByVersion (line 327) | function getSeverityByVersion(monaco: any, monacoVersion: IMonacoVersion) {

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/define.ts
  type IStatements (line 3) | type IStatements = IStatement[];
  type IStatement (line 5) | interface IStatement {
  type ISelectStatement (line 10) | interface ISelectStatement extends IStatement {
  type IResult (line 15) | interface IResult extends IStatement {
  type IFrom (line 20) | interface IFrom extends IStatement {
  type ISource (line 27) | interface ISource extends IStatement {
  type ITableInfo (line 32) | interface ITableInfo {
  type ICompletionItem (line 37) | interface ICompletionItem {
  type CursorType (line 48) | type CursorType =
  type ICursorInfo (line 56) | type ICursorInfo<T = {}> = {
  type IGetFieldsByTableName (line 61) | type IGetFieldsByTableName = (

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/four-operations.ts
  function createFourOperations (line 5) | function createFourOperations(field: ChainFunction) {

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/reader.ts
  function getCursorInfo (line 14) | async function getCursorInfo(rootStatement: IStatements, keyPath: string...
  function findNearestStatement (line 61) | function findNearestStatement(
  function getFieldsFromStatement (line 96) | async function getFieldsFromStatement(
  function getFieldsByFromClauses (line 139) | async function getFieldsByFromClauses(
  function getFieldsByFromClause (line 156) | async function getFieldsByFromClause(
  function judgeStatement (line 299) | async function judgeStatement<T>(
  function findFieldExtraInfo (line 313) | async function findFieldExtraInfo(

FILE: chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/utils.ts
  function isOkay (line 1) | function isOkay(obj: any) {
  function flattenAll (line 5) | function flattenAll(arr: any[]) {
  function createTableName (line 15) | function createTableName(tableNames: { [key: string]: string }) {

FILE: chat2db-client/src/components/MonacoEditor/useMonacoTheme.ts
  function useMonacoTheme (line 7) | function useMonacoTheme() {

FILE: chat2db-client/src/components/MyNotification/index.tsx
  type IProps (line 9) | interface IProps {
  function MyNotification (line 26) | function MyNotification() {

FILE: chat2db-client/src/components/Output/index.tsx
  type IProps (line 13) | interface IProps {
  type IDatasource (line 17) | interface IDatasource extends IHistoryRecord {

FILE: chat2db-client/src/components/Popularize/index.tsx
  type IProps (line 6) | interface IProps {

FILE: chat2db-client/src/components/RefreshLoadingButton/index.tsx
  type IProps (line 7) | interface IProps extends React.DetailedHTMLProps<React.HTMLAttributes<HT...

FILE: chat2db-client/src/components/ScrollLoading/index.tsx
  type IProps (line 7) | interface IProps {

FILE: chat2db-client/src/components/SearchResult/components/OperationalDataBar/index.tsx
  type IProps (line 5) | interface IProps {

FILE: chat2db-client/src/components/SearchResult/components/Pagination/index.tsx
  type IProps (line 10) | interface IProps {
  type IIconType (line 16) | type IIconType = 'pre' | 'next' | 'first' | 'last';
  function Pagination (line 17) | function Pagination(props: IProps) {

FILE: chat2db-client/src/components/SearchResult/components/RightClickMenu/index.tsx
  type IProps (line 7) | interface IProps {
  type IMenu (line 13) | interface IMenu {
  type AllSupportedMenusType (line 22) | enum AllSupportedMenusType {

FILE: chat2db-client/src/components/SearchResult/components/ScreeningResult/index.tsx
  type IProps (line 10) | interface IProps {

FILE: chat2db-client/src/components/SearchResult/components/StatusBar/index.tsx
  type IProps (line 6) | interface IProps {

FILE: chat2db-client/src/components/SearchResult/components/TableBox/index.tsx
  type ITableProps (line 48) | interface ITableProps {
  type IViewTableCellData (line 57) | interface IViewTableCellData {
  type IUpdateData (line 64) | interface IUpdateData {
  type USER_FILLED_VALUE (line 71) | enum USER_FILLED_VALUE {
  function TableBox (line 107) | function TableBox(props: ITableProps) {

FILE: chat2db-client/src/components/SearchResult/hooks/useCurdTableData.ts
  type IProps (line 5) | interface IProps {

FILE: chat2db-client/src/components/SearchResult/hooks/usePasteData.ts
  type IUsePasteDataRelyData (line 4) | interface IUsePasteDataRelyData {

FILE: chat2db-client/src/components/SearchResult/index.tsx
  type IProps (line 28) | interface IProps {
  type ISearchResultRef (line 44) | interface ISearchResultRef {
  type IContext (line 48) | interface IContext {
  function renderSuccessResult (line 117) | function renderSuccessResult() {

FILE: chat2db-client/src/components/ShortcutKey/index.tsx
  type IProps (line 7) | interface IProps {

FILE: chat2db-client/src/components/SingleFileMonacoEditor/index.tsx
  type IProps (line 7) | interface IProps {
  type ISingleFileMonacoEditorRefFunction (line 14) | interface ISingleFileMonacoEditorRefFunction {

FILE: chat2db-client/src/components/StateIndicator/index.tsx
  type IProps (line 6) | interface IProps {
  type State (line 13) | const enum State {

FILE: chat2db-client/src/components/Tabs/index.tsx
  type ITabItem (line 10) | interface ITabItem {
  type IOnchangeProps (line 21) | interface IOnchangeProps {
  constant MAX_TABS (line 26) | const MAX_TABS = 20;
  type IProps (line 28) | interface IProps {
  function inputOnChange (line 163) | function inputOnChange(value: string) {
  function onBlur (line 168) | function onBlur() {
  function showClosed (line 173) | function showClosed() {

FILE: chat2db-client/src/components/UploadDriver/index.tsx
  type IProps (line 10) | interface IProps {
  method onChange (line 29) | onChange(info) {
  function onChange (line 44) | function onChange(e: any) {

FILE: chat2db-client/src/components/ViewDDL/index.tsx
  type IProps (line 8) | interface IProps {

FILE: chat2db-client/src/components/XXXX_FN/index.tsx
  type IProps (line 5) | interface IProps {

FILE: chat2db-client/src/constants/appConfig.ts
  constant APP_NAME (line 1) | const APP_NAME = 'Chat2DB';
  constant GITHUB_URL (line 2) | const GITHUB_URL = 'https://github.com/chat2db/Chat2DB/blob/main/CHANGEL...
  constant WEBSITE_DOC (line 3) | const WEBSITE_DOC = 'https://doc.sqlgpt.cn/changelog/'

FILE: chat2db-client/src/constants/common.ts
  type DatabaseTypeCode (line 1) | enum DatabaseTypeCode {
  type ConsoleStatus (line 21) | enum ConsoleStatus {
  type OSType (line 26) | enum OSType {
  type ConnectionKind (line 32) | enum ConnectionKind {
  type CRUD (line 38) | enum CRUD {

FILE: chat2db-client/src/constants/console.ts
  type ConsoleOpenedStatus (line 2) | enum ConsoleOpenedStatus {

FILE: chat2db-client/src/constants/database.ts
  type ConnectionEnvType (line 8) | enum ConnectionEnvType {

FILE: chat2db-client/src/constants/editTable.ts
  type EditColumnOperationType (line 1) | enum EditColumnOperationType {
  type NullableType (line 11) | enum NullableType {

FILE: chat2db-client/src/constants/table.ts
  type TableDataType (line 1) | enum TableDataType {
  type StatusType (line 20) | enum StatusType {

FILE: chat2db-client/src/constants/theme.ts
  type ThemeType (line 1) | enum ThemeType {
  type EditorThemeType (line 8) | enum EditorThemeType {
  type PrimaryColorType (line 13) | enum PrimaryColorType {
  type LangType (line 24) | enum LangType {

FILE: chat2db-client/src/constants/tree.ts
  type TreeNodeType (line 1) | enum TreeNodeType {
  type OperationColumn (line 29) | enum OperationColumn {

FILE: chat2db-client/src/constants/workspace.ts
  type CreateTabIntroType (line 1) | enum CreateTabIntroType {
  type WorkspaceTabType (line 8) | enum WorkspaceTabType {

FILE: chat2db-client/src/hooks/useEventSource.ts
  function useEventSource (line 5) | function useEventSource({ url }) {

FILE: chat2db-client/src/hooks/useFocusData.ts
  function useCopyFocusData (line 7) | function useCopyFocusData() {

FILE: chat2db-client/src/hooks/usePollRequestService.ts
  type IProps (line 3) | interface IProps {
  type ServiceStatus (line 12) | enum ServiceStatus {

FILE: chat2db-client/src/hooks/useTheme.ts
  function useTheme (line 46) | function useTheme<T = ITheme>(): [T, React.Dispatch<React.SetStateAction...

FILE: chat2db-client/src/hooks/useUpdateEffect.ts
  function useUpdateEffect (line 8) | function useUpdateEffect(fn: Function, arr: any[]) {

FILE: chat2db-client/src/i18n/index.tsx
  function i18n (line 28) | function i18n(key: keyof typeof zhCN, ...args: any[]) {
  function i18nElement (line 46) | function i18nElement(key: keyof typeof zhCN, ...args: React.ReactNode[]) {

FILE: chat2db-client/src/indexedDB/index.ts
  type TableType (line 29) | type TableType = 'workspaceConsoleDDL';
  type DBType (line 31) | type DBType = 'chat2db';

FILE: chat2db-client/src/indexedDB/table.ts
  type IWorkspaceConsoleDDL (line 2) | interface IWorkspaceConsoleDDL {

FILE: chat2db-client/src/layouts/GlobalLayout/index.tsx
  function change (line 51) | function change(e: any) {

FILE: chat2db-client/src/main/analysis.js
  function registerAnalytics (line 5) | function registerAnalytics() {

FILE: chat2db-client/src/main/constants.js
  constant DEV_WEB_URL (line 1) | const DEV_WEB_URL = 'http://localhost:8000/';
  constant JAVA_APP_NAME (line 4) | const JAVA_APP_NAME = 'chat2db-server-start.jar';
  constant JAVA_PATH (line 5) | const JAVA_PATH = 'jre/bin/java';

FILE: chat2db-client/src/main/ga4.js
  class Analytics4 (line 6) | class Analytics4 {
    method constructor (line 7) | constructor(trackingID, secretKey, clientID = machineIdSync(), session...
    method set (line 18) | set(key, value) {
    method setParams (line 27) | setParams(params) {
    method setUserProperties (line 36) | setUserProperties(upValue) {
    method event (line 45) | event(eventName) {

FILE: chat2db-client/src/main/index.js
  function createWindow (line 17) | function createWindow() {

FILE: chat2db-client/src/main/main.js
  method constructor (line 2) | constructor(e,t,r=o(),n=s()){this.trackingID=e,this.secretKey=t,this.cli...
  method set (line 2) | set(e,t){return null!==t?this.customParams[e]=t:delete this.customParams...
  method setParams (line 2) | setParams(e){return"object"==typeof e&&Object.keys(e).length>0?Object.as...
  method setUserProperties (line 2) | setUserProperties(e){return"object"==typeof e&&Object.keys(e).length>0?t...
  method event (line 2) | event(e){const t={client_id:this.clientID,events:[{name:e,params:{sessio...
  function g (line 2) | function g(){const{width:e,height:t,x:r,y:n}=f.get("windowBounds",{width...
  method click (line 2) | click(){o.showMessageBox({title:"关于Chat2DB",message:`关于Chat2DB v${t?.ver...
  method click (line 2) | click(){s.relaunch(),s.quit()}
  method click (line 2) | click(){s.quit()}
  method click (line 2) | click(){const e=l.join(c.homedir(),".chat2db/logs/application.log");n.op...
  method click (line 2) | click(){const e=i.getFocusedWindow();e&&e.toggleDevTools()}
  method click (line 2) | click(){n.openExternal("https://www.sqlgpt.cn/zh")}
  method click (line 2) | click(){n.openExternal("https://doc.sqlgpt.cn/zh/")}
  method click (line 2) | click(){n.openExternal("https://doc.sqlgpt.cn/zh/changelog/")}
  class R (line 2) | class R{constructor(e={}){var t;o.set(this,void 0),i.set(this,void 0),a....
    method constructor (line 2) | constructor(e={}){var t;o.set(this,void 0),i.set(this,void 0),a.set(th...
    method get (line 2) | get(e,t){if(u(this,a,"f").accessPropertiesByDotNotation)return this._g...
    method set (line 2) | set(e,t){if("string"!=typeof e&&"object"!=typeof e)throw new TypeError...
    method has (line 2) | has(e){return u(this,a,"f").accessPropertiesByDotNotation?g.has(this.s...
    method reset (line 2) | reset(...e){for(const t of e)null!=u(this,c,"f")[t]&&this.set(t,u(this...
    method delete (line 2) | delete(e){const{store:t}=this;u(this,a,"f").accessPropertiesByDotNotat...
    method clear (line 2) | clear(){this.store=x();for(const e of Object.keys(u(this,c,"f")))this....
    method onDidChange (line 2) | onDidChange(e,t){if("string"!=typeof e)throw new TypeError("Expected `...
    method onDidAnyChange (line 2) | onDidAnyChange(e){if("function"!=typeof e)throw new TypeError("Expecte...
    method size (line 2) | get size(){return Object.keys(this.store).length}
    method store (line 2) | get store(){try{const e=f.readFileSync(this.path,u(this,i,"f")?null:"u...
    method store (line 2) | set store(e){this._ensureDirectory(),this._validate(e),this._write(e),...
    method _encryptData (line 2) | _encryptData(e){if(!u(this,i,"f"))return e.toString();try{if(u(this,i,...
    method _handleChange (line 2) | _handleChange(e,t){let r=e();const n=()=>{const n=r,s=e();(0,d.isDeepS...
    method _validate (line 2) | _validate(e){if(!u(this,o,"f"))return;if(u(this,o,"f").call(this,e)||!...
    method _ensureDirectory (line 2) | _ensureDirectory(){f.mkdirSync(h.dirname(this.path),{recursive:!0})}
    method _write (line 2) | _write(e){let t=this._serialize(e);if(u(this,i,"f")){const e=p.randomB...
    method _watch (line 2) | _watch(){this._ensureDirectory(),f.existsSync(this.path)||this._write(...
    method _migrate (line 2) | _migrate(e,t,r){let n=this._get(j,"0.0.0");const s=Object.keys(e).filt...
    method _containsReservedKey (line 2) | _containsReservedKey(e){return"object"==typeof e&&Object.keys(e)[0]===...
    method _isVersionInRangeFormat (line 2) | _isVersionInRangeFormat(e){return null===S.clean(e)}
    method _shouldPerformMigration (line 2) | _shouldPerformMigration(e,t,r){return this._isVersionInRangeFormat(e)?...
    method _get (line 2) | _get(e,t){return g.get(this.store,e,t)}
    method _set (line 2) | _set(e,t){const{store:r}=this;g.set(r,e,t),this.store=r}
  method [(o=new WeakMap,i=new WeakMap,a=new WeakMap,c=new WeakMap,Symbol.iterator)] (line 2) | *[(o=new WeakMap,i=new WeakMap,a=new WeakMap,c=new WeakMap,Symbol.iterat...
  function r (line 2) | function r(e,t){return{validate:e,compare:t}}
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  function o (line 2) | function o(e){const t=n.exec(e);if(!t)return!1;const r=+t[1],o=+t[2],i=+...
  function i (line 2) | function i(e,t){if(e&&t)return e>t?1:e<t?-1:0}
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  function c (line 2) | function c(e,t){const r=a.exec(e);if(!r)return!1;const n=+r[1],s=+r[2],o...
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  function l (line 2) | function l(e,t){if(!e||!t)return;const r=a.exec(e),n=a.exec(t);return r&...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function d (line 2) | function d(e,t){if(!e||!t)return;const[r,n]=e.split(u),[s,o]=t.split(u),...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  function g (line 2) | function g(){return!0}
  function l (line 2) | function l(e,t,r,n){var s,i;null!==(s=(i=e.opts.code).formats)&&void 0!=...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  method code (line 2) | code(e){const{gen:t,data:r,schemaCode:o,keyword:a,it:c}=e,{opts:l,self:u...
  class l (line 2) | class l extends n.default{_addVocabularies(){super._addVocabularies(),s....
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  class r (line 2) | class r{}
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  class n (line 2) | class n extends r{constructor(e){if(super(),!t.IDENTIFIER.test(e))throw ...
    method constructor (line 2) | constructor(e){if(super(),!t.IDENTIFIER.test(e))throw new Error("CodeG...
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){return!1}
    method names (line 2) | get names(){return{[this.str]:1}}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof n)return e.loose===!!t.loose&&...
    method format (line 8) | format(){return this.range=this.set.map((e=>e.join(" ").trim())).join(...
    method toString (line 8) | toString(){return this.range}
    method parseRange (line 8) | parseRange(e){const t=((this.options.includePrerelease&&p)|(this.optio...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is r...
    method test (line 8) | test(e){if(!e)return!1;if("string"==typeof e)try{e=new c(e,this.option...
  class s (line 2) | class s extends r{constructor(e){super(),this._items="string"==typeof e?...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  function o (line 2) | function o(e,...t){const r=[e[0]];let n=0;for(;n<t.length;)c(r,t[n]),r.p...
  function a (line 2) | function a(e,...t){const r=[u(e[0])];let n=0;for(;n<t.length;)r.push(i),...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function c (line 2) | function c(e,t){var r;t instanceof s?e.push(...t._items):t instanceof n?...
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  function l (line 2) | function l(e,t){if('""'===t)return e;if('""'===e)return t;if("string"==t...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function u (line 2) | function u(e){return JSON.stringify(e).replace(/\u2028/g,"\\u2028").repl...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  class a (line 2) | class a{optimizeNodes(){return this}optimizeNames(e,t){return this}}
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  class c (line 2) | class c extends a{constructor(e,t,r){super(),this.varKind=e,this.name=t,...
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  class l (line 2) | class l extends a{constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this....
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  class u (line 2) | class u extends l{constructor(e,t,r,n){super(e,r,n),this.op=t}render({_n...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  class d (line 2) | class d extends a{constructor(e){super(),this.label=e,this.names={}}rend...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  class f (line 2) | class f extends a{constructor(e){super(),this.label=e,this.names={}}rend...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}
  class h (line 2) | class h extends a{constructor(e){super(),this.error=e}render({_n:e}){ret...
    method constructor (line 2) | constructor(e){super(),this.error=e}
    method render (line 2) | render({_n:e}){return`throw ${this.error};`+e}
    method names (line 2) | get names(){return this.error.names}
  class p (line 2) | class p extends a{constructor(e){super(),this.code=e}render({_n:e}){retu...
    method constructor (line 2) | constructor(e){super(),this.code=e}
    method render (line 2) | render({_n:e}){return`${this.code};`+e}
    method optimizeNodes (line 2) | optimizeNodes(){return`${this.code}`?this:void 0}
    method optimizeNames (line 2) | optimizeNames(e,t){return this.code=R(this.code,e,t),this}
    method names (line 2) | get names(){return this.code instanceof n._CodeOrName?this.code.names:{}}
  class m (line 2) | class m extends a{constructor(e=[]){super(),this.nodes=e}render(e){retur...
    method constructor (line 2) | constructor(e=[]){super(),this.nodes=e}
    method render (line 2) | render(e){return this.nodes.reduce(((t,r)=>t+r.render(e)),"")}
    method optimizeNodes (line 2) | optimizeNodes(){const{nodes:e}=this;let t=e.length;for(;t--;){const r=...
    method optimizeNames (line 2) | optimizeNames(e,t){const{nodes:r}=this;let n=r.length;for(;n--;){const...
    method names (line 2) | get names(){return this.nodes.reduce(((e,t)=>I(e,t.names)),{})}
  class y (line 2) | class y extends m{render(e){return"{"+e._n+super.render(e)+"}"+e._n}}
    method render (line 2) | render(e){return"{"+e._n+super.render(e)+"}"+e._n}
  class g (line 2) | class g extends m{}
  class v (line 2) | class v extends y{}
  class w (line 2) | class w extends y{constructor(e,t){super(t),this.condition=e}render(e){l...
    method constructor (line 2) | constructor(e,t){super(t),this.condition=e}
    method render (line 2) | render(e){let t=`if(${this.condition})`+super.render(e);return this.el...
    method optimizeNodes (line 2) | optimizeNodes(){super.optimizeNodes();const e=this.condition;if(!0===e...
    method optimizeNames (line 2) | optimizeNames(e,t){var r;if(this.else=null===(r=this.else)||void 0===r...
    method names (line 2) | get names(){const e=super.names;return j(e,this.condition),this.else&&...
    method constructor (line 8) | constructor(e,t,r,n,s){this.key=e,this.value=t,this.length=r,this.now=...
  class E (line 2) | class E extends y{}
  class $ (line 2) | class $ extends E{constructor(e){super(),this.iteration=e}render(e){retu...
    method constructor (line 2) | constructor(e){super(),this.iteration=e}
    method render (line 2) | render(e){return`for(${this.iteration})`+super.render(e)}
    method optimizeNames (line 2) | optimizeNames(e,t){if(super.optimizeNames(e,t))return this.iteration=R...
    method names (line 2) | get names(){return I(super.names,this.iteration.names)}
    method constructor (line 5) | constructor(e={}){this.schemas={},this.refs={},this.formats={},this._c...
    method _addVocabularies (line 5) | _addVocabularies(){this.addKeyword("$async")}
    method _addDefaultMetaSchema (line 5) | _addDefaultMetaSchema(){const{$data:e,meta:t,schemaId:r}=this.opts;let...
    method defaultMeta (line 5) | defaultMeta(){const{meta:e,schemaId:t}=this.opts;return this.opts.defa...
    method validate (line 5) | validate(e,t){let r;if("string"==typeof e){if(r=this.getSchema(e),!r)t...
    method compile (line 5) | compile(e,t){const r=this._addSchema(e,t);return r.validate||this._com...
    method compileAsync (line 5) | compileAsync(e,t){if("function"!=typeof this.opts.loadSchema)throw new...
    method addSchema (line 5) | addSchema(e,t,r,n=this.opts.validateSchema){if(Array.isArray(e)){for(c...
    method addMetaSchema (line 5) | addMetaSchema(e,t,r=this.opts.validateSchema){return this.addSchema(e,...
    method validateSchema (line 5) | validateSchema(e,t){if("boolean"==typeof e)return!0;let r;if(r=e.$sche...
    method getSchema (line 5) | getSchema(e){let t;for(;"string"==typeof(t=b.call(this,e));)e=t;if(voi...
    method removeSchema (line 5) | removeSchema(e){if(e instanceof RegExp)return this._removeAllSchemas(t...
    method addVocabulary (line 5) | addVocabulary(e){for(const t of e)this.addKeyword(t);return this}
    method addKeyword (line 5) | addKeyword(e,t){let r;if("string"==typeof e)r=e,"object"==typeof t&&(t...
    method getKeyword (line 5) | getKeyword(e){const t=this.RULES.all[e];return"object"==typeof t?t.def...
    method removeKeyword (line 5) | removeKeyword(e){const{RULES:t}=this;delete t.keywords[e],delete t.all...
    method addFormat (line 5) | addFormat(e,t){return"string"==typeof t&&(t=new RegExp(t)),this.format...
    method errorsText (line 5) | errorsText(e=this.errors,{separator:t=", ",dataVar:r="data"}={}){retur...
    method $dataMetaSchema (line 5) | $dataMetaSchema(e,t){const r=this.RULES.all;e=JSON.parse(JSON.stringif...
    method _removeAllSchemas (line 5) | _removeAllSchemas(e,t){for(const r in e){const n=e[r];t&&!t.test(r)||(...
    method _addSchema (line 5) | _addSchema(e,t,r,n=this.opts.validateSchema,s=this.opts.addUsedSchema)...
    method _checkUnique (line 5) | _checkUnique(e){if(this.schemas[e]||this.refs[e])throw new Error(`sche...
    method _compileSchemaEnv (line 5) | _compileSchemaEnv(e){if(e.meta?this._compileMetaSchema(e):c.compileSch...
    method _compileMetaSchema (line 5) | _compileMetaSchema(e){const t=this.opts;this.opts=this._metaOpts;try{c...
  class _ (line 2) | class _ extends E{constructor(e,t,r,n){super(),this.varKind=e,this.name=...
    method constructor (line 2) | constructor(e,t,r,n){super(),this.varKind=e,this.name=t,this.from=r,th...
    method render (line 2) | render(e){const t=e.es5?s.varKinds.var:this.varKind,{name:r,from:n,to:...
    method names (line 2) | get names(){const e=j(super.names,this.from);return j(e,this.to)}
  class b (line 2) | class b extends E{constructor(e,t,r,n){super(),this.loop=e,this.varKind=...
    method constructor (line 2) | constructor(e,t,r,n){super(),this.loop=e,this.varKind=t,this.name=r,th...
    method render (line 2) | render(e){return`for(${this.varKind} ${this.name} ${this.loop} ${this....
    method optimizeNames (line 2) | optimizeNames(e,t){if(super.optimizeNames(e,t))return this.iterable=R(...
    method names (line 2) | get names(){return I(super.names,this.iterable.names)}
  class S (line 2) | class S extends y{constructor(e,t,r){super(),this.name=e,this.args=t,thi...
    method constructor (line 2) | constructor(e,t,r){super(),this.name=e,this.args=t,this.async=r}
    method render (line 2) | render(e){return`${this.async?"async ":""}function ${this.name}(${this...
  class O (line 2) | class O extends m{render(e){return"return "+super.render(e)}}
    method render (line 2) | render(e){return"return "+super.render(e)}
  class P (line 2) | class P extends y{render(e){let t="try"+super.render(e);return this.catc...
    method render (line 2) | render(e){let t="try"+super.render(e);return this.catch&&(t+=this.catc...
    method optimizeNodes (line 2) | optimizeNodes(){var e,t;return super.optimizeNodes(),null===(e=this.ca...
    method optimizeNames (line 2) | optimizeNames(e,t){var r,n;return super.optimizeNames(e,t),null===(r=t...
    method names (line 2) | get names(){const e=super.names;return this.catch&&I(e,this.catch.name...
    method constructor (line 5) | constructor(e,t,r){if((0,c.validateKeywordUsage)(e,t,r),this.gen=e.gen...
    method result (line 5) | result(e,t,r){this.failResult((0,u.not)(e),t,r)}
    method failResult (line 5) | failResult(e,t,r){this.gen.if(e),r?r():this.error(),t?(this.gen.else()...
    method pass (line 5) | pass(e,t){this.failResult((0,u.not)(e),void 0,t)}
    method fail (line 5) | fail(e){if(void 0===e)return this.error(),void(this.allErrors||this.ge...
    method fail$data (line 5) | fail$data(e){if(!this.$data)return this.fail(e);const{schemaCode:t}=th...
    method error (line 5) | error(e,t,r){if(t)return this.setParams(t),this._error(e,r),void this....
    method _error (line 5) | _error(e,t){(e?p.reportExtraError:p.reportError)(this,this.def.error,t)}
    method $dataError (line 5) | $dataError(){(0,p.reportError)(this,this.def.$dataError||p.keyword$Dat...
    method reset (line 5) | reset(){if(void 0===this.errsCount)throw new Error('add "trackErrors" ...
    method ok (line 5) | ok(e){this.allErrors||this.gen.if(e)}
    method setParams (line 5) | setParams(e,t){t?Object.assign(this.params,e):this.params=e}
    method block$data (line 5) | block$data(e,t,r=u.nil){this.gen.block((()=>{this.check$data(e,r),t()}))}
    method check$data (line 5) | check$data(e=u.nil,t=u.nil){if(!this.$data)return;const{gen:r,schemaCo...
    method invalid$data (line 5) | invalid$data(){const{gen:e,schemaCode:t,schemaType:r,def:n,it:s}=this;...
    method subschema (line 5) | subschema(e,t){const r=(0,l.getSubschema)(this.it,e);(0,l.extendSubsch...
    method mergeEvaluated (line 5) | mergeEvaluated(e,t){const{it:r,gen:n}=this;r.opts.unevaluated&&(!0!==r...
    method mergeValidEvaluated (line 5) | mergeValidEvaluated(e,t){const{it:r,gen:n}=this;if(r.opts.unevaluated&...
  class x (line 2) | class x extends y{constructor(e){super(),this.error=e}render(e){return`c...
    method constructor (line 2) | constructor(e){super(),this.error=e}
    method render (line 2) | render(e){return`catch(${this.error})`+super.render(e)}
  class N (line 2) | class N extends y{render(e){return"finally"+super.render(e)}}
    method render (line 2) | render(e){return"finally"+super.render(e)}
  function I (line 2) | function I(e,t){for(const r in t)e[r]=(e[r]||0)+(t[r]||0);return e}
  function j (line 2) | function j(e,t){return t instanceof n._CodeOrName?I(e,t.names):e}
  function R (line 2) | function R(e,t,r){return e instanceof n.Name?o(e):(s=e)instanceof n._Cod...
    method constructor (line 2) | constructor(e={}){var t;o.set(this,void 0),i.set(this,void 0),a.set(th...
    method get (line 2) | get(e,t){if(u(this,a,"f").accessPropertiesByDotNotation)return this._g...
    method set (line 2) | set(e,t){if("string"!=typeof e&&"object"!=typeof e)throw new TypeError...
    method has (line 2) | has(e){return u(this,a,"f").accessPropertiesByDotNotation?g.has(this.s...
    method reset (line 2) | reset(...e){for(const t of e)null!=u(this,c,"f")[t]&&this.set(t,u(this...
    method delete (line 2) | delete(e){const{store:t}=this;u(this,a,"f").accessPropertiesByDotNotat...
    method clear (line 2) | clear(){this.store=x();for(const e of Object.keys(u(this,c,"f")))this....
    method onDidChange (line 2) | onDidChange(e,t){if("string"!=typeof e)throw new TypeError("Expected `...
    method onDidAnyChange (line 2) | onDidAnyChange(e){if("function"!=typeof e)throw new TypeError("Expecte...
    method size (line 2) | get size(){return Object.keys(this.store).length}
    method store (line 2) | get store(){try{const e=f.readFileSync(this.path,u(this,i,"f")?null:"u...
    method store (line 2) | set store(e){this._ensureDirectory(),this._validate(e),this._write(e),...
    method _encryptData (line 2) | _encryptData(e){if(!u(this,i,"f"))return e.toString();try{if(u(this,i,...
    method _handleChange (line 2) | _handleChange(e,t){let r=e();const n=()=>{const n=r,s=e();(0,d.isDeepS...
    method _validate (line 2) | _validate(e){if(!u(this,o,"f"))return;if(u(this,o,"f").call(this,e)||!...
    method _ensureDirectory (line 2) | _ensureDirectory(){f.mkdirSync(h.dirname(this.path),{recursive:!0})}
    method _write (line 2) | _write(e){let t=this._serialize(e);if(u(this,i,"f")){const e=p.randomB...
    method _watch (line 2) | _watch(){this._ensureDirectory(),f.existsSync(this.path)||this._write(...
    method _migrate (line 2) | _migrate(e,t,r){let n=this._get(j,"0.0.0");const s=Object.keys(e).filt...
    method _containsReservedKey (line 2) | _containsReservedKey(e){return"object"==typeof e&&Object.keys(e)[0]===...
    method _isVersionInRangeFormat (line 2) | _isVersionInRangeFormat(e){return null===S.clean(e)}
    method _shouldPerformMigration (line 2) | _shouldPerformMigration(e,t,r){return this._isVersionInRangeFormat(e)?...
    method _get (line 2) | _get(e,t){return g.get(this.store,e,t)}
    method _set (line 2) | _set(e,t){const{store:r}=this;g.set(r,e,t),this.store=r}
  function A (line 2) | function A(e,t){for(const r in t)e[r]=(e[r]||0)-(t[r]||0)}
  function T (line 2) | function T(e){return"boolean"==typeof e||"number"==typeof e||null===e?!e...
  method constructor (line 2) | constructor(e,t={}){this._values={},this._blockStarts=[],this._constants...
  method toString (line 2) | toString(){return this._root.render(this.opts)}
  method name (line 2) | name(e){return this._scope.name(e)}
  method scopeName (line 2) | scopeName(e){return this._extScope.name(e)}
  method scopeValue (line 2) | scopeValue(e,t){const r=this._extScope.value(e,t);return(this._values[r....
  method getScopeValue (line 2) | getScopeValue(e,t){return this._extScope.getValue(e,t)}
  method scopeRefs (line 2) | scopeRefs(e){return this._extScope.scopeRefs(e,this._values)}
  method scopeCode (line 2) | scopeCode(){return this._extScope.scopeCode(this._values)}
  method _def (line 2) | _def(e,t,r,n){const s=this._scope.toName(t);return void 0!==r&&n&&(this....
  method const (line 2) | const(e,t,r){return this._def(s.varKinds.const,e,t,r)}
  method let (line 2) | let(e,t,r){return this._def(s.varKinds.let,e,t,r)}
  method var (line 2) | var(e,t,r){return this._def(s.varKinds.var,e,t,r)}
  method assign (line 2) | assign(e,t,r){return this._leafNode(new l(e,t,r))}
  method add (line 2) | add(e,r){return this._leafNode(new u(e,t.operators.ADD,r))}
  method code (line 2) | code(e){return"function"==typeof e?e():e!==n.nil&&this._leafNode(new p(e...
  method object (line 2) | object(...e){const t=["{"];for(const[r,s]of e)t.length>1&&t.push(","),t....
  method if (line 2) | if(e,t,r){if(this._blockNode(new w(e)),t&&r)this.code(t).else().code(r)....
  method elseIf (line 2) | elseIf(e){return this._elseNode(new w(e))}
  method else (line 2) | else(){return this._elseNode(new v)}
  method endIf (line 2) | endIf(){return this._endBlockNode(w,v)}
  method _for (line 2) | _for(e,t){return this._blockNode(e),t&&this.code(t).endFor(),this}
  method for (line 2) | for(e,t){return this._for(new $(e),t)}
  method forRange (line 2) | forRange(e,t,r,n,o=(this.opts.es5?s.varKinds.var:s.varKinds.let)){const ...
  method forOf (line 2) | forOf(e,t,r,o=s.varKinds.const){const i=this._scope.toName(e);if(this.op...
  method forIn (line 2) | forIn(e,t,r,o=(this.opts.es5?s.varKinds.var:s.varKinds.const)){if(this.o...
  method endFor (line 2) | endFor(){return this._endBlockNode(E)}
  method label (line 2) | label(e){return this._leafNode(new d(e))}
  method break (line 2) | break(e){return this._leafNode(new f(e))}
  method return (line 2) | return(e){const t=new O;if(this._blockNode(t),this.code(e),1!==t.nodes.l...
  method try (line 2) | try(e,t,r){if(!t&&!r)throw new Error('CodeGen: "try" without "catch" and...
  method throw (line 2) | throw(e){return this._leafNode(new h(e))}
  method block (line 2) | block(e,t){return this._blockStarts.push(this._nodes.length),e&&this.cod...
  method endBlock (line 2) | endBlock(e){const t=this._blockStarts.pop();if(void 0===t)throw new Erro...
  method func (line 2) | func(e,t=n.nil,r,s){return this._blockNode(new S(e,t,r)),s&&this.code(s)...
  method endFunc (line 2) | endFunc(){return this._endBlockNode(S)}
  method optimize (line 2) | optimize(e=1){for(;e-- >0;)this._root.optimizeNodes(),this._root.optimiz...
  method _leafNode (line 2) | _leafNode(e){return this._currNode.nodes.push(e),this}
  method _blockNode (line 2) | _blockNode(e){this._currNode.nodes.push(e),this._nodes.push(e)}
  method _endBlockNode (line 2) | _endBlockNode(e,t){const r=this._currNode;if(r instanceof e||t&&r instan...
  method _elseNode (line 2) | _elseNode(e){const t=this._currNode;if(!(t instanceof w))throw new Error...
  method _root (line 2) | get _root(){return this._nodes[0]}
  method _currNode (line 2) | get _currNode(){const e=this._nodes;return e[e.length-1]}
  method _currNode (line 2) | set _currNode(e){const t=this._nodes;t[t.length-1]=e}
  function k (line 2) | function k(e){return(t,r)=>t===n.nil?r:r===n.nil?t:n._`${L(t)} ${e} ${L(...
  function L (line 2) | function L(e){return e instanceof n.Name?e:n._`(${e})`}
  class s (line 2) | class s extends Error{constructor(e){super(`CodeGen: "code" for ${e} not...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  class i (line 2) | class i{constructor({prefixes:e,parent:t}={}){this._names={},this._prefi...
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  class a (line 2) | class a extends n.Name{constructor(e,t){super(t),this.prefix=e}setValue(...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  method constructor (line 2) | constructor(e){super(e),this._values={},this._scope=e.scope,this.opts={....
  method get (line 2) | get(){return this._scope}
  method name (line 2) | name(e){return new a(e,this._newName(e))}
  method value (line 2) | value(e,t){var r;if(void 0===t.ref)throw new Error("CodeGen: ref must be...
  method getValue (line 2) | getValue(e,t){const r=this._values[e];if(r)return r.get(t)}
  method scopeRefs (line 2) | scopeRefs(e,t=this._values){return this._reduceValues(t,(t=>{if(void 0==...
  method scopeCode (line 2) | scopeCode(e=this._values,t,r){return this._reduceValues(e,(e=>{if(void 0...
  method _reduceValues (line 2) | _reduceValues(e,r,i={},a){let c=n.nil;for(const l in e){const u=e[l];if(...
  function i (line 2) | function i(e,t){const r=e.const("err",t);e.if(n._`${o.default.vErrors} =...
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  function a (line 2) | function a(e,t){const{gen:r,validateName:s,schemaEnv:o}=e;o.$async?r.thr...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function l (line 2) | function l(e,t,r){const{createErrors:s}=e.it;return!1===s?n._`{}`:functi...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function u (line 2) | function u({errorPath:e},{instancePath:t}){const r=t?n.str`${e}${(0,s.ge...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function d (line 2) | function d({keyword:e,it:{errSchemaPath:t}},{schemaPath:r,parentSchema:o...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  class l (line 2) | class l{constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function u (line 2) | function u(e){const t=f.call(this,e);if(t)return t;const r=(0,i.getFullP...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function d (line 2) | function d(e){return(0,i.inlineRef)(e.schema,this.opts.inlineRefs)?e.sch...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  function f (line 2) | function f(e){for(const n of this._compilations)if(r=e,(t=n).schema===r....
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}
  function h (line 2) | function h(e,t){let r;for(;"string"==typeof(r=this.refs[t]);)t=r;return ...
    method constructor (line 2) | constructor(e){super(),this.error=e}
    method render (line 2) | render({_n:e}){return`throw ${this.error};`+e}
    method names (line 2) | get names(){return this.error.names}
  function p (line 2) | function p(e,t){const r=this.opts.uriResolver.parse(t),n=(0,i._getFullPa...
    method constructor (line 2) | constructor(e){super(),this.code=e}
    method render (line 2) | render({_n:e}){return`${this.code};`+e}
    method optimizeNodes (line 2) | optimizeNodes(){return`${this.code}`?this:void 0}
    method optimizeNames (line 2) | optimizeNames(e,t){return this.code=R(this.code,e,t),this}
    method names (line 2) | get names(){return this.code instanceof n._CodeOrName?this.code.names:{}}
  function y (line 2) | function y(e,{baseId:t,schema:r,root:n}){var s;if("/"!==(null===(s=e.fra...
    method render (line 2) | render(e){return"{"+e._n+super.render(e)+"}"+e._n}
  class s (line 2) | class s extends Error{constructor(e,t,r,s){super(s||`can't resolve refer...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  function c (line 2) | function c(e){for(const t in e){if(a.has(t))return!0;const r=e[t];if(Arr...
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  function l (line 2) | function l(e){let t=0;for(const r in e){if("$ref"===r)return 1/0;if(t++,...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function u (line 2) | function u(e,t="",r){!1!==r&&(t=h(t));const n=e.parse(t);return d(e,n)}
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function d (line 2) | function d(e,t){return e.serialize(t).split("#")[0]+"#"}
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  function h (line 2) | function h(e){return e?e.replace(f,""):""}
    method constructor (line 2) | constructor(e){super(),this.error=e}
    method render (line 2) | render({_n:e}){return`throw ${this.error};`+e}
    method names (line 2) | get names(){return this.error.names}
  function u (line 2) | function u(t){const r=this.opts.uriResolver.resolve;if(t=h(i?r(i,t):t),d...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function y (line 2) | function y(e){if("string"==typeof e){if(!p.test(e))throw new Error(`inva...
    method render (line 2) | render(e){return"{"+e._n+super.render(e)+"}"+e._n}
  function f (line 2) | function f(e,t,r){if(void 0!==t&&!s(e,t))throw m(r)}
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}
  function m (line 2) | function m(e){return new Error(`reference "${e}" resolves to more than o...
    method constructor (line 2) | constructor(e=[]){super(),this.nodes=e}
    method render (line 2) | render(e){return this.nodes.reduce(((t,r)=>t+r.render(e)),"")}
    method optimizeNodes (line 2) | optimizeNodes(){const{nodes:e}=this;let t=e.length;for(;t--;){const r=...
    method optimizeNames (line 2) | optimizeNames(e,t){const{nodes:r}=this;let n=r.length;for(;n--;){const...
    method names (line 2) | get names(){return this.nodes.reduce(((e,t)=>I(e,t.names)),{})}
  function o (line 2) | function o(e,t=e.schema){const{opts:r,self:n}=e;if(!r.strictSchema)retur...
  function i (line 2) | function i(e,t){if("boolean"==typeof e)return!e;for(const r in e)if(t[r]...
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  function a (line 2) | function a(e){return"number"==typeof e?`${e}`:e.replace(/~/g,"~0").repla...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function c (line 2) | function c(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")}
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  function l (line 2) | function l({mergeNames:e,mergeToName:t,mergeValues:r,resultToName:s}){re...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function u (line 2) | function u(e,t){if(!0===t)return e.var("props",!0);const r=e.var("props"...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function d (line 2) | function d(e,t,r){Object.keys(r).forEach((r=>e.assign(n._`${t}${(0,n.get...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  function p (line 2) | function p(e,t,r=e.opts.strictSchema){if(r){if(t=`strict mode: ${t}`,!0=...
    method constructor (line 2) | constructor(e){super(),this.code=e}
    method render (line 2) | render({_n:e}){return`${this.code};`+e}
    method optimizeNodes (line 2) | optimizeNodes(){return`${this.code}`?this:void 0}
    method optimizeNames (line 2) | optimizeNames(e,t){return this.code=R(this.code,e,t),this}
    method names (line 2) | get names(){return this.code instanceof n._CodeOrName?this.code.names:{}}
  function r (line 2) | function r(e,t){return t.rules.some((t=>n(e,t)))}
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  function n (line 2) | function n(e,t){var r;return void 0!==e[t.keyword]||(null===(r=t.definit...
    method constructor (line 2) | constructor(e){if(super(),!t.IDENTIFIER.test(e))throw new Error("CodeG...
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){return!1}
    method names (line 2) | get names(){return{[this.str]:1}}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof n)return e.loose===!!t.loose&&...
    method format (line 8) | format(){return this.range=this.set.map((e=>e.join(" ").trim())).join(...
    method toString (line 8) | toString(){return this.range}
    method parseRange (line 8) | parseRange(e){const t=((this.options.includePrerelease&&p)|(this.optio...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is r...
    method test (line 8) | test(e){if(!e)return!1;if("string"==typeof e)try{e=new c(e,this.option...
  function a (line 2) | function a(e,t){const{gen:r,data:s}=e,o={gen:r,keyword:"false schema",da...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function l (line 2) | function l(e){const t=Array.isArray(e)?e:e?[e]:[];if(t.every(n.isJSONTyp...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function l (line 2) | function l(e){switch(e){case"string":return void n.elseIf(i._`${a} == "n...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function d (line 5) | function d(e,t,r,n=c.Correct){const s=n===c.Correct?i.operators.EQ:i.ope...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  function f (line 5) | function f(e,t,r,n){if(1===e.length)return d(e[0],t,r,n);let s;const o=(...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}
  function p (line 5) | function p(e){const t=function(e){const{gen:t,data:r,schema:n}=e,s=(0,a....
    method constructor (line 2) | constructor(e){super(),this.code=e}
    method render (line 2) | render({_n:e}){return`${this.code};`+e}
    method optimizeNodes (line 2) | optimizeNodes(){return`${this.code}`?this:void 0}
    method optimizeNames (line 2) | optimizeNames(e,t){return this.code=R(this.code,e,t),this}
    method names (line 2) | get names(){return this.code instanceof n._CodeOrName?this.code.names:{}}
  function o (line 5) | function o(e,t,r){const{gen:o,compositeRule:i,data:a,opts:c}=e;if(void 0...
  function m (line 5) | function m({gen:e,validateName:t,schema:r,schemaEnv:n,opts:s},o){s.code....
    method constructor (line 2) | constructor(e=[]){super(),this.nodes=e}
    method render (line 2) | render(e){return this.nodes.reduce(((t,r)=>t+r.render(e)),"")}
    method optimizeNodes (line 2) | optimizeNodes(){const{nodes:e}=this;let t=e.length;for(;t--;){const r=...
    method optimizeNames (line 2) | optimizeNames(e,t){const{nodes:r}=this;let n=r.length;for(;n--;){const...
    method names (line 2) | get names(){return this.nodes.reduce(((e,t)=>I(e,t.names)),{})}
  function y (line 5) | function y(e,t){const r="object"==typeof e&&e[t.schemaId];return r&&(t.c...
    method render (line 2) | render(e){return"{"+e._n+super.render(e)+"}"+e._n}
  function g (line 5) | function g({schema:e,self:t}){if("boolean"==typeof e)return!e;for(const ...
  function v (line 5) | function v(e){return"boolean"!=typeof e.schema}
  function w (line 5) | function w(e){(0,h.checkUnknownRules)(e),function(e){const{schema:t,errS...
    method constructor (line 2) | constructor(e,t){super(t),this.condition=e}
    method render (line 2) | render(e){let t=`if(${this.condition})`+super.render(e);return this.el...
    method optimizeNodes (line 2) | optimizeNodes(){super.optimizeNodes();const e=this.condition;if(!0===e...
    method optimizeNames (line 2) | optimizeNames(e,t){var r;if(this.else=null===(r=this.else)||void 0===r...
    method names (line 2) | get names(){const e=super.names;return j(e,this.condition),this.else&&...
    method constructor (line 8) | constructor(e,t,r,n,s){this.key=e,this.value=t,this.length=r,this.now=...
  function E (line 5) | function E(e,t){if(e.opts.jtd)return _(e,[],!1,t);const r=(0,s.getSchema...
  function $ (line 5) | function $({gen:e,schemaEnv:t,schema:r,errSchemaPath:n,opts:s}){const o=...
    method constructor (line 2) | constructor(e){super(),this.iteration=e}
    method render (line 2) | render(e){return`for(${this.iteration})`+super.render(e)}
    method optimizeNames (line 2) | optimizeNames(e,t){if(super.optimizeNames(e,t))return this.iteration=R...
    method names (line 2) | get names(){return I(super.names,this.iteration.names)}
    method constructor (line 5) | constructor(e={}){this.schemas={},this.refs={},this.formats={},this._c...
    method _addVocabularies (line 5) | _addVocabularies(){this.addKeyword("$async")}
    method _addDefaultMetaSchema (line 5) | _addDefaultMetaSchema(){const{$data:e,meta:t,schemaId:r}=this.opts;let...
    method defaultMeta (line 5) | defaultMeta(){const{meta:e,schemaId:t}=this.opts;return this.opts.defa...
    method validate (line 5) | validate(e,t){let r;if("string"==typeof e){if(r=this.getSchema(e),!r)t...
    method compile (line 5) | compile(e,t){const r=this._addSchema(e,t);return r.validate||this._com...
    method compileAsync (line 5) | compileAsync(e,t){if("function"!=typeof this.opts.loadSchema)throw new...
    method addSchema (line 5) | addSchema(e,t,r,n=this.opts.validateSchema){if(Array.isArray(e)){for(c...
    method addMetaSchema (line 5) | addMetaSchema(e,t,r=this.opts.validateSchema){return this.addSchema(e,...
    method validateSchema (line 5) | validateSchema(e,t){if("boolean"==typeof e)return!0;let r;if(r=e.$sche...
    method getSchema (line 5) | getSchema(e){let t;for(;"string"==typeof(t=b.call(this,e));)e=t;if(voi...
    method removeSchema (line 5) | removeSchema(e){if(e instanceof RegExp)return this._removeAllSchemas(t...
    method addVocabulary (line 5) | addVocabulary(e){for(const t of e)this.addKeyword(t);return this}
    method addKeyword (line 5) | addKeyword(e,t){let r;if("string"==typeof e)r=e,"object"==typeof t&&(t...
    method getKeyword (line 5) | getKeyword(e){const t=this.RULES.all[e];return"object"==typeof t?t.def...
    method removeKeyword (line 5) | removeKeyword(e){const{RULES:t}=this;delete t.keywords[e],delete t.all...
    method addFormat (line 5) | addFormat(e,t){return"string"==typeof t&&(t=new RegExp(t)),this.format...
    method errorsText (line 5) | errorsText(e=this.errors,{separator:t=", ",dataVar:r="data"}={}){retur...
    method $dataMetaSchema (line 5) | $dataMetaSchema(e,t){const r=this.RULES.all;e=JSON.parse(JSON.stringif...
    method _removeAllSchemas (line 5) | _removeAllSchemas(e,t){for(const r in e){const n=e[r];t&&!t.test(r)||(...
    method _addSchema (line 5) | _addSchema(e,t,r,n=this.opts.validateSchema,s=this.opts.addUsedSchema)...
    method _checkUnique (line 5) | _checkUnique(e){if(this.schemas[e]||this.refs[e])throw new Error(`sche...
    method _compileSchemaEnv (line 5) | _compileSchemaEnv(e){if(e.meta?this._compileMetaSchema(e):c.compileSch...
    method _compileMetaSchema (line 5) | _compileMetaSchema(e){const t=this.opts;this.opts=this._metaOpts;try{c...
  function _ (line 5) | function _(e,t,r,n){const{gen:s,schema:a,data:c,allErrors:l,opts:f,self:...
    method constructor (line 2) | constructor(e,t,r,n){super(),this.varKind=e,this.name=t,this.from=r,th...
    method render (line 2) | render(e){const t=e.es5?s.varKinds.var:this.varKind,{name:r,from:n,to:...
    method names (line 2) | get names(){const e=j(super.names,this.from);return j(e,this.to)}
  function b (line 5) | function b(e,t){const{gen:r,schema:n,opts:{useDefaults:s}}=e;s&&(0,a.ass...
    method constructor (line 2) | constructor(e,t,r,n){super(),this.loop=e,this.varKind=t,this.name=r,th...
    method render (line 2) | render(e){return`for(${this.varKind} ${this.name} ${this.loop} ${this....
    method optimizeNames (line 2) | optimizeNames(e,t){if(super.optimizeNames(e,t))return this.iterable=R(...
    method names (line 2) | get names(){return I(super.names,this.iterable.names)}
  function S (line 5) | function S(e,t){return e.includes(t)||"integer"===t&&e.includes("number")}
    method constructor (line 2) | constructor(e,t,r){super(),this.name=e,this.args=t,this.async=r}
    method render (line 2) | render(e){return`${this.async?"async ":""}function ${this.name}(${this...
  function O (line 5) | function O(e,t){t+=` at "${e.schemaEnv.baseId+e.errSchemaPath}" (strictT...
    method render (line 2) | render(e){return"return "+super.render(e)}
  class P (line 5) | class P{constructor(e,t,r){if((0,c.validateKeywordUsage)(e,t,r),this.gen...
    method render (line 2) | render(e){let t="try"+super.render(e);return this.catch&&(t+=this.catc...
    method optimizeNodes (line 2) | optimizeNodes(){var e,t;return super.optimizeNodes(),null===(e=this.ca...
    method optimizeNames (line 2) | optimizeNames(e,t){var r,n;return super.optimizeNames(e,t),null===(r=t...
    method names (line 2) | get names(){const e=super.names;return this.catch&&I(e,this.catch.name...
    method constructor (line 5) | constructor(e,t,r){if((0,c.validateKeywordUsage)(e,t,r),this.gen=e.gen...
    method result (line 5) | result(e,t,r){this.failResult((0,u.not)(e),t,r)}
    method failResult (line 5) | failResult(e,t,r){this.gen.if(e),r?r():this.error(),t?(this.gen.else()...
    method pass (line 5) | pass(e,t){this.failResult((0,u.not)(e),void 0,t)}
    method fail (line 5) | fail(e){if(void 0===e)return this.error(),void(this.allErrors||this.ge...
    method fail$data (line 5) | fail$data(e){if(!this.$data)return this.fail(e);const{schemaCode:t}=th...
    method error (line 5) | error(e,t,r){if(t)return this.setParams(t),this._error(e,r),void this....
    method _error (line 5) | _error(e,t){(e?p.reportExtraError:p.reportError)(this,this.def.error,t)}
    method $dataError (line 5) | $dataError(){(0,p.reportError)(this,this.def.$dataError||p.keyword$Dat...
    method reset (line 5) | reset(){if(void 0===this.errsCount)throw new Error('add "trackErrors" ...
    method ok (line 5) | ok(e){this.allErrors||this.gen.if(e)}
    method setParams (line 5) | setParams(e,t){t?Object.assign(this.params,e):this.params=e}
    method block$data (line 5) | block$data(e,t,r=u.nil){this.gen.block((()=>{this.check$data(e,r),t()}))}
    method check$data (line 5) | check$data(e=u.nil,t=u.nil){if(!this.$data)return;const{gen:r,schemaCo...
    method invalid$data (line 5) | invalid$data(){const{gen:e,schemaCode:t,schemaType:r,def:n,it:s}=this;...
    method subschema (line 5) | subschema(e,t){const r=(0,l.getSubschema)(this.it,e);(0,l.extendSubsch...
    method mergeEvaluated (line 5) | mergeEvaluated(e,t){const{it:r,gen:n}=this;r.opts.unevaluated&&(!0!==r...
    method mergeValidEvaluated (line 5) | mergeValidEvaluated(e,t){const{it:r,gen:n}=this;if(r.opts.unevaluated&...
  function x (line 5) | function x(e,t,r,n){const s=new P(e,r,t);"code"in r?r.code(s,n):s.$data&...
    method constructor (line 2) | constructor(e){super(),this.error=e}
    method render (line 2) | render(e){return`catch(${this.error})`+super.render(e)}
  function j (line 5) | function j(e,{dataLevel:t,dataNames:r,dataPathArr:n}){let s,o;if(""===e)...
  function a (line 5) | function a(e){const{gen:t,data:r,it:s}=e;t.if(s.parentData,(()=>t.assign...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function c (line 5) | function c(e,t,r){if(void 0===r)throw new Error(`keyword "${t}" failed t...
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  function v (line 5) | function v(r=(t.async?n._`await `:n.nil)){const i=p.opts.passContext?s.d...
  function w (line 5) | function w(e){var r;l.if((0,n.not)(null!==(r=t.valid)&&void 0!==r?r:g),e)}
    method constructor (line 2) | constructor(e,t){super(t),this.condition=e}
    method render (line 2) | render(e){let t=`if(${this.condition})`+super.render(e);return this.el...
    method optimizeNodes (line 2) | optimizeNodes(){super.optimizeNodes();const e=this.condition;if(!0===e...
    method optimizeNames (line 2) | optimizeNames(e,t){var r;if(this.else=null===(r=this.else)||void 0===r...
    method names (line 2) | get names(){const e=super.names;return j(e,this.condition),this.else&&...
    method constructor (line 8) | constructor(e,t,r,n,s){this.key=e,this.value=t,this.length=r,this.now=...
  function u (line 5) | function u(r){e.data=r,e.dataLevel=t.dataLevel+1,e.dataTypes=[],t.define...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function E (line 5) | function E(e){var t,r,n,s,o,i,a,c,l,u,d,f,h,y,g,v,w,E,$,_,b,S,O,P,x;cons...
  class $ (line 5) | class ${constructor(e={}){this.schemas={},this.refs={},this.formats={},t...
    method constructor (line 2) | constructor(e){super(),this.iteration=e}
    method render (line 2) | render(e){return`for(${this.iteration})`+super.render(e)}
    method optimizeNames (line 2) | optimizeNames(e,t){if(super.optimizeNames(e,t))return this.iteration=R...
    method names (line 2) | get names(){return I(super.names,this.iteration.names)}
    method constructor (line 5) | constructor(e={}){this.schemas={},this.refs={},this.formats={},this._c...
    method _addVocabularies (line 5) | _addVocabularies(){this.addKeyword("$async")}
    method _addDefaultMetaSchema (line 5) | _addDefaultMetaSchema(){const{$data:e,meta:t,schemaId:r}=this.opts;let...
    method defaultMeta (line 5) | defaultMeta(){const{meta:e,schemaId:t}=this.opts;return this.opts.defa...
    method validate (line 5) | validate(e,t){let r;if("string"==typeof e){if(r=this.getSchema(e),!r)t...
    method compile (line 5) | compile(e,t){const r=this._addSchema(e,t);return r.validate||this._com...
    method compileAsync (line 5) | compileAsync(e,t){if("function"!=typeof this.opts.loadSchema)throw new...
    method addSchema (line 5) | addSchema(e,t,r,n=this.opts.validateSchema){if(Array.isArray(e)){for(c...
    method addMetaSchema (line 5) | addMetaSchema(e,t,r=this.opts.validateSchema){return this.addSchema(e,...
    method validateSchema (line 5) | validateSchema(e,t){if("boolean"==typeof e)return!0;let r;if(r=e.$sche...
    method getSchema (line 5) | getSchema(e){let t;for(;"string"==typeof(t=b.call(this,e));)e=t;if(voi...
    method removeSchema (line 5) | removeSchema(e){if(e instanceof RegExp)return this._removeAllSchemas(t...
    method addVocabulary (line 5) | addVocabulary(e){for(const t of e)this.addKeyword(t);return this}
    method addKeyword (line 5) | addKeyword(e,t){let r;if("string"==typeof e)r=e,"object"==typeof t&&(t...
    method getKeyword (line 5) | getKeyword(e){const t=this.RULES.all[e];return"object"==typeof t?t.def...
    method removeKeyword (line 5) | removeKeyword(e){const{RULES:t}=this;delete t.keywords[e],delete t.all...
    method addFormat (line 5) | addFormat(e,t){return"string"==typeof t&&(t=new RegExp(t)),this.format...
    method errorsText (line 5) | errorsText(e=this.errors,{separator:t=", ",dataVar:r="data"}={}){retur...
    method $dataMetaSchema (line 5) | $dataMetaSchema(e,t){const r=this.RULES.all;e=JSON.parse(JSON.stringif...
    method _removeAllSchemas (line 5) | _removeAllSchemas(e,t){for(const r in e){const n=e[r];t&&!t.test(r)||(...
    method _addSchema (line 5) | _addSchema(e,t,r,n=this.opts.validateSchema,s=this.opts.addUsedSchema)...
    method _checkUnique (line 5) | _checkUnique(e){if(this.schemas[e]||this.refs[e])throw new Error(`sche...
    method _compileSchemaEnv (line 5) | _compileSchemaEnv(e){if(e.meta?this._compileMetaSchema(e):c.compileSch...
    method _compileMetaSchema (line 5) | _compileMetaSchema(e){const t=this.opts;this.opts=this._metaOpts;try{c...
  function _ (line 5) | function _(e,t,r,n="error"){for(const s in e){const o=s;o in t&&this.log...
    method constructor (line 2) | constructor(e,t,r,n){super(),this.varKind=e,this.name=t,this.from=r,th...
    method render (line 2) | render(e){const t=e.es5?s.varKinds.var:this.varKind,{name:r,from:n,to:...
    method names (line 2) | get names(){const e=j(super.names,this.from);return j(e,this.to)}
  function b (line 5) | function b(e){return e=(0,u.normalizeId)(e),this.schemas[e]||this.refs[e]}
    method constructor (line 2) | constructor(e,t,r,n){super(),this.loop=e,this.varKind=t,this.name=r,th...
    method render (line 2) | render(e){return`for(${this.varKind} ${this.name} ${this.loop} ${this....
    method optimizeNames (line 2) | optimizeNames(e,t){if(super.optimizeNames(e,t))return this.iterable=R(...
    method names (line 2) | get names(){return I(super.names,this.iterable.names)}
  function S (line 5) | function S(){const e=this.opts.schemas;if(e)if(Array.isArray(e))this.add...
    method constructor (line 2) | constructor(e,t,r){super(),this.name=e,this.args=t,this.async=r}
    method render (line 2) | render(e){return`${this.async?"async ":""}function ${this.name}(${this...
  function O (line 5) | function O(){for(const e in this.opts.formats){const t=this.opts.formats...
    method render (line 2) | render(e){return"return "+super.render(e)}
  function P (line 5) | function P(e){if(Array.isArray(e))this.addVocabulary(e);else{this.logger...
    method render (line 2) | render(e){let t="try"+super.render(e);return this.catch&&(t+=this.catc...
    method optimizeNodes (line 2) | optimizeNodes(){var e,t;return super.optimizeNodes(),null===(e=this.ca...
    method optimizeNames (line 2) | optimizeNames(e,t){var r,n;return super.optimizeNames(e,t),null===(r=t...
    method names (line 2) | get names(){const e=super.names;return this.catch&&I(e,this.catch.name...
    method constructor (line 5) | constructor(e,t,r){if((0,c.validateKeywordUsage)(e,t,r),this.gen=e.gen...
    method result (line 5) | result(e,t,r){this.failResult((0,u.not)(e),t,r)}
    method failResult (line 5) | failResult(e,t,r){this.gen.if(e),r?r():this.error(),t?(this.gen.else()...
    method pass (line 5) | pass(e,t){this.failResult((0,u.not)(e),void 0,t)}
    method fail (line 5) | fail(e){if(void 0===e)return this.error(),void(this.allErrors||this.ge...
    method fail$data (line 5) | fail$data(e){if(!this.$data)return this.fail(e);const{schemaCode:t}=th...
    method error (line 5) | error(e,t,r){if(t)return this.setParams(t),this._error(e,r),void this....
    method _error (line 5) | _error(e,t){(e?p.reportExtraError:p.reportError)(this,this.def.error,t)}
    method $dataError (line 5) | $dataError(){(0,p.reportError)(this,this.def.$dataError||p.keyword$Dat...
    method reset (line 5) | reset(){if(void 0===this.errsCount)throw new Error('add "trackErrors" ...
    method ok (line 5) | ok(e){this.allErrors||this.gen.if(e)}
    method setParams (line 5) | setParams(e,t){t?Object.assign(this.params,e):this.params=e}
    method block$data (line 5) | block$data(e,t,r=u.nil){this.gen.block((()=>{this.check$data(e,r),t()}))}
    method check$data (line 5) | check$data(e=u.nil,t=u.nil){if(!this.$data)return;const{gen:r,schemaCo...
    method invalid$data (line 5) | invalid$data(){const{gen:e,schemaCode:t,schemaType:r,def:n,it:s}=this;...
    method subschema (line 5) | subschema(e,t){const r=(0,l.getSubschema)(this.it,e);(0,l.extendSubsch...
    method mergeEvaluated (line 5) | mergeEvaluated(e,t){const{it:r,gen:n}=this;r.opts.unevaluated&&(!0!==r...
    method mergeValidEvaluated (line 5) | mergeValidEvaluated(e,t){const{it:r,gen:n}=this;if(r.opts.unevaluated&...
  function x (line 5) | function x(){const e={...this.opts};for(const t of y)delete e[t];return e}
    method constructor (line 2) | constructor(e){super(),this.error=e}
    method render (line 2) | render(e){return`catch(${this.error})`+super.render(e)}
  method log (line 5) | log(){}
  method warn (line 5) | warn(){}
  method error (line 5) | error(){}
  function j (line 5) | function j(e,t){const{RULES:r}=this;if((0,f.eachItem)(e,(e=>{if(r.keywor...
  function R (line 5) | function R(e,t,r){var n;const s=null==t?void 0:t.post;if(r&&s)throw new ...
    method constructor (line 2) | constructor(e={}){var t;o.set(this,void 0),i.set(this,void 0),a.set(th...
    method get (line 2) | get(e,t){if(u(this,a,"f").accessPropertiesByDotNotation)return this._g...
    method set (line 2) | set(e,t){if("string"!=typeof e&&"object"!=typeof e)throw new TypeError...
    method has (line 2) | has(e){return u(this,a,"f").accessPropertiesByDotNotation?g.has(this.s...
    method reset (line 2) | reset(...e){for(const t of e)null!=u(this,c,"f")[t]&&this.set(t,u(this...
    method delete (line 2) | delete(e){const{store:t}=this;u(this,a,"f").accessPropertiesByDotNotat...
    method clear (line 2) | clear(){this.store=x();for(const e of Object.keys(u(this,c,"f")))this....
    method onDidChange (line 2) | onDidChange(e,t){if("string"!=typeof e)throw new TypeError("Expected `...
    method onDidAnyChange (line 2) | onDidAnyChange(e){if("function"!=typeof e)throw new TypeError("Expecte...
    method size (line 2) | get size(){return Object.keys(this.store).length}
    method store (line 2) | get store(){try{const e=f.readFileSync(this.path,u(this,i,"f")?null:"u...
    method store (line 2) | set store(e){this._ensureDirectory(),this._validate(e),this._write(e),...
    method _encryptData (line 2) | _encryptData(e){if(!u(this,i,"f"))return e.toString();try{if(u(this,i,...
    method _handleChange (line 2) | _handleChange(e,t){let r=e();const n=()=>{const n=r,s=e();(0,d.isDeepS...
    method _validate (line 2) | _validate(e){if(!u(this,o,"f"))return;if(u(this,o,"f").call(this,e)||!...
    method _ensureDirectory (line 2) | _ensureDirectory(){f.mkdirSync(h.dirname(this.path),{recursive:!0})}
    method _write (line 2) | _write(e){let t=this._serialize(e);if(u(this,i,"f")){const e=p.randomB...
    method _watch (line 2) | _watch(){this._ensureDirectory(),f.existsSync(this.path)||this._write(...
    method _migrate (line 2) | _migrate(e,t,r){let n=this._get(j,"0.0.0");const s=Object.keys(e).filt...
    method _containsReservedKey (line 2) | _containsReservedKey(e){return"object"==typeof e&&Object.keys(e)[0]===...
    method _isVersionInRangeFormat (line 2) | _isVersionInRangeFormat(e){return null===S.clean(e)}
    method _shouldPerformMigration (line 2) | _shouldPerformMigration(e,t,r){return this._isVersionInRangeFormat(e)?...
    method _get (line 2) | _get(e,t){return g.get(this.store,e,t)}
    method _set (line 2) | _set(e,t){const{store:r}=this;g.set(r,e,t),this.store=r}
  function A (line 5) | function A(e,t,r){const n=e.rules.findIndex((e=>e.keyword===r));n>=0?e.r...
  function T (line 5) | function T(e){let{metaSchema:t}=e;void 0!==t&&(e.$data&&this.opts.$data&...
  function D (line 5) | function D(e){return{anyOf:[e,C]}}
  function r (line 5) | function r(e){const t=e.length;let r,n=0,s=0;for(;s<t;)n++,r=e.charCodeA...
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  class r (line 5) | class r extends Error{constructor(e){super("validation failed"),this.err...
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  method code (line 5) | code(e){const{parentSchema:t,it:r}=e,{items:n}=t;Array.isArray(n)?i(e,n)...
  function i (line 5) | function i(e,t){const{gen:r,schema:o,data:i,keyword:a,it:c}=e;c.items=!0...
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  method code (line 5) | code(e){const{gen:t,schema:r,parentSchema:a,data:c,errsCount:l,it:u}=e;i...
  method code (line 5) | code(e){const{gen:t,schema:r,it:s}=e;if(!Array.isArray(r))throw new Erro...
  method code (line 5) | code(e){const{gen:t,schema:r,parentSchema:o,data:i,it:a}=e;let c,l;const...
  method code (line 8) | code(e){const[t,r]=function({schema:e}){const t={},r={};for(const n in e...
  function a (line 8) | function a(e,t=e.schema){const{gen:r,data:s,it:i}=e;if(0===Object.keys(t...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function c (line 8) | function c(e,t=e.schema){const{gen:r,data:n,keyword:i,it:a}=e,c=r.name("...
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  method code (line 8) | code(e){const{gen:t,parentSchema:r,it:o}=e;void 0===r.then&&void 0===r.e...
  function i (line 8) | function i(e,t){const r=e.schema[t];return void 0!==r&&!(0,s.alwaysValid...
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  method code (line 8) | code(e){const{schema:t,it:r}=e;if(Array.isArray(t))return a(e,"additiona...
  function a (line 8) | function a(e,t,r=e.schema){const{gen:o,parentSchema:i,data:a,keyword:c,i...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  method code (line 8) | code(e){const{schema:t,parentSchema:r,it:n}=e,{prefixItems:a}=r;n.items=...
  method code (line 8) | code(e){const{gen:t,schema:r,it:s}=e;if((0,n.alwaysValidSchema)(s,r))ret...
  method code (line 8) | code(e){const{gen:t,schema:r,parentSchema:o,it:i}=e;if(!Array.isArray(r)...
  method code (line 8) | code(e){const{gen:t,schema:r,data:a,parentSchema:c,it:l}=e,{opts:u}=l,d=...
  method code (line 8) | code(e){const{gen:t,schema:r,parentSchema:a,data:c,it:l}=e;"all"===l.opt...
  method code (line 8) | code(e){const{gen:t,schema:r,data:o,it:i}=e;if((0,s.alwaysValidSchema)(i...
  method code (line 8) | code({keyword:e,parentSchema:t,it:r}){void 0===t.if&&(0,n.checkStrictMod...
  function a (line 8) | function a(e){return e.scopeValue("func",{ref:Object.prototype.hasOwnPro...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function c (line 8) | function c(e,t,r){return n._`${a(e)}.call(${t}, ${r})`}
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  function l (line 8) | function l(e,t,r,s){const o=n._`${t}${(0,n.getProperty)(r)} === undefine...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function u (line 8) | function u(e){return e?Object.keys(e).filter((e=>"__proto__"!==e)):[]}
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function c (line 8) | function c(i){const c=t.const("len",n._`${r}.length`);t.forRange("i",0,c...
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  method code (line 8) | code(){throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schem...
  method code (line 8) | code(e){const{gen:t,schema:r,it:s}=e,{baseId:i,schemaEnv:c,validateName:...
  function u (line 8) | function u(e,t){const{gen:r}=e;return t.validate?r.scopeValue("validate"...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function d (line 8) | function d(e,t,r,n){const{gen:a,it:l}=e,{allErrors:u,schemaEnv:d,opts:f}...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  method code (line 8) | code(e){const{gen:t,data:r,schema:a,parentSchema:c,it:l}=e,{oneOf:u}=c;i...
  method code (line 8) | code(e,t){const{gen:r,data:s,$data:o,schema:i,schemaCode:a,it:c}=e,{opts...
  method code (line 8) | code(e){const{gen:t,data:r,$data:i,schemaCode:a,schema:c}=e;i||c&&"objec...
  method code (line 8) | code(e){const{gen:t,data:r,$data:i,schema:a,schemaCode:c,it:l}=e;if(!i&&...
  method message (line 8) | message({keyword:e,schemaCode:t}){const r="maxItems"===e?"more":"fewer";...
  method code (line 8) | code(e){const{keyword:t,data:r,schemaCode:s}=e,o="maxItems"===t?n.operat...
  method message (line 8) | message({keyword:e,schemaCode:t}){const r="maxLength"===e?"more":"fewer"...
  method code (line 8) | code(e){const{keyword:t,data:r,schemaCode:i,it:a}=e,c="maxLength"===t?n....
  method code (line 8) | code(e){const{keyword:t,data:r,schemaCode:s}=e;e.fail$data(n._`${r} ${o[...
  method message (line 8) | message({keyword:e,schemaCode:t}){const r="maxProperties"===e?"more":"fe...
  method code (line 8) | code(e){const{keyword:t,data:r,schemaCode:s}=e,o="maxProperties"===t?n.o...
  method code (line 8) | code(e){const{gen:t,data:r,schemaCode:s,it:o}=e,i=o.opts.multipleOfPreci...
  method code (line 8) | code(e){const{data:t,$data:r,schema:o,schemaCode:i,it:a}=e,c=a.opts.unic...
  method code (line 8) | code(e){const{gen:t,schema:r,schemaCode:i,data:a,$data:c,it:l}=e,{opts:u...
  method code (line 8) | code(e){const{gen:t,data:r,$data:a,schema:c,parentSchema:l,schemaCode:u,...
  function r (line 8) | function r(e,n,s,o,i,a,c,l,u,d){if(o&&"object"==typeof o&&!Array.isArray...
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  function o (line 8) | function o(e){const t=e.split("."),r=[];for(let e=0;e<t.length;e++){let ...
  method get (line 8) | get(e,t,r){if(!n(e)||"string"!=typeof t)return void 0===r?e:r;const s=o(...
  method set (line 8) | set(e,t,r){if(!n(e)||"string"!=typeof t)return e;const s=e,i=o(t);for(le...
  method delete (line 8) | delete(e,t){if(!n(e)||"string"!=typeof t)return!1;const r=o(t);for(let t...
  method has (line 8) | has(e,t){if(!n(e)||"string"!=typeof t)return!1;const r=o(t);if(0===r.len...
  class s (line 8) | class s{static instances={};errorHandler=null;eventLogger=null;functions...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  method get (line 8) | get(){switch(typeof t.labelPadding){case"boolean":return t.labelPadding?...
  function t (line 8) | function t(r){t.maxLabelLength=Math.max(t.maxLabelLength,r.length);const...
  method constructor (line 8) | constructor({logFn:e=null,onError:t=null,showDialog:r=!0}={}){this.creat...
  method handle (line 8) | handle(e,{logFn:t=this.logFn,onError:r=this.onError,processType:s="brows...
  method setOptions (line 8) | setOptions({logFn:e,onError:t,showDialog:r}){"function"==typeof e&&(this...
  method startCatching (line 8) | startCatching({onError:e,showDialog:t}={}){this.isActive||(this.isActive...
  method stopCatching (line 8) | stopCatching(){this.isActive=!1,process.removeListener("uncaughtExceptio...
  method createIssue (line 8) | createIssue(e,t){n.openUrl(`${e}?${new URLSearchParams(t).toString()}`)}
  method handleError (line 8) | handleError(e){this.handle(e,{errorName:"Unhandled"})}
  method handleRejection (line 8) | handleRejection(e){const t=e instanceof Error?e:new Error(JSON.stringify...
  method constructor (line 8) | constructor(e={}){this.setOptions(e)}
  method setOptions (line 8) | setOptions({events:e,level:t,logger:r,format:n,formatters:s,scope:o}){"o...
  method startLogging (line 8) | startLogging(e={}){this.setOptions(e),this.disposeListeners();for(const ...
  method stopLogging (line 8) | stopLogging(){this.disposeListeners()}
  method arrayToObject (line 8) | arrayToObject(e,t){const r={};return t.forEach(((t,n)=>{r[t]=e[n]})),e.l...
  method disposeListeners (line 8) | disposeListeners(){this.disposers.forEach((e=>e())),this.disposers=[]}
  method formatEventLog (line 8) | formatEventLog({eventName:e,eventSource:t,handlerArgs:r}){const[n,...s]=...
  method getEventNames (line 8) | getEventNames(e){return e&&"object"==typeof e?Object.entries(e).filter((...
  method getWebContentsDetails (line 8) | getWebContentsDetails(e){if(!e?.loadURL)return{};try{return{webContents:...
  method handleEvent (line 8) | handleEvent({eventName:e,eventSource:t,handlerArgs:r}){const n=this.form...
  function i (line 8) | function i(){return c("app")}
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  function a (line 8) | function a(){const e=i();return e?"name"in e?e.name:e.getName():null}
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function c (line 8) | function c(e){return o?.[e]||null}
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  function l (line 8) | function l(){return"browser"===process.type&&o?.ipcMain?o.ipcMain:"rende...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function u (line 8) | function u(){const e=i();return e?"version"in e?e.version:e.getVersion()...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function d (line 8) | function d(){let e=n.type().replace("_"," "),t=n.release();return"Darwin...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  function f (line 8) | function f(e){const t=i();if(!t)return null;try{return t.getPath(e)}catc...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}
  method isDev (line 8) | isDev(){const e=i();return void 0!==e?.isPackaged?!e.isPackaged:"string"...
  method onAppReady (line 8) | onAppReady(e){o?.app?.isReady()?e():o?.app?.once?o?.app?.once("ready",e)...
  method onEveryWebContentsEvent (line 8) | onEveryWebContentsEvent(e,t){return o?.webContents?.getAllWebContents()....
  method onIpc (line 8) | onIpc(e,t){l()?.on(e,t)}
  method onIpcInvoke (line 8) | onIpcInvoke(e,t){l()?.handle?.(e,t)}
  method openUrl (line 8) | openUrl(e,t=console.error){c("shell")?.openExternal(e).catch(t)}
  method setPreloadFileForSessions (line 8) | setPreloadFileForSessions({filePath:e,includeFutureSession:t=!0,getSessi...
  method sendIpc (line 8) | sendIpc(e,t){"browser"===process.type?function(e,t){o?.BrowserWindow?.ge...
  method showErrorBox (line 8) | showErrorBox(e,t){const r=c("dialog");r&&r.showErrorBox(e,t)}
  function f (line 8) | function f(e){c.getInstance(e)?.processMessage(e)}
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}
  method initialize (line 8) | initialize({getSessions:e,includeFutureSession:t,logger:r,preload:c=!0,s...
  function s (line 8) | function s(e){const t=Math.abs(e);return`${e>=0?"-":"+"}${Math.floor(t/6...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  function o (line 8) | function o({data:e,logger:t,message:r}){const{defaultLabel:n,labelLength...
  function i (line 8) | function i({data:e,message:t}){let r=e[0];if("string"!=typeof r)return e...
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  function a (line 8) | function a({data:e}){const t=e[0];if("string"!=typeof t)return e;if(t.la...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  method format (line 8) | format({message:e,logger:t,transport:r,data:s=e?.data}){switch(typeof r....
  function s (line 8) | function s(e={}){const t=new WeakSet;return function(r,n){if("object"==t...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  function o (line 8) | function o(e,t,r={}){const n=!1!==r?.serializeMapAndSet;return t instanc...
  method maxDepth (line 8) | maxDepth({data:t,transport:r,depth:n=r?.depth??6}){if(!t)return t;if(n<1...
  method toString (line 8) | toString({data:e,transport:t}){const r=t?.inspectOptions||{},o=e.map((e=...
  function r (line 8) | function r(e){const r=e.replace(/color:\s*(\w+).*/,"$1").toLowerCase();r...
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  function n (line 8) | function n(e){return e+t.unset}
    method constructor (line 2) | constructor(e){if(super(),!t.IDENTIFIER.test(e))throw new Error("CodeG...
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){return!1}
    method names (line 2) | get names(){return{[this.str]:1}}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof n)return e.loose===!!t.loose&&...
    method format (line 8) | format(){return this.range=this.set.map((e=>e.join(" ").trim())).join(...
    method toString (line 8) | toString(){return this.range}
    method parseRange (line 8) | parseRange(e){const t=((this.options.includePrerelease&&p)|(this.optio...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is r...
    method test (line 8) | test(e){if(!e)return!1;if("string"==typeof e)try{e=new c(e,this.option...
  function s (line 8) | function s(e,t,r){const n={};return e.reduce(((e,s,o,i)=>{if(n[o])return...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  function f (line 8) | function f(e){return Object.assign((function t(r){const n=l({logger:e,me...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}
  function h (line 8) | function h({data:e,message:t,transport:r}){return r.format!==d?e:[`color...
    method constructor (line 2) | constructor(e){super(),this.error=e}
    method render (line 2) | render({_n:e}){return`throw ${this.error};`+e}
    method names (line 2) | get names(){return this.error.names}
  function p (line 8) | function p(e){const{message:t,transport:r}=e;return(function(e,t){if("bo...
    method constructor (line 2) | constructor(e){super(),this.code=e}
    method render (line 2) | render({_n:e}){return`${this.code};`+e}
    method optimizeNodes (line 2) | optimizeNodes(){return`${this.code}`?this:void 0}
    method optimizeNames (line 2) | optimizeNames(e,t){return this.code=R(this.code,e,t),this}
    method names (line 2) | get names(){return this.code instanceof n._CodeOrName?this.code.names:{}}
  function m (line 8) | function m(e){const t={error:"red",warn:"yellow",info:"cyan",default:"un...
    method constructor (line 2) | constructor(e=[]){super(),this.nodes=e}
    method render (line 2) | render(e){return this.nodes.reduce(((t,r)=>t+r.render(e)),"")}
    method optimizeNodes (line 2) | optimizeNodes(){const{nodes:e}=this;let t=e.length;for(;t--;){const r=...
    method optimizeNames (line 2) | optimizeNames(e,t){const{nodes:r}=this;let n=r.length;for(;n--;){const...
    method names (line 2) | get names(){return this.nodes.reduce(((e,t)=>I(e,t.names)),{})}
  method constructor (line 8) | constructor({path:e,writeOptions:t={encoding:"utf8",flag:"a",mode:438},w...
  method size (line 8) | get size(){return this.getSize()}
  method clear (line 8) | clear(){try{return s.writeFileSync(this.path,"",{mode:this.writeOptions....
  method crop (line 8) | crop(e){try{const t=function(e,t){const r=Buffer.alloc(t),n=s.statSync(e...
  method getSize (line 8) | getSize(){if(void 0===this.initialSize)try{const e=s.statSync(this.path)...
  method increaseBytesWrittenCounter (line 8) | increaseBytesWrittenCounter(e){this.bytesWritten+=Buffer.byteLength(e,th...
  method isNull (line 8) | isNull(){return!1}
  method nextAsyncWrite (line 8) | nextAsyncWrite(){const e=this;if(this.hasActiveAsyncWriting||0===this.as...
  method reset (line 8) | reset(){this.initialSize=void 0,this.bytesWritten=0}
  method toString (line 8) | toString(){return this.path}
  method writeLine (line 8) | writeLine(e){if(e+=o.EOL,this.writeAsync)return this.asyncWriteQueue.pus...
  method constructor (line 8) | constructor(){super(),this.emitError=this.emitError.bind(this)}
  method provide (line 8) | provide({filePath:e,writeOptions:t,writeAsync:r=!1}){let n;try{if(e=o.re...
  method createFile (line 8) | createFile({filePath:e,writeOptions:t,writeAsync:r}){return this.testFil...
  method emitError (line 8) | emitError(e,t){this.emit("error",e,t)}
  method testFileWriting (line 8) | testFileWriting(e){s.mkdirSync(o.dirname(e),{recursive:!0}),s.writeFileS...
  method clear (line 8) | clear(){}
  method crop (line 8) | crop(){}
  method getSize (line 8) | getSize(){return 0}
  method isNull (line 8) | isNull(){return!0}
  method writeLine (line 8) | writeLine(){}
  method archiveLogFn (line 8) | archiveLogFn(e){const t=e.toString(),r=s.parse(t);try{n.renameSync(t,s.j...
  function i (line 8) | function i(t){const r=m(t);i.maxSize>0&&r.size>i.maxSize&&(i.archiveLogF...
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  function p (line 8) | function p(t,r=null,n="error"){const s=[`electron-log.transports.file: $...
    method constructor (line 2) | constructor(e){super(),this.code=e}
    method render (line 2) | render({_n:e}){return`${this.code};`+e}
    method optimizeNodes (line 2) | optimizeNodes(){return`${this.code}`?this:void 0}
    method optimizeNames (line 2) | optimizeNames(e,t){return this.code=R(this.code,e,t),this}
    method names (line 2) | get names(){return this.code instanceof n._CodeOrName?this.code.names:{}}
  function m (line 8) | function m(e){r||(r=Object.create(Object.prototype,{...Object.getOwnProp...
    method constructor (line 2) | constructor(e=[]){super(),this.nodes=e}
    method render (line 2) | render(e){return this.nodes.reduce(((t,r)=>t+r.render(e)),"")}
    method optimizeNodes (line 2) | optimizeNodes(){const{nodes:e}=this;let t=e.length;for(;t--;){const r=...
    method optimizeNames (line 2) | optimizeNames(e,t){const{nodes:r}=this;let n=r.length;for(;n--;){const...
    method names (line 2) | get names(){return this.nodes.reduce(((e,t)=>I(e,t.names)),{})}
  function h (line 8) | function h(e=process.type){switch(e){case"renderer":return"renderer.log"...
    method constructor (line 2) | constructor(e){super(),this.error=e}
    method render (line 2) | render({_n:e}){return`throw ${this.error};`+e}
    method names (line 2) | get names(){return this.error.names}
  function o (line 8) | function o(...e){if(!e[0])return null;try{const t=function(e,t){let r=t;...
  function a (line 8) | function a(e){const t=o.getPath("appData");if(t)return t;const r=c();swi...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function c (line 8) | function c(){return n.homedir?n.homedir():process.env.HOME}
    method constructor (line 2) | constructor(e,t,r){super(),this.varKind=e,this.name=t,this.rhs=r}
    method render (line 2) | render({es5:e,_n:t}){const r=e?s.varKinds.var:this.varKind,n=void 0===...
    method optimizeNames (line 2) | optimizeNames(e,t){if(e[this.name.str])return this.rhs&&(this.rhs=R(th...
    method names (line 2) | get names(){return this.rhs instanceof n._CodeOrName?this.rhs.names:{}}
  function l (line 8) | function l(e,t){return"darwin"===e?s.join(c(),"Library/Logs",t):s.join(f...
    method _addVocabularies (line 2) | _addVocabularies(){super._addVocabularies(),s.default.forEach((e=>this...
    method _addDefaultMetaSchema (line 2) | _addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.me...
    method defaultMeta (line 2) | defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this....
    method constructor (line 2) | constructor(e,t,r){super(),this.lhs=e,this.rhs=t,this.sideEffects=r}
    method render (line 2) | render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}
    method optimizeNames (line 2) | optimizeNames(e,t){if(!(this.lhs instanceof n.Name)||e[this.lhs.str]||...
    method names (line 2) | get names(){return j(this.lhs instanceof n.Name?{}:{...this.lhs.names}...
    method constructor (line 2) | constructor(e){var t;let r;this.refs={},this.dynamicAnchors={},"object...
  function u (line 8) | function u(e){return"darwin"===e?s.join(c(),"Library/Logs","{appName}"):...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function d (line 8) | function d(){let e=o.getName()||"",t=o.getVersion();if("electron"===e.to...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  function f (line 8) | function f(e,t){return o.getName()!==t?s.join(a(e),t):o.getPath("userDat...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}
  method electronDefaultDir (line 8) | get electronDefaultDir(){return o.getPath("logs")}
  method processErrorFn (line 8) | processErrorFn({error:r}){e.processMessage({data:[`electron-log: can't P...
  method sendRequestFn (line 8) | sendRequestFn({serverUrl:e,requestOptions:t,body:r}){const o=(e.startsWi...
  function t (line 8) | function t(r){if(!t.url)return;const n=t.makeBodyFn({logger:e,message:{....
  function s (line 8) | function s({contextBridge:e,ipcRenderer:t}){if(!t)return;t.on("__ELECTRO...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  method logFn (line 8) | logFn({error:t,errorName:r,showDialog:n}){e.transports.console({data:[r,...
  method constructor (line 8) | constructor({logFn:e=null}={}){this.handleError=this.handleError.bind(th...
  method handle (line 8) | handle(e,{logFn:r=this.logFn,errorName:n="",onError:s=this.onError,showD...
  method setOptions (line 8) | setOptions({logFn:e,onError:t,preventDefault:r,showDialog:n}){"function"...
  method startCatching (line 8) | startCatching({onError:e,showDialog:t}={}){this.isActive||(this.isActive...
  method handleError (line 8) | handleError(e){this.handle(e,{errorName:"Unhandled"})}
  method handleRejection (line 8) | handleRejection(e){const t=e instanceof Error?e:new Error(JSON.stringify...
  method writeFn (line 8) | writeFn({message:{level:e,data:r}}){const n=t[e]||t.info;setTimeout((()=...
  function r (line 8) | function r(e){r.writeFn({message:{...e,data:r.formatDataFn(e)}})}
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  function r (line 8) | function r(t){if(window.__electronLog)try{__electronLog.sendToMain(r.ser...
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  method constructor (line 8) | constructor(e){let t,r;if(i){const e=i.sendSync("electron-store-get-data...
  method initRenderer (line 8) | static initRenderer(){u()}
  method openInEditor (line 8) | openInEditor(){a.openPath(this.path)}
  class w (line 8) | class w{constructor(e,t,r,n,s){this.key=e,this.value=t,this.length=r,thi...
    method constructor (line 2) | constructor(e,t){super(t),this.condition=e}
    method render (line 2) | render(e){let t=`if(${this.condition})`+super.render(e);return this.el...
    method optimizeNodes (line 2) | optimizeNodes(){super.optimizeNodes();const e=this.condition;if(!0===e...
    method optimizeNames (line 2) | optimizeNames(e,t){var r;if(this.else=null===(r=this.else)||void 0===r...
    method names (line 2) | get names(){const e=super.names;return j(e,this.condition),this.else&&...
    method constructor (line 8) | constructor(e,t,r,n,s){this.key=e,this.value=t,this.length=r,this.now=...
  method constructor (line 8) | constructor(e){if("number"==typeof e&&(e={max:e}),e||(e={}),e.max&&("num...
  method max (line 8) | set max(e){if("number"!=typeof e||e<0)throw new TypeError("max must be a...
  method max (line 8) | get max(){return this[s]}
  method allowStale (line 8) | set allowStale(e){this[a]=!!e}
  method allowStale (line 8) | get allowStale(){return this[a]}
  method maxAge (line 8) | set maxAge(e){if("number"!=typeof e)throw new TypeError("maxAge must be ...
  method maxAge (line 8) | get maxAge(){return this[c]}
  method lengthCalculator (line 8) | set lengthCalculator(e){"function"!=typeof e&&(e=p),e!==this[i]&&(this[i...
  method lengthCalculator (line 8) | get lengthCalculator(){return this[i]}
  method length (line 8) | get length(){return this[o]}
  method itemCount (line 8) | get itemCount(){return this[d].length}
  method rforEach (line 8) | rforEach(e,t){t=t||this;for(let r=this[d].tail;null!==r;){const n=r.prev...
  method forEach (line 8) | forEach(e,t){t=t||this;for(let r=this[d].head;null!==r;){const n=r.next;...
  method keys (line 8) | keys(){return this[d].toArray().map((e=>e.key))}
  method values (line 8) | values(){return this[d].toArray().map((e=>e.value))}
  method reset (line 8) | reset(){this[l]&&this[d]&&this[d].length&&this[d].forEach((e=>this[l](e....
  method dump (line 8) | dump(){return this[d].map((e=>!y(this,e)&&{k:e.key,v:e.value,e:e.now+(e....
  method dumpLru (line 8) | dumpLru(){return this[d]}
  method set (line 8) | set(e,t,r){if((r=r||this[c])&&"number"!=typeof r)throw new TypeError("ma...
  method has (line 8) | has(e){if(!this[f].has(e))return!1;const t=this[f].get(e).value;return!y...
  method get (line 8) | get(e){return m(this,e,!0)}
  method peek (line 8) | peek(e){return m(this,e,!1)}
  method pop (line 8) | pop(){const e=this[d].tail;return e?(v(this,e),e.value):null}
  method del (line 8) | del(e){v(this,this[f].get(e))}
  method load (line 8) | load(e){this.reset();const t=Date.now();for(let r=e.length-1;r>=0;r--){c...
  method prune (line 8) | prune(){this[f].forEach(((e,t)=>m(this,t,!1)))}
  function t (line 8) | function t(n){if(r[n])return r[n].exports;var s=r[n]={exports:{},id:n,lo...
  function n (line 8) | function n(e){return(0,a.createHash)("sha256").update(e).digest("hex")}
    method constructor (line 2) | constructor(e){if(super(),!t.IDENTIFIER.test(e))throw new Error("CodeG...
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){return!1}
    method names (line 2) | get names(){return{[this.str]:1}}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof n)return e.loose===!!t.loose&&...
    method format (line 8) | format(){return this.range=this.set.map((e=>e.join(" ").trim())).join(...
    method toString (line 8) | toString(){return this.range}
    method parseRange (line 8) | parseRange(e){const t=((this.options.includePrerelease&&p)|(this.optio...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is r...
    method test (line 8) | test(e){if(!e)return!1;if("string"==typeof e)try{e=new c(e,this.option...
  function s (line 8) | function s(e){switch(c){case"darwin":return e.split("IOPlatformUUID")[1]...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  class s (line 8) | class s extends Error{constructor(e){super(),this.value=e}}
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  class s (line 8) | class s{static get ANY(){return n}constructor(e,t){if(t=o(t),e instanceo...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  class n (line 8) | class n{constructor(e,t){if(t=o(t),e instanceof n)return e.loose===!!t.l...
    method constructor (line 2) | constructor(e){if(super(),!t.IDENTIFIER.test(e))throw new Error("CodeG...
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){return!1}
    method names (line 2) | get names(){return{[this.str]:1}}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof n)return e.loose===!!t.loose&&...
    method format (line 8) | format(){return this.range=this.set.map((e=>e.join(" ").trim())).join(...
    method toString (line 8) | toString(){return this.range}
    method parseRange (line 8) | parseRange(e){const t=((this.options.includePrerelease&&p)|(this.optio...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is r...
    method test (line 8) | test(e){if(!e)return!1;if("string"==typeof e)try{e=new c(e,this.option...
  class u (line 8) | class u{constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loos...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function t (line 8) | function t(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=argu...
  function r (line 8) | function r(e){return"(?:"+e+")"}
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....
  function n (line 8) | function n(e){return void 0===e?"undefined":null===e?"null":Object.proto...
    method constructor (line 2) | constructor(e){if(super(),!t.IDENTIFIER.test(e))throw new Error("CodeG...
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){return!1}
    method names (line 2) | get names(){return{[this.str]:1}}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof n)return e.loose===!!t.loose&&...
    method format (line 8) | format(){return this.range=this.set.map((e=>e.join(" ").trim())).join(...
    method toString (line 8) | toString(){return this.range}
    method parseRange (line 8) | parseRange(e){const t=((this.options.includePrerelease&&p)|(this.optio...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is r...
    method test (line 8) | test(e){if(!e)return!1;if("string"==typeof e)try{e=new c(e,this.option...
  function s (line 8) | function s(e){return e.toUpperCase()}
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  function o (line 8) | function o(e){var n="[A-Za-z]",s="[0-9]",o=t(s,"[A-Fa-f]"),i=r(r("%[EFef...
  function g (line 8) | function g(e){throw new RangeError(p[e])}
  function v (line 8) | function v(e,t){var r=e.split("@"),n="";return r.length>1&&(n=r[0]+"@",e...
  function w (line 8) | function w(e){for(var t=[],r=0,n=e.length;r<n;){var s=e.charCodeAt(r++);...
    method constructor (line 2) | constructor(e,t){super(t),this.condition=e}
    method render (line 2) | render(e){let t=`if(${this.condition})`+super.render(e);return this.el...
    method optimizeNodes (line 2) | optimizeNodes(){super.optimizeNodes();const e=this.condition;if(!0===e...
    method optimizeNames (line 2) | optimizeNames(e,t){var r;if(this.else=null===(r=this.else)||void 0===r...
    method names (line 2) | get names(){const e=super.names;return j(e,this.condition),this.else&&...
    method constructor (line 8) | constructor(e,t,r,n,s){this.key=e,this.value=t,this.length=r,this.now=...
  function P (line 8) | function P(e){var t=e.charCodeAt(0);return t<16?"%0"+t.toString(16).toUp...
    method render (line 2) | render(e){let t="try"+super.render(e);return this.catch&&(t+=this.catc...
    method optimizeNodes (line 2) | optimizeNodes(){var e,t;return super.optimizeNodes(),null===(e=this.ca...
    method optimizeNames (line 2) | optimizeNames(e,t){var r,n;return super.optimizeNames(e,t),null===(r=t...
    method names (line 2) | get names(){const e=super.names;return this.catch&&I(e,this.catch.name...
    method constructor (line 5) | constructor(e,t,r){if((0,c.validateKeywordUsage)(e,t,r),this.gen=e.gen...
    method result (line 5) | result(e,t,r){this.failResult((0,u.not)(e),t,r)}
    method failResult (line 5) | failResult(e,t,r){this.gen.if(e),r?r():this.error(),t?(this.gen.else()...
    method pass (line 5) | pass(e,t){this.failResult((0,u.not)(e),void 0,t)}
    method fail (line 5) | fail(e){if(void 0===e)return this.error(),void(this.allErrors||this.ge...
    method fail$data (line 5) | fail$data(e){if(!this.$data)return this.fail(e);const{schemaCode:t}=th...
    method error (line 5) | error(e,t,r){if(t)return this.setParams(t),this._error(e,r),void this....
    method _error (line 5) | _error(e,t){(e?p.reportExtraError:p.reportError)(this,this.def.error,t)}
    method $dataError (line 5) | $dataError(){(0,p.reportError)(this,this.def.$dataError||p.keyword$Dat...
    method reset (line 5) | reset(){if(void 0===this.errsCount)throw new Error('add "trackErrors" ...
    method ok (line 5) | ok(e){this.allErrors||this.gen.if(e)}
    method setParams (line 5) | setParams(e,t){t?Object.assign(this.params,e):this.params=e}
    method block$data (line 5) | block$data(e,t,r=u.nil){this.gen.block((()=>{this.check$data(e,r),t()}))}
    method check$data (line 5) | check$data(e=u.nil,t=u.nil){if(!this.$data)return;const{gen:r,schemaCo...
    method invalid$data (line 5) | invalid$data(){const{gen:e,schemaCode:t,schemaType:r,def:n,it:s}=this;...
    method subschema (line 5) | subschema(e,t){const r=(0,l.getSubschema)(this.it,e);(0,l.extendSubsch...
    method mergeEvaluated (line 5) | mergeEvaluated(e,t){const{it:r,gen:n}=this;r.opts.unevaluated&&(!0!==r...
    method mergeValidEvaluated (line 5) | mergeValidEvaluated(e,t){const{it:r,gen:n}=this;if(r.opts.unevaluated&...
  function x (line 8) | function x(e){for(var t="",r=0,n=e.length;r<n;){var s=parseInt(e.substr(...
    method constructor (line 2) | constructor(e){super(),this.error=e}
    method render (line 2) | render(e){return`catch(${this.error})`+super.render(e)}
  function N (line 8) | function N(e,t){function r(e){var r=x(e);return r.match(t.UNRESERVED)?r:...
    method render (line 2) | render(e){return"finally"+super.render(e)}
  function I (line 8) | function I(e){return e.replace(/^0*(.*)/,"$1")||"0"}
  function j (line 8) | function j(e,t){var r=e.match(t.IPV4ADDRESS)||[],n=c(r,2)[1];return n?n....
  function R (line 8) | function R(e,t){var r=e.match(t.IPV6ADDRESS)||[],n=c(r,3),s=n[1],o=n[2];...
    method constructor (line 2) | constructor(e={}){var t;o.set(this,void 0),i.set(this,void 0),a.set(th...
    method get (line 2) | get(e,t){if(u(this,a,"f").accessPropertiesByDotNotation)return this._g...
    method set (line 2) | set(e,t){if("string"!=typeof e&&"object"!=typeof e)throw new TypeError...
    method has (line 2) | has(e){return u(this,a,"f").accessPropertiesByDotNotation?g.has(this.s...
    method reset (line 2) | reset(...e){for(const t of e)null!=u(this,c,"f")[t]&&this.set(t,u(this...
    method delete (line 2) | delete(e){const{store:t}=this;u(this,a,"f").accessPropertiesByDotNotat...
    method clear (line 2) | clear(){this.store=x();for(const e of Object.keys(u(this,c,"f")))this....
    method onDidChange (line 2) | onDidChange(e,t){if("string"!=typeof e)throw new TypeError("Expected `...
    method onDidAnyChange (line 2) | onDidAnyChange(e){if("function"!=typeof e)throw new TypeError("Expecte...
    method size (line 2) | get size(){return Object.keys(this.store).length}
    method store (line 2) | get store(){try{const e=f.readFileSync(this.path,u(this,i,"f")?null:"u...
    method store (line 2) | set store(e){this._ensureDirectory(),this._validate(e),this._write(e),...
    method _encryptData (line 2) | _encryptData(e){if(!u(this,i,"f"))return e.toString();try{if(u(this,i,...
    method _handleChange (line 2) | _handleChange(e,t){let r=e();const n=()=>{const n=r,s=e();(0,d.isDeepS...
    method _validate (line 2) | _validate(e){if(!u(this,o,"f"))return;if(u(this,o,"f").call(this,e)||!...
    method _ensureDirectory (line 2) | _ensureDirectory(){f.mkdirSync(h.dirname(this.path),{recursive:!0})}
    method _write (line 2) | _write(e){let t=this._serialize(e);if(u(this,i,"f")){const e=p.randomB...
    method _watch (line 2) | _watch(){this._ensureDirectory(),f.existsSync(this.path)||this._write(...
    method _migrate (line 2) | _migrate(e,t,r){let n=this._get(j,"0.0.0");const s=Object.keys(e).filt...
    method _containsReservedKey (line 2) | _containsReservedKey(e){return"object"==typeof e&&Object.keys(e)[0]===...
    method _isVersionInRangeFormat (line 2) | _isVersionInRangeFormat(e){return null===S.clean(e)}
    method _shouldPerformMigration (line 2) | _shouldPerformMigration(e,t,r){return this._isVersionInRangeFormat(e)?...
    method _get (line 2) | _get(e,t){return g.get(this.store,e,t)}
    method _set (line 2) | _set(e,t){const{store:r}=this;g.set(r,e,t),this.store=r}
  function C (line 8) | function C(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[...
  function F (line 8) | function F(e){for(var t=[];e.length;)if(e.match(D))e=e.replace(D,"");els...
  function U (line 8) | function U(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[...
  function z (line 8) | function z(e,t){var r=arguments.length>2&&void 0!==arguments[2]?argument...
  function V (line 8) | function V(e,t){return e&&e.toString().replace(t&&t.iri?a.PCT_ENCODED:i....
  function W (line 8) | function W(e){return"boolean"==typeof e.secure?e.secure:"wss"===String(e...
  function se (line 8) | function se(e){var t=x(e);return t.match(Z)?t:e}
  function a (line 8) | function a(){return i>o.length-16&&(s().randomFillSync(o),i=0),o.slice(i...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function d (line 8) | function d(e,t=0){return u[e[t+0]]+u[e[t+1]]+u[e[t+2]]+u[e[t+3]]+"-"+u[e...
    method constructor (line 2) | constructor(e){super(),this.label=e,this.names={}}
    method render (line 2) | render({_n:e}){return`${this.label}:`+e}
  function w (line 8) | function w(e,t,r){function n(e,n,s,o){var i;if("string"==typeof e&&(e=fu...
    method constructor (line 2) | constructor(e,t){super(t),this.condition=e}
    method render (line 2) | render(e){let t=`if(${this.condition})`+super.render(e);return this.el...
    method optimizeNodes (line 2) | optimizeNodes(){super.optimizeNodes();const e=this.condition;if(!0===e...
    method optimizeNames (line 2) | optimizeNames(e,t){var r;if(this.else=null===(r=this.else)||void 0===r...
    method names (line 2) | get names(){const e=super.names;return j(e,this.condition),this.else&&...
    method constructor (line 8) | constructor(e,t,r,n,s){this.key=e,this.value=t,this.length=r,this.now=...
  function n (line 8) | function n(e){var t=this;if(t instanceof n||(t=new n),t.tail=null,t.head...
    method constructor (line 2) | constructor(e){if(super(),!t.IDENTIFIER.test(e))throw new Error("CodeG...
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){return!1}
    method names (line 2) | get names(){return{[this.str]:1}}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof n)return e.loose===!!t.loose&&...
    method format (line 8) | format(){return this.range=this.set.map((e=>e.join(" ").trim())).join(...
    method toString (line 8) | toString(){return this.range}
    method parseRange (line 8) | parseRange(e){const t=((this.options.includePrerelease&&p)|(this.optio...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is r...
    method test (line 8) | test(e){if(!e)return!1;if("string"==typeof e)try{e=new c(e,this.option...
  function s (line 8) | function s(e,t,r){var n=t===e.head?new a(r,null,t,e):new a(r,t,t.next,e)...
    method constructor (line 2) | constructor(e){super(),this._items="string"==typeof e?[e]:e}
    method toString (line 2) | toString(){return this.str}
    method emptyStr (line 2) | emptyStr(){if(this._items.length>1)return!1;const e=this._items[0];ret...
    method str (line 2) | get str(){var e;return null!==(e=this._str)&&void 0!==e?e:this._str=th...
    method names (line 2) | get names(){var e;return null!==(e=this._names)&&void 0!==e?e:this._na...
    method constructor (line 2) | constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.valu...
    method constructor (line 2) | constructor(e,t,r,s){super(s||`can't resolve reference ${r} from id ${...
    method constructor (line 8) | constructor({allowUnknownLevel:e=!1,errorHandler:t,eventLogger:r,initi...
    method getInstance (line 8) | static getInstance({logId:e}){return this.instances[e]||this.instances...
    method addLevel (line 8) | addLevel(e,t=this.levels.length){!1!==t&&this.levels.splice(t,0,e),thi...
    method catchErrors (line 8) | catchErrors(e){return this.processMessage({data:["log.catchErrors is d...
    method create (line 8) | create(e){return"string"==typeof e&&(e={logId:e}),new s({...e,errorHan...
    method compareLevels (line 8) | compareLevels(e,t,r=this.levels){const n=r.indexOf(e),s=r.indexOf(t);r...
    method initialize (line 8) | initialize(e={}){this.initializeFn({logger:this,...e})}
    method logData (line 8) | logData(e,t={}){this.processMessage({data:e,...t})}
    method processMessage (line 8) | processMessage(e,{transports:t=this.transports}={}){if("errorHandler"=...
    method processInternalErrorFn (line 8) | processInternalErrorFn(e){}
    method transportEntries (line 8) | transportEntries(e=this.transports){return(Array.isArray(e)?e:Object.e...
    method constructor (line 8) | constructor(e){super(),this.value=e}
    method ANY (line 8) | static get ANY(){return n}
    method constructor (line 8) | constructor(e,t){if(t=o(t),e instanceof s){if(e.loose===!!t.loose)retu...
    method parse (line 8) | parse(e){const t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATO...
    method toString (line 8) | toString(){return this.value}
    method test (line 8) | test(e){if(l("Comparator.test",e,this.options.loose),this.semver===n||...
    method intersects (line 8) | intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator...
  function o (line 8) | function o(e,t){e.tail=new a(t,e.tail,null,e),e.head||(e.head=e.tail),e....
  function i (line 8) | function i(e,t){e.head=new a(t,null,e.head,e),e.tail||(e.tail=e.head),e....
    method constructor (line 2) | constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,...
    method toName (line 2) | toName(e){return e instanceof n.Name?e:this.name(e)}
    method name (line 2) | name(e){return new n.Name(this._newName(e))}
    method _newName (line 2) | _newName(e){return`${e}${(this._names[e]||this._nameGroup(e)).index++}`}
    method _nameGroup (line 2) | _nameGroup(e){var t,r;if((null===(r=null===(t=this._parent)||void 0===...
  function a (line 8) | function a(e,t,r,n){if(!(this instanceof a))return new a(e,t,r,n);this.l...
    method optimizeNodes (line 2) | optimizeNodes(){return this}
    method optimizeNames (line 2) | optimizeNames(e,t){return this}
    method constructor (line 2) | constructor(e,t){super(t),this.prefix=e}
    method setValue (line 2) | setValue(e,{property:t,itemIndex:r}){this.value=e,this.scopePath=n._`....
  function u (line 8) | function u(){let e="";return e=i.readFileSync(s.join(__dirname,"../..","...
    method constructor (line 2) | constructor(e,t,r,n){super(e,r,n),this.op=t}
    method render (line 2) | render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}
    method constructor (line 8) | constructor(e,t){if(t=c(t),e instanceof u){if(e.loose===!!t.loose&&e.i...
    method format (line 8) | format(){return this.version=`${this.major}.${this.minor}.${this.patch...
    method toString (line 8) | toString(){return this.version}
    method compare (line 8) | compare(e){if(n("SemVer.compare",this.version,this.options,e),!(e inst...
    method compareMain (line 8) | compareMain(e){return e instanceof u||(e=new u(e,this.options)),l(this...
    method comparePre (line 8) | comparePre(e){if(e instanceof u||(e=new u(e,this.options)),this.prerel...
    method compareBuild (line 8) | compareBuild(e){e instanceof u||(e=new u(e,this.options));let t=0;do{c...
    method inc (line 8) | inc(e,t,r){switch(e){case"premajor":this.prerelease.length=0,this.patc...
  function r (line 8) | function r(n){var s=t[n];if(void 0!==s)return s.exports;var o=t[n]={id:n...
    method constructor (line 5) | constructor(e){super("validation failed"),this.errors=e,this.ajv=this....

FILE: chat2db-client/src/main/menu.js
  method click (line 17) | click() {
  method click (line 31) | click() {
  method click (line 40) | click() {
  method click (line 107) | click() {
  method click (line 116) | click() {
  method click (line 123) | click() {
  method click (line 130) | click() {
  method click (line 137) | click() {

FILE: chat2db-client/src/main/utils.js
  function loadMainResource (line 15) | function loadMainResource(mainWindow) {
  function readVersion (line 36) | function readVersion() {

FILE: chat2db-client/src/pages/demo/index.tsx
  function Test (line 4) | function Test() {

FILE: chat2db-client/src/pages/login/index.tsx
  type IFormData (line 13) | interface IFormData {

FILE: chat2db-client/src/pages/main/dashboard/chart-item/index.tsx
  function countArrayElements (line 32) | function countArrayElements<T>(arr: T[]): { name: T; value: number }[] {
  type IChartItemProps (line 50) | interface IChartItemProps {
  function ChartItem (line 63) | function ChartItem(props: IChartItemProps) {

FILE: chat2db-client/src/pages/main/dashboard/chart/bar/index.tsx
  type EChartsOption (line 5) | type EChartsOption = charts.EChartsOption;
  type IProps (line 7) | interface IProps {

FILE: chat2db-client/src/pages/main/dashboard/chart/line/index.tsx
  type EChartsOption (line 5) | type EChartsOption = charts.EChartsOption;
  type IProps (line 7) | interface IProps {

FILE: chat2db-client/src/pages/main/dashboard/chart/pie/index.tsx
  type EChartsOption (line 5) | type EChartsOption = charts.EChartsOption;
  type IProps (line 7) | interface IProps {

FILE: chat2db-client/src/pages/main/dashboard/index.tsx
  type IProps (line 25) | interface IProps {
  function Chart (line 36) | function Chart(props: IProps) {

FILE: chat2db-client/src/pages/main/index.tsx
  function MainPage (line 73) | function MainPage() {

FILE: chat2db-client/src/pages/main/store/connection/index.ts
  type IConnectionStore (line 12) | interface IConnectionStore {

FILE: chat2db-client/src/pages/main/store/main/index.ts
  type IMainStore (line 6) | interface IMainStore {

FILE: chat2db-client/src/pages/main/store/monaco/index.ts
  type tableItem (line 7) | interface tableItem {
  type schemaItem (line 15) | interface schemaItem {
  type databaseItem (line 20) | type databaseItem = {
  type IMonacoStore (line 28) | interface IMonacoStore {

FILE: chat2db-client/src/pages/main/team/datasource-management/index.tsx
  function DataSourceManagement (line 15) | function DataSourceManagement() {

FILE: chat2db-client/src/pages/main/team/team-management/index.tsx
  function TeamManagement (line 18) | function TeamManagement() {

FILE: chat2db-client/src/pages/main/team/universal-add-modal/index.tsx
  type IProps (line 14) | interface IProps {
  type ValueType (line 21) | interface ValueType {
  function UniversalAddModal (line 63) | function UniversalAddModal(props: IProps) {

FILE: chat2db-client/src/pages/main/team/universal-drawer/index.tsx
  type IProps (line 41) | interface IProps {
  type IAffiliationDetail (line 48) | interface IAffiliationDetail {
  function UniversalDrawer (line 59) | function UniversalDrawer(props: IProps) {

FILE: chat2db-client/src/pages/main/team/user-management/index.tsx
  function UserManagement (line 18) | function UserManagement() {

FILE: chat2db-client/src/pages/main/workspace/components/OperationLine/index.tsx
  type IProps (line 15) | interface IProps {

FILE: chat2db-client/src/pages/main/workspace/components/SQLExecute/index.tsx
  type IProps (line 10) | interface IProps {

FILE: chat2db-client/src/pages/main/workspace/components/SaveList/index.tsx
  function openSearch (line 36) | function openSearch() {
  function onBlur (line 40) | function onBlur() {
  function onChange (line 47) | function onChange(value: string) {
  function openConsole (line 53) | function openConsole(item: IConsole) {
  function deleteSaved (line 77) | function deleteSaved(data: IConsole) {

FILE: chat2db-client/src/pages/main/workspace/components/TableList/index.tsx
  type IProps (line 15) | interface IProps {

FILE: chat2db-client/src/pages/main/workspace/components/ViewAllTable/index.tsx
  type IProps (line 23) | interface IProps {

FILE: chat2db-client/src/pages/main/workspace/components/WorkspaceExtend/WorkspaceExtendNav/index.tsx
  type IToolbar (line 12) | interface IToolbar {
  type IProps (line 19) | interface IProps {

FILE: chat2db-client/src/pages/main/workspace/components/WorkspaceExtend/config.tsx
  type IToolbar (line 7) | interface IToolbar {
  type GlobalComponents (line 14) | enum GlobalComponents {

FILE: chat2db-client/src/pages/main/workspace/components/WorkspaceExtend/index.tsx
  type IToolbar (line 11) | interface IToolbar {

FILE: chat2db-client/src/pages/main/workspace/components/WorkspaceTabs/index.tsx
  function renderCreateConsoleButton (line 282) | function renderCreateConsoleButton() {

FILE: chat2db-client/src/pages/main/workspace/store/common.ts
  type ICommonStore (line 4) | interface ICommonStore {

FILE: chat2db-client/src/pages/main/workspace/store/config.ts
  type IConfigStore (line 2) | interface IConfigStore {

FILE: chat2db-client/src/pages/main/workspace/store/console.ts
  type IConsoleStore (line 9) | interface IConsoleStore {

FILE: chat2db-client/src/pages/main/workspace/store/index.ts
  type IStore (line 11) | type IStore = IConfigStore & IConsoleStore & ICommonStore & IModalStore;

FILE: chat2db-client/src/pages/main/workspace/store/modal.ts
  type IModalStore (line 4) | interface IModalStore {

FILE: chat2db-client/src/pages/test/index.tsx
  function Test (line 6) | function Test() {

FILE: chat2db-client/src/service/base.ts
  type IErrorLevel (line 5) | type IErrorLevel = 'toast' | 'prompt' | 'critical' | false;
  type IOptions (line 6) | interface IOptions {
  type ErrorCode (line 35) | enum ErrorCode {
  function createRequest (line 128) | function createRequest<P = void, R = void>(url: string, options?: IOptio...
  function delayTimeFn (line 224) | function delayTimeFn(callback: () => void, time: number | true | undefin...

FILE: chat2db-client/src/service/config.ts
  type ILatestVersion (line 4) | interface ILatestVersion {

FILE: chat2db-client/src/service/connection.ts
  type IDriverResponse (line 5) | interface IDriverResponse {
  type IDriverParams (line 15) | interface IDriverParams {
  type IUploadDriver (line 19) | interface IUploadDriver {

FILE: chat2db-client/src/service/history.ts
  type IGetSavedListParams (line 6) | interface IGetSavedListParams extends IPageParams {
  type IGetHistoryListParams (line 10) | interface IGetHistoryListParams extends IPageParams {
  type ISaveBasicInfo (line 14) | interface ISaveBasicInfo {
  type IUpdateConsoleParams (line 22) | interface IUpdateConsoleParams {
  type IHistoryRecord (line 26) | interface IHistoryRecord {

FILE: chat2db-client/src/service/sql.ts
  type IGetTableListParams (line 16) | interface IGetTableListParams extends IPageParams {
  type IExecuteSqlParams (line 23) | interface IExecuteSqlParams {
  type IExecuteSqlResponse (line 34) | interface IExecuteSqlResponse {
  type IConnectConsoleParams (line 42) | interface IConnectConsoleParams {
  type ITableParams (line 57) | interface ITableParams {
  type IExecuteTableParams (line 64) | interface IExecuteTableParams {
  type IColumn (line 71) | interface IColumn {
  type ISchemaParams (line 85) | interface ISchemaParams {
  type ISchemaResponse (line 89) | interface ISchemaResponse {
  type MetaSchemaVO (line 93) | interface MetaSchemaVO {
  type Database (line 98) | interface Database {
  type Schema (line 103) | interface Schema {
  type IExportParams (line 148) | interface IExportParams extends IExecuteSqlParams {
  type IModifyTableSqlParams (line 274) | interface IModifyTableSqlParams {
  type IModifySequenceSqlParams (line 289) | interface IModifySequenceSqlParams {

FILE: chat2db-client/src/store/common/appTitleBarConfig.ts
  type IAppTitleBarConfig (line 3) | interface IAppTitleBarConfig {

FILE: chat2db-client/src/store/common/components.ts
  type IComponentsContent (line 4) | interface IComponentsContent {

FILE: chat2db-client/src/store/common/copyFocusedContent.ts
  type ICopyFocusedContent (line 2) | interface ICopyFocusedContent {

FILE: chat2db-client/src/store/common/index.ts
  type IStore (line 10) | type IStore = ICopyFocusedContent & IComponentsContent & IAppTitleBarCon...

FILE: chat2db-client/src/store/config/index.ts
  type IConfigStore (line 6) | interface IConfigStore {

FILE: chat2db-client/src/store/monaco/index.ts
  type tableItem (line 7) | interface tableItem {
  type schemaItem (line 15) | interface schemaItem {
  type databaseItem (line 20) | type databaseItem = {
  type IMonacoStore (line 28) | interface IMonacoStore {

FILE: chat2db-client/src/store/setting/index.ts
  type ISettingState (line 14) | interface ISettingState {

FILE: chat2db-client/src/store/user/index.ts
  type IUserStore (line 8) | interface IUserStore {

FILE: chat2db-client/src/theme/background/dark.ts
  type IAntdPrimaryColor (line 5) | type IAntdPrimaryColor = {

FILE: chat2db-client/src/theme/background/darkDimmed.ts
  type IAntdPrimaryColor (line 5) | type IAntdPrimaryColor = {

FILE: chat2db-client/src/theme/background/light.ts
  type IAntdPrimaryColor (line 5) | type IAntdPrimaryColor = {

FILE: chat2db-client/src/theme/index.ts
  function getAntdThemeConfig (line 15) | function getAntdThemeConfig(_theme: ITheme) {
  function injectThemeVar (line 28) | function injectThemeVar(token: { [key in string]: string }, _th
Condensed preview — 1633 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,305K chars).
[
  {
    "path": ".gitattributes",
    "chars": 29,
    "preview": "*.css linguist-language=java\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yml",
    "chars": 505,
    "preview": "name: 💣 Bug\ntitle: 'Bug: '\ndescription: bug template\nlabels: bug\nbody:\n  - type: input\n    id: version\n    attributes:\n "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/optimized.md",
    "chars": 87,
    "preview": "---\nname: \"💫 Optimized\"\nabout: optimized template\ntitle: '优化: '\nlabels: 'optimized'\n---"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/suggest.md",
    "chars": 87,
    "preview": "---\nname: \"💌 Suggest\"\nabout: suggest template\ntitle: 'suggest: '\nlabels: 'suggest'\n---\n"
  },
  {
    "path": ".github/workflows/pushdocker.yml",
    "chars": 2650,
    "preview": "# When tagging a release, do two things\n# 1.\nname: Push To Docker\n\n# Workflow's trigger\non:\n  release:\n    types: [ publ"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 15125,
    "preview": "# Workflow's name\nname: Build Client\n\n# Workflow's trigger\n# Pack when creating tags\non:\n  push:\n    tags:\n      - v*\n\n#"
  },
  {
    "path": ".github/workflows/release_test.yml",
    "chars": 9670,
    "preview": "name: Build Test Client\n\non:\n  push:\n    branches:\n    - \"release_test\"\n\njobs:\n  release:\n    strategy:\n      fail-fast:"
  },
  {
    "path": ".github/workflows/release_test_2.yml",
    "chars": 8380,
    "preview": "name: Build Test Client 2 \n\non:\n  push:\n    branches:\n    - \"release_test_2\"\n\njobs:\n  release:\n    strategy:\n      fail-"
  },
  {
    "path": ".gitignore",
    "chars": 610,
    "preview": "### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*."
  },
  {
    "path": ".vscode/settings.json",
    "chars": 1376,
    "preview": "{\n  \"cSpell.words\": [\n    \"aarch\",\n    \"ahooks\",\n    \"alicdn\",\n    \"aliyuncs\",\n    \"altool\",\n    \"andale\",\n    \"antd\",\n "
  },
  {
    "path": "CHANGELOG.md",
    "chars": 14901,
    "preview": "## 3.1.19\n\n`2024-1-3`\n\n**Changelog**\n\n- ⭐【New Features】Open table supports filtering sort\n- ⚡️【Optimize】Optimize startup"
  },
  {
    "path": "CHANGELOG_CN.md",
    "chars": 6900,
    "preview": "## 3.1.19\n\n`2024-1-3`\n\n**更新日志**\n\n- ⭐【新功能】打开表支持筛选排序\n- ⚡️【优化】优化启动速度\n- 🐞【修复】修改表结构生成SQL错误\n- 🐞【修复】直接查询表因字符导致数据错误的问题\n- 🐞【修复】nu"
  },
  {
    "path": "CHAT2DB_AI_SQL.md",
    "chars": 3148,
    "preview": "# Chat2DB AI SQL功能使用说明\nChat2DB包含一系列基于ChatGPT的AI SQL使用功能,主要包括自然语言转SQL、SQL解释、SQL优化和SQL转换。 使用这些AI功能,可以将自然语言转换成本地查询SQL,而不仅仅是"
  },
  {
    "path": "Chat2DB_LICENSE",
    "chars": 2761,
    "preview": "The Chat2DB License\n\n一、定义\n\n“许可方”是指分发其软件的 Chat2DB 软件团队。\n\n“软件”是指根据本许可提供的 Chat2DB 软件。\n\n2. 许可授予\n\n根据本许可的条款和条件,许可方特此授予您非排他性、全球"
  },
  {
    "path": "LICENSE",
    "chars": 11335,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 11913,
    "preview": "<div align=\"center\">\n  <h2>🚀 Zoer is Launching</h2>\n  <p><strong>Powered by Chat2DB Team - AI-powered app builder that c"
  },
  {
    "path": "README_CN.md",
    "chars": 10783,
    "preview": "<div align=\"center\">\n    <a href=\"https://trendshift.io/repositories/11808\" target=\"_blank\"><img src=\"https://trendshift"
  },
  {
    "path": "README_JA.md",
    "chars": 10531,
    "preview": "\n\n\n<div align=\"center\">\n    <a href=\"https://trendshift.io/repositories/11808\" target=\"_blank\"><img src=\"https://trendsh"
  },
  {
    "path": "chat2db-client/.eslintrc.js",
    "chars": 4401,
    "preview": "module.exports = {\n  parser: '@typescript-eslint/parser',\n  env: {\n    browser: true,\n    es2021: true,\n  },\n  plugins: "
  },
  {
    "path": "chat2db-client/.gitignore",
    "chars": 207,
    "preview": "/node_modules\n/.env.local\n/.umirc.local.ts\n/config/config.local.ts\n/src/.umi\n/src/.umi-production\n/src/.umi-test\n/src/ma"
  },
  {
    "path": "chat2db-client/.npmrc",
    "chars": 42,
    "preview": "registry=https://registry.npmmirror.com/\n\n"
  },
  {
    "path": "chat2db-client/.prettierignore",
    "chars": 34,
    "preview": "node_modules\n.umi\n.umi-production\n"
  },
  {
    "path": "chat2db-client/.prettierrc",
    "chars": 256,
    "preview": "{\n  \"printWidth\": 120,\n  \"singleQuote\": true,\n  \"trailingComma\": \"all\",\n  \"proseWrap\": \"never\",\n  \"overrides\": [{ \"files"
  },
  {
    "path": "chat2db-client/.umirc.prod.desktop.ts",
    "chars": 860,
    "preview": "import { extractYarnConfig } from './src/utils/webpack';\nimport { defineConfig } from 'umi';\nconst MonacoWebpackPlugin ="
  },
  {
    "path": "chat2db-client/.umirc.prod.ts",
    "chars": 890,
    "preview": "import { defineConfig } from 'umi';\nimport { extractYarnConfig } from './src/utils/webpack';\nconst MonacoWebpackPlugin ="
  },
  {
    "path": "chat2db-client/.umirc.ts",
    "chars": 3264,
    "preview": "import { defineConfig } from 'umi';\nimport { extractYarnConfig, transitionTimezoneTimestamp } from './src/utils/webpack'"
  },
  {
    "path": "chat2db-client/.vscode/settings.json",
    "chars": 1784,
    "preview": "{\n  \"workbench.colorTheme\": \"One Dark Pro\",\n  \"workbench.iconTheme\": \"vscode-icons-mac\",\n  \"editor.fontSize\": 14,\n  \"edi"
  },
  {
    "path": "chat2db-client/mock/sqlResult.json",
    "chars": 3487,
    "preview": "{\n  \"success\": true,\n  \"errorCode\": null,\n  \"errorMessage\": null,\n  \"data\": [\n    {\n      \"sql\": \"SELECT *\\nFROM student"
  },
  {
    "path": "chat2db-client/package.json",
    "chars": 4348,
    "preview": "{\n  \"name\": \"chat2db\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https:/"
  },
  {
    "path": "chat2db-client/readme.md",
    "chars": 2080,
    "preview": "## 技术选型\n\n1. 脚手架:umi v4\n2. 组件库:antd v5\n3. 状态管理库 dva\n4. 图表库\n5. 国际化\n\n目录结构 tree ./ -L 2 -I node_modules\n\n## 启动项目\n\n\n强制使用 yarn"
  },
  {
    "path": "chat2db-client/src/assets/font/demo.css",
    "chars": 8305,
    "preview": "/* Logo 字体 */\n@font-face {\n  font-family: \"iconfont logo\";\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.e"
  },
  {
    "path": "chat2db-client/src/assets/font/demo_index.html",
    "chars": 168701,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\"/>\n  <title>iconfont Demo</title>\n  <link rel=\"shortcut icon\" href="
  },
  {
    "path": "chat2db-client/src/assets/font/iconfont.css",
    "chars": 10539,
    "preview": "@font-face {\n  font-family: \"iconfont\"; /* Project id 3633546 */\n  src: url('iconfont.woff2?t=1704794525154') format('wo"
  },
  {
    "path": "chat2db-client/src/assets/font/iconfont.js",
    "chars": 312960,
    "preview": "window._iconfont_svg_string_3633546='<svg><symbol id=\"icon-right_on_5\" viewBox=\"0 0 1024 1024\"><path d=\"M153.6 62.577778"
  },
  {
    "path": "chat2db-client/src/assets/font/iconfont.json",
    "chars": 31857,
    "preview": "{\n  \"id\": \"3633546\",\n  \"name\": \"chat2db\",\n  \"font_family\": \"iconfont\",\n  \"css_prefix_text\": \"icon-\",\n  \"description\": \"\""
  },
  {
    "path": "chat2db-client/src/blocks/AppTitleBar/index.less",
    "chars": 1130,
    "preview": "@import '../../styles/var.less';\n\n.appTitleBar {\n  background-color: var(--color-bg-subtle);\n  -webkit-app-region: drag;"
  },
  {
    "path": "chat2db-client/src/blocks/AppTitleBar/index.tsx",
    "chars": 2350,
    "preview": "import React, { memo, useState, useMemo } from 'react';\nimport styles from './index.less';\nimport classnames from 'class"
  },
  {
    "path": "chat2db-client/src/blocks/CreateConnection/index.less",
    "chars": 2192,
    "preview": "@import '../../styles/var.less';\n\n.box {\n  width: 100%;\n  height: 100%;\n  overflow-y: auto;\n}\n\n.dataBaseListBox{\n  displ"
  },
  {
    "path": "chat2db-client/src/blocks/CreateConnection/index.tsx",
    "chars": 4686,
    "preview": "import React, { memo, useEffect, useState } from 'react';\nimport styles from './index.less';\nimport classnames from 'cla"
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/BaseInfo/index.less",
    "chars": 168,
    "preview": "@import '../../../styles/var.less';\n\n.baseInfo {\n  padding: 20px 10px 0px;\n  display: flex;\n  // justify-content: center"
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/BaseInfo/index.tsx",
    "chars": 2341,
    "preview": "import React, { useContext, useEffect, useImperativeHandle, ForwardedRef, forwardRef } from 'react';\nimport styles from "
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/ColumnList/index.less",
    "chars": 2836,
    "preview": "@import '../../../styles/var.less';\n\n.columnList {\n  height: 100%;\n  padding: 10px;\n  box-sizing: border-box;\n  display:"
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/ColumnList/index.tsx",
    "chars": 18797,
    "preview": "import React, { useContext, useEffect, useState, useRef, forwardRef, ForwardedRef, useImperativeHandle } from 'react';\ni"
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/IncludeCol/index.less",
    "chars": 1563,
    "preview": "@import '../../../styles/var.less';\n\n.includeCol {\n  max-height: 40vh;\n  display: flex;\n  flex-direction: column;\n  over"
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/IncludeCol/index.tsx",
    "chars": 7382,
    "preview": "/**\n * 这个组件只负责拿到用户选择的表名\n *  */\nimport React, {\n  useMemo,\n  useState,\n  useRef,\n  useContext,\n  useEffect,\n  forwardRef,"
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/IndexList/index.less",
    "chars": 2386,
    "preview": "@import '../../../styles/var.less';\n\n.indexList {\n  height: 100%;\n  padding: 10px;\n  box-sizing: border-box;\n  display: "
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/IndexList/index.tsx",
    "chars": 13064,
    "preview": "import React, {\n  useState,\n  forwardRef,\n  ForwardedRef,\n  useImperativeHandle,\n  useContext,\n  useRef,\n  useMemo,\n  us"
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/RealTimeSQL/index.less",
    "chars": 54,
    "preview": "@import '../../../styles/var.less';\n\n.realTimeSQL {\n}\n"
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/RealTimeSQL/index.tsx",
    "chars": 421,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\n\ninterface "
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/index.less",
    "chars": 3185,
    "preview": "@import '../../styles/var.less';\n\n.box {\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n}\n\n.header {\n  // po"
  },
  {
    "path": "chat2db-client/src/blocks/DatabaseTableEditor/index.tsx",
    "chars": 8918,
    "preview": "import React, { memo, useRef, useState, createContext, useEffect, useMemo } from 'react';\nimport { Button, Modal, messag"
  },
  {
    "path": "chat2db-client/src/blocks/SequenceEditor/BaseInfo/index.less",
    "chars": 168,
    "preview": "@import '../../../styles/var.less';\n\n.baseInfo {\n  padding: 20px 10px 0px;\n  display: flex;\n  // justify-content: center"
  },
  {
    "path": "chat2db-client/src/blocks/SequenceEditor/BaseInfo/index.tsx",
    "chars": 4392,
    "preview": "import React, { useContext, useEffect, useImperativeHandle, ForwardedRef, forwardRef, useState } from 'react';\nimport st"
  },
  {
    "path": "chat2db-client/src/blocks/SequenceEditor/IncludeCol/index.less",
    "chars": 1563,
    "preview": "@import '../../../styles/var.less';\n\n.includeCol {\n  max-height: 40vh;\n  display: flex;\n  flex-direction: column;\n  over"
  },
  {
    "path": "chat2db-client/src/blocks/SequenceEditor/IncludeCol/index.tsx",
    "chars": 7382,
    "preview": "/**\n * 这个组件只负责拿到用户选择的表名\n *  */\nimport React, {\n  useMemo,\n  useState,\n  useRef,\n  useContext,\n  useEffect,\n  forwardRef,"
  },
  {
    "path": "chat2db-client/src/blocks/SequenceEditor/RealTimeSQL/index.less",
    "chars": 54,
    "preview": "@import '../../../styles/var.less';\n\n.realTimeSQL {\n}\n"
  },
  {
    "path": "chat2db-client/src/blocks/SequenceEditor/RealTimeSQL/index.tsx",
    "chars": 421,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\n\ninterface "
  },
  {
    "path": "chat2db-client/src/blocks/SequenceEditor/index.less",
    "chars": 3185,
    "preview": "@import '../../styles/var.less';\n\n.box {\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n}\n\n.header {\n  // po"
  },
  {
    "path": "chat2db-client/src/blocks/SequenceEditor/index.tsx",
    "chars": 6010,
    "preview": "import React, { memo, useRef, useState, createContext, useEffect } from 'react';\nimport { Button, Modal, message } from "
  },
  {
    "path": "chat2db-client/src/blocks/Setting/About/index.less",
    "chars": 1338,
    "preview": ".aboutUs {\n  .versionsInfo {\n    display: flex;\n    align-items: center;\n    padding-bottom: 10px;\n    border-bottom: 1p"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/About/index.tsx",
    "chars": 5936,
    "preview": "import React, { useEffect, useMemo } from 'react';\nimport styles from './index.less';\nimport i18n from '@/i18n';\nimport "
  },
  {
    "path": "chat2db-client/src/blocks/Setting/AiSetting/aiTypeConfig.ts",
    "chars": 1519,
    "preview": "import i18n from '@/i18n';\nimport { IAiConfig } from '@/typings';\nimport { AIType } from '@/typings/ai';\n\nexport type IA"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/AiSetting/index.less",
    "chars": 411,
    "preview": ".aiSqlSource {\n  display: flex;\n  margin-bottom: 20px;\n}\n\n.aiSqlSourceTitle {\n  margin-right: 20px;\n  min-width: 50px;\n}"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/AiSetting/index.tsx",
    "chars": 4258,
    "preview": "import React, { useEffect, useState } from 'react';\nimport configService from '@/service/config';\nimport { AIType } from"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/BaseSetting/index.less",
    "chars": 1368,
    "preview": ".title {\n  font-size: 14px;\n  margin-bottom: 10px;\n\n  i {\n    margin-left: 10px;\n    color: var(--color-primary);\n  }\n}\n"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/BaseSetting/index.tsx",
    "chars": 5834,
    "preview": "import React, { useState } from 'react';\nimport { LangType, ThemeType } from '@/constants';\nimport i18n, { currentLang }"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/ProxySetting/index.less",
    "chars": 241,
    "preview": ".title {\n  font-size: 14px;\n  margin-bottom: 10px;\n\n  i {\n    margin-left: 10px;\n    color: var(--color-primary);\n  }\n}\n"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/ProxySetting/index.tsx",
    "chars": 1728,
    "preview": "import React, { useState } from 'react';\nimport i18n from '@/i18n';\nimport { Button, Input, message } from 'antd';\nimpor"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/UpdateDetection/index.less",
    "chars": 938,
    "preview": "@import '../../../styles/var.less';\n.versionText{\n  color: var(--color-primary);\n}\n\n.notificationBtnBox{\n  display: flex"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/UpdateDetection/index.tsx",
    "chars": 8050,
    "preview": "import React, { memo, useEffect, forwardRef, ForwardedRef, useImperativeHandle } from 'react';\nimport configService from"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/index.less",
    "chars": 1469,
    "preview": "@import '../../styles/var.less';\n\n.box {\n  .f-icon-button();\n}\n\n.settingIcon {\n  color: var(--custom-color-icon);\n\n  &:h"
  },
  {
    "path": "chat2db-client/src/blocks/Setting/index.tsx",
    "chars": 4931,
    "preview": "import React, { ReactNode, useEffect, useState } from 'react';\nimport classnames from 'classnames';\nimport Iconfont from"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/functions/deleteSequence.tsx",
    "chars": 1998,
    "preview": "// 置顶表格\nimport React, { useState } from 'react';\nimport mysqlService from '@/service/sql';\nimport { Button, Checkbox } f"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/functions/deleteTable.less",
    "chars": 302,
    "preview": ".deleteTableFooter{\n  display: flex;\n  justify-content: center;\n  button{\n    margin: 0px 15px;\n  }\n\n}\n\n.checkContainer{"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/functions/deleteTable.tsx",
    "chars": 1943,
    "preview": "// 置顶表格\nimport React, { useState } from 'react';\nimport mysqlService from '@/service/sql';\nimport { Button, Checkbox } f"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/functions/openAsyncSql.ts",
    "chars": 5301,
    "preview": "import { WorkspaceTabType } from '@/constants';\nimport sqlService from '@/service/sql';\nimport {createConsole} from '@/p"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/functions/pinTable.ts",
    "chars": 473,
    "preview": "// 置顶表格\nimport mysqlService from '@/service/sql';\nexport const handelPinTable = ({ treeNodeData,loadData }) => {\n  const"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/functions/refresh.ts",
    "chars": 151,
    "preview": "import { ITreeNode } from '@/typings';\n\nexport const refreshTreeNode = (props:{\n  treeNodeData: ITreeNode;\n}) => {\n  con"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/functions/viewDDL.less",
    "chars": 118,
    "preview": ".monacoEditorBox{\n  border: 1px solid var(--color-border);\n  border-radius: 4px;\n  height: 60vh;\n  overflow: hidden;\n}"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/functions/viewDDL.tsx",
    "chars": 1251,
    "preview": "// 置顶表格\nimport React from 'react';\nimport mysqlService from '@/service/sql';\nimport { v4 as uuid } from 'uuid';\nimport s"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/hooks/useGetRightClickMenu.ts",
    "chars": 22782,
    "preview": "import { ITreeNode } from '@/typings';\nimport { OperationColumn, WorkspaceTabType, TreeNodeType } from '@/constants';\nim"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/hooks/useTreeNodeFocus.ts",
    "chars": 181,
    "preview": "import { useTreeStore } from '../treeStore';\n\nexport const useTreeNodeFocus = (treeId) => {\n  const focusId = useTreeSto"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/index.less",
    "chars": 2906,
    "preview": "@import '../../styles/var.less';\n\n.scrollBox {\n  overflow-y: auto;\n  padding: 2px 6px 10px;\n  box-sizing: border-box;\n  "
  },
  {
    "path": "chat2db-client/src/blocks/Tree/index.tsx",
    "chars": 14594,
    "preview": "import React, { memo, useEffect, useMemo, useState, createContext, useContext } from 'react';\nimport styles from './inde"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/treeConfig.tsx",
    "chars": 19952,
    "preview": "import { ITreeNode, IConnectionDetails } from '@/typings';\nimport { TreeNodeType, OperationColumn } from '@/constants';\n"
  },
  {
    "path": "chat2db-client/src/blocks/Tree/treeStore.ts",
    "chars": 877,
    "preview": "/**\n * 树的store\n */\nimport { create, UseBoundStore, StoreApi } from 'zustand';\nimport { devtools } from 'zustand/middlewa"
  },
  {
    "path": "chat2db-client/src/components/BrandLogo/index.less",
    "chars": 179,
    "preview": "@import '../../styles/var.less';\n\n.box {\n  display: flex;\n  justify-content: center;\n  border-radius: 10%;\n  overflow: h"
  },
  {
    "path": "chat2db-client/src/components/BrandLogo/index.tsx",
    "chars": 546,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport logo"
  },
  {
    "path": "chat2db-client/src/components/CascaderDB/index.less",
    "chars": 644,
    "preview": ".cascaderDB {\n  display: inline-flex;\n  align-items: center;\n  border-radius: 16px;\n  padding: 4px 8px 4px 0;\n  backgrou"
  },
  {
    "path": "chat2db-client/src/components/CascaderDB/index.tsx",
    "chars": 6167,
    "preview": "import React, { useEffect, useState } from 'react';\nimport { Divider, Select, Typography } from 'antd';\nimport connectio"
  },
  {
    "path": "chat2db-client/src/components/ConnectionEdit/components/Driver/index.less",
    "chars": 895,
    "preview": "@import '../../../../styles/var.less';\n\n.box {\n  :global {\n    .ant-form-item-row{\n      display: flex;\n    }\n    .ant-f"
  },
  {
    "path": "chat2db-client/src/components/ConnectionEdit/components/Driver/index.tsx",
    "chars": 5728,
    "preview": "import React, { memo, useState, useEffect } from 'react';\nimport styles from './index.less';\nimport classnames from 'cla"
  },
  {
    "path": "chat2db-client/src/components/ConnectionEdit/config/dataSource.ts",
    "chars": 55875,
    "preview": "import { DatabaseTypeCode, OperationColumn } from '@/constants';\nimport { IConnectionConfig } from './types';\nimport { I"
  },
  {
    "path": "chat2db-client/src/components/ConnectionEdit/config/enum.ts",
    "chars": 250,
    "preview": "export enum InputType {\n  INPUT = 'input',\n  PASSWORD = 'password',\n  SELECT = 'select',\n}\n\nexport enum AuthenticationTy"
  },
  {
    "path": "chat2db-client/src/components/ConnectionEdit/config/types.ts",
    "chars": 1548,
    "preview": "import { InputType, AuthenticationType, SSHAuthenticationType } from './enum';\nimport { DatabaseTypeCode, OperationColum"
  },
  {
    "path": "chat2db-client/src/components/ConnectionEdit/index.less",
    "chars": 2280,
    "preview": "@import '../../styles/var.less';\n\n.connectionBox {\n  width: 100%;\n  box-sizing: border-box;\n  flex-shrink: 0;\n  padding:"
  },
  {
    "path": "chat2db-client/src/components/ConnectionEdit/index.tsx",
    "chars": 20274,
    "preview": "import React, { useEffect, useMemo, useState, Fragment, forwardRef, ForwardedRef, useImperativeHandle } from 'react';\nim"
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/components/ChatInput/index.less",
    "chars": 1366,
    "preview": ".chatWrapper {\n  display: flex;\n  align-items: center;\n  padding: 2px 4px 2px 20px;\n  height: 42px;\n  box-sizing: border"
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/components/ChatInput/index.tsx",
    "chars": 4119,
    "preview": "import React, { useState } from 'react';\nimport styles from './index.less';\nimport AIImg from '@/assets/img/ai.svg';\nimp"
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/components/OperationLine/index.less",
    "chars": 533,
    "preview": "\n.consoleOptionsWrapper {\n  position: absolute;\n  bottom: 0px;\n  left: 0;\n  right: 0;\n  height: 40px;\n  display: flex;\n "
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/components/OperationLine/index.tsx",
    "chars": 2366,
    "preview": "import React from 'react';\nimport i18n from '@/i18n';\nimport { Button, Popover } from 'antd';\nimport { IBoundInfo } from"
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/components/SelectBoundInfo/index.less",
    "chars": 515,
    "preview": "@import '../../../../styles/var.less';\n\n.consoleOptionsRight {\n  flex: 1;\n  display: flex;\n  justify-content: flex-end;\n"
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/components/SelectBoundInfo/index.tsx",
    "chars": 8840,
    "preview": "import React, { useEffect, useMemo, useState, memo, useContext } from 'react';\nimport { IntelligentEditorContext } from "
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/hooks/useModuleData.ts",
    "chars": 1066,
    "preview": "import {useState, useEffect} from 'react';\nimport sqlService from '@/service/sql';\nimport {IBoundInfo} from '../index'\n\n"
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/hooks/useSaveEditorData.ts",
    "chars": 3741,
    "preview": "import {useState, useEffect, useRef} from 'react';\nimport { ConsoleStatus } from '@/constants';\nimport { message } from "
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/index.less",
    "chars": 338,
    "preview": ".console {\n  position: relative;\n  height: 100%;\n\n  :global {\n    .ant-spin-nested-loading {\n      height: 100%;\n    }\n\n"
  },
  {
    "path": "chat2db-client/src/components/ConsoleEditor/index.tsx",
    "chars": 13692,
    "preview": "import React, {\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  useImperativeHandle,\n  ForwardedRef,\n  forwardRef,\n  cre"
  },
  {
    "path": "chat2db-client/src/components/CreateDatabase/index.less",
    "chars": 673,
    "preview": "@import '../../styles/var.less';\n\n.monacoEditorBox {\n  height: 200px;\n  border: 1px solid var(--color-border);\n  border-"
  },
  {
    "path": "chat2db-client/src/components/CreateDatabase/index.tsx",
    "chars": 5790,
    "preview": "import React, { useCallback, useMemo, useState, useEffect } from 'react';\nimport styles from './index.less';\nimport clas"
  },
  {
    "path": "chat2db-client/src/components/CustomLayout/index.less",
    "chars": 453,
    "preview": "@import '../../styles/var.less';\n\n.customLayout {\n  display: flex;\n  align-items: center;\n  margin: 0px -3px;\n  .iconPan"
  },
  {
    "path": "chat2db-client/src/components/CustomLayout/index.tsx",
    "chars": 1239,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport { us"
  },
  {
    "path": "chat2db-client/src/components/CustomSelect/index.less",
    "chars": 43,
    "preview": "@import '../../styles/var.less';\n\n.box {\n}\n"
  },
  {
    "path": "chat2db-client/src/components/CustomSelect/index.tsx",
    "chars": 1702,
    "preview": "import React, { memo, useEffect, useState } from 'react';\nimport { Select } from 'antd';\n\ninterface IOption {\n  label: s"
  },
  {
    "path": "chat2db-client/src/components/DraggableContainer/index.less",
    "chars": 742,
    "preview": "// @import '../../var.less';\n\n.box {\n  display: flex;\n  .divider {\n    width: 0px;\n    position: relative;\n  }\n\n  .divid"
  },
  {
    "path": "chat2db-client/src/components/DraggableContainer/index.tsx",
    "chars": 2442,
    "preview": "import React, { memo, useRef, useEffect, useState } from 'react';\nimport styles from './index.less';\nimport classnames f"
  },
  {
    "path": "chat2db-client/src/components/EditDialog/index.less",
    "chars": 43,
    "preview": "@import '../../styles/var.less';\n\n.box {\n}\n"
  },
  {
    "path": "chat2db-client/src/components/EditDialog/index.tsx",
    "chars": 1116,
    "preview": "import React, { memo, useEffect, useRef, useState, ForwardedRef } from 'react';\nimport styles from './index.less';\nimpor"
  },
  {
    "path": "chat2db-client/src/components/ExecuteSQL/index.less",
    "chars": 2136,
    "preview": "@import '../../styles/var.less';\n\n.executeSQL {\n  .monacoEditorModal {\n    display: flex;\n    height: 400px;\n    border:"
  },
  {
    "path": "chat2db-client/src/components/ExecuteSQL/index.tsx",
    "chars": 3570,
    "preview": "import React, { memo, useRef, useState, useMemo, useEffect } from 'react';\nimport styles from './index.less';\nimport cla"
  },
  {
    "path": "chat2db-client/src/components/Iconfont/index.less",
    "chars": 905,
    "preview": "@font-face {\n  font-family: 'iconfont'; /* Project id 3633546 */\n  src: url('../../assets/font/iconfont.woff2') format('"
  },
  {
    "path": "chat2db-client/src/components/Iconfont/index.tsx",
    "chars": 1816,
    "preview": "import React from 'react';\nimport classnames from 'classnames';\n// import desktopStyle from './desktop.less';\nimport sty"
  },
  {
    "path": "chat2db-client/src/components/ImportBlock/index.tsx",
    "chars": 1538,
    "preview": "import React from 'react';\nimport { Modal, Upload, Button } from 'antd';\nimport { UploadOutlined } from '@ant-design/ico"
  },
  {
    "path": "chat2db-client/src/components/ImportConnection/index.tsx",
    "chars": 2199,
    "preview": "import React, { useEffect, useState } from 'react';\nimport { Modal, Upload, Button, message } from 'antd';\nimport { Uplo"
  },
  {
    "path": "chat2db-client/src/components/LayoutBasic/index.less",
    "chars": 18,
    "preview": ".layoutBasic{\n  \n}"
  },
  {
    "path": "chat2db-client/src/components/LayoutBasic/index.tsx",
    "chars": 243,
    "preview": "import React from 'react';\nimport style from './index.less'\n\ninterface IProps{\n  className: string;\n}\n\nfunction LayoutBa"
  },
  {
    "path": "chat2db-client/src/components/Loading/LazyLoading/index.less",
    "chars": 175,
    "preview": "@import '../../../styles/var.less';\n.box {\n  .f-fill-absolute();\n  display: flex;\n  justify-content: center;\n  align-ite"
  },
  {
    "path": "chat2db-client/src/components/Loading/LazyLoading/index.tsx",
    "chars": 368,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport Load"
  },
  {
    "path": "chat2db-client/src/components/Loading/Loading/index.less",
    "chars": 2689,
    "preview": ".loading-components-box{\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  .load-container {\n    mar"
  },
  {
    "path": "chat2db-client/src/components/Loading/Loading/index.tsx",
    "chars": 1106,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport './i"
  },
  {
    "path": "chat2db-client/src/components/Loading/LoadingContent/index.less",
    "chars": 401,
    "preview": ".loadingContent {\n  position: relative;\n}\n\n.stateIndicator {\n  width: 200px;\n  height: 200px;\n}\n\n.empty {\n  height: 100%"
  },
  {
    "path": "chat2db-client/src/components/Loading/LoadingContent/index.tsx",
    "chars": 1214,
    "preview": "import React from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport StateIndicator"
  },
  {
    "path": "chat2db-client/src/components/Loading/LoadingGracile/index.less",
    "chars": 3059,
    "preview": "@import '../../../styles/var.less';\n\n.spinner {\n  font-size: 14px;\n  position: relative;\n  display: inline-block;\n  widt"
  },
  {
    "path": "chat2db-client/src/components/Loading/LoadingGracile/index.tsx",
    "chars": 924,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport './i"
  },
  {
    "path": "chat2db-client/src/components/Loading/LoadingLiquid/index.less",
    "chars": 729,
    "preview": ".box {\n  svg {\n    width: 0;\n    height: 0;\n  }\n}\n\n.loading {\n  width: 200px;\n  height: 200px;\n  position: relative;\n  f"
  },
  {
    "path": "chat2db-client/src/components/Loading/LoadingLiquid/index.tsx",
    "chars": 976,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport './i"
  },
  {
    "path": "chat2db-client/src/components/MenuLabel/index.less",
    "chars": 358,
    "preview": "@import '../../styles/var.less';\n\n.menuLabel {\n  display: flex;\n  align-items: center;\n  .menuLabelIconBox{\n    width: 2"
  },
  {
    "path": "chat2db-client/src/components/MenuLabel/index.tsx",
    "chars": 758,
    "preview": "import React, { memo } from 'react';\nimport classnames from 'classnames';\nimport Iconfont from '@/components/Iconfont';\n"
  },
  {
    "path": "chat2db-client/src/components/Modal/BaseModal/index.tsx",
    "chars": 1333,
    "preview": "import React, { memo, useEffect, useMemo, useState } from 'react';\nimport { Modal as AntdModal } from 'antd';\nimport { i"
  },
  {
    "path": "chat2db-client/src/components/Modal/MonacoEditorModal/index.tsx",
    "chars": 581,
    "preview": "import React, { memo } from 'react';\nimport { Modal } from 'antd';\nimport MonacoEditor, { IExportRefFunction } from '@/c"
  },
  {
    "path": "chat2db-client/src/components/Modal/TriggeredModal/index.less",
    "chars": 33,
    "preview": "@import '../../styles/var.less';\n"
  },
  {
    "path": "chat2db-client/src/components/Modal/TriggeredModal/index.tsx",
    "chars": 774,
    "preview": "import React, { memo, Fragment, ReactElement, cloneElement } from 'react';\nimport { Modal } from 'antd';\n\ninterface ITri"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/index.less",
    "chars": 37,
    "preview": ".editorContainer {\n  height: 100%;\n}\n"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/index.tsx",
    "chars": 9038,
    "preview": "import React, { ForwardedRef, forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\nimport cs from 'classna"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/monacoEditorConfig.ts",
    "chars": 1127,
    "preview": "import { IEditorOptions } from '@/components/MonacoEditor';\n\nexport const editorDefaultOptions: IEditorOptions = {\n  fon"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/index.ts",
    "chars": 51,
    "preview": "export * from './parser';\nexport * from './lexer';\n"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/lexer/index.ts",
    "chars": 2218,
    "preview": "import { IToken } from './token';\n\nexport { IToken };\n\ninterface ILexerConfig {\n  type: string;\n  regexes: RegExp[];\n  /"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/lexer/token.ts",
    "chars": 92,
    "preview": "export interface IToken {\n  type: string;\n  value: string;\n  position?: [number, number];\n}\n"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/parser/chain.ts",
    "chars": 20993,
    "preview": "/* eslint-disable no-use-before-define */\nimport { defaults, uniq, uniqBy } from 'lodash';\nimport { Lexer } from '../lex"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/parser/define.ts",
    "chars": 4524,
    "preview": "import { IToken } from '../lexer/token';\nimport { IMatch } from './match';\nimport { Scanner } from './scanner';\n\n// tsli"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/parser/index.ts",
    "chars": 174,
    "preview": "export { chain, createParser } from './chain';\nexport { many, matchTokenType, optional, plus } from './match';\nexport { "
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/parser/match.ts",
    "chars": 3606,
    "preview": "import { IToken } from '../lexer/token';\nimport { chain } from './chain';\nimport { IElements } from './define';\nimport {"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/parser/scanner.ts",
    "chars": 2371,
    "preview": "import { IToken } from '../lexer/token';\n\nexport class Scanner {\n  private tokens: IToken[] = [];\n\n  private index = 0;\n"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/parser/utils.ts",
    "chars": 1617,
    "preview": "import { IAst } from './define';\n\nexport const compareIgnoreLowerCaseWhenString = (source: any, target: any) => {\n  if ("
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/monaco-plugin/default-opts.ts",
    "chars": 3763,
    "preview": "/* eslint-disable @typescript-eslint/no-parameter-properties */\n/* eslint-disable no-useless-constructor */\nimport * as "
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/monaco-plugin/index.ts",
    "chars": 9811,
    "preview": "/* eslint-disable no-restricted-globals */\n/* eslint-disable no-case-declarations */\n/* eslint-disable no-use-before-def"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/monaco-plugin/parser.worker.ts",
    "chars": 256,
    "preview": "import { mysqlParser } from '../sql-parser';\n\n// eslint-disable-next-line no-restricted-globals\nconst ctx: Worker = self"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/define.ts",
    "chars": 1219,
    "preview": "import { IToken } from '../../..';\n\nexport type IStatements = IStatement[];\n\nexport interface IStatement {\n  type: 'stat"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/four-operations.ts",
    "chars": 995,
    "preview": "/* eslint-disable no-use-before-define */\nimport { chain, ChainFunction, optional } from '../../..';\n\n// Four operations"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/parser.ts",
    "chars": 3048,
    "preview": "/* eslint-disable no-use-before-define */\nimport { chain, many, matchTokenType, optional } from '../../..';\nimport { res"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/reader.ts",
    "chars": 9527,
    "preview": "/* eslint-disable no-case-declarations */\nimport * as _ from 'lodash';\nimport { IToken } from '../../..';\nimport {\n  ICo"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/reserve-keys.ts",
    "chars": 260,
    "preview": "export const reserveKeys = [\n  'select',\n  'create',\n  'insert',\n  'from',\n  'where',\n  'order',\n  'limit',\n  'by',\n  's"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/base/utils.ts",
    "chars": 612,
    "preview": "export function isOkay(obj: any) {\n  return obj != null;\n}\n\nexport function flattenAll(arr: any[]) {\n  return arr\n    .f"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/index.tsx",
    "chars": 132,
    "preview": "import * as reader from './base/reader';\n\nexport { reader };\nexport * from './base/define';\n\nexport { mysqlParser } from"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/mysql/index.ts",
    "chars": 334,
    "preview": "import { createParser } from '../../..';\nimport { IStatements } from '../base/define';\nimport { sqlTokenizer } from './l"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/mysql/lexer.ts",
    "chars": 931,
    "preview": "import { createLexer } from '../../..';\n\nexport const sqlTokenizer = createLexer([\n  {\n    type: 'whitespace',\n    regex"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/syntax-parser/plugin/sql-parser/mysql/parser.ts",
    "chars": 14422,
    "preview": "/* eslint-disable no-use-before-define */\nimport { chain, many, optional, plus } from '../../..';\nimport { createFourOpe"
  },
  {
    "path": "chat2db-client/src/components/MonacoEditor/useMonacoTheme.ts",
    "chars": 1359,
    "preview": "import { useEffect } from 'react';\nimport {useTheme} from '@/hooks/useTheme';\nimport * as monaco from 'monaco-editor/esm"
  },
  {
    "path": "chat2db-client/src/components/MyNotification/index.less",
    "chars": 1385,
    "preview": "@import '../../styles/var.less';\n\n.message {\n  display: flex;\n  align-items: center;\n  padding: 0px 8px;\n  i {\n    margi"
  },
  {
    "path": "chat2db-client/src/components/MyNotification/index.tsx",
    "chars": 3213,
    "preview": "import React, { useCallback, useState } from 'react';\nimport { Button, message, Modal, notification, Space } from 'antd'"
  },
  {
    "path": "chat2db-client/src/components/Output/index.less",
    "chars": 1401,
    "preview": "@import '../../styles/var.less';\n\n.output {\n  width: 100%;\n  height: 100%;\n  position: relative;\n  display: flex;\n  flex"
  },
  {
    "path": "chat2db-client/src/components/Output/index.tsx",
    "chars": 4493,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport Icon"
  },
  {
    "path": "chat2db-client/src/components/Popularize/index.less",
    "chars": 364,
    "preview": "@import '../../styles/var.less';\n\n.box {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: ce"
  },
  {
    "path": "chat2db-client/src/components/Popularize/index.tsx",
    "chars": 1169,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport i18n"
  },
  {
    "path": "chat2db-client/src/components/RefreshLoadingButton/index.less",
    "chars": 43,
    "preview": "@import '../../styles/var.less';\n\n.box {\n}\n"
  },
  {
    "path": "chat2db-client/src/components/RefreshLoadingButton/index.tsx",
    "chars": 610,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport Icon"
  },
  {
    "path": "chat2db-client/src/components/ScrollLoading/index.less",
    "chars": 197,
    "preview": "@import '../../styles/var.less';\n\n.box{\n  .tips{\n    display: flex;\n    justify-content: center;\n    align-items: center"
  },
  {
    "path": "chat2db-client/src/components/ScrollLoading/index.tsx",
    "chars": 2370,
    "preview": "import React, { memo, useRef, useCallback, useEffect } from 'react';\nimport styles from './index.less';\nimport classname"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/OperationalDataBar/index.less",
    "chars": 49,
    "preview": "@import '../../../../styles/var.less';\n\n.box {\n}\n"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/OperationalDataBar/index.tsx",
    "chars": 339,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\n\ninterface "
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/Pagination/index.less",
    "chars": 870,
    "preview": "@import '../../../../styles/var.less';\n.paginationWrapper {\n  display: flex;\n  justify-content: start;\n  align-items: ce"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/Pagination/index.tsx",
    "chars": 4952,
    "preview": "import React, { useEffect, useState } from 'react';\nimport { VerticalLeftOutlined, VerticalRightOutlined, LeftOutlined, "
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/RightClickMenu/index.less",
    "chars": 169,
    "preview": "@import '../../../../styles/var.less';\n\n.dropdownOverlay {\n  :global {\n    .ant-dropdown-menu-submenu-title{\n      displ"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/RightClickMenu/index.tsx",
    "chars": 4331,
    "preview": "import React, { memo, useEffect, useMemo } from 'react';\nimport { Dropdown, ConfigProvider } from 'antd';\nimport i18n fr"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/ScreeningResult/index.less",
    "chars": 794,
    "preview": ".screeningResult{\n  display: flex;\n  align-items: center;\n  height: 18px;\n  padding: 4px 0px;\n  border-bottom: 1px solid"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/ScreeningResult/index.tsx",
    "chars": 4021,
    "preview": "import React, { memo, useEffect, useContext } from 'react';\nimport classnames from 'classnames';\nimport styles from './i"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/StatusBar/index.less",
    "chars": 400,
    "preview": "@import '../../../../styles/var.less';\n\n.statusBar {\n  height: 26px;\n  box-sizing: border-box;\n  padding: 4px 8px;\n  fon"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/StatusBar/index.tsx",
    "chars": 712,
    "preview": "import React, { memo } from 'react';\nimport styles from './index.less';\nimport classnames from 'classnames';\nimport i18n"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/TableBox/index.less",
    "chars": 6061,
    "preview": "@import '../../../../styles/var.less';\n\n.button-bar-item() {\n  width: 24px;\n  height: 24px;\n  display: flex;\n  justify-c"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/components/TableBox/index.tsx",
    "chars": 37774,
    "preview": "import React, { useEffect, useMemo, useState } from 'react';\nimport { Dropdown, Input, MenuProps, message, Modal, Space,"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/hooks/useCurdTableData.ts",
    "chars": 7025,
    "preview": "import lodash from 'lodash';\nimport { CRUD } from '@/constants';\nimport { USER_FILLED_VALUE, IUpdateData } from '../comp"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/hooks/useMultipleSelect.ts",
    "chars": 4257,
    "preview": "import { useEffect, useState, useRef, useCallback } from 'react';\nimport lodash from 'lodash';\n\n// 多选行 hooks\nconst useMu"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/hooks/usePasteData.ts",
    "chars": 2020,
    "preview": "import { useEffect, useState } from 'react';\nimport { clipboardToArray } from '@/utils';\n\ninterface IUsePasteDataRelyDat"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/index.less",
    "chars": 1508,
    "preview": "@import '../../styles/var.less';\n\n.searchResult {\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  position:"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/index.tsx",
    "chars": 6765,
    "preview": "import React, {\n  useCallback,\n  useEffect,\n  useMemo,\n  useState,\n  useRef,\n  forwardRef,\n  ForwardedRef,\n  useImperati"
  },
  {
    "path": "chat2db-client/src/components/SearchResult/utils.tsx",
    "chars": 243,
    "preview": "import { USER_FILLED_VALUE } from './components/TableBox/index';\n\n// 在input中把USER_FILLED_VALUE转换为null\nexport const trans"
  },
  {
    "path": "chat2db-client/src/components/ShortcutKey/index.less",
    "chars": 701,
    "preview": "@import '../../styles/var.less';\n\n.box {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-i"
  },
  {
    "path": "chat2db-client/src/components/ShortcutKey/index.tsx",
    "chars": 1844,
    "preview": "import React, { memo, Fragment } from 'react';\nimport i18n from '@/i18n';\nimport styles from './index.less';\nimport clas"
  },
  {
    "path": "chat2db-client/src/components/SingleFileMonacoEditor/index.less",
    "chars": 78,
    "preview": "@import '../../styles/var.less';\n\n.singleFileMonacoEditor {\n  height: 18px;\n}\n"
  },
  {
    "path": "chat2db-client/src/components/SingleFileMonacoEditor/index.tsx",
    "chars": 2731,
    "preview": "import React, { memo, useCallback, useMemo, ForwardedRef, forwardRef, useImperativeHandle, useRef } from 'react';\nimport"
  },
  {
    "path": "chat2db-client/src/components/StateIndicator/index.less",
    "chars": 1157,
    "preview": "@import '../../styles/var.less';\n\n.box {\n  height: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: cent"
  }
]

// ... and 1433 more files (download for full content)

About this extraction

This page contains the full source code of the CodePhiliaX/Chat2DB GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1633 files (4.7 MB), approximately 1.3M tokens, and a symbol index with 5801 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!