Skip to content
FunCoding

Search

Search docs, Skills and MCP

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_updateonSessionUpdate
普通 permission_requestonPermissionRequest 后向 session 提交选择
ask_user_question 且 questions 为数组onAskUserQuestion,并把 answers 传回 daemon
session_died 且匹配当前 sessionIdonDisconnected
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 协议。