技术决策
扩展将领域状态、DeepSeek 传输、VS Code 能力和 React 渲染分离,使安全规则在扩展宿主中保持权威。
分层边界
- core 负责与供应商无关的会话、上下文和工具领域逻辑,不导入 React 或具体 HTTP 客户端。
- deepseekApi 负责请求、响应验证、SSE 解析、有限重试和工具调用编排。
- vscodeApi 负责密钥、工作区访问、存储、命令、终端进程、确认以及宿主与 webview 的通信。
- ui 负责 React webview,只有收到宿主消息后才会更改权威工具状态。
按时间排序的事件模型
- 助手输出以类型化的推理、内容和工具组事件持久化,而不是将控制标记嵌入文本。
- 实时流和恢复的历史记录使用同一 timeline 契约,保留 think -> tool -> think -> response 顺序。
- 文本增量按动画帧分组,并在工具组、完成、取消或持久化之前刷新。
- 消息、事件、会话和备用工具调用 ID 使用 crypto.randomUUID()。
工具和终端
- 工具状态使用单一原生生命周期,最终进入 completed、rejected、cancelled 或 error;拒绝不会被编码为执行错误。
- 调用按顺序执行,以保持写入顺序和独立批准;编排器会阻止名称和参数完全相同的重复调用。
- 终端使用 spawn、进程树取消、结构化结果、保留首尾的有界输出,以及非零退出码检测。
- 路径授权会解析真实路径和现有祖先,防止通过 symlink 或 junction 越界。会话会保留所选多根工作区的 URI。
- 已确认的文件写入带有 SHA-256 守卫;如果预览后磁盘内容发生变化,编辑或覆盖会失败。
API、上下文和持久化
- SSE 支持注释、CRLF、带或不带空格的 data 字段、多行事件、解码器收尾、异常 JSON 诊断和 reader 取消。
- DeepSeek 请求使用规范化 URL,每次尝试超时 60 秒;对临时故障最多尝试三次,并遵守 Retry-After。
- 设置和会话历史保存在 ~/.yrs-dpsk-copilot/ 下。历史记录每个会话使用一个经过验证的 JSON 文件,并直接从这些文件生成列表。
- 上下文具有总预算、二进制检测、Git staged 和 unstaged 数据、受限的 AGENTS.md 来源,以及明确的不受信任数据分隔符。