Skip to content

fix(opencode2): 裸 PTY 分支缺少 bracketed-paste 标记(与 #1289 同族) #1303

Description

@deepcoldy

问题

src/adapters/cli/opencode2.tswriteInput 裸 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:76passesInitialPromptViaArgs: 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 由自动评审流程创建,具体优先级以维护者判断为准。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions