Skip to content

feat(debug): #1210 实现普通 TCP 调试连接与有界生命周期 - #1538

Merged
xiaoyumuxi merged 4 commits into
previewfrom
codex/1210-debug-tcp-lifecycle
Oct 27, 2026
Merged

xiaoyumuxi merged 4 commits into
previewfrom
codex/1210-debug-tcp-lifecycle

Conversation

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

背景与范围

Refs #1210,接续 #1520、#1525。本 PR 包含实际 TCP 实现,不是仅设计文档。

本轮只交付普通 TCP 直连与生命周期;代理、SSH、隧道、端口转发另做方案,不在本 PR 实现。

功能改动

  • 新增共用 MacTCPDebugAdapterTransport,复用 Apple Network;已有语言服务器托管端口与显式外部 DAP 服务共用字节流生命周期。
  • 预留 DebugAdapterConnectionProviding 可替换连接接口,目前唯一实现为直连,不增加代理配置、认证或辅助进程。
  • 建连/端点发现可取消且有期限;直连默认 10 秒、语言服务器端点发现 120 秒。逐次写入 10 秒,队列含在途最多 8 MiB / 1024 次写入,一次仅一个原生写入;不限制已连接会话的空闲时长,不自动重连或重放。
  • 停止、EOF、错误和超时幂等清理 socket、任务、计时器及回调;连接代次隔离旧结果。会话停止时 disconnect 最多排空 1 秒,传输 stop 与失败立即中止;排空不是远端确认或送达保证。
  • 新增 Debug 更多操作中的“连接调试适配器…”入口,支持主机、端口、launch/attach 与适配器 JSON 参数(对象,上限 256 KiB)。配置为一次性、不持久化。
  • adapterEndpoint 独立于 DAP 参数,明确区分 IDE → DAP 适配器与适配器 → debuggee。显式端点不回退到本地进程,不误用 JVM JDWP / gdbserver 地址。
  • 新增 Rust Core debug.validateAdapterEndpoint 和 28 项共享端点 fixture;校验主机、端口及回环分类。非回环连接逐次确认,默认取消,明确提示裸 TCP 不加密、不认证;确认在网络期限开始前完成。
  • 外部服务、共享语言服务器、attach 目标及用户隧道不归 socket 所有;attach disconnect 的 terminateDebuggee=false。外部会话不默认宣称支持未知子会话端点。
  • 保留现有 stdio 与 tcpLanguageServer 回环信任边界;更新配置复制、会话选路、插件撤销归属、共享契约、中英 i18n、架构 Note 和跨平台功能矩阵。

验证

  • Swift 6.3.3 影响范围计时回归:286/286 通过(TCP、插件调试、运行配置集成、Debug Module、菜单覆盖、共享 i18n),不是整个 Swift 测试集。
  • Rust Core 计时回归:1298/1298 通过。
  • 真实临时回环 TCP:双向字节流、分片 DAP 响应、Core initialize → attach → disconnect、外部监听服务继续存活;可控 socket/时钟覆盖取消、限额、超时、旧回调及资源释放。
  • i18n 35/35,通过生成一致性与界面文案检查;服务/共享/Windows 静态边界、运行时发行包只读、Rust 注释/布局/格式、Agent Notes、Core verifier、Java 语义所有权与 diff 检查通过。
  • 实际 base/head 功能矩阵变化 gate 和结构校验通过。
  • 标准 Swift/Rust 桥接验证脚本受本机默认 SDK 与固定编译器不匹配影响未整体通过;显式 SDK 的 ABI 验证器及 12 个原生 Git 桥接集成场景通过。

明确未包含 / 待验收

  • Windows TCP 宿主未实现,功能矩阵如实标注;macOS 完整界面运行时验收保持 pending。
  • 未运行真实 JVM、debugpy、GDB 端到端调试,不声称全部适配器已兼容。
  • 当前入口复用文件调试提供方索引,尚不独立发现仅 attach 或非文件型插件。
  • 不实现 tcpPort/tcpAnnounced 托管进程、代理、SSH、转发、持久化配置或自动重连。

按仓库规则先提交 Draft,避免提前占用 macOS/Windows runner。

Unify hosted and external DAP byte streams behind a replaceable connection provider; reserve the seam for future network routes without adding proxy or tunnel behavior.

Add explicit endpoint validation, per-connection remote consent, a one-shot launch/attach entry, bounded startup/write buffering, generation-fenced callbacks, and bounded disconnect draining. Keep the debuggee target separate and external resources user-owned.

Cover routing, cancellation, queue limits, cleanup and real loopback Core DAP initialize/attach/disconnect. Update shared fixtures, localization, architecture notes and the platform capability matrix. Windows host and real debugger acceptance remain out of scope.
@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 27, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review October 27, 2026 13:42
@lithe-code-review

lithe-code-review Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/1210-debug-tcp-lifecycle · head: 8868056

未发现需要阻塞合并的问题。本次静态审查未发现达到证据门槛的新增代码缺陷;界面改动仍需补充截图。

Scope Check

  • 关联需求: 本 PR 交付 [Feature] 类型化 DebugAdapter Registry 与第三方 DAP 接入现有 Debug UI #1210 的普通 TCP 连接与生命周期子集,不能据此判定整个 Issue 已完成。
  • 已完成范围: 共用 TCP 传输、端点校验与逐次确认、外部会话选路、队列预算、写入期限、有界排空、取消与旧回调隔离;配套更新契约、fixtures、中英 i18n、架构 Note 和功能矩阵。
  • 未完成范围: Windows TCP 宿主、仅 attach 或非文件型插件发现、代理与隧道、真实 JVM/debugpy/GDB 端到端验收;这些限制已在 PR 与功能矩阵中明确披露。
  • 成熟能力复用: 网络字节流复用 Apple Network,DAP 帧与协议状态继续由既有 Rust Core 处理,未发现新增并行领域真源。
  • 问题归属: 未将既有调用链中的历史行为列为本次 Findings,也未要求扩大到已声明的非目标。

