From b69545caa53b91a456c2bc6926e5cc11e2097a7f Mon Sep 17 00:00:00 2001 From: kuddev Date: Fri, 11 Sep 2026 21:23:07 +0800 Subject: [PATCH] feat: add document workflows and configurable AI toasts --- .agents/memory.md | 178 -- .gitignore | 7 + CONTRIBUTING.md | 2 + Cargo.lock | 91 +- architecture/file-budgets.txt | 1 - docs/architecture-decisions.md | 129 +- docs/biology-rendering-test.md | 1561 +++++++++++++++++ docs/chemistry-rendering-test.md | 939 ++++++++++ docs/math-rendering-test.md | 934 ++++++++++ docs/project-constraints.md | 103 ++ docs/scientific-rendering-acceptance-paper.md | 989 +++++++++++ docs/scientific-rendering-performance.md | 164 ++ docs/screenshots/scientific-fixture.png | Bin 0 -> 214 bytes nebula-completions/src/command_search.rs | 113 ++ nebula-completions/src/lib.rs | 1 + nebula_app/Cargo.toml | 5 + .../assets/icons/nebula-command-manager.svg | 8 +- nebula_app/i18n/en-US.json | 148 +- nebula_app/i18n/zh-CN.json | 148 +- nebula_app/src/agent_env.rs | 9 + nebula_app/src/chemistry.rs | 80 + nebula_app/src/display/command_completion.rs | 43 +- nebula_app/src/display/command_palette.rs | 107 +- nebula_app/src/display/content.rs | 2 +- nebula_app/src/display/keymap.rs | 92 +- nebula_app/src/display/mod.rs | 7 +- nebula_app/src/display/settings.rs | 20 +- .../src/display/side_panel/gitignore.rs | 264 +++ .../src/display/side_panel/gitignore_tests.rs | 82 + nebula_app/src/display/side_panel/mod.rs | 101 +- nebula_app/src/display/side_panel/vcs.rs | 110 -- nebula_app/src/display/ssh_ui.rs | 17 +- nebula_app/src/display/state.rs | 2 + nebula_app/src/display/suggest_engine.rs | 28 +- nebula_app/src/display/terminal_color.rs | 39 +- nebula_app/src/display/terminal_math.rs | 1432 +-------------- nebula_app/src/display/terminal_math/scan.rs | 1405 +++++++++++++++ nebula_app/src/display/ui/theme.rs | 318 ++-- nebula_app/src/document_io.rs | 69 + nebula_app/src/event.rs | 109 +- nebula_app/src/event/quick_hotkey.rs | 120 ++ nebula_app/src/gpui_shell/config.rs | 7 + nebula_app/src/gpui_shell/copy_feedback.rs | 117 ++ nebula_app/src/gpui_shell/file_drop.rs | 2 + .../src/gpui_shell/file_editor/chrome.rs | 301 ++++ .../gpui_shell/file_editor/code_actions.rs | 568 ++++++ .../file_editor/code_actions_tests.rs | 127 ++ .../src/gpui_shell/file_editor/document.rs | 68 +- .../src/gpui_shell/file_editor/focus_tests.rs | 101 ++ .../src/gpui_shell/file_editor/images.rs | 6 + nebula_app/src/gpui_shell/file_editor/info.rs | 230 ++- nebula_app/src/gpui_shell/file_editor/mod.rs | 494 +++--- .../src/gpui_shell/file_editor/outline.rs | 375 +++- .../gpui_shell/file_editor/outline_view.rs | 156 ++ .../src/gpui_shell/file_editor/preview.rs | 485 +++++ .../file_editor/reader_presentation.rs | 30 + .../src/gpui_shell/file_editor/source.rs | 112 ++ .../src/gpui_shell/file_editor/tests.rs | 184 ++ nebula_app/src/gpui_shell/file_preview.rs | 85 + nebula_app/src/gpui_shell/math_view.rs | 737 +++++--- .../gpui_shell/math_view/source_fallback.rs | 73 + nebula_app/src/gpui_shell/mod.rs | 5 + nebula_app/src/gpui_shell/molecule_view.rs | 88 + .../src/gpui_shell/scientific_render.rs | 417 +++++ .../scientific_render/corpus_tests.rs | 95 + nebula_app/src/gpui_shell/settings_pane.rs | 39 +- .../settings_pane/initialization.rs | 15 + .../src/gpui_shell/settings_pane/keymap.rs | 36 +- .../gpui_shell/settings_pane/navigation.rs | 35 +- .../gpui_shell/settings_pane/search_header.rs | 10 + .../gpui_shell/settings_pane/setting_help.rs | 5 + .../src/gpui_shell/settings_pane/status.rs | 16 +- .../src/gpui_shell/settings_pane/tests.rs | 40 + .../gpui_shell/settings_pane/theme_picker.rs | 23 +- nebula_app/src/gpui_shell/ssh_hosts.rs | 34 +- nebula_app/src/gpui_shell/ssh_settings.rs | 453 +---- .../src/gpui_shell/ssh_settings/editor.rs | 1 + .../src/gpui_shell/ssh_settings/library.rs | 637 +++++++ .../ssh_settings/library/exchange.rs | 244 +++ .../terminal/completion_viewport.rs | 6 +- nebula_app/src/gpui_shell/terminal/element.rs | 91 +- .../src/gpui_shell/terminal/event_mailbox.rs | 116 ++ .../src/gpui_shell/terminal/math_overlay.rs | 69 + nebula_app/src/gpui_shell/terminal/mod.rs | 3 + .../gpui_shell/terminal/molecule_overlay.rs | 223 +++ nebula_app/src/gpui_shell/terminal/session.rs | 15 +- .../src/gpui_shell/terminal/session_pump.rs | 59 + nebula_app/src/gpui_shell/terminal/suggest.rs | 15 +- nebula_app/src/gpui_shell/terminal/view.rs | 115 +- .../src/gpui_shell/terminal/view/path_drop.rs | 204 +++ .../src/gpui_shell/terminal/view/pointer.rs | 21 +- .../src/gpui_shell/terminal/view/runtime.rs | 119 +- nebula_app/src/gpui_shell/theme.rs | 121 +- nebula_app/src/gpui_shell/theme/syntax.rs | 56 + nebula_app/src/gpui_shell/toast.rs | 160 +- nebula_app/src/gpui_shell/workspace.rs | 131 +- nebula_app/src/gpui_shell/workspace/agents.rs | 71 +- .../gpui_shell/workspace/command_manager.rs | 180 +- .../src/gpui_shell/workspace/documents.rs | 130 +- .../src/gpui_shell/workspace/file_tree.rs | 119 +- .../gpui_shell/workspace/keyboard_bindings.rs | 130 ++ .../src/gpui_shell/workspace/notifications.rs | 142 +- .../src/gpui_shell/workspace/remote_files.rs | 664 ++----- .../gpui_shell/workspace/remote_files/drag.rs | 175 ++ .../workspace/remote_files/target.rs | 50 + .../workspace/remote_files/transfers.rs | 635 +++++++ .../src/gpui_shell/workspace/sidebar.rs | 20 +- nebula_app/src/gpui_shell/workspace/tests.rs | 9 +- .../src/gpui_shell/workspace/vcs_panel.rs | 4 +- .../gpui_shell/workspace/window_titlebar.rs | 38 +- nebula_app/src/i18n/locale.rs | 25 +- nebula_app/src/input/keyboard.rs | 7 +- nebula_app/src/input/mod.rs | 2 +- nebula_app/src/main.rs | 7 + nebula_app/src/math/bitmap.rs | 162 ++ nebula_app/src/math/compile.rs | 15 + nebula_app/src/math/layout.rs | 50 +- nebula_app/src/math/mod.rs | 1 + nebula_app/src/math/parser.rs | 69 +- nebula_app/src/nebula_history.rs | 61 + nebula_app/src/notify.rs | 72 +- .../src/platform/ai_session_identity.rs | 470 +++++ nebula_app/src/platform/file_drag/mod.rs | 160 ++ nebula_app/src/platform/file_drag/windows.rs | 340 ++++ .../src/platform/file_drag/windows/stream.rs | 179 ++ .../src/platform/file_drag/windows/tests.rs | 167 ++ .../file_drag/windows/tests/ole_probe.rs | 305 ++++ nebula_app/src/platform/file_preview.rs | 218 +++ nebula_app/src/platform/locale.rs | 81 + nebula_app/src/platform/mod.rs | 3 + nebula_app/src/process_tree.rs | 31 + nebula_app/src/render_cache.rs | 139 ++ nebula_app/src/runtime_exec.rs | 40 +- nebula_app/src/saved_commands.rs | 2 + nebula_app/src/saved_commands/builtins.rs | 285 +++ nebula_app/src/scientific_corpus.rs | 264 +++ nebula_app/src/shell_detect.rs | 29 + nebula_app/src/ssh_profiles.rs | 61 +- nebula_app/src/ssh_profiles/connection.rs | 1 + nebula_app/src/ssh_profiles/exchange.rs | 242 +++ nebula_app/src/ssh_profiles/organization.rs | 272 +++ nebula_app/src/ssh_session.rs | 40 +- nebula_app/src/ssh_session/exec.rs | 54 + nebula_app/src/ssh_session/lifecycle.rs | 18 +- nebula_app/src/ssh_session/lifecycle/tests.rs | 90 + nebula_app/src/ssh_sftp.rs | 29 +- nebula_app/src/ssh_sftp/document.rs | 222 +++ nebula_app/src/ssh_sftp/document/tests.rs | 160 ++ .../src/ssh_sftp/document/tests/peer.rs | 240 +++ nebula_app/src/ssh_sftp/export.rs | 185 ++ nebula_app/src/ssh_sftp/transaction.rs | 101 +- nebula_app/src/text_document.rs | 129 ++ nebula_app/src/text_preview.rs | 71 + nebula_settings/src/lib.rs | 121 +- nebula_settings/src/reset.rs | 10 + nebula_settings/src/themes.rs | 349 +++- nebula_terminal/src/render/boxdraw.rs | 260 ++- packaging/macos/Info.plist | 14 + 158 files changed, 21699 insertions(+), 4473 deletions(-) delete mode 100644 .agents/memory.md create mode 100644 docs/biology-rendering-test.md create mode 100644 docs/chemistry-rendering-test.md create mode 100644 docs/scientific-rendering-acceptance-paper.md create mode 100644 docs/scientific-rendering-performance.md create mode 100644 docs/screenshots/scientific-fixture.png create mode 100644 nebula-completions/src/command_search.rs create mode 100644 nebula_app/src/chemistry.rs create mode 100644 nebula_app/src/display/side_panel/gitignore.rs create mode 100644 nebula_app/src/display/side_panel/gitignore_tests.rs create mode 100644 nebula_app/src/display/terminal_math/scan.rs create mode 100644 nebula_app/src/document_io.rs create mode 100644 nebula_app/src/event/quick_hotkey.rs create mode 100644 nebula_app/src/gpui_shell/copy_feedback.rs create mode 100644 nebula_app/src/gpui_shell/file_editor/chrome.rs create mode 100644 nebula_app/src/gpui_shell/file_editor/code_actions.rs create mode 100644 nebula_app/src/gpui_shell/file_editor/code_actions_tests.rs create mode 100644 nebula_app/src/gpui_shell/file_editor/focus_tests.rs create mode 100644 nebula_app/src/gpui_shell/file_editor/outline_view.rs create mode 100644 nebula_app/src/gpui_shell/file_editor/preview.rs create mode 100644 nebula_app/src/gpui_shell/file_editor/reader_presentation.rs create mode 100644 nebula_app/src/gpui_shell/file_editor/source.rs create mode 100644 nebula_app/src/gpui_shell/file_preview.rs create mode 100644 nebula_app/src/gpui_shell/math_view/source_fallback.rs create mode 100644 nebula_app/src/gpui_shell/molecule_view.rs create mode 100644 nebula_app/src/gpui_shell/scientific_render.rs create mode 100644 nebula_app/src/gpui_shell/scientific_render/corpus_tests.rs create mode 100644 nebula_app/src/gpui_shell/ssh_settings/library.rs create mode 100644 nebula_app/src/gpui_shell/ssh_settings/library/exchange.rs create mode 100644 nebula_app/src/gpui_shell/terminal/event_mailbox.rs create mode 100644 nebula_app/src/gpui_shell/terminal/molecule_overlay.rs create mode 100644 nebula_app/src/gpui_shell/terminal/session_pump.rs create mode 100644 nebula_app/src/gpui_shell/terminal/view/path_drop.rs create mode 100644 nebula_app/src/gpui_shell/theme/syntax.rs create mode 100644 nebula_app/src/gpui_shell/workspace/keyboard_bindings.rs create mode 100644 nebula_app/src/gpui_shell/workspace/remote_files/drag.rs create mode 100644 nebula_app/src/gpui_shell/workspace/remote_files/target.rs create mode 100644 nebula_app/src/gpui_shell/workspace/remote_files/transfers.rs create mode 100644 nebula_app/src/math/bitmap.rs create mode 100644 nebula_app/src/platform/ai_session_identity.rs create mode 100644 nebula_app/src/platform/file_drag/mod.rs create mode 100644 nebula_app/src/platform/file_drag/windows.rs create mode 100644 nebula_app/src/platform/file_drag/windows/stream.rs create mode 100644 nebula_app/src/platform/file_drag/windows/tests.rs create mode 100644 nebula_app/src/platform/file_drag/windows/tests/ole_probe.rs create mode 100644 nebula_app/src/platform/file_preview.rs create mode 100644 nebula_app/src/platform/locale.rs create mode 100644 nebula_app/src/render_cache.rs create mode 100644 nebula_app/src/saved_commands/builtins.rs create mode 100644 nebula_app/src/scientific_corpus.rs create mode 100644 nebula_app/src/ssh_profiles/exchange.rs create mode 100644 nebula_app/src/ssh_profiles/organization.rs create mode 100644 nebula_app/src/ssh_session/exec.rs create mode 100644 nebula_app/src/ssh_sftp/document.rs create mode 100644 nebula_app/src/ssh_sftp/document/tests.rs create mode 100644 nebula_app/src/ssh_sftp/document/tests/peer.rs create mode 100644 nebula_app/src/ssh_sftp/export.rs create mode 100644 nebula_app/src/text_document.rs create mode 100644 nebula_app/src/text_preview.rs diff --git a/.agents/memory.md b/.agents/memory.md deleted file mode 100644 index 86e5240..0000000 --- a/.agents/memory.md +++ /dev/null @@ -1,178 +0,0 @@ -# Pebrel 持久化发布记忆 - -最后核验:2026-09-07,GitHub 仓库更名、旧链接跳转与历史发布资产一致性。1.6.0 仍为本地候选,本次没有创建正式 Release、推送发布提交或移动版本标签。 - -本文记录已经实际遇到并核实的发布陷阱,以及后续版本可直接执行的 Release Note 与 GitHub Release 规则。它不保存密钥、令牌、临时构建路径或未经验证的猜测。 - -## 0. 当前品牌与仓库迁移状态(2026-09-07 核验) - -用户已明确授权将现有 GitHub 项目更名。`Kuddev/nebula` 已重命名为 -[`Kuddev/pebrel`](https://github.com/Kuddev/pebrel),repository ID 仍为 `1289958986`。 -这次操作只修改仓库名称;当时的 663 stars、44 forks、17 open issues 保持不变。 -后续仓库命令与当前文档使用新地址;旧推广链接按下列实测边界保留访问。 - -- 旧仓库主页、PR、commit、blob、Releases、tag、latest、真实旧资产与 API 地址均已实际检查;旧 raw README 和 PNG 地址直接返回 200,内容 SHA256 与新地址一致。 -- 旧 Issue `#95`、`#60` 使用普通浏览器的 `Accept: text/html` 时,301 跳转到新仓库后返回 200。相同旧地址在 `curl` 默认 `Accept: */*` 下曾返回 404;不能把这种内容协商差异说成所有客户端都无条件重定向,也不能据此认定浏览器推广链接失效。 -- GitHub 支持旧 Git clone/fetch/push URL 重定向,旧 HTTPS Git 地址已通过只读 `ls-remote` 核验;本地 `origin` 已更新到新地址,没有为验证执行推送。 -- 更名前后 `main`、发布分支和 18 个版本标签未移动;20 个 Release 与 34 个资产的元数据保持一致。其他验证分支的并发快进另行核对,不冒充所有远端引用完全静止。 -- 通过旧 1.5.0 安装器下载地址实际下载得到 `29,945,853` 字节,SHA256 为 `416a1e127045ce81c78cc2d0990d469d8adde935931963148fb81a9d5cef2bd2`,与更名前一致。 -- 不要重新创建 `Kuddev/nebula` 仓库,否则旧名称会被新仓库占用并破坏重定向。GitHub Pages 与其他仓库通过旧名称 `uses:` 引用的 Actions 不属于通用重定向保证;本项目核验时 `has_pages=false`,完整默认分支树没有 `action.yml` 或 `action.yaml`。 - -官方说明:[Renaming a repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/renaming-a-repository)。历史版本说明、标签与资产文件名保持原样;仓库更名不会替已改名的 Release 资产创建文件名别名。 - -1.6.0 候选的源码与打包脚本已采用以下新名称,但**这不代表 1.6.0 已经公开发布**: - -| 对象 | 1.6.0 候选名称 | -| --- | --- | -| 主程序与 CLI | `pebrel.exe` / `pebrel` | -| AI hook 辅助程序 | `runtime/pebrel-hook.exe` | -| Portable ZIP | `Pebrel-v1.6.0-windows-x64.zip` | -| Windows 安装器 | `Pebrel-1.6.0-windows-x64-setup.exe` | -| Release Note | `docs/release-notes/v1.6.0.md`,标题 `Pebrel 1.6.0` | - -旧客户端按精确的 `NebulaTerminal--windows-x64-setup.exe` 名称查找更新。 -未来公开发布 Pebrel 安装资产时,还需要提供相同安装器字节的旧命名兼容资产,或先完成明确的客户端迁移方案;不能把仓库重定向当成资产改名兼容。 -目前下载入口应指向真实的 `https://github.com/Kuddev/pebrel/releases/latest` 页面,不能生成指向尚未发布 Pebrel 资产的 `latest/download/...` 链接。 - -下文保留 1.3.0 / 1.3.1 的已发布核验先例与通用发布步骤。其历史名称用于识别旧版本,新的候选名称以上表和当前打包脚本为准;最终 SHA256 仍必须在新文件生成后重新计算。 - -## 1. 命名规范是接口,不是装饰 - -以已发布的 `v1.3.0` 和 `v1.3.1` 为准: - -| 对象 | 规范 | 示例 | -| --- | --- | --- | -| Git 标签 | `vX.Y.Z` | `v1.3.1` | -| GitHub Release 标题 | `Nebula Terminal X.Y.Z` | `Nebula Terminal 1.3.1` | -| Portable ZIP | `NebulaTerminal-vX.Y.Z-windows-x64.zip` | `NebulaTerminal-v1.3.1-windows-x64.zip` | -| Windows 安装器 | `NebulaTerminal-X.Y.Z-windows-x64-setup.exe` | `NebulaTerminal-1.3.1-windows-x64-setup.exe` | -| Release Note 文件 | `docs/release-notes/vX.Y.Z.md` | `docs/release-notes/v1.3.1.md` | - -- ZIP 带 `v`,安装器不带 `v`。不要为了“看起来统一”擅自改成同一种格式。 -- 应用内更新会按精确安装器文件名选择资产。发布资产改名不仅影响展示,还可能直接破坏自动更新。 -- GitHub CLI 上传资产时,`#