├── .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(); 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: ['/src/', '/test/'], 3 | transform: { 4 | '^.+\\.tsx?$': 'ts-jest', 5 | }, 6 | testRegex: '(/__tests__/.*|\\.(test|spec))\\.[tj]sx?$', 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 | 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()).toBeTruthy(); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /client/desktop/src/renderer/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | Tailchat 10 | 11 | 12 |
13 | 14 | 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(); 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 | 2 | Tailchat 3 | 4 | -------------------------------------------------------------------------------- /client/mobile/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 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 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /client/mobile/ios/Tailchat.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /client/mobile/ios/Tailchat.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 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 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 = React.memo((props) => { 5 | return {props.children}; 6 | }); 7 | Highlight.displayName = 'Highlight'; 8 | -------------------------------------------------------------------------------- /client/packages/design/components/Introduction.stories.mdx: -------------------------------------------------------------------------------- 1 | 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(state: T): T | undefined { 4 | const ref = useRef(); 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(state: T): MutableRefObject { 4 | const ref = useRef(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, 't'>; 5 | export const Trans: React.FC = React.memo((props) => { 6 | return {props.children}; 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>('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(); 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 2 | ? T 3 | : never; 4 | 5 | export type FunctionReturningPromise = (...args: any[]) => Promise; 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 { 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 { 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; 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 = React.memo((props) => { 5 | const { node } = props; 6 | const text = node.content.join(''); 7 | 8 | return {text}; 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 = React.memo((props) => { 5 | const { node } = props; 6 | const text = node.content.join(''); 7 | 8 | return {text}; 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 = React.memo((props) => { 5 | const { node } = props; 6 | const text = node.content.join(''); 7 | 8 | return {text}; 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

开发中
; 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; 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 ; 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 ; 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(); 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(); 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(); 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 |
5 | 8 | Any Text 9 | 10 |
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 |
5 | [iconify icon="mdi:loading"] 6 |
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(''); 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 ; 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 | 8 | ); 9 | -------------------------------------------------------------------------------- /server/admin/src/client/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 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; 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 | 3 | 4 | 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 | --------------------------------------------------------------------------------