DSH / Atlas
2026-07-21implementedfeaturearchived 2026-07-26

No startup banner

移除启动横幅

The TUI opened with a boxed product banner ("DEEPSEEK HARNESS" + model/session detail), most recently with a sweep-in animation ([banner sweep Agent Note](2026-07-21-tui-banner-sweep.md)). The user's verdict: remove it. A product title re-read on every boot is chrome, the box spends four rows before any content, and the identifying facts it carried (model, session) have better homes.

English

Problem

The TUI opened with a boxed product banner ("DEEPSEEK HARNESS" + model/session detail), most recently with a sweep-in animation (banner sweep Agent Note). The user's verdict: remove it. A product title re-read on every boot is chrome, the box spends four rows before any content, and the identifying facts it carried (model, session) have better homes.

Decision

  • HeaderComponent, the sweep animation, and its lifecycle wiring are deleted. The TUI mounts straight into the transcript; startup renders nothing above the separator.
  • The model name moves into the footer status line's left segment (<model> <cwd> ↑tokens ↓tokens), so the session's driving model stays visible at all times, not just at boot. The session id is no longer displayed — it lives in the session log and ./.sessions filenames, where dsh --resume <id> and the /resume selector retrieve it.
  • welcome, when configured, renders as the transcript's first line (a muted notice) inside rebuildTranscript, so palette swaps preserve it. Unset renders nothing. Fixtures keep their configured welcomes; the PTY smoke's boot marker becomes the footer's model name, the only mounted-TUI text guaranteed to render regardless of cwd length.

This supersedes the banner sweep Agent Note entirely: both the sweep and the banner it animated are gone.

Alternatives considered

Keep a one-line header (no box). Rejected: the only load-bearing fact was the model name, and the footer already aggregates session status; a dedicated header row for one fact is the same chrome, smaller.

Show the session id in the footer too. Rejected: a 36-char UUID dominates the 100-column footer and clips the status segment; it identifies the session for resume, which is a log/filesystem concern, not a glanceable one.

Print the welcome outside the transcript (above the separator). Rejected: any fixed region above the transcript is a banner again; as a transcript line it scrolls away naturally and survives rebuilds through the same path as every other transcript element.

Consequences

  • Startup output is fully deterministic again — no animation frames at all; the interval-lifecycle machinery from the two animation iterations is gone.
  • All 26 pi-tui terminal snapshots re-recorded (test:snapshot:refresh): banner rows gone, footer rows gain the model prefix.
  • Anything that anchored on banner text (DEEPSEEK, box corners) re-anchors on the footer model name; main-session- no longer appears in boot output.
  • /clear now wipes the welcome line too: it is an ordinary transcript line, and /clear empties the transcript (the old banner survived /clear only by sitting outside it).
  • The footer's left segment is wider; on narrow terminals the right status segment clips earlier.

Testing

packages/ui/tui/tests/tui.spec.ts pins: no box corners/product title and an empty transcript when welcome is unset, with the model in the footer; a configured welcome as the first transcript line without a banner; and the welcome surviving a palette-swap transcript rebuild. The PTY smoke boots on the footer model name and asserts DEEPSEEK HARNESS is absent. Snapshots verify the full frames.

中文

Problem

TUI 启动时展示一个带框的产品横幅("DEEPSEEK HARNESS" + 模型/会话详情),最近一版还带扫入动画(横幅扫入 Agent Note)。用户的裁决:删掉它。每次启动都被重读的产品标题是装饰,盒子在任何内容之前先占掉四行,而它承载的识别信息(模型、会话)有更好的去处。

Decision

  • 删除 HeaderComponent、扫入动画及其生命周期接线。TUI 直接挂载进 transcript;启动时分隔线之上不渲染任何东西。
  • 模型名移入页脚状态行的左段(<model> <cwd> ↑tokens ↓tokens),会话使用的模型因此始终可见,而不只是启动时。会话 id 不再显示——它存在于会话日志和 ./.sessions 文件名中,dsh --resume <id>/resume 选择器会从中获取该 id。
  • 配置了 welcome 时,它作为 transcript 的第一行(一条弱化的通知)在 rebuildTranscript 内渲染,因此调色板切换会保留它。未设置则什么也不渲染。fixture 保留各自配置的欢迎语;PTY 冒烟测试的启动标记改为页脚的模型名——无论 cwd 多长都保证渲染的唯一挂载后文本。

本 note 完全取代横幅扫入 Agent Note:扫入动画和它所动画的横幅都已移除。

Alternatives considered

保留单行头部(去掉盒子)。 否决:唯一有承载价值的信息是模型名,而页脚已经聚合会话状态;为一条信息保留专用头部行仍是同一种装饰,只是小一点。

把会话 id 也放进页脚。 否决:36 字符的 UUID 会占满 100 列页脚并裁掉状态段;它的用途是恢复会话的标识,属于日志/文件系统关注点,不是需要一瞥可见的信息。

把欢迎语渲染在 transcript 之外(分隔线上方)。 否决:transcript 上方任何固定区域都会再次变成横幅;作为 transcript 行它自然滚走,并通过与其他 transcript 元素相同的路径在重建后保留。

Consequences

  • 启动输出再次完全确定——没有任何动画帧;两轮动画迭代留下的定时器生命周期机制全部移除。
  • 全部 26 个 pi-tui 终端快照重新录制(test:snapshot:refresh):横幅行消失,页脚行增加模型前缀。
  • 锚定横幅文本(DEEPSEEK、盒子角)的内容改为锚定页脚模型名;启动输出中不再出现 main-session-
  • /clear 现在也会清掉欢迎行:它是普通的 transcript 行,而 /clear 清空 transcript(旧横幅能在 /clear 后存活只因为它在 transcript 之外)。
  • 页脚左段变宽;窄终端上右侧状态段更早被裁剪。

Testing

packages/ui/tui/tests/tui.spec.ts 固定:welcome 未设置时无盒子角/产品标题、transcript 为空、模型在页脚;配置的欢迎语作为 transcript 第一行且无横幅;欢迎语在调色板切换的 transcript 重建后保留。PTY 冒烟测试以页脚模型名为启动标记并断言 DEEPSEEK HARNESS 不出现。快照验证完整帧。