Suggestions

  1. 补充 Debug 更多操作菜单的前后对比,以及新增连接表单、非回环确认弹窗和错误状态截图。当前提供的 PR 正文与评论中没有截图,尚无法验证实际布局、控件状态与中英文显示效果;此项不构成 P0/P1 阻塞问题。

Summary

传输层、平台组合根与 DAP 协议层的职责划分清晰。静态调用链支持显式端点不回退本地进程、attach 断开不终止目标,以及停止后拒绝旧连接回调的设计。新增测试覆盖主要传输边界,但这些证据尚不能替代真实适配器兼容性与完整 UI 工作流验收。

Verification

  • 实际检查: 固定范围 edb8c36...8868056,核对完整 36 文件清单;审查 TCP/native socket、托管与插件传输、外部配置及 UI、会话管理与 Core 协议调用链、Rust dispatcher/端点校验、测试、fixtures、i18n 源文件、功能矩阵和相关 Notes。生成字符串表仅核对变更清单,未读取正文。
  • 已提供结果: PR 作者报告受影响 Swift 回归 286/286、Rust Core 1298/1298、i18n 35/35,以及相关静态检查通过;本次未独立复验,提供的上下文中 head 暂无 Check Run 结果。
  • 验证限制: 作者说明标准 Swift/Rust 桥接脚本因 SDK 与编译器不匹配未整体通过;显式 SDK ABI 验证及 12 个原生 Git 桥接场景通过,不能视为标准桥接检查整体通过。
  • 本次未运行: 未运行任何仓库代码、构建、验证脚本、测试或应用;未修改文件、访问网络或发布评论。
  • 仍待补充: UI 截图与 macOS 完整界面验收;真实 JVM/debugpy/GDB 兼容性及外部服务存活验证。Windows TCP 宿主仍为未实现,矩阵已如实标注。

- 被拒绝或不可达的端口立即以系统原因失败,不再停在 .waiting 等满超时
- 端点发现与建连各自独立计时:发现 120 秒(语言服务器冷启动),建连 10 秒
- 外部适配器会话初始化期限改为 10 秒建连加 10 秒握手,不再抢在建连之前结束
- 连接对话框在连接启动前保持打开,失败原因留在对话框内并保留已填内容
- connectExternalDebugAdapter 返回失败原因,不再静默丢弃请求
- 当前文件没有调试提供方时,"连接调试适配器…"菜单项不可用;主机名先去除首尾空白
- 删除宿主端口传输中无人使用的错误分支
- 补充发现/建连两段期限与真实回环拒绝连接的测试,同步 Agent Note 与功能矩阵
连接状态转换、取消规则、代次令牌与过期结果拒绝、只结束一次、
建连/写入/排空期限、待发字节与消息预算、单个在途写入,原先都写在
macOS 的 MacTCPDebugAdapterTransport 里,Windows 接入要重写并重新
证明同一套规则。现在这些规则由 Core 的独立状态机持有,平台只做 I/O。

Core(rust/lithe-core/src/debug/transport_lifecycle.rs)
- 与 DAP 协议状态机独立,按 transportId 登记。
- 新增命令 debug.transport.policy / handle / release:平台发送事件,
  Core 返回新代次、阶段、结果和有序效果(发现端点、设置或取消计时器、
  连接、写入、投递数据、关闭、报告失败、通知终止)。
- Core 没有时钟,只决定期限长短和到期后的转换;待发数据只以字节数
  越过 JSON 边界,真实字节、socket 与计时器句柄留在平台。
- 共享 fixture shared/fixtures/debug/transport-lifecycle-v1.json 覆盖
  约 28 个场景,Rust 逐步回放;已登记到 v1-baseline。

macOS
- 新增 RustDebugTransportCore.swift 类型化桥接。
- MacTCPDebugAdapterTransport 只拥有 NWConnection、端点发现任务、待发帧
  字节和系统计时器,并执行 Core 返回的效果;core 参数贯穿托管端口、
  插件和外部端点三条传输,会话初始化期限改读 Core 策略。
- 计时器触发后也释放句柄,避免排空计时器继续持有传输。
- Core 调用本身失败时本地静默拆除并向所有者报告一次。

已接受的行为差异:观察者在错误输出回调里调用 stop() 时,终止通知
现在仍会送达(旧实现把它当作生命周期被替换而吞掉);重启仍会使旧
通知作废。

文档:更新 Agent Note、功能矩阵与 rust-core-api 契约。
合并 preview 并解决共享 i18n 冲突,保留 TCP 连接与反汇编的双方词条并重新生成语言资源。

桥接故障后立即清理 socket、计时器与缓冲,重启使用新登记 ID,隔离旧回调和终止通知。外部连接表单等待 DAP 初始化,失败保留输入,取消仅停止本次会话。

补齐回归测试、契约说明、Agent Note 与功能矩阵。验证:Swift 332/332、Rust 1313/1313、i18n 35/35,以及边界、矩阵和 bundle 只读检查。
@xiaoyumuxi
xiaoyumuxi merged commit 0beb43c into preview Oct 27, 2026
6 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: medium ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant