The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
├── .dockerignore
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .github
    └── workflows
    │   ├── admin.yaml
    │   ├── ci.yaml
    │   ├── deploy-deno.yml
    │   ├── deploy-github-app.yml
    │   ├── deploy-laf.yml
    │   ├── deploy-website.yml
    │   ├── desktop-build.yml
    │   ├── docker-publish-canary.yml
    │   ├── docker-publish.yml
    │   ├── rn-build-apk.yml
    │   ├── translator.yaml
    │   ├── vercel-nightly-test.yml
    │   └── vercel-nightly.yml
├── .gitignore
├── .husky
    ├── commit-msg
    └── pre-commit
├── .lintstagedrc.json
├── .npmrc
├── .prettierignore
├── .prettierrc.json
├── .release-it.json
├── .vscode
    ├── launch.json
    ├── react.code-snippets
    └── settings.json
├── CHANGELOG.md
├── Dockerfile
├── LICENSE
├── README.md
├── README.zh.md
├── apps
    ├── README.md
    ├── cli
    │   ├── .gitignore
    │   ├── .npmrc
    │   ├── LICENSE
    │   ├── README.md
    │   ├── bin
    │   │   └── cli
    │   ├── package.json
    │   ├── src
    │   │   ├── app
    │   │   │   ├── App.tsx
    │   │   │   ├── hooks
    │   │   │   │   └── useScreenSize.ts
    │   │   │   └── index.tsx
    │   │   ├── commands
    │   │   │   ├── app.ts
    │   │   │   ├── benchmark
    │   │   │   │   ├── connections.ts
    │   │   │   │   ├── index.ts
    │   │   │   │   ├── message.ts
    │   │   │   │   └── register.ts
    │   │   │   ├── connect.ts
    │   │   │   ├── create.ts
    │   │   │   ├── declaration.ts
    │   │   │   ├── docker
    │   │   │   │   ├── doctor.ts
    │   │   │   │   ├── index.ts
    │   │   │   │   ├── init.ts
    │   │   │   │   └── update.ts
    │   │   │   ├── registry
    │   │   │   │   ├── config.ts
    │   │   │   │   └── index.ts
    │   │   │   ├── smtp.ts
    │   │   │   └── usage.ts
    │   │   ├── index.ts
    │   │   ├── update.ts
    │   │   └── utils.ts
    │   ├── templates
    │   │   ├── client-plugin
    │   │   │   └── {{id}}
    │   │   │   │   ├── manifest.json
    │   │   │   │   ├── package.json
    │   │   │   │   ├── src
    │   │   │   │       ├── index.tsx
    │   │   │   │       └── translate.ts
    │   │   │   │   ├── tsconfig.json
    │   │   │   │   └── types
    │   │   │   │       └── tailchat.d.ts
    │   │   ├── plopfile.js
    │   │   ├── server-plugin-full
    │   │   │   └── {{id}}
    │   │   │   │   ├── .ministarrc.js
    │   │   │   │   ├── models
    │   │   │   │       └── {{pickPluginName id}}.ts
    │   │   │   │   ├── package.json
    │   │   │   │   ├── services
    │   │   │   │       └── {{pickPluginName id}}.service.ts
    │   │   │   │   └── web
    │   │   │   │       └── plugins
    │   │   │   │           └── {{id}}
    │   │   │   │               ├── manifest.json
    │   │   │   │               ├── package.json
    │   │   │   │               ├── src
    │   │   │   │                   └── index.tsx
    │   │   │   │               ├── tsconfig.json
    │   │   │   │               └── types
    │   │   │   │                   └── tailchat.d.ts
    │   │   ├── server-plugin-web
    │   │   │   └── {{id}}
    │   │   │   │   ├── .ministarrc.js
    │   │   │   │   └── web
    │   │   │   │       └── plugins
    │   │   │   │           └── {{id}}
    │   │   │   │               ├── manifest.json
    │   │   │   │               ├── package.json
    │   │   │   │               ├── src
    │   │   │   │                   ├── index.tsx
    │   │   │   │                   └── translate.ts
    │   │   │   │               ├── tsconfig.json
    │   │   │   │               └── types
    │   │   │   │                   └── tailchat.d.ts
    │   │   └── server-plugin
    │   │   │   └── {{id}}
    │   │   │       ├── models
    │   │   │           └── {{pickPluginName id}}.ts
    │   │   │       ├── package.json
    │   │   │       └── services
    │   │   │           └── {{pickPluginName id}}.service.ts
    │   └── tsconfig.json
    ├── github-app
    │   ├── .dockerignore
    │   ├── .env.example
    │   ├── .gitignore
    │   ├── CODE_OF_CONDUCT.md
    │   ├── CONTRIBUTING.md
    │   ├── Dockerfile
    │   ├── LICENSE
    │   ├── README.md
    │   ├── api
    │   │   ├── github
    │   │   │   └── webhooks
    │   │   │   │   └── index.js
    │   │   └── index.js
    │   ├── app.yml
    │   ├── jest.config.js
    │   ├── package.json
    │   ├── public
    │   │   └── favicon.ico
    │   ├── src
    │   │   ├── app.ts
    │   │   ├── client.ts
    │   │   ├── index.ts
    │   │   └── utils.ts
    │   ├── test
    │   │   ├── fixtures
    │   │   │   ├── issues.opened.json
    │   │   │   └── mock-cert.pem
    │   │   └── index.test.ts
    │   ├── tsconfig.json
    │   └── vercel.json
    ├── oauth-demo
    │   ├── app.html
    │   ├── index.ts
    │   ├── package.json
    │   └── tsconfig.json
    └── widget
    │   ├── .gitignore
    │   ├── .yarnrc
    │   ├── demo
    │       ├── .gitignore
    │       ├── index.html
    │       ├── package.json
    │       └── yarn.lock
    │   ├── package.json
    │   ├── src
    │       └── index.ts
    │   └── tsconfig.json
