Skip to content

fix(macos): 修复 Java 启动竞态、插件启动参数与无限重试 - #1526

Merged
xiaoyumuxi merged 5 commits into
previewfrom
codex/issue-1524-java-startup-race
Oct 28, 2026
Merged

xiaoyumuxi merged 5 commits into
previewfrom
codex/issue-1524-java-startup-race

Conversation

@arkleselect

@arkleselect arkleselect commented Oct 27, 2026 •

Copy link
Copy Markdown
Collaborator

问题与结果

macOS 打开工作区时,旧模块图的异步清理可能取消新启动的 Java 会话,使导航一直停在 preparing;另外,Java 插件启动入口丢失宿主集成参数,导致 Equinox 立即退出、持续重启,并往应用包写入配置状态和日志。本 PR 修复两条启动链路,使 Java 服务正常就绪并提供定义导航。

Closes #1523
Closes #1524

改动

  • 语言能力激活先等待模块清理结束,再检查取消状态和能力缓存;维护入口不再直接复用旧 session,测试扩展激活也等待清理。
  • 文档触发的语言服务激活在清理结束后重新检查工作区身份及文档是否仍打开;插件激活与语言模块激活使用相同的等待边界。
  • 当前 Java 准备操作收到 stopped 后取消 owner 并退出 preparing,保持 operation ID 过滤,避免旧事件覆盖新操作。
  • 插件启动统一传递宿主集成、运行 JVM、JDT 资源、平台缓存、工作区指纹、Maven/Gradle 上下文,以及 workspace configuration 和 host services;保留插件进程归属。
  • 复用现有 Rust JDT 启动适配与缓存中的可写 Equinox 配置副本,保持发行目录只读;没有新增依赖、资源目录或公共插件协议。
  • 同一工作区的语言服务连续三次未成功启动后停止自动重试,复用原失败原因;ready、显式停止/重启或切换工作区后可重新尝试。
  • 增加清理闸门、取消、陈旧事件、启动参数和重试限制回归测试,同步生命周期/Java 插件决策笔记与平台功能矩阵。

审查与验证

  • 本地代码审查:未发现需要阻塞合并的问题。
  • 153 个 Swift 回归测试通过(6 suites),另有 9 个桥接测试通过;C ABI、链接符号及 Git 执行集成验证通过。
  • 两轮真实 macOS 应用启动均一次进入 ready,无启动失败或取消;Command 点击 getOrder 定位 OrderController.java,normalizeId 定位同文件方法,findOrder 定位 OrderService.java。用户复测反馈问题不再出现。
  • 两轮启动/导航前后,应用包 1,401 个文件/链接的清单及内容哈希保持不变。测试应用、JDT LS 与辅助进程均已退出,临时 app 已清理。
  • 测试稳定性、运行时包只读、Agent Notes(160)、平台矩阵(209)、矩阵变更门禁、i18n 生成/语言检查和 diff 检查通过。

验证限制

  • 首轮后续后台请求曾出现超时,第二轮未复现,保留日志;不宣称本 PR 已修复所有后台请求超时。
  • 未修改的 RunLaunchEnvironment.swift:50 存在 PATH 默认值,现有 service-boundary 检查仍会报告该基线问题。
  • 全量 Rust 检查 1,244 通过、8 个 Git 夹具因机器默认分支为 main 而失败(夹具假定 master);仅为测试进程指定 init.defaultBranch=master 后,相关 20 个测试通过。未修改全局 Git 配置。
  • 本次修改 macOS,Windows 未进行运行验证;平台矩阵的整体验证状态保留 pending。

CI 跟进

  • 修复新增生命周期回归测试的正文截止:使用 WorkbenchTestScope.run,超时后释放闸门、取消请求并清理;相关 8 个测试通过。
  • CI 的 3,092 个 Swift 测试通过后,独立 DMG 集成测试在镜像创建 98% 时触发 20 秒子进程截止。仅将 diskutil 创建期限校准为 30 秒,保留单测试 45 秒和套件 120 秒上限、原镜像格式与签名/挂载/回退断言。本机复核该集成测试通过(约 1.5 秒),确认无残留挂载。

Review:关闭项目后的延后激活

修复 shutdownProjectSession() 与延后语言激活之间的关闭边界:在首次挂起前标记会话结束并使工作区身份失效;语言协调器等待清理后检查会话是否仍有效,以取消结束关闭会话的激活与测试扩展请求。窗口处于后台不等于关闭,仍可运行语言服务。

新增真实 AppModel 回归测试,按“暂停模块清理 → 保留受支持文档并排队激活 → 关闭项目会话 → 释放清理”执行,同时覆盖维护激活;断言工作区 URL 和文档虽被保留,语言能力与进程仍不会恢复。相关 164 个测试通过(10 suites);包只读、测试稳定性、i18n、Agent Notes 与平台矩阵检查通过。

