From 97b6ae23d77b9e43b35925351251378e3001dd1e Mon Sep 17 00:00:00 2001 From: 47Seek <229621367+47seek@users.noreply.github.com> Date: Fri, 9 Oct 2026 18:53:43 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"feat(lark):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=A3=9E=E4=B9=A6=E5=8D=A1=E7=89=87=E9=BB=98=E8=AE=A4=E9=A1=B5?= =?UTF-8?q?=E8=84=9A=E6=96=87=E6=A1=88=20(#1738)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restores the plain [botmux](https://github.com/deepcoldy/botmux) default footer brand. The "Powered by ... with ❤" copy was not on any previous release and was not wanted on the fleet cards. Co-Authored-By: Claude Code --- docs-site/docs/en/bots-json.md | 2 +- docs-site/docs/zh/bots-json.md | 2 +- src/bot-registry.ts | 2 +- src/dashboard/web/i18n.ts | 12 ++++++------ src/im/lark/md-card.ts | 6 +++--- src/services/bot-config-store.ts | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs-site/docs/en/bots-json.md b/docs-site/docs/en/bots-json.md index 8659cfb263..cefdc711c1 100644 --- a/docs-site/docs/en/bots-json.md +++ b/docs-site/docs/en/bots-json.md @@ -234,7 +234,7 @@ This option addresses one narrow gap: Codex running through Botmux's app-server | Field | Description | |------|------| -| `brandLabel` | Branding text at the bottom of the card. `undefined` = default `Powered by [botmux](https://github.com/deepcoldy/botmux) with :LOVE:`; `""` = hidden; any other string = rendered as-is (supports markdown). Purely cosmetic, does not affect routing / permissions | +| `brandLabel` | Branding text at the bottom of the card. `undefined` = default `botmux` link; `""` = hidden; any other string = rendered as-is (supports markdown). Purely cosmetic, does not affect routing / permissions | | `showUsageInCardFooter` | Whether reply-card footers show native Context / Token usage from the Agent CLI. Missing / `true` = show; `false` = hide both metrics. A missing individual metric is still omitted independently. This controls card display only and does not disable the Usage Ledger or other accounting | | `modelBackendVariant` display | A frozen TraeX backend variant appears only in the runtime identity on the live streaming session card. Reply-card footers show Context / Token usage only; they do not show the variant | | `disableStreamingCard` | When `true`, no real-time streaming session card is sent at all (the Web Terminal still runs and the final reply still arrives via `botmux send`, there's just no auto-refreshing status card). For users who find the real-time card noisy | diff --git a/docs-site/docs/zh/bots-json.md b/docs-site/docs/zh/bots-json.md index 62abc59dcc..1d09156382 100644 --- a/docs-site/docs/zh/bots-json.md +++ b/docs-site/docs/zh/bots-json.md @@ -237,7 +237,7 @@ Dashboard 保存后无需重启 daemon。模型、思考强度分别选择“继 | 字段 | 说明 | |------|------| -| `brandLabel` | 卡片底部品牌文案。`undefined`=默认 `Powered by [botmux](https://github.com/deepcoldy/botmux) with :LOVE:`;`""`=隐藏;其它字符串=原样渲染(支持 markdown)。纯样式,不影响路由 / 权限 | +| `brandLabel` | 卡片底部品牌文案。`undefined`=默认 `botmux` 链接;`""`=隐藏;其它字符串=原样渲染(支持 markdown)。纯样式,不影响路由 / 权限 | | `showUsageInCardFooter` | 回复卡片页脚是否展示 Agent CLI 原生提供的 Context / Token 用量。缺省 / `true`=展示,`false`=同时隐藏两项;单项数据缺失时仍只省略缺失项。仅控制卡片展示,不停止 Usage Ledger 或其它统计 | | `modelBackendVariant` 显示 | 已冻结的 TraeX 后端变体只显示在实时流式 session 卡片的运行时标识中;回复卡片页脚只显示 Context / Token 用量,不展示该变体 | | `disableStreamingCard` | `true` 时彻底不发实时流式 session 卡片(web 终端仍跑、最终答复仍经 `botmux send` 到达,只是没有自动刷新的状态卡)。给嫌实时卡吵的用户 | diff --git a/src/bot-registry.ts b/src/bot-registry.ts index e51aab3252..030f0405ab 100644 --- a/src/bot-registry.ts +++ b/src/bot-registry.ts @@ -2016,7 +2016,7 @@ export interface BotConfig { skills?: BotSkillPolicy; /** * Custom footer brand label for cards this bot sends. Three states: - * • `undefined` (unset) → default `Powered by [botmux](https://github.com/deepcoldy/botmux) with :LOVE:` + * • `undefined` (unset) → default `[botmux](github)` link * • `''` (empty) → brand suppressed (footer shows only 发送给 if any) * • any other string → rendered verbatim (markdown allowed) * Resolved via {@link resolveBrandLabel}. Pure cosmetic — does not affect diff --git a/src/dashboard/web/i18n.ts b/src/dashboard/web/i18n.ts index 731d4e4301..1490dfd891 100644 --- a/src/dashboard/web/i18n.ts +++ b/src/dashboard/web/i18n.ts @@ -2423,8 +2423,8 @@ const zh = { 'botDefaults.autoWorktreeHelp': '仅用于「固定进默认目录」模式。新会话会在默认 git 仓库中创建独立 worktree,避免并发会话互相影响;失败时回退到默认目录。/close 不会自动删除 worktree。', 'botDefaults.workingDirSaved': '已保存(下个新会话生效)', 'botDefaults.brandLabel': '个性签名(卡片页脚)', - 'botDefaults.brandLabelHelp': '设置该 bot 卡片页脚签名。留空=不显示;填写=自定义 Markdown;恢复默认=显示 Powered by botmux with ❤。支持变量:{cwdName}=会话当前目录显示名(该目录 .botmux-dir.json 的 name,缺省用目录名)、{cwd}=完整路径、{cwdUrl}=该目录 .botmux-dir.json 的 url;空链接自动降级为纯文本。例:[{cwdName}]({cwdUrl})', - 'botDefaults.brandLabelPlaceholder': '默认:Powered by botmux with ❤(留空则不显示)', + 'botDefaults.brandLabelHelp': '设置该 bot 卡片页脚签名。留空=不显示;填写=自定义 Markdown;恢复默认=显示 botmux。支持变量:{cwdName}=会话当前目录显示名(该目录 .botmux-dir.json 的 name,缺省用目录名)、{cwd}=完整路径、{cwdUrl}=该目录 .botmux-dir.json 的 url;空链接自动降级为纯文本。例:[{cwdName}]({cwdUrl})', + 'botDefaults.brandLabelPlaceholder': '默认:botmux(留空则不显示)', 'botDefaults.sectionSandbox': '文件沙盒', 'botDefaults.sandboxToggle': '开启文件沙盒', 'botDefaults.sandboxHelp': '开启后,该 bot 的每个会话都跑在沙盒里:agent 能在项目目录内正常读写干活,但碰不到项目外你磁盘上的真实文件、密钥、别的会话数据——对项目外的写入会被隔离/拦截。适合把机器人分享给半受信任的人(oncall)。Linux 用 bwrap、macOS 用 Seatbelt,两端保护效果一致;下个新会话生效。', @@ -2494,7 +2494,7 @@ const zh = { 'botDefaults.backendSaved': '已保存(下个新会话生效)', 'botDefaults.brandSave': '保存签名', 'botDefaults.brandReset': '恢复默认', - 'botDefaults.brandStateDefault': '当前:Powered by botmux with ❤', + 'botDefaults.brandStateDefault': '当前:默认 botmux', 'botDefaults.brandStateOff': '当前:已关闭', 'botDefaults.brandStateCustom': '当前:自定义', 'botDefaults.sectionCard': '任务卡片', @@ -5721,8 +5721,8 @@ const en: Record = { 'botDefaults.autoWorktreeHelp': 'Only for "Always use the default directory" mode. Creates an isolated git worktree per new session to avoid collisions; falls back to the default dir on failure. /close does not remove worktrees.', 'botDefaults.workingDirSaved': 'Saved (takes effect next session)', 'botDefaults.brandLabel': 'Signature (card footer)', - 'botDefaults.brandLabelHelp': 'Footer signature for cards sent by this bot. Empty hides it; custom text supports Markdown; reset shows Powered by botmux with ❤. Supports variables: {cwdName}=the session\'s current directory display name (the `name` field in that dir\'s .botmux-dir.json, falls back to the directory name), {cwd}=full path, {cwdUrl}=the `url` field in that dir\'s .botmux-dir.json; an empty link auto-degrades to plain text. Example: [{cwdName}]({cwdUrl})', - 'botDefaults.brandLabelPlaceholder': 'Default: Powered by botmux with ❤ (empty = hidden)', + 'botDefaults.brandLabelHelp': 'Footer signature for cards sent by this bot. Empty hides it; custom text supports Markdown; reset shows botmux. Supports variables: {cwdName}=the session\'s current directory display name (the `name` field in that dir\'s .botmux-dir.json, falls back to the directory name), {cwd}=full path, {cwdUrl}=the `url` field in that dir\'s .botmux-dir.json; an empty link auto-degrades to plain text. Example: [{cwdName}]({cwdUrl})', + 'botDefaults.brandLabelPlaceholder': 'Default: botmux (empty = hidden)', 'botDefaults.sectionSandbox': 'File sandbox', 'botDefaults.sandboxToggle': 'Enable file sandbox', 'botDefaults.sandboxHelp': "When on, every session of this bot runs in a sandbox: the agent works normally inside the project dir, but cannot touch your real files, secrets, or other sessions outside it — writes outside the project are isolated/blocked. For sharing the bot with semi-trusted users (oncall). Linux uses bwrap, macOS uses Seatbelt; same protection on both. Applies to the next new session.", @@ -5792,7 +5792,7 @@ const en: Record = { 'botDefaults.backendSaved': 'Saved (applies to the next new session)', 'botDefaults.brandSave': 'Save Signature', 'botDefaults.brandReset': 'Reset to default', - 'botDefaults.brandStateDefault': 'Current: Powered by botmux with ❤', + 'botDefaults.brandStateDefault': 'Current: default botmux', 'botDefaults.brandStateOff': 'Current: off', 'botDefaults.brandStateCustom': 'Current: custom', 'botDefaults.sectionCard': 'Task Cards', diff --git a/src/im/lark/md-card.ts b/src/im/lark/md-card.ts index 91f84864a0..b7d332447c 100644 --- a/src/im/lark/md-card.ts +++ b/src/im/lark/md-card.ts @@ -380,12 +380,12 @@ export function normalizeLocalHomeLinks( } /** Default footer brand when a bot has no custom `brandLabel` configured. */ -export const DEFAULT_BRAND_LABEL = 'Powered by [botmux](https://github.com/deepcoldy/botmux) with :LOVE:'; +export const DEFAULT_BRAND_LABEL = '[botmux](https://github.com/deepcoldy/botmux)'; /** * Resolve the brand segment to render in a card footer from a bot's configured * `brandLabel` (see {@link resolveBrandLabel}): - * • `undefined` (unset) → `Powered by [botmux](...) with :LOVE:` + * • `undefined` (unset) → the default botmux link * • `''` / whitespace → `null` (brand suppressed) * • any other string → one trimmed line (markdown allowed) * Returning `null` lets callers drop the brand — and, when there's also no @@ -1526,7 +1526,7 @@ export function hasMarkdown(text: string): boolean { * addressing line (e.g. top-level broadcasts have no specific recipient). * * `brand` is the sending bot's configured `brandLabel` (see - * {@link brandFooterSegment}): unset → default `Powered by [botmux](...) with :LOVE:`, `''` → brand + * {@link brandFooterSegment}): unset → default botmux link, `''` → brand * suppressed, else custom. When brand, usage, and recipient are all absent the * whole footer (HR included) is omitted. */ diff --git a/src/services/bot-config-store.ts b/src/services/bot-config-store.ts index d459c5dbf0..8e60f99657 100644 --- a/src/services/bot-config-store.ts +++ b/src/services/bot-config-store.ts @@ -107,7 +107,7 @@ export const CONFIG_FIELDS: readonly ConfigFieldSpec[] = [ { key: 'lang', configKey: 'lang', kind: 'enum', effect: 'immediate', clearable: true, enumValues: ['zh', 'en'], hint: '机器人 UI 语言 zh|en;unset 回全局默认' }, { key: 'skillInjection', configKey: 'skillInjection', kind: 'enum', effect: 'next-session', clearable: true, enumValues: ['global', 'prompt', 'off'], hint: 'botmux skills 注入方式(仅影响 codex/gemini 等全局 skills 目录的 CLI):prompt=注入会话不落全局盘(默认)|global=装进 CLI 全局目录(会被独立 CLI 看到)|off=只留提示+botmux --help;切到/离开 global 需重启 daemon 才完全生效;unset 回机器级默认' }, { key: 'defaultWorkingDir', configKey: 'defaultWorkingDir', kind: 'dir', effect: 'next-session', clearable: true, hint: '新话题默认工作目录(跳过仓库选择卡片)' }, - { key: 'brandLabel', configKey: 'brandLabel', kind: 'string', effect: 'immediate', clearable: true, hint: '卡片页脚品牌文案;unset 回默认 “Powered by botmux with ❤”' }, + { key: 'brandLabel', configKey: 'brandLabel', kind: 'string', effect: 'immediate', clearable: true, hint: '卡片页脚品牌文案;unset 回默认 botmux 链接' }, { key: 'usageDisplay', configKey: 'usageDisplay', kind: 'enum', effect: 'immediate', clearable: true, enumValues: ['streaming', 'footer', 'off'], hint: '用量显示位置:streaming=流式卡正文(默认)|footer=回复卡页脚|off=不显示' }, { key: 'showReplyTiming', configKey: 'showReplyTiming', kind: 'boolean', effect: 'immediate', clearable: false, hint: '最终回复页脚分别显示等待和执行耗时 on|off(默认 off);等待含排队/准备,缺失计时则不显示' }, { key: 'autoStartPrompt', configKey: 'autoStartOnGroupJoinPrompt', kind: 'string', effect: 'immediate', clearable: true, hint: '被拉进新群主动开工的首轮 prompt(配合 autoStartOnGroupJoin)' },