Repository navigation
Releases: cxykevin/alcoh
Release list
alcoh v0.2.7
alcoh v0.2.7
本版本主线是正文鼠标选择:复制改成按列取原文(选区两端被切掉的 markdown 标记丢掉、完整的标记原样保留),拖到正文上下边界会贴边自动滚动;选区改为按内容行存放,滚动后高亮与复制内容都跟着走。另有新增设置项“显示协议细节”,默认关闭,隐藏未知 session update 与 calling_info 参数块。
主要更新
正文按列复制原始 markdown
- 渲染侧为每个渲染 rune 记录它在原文里的下标(
StyledLine.Map/SrcLine.Map,-1 表示渲染合成字符),复制时先取选区对应的原文下标区间再拼回文字:- 选区两端的标记符(
**、`、#、>、-等)丢掉,只选中的文字不带标记; - 夹在选中字符中间的标记保留(选中“正文 加”得到
正文 **加粗); - 整行被完整选中时仍按原文输出,标记原样保留;
- 长逻辑行 wrap 出来的续行与首行同属一行,片段直接拼接、不插换行;
- 代码块行号前缀、tab 展开的空格、列表符号都是渲染合成,不参与取字。
- 选区两端的标记符(
- 格式标记(
**加粗**、`代码`)按开启标记判断是否完整:开启标记也在选区内(这段格式从选区内开始)就算完整,闭合标记被选区右端挡在外面时补上它;只有开启标记在选区外(格式被左侧切断)才剔除选区里那半个标记,不再复制出落单的标记。 - 拖拽选择到正文上/下边界之外时贴边自动滚动:每来一次移动事件滚一行,滚到顶/底即停;选区终点钉在边界行上,滚动后同一屏幕行指向更远的内容,选区随之延长(边界判断用渲染侧记录的正文内容总行数)。
选区按内容行存放,跟随滚动
- 选区此前按屏幕行存放,正文滚动(滚轮、翻页、拖拽自动滚动)后高亮仍停在原来的屏幕行,Ctrl+C 复制到的也不再是当初选中的那段文字。现在选区存内容行号(屏幕行 − 正文首行 + 滚动偏移),渲染与取文时按当前滚动偏移换算回屏幕行,选区从此与滚动位置无关;滚出可见区的选区不再高亮。
新增“显示协议细节”开关(默认关闭)
- 未知 session update 的系统提示行与 alkaid0 私有的
calling_info参数块此前一律写进正文,普通会话里噪声较大。改为由本地设置控制、默认关闭:原始 JSON 始终保留在协议诊断中,需要排查协议问题时在设置里打开就能看到完整细节。 - 设置页新增第 5 行“显示协议细节”(键盘与滚轮移动的行数上限同步改为 5),随会话激活与能力刷新同步到当前会话,切换后立即作用于当前会话与主页预创建会话;工具块缓存签名并入开关,避免切换后仍命中旧渲染。
- 帮助弹窗文案与 en 翻译同步更新。
其它
- 补掉两处 gofmt 差异(
keymap.go注释缺空格、i18n/en.go翻译值列对齐),仅注释与空白列调整,不改行为。
验证
gofmt无差异、go vet ./...通过、go test ./...全部通过。- 新增/更新回归测试:按列取字与 wrap 拼接(
TestCopyBodyTextColumns)、格式标记的整行 / 左端切断 / 右端补闭标记(TestCopyBodyTextFormatMarks)、拖拽到上下边界自动滚动与两端封顶(TestDragAutoScrollsBody)、滚动后高亮跟随同一内容行与滚出可见区不再高亮(TestApplySelectionFollowsScroll)、协议细节默认隐藏与打开后显示(model、view 两侧);view 侧新增TestAppViewBodyRows,markdown / highlight / message_list 既有用例按列映射规则同步调整。
alcoh v0.2.6
alcoh v0.2.6
本版本主线是 workflow 终端预览:选中 workflow 终端时不再只看原始 VT 输出,而是渲染 tflow 流程图(节点按状态着色、可切换选中节点、可平移),下栏用页签平级展示 Agent 列表与节点日志。另有 shells 面板列表滚动、粘贴覆盖当前行等修复。
主要更新
workflow 终端预览(alkaid0 v0.5)
- 协议层:新增
workflow/status查询(受 v0.5 能力位开关)、workflow 快照通知与update_*增量事件解码;TerminalInfo增加 workflow 标记,WorkflowControl与TerminalControl分开声明,实现方可以只实现终端部分。 - 模型层:终端状态挂载 workflow 状态,按 runID 累积图、节点/agent 状态与日志(事件按 sequence 重放),并提供节点选择、画布平移与分栏滚动游标。
- 视图层:
workflow_panel.go负责 tflow 布局与上下分栏绘制,布局按图 / 节点状态 / 选中项缓存,避免每帧重算;shell 面板在 workflow 终端上改画分栏。 - 键位:Tab / Shift+Tab 循环切换选中节点(节点日志跟随),hjkl 与方向键四向平移(一次半个分栏),←→ 切下栏页签,PgUp/PgDn 翻页、滚轮按行滚动;底部提示与 i18n 同步。
- 下栏页签:图下方改为 notebook 式两页,默认 Agent 列表(序号 / 状态着色 / 提示词摘要 / 重试次数),←→ 环绕切到节点日志页,两页各自记住滚动位置。
- 快照时机:进入面板、刷新(r)、切换选中节点时补一次全量快照,断线重连或打开早已结束的 workflow 也能立刻看到完整状态。
- 真机兼容:真实服务把 dynworkflow 的 graph 事件整体塞进
graph字段(比增量事件多包一层),快照解码现在兼容嵌套与扁平两种形状——此前真机上图始终为空。 - 平移错位修复:按网格列落位、宽度取自网格续列,窗口左边界落在宽字符中间不再让整行偏移;右边界放不下整个宽字符时不画,避免压到分栏边框。
- 依赖新增
github.com/cxykevin/tflow v0.0.1。
Agent 列表序号修正
- workflow 事件里的
agentIndex从 1 开始,此前当作 0 起下标索引,第 1 个 agent 的事件落到第二行:第一行永远停在"等待"、内容与第二行重复,末尾多出幻影行(单个 agent 看上去是 #1 等待、#2 同一个 agent)。现在按 1 起解析(内部仍 0 起存放、显示时 +1),事件没带序号时兜底第一个 agent,status 重放沿用日志条目上的序号。
shells 面板列表滚动与滚动条
- 列表按行铺开(每条 shell 两行、历史段前一行分节标题),窗口起点按选中项计算:装得下停在顶部,装不下把选中项贴到窗口底部,选中的终端(含命令那行)始终完整可见;窗口底部放不下整条时不画半条。
- 最右一列画滚动条,仅在内容超出一屏时出现。
粘贴不再清掉当前行
InputBuffer.InsertText对不含换行的粘贴内容会把首段与末段写进同一行,后一次写入覆盖前一次,光标前的原有内容被清掉(表现为"一粘贴当前行就只剩粘贴内容")。现在单行粘贴按"光标前内容 + 粘贴文本 + 光标后内容"一次拼好,光标停在粘贴内容之后、原有后缀之前。
验证
gofmt无差异、go vet ./...通过、go test ./...通过。- 新增回归测试:workflow 事件解码与状态重放、键位与页签切换、宽图逐平移量列位比对与右边界截断、agentIndex 1 起落位与幻影行、shell 列表行铺开 / 滚动可见性 / 无滚动条、单行粘贴保留当前行(旧实现下失败)。
- 假 agent 的 pty e2e 覆盖 3 节点默认图与 9 节点宽图两种场景(最终场景 A 21 项 + 场景 B 8 项)全部通过。
- 真机 alkaid0 联调:workflow 面板能正确渲染节点、连线与实时状态。
alcoh v0.2.5
alcoh v0.2.5
本版本有两条主线:工具调用接入 alkaid0 v0.4 私有协议渲染(标题变为可读签名、正文只展开标题未包含的参数),以及修掉滚动时行尾字符残留(宽字符续列光标与 Emoji 列宽)。
主要更新
工具调用按 alkaid0 v0.4 私有协议渲染
服务端声明 alk.cxykevin.top/alkaid0/v0.4 时,工具调用不再显示服务端标题 [Call <name>]<callId> 与全参数文本块,改由客户端按工具语义渲染:
- 可读标题:
Edit(path)、Run {type}({reason})(后台任务为Run {type}*(...),command转入正文)、Read(path)、Search(query)/Search online(query)、Fetch(method url)、Scope(name)、Agent(name)、Use Agent(name)、Deactivate Agent(name);未收录的工具回退Name()。 - 正文只显示标题未包含的参数:展开后以
Key: value列出其余参数(按参数名排序、跳过空值),服务端首个"全参数预览"文本块不再重复渲染;diff/终端等内容块照旧展示,复制出的原文与画面一致。 - 参数来源:
content里的alk.cxykevin.top/calling_info块(alkaid0 不发送rawInput,见服务端docs/acp/extension.md§4.1);没有该块、或服务端未声明 v0.4 能力时完全回退原有渲染。
滚动时行尾字符残留修复
- 宽字符续列光标:Diff 写入的 run 从宽字符续列开始时,
MoveTo会把终端光标停在续列上,而续列分支只推进列号、不推进光标,run 内后续字符整体左移一格,行尾保留上一帧字符。现在同步推进光标,保证列号与终端光标一致。 - 选择整字闭包:shells 预览选择只反续列样式,正好制造上述"从续列开始的 run";抽出
wideCharBounds供正文选择与 shells 选择共用。 - 列宽表修正:
Emoji_Presentation=Yes(✅❌✨ 等)终端按 2 列渲染,本地按 1 列会让整行少前进 1 列、行尾残留旧字符(真实会话里 ✅ 出现 43 次);并补齐易经六十四卦、太玄经符号、算筹数字、片假名扩展等宽字符区块,U+3248-324F按 Ambiguous 归窄,U+FFA0归零宽。
验证
gofmt无差异、go vet ./...通过、go test ./...通过。- 新增回归测试:工具调用私有渲染(edit/run 前后台/read/search 在线离线/fetch 与子代理工具/未知工具回退/diff 保留/无 v0.4 回退,能力开关在
SetAgentInfo前后生效);宽度表断言与区间表有序性、续列起始 run、shells 选择整字反显。
alcoh v0.2.4
alcoh v0.2.4
本版本是一次稳定性补丁,专治 Windows Terminal 下"不定期卡死、按键和 Ctrl+C 全部失灵、只能关窗口":修掉三类各自独立的成因(输入通道永久失效、长会话流式输出时事件循环被绘制占满、终端输出里的零宽字符触发 panic 后死锁),并保证异常退出时终端一定会被还原。
主要更新
输入通道不再"假死"(Windows 专有触发)
- Windows 控制台上
os.Stdin的读取会在若干情况下返回 0 字节、被 Go 当成io.EOF:按下 Ctrl+Z(Go 的readConsole把 0x1A 当作控制台 EOF 标记吃掉)、ReadConsole返回 0 字符、输入缓冲被 flush。 - 旧实现遇到这种"伪 EOF"就直接退出输入读取循环,并且只尝试投递一次退出事件;一旦事件通道满(例如 AI 正在流式输出、主循环忙)这次投递被丢弃,而读取循环已经退出——按键、鼠标、Ctrl+C 从此永久失效,窗口只能关掉。
- 现在:控制台句柄仍可用时退避后继续读(Ctrl+Z 不再致命);确实失效时阻塞式投递退出事件,绝不丢弃。同时修掉
checkResize里lastW/lastH的数据竞争,尺寸事件不再因通道满而永久丢失导致画面错位。
长会话流式输出不再占满事件循环
- 正文渲染按 Timeline 条目缓存渲染结果(FNV-1a 签名,宽度/配色变化时整表失效),只重画真正变化的条目。
- 此前每帧都要对整段会话重做 markdown 解析、语法高亮与换行,帧耗时随会话长度线性增长(本机实测 600 条消息约 438ms/帧);流式输出时 10fps 重绘把事件循环占满,按键长时间得不到处理,看起来就是卡死。
- 现在同一场景约 0.9ms/帧,流式追加帧约 2.5ms。
终端写出不再阻塞事件循环
- 帧写出移入独立 goroutine:Windows 控制台的
WriteFile没有超时,终端停止消费输出(拖动/缩放窗口、最小化、RDP 断开)时同步写会把按键处理一起拖死。 - 写入器忙时跳过中间帧、保留待重画标记,下一轮(最迟 100ms)补上最新画面;退出前最多等 1.2s 写完在途帧。
终端预览零宽字符 panic(本次卡死的直接原因)
- shells 面板预览的 VT 屏幕按"显示列宽"判断换行,零宽字符(ZWJ、组合记号、变体选择符)宽度为 0 不受换行约束,光标在行尾时会越界写
Cells[Y][Width],直接 panic。 - 修复:零宽字符不占列、直接跳过;
\t展开加迭代上限,避免极窄屏幕 (Width=1) 上换行把列号归零造成空转。 - 并修掉随之而来的死锁:主循环改为
withModel/withModelRead(defer 解锁),模型层 panic 展开时不会再把锁留在锁定状态;退出路径改为先写出在途帧、立刻恢复终端,其余清理(删预创建会话/插件/后端关闭/命令回收)放进带 3s 总超时的 goroutine——任何异常退出都不会把终端留在 raw + alternate screen,也不会卡在退出路径里。
其它
- 括号粘贴结束标记丢失(Windows 控制台输入缓冲溢出会丢字节)时按 4MB 上限截断返回,避免后续按键被无限吞进粘贴缓冲。
验证
gofmt无差异、go vet ./...通过、go test ./...与go test -race ./...通过。- 新增回归测试:终端写出阻塞时事件循环仍能响应按键并退出、正文缓存随流式追加与展开思考失效重绘、粘贴结束标记丢失时的截断行为、零宽字符落在行尾不再 panic、1 列宽屏幕上的 tab 终止、
withModelpanic 后锁被释放、后端关闭阻塞时Run仍恢复终端并在超时后返回。 - 在 Windows Server + Windows Terminal(ConPTY)上实测:旧版按 Ctrl+Z 会让输入通道失效,新版进程存活并继续响应输入;对卡死进程取完整内存转储后由 goroutine 栈确认了"零宽字符越界 panic → 退出清理在 modelMu 上死锁"的链路。
已知限制
alkaid0 当前公开的 v0.5 / v0.6 扩展文档未定义终端 stdin/write 或 resize RPC,因此本版本仍不提供交互式 PTY 输入、原始 escape 转发和终端尺寸转发。
alcoh v0.2.3
alcoh v0.2.3
本版本是一次以配置编辑器为主的补丁:为 /server 里"选择模型"的键补上模型提示与模型选择框,并让命令面板中的服务端命令描述随界面语言本地化。
主要更新
模型提示与模型选择框(/server)
配置编辑器里引用模型的键——Agent.SummaryModel、Agent.TitleModel、Agent.Agents.*.AgentModel、Model.DefaultModelID、Context.EmbeddingModelID、Context.SearchSummaryModel——现在有两层辅助:
- 行尾灰字提示:这些键的行尾以灰字显示其值指向的模型名(先按
Model.Models的键匹配,未命中再按模型条目的ModelID匹配;ModelName为空退回ModelID;引用不到模型时不提示)。Model.Models集合页原有的各项模型名预览保持不变。 - 模型选择框:在这些键上按
Enter(或→)弹出选择框,候选项直接读配置文档的Model.Models——与/model不同,不查服务端公布的模型列表。候选忽略Hide(隐藏模型照样列出,只加(隐藏)标注),也不按Type过滤(LLM /embedding/rerank全部出现),每行显示键 模型名 — ModelID [类型]。 - 打开时选中当前引用值,
↑↓(或滚轮)移动(带环绕、选中行居中滚动),Enter写回该模型的键:值的类型沿用字段原有类型(数字字段写数字、字符串字段写字符串、null按键的形状推断),与手工编辑等价,并沿用"编辑即保存 + 全量重载"的既有写回链路;e退回手工输入值,Esc取消且不写回。 - 配置里没有任何模型时不弹选择框,直接进入值编辑;
/plugins的本地配置编辑器不受影响。
服务端命令描述本地化(alkaid0 v0.4)
- 服务端下发的命令描述只有英文原文。服务端声明
alk.cxykevin.top/alkaid0/v0.4私有能力时,命令面板里这些描述改由客户端按当前界面语言翻译:中文界面查internal/i18n/server.go的对照表(服务端英文原文 → 中文),未收录的条目回退英文原文,英文界面直接用服务端原文。 - 未声明该能力的第三方 ACP 服务端,其描述语言未知,一律原样展示、不做猜测性翻译。
验证
gofmt无差异、go vet ./...通过、go test ./...通过。- 新增
TestModelRefPreview/TestConfigEditorModelPick(model 层候选列表、初始选中、环绕、写回类型与 null 推断)、TestConfigTreeDrawModelRefPreview/TestConfigTreeDrawModelPick(view 层灰字样式与选择框渲染)、TestServerConfigEditorModelPick(app 层键盘驱动端到端:开框、Esc不写回、↓+Enter写回并重载生效、e手工输入),以及internal/i18n/server_test.go、internal/view/slash_i18n_test.go。
已知限制
alkaid0 当前公开的 v0.5 / v0.6 扩展文档未定义终端 stdin/write 或 resize RPC,因此本版本仍不提供交互式 PTY 输入、原始 escape 转发和终端尺寸转发。
alcoh v0.2.2
alcoh v0.2.2
本版本把 shells 面板接上 alkaid0 v0.6 的终端历史与实时终端,并重做面板的列表与预览。
主要更新
终端历史不再丢失(alkaid0 v0.6)
- 终端结束时(
alk.cxykevin.top/terminal_update的stop,或后台任务结束的shell_stop)把已收到的内容移入历史段,不再直接丢弃。 - 新增
alk.cxykevin.top/session/terminal/history(alk.cxykevin.top/alkaid0/v0.6能力):进入会话、打开面板或按r时取回该会话全部已结束终端,包括服务端重启前结束、内存中只剩持久化副本的restored条目;服务端未声明 v0.6 时静默跳过,面板只显示本地归档。 - 恢复会话时用回放的
run工具调用复原元数据:alk.cxykevin.top/terminal_id建立工具调用与终端的对应,工具参数经私有alk.cxykevin.top/calling_info块复原条目的 reason 与命令(alkaid0 不发送标准rawInput,直播与回放同一份)。只补空字段,且忽略wait/kill的参数,避免用 run id 覆盖真实命令。 - 面板分两段:上半段活动 shell、下半段历史 shell,每段内部都是"新的在上",同一终端只出现在一段里。
实时终端补齐
- 前台
run(不带background)不推送start/running,改为进入会话、打开面板或按r时调用alk.cxykevin.top/session/terminal/list列出正在运行的终端,结果以事件广播并入模型。 - 输入框下方的
<n> shell徽标与面板标题计数只统计活动 shell,历史数量在标题里以· history <n>单独标注。
列表与预览改版
- 每条 shell 占两行:第一行是
run的 reason(无则回退标题 / 终端 ID)与右对齐的彩色状态(运行中=蓝、已完成=绿、已终止=黄、失败=红),第二行是启动命令。 - 面板全部文案(标题、计数、状态、页脚、空状态、徽标)走 i18n,英文表同步补齐。
- 预览按框体尺寸重建 VT 屏幕后再重放 transcript:长行按显示宽度自动换行(CJK 记 2 列,行末放不下的宽字符整字换行,不再被截断),内容铺满整框(含全屏),终端文字统一白色。
- 预览最右一列加滚动条(内容不足一屏时显示为细点线),
PgUp/PgDn或预览区内滚轮滚动;VT 屏幕在视口之外保留最多 400 行回滚缓冲,滚动窗口按保留范围夹紧,不会滚出空白。 - 粘滞语义:停在底部时新输出继续跟随,向上滚动后位置不动,滚回底部恢复跟随;切换终端一律回到最底部。
交互
r刷新面板(活动终端 + 历史段 + 选中终端最新内容),打开面板时自动刷新一次。- 历史段的 shell 按
x不再发停止请求,改为提示"该 shell 已结束,可查看内容但无法停止"。 Ctrl/Alt组合键不再被面板的x/r吃掉。
验证
gofmt、go vet ./...通过。go test ./...通过。- 新增
internal/acp/terminal_v06_test.go、internal/app/shell_history_test.go、internal/model/terminal_{link,list,order,scroll}_test.go、internal/term/vt_width_test.go、internal/view/shell_{panel,preview,scroll,cjk,badge}_test.go,覆盖历史接入、列表顺序、工具调用与终端对应、换行与宽度、滚动与粘滞、CJK 边界。
已知限制
alkaid0 当前公开的 v0.5 / v0.6 扩展文档未定义终端 stdin/write 或 resize RPC,因此本版本仍不提供交互式 PTY 输入、原始 escape 转发和终端尺寸转发。
alcoh v0.2.1
alcoh v0.2.1
本版本是一次以修复为主的补丁:Esc 打断在连按时稳定生效,并修正会话消息顺序、补上运行状态动效。
主要更新
状态栏运行态动效
- 会话运行中不再固定显示
running,改为 spinner + 循环动词(coding / vibing / diving / building / exploring / shipping)。 - 动词叠加从左向右扫过的高光:前缘纯白加粗,向后渐隐回主题蓝,扫到词尾后连续复位。
- 状态栏左侧改按 Span 列表绘制,超宽时沿用原有截断语义,宽字符不会被截成半格。
修复
Esc 打断不再被吞
- 终端把独立 Esc 键编码为单字节
0x1b,把 Alt+X、方向键等编码为 ESC 前缀。此前解析器只凭"缓冲里是否还有字节"区分两者:当两次 Esc 落在同一读批次时(快速连按,或渲染繁忙时 stdin 已有积压),整批被解析成一次Alt+Esc,session/cancel根本没有发出,运行中的会话无法终止。 - 现在同一读批次里的多个 Esc 字节会逐个还原成 Esc 键;ESC 前缀另加 50ms 判定窗口(readline
keyseq-timeout思路),窗口内没有后续字节才判定为独立 Esc 键。 - 顺带修掉反向隐患:被终端拆包送达的
ESC [ A不再被误判成 "Esc +[+A",运行中按方向键不会误触发打断。 - Windows 控制台等不支持读超时的输入源保持原有即时语义。
会话消息顺序
- alkaid0 会话按
messageId(msg_<n>数值)排序展示,流式回放与工具调用、思考块不再因到达顺序不同而错位。
验证
gofmt、go vet ./...通过。go test ./...与go test -race ./...在 ubuntu / macos / windows 三个 runner 上通过。- 打断修复经真实 alkaid0 服务端 + TUI 端到端复核:连按 Esc、单次 Esc 均能中断当前轮次,方向键不误触发。
已知限制
alkaid0 当前公开的 v0.5 扩展文档未定义终端 stdin/write 或 resize RPC,因此本版本仍不提供交互式 PTY 输入、原始 escape 转发和终端尺寸转发。
alcoh v0.2.0
alcoh v0.2.0
本版本带来终端体验、ACP v2 支持、插件系统和会话管理方面的大幅增强。
主要更新
Shells 终端面板
- 支持 alkaid0 私有协议 v0.5 的终端状态与内容推送。
- 新增动态 shells 列表,显示终端启动命令、运行状态和终端预览。
- 支持 60/40 的 shell 列表与终端预览布局;终端宽度小于 60 列时自动隐藏预览。
- 支持全屏终端预览、VT/xterm 控制序列解析、终端状态更新和结束清理。
- 支持终端预览鼠标选择与 Ctrl+C 复制。
- 支持 x kill、Esc return 等面板操作。
- 仅当服务端声明 alk.cxykevin.top/alkaid0/v0.5 能力时启用相关功能。
ACP v2 与 alkaid0 扩展
- 完善 ACP v2 JSON-RPC 客户端。
- 支持 stdio 与 WebSocket 双 transport。
- 增强服务端能力声明、未知字段保留和协议诊断。
- 支持 alkaid0 扩展配置读取与写回。
插件与会话管理
- 新增本地插件系统,支持 JSON-RPC、protobuf、插件命令、快捷键和状态栏信息。
- 支持会话列表分页和加载更多会话。
- 改进会话恢复、预创建会话、标题及状态同步。
输入与终端体验
- 支持括号粘贴模式、CJK 宽字符和鼠标框选复制。
- 改进 Ctrl+C、Esc、历史导航和面板快捷键行为。
- 增强 VT/xterm 屏幕模型,包括光标、滚动、清屏、SGR、OSC 和备用屏幕处理。
配置与引导
- 更新 alkaid0 v0.4.6 配置 schema。
- 完善 /connect 服务商连接向导和启动新手引导。
- 支持 /effort、/model 等命令面板功能。
修复
- 修复宽字符续列覆盖、终端快照重复追加和旧 shell 未清理问题。
- 修复窄终端布局及终端预览空输出、短输出时错误显示省略号的问题。
- 修复 shell 面板 Esc 返回和 Ctrl/Alt 快捷键处理冲突。
- 修复终端预览选择复制与消息区选择之间的状态干扰。
验证
- gofmt 检查通过。
- go vet ./... 通过。
- go test ./... 通过。
- go test -race ./... 通过。
已知限制
alkaid0 当前公开的 v0.5 扩展文档未定义终端 stdin/write 或 resize RPC,因此本版本暂不提供交互式 PTY 输入、原始 escape 转发和终端尺寸转发。