Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs-site/docs/en/bots-json.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
2 changes: 1 addition & 1 deletion docs-site/docs/zh/bots-json.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` 到达,只是没有自动刷新的状态卡)。给嫌实时卡吵的用户 |
Expand Down
2 changes: 1 addition & 1 deletion src/bot-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 6 additions & 6 deletions src/dashboard/web/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,两端保护效果一致;下个新会话生效。',
Expand Down Expand Up @@ -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': '任务卡片',
Expand Down Expand Up @@ -5721,8 +5721,8 @@ const en: Record<keyof typeof zh, string> = {
'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.",
Expand Down Expand Up @@ -5792,7 +5792,7 @@ const en: Record<keyof typeof zh, string> = {
'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',
Expand Down
6 changes: 3 additions & 3 deletions src/im/lark/md-card.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/services/bot-config-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)' },
Expand Down
Loading