├── client
    ├── .dockerignore
    ├── .gitattributes
    ├── .github
    │   └── workflows
    │   │   └── playwright.yml
    ├── .husky
    │   ├── commit-msg
    │   └── pre-commit
    ├── .npmrc
    ├── build
    │   ├── config
    │   │   └── i18next-scanner.config.js
    │   └── script
    │   │   ├── buildPublicTranslation.js
    │   │   └── scanTranslation.js
    ├── desktop-old
    │   ├── .gitignore
    │   ├── .npmrc
    │   ├── build
    │   │   ├── icon.icns
    │   │   └── icon.ico
    │   ├── forge.config.js
    │   ├── package.json
    │   ├── scripts
    │   │   └── update.ts
    │   ├── src
    │   │   ├── lib
    │   │   │   ├── electron-update-notifier.ts
    │   │   │   └── update-electron-app.ts
    │   │   └── main
    │   │   │   ├── config.ts
    │   │   │   ├── index.ts
    │   │   │   ├── menu.ts
    │   │   │   └── update.ts
    │   ├── tsconfig.json
    │   └── yarn.lock
    ├── desktop
    │   ├── .editorconfig
    │   ├── .erb
    │   │   ├── configs
    │   │   │   ├── .eslintrc
    │   │   │   ├── webpack.config.base.ts
    │   │   │   ├── webpack.config.main.prod.ts
    │   │   │   ├── webpack.config.preload.dev.ts
    │   │   │   ├── webpack.config.renderer.dev.dll.ts
    │   │   │   ├── webpack.config.renderer.dev.ts
    │   │   │   ├── webpack.config.renderer.prod.ts
    │   │   │   └── webpack.paths.ts
    │   │   ├── img
    │   │   │   ├── erb-banner.svg
    │   │   │   └── erb-logo.png
    │   │   ├── mocks
    │   │   │   └── fileMock.js
    │   │   └── scripts
    │   │   │   ├── .eslintrc
    │   │   │   ├── check-build-exists.ts
    │   │   │   ├── check-native-dep.js
    │   │   │   ├── check-node-env.js
    │   │   │   ├── check-port-in-use.js
    │   │   │   ├── clean.js
    │   │   │   ├── delete-source-maps.js
    │   │   │   ├── electron-rebuild.js
    │   │   │   ├── link-modules.ts
    │   │   │   └── notarize.js
    │   ├── .gitattributes
    │   ├── .github
    │   │   └── workflows
    │   │   │   ├── publish.yml
    │   │   │   └── test.yml
    │   ├── .gitignore
    │   ├── .npmrc
    │   ├── .vscode
    │   │   ├── extensions.json
    │   │   ├── launch.json
    │   │   ├── settings.json
    │   │   └── tasks.json
    │   ├── LICENSE
    │   ├── README.md
    │   ├── assets
    │   │   ├── add.svg
    │   │   ├── assets.d.ts
    │   │   ├── capturer-source-picker.html
    │   │   ├── entitlements.mac.plist
    │   │   ├── icon.icns
    │   │   ├── icon.ico
    │   │   ├── icon.png
    │   │   └── icon.svg
    │   ├── electron-builder.yml
    │   ├── package.json
    │   ├── release
    │   │   └── app
    │   │   │   ├── .npmrc
    │   │   │   ├── package.json
    │   │   │   └── yarn.lock
    │   ├── scripts
    │   │   └── deploy.ts
    │   ├── src
    │   │   ├── __tests__
    │   │   │   └── App.test.tsx
    │   │   ├── main
    │   │   │   ├── inject
    │   │   │   │   ├── index.ts
    │   │   │   │   └── message-handler.ts
    │   │   │   ├── lib
    │   │   │   │   ├── electron-serve.ts
    │   │   │   │   ├── http.ts
    │   │   │   │   └── webview-manager.ts
    │   │   │   ├── main.ts
    │   │   │   ├── menu.ts
    │   │   │   ├── preload.ts
    │   │   │   ├── screenshots.ts
    │   │   │   └── util.ts
    │   │   └── renderer
    │   │   │   ├── AddServerItem.tsx
    │   │   │   ├── App.css
    │   │   │   ├── App.tsx
    │   │   │   ├── ServerItem.css
    │   │   │   ├── ServerItem.tsx
    │   │   │   ├── index.ejs
    │   │   │   ├── index.tsx
    │   │   │   ├── preload.d.ts
    │   │   │   ├── store
    │   │   │       └── server.ts
    │   │   │   └── utils
    │   │   │       └── index.ts
    │   ├── tailwind.config.js
    │   ├── test
    │   │   └── http-server.ts
    │   ├── tsconfig.json
    │   └── yarn.lock
    ├── mobile
    │   ├── .bundle
    │   │   └── config
    │   ├── .env.example
    │   ├── .eslintrc.js
    │   ├── .gitignore
    │   ├── .node-version
    │   ├── .npmrc
    │   ├── .prettierrc.js
    │   ├── .ruby-version
    │   ├── .watchmanconfig
    │   ├── Gemfile
    │   ├── Gemfile.lock
    │   ├── __tests__
    │   │   └── App-test.tsx
    │   ├── android
    │   │   ├── app
    │   │   │   ├── build.gradle
    │   │   │   ├── debug.keystore
    │   │   │   ├── proguard-rules.pro
    │   │   │   └── src
    │   │   │   │   ├── debug
    │   │   │   │       ├── AndroidManifest.xml
    │   │   │   │       └── java
    │   │   │   │       │   └── com
    │   │   │   │       │       └── msgbyte
    │   │   │   │       │           └── tailchat
    │   │   │   │       │               └── ReactNativeFlipper.java
    │   │   │   │   ├── main
    │   │   │   │       ├── AndroidManifest.xml
    │   │   │   │       ├── java
    │   │   │   │       │   └── com
    │   │   │   │       │   │   └── msgbyte
    │   │   │   │       │   │       └── tailchat
    │   │   │   │       │   │           ├── GetuiLogger.java
    │   │   │   │       │   │           ├── GetuiModule.java
    │   │   │   │       │   │           ├── GetuiPackage.java
    │   │   │   │       │   │           ├── MainActivity.java
    │   │   │   │       │   │           ├── MainApplication.java
    │   │   │   │       │   │           ├── PushIntentService.java
    │   │   │   │       │   │           └── TailchatPushService.java
    │   │   │   │       └── res
    │   │   │   │       │   ├── drawable
    │   │   │   │       │       └── rn_edit_text_material.xml
    │   │   │   │       │   ├── mipmap-hdpi
    │   │   │   │       │       ├── ic_launcher.png
    │   │   │   │       │       └── ic_launcher_round.png
    │   │   │   │       │   ├── mipmap-mdpi
    │   │   │   │       │       ├── ic_launcher.png
    │   │   │   │       │       └── ic_launcher_round.png
    │   │   │   │       │   ├── mipmap-xhdpi
    │   │   │   │       │       ├── ic_launcher.png
    │   │   │   │       │       └── ic_launcher_round.png
    │   │   │   │       │   ├── mipmap-xxhdpi
    │   │   │   │       │       ├── ic_launcher.png
    │   │   │   │       │       └── ic_launcher_round.png
    │   │   │   │       │   ├── mipmap-xxxhdpi
    │   │   │   │       │       ├── ic_launcher.png
    │   │   │   │       │       └── ic_launcher_round.png
    │   │   │   │       │   └── values
    │   │   │   │       │       ├── strings.xml
    │   │   │   │       │       └── styles.xml
    │   │   │   │   └── release
    │   │   │   │       └── java
    │   │   │   │           └── com
    │   │   │   │               └── tailchat
    │   │   │   │                   └── ReactNativeFlipper.java
    │   │   ├── build.gradle
    │   │   ├── gradle.properties
    │   │   ├── gradle
    │   │   │   └── wrapper
    │   │   │   │   ├── gradle-wrapper.jar
    │   │   │   │   └── gradle-wrapper.properties
    │   │   ├── gradlew
    │   │   ├── gradlew.bat
    │   │   └── settings.gradle
    │   ├── app.json
    │   ├── babel.config.js
    │   ├── index.js
    │   ├── ios
    │   │   ├── .xcode.env
    │   │   ├── Podfile
    │   │   ├── Podfile.lock
    │   │   ├── Tailchat.xcodeproj
    │   │   │   ├── project.pbxproj
    │   │   │   ├── project.xcworkspace
    │   │   │   │   ├── contents.xcworkspacedata
    │   │   │   │   └── xcshareddata
    │   │   │   │   │   └── IDEWorkspaceChecks.plist
    │   │   │   └── xcshareddata
    │   │   │   │   └── xcschemes
    │   │   │   │       └── Tailchat.xcscheme
    │   │   ├── Tailchat.xcworkspace
    │   │   │   └── contents.xcworkspacedata
    │   │   ├── Tailchat
    │   │   │   ├── AppDelegate.h
    │   │   │   ├── AppDelegate.mm
    │   │   │   ├── Images.xcassets
    │   │   │   │   ├── AppIcon.appiconset
    │   │   │   │   │   └── Contents.json
    │   │   │   │   └── Contents.json
    │   │   │   ├── Info.plist
    │   │   │   ├── LaunchScreen.storyboard
    │   │   │   └── main.m
    │   │   └── TailchatTests
    │   │   │   ├── Info.plist
    │   │   │   └── TailchatTests.m
    │   ├── metro.config.js
    │   ├── package.json
    │   ├── scripts
    │   │   └── notify-links.js
    │   ├── src
    │   │   ├── App.tsx
    │   │   ├── AppMain.tsx
    │   │   ├── Entry.tsx
    │   │   ├── components
    │   │   │   └── ServerCard.tsx
    │   │   ├── hooks
    │   │   │   └── useToast.tsx
    │   │   ├── lib
    │   │   │   ├── i18n
    │   │   │   │   ├── index.ts
    │   │   │   │   └── translations
    │   │   │   │   │   ├── en.json
    │   │   │   │   │   └── zh.json
    │   │   │   ├── inject
    │   │   │   │   ├── index.ts
    │   │   │   │   └── message-handler.ts
    │   │   │   ├── notifications
    │   │   │   │   ├── getui.ts
    │   │   │   │   └── index.ts
    │   │   │   ├── permissions
    │   │   │   │   └── index.ts
    │   │   │   ├── socket
    │   │   │   │   └── index.ts
    │   │   │   └── utils
    │   │   │   │   ├── index.ts
    │   │   │   │   └── storage.ts
    │   │   ├── store
    │   │   │   ├── server.ts
    │   │   │   └── ui.ts
    │   │   ├── theme.ts
    │   │   └── types.ts
    │   ├── tsconfig.json
    │   └── yarn.lock
    ├── package.json
    ├── packages
    │   ├── design
    │   │   ├── .gitignore
    │   │   ├── .storybook
    │   │   │   ├── main.js
    │   │   │   └── preview.js
    │   │   ├── README.md
    │   │   ├── components
    │   │   │   ├── AutoFolder
    │   │   │   │   ├── index.stories.tsx
    │   │   │   │   └── index.tsx
    │   │   │   ├── Avatar
    │   │   │   │   ├── combined.css
    │   │   │   │   ├── combined.tsx
    │   │   │   │   ├── index.stories.tsx
    │   │   │   │   ├── index.tsx
    │   │   │   │   └── utils.ts
    │   │   │   ├── AvatarWithPreview
    │   │   │   │   ├── index.stories.tsx
    │   │   │   │   └── index.tsx
    │   │   │   ├── CopyableText
    │   │   │   │   ├── index.stories.tsx
    │   │   │   │   └── index.tsx
    │   │   │   ├── DelayTip
    │   │   │   │   ├── index.stories.tsx
    │   │   │   │   └── index.tsx
    │   │   │   ├── Highlight
    │   │   │   │   ├── index.module.less
    │   │   │   │   └── index.tsx
    │   │   │   ├── Icon
    │   │   │   │   └── index.tsx
    │   │   │   ├── Image
    │   │   │   │   ├── index.stories.tsx
    │   │   │   │   └── index.tsx
    │   │   │   ├── Introduction.stories.mdx
    │   │   │   ├── RichEditor
    │   │   │   │   ├── bbcode.ts
    │   │   │   │   ├── editor.css
    │   │   │   │   ├── editor.tsx
    │   │   │   │   ├── extensions
    │   │   │   │   │   └── index.ts
    │   │   │   │   ├── index.stories.tsx
    │   │   │   │   ├── index.tsx
    │   │   │   │   └── toolbar.tsx
    │   │   │   ├── SensitiveText
    │   │   │   │   ├── index.stories.tsx
    │   │   │   │   └── index.tsx
    │   │   │   ├── VirtualChatList
    │   │   │   │   ├── README.md
    │   │   │   │   ├── ResizeWatcher.tsx
    │   │   │   │   ├── Scroller.tsx
    │   │   │   │   ├── index.stories.tsx
    │   │   │   │   ├── index.tsx
    │   │   │   │   └── types.ts
    │   │   │   ├── WebMetaForm
    │   │   │   │   ├── __tests__
    │   │   │   │   │   └── utils.spec.ts
    │   │   │   │   ├── index.tsx
    │   │   │   │   ├── types
    │   │   │   │   │   ├── Checkbox.tsx
    │   │   │   │   │   ├── Custom.tsx
    │   │   │   │   │   ├── Password.tsx
    │   │   │   │   │   ├── Select.tsx
    │   │   │   │   │   ├── Text.tsx
    │   │   │   │   │   └── TextArea.tsx
    │   │   │   │   └── utils.ts
    │   │   │   ├── index.ts
    │   │   │   └── utils.ts
    │   │   ├── package.json
    │   │   ├── tsconfig.json
    │   │   └── types
    │   │   │   └── index.d.ts
    │   ├── plugin-declaration-generator
    │   │   ├── .gitignore
    │   │   ├── README.md
    │   │   ├── package.json
    │   │   ├── src
    │   │   │   ├── index.ts
    │   │   │   ├── parser.ts
    │   │   │   └── tsgenerator.ts
    │   │   ├── test
    │   │   │   ├── demo
    │   │   │   │   ├── bar.ts
    │   │   │   │   ├── foo.ts
    │   │   │   │   ├── index.ts
    │   │   │   │   └── tsconfig.json
    │   │   │   ├── index.d.ts
    │   │   │   ├── index.ts
    │   │   │   └── parser.ts
    │   │   └── tsconfig.json
    │   └── tailchat-client-sdk
    │   │   ├── .gitignore
    │   │   ├── README.md
    │   │   ├── jest.config.js
    │   │   ├── package.json
    │   │   ├── src
    │   │       ├── __tests__
    │   │       │   └── utils.spec.ts
    │   │       ├── index.ts
    │   │       ├── openapi
    │   │       │   ├── client
    │   │       │   │   ├── base.ts
    │   │       │   │   ├── http.ts
    │   │       │   │   ├── index.ts
    │   │       │   │   └── ws.ts
    │   │       │   └── index.ts
    │   │       ├── plugins
    │   │       │   └── simplenotify.ts
    │   │       └── utils.ts
    │   │   ├── test
    │   │       └── index.ts
    │   │   └── tsconfig.json
    ├── shared
    │   ├── api
    │   │   ├── buildStorage.ts
    │   │   ├── request.ts
    │   │   └── socket.ts
    │   ├── cache
    │   │   ├── Provider.tsx
    │   │   ├── cache.ts
    │   │   ├── index.ts
    │   │   ├── useCache.ts
    │   │   └── utils.ts
    │   ├── components
    │   │   ├── AlphaContainer.tsx
    │   │   ├── DevContainer.tsx
    │   │   ├── Portal
    │   │   │   ├── Consumer.tsx
    │   │   │   ├── Manager.tsx
    │   │   │   ├── README.md
    │   │   │   ├── buildPortal.tsx
    │   │   │   ├── context.ts
    │   │   │   ├── defaultEventEmitter.tsx
    │   │   │   └── index.ts
    │   │   └── Provider.tsx
    │   ├── contexts
    │   │   ├── ChatBoxContext.tsx
    │   │   ├── ColorSchemeContext.tsx
    │   │   ├── ConverseMessageContext.tsx
    │   │   ├── GroupInfoContext.tsx
    │   │   └── factory.tsx
    │   ├── event
    │   │   └── index.ts
    │   ├── helper
    │   │   └── converse-helper.ts
    │   ├── hooks
    │   │   ├── factory
    │   │   │   ├── createUpdateEffect.ts
    │   │   │   └── createUseStorageState.ts
    │   │   ├── model
    │   │   │   ├── useAvailableServices.ts
    │   │   │   ├── useMessageNotifyEventFilter.tsx
    │   │   │   ├── useUserInfo.ts
    │   │   │   ├── useUserInfoList.ts
    │   │   │   ├── useUserSettings.ts
    │   │   │   └── useUsernames.ts
    │   │   ├── useAlphaMode.ts
    │   │   ├── useAsync.ts
    │   │   ├── useAsyncFn.ts
    │   │   ├── useAsyncRefresh.ts
    │   │   ├── useAsyncRequest.ts
    │   │   ├── useDataReady.ts
    │   │   ├── useDebounce.ts
    │   │   ├── useEditValue.ts
    │   │   ├── useEffectOnce.ts
    │   │   ├── useEvent.ts
    │   │   ├── useInterval.ts
    │   │   ├── useLazyValue.ts
    │   │   ├── useMemoizedFn.ts
    │   │   ├── useMountedState.ts
    │   │   ├── usePrevious.ts
    │   │   ├── useRafState.ts
    │   │   ├── useSearch.ts
    │   │   ├── useShallowObject.ts
    │   │   ├── useTimeoutFn.ts
    │   │   ├── useUnmount.ts
    │   │   ├── useUpdateEffect.ts
    │   │   ├── useUpdateRef.ts
    │   │   ├── useWatch.ts
    │   │   └── useWhyDidYouUpdate.ts
    │   ├── i18n
    │   │   ├── Trans.tsx
    │   │   ├── __mocks__
    │   │   │   └── index.ts
    │   │   ├── index.ts
    │   │   ├── langs
    │   │   │   ├── en-US
    │   │   │   │   └── translation.json
    │   │   │   └── zh-CN
    │   │   │   │   └── translation.json
    │   │   └── language.ts
    │   ├── index.tsx
    │   ├── manager
    │   │   ├── __tests__
    │   │   │   └── buildReg.spec.ts
    │   │   ├── buildReg.ts
    │   │   ├── request.ts
    │   │   ├── service.ts
    │   │   ├── socket.ts
    │   │   ├── storage.ts
    │   │   └── ui.ts
    │   ├── model
    │   │   ├── __all__.ts
    │   │   ├── common.ts
    │   │   ├── config.ts
    │   │   ├── converse.ts
    │   │   ├── friend.ts
    │   │   ├── group.ts
    │   │   ├── inbox.ts
    │   │   ├── message.ts
    │   │   ├── plugin.ts
    │   │   └── user.ts
    │   ├── package.json
    │   ├── redux
    │   │   ├── hooks
    │   │   │   ├── useAckInfo.ts
    │   │   │   ├── useAppSelector.ts
    │   │   │   ├── useConverse.ts
    │   │   │   ├── useConverseAck.ts
    │   │   │   ├── useConverseMessage.ts
    │   │   │   ├── useDMConverseName.ts
    │   │   │   ├── useFriendNickname.ts
    │   │   │   ├── useGroup.ts
    │   │   │   ├── useGroupAck.ts
    │   │   │   ├── useGroupMemberMute.ts
    │   │   │   ├── useGroupPermission.ts
    │   │   │   ├── useInbox.ts
    │   │   │   ├── useUnread.ts
    │   │   │   └── useUserInfo.ts
    │   │   ├── setup.ts
    │   │   ├── slices
    │   │   │   ├── chat.ts
    │   │   │   ├── global.ts
    │   │   │   ├── group.ts
    │   │   │   ├── index.ts
    │   │   │   ├── ui.ts
    │   │   │   └── user.ts
    │   │   └── store.ts
    │   ├── store
    │   │   └── globalConfig.ts
    │   ├── types.ts
    │   └── utils
    │   │   ├── __tests__
    │   │       ├── array-helper.spec.ts
    │   │       ├── color-scheme-helper.spec.ts
    │   │       ├── date-helper.spec.ts
    │   │       ├── is-promise.spec.ts
    │   │       ├── json-helper.spec.ts
    │   │       └── string-helper.spec.ts
    │   │   ├── array-helper.ts
    │   │   ├── color-scheme-helper.ts
    │   │   ├── consts.ts
    │   │   ├── date-helper.ts
    │   │   ├── environment.ts
    │   │   ├── is-promise.ts
    │   │   ├── json-helper.ts
    │   │   ├── message-helper.ts
    │   │   ├── panel-helper.ts
    │   │   ├── request.ts
    │   │   ├── role-helper.ts
    │   │   ├── string-helper.ts
    │   │   ├── upload-helper.ts
    │   │   ├── url-helper.ts
    │   │   └── utils.ts
    ├── test
    │   └── client.ts
    ├── tsconfig.json
    └── web
    │   ├── .ministarrc.js
    │   ├── .npmrc
    │   ├── assets
    │       ├── _redirects
    │       ├── audio
    │       │   └── telephone.mp3
    │       ├── images
    │       │   ├── avatar
    │       │   │   ├── github-color.webp
    │       │   │   ├── github-dark.svg
    │       │   │   ├── github.svg
    │       │   │   └── robot.webp
    │       │   ├── bg.webp
    │       │   ├── fallback
    │       │   │   ├── 403.svg
    │       │   │   ├── 404.svg
    │       │   │   ├── failed.svg
    │       │   │   ├── in-develop.svg
    │       │   │   ├── no-content.svg
    │       │   │   ├── no-image.svg
    │       │   │   ├── no-message.svg
    │       │   │   ├── no-network.svg
    │       │   │   ├── no-permission.svg
    │       │   │   └── no-searchresult.svg
    │       │   ├── favicon.ico
    │       │   ├── login-pattern.svg
    │       │   ├── logo.svg
    │       │   ├── logo
    │       │   │   ├── logo@192.png
    │       │   │   ├── logo@32.png
    │       │   │   └── logo@512.png
    │       │   ├── problem.svg
    │       │   └── ripple.svg
    │       ├── pwa.webmanifest
    │       ├── robots.txt
    │       └── template.html
    │   ├── build
    │       ├── __tests__
    │       │   └── utils.spec.ts
    │       ├── inject-analytics.js
    │       ├── utils.ts
    │       ├── webpack.config.ts
    │       └── workbox.ts
    │   ├── e2e
    │       ├── cypress
    │       │   ├── .gitignore
    │       │   ├── cypress.json
    │       │   ├── cypress
    │       │   │   ├── components
    │       │   │   │   ├── antd.test.tsx
    │       │   │   │   └── utils
    │       │   │   │   │   └── TestWrapper.tsx
    │       │   │   ├── plugins
    │       │   │   │   ├── index.js
    │       │   │   │   ├── load-webpack.js
    │       │   │   │   └── utils
    │       │   │   │   │   └── tryLoadWebpackConfig.js
    │       │   │   └── support
    │       │   │   │   ├── commands.ts
    │       │   │   │   └── index.ts
    │       │   ├── package.json
    │       │   └── yarn.lock
    │       └── playwright
    │       │   ├── .gitignore
    │       │   ├── .npmrc
    │       │   ├── package.json
    │       │   ├── playwright.config.ts
    │       │   ├── tests
    │       │       ├── entry.spec.ts
    │       │       ├── example.spec.ts.skip
    │       │       ├── main.spec.ts
    │       │       └── utils
    │       │       │   └── user.ts
    │       │   └── yarn.lock
    │   ├── jest.config.js
    │   ├── package.json
    │   ├── plugins
    │       ├── .eslintrc.js
    │       ├── README.md
    │       ├── com.msgbyte.ai-assistant
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── index.tsx
    │       │   │   ├── popover.tsx
    │       │   │   ├── prompt.ts
    │       │   │   └── translate.ts
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.bbcode
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── __tests__
    │       │   │   │   ├── __snapshots__
    │       │   │   │   │   └── render.spec.tsx.snap
    │       │   │   │   └── render.spec.tsx
    │       │   │   ├── bbcode
    │       │   │   │   ├── __tests__
    │       │   │   │   │   ├── index.spec.ts
    │       │   │   │   │   ├── parser.spec.ts
    │       │   │   │   │   ├── serialize.spec.ts
    │       │   │   │   │   └── utils.spec.ts
    │       │   │   │   ├── index.tsx
    │       │   │   │   ├── parser.tsx
    │       │   │   │   ├── serialize.ts
    │       │   │   │   ├── type.ts
    │       │   │   │   └── utils.tsx
    │       │   │   ├── components
    │       │   │   │   └── Highlight.tsx
    │       │   │   ├── index.tsx
    │       │   │   ├── render.ts
    │       │   │   └── tags
    │       │   │   │   ├── BoldTag.tsx
    │       │   │   │   ├── CardTag.tsx
    │       │   │   │   ├── CodeTag.tsx
    │       │   │   │   ├── DeleteTag.tsx
    │       │   │   │   ├── EmojiTag.tsx
    │       │   │   │   ├── ImgTag.tsx
    │       │   │   │   ├── ItalicTag.tsx
    │       │   │   │   ├── MarkdownTag.tsx
    │       │   │   │   ├── MentionTag.tsx
    │       │   │   │   ├── PlainText.tsx
    │       │   │   │   ├── UnderlinedTag.tsx
    │       │   │   │   ├── UrlTag.tsx
    │       │   │   │   ├── __all__.ts
    │       │   │   │   └── styles.less
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── index.d.ts
    │       ├── com.msgbyte.biggerfont
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── const.ts
    │       │   │   ├── index.tsx
    │       │   │   └── translate.ts
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.draw
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── DrawModal.tsx
    │       │   │   ├── index.tsx
    │       │   │   └── translate.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.env.electron
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── DeviceInfoPanel.tsx
    │       │   │   ├── ElectronWebview.tsx
    │       │   │   ├── checkUpdate.tsx
    │       │   │   ├── index.tsx
    │       │   │   ├── overwrite.css
    │       │   │   ├── translate.ts
    │       │   │   └── utils.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.env.rn
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── DeviceInfoPanel.tsx
    │       │   │   ├── index.tsx
    │       │   │   ├── translate.ts
    │       │   │   └── utils.ts
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.filepizza
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   └── index.tsx
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.filesend
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   └── index.tsx
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.filesfm
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   └── index.tsx
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.genshin
    │       │   ├── assets
    │       │   │   └── icon.jpg
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── GenshinPanel
    │       │   │   │   ├── GachaPool
    │       │   │   │   │   ├── GachaPoolItem.tsx
    │       │   │   │   │   ├── GachaResult.tsx
    │       │   │   │   │   ├── WishResultModal.tsx
    │       │   │   │   │   ├── WishResultText.tsx
    │       │   │   │   │   ├── index.tsx
    │       │   │   │   │   └── useWish.tsx
    │       │   │   │   ├── consts.ts
    │       │   │   │   ├── index.less
    │       │   │   │   ├── index.tsx
    │       │   │   │   └── utils.ts
    │       │   │   ├── components
    │       │   │   │   ├── GenshinLoading.less
    │       │   │   │   ├── GenshinLoading.tsx
    │       │   │   │   ├── GenshinRichtext.tsx
    │       │   │   │   └── __tests__
    │       │   │   │   │   ├── GenshinRichtext.spec.tsx
    │       │   │   │   │   └── __snapshots__
    │       │   │   │   │       └── GenshinRichtext.spec.tsx.snap
    │       │   │   ├── index.tsx
    │       │   │   ├── translate.ts
    │       │   │   └── utils
    │       │   │   │   └── openFullScreenVideo.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.integration
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── IntegrationPanel.tsx
    │       │   │   ├── index.tsx
    │       │   │   ├── translate.ts
    │       │   │   └── types.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.intro
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── index.ts
    │       │   │   ├── steps.ts
    │       │   │   ├── style.less
    │       │   │   ├── tour.ts
    │       │   │   └── translate.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.mdpanel
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── group
    │       │   │   │   └── MarkdownPanel.tsx
    │       │   │   ├── index.tsx
    │       │   │   └── translate.ts
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.miaolang
    │       │   ├── README.md
    │       │   ├── docs
    │       │   │   ├── output.png
    │       │   │   └── send.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── SendMiaoModal.tsx
    │       │   │   ├── index.ts
    │       │   │   ├── miaotrans.ts
    │       │   │   ├── reg.ts
    │       │   │   └── translate.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.music
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── index.tsx
    │       │   │   ├── panels
    │       │   │   │   └── MusicPanel.tsx
    │       │   │   └── translate.ts
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.notify
    │       │   ├── assets
    │       │   │   └── sounds_bing.mp3
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── bubble.ts
    │       │   │   ├── const.ts
    │       │   │   ├── index.tsx
    │       │   │   ├── notify.ts
    │       │   │   └── translate.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.offline-icons
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── scripts
    │       │   │   └── extract-icons.ts
    │       │   ├── src
    │       │   │   ├── icons.json
    │       │   │   ├── index.tsx
    │       │   │   └── translate.ts
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.openapi
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── MainPanel
    │       │   │   │   ├── AppInfo
    │       │   │   │   │   ├── Bot.tsx
    │       │   │   │   │   ├── OAuth.tsx
    │       │   │   │   │   ├── Profile.less
    │       │   │   │   │   ├── Profile.tsx
    │       │   │   │   │   ├── Summary.tsx
    │       │   │   │   │   ├── Webpage.tsx
    │       │   │   │   │   ├── index.less
    │       │   │   │   │   ├── index.tsx
    │       │   │   │   │   └── useOpenAppAction.tsx
    │       │   │   │   ├── context.tsx
    │       │   │   │   ├── index.less
    │       │   │   │   ├── index.tsx
    │       │   │   │   ├── types.ts
    │       │   │   │   └── useOpenAppList.ts
    │       │   │   ├── components
    │       │   │   │   └── ServiceChecker.tsx
    │       │   │   ├── index.ts
    │       │   │   ├── modals
    │       │   │   │   └── CreateOpenApp.tsx
    │       │   │   └── translate.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.posthog
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   └── index.tsx
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.sentry
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── index.tsx
    │       │   │   └── lazy.tsx
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.snapdrop
    │       │   ├── README.md
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── index.tsx
    │       │   │   └── translate.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.theme.genshin
    │       │   ├── README.md
    │       │   ├── assets
    │       │   │   └── icon.jpg
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── amber
    │       │   │   │   ├── avatar.png
    │       │   │   │   ├── bg.jpeg
    │       │   │   │   └── theme.less
    │       │   │   ├── hutao
    │       │   │   │   ├── avatar.png
    │       │   │   │   ├── bg.jpg
    │       │   │   │   └── theme.less
    │       │   │   ├── index.ts
    │       │   │   ├── jean
    │       │   │   │   ├── avatar.png
    │       │   │   │   ├── bg.jpeg
    │       │   │   │   └── theme.less
    │       │   │   ├── mona
    │       │   │   │   ├── avatar.png
    │       │   │   │   ├── bg.jpeg
    │       │   │   │   └── theme.less
    │       │   │   └── rosaria
    │       │   │   │   ├── avatar.png
    │       │   │   │   ├── bg.jpeg
    │       │   │   │   └── theme.less
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── index.d.ts
    │       ├── com.msgbyte.theme.miku
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── bg.jpg
    │       │   │   ├── index.ts
    │       │   │   └── theme.less
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── index.d.ts
    │       ├── com.msgbyte.toolwa
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── index.tsx
    │       │   │   └── translate.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.user.location
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   └── index.tsx
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.webview
    │       │   ├── README.md
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── group
    │       │   │   │   ├── GroupCustomWebPanelRender.tsx
    │       │   │   │   └── GroupWebPanelRender.tsx
    │       │   │   ├── index.tsx
    │       │   │   └── translate.ts
    │       │   └── tsconfig.json
    │       ├── com.msgbyte.wenshushu
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   └── index.tsx
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       ├── com.msgbyte.widget.sakana
    │       │   ├── assets
    │       │   │   └── icon.png
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │   │   ├── index.tsx
    │       │   │   ├── main.css
    │       │   │   ├── main.ts
    │       │   │   └── translate.ts
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │   │   └── tailchat.d.ts
    │       └── com.msgbyte.wormhole
    │       │   ├── assets
    │       │       └── icon.webp
    │       │   ├── manifest.json
    │       │   ├── package.json
    │       │   ├── src
    │       │       └── index.tsx
    │       │   ├── tsconfig.json
    │       │   └── types
    │       │       └── tailchat.d.ts
    │   ├── postcss.config.js
    │   ├── registry.json
    │   ├── scripts
    │       ├── deno-static-entry.ts
    │       ├── generate-plugin-declaration.babel.ts
    │       ├── generate-plugin-declaration.tsmorph.ts
    │       ├── generate-plugin-declaration.typescript.ts
    │       ├── plugin-declaration.ts
    │       └── test-export.ts
    │   ├── src
    │       ├── App.tsx
    │       ├── components
    │       │   ├── AlertErrorView.tsx
    │       │   ├── AppRouterApi.tsx
    │       │   ├── Card
    │       │   │   ├── FileCard.tsx
    │       │   │   ├── Wrapper.tsx
    │       │   │   └── index.tsx
    │       │   ├── ChatBox
    │       │   │   ├── ChatBoxPlaceholder.tsx
    │       │   │   ├── ChatInputBox
    │       │   │   │   ├── Addon.tsx
    │       │   │   │   ├── BaseChatInputButton.less
    │       │   │   │   ├── BaseChatInputButton.tsx
    │       │   │   │   ├── ChatDropArea.tsx
    │       │   │   │   ├── Emotion.less
    │       │   │   │   ├── Emotion.tsx
    │       │   │   │   ├── MentionCommandItem.tsx
    │       │   │   │   ├── clipboard-helper.ts
    │       │   │   │   ├── context.tsx
    │       │   │   │   ├── index.tsx
    │       │   │   │   ├── input.less
    │       │   │   │   ├── input.tsx
    │       │   │   │   ├── usePasteHandler.tsx
    │       │   │   │   └── utils.tsx
    │       │   │   ├── ChatMessageList
    │       │   │   │   ├── ChatMessageHeader.tsx
    │       │   │   │   ├── Item.less
    │       │   │   │   ├── Item.tsx
    │       │   │   │   ├── MessageAckContainer.tsx
    │       │   │   │   ├── MessageHighlightContainer.tsx
    │       │   │   │   ├── NormalList.tsx
    │       │   │   │   ├── ScrollToBottom.tsx
    │       │   │   │   ├── VirtualizedList.tsx
    │       │   │   │   ├── VirtualizedList2.tsx
    │       │   │   │   ├── const.ts
    │       │   │   │   ├── index.tsx
    │       │   │   │   ├── types.ts
    │       │   │   │   ├── useChatMessageItemAction.tsx
    │       │   │   │   ├── useChatMessageReaction.tsx
    │       │   │   │   ├── useMessageReactions.tsx
    │       │   │   │   └── useRenderPluginMessageInterpreter.tsx
    │       │   │   ├── ChatReply.tsx
    │       │   │   ├── __tests__
    │       │   │   │   └── preprocessMessage.spec.ts
    │       │   │   ├── index.tsx
    │       │   │   └── preprocessMessage.tsx
    │       │   ├── CollapseView.tsx
    │       │   ├── CommonSidebarWrapper.tsx
    │       │   ├── ConverseName.tsx
    │       │   ├── DelayTip.tsx
    │       │   ├── DynamicVirtualizedList
    │       │   │   ├── DynamicSizeList.tsx
    │       │   │   ├── ItemMeasurer.tsx
    │       │   │   └── README.md
    │       │   ├── Emoji
    │       │   │   ├── Emoji.tsx
    │       │   │   ├── Picker.less
    │       │   │   ├── Picker.tsx
    │       │   │   ├── const.ts
    │       │   │   ├── index.tsx
    │       │   │   ├── twitter.png
    │       │   │   ├── types.ts
    │       │   │   └── utils.ts
    │       │   ├── ErrorBoundary.tsx
    │       │   ├── ErrorView.tsx
    │       │   ├── FileSelector.tsx
    │       │   ├── FullModal
    │       │   │   ├── CommonTitle.tsx
    │       │   │   ├── Factory.tsx
    │       │   │   ├── Field.tsx
    │       │   │   └── index.tsx
    │       │   ├── GlobalAnnouncementBar.tsx
    │       │   ├── GlobalTemporaryTip.tsx
    │       │   ├── GroupName.tsx
    │       │   ├── GroupPanelItem.tsx
    │       │   ├── GroupPanelSelector.tsx
    │       │   ├── GroupSection.tsx
    │       │   ├── Highlight.tsx
    │       │   ├── IconBtn.tsx
    │       │   ├── Image.tsx
    │       │   ├── ImagePicker.tsx
    │       │   ├── ImageUploader.tsx
    │       │   ├── Intersection.tsx
    │       │   ├── InviteCodeExpiredAt.tsx
    │       │   ├── IsDeveloping.tsx
    │       │   ├── JumpToButton.tsx
    │       │   ├── KeepAliveOverlay
    │       │   │   ├── KeepAliveOverlayHost.tsx
    │       │   │   ├── README.md
    │       │   │   ├── index.ts
    │       │   │   ├── store.ts
    │       │   │   └── withKeepAliveOverlay.tsx
    │       │   ├── LanguageSelect.tsx
    │       │   ├── Loadable.tsx
    │       │   ├── Loading.tsx
    │       │   ├── LoadingOnFirst.tsx
    │       │   ├── LoadingSpinner.tsx
    │       │   ├── Markdown
    │       │   │   ├── editor.less
    │       │   │   ├── editor.tsx
    │       │   │   ├── index.tsx
    │       │   │   ├── render.less
    │       │   │   └── render.tsx
    │       │   ├── Modal.less
    │       │   ├── Modal.tsx
    │       │   ├── NoData.tsx
    │       │   ├── NotFound.tsx
    │       │   ├── OpenedPanelTip.tsx
    │       │   ├── Panel
    │       │   │   ├── common
    │       │   │   │   ├── Header.tsx
    │       │   │   │   ├── MessageSearch.tsx
    │       │   │   │   └── Wrapper.tsx
    │       │   │   ├── group
    │       │   │   │   ├── GroupExtraDataPanel.tsx
    │       │   │   │   ├── MembersPanel.tsx
    │       │   │   │   ├── PluginPanel.tsx
    │       │   │   │   ├── TextPanel.tsx
    │       │   │   │   └── shared
    │       │   │   │   │   └── GroupPanelContainer.tsx
    │       │   │   └── personal
    │       │   │   │   └── ConversePanel.tsx
    │       │   ├── PermissionList.tsx
    │       │   ├── PillTabs.less
    │       │   ├── PillTabs.tsx
    │       │   ├── Portal.tsx
    │       │   ├── Problem.tsx
    │       │   ├── QuickSwitcher
    │       │   │   ├── index.tsx
    │       │   │   ├── useQuickSwitcherActionContext.tsx
    │       │   │   ├── useQuickSwitcherAllAction.ts
    │       │   │   └── useQuickSwitcherFilteredActions.tsx
    │       │   ├── SectionHeader.tsx
    │       │   ├── SidebarView.tsx
    │       │   ├── Slides.less
    │       │   ├── Slides.tsx
    │       │   ├── Spinner.tsx
    │       │   ├── SplitPanel.less
    │       │   ├── SplitPanel.tsx
    │       │   ├── SubmitButton.tsx
    │       │   ├── TcPopover.tsx
    │       │   ├── TipIcon.tsx
    │       │   ├── UpdateNotificationBtn.tsx
    │       │   ├── UserAvatar.tsx
    │       │   ├── UserListItem.tsx
    │       │   ├── UserName.tsx
    │       │   ├── UserPicker
    │       │   │   ├── FriendPicker.tsx
    │       │   │   └── UserPicker.tsx
    │       │   ├── UserProfileContainer.tsx
    │       │   ├── UserSelector.tsx
    │       │   ├── Webview.tsx
    │       │   ├── __mocks__
    │       │   │   ├── Loadable.tsx
    │       │   │   └── UserName.tsx
    │       │   ├── __tests__
    │       │   │   ├── AlertErrorView.spec.tsx
    │       │   │   ├── DelayTip.spec.tsx
    │       │   │   ├── ErrorView.spec.tsx
    │       │   │   ├── Highlight.spec.tsx
    │       │   │   ├── IconBtn.spec.tsx
    │       │   │   ├── IsDeveloping.spec.tsx
    │       │   │   ├── LoadingSpinner.spec.tsx
    │       │   │   ├── Markdown.spec.tsx
    │       │   │   ├── NoData.spec.tsx
    │       │   │   ├── PillTabs.spec.tsx
    │       │   │   ├── Slides.spec.tsx
    │       │   │   ├── Spinner.spec.tsx
    │       │   │   └── __snapshots__
    │       │   │   │   ├── AlertErrorView.spec.tsx.snap
    │       │   │   │   ├── DelayTip.spec.tsx.snap
    │       │   │   │   ├── ErrorView.spec.tsx.snap
    │       │   │   │   ├── Highlight.spec.tsx.snap
    │       │   │   │   ├── IconBtn.spec.tsx.snap
    │       │   │   │   ├── IsDeveloping.spec.tsx.snap
    │       │   │   │   ├── LoadingSpinner.spec.tsx.snap
    │       │   │   │   ├── Markdown.spec.tsx.snap
    │       │   │   │   ├── NoData.spec.tsx.snap
    │       │   │   │   ├── PillTabs.spec.tsx.snap
    │       │   │   │   ├── Slides.spec.tsx.snap
    │       │   │   │   └── Spinner.spec.tsx.snap
    │       │   ├── modals
    │       │   │   ├── AppendDMConverseMembers.tsx
    │       │   │   ├── ClaimTemporaryUser.tsx
    │       │   │   ├── CreateDMConverse.tsx
    │       │   │   ├── CreateGroup.tsx
    │       │   │   ├── CreateGroupInvite
    │       │   │   │   ├── CreateInviteCode.module.less
    │       │   │   │   ├── CreateInviteCode.tsx
    │       │   │   │   └── index.tsx
    │       │   │   ├── EditGroupInvite
    │       │   │   │   └── index.tsx
    │       │   │   ├── EmailVerify.tsx
    │       │   │   ├── GroupDetail
    │       │   │   │   ├── Config.tsx
    │       │   │   │   ├── Invite.tsx
    │       │   │   │   ├── Member.tsx
    │       │   │   │   ├── Panel
    │       │   │   │   │   ├── GroupPanelTree.tsx
    │       │   │   │   │   ├── __tests__
    │       │   │   │   │   │   ├── GroupPanelTree.spec.tsx
    │       │   │   │   │   │   ├── __snapshots__
    │       │   │   │   │   │   │   └── GroupPanelTree.spec.tsx.snap
    │       │   │   │   │   │   └── utils.spec.ts
    │       │   │   │   │   ├── index.tsx
    │       │   │   │   │   ├── useGroupPanelTreeDrag.tsx
    │       │   │   │   │   └── utils.ts
    │       │   │   │   ├── Role
    │       │   │   │   │   ├── RoleItem.tsx
    │       │   │   │   │   ├── index.tsx
    │       │   │   │   │   ├── tabs
    │       │   │   │   │   │   ├── member.tsx
    │       │   │   │   │   │   ├── permission.tsx
    │       │   │   │   │   │   └── summary.tsx
    │       │   │   │   │   ├── useModifyPermission.ts
    │       │   │   │   │   └── useRoleActions.ts
    │       │   │   │   ├── Summary.tsx
    │       │   │   │   └── index.tsx
    │       │   │   ├── GroupPanel
    │       │   │   │   ├── AdvanceGroupPanelPermission.tsx
    │       │   │   │   ├── CreateGroupPanel.tsx
    │       │   │   │   ├── ModifyGroupPanel.tsx
    │       │   │   │   ├── __tests__
    │       │   │   │   │   └── helper.spec.ts
    │       │   │   │   ├── helper.ts
    │       │   │   │   ├── types.ts
    │       │   │   │   └── useGroupPanelFields.tsx
    │       │   │   ├── ImageCropper.tsx
    │       │   │   ├── ImageUploadPreviewer.tsx
    │       │   │   ├── ModifyPassword.tsx
    │       │   │   ├── SelectGroupMember.tsx
    │       │   │   ├── ServiceUrlSettings.tsx
    │       │   │   ├── SetFriendNickname.tsx
    │       │   │   └── SettingsView
    │       │   │   │   ├── About.tsx
    │       │   │   │   ├── Account.tsx
    │       │   │   │   ├── Debug.tsx
    │       │   │   │   ├── Performance.tsx
    │       │   │   │   ├── Status.tsx
    │       │   │   │   ├── System.tsx
    │       │   │   │   └── index.tsx
    │       │   └── popover
    │       │   │   └── UserPopover
    │       │   │       ├── GroupUserPopover.tsx
    │       │   │       ├── PersonalUserPopover.tsx
    │       │   │       ├── index.tsx
    │       │   │       └── usePluginUserExtraInfo.tsx
    │       ├── context
    │       │   ├── GroupIdContext.tsx
    │       │   ├── GroupPanelContext.tsx
    │       │   └── SocketContext.tsx
    │       ├── dev.ts
    │       ├── hooks
    │       │   ├── useGlobalKeyDown.ts
    │       │   ├── useGroupMemberAction.ts
    │       │   ├── useGroupUnreadState.ts
    │       │   ├── useHistoryNav.ts
    │       │   ├── useInjectTianjiScript.ts
    │       │   ├── useIsMobile.ts
    │       │   ├── useLocalStorage.ts
    │       │   ├── usePanelWindow.ts
    │       │   ├── usePwa.ts
    │       │   ├── useSearchParam.ts
    │       │   ├── useSessionStorageState.ts
    │       │   ├── useUserPreference.ts
    │       │   └── useWindowSize.ts
    │       ├── index.tsx
    │       ├── init.tsx
    │       ├── plugin
    │       │   ├── PluginStore
    │       │   │   ├── DocumentView
    │       │   │   │   ├── DocumentMarkdownRender.tsx
    │       │   │   │   └── index.tsx
    │       │   │   ├── Item.tsx
    │       │   │   ├── ManualInstall.tsx
    │       │   │   └── index.tsx
    │       │   ├── __tests__
    │       │   │   └── utils.spec.ts
    │       │   ├── builtin.ts
    │       │   ├── common
    │       │   │   ├── context.ts
    │       │   │   ├── index.ts
    │       │   │   └── reg.ts
    │       │   ├── component
    │       │   │   └── index.tsx
    │       │   ├── loader.ts
    │       │   ├── manager.ts
    │       │   ├── showPluginLoadError.tsx
    │       │   └── utils.ts
    │       ├── routes
    │       │   ├── Entry
    │       │   │   ├── ForgetPasswordView.tsx
    │       │   │   ├── GuestView.tsx
    │       │   │   ├── LoginView.tsx
    │       │   │   ├── RegisterView.tsx
    │       │   │   ├── components
    │       │   │   │   ├── Input.tsx
    │       │   │   │   ├── PrimaryBtn.tsx
    │       │   │   │   └── SecondaryBtn.tsx
    │       │   │   ├── index.module.less
    │       │   │   ├── index.tsx
    │       │   │   └── utils.ts
    │       │   ├── Invite
    │       │   │   ├── InviteInfo.tsx
    │       │   │   ├── JoinBtn.tsx
    │       │   │   ├── SuccessModal.tsx
    │       │   │   └── index.tsx
    │       │   ├── Main
    │       │   │   ├── Content
    │       │   │   │   ├── CustomSidebarItem.tsx
    │       │   │   │   ├── Group
    │       │   │   │   │   ├── AckPanelItem.tsx
    │       │   │   │   │   ├── GroupHeader.tsx
    │       │   │   │   │   ├── Panel.tsx
    │       │   │   │   │   ├── PanelRedirect.tsx
    │       │   │   │   │   ├── Sidebar.tsx
    │       │   │   │   │   ├── SidebarItem.tsx
    │       │   │   │   │   ├── index.tsx
    │       │   │   │   │   ├── useGroupHeaderAction.tsx
    │       │   │   │   │   └── utils.tsx
    │       │   │   │   ├── Inbox
    │       │   │   │   │   ├── Content
    │       │   │   │   │   │   ├── Markdown.tsx
    │       │   │   │   │   │   ├── Message.tsx
    │       │   │   │   │   │   └── index.tsx
    │       │   │   │   │   ├── Sidebar.tsx
    │       │   │   │   │   └── index.tsx
    │       │   │   │   ├── PageContent.tsx
    │       │   │   │   ├── Personal
    │       │   │   │   │   ├── Converse
    │       │   │   │   │   │   └── index.tsx
    │       │   │   │   │   ├── Friends
    │       │   │   │   │   │   ├── AddFriend.tsx
    │       │   │   │   │   │   ├── FriendList.tsx
    │       │   │   │   │   │   ├── RequestReceived.tsx
    │       │   │   │   │   │   ├── RequestSend.tsx
    │       │   │   │   │   │   └── index.tsx
    │       │   │   │   │   ├── Plugins
    │       │   │   │   │   │   └── index.tsx
    │       │   │   │   │   ├── Sidebar.tsx
    │       │   │   │   │   ├── SidebarDMItem.tsx
    │       │   │   │   │   └── index.tsx
    │       │   │   │   ├── SidebarItem.tsx
    │       │   │   │   └── index.tsx
    │       │   │   ├── Navbar
    │       │   │   │   ├── CustomNavItem.tsx
    │       │   │   │   ├── GroupNav.tsx
    │       │   │   │   ├── InboxNav.tsx
    │       │   │   │   ├── InstallBtn.tsx
    │       │   │   │   ├── MobileMenuBtn.tsx
    │       │   │   │   ├── NavItem.tsx
    │       │   │   │   ├── PersonalNav.tsx
    │       │   │   │   ├── QuickSwitcherNav.tsx
    │       │   │   │   ├── ReactQueryDevBtn.tsx
    │       │   │   │   ├── SettingBtn.tsx
    │       │   │   │   └── index.tsx
    │       │   │   ├── Provider.tsx
    │       │   │   ├── SidebarContext.tsx
    │       │   │   ├── index.tsx
    │       │   │   └── useShortcuts.tsx
    │       │   └── Panel
    │       │   │   ├── README.md
    │       │   │   └── index.tsx
    │       ├── styles
    │       │   ├── antd
    │       │   │   ├── dark.less
    │       │   │   ├── index.less
    │       │   │   ├── overwrite.less
    │       │   │   └── theme.less
    │       │   ├── global.less
    │       │   ├── index.ts
    │       │   └── tailwind.less
    │       └── utils
    │       │   ├── __tests__
    │       │       ├── jwt-helper.spec.ts
    │       │       ├── url-helper.spec.ts
    │       │       └── window-helper.spec.ts
    │       │   ├── device-helper.ts
    │       │   ├── dom-helper.ts
    │       │   ├── event-helper.ts
    │       │   ├── file-helper.ts
    │       │   ├── global-helper.ts
    │       │   ├── global-state-helper.ts
    │       │   ├── group-helper.ts
    │       │   ├── hot-key.ts
    │       │   ├── image-helper.ts
    │       │   ├── jwt-helper.ts
    │       │   ├── location-helper.ts
    │       │   ├── measure-helper.ts
    │       │   ├── plugin-helper.ts
    │       │   ├── sw-helper.ts
    │       │   ├── url-helper.ts
    │       │   ├── user-helper.ts
    │       │   └── window-helper.ts
    │   ├── tailchat.d.ts
    │   ├── tailwind.config.js
    │   ├── test
    │       ├── fileTransformer.js
    │       ├── setup.js
    │       └── utils
    │       │   └── lazy.tsx
    │   ├── tsconfig.json
    │   ├── tsconfig.node.json
    │   ├── tsconfig.test.json
    │   └── types
    │       ├── global.d.ts
    │       └── index.d.ts
