Skip to content

docs(debug): #1210 统一调试内核、三层能力与调试适配器 Registry 设计 - #1500

Merged
xiaoyumuxi merged 5 commits into
previewfrom
feat/1210-debug-adapter-provider
Oct 25, 2026
Merged

xiaoyumuxi merged 5 commits into
previewfrom
feat/1210-debug-adapter-provider

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

关联 #1210。本 PR 只提交设计和实施计划,不关闭功能 Issue,不修改产品代码或正式契约。

方向调整:重写统一调试内核,而不是在两套内核上补丁

上一版方案是“Registry 先接入,Swift/Rust 两套内核以后在 Provider 背后慢慢整合”。评审后改为:在 Rust Core 里重新设计一个统一的 DAP 客户端内核,macOS 和 Windows 都通过 debug.* 使用它;平台只负责进程、socket、终端和界面。内置适配器和第三方插件共用同一个类型化 Registry,插件只声明“怎么启动调试器”。

本轮改动

  • 主 Note 重写并改名:2026-10-25-debug-adapter-provider-and-declarative-registration.md 改为 2026-10-25-unified-debug-engine-and-adapter-registry.md。
    • 内容包括现状盘点(两套内核、按语言的工厂、以源码为中心的 v1 投影)和内核 / 平台 / 插件 / 调试器四方职责表。
    • 会话模型 v2 第一版就预留扩展位置:可选的 source/line/column、字符串地址、presentationHint 透传、引用绑定暂停代次、能力快照、保留未知值。
    • 扩展机制:宿主内核模块注册处理器,客户端能力由已注册的扩展决定,插件 JSON 里不出现。
    • 迁移分为 P0 行为基线 → P1 新内核与 v2 → P2 内置迁移与 Registry → P3 第三方声明契约 → P4 双端第三方验收 → P5 删除 Swift 会话、按语言工厂和 v1。
  • 能力分三层:
  • 原生投影 Note 改为可选扩展 Note:2026-10-25-native-debug-projections.md 改为 2026-10-25-optional-debug-extensions.md。
    • 覆盖全部可选分组:断点增强、表达式与变量、执行控制增强、无源码与生成代码、原生调试、进程与模块、语言专属。每组列出 DAP 请求、客户端能力和界面入口。
    • 明确区分反编译(适配器通过 sourceReference 返回源码)和反汇编(disassemble)。
    • 写操作单独授权;给出实现顺序,其中 startDebugging 是删除 Swift 会话的前置条件。
  • 新增会话投影 v2 草案:debug-session-projection.draft.schema.json 和 projection-v2-examples.draft.json。
    • 4 条接受样例:有源码帧 + 无源码汇编帧、会话内反编译源码、registers scope 与未知提示、未注册内存扩展时的能力快照。
    • 5 条拒绝样例:数字地址、无 source 却有 line、两种源码身份同时出现、路径逃逸、缺少暂停代次。
  • README 与链接:README 开头改为说明本目录评审“插件声明 + 投影 v2”两份跨端草案,插件声明部分(API 4、debugAdapters 1、serverProcess 2、传输、S01–S02 / C01–C09 拒绝表)保持不变;公共扩展契约 Note 的链接指向新文件名;旧阶段编号 P1–P3 改为 P3–P4。

保持不变的部分

插件声明沿用上一版:复用 serverProcess、stdio/tcpAnnounced/tcpPort 传输、标准能力跟随 DAP 协商且只能 capabilities.disabled、Java 作为内置 Provider、没有依赖/导出/工作流/resolver/hostIntegration 字段。插件依赖与导出仍是独立平台提案。

评审入口

验证

  • 投影 v2:Python jsonschema 离线按 Draft 2020-12 检查 schema 本身,4 条接受样例通过、5 条拒绝样例都被拒绝。
  • ./scripts/verify-agent-notes.sh:157 篇 active Note 通过。
  • ./scripts/verify-shared-contracts.sh、./scripts/verify-runtime-bundle-immutability.sh 通过。
  • node scripts/verify-app-language-localization.mjs、node scripts/generate-i18n.mjs --check 通过;git diff --cached --check 通过。

上一轮的 semantic-rejections.draft.json 未改动:其中 15 条 Core 语义拒绝仍是 pendingCoreImplementation。本次没有运行产品构建或真实调试,没有启动 Lithe 或调试进程,schema 校验不构成运行时证据。只改设计文档,不涉及平台行为,因此不更新功能矩阵。

@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 25, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review October 25, 2026 14:26
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← feat/1210-debug-adapter-provider · head: 22ac9a4

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

