lobehub/vite.config.ts
Rdmclin2 965fc929e1
feat: add unified messaging tool for cross-platform communication (#13296)
*  feat: add cross-platform message tool for AI bot channel operations

Implement a unified message tool (`lobe-message`) that provides AI with
messaging capabilities across Discord, Telegram, Slack, Google Chat,
and IRC through a single interface with platform-specific extensions.

Core APIs: sendMessage, readMessages, editMessage, deleteMessage,
searchMessages, reactToMessage, getReactions, pin/unpin management,
channel/member info, thread operations, and polls.

Architecture follows the established builtin-tool pattern:
- Package: @lobechat/builtin-tool-message (manifest, types, executor,
  ExecutionRuntime, client components)
- Registry: registered in builtin-tools (renders, inspectors,
  interventions, streamings)
- Server runtime: stub service ready for platform adapter integration

https://claude.ai/code/session_011sHc6R7V4cSYKere9RY1QM

* feat: implement platform specific message service

* chore: add wechat platform

* chore: update wechat api service

* chore: update protocol implementation

* chore: optimize  platform api test

* fix: lark domain error

* feat: support bot message cli

* chore: refactor adapter to service

* chore: optimize bot status fetch

* fix: bot status

* fix: channel nav ignore

* feat: message tool support bot manage

* feat: add lobe-message runtime

* feat: support direct message

* feat: add history limit

* chore: update const limit

* feat: optimize  server id message history limit

* chore: optimize system role & inject platform environment info

* chore: update  readMessages vibe

* fix: form body width 50%

* chore: optimize tool prompt

* chore: update i18n files

* chore: optimize read message system role and update bot message lh

* updage readMessage api rate limit

* chore: comatible for readMessages

* fix: feishu readMessage implementation error

* fix: test case

* chore: update i18n files

* fix: lint error

* chore: add timeout for conversaction case

* fix: message test case

* fix: vite gzip error

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-31 00:26:32 +08:00

165 lines
5.7 KiB
TypeScript

import { resolve } from 'node:path';
import type { PluginOption, ViteDevServer } from 'vite';
import { defineConfig, loadEnv } from 'vite';
import { VitePWA } from 'vite-plugin-pwa';
import { viteEnvRestartKeys } from './plugins/vite/envRestartKeys';
import {
sharedOptimizeDeps,
sharedRendererDefine,
sharedRendererPlugins,
sharedRollupOutput,
} from './plugins/vite/sharedRendererConfig';
import { vercelSkewProtection } from './plugins/vite/vercelSkewProtection';
const isMobile = process.env.MOBILE === 'true';
const mode = process.env.NODE_ENV === 'production' ? 'production' : 'development';
Object.assign(process.env, loadEnv(mode, process.cwd(), ''));
const isDev = process.env.NODE_ENV !== 'production';
const platform = isMobile ? 'mobile' : 'web';
export default defineConfig({
base: isDev ? '/' : process.env.VITE_CDN_BASE || '/_spa/',
build: {
outDir: isMobile ? 'dist/mobile' : 'dist/desktop',
reportCompressedSize: false,
rollupOptions: {
input: resolve(__dirname, isMobile ? 'index.mobile.html' : 'index.html'),
output: sharedRollupOutput,
},
},
define: sharedRendererDefine({ isMobile, isElectron: false }),
optimizeDeps: sharedOptimizeDeps,
plugins: [
vercelSkewProtection(),
viteEnvRestartKeys(['APP_URL']),
...sharedRendererPlugins({ platform }),
isDev && {
name: 'lobe-dev-proxy-print',
configureServer(server: ViteDevServer) {
const ONLINE_HOST = 'https://app.lobehub.com';
const c = {
green: (s: string) => `\x1B[32m${s}\x1B[0m`,
bold: (s: string) => `\x1B[1m${s}\x1B[0m`,
cyan: (s: string) => `\x1B[36m${s}\x1B[0m`,
};
const { info } = server.config.logger;
return () => {
server.printUrls = () => {
const urls = server.resolvedUrls;
if (!urls?.local?.[0]) return;
const localHost = urls.local[0].replace(/\/$/, '');
const proxyUrl = `${ONLINE_HOST}/_dangerous_local_dev_proxy?debug-host=${encodeURIComponent(localHost)}`;
const colorUrl = (url: string) =>
c.cyan(url.replace(/:(\d+)\//, (_, port) => `:${c.bold(port)}/`));
info(` ${c.green('➜')} ${c.bold('Debug Proxy')}: ${colorUrl(proxyUrl)}`);
};
};
},
},
VitePWA({
injectRegister: null,
manifest: false,
registerType: 'prompt',
workbox: {
globPatterns: ['**/*.{js,css,html,woff2}'],
maximumFileSizeToCacheInBytes: 10 * 1024 * 1024,
runtimeCaching: [
{
handler: 'StaleWhileRevalidate',
options: { cacheName: 'google-fonts-stylesheets' },
urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
},
{
handler: 'CacheFirst',
options: {
cacheName: 'google-fonts-webfonts',
expiration: { maxAgeSeconds: 60 * 60 * 24 * 365, maxEntries: 30 },
},
urlPattern: /^https:\/\/fonts\.gstatic\.com\/.*/i,
},
{
handler: 'StaleWhileRevalidate',
options: {
cacheName: 'image-assets',
expiration: { maxAgeSeconds: 60 * 60 * 24 * 30, maxEntries: 100 },
},
urlPattern: /\.(?:png|jpg|jpeg|svg|gif|webp|ico|avif)$/i,
},
{
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
expiration: { maxAgeSeconds: 60 * 5, maxEntries: 50 },
},
urlPattern: /\/(api|trpc)\/.*/i,
},
],
},
}),
].filter(Boolean) as PluginOption[],
server: {
cors: true,
port: 9876,
host: true,
proxy: {
'/api': `http://localhost:${process.env.PORT || 3010}`,
'/oidc': `http://localhost:${process.env.PORT || 3010}`,
'/trpc': `http://localhost:${process.env.PORT || 3010}`,
'/webapi': `http://localhost:${process.env.PORT || 3010}`,
},
warmup: {
clientFiles: [
// src/ business code
'./src/initialize.ts',
'./src/spa/**/*.tsx',
'./src/business/**/*.{ts,tsx}',
'./src/components/**/*.{ts,tsx}',
'./src/config/**/*.ts',
'./src/const/**/*.ts',
'./src/envs/**/*.ts',
'./src/features/**/*.{ts,tsx}',
'./src/helpers/**/*.ts',
'./src/hooks/**/*.{ts,tsx}',
'./src/layout/**/*.{ts,tsx}',
'./src/libs/**/*.{ts,tsx}',
'./src/locales/**/*.ts',
'./src/routes/**/*.{ts,tsx}',
'./src/services/**/*.ts',
'./src/store/**/*.{ts,tsx}',
'./src/styles/**/*.ts',
'./src/utils/**/*.{ts,tsx}',
// monorepo packages
'./packages/types/src/**/*.ts',
'./packages/const/src/**/*.ts',
'./packages/utils/src/**/*.ts',
'./packages/context-engine/src/**/*.ts',
'./packages/prompts/src/**/*.ts',
'./packages/model-bank/src/**/*.ts',
'./packages/model-runtime/src/**/*.ts',
'./packages/agent-runtime/src/**/*.ts',
'./packages/conversation-flow/src/**/*.ts',
'./packages/electron-client-ipc/src/**/*.ts',
'./packages/builtin-agents/src/**/*.ts',
'./packages/builtin-skills/src/**/*.ts',
'./packages/builtin-tool-*/src/**/*.ts',
'./packages/builtin-tools/src/**/*.ts',
'./packages/business/*/src/**/*.ts',
'./packages/config/src/**/*.ts',
'./packages/edge-config/src/**/*.ts',
'./packages/editor-runtime/src/**/*.ts',
'./packages/fetch-sse/src/**/*.ts',
'./packages/desktop-bridge/src/**/*.ts',
'./packages/python-interpreter/src/**/*.ts',
'./packages/agent-manager-runtime/src/**/*.ts',
],
},
},
});