├── codemagic.yaml
├── commitlint.config.js
├── docker-compose.env
├── docker-compose.yml
├── docker
    ├── admin.yml
    ├── config
    │   └── nginx.conf
    ├── livekit.yml
    ├── simple
    │   ├── README.md
    │   ├── docker-compose.yml
    │   └── k8s
    │   │   ├── README.md
    │   │   ├── images
    │   │       └── traefik-svc.png
    │   │   ├── ingress.yml
    │   │   ├── minio.yml
    │   │   ├── mongo.yml
    │   │   ├── namespace.yml
    │   │   ├── pv.yml
    │   │   ├── redis.yml
    │   │   └── tailchat.yml
    ├── swag.env.example
    └── swag.yml
├── package.json
├── packages
    └── types
    │   ├── package.json
    │   ├── src
    │       ├── index.ts
    │       └── model
    │       │   ├── group.ts
    │       │   ├── inbox.ts
    │       │   ├── message.ts
    │       │   └── user.ts
    │   └── tsconfig.json
├── page
    └── nightly-intro.html
├── patches
    ├── moleculer@0.14.23.patch
    └── vite-express@0.8.0.patch
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── server
    ├── .dockerignore
    ├── .env.example
    ├── .gitignore
    ├── .npmrc
    ├── README.md
    ├── admin
    │   ├── index.html
    │   ├── nodemon.json
    │   ├── package.json
    │   ├── public
    │   │   └── favicon.ico
    │   ├── src
    │   │   ├── client
    │   │   │   ├── App.tsx
    │   │   │   ├── auth.ts
    │   │   │   ├── components
    │   │   │   │   ├── Dashboard.tsx
    │   │   │   │   ├── MarkdownEditor
    │   │   │   │   │   ├── editor.tsx
    │   │   │   │   │   ├── index.tsx
    │   │   │   │   │   ├── plugins.ts
    │   │   │   │   │   └── style.less
    │   │   │   │   ├── TagItems.tsx
    │   │   │   │   ├── TailchatImage.tsx
    │   │   │   │   └── field
    │   │   │   │   │   ├── filesize.tsx
    │   │   │   │   │   ├── imageUrl.tsx
    │   │   │   │   │   └── user.tsx
    │   │   │   ├── fields.ts
    │   │   │   ├── global.css
    │   │   │   ├── i18n
    │   │   │   │   ├── en.ts
    │   │   │   │   ├── index.ts
    │   │   │   │   └── zh.ts
    │   │   │   ├── main.tsx
    │   │   │   ├── request.ts
    │   │   │   ├── resources
    │   │   │   │   ├── file.tsx
    │   │   │   │   ├── group.tsx
    │   │   │   │   └── user.tsx
    │   │   │   ├── routes
    │   │   │   │   ├── analytics
    │   │   │   │   │   └── index.tsx
    │   │   │   │   ├── cache.tsx
    │   │   │   │   ├── network
    │   │   │   │   │   └── index.tsx
    │   │   │   │   ├── socketio.tsx
    │   │   │   │   └── system
    │   │   │   │   │   ├── index.tsx
    │   │   │   │   │   └── notify.tsx
    │   │   │   ├── utils.ts
    │   │   │   └── vite-env.d.ts
    │   │   └── server
    │   │   │   ├── broker.ts
    │   │   │   ├── index.ts
    │   │   │   ├── middleware
    │   │   │       ├── auth.ts
    │   │   │       └── express-mongoose-ra-json-server
    │   │   │       │   ├── README.md
    │   │   │       │   ├── index.ts
    │   │   │       │   ├── statusMessages.ts
    │   │   │       │   └── utils
    │   │   │       │       ├── baseModel.interface.ts
    │   │   │       │       ├── castFilter.ts
    │   │   │       │       ├── convertId.ts
    │   │   │       │       ├── filterGetList.ts
    │   │   │       │       ├── filterReadOnly.ts
    │   │   │       │       ├── parseQuery.ts
    │   │   │       │       └── virtualId.ts
    │   │   │   └── router
    │   │   │       ├── analytics.ts
    │   │   │       ├── api.ts
    │   │   │       ├── cache.ts
    │   │   │       ├── config.ts
    │   │   │       ├── file.ts
    │   │   │       └── network.ts
    │   ├── tsconfig.json
    │   ├── tsconfig.server.json
    │   └── vite.config.ts
    ├── devops
    │   ├── README.md
    │   ├── config
    │   │   ├── grafana-dashboards.yml
    │   │   ├── grafana-dashboards
    │   │   │   └── tailchat-server.json
    │   │   ├── grafana-prometheus-datasource.yml
    │   │   └── prometheus.yml
    │   └── docker-compose.devops.yml
    ├── jest.config.js
    ├── lib
    │   ├── __tests__
    │   │   ├── const.spec.ts
    │   │   └── utils.spec.ts
    │   ├── const.ts
    │   ├── crypto
    │   │   ├── __tests__
    │   │   │   ├── __snapshots__
    │   │   │   │   └── des.spec.ts.snap
    │   │   │   └── des.spec.ts
    │   │   └── des.ts
    │   └── utils.ts
    ├── locales
    │   ├── en-US
    │   │   └── translation.json
    │   └── zh-CN
    │   │   └── translation.json
    ├── mixins
    │   ├── __tests__
    │   │   └── socketio.spec.ts
    │   ├── cache.cleaner.mixin.ts
    │   ├── health.mixin.ts
    │   └── socketio.mixin.ts
    ├── models
    │   ├── README.md
    │   ├── chat
    │   │   ├── ack.ts
    │   │   ├── converse.ts
    │   │   ├── inbox.ts
    │   │   └── message.ts
    │   ├── config.ts
    │   ├── file.ts
    │   ├── group
    │   │   ├── group-extra.ts
    │   │   ├── group.ts
    │   │   └── invite.ts
    │   ├── openapi
    │   │   ├── __tests__
    │   │   │   └── app.spec.ts
    │   │   └── app.ts
    │   ├── plugin
    │   │   └── manifest.ts
    │   └── user
    │   │   ├── dmlist.ts
    │   │   ├── friend.ts
    │   │   ├── friendRequest.ts
    │   │   ├── mail.ts
    │   │   └── user.ts
    ├── moleculer.config.ts
    ├── openapi.json
    ├── openapi.yaml
    ├── package.json
    ├── packages
    │   ├── openapi-generator
    │   │   ├── package.json
    │   │   ├── src
    │   │   │   ├── generateOpenapiPath.ts
    │   │   │   └── index.ts
    │   │   └── tsconfig.json
    │   ├── sdk
    │   │   ├── .gitignore
    │   │   ├── package.json
    │   │   ├── src
    │   │   │   ├── const.ts
    │   │   │   ├── db
    │   │   │   │   ├── index.ts
    │   │   │   │   ├── mongoose.ts
    │   │   │   │   └── typegoose.ts
    │   │   │   ├── index.ts
    │   │   │   ├── openapi
    │   │   │   │   ├── index.ts
    │   │   │   │   └── oauth.ts
    │   │   │   ├── runner
    │   │   │   │   ├── cli.ts
    │   │   │   │   ├── index.ts
    │   │   │   │   └── moleculer.config.ts
    │   │   │   ├── services
    │   │   │   │   ├── base.ts
    │   │   │   │   ├── broker.ts
    │   │   │   │   ├── lib
    │   │   │   │   │   ├── call.ts
    │   │   │   │   │   ├── errors.ts
    │   │   │   │   │   ├── i18n
    │   │   │   │   │   │   ├── __tests__
    │   │   │   │   │   │   │   ├── index.spec.ts
    │   │   │   │   │   │   │   └── parser.spec.ts
    │   │   │   │   │   │   ├── index.ts
    │   │   │   │   │   │   └── parser.ts
    │   │   │   │   │   ├── moleculer-db-adapter-mongoose
    │   │   │   │   │   │   ├── README.md
    │   │   │   │   │   │   └── index.ts
    │   │   │   │   │   ├── moleculer-web
    │   │   │   │   │   │   ├── README.md
    │   │   │   │   │   │   ├── alias.ts
    │   │   │   │   │   │   ├── errors.ts
    │   │   │   │   │   │   ├── index.ts
    │   │   │   │   │   │   ├── memory-store.ts
    │   │   │   │   │   │   └── utils.ts
    │   │   │   │   │   ├── role.ts
    │   │   │   │   │   └── settings.ts
    │   │   │   │   ├── mixins
    │   │   │   │   │   ├── db.mixin.ts
    │   │   │   │   │   └── minio.mixin.ts
    │   │   │   │   └── types.ts
    │   │   │   ├── structs
    │   │   │   │   ├── chat.ts
    │   │   │   │   ├── events.ts
    │   │   │   │   ├── group.ts
    │   │   │   │   └── user.ts
    │   │   │   └── utils.ts
    │   │   └── tsconfig.json
    │   └── swagger-jsdoc-generator
    │   │   ├── package.json
    │   │   ├── src
    │   │       ├── index.ts
    │   │       ├── processService.ts
    │   │       └── utils.ts
    │   │   └── tsconfig.json
    ├── plugins
    │   ├── com.msgbyte.agora
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │   │   └── agora-meeting.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   ├── agora.service.ts
    │   │   │   └── utils
    │   │   │   │   ├── AccessToken2.ts
    │   │   │   │   ├── README.md
    │   │   │   │   └── RtcTokenBuilder2.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.agora
    │   │   │           ├── assets
    │   │   │               └── icon.png
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── FloatWindow
    │   │   │               │   ├── Controls.tsx
    │   │   │               │   ├── MeetingView.tsx
    │   │   │               │   ├── NetworkStats.tsx
    │   │   │               │   ├── SpeakerNames.tsx
    │   │   │               │   ├── VideoView.tsx
    │   │   │               │   ├── Videos.tsx
    │   │   │               │   ├── client.ts
    │   │   │               │   ├── index.tsx
    │   │   │               │   ├── store.ts
    │   │   │               │   ├── useScreenSharing.ts
    │   │   │               │   ├── utils.ts
    │   │   │               │   └── window.tsx
    │   │   │               ├── index.tsx
    │   │   │               ├── request.ts
    │   │   │               └── translate.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   ├── com.msgbyte.autojoinGroup
    │   │   ├── package.json
    │   │   └── services
    │   │   │   └── autojoinGroup.service.ts
    │   ├── com.msgbyte.discover
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │   │   └── discover.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   └── discover.service.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.discover
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── DiscoverPanel
    │   │   │               │   ├── DiscoverServerCard.tsx
    │   │   │               │   └── index.tsx
    │   │   │               ├── index.tsx
    │   │   │               ├── request.ts
    │   │   │               └── translate.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   ├── com.msgbyte.getui
    │   │   ├── lib
    │   │   │   └── GetuiClient.ts
    │   │   ├── models
    │   │   │   └── log.ts
    │   │   ├── package.json
    │   │   └── services
    │   │   │   └── getui.service.ts
    │   ├── com.msgbyte.github
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │   │   ├── repo.ts
    │   │   │   └── subscribe.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   ├── repo.service.dev.ts
    │   │   │   └── subscribe.service.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.github
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── GroupSubscribePanel
    │   │   │               │   ├── AddGroupSubscribeModal.tsx
    │   │   │               │   └── index.tsx
    │   │   │               ├── components
    │   │   │               │   └── GithubRepoInfo.tsx
    │   │   │               ├── index.tsx
    │   │   │               ├── request.ts
    │   │   │               └── translate.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   ├── com.msgbyte.iam
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │   │   └── iam.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   └── iam.service.ts
    │   │   ├── strategies
    │   │   │   ├── github.ts
    │   │   │   ├── index.ts
    │   │   │   └── types.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.iam
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── IAMAction.tsx
    │   │   │               ├── index.tsx
    │   │   │               ├── request.ts
    │   │   │               └── translate.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   ├── com.msgbyte.linkmeta
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │   │   └── linkmeta.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   └── linkmeta.service.ts
    │   │   ├── test
    │   │   │   ├── __snapshots__
    │   │   │   │   └── linkmeta.spec.ts.snap
    │   │   │   └── linkmeta.spec.ts
    │   │   ├── utils
    │   │   │   ├── __tests__
    │   │   │   │   └── fetchLinkPreview.spec.ts
    │   │   │   ├── fetchLinkPreview.ts
    │   │   │   └── specialWebsiteMeta.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.linkmeta
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── UrlMetaPreviewer
    │   │   │               │   ├── Audio.tsx
    │   │   │               │   ├── Base.tsx
    │   │   │               │   ├── Image.tsx
    │   │   │               │   ├── Video.tsx
    │   │   │               │   ├── index.less
    │   │   │               │   ├── index.tsx
    │   │   │               │   ├── render.tsx
    │   │   │               │   └── types.ts
    │   │   │               ├── index.tsx
    │   │   │               ├── request.ts
    │   │   │               └── translate.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   ├── com.msgbyte.livekit
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │   │   └── livekit.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   └── livekit.service.ts
    │   │   ├── web
    │   │   │   └── plugins
    │   │   │   │   └── com.msgbyte.livekit
    │   │   │   │       ├── assets
    │   │   │   │           └── icon.png
    │   │   │   │       ├── manifest.json
    │   │   │   │       ├── package.json
    │   │   │   │       ├── src
    │   │   │   │           ├── components
    │   │   │   │           │   ├── ActiveRoom.tsx
    │   │   │   │           │   ├── FullScreenBtn.tsx
    │   │   │   │           │   ├── InviteCallNotification.tsx
    │   │   │   │           │   ├── LivekitContainer.tsx
    │   │   │   │           │   ├── LivekitView.tsx
    │   │   │   │           │   ├── ParticipantAvatars.tsx
    │   │   │   │           │   └── lib
    │   │   │   │           │   │   ├── CarouselLayout.tsx
    │   │   │   │           │   │   ├── Chat.tsx
    │   │   │   │           │   │   ├── ControlBar.tsx
    │   │   │   │           │   │   ├── FocusLayout.tsx
    │   │   │   │           │   │   ├── Member.tsx
    │   │   │   │           │   │   ├── ParticipantTile.tsx
    │   │   │   │           │   │   ├── PreJoinView.tsx
    │   │   │   │           │   │   ├── VideoConference.tsx
    │   │   │   │           │   │   └── icons
    │   │   │   │           │   │       └── ScreenShareIcon.tsx
    │   │   │   │           ├── consts.ts
    │   │   │   │           ├── context
    │   │   │   │           │   └── MeetingContext.tsx
    │   │   │   │           ├── group
    │   │   │   │           │   ├── LivekitPanel.tsx
    │   │   │   │           │   └── LivekitPanelBadge.tsx
    │   │   │   │           ├── index.tsx
    │   │   │   │           ├── navbar
    │   │   │   │           │   ├── redirect.tsx
    │   │   │   │           │   └── useIconIsShow.ts
    │   │   │   │           ├── panel
    │   │   │   │           │   └── LivekitMeetingPanel.tsx
    │   │   │   │           ├── request.ts
    │   │   │   │           ├── store
    │   │   │   │           │   ├── meeting.ts
    │   │   │   │           │   └── useLivekitState.ts
    │   │   │   │           ├── translate.ts
    │   │   │   │           └── utils
    │   │   │   │           │   ├── common.ts
    │   │   │   │           │   ├── mergeProps.ts
    │   │   │   │           │   ├── useMediaQuery.ts
    │   │   │   │           │   ├── useObservableState.ts
    │   │   │   │           │   ├── useResizeObserver.ts
    │   │   │   │           │   ├── useRoomParticipants.ts
    │   │   │   │           │   ├── useServerUrl.ts
    │   │   │   │           │   └── useToken.ts
    │   │   │   │       ├── tsconfig.json
    │   │   │   │       └── types
    │   │   │   │           └── tailchat.d.ts
    │   │   └── webhook
    │   │   │   ├── README.md
    │   │   │   ├── broker.ts
    │   │   │   └── index.ts
    │   ├── com.msgbyte.meeting
    │   │   ├── .ministarrc.js
    │   │   ├── deprecated.md
    │   │   ├── models
    │   │   │   └── meeting.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   └── meeting.service.dev.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.meeting
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── FloatWindow
    │   │   │               │   ├── PeerView.tsx
    │   │   │               │   ├── index.tsx
    │   │   │               │   ├── window.less
    │   │   │               │   └── window.tsx
    │   │   │               ├── MeetingPanel
    │   │   │               │   └── index.tsx
    │   │   │               ├── MeetingUrlWrapper.tsx
    │   │   │               ├── helper.ts
    │   │   │               ├── hooks
    │   │   │               │   └── useCreateMeeting.ts
    │   │   │               ├── index.tsx
    │   │   │               ├── meeting
    │   │   │               │   ├── client.ts
    │   │   │               │   ├── context.tsx
    │   │   │               │   ├── index.ts
    │   │   │               │   └── useClientState.ts
    │   │   │               ├── request.ts
    │   │   │               └── translate.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   ├── com.msgbyte.prettyinvite
    │   │   ├── package.json
    │   │   └── services
    │   │   │   └── prettyinvite.service.ts
    │   ├── com.msgbyte.simplenotify
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │   │   └── simplenotify.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   └── simplenotify.service.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.simplenotify
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── GroupSubscribePanel
    │   │   │               │   ├── AddGroupSubscribeModal.tsx
    │   │   │               │   └── index.tsx
    │   │   │               ├── index.tsx
    │   │   │               ├── request.ts
    │   │   │               └── translate.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   ├── com.msgbyte.tasks
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │   │   └── task.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   └── tasks.service.ts
    │   │   ├── test
    │   │   │   └── tasks.spec.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.tasks
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── TasksPanel
    │   │   │               │   ├── NewTask.tsx
    │   │   │               │   ├── TaskItem.tsx
    │   │   │               │   ├── index.less
    │   │   │               │   ├── index.tsx
    │   │   │               │   └── type.ts
    │   │   │               ├── index.tsx
    │   │   │               ├── request.ts
    │   │   │               └── translate.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   ├── com.msgbyte.topic
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │   │   └── topic.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   └── topic.service.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.topic
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── components
    │   │   │               │   ├── TopicCard.tsx
    │   │   │               │   ├── TopicComments.tsx
    │   │   │               │   └── modals
    │   │   │               │   │   └── TopicCreate.tsx
    │   │   │               ├── group
    │   │   │               │   └── GroupTopicPanelRender.tsx
    │   │   │               ├── inbox
    │   │   │               │   └── TopicInboxItem.tsx
    │   │   │               ├── index.tsx
    │   │   │               ├── request.ts
    │   │   │               ├── store.ts
    │   │   │               ├── translate.ts
    │   │   │               └── types.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   ├── com.msgbyte.welcome
    │   │   ├── .ministarrc.js
    │   │   ├── package.json
    │   │   ├── services
    │   │   │   └── welcome.service.ts
    │   │   └── web
    │   │   │   └── plugins
    │   │   │       └── com.msgbyte.welcome
    │   │   │           ├── manifest.json
    │   │   │           ├── package.json
    │   │   │           ├── src
    │   │   │               ├── index.tsx
    │   │   │               └── translate.ts
    │   │   │           ├── tsconfig.json
    │   │   │           └── types
    │   │   │               └── tailchat.d.ts
    │   └── com.msgbyte.wxpusher
    │   │   ├── .ministarrc.js
    │   │   ├── models
    │   │       └── wxpusher-user.ts
    │   │   ├── package.json
    │   │   ├── services
    │   │       └── wxpusher.service.ts
    │   │   └── web
    │   │       └── plugins
    │   │           └── com.msgbyte.wxpusher
    │   │               ├── assets
    │   │                   └── icon.png
    │   │               ├── manifest.json
    │   │               ├── package.json
    │   │               ├── src
    │   │                   ├── SettingsPanel.tsx
    │   │                   ├── index.tsx
    │   │                   └── translate.ts
    │   │               ├── tsconfig.json
    │   │               └── types
    │   │                   └── tailchat.d.ts
    ├── public
    │   ├── .gitkeep
    │   └── css
    │   │   └── bulma.min.css
    ├── runner.ts
    ├── scripts
    │   ├── avatar-url-transform.ts
    │   ├── build.ts
    │   ├── buildDocker.js
    │   ├── dashboard.ts
    │   ├── installPlugin.js
    │   ├── k8s
    │   │   ├── README.md
    │   │   └── kompose
    │   │   │   ├── data-persistentvolumeclaim.yaml
    │   │   │   ├── default-networkpolicy.yaml
    │   │   │   ├── docker-compose-env-configmap.yaml
    │   │   │   ├── internal-networkpolicy.yaml
    │   │   │   ├── minio-pod.yaml
    │   │   │   ├── mongo-pod.yaml
    │   │   │   ├── redis-pod.yaml
    │   │   │   ├── service-chat-deployment.yaml
    │   │   │   ├── service-file-deployment.yaml
    │   │   │   ├── service-gateway-deployment.yaml
    │   │   │   ├── service-group-deployment.yaml
    │   │   │   ├── service-user-deployment.yaml
    │   │   │   ├── storage-persistentvolumeclaim.yaml
    │   │   │   ├── traefik-claim0-persistentvolumeclaim.yaml
    │   │   │   ├── traefik-deployment.yaml
    │   │   │   └── traefik-service.yaml
    │   ├── migrate-mongo-config.js
    │   ├── migrations
    │   │   └── 20220507114141-plugin_simplenotify_defaults_type.ts
    │   ├── scanTranslation.js
    │   └── swagger.ts
    ├── services
    │   ├── README.md
    │   ├── core
    │   │   ├── chat
    │   │   │   ├── ack.service.ts
    │   │   │   ├── converse.service.ts
    │   │   │   ├── inbox.service.ts
    │   │   │   └── message.service.ts
    │   │   ├── config.service.ts
    │   │   ├── file.service.ts
    │   │   ├── gateway.service.ts
    │   │   ├── group
    │   │   │   ├── group.service.ts
    │   │   │   ├── groupExtra.service.ts
    │   │   │   └── invite.service.ts
    │   │   ├── plugin
    │   │   │   └── registry.service.ts
    │   │   └── user
    │   │   │   ├── dmlist.service.ts
    │   │   │   ├── friend.service.ts
    │   │   │   ├── friendRequest.service.ts
    │   │   │   ├── mail.service.ts
    │   │   │   └── user.service.ts
    │   ├── debug.service.ts
    │   └── openapi
    │   │   ├── app.service.ts
    │   │   ├── bot.service.ts
    │   │   ├── integration.service.ts
    │   │   └── oidc
    │   │       ├── account.ts
    │   │       ├── adapter.ts
    │   │       ├── model.ts
    │   │       ├── oidc.service.ts
    │   │       └── views
    │   │           ├── _footer.ejs
    │   │           ├── _header.ejs
    │   │           ├── authorize.ejs
    │   │           ├── error.ejs
    │   │           └── login.ejs
    ├── test
    │   ├── demo
    │   │   ├── getui
    │   │   │   └── index.ts
    │   │   ├── openapi-client-simple
    │   │   │   ├── app.html
    │   │   │   ├── index.ts
    │   │   │   └── package.json
    │   │   ├── openapi-client
    │   │   │   ├── index.ts
    │   │   │   └── package.json
    │   │   └── openapi-oidc-page
    │   │   │   ├── index.ts
    │   │   │   └── package.json
    │   ├── integration
    │   │   ├── chat
    │   │   │   ├── ack.spec.ts
    │   │   │   └── message.spec.ts
    │   │   ├── group
    │   │   │   └── group.spec.ts
    │   │   ├── openapi
    │   │   │   └── app.spec.ts
    │   │   └── user
    │   │   │   ├── dmlist.spec.ts
    │   │   │   └── user.spec.ts
    │   ├── setup.ts
    │   └── utils.ts
    ├── tsconfig.json
    ├── types
    │   ├── neo-blessed
    │   │   └── index.d.ts
    │   └── plugins.d.ts
    └── views
    │   └── mail.ejs