Findings

  1. [P2] 能力快照应能表示直接绑定本包函数的能力
    shared/proposals/debug-adapters-1210/debug-capability-state.draft.schema.json:33

    • 实际影响:注册草案允许直接调用本包后端函数,但能力快照要求所有 source: "backend" 状态都提供 {pluginID, export}。对于没有导出的本包函数,宿主无法生成既符合 schema、又准确描述来源的快照。
    • 触发条件:能力通过 invoke.use: {backendRef: "resolver", functionID: "debug.hotCodeReplace"} 实现,没有对应导出。这种绑定由注册 schema 的 functionCapability 和组合 schema 的 use 明确允许。
    • 复现步骤:为上述能力构造 {state: "supported", source: "backend"};它因缺少 provider 被拒绝。改用 {pluginID, backendRef, functionID} 描述来源,又会因缺少 export 和存在额外字段被拒绝,只能虚构一个未声明的导出。
    • 来源:本次引入;属于新增草案之间的一致性问题,尚未影响产品运行。

Scope Check

  • 关联 [Feature] 类型化 DebugAdapter Registry 与第三方 DAP 接入现有 Debug UI #1210:本次交付设计与实施计划,不关闭功能 Issue;Registry、第三方 DAP 完整流程及 Windows 实机验收仍待实现。
  • 已检查全部 29 个变更文件;没有产品实现、正式插件契约、测试代码或生成文件变更。
  • 提案明确复用现有 DAP、插件函数通道、JDT 工程事实和平台资源清理链路,并保留旧 API 与分阶段迁移边界。
  • Finding 属于本次新增 schema 的职责范围,没有要求修复历史问题。

Suggestions

  1. 将能力来源建模为可区分的引用:依赖导出使用 {pluginID, export},本包函数使用 {pluginID, backendRef, functionID};明确组合流程的来源表示,并补充无导出本包函数的能力快照正例。

Summary

提案清楚区分设计与已实现能力,兼容性、上游复用及资源所有权方向与现有边界一致。建议先补齐能力声明与状态投影之间的表达缺口,避免后续双端实现自行补充不同规则。

Verification

  • 静态阅读全部变更文件,并追踪现有调试工厂、配置解析、Node TCP transport、共享 Debug/函数契约及相关架构 Note。
  • 作者报告离线 schema/示例校验、Agent Notes、共享契约、安装包只读与 i18n 检查通过;本次未独立执行这些检查。
  • 提供的 head Checks 中,Agent Notes 和平台 gate 有成功记录;Rust、Swift、Windows 等产品测试为 skipped,不能作为运行时兼容性证据。
  • 本次未运行代码、脚本、测试或应用,未访问网络。双端真实调试、取消竞态和清理验证仍属于后续实施验收;本次无 UI 改动,不要求界面截图。

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator Author

评审意见:方向调整为「重写调试内核 + 沿用现有插件声明」

结论:目标是兼容 GDB / LLDB 等多种调试器,并支持线程、寄存器、内存、汇编等能力。这个目标靠**重新设计统一的调试内核(DAP 客户端)**来实现,插件只负责声明“怎么启动调试器”。当前草案在插件协议层新造了依赖、导出和 JSON 工作流,这些现有契约大多已经覆盖,有两处还和现有规则冲突。建议按下面的方式收窄范围后再推进。

1. 现有协议已覆盖的部分,不要再造