Review:生产桥接覆盖与交互证据

  • 新增 RustLanguageServerLaunchTests,直接经过生产 RustCoreBridge、C ABI 和真实 Core 启动本地标准输入输出协议进程,覆盖通用插件与 JDT 两条路径,不经过协议默认回退。断言插件身份隔离、workspace configuration、credentials host service 往返、运行时选择、JDT launcher/lombok/extension 参数、可写配置与 workspace 缓存路径、工作区指纹;确认原配置目录未改变。Maven/Gradle 非空上下文映射不在本新增用例覆盖范围。
  • 夹具使用 macOS 开发工具提供的 Python,无 JVM 或网络依赖;Core 负责子进程,测试停止并销毁会话、删除临时资源。用例归入常规 Swift 测试,不依赖插件包验证任务。
  • 本轮相关 18 个测试、3 个 suites 通过(新增参数化用例的两个路径均通过,测试执行约 3.1 秒),测试稳定性报告已生成。运行时包只读、i18n、Agent Notes、平台矩阵及矩阵变更门禁通过。
  • 本轮仅增加测试、文档和证据,未改变生产实现;截图来自 04ff2fe 生产代码的真实 macOS 应用。应用就绪后,在 Main.java 中 Command 点击 getOrder,打开 OrderController.java 并选中方法声明。截图仅含合成测试项目;应用、JDT LS 和临时预览实例已关闭、清理。本轮截图采集未另做包哈希对比,前两轮包哈希结果见上文。

Java ready:

Java service ready

Command 点击 getOrder 后定位方法定义:

getOrder definition navigation

@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 27, 2026
@arkleselect
arkleselect marked this pull request as ready for review October 27, 2026 05:28
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/issue-1524-java-startup-race · head: 7a60cef

未发现需要阻塞合并的问题。

Findings

  1. [P2] 为生命周期回归测试的任务等待设置本地截止
    macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift:73

    • 实际影响:这里及第 76 行直接等待 request.value,没有本地截止。WorkbenchTestScope.withCleanup 仅为清理操作设置截止,不限制测试正文;受测激活或清理卡住时,测试也会挂起,无法进入清理,只能等待外层看门狗。
    • 触发条件:释放清理闸门后,模块关闭或语言能力激活未能完成。
    • 复现步骤:让注入的 shutdownRuntime 在闸门释放后保持挂起,运行任一参数组合;request.value 不返回,现有 finished 闸门也没有用于有界等待。该路径由静态调用链确认,本次未运行。
    • 来源:本次引入。

Scope Check

Suggestions

  1. 在测试正文中使用 WorkbenchTestScope.run 包裹初始激活和请求结果等待,或先有界等待 finished、确认任务结束后再读取结果;超时后仍应执行取消、释放闸门及资源清理。
  2. 补充修复后 Java 就绪及定义导航的截图或录屏。上下文中的附件仅展示故障状态,尚无修复后的交互对比。

Summary

生产改动与现有生命周期边界一致,插件启动保留了插件归属,并将 JDT 资源交给已有 Rust 适配层处理。未发现明确功能回归;主要建议是补齐新增并发测试的等待截止。

Verification

  • 本次仅进行指定 base...head 的静态只读审查,未修改文件、运行代码或测试、访问网络。
  • 作者报告:153 个 Swift 回归测试、9 个桥接测试及相关检查通过;两轮 macOS 启动与导航成功,bundle 文件清单和哈希不变。这些结果未独立复验。
  • 提供的 Check Run 中 Swift、Rust Core 等测试为 skipped,部分分类检查仍 queued;平台 gate 成功不能单独证明相关测试已运行。
  • 非阻塞验证缺口:Windows 未实机验证;新增插件参数测试走协议默认回退,未直接验证生产适配器中插件身份、配置与 host services 的组合传递;修复后的视觉交互尚未验证。

@arkleselect

Copy link
Copy Markdown
Collaborator Author

@lithe review

@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/issue-1524-java-startup-race · head: 09eca09

未发现需要阻塞合并的问题。

Findings

  1. [P2] 在项目会话关闭时撤销延后的语言服务激活
    macos/Sources/Lithe/Models/AppModel/AppModel.swift:1364

    • 实际影响:这里创建的任务没有被保存或取消。原生窗口关闭后的清理结束时,它仍可重新激活语言模块并启动 LSP;Settings 保留关闭的 AppModel 时,新进程会继续存活。
    • 触发条件:文档激活正在等待模块清理,用户在等待结束前关闭项目窗口。
    • 复现步骤:用闸门暂停模块清理,对仍打开的受支持文档调用 activateLanguageServerIfAvailable,再让 shutdownProjectSession() 加入该清理,最后释放闸门。关闭路径不清空文档,也不改变工作区 URL 或 generation,因此这里的身份和文档检查仍通过;DocumentLanguageCoordinator.stop() 只取消提示刷新任务,无法取消此任务。随后会再次进入语言服务激活。
    • 来源:本次引入。新增等待分支把启动推迟到清理完成之后,却没有区分工作区切换清理和会话最终关闭。

Scope Check

Suggestions

  1. 持有延后激活任务,在 shutdownProjectSession() 入口撤销;或加入明确的会话关闭状态/generation,并在等待后检查。增加“暂停清理 → 排队激活 → 关闭会话 → 释放清理”的回归测试,断言模块和进程不会重新启动。
  2. 补充修复后 Java 就绪和定义导航的截图或录屏。现有上下文只有故障截图,尚未验证修复后的可见交互。

Summary

主体修复符合现有模块和 JDT 资源所有权边界。上一轮提出的测试正文无界等待已通过 WorkbenchTestScope.run 处理;剩余建议集中在延后启动任务的关闭与取消。

Verification

  • 本次仅静态审查指定 base...head;未修改文件、运行代码或测试、访问网络。
  • 提供的 head 检查中,Swift、Rust Core、Windows 前端、Windows Rust 和真实 JDT 测试均为 success;发布包及插件包验证为 skipped。
  • 作者报告两轮 macOS 启动与导航成功、bundle 清单和哈希不变,以及稳定性、i18n、矩阵等检查通过;本次未独立复验。
  • 非阻塞验证缺口:本次 macOS 改动未进行 Windows 实机验收;新增插件参数测试使用协议默认回退,未直接断言生产适配器同时传递插件身份、配置及 host services;修复后的视觉交互尚未验证。

@arkleselect

Copy link
Copy Markdown
Collaborator Author

@lithe review

@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/issue-1524-java-startup-race · head: 04ff2fe

未发现需要阻塞合并的问题。

Scope Check

  • 关联需求:按提供的 Issue 上下文审查 [Bug] macOS Java 插件启动 JDT LS 后立即退出并持续重启,日志写入 app bundle #1523 和 [Bug] macOS 打开工作区时旧模块清理取消新 Java 会话,导航持续卡在 preparing #1524;改动覆盖 Java 插件启动参数与重试上限、旧模块清理等待、停止事件收尾,以及项目会话关闭后的延迟激活边界。
  • 已完成范围:检查了确定性清单中的全部 19 个文件,并追踪语言模块激活、项目会话关闭、Java 会话状态、插件启动到 RustCoreBridge 的调用链。
  • 未完成范围:作者说明未进行 Windows 实机验收;提供的 CI 中插件包验证为 skipped。
  • 上游复用:继续通过既有 Rust JDT 启动适配准备 Equinox 可写配置副本;未发现新增并行 Java 语义实现或运行时发行目录写入。
  • 本次引入或加剧的问题:未确认有符合阻塞标准的生产缺陷。
  • 职责范围:启动生命周期、插件参数传递及重试控制均属于本次变更范围。

Suggestions

  1. 为新增的插件启动路径补充经过生产 RustCoreBridge 适配器的回归断言。RunConfigurationIntegrationTests.swift:2519 使用的 TestLanguageServerRuntimeCore 只实现常规 startLanguageServer;协议默认实现会把该用例路由到常规启动方法。因此测试没有覆盖生产适配器向 lspStartServer 传递插件身份、workspace configuration、host services 和 JDT 启动上下文的映射。
  2. PR 上下文提供的是故障状态截图,没有修复后 Java ready 和定义导航的截图或录屏。补充修复后的交互证据,便于核对用户可见结果;本次静态审查未验证视觉效果。

Summary

静态代码显示清理闸门、工作区身份检查、匹配 operation 的停止收尾和三次启动失败上限已接入;插件启动参数也沿生产适配器传入 Rust 请求。未发现需要阻塞合并的问题,剩余建议集中在适配器测试覆盖和修复后的交互证据。

Verification

  • 实际检查:指定的 ce7098c09d3faba9783600dc33985c49ae42868f...04ff2fe7b7650e72f1334a6f0cf654dae79532ef 差异、全部 19 个清单文件,以及模块清理、语言激活、Java 启动与 Rust 适配调用链。
  • 提供的 head Check Run 显示 macOS/Swift、Rust Core、Windows gate 与 Windows 测试成功;插件测试和包验证为 skipped。PR 描述还报告了 164 个 Swift 测试及真实 macOS 启动、导航和 bundle 哈希验证,这些结果未独立复验。
  • 本次未运行测试、验证脚本或应用,也未访问网络,遵循只读审查限制。
  • 非阻塞缺口:修复后的可见交互没有截图;Windows 未进行实机运行验证;新增插件参数用例未直接覆盖生产适配器映射。

@arkleselect

Copy link
Copy Markdown
Collaborator Author

@lithe review

@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ✅ 通过
范围: preview ← codex/issue-1524-java-startup-race · head: df626c3

未发现需要阻塞合并的问题。

Scope Check

Summary

生命周期检查与现有模块边界一致。新增生产桥接测试覆盖通用插件和 JDT 路径,补充了此前协议默认回退测试未覆盖的插件归属、配置、host services 与缓存参数映射。新增并发测试通过闸门及正文截止控制等待,并保留取消和清理路径。

Verification

  • 本次仅静态审查指定 base...head;未修改文件、运行代码或测试、访问网络。
  • 提供的 head Check Run 显示 Swift、Rust Core、arm64 发布包验证及 Windows 相关测试成功;插件测试与包验证、Rust 远程工作区测试为 skipped。
  • 作者报告真实 macOS 启动、定义导航及两轮 bundle 清单和哈希验证通过;这些结果未独立复验。
  • 上下文已提供修复后 Java ready 和定义导航截图链接;本次未读取图片,视觉效果未独立验证。
  • 非阻塞缺口:新增生产桥接用例未覆盖非空 Maven/Gradle 上下文;作者未进行 Windows 实机验收,平台矩阵保留 pending。

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

