feat(hermes): add bundled plugin channel configs

This commit is contained in:
晴天
2026-05-24 05:12:17 +08:00
parent b3d763c46a
commit ff4da27eeb
9 changed files with 1683 additions and 31 deletions

View File

@@ -87,11 +87,112 @@ const CHANNELS = [
{ key: 'clientSecret', labelKey: 'engine.hermesChannelDingTalkClientSecret', type: 'password', placeholder: 'client secret' },
],
},
{
id: 'teams',
icon: 'users',
titleKey: 'engine.hermesChannelTeams',
descKey: 'engine.hermesChannelTeamsDesc',
secretFields: ['clientId', 'clientSecret', 'tenantId'],
fields: [
{ key: 'clientId', labelKey: 'engine.hermesChannelTeamsClientId', type: 'text', placeholder: '00000000-0000-0000-0000-000000000000' },
{ key: 'clientSecret', labelKey: 'engine.hermesChannelTeamsClientSecret', type: 'password', placeholder: 'client secret' },
{ key: 'tenantId', labelKey: 'engine.hermesChannelTeamsTenantId', type: 'text', placeholder: '00000000-0000-0000-0000-000000000000' },
{ key: 'port', labelKey: 'engine.hermesChannelPort', type: 'number', placeholder: '3978' },
{ key: 'serviceUrl', labelKey: 'engine.hermesChannelServiceUrl', type: 'url', placeholder: 'https://smba.trafficmanager.net/teams/' },
],
policyFields: [
{ key: 'allowFrom', labelKey: 'engine.hermesChannelAllowedUsers', type: 'textarea', placeholderKey: 'engine.hermesChannelTeamsAllowedUsersPh' },
{ key: 'allowAllUsers', labelKey: 'engine.hermesChannelAllowAllUsers', type: 'checkbox' },
{ key: 'homeChannel', labelKey: 'engine.hermesChannelHomeChannel', type: 'text', placeholder: '19:xxx@thread.tacv2' },
{ key: 'homeChannelName', labelKey: 'engine.hermesChannelHomeChannelName', type: 'text', placeholder: 'ops' },
],
},
{
id: 'google_chat',
icon: 'message-square',
titleKey: 'engine.hermesChannelGoogleChat',
descKey: 'engine.hermesChannelGoogleChatDesc',
secretFields: ['projectId', 'serviceAccountJson'],
fields: [
{ key: 'projectId', labelKey: 'engine.hermesChannelGoogleProjectId', type: 'text', placeholder: 'my-gcp-project' },
{ key: 'subscriptionName', labelKey: 'engine.hermesChannelGoogleSubscriptionName', type: 'text', placeholder: 'projects/my-gcp-project/subscriptions/hermes' },
{ key: 'serviceAccountJson', labelKey: 'engine.hermesChannelGoogleServiceAccount', type: 'password', placeholderKey: 'engine.hermesChannelGoogleServiceAccountPh' },
],
policyFields: [
{ key: 'allowFrom', labelKey: 'engine.hermesChannelAllowedUsers', type: 'textarea', placeholderKey: 'engine.hermesChannelGoogleAllowedUsersPh' },
{ key: 'allowAllUsers', labelKey: 'engine.hermesChannelAllowAllUsers', type: 'checkbox' },
{ key: 'homeChannel', labelKey: 'engine.hermesChannelHomeChannel', type: 'text', placeholder: 'spaces/AAAA...' },
{ key: 'homeChannelName', labelKey: 'engine.hermesChannelHomeChannelName', type: 'text', placeholder: 'ops-space' },
],
},
{
id: 'irc',
icon: 'hash',
titleKey: 'engine.hermesChannelIrc',
descKey: 'engine.hermesChannelIrcDesc',
secretFields: ['server', 'serverPassword', 'nickservPassword'],
fields: [
{ key: 'server', labelKey: 'engine.hermesChannelIrcServer', type: 'text', placeholder: 'irc.libera.chat' },
{ key: 'port', labelKey: 'engine.hermesChannelPort', type: 'number', placeholder: '6697' },
{ key: 'nickname', labelKey: 'engine.hermesChannelIrcNickname', type: 'text', placeholder: 'hermes-bot' },
{ key: 'channel', labelKey: 'engine.hermesChannelIrcChannel', type: 'text', placeholder: '#hermes' },
{ key: 'serverPassword', labelKey: 'engine.hermesChannelIrcServerPassword', type: 'password', placeholder: 'optional' },
{ key: 'nickservPassword', labelKey: 'engine.hermesChannelIrcNickservPassword', type: 'password', placeholder: 'optional' },
],
toggles: [
{ key: 'useTls', labelKey: 'engine.hermesChannelIrcUseTls' },
],
policyFields: [
{ key: 'allowFrom', labelKey: 'engine.hermesChannelAllowedUsers', type: 'textarea', placeholderKey: 'engine.hermesChannelIrcAllowedUsersPh' },
{ key: 'allowAllUsers', labelKey: 'engine.hermesChannelAllowAllUsers', type: 'checkbox' },
{ key: 'homeChannel', labelKey: 'engine.hermesChannelHomeChannel', type: 'text', placeholder: '#reports' },
{ key: 'homeChannelName', labelKey: 'engine.hermesChannelHomeChannelName', type: 'text', placeholder: 'reports' },
],
},
{
id: 'line',
icon: 'message-circle',
titleKey: 'engine.hermesChannelLine',
descKey: 'engine.hermesChannelLineDesc',
secretFields: ['channelAccessToken', 'channelSecret'],
fields: [
{ key: 'channelAccessToken', labelKey: 'engine.hermesChannelLineAccessToken', type: 'password', placeholder: 'LINE channel access token' },
{ key: 'channelSecret', labelKey: 'engine.hermesChannelLineSecret', type: 'password', placeholder: 'LINE channel secret' },
{ key: 'port', labelKey: 'engine.hermesChannelPort', type: 'number', placeholder: '8646' },
{ key: 'host', labelKey: 'engine.hermesChannelHost', type: 'text', placeholder: '0.0.0.0' },
{ key: 'publicUrl', labelKey: 'engine.hermesChannelPublicUrl', type: 'url', placeholder: 'https://line.example.com' },
],
policyFields: [
{ key: 'allowFrom', labelKey: 'engine.hermesChannelAllowedUsers', type: 'textarea', placeholderKey: 'engine.hermesChannelLineAllowedUsersPh' },
{ key: 'allowedGroups', labelKey: 'engine.hermesChannelLineAllowedGroups', type: 'textarea', placeholderKey: 'engine.hermesChannelLineAllowedGroupsPh' },
{ key: 'allowedRooms', labelKey: 'engine.hermesChannelLineAllowedRooms', type: 'textarea', placeholderKey: 'engine.hermesChannelLineAllowedRoomsPh' },
{ key: 'allowAllUsers', labelKey: 'engine.hermesChannelAllowAllUsers', type: 'checkbox' },
{ key: 'homeChannel', labelKey: 'engine.hermesChannelHomeChannel', type: 'text', placeholder: 'Uxxxxxxxx' },
{ key: 'slowResponseThreshold', labelKey: 'engine.hermesChannelLineSlowResponse', type: 'number', placeholder: '45' },
],
},
{
id: 'simplex',
icon: 'radio',
titleKey: 'engine.hermesChannelSimpleX',
descKey: 'engine.hermesChannelSimpleXDesc',
secretFields: ['wsUrl'],
fields: [
{ key: 'wsUrl', labelKey: 'engine.hermesChannelSimpleXWsUrl', type: 'url', placeholder: 'ws://127.0.0.1:5225' },
],
policyFields: [
{ key: 'allowFrom', labelKey: 'engine.hermesChannelAllowedUsers', type: 'textarea', placeholderKey: 'engine.hermesChannelSimpleXAllowedUsersPh' },
{ key: 'allowAllUsers', labelKey: 'engine.hermesChannelAllowAllUsers', type: 'checkbox' },
{ key: 'homeChannel', labelKey: 'engine.hermesChannelHomeChannel', type: 'text', placeholder: 'group:ops' },
{ key: 'homeChannelName', labelKey: 'engine.hermesChannelHomeChannelName', type: 'text', placeholder: 'Ops' },
],
},
]
const COMMON_FIELDS = [
const LEGACY_POLICY_FIELDS = [
{ key: 'dmPolicy', labelKey: 'engine.hermesChannelDmPolicy', type: 'select', options: [['pair', 'engine.hermesChannelPolicyPair'], ['open', 'engine.hermesChannelPolicyOpen'], ['allowlist', 'engine.hermesChannelPolicyAllowlist'], ['disabled', 'engine.hermesChannelPolicyDisabled']] },
{ key: 'groupPolicy', labelKey: 'engine.hermesChannelGroupPolicy', type: 'select', options: [['allowlist', 'engine.hermesChannelPolicyAllowlist'], ['open', 'engine.hermesChannelPolicyOpen'], ['disabled', 'engine.hermesChannelPolicyDisabled']] },
{ key: 'requireMention', labelKey: 'engine.hermesChannelRequireMention', type: 'checkbox' },
{ key: 'allowFrom', labelKey: 'engine.hermesChannelAllowFrom', type: 'textarea', placeholderKey: 'engine.hermesChannelAllowFromPlaceholder' },
{ key: 'groupAllowFrom', labelKey: 'engine.hermesChannelGroupAllowFrom', type: 'textarea', placeholderKey: 'engine.hermesChannelGroupAllowFromPlaceholder' },
]
@@ -109,13 +210,14 @@ function channelMeta(id) {
}
function defaultForm(platform) {
const form = {
enabled: false,
dmPolicy: 'pair',
groupPolicy: 'allowlist',
allowFrom: '',
groupAllowFrom: '',
requireMention: true,
const channel = channelMeta(platform)
const form = { enabled: false }
if (!channel.policyFields) {
form.dmPolicy = 'pair'
form.groupPolicy = 'allowlist'
form.allowFrom = ''
form.groupAllowFrom = ''
form.requireMention = true
}
if (platform === 'feishu') {
form.domain = 'feishu'
@@ -152,6 +254,15 @@ function isConfigured(channel, form) {
function renderField(field, form, disabled) {
const value = valueOf(form, field.key)
const label = esc(t(field.labelKey))
const placeholder = field.placeholderKey ? t(field.placeholderKey) : (field.placeholder || '')
if (field.type === 'checkbox') {
return `
<label class="hm-channel-check">
<input class="hm-channel-input" data-key="${esc(field.key)}" type="checkbox" ${form[field.key] ? 'checked' : ''} ${disabled ? 'disabled' : ''}>
<span>${label}</span>
</label>
`
}
if (field.type === 'select') {
return `
<label class="hm-field">
@@ -168,14 +279,14 @@ function renderField(field, form, disabled) {
return `
<label class="hm-field">
<span class="hm-field-label">${label}</span>
<textarea class="hm-input hm-channel-input hm-channel-textarea" data-key="${esc(field.key)}" ${disabled ? 'disabled' : ''} placeholder="${esc(t(field.placeholderKey))}">${esc(value)}</textarea>
<textarea class="hm-input hm-channel-input hm-channel-textarea" data-key="${esc(field.key)}" ${disabled ? 'disabled' : ''} placeholder="${esc(placeholder)}">${esc(value)}</textarea>
</label>
`
}
return `
<label class="hm-field">
<span class="hm-field-label">${label}</span>
<input class="hm-input hm-channel-input" data-key="${esc(field.key)}" type="${esc(field.type || 'text')}" value="${esc(value)}" ${disabled ? 'disabled' : ''} placeholder="${esc(field.placeholder || '')}" autocomplete="off">
<input class="hm-input hm-channel-input" data-key="${esc(field.key)}" type="${esc(field.type || 'text')}" value="${esc(value)}" ${disabled ? 'disabled' : ''} placeholder="${esc(placeholder)}" autocomplete="off">
</label>
`
}
@@ -208,6 +319,9 @@ export function render() {
const channel = channelMeta(active)
const form = normalizeForm(active, values[active])
const disabled = loading || saving
const policyFields = channel.policyFields || LEGACY_POLICY_FIELDS
const policyInputs = policyFields.filter(field => field.type !== 'checkbox')
const policyToggles = policyFields.filter(field => field.type === 'checkbox')
const enabledCount = CHANNELS.filter(item => normalizeForm(item.id, values[item.id]).enabled).length
const configuredCount = CHANNELS.filter(item => isConfigured(item, normalizeForm(item.id, values[item.id]))).length
@@ -295,16 +409,16 @@ export function render() {
<div class="hm-channel-section">
<div class="hm-channel-section-title">${esc(t('engine.hermesChannelAccessPolicy'))}</div>
<div class="hm-field-row">
${COMMON_FIELDS.slice(0, 2).map(field => renderField(field, form, disabled)).join('')}
</div>
<label class="hm-channel-check hm-channel-check--wide">
<input class="hm-channel-input" data-key="requireMention" type="checkbox" ${form.requireMention ? 'checked' : ''} ${disabled ? 'disabled' : ''}>
<span>${esc(t('engine.hermesChannelRequireMention'))}</span>
</label>
<div class="hm-field-row">
${COMMON_FIELDS.slice(2).map(field => renderField(field, form, disabled)).join('')}
</div>
${policyInputs.length ? `
<div class="hm-field-row">
${policyInputs.map(field => renderField(field, form, disabled)).join('')}
</div>
` : ''}
${policyToggles.length ? `
<div class="hm-channel-toggle-grid">
${policyToggles.map(field => renderField(field, form, disabled)).join('')}
</div>
` : ''}
</div>
${(channel.advancedFields || []).length ? `

View File

@@ -558,7 +558,8 @@
justify-content: center;
gap: 7px;
padding: 9px 18px;
height: 38px;
min-height: 44px;
height: 44px;
border-radius: var(--hm-radius-sm);
border: 1px solid var(--hm-border-strong);
background: transparent;
@@ -585,8 +586,9 @@
}
[data-engine="hermes"] .hm-btn--sm {
height: 30px;
padding: 4px 12px;
min-height: 44px;
height: 44px;
padding: 8px 14px;
font-size: 12px;
}
@@ -742,7 +744,8 @@
font-size: 13px;
line-height: 1.5;
padding: 10px 14px;
height: 40px;
min-height: 44px;
height: 44px;
border: 1px solid var(--hm-border);
background: var(--hm-surface-0);
color: var(--hm-text-primary);
@@ -1061,6 +1064,8 @@ body[data-active-engine="hermes"] .sidebar-title {
}
body[data-active-engine="hermes"] .sidebar-collapse-btn,
body[data-active-engine="hermes"] .sidebar-close-btn {
min-width: 44px;
min-height: 44px;
color: #A8A29E;
background: transparent;
border: none;
@@ -1089,6 +1094,7 @@ body[data-active-engine="hermes"] .engine-switcher-label {
padding: 0 4px 8px;
}
body[data-active-engine="hermes"] .engine-current {
min-height: 44px;
padding: 10px 12px;
border: 1px solid rgba(202, 138, 4, 0.25);
border-radius: 6px;
@@ -1142,6 +1148,7 @@ body[data-active-engine="hermes"] .sidebar-nav {
padding: 4px 10px;
}
body[data-active-engine="hermes"] .nav-item {
min-height: 44px;
padding: 9px 14px;
border-radius: 6px;
color: #44403C;
@@ -1190,6 +1197,7 @@ body[data-active-engine="hermes"] .sidebar-footer {
}
body[data-active-engine="hermes"] #btn-theme-toggle,
body[data-active-engine="hermes"] .lang-trigger {
min-height: 44px;
padding: 8px 14px;
border-radius: 6px;
color: #78716C;
@@ -1207,6 +1215,9 @@ body[data-active-engine="hermes"] .lang-dropdown {
box-shadow: 0 -4px 16px rgba(28, 25, 23, 0.08);
border-radius: 8px;
}
body[data-active-engine="hermes"] .lang-search {
min-height: 44px;
}
body[data-active-engine="hermes"] .lang-option {
padding: 8px 12px;
border-radius: 4px;

View File

@@ -923,11 +923,21 @@ export default {
hermesChannelSlack: _('Slack', 'Slack', 'Slack'),
hermesChannelFeishu: _('飞书 / Lark', 'Feishu / Lark', '飛書 / Lark'),
hermesChannelDingTalk: _('钉钉', 'DingTalk', '釘釘'),
hermesChannelTeams: _('Microsoft Teams', 'Microsoft Teams', 'Microsoft Teams'),
hermesChannelGoogleChat: _('Google Chat', 'Google Chat', 'Google Chat'),
hermesChannelIrc: _('IRC', 'IRC', 'IRC'),
hermesChannelLine: _('LINE', 'LINE', 'LINE'),
hermesChannelSimpleX: _('SimpleX', 'SimpleX', 'SimpleX'),
hermesChannelTelegramDesc: _('通过 Telegram Bot 与 Hermes 对话,适合个人私聊和小群组。', 'Talk to Hermes through a Telegram bot for direct chats and small groups.', '透過 Telegram Bot 與 Hermes 對話,適合個人私聊和小群組。'),
hermesChannelDiscordDesc: _('连接 Discord Bot支持服务器频道和线程里的 Agent 会话。', 'Connect a Discord bot for server channels and threaded agent sessions.', '連接 Discord Bot支援伺服器頻道和討論串裡的 Agent 會話。'),
hermesChannelSlackDesc: _('连接 Slack Bot可用于团队频道、私信和工作流通知。', 'Connect a Slack bot for team channels, direct messages, and workflow notifications.', '連接 Slack Bot可用於團隊頻道、私訊和工作流通知。'),
hermesChannelFeishuDesc: _('连接飞书或 Lark 应用,支持长连接和 Webhook 两种模式。', 'Connect a Feishu or Lark app with WebSocket or webhook mode.', '連接飛書或 Lark 應用,支援長連線和 Webhook 兩種模式。'),
hermesChannelDingTalkDesc: _('连接钉钉机器人应用,支持群聊白名单、用户白名单和 @Bot 唤醒策略。', 'Connect a DingTalk robot app with group allowlists, user allowlists, and @mention wake rules.', '連接釘釘機器人應用,支援群聊白名單、使用者白名單和 @Bot 喚醒策略。'),
hermesChannelTeamsDesc: _('连接 Microsoft Teams Bot支持服务 URL、用户白名单和默认频道。', 'Connect a Microsoft Teams bot with service URL, user allowlists, and a home channel.', '連接 Microsoft Teams Bot支援服務 URL、使用者白名單和預設頻道。'),
hermesChannelGoogleChatDesc: _('连接 Google Chat Pub/Sub 应用,支持项目订阅、服务账号和空间白名单。', 'Connect a Google Chat Pub/Sub app with project subscriptions, service accounts, and space allowlists.', '連接 Google Chat Pub/Sub 應用,支援專案訂閱、服務帳號和空間白名單。'),
hermesChannelIrcDesc: _('连接 IRC 网络,支持 TLS、NickServ 密码、频道和用户白名单。', 'Connect an IRC network with TLS, NickServ passwords, channels, and user allowlists.', '連接 IRC 網路,支援 TLS、NickServ 密碼、頻道和使用者白名單。'),
hermesChannelLineDesc: _('连接 LINE Messaging API支持 Webhook、用户、群组和聊天室白名单。', 'Connect LINE Messaging API with webhook, user, group, and room allowlists.', '連接 LINE Messaging API支援 Webhook、使用者、群組和聊天室白名單。'),
hermesChannelSimpleXDesc: _('连接 SimpleX WebSocket 网关,支持联系人白名单和默认会话。', 'Connect a SimpleX WebSocket gateway with contact allowlists and a home conversation.', '連接 SimpleX WebSocket 閘道,支援聯絡人白名單和預設會話。'),
hermesChannelEnabled: _('已启用', 'Enabled', '已啟用'),
hermesChannelDisabled: _('未启用', 'Disabled', '未啟用'),
hermesChannelSave: _('保存渠道', 'Save Channel', '儲存頻道'),
@@ -964,6 +974,40 @@ export default {
hermesChannelFeishuAppSecret: _('App Secret', 'App Secret', 'App Secret'),
hermesChannelDingTalkClientId: _('Client ID / App Key', 'Client ID / App Key', 'Client ID / App Key'),
hermesChannelDingTalkClientSecret: _('Client Secret', 'Client Secret', 'Client Secret'),
hermesChannelTeamsClientId: _('Client ID', 'Client ID', 'Client ID'),
hermesChannelTeamsClientSecret: _('Client Secret', 'Client Secret', 'Client Secret'),
hermesChannelTeamsTenantId: _('Tenant ID', 'Tenant ID', 'Tenant ID'),
hermesChannelGoogleProjectId: _('Project ID', 'Project ID', 'Project ID'),
hermesChannelGoogleSubscriptionName: _('订阅名称', 'Subscription Name', '訂閱名稱'),
hermesChannelGoogleServiceAccount: _('服务账号 JSON / 文件路径', 'Service Account JSON / Path', '服務帳號 JSON / 檔案路徑'),
hermesChannelGoogleServiceAccountPh: _('可填写 JSON 内容或凭证文件路径。', 'Enter JSON content or a credentials file path.', '可填寫 JSON 內容或憑證檔案路徑。'),
hermesChannelIrcServer: _('服务器', 'Server', '伺服器'),
hermesChannelIrcNickname: _('昵称', 'Nickname', '暱稱'),
hermesChannelIrcChannel: _('频道', 'Channel', '頻道'),
hermesChannelIrcServerPassword: _('服务器密码', 'Server Password', '伺服器密碼'),
hermesChannelIrcNickservPassword: _('NickServ 密码', 'NickServ Password', 'NickServ 密碼'),
hermesChannelIrcUseTls: _('启用 TLS', 'Use TLS', '啟用 TLS'),
hermesChannelLineAccessToken: _('Channel Access Token', 'Channel Access Token', 'Channel Access Token'),
hermesChannelLineSecret: _('Channel Secret', 'Channel Secret', 'Channel Secret'),
hermesChannelLineAllowedGroups: _('允许群组', 'Allowed Groups', '允許群組'),
hermesChannelLineAllowedRooms: _('允许聊天室', 'Allowed Rooms', '允許聊天室'),
hermesChannelLineSlowResponse: _('慢响应阈值(秒)', 'Slow Response Threshold (seconds)', '慢回應閾值(秒)'),
hermesChannelSimpleXWsUrl: _('WebSocket 地址', 'WebSocket URL', 'WebSocket 位址'),
hermesChannelPort: _('端口', 'Port', '連接埠'),
hermesChannelHost: _('监听地址', 'Host', '監聽位址'),
hermesChannelPublicUrl: _('公开 URL', 'Public URL', '公開 URL'),
hermesChannelServiceUrl: _('服务 URL', 'Service URL', '服務 URL'),
hermesChannelAllowedUsers: _('允许用户', 'Allowed Users', '允許使用者'),
hermesChannelAllowAllUsers: _('允许所有用户', 'Allow all users', '允許所有使用者'),
hermesChannelHomeChannel: _('默认会话 / 频道', 'Home Conversation / Channel', '預設會話 / 頻道'),
hermesChannelHomeChannelName: _('默认会话名称', 'Home Conversation Name', '預設會話名稱'),
hermesChannelTeamsAllowedUsersPh: _('每行或逗号分隔一个 Microsoft Entra 用户 ID。', 'One Microsoft Entra user ID per line or comma-separated.', '每行或逗號分隔一個 Microsoft Entra 使用者 ID。'),
hermesChannelGoogleAllowedUsersPh: _('每行或逗号分隔一个 Google Chat 用户或空间 ID。', 'One Google Chat user or space ID per line or comma-separated.', '每行或逗號分隔一個 Google Chat 使用者或空間 ID。'),
hermesChannelIrcAllowedUsersPh: _('每行或逗号分隔一个 IRC nick。', 'One IRC nick per line or comma-separated.', '每行或逗號分隔一個 IRC nick。'),
hermesChannelLineAllowedUsersPh: _('每行或逗号分隔一个 LINE 用户 ID。', 'One LINE user ID per line or comma-separated.', '每行或逗號分隔一個 LINE 使用者 ID。'),
hermesChannelLineAllowedGroupsPh: _('每行或逗号分隔一个 LINE 群组 ID。', 'One LINE group ID per line or comma-separated.', '每行或逗號分隔一個 LINE 群組 ID。'),
hermesChannelLineAllowedRoomsPh: _('每行或逗号分隔一个 LINE 聊天室 ID。', 'One LINE room ID per line or comma-separated.', '每行或逗號分隔一個 LINE 聊天室 ID。'),
hermesChannelSimpleXAllowedUsersPh: _('每行或逗号分隔一个 SimpleX 联系人或群组标识。', 'One SimpleX contact or group identifier per line or comma-separated.', '每行或逗號分隔一個 SimpleX 聯絡人或群組識別。'),
hermesChannelFeishuDomain: _('区域', 'Region', '區域'),
hermesChannelFeishuDomainCn: _('中国大陆feishu', 'Mainland China (feishu)', '中國大陸feishu'),
hermesChannelFeishuDomainIntl: _('国际版lark', 'International (lark)', '國際版lark'),

View File

@@ -746,8 +746,8 @@
flex-shrink: 0;
}
.mobile-hamburger {
width: 36px;
height: 36px;
width: 44px;
height: 44px;
border-radius: 8px;
background: none;
border: 1px solid var(--border-primary);