草案新增 现有契约中已有 建议
backends.process、debugProcess.dependencyRuntime serverProcess 的 packaged / systemCommand / runtime 启动方式、启动模板(${pluginDir}、${stateDir}、${setting:…}、${arch})、languageServerLaunchPlan 按 languageID / buildSystemID / vcsProviderID / backend 选择进程 新增 debugAdapterID 选择项,安装审查、路径校验、requiredPackagePaths 全部沿用
依赖 python-runtime 插件导出 selectedInterpreter runtime 的 tool + runtimeDependencies、executableResolution: 1 候选链(setting / projectFile / environment / command) 用现有解释器/工具选择机制,不引入插件依赖
backend.kind: "hostIntegration", integrationID: "jdt" languageServers[].hostIntegration: { id: "jdt", capabilities: ["debug", "run", "testing"] },仅 dev.lithe 可声明 Java 调试已有声明方式;草案写法还绕开了“仅官方插件”限制
steps / use / with / $value 工作流与 debug.process.acquire、debug.session.plan Build 的 Core plan → 宿主执行 → Core decode 模式(build.modelPlan / build.decodeModel) 改为 Core 命令(如 debug.launchPlan),编排留在 Core
动态解析走 lithe/function/invoke + 领域绑定 Build Provider:initialize 协商 litheBuild,类型化方法 lithe/build/model 照搬:协商 litheDebug,类型化 lithe/debug/* 方法
能力 source: dap | function | disabled,省略即不展示 领域操作由 manifest source 选唯一实现;其余靠 initialize 协商 标准能力跟随 DAP initialize / capabilities 事件,manifest 不再逐项声明
targetBindings executionProviders 参数模板 ${file}、${fileDirectory}、${userArguments} 沿用同一套模板变量
start-plan 自定义错误码 「Outcomes and error codes」的 plugin.* 稳定码 沿用,按需新增 plugin.debug.*

2. 与现有契约冲突的两处

  • shared/contracts/plugins/v1/README.md「Declarative or backend implementation」规定:领域操作必须通过类型化方法和 Core 的 plan/decode 命令实现,never through a plugin function。草案把 debug.resolve 放进插件函数,并写明“不另建 lithe/debug/*”,方向正好相反。
  • 同文件 Build providers 规定:“Two plugins never share a process, and the host never relays messages between processes”。跨插件 exports 调用本质上就是宿主在插件进程之间转发消息。插件依赖如确有需要,应作为插件平台级提案单独评审(包括市场依赖解析、菱形依赖版本冲突、禁用/卸载级联、信任传递),不放在 [Feature] 类型化 DebugAdapter Registry 与第三方 DAP 接入现有 Debug UI #1210 里。

3. Schema 校验覆盖不到语义规则

离线校验时,14 个示例通过;下面 7 个本应拒绝的输入也全部通过:

  • 引用未声明的 dependency
  • 引用未声明的 backendRef
  • 插件依赖自身
  • 重复的 adapter id
  • 重复的 step id,或引用不存在的 step
  • launch 把 program 绑定到 target.processID
  • stepBack 走没有契约的 function

JSON Schema 本身做不到这类交叉引用检查。正式设计需要列出 Core 语义校验规则清单,每条配一个拒绝 fixture。

其他细节:

  • node.registration.json 支持 file 目标,但没有 program 绑定。
  • ${pluginDir} 出现在 dependencyRuntime 参数里,没写明属于哪个包。
  • preparation 是任意字符串,应改为类型化的 Build/Run 动作引用,并限制最多重入一次。
  • 两份 schema 的 id pattern 大小写规则不一致。
  • registration 没有 pluginAPIVersion / requires / permissions,看不出挂在 manifest 的哪里。

4. 建议的新范围

主提案:重写调试内核 + Registry

  1. 用一个统一的 DAP 客户端内核取代现在 Swift DebugAdapterProtocolSession 与 Rust CoreDebugAdapterProtocolSession 两套会话,去掉按语言(Java / Go / Node)的专用分支。
  2. 插件声明沿用现有协议:requires.debugAdapters: 1;debugAdapters[] 声明 id、adapterID、languageIDs、configurationTypes、launch/attach 参数模板;进程用 serverProcess;transport 只有 stdio 和固定几种 TCP 端口发现方式。按能力版本规则,新增调试权限(如 process.debug)需要新的 API 级别。
  3. 可选 Debug Provider:只在需要动态解析配置时使用,按 Build Provider 模式协商 litheDebug,配合 Core 的 plan/decode 命令。
  4. Java 继续走 hostIntegration.capabilities: ["debug"],热替换作为内核的扩展请求。
  5. 第一个第三方接入用 GDB DAP(gdb -i=dap)或 lldb-dap,跑通源码级调试,证明内核与语言无关。

迁移

  • 先把旧行为录成基线 fixtures:Java 热替换与 JUnit/TestNG、调试用 Run 的 JDK、Node 子会话与 source map、断点先于 launch 入队、停止与清理顺序。
  • 按适配器逐个切换到新内核,同一目标只启用一个实现;功能等价后再删除旧路径。macOS / Windows 分别提供真机证据。

扩展(汇编、内存等)单独成 Note,但新内核第一版就要预留模型

第一版就定下来 原因
栈帧 source / line / column 可选,带不透明的 instructionPointerReference 目前 DebugStackFrame.line 是必填 i64;以后再改就是破坏性变更
地址、内存引用、指令引用一律用字符串 避免 JS 数值精度问题,以后不改类型
scope 透传 presentationHint(如 registers) 寄存器视图直接按提示筛选
功能是否显示由 DAP initialize 能力与 capabilities 事件决定 扩展上线只是多一个按能力显示的入口
请求分发按请求名注册处理器 加 readMemory / writeMemory / disassemble / setInstructionBreakpoints 只是新增条目
客户端能力(如 supportsMemoryReferences,目前写死 false)由已注册的扩展决定 没装扩展就不声明
Rust / Swift / TypeScript 共用 fixtures,包含无源码栈帧样例 三端从第一天就能解码

扩展是宿主侧的内核模块加界面,不放进插件 JSON 的 source: function。插件只负责启动调试器,能力由 DAP 协商。

参考:Rust Core 当前已实现 threads / stackTrace / scopes / variables / setVariable、各类断点(含 data breakpoints)、step / stepBack / pause、runInTerminal;尚未实现 readMemory、writeMemory、disassemble、setInstructionBreakpoints、指令粒度单步、modules / loadedSources、startDebugging。

注:微软 cpptools 的 OpenDebugAD7 / vsdbg 许可证只允许在微软 VS 系列产品中使用,不能打包。GDB 14+ 原生 DAP、lldb-dap、CodeLLDB(MIT)可以使用。

@xiaoyumuxi xiaoyumuxi changed the title docs(debug): #1210 统一调试插件 JSON 组合设计与实施计划 docs(debug): #1210 最小 Registry 与 DAP 接入计划,拆分平台扩展 Oct 25, 2026
@xiaoyumuxi

Copy link
Copy Markdown
Collaborator Author

补充:调试能力分层(必选 / 推荐 / 可选)

基本的断点调试、调用栈和变量查看属于必选,其余能力都按适配器在 DAP initialize 中声明的 capabilities(以及之后的 capabilities 事件)开关:支持就显示,不支持就隐藏。插件 manifest 不逐项声明。

必选:接入的适配器都必须支持,宿主必须实现

类别 内容
会话生命周期 initialize;launch 或 attach 至少一种;configurationDone;disconnect / terminate;停止与资源清理
断点 行断点(setBreakpoints);断点确认与位置修正(verified、移到有效行)
执行控制 continue、pause、next、stepIn、stepOut
调用栈 threads(调用栈按线程获取,不能省)、stackTrace
变量 scopes、variables(含嵌套展开与分页)
事件 stopped(带停止原因)、continued、exited / terminated、output

Rust Core 目前已实现以上全部内容。新内核主要是重新整理和统一实现,不是新增功能。

推荐:协议上是可选,但优先做

  • 监视表达式、悬停求值、调试控制台(evaluate 的 watch / hover / repl 上下文)。用户通常把它们视为“变量追踪”的一部分。GDB / LLDB 的大量功能也要靠控制台命令,没有控制台,原生调试的体验会明显变差。

可选:按适配器能力启用

分组 内容
断点增强 条件断点、命中次数、日志点、函数断点、异常断点过滤、数据断点(监视点)
表达式与变量 setVariable、setExpression、completions
执行控制增强 stepBack / reverseContinue、restart、restartFrame、gotoTargets、stepInTargets
无源码 / 生成代码 source 请求(sourceReference):反编译源码(如 Java jar 中的 class)、JS 中 eval 生成的代码。反编译和反汇编不同:反编译由适配器直接返回源码内容
原生调试 寄存器(scope 的 presentationHint: "registers")、readMemory / writeMemory、disassemble、setInstructionBreakpoints、granularity: "instruction" 单步
进程与模块 modules、loadedSources、startDebugging 子会话、runInTerminal
语言专属扩展 Java 热替换等,以内核扩展请求的形式接入

注意

“可选”指功能可以晚做、适配器可以不支持,数据模型本身不能可选。上一条评论“扩展预留”表里的内容需要在新内核第一版里定下来:可选的 source / line / column、字符串形式的地址与引用、透传 presentationHint、能力驱动界面、按请求名分发、三端共用 fixtures。之后加上可选功能时只做增量,不改已有结构。

验收建议:

- Replace the incremental Registry note with a unified Rust Core DAP engine plan:
  one kernel for both platforms, Swift session and per-language factories removed
  after P0 baseline parity (P0-P5).
- Define required / recommended / optional capability tiers; #1210 closes on the
  required tier plus one third-party adapter (GDB DAP or lldb-dap) on both platforms.
- Turn the native projections note into an optional extensions note covering all
  optional groups (breakpoints, expressions, stepping, sources, native, modules).
- Add a session projection v2 draft schema with accept/reject examples: optional
  source/line/column, string addresses, presentationHint passthrough, stop
  generation and capability snapshot.
- Update README and public extension note links.
@xiaoyumuxi xiaoyumuxi changed the title docs(debug): #1210 最小 Registry 与 DAP 接入计划,拆分平台扩展 docs(debug): #1210 统一调试内核、三层能力与调试适配器 Registry 设计 Oct 25, 2026
@xiaoyumuxi
xiaoyumuxi merged commit d407b3e into preview Oct 25, 2026
12 of 16 checks passed
1lck added a commit that referenced this pull request Oct 27, 2026
* fix(macos): 运行 Node 脚本时补齐启动 PATH (#1455) (#1492)

* fix(macos): 运行 Node 脚本时补齐启动 PATH (#1455)

从 Finder 启动的 Lithe 只继承 launchd 的最小 PATH,pnpm/npm/yarn/tsx 的
#!/usr/bin/env node 找不到解释器,运行 package.json 脚本直接报
env: node: No such file or directory。

- RunLaunchEnvironment:启动前把发现到的 node 目录和解析出的可执行文件目录
  前置到子进程 PATH,按小写去重;项目内 node 与项目根目录不注入,避免仓库
  文件劫持后续系统命令。
- RunExecutableResolver:.toolchain 与 .command 共用同一条环境组合路径,
  覆盖主进程和预启动步骤。
- RunLaunchEnvironmentTests:6 个用例覆盖补齐、项目内排除、wrapper 排除、
  去重与顺序、缺失 PATH、resolver 实际接线。
- 新增 Agent Note 与平台特性矩阵 run-node-launch-path 记录。

* fix(macos): 保留运行配置显式 PATH 优先级,补齐 Node 工具链覆盖

- 启动 PATH 改为追加:原有条目(含运行配置显式 PATH)保持优先级,自动发现
  的 node 与启动器目录追加在后;Finder 启动时 PATH 本就没有 node,追加同样生效。
- 新增「显式 PATH 保持优先级」与 .toolchain("project-node") 接线测试,共 8 例。
- 修正 Agent Note 与特性矩阵中「两端都排除项目目录」「与 Windows 一致」的不准确
  表述,补充 fnm multishell 等发现范围限制与 Windows 排序差异。

* feat(macos): AI 设置资源库、Agent 上下文长度与压缩阈值、对话多标签与性能、ACP 适配器升级 (#1490)

* feat(macos): AI 设置资源库折叠、Agent 上下文长度与自动压缩阈值、对话多标签与性能、ACP 适配器升级

设置
- 设置 › AI 下新增可折叠的“资源库”,收纳指令、技能、Hooks、MCP 配置;面包屑为 AI › 资源库 › 页面,搜索和跳转自动展开。
- 设置页内容区随窗口宽度伸缩,去掉各页 900/860/760 的宽度上限,调大窗口不再留右侧空白。
- Agent 对话详情栏与上下文面板的说明文字收进 ⓘ。

Agent 上下文
- 设置 › Agents 新增“上下文”卡片:上下文长度、自动压缩阈值(支持 200K / 1M / 200000,留空沿用 Agent 默认值,占位值为 Agent 自己上报的大小)。
- Codex 写入 model_context_window / model_auto_compact_token_limit;Claude Code 只有一个压缩窗口开关,阈值(否则上下文长度)作为 CLAUDE_CODE_AUTO_COMPACT_WINDOW 传入。
- 圆环分母按配置封顶(Claude 回合内会在配置值和模型值之间来回上报),阈值与圆环不同时在弹窗多一行“自动压缩阈值”。

ACP 适配器与观测
- codex-acp 1.13.1 → 2.2.2,claude-agent-acp 0.81.2 → 0.95.0,配套 CLI 最低版本随依赖提高。
- Codex 2.x 把 401 当作“需要登录”且不再发失败更新,中继在信封保留原始类别并对适配器改成通用类别,宿主仍按永久错误立即取消。
- Claude 订阅经本机透传代理观测(ANTHROPIC_BASE_URL,请求原样转发,不读取令牌),Claude Code 起标题请求标记为 auxiliary,只计 Token 不计步数(Windows 同步)。
- 附件路径含百分号编码时额外带一行 📎 真实路径,避免模型读 %20 失败;斜杠命令不追加。

Agent 对话
- 编辑区对话改为每个对话一个标签(EditorTabItem.agentConversation(UUID)),新对话在新标签打开,当前标签为空时复用。
- 点开/收起思考过程不再重算整条对话(展开状态移入引用存储),已完成轮次的分组与导航索引缓存,每次刷新只重算当前一轮。

文档与矩阵
- 更新 Agent Note、设置归属 Note、rust-core-api 契约、功能矩阵(新增 agent-context-limits)。

* fix(agent): address PR #1490 conversation and usage regressions

Bind editor tabs to Agent/session pairs and clean discarded prepared sessions while retaining drafts. Count all observed requests separately from conversation steps, preserve auxiliary-only usage, and retain legacy statistics compatibility.

Make attachment URI tests platform-aware, align CLI version fixtures, and add deterministic regressions, owning notes, and feature matrix updates.

* fix(settings): preserve resets and enforce source-backed configuration

Invalidate context-limit drafts on external changes and Restore Defaults, including empty overrides with unsaved input. Guard blur and page-exit commits against stale snapshots and cover the native lifecycle.

Deny camera and microphone requests in Agent visualization pages through the existing shared delegate and register the entry in media coverage tests. Document discover-edit-confirm-save-readback settings behavior, secret protection, and the scope of native configuration writes; keep feature evidence current.

* fix(agent): 处理 PR 1490 评审发现的问题

- Claude 订阅在用户配置了自定义 ANTHROPIC_BASE_URL 时不再改走本地统计代理
- 斜杠命令只识别单个 /word,绝对路径开头的消息不再跳过附件路径行;含控制字符的路径不追加
- Rust 端把自动压缩阈值限制在上下文长度以内
- 会话命名请求只检查 system 的第一个块,不再序列化整个 system
- 上下文长度输入拒绝十六进制和指数写法
- 只设压缩阈值时仍刷新 Agent 默认上下文长度
- 修正被新代码拆开的两处文档注释

* fix(macos): 新对话复用空会话时不再解绑标签;缺少 PATH 时保留系统目录

- 聚焦标签已绑定可复用的空会话时直接返回,避免解绑后又被 reconcile 绑回
- 启动环境缺少 PATH 时以 /usr/bin:/bin 为基础追加已解析目录,env 类 shebang 启动器可用
- PATH 去重改为区分大小写,不再丢弃区分大小写卷上的不同目录

* fix(macos): 设置页和窗口标题跟随应用语言而不是系统语言 (#1418)

String(localized:) 按系统语言选语言包,locale 参数只影响格式,应用语言为英文而系统为中文时会漏出中文。
改为 AppLanguage.localizedString/localizedFormat,Text 字面量则交给环境 locale。

- 设置窗口和软件更新窗口标题
- 工作台背景图占位文字(设置页与工作台两处)
- 终端默认 Shell 的“系统默认 · …”
- 终端回滚行数的“N 行”
- AI 供应商用途文字、设置搜索词、欢迎窗口标题

* fix(macos): 界面文案统一按应用语言取词,词条全部收进 shared/i18n (#1494) (#1496)

* fix(macos): 界面文案统一按应用语言取词,词条全部收进 shared/i18n (#1494)

- 新增 L10n.string / Bundle.appLanguage(LitheModuleAPI),由设置里的语言驱动
- 约 500 处 String(localized:) 与 NSLocalizedString 迁移到 L10n
- 补齐约 370 条缺失的中英词条(错误、弹窗、Java 调试页、更新窗口等)
- 新增 verify-app-language-localization.mjs 防退化并接入 verify-service-boundaries.sh

* docs(agent): 要求界面文案必须走 shared/i18n 与 L10n,审查时核对

* fix(macos): 端口、退出码、HTTP 状态码不再被本地化数字格式加千分位

* fix(macos): 打开项目时可选本地或远程,远程开发窗口随窗口缩放 (#1487) (#1499)

* fix(macos): 打开项目时按已保存的 SSH 连接选择本地或远程,并让远程开发窗口随父窗口缩放 (#1487)

* fix(macos): 已保存 SSH 连接时,打开项目改为统一的本地/远程选择面板 (#1487)

* fix(macos): 打开面板内置本地文件夹浏览,不再弹系统访达面板 (#1487)

* fix(macos): 打开面板文件列表显示修改时间与大小,默认尺寸更大且不再随点击缩小 (#1487)

* fix(macos): 远程开发窗口的主机地址行不再撑出窗口,长位置名截断显示 (#1487)

* fix(macos): 远程开发窗口的地址行改为两行,位置信息换行完整显示 (#1487)

* docs(matrix): 同步打开项目面板与远程开发窗口自适应的能力记录 (#1487)

* fix(macos): 打开面板本地目录异步加载、路径校验与空目录提示,修复 review 反馈 (#1487)

* docs(debug): #1210 统一调试内核、三层能力与调试适配器 Registry 设计 (#1500)

* docs(debug): propose JSON-composed debugger plugin design (#1210)

* docs(debug): narrow registry proposal and separate platform extensions (#1210)

* docs(debug): redesign #1210 around a unified debug engine (#1210)

- Replace the incremental Registry note with a unified Rust Core DAP engine plan:
  one kernel for both platforms, Swift session and per-language factories removed
  after P0 baseline parity (P0-P5).
- Define required / recommended / optional capability tiers; #1210 closes on the
  required tier plus one third-party adapter (GDB DAP or lldb-dap) on both platforms.
- Turn the native projections note into an optional extensions note covering all
  optional groups (breakpoints, expressions, stepping, sources, native, modules).
- Add a session projection v2 draft schema with accept/reject examples: optional
  source/line/column, string addresses, presentationHint passthrough, stop
  generation and capability snapshot.
- Update README and public extension note links.

* refactor(macos): remove unused legacy editor code (#1498)

* fix(macos): prevent Git Log filter labels from overlapping (#1342) (#1489)

* feat(debug): #1210 P0/P1 调试行为基线、Core v2 投影与旧 Swift 会话删除 (#1508)

* feat(debug): #1210 P0/P1 调试行为基线与 Core v2 投影,旧 Swift 会话删除

- P0:shared/fixtures/debug/v1-baseline.json 记录 15 项调试行为基线,
  scripts/verify-debug-v1-baseline.mjs 校验证据测试与 fixture 真实存在,
  并接入 verify-shared-contracts.sh
- P1:Rust Core 新增 v2 投影(source 可选、地址为字符串、开放 presentationHint、
  stopGeneration、能力快照),共用 projection-v2-examples.json
- P1:支持 DAP startDebugging 反向请求(debug.startDebuggingResponse),
  仅在宿主声明 supportsStartDebuggingRequest 时启用;Node source map 位置透传
- macOS:新增 DebugProjectionV2,Core 会话与 fixture 对齐
- 删除旧 Swift DebugAdapterProtocolSession,Java、Python、Rust 全部走 Core 会话
- 移除宿主内置 Go(Delve)与 Node(js-debug)调试,之后由语言插件提供
- 更新提案笔记与 debug-adapters-1210 README

* feat(debug): #1210 基础层能力快照、扩展注册表、过期引用、子会话聚合与 v2 投影输出

* docs(debug): #1210 提案笔记更新基础层进度

* fix(ci): #1210 补调试能力矩阵记录,修正 HTML 预览笔记的失效路径

* fix(debug): #1210 评审修复:停止代数竞态与按线程失效、过期栈帧、能力事件、子会话停止去重、v2 路径与栈帧校验

* chore(debug): #1210 decode_projection 仅测试使用

* chore(debug): #1210 去掉仅测试使用的导入警告

* fix(debug): #1210 父会话销毁时级联销毁子会话,统一父子生命周期

* feat(debug): #1210 macOS 多会话:startDebugging 子会话、统一生命周期与会话标签条 (#1509)

* feat(debug): #1210 macOS 多会话:startDebugging 子会话、统一生命周期与会话标签条

* feat(debug): #1210 子会话默认复用 provider 会话工厂,宿主总是声明 startDebugging

* refactor(debug): #1210 移除内置 Python、Rust stdio 调试器,只保留 Java,其余交给语言插件

* test(debug): #1210 投影 v2 夹具按文件位置定位,不依赖工作目录

* feat(debug): #1210 多会话 UI 改为折叠模式,会话切换并入线程选择器

* docs(matrix): #1210 调试功能矩阵补充多会话与内置调试器移除

* fix(debug): #1210 语言目录不再为 python、rust 声明内置调试适配器

* fix(debug): #1210 子会话启动前重放已保存断点,登记多会话平台矩阵

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(debug): #1210 子会话不抢选择、停止清理去重、会话菜单走 i18n

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* refactor(macos): 移除内置 Rust 调试器遗留的 lldb-dap 工具发现

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>

* feat(debug): #1210 debugAdapters 声明校验与插件 API 4 契约 (#1510)

* feat(debug): #1210 debugAdapters 声明校验、插件 API 4 契约与拒绝用例

* fix(debug): #1210 评审修复:onDebug 激活事件进 schema、API 4 以下拒绝 debugAdapters、安装检查覆盖适配器可执行文件

* fix(debug): #1210 安装检查跟随符号链接到最终普通文件(悬空、指向目录、循环均拒绝)

* fix(debug): #1210 评审跟进:runtime 启动的 entry/packagedRuntime 纳入安装检查、路径规范化、空 debugAdapters 与 Core 一致

* fix(macos): 修复工作树列表与操作按钮 UI (#1503) (#1516)

* fix(macos): restore worktree UI layout and action styles (#1503)

* test(macos): isolate breakpoint cleanup from the default debug catalog

* feat(debug): #1210 macOS 调试适配器宿主:声明式 Provider、调试控制台与插件热激活 (#1512)

* feat(debug): #1210 debugAdapterID 启动计划与 debug.adapters.startArguments 命令

* feat(debug): #1210 macOS 声明式调试适配器 Provider(stdio launch)

* test(debug): #1210 插件调试适配器传输与启动配置回落测试,补 Agent 笔记

* refactor(debug): #1210 移除调试启动解析器里遗留的内置 Rust / Python 分支

* feat(debug): #1210 调试适配器支持 systemCommand 启动,工具发现覆盖 Xcode 工具链

* fix(core): 清理 git 模块在非测试构建下的两个编译警告

UNTRACKED_DIRECTORY_SUMMARY_THRESHOLD 只有测试使用,重导出加 #[cfg(test)];
create_line_history_scratch 在 unix 分支里的外层 builder 不需要 mut。

* feat(debug): #1210 调试控制台提示符与补全,调试适配器可执行文件作为插件设置

调试控制台
- 控制台底部新增提示符输入行和补全弹窗,补全由适配器的 completions 请求提供,
  首词只保留可执行的候选(过滤 lldb-dap 混入的 C++ 关键字和类型)。
- 插件可在 debugAdapters[].console 里声明 commandPrefix 与命令列表,
  宿主按插件声明给出命令补全和前缀转换,不再按适配器名字写特殊分支。
- Core 新增 DAP completions 请求的转发与能力检查。

可执行文件设置
- debugAdapters[].configurations.launch.executable { setting, candidates[] }
  与 targetBindings.program = "target.executable" 成对出现;
  用户在设置里填的路径永远优先,填了却不可运行是终止错误,不回落候选。
- Core 新增 debug.adapters.executablePlan,只产出计划不碰文件系统;
  debug.adapters.startArguments 的目标事实新增 executable,必须是绝对路径。
- 宿主新增 MacPluginDebugExecutableResolver,按候选顺序检查文件系统;
  设置页回显实际生效的路径和来源,找不到时在 ⓘ 里说明如何安装或编译。
- 契约、schema、fixture、README 和 rust-core-api.md 同步更新,
  两项均加在尚未发布的插件 API 4 debugAdapters v1 内。

附带补充了中英文词条、两篇 Agent 笔记和对应的 Rust / Swift 测试。

* feat(plugins): #1210 调试适配器插件热激活,装完即用不用重启

插件的贡献在启动时一次性装进模块图,运行期没有再登记或撤回的路径,所以每次装插件都要重启。
这次只放行后端已经有运行期实现的插件,判断由宿主写在 PluginDescriptor.canActivateWithoutRestart,
不是 plugin.json 字段,插件契约不变。目前只有纯调试适配器插件满足条件,其余插件仍写成
.updateStaged,重启后生效。

- 新增内存实时注册表 MacLivePluginRegistry:后台线程用只读 store 扫描已安装目录,主线程读不可变
  快照;扫描失败保留上一次的登记;generation 只在内容变化时加一
- 调试器查找、语言目录每次读取实时快照;debug-only 语言声明只给已有语言加 .debugAdapter,不改
  名字、语言标识和语言服务器;装调试器不会重启正在跑的语言服务器
- 插件包被替换、移除、停用前先撤回,停掉它服务的调试会话
- 多个项目窗口各有一个注册表,用 litheLivePluginsDidChange 通知互相重扫
- MacPluginManager 的安装、更新、回退、卸载、启用/停用走实时路径,不再设置需要重启标记
- 修复 ValidatedPluginCatalog 按 id 排序遍历时 debug-only 声明可能先占住语言、让语言包被判成重复
  的顺序问题
- 补 Agent 笔记和 PluginLiveActivationTests(19 个)

* fix(debug): #1210 适配器拒绝请求时显示它自己的解释,而不是笼统提示

DAP 的失败响应有两段文字:message 是给客户端解释的简短原因,body.error.format
才是给用户看的说明(带 {变量} 占位符)。lldb-dap、debugpy 等把有用的信息只放在
后者,Core 之前只读 message,缺失时回落成英文笼统提示。

现在 Core 优先取 error.format 并用 error.variables 填充占位符,再回落到 message;
没有任何文字时 Swift 端的兜底提示也走 L10n(补齐中英词条)。

* test(debug): #1210 可执行文件绑定测试在 Windows 上改用平台原生绝对路径

Path::is_absolute 与平台有关,Windows 上 /work/main 不是绝对路径,Core 正确地拒绝了它,导致 Windows Rust 测试失败。测试改为按平台选择绝对路径,生产逻辑不变。

* fix(debug): #1210 评审修复:按请求与目标类型选适配器、拒绝未支持的传输、会话按插件停止、传递被禁用的能力

- 选择:文件启动只考虑支持 launch 且 targetKinds 覆盖 file 的 selector;语言归属(languageIDs)与启动选择(fileLaunchLanguageIDs)分开,只声明 attach 的适配器不再被选来启动文件
- 传输:宿主只能拉起 stdio,声明 tcpPort/tcpAnnounced 的适配器在启动进程前以 plugin.launch.unsupportedTransport 拒绝,并给出本地化说明
- 能力:capabilities.disabled 经 debug.createSession 的 disabledCapabilities 传给 Core
- 会话:会话记录所属插件,更新、卸载、停用只停该插件拥有的会话,同语言其他插件的会话不受影响;在模块设置里停用调试模块时同样停止
- 文案:启动解析的拒绝原因走 L10n,补齐中英词条
- 文档与矩阵:更新插件热激活 Agent Note 与 rust-core-api.md,新增 plugin-debug-adapters 功能矩阵记录(macOS 已实现、Windows 未接入)

* docs(debug): #1210 设计笔记补充 macOS P4 进展,更正适配器启动方式的过期描述 (#1518)

* chore(ci): add Bot PR workflow for GitHub App identity (#1531)

---------

Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>
Co-authored-by: muchen <145200703+Mucheen@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: arkleselect <166632698+arkleselect@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.

[Feature] 类型化 DebugAdapter Registry 与第三方 DAP 接入现有 Debug UI

1 participant