├── tsconfig.json
├── vercel.json
└── website
    ├── .gitignore
    ├── .npmrc
    ├── README.md
    ├── babel.config.js
    ├── blog
        ├── 2023-02-25-ready-for-global.md
        ├── 2023-03-01-the-era-of-noIM.md
        ├── 2023-03-14-v1.6.7.md
        ├── 2023-03-27-deploy-in-synology.md
        ├── 2023-04-02-v1.6.8.md
        ├── 2023-04-24-v1.7.0.md
        ├── 2023-04-28-fast-create-robot-with-laf.md
        ├── 2023-05-24-v1.7.4.md
        ├── 2023-05-28-v1.7.5.md
        ├── 2023-06-07-v1.7.6.md
        ├── 2023-06-19-benchmark-report.md
        ├── 2023-06-21-v1.8.0.md
        ├── 2023-07-03-v1.8.1.md
        ├── 2023-07-04-share-1kstar.md
        ├── 2023-07-05-v1.8.2.md
        ├── 2023-07-10-v1.8.3.md
        ├── 2023-07-14-v1.8.4.md
        ├── 2023-07-19-v1.8.5.md
        ├── 2023-07-24-v1.8.6.md
        ├── 2023-07-30-v1.8.7.md
        ├── 2023-08-06-v1.8.8.md
        ├── 2023-08-13-v1.8.9.md
        ├── 2023-08-21-v1.8.10.md
        ├── 2023-08-28-v1.8.11.md
        ├── 2023-09-04-v1.8.12.md
        ├── 2023-09-15-v1.9.0.md
        ├── 2023-09-19-view-panel-permission.md
        ├── 2023-09-25-v1.9.1.md
        ├── 2023-10-16-v1.9.2.md
        ├── 2023-11-06-v1.9.4.md
        ├── 2023-11-21-v1.9.5.md
        ├── 2023-12-11-v1.10.0.md
        ├── 2024-03-17-v1.10.1.md
        ├── 2024-04-07-v1.11.0.md
        ├── 2024-04-15-v1.11.1.md
        └── authors.yml
    ├── docs
        ├── advanced-usage
        │   ├── _category_.json
        │   ├── custom-builtin-plugin.md
        │   ├── external-storage.md
        │   ├── github-integration.md
        │   ├── openapp
        │   │   ├── _category_.json
        │   │   ├── about.md
        │   │   ├── bot.md
        │   │   ├── create.md
        │   │   ├── oauth.md
        │   │   └── ws.md
        │   ├── plugins
        │   │   ├── _category_.json
        │   │   ├── com.msgbyte.autojoinGroup.md
        │   │   ├── com.msgbyte.iam.md
        │   │   ├── com.msgbyte.livekit.md
        │   │   └── com.msgbyte.wxpusher.md
        │   └── richtext.md
        ├── architecture.md
        ├── benchmark
        │   ├── _category_.json
        │   ├── cli.md
        │   └── report.md
        ├── cli
        │   ├── _category_.json
        │   └── tailchat-cli.md
        ├── contribution
        │   ├── _category_.json
        │   ├── community.md
        │   ├── dev
        │   │   ├── _category_.json
        │   │   └── role.md
        │   └── guide.md
        ├── deployment
        │   ├── _category_.json
        │   ├── admin.md
        │   ├── assets
        │   │   └── docker-init.png
        │   ├── cdn.md
        │   ├── dev.md
        │   ├── docker-compose.mdx
        │   ├── environment.md
        │   ├── https-gateway.md
        │   ├── install-docker.md
        │   ├── mobile.md
        │   ├── other-way
        │   │   ├── _category_.json
        │   │   ├── bt.md
        │   │   ├── kubernetes
        │   │   │   ├── _category_.json
        │   │   │   ├── sealos.md
        │   │   │   └── simple.md
        │   │   └── manual.md
        │   ├── quickstart.md
        │   ├── smtp.md
        │   └── troubleshooting.md
        ├── devops
        │   ├── _category_.json
        │   └── mongodb.md
        ├── intro.md
        ├── meeting
        │   ├── _category_.json
        │   ├── agora.md
        │   ├── deployment.md
        │   ├── images
        │   │   ├── 1.png
        │   │   ├── 2.png
        │   │   ├── 3.png
        │   │   ├── 4.png
        │   │   ├── 5.png
        │   │   ├── 6.png
        │   │   └── 7.png
        │   ├── intro.md
        │   └── livekit.md
        ├── nightly-env.md
        ├── plugin-list
        │   ├── _category_.json
        │   ├── fe.md
        │   ├── full.md
        │   └── theme.md
        ├── plugins
        │   ├── _category_.json
        │   ├── api
        │   │   ├── _category_.json
        │   │   ├── common.md
        │   │   ├── component.md
        │   │   ├── cssvar.md
        │   │   └── role.md
        │   ├── guide
        │   │   ├── _category_.json
        │   │   ├── create-theme.md
        │   │   ├── deploy.md
        │   │   ├── init-env.md
        │   │   └── typescript-support.md
        │   ├── icon.md
        │   └── start.mdx
        └── why.md
    ├── docusaurus.config.js
    ├── i18n
        └── zh-Hans
        │   ├── code.json
        │   ├── docusaurus-plugin-content-blog
        │       ├── 2022-03-27-intro.md
        │       ├── 2022-09-06-v1.0.0.md
        │       ├── 2023-01-07-v1.4.0.md
        │       ├── 2023-03-01-the-era-of-noIM.md
        │       ├── 2023-03-14-v1.6.7.md
        │       ├── 2023-03-27-deploy-in-synology.md
        │       ├── 2023-04-02-v1.6.8.md
        │       ├── 2023-04-24-v1.7.0.md
        │       ├── 2023-04-28-fast-create-robot-with-laf.md
        │       ├── 2023-05-24-v1.7.4.md
        │       ├── 2023-05-28-v1.7.5.md
        │       ├── 2023-06-07-v1.7.6.md
        │       ├── 2023-06-19-benchmark-report.md
        │       ├── 2023-06-21-v1.8.0.md
        │       ├── 2023-07-03-v1.8.1.md
        │       ├── 2023-07-04-share-1kstar.md
        │       ├── 2023-07-05-v1.8.2.md
        │       ├── 2023-07-10-v1.8.3.md
        │       ├── 2023-07-14-v1.8.4.md
        │       ├── 2023-07-19-v1.8.5.md
        │       ├── 2023-07-24-v1.8.6.md
        │       ├── 2023-07-30-v1.8.7.md
        │       ├── 2023-08-06-v1.8.8.md
        │       ├── 2023-08-13-v1.8.9.md
        │       ├── 2023-08-21-v1.8.10.md
        │       ├── 2023-08-28-v1.8.11.md
        │       ├── 2023-09-04-v1.8.12.md
        │       ├── 2023-09-15-v1.9.0.md
        │       ├── 2023-09-19-view-panel-permission.md
        │       ├── 2023-09-25-v1.9.1.md
        │       ├── 2023-10-16-v1.9.2.md
        │       ├── 2023-11-06-v1.9.4.md
        │       ├── 2023-11-21-v1.9.5.md
        │       ├── 2023-12-11-v1.10.0.md
        │       ├── 2024-03-17-v1.10.1.md
        │       ├── 2024-04-07-v1.11.0.md
        │       ├── 2024-04-15-v1.11.1.md
        │       ├── authors.yml
        │       ├── images
        │       │   └── v1.4.0-agora.png
        │       └── options.json
        │   ├── docusaurus-plugin-content-docs
        │       ├── current.json
        │       └── current
        │       │   ├── advanced-usage
        │       │       ├── custom-builtin-plugin.md
        │       │       ├── external-storage.md
        │       │       ├── github-integration.md
        │       │       ├── openapp
        │       │       │   ├── about.md
        │       │       │   ├── bot.md
        │       │       │   ├── create.md
        │       │       │   ├── oauth.md
        │       │       │   └── ws.md
        │       │       ├── plugins
        │       │       │   ├── assets
        │       │       │   │   └── wxpusher.png
        │       │       │   ├── com.msgbyte.autojoinGroup.md
        │       │       │   ├── com.msgbyte.iam.md
        │       │       │   ├── com.msgbyte.livekit.md
        │       │       │   └── com.msgbyte.wxpusher.md
        │       │       └── richtext.md
        │       │   ├── architecture.md
        │       │   ├── benchmark
        │       │       ├── cli.md
        │       │       └── report.md
        │       │   ├── cli
        │       │       ├── _category_.json
        │       │       └── tailchat-cli.md
        │       │   ├── contribution
        │       │       ├── _category_.json
        │       │       ├── community.md
        │       │       ├── dev
        │       │       │   ├── _category_.json
        │       │       │   └── role.md
        │       │       └── guide.md
        │       │   ├── deployment
        │       │       ├── _category_.json
        │       │       ├── admin.md
        │       │       ├── assets
        │       │       │   └── docker-init.png
        │       │       ├── cdn.md
        │       │       ├── dev.md
        │       │       ├── docker-compose-old.md
        │       │       ├── docker-compose.mdx
        │       │       ├── environment.md
        │       │       ├── https-gateway.md
        │       │       ├── install-docker.md
        │       │       ├── mobile.md
        │       │       ├── other-way
        │       │       │   ├── assets
        │       │       │   │   ├── bt-logo.jpg
        │       │       │   │   ├── bt1.png
        │       │       │   │   ├── bt2.png
        │       │       │   │   ├── bt3.png
        │       │       │   │   ├── bt4.png
        │       │       │   │   └── bt5.png
        │       │       │   ├── bt.md
        │       │       │   ├── kubernetes
        │       │       │   │   ├── _category_.json
        │       │       │   │   ├── sealos.md
        │       │       │   │   └── simple.md
        │       │       │   └── manual.md
        │       │       ├── quickstart.md
        │       │       ├── smtp.md
        │       │       └── troubleshooting.md
        │       │   ├── devops
        │       │       ├── _category_.json
        │       │       └── mongodb.md
        │       │   ├── intro.md
        │       │   ├── meeting
        │       │       ├── agora.md
        │       │       ├── deployment.md
        │       │       ├── images
        │       │       │   ├── 1.png
        │       │       │   ├── 2.png
        │       │       │   ├── 3.png
        │       │       │   ├── 4.png
        │       │       │   ├── 5.png
        │       │       │   ├── 6.png
        │       │       │   └── 7.png
        │       │       ├── intro.md
        │       │       └── livekit.md
        │       │   ├── nightly-env.md
        │       │   ├── plugins
        │       │       ├── api
        │       │       │   ├── _category_.json
        │       │       │   ├── common.md
        │       │       │   ├── component.md
        │       │       │   ├── cssvar.md
        │       │       │   └── role.md
        │       │       ├── guide
        │       │       │   ├── create-theme.md
        │       │       │   ├── deploy.md
        │       │       │   ├── init-env.md
        │       │       │   └── typescript-support.md
        │       │       ├── icon.md
        │       │       └── start.mdx
        │       │   └── why.md
        │   └── docusaurus-theme-classic
        │       ├── footer.json
        │       └── navbar.json
    ├── package.json
    ├── scripts
        └── generate-plugin-list.ts
    ├── sidebars.js
    ├── src
        ├── components
        │   ├── FeatureSection.less
        │   ├── FeatureSection.tsx
        │   ├── HomepageFeatures.module.css
        │   ├── HomepageFeatures.tsx
        │   ├── HomepageHeader.less
        │   ├── HomepageHeader.tsx
        │   ├── JoinCommunity.less
        │   └── JoinCommunity.tsx
        ├── css
        │   └── custom.css
        ├── pages
        │   ├── downloads.less
        │   ├── downloads.tsx
        │   ├── index.module.css
        │   ├── index.tsx
        │   └── markdown-page.md
        └── utils
        │   ├── consts.ts
        │   └── useMediumZoom.ts
    ├── static
        ├── .nojekyll
        ├── CNAME
        ├── downloads
        │   └── client.json
        └── img
        │   ├── advanced-usage
        │       ├── livekit
        │       │   ├── 1.png
        │       │   ├── 2.png
        │       │   ├── 3.png
        │       │   ├── 4.png
        │       │   ├── 5.png
        │       │   ├── 6.png
        │       │   ├── 7.png
        │       │   └── 8.png
        │       ├── openapp
        │       │   ├── 1.png
        │       │   ├── 2.png
        │       │   ├── 3.png
        │       │   └── 4.png
        │       └── plugins
        │       │   └── livekit
        │       │       ├── 1.png
        │       │       ├── 2.png
        │       │       ├── 3.png
        │       │       └── 4.png
        │   ├── architecture
        │       ├── backend.excalidraw.svg
        │       ├── https-gateway.excalidraw.svg
        │       ├── meeting.excalidraw.svg
        │       ├── overview.excalidraw.svg
        │       ├── plugin.excalidraw.svg
        │       └── transport.excalidraw.png
        │   ├── avatar
        │       └── reacher.png
        │   ├── benchmark
        │       └── 1.png
        │   ├── blog
        │       ├── 1kstar
        │       │   ├── 1.png
        │       │   └── 2.png
        │       ├── intro
        │       │   ├── 1.png
        │       │   ├── 10.png
        │       │   ├── 11.png
        │       │   ├── 12.png
        │       │   ├── 13.png
        │       │   ├── 14.png
        │       │   ├── 15.png
        │       │   ├── 16.png
        │       │   ├── 17.png
        │       │   ├── 18.png
        │       │   ├── 19.png
        │       │   ├── 2.png
        │       │   ├── 20.png
        │       │   ├── 21.png
        │       │   ├── 22.png
        │       │   ├── 3.png
        │       │   ├── 4.png
        │       │   ├── 5.png
        │       │   ├── 6.png
        │       │   ├── 7.png
        │       │   ├── 8.png
        │       │   └── 9.png
        │       ├── release-note
        │       │   ├── v1.8.10
        │       │   │   ├── 1.png
        │       │   │   └── 2.png
        │       │   ├── v1.8.11
        │       │   │   └── 1.png
        │       │   ├── v1.8.12
        │       │   │   ├── 1.gif
        │       │   │   └── 2.png
        │       │   ├── v1.8.3
        │       │   │   ├── 1.png
        │       │   │   ├── 2.png
        │       │   │   ├── 3.png
        │       │   │   └── 4.png
        │       │   ├── v1.8.4
        │       │   │   ├── 1.png
        │       │   │   ├── 2.png
        │       │   │   ├── 3.png
        │       │   │   ├── 4.png
        │       │   │   ├── 5.png
        │       │   │   ├── 6.png
        │       │   │   └── 7.png
        │       │   ├── v1.8.5
        │       │   │   ├── 1.png
        │       │   │   ├── 2.png
        │       │   │   ├── 3.png
        │       │   │   └── 4.png
        │       │   ├── v1.8.7
        │       │   │   ├── 1.png
        │       │   │   ├── 2.png
        │       │   │   ├── 3.png
        │       │   │   ├── 4.png
        │       │   │   ├── 5.png
        │       │   │   ├── 6.png
        │       │   │   ├── 7.png
        │       │   │   └── 8.png
        │       │   ├── v1.8.8
        │       │   │   ├── 1.png
        │       │   │   ├── 2.gif
        │       │   │   └── 3.png
        │       │   ├── v1.8.9
        │       │   │   ├── 1.gif
        │       │   │   ├── 2.png
        │       │   │   └── 3.png
        │       │   ├── v1.9.0
        │       │   │   └── 1.png
        │       │   ├── v1.9.1
        │       │   │   └── 1.png
        │       │   ├── v1.9.2
        │       │   │   ├── 1.png
        │       │   │   ├── 2.png
        │       │   │   ├── 3.png
        │       │   │   └── 4.png
        │       │   ├── v1.9.4
        │       │   │   ├── 1.png
        │       │   │   └── 2.png
        │       │   └── v1.9.5
        │       │   │   ├── 1.png
        │       │   │   ├── 2.png
        │       │   │   ├── 3.png
        │       │   │   ├── 4.png
        │       │   │   └── 5.png
        │       └── robot-with-laf
        │       │   ├── 1.png
        │       │   ├── 10.png
        │       │   ├── 11.png
        │       │   ├── 12.png
        │       │   ├── 2.png
        │       │   ├── 3.png
        │       │   ├── 4.png
        │       │   ├── 5.png
        │       │   ├── 6.png
        │       │   ├── 7.png
        │       │   ├── 8.png
        │       │   └── 9.png
        │   ├── docusaurus.png
        │   ├── favicon.ico
        │   ├── gallery
        │       ├── bot.png
        │       ├── custom-theme.png
        │       ├── download
        │       │   ├── desktop.png
        │       │   └── mobile.png
        │       ├── group-roles.png
        │       ├── messenger.png
        │       ├── multi-platform-support.png
        │       └── plugin-center.png
        │   ├── github-app
        │       ├── github-integration.excalidraw.png
        │       └── github-new-app.png
        │   ├── hero-dark.png
        │   ├── hero-light.png
        │   ├── intro
        │       ├── admin-network.png
        │       ├── ai.png
        │       ├── connect-apps.excalidraw.svg
        │       ├── github-bot.png
        │       ├── hello.png
        │       ├── plugins.png
        │       ├── roles.png
        │       └── theme.png
        │   ├── kubernetes
        │       ├── sealos
        │       │   ├── 1.png
        │       │   ├── 10.png
        │       │   ├── 11.png
        │       │   ├── 12.png
        │       │   ├── 13.png
        │       │   ├── 14.png
        │       │   ├── 15.png
        │       │   ├── 16.png
        │       │   ├── 17.png
        │       │   ├── 2.png
        │       │   ├── 3.png
        │       │   ├── 4.png
        │       │   ├── 5.png
        │       │   ├── 6.png
        │       │   ├── 7.png
        │       │   ├── 8.png
        │       │   └── 9.png
        │       └── traefik-svc.png
        │   ├── logo.svg
        │   ├── logo@192.png
        │   ├── misc
        │       ├── getui.png
        │       └── memory-usage.png
        │   ├── tutorial
        │       ├── docsVersionDropdown.png
        │       ├── localeDropdown.png
        │       └── plugin
        │       │   ├── 1.png
        │       │   ├── 10.png
        │       │   ├── 2.png
        │       │   ├── 3.png
        │       │   ├── 4.png
        │       │   ├── 5.png
        │       │   ├── 6.png
        │       │   ├── 7.png
        │       │   ├── 8.png
        │       │   └── 9.png
        │   ├── underline.svg
        │   ├── undraw_Website_setup_re_d4y9.svg
        │   ├── undraw_design_components_9vy6.svg
        │   ├── undraw_open_source_1qxw.svg
        │   ├── wechat.jpg
        │   └── wechat2.jpg
    └── tsconfig.json


/.dockerignore:
--------------------------------------------------------------------------------
 1 | .env
 2 | node_modules
 3 | logs
 4 | dist
 5 | website
 6 | page
 7 | client/desktop
 8 | client/desktop-old
 9 | client/mobile
10 | apps
11 | 


--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
 1 | root = true
 2 | 
 3 | [*]
 4 | charset = utf-8
 5 | end_of_line = lf
 6 | indent_style = space
 7 | indent_size = 2
 8 | insert_final_newline = true
 9 | trim_trailing_whitespace = true
10 | 
11 | [.gitconfig]
12 | indent_style = tab
13 | 
14 | [Makefile]
15 | indent_style = tab
16 | 
17 | [*.md]
18 | trim_trailing_whitespace = false
19 | 


--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | *.js
2 | client/desktop/
3 | apps/cli/templates/
4 | 


--------------------------------------------------------------------------------
/.husky/commit-msg:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | . "$(dirname "$0")/_/husky.sh"
3 | 
4 | npx --no-install commitlint --edit "$1"
5 | 


--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | . "$(dirname "$0")/_/husky.sh"
3 | 
4 | npx lint-staged
5 | 


--------------------------------------------------------------------------------
/.lintstagedrc.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "src/*.{json,less}": [
 3 |     "prettier --write --config ./.prettierrc.json"
 4 |   ],
 5 |   "./**/*.js": [
 6 |     "prettier --write --config ./.prettierrc.json"
 7 |   ],
 8 |   "./**/*.{ts,tsx}": [
 9 |     "eslint --fix",
10 |     "prettier --write --config ./.prettierrc.json"
11 |   ]
12 | }
13 | 


--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | strict-peer-dependencies = false # some dependency is not fit tailchat, tailchat's dependency is complex, every peer dependencies problem should check with manual.
4 | 


--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | apps/cli/templates/
2 | 


--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "printWidth": 80,
 3 |   "tabWidth": 2,
 4 |   "useTabs": false,
 5 |   "semi": true,
 6 |   "singleQuote": true,
 7 |   "trailingComma": "es5",
 8 |   "bracketSpacing": true,
 9 |   "arrowParens": "always",
10 |   "jsxBracketSameLine": false
11 | }
12 | 


--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | // Place your settings in this file to overwrite default and user settings.
2 | {
3 |   "editor.rulers": [80]
4 | }
5 | 


--------------------------------------------------------------------------------
/apps/README.md:
--------------------------------------------------------------------------------
1 | 用于存放非Tailchat核心功能的应用
2 | 


--------------------------------------------------------------------------------
/apps/cli/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | 


--------------------------------------------------------------------------------
/apps/cli/bin/cli:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | 
3 | require('../lib')
4 | 


--------------------------------------------------------------------------------
/apps/cli/src/app/index.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import { App } from './App';
 3 | import { render } from 'ink';
 4 | 
 5 | export function run() {
 6 |   const ins = render(<App />);
 7 | 
 8 |   return ins;
 9 | }
10 | 


--------------------------------------------------------------------------------
/apps/cli/src/commands/app.ts:
--------------------------------------------------------------------------------
 1 | import { CommandModule } from 'yargs';
 2 | import { run } from '../app';
 3 | import { isDev } from '../utils';
 4 | 
 5 | export const appCommand: CommandModule = {
 6 |   command: 'app',
 7 |   describe: isDev() ? false : 'Tailchat cli(WIP)',
 8 |   builder: undefined,
 9 |   async handler() {
10 |     await run();
11 |   },
12 | };
13 | 


--------------------------------------------------------------------------------
/apps/cli/src/update.ts:
--------------------------------------------------------------------------------
1 | import updateNotifier from 'update-notifier';
2 | const packageJson = require('../package.json');
3 | 
4 | updateNotifier({
5 |   pkg: packageJson,
6 |   shouldNotifyInNpmScript: true,
7 | }).notify();
8 | 


--------------------------------------------------------------------------------
/apps/cli/templates/client-plugin/{{id}}/manifest.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "label": "{{name}}",
 3 |   "name": "{{id}}",
 4 |   "url": "/plugins/{{id}}/index.js",
 5 |   "version": "0.0.0",
 6 |   "author": "{{author}}",
 7 |   "description": "{{desc}}",
 8 |   "requireRestart": true
 9 | }
10 | 


--------------------------------------------------------------------------------
/apps/cli/templates/client-plugin/{{id}}/src/index.tsx:
--------------------------------------------------------------------------------
1 | const PLUGIN_ID = '{{id}}';
2 | const PLUGIN_NAME = '{{name}}';
3 | 
4 | console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`);
5 | 


--------------------------------------------------------------------------------
/apps/cli/templates/client-plugin/{{id}}/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   name: localTrans({
5 |     'zh-CN': '{{name}}',
6 |     'en-US': '{{name}}',
7 |   }),
8 | };
9 | 


--------------------------------------------------------------------------------
/apps/cli/templates/client-plugin/{{id}}/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/apps/cli/templates/client-plugin/{{id}}/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/manifest.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "label": "{{name}}",
 3 |   "name": "{{id}}",
 4 |   "url": "{BACKEND}/plugins/{{id}}/index.js",
 5 |   "version": "0.0.0",
 6 |   "author": "{{author}}",
 7 |   "description": "{{desc}}",
 8 |   "requireRestart": true
 9 | }
10 | 


--------------------------------------------------------------------------------
/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/src/index.tsx:
--------------------------------------------------------------------------------
1 | const PLUGIN_ID = '{{id}}';
2 | const PLUGIN_NAME = '{{name}}';
3 | 
4 | console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`);
5 | 


--------------------------------------------------------------------------------
/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/manifest.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "label": "{{name}}",
 3 |   "name": "{{id}}",
 4 |   "url": "{BACKEND}/plugins/{{id}}/index.js",
 5 |   "version": "0.0.0",
 6 |   "author": "{{author}}",
 7 |   "description": "{{desc}}",
 8 |   "requireRestart": true
 9 | }
10 | 


