IDE Companion 协议
实现端口发现、逐请求认证、上下文通知与异步 diff 结果。
这是开发编辑器 Companion 的接口契约,不是 ACP 配置。插件运行本地 HTTP MCP 服务,使用动态端口(监听 port 0),并在集成终端注入该实际端口。
服务发现与认证
QWEN_CODE_IDE_SERVER_PORT 指向 ~/.qwen/ide/
workspacePath 是工作区绝对根路径列表,Linux/macOS 用冒号分隔,Windows 用分号;CLI 当前目录不在任一工作区内会拒绝连接。ppid 按规范记录 IDE 进程的父进程 ID。
每次启动生成唯一秘密 authToken。CLI 在每个请求附 Authorization: Bearer,服务端必须每次验证,不能只在握手检验。旧于 v0.5.1 的临时目录发现文件仅供兼容,新实现不依赖它们。
上下文通知
ide/contextUpdate 可在文件打开、关闭、聚焦、光标或选择变化时发送,官方建议防抖 50ms。
workspaceState 下可有 openFiles 和 isTrusted。每项文件包含绝对 path、最近聚焦 Unix timestamp,可附 isActive、cursor.line/character 和 selectedText;光标坐标从一开始。
只包括磁盘实际存在文件。CLI 按 timestamp 排序,只把最近项作为活动文件,其余 cursor/selection 会清除;最终截到十个文件和 16KB 选区。插件本身也应限量,不能通过多次 isActive:true 让多个选区都成为当前焦点。
打开 diff 与结果是两件事
openDiff 接收 filePath 和 newContent。成功打开后立即返回 content:[],失败则 isError:true 加错误文字;这个确认只说明视图已打开,不能当作用户接受。
接受后异步发送 ide/diffAccepted,含 filePath 与最终完整 content。用户可能在界面改过内容,因此最终 content 不一定等于原 newContent。拒绝则发 ide/diffRejected,带 filePath。
closeDiff 接收 filePath,成功时返回单个 TextContent,内容是关闭前的最终文件文本;失败返回 isError:true 与说明。实现 diff 能力时需按规范注册 openDiff/closeDiff 并处理这些结果。
生命周期
激活先启动 MCP,再创建发现文件;停用先停止服务并删除发现文件。不能让退出后的旧 lock 继续指向被其他进程复用的端口,也不能把“lock 文件存在”当作服务仍活跃的唯一证据。
用户侧行为见Companion 使用。协议文档标注的最后更新时间较早,开发新实现还应对照目标 CLI 版本,而不是把它当永久冻结协议。