问题
src/adapters/cli/opencode2.ts 的 writeInput 裸 PTY 分支,与 #1289 修复前的 opencode.ts 逐字相同:
} else {
pty.write(content); // 没有 bracketed-paste 标记
await delay(1000);
pty.write('\r');
}
没有 ESC[200~ … ESC[201~ 包裹时,TUI 会把长文本里的每个换行当成一次回车按键 —— 消息被切碎、提前提交、或整条丢失。这正是 #1289 为 v1 修掉的缺陷。
为什么 v2 的暴露面比 v1 更大
opencode.ts 设了 passesInitialPromptViaArgs: true + maxInitialPromptArgBytes: 8192,所以只有超过 8KB 的首条消息才会转入输入队列、命中这条路径。
而 opencode2.ts:76 是 passesInitialPromptViaArgs: false(V2 的 --prompt 只填 composer 不自动提交,见该文件头部注释),意味着每一条首条消息都走 writeInput —— 在 PTY 后端下,任何长消息或多行消息都会命中同一个碎裂问题,不像 v1 只有超预算的长首条才会。
建议改法
照搬 #1289 的做法即可(约 3 行):把粘贴判定提成变量,裸 PTY 分支按它决定是否包裹。
const needsPaste = !isSlashCommand && (content.length > OPENCODE_PASTE_THRESHOLD || content.includes('\n'));
// tmux 分支:if (needsPaste && pty.pasteText) { ... }
// 裸 PTY 分支:pty.write(needsPaste ? `\x1b[200~${content}\x1b[201~` : content);
短单行与斜杠命令必须维持原有的 typing 方式(斜杠命令是 TUI 命令面板输入,包起来会被当字面文本)。
测试建议
test/opencode-resume.test.ts 里 #1289 补的用例可以直接作为模板,注意负向用例要覆盖长斜杠命令(走长度分支)和多行斜杠命令(走换行分支)两支 —— 只测短的 /session 抓不住守卫(#1289 首轮实测:删掉 !isSlashCommand 时测试仍全绿)。
背景
在 #1289 的评审中发现并确认(两轮评审均判定为非阻断,不属于 #1289 引入的回归,故拆出单独跟进)。修复已合入 v1:506b52d05。
本 issue 由自动评审流程创建,具体优先级以维护者判断为准。
问题
src/adapters/cli/opencode2.ts的writeInput裸 PTY 分支,与 #1289 修复前的opencode.ts逐字相同:没有
ESC[200~ … ESC[201~包裹时,TUI 会把长文本里的每个换行当成一次回车按键 —— 消息被切碎、提前提交、或整条丢失。这正是 #1289 为 v1 修掉的缺陷。为什么 v2 的暴露面比 v1 更大
opencode.ts设了passesInitialPromptViaArgs: true+maxInitialPromptArgBytes: 8192,所以只有超过 8KB 的首条消息才会转入输入队列、命中这条路径。而
opencode2.ts:76是passesInitialPromptViaArgs: false(V2 的--prompt只填 composer 不自动提交,见该文件头部注释),意味着每一条首条消息都走writeInput—— 在 PTY 后端下,任何长消息或多行消息都会命中同一个碎裂问题,不像 v1 只有超预算的长首条才会。建议改法
照搬 #1289 的做法即可(约 3 行):把粘贴判定提成变量,裸 PTY 分支按它决定是否包裹。
短单行与斜杠命令必须维持原有的 typing 方式(斜杠命令是 TUI 命令面板输入,包起来会被当字面文本)。
测试建议
test/opencode-resume.test.ts里 #1289 补的用例可以直接作为模板,注意负向用例要覆盖长斜杠命令(走长度分支)和多行斜杠命令(走换行分支)两支 —— 只测短的/session抓不住守卫(#1289 首轮实测:删掉!isSlashCommand时测试仍全绿)。背景
在 #1289 的评审中发现并确认(两轮评审均判定为非阻断,不属于 #1289 引入的回归,故拆出单独跟进)。修复已合入 v1:
506b52d05。本 issue 由自动评审流程创建,具体优先级以维护者判断为准。