--------------------------------------------------------------------------------
/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/src/index.tsx:
--------------------------------------------------------------------------------
1 | const PLUGIN_ID = '{{id}}';
2 | const PLUGIN_NAME = '{{name}}';
3 | 
4 | console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`);
5 | 


--------------------------------------------------------------------------------
/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   name: localTrans({
5 |     'zh-CN': '{{name}}',
6 |     'en-US': '{{name}}',
7 |   }),
8 | };
9 | 


--------------------------------------------------------------------------------
/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/apps/github-app/.dockerignore:
--------------------------------------------------------------------------------
 1 | **/node_modules/
 2 | **/.git
 3 | **/README.md
 4 | **/LICENSE
 5 | **/.vscode
 6 | **/npm-debug.log
 7 | **/coverage
 8 | **/.env
 9 | **/.editorconfig
10 | **/dist
11 | **/*.pem
12 | Dockerfile
13 | 


--------------------------------------------------------------------------------
/apps/github-app/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | npm-debug.log
3 | *.pem
4 | !mock-cert.pem
5 | .env
6 | coverage
7 | lib
8 | 


--------------------------------------------------------------------------------
/apps/github-app/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:12-slim
2 | WORKDIR /usr/src/app
3 | COPY package.json package-lock.json ./
4 | RUN npm ci --production
5 | RUN npm cache clean --force
6 | ENV NODE_ENV="production"
7 | COPY . .
8 | CMD [ "npm", "start" ]
9 | 


--------------------------------------------------------------------------------
/apps/github-app/api/index.js:
--------------------------------------------------------------------------------
 1 | const app = require('express')();
 2 | const { v4 } = require('uuid');
 3 | const { createProbot } = require('probot');
 4 | const { appFn, buildRouter } = require('../src/app');
 5 | 
 6 | const probot = createProbot();
 7 | probot.load(appFn, {
 8 |   getRouter: (path) => app,
 9 | });
10 | 
11 | module.exports = app;
12 | 


--------------------------------------------------------------------------------
/apps/github-app/jest.config.js:
--------------------------------------------------------------------------------
 1 | module.exports = {
 2 |   roots: ['<rootDir>/src/', '<rootDir>/test/'],
 3 |   transform: {
 4 |     '^.+\\.tsx?
#39;: 'ts-jest',
 5 |   },
 6 |   testRegex: '(/__tests__/.*|\\.(test|spec))\\.[tj]sx?
#39;,
 7 |   moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
 8 |   testEnvironment: 'node',
 9 | };
10 | 


--------------------------------------------------------------------------------
/apps/github-app/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/apps/github-app/public/favicon.ico


--------------------------------------------------------------------------------
/apps/github-app/src/index.ts:
--------------------------------------------------------------------------------
1 | import { run } from 'probot';
2 | import { appFn } from './app';
3 | 
4 | run(appFn);
5 | 


--------------------------------------------------------------------------------
/apps/github-app/test/fixtures/issues.opened.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "action": "opened",
 3 |   "issue": {
 4 |     "number": 1,
 5 |     "user": {
 6 |       "login": "hiimbex"
 7 |     }
 8 |   },
 9 |   "repository": {
10 |     "name": "testing-things",
11 |     "owner": {
12 |       "login": "hiimbex"
13 |     }
14 |   },
15 |   "installation": {
16 |     "id": 2
17 |   }
18 | }
19 | 


--------------------------------------------------------------------------------
/apps/github-app/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 |   "rewrites": [
3 |     { "source": "/api/(.*)", "destination": "/api" },
4 |     { "source": "/api/github/webhooks", "destination": "/api/github/webhooks" }
5 |   ]
6 | }
7 | 


--------------------------------------------------------------------------------
/apps/oauth-demo/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "isolatedModules": true,
 5 |     "strict": true,
 6 |     "importsNotUsedAsValues": "error",
 7 |     "experimentalDecorators": true,
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/apps/widget/.gitignore:
--------------------------------------------------------------------------------
1 | lib/
2 | 


--------------------------------------------------------------------------------
/apps/widget/.yarnrc:
--------------------------------------------------------------------------------
1 | registry "https://registry.npmjs.org"
2 | version-tag-prefix "widget-v"
3 | version-git-message "widget-v%s"
4 | 


--------------------------------------------------------------------------------
/apps/widget/demo/.gitignore:
--------------------------------------------------------------------------------
1 | .parcel-cache/
2 | 


--------------------------------------------------------------------------------
/apps/widget/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "target": "ES5",
 4 |     "declaration": true,
 5 |     "lib": ["DOM", "ESNext"],
 6 |     "rootDir": "./src",
 7 |     "outDir": "lib"
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | 


--------------------------------------------------------------------------------
/client/.gitattributes:
--------------------------------------------------------------------------------
1 | *.ts    eol=lf
2 | *.tsx   eol=lf
3 | 


--------------------------------------------------------------------------------
/client/.husky/commit-msg:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | . "$(dirname "$0")/_/husky.sh"
3 | 
4 | npx --no-install commitlint --edit "$1"
5 | 


--------------------------------------------------------------------------------
/client/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | . "$(dirname "$0")/_/husky.sh"
3 | 
4 | pnpm lint-staged
5 | 


--------------------------------------------------------------------------------
/client/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | public-hoist-pattern[] = react
4 | public-hoist-pattern[] = @types/react
5 | # For docker: https://pnpm.io/npmrc#unsafe-perm
6 | unsafe-perm = true
7 | 


--------------------------------------------------------------------------------
/client/desktop-old/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | 


--------------------------------------------------------------------------------
/client/desktop-old/build/icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/desktop-old/build/icon.icns


--------------------------------------------------------------------------------
/client/desktop-old/build/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/desktop-old/build/icon.ico


--------------------------------------------------------------------------------
/client/desktop-old/src/main/config.ts:
--------------------------------------------------------------------------------
 1 | import { app } from 'electron';
 2 | 
 3 | const isDev = !app.isPackaged;
 4 | const webUrl = isDev
 5 |   ? 'http://localhost:11011'
 6 |   : 'https://nightly.paw.msgbyte.com';
 7 | 
 8 | export const config = {
 9 |   isDev,
10 |   webUrl,
11 | };
12 | 


--------------------------------------------------------------------------------
/client/desktop/.editorconfig:
--------------------------------------------------------------------------------
 1 | root = true
 2 | 
 3 | [*]
 4 | indent_style = space
 5 | indent_size = 2
 6 | end_of_line = lf
 7 | charset = utf-8
 8 | trim_trailing_whitespace = true
 9 | insert_final_newline = true
10 | 
11 | [*.md]
12 | trim_trailing_whitespace = false
13 | 


--------------------------------------------------------------------------------
/client/desktop/.erb/configs/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 |   "rules": {
3 |     "no-console": "off",
4 |     "global-require": "off",
5 |     "import/no-dynamic-require": "off"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/desktop/.erb/img/erb-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/desktop/.erb/img/erb-logo.png


--------------------------------------------------------------------------------
/client/desktop/.erb/mocks/fileMock.js:
--------------------------------------------------------------------------------
1 | export default 'test-file-stub';
2 | 


--------------------------------------------------------------------------------
/client/desktop/.erb/scripts/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 |   "rules": {
3 |     "no-console": "off",
4 |     "global-require": "off",
5 |     "import/no-dynamic-require": "off",
6 |     "import/no-extraneous-dependencies": "off"
7 |   }
8 | }
9 | 


--------------------------------------------------------------------------------
/client/desktop/.erb/scripts/delete-source-maps.js:
--------------------------------------------------------------------------------
1 | import path from 'path';
2 | import rimraf from 'rimraf';
3 | import webpackPaths from '../configs/webpack.paths';
4 | 
5 | export default function deleteSourceMaps() {
6 |   rimraf.sync(path.join(webpackPaths.distMainPath, '*.js.map'));
7 |   rimraf.sync(path.join(webpackPaths.distRendererPath, '*.js.map'));
8 | }
9 | 


--------------------------------------------------------------------------------
/client/desktop/.gitattributes:
--------------------------------------------------------------------------------
 1 | *       text    eol=lf
 2 | *.exe   binary
 3 | *.png   binary
 4 | *.jpg   binary
 5 | *.jpeg  binary
 6 | *.ico   binary
 7 | *.icns  binary
 8 | *.eot   binary
 9 | *.otf   binary
10 | *.ttf   binary
11 | *.woff  binary
12 | *.woff2 binary
13 | 


--------------------------------------------------------------------------------
/client/desktop/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | electron_mirror = https://npmmirror.com/mirrors/electron/
4 | 


--------------------------------------------------------------------------------
/client/desktop/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 |   "recommendations": ["dbaeumer.vscode-eslint", "EditorConfig.EditorConfig"]
3 | }
4 | 


--------------------------------------------------------------------------------
/client/desktop/README.md:
--------------------------------------------------------------------------------
 1 | ## Usage
 2 | 
 3 | ### Install dependency
 4 | 
 5 | ```bash
 6 | yarn
 7 | ```
 8 | 
 9 | ### dev
10 | 
11 | ```bash
12 | yarn dev
13 | ```
14 | 
15 | ### package
16 | 
17 | ```bash
18 | yarn package
19 | ```
20 | 


--------------------------------------------------------------------------------
/client/desktop/assets/add.svg:
--------------------------------------------------------------------------------
1 | <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="currentColor" d="M8 2.5a.5.5 0 0 0-1 0V7H2.5a.5.5 0 0 0 0 1H7v4.5a.5.5 0 0 0 1 0V8h4.5a.5.5 0 0 0 0-1H8V2.5Z"/></svg>
2 | 


--------------------------------------------------------------------------------
/client/desktop/assets/icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/desktop/assets/icon.icns


--------------------------------------------------------------------------------
/client/desktop/assets/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/desktop/assets/icon.ico


--------------------------------------------------------------------------------
/client/desktop/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/desktop/assets/icon.png


--------------------------------------------------------------------------------
/client/desktop/release/app/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | electron_mirror = https://npmmirror.com/mirrors/electron/
4 | 


--------------------------------------------------------------------------------
/client/desktop/src/__tests__/App.test.tsx:
--------------------------------------------------------------------------------
 1 | import '@testing-library/jest-dom';
 2 | import { render } from '@testing-library/react';
 3 | import App from '../renderer/App';
 4 | 
 5 | describe('App', () => {
 6 |   it('should render', () => {
 7 |     expect(render(<App />)).toBeTruthy();
 8 |   });
 9 | });
10 | 


--------------------------------------------------------------------------------
/client/desktop/src/renderer/index.ejs:
--------------------------------------------------------------------------------
 1 | <!DOCTYPE html>
 2 | <html>
 3 |   <head>
 4 |     <meta charset="utf-8" />
 5 |     <meta
 6 |       http-equiv="Content-Security-Policy"
 7 |       content="script-src 'self' 'unsafe-inline'"
 8 |     />
 9 |     <title>Tailchat</title>
10 |   </head>
11 |   <body>
12 |     <div id="root"></div>
13 |   </body>
14 | </html>
15 | 


--------------------------------------------------------------------------------
/client/desktop/src/renderer/utils/index.ts:
--------------------------------------------------------------------------------
1 | export function urlResolve(base: string, url: string): string {
2 |   return new URL(url, base).href;
3 | }
4 | 


--------------------------------------------------------------------------------
/client/desktop/tailwind.config.js:
--------------------------------------------------------------------------------
1 | module.exports = require('../web/tailwind.config');
2 | 


--------------------------------------------------------------------------------
/client/desktop/test/http-server.ts:
--------------------------------------------------------------------------------
 1 | import { startLocalServer } from '../src/main/lib/http';
 2 | import path from 'path';
 3 | 
 4 | const port = 12120;
 5 | 
 6 | startLocalServer(
 7 |   path.resolve(__dirname, '../release/app/dist/renderer'),
 8 |   port
 9 | ).then(() => {
10 |   console.log('HTTP Server start in', `http://localhost:${port}`);
11 | });
12 | 


--------------------------------------------------------------------------------
/client/mobile/.bundle/config:
--------------------------------------------------------------------------------
1 | BUNDLE_PATH: "vendor/bundle"
2 | BUNDLE_FORCE_RUBY_PLATFORM: 1
3 | 


--------------------------------------------------------------------------------
/client/mobile/.env.example:
--------------------------------------------------------------------------------
 1 | TAILCHAT_UPLOAD_STORE_FILE=
 2 | TAILCHAT_UPLOAD_STORE_PASSWORD=
 3 | TAILCHAT_UPLOAD_KEY_ALIAS=
 4 | TAILCHAT_UPLOAD_KEY_PASSWORD=
 5 | 
 6 | GETUI_APPID=
 7 | GETUI_APPKEY=
 8 | GETUI_APPSECRET=
 9 | GETUI_HUAWEI_APP_ID=
10 | 


--------------------------------------------------------------------------------
/client/mobile/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 |   root: true,
3 |   extends: '@react-native-community',
4 | };
5 | 


--------------------------------------------------------------------------------
/client/mobile/.node-version:
--------------------------------------------------------------------------------
1 | 18
2 | 


--------------------------------------------------------------------------------
/client/mobile/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | 


--------------------------------------------------------------------------------
/client/mobile/.prettierrc.js:
--------------------------------------------------------------------------------
1 | module.exports = require('../../.prettierrc.json');
2 | 


--------------------------------------------------------------------------------
/client/mobile/.ruby-version:
--------------------------------------------------------------------------------
1 | 2.7.6
2 | 


--------------------------------------------------------------------------------
/client/mobile/.watchmanconfig:
--------------------------------------------------------------------------------
1 | {}


--------------------------------------------------------------------------------
/client/mobile/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 | 
3 | # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
4 | ruby File.read(File.join(__dir__, '.ruby-version')).strip
5 | 
6 | gem 'cocoapods', '~> 1.11', '>= 1.11.3'
7 | 


--------------------------------------------------------------------------------
/client/mobile/__tests__/App-test.tsx:
--------------------------------------------------------------------------------
 1 | /**
 2 |  * @format
 3 |  */
 4 | 
 5 | import 'react-native';
 6 | import React from 'react';
 7 | import App from '../src/App';
 8 | 
 9 | // Note: test renderer must be required after react-native.
10 | import renderer from 'react-test-renderer';
11 | 
12 | it('renders correctly', () => {
13 |   renderer.create(<App />);
14 | });
15 | 


--------------------------------------------------------------------------------
/client/mobile/android/app/debug.keystore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/debug.keystore


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/TailchatPushService.java:
--------------------------------------------------------------------------------
1 | package com.msgbyte.tailchat;
2 | 
3 | import com.igexin.sdk.PushService;
4 | 
5 | public class TailchatPushService extends PushService {
6 | }
7 | 


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 | <resources>
2 |     <string name="app_name">Tailchat</string>
3 | </resources>
4 | 


--------------------------------------------------------------------------------
/client/mobile/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
 1 | <resources>
 2 | 
 3 |     <!-- Base application theme. -->
 4 |     <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
 5 |         <!-- Customize your theme here. -->
 6 |         <item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
 7 |     </style>
 8 | 
 9 | </resources>
10 | 


--------------------------------------------------------------------------------
/client/mobile/android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/mobile/android/gradle/wrapper/gradle-wrapper.jar


--------------------------------------------------------------------------------
/client/mobile/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | 


--------------------------------------------------------------------------------
/client/mobile/android/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = 'Tailchat'
2 | apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
3 | include ':app'
4 | 
5 | includeBuild('../node_modules/react-native-gradle-plugin')
6 | 


--------------------------------------------------------------------------------
/client/mobile/app.json:
--------------------------------------------------------------------------------
1 | {
2 |   "name": "Tailchat",
3 |   "displayName": "Tailchat"
4 | }


--------------------------------------------------------------------------------
/client/mobile/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 |   presets: ['module:metro-react-native-babel-preset'],
3 |   plugins: ['react-native-reanimated/plugin'],
4 | };
5 | 


--------------------------------------------------------------------------------
/client/mobile/index.js:
--------------------------------------------------------------------------------
 1 | /**
 2 |  * @format
 3 |  */
 4 | 
 5 | import { AppRegistry } from 'react-native';
 6 | import App from './src/App';
 7 | import { name as appName } from './app.json';
 8 | 
 9 | AppRegistry.registerComponent(appName, () => App);
10 | 


--------------------------------------------------------------------------------
/client/mobile/ios/Tailchat.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 | <?xml version="1.0" encoding="UTF-8"?>
2 | <Workspace
3 |    version = "1.0">
4 |    <FileRef
5 |       location = "self:">
6 |    </FileRef>
7 | </Workspace>
8 | 


--------------------------------------------------------------------------------
/client/mobile/ios/Tailchat.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 | <?xml version="1.0" encoding="UTF-8"?>
2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 | <plist version="1.0">
4 | <dict>
5 | 	<key>IDEDidComputeMac32BitWarning</key>
6 | 	<true/>
7 | </dict>
8 | </plist>
9 | 


--------------------------------------------------------------------------------
/client/mobile/ios/Tailchat.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
 1 | <?xml version="1.0" encoding="UTF-8"?>
 2 | <Workspace
 3 |    version = "1.0">
 4 |    <FileRef
 5 |       location = "group:Tailchat.xcodeproj">
 6 |    </FileRef>
 7 |    <FileRef
 8 |       location = "group:Pods/Pods.xcodeproj">
 9 |    </FileRef>
10 | </Workspace>
11 | 


--------------------------------------------------------------------------------
/client/mobile/ios/Tailchat/Images.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 |   "info" : {
3 |     "version" : 1,
4 |     "author" : "xcode"
5 |   }
6 | }
7 | 


--------------------------------------------------------------------------------
/client/mobile/ios/Tailchat/main.m:
--------------------------------------------------------------------------------
 1 | #import <UIKit/UIKit.h>
 2 | 
 3 | #import "AppDelegate.h"
 4 | 
 5 | int main(int argc, char *argv[])
 6 | {
 7 |   @autoreleasepool {
 8 |     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
 9 |   }
10 | }
11 | 


--------------------------------------------------------------------------------
/client/mobile/src/theme.ts:
--------------------------------------------------------------------------------
1 | export const theme = {
2 |   contentBg: {
3 |     light: 'rgba(243, 244, 246, 1)',
4 |     dark: 'rgba(55, 65, 81, 1)',
5 |   },
6 | };
7 | 


--------------------------------------------------------------------------------
/client/mobile/src/types.ts:
--------------------------------------------------------------------------------
1 | export * from '../../../packages/types';
2 | 


--------------------------------------------------------------------------------
/client/mobile/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "extends": "@tsconfig/react-native/tsconfig.json",
3 |   "compilerOptions": {
4 |     "importsNotUsedAsValues": "error"
5 |   }
6 | }
7 | 


--------------------------------------------------------------------------------
/client/packages/design/.gitignore:
--------------------------------------------------------------------------------
1 | es
2 | lib
3 | 


--------------------------------------------------------------------------------
/client/packages/design/.storybook/main.js:
--------------------------------------------------------------------------------
 1 | module.exports = {
 2 |   stories: [
 3 |     '../components/**/*.stories.mdx',
 4 |     '../components/**/*.stories.@(js|jsx|ts|tsx)',
 5 |   ],
 6 |   addons: [
 7 |     '@storybook/addon-links',
 8 |     '@storybook/addon-essentials',
 9 |     '@storybook/addon-interactions',
10 |   ],
11 |   framework: '@storybook/react',
12 | };
13 | 


--------------------------------------------------------------------------------
/client/packages/design/.storybook/preview.js:
--------------------------------------------------------------------------------
 1 | import 'antd/dist/antd.css';
 2 | 
 3 | export const parameters = {
 4 |   actions: { argTypesRegex: '^on[A-Z].*' },
 5 |   controls: {
 6 |     matchers: {
 7 |       color: /(background|color)$/i,
 8 |       date: /Date$/,
 9 |     },
10 |   },
11 | };
12 | 


--------------------------------------------------------------------------------
/client/packages/design/README.md:
--------------------------------------------------------------------------------
1 | Tailchat 的前端组件
2 | 
3 | 能进这个包的原则是该组件是一个业务无关的组件(无环境依赖)
4 | 


--------------------------------------------------------------------------------
/client/packages/design/components/Highlight/index.module.less:
--------------------------------------------------------------------------------
1 | .highLight {
2 |   background-color: rgba(0,0,0,0.2);
3 |   border-radius: 0.25rem;
4 |   padding-top: 0.25rem;
5 |   padding-bottom: 0.25rem;
6 |   padding-left: 0.5rem;
7 |   padding-right: 0.5rem;
8 | }
9 | 


--------------------------------------------------------------------------------
/client/packages/design/components/Highlight/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { PropsWithChildren } from 'react';
2 | import styles from './index.module.less';
3 | 
4 | export const Highlight: React.FC<PropsWithChildren> = React.memo((props) => {
5 |   return <span className={styles.highLight}>{props.children}</span>;
6 | });
7 | Highlight.displayName = 'Highlight';
8 | 


--------------------------------------------------------------------------------
/client/packages/design/components/Introduction.stories.mdx:
--------------------------------------------------------------------------------
1 | <Meta title="Tailchat/Introduction" />
2 | 
3 | # Tailchat Design
4 | 
5 | Tailchat Design 是 msgbyte 专为 Tailchat 打造的一套设计样式,基于 `antd` 之上做了一层封装
6 | 


--------------------------------------------------------------------------------
/client/packages/design/components/RichEditor/editor.css:
--------------------------------------------------------------------------------
 1 | .remirror-editor-wrapper {
 2 |   height: 100%;
 3 | }
 4 | 
 5 | .tailchat-rich-editor {
 6 |   height: 100%;
 7 |   outline: 0;
 8 | }
 9 | 
10 | .tailchat-rich-editor p {
11 |   margin: 0;
12 | }
13 | 


--------------------------------------------------------------------------------
/client/packages/design/components/RichEditor/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | /**
3 |  * 富文本编辑器
4 |  */
5 | 
6 | export const RichEditor = React.lazy(() =>
7 |   import('./editor').then((module) => ({ default: module.RichEditor }))
8 | );
9 | 


--------------------------------------------------------------------------------
/client/packages/design/components/VirtualChatList/README.md:
--------------------------------------------------------------------------------
1 | WIP: Warning
2 | 
3 | 可变高度的虚拟列表
4 | 
5 | 专为聊天场景打造的
6 | 


--------------------------------------------------------------------------------
/client/packages/design/components/VirtualChatList/types.ts:
--------------------------------------------------------------------------------
 1 | export interface Vector {
 2 |   x: number;
 3 |   y: number;
 4 | }
 5 | 
 6 | export interface IsForward {
 7 |   x: boolean;
 8 |   y: boolean;
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/packages/design/components/WebMetaForm/utils.ts:
--------------------------------------------------------------------------------
 1 | /**
 2 |  * 获取校验状态
 3 |  */
 4 | export function getValidateStatus(error: string | undefined): 'error' | '' {
 5 |   if (error === undefined || error === '') {
 6 |     return '';
 7 |   } else {
 8 |     return 'error';
 9 |   }
10 | }
11 | 


--------------------------------------------------------------------------------
/client/packages/design/components/utils.ts:
--------------------------------------------------------------------------------
1 | /**
2 |  * 是否一个可用的字符串
3 |  * 定义为有长度的字符串
4 |  */
5 | export function isValidStr(str: unknown): str is string {
6 |   return typeof str == 'string' && str !== '';
7 | }
8 | 


--------------------------------------------------------------------------------
/client/packages/design/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "extends": "../../tsconfig.json",
3 |   "compilerOptions": {
4 |     "declaration": true,
5 |     "declarationDir": ".",
6 |   },
7 |   "include": ["components/**/*"]
8 | }
9 | 


--------------------------------------------------------------------------------
/client/packages/design/types/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.module.less';
2 | 


--------------------------------------------------------------------------------
/client/packages/plugin-declaration-generator/.gitignore:
--------------------------------------------------------------------------------
1 | lib
2 | 


--------------------------------------------------------------------------------
/client/packages/plugin-declaration-generator/README.md:
--------------------------------------------------------------------------------
1 | WIP
2 | 


--------------------------------------------------------------------------------
/client/packages/plugin-declaration-generator/test/demo/foo.ts:
--------------------------------------------------------------------------------
 1 | import * as mkdirp from 'mkdirp';
 2 | 
 3 | /**
 4 |  * This is foo
 5 |  */
 6 | export function foo(input: string) {
 7 |   console.log('Anything', input);
 8 |   mkdirp('./foo/foo/foo/foo/foo/foo/foo');
 9 | 
10 |   return input + 1;
11 | }
12 | 
13 | export const fooVar = 'fooVar' as string;
14 | 


--------------------------------------------------------------------------------
/client/packages/plugin-declaration-generator/test/demo/index.ts:
--------------------------------------------------------------------------------
 1 | export { foo, fooVar } from '@/foo';
 2 | export { bar, complexBar } from '@/bar';
 3 | 
 4 | /**
 5 |  * Root export
 6 |  */
 7 | export function main() {
 8 |   console.log('main');
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/packages/plugin-declaration-generator/test/demo/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "paths": {
4 |       "@/*": ["./*"],
5 |     }
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/packages/plugin-declaration-generator/test/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/foo' {
2 |   export const a: any;
3 |   export const b: string;
4 | }
5 | 


--------------------------------------------------------------------------------
/client/packages/tailchat-client-sdk/.gitignore:
--------------------------------------------------------------------------------
1 | lib
2 | 