等一下哦,这个我们把 Java 的 LSP 插件化之后再看看要不要合入,因为可能有不符合的地方

@arkleselect

arkleselect commented Oct 28, 2026 via email

Copy link
Copy Markdown
Collaborator Author

@xiaoyumuxi
xiaoyumuxi merged commit 446ebf4 into preview Oct 28, 2026
18 checks passed
@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

好吧 这个问题在我电脑一直存在 修不好这个跳转类方法的功能不太好加,要不然我就这两个放一块,要不我就等下 Xiaoyumuxi @.>于2026年10月28日 周三上午11:34写道:
…
xiaoyumuxi left a comment (1lck/Lithe-IDEA#1526) <#1526 (comment)> 等一下哦,这个我们把 Java 的 LSP 插件化之后再看看要不要合入,因为可能有不符合的地方 — Reply to this email directly, view it on GitHub <#1526?email_source=notifications&email_token=BHXJZ6XRPPSNWHZDY72PHTD5WFSLHA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTMNBVHE4TONZZGM22M4TFMFZW63VGMF2XI2DPOKSWK5TFNZ2KYZTPN52GK4S7MNWGSY3L#issuecomment-6459977935>, or unsubscribe https://github.com/notifications/unsubscribe-auth/BHXJZ6WXL7DBBLSW5TDDP4L5WFSLHAVCNFSNUABGKJSXA33TNF2G64TZHMYTGMRQGA4TCOBRGY5US43TOVSTWNRQGUZTIMJVGM2TNILWAI . You are receiving this because you authored the thread.Message ID: @.
>

没事,那就先合入吧,后面出问题了再修

1lck added a commit that referenced this pull request Oct 29, 2026
* feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步) (#1520)

* feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步)

debugAdapters 新增 tcpLanguageServer 传输,用于调试服务寄居在同一插件语言服务器里的适配器(Java Debug Server 之于 JDT LS)。该传输没有 launch.process,endpoint 只有 {languageID, command}:languageID 必须是同一插件 languageServers[] 里声明过的,command 限 [A-Za-z0-9._:-]{1,128}。宿主不拉起进程,而是启动该插件的语言服务器,用 workspace/executeCommand 执行 command,把返回值解析成 1…65535 的端口后连接 127.0.0.1。

Rust Core:DebugLaunch.process 改为可选(其他传输仍必填),新增 DebugTransport::TcpLanguageServer 与 DebugEndpoint 校验;programs() 产出 languageServerDebugAdapter,命令变化需要重新批准;debug_adapter_launch_plan 对无进程适配器返回插件语言服务器的启动计划和 debugAdapter 描述符。

macOS:DebugAdapterProcess 换成 DebugAdapterLaunch(host 为 .process 或 .languageServer);MacJavaDebugAdapterTransport 改名 MacHostedPortDebugAdapterTransport,端口来源由宿主注入,不再知道 Java;LanguageToolingSessionManager 新增 startHostedDebugAdapter,校验语言服务器确由该插件拥有,内置 Java 语言服务被拒绝;端口解析抽成 debugAdapterPort(from:)。tcpPort、tcpAnnounced、attach 和 runSelectedRuntime 仍被拒绝,拒绝文案改为只支持 stdio 与语言服务器承载的适配器。

契约与文档:plugin-manifest.schema.json、契约 README、rust-core-api.md、声明草案和 #1210 Agent Note 同步,新增 debug-adapter-language-server 契约 fixture;功能矩阵补充证据与验证说明。i18n:3 条 Java 专属文案改为通用文案,新增 3 条,调整传输拒绝文案,并重新生成产物。

测试:Rust 新增 3 个 Core 测试;Swift 新增解析器、传输、端口解析(16 个用例)与语言服务器归属测试。

* fix(debug): activate hosted language servers and cancel stale adapter starts

* fix(ci): respect runtime boundaries and stabilize native regression tests

* Merge pull request #1534 from 1lck/codex/remove-bot-pr-workflow

chore(ci): remove unused GitHub App Bot PR workflow

* feat(debug): #1210 远程 attach 契约与普通 TCP 生命周期边界 (#1525)

* feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步)

debugAdapters 新增 tcpLanguageServer 传输,用于调试服务寄居在同一插件语言服务器里的适配器(Java Debug Server 之于 JDT LS)。该传输没有 launch.process,endpoint 只有 {languageID, command}:languageID 必须是同一插件 languageServers[] 里声明过的,command 限 [A-Za-z0-9._:-]{1,128}。宿主不拉起进程,而是启动该插件的语言服务器,用 workspace/executeCommand 执行 command,把返回值解析成 1…65535 的端口后连接 127.0.0.1。

Rust Core:DebugLaunch.process 改为可选(其他传输仍必填),新增 DebugTransport::TcpLanguageServer 与 DebugEndpoint 校验;programs() 产出 languageServerDebugAdapter,命令变化需要重新批准;debug_adapter_launch_plan 对无进程适配器返回插件语言服务器的启动计划和 debugAdapter 描述符。

macOS:DebugAdapterProcess 换成 DebugAdapterLaunch(host 为 .process 或 .languageServer);MacJavaDebugAdapterTransport 改名 MacHostedPortDebugAdapterTransport,端口来源由宿主注入,不再知道 Java;LanguageToolingSessionManager 新增 startHostedDebugAdapter,校验语言服务器确由该插件拥有,内置 Java 语言服务被拒绝;端口解析抽成 debugAdapterPort(from:)。tcpPort、tcpAnnounced、attach 和 runSelectedRuntime 仍被拒绝,拒绝文案改为只支持 stdio 与语言服务器承载的适配器。

契约与文档:plugin-manifest.schema.json、契约 README、rust-core-api.md、声明草案和 #1210 Agent Note 同步,新增 debug-adapter-language-server 契约 fixture;功能矩阵补充证据与验证说明。i18n:3 条 Java 专属文案改为通用文案,新增 3 条,调整传输拒绝文案,并重新生成产物。

测试:Rust 新增 3 个 Core 测试;Swift 新增解析器、传输、端口解析(16 个用例)与语言服务器归属测试。

* feat(debug): #1210 远程 attach 契约:attach 配置声明 connection 绑定,适配器在远端的设计 Note

- attach 配置的 targetBindings 新增 connection:host+port 或 address,目的地是适配器参数里的点分路径(最多 4 段),可选 pathMappings(objects/first 两种形状)
- 声明期拒绝目的地冲突(与其他目的地、processId/cwd 参数或默认 arguments 重名/包含),运行期 set_argument 只写空位
- debug.adapters.startArguments 支持 connection 目标,校验主机/端口/映射,返回 connection:{host,port,remote};回环只按字面量判断,其余一律 remote:true
- 适配器没有路径映射绑定而目标带了映射时拒绝,而不是悄悄丢弃
- plan 描述符新增 remoteAttach:{pathMappings},宿主据此决定界面,不按适配器名字判断
- 不新增权限,debug.attach 已覆盖;契约 README、schema、rust-core-api、fixture(含 22 条新拒绝用例)、功能矩阵同步
- 新增 Agent Note:适配器运行在远端——经 SSH 的 stdio 调试(仅设计,待确认四项默认选择后再实现),并更新统一调试 Note

* feat(debug): #1210 远程 attach 兼容性审计:路径映射补 dictionary / pairs 两种形状,缺口清单与路线图

按各调试器上游文档核对“附加到远端程序”的参数写法后,路径映射就四种写法:
- objects:对象列表(debugpy pathMappings、delve substitutePath)
- first:唯一一条映射写成两个字符串(js-debug localRoot/remoteRoot)
- dictionary:以 local 或 remote 一侧为键的对象(CodeLLDB sourceMap、PHP pathMappings)
- pairs:二元数组列表,order 为 remoteLocal 或 localRemote(lldb-dap sourceMap)

形状装不下用户给的映射就拒绝,不截断:first 只接受一条(此前只取第一条,与
“不悄悄丢映射”的原则矛盾,属于未发布 API 4 内的行为修正),dictionary 在键的
一侧不能出现同一个根两次,违反返回 debug.target.invalid(target.pathMappings)。
plan.debugAdapter.remoteAttach 增加 maxPathMappings,宿主据此决定最多显示几行。

契约与 fixture:schema 增加两个 oneOf 分支;remote-attach fixture 增加 keyed、
paired 两个适配器(共 6 个);拒绝用例新增 6 条(共 28 条)。

Note:#1210 统一 Note 新增“兼容性审计”,逐个适配器标注“已核对 / 待核验”,列出
G1–G11 缺口(空闲端口占位符、tcpConnect、监听 attach、URI 目标、命令模板等)的
现状、决定和触发条件,并更新后续路线;SSH Note 说明适配器原生映射与 Core 路径翻译
是叠加的两层,远端适配器必须由 Core 翻译。

* docs(debug): separate network paths from TCP lifecycle scope

* feat(debug): #1210 内置汇编级调试:反汇编、指令步进、指令断点、寄存器与只读内存 (#1527)

* feat(debug): #1210 内置汇编级调试:反汇编、指令步进、指令断点、寄存器与只读内存

内核按适配器能力开放汇编级调试,插件只负责启动 lldb-dap/gdb 等适配器;能力快照 supported = 适配器声明 ∧ 已注册扩展 ∧ 已授权。

- 无源码栈帧:栈帧不伪造文件和第 1 行,显示函数名与地址,暂停后自动打开反汇编

- 反汇编:debug.inspect disassemble 与反汇编视图,高亮当前指令,保持最小滚动,剩余不足时向后续读

- 指令步进:debug.execute 增加 granularity,仅适配器声明 supportsSteppingGranularity 时生效;反汇编打开时步过/步入按指令前进,面板头部与按钮提示同步变化,不支持时提示仍按源码行前进

