Repository navigation
fix(remote): #1507 远程工作区、构建与插件执行适配 - #1515
Merged
Merged
Conversation
xiaoyumuxi
marked this pull request as ready for review
October 26, 2026 07:44
Lithe Review结论: ⛔ 有阻塞 Findings
Scope Check
Suggestions
Summary远程工作区适配范围较大,契约、能力矩阵和架构 Note 均有相应更新;Draft 也清楚标出未完成部分。资源启动期间的取消竞态会留下远端进程,修复前不建议合并。 Verification
|
…ation 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.
The original PR implementation is already incorporated in the preceding preview-based commit. Retain its ancestry without overwriting the integrated and locally verified tree, so the existing PR can be updated by a normal fast-forward push.
xiaoyumuxi
marked this pull request as draft
October 27, 2026 11:47
…cycles Resolve RuntimeLocator by retaining remote discovery defaults and the upstream platform search-path port. Preserve both remote asynchronous preparation regressions and the upstream hosted workspace-command tests. Import preview's PATH-boundary correction without expanding remote Java integration. Validate the merged tree with full Core timing and focused Swift timing.
xiaoyumuxi
marked this pull request as ready for review
October 27, 2026 12:23
Lithe Review结论: ❓ 审查未完成 任务: 374 审查失败:Review timed out 可以重新评论 |
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.
Collaborator
Author
|
@lithe review |
Lithe Review结论: 未发现需要阻塞合并的问题。 Scope Check
Suggestions
Summary本次静态检查未发现明确的代码缺陷。此前关于启动期间取消可能遗留远端进程的阻塞问题,在当前 head 中已通过服务端预登记关闭请求、创建者负责迟到资源清理及对应并发回归测试处理。整体实现仍处于 PR 明确标注的阶段性范围。 Verification
|
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.
Resolve the conflicts between the remote workspace adapter and preview's shared run-workspace scan, build-provider model-input checks and plugin language-server launch overload. - Run scans and fingerprint reads go through the remote-aware workspace I/O; a remote transport failure now fails the scan instead of being reported as an unreadable path. - Preview's run preparation and test discovery take the same run lease (withPlanContext) as the other build commands, and model inputs are resolved before the lease so a throw cannot skip its release. - LanguageServerSession keeps the captured launch values and calls the 17-argument plugin start overload; the test double records the workspace configuration through that overload. - i18n catalogs are merged by message id and regenerated. - windows Cargo.lock keeps preview's lock with only the lithe-remote crate switch.
- 两条 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 共用,修正此前两处不一致。 - 新增集成测试:读取主机目录树且占位目录保持为空、单目录错误记为不完整、 根目录之下链路中断时扫描失败。
xiaoyumuxi
added a commit
that referenced
this pull request
Oct 29, 2026
…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,改动时要同步检查调用点并给出检查方法
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>
4 tasks
xiaoyumuxi
added a commit
that referenced
this pull request
Oct 30, 2026
* docs(plugins): 按 preview e8c4e9f 刷新 macOS 插件 API 计划 #1517(原生 Provider 工作流)和 #1515(远程工作区适配)都已合并, 计划里"在途/未合并"的说法已过时。本次只改文档,不改运行时代码、 schema、SDK 和功能矩阵状态。 基线与现状 - 盘点基线:Lithe 更新为 preview e8c4e9f;#1517 记为已合并;新增 #1515 (阶段性实现,范围与缺口见 API-40);记录插件文档仓库 main 仍是 be779d2000e3,且其契约锁落后主仓库 4 个触及 plugins/v1 的提交 - 能力版本:对照 PluginTypes.swift 与 capabilities.rs,补上 buildProviders 1–6、buildModelInputs 1、debugAdapters 1/2; Core 与 Mac 唯一差异是 serverProcess(Core 1/2,Mac 1) - API-29、API-31、API-35、M4、DOC-12、5.1 SDK 行:去掉对 #1517 在途的依赖, 改为已合并后的文档、SDK 对齐与端到端验收 新增条目(编号接续 API-39,不改动既有编号) - API-40 工作区 authority(M0):远程工作区仍是本机空占位根,backend:1 与 Web bridge 不识别远程绑定;未实现的 authority 必须明确拒绝。API-05、 API-35 同步指向它 - API-41 激活事件与启动预算(M0/M1):现有 activationEvents 只与已声明的 Provider/窗口命令一一对应;应用没有工作区信任概念,M0 需决定 - API-42 内置 Git 只读快照(M3):Git 不在统一 VCS 层,API-31 只覆盖插件 VCS - API-43 documents.onWillSave(M3):保存路径没有保存前钩子 - API-44 Agent 侧贡献(后续):Skills/Hooks/MCP 是用户管理的原生配置, 没有插件来源 - 同步 2.1 现状表、4.1/4.2 评审清单、阶段表 M0/M1/M3c/M4/后续、 DOC-02/04/07/13 以及新增 DOC-18/19、来源索引 S20–S22 公共扩展契约提案(proposed Note) - 修正"内置 Git 与插件 VCS 共用同一统一模型",与 2026-10-22 评审一致: Git 暂不接入统一层 - #1517 改为已合并,补 #1515 的范围;新增 authority/激活/保存前事件/ Agent 侧贡献一节,说明本 Note 不预设答案 * 插件后端 2 与函数协议 3:工作区上下文、能力发现与宿主错误码 - requires.backend 新增版本 2:可由 onWorkspaceOpen 或插件命令启动,不再必须有网页;后端可以是插件唯一内容;backend 1 语义不变 - 新权限 workspace.metadata(仅 backend 2)授予 workspace 宿主服务;拒绝 onStartupFinished 等常驻启动事件 - 插件函数协议新增版本 3:lithe/host/getCapabilities 由 Core 直接回答,subscriptions/dispose,workspace/listContexts、getContext、getFolders - 宿主方法改为表驱动(HOST_METHODS),后续文件、编辑器、窗口服务按行接入 - lsp.functionRequest 可携带 context,仅 v3 后端收到 params.context - lsp.hostResponse.error 可带 code,按白名单映射为 contextExpired、authorityUnsupported、versionConflict、limitExceeded、cancelled、timeout 等 - 后端可用 $/cancelRequest 取消自己的宿主请求,Core 立即回复 cancelled 并发出 hostRequestCancelled 事件 - 同步契约 README、manifest schema、正反例 fixture 与 Rust 单元测试 * feat(macos): 插件后端 backend 2 的工作区上下文、激活事件与宿主服务分发 - hostCapabilities 提供 backend [1, 2] - 新增 PluginWorkspaceContexts:每窗口一个上下文,contextID 加 generation,本地/远程 authority,rootID 与状态目录摘要 - 新增 PluginHostServiceDispatcher 与 PluginHostServiceHandling 扩展点,统一错误码、授权与上下文核验、订阅回收与宿主请求取消;凭据与 workspace 服务接入 - MacPluginBackendSessions 支持 onWorkspaceOpen 与 onCommand 激活(串行、不阻塞),调用携带工作区上下文 - RustCoreBridge 传递 lsp.functionRequest.context 与 hostResponse.error.code,会话处理 hostRequestCancelled - 新增界面文案词条并重新生成;新增 Agent Note 记录设计、第 4 节回答与威胁模型,写明工作区信任暂不引入 * test(macos): 补上上下文测试缺少的 throws 声明 * feat(macos): 为插件 API-09/10 提供宿主内部文档与编辑器服务 实现 macos-plugin-api-plan 中 API-09(documents.list/getSnapshot、 editor.getActive/getSelections)和 API-10(editor.applyEdits/ replaceSelections/insertText)的 Mac 宿主内部服务,暂不对插件公开, 等 M0 分发层接入。 - EditorDocumentService:调用方必须显式传入窗口与工作区范围和文档 ID, 不回退到当前活动窗口;读取的是含未保存修改的内存缓冲区。 - 新增 EditorDocument.contentVersion 作为版本来源:每次文本变化单调 递增,不受保存/冲突决策改写,没有 WebView 时也存在,WebView 重载 后不归零。 - 坐标:行、列都从 1 开始,列按 UTF-16 码元计数;CR/LF/CRLF 各算 一次换行。只在 LSP 适配边界换算成从 0 开始。 - EditorTextEditPlanner 先校验整批编辑(越界、反向、拆开代理对、 重叠),全部通过才下发;插入的换行沿用文档首个换行符。 - Monaco 适配:同步比对桥接 revision;JS 端再核对 revision 和未确认 输入,有 IME 组字、只读、冻结或关闭中时拒绝;用前后两个 undo stop 加 pushEditOperations 作为一个撤销步骤应用;编辑消息带 origin, 用来回报这一批产生的精确版本。 - SourceText.apply 支持按批次指定 EOL。 - 补充 Swift 单测(emoji、组合字符、CRLF、中文、多选区、版本冲突、 只读、越界、重叠)和 bun 单测。 * feat(macos): 新增插件工作区文件访问的宿主内部服务(API-06/07/08) 尚未暴露为插件公共 API,也未改动 shared/contracts、capabilities.rs 和 hostCapabilities; M0 分发层负责授权并把插件请求映射为显式根和调用方身份。 - Core/Ports/PluginWorkspaceFileAccess.swift:服务协议与值类型。每次调用显式携带 工作区根(root ID、目录、authority、generation、可见性规则)和调用方身份,不回退到活动窗口; 资源 ID 为 root ID + 以 / 分隔的 NFC 相对路径,结果中不出现系统绝对路径; 错误分类、集中的预算常量及每个取值的依据。 - MacWorkspaceSecurePath:路径词法校验(拒绝绝对路径、空段、.、..、NUL、超长段和超长路径), 逐段 NFC 规范化;从根描述符逐段 openat(O_NOFOLLOW) 解析,末段用 fstatat(AT_SYMLINK_NOFOLLOW) 或 O_NOFOLLOW|O_NONBLOCK 打开,防止 .. 越界、任意段的符号链接以及检查后换成链接的 TOCTOU; 注释写明能防和不能防的范围(硬链接、持有描述符期间被移出的目录、挂载点)。 - MacPluginWorkspaceFileService: - readDirectory 用不透明游标分页(游标绑定根、generation 和目录,记录最后一个排序键), 单页上限和单目录扫描上限;排序与项目树一致(目录优先、自然文件名序), 隐藏规则、符号链接和嵌套 linked worktree 的省略也与项目树一致。 - stat 报告链接本身。readFile 有字节上限、编辑器同款编码探测、二进制结果、截断标记, 未截断时附带 SHA-256 身份。 - findFiles/findText 复用现有搜索 owner(Search Everywhere 文件提供者和项目文本搜索), 支持取消、偏移游标分页和截断标记,结果标明只来自磁盘、不含未保存缓冲区。 - 拒绝非本地 authority,以及被标为本地的远程占位根(unsupportedAuthority); 旧的或已关闭的 generation 返回 staleWorkspace。 - 阻塞工作在宿主队列上执行;按调用方限制并发;任务取消时立即返回 cancelled。 - MacPluginWorkspaceWatchHub:复用 DirectoryWatcherFactory/DirectoryChangeSource, 同一根 generation 的订阅共享一个变更源并做引用计数;订阅归属调用方和工作区, 在 dispose、releaseResources、closeWorkspace 或新 generation 取代时释放; 高频事件按订阅合并,超出待处理上限或源报告丢失时折叠为“需要重新扫描”; 旧 generation 的迟到事件按键丢弃,不会到达新订阅;dispose 返回后不再投递。 - MacWorkspaceSnapshotBuilder.isNestedLinkedWorktree 改为 internal 以复用。 - PluginWorkspaceFileServiceTests 覆盖:越界与路径校验、根外符号链接、 链接互换竞态(含中途换链接)、分页游标与篡改、超大目录、隐藏规则、二进制文件、 超限截断、NFC 名称、watcher 释放/合并/溢出/旧 generation、远程 authority 拒绝、 搜索分页与不可用、取消与并发预算。 * feat(macos): 增加插件宿主的编辑器打开、HTML 预览、外部浏览器和窗口消息内部服务 实现 docs/development/macos-plugin-api-plan.md 中 API-15、API-16 和 API-17 最小部分的宿主内部服务。只提供 Swift 协议和实现,不对插件公开,不修改插件契约、 Rust capabilities 和 PluginTypes 的 hostCapabilities,授权与调用分发留给 M0。 作用域与资源 - 每次调用显式携带插件、窗口、工作区和工作区代际,不回退到当前活动窗口。 - PluginHostScopeGate 在窗口缺失、远程工作区、工作区或代际变化时拒绝,并在每个 等待点之后再次校验,窗口关闭或工作区替换后不再放光标、不再启动浏览器。 - 资源使用“根 ID + 工作区相对路径”,在符号链接解析后按带尾部斜杠的前缀比较, 拒绝路径逃逸、兄弟目录前缀、控制字符和超长路径。 editor.open / reveal - 复用 documentFeature.openFileAsync 和文档 owner:已打开的文档只激活不重载, 未保存缓冲区保持原样;没打开才从磁盘加载一次。 - activation 为 select 时调用 selectEditorTab,等同点击标签,把后台标签切成前台 标签,编辑器切片读选区、改文本前需先走这条路径;background 不改前台标签、 不放光标。结果中 isActive 表示标签在前台,windowIsForeground 表示窗口在前台。 - 后台窗口只在自己的窗口内工作,不提升窗口、不激活应用。 - range 只落到起点光标并在结果里明示;可替换预览标签暂不支持,明确拒绝。 - reveal 要求文件已打开,否则返回 documentNotOpen。 preview.openHTML - 仅接受 .html/.htm,走 editor.open 的 select 路径,内嵌预览使用当前缓冲区。 - 仅预览模式是标签视图的 @State,暂不支持,明确拒绝。 browser.openExternal - 网址只允许 http/https,必须有主机名,禁止用户信息、空白和控制字符,限长 4096 字节;其它 scheme 一律拒绝,不追加内容、不执行脚本。 - 本地文件只接工作区内的 .html/.htm,让系统浏览器读磁盘;打开前先让编辑器交出 未报告的输入,缓冲区脏或编辑器未确认都按“有未保存修改”处理。调用方可选择 openSavedFile 并在结果里明示,或 requireSaved 返回 unsavedChanges。 - PlatformUI 新增 openWebURLInBrowser;MacHTMLBrowserOpener 新增 openWeb, 自身再次校验协议和主机,只向 Launch Services 查询处理浏览器。 window.showInformation / Warning / Error - 每个窗口一个 PluginHostMessageFeatureModel,WorkbenchView 左下角用 PluginHostMessageStack 原样显示插件文字和按钮,不走会翻译文案的宿主通知栈。 - 最多同时显示 3 条,其余排队;返回用户选择的按钮序号或关闭、窗口关闭、 工作区替换、调用取消等结束原因,每条消息恰好结束一次。 - 限额:同一插件每窗口 10 秒 5 条、同时 3 条,每窗口共 10 条;文字 2000 字符, 按钮 3 个、每个 40 字符。超频返回 rateLimited 并向用户提示一次,队列满返回 messageQueueFull;限频时间由调用方注入。 - 宿主自己的 20 条文案补齐 shared/i18n 中英词条并重新生成。 HTML 预览与 plugin bridge 隔离 - 核对结论:预览使用全新的 WKWebViewConfiguration,唯一脚本处理器是应用内容世界里 的 litheScrollbarFrame;lithe 消息处理器和 lithe-plugin 协议只在 MacPluginWebPage,项目页面和外部浏览器都拿不到 bridge,无需改代码。 - 新增 HTMLPreviewBridgeIsolationTests 作为回归测试。 测试与文档 - 新增 PluginHostEditorServiceTests、PluginHostBrowserServiceTests、 PluginHostMessageServiceTests(含限频器与编辑器同步等待)、 HTMLPreviewBridgeIsolationTests,并扩展 HTMLBrowserOpenerTests;测试使用假窗口、 注入时钟和有界等待,不依赖 sleep。 - 新增 Agent Note 2026-10-30-plugin-host-open-preview-services.md,记录决策、 前台标签与前台窗口的区别、未保存语义、bridge 隔离证据、运行期不写发行包、 已知限制和被否方案。 本次未在本机编译或运行 Swift 测试。 * fix(macos): isolate editor flush request to the main actor * feat(plugins): give each host error its own JSON-RPC code from protocol 3 Record the backend workspace context and host services in the platform feature matrix, and require one-to-one error codes in develop-lithe. * fix(macos): make the editor flush callback sendable * feat(core): add host notifications, failure details and finer host error codes * feat(macos): push host notifications to plugin backends and tighten workspace contexts - Push lithe/host/workspace/didChangeContexts to running backends granted workspace on every context open, change, or close. - Deliver lithe/host/commands/didRun to a backend 2 plugin when its command runs: at once when ready, after the start when starting, and only on its own onCommand:<id> when stopped. - Send subscription events with a per-subscription sequence through lithe/host/subscriptions/notify; notifications to one backend stay in order and are cancelled with the session. - Start onWorkspaceOpen backends on enable or register when a workspace is already open. - Grant a backend only the host services this host has handlers for, so getCapabilities lists nothing that fails for want of one. - Switching a window to another workspace closes its context and opens one with a new contextID; generation counts changes of the same workspace. - Make rootID an HMAC keyed per plugin with a host secret kept in Application Support/Lithe/PluginHost/root-id.key (0600, created once). - listContexts no longer returns or creates stateDirectory; getContext does. - Add notFound, readOnly, unsupportedOption, preconditionFailed, busy and rateLimited host error codes and structured failure details. - Fix the dispose error message, document the protocol 3 notifications, details, error-code range, and context semantics in the contract, the Rust Core API, the Agent Note, and the feature matrix. * feat(plugins): extend protocol 3 additively instead of new versions - From protocol 3, new host services, methods, notifications, options, result fields and failure codes are added within the version and found with getCapabilities; only a change an existing backend would misread needs a new protocol version. - Core answers a field a host method does not define with plugin.host.unsupportedOption (-32018) and details { option } for a version 3 session, before the host sees the request; version 2 keeps plugin.host.invalidParams. - Document the extension rule and the backend's duties (call only listed methods, ignore unknown fields and notifications, treat unknown numbers as host failures) in the contract README, the outcomes table, the Agent Notes, and the feature matrix; add fixture and engine tests. * feat(plugins): connect public host APIs and harden backend lifecycle * fix(plugins): preserve older backends when host notifications are unsupported * test(macos): stabilize Agent popup clicks and record API-01–44 completion - Agent selector/activity tests: fix the hosting view size only where the layout needs it, display windows before synthesized clicks, and compute click points from LitheDropdownMetrics in flipped and unflipped documents. - macOS plugin API plan: add the per-API completion table for PR #1595 and a summary of the public host methods with their permissions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
关联 #1507。远程项目此前有多条工作流访问本机占位目录、运行本机工具,导致终端、环境发现、Git 和搜索无法使用真实主机数据。本 PR 将这些流程的文件和进程 I/O 接到工作区所属连接,并加入构建及通用插件执行的基础适配。
这是阶段性实现,尚未完成整个 issue,不关闭 #1507,也不宣称达到合并/发布条件。 当前 PR 实际为非 Draft;本次只追加提交和更新说明,不切换 Draft/Ready 状态。 已接入的代码、自动化 fixture 与真实 SSH 验收分开记录;功能矩阵保持
partial / pending。本次改动
工作区身份、文件树与监听
remoteWorkspace { sessionId, localRoot, remoteRoot },只映射类型化路径字段;拒绝跨主机混合操作。长期历史、进程及清理持有原连接,重连或切换项目不会改投另一台主机;远端失败不回退到本机占位目录。trash,不可用时失败而不变成永久删除。终端、环境、Git 与搜索
构建、插件部署与 stdio
remote.hostInfo、remote.uploadFile与可选upload主机能力:256 KiB 分块、每文件最多 2 GiB、四个上传槽、五分钟绝对期限、精确 offset、SHA-256 和禁止覆盖的原子发布。失败/取消尝试 abort,断线与到期清理暂存文件,未提高协议单帧上限。~/.lithe-server/plugin-runs/<UUID>/package,普通文件只读、可执行文件只读可执行;提供者可写状态独立放在state/plugins。不写 app bundle 或安装资源,进程销毁后才删除快照。包体、契约与资源维护
2026-10-27:通用插件 / LSP 续作
本轮只继续通用远程能力,不新增 Java/JDT、JDK 目标包或 SVN 专属实现。原 PR 已有适配保留;Java/SVN 的语言或工具专属验收不作为本轮完成条件。Agent 按用户要求后续单独处理,不关闭 #1507。
BUSY、客户端两秒清理等待到期或连接断开均不撤销已记录的清理;关闭等待本身最多 60 秒。cdeec1949并保留原 PR 提交祖先,使用普通 fast-forward push,无 force push。两处合并冲突分别保留远程 RuntimeLocator 默认实现与上游平台搜索路径端口、远程启动准备测试与上游 hosted workspace-command 测试。2026-10-27:插件完整快照与上传隔离(本批新增)
已实现
runDirectories能力及fs.createRunDirectory / fs.releaseRunDirectory。客户端在请求前生成身份,分配回复丢失或取消后仍能按原连接、原身份释放;不接受客户端传入任意删除路径。Core 有限方法白名单同步放行,并有测试保护。~/.lithe-server/plugin-runs/<id>下新建 0700 目录,每会话最多 256 个;不接管已有目录。父目录必须是当前用户所有的真实私有目录,拒绝符号链接或宽松权限,不用 chmod 接管用户目录。upload + runDirectories;旧主机明确提示升级,不降级为不受会话管理的路径删除。校验返回路径,捕获原会话并使用未取消任务清理;已安装插件及 bundle 保持只读。BUSY,其他文件可独立完成;取消、断线和到期先标记,慢 I/O 工作线程继续负责暂存文件清理。partial / pending。仅记录、未实现的候选计划
按用户要求,将 27 项候选(T01–T14、E01–E07、X01–X06) 写入远程工作区 Host 提案的“待评估能力候选”章节。全部待评估、未排期,不代表已批准开发,也不自动成为本 PR 的合并条件:
Agent 的本地/远端执行抽象、钩子或桥接方式留到后续独立讨论;不从这份计划自动扩展。
TODO:通用能力剩余 5 类
这些是工作包,不是五个小修补;已实现代码、fixture 和真实主机验收分别记录。新增候选与以下已有缺口分开,不能用“候选未定”豁免安全和验证 gate。
trashDocument(expectedIdentity:);Git 大文件临时内容/原子写入仍限 8 MiB,尚未接入分块上传。本轮明确排除
当前代码的本地验证(2026-10-27)
--locked --tests -- -D warnings当前五条计时 lane 合计 1,448 条,均通过,无超时或硬预算超限。新增 server 用例中取消/上传隔离约 9–32 ms,目录释放/权限/隔离/重试约 33–65 ms;持久会话销毁 1,367 ms、空闲到期清理 1,860 ms 为软性能预警,未超过硬预算。报告为
.artifacts/test-stability/remote-snapshot-{core,rust,swift,remote-protocol,remote-client}.json及相邻 HTML/JUnit,聚合视图为remote-snapshot-validation.html/index.html;生成报告不提交进源码。上轮的 140 项 Swift、69 项 server 和 1,548 条旧聚合属于先前修订,不与当前五条 lane 累加。Core 全量复跑使用进程级
GIT_CONFIG_*指定 fixture 默认分支 master,没有修改用户全局 Git 配置。之前的 PTY resize 回归使用命令边界握手,未降低断言。已知检查限制与 CI 状态
verify-remote-workspace.sh --static在x86_64-apple-darwin因本机缺失可用的core/std目标库失败,未修改用户工具链;其他三种 target check 和 Linux 两种 release 已另行验证。cargo fmt --all --check仍在本批未修改的lithe-agent-host文件报格式差异;受影响 Core/remote 四 crate 的定向 fmt 通过,不借此改动用户明确跳过的 Agent 模块。git_watch_context::watch_context_distinguishes_linked_worktree_git_and_common_directories在git init -q -b main约 10 秒后得到Some(Cancelled)。本批未修复或证明其根因,不能称 CI 全绿。RunLaunchEnvironment.swiftPATH 服务边界阻断已在前次合入的 preview 中修复,当前服务边界检查通过;没有放宽检查或扩展远程 Java/JDT。gh pr ready或切换 Draft;不关闭 [Bug] SSH 服务的缺陷与待完善的点 #1507。候选计划不是实现完成或合并承诺。