IDE daemon transport 实现
核对 loopback 连接、事件回调、审批和断连恢复的实际责任。
This page has not been translated into English yet. The original Chinese version is shown below.
DaemonIdeConnection 是 VS Code companion 的 daemon sibling transport,封装 SDK HTTP/SSE。它本身负责连接,不负责具体 webview 布局;extension host 将回调转换为 webview 消息,页面可嵌入 Web Shell 渲染。
建立连接
connect(options) 接受 baseUrl、token、workspaceCwd、modelServiceId、lastEventId,以及测试使用的 sessionFactory。构造实例本身不连接网络,connect 才调用工厂并建立会话。
baseUrl 必须使用 http 或 https,不能在 URL 中嵌入用户名或密码,并必须通过客户端 loopback 校验。允许 localhost、IPv6 loopback 和实现识别的 127.x.x.x loopback 等形式;daemon 的 hostAllowlist 不能替代这一客户端限制。
文档建议远程环境使用明确的本地转发入口,但转发仍需匹配 daemon 认证、Host 和实际工作区。不要从架构页中的设置名称示例推断某个 VS Code 用户设置已正式接线。
连接串行化不等于无操作
同时发生的 connect 调用会排队,避免两个握手竞争。当前实现发现已有 session 时先 disconnect,再调用新工厂;这不是“重复调用永远复用原对象”的无副作用幂等保证。
disconnect 停止 SSE 消费并清除活动连接引用,报告 disconnected。它没有在该方法内删除 daemon 会话或清空所有回调注册;宿主应分别管理回调和服务器会话生命周期。
事件回调
| 来源 | 回调或动作 |
|---|---|
| session_update | onSessionUpdate |
| 普通 permission_request | onPermissionRequest 后向 session 提交选择 |
| ask_user_question 且 questions 为数组 | onAskUserQuestion,并把 answers 传回 daemon |
| session_died 且匹配当前 sessionId | onDisconnected |
| SSE 自然结束或错误 | stream_ended 或 daemon_error 断开原因 |
| prompt HTTP 响应完成 | onEndTurn(response.stopReason) |
onEndTurn 不由 SSE dispatch 直接产生;sendPrompt 的非 abort 异常调用 onEndTurn('error')。其他当前没有处理分支的事件记录 debug,不自动映射成 IDE 交互。
审批与游标
选择必须对应请求实际提供的 optionId;缺失、取消或无效选择按取消处理。ask_user_question 的 answers 位于响应顶层,不嵌入 outcome 内。
等待用户选择期间发生 abort 会放弃回应;若 session 已切换,也不把旧审批发送给新会话。审批响应发送异常时,该事件不会立即推进 adapter 的 lastSeenEventId,以保留重放机会。
宿主可保存 lastEventId 并在重新连接时提供,但游标本身不是持久完整历史,也不能代替正确的会话身份与恢复流程。
尚未达到的对等能力
旧 ACP stdio 路径仍是主要集成;HTTP adapter 当前没有完整 reverse RPC 或编辑器能力表面。需要读取未保存 buffer、特定 diff 预览等功能时,不能仅因 daemon prompt 能运行就声明与 stdio 完全一致。
workspaceCwd 必须属于 daemon 的有效工作区;workspace_mismatch 应作为明确配置错误处理。实际使用与 companion 协议见VS Code 集成及Companion 协议。