--------------------------------------------------------------------------------
/client/packages/tailchat-client-sdk/README.md:
--------------------------------------------------------------------------------
1 | ## Document
2 | 
3 | visit website to learn more: [https://tailchat.msgbyte.com/docs/advanced-usage/openapp/about](https://tailchat.msgbyte.com/docs/advanced-usage/openapp/about)
4 | 


--------------------------------------------------------------------------------
/client/packages/tailchat-client-sdk/jest.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
2 | module.exports = {
3 |   preset: 'ts-jest',
4 |   testEnvironment: 'node',
5 | };
6 | 


--------------------------------------------------------------------------------
/client/packages/tailchat-client-sdk/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './openapi';
2 | export * from './plugins/simplenotify';
3 | export * from './utils';
4 | 


--------------------------------------------------------------------------------
/client/packages/tailchat-client-sdk/src/openapi/client/http.ts:
--------------------------------------------------------------------------------
1 | import { TailchatBaseClient } from './base';
2 | 
3 | export class TailchatHTTPClient extends TailchatBaseClient {}
4 | 


--------------------------------------------------------------------------------
/client/packages/tailchat-client-sdk/src/openapi/client/index.ts:
--------------------------------------------------------------------------------
1 | export {
2 |   /**
3 |    * @deprecated please rename to TailchatHTTPClient
4 |    */
5 |   TailchatHTTPClient as TailchatClient,
6 |   TailchatHTTPClient,
7 | } from './http';
8 | export { TailchatWsClient } from './ws';
9 | 


--------------------------------------------------------------------------------
/client/packages/tailchat-client-sdk/src/openapi/index.ts:
--------------------------------------------------------------------------------
1 | export * from './client';
2 | 


--------------------------------------------------------------------------------
/client/packages/tailchat-client-sdk/src/utils.ts:
--------------------------------------------------------------------------------
 1 | /**
 2 |  * remove first [at=xxx]xxx[/at] in message first
 3 |  */
 4 | export function stripMentionTag(message: string): string {
 5 |   return message
 6 |     .trim()
 7 |     .replace(/^\[at=.*?\[\/at\]/, '')
 8 |     .replace(/^@\S*\s?/, '')
 9 |     .trimStart();
10 | }
11 | 


--------------------------------------------------------------------------------
/client/shared/components/Portal/README.md:
--------------------------------------------------------------------------------
 1 | ## Portal
 2 | 
 3 | **暂时没有使用**
 4 | 
 5 | 这是一组用于使用命令式方法将一个React DOM映射到相关的位置的方法
 6 | 可以指定不同的portal位置
 7 | 
 8 | 用于处理对于每个节点都需要创建一个相关的Modal的情况
 9 | 
10 | > 参考 https://github.com/ant-design/ant-design-mobile-rn/blob/master/components/portal/ 的实现
11 | 


--------------------------------------------------------------------------------
/client/shared/components/Portal/index.ts:
--------------------------------------------------------------------------------
1 | export { buildPortal } from './buildPortal';
2 | export { DefaultEventEmitter } from './defaultEventEmitter';
3 | 


--------------------------------------------------------------------------------
/client/shared/hooks/model/useUsernames.ts:
--------------------------------------------------------------------------------
 1 | import { useUserInfoList } from './useUserInfoList';
 2 | 
 3 | /**
 4 |  * 用户名列表
 5 |  */
 6 | export function useUsernames(userIds: string[]): string[] {
 7 |   const userInfoList = useUserInfoList(userIds);
 8 | 
 9 |   return userInfoList.map((info) => info.nickname);
10 | }
11 | 


--------------------------------------------------------------------------------
/client/shared/hooks/useEffectOnce.ts:
--------------------------------------------------------------------------------
1 | import { EffectCallback, useEffect } from 'react';
2 | 
3 | // Reference: https://github.com/streamich/react-use/blob/master/src/useEffectOnce.ts
4 | 
5 | export const useEffectOnce = (effect: EffectCallback) => {
6 |   useEffect(effect, []);
7 | };
8 | 


--------------------------------------------------------------------------------
/client/shared/hooks/useEvent.ts:
--------------------------------------------------------------------------------
1 | import { useMemoizedFn } from './useMemoizedFn';
2 | 
3 | export const useEvent = useMemoizedFn;
4 | 


--------------------------------------------------------------------------------
/client/shared/hooks/usePrevious.ts:
--------------------------------------------------------------------------------
 1 | import { useEffect, useRef } from 'react';
 2 | 
 3 | export function usePrevious<T>(state: T): T | undefined {
 4 |   const ref = useRef<T>();
 5 | 
 6 |   useEffect(() => {
 7 |     ref.current = state;
 8 |   });
 9 | 
10 |   return ref.current;
11 | }
12 | 


--------------------------------------------------------------------------------
/client/shared/hooks/useUpdateEffect.ts:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react';
2 | import { createUpdateEffect } from './factory/createUpdateEffect';
3 | 
4 | export const useUpdateEffect = createUpdateEffect(useEffect);
5 | 


--------------------------------------------------------------------------------
/client/shared/hooks/useUpdateRef.ts:
--------------------------------------------------------------------------------
1 | import { useRef, MutableRefObject } from 'react';
2 | 
3 | export function useUpdateRef<T>(state: T): MutableRefObject<T> {
4 |   const ref = useRef<T>(state);
5 |   ref.current = state;
6 | 
7 |   return ref;
8 | }
9 | 


--------------------------------------------------------------------------------
/client/shared/hooks/useWatch.ts:
--------------------------------------------------------------------------------
 1 | import { DependencyList, useLayoutEffect } from 'react';
 2 | import { useMemoizedFn } from './useMemoizedFn';
 3 | 
 4 | /**
 5 |  * 监听变更并触发回调
 6 |  */
 7 | export function useWatch(deps: DependencyList, cb: () => void) {
 8 |   const memoizedFn = useMemoizedFn(cb);
 9 |   useLayoutEffect(() => {
10 |     memoizedFn();
11 |   }, deps);
12 | }
13 | 


--------------------------------------------------------------------------------
/client/shared/i18n/Trans.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Trans as OriginalTrans, TransProps } from 'react-i18next';
3 | 
4 | type Props = Omit<TransProps<string>, 't'>;
5 | export const Trans: React.FC<Props> = React.memo((props) => {
6 |   return <OriginalTrans>{props.children}</OriginalTrans>;
7 | });
8 | Trans.displayName = 'Trans';
9 | 


--------------------------------------------------------------------------------
/client/shared/i18n/__mocks__/index.ts:
--------------------------------------------------------------------------------
 1 | export const t = (key: string) => {
 2 |   return key;
 3 | };
 4 | 
 5 | export function onLanguageChanged() {}
 6 | 
 7 | export function useTranslation() {
 8 |   return { t };
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/shared/manager/request.ts:
--------------------------------------------------------------------------------
 1 | import { buildRegFn, buildCachedRegFnAsync } from './buildReg';
 2 | 
 3 | export const [getErrorHook, setErrorHook] = buildRegFn<(err: any) => boolean>(
 4 |   'requestErrorHook',
 5 |   () => true
 6 | );
 7 | 
 8 | export const [tokenGetter, setTokenGetter, refreshTokenGetter] =
 9 |   buildCachedRegFnAsync<() => Promise<string>>('requestTokenGetter');
10 | 


--------------------------------------------------------------------------------
/client/shared/manager/service.ts:
--------------------------------------------------------------------------------
1 | import { buildRegFnWithEvent } from './buildReg';
2 | 
3 | /**
4 |  * 获取服务器地址相关逻辑
5 |  * @default window.location.origin (前后端一体)
6 |  */
7 | export const [getServiceUrl, setServiceUrl, onServiceUrlChange] =
8 |   buildRegFnWithEvent<() => string>('serverUrl', () => window.location.origin);
9 | 


--------------------------------------------------------------------------------
/client/shared/manager/socket.ts:
--------------------------------------------------------------------------------
1 | import { buildRegList } from './buildReg';
2 | 
3 | interface PluginSocketEventListener {
4 |   eventName: string;
5 |   eventFn: (...args: any[]) => void;
6 | }
7 | export const [socketEventListeners, regSocketEventListener] =
8 |   buildRegList<PluginSocketEventListener>();
9 | 


--------------------------------------------------------------------------------
/client/shared/model/__all__.ts:
--------------------------------------------------------------------------------
 1 | export * as common from './common';
 2 | export * as config from './config';
 3 | export * as converse from './converse';
 4 | export * as friend from './friend';
 5 | export * as group from './group';
 6 | export * as message from './message';
 7 | export * as plugin from './plugin';
 8 | export * as user from './user';
 9 | export * as inbox from './inbox';
10 | 


--------------------------------------------------------------------------------
/client/shared/types.ts:
--------------------------------------------------------------------------------
1 | export type PromiseType<P extends Promise<any>> = P extends Promise<infer T>
2 |   ? T
3 |   : never;
4 | 
5 | export type FunctionReturningPromise = (...args: any[]) => Promise<any>;
6 | 


--------------------------------------------------------------------------------
/client/shared/utils/environment.ts:
--------------------------------------------------------------------------------
 1 | export const isBrowser = typeof window !== 'undefined';
 2 | 
 3 | export const isNavigator = typeof navigator !== 'undefined';
 4 | 
 5 | export const isDevelopment = process.env.NODE_ENV === 'development';
 6 | 
 7 | export const isProduction = process.env.NODE_ENV === 'production';
 8 | 
 9 | export const version = process.env.VERSION || '0.0.0';
10 | 


--------------------------------------------------------------------------------
/client/shared/utils/is-promise.ts:
--------------------------------------------------------------------------------
1 | export function isPromise(obj: any): obj is Promise<unknown> {
2 |   return (
3 |     !!obj &&
4 |     (typeof obj === 'object' || typeof obj === 'function') &&
5 |     typeof obj.then === 'function'
6 |   );
7 | }
8 | 


--------------------------------------------------------------------------------
/client/shared/utils/json-helper.ts:
--------------------------------------------------------------------------------
 1 | /**
 2 |  * 判断是否是一个合法的json字符串
 3 |  * @param jsonStr json字符串
 4 |  */
 5 | export function isValidJson(jsonStr: string): boolean {
 6 |   if (typeof jsonStr !== 'string') {
 7 |     return false;
 8 |   }
 9 | 
10 |   try {
11 |     JSON.parse(jsonStr);
12 |     return true;
13 |   } catch (e) {
14 |     return false;
15 |   }
16 | }
17 | 


--------------------------------------------------------------------------------
/client/shared/utils/panel-helper.ts:
--------------------------------------------------------------------------------
 1 | import { GroupPanel, GroupPanelType } from '../model/group';
 2 | 
 3 | /**
 4 |  * 判断面板是否为会话面板
 5 |  *
 6 |  * 会话面板的属性是带有已读未读属性的(如默认的文本面板)
 7 |  */
 8 | export function isConversePanel(panel: GroupPanel) {
 9 |   // 目前只有文本面板
10 | 
11 |   if (panel.type === GroupPanelType.TEXT) {
12 |     return true;
13 |   }
14 | 
15 |   return false;
16 | }
17 | 


--------------------------------------------------------------------------------
/client/shared/utils/utils.ts:
--------------------------------------------------------------------------------
 1 | /**
 2 |  * JavaScript 中的 sleep 函数
 3 |  * 参考 https://github.com/sqren/await-sleep/blob/master/index.js
 4 |  * @param milliseconds 阻塞毫秒
 5 |  */
 6 | export function sleep(milliseconds: number): Promise<void> {
 7 |   return new Promise((resolve) => {
 8 |     setTimeout(resolve, milliseconds);
 9 |   });
10 | }
11 | 


--------------------------------------------------------------------------------
/client/web/.npmrc:
--------------------------------------------------------------------------------
1 | registry = https://registry.npmmirror.com
2 | 


--------------------------------------------------------------------------------
/client/web/assets/_redirects:
--------------------------------------------------------------------------------
1 | /* /index.html 200
2 | 


--------------------------------------------------------------------------------
/client/web/assets/audio/telephone.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/assets/audio/telephone.mp3


--------------------------------------------------------------------------------
/client/web/assets/images/avatar/github-color.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/assets/images/avatar/github-color.webp


--------------------------------------------------------------------------------
/client/web/assets/images/avatar/robot.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/assets/images/avatar/robot.webp


--------------------------------------------------------------------------------
/client/web/assets/images/bg.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/assets/images/bg.webp


--------------------------------------------------------------------------------
/client/web/assets/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/assets/images/favicon.ico


--------------------------------------------------------------------------------
/client/web/assets/images/logo/logo@192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/assets/images/logo/logo@192.png


--------------------------------------------------------------------------------
/client/web/assets/images/logo/logo@32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/assets/images/logo/logo@32.png


--------------------------------------------------------------------------------
/client/web/assets/images/logo/logo@512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/assets/images/logo/logo@512.png


--------------------------------------------------------------------------------
/client/web/assets/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Disallow: /invite/
3 | 


--------------------------------------------------------------------------------
/client/web/e2e/cypress/.gitignore:
--------------------------------------------------------------------------------
 1 | # 临时忽略, 这些是自动生成的代码
 2 | cypress/integration
 3 | cypress/fixtures
 4 | 
 5 | # 未启用的代码
 6 | cypress/screenshots
 7 | cypress/snapshots
 8 | 
 9 | # video
10 | cypress/videos
11 | 


--------------------------------------------------------------------------------
/client/web/e2e/cypress/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 |   "component": {
3 |     "testFiles": "**/*.test.{js,ts,jsx,tsx}",
4 |     "componentFolder": "./cypress/components/"
5 |   }
6 | }
7 | 


--------------------------------------------------------------------------------
/client/web/e2e/playwright/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | test-results/
3 | playwright-report/
4 | auth.json
5 | 


--------------------------------------------------------------------------------
/client/web/e2e/playwright/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.ai-assistant/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.ai-assistant/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.ai-assistant/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.ai-assistant/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.bbcode/src/bbcode/type.ts:
--------------------------------------------------------------------------------
 1 | export type AstNode = AstNodeObj | AstNodeStr;
 2 | 
 3 | export type AstNodeObj = {
 4 |   tag: string;
 5 |   attrs: Record<string, string>;
 6 |   content: AstNode[];
 7 | };
 8 | 
 9 | export type AstNodeStr = string;
10 | 
11 | export interface TagProps {
12 |   node: AstNodeObj;
13 | }
14 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.bbcode/src/bbcode/utils.tsx:
--------------------------------------------------------------------------------
 1 | import type { AstNodeObj } from './type';
 2 | 
 3 | /**
 4 |  * 获取 url 节点的url地址
 5 |  * @param urlTag url节点
 6 |  */
 7 | export function getUrlTagRealUrl(urlTag: AstNodeObj): string {
 8 |   return urlTag.attrs.url ?? urlTag.content.join('');
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.bbcode/src/render.ts:
--------------------------------------------------------------------------------
1 | import { BBCode } from './bbcode';
2 | import './tags/__all__';
3 | 
4 | export default BBCode;
5 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.bbcode/src/tags/BoldTag.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import type { TagProps } from '../bbcode/type';
 3 | 
 4 | export const BoldTag: React.FC<TagProps> = React.memo((props) => {
 5 |   const { node } = props;
 6 |   const text = node.content.join('');
 7 | 
 8 |   return <b>{text}</b>;
 9 | });
10 | BoldTag.displayName = 'BoldTag';
11 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.bbcode/src/tags/DeleteTag.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import type { TagProps } from '../bbcode/type';
 3 | 
 4 | export const DeleteTag: React.FC<TagProps> = React.memo((props) => {
 5 |   const { node } = props;
 6 |   const text = node.content.join('');
 7 | 
 8 |   return <del>{text}</del>;
 9 | });
10 | DeleteTag.displayName = 'DeleteTag';
11 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.bbcode/src/tags/ItalicTag.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import type { TagProps } from '../bbcode/type';
 3 | 
 4 | export const ItalicTag: React.FC<TagProps> = React.memo((props) => {
 5 |   const { node } = props;
 6 |   const text = node.content.join('');
 7 | 
 8 |   return <i>{text}</i>;
 9 | });
10 | ItalicTag.displayName = 'ItalicTag';
11 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.bbcode/src/tags/styles.less:
--------------------------------------------------------------------------------
 1 | .plugin-bbcode-mention-tag {
 2 |   background-color: rgba(88, 101, 242, 0.3);
 3 |   border-radius: 2px;
 4 |   padding: 0 4px;
 5 | 
 6 |   &:hover {
 7 |     background-color: rgb(88, 101, 242);
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.bbcode/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "allowSyntheticDefaultImports": true,
 5 |     "jsx": "react",
 6 |     "paths": {
 7 |       "@capital/*": ["../../src/plugin/*"],
 8 |     }
 9 |   }
10 | }
11 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.bbcode/types/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@bbob/parser';
2 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.biggerfont/src/const.ts:
--------------------------------------------------------------------------------
1 | export const PLUGIN_ID = 'com.msgbyte.biggerfont';
2 | 
3 | export const PLUGIN_CONFIG = `${PLUGIN_ID}.config`;
4 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.biggerfont/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.biggerfont/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.draw/manifest.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "label": "Drawing plugin",
 3 |   "label.zh-CN": "绘图插件",
 4 |   "name": "com.msgbyte.draw",
 5 |   "url": "/plugins/com.msgbyte.draw/index.js",
 6 |   "version": "0.0.0",
 7 |   "author": "msgbyte",
 8 |   "description": "Allows sending custom drawings",
 9 |   "description.zh-CN": "允许发送自定义绘图",
10 |   "requireRestart": false
11 | }
12 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.draw/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "@plugins/com.msgbyte.draw",
 3 |   "main": "src/index.tsx",
 4 |   "version": "0.0.0",
 5 |   "private": true,
 6 |   "dependencies": {
 7 |     "react-canvas-draw": "^1.2.1"
 8 |   },
 9 |   "devDependencies": {
10 |     "@types/react-canvas-draw": "^1.1.1",
11 |     "react": "18.2.0"
12 |   }
13 | }
14 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.draw/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   draw: localTrans({ 'zh-CN': '绘图', 'en-US': 'Draw' }),
5 |   send: localTrans({ 'zh-CN': '发送', 'en-US': 'Send' }),
6 | };
7 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.draw/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.env.electron/src/overwrite.css:
--------------------------------------------------------------------------------
1 | .ant-dropdown-menu {
2 |   box-shadow: none; /* avoid group detail dropdown's shadow will make dom invisiable */
3 | }
4 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.env.electron/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "importsNotUsedAsValues": "error",
 6 |     "paths": {
 7 |       "@capital/*": ["../../src/plugin/*"],
 8 |     }
 9 |   }
10 | }
11 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.env.rn/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.env.rn/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.filepizza/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.filepizza/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.filepizza/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.filesend/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.filesfm/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.filesfm/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.filesfm/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.genshin/assets/icon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.genshin/assets/icon.jpg


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.genshin/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "@plugins/com.msgbyte.genshin",
 3 |   "main": "src/index.tsx",
 4 |   "version": "0.0.0",
 5 |   "private": true,
 6 |   "dependencies": {
 7 |     "genshin-gacha-kit": "^1.1.0",
 8 |     "html-react-parser": "^1.4.5"
 9 |   },
10 |   "devDependencies": {
11 |     "react": "18.2.0"
12 |   }
13 | }
14 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.genshin/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   genshin: localTrans({ 'zh-CN': '原神', 'en-US': 'Genshin' }),
5 |   gacha: localTrans({ 'zh-CN': '抽卡', 'en-US': 'Gacha' }),
6 | };
7 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.genshin/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.integration/src/types.ts:
--------------------------------------------------------------------------------
 1 | export type OpenAppCapability = 'bot' | 'webpage' | 'oauth';
 2 | 
 3 | export interface OpenAppInfo {
 4 |   _id: string;
 5 |   owner: string;
 6 |   appId: string;
 7 |   appName: string;
 8 |   appDesc: string;
 9 |   appIcon: string;
10 |   capability: OpenAppCapability[];
11 | }
12 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.integration/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "importsNotUsedAsValues": "error",
 6 |     "paths": {
 7 |       "@capital/*": ["../../src/plugin/*"],
 8 |     }
 9 |   }
10 | }
11 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.intro/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "@plugins/com.msgbyte.intro",
 3 |   "main": "src/index.ts",
 4 |   "version": "0.0.0",
 5 |   "private": true,
 6 |   "dependencies": {
 7 |     "shepherd.js": "^11.1.1"
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.intro/src/index.ts:
--------------------------------------------------------------------------------
1 | /**
2 |  * 异步加载
3 |  */
4 | import('./tour');
5 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.intro/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.mdpanel/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.mdpanel/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.miaolang/README.md:
--------------------------------------------------------------------------------
 1 | ## 喵语翻译
 2 | 
 3 | 允许用户将自然语言转换为加密后的喵语
 4 | 
 5 | 在任意聊天款的右侧添加喵语翻译
 6 | 
 7 | ![](./docs/send.png)
 8 | 
 9 | 在此输入的任意内容都会被转换为加密后的喵语言,只有安装了相同插件的用户才能翻译
10 | 
11 | ![](./docs/output.png)
12 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.miaolang/docs/output.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.miaolang/docs/output.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.miaolang/docs/send.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.miaolang/docs/send.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.miaolang/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "@plugins/com.msgbyte.miaolang",
 3 |   "main": "src/index.ts",
 4 |   "version": "0.0.0",
 5 |   "private": true,
 6 |   "dependencies": {
 7 |     "miao-lang": "^1.0.5"
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.miaolang/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.music/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.music/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.music/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   musicpanel: localTrans({
5 |     'zh-CN': '在线听音乐',
6 |     'en-US': 'YesPlayMusic',
7 |   }),
8 | };
9 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.music/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.notify/assets/sounds_bing.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.notify/assets/sounds_bing.mp3


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.notify/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "@plugins/com.msgbyte.notify",
 3 |   "main": "src/index.tsx",
 4 |   "version": "0.0.0",
 5 |   "private": true,
 6 |   "dependencies": {
 7 |     "lodash": "^4.17.21",
 8 |     "tinycon": "^0.6.8"
 9 |   },
10 |   "devDependencies": {
11 |     "@types/tinycon": "^0.6.3"
12 |   }
13 | }
14 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.notify/src/const.ts:
--------------------------------------------------------------------------------
1 | export const PLUGIN_NAME = 'com.msgbyte.notify';
2 | 
3 | export const PLUGIN_SYSTEM_SETTINGS_DISABLED_SOUND = `${PLUGIN_NAME}.disabledSound`;
4 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.notify/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.offline-icons/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   name: localTrans({
5 |     'zh-CN': 'Offline Icons',
6 |     'en-US': 'Offline Icons',
7 |   }),
8 | };
9 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.offline-icons/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "resolveJsonModule": true,
6 |     "importsNotUsedAsValues": "error"
7 |   }
8 | }
9 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.offline-icons/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.openapi/package.json:
--------------------------------------------------------------------------------
1 | {
2 |   "name": "@plugins/com.msgbyte.openapi",
3 |   "main": "src/index.ts",
4 |   "version": "0.0.0",
5 |   "private": true,
6 |   "dependencies": {}
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Profile.less:
--------------------------------------------------------------------------------
1 | .plugin-openapi-app-info_profile {
2 |   h2 {
3 |     margin-bottom: 10px;
4 |   }
5 | }
6 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Webpage.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | 
3 | const Webpage: React.FC = React.memo(() => {
4 |   return <div>开发中</div>;
5 | });
6 | Webpage.displayName = 'Webpage';
7 | 
8 | export default Webpage;
9 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/index.less:
--------------------------------------------------------------------------------
1 | .plugin-openapi-app-info {
2 |   display: flex;
3 |   height: 100%;
4 | 
5 |   .plugin-openapi-app-info_body {
6 |     padding: 0 10px;
7 |   }
8 | }
9 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.openapi/src/MainPanel/index.less:
--------------------------------------------------------------------------------
1 | .plugin-openapi-main-panel {
2 |   height: 100%;
3 | }
4 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.openapi/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.posthog/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.posthog/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.posthog/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.posthog/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.sentry/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.sentry/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.sentry/src/index.tsx:
--------------------------------------------------------------------------------
1 | import('./lazy');
2 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.sentry/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.snapdrop/README.md:
--------------------------------------------------------------------------------
 1 | ## com.msgbyte.snapdrop
 2 | 
 3 | 为 `Tailchat` 增加 局域网文件互传的功能
 4 | 
 5 | Powered by [snapdrop](https://github.com/RobinLinus/snapdrop.git)
 6 | 
 7 | ### 使用方式
 8 | 
 9 | 仅需要在同一网络下两个设备均打开 [我 -> 隔空投送] 面板,单击或长按即可发送
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.snapdrop/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.snapdrop/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.snapdrop/package.json:
--------------------------------------------------------------------------------
1 | {
2 |   "name": "@plugins/com.msgbyte.snapdrop",
3 |   "main": "src/index.tsx",
4 |   "version": "0.0.0",
5 |   "private": true,
6 |   "dependencies": {
7 |   }
8 | }
9 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.snapdrop/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   panelName: localTrans({ 'zh-CN': '隔空投送', 'en-US': 'Snapdrop' }),
5 | };
6 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.snapdrop/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/README.md:
--------------------------------------------------------------------------------
1 | ## 原神主题
2 | 
3 | 包含主题如下:
4 | - 原神-胡桃
5 | - 原神-琴
6 | - 原神-安柏
7 | - 原神-莫娜
8 | - 原神-罗莎莉亚
9 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/assets/icon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/assets/icon.jpg


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/package.json:
--------------------------------------------------------------------------------
1 | {
2 |   "name": "@plugins/com.msgbyte.theme.genshin",
3 |   "main": "src/index.ts",
4 |   "version": "0.0.0",
5 |   "private": true,
6 |   "dependencies": {}
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/amber/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/amber/avatar.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/amber/bg.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/amber/bg.jpeg


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/hutao/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/hutao/avatar.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/hutao/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/hutao/bg.jpg


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/jean/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/jean/avatar.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/jean/bg.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/jean/bg.jpeg


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/mona/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/mona/avatar.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/mona/bg.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/mona/bg.jpeg


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/avatar.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/bg.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/bg.jpeg


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.genshin/types/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.less';
2 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.miku/package.json:
--------------------------------------------------------------------------------
1 | {
2 |   "name": "@plugins/com.msgbyte.theme.miku",
3 |   "main": "src/index.ts",
4 |   "version": "0.0.0",
5 |   "private": true,
6 |   "dependencies": {}
7 | }


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.miku/src/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.theme.miku/src/bg.jpg


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.miku/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.theme.miku/types/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.less';
2 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.toolwa/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.toolwa/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.toolwa/package.json:
--------------------------------------------------------------------------------
1 | {
2 |   "name": "@plugins/com.msgbyte.toolwa",
3 |   "main": "src/index.tsx",
4 |   "version": "0.0.0",
5 |   "private": true,
6 |   "dependencies": {
7 |   }
8 | }
9 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.toolwa/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   panelName: localTrans({ 'zh-CN': '工具哇!', 'en-US': 'Toolwa!' }),
5 | };
6 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.toolwa/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.user.location/src/index.tsx:
--------------------------------------------------------------------------------
1 | import { regUserExtraInfo, localTrans } from '@capital/common';
2 | 
3 | regUserExtraInfo({
4 |   name: 'location',
5 |   label: localTrans({ 'zh-CN': '所在城市', 'en-US': 'City' }),
6 | });
7 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.user.location/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.user.location/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.webview/README.md:
--------------------------------------------------------------------------------
1 | ## com.msgbyte.webview
2 | 
3 | 为 `Tailchat` 增加 `Webview` 能力
4 | 
5 | ### Usage
6 | 
7 | 在 群组设置 -> 创建面板 可以添加网页面板。
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.webview/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "@plugins/com.msgbyte.webview",
 3 |   "main": "src/index.tsx",
 4 |   "version": "0.0.0",
 5 |   "private": true,
 6 |   "dependencies": {
 7 |     "url-regex": "^5.0.0",
 8 |     "xss": "^1.0.14"
 9 |   }
10 | }
11 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.webview/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "jsx": "react",
 5 |     "paths": {
 6 |       "@capital/*": ["../../src/plugin/*"],
 7 |     }
 8 |   }
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.wenshushu/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.wenshushu/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.wenshushu/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.widget.sakana/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.widget.sakana/assets/icon.png


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.widget.sakana/manifest.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "label": "sakana-widget",
 3 |   "name": "com.msgbyte.widget.sakana",
 4 |   "url": "/plugins/com.msgbyte.widget.sakana/index.js",
 5 |   "icon": "/plugins/com.msgbyte.widget.sakana/assets/icon.png",
 6 |   "version": "0.0.0",
 7 |   "author": "moonrailgun",
 8 |   "description": "Add sakana widget in tailchat"
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.widget.sakana/src/index.tsx:
--------------------------------------------------------------------------------
1 | const PLUGIN_ID = 'com.msgbyte.sakana-widget';
2 | const PLUGIN_NAME = 'sakana-widget';
3 | 
4 | console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`);
5 | 
6 | import('./main');
7 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.widget.sakana/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   name: localTrans({
5 |     'zh-CN': 'sakana-widget',
6 |     'en-US': 'sakana-widget',
7 |   }),
8 | };
9 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.widget.sakana/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.widget.sakana/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.wormhole/assets/icon.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/plugins/com.msgbyte.wormhole/assets/icon.webp


--------------------------------------------------------------------------------
/client/web/plugins/com.msgbyte.wormhole/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 |   plugins: [
3 |     'tailwindcss',
4 |     'autoprefixer',
5 |   ]
6 | }
7 | 


--------------------------------------------------------------------------------
/client/web/scripts/test-export.ts:
--------------------------------------------------------------------------------
1 | export { localTrans } from '../src/plugin/common/index';
2 | 


--------------------------------------------------------------------------------
/client/web/src/components/ChatBox/ChatInputBox/BaseChatInputButton.less:
--------------------------------------------------------------------------------
1 | .chat-message-input_action-popover {
2 |   > .ant-popover-content > .ant-popover-inner > .ant-popover-inner-content {
3 |     padding: 0;
4 |   }
5 | }
6 | 


--------------------------------------------------------------------------------
/client/web/src/components/ChatBox/ChatInputBox/Emotion.less:
--------------------------------------------------------------------------------
 1 | .chat-message-input_action-popover.emotion-popover {
 2 |   > .ant-popover-content > .ant-popover-inner {
 3 |     background-color: transparent;
 4 |     border-radius: 10px;
 5 | 
 6 |     .ant-popover-inner-content {
 7 |       padding: 0;
 8 |     }
 9 |   }
10 | }
11 | 


--------------------------------------------------------------------------------
/client/web/src/components/ChatBox/ChatMessageList/const.ts:
--------------------------------------------------------------------------------
1 | export const messageReverseItemId = {
2 |   OLDER_MESSAGES_LOADER: 'OLDER_MESSAGES_LOADER',
3 |   TEXT_CHANNEL_INTRO: 'TEXT_CHANNEL_INTRO',
4 | };
5 | 


--------------------------------------------------------------------------------
/client/web/src/components/ChatBox/ChatMessageList/types.ts:
--------------------------------------------------------------------------------
 1 | import type { ChatMessage } from 'tailchat-shared';
 2 | 
 3 | export interface MessageListProps {
 4 |   messages: ChatMessage[];
 5 |   title?: React.ReactNode;
 6 |   isLoadingMore: boolean;
 7 |   hasMoreMessage: boolean;
 8 |   onLoadMore: () => Promise<void>;
 9 | }
10 | 


--------------------------------------------------------------------------------
/client/web/src/components/DelayTip.tsx:
--------------------------------------------------------------------------------
1 | export { DelayTip } from 'tailchat-design';
2 | 


--------------------------------------------------------------------------------
/client/web/src/components/DynamicVirtualizedList/README.md:
--------------------------------------------------------------------------------
1 | Fork from https://github.com/mattermost/dynamic-virtualized-list
2 | 


--------------------------------------------------------------------------------
/client/web/src/components/Emoji/Picker.less:
--------------------------------------------------------------------------------
 1 | .emoji-picker {
 2 |   .emoji-mart {
 3 |     display: block;
 4 | 
 5 |     .emoji-mart-anchors {
 6 |       justify-content: flex-start;
 7 |       @apply space-x-1;
 8 | 
 9 |       .emoji-mart-anchor {
10 |         flex: initial;
11 |       }
12 |     }
13 |   }
14 | 
15 | }
16 | 


--------------------------------------------------------------------------------
/client/web/src/components/Emoji/const.ts:
--------------------------------------------------------------------------------
1 | import data from '@emoji-mart/data/sets/5/twitter.json';
2 | 
3 | export const emojiData = data;
4 | 


--------------------------------------------------------------------------------
/client/web/src/components/Emoji/twitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/client/web/src/components/Emoji/twitter.png


--------------------------------------------------------------------------------
/client/web/src/components/Emoji/types.ts:
--------------------------------------------------------------------------------
1 | export interface EmojiData {
2 |   id: string;
3 |   name: string;
4 |   native: string;
5 |   unified: string;
6 |   keywords: string[];
7 |   shortcodes: string;
8 | }
9 | 


--------------------------------------------------------------------------------
/client/web/src/components/ErrorView.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import { Problem } from './Problem';
 3 | 
 4 | /**
 5 |  * 用于接口错误显示的组件
 6 |  */
 7 | export const ErrorView: React.FC<{
 8 |   error: Error;
 9 | }> = React.memo(({ error }) => {
10 |   return <Problem text={String(error.message ?? error.name ?? error)} />;
11 | });
12 | ErrorView.displayName = 'ErrorView';
13 | 


--------------------------------------------------------------------------------
/client/web/src/components/Highlight.tsx:
--------------------------------------------------------------------------------
1 | export { Highlight } from 'tailchat-design';
2 | 


--------------------------------------------------------------------------------
/client/web/src/components/Image.tsx:
--------------------------------------------------------------------------------
1 | export { Image } from 'tailchat-design';
2 | 


--------------------------------------------------------------------------------
/client/web/src/components/KeepAliveOverlay/README.md:
--------------------------------------------------------------------------------
1 | 组件状态缓存, 使用覆盖层的方式来保持存活(类似小程序叠加原生程序的感觉)
2 | 
3 | 支持`iframe`的渲染缓存.
4 | 


--------------------------------------------------------------------------------
/client/web/src/components/KeepAliveOverlay/index.ts:
--------------------------------------------------------------------------------
1 | export { KeepAliveOverlayHost } from './KeepAliveOverlayHost';
2 | export { withKeepAliveOverlay } from './withKeepAliveOverlay';
3 | 


--------------------------------------------------------------------------------
/client/web/src/components/Markdown/index.tsx:
--------------------------------------------------------------------------------
1 | import { Loadable } from '../Loadable';
2 | 
3 | export { Markdown } from './render';
4 | 
5 | export const MarkdownEditor = Loadable(() =>
6 |   import('./editor').then((module) => module.MarkdownEditor)
7 | );
8 | 


--------------------------------------------------------------------------------
/client/web/src/components/Slides.less:
--------------------------------------------------------------------------------
1 | .slides {
2 |   .slick-list {
3 |     transition: height .2s ease-in-out;
4 |   }
5 | }
6 | 


--------------------------------------------------------------------------------
/client/web/src/components/Spinner.tsx:
--------------------------------------------------------------------------------
1 | import { Icon } from 'tailchat-design';
2 | import React from 'react';
3 | 
4 | export const Spinner: React.FC = React.memo(() => {
5 |   return <Icon className="animate-spin mr-3 inline" icon="mdi:loading" />;
6 | });
7 | Spinner.displayName = 'Spinner';
8 | 


--------------------------------------------------------------------------------
/client/web/src/components/__mocks__/UserName.tsx:
--------------------------------------------------------------------------------
1 | export function UserName(props: any) {
2 |   return `[UserName ${JSON.stringify(props)}]`;
3 | }
4 | 


--------------------------------------------------------------------------------
/client/web/src/components/__tests__/IconBtn.spec.tsx:
--------------------------------------------------------------------------------
 1 | import { render } from '@testing-library/react';
 2 | import React from 'react';
 3 | import { IconBtn } from '../IconBtn';
 4 | 
 5 | describe('IconBtn', () => {
 6 |   test('render', () => {
 7 |     const wrapper = render(<IconBtn icon="mdi:close" />);
 8 |     expect(wrapper.container).toMatchSnapshot();
 9 |   });
10 | });
11 | 


--------------------------------------------------------------------------------
/client/web/src/components/__tests__/IsDeveloping.spec.tsx:
--------------------------------------------------------------------------------
 1 | import { render } from '@testing-library/react';
 2 | import React from 'react';
 3 | import { IsDeveloping } from '../IsDeveloping';
 4 | 
 5 | describe('IsDeveloping', () => {
 6 |   test('render', () => {
 7 |     const wrapper = render(<IsDeveloping />);
 8 |     expect(wrapper.container).toMatchSnapshot();
 9 |   });
10 | });
11 | 


--------------------------------------------------------------------------------
/client/web/src/components/__tests__/Spinner.spec.tsx:
--------------------------------------------------------------------------------
 1 | import { render } from '@testing-library/react';
 2 | import React from 'react';
 3 | import { Spinner } from '../Spinner';
 4 | 
 5 | describe('Spinner', () => {
 6 |   test('render', () => {
 7 |     const wrapper = render(<Spinner />);
 8 |     expect(wrapper.container).toMatchSnapshot();
 9 |   });
10 | });
11 | 


--------------------------------------------------------------------------------
/client/web/src/components/__tests__/__snapshots__/Highlight.spec.tsx.snap:
--------------------------------------------------------------------------------
 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP
 2 | 
 3 | exports[`Highlight render 1`] = `
 4 | <div>
 5 |   <span
 6 |     class="highLight"
 7 |   >
 8 |     Any Text
 9 |   </span>