- 指令断点:debug.setInstructionBreakpoints,点击地址栏设置或移除;只属于当前会话,不持久化、不重放

- 寄存器:作用域 presentationHint registers 显示为寄存器标签;宿主不内置 CPU 寄存器表

- 内存:debug.inspect readMemory,接受地址或保存着地址的表达式,从目标前 64 字节读起并分页;目标字节在十六进制和 ASCII 两侧高亮并滚入可见区;右侧显示设置可切换进制、每格字节数、每行字节数、字节序与 ASCII 列;读不到的字节显示为缺失;只读,不开放 writeMemory

- 单步局部刷新:next/stepIn/stepOut/stepBack 保留现有检查数据并原地替换,线程、调用栈、变量、反汇编、内存与 JSON 视图不再整面板清空,变化的内存字节被标出;继续、暂停、结束才清空

- 变量 JSON 视图:修复顶部空白带,key/value 分色高亮

- i18n:新增词条走 shared/i18n 并生成;功能矩阵新增 debug-disassembly(Windows 待实现);设计笔记补充真实 lldb-dap 验证结论

* fix(debug): #1210 guard retained inspection across steps and cancellation

Freeze the old variable tree before the next stop reloads scopes and keep inspection controls read-only until replacement. Retire disassembly and memory callbacks before synchronous cancellation, and reject stale disassembly retries after session changes. Clear retained inspection when transport fails or the session terminates.

Label memory offsets relative to the requested reference, use shared text-input and font owners, and update the owning decision note and platform verification steps.

Add four deterministic regressions reproduced against the original PR. Validation: 152 selected Swift tests and 72 Rust debug tests passed; i18n, shared contracts, platform boundaries, test stability, Agent Notes, matrix gates and runtime bundle immutability passed. Real GUI and Windows runtime validation remain pending.

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

* feat(debug): #1210 implement direct TCP adapter lifecycle

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.

* fix(debug): #1210 修复 TCP 调试连接评审问题

- 被拒绝或不可达的端口立即以系统原因失败,不再停在 .waiting 等满超时
- 端点发现与建连各自独立计时:发现 120 秒(语言服务器冷启动),建连 10 秒
- 外部适配器会话初始化期限改为 10 秒建连加 10 秒握手,不再抢在建连之前结束
- 连接对话框在连接启动前保持打开,失败原因留在对话框内并保留已填内容
- connectExternalDebugAdapter 返回失败原因,不再静默丢弃请求
- 当前文件没有调试提供方时,"连接调试适配器…"菜单项不可用;主机名先去除首尾空白
- 删除宿主端口传输中无人使用的错误分支
- 补充发现/建连两段期限与真实回环拒绝连接的测试,同步 Agent Note 与功能矩阵

* refactor(debug): #1210 将 TCP 调试连接生命周期下沉到 Rust Core

连接状态转换、取消规则、代次令牌与过期结果拒绝、只结束一次、
建连/写入/排空期限、待发字节与消息预算、单个在途写入,原先都写在
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 契约。

* feat(plugins): Java Support 独立分发、迁移与按需安装 (#1483)

* feat(plugins): 支持 Java 签名安装与双架构独立发布基础

* feat(plugins): 完成 Java Support 迁移与按需分发入口

* fix(plugins): suggest Java restoration after completed removal

* docs(plugins): inventory Maven and Java migration for #1495 (#1513)

* fix(run): 统一跨平台启动环境、容错扫描与构建事件过滤 (#1543)

* fix(run): share launch environment and resilient workspace policies

* fix(run): stop shared Java enumeration at its source limit

* docs(plugins): plan macOS public APIs and SDK documentation (#1548)

* feat(plugins): #1495 原生 Provider 工作流与只读工程模型共享 (#1517)

* feat(plugins): execute native build tasks in workspace providers (#1495)

* feat(plugins): discover and execute native provider tests (#1495)

* feat(plugins): prepare and persist provider application runs (#1495)

* feat(plugins): prepare native provider debug sessions (#1495)

* feat(plugins): share read-only provider model inputs (#1495)

* fix(build): isolate producer revisions and own run saves

* feat(plugins): Java Support 独立分发、迁移与按需安装 (#1483)

* feat(plugins): 支持 Java 签名安装与双架构独立发布基础

* feat(plugins): 完成 Java Support 迁移与按需分发入口

* fix(plugins): suggest Java restoration after completed removal

* docs(plugins): inventory Maven and Java migration for #1495 (#1513)

* fix(run): 统一跨平台启动环境、容错扫描与构建事件过滤 (#1543)

* fix(run): share launch environment and resilient workspace policies

* fix(run): stop shared Java enumeration at its source limit

* docs(plugins): plan macOS public APIs and SDK documentation (#1548)

---------

Co-authored-by: Lichenkang <2188718831@qq.com>
Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>

* fix(macos): 修复 Java 启动竞态、插件启动参数与无限重试 (#1526)

* fix(macos): stabilize Java startup and plugin launch (#1523, #1524)

* test(macos): bound language startup regression task waits

* test(macos): allow disk image creation margin within integration budget

* fix(macos): revoke deferred language activation when project session closes

* test(macos): cover production language launch and navigation evidence

* fix(ide-host): include ttlMs and cacheScope in MCP tools/list (#1545) (#1546)

The helper advertises protocol revision 2026-07-28 through server/discover.
For that revision ListToolsResult extends CacheableResult, where ttlMs and
cacheScope are required, but building the result with ..Default::default()
left both fields absent. Clients validating the negotiated wire shape
rejected the whole server with INVALID_RESULT (ZCode 0.17.0, Qoder).

The catalog describes live IDE state, so the result is immediately stale
(ttlMs 0) and private to the connected client.

Co-authored-by: jiaqizhang258 <321343564+jiaqizhang258@users.noreply.github.com>
Co-authored-by: Lichenkang <2188718831@qq.com>

* fix(mcp): 稳定 Windows 请求调度与授权生命周期 (#1549)

* fix(mcp): stabilize Windows request delivery and protocol discovery

* fix(mcp): recover independent notifications and enforce monotonic deadlines

* fix(macos): 独立多 Diff 标签与连续滚动、工作树管理体验 (#1555)

* fix(macos): support independent diff tabs and continuous Git browsing

- isolate diff sessions, editor groups, focus, navigation and async reads
- auto-load disassembly, Git/worktree history, VCS and MCP discovery lists
- preserve scroll anchors and suppress background Git command noise
- add worktree change management and shared localized actions
- organize develop-lithe guidance in Chinese and update capability records
- repair per-toolchain SwiftPM resource caches and add regression coverage
- align affected macOS code with the pinned Swift 6.3.3 compiler

Refs #1210

* fix(macos): 工作树更改页即时暂存、工具栏精简与 Git 控制台取消过滤

工作树「更改」页
- 勾选复选框后立即显示目标暂存状态(乐观显示),Git 完成后以实际结果为准;
  仅等待本工作树状态扫描完成即恢复可点击,不再被全项目刷新阻塞。
- 工具栏只保留有实际动作的按钮:刷新、暂存全部、丢弃所选、显示 Diff;
  移除灰显无作用的占位按钮,启用条件与选区/可暂存项一致。
- 提交历史页脚在加载中/失败/空闲都有固定行高内容,不再留空白带。
- 概览动作改为自然宽度的单一换行流,宽窗口详情自适应两列。

Git 控制台
- 在任何命令启动前就被取消(被后续请求取代)的请求不再显示为失败行;
  已启动命令的取消仍保留并标注原因。同步更新共享契约、fixture 与 Windows journal。

其他
- Git Log 筛选弹窗/图/Diff 的布局与滚动细节调整,补充对应测试与中英词条。
- 同步 git-worktrees 平台能力记录。

* fix(macos): 修复多 Diff 标签刷新、历史重试、反汇编宽度与保存更改比较的评审问题

- 状态刷新只在本次真正读取过状态的仓库内才把"缺席"当作文件已干净;链接工作树的标签不再被
  工作区刷新误关,由该工作树自己的状态读取(refreshWorktreeChanges)决定是否关闭
- 工作区/目录比较刷新内容未变时不再给会话的 @published 属性赋值(不重绘、不丢滚动位置);
  新增 GitRepositoryDiffSession.updateDocument,同时比较补丁与行(与 HEAD 的比较没有补丁文本)
- 目录比较刷新改为就地更新(showDirectoryDiff 增加 refreshingConfirmedRoots),不再清空行并闪现加载态
- 提交历史加载失败后的显式重试按已加载条数重新打开窗口,不缩回首页、不移动选择
- 反汇编列表只对最长候选行做文字测量,不再每次 body 求值都测量全部行
- 保存更改比较恢复"快照属于当前仓库"的校验,并在打开标签前校验版本与文件,避免留下空标签
- 补充回归测试,并更新两份 Agent Note

* fix(remote): #1507 远程工作区、构建与插件执行适配 (#1515)

* fix(remote): adapt workspace I/O and plugin execution for #1507

* fix(remote): continue #1507 common backend lifecycle and plugin validation

Integrate PR #1515 onto the preview baseline, preserving plugin live activation and shared i18n changes. Reserve pending process, terminal and watch starts before dispatch; retain cleanup ownership across cancellation, worker saturation, disconnect and session shutdown.

Add deterministic lifecycle and declarative remote launch regressions; isolate the empty connection registry test, fix Swift fixture shadowing and synchronize terminal resize with shell readiness. Update contracts, Agent Notes and partial/pending capability evidence. Java/JDT integration remains out of scope.

* fix(remote): own plugin snapshots and isolate upload I/O

Add session-owned run directory allocation and cleanup with retryable errors, original-session macOS deployment cleanup, and per-upload I/O isolation.

Cover lifecycle and upload ordering regressions, update contracts/resource boundaries and capability evidence, and record optional transfer/environment candidates without expanding Agent or Java scope.

* fix(remote): preserve repository identity and consolidate remote crate

Keep remote Git repository roots and external metadata bound to their original host, including parent repositories and symlink roots.

Consolidate client, protocol and server into lithe-remote with isolated client/server features, preserving the standalone server binary. Update consumers, packaging, CI selection, resource validation, contracts and regression coverage.

* fix(remote): 修复合并后的 Agent Notes 路径,补齐能力矩阵并收紧远程扫描失败判定

- 两条 proposed 笔记的适用范围仍指向已合并的 rust/lithe-remote-client,
  改为 rust/lithe-remote/src/client/,修复 Verify Agent Notes。
- 能力矩阵:remote-development-workspace 增加 BuildSystemService 与共享扫描证据,
  写明运行配置发现尚未接入远程(Core 对 runConfig.inspect 返回 NotSupported,
  仅 runConfig.selectJava 可用);run-discovery 增加同一说明。状态不变。
- 远程共享运行扫描只在链路取消、超时或中断时整体失败;主机对单个目录报告的
  错误仍记为扫描不完整,与本机一致。判断集中到 workspace_io::is_transport_failure,
  detectors/scan.rs 与 workspace_scan.rs 共用,修正此前两处不一致。
- 新增集成测试:读取主机目录树且占位目录保持为空、单目录错误记为不完整、
  根目录之下链路中断时扫描失败。

* fix(macos): avoid reentrant workbench hit testing (#1542) (#1557)

* chore(scripts): 按作用语义整理 scripts 目录层级 (#1563)

* chore(scripts): 按作用语义整理 scripts 目录层级

把 scripts/ 根目录下 127 个平铺脚本移入分类子目录,根目录不再放任何脚本。
全部使用 git mv,历史可追溯。

新目录:
- ci/{common,cancel-closed-pr-runs,update-repo-charts}:CI 脚本,按工作流名分目录
- macos/{build,package,prepare,test,verify,perf,probe}
- windows/{build,prepare,package,test,verify}
- release/{sparkle,macos,autobuild,windows,notes}
- rust-core、architecture、i18n、agent-notes、platform-feature-matrix、
  plugins、remote、ide-mcp、editor、git-graph、agent、resources

同步修改:
- classify-ci-changes.sh 路径模式、plan-ci-lane-reuse.mjs 基础设施规则、
  对应测试夹具(夹具复制脚本时按新目录深度建目录)
- ci-macos.yml 的 scripts/**/*.sh 循环、verify-i18n.yml 等工作流路径与 paths 过滤
- sparkle 的三个 Ruby 脚本改为 require_relative "../autobuild/autobuild-identity"
- tauri.conf.json 的 beforeDevCommand / beforeBuildCommand
- README、docs、Agent 笔记、Skill 和 Fonts NOTICE 中的脚本路径
- develop-lithe Skill 新增“脚本放置与分类”一节,AGENTS.md 增加入口提醒:
  脚本必须在 scripts/ 下按作用分类,不得放在 scripts/ 根目录

验证:
- 127 个脚本在旧分类器/新分类器下的 lane 结果一致,未知路径仍然 fail closed
- 127 个脚本的规划器基础设施规则一致
- 受影响的 node/bun/shell/ruby/python 测试与 i18n、特性矩阵、Agent 笔记、
  共享契约、模块/服务/编辑器边界、运行时 bundle 只读校验均通过

* fix(scripts): 修复 scripts 分类整理的评审问题

- Windows 前端安装测试移到 scripts/windows/build/,与被测脚本同目录,
  测试夹具里复制脚本的路径、ci-windows.yml 的运行命令、分类器 windows 分支
  和 Agent Note 里的路径同步更新
- 分类器空分支删除 3 个已不存在的平铺脚本名,避免过期名字被误当成已登记
- 规划器的 Windows 规则改为按目录匹配(windows/、release/windows/),
  并单独登记 ide-mcp/build-windows-ide-mcp.mjs,补齐测试期望,
  与分类器的路由保持一致
- develop-lithe Skill 补充:平台专属脚本留在所属跨平台领域目录的例外、
  手工验收脚本放 test/、tauri.conf.json / package.json / official-plugins.json
  inputPaths / worktree-resources.json 里硬编码脚本路径的检查清单

* fix(windows): 补全 JavaSelectionRequest.requirements,修复 Windows 安装包构建 (#1507) (#1565)

#1515 给 lithe-core 的 JavaSelectionRequest 新增了必填字段 requirements,
但 Windows 的 select_project_java 仍按旧字段构造,导致 Release AutoBuild
的 Windows 安装包步骤报 E0063 编译失败。

- windows/tauri/src-tauri/src/run.rs:Windows 传 root,requirements 与 root
  互斥,所以填 None
- develop-lithe Skill:补充 lithe-core 公开 Rust 类型/签名也是兼容面,
  Windows 直接链接 Core,改动时要同步检查调用点并给出检查方法

* docs: refresh WeChat community QR code (#1569)

---------

Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>
Co-authored-by: muchen <145200703+Mucheen@users.noreply.github.com>
Co-authored-by: arkleselect <166632698+arkleselect@users.noreply.github.com>
Co-authored-by: jiaqizhang258 <549728022@qq.com>
Co-authored-by: jiaqizhang258 <321343564+jiaqizhang258@users.noreply.github.com>
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.

2 participants