Skip to content

feat(plugins): macOS 设置页接入工具链提供方查询 (#1581) - #2

Merged
FxRayHughes merged 1 commit into
feat/plugin-toolchain-sourcesfrom
feat/1581-toolchain-query-client
Nov 1, 2026
Merged

FxRayHughes merged 1 commit into
feat/plugin-toolchain-sourcesfrom
feat/1581-toolchain-query-client

Conversation

@FxRayHughes

Copy link
Copy Markdown
Owner

改了什么

1lck#1581 框架的 B 项:macOS 设置页接入工具链提供方查询。合并目标是 feat/plugin-toolchain-sources。

Core

  • lsp.startServer 增加 toolchainProviders。只有插件拥有、并且声明了提供方的会话,才会被提供 capabilities.experimental.litheToolchains {versions:[1],providers}。
  • 后端的回答必须是所提供项的非空、无重复子集,否则一个提供方都不启用,并发出 toolchainProviders 事件。
  • 新命令 lsp.toolchainRequest:
    • 未协商的提供方直接返回 not_supported 和 plugin.toolchain.providerUnavailable,不会写到进程。
    • 回复以 {id,response} 原样返回,错误回复也一样,所有规则交给 toolchains.decodeReply。
    • 超时上限 60 秒,取消沿用现有的 $/cancelRequest。
  • toolchains.candidates 接受 providerInstallations。它会校验 provider 确实属于注册表、并且声明了该工具;与扫描结果是同一个规范 home 时只算一份,归属记为提供方。
  • 修复机器人 P2(resolution.rs):提供方返回别名链接(如 mise 的 latest),宿主只读到链接路径的事实时,以前会判为 unsafePath。现在宿主读取 ${home} 前缀目录的事实,Core 已有的链接目标推导能补全规范路径,这个场景已通过。新增了回归测试。

macOS

  • MacPluginBackendSessions.queryToolchainProvider 启动或复用插件唯一的后端进程,设置变化时的重启规则和页面调用一致。
  • MacToolchainDiscovery 对每个已启用的提供方:
    • 先发一次全局查询(workspace:null),再对根目录和有自己版本文件的目录逐个查询,最多 32 个;
    • 每次查询有独立的 operationID 和递增的代次,超时 15 秒;
    • 宿主只读取回复和定义点名的路径作为事实,然后交给 decodeReply;失败时原样显示提供方给的原因。
  • 工作区没有打开窗口时,没有 context,只做全局查询,并在页面上说明。
  • 失效时整份重查:
    • 工作区内的变化按 watchFiles 尾部匹配,挂在现有的 350ms 防抖文件事件上;
    • 工作区外的路径按回复里的 watch 用一个 FSEvents 流监听;
    • 连续变化合并成一次重载,页面关闭时释放监听。
  • 设置页:
    • 项目步骤和全局步骤显示提供方原文的要求、对应的安装版本或“未安装”;
    • 来源页显示每个版本管理器最近一次查询的耗时或失败原因;
    • 文案都走 shared/i18n。
  • 契约(toolchains.md、protocol.md、rust-core-api.md)、功能矩阵和 Agent Note 已同步更新。

验证

  • cargo test -p lithe-core --lib:1498 个全部通过。新增了引擎脚本后端测试(协商、拒绝未声明的提供方、原样回传错误)、candidates 的归属和拒绝,以及别名链接回归。
  • cargo clippy -p lithe-core --no-deps --all-targets -D warnings:错误数和基线分支一样(85 个,都是已有的),本 PR 没有新增。
  • macOS test-stability-macos.sh --filter 'Toolchain|PluginBackend|LanguageServer|ProjectRuntimeSettings|RunConfigurationIntegration|BuildProvider|PluginHostService':306 个测试全部通过。新增内容:
    • 用真实临时目录和注入的查询,测别名链接 home、全局与项目要求分流、工作区内的 home 被整份拒绝;
    • 文件事件合并后只重载一次;
    • 外部输入的监听在关闭时释放。
  • fmt、Rust 注释、Agent Notes、共享契约、功能矩阵和矩阵变更闸、i18n 生成、校验与测试都通过。

没做或要注意

  • macOS 全量测试和 Windows 没有在本地跑。
  • verify-rust-core-swift-bridge.sh 在本机缺少 Lithe 可执行产物,没有跑通;交给 CI。
  • 还没有在真实 App 里装上 mise 插件 0.2.0(Answer Lithe toolchain queries from mise (0.2.0) lithe-plugin-mise#1)跑端到端。那个插件的 Core decodeReply 已经用真实 mise 输出单独验证过。
  • 保存、Lithe 全局默认和运行时消费者仍未接入,页面仍是只读。

- Core: lsp.toolchainRequest 与 litheToolchains 协商,原样回传回复交 toolchains.decodeReply
- Core: candidates 接受 providerInstallations 并保留提供方归属
- 修复别名链接 home 只有链接路径事实时被判 unsafePath(机器人 P2)
- macOS: 启动或复用插件后端查询,全局+逐目录独立 operationID/代次,超时与取消
- macOS: watchFiles 与回复 watch 变化整份重查,短时间事件合并
- 设置页显示提供方要求、版本与查询结果;文案走 shared/i18n
- 更新契约、功能矩阵与 Agent Note
@FxRayHughes
FxRayHughes marked this pull request as ready for review November 1, 2026 10:33
@FxRayHughes
FxRayHughes merged commit b87c7f6 into feat/plugin-toolchain-sources Nov 1, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant