# Blue 2.0 架构 Blue 是 `dsh-base` 上的一组普通 Cordis sibling 插件。它不建立第二个插件 模型,不拦截或复制 dsh service graph,也不为外部插件建立私有 runtime realm。 ```mermaid flowchart TB ROOT["一个 dsh 进程 · 一张 Cordis service graph"] DSH["dsh 原生服务
commands · sessionProjections · tools · agents"] PLUGIN["普通 Cordis 插件
Blue 官方行与外部 sibling"] AGENT["blueCurrentAgent
当前选择的精确 Agent"] UI["Blue 直接 UI 服务
bluePanes · blueStatus
blueOverlays · blueEditorExtensions"] CORE["blue-core renderer
唯一 pi-tui 与原始终端 owner"] TERM["终端"] ROOT --> DSH ROOT --> PLUGIN DSH --> PLUGIN AGENT --> PLUGIN PLUGIN --> UI UI --> CORE CORE --> TERM ``` ## 运行时原则 1. 插件直接 inject 并使用 dsh 原生服务,例如 `commands`、 `sessionProjections`、`tools` 和 `settings`。与 `planMode` 同 realm 的插件 可以直接 inject 它;根级 UI 插件通过原生 `plan` projection 读取状态、通过 原生 `/plan` 命令写入,不增加 Blue adapter。 2. Blue 只增加终端 UI 所需的四个 service: `bluePanes`、`blueStatus`、`blueOverlays`、 `blueEditorExtensions`。 3. `blueCurrentAgent` 只表达当前 Blue frontend 选择的精确 Agent。插件拿到 Agent 后,仍调用原生 dsh service;该对象不是 renderer model。 4. 注册、listener、timer 与异步 continuation 都属于创建它们的 Cordis Fiber。 Fiber unload 是唯一的插件贡献清理机制。 5. 只有 `packages/core` import pi-tui、处理 ANSI/raw mode、焦点、布局和 visible width。 6. UI contribution 始终是普通 readonly node;core 私有地窗口化大列表,并在 响应式分支首次可见时才校验和编译,不向插件暴露 renderer 调度状态。 ## 包边界 | 包 | 当前职责 | | --- | --- | | `api` | renderer-neutral node/event contract 与四个直接 UI registry | | `ui` | 纯 node builder 和 `defineBlueComponent` | | `frontend` | renderer-neutral locale、theme、notification 与 transcript models | | `conversation` | 注册官方 append-origin `sessionProjections` | | `app` | startup、session navigation、current Agent、request/retraction/title cadence | | `core` | pi-tui/terminal owner,并渲染 pane/overlay registry | | `transcript` | projection-backed transcript、tool presentation、status 与 pane contributors | | `interaction` | editor、原生 dsh commands、dialog 和 editor-extension consumer | | `bundle/blue` | `dsh-base` 上的 flat composition 与 presets | | `cli` | dependency-free `blue` launcher | 不存在第二套插件作者工具、Harness service adapter 包、validation-only adapter 包、可替换 provider owner、插件 bridge 或 app session facade。 ## 状态所有权 - Harness 的 Agent、Session、command、tool 与 projection 状态仍由 Harness package 持有。 - app 持有当前 Agent selection;它不重做 Harness command/tool/projection API。 - API registry 持有当前 UI contribution definitions,且每项 registration 随 consumer Fiber 清理。 - transcript 与 interaction 持有它们自己的 renderer-neutral/TUI product state。 - core 持有 terminal、focus、layout、懒 admission cache 与编译后的 renderer object;这些状态随 surface generation 失效,不进入公开 node。 Renderer 可以根据当前 Agent 调用 projection snapshot,但不能折叠第二份 Harness session event truth。 ## Composition ```mermaid flowchart TB BASE["dsh-base"] subgraph GRAPH["flat Cordis sibling graph · 36 inserted rows"] SUPPORT["dsh support · 6 rows
subagent settings · presets · host runner
workspace · session controller · title"] API["blue-api
four direct UI registries"] APP["blue-conversation · blue-startup · blue-app"] VIEW["blue-frontend · blue-core · theme"] PRODUCT["transcript · status · panes · editor · interaction"] PLUGINS["external Cordis plugins"] end NATIVE["native dsh services"] BASE --> NATIVE NATIVE --> SUPPORT NATIVE --> APP NATIVE --> PRODUCT NATIVE --> PLUGINS API --> VIEW API --> PRODUCT API --> PLUGINS APP --> PRODUCT VIEW --> PRODUCT ``` `cordis.patch.yml` 插入 35 个普通 sibling:6 个 dsh 支撑行和 29 个 Blue product 行。YAML 顺序不代表启动顺序;所有顺序要求必须由 `inject` 表达。 动态 Cordis plugin 与官方 Blue 行处在同一 service graph。 ## 验证 whole-tree bundle 测试必须证明原生 command/projection/tool service 可达、 current Agent identity 精确、四个 UI service 可注册、Fiber unload 会清理、 core reload 后 registry 仍可重挂 renderer。宽度敏感组件继续接受各包 `width-scan` 检查。