10 | </div>
11 | `;
12 | 


--------------------------------------------------------------------------------
/client/web/src/components/__tests__/__snapshots__/Spinner.spec.tsx.snap:
--------------------------------------------------------------------------------
1 | // Jest Snapshot v1, https://goo.gl/fbAQLP
2 | 
3 | exports[`Spinner render 1`] = `
4 | <div>
5 |   [iconify icon="mdi:loading"]
6 | </div>
7 | `;
8 | 


--------------------------------------------------------------------------------
/client/web/src/components/modals/CreateGroupInvite/CreateInviteCode.module.less:
--------------------------------------------------------------------------------
1 | .createInviteBtn {
2 |   display: flex;
3 |   :global {
4 |     .ant-btn:not(.ant-dropdown-trigger) {
5 |       flex: 1;
6 |     }
7 |   }
8 | }
9 | 


--------------------------------------------------------------------------------
/client/web/src/components/modals/GroupPanel/types.ts:
--------------------------------------------------------------------------------
1 | import type { GroupPanelType } from 'tailchat-shared';
2 | 
3 | export interface GroupPanelValues {
4 |   name: string;
5 |   type: string | GroupPanelType.TEXT | GroupPanelType.GROUP;
6 |   [key: string]: unknown;
7 | }
8 | 


--------------------------------------------------------------------------------
/client/web/src/context/GroupIdContext.tsx:
--------------------------------------------------------------------------------
 1 | import React, { useContext } from 'react';
 2 | 
 3 | const GroupIdContext = React.createContext<string>('');
 4 | GroupIdContext.displayName = 'GroupIdContext';
 5 | 
 6 | export const GroupIdContextProvider = GroupIdContext.Provider;
 7 | 
 8 | export function useGroupIdContext(): string {
 9 |   return useContext(GroupIdContext);
10 | }
11 | 


--------------------------------------------------------------------------------
/client/web/src/dev.ts:
--------------------------------------------------------------------------------
 1 | import { isDevelopment, request, version } from 'tailchat-shared';
 2 | import { measure } from './utils/measure-helper';
 3 | 
 4 | if (isDevelopment === true) {
 5 |   (window as any).DEBUG = {
 6 |     request,
 7 |     version,
 8 |     measure,
 9 |   };
10 | }
11 | 


--------------------------------------------------------------------------------
/client/web/src/hooks/useIsMobile.ts:
--------------------------------------------------------------------------------
 1 | import { useWindowSize } from './useWindowSize';
 2 | 
 3 | /**
 4 |  * 判定是否为移动版网页
 5 |  */
 6 | export function useIsMobile(): boolean {
 7 |   const { width } = useWindowSize();
 8 | 
 9 |   return width < 768;
10 | }
11 | 


--------------------------------------------------------------------------------
/client/web/src/hooks/useLocalStorage.ts:
--------------------------------------------------------------------------------
1 | import { createUseStorageState } from 'tailchat-shared';
2 | 
3 | export const useLocalStorageState = createUseStorageState(() => localStorage);
4 | 


--------------------------------------------------------------------------------
/client/web/src/hooks/useSessionStorageState.ts:
--------------------------------------------------------------------------------
1 | import { createUseStorageState } from 'tailchat-shared';
2 | 
3 | export const useSessionStorageState = createUseStorageState(
4 |   () => sessionStorage
5 | );
6 | 


--------------------------------------------------------------------------------
/client/web/src/plugin/common/context.ts:
--------------------------------------------------------------------------------
1 | export { useGroupIdContext } from '../../context/GroupIdContext';
2 | export { useGroupPanelContext } from '../../context/GroupPanelContext';
3 | export { useSocketContext } from '../../context/SocketContext';
4 | 


--------------------------------------------------------------------------------
/client/web/src/routes/Entry/index.module.less:
--------------------------------------------------------------------------------
1 | .entryLeft {
2 |   box-shadow: 2px 0px 10px 0px rgba(0, 0, 0, 0.8);
3 | }
4 | 


--------------------------------------------------------------------------------
/client/web/src/routes/Main/Content/Personal/Plugins/index.tsx:
--------------------------------------------------------------------------------
1 | import { PluginStore } from '@/plugin/PluginStore';
2 | import React from 'react';
3 | 
4 | export const PluginsPanel: React.FC = React.memo(() => {
5 |   return <PluginStore />;
6 | });
7 | PluginsPanel.displayName = 'PluginsPanel';
8 | 


--------------------------------------------------------------------------------
/client/web/src/routes/Panel/README.md:
--------------------------------------------------------------------------------
1 | 该文件是用于独立窗口打开面板的功能
2 | 


--------------------------------------------------------------------------------
/client/web/src/styles/antd/index.less:
--------------------------------------------------------------------------------
1 | @import "./overwrite.less";
2 | @import "./theme.less";
3 | @import "./dark.less";
4 | 


--------------------------------------------------------------------------------
/client/web/src/styles/index.ts:
--------------------------------------------------------------------------------
1 | import 'antd/dist/antd.css';
2 | import './antd/index.less';
3 | import './tailwind.less';
4 | import './global.less';
5 | 


--------------------------------------------------------------------------------
/client/web/src/utils/device-helper.ts:
--------------------------------------------------------------------------------
1 | export function isMobile(): boolean {
2 |   return window.document.body.clientWidth < 768;
3 | }
4 | 


--------------------------------------------------------------------------------
/client/web/src/utils/location-helper.ts:
--------------------------------------------------------------------------------
1 | /**
2 |  * 获取当前页面的search参数
3 |  */
4 | export function getSearchParam(param: string): string | null {
5 |   return new URLSearchParams(window.location.search).get(param);
6 | }
7 | 


--------------------------------------------------------------------------------
/client/web/test/fileTransformer.js:
--------------------------------------------------------------------------------
 1 | const path = require('path');
 2 | 
 3 | module.exports = {
 4 |   process(src, filename, config, options) {
 5 |     const code =
 6 |       'module.exports = ' + JSON.stringify(path.basename(filename)) + ';';
 7 | 
 8 |     // return { code };
 9 |     return code;
10 |   },
11 | };
12 | 


--------------------------------------------------------------------------------
/client/web/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 |   "extends": "./tsconfig.json",
3 |   "compilerOptions": {
4 |     "module": "CommonJS",
5 |   }
6 | }
7 | 


--------------------------------------------------------------------------------
/client/web/tsconfig.test.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "extends": "./tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "allowJs": true,
 5 |     "paths": {
 6 |       "@/*": ["./src/*"],
 7 |       "@test/*": ["./test/*"],
 8 |       "@assets/*": ["./assets/*"],
 9 |       "tailchat-design": ["../packages/design/components"],
10 |       "@capital/*": ["./src/plugin/*"]
11 |     }
12 |   }
13 | }
14 | 


--------------------------------------------------------------------------------
/client/web/types/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.jpg';
2 | declare module '*.svg';
3 | declare module '*.png';
4 | declare module '*.module.less';
5 | declare module '@bbob/parser'; // Work around for com.msgbyte.bbcode. ts-jest looks like cannot load plugins-self typedefinition
6 | 


--------------------------------------------------------------------------------
/docker/simple/README.md:
--------------------------------------------------------------------------------
1 | Only have one tailchat instance version.
2 | 
3 | Not include **openapi** and **admin**
4 | 


--------------------------------------------------------------------------------
/docker/simple/k8s/images/traefik-svc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/docker/simple/k8s/images/traefik-svc.png


--------------------------------------------------------------------------------
/docker/simple/k8s/namespace.yml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 |   name: tailchat
5 | 


--------------------------------------------------------------------------------
/docker/swag.env.example:
--------------------------------------------------------------------------------
1 | URL=
2 | 
3 | TZ=Asia/Shanghai
4 | 


--------------------------------------------------------------------------------
/packages/types/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './model/inbox';
2 | export * from './model/user';
3 | export * from './model/message';
4 | export * from './model/group';
5 | 


--------------------------------------------------------------------------------
/packages/types/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "declaration": true,
 5 |     "target": "ES5",
 6 |     "lib": ["ES2015"],
 7 |     "module": "CommonJS"
 8 |   },
 9 |   "include": ["src"]
10 | }
11 | 


--------------------------------------------------------------------------------
/pnpm-workspace.yaml:
--------------------------------------------------------------------------------
 1 | packages:
 2 |   - 'apps/*'
 3 |   - 'packages/*'
 4 |   - 'client/web'
 5 |   - 'client/shared'
 6 |   - 'client/web/plugins/**'
 7 |   - 'client/packages/**'
 8 |   - 'server'
 9 |   - 'server/admin'
10 |   - 'server/packages/**'
11 |   - 'server/plugins/**'
12 |   - 'server/test/demo/**'
13 |   - 'website'
14 | 


--------------------------------------------------------------------------------
/server/.dockerignore:
--------------------------------------------------------------------------------
1 | .env
2 | node_modules
3 | logs
4 | dist
5 | 


--------------------------------------------------------------------------------
/server/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | ignore-workspace-root-check = true
4 | strict-peer-dependencies = false # 因为一些旧依赖(特别是mongoose相关) 比较糟糕,因此关掉
5 | # For docker: https://pnpm.io/npmrc#unsafe-perm
6 | unsafe-perm = true
7 | 


--------------------------------------------------------------------------------
/server/admin/nodemon.json:
--------------------------------------------------------------------------------
1 | {
2 |   "verbose": true,
3 |   "watch": ["./src/server"],
4 |   "ext": "ts",
5 |   "delay": 1000,
6 |   "exec": "ts-node ./src/server/index.ts"
7 | }
8 | 


--------------------------------------------------------------------------------
/server/admin/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/server/admin/public/favicon.ico


--------------------------------------------------------------------------------
/server/admin/src/client/components/MarkdownEditor/index.tsx:
--------------------------------------------------------------------------------
1 | import loadable from '@loadable/component';
2 | 
3 | export const MarkdownEditor = loadable(() =>
4 |   import('./editor').then((module) => module.MarkdownEditor)
5 | );
6 | 


--------------------------------------------------------------------------------
/server/admin/src/client/components/MarkdownEditor/plugins.ts:
--------------------------------------------------------------------------------
1 | import gfm from '@bytemd/plugin-gfm';
2 | 
3 | export const plugins = [
4 |   gfm(),
5 |   // Add more plugins here
6 | ];
7 | 


--------------------------------------------------------------------------------
/server/admin/src/client/components/MarkdownEditor/style.less:
--------------------------------------------------------------------------------
1 | .bytemd .bytemd-toolbar-right [bytemd-tippy-path='5'] {
2 |   // Hidden github icon
3 |   display: none;
4 | }
5 | 
6 | .bytemd-fullscreen.bytemd {
7 |   z-index: 99;
8 | }
9 | 


--------------------------------------------------------------------------------
/server/admin/src/client/global.css:
--------------------------------------------------------------------------------
1 | .arco-table-th {
2 |   white-space: nowrap;
3 | }
4 | .arco-table-td {
5 |   /* white-space: nowrap; */
6 |   overflow: hidden;
7 | }
8 | 


--------------------------------------------------------------------------------
/server/admin/src/client/main.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import App from './App';
4 | import './global.css';
5 | 
6 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
7 |   <App />
8 | );
9 | 


--------------------------------------------------------------------------------
/server/admin/src/client/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | /// <reference types="vite/client" />
2 | 


--------------------------------------------------------------------------------
/server/admin/src/server/middleware/express-mongoose-ra-json-server/README.md:
--------------------------------------------------------------------------------
1 | fork from https://github.com/NathanAdhitya/express-mongoose-ra-json-server
2 | 
3 | modify:
4 | - count logic in get `/`
5 | 


--------------------------------------------------------------------------------
/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/baseModel.interface.ts:
--------------------------------------------------------------------------------
1 | import type { Model, Document } from 'mongoose';
2 | 
3 | export interface ADPBaseSchema {
4 |   _id: string;
5 | }
6 | 
7 | export type ADPBaseModel = Model<ADPBaseSchema & Document & any>;
8 | 


--------------------------------------------------------------------------------
/server/devops/README.md:
--------------------------------------------------------------------------------
 1 | # 可选启用
 2 | 
 3 | WIP
 4 | 
 5 | 该文件夹用于运维
 6 | 
 7 | ## 用法 Usage
 8 | 
 9 | ```bash
