From 69da167f65ee458eb657ea1d417bee3e90def4a2 Mon Sep 17 00:00:00 2001 From: kuddev Date: Sat, 29 Aug 2026 19:03:57 +0800 Subject: [PATCH] release: prepare Nebula Terminal 1.4.0 --- CHANGELOG.md | 34 ++++++--- Cargo.lock | 14 ++-- docs/release-notes/v1.4.0.md | 130 ++++++++++++++++++++++++++++++++ nebula-completions/Cargo.toml | 2 +- nebula_app/Cargo.toml | 10 +-- nebula_app/windows/nebula.rc | 8 +- nebula_config/Cargo.toml | 4 +- nebula_config_derive/Cargo.toml | 4 +- nebula_settings/Cargo.toml | 2 +- nebula_split/Cargo.toml | 2 +- nebula_terminal/Cargo.toml | 2 +- scripts/installer.iss | 4 +- 12 files changed, 178 insertions(+), 38 deletions(-) create mode 100644 docs/release-notes/v1.4.0.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fcefe7..06dd133 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,19 @@ Every release entry is provided in English and Simplified Chinese. ### English +No unreleased changes yet. + +### 简体中文 + +暂无未发布改动。 + +## 1.4.0 - 2026-08-29 + +### English + #### Added - **The terminal card's geometry is now one configurable group — corner radius, gutter, shadow, and the divider between the tab sidebar and the terminal — and it travels with the theme.** "A rounded card floating on the shell" and "the terminal filling the entire right-hand area, separated by a single hairline" are no longer two layouts or two code paths; they are two sets of values on one path. `Nord` is the first theme to take the second form: radius and gutter both drop to zero and a 1px divider carries the structural boundary, because once the gutter is gone the sidebar and the terminal read as one undivided slab. Every other theme keeps the floating card and deliberately draws *no* divider — with a gutter present, a line would be a second boundary saying the same thing. Explicit `pane_card_radius` / `pane_card_gutter` / `pane_card_shadow` / `pane_card_divider` keys in `nebula_settings.txt` override whatever the theme asks for, so switching themes changes the shape while anyone who has tuned it keeps control. The radius default also became a single source of truth: the old shell's `UI_SHELL_RADIUS_LOGICAL` and the new shell's card now reference the same constant instead of each carrying its own literal — two copies of one number is exactly what produced the white seam around the card. -- **GPUI settings now ship with embedded English and Simplified Chinese catalogs.** The language preference can follow the system or explicitly select either catalog, persists across launches, and updates the settings navigation, controls, placeholders, provider tests, network tests, SSH status, and other migrated settings messages without reading translation files at runtime. English is the fallback for missing localized messages, configuration values remain separate from display text, and the build rejects catalogs whose message-ID sets drift apart. +- **GPUI settings now ship with embedded English and Simplified Chinese catalogs.** The language preference can follow the system or explicitly select either catalog, persists across launches, and updates the settings navigation, controls, placeholders, provider tests, network tests, SSH status, and other migrated settings messages without reading translation files at runtime. English is the fallback for missing localized messages, configuration values remain separate from display text, and the build rejects catalogs whose message-ID sets drift apart. Addresses [#71](https://github.com/Kuddev/nebula/issues/71) for the GPUI Settings portion only; other untranslated surfaces remain outside this release. - **Windows now has a dedicated GPUI quick terminal window.** The configured global shortcut opens a process-wide singleton across the full width and 40% height of the display containing the most recently active regular workspace, slides it from the top edge, and preserves its PTY, scrollback, and terminal state while hidden. Changing the shortcut re-registers it with Windows, and repeated key events are coalesced into one show or hide action. - **A versioned Runtime control API and resource-style CLI now give automation one discoverable interface to Nebula.** `nebula env` reports the current pane identity, control executable, supported commands, and runtime reachability; `nebula window`, `nebula tab`, `nebula pane`, and `nebula agent` expose read, send, wait, close, rename, move, split, zoom, resize, run, paste, and execution operations through the same JSON protocol. Bash, Fish, and Zsh completions describe the expanded command surface. - **Typed multi-step orchestration can build an Agent workspace in one request.** A workflow may create tabs, split panes, start verified AI providers in parallel, wait for the requested generation to become ready, and submit initial prompts. Backward step references, bounded templates, explicit partial-failure receipts, and no implicit rollback keep completed actions visible and resumable when a later step fails. @@ -29,7 +39,7 @@ Every release entry is provided in English and Simplified Chinese. - **Common formulas such as `$E=mc^2$` and `$n!$` are recognized without reinterpreting shell variables, prompts, prices, or `sed`/`grep` BRE groups as mathematics.** Inline delimiters may cross terminal soft wraps but no longer join unrelated hard lines. - **Resetting a settings drop-down immediately restores its displayed default value** instead of updating the saved setting while leaving the old selection visible. - **Rounded terminal panes no longer expose an outline or a gap along their top edge** in either light or dark themes; the shell paint now follows the pane's actual left, right, bottom, and zero-width top gutters. -- **New Windows terminal panes no longer inherit stale environment variables from the long-running Nebula process.** Each pane rebuilds its environment from the current machine and user registry values, merges `PATH` in Windows order, treats variable names case-insensitively, expands registry values against the refreshed snapshot, preserves process-private values when a registry entry disappears, and applies pane-specific overrides last. The same refreshed environment reaches GPUI panes, legacy panes, and WSL launches. +- **New Windows terminal panes no longer inherit stale environment variables from the long-running Nebula process.** Each pane rebuilds its environment from the current machine and user registry values, merges `PATH` in Windows order, treats variable names case-insensitively, expands registry values against the refreshed snapshot, preserves process-private values when a registry entry disappears, and applies pane-specific overrides last. The same refreshed environment reaches GPUI panes, legacy panes, and WSL launches. Addresses [#68](https://github.com/Kuddev/nebula/issues/68). - **The GPUI quick-terminal shortcut now works outside Nebula.** The configured combination is registered with Windows when the first workspace opens, follows later settings changes without discarding a still-valid old registration if the replacement fails, and targets the most recently active regular workspace instead of requiring Nebula to be focused. - **The quick terminal no longer opens with a blank strip or settles at ordinary-window dimensions.** Its native size and terminal surface are synchronized once while the window is still above the screen, and its full-width, 40%-height geometry is confirmed after entry without repeatedly resizing the PTY or swapchain. It is also excluded from regular-window MRU routing, runtime command targeting, session restoration, reveal-all behavior, and ordinary workspace persistence, so hiding or closing it cannot rewrite the normal workspace session. - **Display-math delimiters no longer consume unrelated prose or later formulas.** Multiline `$$...$$` and `\[...\]` pairing now requires a real block-opening context and stops at blank-line presentation boundaries, so a delimiter mentioned in prose or an orphaned closer at the top of scrollback cannot pair with a later block. @@ -39,9 +49,9 @@ Every release entry is provided in English and Simplified Chinese. - **Tab badges no longer let fallback signals overwrite authoritative state.** Agent authorization and interactive prompts use the hand indicator, a non-zero command exit keeps a warning triangle until the next command begins, and a successful background completion briefly shows a check before settling into the unread-completion mark. A trailing BEL can request attention only when no agent rule has already decided the pane state, so a completed agent turn is not mislabeled as waiting for input. - **Runtime completion edges no longer leak into a command that is still being submitted, and an unselected completion popup no longer captures shell history keys.** `Up` and `Down` remain available to the shell until `Tab` or a mouse action selects a candidate; once selected, the same keys navigate the popup as expected. - **GPUI cursor blinking now agrees with its setting and with the existing shell.** An unset `cursor_blink` value enables blinking consistently in both Settings and the terminal; blinking pauses while the window or pane is unfocused and during IME preedit, then restarts from a visible cursor when focus or composition changes. The interval is aligned at 750ms, and stale timer generations cannot hide the cursor after blinking is no longer allowed. -- **Entering non-ASCII proxy text, including full-width punctuation, no longer crashes Settings.** Case-insensitive `socks5://`, `socks5h://`, `socks://`, and `http://` matching now respects UTF-8 character boundaries while preserving bare `host:port` compatibility. -- **GPUI title-bar File Tree and Git controls no longer arm a window drag.** Their left mouse-down events stop before reaching the draggable title bar, while the real button click still opens the requested panel. -- **GPUI diagnostics and Windows panic reporting no longer turn a recoverable diagnostic failure into a second panic.** GUI logging uses a fallible stderr sink and direct `println!` / `eprintln!` calls are rejected inside GPUI modules. On Windows, panic text is persisted to `nebula-panic.log` before a dedicated thread shows the error dialog, preventing its modal message loop from re-entering GPUI during the original panic. +- **Entering non-ASCII proxy text, including full-width punctuation, no longer crashes Settings.** Case-insensitive `socks5://`, `socks5h://`, `socks://`, and `http://` matching now respects UTF-8 character boundaries while preserving bare `host:port` compatibility. Addresses [#67](https://github.com/Kuddev/nebula/issues/67). +- **GPUI title-bar File Tree and Git controls no longer arm a window drag.** Their left mouse-down events stop before reaching the draggable title bar, while the real button click still opens the requested panel. Addresses [#62](https://github.com/Kuddev/nebula/issues/62). +- **GPUI diagnostics and Windows panic reporting no longer turn a recoverable diagnostic failure into a second panic.** GUI logging uses a fallible stderr sink and direct `println!` / `eprintln!` calls are rejected inside GPUI modules. On Windows, panic text is persisted to `nebula-panic.log` before a dedicated thread shows the error dialog, preventing its modal message loop from re-entering GPUI during the original panic. Addresses [#70](https://github.com/Kuddev/nebula/issues/70). - **Selecting a wide terminal character highlights its complete two-column footprint.** Whether the pointer lands on the leading cell or spacer, CJK characters, full-width punctuation, and emoji produce one non-overlapping selection run; simple, block, semantic, and line selections copy the complete character instead of showing or copying half a glyph. - **Runtime commands no longer show or activate their routed window as a side effect.** Snapshot, read, prompt, paste, run, exec, layout, and Agent operations preserve the current foreground window; runtime-created windows use non-activating show semantics, and only an explicit `focus` command activates a hidden or background workspace. - **Top-tab and sidebar actions are clickable without leaking into parent drag or collapse handlers.** Terminal tabs, the top-bar new-tab and overflow controls, and the sidebar new-tab control stop their mouse-down event at the action boundary, retain a shared 34px alignment, and no longer start a title-bar drag or toggle the `TABS` group at the same time. @@ -56,7 +66,7 @@ Every release entry is provided in English and Simplified Chinese. - **ConPTY cursor realignment now handles resize drift in both directions.** Nebula corrects content whether conhost collapsed rows above the local cursor or wrapped farther below it, and resize bursts are coalesced without dropping the final geometry or a required full-PTY notification. #### Improved -- **Terminal TeX rendering now detects formulas from terminal content instead of a recognized AI process name**, so block formulas remain available through WSL, SSH, and full-screen agent interfaces. Standard `$...$`, `$$...$$`, `\(...\)`, and `\[...\]` forms, Markdown-damaged bare delimiters, compact fraction arguments such as `\frac13`, dimmed reasoning output, cell backgrounds, and overlapping persisted formulas are handled more reliably. +- **Terminal TeX rendering now detects formulas from terminal content instead of a recognized AI process name**, so block formulas remain available through WSL, SSH, and full-screen agent interfaces. Standard `$...$`, `$$...$$`, `\(...\)`, and `\[...\]` forms, Markdown-damaged bare delimiters, compact fraction arguments such as `\frac13`, dimmed reasoning output, cell backgrounds, and overlapping persisted formulas are handled more reliably. Includes the terminal-math work contributed by [@liu-ws](https://github.com/liu-ws) in [#55](https://github.com/Kuddev/nebula/pull/55). - **GPUI now uses the legacy compact projection contract for inline terminal math.** A rendered formula occupies its measured visual width and following text closes the unused source-cell gap; ANSI backgrounds, selections, box-drawing glyphs, cursor shapes, ghost text, completion popups, IME anchors, and link previews all use the same projected columns. Mouse selection and link hit-testing map back to unchanged terminal source coordinates, including non-zero scrollback origins. Active selections and VI mode reveal the original TeX, alternate-screen applications keep fixed TUI columns, overlapping streamed formulas share one survivor set, and font or bitmap failures fall back to source text without stale shifts or hidden cells. - **Quick-terminal motion now matches the established slide behavior.** Entry uses a 120ms swift-out transition, exit uses a 90ms ease-in transition, and reversing direction mid-animation continues from the current position instead of jumping. Frame callbacks move only the native window's Y coordinate with no activation, resize, or z-order churn; user-triggered recall focuses once before entry, and the native window is hidden only after the exit finishes. - **Nord is now the factory-default dark theme, paired with Paper when the system uses a light appearance.** Fresh installs and missing or invalid theme values use the same default in the legacy and GPUI shells, while an explicit user-selected theme remains untouched. @@ -69,7 +79,7 @@ Every release entry is provided in English and Simplified Chinese. #### 新增 - **终端卡的几何收成了一组可配的键——圆角、卡缝、投影,以及左侧 Tab 栏与终端之间的竖线——并且跟随主题走。** 「浮在壳上的圆角卡」与「终端铺满整个右侧区域、靠一条细线分界」不再是两套布局、也不是两条渲染路径,而是同一条路径上的两组取值。`Nord` 是第一个采用后者的主题:圆角与卡缝双双归零,由一条 1px 竖线承担结构分界——卡缝一旦消失,侧栏与终端就会糊成一整块。其余主题保持浮起的卡片,并且刻意**不画**竖线:已经有卡缝了,再加一条线是在重复同一件事。`nebula_settings.txt` 里的 `pane_card_radius` / `pane_card_gutter` / `pane_card_shadow` / `pane_card_divider` 会覆盖主题的要求,于是切主题能换形态,而手调过的人不会被主题夺回控制权。圆角默认值同时收敛为单一真源:旧壳的 `UI_SHELL_RADIUS_LOGICAL` 与新壳的卡现在引用同一个常量,不再各自持有一份字面量——同一个数字存两份,正是那圈白边的来源。 -- **GPUI 设置现已内置 English 与简体中文语言 catalog。** 语言偏好可以跟随系统,也可以显式选择任一语言;选择会跨启动保留,并在运行时更新设置导航、控件、占位文案、Provider 测试、网络测试、SSH 状态及其他已迁移的设置消息,无需从磁盘读取翻译文件。缺少本地化消息时回退 English,配置值与显示文案保持分离,构建阶段会拒绝消息 ID 集合不一致的 catalog。 +- **GPUI 设置现已内置 English 与简体中文语言 catalog。** 语言偏好可以跟随系统,也可以显式选择任一语言;选择会跨启动保留,并在运行时更新设置导航、控件、占位文案、Provider 测试、网络测试、SSH 状态及其他已迁移的设置消息,无需从磁盘读取翻译文件。缺少本地化消息时回退 English,配置值与显示文案保持分离,构建阶段会拒绝消息 ID 集合不一致的 catalog。此项对应 [#71](https://github.com/Kuddev/nebula/issues/71) 的 GPUI 设置页范围;其他尚未翻译的界面不在本次发布范围内。 - **Windows 新增 GPUI 独立快速终端窗口。** 已配置的全局快捷键会打开一个进程级单例窗口,定位到最近活跃普通工作区所在的显示器,使用显示器全宽和 40% 高度从顶部滑入;窗口隐藏期间继续保留 PTY、滚屏和终端状态。修改快捷键后会向 Windows 重新注册,同一轮重复按键会合并成一次显示或隐藏操作。 - **新增版本化 Runtime 控制 API 与资源式 CLI,为自动化提供统一、可发现的 Nebula 操作入口。** `nebula env` 会报告当前 pane 身份、控制面可执行文件、支持的命令和运行时连通性;`nebula window`、`nebula tab`、`nebula pane`、`nebula agent` 通过同一 JSON 协议提供读取、发送、等待、关闭、重命名、移动、分屏、缩放、调整比例、运行、粘贴和执行操作。Bash、Fish、Zsh 补全同步覆盖新的命令面。 - **新增强类型多步编排,可在一次请求中建立 Agent 工作区。** 工作流可以创建标签、分屏、并行启动经过核实的 AI Provider、等待指定 generation ready,再投递首个 Prompt。后向步骤引用、受限模板、显式 partial 失败回执以及不隐式回滚,让后续步骤失败时已经完成的动作仍然可见、可续作。 @@ -88,7 +98,7 @@ Every release entry is provided in English and Simplified Chinese. - **`$E=mc^2$`、`$n!$` 等常见公式可以被正确识别,同时不会把 shell 变量、提示符、价格或 `sed`/`grep` 的 BRE 分组误当成数学公式。** 行内定界符可以跨终端软换行,但不会再连接互不相关的真实换行。 - **还原设置下拉框后会立即显示默认选项**,不再出现设置值已经写回、界面却仍停留在旧选项的情况。 - **浅色与深色主题下,圆角终端 pane 四周不再露出线框或顶部缝隙**;壳层绘制现在严格采用 pane 真实的左、右、下卡缝以及零宽度上卡缝。 -- **Windows 新建终端 pane 不再继承 Nebula 常驻进程里的过期环境变量。** 每个 pane 会从当前机器和用户注册表重建环境,按 Windows 顺序合并 `PATH`,以大小写不敏感方式处理变量名,基于刷新后的快照展开注册表值,在注册表项消失时保留进程私有值,并最后应用 pane 专属覆盖项。GPUI pane、旧壳 pane 和 WSL 启动都会使用同一份刷新结果。 +- **Windows 新建终端 pane 不再继承 Nebula 常驻进程里的过期环境变量。** 每个 pane 会从当前机器和用户注册表重建环境,按 Windows 顺序合并 `PATH`,以大小写不敏感方式处理变量名,基于刷新后的快照展开注册表值,在注册表项消失时保留进程私有值,并最后应用 pane 专属覆盖项。GPUI pane、旧壳 pane 和 WSL 启动都会使用同一份刷新结果。对应 [#68](https://github.com/Kuddev/nebula/issues/68)。 - **GPUI 快速终端快捷键在 Nebula 之外也能正常响应。** 第一个工作区打开时会向 Windows 注册已配置组合键,设置变化后会同步更新;如果新组合键注册失败,仍会保留有效的旧注册。快捷键会定位最近活跃的普通工作区,不要求 Nebula 已经处于焦点。 - **快速终端首次打开不再出现空白条,也不会停在普通窗口尺寸。** 原生窗口尺寸与终端表面会在窗口仍位于屏幕上方时完成一次同步,入场结束后再确认全宽、40% 高度的几何,但不会反复 resize PTY 或 swapchain。快速终端同时从普通窗口 MRU、runtime 命令定位、会话恢复、显示全部窗口和普通工作区持久化中隔离,隐藏或关闭它不会改写正常工作区会话。 - **显示数学定界符不再吞掉无关正文或后续公式。** 跨行 `$$...$$` 与 `\[...\]` 只有在真正的块起始上下文中才会配对,并会在空行展示边界停止,因此正文里提到的定界符、或滚屏顶部孤立的结束符不会再错误连接后面的公式块。 @@ -98,9 +108,9 @@ Every release entry is provided in English and Simplified Chinese. - **Tab 徽章不再让兜底信号覆盖权威状态。** Agent 授权和交互提示使用手掌标记,命令非零退出后会保留警示三角直到下一条命令开始,后台成功完成时会短暂显示对勾,再沉降为未读完成标记。只有尚无 Agent 规则判定 pane 状态时,末尾 BEL 才能请求关注,因此已经完成的 Agent 回合不会再被误标成等待输入。 - **Runtime 完成边沿不再串入仍在提交的新命令,补全弹窗尚未选中时也不会抢走 shell 历史方向键。** 在按 `Tab` 或用鼠标选择候选前,`Up` / `Down` 仍交给 shell;建立选中后,同样的方向键会按预期导航候选列表。 - **GPUI 光标闪烁现在与设置页和旧壳保持一致。** 未设置 `cursor_blink` 时,设置页与终端都会统一启用闪烁;窗口或 pane 失焦、以及输入法预编辑期间会暂停,焦点或组合状态变化时会先显示光标再重新开始。间隔统一为 750ms,过期 timer generation 不会在已不允许闪烁时再次隐藏光标。 -- **设置页输入非 ASCII 代理文本、包括全角标点时不再崩溃。** 大小写不敏感的 `socks5://`、`socks5h://`、`socks://`、`http://` 匹配现在遵守 UTF-8 字符边界,同时继续兼容裸 `host:port`。 -- **GPUI 标题栏的文件树与 Git 控件不再触发窗口拖动。** 左键按下事件会在到达可拖拽标题栏前停止,同时真实按钮点击仍会打开对应面板。 -- **GPUI 诊断与 Windows panic 报告不再把一次可恢复的诊断失败升级成二次 panic。** GUI 日志使用可失败 stderr sink,GPUI 模块内直接调用 `println!` / `eprintln!` 会在编译期被拒绝。Windows 会先把 panic 文本保存到 `nebula-panic.log`,再由专用线程显示错误对话框,避免模态消息循环在原始 panic 期间重新进入 GPUI。 +- **设置页输入非 ASCII 代理文本、包括全角标点时不再崩溃。** 大小写不敏感的 `socks5://`、`socks5h://`、`socks://`、`http://` 匹配现在遵守 UTF-8 字符边界,同时继续兼容裸 `host:port`。对应 [#67](https://github.com/Kuddev/nebula/issues/67)。 +- **GPUI 标题栏的文件树与 Git 控件不再触发窗口拖动。** 左键按下事件会在到达可拖拽标题栏前停止,同时真实按钮点击仍会打开对应面板。对应 [#62](https://github.com/Kuddev/nebula/issues/62)。 +- **GPUI 诊断与 Windows panic 报告不再把一次可恢复的诊断失败升级成二次 panic。** GUI 日志使用可失败 stderr sink,GPUI 模块内直接调用 `println!` / `eprintln!` 会在编译期被拒绝。Windows 会先把 panic 文本保存到 `nebula-panic.log`,再由专用线程显示错误对话框,避免模态消息循环在原始 panic 期间重新进入 GPUI。对应 [#70](https://github.com/Kuddev/nebula/issues/70)。 - **选中终端宽字符时会完整高亮它占用的两列。** 无论命中首格还是 spacer,CJK 字符、全角标点与 emoji 都只生成一个不重叠的选区 run;简单、块、语义和整行选区会复制完整字符,不再只显示或复制半个字形。 - **Runtime 命令不再因为路由而显示或激活目标窗口。** Snapshot、读取、Prompt、paste、run、exec、布局和 Agent 操作都会保留当前前台窗口;Runtime 新建窗口采用非激活显示语义,只有显式 `focus` 命令会激活隐藏或后台工作区。 - **顶栏标签与侧栏操作可以正常点击,不再把事件泄漏给父级拖动或折叠处理。** 终端标签、顶栏新建与更多按钮、侧栏新建按钮会在操作边界停止 mouse-down,保持统一的 34px 对齐,也不会同时启动标题栏拖动或切换 `TABS` 分组。 @@ -115,7 +125,7 @@ Every release entry is provided in English and Simplified Chinese. - **ConPTY 光标对账现在能处理 resize 漂移的两个方向。** 无论 conhost 在本地光标上方折叠了行,还是在下方产生更多换行,Nebula 都会校正内容;resize 爆发会合并处理,同时保留最终几何和必要的完整 PTY 通知。 #### 改进 -- **终端 TeX 渲染改为根据终端内容识别公式,不再依赖识别 AI 进程名称**,因此块级公式可继续用于 WSL、SSH 和全屏 Agent 界面。标准 `$...$`、`$$...$$`、`\(...\)`、`\[...\]`、Markdown 损坏后的裸定界符、`\frac13` 等紧凑分式参数、DIM 推理输出、单元格背景和持久化公式重叠都能得到更可靠的处理。 +- **终端 TeX 渲染改为根据终端内容识别公式,不再依赖识别 AI 进程名称**,因此块级公式可继续用于 WSL、SSH 和全屏 Agent 界面。标准 `$...$`、`$$...$$`、`\(...\)`、`\[...\]`、Markdown 损坏后的裸定界符、`\frac13` 等紧凑分式参数、DIM 推理输出、单元格背景和持久化公式重叠都能得到更可靠的处理。包含 [@liu-ws](https://github.com/liu-ws) 在 [#55](https://github.com/Kuddev/nebula/pull/55) 中贡献的终端数学工作。 - **GPUI 现在沿用旧壳的行内终端数学紧凑投影合同。** 公式按实际测得的视觉宽度占位,后续文本会收拢源单元格留下的空隙;ANSI 背景、选区、框线字形、各种光标、幽灵补全、补全弹窗、输入法锚点和链接预览全部使用同一套投影列。鼠标选择与链接命中仍会映射回未改动的终端源坐标,也覆盖非零滚屏起点。活动选区与 VI 模式会显示原始 TeX,备用屏应用保持 TUI 固定列,流式重叠公式共享同一存活集合,字体或位图失败时回退源文本,不会遗留旧位移或隐藏单元格。 - **快速终端运动现在与既有滑入体验一致。** 入场使用 120ms swift-out,退场使用 90ms ease-in,中途反向切换会从当前位置继续,不会跳到错误端点。帧回调只移动原生窗口 Y 坐标,不重复激活、不 resize、不改 z-order;用户主动召回时只在入场前聚焦一次,退场动画结束后才真正隐藏原生窗口。 - **Nord 现在是出厂默认深色主题,系统使用浅色外观时配对 Paper。** 新安装、缺少主题值或主题值无效时,旧壳与 GPUI 壳会采用同一个默认来源;用户显式选择的主题不会被覆盖。 diff --git a/Cargo.lock b/Cargo.lock index 08895c1..f0ce122 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4934,7 +4934,7 @@ dependencies = [ [[package]] name = "nebula" -version = "1.3.1" +version = "1.4.0" dependencies = [ "ab_glyph_rasterizer", "aes-gcm", @@ -5014,7 +5014,7 @@ dependencies = [ [[package]] name = "nebula-completions" -version = "1.3.1" +version = "1.4.0" dependencies = [ "lscolors", "nu-ansi-term", @@ -5035,15 +5035,15 @@ dependencies = [ [[package]] name = "nebula-settings" -version = "1.3.1" +version = "1.4.0" [[package]] name = "nebula-split" -version = "1.3.1" +version = "1.4.0" [[package]] name = "nebula_config" -version = "1.3.1" +version = "1.4.0" dependencies = [ "log", "nebula_config_derive", @@ -5053,7 +5053,7 @@ dependencies = [ [[package]] name = "nebula_config_derive" -version = "1.3.1" +version = "1.4.0" dependencies = [ "log", "nebula_config", @@ -5070,7 +5070,7 @@ version = "0.6.0" [[package]] name = "nebula_terminal" -version = "1.3.1" +version = "1.4.0" dependencies = [ "base64", "bitflags 2.13.0", diff --git a/docs/release-notes/v1.4.0.md b/docs/release-notes/v1.4.0.md new file mode 100644 index 0000000..76dacfa --- /dev/null +++ b/docs/release-notes/v1.4.0.md @@ -0,0 +1,130 @@ +# Nebula Terminal 1.4.0 + +## English + +### Added +- **The terminal card's geometry is now one configurable group — corner radius, gutter, shadow, and the divider between the tab sidebar and the terminal — and it travels with the theme.** "A rounded card floating on the shell" and "the terminal filling the entire right-hand area, separated by a single hairline" are no longer two layouts or two code paths; they are two sets of values on one path. `Nord` is the first theme to take the second form: radius and gutter both drop to zero and a 1px divider carries the structural boundary, because once the gutter is gone the sidebar and the terminal read as one undivided slab. Every other theme keeps the floating card and deliberately draws *no* divider — with a gutter present, a line would be a second boundary saying the same thing. Explicit `pane_card_radius` / `pane_card_gutter` / `pane_card_shadow` / `pane_card_divider` keys in `nebula_settings.txt` override whatever the theme asks for, so switching themes changes the shape while anyone who has tuned it keeps control. The radius default also became a single source of truth: the old shell's `UI_SHELL_RADIUS_LOGICAL` and the new shell's card now reference the same constant instead of each carrying its own literal — two copies of one number is exactly what produced the white seam around the card. +- **GPUI settings now ship with embedded English and Simplified Chinese catalogs.** The language preference can follow the system or explicitly select either catalog, persists across launches, and updates the settings navigation, controls, placeholders, provider tests, network tests, SSH status, and other migrated settings messages without reading translation files at runtime. English is the fallback for missing localized messages, configuration values remain separate from display text, and the build rejects catalogs whose message-ID sets drift apart. Addresses [#71](https://github.com/Kuddev/nebula/issues/71) for the GPUI Settings portion only; other untranslated surfaces remain outside this release. +- **Windows now has a dedicated GPUI quick terminal window.** The configured global shortcut opens a process-wide singleton across the full width and 40% height of the display containing the most recently active regular workspace, slides it from the top edge, and preserves its PTY, scrollback, and terminal state while hidden. Changing the shortcut re-registers it with Windows, and repeated key events are coalesced into one show or hide action. +- **A versioned Runtime control API and resource-style CLI now give automation one discoverable interface to Nebula.** `nebula env` reports the current pane identity, control executable, supported commands, and runtime reachability; `nebula window`, `nebula tab`, `nebula pane`, and `nebula agent` expose read, send, wait, close, rename, move, split, zoom, resize, run, paste, and execution operations through the same JSON protocol. Bash, Fish, and Zsh completions describe the expanded command surface. +- **Typed multi-step orchestration can build an Agent workspace in one request.** A workflow may create tabs, split panes, start verified AI providers in parallel, wait for the requested generation to become ready, and submit initial prompts. Backward step references, bounded templates, explicit partial-failure receipts, and no implicit rollback keep completed actions visible and resumable when a later step fails. +- **Managed Agents now have stable names, generation identities, and transactional Git worktree forks.** Cold-start, resume, and fork syntax is limited to verified `claude`, `codex`, `opencode`, `cursor`, `pi`, `omp`, and `kimi` commands; fork results retain branch, path, source, and base-commit provenance, reject dirty or conflicting sources, and clean up failed transactions. Native SSH panes report worktree forking as unsupported instead of pretending to create a remote checkout. +- **Local terminal panes expose a stable automation environment contract.** `TERM_PROGRAM`, `TERM_PROGRAM_VERSION`, `NEBULA_PANE_ID`, `NEBULA_CLI`, and `NEBULA_BIN_DIR` identify the pane and control plane; WSL receives idempotent `PATH` / `WSLENV` forwarding with translated paths, while native SSH receives only a remote marker and never advertises a host-local control executable. +- **`pane.exec` runs a direct argv as an independent non-TTY child in the pane's local or WSL working context.** It leaves shell history, the interactive terminal, cwd, and pane environment untouched; captures stdout and stderr concurrently; reports exit status, encoding, truncation, and timeout metadata; and bounds retained output. Timeouts and early parent exits clean up descendants through a Windows Job Object or Unix process group. Native SSH returns `remote_exec_unsupported` rather than silently running elsewhere. +- **Panes and live managed Agents support bounded bracketed paste from literal text, stdin, or a file.** Prompt, paste, control-key, argv, and multiline validation prevent arbitrary terminal bytes from bypassing the public API, and generation-aware targeting keeps delayed input from reaching a restarted Agent with the same display name. +- **Quick Jump searches tabs, panes, frequent directories, configured SSH hosts, and recoverable AI sessions in one palette.** Results retain tab and pane location, cwd, remote destination, provider, and session metadata, then expose direct focus, open, launch, or resume actions. File and Recipe scopes remain hidden because those backends are not yet end-to-end. +- **Selected terminal or document text can be sent to an explicitly chosen live Agent.** The searchable Send to Chat dialog previews the selection as a quote, preserves blank lines, accepts an optional comment, can copy the composed message, labels remote SSH targets, and reports the destination after sending. If no live Agent exists, the action is disabled instead of guessing a pane. +- **Windows terminal tabs can be dragged between Nebula windows.** A tab may become a new tab in the target or dock its complete split tree to the left, right, top, or bottom; terminal panes, runtime ownership, subscriptions, focus, and session metadata move together. Moving the last tab closes the empty source window, while a target that disappears before commit leaves the source tab attached. +- **Windows taskbar progress reflects OSC 9;4 emitted by terminal applications.** Normal, indeterminate, error, paused, and cleared states map to the native taskbar indicator; unsupported or unknown states clear stale progress instead of leaving the taskbar stuck. +- **The GPUI file tree now offers complete context actions for local and WSL entries.** Users can open files or directories, reveal them in Explorer, copy host or Linux paths, launch a terminal in a directory, and send deletions to the recycle bin after confirmation. WSL routes retain their distribution and guest path instead of being flattened into an invalid host path. + +### Fixed +- **Output no longer stops mid-frame with the CLI's input box missing.** The 1.2.0 fix for the lost `piper` wakeup only closed half the race. It re-posted the readable event when the pipe still held bytes *at the moment the read returned* — but `drain_inner` takes the read waker **before** it copies any data, so "this read got something" already means "no waker is registered", regardless of whether the pipe happens to look empty now. An AI CLI's trailing bytes land in exactly that window: a screenful of diff pushes `pty_read` past its 64 KB `MAX_LOCKED_READ` break just as the pipe drains, and the few hundred bytes of input box and status bar printed right after find an empty waker, so their `wake()` is a no-op. Those bytes then sit in the pipe until a keystroke (which flips write interest, re-registers, and re-posts) or a resize (which force-drains) lets them out; dragging a tab does neither and never recovered. Live evidence from a stuck pane: one no-op arrow key released 527 stranded lines at once. The repost now keys only on "this read got data", which is self-converging — the following read finds the pipe empty and piper registers the waker again. +- **Common formulas such as `$E=mc^2$` and `$n!$` are recognized without reinterpreting shell variables, prompts, prices, or `sed`/`grep` BRE groups as mathematics.** Inline delimiters may cross terminal soft wraps but no longer join unrelated hard lines. +- **Resetting a settings drop-down immediately restores its displayed default value** instead of updating the saved setting while leaving the old selection visible. +- **Rounded terminal panes no longer expose an outline or a gap along their top edge** in either light or dark themes; the shell paint now follows the pane's actual left, right, bottom, and zero-width top gutters. +- **New Windows terminal panes no longer inherit stale environment variables from the long-running Nebula process.** Each pane rebuilds its environment from the current machine and user registry values, merges `PATH` in Windows order, treats variable names case-insensitively, expands registry values against the refreshed snapshot, preserves process-private values when a registry entry disappears, and applies pane-specific overrides last. The same refreshed environment reaches GPUI panes, legacy panes, and WSL launches. Addresses [#68](https://github.com/Kuddev/nebula/issues/68). +- **The GPUI quick-terminal shortcut now works outside Nebula.** The configured combination is registered with Windows when the first workspace opens, follows later settings changes without discarding a still-valid old registration if the replacement fails, and targets the most recently active regular workspace instead of requiring Nebula to be focused. +- **The quick terminal no longer opens with a blank strip or settles at ordinary-window dimensions.** Its native size and terminal surface are synchronized once while the window is still above the screen, and its full-width, 40%-height geometry is confirmed after entry without repeatedly resizing the PTY or swapchain. It is also excluded from regular-window MRU routing, runtime command targeting, session restoration, reveal-all behavior, and ordinary workspace persistence, so hiding or closing it cannot rewrite the normal workspace session. +- **Display-math delimiters no longer consume unrelated prose or later formulas.** Multiline `$$...$$` and `\[...\]` pairing now requires a real block-opening context and stops at blank-line presentation boundaries, so a delimiter mentioned in prose or an orphaned closer at the top of scrollback cannot pair with a later block. +- **Presentation-only `\boxed{...}` and `\tag{...}` commands no longer make an otherwise valid formula fall back to raw TeX.** Boxed content remains renderable even when the current math backend cannot draw the frame, and equation tags are retained as inline numbers. +- **Spaces and other valid ink-free glyphs inside `\text{...}` no longer make an entire formula disappear.** Glyphs with advance width but no outline produce an empty bitmap instead of a missing-glyph error; if a formula still cannot be composed, its original terminal cells remain visible rather than leaving a blank hole. +- **Sidebar resizing follows the theme's actual boundary.** Nord's flush terminal layout centers the resize cursor and width calculation on its 1px divider, while floating-card themes continue to use their gutter, so the visible line no longer lags behind the pointer. +- **Tab badges no longer let fallback signals overwrite authoritative state.** Agent authorization and interactive prompts use the hand indicator, a non-zero command exit keeps a warning triangle until the next command begins, and a successful background completion briefly shows a check before settling into the unread-completion mark. A trailing BEL can request attention only when no agent rule has already decided the pane state, so a completed agent turn is not mislabeled as waiting for input. +- **Runtime completion edges no longer leak into a command that is still being submitted, and an unselected completion popup no longer captures shell history keys.** `Up` and `Down` remain available to the shell until `Tab` or a mouse action selects a candidate; once selected, the same keys navigate the popup as expected. +- **GPUI cursor blinking now agrees with its setting and with the existing shell.** An unset `cursor_blink` value enables blinking consistently in both Settings and the terminal; blinking pauses while the window or pane is unfocused and during IME preedit, then restarts from a visible cursor when focus or composition changes. The interval is aligned at 750ms, and stale timer generations cannot hide the cursor after blinking is no longer allowed. +- **Entering non-ASCII proxy text, including full-width punctuation, no longer crashes Settings.** Case-insensitive `socks5://`, `socks5h://`, `socks://`, and `http://` matching now respects UTF-8 character boundaries while preserving bare `host:port` compatibility. Addresses [#67](https://github.com/Kuddev/nebula/issues/67). +- **GPUI title-bar File Tree and Git controls no longer arm a window drag.** Their left mouse-down events stop before reaching the draggable title bar, while the real button click still opens the requested panel. Addresses [#62](https://github.com/Kuddev/nebula/issues/62). +- **GPUI diagnostics and Windows panic reporting no longer turn a recoverable diagnostic failure into a second panic.** GUI logging uses a fallible stderr sink and direct `println!` / `eprintln!` calls are rejected inside GPUI modules. On Windows, panic text is persisted to `nebula-panic.log` before a dedicated thread shows the error dialog, preventing its modal message loop from re-entering GPUI during the original panic. Addresses [#70](https://github.com/Kuddev/nebula/issues/70). +- **Selecting a wide terminal character highlights its complete two-column footprint.** Whether the pointer lands on the leading cell or spacer, CJK characters, full-width punctuation, and emoji produce one non-overlapping selection run; simple, block, semantic, and line selections copy the complete character instead of showing or copying half a glyph. +- **Runtime commands no longer show or activate their routed window as a side effect.** Snapshot, read, prompt, paste, run, exec, layout, and Agent operations preserve the current foreground window; runtime-created windows use non-activating show semantics, and only an explicit `focus` command activates a hidden or background workspace. +- **Top-tab and sidebar actions are clickable without leaking into parent drag or collapse handlers.** Terminal tabs, the top-bar new-tab and overflow controls, and the sidebar new-tab control stop their mouse-down event at the action boundary, retain a shared 34px alignment, and no longer start a title-bar drag or toggle the `TABS` group at the same time. +- **The sidebar divider is now one pixel-aligned segment from the top of the window to the pane card bottom.** It no longer stops below the title bar or forms a seam from two independently painted pieces, and it is omitted when the layout has no real sidebar boundary. +- **Runtime Agent notifications are associated with the correct pane and process.** On Windows, process-ancestry evidence can find hook helpers through intermediate shells, distinguish nested Agents by PID, and reject another pane's event instead of trusting a short-lived session id; unavailable remote process evidence is reported as such rather than fabricated. +- **Runtime waits no longer treat a pane that was already idle as completion of a command that has just been submitted.** Submission creates a fresh running/state-change edge before waiting, Agent waits stay bound to the requested generation, and a command without reliable OSC exit evidence is not reported as a verified success. +- **Runtime layout mutations no longer guess when a target is ambiguous or unavailable.** Explicit ambiguity, busy-pane, stale lifecycle, unsupported-remote, and invalid-target errors replace silent fallback to whichever window or pane happened to be current. +- **Local selection content is not silently forwarded to an SSH Agent by programmatic routing.** Automated sends return `remote_target_refused`; a user may still deliberately choose a labeled remote target in the Send to Chat dialog. +- **The GPUI file tree keeps long lists and status messages inside the rounded drawer.** Row density, clipping, scrolling, and bottom padding no longer fight each other, and empty states distinguish loading, enumeration failure, missing cwd, and a genuinely empty directory with an appropriate retry or navigation action. +- **WSL file-tree entries preserve their guest paths and distribution.** Files open through the corresponding `\\wsl.localhost` route, directories launch a terminal at the Linux cwd without forcing Bash over the distribution's configured default shell, and Explorer actions use the matching host-visible path. +- **Applications using DECSET 2031 receive consistent terminal color-scheme notifications.** The subscription uses the same light/dark predicate as OSC 11, reports the current scheme immediately, avoids duplicate notifications, and updates after a live theme change. +- **ConPTY cursor realignment now handles resize drift in both directions.** Nebula corrects content whether conhost collapsed rows above the local cursor or wrapped farther below it, and resize bursts are coalesced without dropping the final geometry or a required full-PTY notification. + +### Improved +- **Terminal TeX rendering now detects formulas from terminal content instead of a recognized AI process name**, so block formulas remain available through WSL, SSH, and full-screen agent interfaces. Standard `$...$`, `$$...$$`, `\(...\)`, and `\[...\]` forms, Markdown-damaged bare delimiters, compact fraction arguments such as `\frac13`, dimmed reasoning output, cell backgrounds, and overlapping persisted formulas are handled more reliably. Includes the terminal-math work contributed by [@liu-ws](https://github.com/liu-ws) in [#55](https://github.com/Kuddev/nebula/pull/55). +- **GPUI now uses the legacy compact projection contract for inline terminal math.** A rendered formula occupies its measured visual width and following text closes the unused source-cell gap; ANSI backgrounds, selections, box-drawing glyphs, cursor shapes, ghost text, completion popups, IME anchors, and link previews all use the same projected columns. Mouse selection and link hit-testing map back to unchanged terminal source coordinates, including non-zero scrollback origins. Active selections and VI mode reveal the original TeX, alternate-screen applications keep fixed TUI columns, overlapping streamed formulas share one survivor set, and font or bitmap failures fall back to source text without stale shifts or hidden cells. +- **Quick-terminal motion now matches the established slide behavior.** Entry uses a 120ms swift-out transition, exit uses a 90ms ease-in transition, and reversing direction mid-animation continues from the current position instead of jumping. Frame callbacks move only the native window's Y coordinate with no activation, resize, or z-order churn; user-triggered recall focuses once before entry, and the native window is hidden only after the exit finishes. +- **Nord is now the factory-default dark theme, paired with Paper when the system uses a light appearance.** Fresh installs and missing or invalid theme values use the same default in the legacy and GPUI shells, while an explicit user-selected theme remains untouched. +- **Runtime snapshots are now suitable for automation and auditing.** They expose revisions, semantic pane lifecycle and task state, zoom state, process evidence, stable Agent identity, generation, and worktree provenance; provider actions use verified cold-start, resume, and fork syntax instead of inferring commands from display names. +- **GPUI Settings navigation is now a flat list with stable routes.** Group headings are removed and the visible order is Application, Appearance, Profiles, Interaction, Key Bindings, SSH, Network, Advanced. AI Providers and Backup retain their implementations and route indices but are temporarily absent from the default sidebar. +- **GPUI session residency and tray actions now respect live-pane ownership.** When configured, closing a regular workspace hides it without killing PTYs; tray actions can reveal the correct workspace and focus a selected Agent pane, while an explicit tray quit saves session state before shutdown. Quick-terminal windows remain outside this ordinary-session lifecycle. +- **GPUI terminal rendering shares the existing terminal color resolver.** Application-owned truecolor and background values follow theme and terminal overrides consistently, while fixed ANSI and graphic colors retain their intended ownership. + +## 中文 + +### 新增 +- **终端卡的几何收成了一组可配的键——圆角、卡缝、投影,以及左侧 Tab 栏与终端之间的竖线——并且跟随主题走。** 「浮在壳上的圆角卡」与「终端铺满整个右侧区域、靠一条细线分界」不再是两套布局、也不是两条渲染路径,而是同一条路径上的两组取值。`Nord` 是第一个采用后者的主题:圆角与卡缝双双归零,由一条 1px 竖线承担结构分界——卡缝一旦消失,侧栏与终端就会糊成一整块。其余主题保持浮起的卡片,并且刻意**不画**竖线:已经有卡缝了,再加一条线是在重复同一件事。`nebula_settings.txt` 里的 `pane_card_radius` / `pane_card_gutter` / `pane_card_shadow` / `pane_card_divider` 会覆盖主题的要求,于是切主题能换形态,而手调过的人不会被主题夺回控制权。圆角默认值同时收敛为单一真源:旧壳的 `UI_SHELL_RADIUS_LOGICAL` 与新壳的卡现在引用同一个常量,不再各自持有一份字面量——同一个数字存两份,正是那圈白边的来源。 +- **GPUI 设置现已内置 English 与简体中文语言 catalog。** 语言偏好可以跟随系统,也可以显式选择任一语言;选择会跨启动保留,并在运行时更新设置导航、控件、占位文案、Provider 测试、网络测试、SSH 状态及其他已迁移的设置消息,无需从磁盘读取翻译文件。缺少本地化消息时回退 English,配置值与显示文案保持分离,构建阶段会拒绝消息 ID 集合不一致的 catalog。此项对应 [#71](https://github.com/Kuddev/nebula/issues/71) 的 GPUI 设置页范围;其他尚未翻译的界面不在本次发布范围内。 +- **Windows 新增 GPUI 独立快速终端窗口。** 已配置的全局快捷键会打开一个进程级单例窗口,定位到最近活跃普通工作区所在的显示器,使用显示器全宽和 40% 高度从顶部滑入;窗口隐藏期间继续保留 PTY、滚屏和终端状态。修改快捷键后会向 Windows 重新注册,同一轮重复按键会合并成一次显示或隐藏操作。 +- **新增版本化 Runtime 控制 API 与资源式 CLI,为自动化提供统一、可发现的 Nebula 操作入口。** `nebula env` 会报告当前 pane 身份、控制面可执行文件、支持的命令和运行时连通性;`nebula window`、`nebula tab`、`nebula pane`、`nebula agent` 通过同一 JSON 协议提供读取、发送、等待、关闭、重命名、移动、分屏、缩放、调整比例、运行、粘贴和执行操作。Bash、Fish、Zsh 补全同步覆盖新的命令面。 +- **新增强类型多步编排,可在一次请求中建立 Agent 工作区。** 工作流可以创建标签、分屏、并行启动经过核实的 AI Provider、等待指定 generation ready,再投递首个 Prompt。后向步骤引用、受限模板、显式 partial 失败回执以及不隐式回滚,让后续步骤失败时已经完成的动作仍然可见、可续作。 +- **托管 Agent 新增稳定名称、generation 身份和事务化 Git worktree 分叉。** 冷启动、恢复和分叉只开放已核实的 `claude`、`codex`、`opencode`、`cursor`、`pi`、`omp`、`kimi` 命令;fork 结果保留 branch、路径、来源和 base commit provenance,拒绝脏源或冲突,并清理失败的事务。原生 SSH pane 会明确报告不支持 worktree 分叉,不会伪装成已创建远端 checkout。 +- **本地终端 pane 新增稳定自动化环境契约。** `TERM_PROGRAM`、`TERM_PROGRAM_VERSION`、`NEBULA_PANE_ID`、`NEBULA_CLI`、`NEBULA_BIN_DIR` 用于识别 pane 和控制面;WSL 通过幂等的 `PATH` / `WSLENV` 与路径转换获得入口,原生 SSH 只收到远端标记,不会宣称拥有 host 本地控制面可执行文件。 +- **`pane.exec` 可以在 pane 的本地或 WSL 工作上下文中直接运行 argv,作为独立非 TTY 子进程执行。** 它不会改变 shell 历史、交互终端、cwd 或 pane 环境;会并发捕获 stdout/stderr,返回退出状态、编码、截断和超时元数据,并限制输出保留量。超时或父进程提前退出时通过 Windows Job Object 或 Unix process group 清理后代。原生 SSH 会返回 `remote_exec_unsupported`,不会静默改在别处执行。 +- **pane 与 live 托管 Agent 支持从字面量、stdin 或文件进行受限 bracketed paste。** Prompt、paste、控制键、argv 和多行输入校验会阻止任意终端字节绕过公开 API;generation-aware 目标绑定也会避免延迟输入落入同名但已经重启的 Agent。 +- **Quick Jump 可以在同一面板中搜索标签、pane、常用目录、已配置 SSH 主机和可恢复 AI 会话。** 结果保留标签与 pane 位置、cwd、远端目标、Provider 和会话元数据,并提供直接聚焦、打开、启动或恢复操作。Files 与 Recipes scope 因后端尚未端到端完成而继续隐藏。 +- **终端或文档选区可以发送给用户明确选择的 live Agent。** 可搜索的 Send to Chat 对话框会把选区预览为引用、保留空行、接受可选评论、支持复制组合消息、标识 SSH 远端目标,并在发送后报告目标。没有 live Agent 时该操作会禁用,不会猜测 pane。 +- **Windows 支持在 Nebula 窗口之间拖动终端标签。** 标签既可成为目标窗口的新标签,也可把完整 split tree 停靠到左、右、上、下区域;终端 pane、Runtime 所有权、订阅、焦点与会话元数据会一起迁移。移动最后一个标签时会关闭空源窗口;如果目标在提交前消失,源标签继续留在原窗口。 +- **Windows 任务栏进度会反映终端应用发出的 OSC 9;4。** 普通、不确定、错误、暂停和清除状态映射到原生任务栏指示器;不支持或未知状态会清除旧进度,不会让任务栏卡在过期状态。 +- **GPUI 文件树为本地和 WSL 条目提供完整右键操作。** 用户可以打开文件或目录、在资源管理器中显示、复制 host 或 Linux 路径、在目录中启动终端,并在确认后把文件送入回收站。WSL 路由保留发行版和 guest path,不会被压成无效 host 路径。 + +### 修复 +- **输出不再停在半帧、缺 CLI 输入框。** 1.2.0 那次修 `piper` 丢唤醒只补了一半:它在「读取返回的那一刻管道仍有货」时补投 readable,但 `drain_inner` 是**在拷贝数据之前**就摘掉 read waker 的——因此「这次读到过数据」本身就意味着此刻没有 waker,与管道当下看起来空不空无关。AI CLI 的收尾字节恰好落在这个窗口里:先打完一屏 diff 把 `pty_read` 顶过 64 KB 的 `MAX_LOCKED_READ` 提前 break、管道刚好排空,紧随其后那几百字节的输入框与状态栏就撞上空 waker,它们的 `wake()` 成了空操作。这批字节于是滞留在管道里,直到一次按键(翻转写意图、触发 reregister 并补投)或一次 resize(走强制排空)才被放出来;而拖动标签两者都不做,所以永远不会自行恢复。卡住 pane 的活体取证:一个 no-op 方向键一次性放出了 527 行滞留输出。现在补投只以「这次读到过数据」为判据,并且自收敛——紧接着的那次读取会遇到空管道,piper 借此重新注册 waker。 +- **`$E=mc^2$`、`$n!$` 等常见公式可以被正确识别,同时不会把 shell 变量、提示符、价格或 `sed`/`grep` 的 BRE 分组误当成数学公式。** 行内定界符可以跨终端软换行,但不会再连接互不相关的真实换行。 +- **还原设置下拉框后会立即显示默认选项**,不再出现设置值已经写回、界面却仍停留在旧选项的情况。 +- **浅色与深色主题下,圆角终端 pane 四周不再露出线框或顶部缝隙**;壳层绘制现在严格采用 pane 真实的左、右、下卡缝以及零宽度上卡缝。 +- **Windows 新建终端 pane 不再继承 Nebula 常驻进程里的过期环境变量。** 每个 pane 会从当前机器和用户注册表重建环境,按 Windows 顺序合并 `PATH`,以大小写不敏感方式处理变量名,基于刷新后的快照展开注册表值,在注册表项消失时保留进程私有值,并最后应用 pane 专属覆盖项。GPUI pane、旧壳 pane 和 WSL 启动都会使用同一份刷新结果。对应 [#68](https://github.com/Kuddev/nebula/issues/68)。 +- **GPUI 快速终端快捷键在 Nebula 之外也能正常响应。** 第一个工作区打开时会向 Windows 注册已配置组合键,设置变化后会同步更新;如果新组合键注册失败,仍会保留有效的旧注册。快捷键会定位最近活跃的普通工作区,不要求 Nebula 已经处于焦点。 +- **快速终端首次打开不再出现空白条,也不会停在普通窗口尺寸。** 原生窗口尺寸与终端表面会在窗口仍位于屏幕上方时完成一次同步,入场结束后再确认全宽、40% 高度的几何,但不会反复 resize PTY 或 swapchain。快速终端同时从普通窗口 MRU、runtime 命令定位、会话恢复、显示全部窗口和普通工作区持久化中隔离,隐藏或关闭它不会改写正常工作区会话。 +- **显示数学定界符不再吞掉无关正文或后续公式。** 跨行 `$$...$$` 与 `\[...\]` 只有在真正的块起始上下文中才会配对,并会在空行展示边界停止,因此正文里提到的定界符、或滚屏顶部孤立的结束符不会再错误连接后面的公式块。 +- **只负责展示的 `\boxed{...}` 与 `\tag{...}` 不再让原本有效的公式回退成原始 TeX。** 当前数学后端无法绘制边框时仍会渲染盒内内容,公式编号也会作为行内编号保留下来。 +- **`\text{...}` 中的空格等合法无墨字形不再导致整条公式消失。** 有前进宽度但没有轮廓的字形会生成空位图,而不是触发缺字错误;如果公式仍然无法合成,终端原始单元格会继续显示,不会留下一块空洞。 +- **侧栏拖拽现在跟随主题真正的边界。** Nord 的铺满终端布局会把 resize 光标和宽度计算对准 1px 分隔线,浮起卡片主题则继续使用卡缝,因此可见竖线不会再落后于鼠标指针。 +- **Tab 徽章不再让兜底信号覆盖权威状态。** Agent 授权和交互提示使用手掌标记,命令非零退出后会保留警示三角直到下一条命令开始,后台成功完成时会短暂显示对勾,再沉降为未读完成标记。只有尚无 Agent 规则判定 pane 状态时,末尾 BEL 才能请求关注,因此已经完成的 Agent 回合不会再被误标成等待输入。 +- **Runtime 完成边沿不再串入仍在提交的新命令,补全弹窗尚未选中时也不会抢走 shell 历史方向键。** 在按 `Tab` 或用鼠标选择候选前,`Up` / `Down` 仍交给 shell;建立选中后,同样的方向键会按预期导航候选列表。 +- **GPUI 光标闪烁现在与设置页和旧壳保持一致。** 未设置 `cursor_blink` 时,设置页与终端都会统一启用闪烁;窗口或 pane 失焦、以及输入法预编辑期间会暂停,焦点或组合状态变化时会先显示光标再重新开始。间隔统一为 750ms,过期 timer generation 不会在已不允许闪烁时再次隐藏光标。 +- **设置页输入非 ASCII 代理文本、包括全角标点时不再崩溃。** 大小写不敏感的 `socks5://`、`socks5h://`、`socks://`、`http://` 匹配现在遵守 UTF-8 字符边界,同时继续兼容裸 `host:port`。对应 [#67](https://github.com/Kuddev/nebula/issues/67)。 +- **GPUI 标题栏的文件树与 Git 控件不再触发窗口拖动。** 左键按下事件会在到达可拖拽标题栏前停止,同时真实按钮点击仍会打开对应面板。对应 [#62](https://github.com/Kuddev/nebula/issues/62)。 +- **GPUI 诊断与 Windows panic 报告不再把一次可恢复的诊断失败升级成二次 panic。** GUI 日志使用可失败 stderr sink,GPUI 模块内直接调用 `println!` / `eprintln!` 会在编译期被拒绝。Windows 会先把 panic 文本保存到 `nebula-panic.log`,再由专用线程显示错误对话框,避免模态消息循环在原始 panic 期间重新进入 GPUI。对应 [#70](https://github.com/Kuddev/nebula/issues/70)。 +- **选中终端宽字符时会完整高亮它占用的两列。** 无论命中首格还是 spacer,CJK 字符、全角标点与 emoji 都只生成一个不重叠的选区 run;简单、块、语义和整行选区会复制完整字符,不再只显示或复制半个字形。 +- **Runtime 命令不再因为路由而显示或激活目标窗口。** Snapshot、读取、Prompt、paste、run、exec、布局和 Agent 操作都会保留当前前台窗口;Runtime 新建窗口采用非激活显示语义,只有显式 `focus` 命令会激活隐藏或后台工作区。 +- **顶栏标签与侧栏操作可以正常点击,不再把事件泄漏给父级拖动或折叠处理。** 终端标签、顶栏新建与更多按钮、侧栏新建按钮会在操作边界停止 mouse-down,保持统一的 34px 对齐,也不会同时启动标题栏拖动或切换 `TABS` 分组。 +- **侧栏分隔线现在是一条从窗口顶部延伸到 pane 卡底部、按物理像素对齐的连续线。** 它不再停在标题栏下方,也不会因两段独立绘制造成接缝;没有真实侧栏边界的布局不会绘制该线。 +- **Runtime Agent 通知现在会关联到正确的 pane 和进程。** Windows 进程祖先证据可以穿过中间 shell 找到 hook helper、按 PID 区分嵌套 Agent,并拒绝其他 pane 的事件,而不是信任短命 session id;无法取得远端进程证据时会明确报告,不会伪造。 +- **Runtime wait 不再把提交前已经 idle 的 pane 误判成刚提交的命令已经完成。** 提交操作会先建立新的 running / 状态变化边沿,Agent wait 始终绑定请求的 generation;没有可靠 OSC 退出证据的命令不会被报告为已验证成功。 +- **Runtime 布局变更在目标歧义或不可用时不再猜测。** 目标歧义、pane 忙碌、生命周期过期、远端不支持和目标无效都会返回明确错误,不会静默回退到碰巧处于当前状态的窗口或 pane。 +- **本地选区不会再被程序路由静默发送给 SSH Agent。** 自动发送会返回 `remote_target_refused`;用户仍可以在 Send to Chat 对话框中主动选择带远端标识的目标。 +- **GPUI 文件树会把长列表和状态消息限制在圆角抽屉内部。** 行密度、裁剪、滚动和底部 padding 不再互相冲突;空态会区分读取中、枚举失败、缺少 cwd 与真正空目录,并提供对应的重试或导航操作。 +- **WSL 文件树条目会保留 guest path 和发行版。** 文件通过对应的 `\\wsl.localhost` 路由打开,目录在 Linux cwd 处启动终端且不会强制 Bash 覆盖发行版配置的默认 shell,资源管理器操作则使用匹配的 host 可见路径。 +- **使用 DECSET 2031 的应用现在会收到一致的终端色彩方案通知。** 订阅与 OSC 11 使用同一个明暗判据,会立即报告当前方案、避免重复通知,并在运行中切换主题后更新。 +- **ConPTY 光标对账现在能处理 resize 漂移的两个方向。** 无论 conhost 在本地光标上方折叠了行,还是在下方产生更多换行,Nebula 都会校正内容;resize 爆发会合并处理,同时保留最终几何和必要的完整 PTY 通知。 + +### 改进 +- **终端 TeX 渲染改为根据终端内容识别公式,不再依赖识别 AI 进程名称**,因此块级公式可继续用于 WSL、SSH 和全屏 Agent 界面。标准 `$...$`、`$$...$$`、`\(...\)`、`\[...\]`、Markdown 损坏后的裸定界符、`\frac13` 等紧凑分式参数、DIM 推理输出、单元格背景和持久化公式重叠都能得到更可靠的处理。包含 [@liu-ws](https://github.com/liu-ws) 在 [#55](https://github.com/Kuddev/nebula/pull/55) 中贡献的终端数学工作。 +- **GPUI 现在沿用旧壳的行内终端数学紧凑投影合同。** 公式按实际测得的视觉宽度占位,后续文本会收拢源单元格留下的空隙;ANSI 背景、选区、框线字形、各种光标、幽灵补全、补全弹窗、输入法锚点和链接预览全部使用同一套投影列。鼠标选择与链接命中仍会映射回未改动的终端源坐标,也覆盖非零滚屏起点。活动选区与 VI 模式会显示原始 TeX,备用屏应用保持 TUI 固定列,流式重叠公式共享同一存活集合,字体或位图失败时回退源文本,不会遗留旧位移或隐藏单元格。 +- **快速终端运动现在与既有滑入体验一致。** 入场使用 120ms swift-out,退场使用 90ms ease-in,中途反向切换会从当前位置继续,不会跳到错误端点。帧回调只移动原生窗口 Y 坐标,不重复激活、不 resize、不改 z-order;用户主动召回时只在入场前聚焦一次,退场动画结束后才真正隐藏原生窗口。 +- **Nord 现在是出厂默认深色主题,系统使用浅色外观时配对 Paper。** 新安装、缺少主题值或主题值无效时,旧壳与 GPUI 壳会采用同一个默认来源;用户显式选择的主题不会被覆盖。 +- **Runtime snapshot 现在可直接用于自动化与审计。** 它会暴露 revision、语义化 pane 生命周期和任务状态、缩放状态、进程证据、稳定 Agent 身份、generation 和 worktree provenance;Provider 操作使用已核实的冷启动、恢复和分叉语法,不再根据显示名称猜命令。 +- **GPUI 设置导航改为保持稳定路由的扁平列表。** 左侧不再显示分组标题,默认顺序为“应用、外观、配置文件、交互、按键映射、SSH、网络、高级”。“AI 供应商”和“备份”仍保留实现及路由索引,但暂时不进入默认侧栏。 +- **GPUI 会话驻留与托盘操作现在遵守 live pane 所有权。** 配置启用时关闭普通工作区会隐藏窗口而不杀 PTY;托盘操作可显示正确工作区并聚焦指定 Agent pane,显式从托盘退出则会先保存 session 再关闭。快速终端窗口不参与普通 session 生命周期。 +- **GPUI 终端渲染与旧壳共享 Terminal color resolver。** 应用拥有的 truecolor 和背景值会一致遵循主题与终端覆盖设置,固定 ANSI 和图形颜色则保持原有归属。 + +## Contributors + +- [@liu-ws](https://github.com/liu-ws): terminal TeX rendering for WSL agents ([#55](https://github.com/Kuddev/nebula/pull/55)). + +--- + +**SHA256** + +- `NebulaTerminal-v1.4.0-windows-x64.zip`: `PENDING FORMAL BUILD` +- `NebulaTerminal-1.4.0-windows-x64-setup.exe`: `PENDING FORMAL BUILD` diff --git a/nebula-completions/Cargo.toml b/nebula-completions/Cargo.toml index 21028b1..b48aa2f 100644 --- a/nebula-completions/Cargo.toml +++ b/nebula-completions/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nebula-completions" -version = "1.3.1" +version = "1.4.0" edition.workspace = true [features] diff --git a/nebula_app/Cargo.toml b/nebula_app/Cargo.toml index 27facbb..d80ef91 100644 --- a/nebula_app/Cargo.toml +++ b/nebula_app/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nebula" -version = "1.3.1" +version = "1.4.0" license = "GPL-3.0-or-later" description = "Nebula Terminal — a premium GPU-accelerated terminal emulator" readme = "README.md" @@ -15,15 +15,15 @@ path = "src/main.rs" [dependencies.nebula_terminal] path = "../nebula_terminal" -version = "1.3.1" +version = "1.4.0" [dependencies.nebula_config_derive] path = "../nebula_config_derive" -version = "1.3.1" +version = "1.4.0" [dependencies.nebula_config] path = "../nebula_config" -version = "1.3.1" +version = "1.4.0" # 可选:GPUI UI 层(feature = "gpui-shell",模块 src/gpui_shell/)。 # GPUI/component 的版本和 Git 来源由根 Cargo.toml 统一精确固定。 @@ -62,7 +62,7 @@ optional = true [dependencies.nebula-completions] path = "../nebula-completions" -version = "1.3.1" +version = "1.4.0" [dependencies] ahash = { version = "0.8.6", features = ["no-rng"] } diff --git a/nebula_app/windows/nebula.rc b/nebula_app/windows/nebula.rc index 7ef14b6..2363245 100644 --- a/nebula_app/windows/nebula.rc +++ b/nebula_app/windows/nebula.rc @@ -8,8 +8,8 @@ IDI_ICON ICON "nebula.ico" APP_MANIFEST RT_MANIFEST nebula.manifest 1 VERSIONINFO -FILEVERSION 1,3,1,0 -PRODUCTVERSION 1,3,1,0 +FILEVERSION 1,4,0,0 +PRODUCTVERSION 1,4,0,0 FILEFLAGSMASK 0x3fL FILEFLAGS 0x0L FILEOS 0x40004L @@ -22,11 +22,11 @@ BEGIN BEGIN VALUE "CompanyName", "Kuddev" VALUE "FileDescription", "Nebula Terminal" - VALUE "FileVersion", "1.3.1" + VALUE "FileVersion", "1.4.0" VALUE "InternalName", "nebula" VALUE "OriginalFilename", "nebula.exe" VALUE "ProductName", "Nebula Terminal" - VALUE "ProductVersion", "1.3.1" + VALUE "ProductVersion", "1.4.0" END END BLOCK "VarFileInfo" diff --git a/nebula_config/Cargo.toml b/nebula_config/Cargo.toml index 3d8a662..e4223f6 100644 --- a/nebula_config/Cargo.toml +++ b/nebula_config/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nebula_config" -version = "1.3.1" +version = "1.4.0" license = "GPL-3.0-or-later" description = "Nebula configuration abstractions" homepage = "https://github.com/Kuddev/nebula" @@ -14,5 +14,5 @@ serde = "1.0.163" toml.workspace = true [dev-dependencies] -nebula_config_derive = { version = "1.3.1", path = "../nebula_config_derive" } +nebula_config_derive = { version = "1.4.0", path = "../nebula_config_derive" } serde = { version = "1.0.163", features = ["derive"] } diff --git a/nebula_config_derive/Cargo.toml b/nebula_config_derive/Cargo.toml index bcc82dc..c2b2bef 100644 --- a/nebula_config_derive/Cargo.toml +++ b/nebula_config_derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nebula_config_derive" -version = "1.3.1" +version = "1.4.0" license = "GPL-3.0-or-later" description = "Failure resistant deserialization derive" homepage = "https://github.com/Kuddev/nebula" @@ -18,7 +18,7 @@ syn = { version = "2.0.16", features = ["derive", "parsing", "proc-macro", "prin [dev-dependencies.nebula_config] path = "../nebula_config" -version = "1.3.1" +version = "1.4.0" [dev-dependencies] log = "0.4.11" diff --git a/nebula_settings/Cargo.toml b/nebula_settings/Cargo.toml index 878413a..fac0082 100644 --- a/nebula_settings/Cargo.toml +++ b/nebula_settings/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nebula-settings" -version = "1.3.1" +version = "1.4.0" license = "GPL-3.0-or-later" description = "Shared reader for Nebula runtime user settings (nebula_settings.txt) and theme terminal-color tables" publish = false diff --git a/nebula_split/Cargo.toml b/nebula_split/Cargo.toml index 23048c8..06b6643 100644 --- a/nebula_split/Cargo.toml +++ b/nebula_split/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nebula-split" -version = "1.3.1" +version = "1.4.0" license = "GPL-3.0-or-later" description = "Shared split-pane rules: layout tree, geometry, divider drag and directional focus" publish = false diff --git a/nebula_terminal/Cargo.toml b/nebula_terminal/Cargo.toml index ea84ace..d884998 100644 --- a/nebula_terminal/Cargo.toml +++ b/nebula_terminal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nebula_terminal" -version = "1.3.1" +version = "1.4.0" license = "GPL-3.0-or-later" description = "Nebula terminal emulation core" readme = "../README.md" diff --git a/scripts/installer.iss b/scripts/installer.iss index 706dbf1..0e23139 100644 --- a/scripts/installer.iss +++ b/scripts/installer.iss @@ -1,9 +1,9 @@ #ifndef AppVersion - #define AppVersion "1.3.1" + #define AppVersion "1.4.0" #endif #ifndef NumericVersion - #define NumericVersion "1.3.1.0" + #define NumericVersion "1.4.0.0" #endif #ifndef Configuration