10 | cd ./devops
11 | docker compose -f ../docker-compose.yml -f docker-compose.devops.yml up -d
12 | ```
13 | 


--------------------------------------------------------------------------------
/server/devops/config/grafana-dashboards.yml:
--------------------------------------------------------------------------------
1 | - name: 'default'
2 |   org_id: 1
3 |   folder: ''
4 |   type: 'file'
5 |   options:
6 |     folder: '/var/lib/grafana/dashboards'
7 | 


--------------------------------------------------------------------------------
/server/lib/crypto/__tests__/__snapshots__/des.spec.ts.snap:
--------------------------------------------------------------------------------
 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP
 2 | 
 3 | exports[`des encrypt D 1`] = `"ihmnn4VBPYE="`;
 4 | 
 5 | exports[`des encrypt bar 1`] = `"p/PIC32MPm4="`;
 6 | 
 7 | exports[`des encrypt foo 1`] = `"NP3+ABhEiY4="`;
 8 | 
 9 | exports[`des encrypt 你 1`] = `"O5kF0LXzjpE="`;
10 | 


--------------------------------------------------------------------------------
/server/models/README.md:
--------------------------------------------------------------------------------
1 | Reference: https://typegoose.github.io/typegoose/docs/guides/quick-start-guide
2 | 


--------------------------------------------------------------------------------
/server/packages/openapi-generator/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "declaration": true,
 5 |     "outDir": "./dist",
 6 |     "paths": {}
 7 |   },
 8 |   "include": ["./src/**/*"],
 9 |   "exclude": ["./node_modules/**/*", "./dist/**/*"]
10 | }
11 | 


--------------------------------------------------------------------------------
/server/packages/sdk/.gitignore:
--------------------------------------------------------------------------------
1 | dist
2 | 


--------------------------------------------------------------------------------
/server/packages/sdk/src/const.ts:
--------------------------------------------------------------------------------
 1 | /**
 2 |  * 系统用户id
 3 |  */
 4 | export const SYSTEM_USERID = '000000000000000000000000';
 5 | 
 6 | /**
 7 |  * 配置项
 8 |  */
 9 | export const CONFIG_GATEWAY_AFTER_HOOK = '$gatewayAfterHooks';
10 | 


--------------------------------------------------------------------------------
/server/packages/sdk/src/db/index.ts:
--------------------------------------------------------------------------------
1 | export * from './typegoose';
2 | export * from './mongoose';
3 | 


--------------------------------------------------------------------------------
/server/packages/sdk/src/db/mongoose.ts:
--------------------------------------------------------------------------------
1 | export { Types, isValidObjectId } from 'mongoose';
2 | 


--------------------------------------------------------------------------------
/server/packages/sdk/src/openapi/index.ts:
--------------------------------------------------------------------------------
1 | export { OAuthClient } from './oauth';
2 | 


--------------------------------------------------------------------------------
/server/packages/sdk/src/runner/cli.ts:
--------------------------------------------------------------------------------
1 | import { Runner } from 'moleculer';
2 | 
3 | const runner = new Runner();
4 | runner.start(process.argv);
5 | 


--------------------------------------------------------------------------------
/server/packages/sdk/src/services/broker.ts:
--------------------------------------------------------------------------------
1 | import Moleculer from 'moleculer';
2 | 
3 | /**
4 |  * 用于不暴露moleculer让外部手动启动一个broker
5 |  *
6 |  * 如tailchat-cli
7 |  */
8 | export class TcBroker extends Moleculer.ServiceBroker {}
9 | 


--------------------------------------------------------------------------------
/server/packages/sdk/src/services/lib/moleculer-db-adapter-mongoose/README.md:
--------------------------------------------------------------------------------
1 | fork from `moleculer-db-adapter-mongoose`
2 | 


--------------------------------------------------------------------------------
/server/packages/sdk/src/services/lib/moleculer-web/README.md:
--------------------------------------------------------------------------------
1 | Fork from https://github.com/moleculerjs/moleculer-web
2 | 
3 | Hash: f375dbb4f8bff8aa16e95024e5c65463b626fa45
4 | 


--------------------------------------------------------------------------------
/server/packages/sdk/src/structs/user.ts:
--------------------------------------------------------------------------------
 1 | import type { UserBaseInfo, UserInfoWithToken, UserType } from 'tailchat-types';
 2 | import { userType } from 'tailchat-types';
 3 | 
 4 | export {
 5 |   userType,
 6 |   UserType,
 7 |   UserBaseInfo as UserStruct,
 8 |   UserInfoWithToken as UserStructWithToken,
 9 | };
10 | 


--------------------------------------------------------------------------------
/server/packages/swagger-jsdoc-generator/src/utils.ts:
--------------------------------------------------------------------------------
 1 | import { MethodDeclaration, ParameterDeclaration, SyntaxKind } from 'ts-morph';
 2 | 
 3 | /**
 4 |  * 获取函数参数列表
 5 |  */
 6 | export function getMethodParameters(
 7 |   methodDeclaration: MethodDeclaration
 8 | ): ParameterDeclaration[] {
 9 |   return methodDeclaration.getChildrenOfKind(SyntaxKind.Parameter);
10 | }
11 | 


--------------------------------------------------------------------------------
/server/packages/swagger-jsdoc-generator/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "declaration": true,
 5 |     "rootDir": "./src",
 6 |     "outDir": "./dist",
 7 |     "typeRoots": ["./node_modules/@types"],
 8 |   },
 9 |   "include": ["./src/**/*"],
10 |   "exclude": ["./node_modules/**/*", "./dist/**/*"]
11 | }
12 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.agora/services/utils/README.md:
--------------------------------------------------------------------------------
1 | Copy from https://github.com/AgoraIO/Tools/tree/master/DynamicKey/AgoraDynamicKey/nodejs
2 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/assets/icon.png


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.agora');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.discover');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.github/.ministarrc.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | 
3 | module.exports = {
4 |   externalDeps: ['react', 'react-router'],
5 |   pluginRoot: path.resolve(__dirname, './web'),
6 |   outDir: path.resolve(__dirname, '../../public'),
7 | };
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/package.json:
--------------------------------------------------------------------------------
1 | {
2 |   "name": "@plugins/com.msgbyte.github",
3 |   "main": "src/index.tsx",
4 |   "version": "0.0.0",
5 |   "private": true,
6 |   "dependencies": {}
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.github');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.iam/strategies/index.ts:
--------------------------------------------------------------------------------
1 | import { GithubStrategy } from './github';
2 | 
3 | export const strategies = [GithubStrategy];
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/index.tsx:
--------------------------------------------------------------------------------
 1 | import { regLoginAction } from '@capital/common';
 2 | import { IAMAction } from './IAMAction';
 3 | 
 4 | console.log('Plugin Identity and Access Management is loaded');
 5 | 
 6 | regLoginAction({
 7 |   name: 'plugin:com.msgbyte.iam/loginAction',
 8 |   component: IAMAction,
 9 | });
10 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.iam');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.linkmeta/.ministarrc.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | 
3 | module.exports = {
4 |   externalDeps: ['react'],
5 |   pluginRoot: path.resolve(__dirname, './web'),
6 |   outDir: path.resolve(__dirname, '../../public'),
7 | };
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "@plugins/com.msgbyte.linkmeta",
 3 |   "main": "src/index.tsx",
 4 |   "version": "0.0.0",
 5 |   "private": true,
 6 |   "dependencies": {
 7 |     "lodash-es": "^4.17.21",
 8 |     "url-regex": "^5.0.0"
 9 |   }
10 | }
11 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.linkmeta');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/src/translate.ts:
--------------------------------------------------------------------------------
1 | import { localTrans } from '@capital/common';
2 | 
3 | export const Translate = {
4 |   linkmetaService: localTrans({
5 |     'zh-CN': 'Url元数据服务',
6 |     'en-US': 'Link Meta Service',
7 |   }),
8 | };
9 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.livekit/web/plugins/com.msgbyte.livekit/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/server/plugins/com.msgbyte.livekit/web/plugins/com.msgbyte.livekit/assets/icon.png


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.livekit/web/plugins/com.msgbyte.livekit/src/consts.ts:
--------------------------------------------------------------------------------
1 | export const PLUGIN_ID = 'com.msgbyte.livekit';
2 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.livekit/web/plugins/com.msgbyte.livekit/src/navbar/useIconIsShow.ts:
--------------------------------------------------------------------------------
 1 | import { useLivekitState } from '../store/useLivekitState';
 2 | 
 3 | export function useIconIsShow() {
 4 |   return useLivekitState().isActive;
 5 | }
 6 | 
 7 | export function usePersionPanelIsShow() {
 8 |   return useLivekitState().isActive;
 9 | }
10 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.livekit/web/plugins/com.msgbyte.livekit/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.livekit');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.livekit/web/plugins/com.msgbyte.livekit/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.livekit/webhook/README.md:
--------------------------------------------------------------------------------
1 | ## Receive webhook from livekit and send to `livekit.service.js`;
2 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.meeting/.ministarrc.js:
--------------------------------------------------------------------------------
 1 | const path = require('path');
 2 | const nodePolyfills = require('rollup-plugin-polyfill-node')
 3 | 
 4 | module.exports = {
 5 |   externalDeps: ['react', 'react-router'],
 6 |   pluginRoot: path.resolve(__dirname, './web'),
 7 |   outDir: path.resolve(__dirname, '../../public'),
 8 |   rollupPlugins: [nodePolyfills()]
 9 | };
10 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.meeting/deprecated.md:
--------------------------------------------------------------------------------
1 | Please use `com.msgbyte.livekit` to replace
2 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.meeting/web/plugins/com.msgbyte.meeting/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.meeting');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.meeting/web/plugins/com.msgbyte.meeting/src/translate.ts:
--------------------------------------------------------------------------------
 1 | import { localTrans } from '@capital/common';
 2 | 
 3 | export const Translate = {
 4 |   meeting: localTrans({ 'zh-CN': '视频会议', 'en-US': 'Meeting' }),
 5 |   meetingService: localTrans({
 6 |     'zh-CN': '视频会议服务',
 7 |     'en-US': 'Meeting Service',
 8 |   }),
 9 | };
10 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.meeting/web/plugins/com.msgbyte.meeting/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.simplenotify/.ministarrc.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | 
3 | module.exports = {
4 |   externalDeps: ['react'],
5 |   pluginRoot: path.resolve(__dirname, './web'),
6 |   outDir: path.resolve(__dirname, '../../public'),
7 | };
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.simplenotify/web/plugins/com.msgbyte.simplenotify/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "@plugins/com.msgbyte.simplenotify",
 3 |   "main": "src/index.tsx",
 4 |   "version": "0.0.0",
 5 |   "private": true,
 6 |   "devDependencies": {
 7 |     "@types/react": "18.0.20",
 8 |     "react": "18.2.0"
 9 |   }
10 | }
11 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.simplenotify/web/plugins/com.msgbyte.simplenotify/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.simplenotify');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.simplenotify/web/plugins/com.msgbyte.simplenotify/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.tasks/.ministarrc.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | 
3 | module.exports = {
4 |   externalDeps: ['react'],
5 |   pluginRoot: path.resolve(__dirname, './web'),
6 |   outDir: path.resolve(__dirname, '../../public'),
7 | };
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.tasks/web/plugins/com.msgbyte.tasks/package.json:
--------------------------------------------------------------------------------
1 | {
2 |   "name": "@plugins/com.msgbyte.tasks",
3 |   "main": "src/index.tsx",
4 |   "version": "0.0.0",
5 |   "private": true,
6 |   "dependencies": {}
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.tasks/web/plugins/com.msgbyte.tasks/src/TasksPanel/type.ts:
--------------------------------------------------------------------------------
 1 | export interface TaskItemType {
 2 |   _id: string;
 3 |   creator: string;
 4 |   assignee?: string[];
 5 |   title: string;
 6 |   description?: string;
 7 |   done: boolean;
 8 |   expiredAt?: string;
 9 | }
10 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.tasks/web/plugins/com.msgbyte.tasks/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.tasks');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.tasks/web/plugins/com.msgbyte.tasks/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.tasks/web/plugins/com.msgbyte.tasks/types/tailchat.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@capital/common';
2 | declare module '@capital/component';
3 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.topic/.ministarrc.js:
--------------------------------------------------------------------------------
 1 | const path = require('path');
 2 | 
 3 | module.exports = {
 4 |   externalDeps: [
 5 |     'react',
 6 |     'styled-components',
 7 |     'zustand',
 8 |     'zustand/middleware/immer',
 9 |   ],
10 |   pluginRoot: path.resolve(__dirname, './web'),
11 |   outDir: path.resolve(__dirname, '../../public'),
12 | };
13 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.topic/web/plugins/com.msgbyte.topic/src/request.ts:
--------------------------------------------------------------------------------
1 | import { createPluginRequest } from '@capital/common';
2 | 
3 | export const request = createPluginRequest('com.msgbyte.topic');
4 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.topic/web/plugins/com.msgbyte.topic/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.welcome/web/plugins/com.msgbyte.welcome/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.wxpusher/web/plugins/com.msgbyte.wxpusher/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/server/plugins/com.msgbyte.wxpusher/web/plugins/com.msgbyte.wxpusher/assets/icon.png


--------------------------------------------------------------------------------
/server/plugins/com.msgbyte.wxpusher/web/plugins/com.msgbyte.wxpusher/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "esModuleInterop": true,
4 |     "jsx": "react",
5 |     "importsNotUsedAsValues": "error"
6 |   }
7 | }
8 | 


--------------------------------------------------------------------------------
/server/public/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/server/public/.gitkeep


--------------------------------------------------------------------------------
/server/runner.ts:
--------------------------------------------------------------------------------
1 | import path from 'path';
2 | import { startDevRunner } from 'tailchat-server-sdk/dist/runner';
3 | 
4 | startDevRunner({
5 |   config: path.resolve(__dirname, './moleculer.config.ts'),
6 | });
7 | 


--------------------------------------------------------------------------------
/server/scripts/k8s/README.md:
--------------------------------------------------------------------------------
1 | WIP Warning!
2 | 
3 | 正在施工中!
4 | 


--------------------------------------------------------------------------------
/server/scripts/k8s/kompose/data-persistentvolumeclaim.yaml:
--------------------------------------------------------------------------------
 1 | apiVersion: v1
 2 | kind: PersistentVolumeClaim
 3 | metadata:
 4 |   labels:
 5 |     io.kompose.service: data
 6 |   name: data
 7 | spec:
 8 |   accessModes:
 9 |     - ReadWriteOnce
10 |   resources:
11 |     requests:
12 |       storage: 100Mi
13 | status: {}
14 | 


--------------------------------------------------------------------------------
/server/scripts/k8s/kompose/default-networkpolicy.yaml:
--------------------------------------------------------------------------------
 1 | apiVersion: networking.k8s.io/v1
 2 | kind: NetworkPolicy
 3 | metadata:
 4 |   name: default
 5 | spec:
 6 |   ingress:
 7 |     - from:
 8 |         - podSelector:
 9 |             matchLabels:
10 |               io.kompose.network/default: "true"
11 |   podSelector:
12 |     matchLabels:
13 |       io.kompose.network/default: "true"
14 | 


--------------------------------------------------------------------------------
/server/scripts/k8s/kompose/storage-persistentvolumeclaim.yaml:
--------------------------------------------------------------------------------
 1 | apiVersion: v1
 2 | kind: PersistentVolumeClaim
 3 | metadata:
 4 |   labels:
 5 |     io.kompose.service: storage
 6 |   name: storage
 7 | spec:
 8 |   accessModes:
 9 |     - ReadWriteOnce
10 |   resources:
11 |     requests:
12 |       storage: 100Mi
13 | status: {}
14 | 


--------------------------------------------------------------------------------
/server/scripts/k8s/kompose/traefik-claim0-persistentvolumeclaim.yaml:
--------------------------------------------------------------------------------
 1 | apiVersion: v1
 2 | kind: PersistentVolumeClaim
 3 | metadata:
 4 |   labels:
 5 |     io.kompose.service: traefik-claim0
 6 |   name: traefik-claim0
 7 | spec:
 8 |   accessModes:
 9 |     - ReadOnlyMany
10 |   resources:
11 |     requests:
12 |       storage: 100Mi
13 | status: {}
14 | 


--------------------------------------------------------------------------------
/server/services/README.md:
--------------------------------------------------------------------------------
1 | ## 简述
2 | 
3 | 每个`.service.ts`文件都是一个微服务
4 | 
5 | 应当确保尽量不要出现一个单独的微服务承载太重的业务,而应当考虑多拆分到不同的微任务中。
6 | 


--------------------------------------------------------------------------------
/server/services/openapi/oidc/account.ts:
--------------------------------------------------------------------------------
 1 | import { User } from './model';
 2 | 
 3 | export async function claimUserInfo(userId: string) {
 4 |   const baseUserInfo = await User.getUserBaseInfo(userId);
 5 | 
 6 |   return {
 7 |     ...baseUserInfo,
 8 |     sub: userId,
 9 |   };
10 | }
11 | 


--------------------------------------------------------------------------------
/server/services/openapi/oidc/model.ts:
--------------------------------------------------------------------------------
1 | import { mongoose } from '@typegoose/typegoose';
2 | import { config } from 'tailchat-server-sdk';
3 | import OpenApp from '../../../models/openapi/app';
4 | import User from '../../../models/user/user';
5 | 
6 | mongoose.connect(config.mongoUrl);
7 | 
8 | export { OpenApp, User };
9 | 


--------------------------------------------------------------------------------
/server/services/openapi/oidc/views/_footer.ejs:
--------------------------------------------------------------------------------
1 | 
2 | </body>
3 | 
4 | </html>
5 | 


--------------------------------------------------------------------------------
/server/test/setup.ts:
--------------------------------------------------------------------------------
1 | import dotenv from 'dotenv';
2 | 
3 | /**
4 |  * 读取.env环境变量配置文件
5 |  */
6 | dotenv.config();
7 | 


--------------------------------------------------------------------------------
/server/types/neo-blessed/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module 'neo-blessed' {
2 |   export * from 'blessed';
3 | }
4 | 


--------------------------------------------------------------------------------
/server/types/plugins.d.ts:
--------------------------------------------------------------------------------
1 | /**
2 |  * 该文件主要解决tsc在ci环境时无法很好探知到monorepo中的项目的依赖类型导致的报错
3 |  */
4 | 
5 | declare module 'link-preview-js';
6 | 


--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "esModuleInterop": true,
 4 |     "isolatedModules": true,
 5 |     "strict": true,
 6 |     "pretty": true,
 7 |     "skipLibCheck": true,
 8 |     "importsNotUsedAsValues": "error",
 9 |     "experimentalDecorators": true,
10 |   }
11 | }
12 | 


--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 |   "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
3 | }
4 | 


--------------------------------------------------------------------------------
/website/.gitignore:
--------------------------------------------------------------------------------
 1 | # Dependencies
 2 | /node_modules
 3 | 
 4 | # Production
 5 | /build
 6 | 
 7 | # Generated files
 8 | .docusaurus
 9 | .cache-loader
10 | 
11 | # Misc
12 | .DS_Store
13 | .env.local
14 | .env.development.local
15 | .env.test.local
16 | .env.production.local
17 | 
18 | npm-debug.log*
19 | yarn-debug.log*
20 | yarn-error.log*
21 | 
22 | .vercel
23 | 


--------------------------------------------------------------------------------
/website/.npmrc:
--------------------------------------------------------------------------------
1 | # https://npmmirror.com/
2 | registry = https://registry.npmmirror.com
3 | 


--------------------------------------------------------------------------------
/website/README.md:
--------------------------------------------------------------------------------
1 | # Tailchat Document
2 | 
3 | [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/)
4 | 


--------------------------------------------------------------------------------
/website/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 |   presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
3 | };
4 | 


--------------------------------------------------------------------------------
/website/blog/2023-03-27-deploy-in-synology.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: Tailchat Synology deployment record
 3 | authors: reacher
 4 | image: /img/logo.svg
 5 | keywords:
 6 |   - tailchat
 7 | tags: [blog]
 8 | ---
 9 | 
10 | :::info
11 | Its blog is a chinese only blog from users, please switch to chinese language to read it.
12 | :::
13 | 


--------------------------------------------------------------------------------
/website/blog/authors.yml:
--------------------------------------------------------------------------------
 1 | moonrailgun:
 2 |   name: moonrailgun
 3 |   title: Founder of Tailchat
 4 |   url: https://github.com/moonrailgun
 5 |   image_url: https://avatars.githubusercontent.com/u/6964737?v=4
 6 |   email: moonrailgun@gmail.com
 7 | 
 8 | reacher:
 9 |   name: Reacher
10 |   title: Tailchat Normal User
11 |   image_url: /img/avatar/reacher.png
12 | 


--------------------------------------------------------------------------------
/website/docs/advanced-usage/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Advanced Usage",
3 |   "position": 30
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/advanced-usage/openapp/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Open App",
3 |   "position": 20
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/advanced-usage/plugins/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Plugin Document",
3 |   "position": 10
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/advanced-usage/plugins/com.msgbyte.wxpusher.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | sidebar_position: 2
 3 | title: wxpusher
 4 | ---
 5 | 
 6 | `com.msgbyte.wxpusher`
 7 | 
 8 | :::caution
 9 | This plugin just make for chinese mainland user which use wechat. please switch language to `zh-Hans` to continue.
10 | :::
11 | 


--------------------------------------------------------------------------------
/website/docs/architecture.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | sidebar_position: 3
 3 | title: System Architecture
 4 | ---
 5 | 
 6 | ## Backend Architecture
 7 | 
 8 | ![](/img/architecture/backend.excalidraw.svg)
 9 | 
10 | ## Plugin mechanism architecture
11 | 
12 | ![](/img/architecture/plugin.excalidraw.svg)
13 | 


--------------------------------------------------------------------------------
/website/docs/benchmark/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Benchmark",
3 |   "position": 50
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/cli/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Cli",
3 |   "position": 40
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/contribution/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Contribution",
3 |   "position": 90
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/contribution/dev/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Development Documentation",
3 |   "position": 2
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/deployment/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Application Deployment",
3 |   "position": 10
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/deployment/assets/docker-init.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/docs/deployment/assets/docker-init.png


--------------------------------------------------------------------------------
/website/docs/deployment/other-way/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Install with other ways",
3 |   "position": 5
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/deployment/other-way/bt.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | sidebar_position: 3
 3 | title: Install with BT
 4 | ---
 5 | 
 6 | :::info
 7 | This document is only available for Chinese.
 8 | :::
 9 | 
10 | If you are chinese user, and wanna install Tailchat with bt, please learn more with switch language to chinese and read it.
11 | 


--------------------------------------------------------------------------------
/website/docs/deployment/other-way/kubernetes/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Kubernetes",
3 |   "position": 2
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/devops/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Operations",
3 |   "position": 15
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/meeting/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Video Conference",
3 |   "position": 35
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/meeting/images/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/docs/meeting/images/1.png


--------------------------------------------------------------------------------
/website/docs/meeting/images/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/docs/meeting/images/2.png


--------------------------------------------------------------------------------
/website/docs/meeting/images/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/docs/meeting/images/3.png


--------------------------------------------------------------------------------
/website/docs/meeting/images/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/docs/meeting/images/4.png


--------------------------------------------------------------------------------
/website/docs/meeting/images/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/docs/meeting/images/5.png


--------------------------------------------------------------------------------
/website/docs/meeting/images/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/docs/meeting/images/6.png


--------------------------------------------------------------------------------
/website/docs/meeting/images/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/docs/meeting/images/7.png


--------------------------------------------------------------------------------
/website/docs/plugin-list/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Plugin List",
3 |   "position": 20
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/plugins/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Develop plugins",
3 |   "position": 70
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/plugins/api/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "API Interface",
3 |   "position": 99
4 | }
5 | 


--------------------------------------------------------------------------------
/website/docs/plugins/api/cssvar.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | sidebar_position: 3
 3 | title: Global CSS Variables
 4 | ---
 5 | 
 6 | - `--tc-primary-color`: primary color
 7 | - `--tc-background-image`: background image
 8 | - `--tc-content-background-image`: content page background image
 9 | - `--tc-content-background-image-opacity`: content page background image opacity, default **0.15**
10 | 


--------------------------------------------------------------------------------
/website/docs/plugins/guide/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Guide",
3 |   "position": 5
4 | }
5 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2023-03-14-v1.6.7.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: 版本发布日志 v1.6.7
 3 | authors: moonrailgun
 4 | image: /img/logo.svg
 5 | slug: release-1.6.7
 6 | keywords:
 7 |   - tailchat
 8 | tags: [Release Note]
 9 | ---
10 | 
11 | - 增强个人品牌定制,允许自定义服务器登录入口的名称与背景图(图片没有文件上传限制)
12 | - 优化了后台管理平台的内存占用,占用内存只占原来的1/4左右
13 | - 后台管理平台增加了converseID的过滤
14 | - 修复了一些bug
15 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2024-04-15-v1.11.1.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: 版本发布日志 v1.11.1
 3 | authors: moonrailgun
 4 | image: /img/logo.svg
 5 | slug: release-1.11.1
 6 | keywords:
 7 |   - tailchat
 8 | tags: [Release Note]
 9 | ---
10 | 
11 | - 增加消息右键菜单
12 |   - 增加设置项允许关闭右键菜单
13 |   - 优化了在消息右键菜单中通过选中复制部分文本的逻辑
14 | - 修复命令面板无法鼠标点击的问题
15 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-blog/images/v1.4.0-agora.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-blog/images/v1.4.0-agora.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/advanced-usage/openapp/create.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | sidebar_position: 2
 3 | title: 创建开放平台应用
 4 | ---
 5 | 
 6 | 安装 `com.msgbyte.openapi` 插件后可以在左下角设置页面看到多出来一个开放API的功能
 7 | 
 8 | ![](/img/advanced-usage/openapp/1.png)
 9 | 
10 | 填入应用名称与应用描述即可
11 | 
12 | ![](/img/advanced-usage/openapp/2.png)
13 | 
14 | 成功后你可以在你的应用列表中看到你的开放平台应用
15 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/advanced-usage/plugins/assets/wxpusher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/advanced-usage/plugins/assets/wxpusher.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/architecture.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | sidebar_position: 3
 3 | title: 系统架构
 4 | ---
 5 | 
 6 | ## 服务端架构
 7 | 
 8 | ![](/img/architecture/backend.excalidraw.svg)
 9 | 
10 | ## 插件机制架构
11 | 
12 | ![](/img/architecture/plugin.excalidraw.svg)
13 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/cli/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "命令行终端",
3 |   "position": 40
4 | }
5 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contribution/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "项目贡献",
3 |   "position": 90
4 | }
5 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contribution/dev/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "开发文档",
3 |   "position": 2
4 | }
5 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "应用部署",
3 |   "position": 10
4 | }
5 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/assets/docker-init.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/assets/docker-init.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt-logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt-logo.jpg


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt1.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt2.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt3.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt4.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/assets/bt5.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/other-way/kubernetes/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "Kubernetes",
3 |   "position": 2
4 | }
5 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/devops/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "运维操作",
3 |   "position": 15
4 | }
5 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/1.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/2.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/3.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/4.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/5.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/6.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/meeting/images/7.png


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/plugins/api/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 |   "label": "API 接口",
3 |   "position": 99
4 | }
5 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/plugins/api/cssvar.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | sidebar_position: 3
 3 | title: 全局CSS变量
 4 | ---
 5 | 
 6 | - `--tc-primary-color`: 主色调
 7 | - `--tc-background-image`: 背景图片
 8 | - `--tc-content-background-image`: 内容页背景图片
 9 | - `--tc-content-background-image-opacity`: 内容页背景图片透明度,默认 **0.15**
10 | 


--------------------------------------------------------------------------------
/website/i18n/zh-Hans/docusaurus-theme-classic/footer.json:
--------------------------------------------------------------------------------
1 | {
2 |   "copyright": {
3 |     "message": "Copyright © 2023 MsgByte, Inc. Built with Docusaurus and ❤.",
4 |     "description": "The footer copyright"
5 |   }
6 | }
7 | 


--------------------------------------------------------------------------------
/website/src/components/HomepageFeatures.module.css:
--------------------------------------------------------------------------------
 1 | /* stylelint-disable docusaurus/copyright-header */
 2 | 
 3 | .features {
 4 |   display: flex;
 5 |   align-items: center;
 6 |   padding: 2rem 0;
 7 |   width: 100%;
 8 | }
 9 | 
10 | .featureSvg {
11 |   height: 200px;
12 |   width: 200px;
13 | }
14 | 


--------------------------------------------------------------------------------
/website/src/pages/markdown-page.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Markdown page example
3 | ---
4 | 
5 | # Markdown page example
6 | 
7 | You don't need React to write simple standalone pages.
8 | 


--------------------------------------------------------------------------------
/website/src/utils/consts.ts:
--------------------------------------------------------------------------------
1 | export const nightlyUrl = 'https://nightly.paw.msgbyte.com/';
2 | 
3 | export const inviteLink = 'https://nightly.paw.msgbyte.com/invite/8Jfm1dWb';
4 | 
5 | export const discordLink = 'https://discord.gg/JmQBGvSEbA';
6 | 
7 | export const releaseNoteUrl = '/blog/tags/release-note';
8 | 


--------------------------------------------------------------------------------
/website/src/utils/useMediumZoom.ts:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react';
2 | import mediumZoom from 'medium-zoom';
3 | 
4 | export function useMediumZoom() {
5 |   useEffect(() => {
6 |     mediumZoom('[data-zoomable]');
7 |   }, []);
8 | }
9 | 


--------------------------------------------------------------------------------
/website/static/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/.nojekyll


--------------------------------------------------------------------------------
/website/static/CNAME:
--------------------------------------------------------------------------------
1 | tailchat.msgbyte.com
2 | 


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/livekit/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/livekit/1.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/livekit/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/livekit/2.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/livekit/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/livekit/3.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/livekit/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/livekit/4.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/livekit/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/livekit/5.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/livekit/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/livekit/6.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/livekit/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/livekit/7.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/livekit/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/livekit/8.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/openapp/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/openapp/1.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/openapp/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/openapp/2.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/openapp/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/openapp/3.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/openapp/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/openapp/4.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/plugins/livekit/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/plugins/livekit/1.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/plugins/livekit/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/plugins/livekit/2.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/plugins/livekit/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/plugins/livekit/3.png


--------------------------------------------------------------------------------
/website/static/img/advanced-usage/plugins/livekit/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/advanced-usage/plugins/livekit/4.png


--------------------------------------------------------------------------------
/website/static/img/architecture/transport.excalidraw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/architecture/transport.excalidraw.png


--------------------------------------------------------------------------------
/website/static/img/avatar/reacher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/avatar/reacher.png


--------------------------------------------------------------------------------
/website/static/img/benchmark/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/benchmark/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/1kstar/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/1kstar/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/1kstar/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/1kstar/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/10.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/11.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/12.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/13.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/14.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/15.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/16.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/17.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/18.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/19.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/20.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/21.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/22.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/4.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/5.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/6.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/7.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/8.png


--------------------------------------------------------------------------------
/website/static/img/blog/intro/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/intro/9.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.10/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.10/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.10/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.10/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.11/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.11/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.12/1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.12/1.gif


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.12/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.12/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.3/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.3/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.3/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.3/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.3/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.3/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.3/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.3/4.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.4/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.4/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.4/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.4/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.4/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.4/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.4/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.4/4.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.4/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.4/5.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.4/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.4/6.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.4/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.4/7.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.5/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.5/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.5/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.5/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.5/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.5/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.5/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.5/4.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.7/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.7/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.7/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.7/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.7/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.7/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.7/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.7/4.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.7/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.7/5.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.7/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.7/6.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.7/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.7/7.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.7/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.7/8.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.8/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.8/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.8/2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.8/2.gif


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.8/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.8/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.9/1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.9/1.gif


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.9/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.9/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.8.9/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.8.9/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.0/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.0/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.1/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.1/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.2/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.2/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.2/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.2/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.2/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.2/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.2/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.2/4.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.4/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.4/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.4/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.4/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.5/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.5/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.5/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.5/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.5/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.5/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.5/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.5/4.png


--------------------------------------------------------------------------------
/website/static/img/blog/release-note/v1.9.5/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/release-note/v1.9.5/5.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/1.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/10.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/11.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/12.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/2.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/3.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/4.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/5.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/6.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/7.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/8.png


--------------------------------------------------------------------------------
/website/static/img/blog/robot-with-laf/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/blog/robot-with-laf/9.png


--------------------------------------------------------------------------------
/website/static/img/docusaurus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/docusaurus.png


--------------------------------------------------------------------------------
/website/static/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/favicon.ico


--------------------------------------------------------------------------------
/website/static/img/gallery/bot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/gallery/bot.png


--------------------------------------------------------------------------------
/website/static/img/gallery/custom-theme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/gallery/custom-theme.png


--------------------------------------------------------------------------------
/website/static/img/gallery/download/desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/gallery/download/desktop.png


--------------------------------------------------------------------------------
/website/static/img/gallery/download/mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/gallery/download/mobile.png


--------------------------------------------------------------------------------
/website/static/img/gallery/group-roles.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/gallery/group-roles.png


--------------------------------------------------------------------------------
/website/static/img/gallery/messenger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/gallery/messenger.png


--------------------------------------------------------------------------------
/website/static/img/gallery/multi-platform-support.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/gallery/multi-platform-support.png


--------------------------------------------------------------------------------
/website/static/img/gallery/plugin-center.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/gallery/plugin-center.png


--------------------------------------------------------------------------------
/website/static/img/github-app/github-integration.excalidraw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/github-app/github-integration.excalidraw.png


--------------------------------------------------------------------------------
/website/static/img/github-app/github-new-app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/github-app/github-new-app.png


--------------------------------------------------------------------------------
/website/static/img/hero-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/hero-dark.png


--------------------------------------------------------------------------------
/website/static/img/hero-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/hero-light.png


--------------------------------------------------------------------------------
/website/static/img/intro/admin-network.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/intro/admin-network.png


--------------------------------------------------------------------------------
/website/static/img/intro/ai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/intro/ai.png


--------------------------------------------------------------------------------
/website/static/img/intro/github-bot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/intro/github-bot.png


--------------------------------------------------------------------------------
/website/static/img/intro/hello.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/intro/hello.png


--------------------------------------------------------------------------------
/website/static/img/intro/plugins.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/intro/plugins.png


--------------------------------------------------------------------------------
/website/static/img/intro/roles.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/intro/roles.png


--------------------------------------------------------------------------------
/website/static/img/intro/theme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/intro/theme.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/1.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/10.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/11.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/12.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/13.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/14.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/15.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/16.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/17.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/2.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/3.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/4.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/5.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/6.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/7.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/8.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/sealos/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/sealos/9.png


--------------------------------------------------------------------------------
/website/static/img/kubernetes/traefik-svc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/kubernetes/traefik-svc.png


--------------------------------------------------------------------------------
/website/static/img/logo@192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/logo@192.png


--------------------------------------------------------------------------------
/website/static/img/misc/getui.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/misc/getui.png


--------------------------------------------------------------------------------
/website/static/img/misc/memory-usage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/misc/memory-usage.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/docsVersionDropdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/docsVersionDropdown.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/localeDropdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/localeDropdown.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/1.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/10.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/2.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/3.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/4.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/5.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/6.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/7.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/8.png


--------------------------------------------------------------------------------
/website/static/img/tutorial/plugin/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/tutorial/plugin/9.png


--------------------------------------------------------------------------------
/website/static/img/wechat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/wechat.jpg


--------------------------------------------------------------------------------
/website/static/img/wechat2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msgbyte/tailchat/5a21d630e508c12f2474af28854b54fe06d5ac49/website/static/img/wechat2.jpg


--------------------------------------------------------------------------------
/website/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 |   "extends": "@tsconfig/docusaurus/tsconfig.json",
3 |   "compilerOptions": {
4 |     "resolveJsonModule": true
5 |   },
6 |   "include": ["src/"]
7 | }
8 | 


--------------------------------------------------------------------------------