Skip to content

Releases: feigeCode/navop

Navop v0.22.0

Choose a tag to compare

@github-actions github-actions released this 28 Oct 07:45
2db7763

更新内容

  • 团队管理全部迁入桌面端原生「团队」页:建团队、改资料、邀请成员、改角色、移除成员与团队密钥都在应用内完成,不再把 access_token / refresh_token 拼进 URL 打开浏览器(网站 dashboard 可以下线了);权限严格对齐线上 RPC,owner 不可被直接移除。
  • 侧边栏 AI 每轮都重新读一次终端现场:当前目录、是否在 vim 这类全屏程序里、选中了什么、窗口尺寸和前台进程都会随消息带过去,不用再让模型先调 terminal.read 才知道你在哪。SSH 终端保持「连接」为默认目标,连接级工具的行为不变。
  • 终端里选中一段内容后直接提问,选中的正文会随消息一起送进侧边栏 AI(超过 8000 字截断并标注),发送前就能在转录里看到自己送出了什么。
  • 读终端时可以省略 target:会话里只有一个终端时自动补上,返回结果新增全屏程序、滚动位置、光标行与选中区间。
  • 侧栏分组右键新增「移动到」:子分组可以换父级,也可以移回顶层;目标里会剔掉自己和自己的后代,不会移成环。
  • AI 输入框重新排版:能力入口(计划 / 子代理 / 上下文 / 技能)回到卡片顶部一行,底栏只留「怎么发出去」(模型、模式 / 权限、附件、发送),窄侧栏下标签不再被挤成省略号;ACP 与内置 Agent 两套输入框共用同一套尺寸。
  • ACP 客户端目录收全官方 registry:内置 27 个预设,默认只启用 Claude Code、Codex、OpenCode、DeepSeek Harness 与 Pi,其余在「设置 > ACP 客户端」里按需打开;新装机器不会因为探活把十几个 CLI 一起拉起来。

修复与优化

  • 修复侧栏 ACP 底栏缺分支与 Worktree 的问题:终端侧边栏现在和工作台一样注入工作区、分支与 Worktree,切换分支、勾选 Worktree 都可用,chip 与实际工作目录始终一致。
  • ACP 切换器选完立即关闭,不再盖住新视图;agent 变多时列表固定高度并可滚动,不会顶到窗口边缘点不到靠下的项。
  • 修掉执行过程每来一次工具调用就收起、再撑开的闪烁:过程按「段」折叠,当前段默认展开;正文写完后的新一段思考单独成段,不再挂到上一段正文上方。
  • 修掉深色侧栏里的白块与串色:输入区底色跟卡片形态走(卡片有框时不填色、无框的侧栏才用内嵌底色),弹层自己画浮层表面,按钮恢复手指光标。
  • 同一份待审批不再出现两处入口:去掉输入框上方的重复决策栏,审批只在时间线卡片里做,卡片里的入参与上下文更完整。
  • 首页与侧栏不再「丢连接」:未分组连接在分组过滤下也照常显示,分组被删除或尚未同步落地的连接会收进「未分组」,不会再两个视图都找不到。
  • 分组右键「新建连接」默认落在该分组;此前向导总是默认「未分组」,保存后连接跑到根目录。
  • 云同步不再清空或改回连接的分组归属:分组还没上传时宁可不传,也不会把「无分组」写进云端;云端没有分组引用时保留本地分组,收尾阶段按云端明确给出的引用对齐,不再来回覆盖。
  • 团队页补回滚动条并修掉左栏头部溢出:264px 窄栏下刷新按钮不再被右侧详情面板盖掉,成员行在窄窗口不再挤压角色徽标。
  • SFTP 上传文件夹冲突选「覆盖」前增加二次确认:明确说明这是整目录替换(只存在于远端的文件会被删掉),只需替换同名文件时应改用「合并」。
  • 数据库表格右键「删除记录」按选区批量删除:多选后右键删除不再只删掉第一行;右键落在选区外时仍只删那一行。
  • SQL Server 低兼容级别的库恢复分页能力:兼容级别低于 110 时回退 ROW_NUMBER() 分页,双击表预览不再整页空白。
  • 修复启动期两处运行态 panic:secondary-s 快捷键改为按宿主系统解析,ACP 就绪等待不再跨 await 持有 runtime guard。
  • 升级到 gpui-fast v0.1.12、gpui-kit v0.8.1 与 russh 0.65.0,并适配一批 API 变更(滚动事件、动态快捷键、键盘布局识别等)。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


What's New

  • Team management now lives in a native desktop "Team" page: create teams, edit profiles, invite members, change roles, remove members and manage team keys inside the app instead of opening the browser with access_token / refresh_token in the URL (the website dashboard can be retired). Permissions mirror the online RPC layer, and an owner can no longer be removed directly.
  • The sidebar AI re-reads the terminal on every turn: current directory, whether a full-screen program like vim is running, the current selection, window size and foreground process all travel with the message, so the model no longer has to call terminal.read first. SSH terminals keep the connection as their default target, so connection-scoped tools behave as before.
  • Select text in the terminal and ask a question: the selected body is attached to the message (truncated with a note above 8000 characters) and shows up in the transcript, so you can see what you sent.
  • terminal.read can omit its target: with a single terminal in the session it is filled in automatically, and results now include the alternate-screen state, display offset, cursor row and selection.
  • Sidebar groups gained a "Move to" action in the context menu: subgroups can change parents or move back to the top level, and the target list excludes the group itself and its descendants so no cycle can be created.
  • The AI composer was re-laid out: capability entries (plan / subagents / context / skills) sit on a row at the top of the card, the bottom row is only about sending (model, mode / permission, attachment, send), labels no longer collapse into ellipses in narrow sidebars, and the ACP and built-in agent composers share one set of measurements.
  • The ACP client catalog now covers the official registry: 27 built-in presets with only Claude Code, Codex, OpenCode, DeepSeek Harness and Pi enabled by default; the rest can be turned on in Settings > ACP clients, so a fresh machine no longer spawns a dozen CLIs just to probe them.

Fixes and Improvements

  • Fixed the missing branch and Worktree controls in the sidebar ACP footer: the terminal sidebar now injects workspace, branches and Worktree just like the workbench, so switching branches and enabling Worktree work there, and the chip always matches the real working directory.
  • The ACP switcher closes as soon as a client is picked instead of covering the new view, and its list scrolls inside a fixed height so entries near the bottom stay reachable.
  • Fixed the flicker where the process block collapsed on every tool call and expanded again: the process collapses by segment with the current segment staying open, and a new reasoning segment after written text now starts its own block instead of appearing above the previous answer.
  • Fixed white patches and wrong colors in dark sidebars: the editor fill follows the card shape (no fill when the card has a border, an inset fill only in borderless sidebars), popovers paint their own surface, and buttons use the pointing-hand cursor again.
  • A pending approval no longer appears twice: the duplicate decision bar above the composer is gone, and approvals happen on the timeline card, which carries the full arguments and context.
  • The home page and sidebar no longer lose connections: ungrouped connections show up even while groups are filtered, and connections whose group was deleted or has not synced yet are collected under "Ungrouped" instead of disappearing from both views.
  • "New connection" from a group's context menu now lands in that group; the wizard used to default to "Ungrouped" and save the connection at the root.
  • Cloud sync no longer clears or reverts a connection's group: uploads wait until the group has a cloud ID instead of writing "no group", downloads keep the local group when the cloud record has no reference, and a final alignment pass applies the references the cloud does provide.
  • The team page scrolls again and no longer overflows its header: at 264px the refresh button is no longer hidden behind the detail panel, and member rows stop squeezing the role badge in narrow windows.
  • Overwriting an SFTP folder conflict now asks for confirmation first, spelling out that it replaces the whole directory (deleting files that only exist remotely) and pointing to "Merge" when only same-named files should be replaced.
  • "Delete record" in the database grid now deletes the whole selection: right-clicking inside a multi-row selection no longer removes only the first row, while right-clicking outside the selection still deletes a single row.
  • SQL Server databases at a lower compatibility level paginate again: below level 110 the grid falls back to ROW_NUMBER() paging, so previewing a table no longer shows a blank page.
  • Fixed two startup panics: the secondary-s shortcut is resolved against the host OS, and the ACP readiness wait no longer holds a runtime guard across an await.
  • Upgraded to gpui-fast v0.1.12, gpui-kit v0.8.1 and russh 0.65.0, adapting to a batch of API changes (scroll events, dynamic key bindings, keyboard layout detection).

Full Changelog: v0.21.2...v0.22.0

Navop v0.21.2

Choose a tag to compare

@github-actions github-actions released this 26 Oct 05:13
9300f9f

修复与优化

  • 个人同步:修复引用了钥匙串凭据的连接在多设备间持续产生假冲突的问题。连接载荷里的凭据引用导出时保留了源设备的本地整数 ID,而每台设备的行号各不相同,导致同一条连接跨设备的 checksum 永不相等,被判定为「双方都改过」而反复冲突、来回覆盖。现在导出载荷统一只保留跨设备稳定的 credential_cloud_id,整数 ID 置零(下载时仍按云端 ID 映射回本机行号,行为不变)。
  • 安全:个人主密钥的派生从「SHA-256 + 固定盐」升级为 Argon2id + 随机盐(64 MiB / 3 次迭代),验证数据改为版本化信封 NAVOPKDF2:。旧格式在解锁时自动迁移并重加密本地连接、凭据、团队密钥缓存与冲突快照,云端记录由既有 pending 机制补做;迁移中断可续,旧密文始终可读(#460)。
  • 安全:自动解锁用的主密钥不再默认用程序内置密钥加密写进 data/state/key_storage,改存系统凭据库(macOS 钥匙串 / Windows 凭据管理器)并自动迁移、删除旧文件;没有可用凭据库的平台改为每次启动手动输入,不再静默回退弱存储(#459)。
  • 设置:「记住主密码」新增「主密钥保存位置」选项,可在系统凭据库(macOS 显示「macOS 钥匙串」、Windows 显示「Windows 凭据管理器」)与「本机文件(数据目录)」之间切换,便携模式同样可选。切换时先把已记住的密钥写入新位置、成功后再删除旧副本;选择本机文件会显示内置密钥加密的风险提示(#459)。
  • 首页:从标签栏「+」打开的「打开连接」列表里点一次不再新建两个 SSH 会话。此前同一行既挂了行内的打开回调,又有列表内建的点击 → confirm 打开路径,一次点击先后走完两条路径(已有 2 个标签时点一次直接变成 4 个);现在点击与键盘回车统一只走 confirm,并补源码级回归测试守住「行渲染不得直接打开连接」(#461)。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


Fixes and Improvements

  • Personal sync: fixed constantly recurring false conflicts for connections that reference keychain credentials. The exported payload kept the source device's local integer credential ID, which differs on every device, so the same logical connection never produced an equal checksum across devices and was repeatedly flagged as "modified on both sides", overwriting back and forth. Exports now carry only the device-stable credential_cloud_id with the integer ID zeroed (downloads still map the cloud ID back to the local row, unchanged behavior).
  • Security: the personal master key is now derived with Argon2id and a random salt (64 MiB / 3 iterations) instead of SHA-256 with a fixed salt, and its verification data uses a versioned NAVOPKDF2: envelope. Legacy installs are migrated on unlock: local connections, credentials, team key caches and conflict snapshots are re-encrypted, cloud records are re-encrypted through the existing pending mechanism, interrupted migrations resume, and old ciphertext stays readable throughout (#460).
  • Security: the master key kept for automatic unlock is no longer encrypted into data/state/key_storage with an application-embedded key by default. It is stored in the system credential store (macOS Keychain / Windows Credential Manager), the legacy file is migrated and deleted, and platforms without an available credential store ask for the key on each start instead of silently falling back to the weak store (#459).
  • Settings: "remember master key" now has a storage location choice between the system credential store (shown as "macOS Keychain" on macOS and "Windows Credential Manager" on Windows) and a local file in the data directory, also in portable mode. Switching writes the remembered key to the new location first and only then deletes the old copy; the local file option shows the risk that it is encrypted with an application-embedded key (#459).
  • Home: clicking an entry in the “Open connection” list opened from the tab bar’s “+” no longer creates two SSH sessions. A row carried both its own open callback and the list’s built-in click → confirm open path, so a single click ran through both (going from 2 tabs to 4 in one click); clicks and the Enter key now share the single confirm path, guarded by a source-level regression test (#461).

Full Changelog: v0.21.1...v0.21.2

Navop v0.21.1

Choose a tag to compare

@github-actions github-actions released this 22 Oct 15:32
90cf68a

修复与优化

  • 连接表单:SSH、MySQL、Redis、MongoDB 表单里的「AI 访问」一行不再显示成 ConnectionForm.ai_access 这样的原始键名。此前四个 crate 各自拼这个 i18n 键,而语言包里只有提供该组件的 crate 定义了它,rust-i18n 查不到就把键名原样渲染出来;现在统一走 connection_form 的共享文案,并新增全仓契约测试守住同类漏键(同时修掉另外 16 处失效键,包括保存失败提示、文件操作、锁屏提示与 FTP 弹窗标题)。
  • 数据库:Auto(粘性)会话的空闲断连自愈改为「执行前探活」,不再在收到 connection closed 后重放整段脚本——同一句文案既可能表示请求没发出去,也可能表示语句已被服务端执行,重放就有重复写入的风险。现在取连接先本地判死(PostgreSQL)或有界 ping(MySQL 走驱动级 COM_PING),判死即就地重连,语句只在重连后的新连接上发出一次;服务端尚未恢复时建连上限也收紧到 10 秒,不至于每次执行都等满默认超时(#433、#447)。
  • 数据库:粘性会话与手动事务不再被后台清理强拆——页签钉住的会话挂机 30 分钟后首次执行不再报 Session not found,手动事务也不会被静默回滚,页签关闭时仍照常释放。
  • 设置:settings.json 解析失败时不再静默回落默认值、再被下一次保存全量覆盖。坏文件会先改名保留为 settings.json.corrupt-<时间戳> 便于定位是哪个字段解析失败,保存改为「临时文件 + rename」原子写并在覆盖前留一份 .bak;同时先按磁盘上的日志路径装好日志再加载设置,让解析错误真正落进日志文件。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


Fixes and Improvements

  • Connection forms: the "AI Access" row in the SSH, MySQL, Redis and MongoDB forms no longer renders as a raw key such as ConnectionForm.ai_access. Each of those four crates assembled the i18n key by itself while only the crate that provides the widget defines it, so rust-i18n returned the key verbatim; the row now uses the shared text from connection_form, and a repository-wide contract test guards against the same class of miss (16 other broken keys are fixed as well, including the save-failure notice, file actions, the session lock banners and the FTP dialog titles).
  • Database: Auto (sticky) sessions now self-heal by probing the connection before running instead of replaying the batch after a connection closed. That single message can mean either "the request never left the client" or "the statement already ran on the server", so replaying risked duplicate writes. A pooled connection is now checked locally (PostgreSQL) or with a bounded ping (MySQL uses the driver-level COM_PING) and replaced in place when dead, so the statement goes out exactly once on the new connection; the connect timeout is also clamped to 10 seconds while the server stays down, instead of letting every run wait out the default timeout (#433, #447).
  • Database: sticky sessions and manual transactions are no longer torn down by background cleanup — a tab-pinned session idle for 30 minutes no longer fails its first run with Session not found and a manual transaction is not silently rolled back, while closing the tab still releases it.
  • Settings: a settings.json that fails to parse is no longer silently replaced by defaults and then overwritten wholesale by the next save. The bad file is renamed to settings.json.corrupt-<timestamp> so the offending field can be identified, saving is atomic (temp file + rename) with a .bak copy of the previous version, and logging is configured from the on-disk log path before settings load so the parse error actually reaches the log file.

Full Changelog: v0.21.0...v0.21.1

Navop v0.21.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 09:52
8dc9637

更新内容

  • 连接新增「AI 访问」策略(允许 / 只读 / 禁止),决定 AI 能否操作这条连接。策略分三层生效:被禁止的连接不进 AI 的资源目录、connections.list / find 也不返回;只读连接只保留读类工具;真正执行时统一复核 connection、connection_id、target、session_id,内置对话与外部 MCP 客户端共用同一道闸门,写操作直接拒绝而不是静默放宽。策略属于连接内容,随连接一起云同步,换机器后限制依然生效;侧栏徽标与右键菜单可以直接切换(#437)。
  • 扩展连接支持自定义图标:连接表单可选内置图标或本地图片,未选择时回退到扩展 manifest 声明的图标,表单与 manifest 也新增了 Icon 字段类型供扩展自带图标选择器。连接列表、卡片与终端标签页改用同一套解析,标签页不再一律显示通用图标——SSH 连接设置过的自定义图标现在也会出现在标签上(#438)。
  • AI 对话的模型下拉在选项超过 15 个时(例如 OpenRouter 这类聚合供应商的数百个模型)顶部出现搜索框,按供应商、模型名与提示词做不区分大小写的模糊过滤,模型名以关键字开头的排在前面;列表限高滚动,无匹配时显示空态(#405)。
  • 首页的「最近连接」分组现在可以关掉:设置 → 通用 →「连接显示」新增开关,关闭后首页只显示各分组内的连接,重启也不会再自己冒出来(#388)。
  • SQL 查询结果可以按来源补全字段注释:开启「列头显示字段注释」时,会分析查询涉及的基表、连接与别名,把源字段的注释映射到结果列;分析不完整时退化为「列名在候选表中唯一」的保守匹配,无法唯一确定就不显示,避免张冠李戴(#428)。
  • SQL 执行多了明确的运行态:发起后结果面板立即切到「运行中」并强制可见,工具栏同步显示旋转指示与「运行中...」,运行时间从执行开始就持续走动,大查询期间不会再看着像「点了没反应」。建立 Auto 会话与手动事务的建连阶段同样计入运行中,在这一阶段点取消会真正作废本次执行(#427)。

修复与优化

  • ClickHouse 改为扩展驱动(升级需先安装驱动):内置插件已移除,连接、打开与表单统一走扩展市场的 clickhouse 驱动。历史连接记录仍然保留,但需要先安装该驱动才能打开;未安装时按 DuckDB / TDengine 的同一策略提示安装,新建入口在驱动安装后才出现(#436)。
  • 数据库:Auto(粘性)会话在空闲期被服务端或防火墙掐断后,不必再关掉连接重开。此前驱动把断连包成正常结果,断连信号只在错误时置位,编辑器于是一直复用死连接,每条语句都在几毫秒内失败。现在若整批结果都表明「语句还没发出去就已断连」,会就地替换会话的物理连接并重试一次,会话 id、页签状态与记住的 schema 都保留;中途断连(broken pipe / unexpected EOF)与手动事务不重试,避免语句被重放成重复写入(#447)。
  • 数据库:修复 Auto 模式选中 schema 后未限定表名的查询仍落在 public。建会话时只传了 database、没把 search_path 对齐到下拉框选中的 schema,后续执行又不会重放切换,选择形同无效;现在会话建立后先切 schema 再执行,且只在建会话时切一次,不覆盖用户手动的 SET search_path(#433)。
  • 数据库:结果操作(复制为 INSERT / UPDATE / DELETE)不再把表名拼成 schema.schema.table 导致执行报错——查询分析给出的表名本身可能已带 schema 前缀(#400)。
  • 笔记:打开外部 Markdown 文件后,文中的相对路径图片现在能正常渲染。此前编辑器创建时没有绑定文件路径,图片基准目录退回进程工作目录;现在打开即绑定绝对路径,在笔记内重命名文档时也会同步更新(#448)。
  • 设置 → MCP:「安装 Navop Skill」不再在 macOS 上以 No such file or directory (os error 2) 失败。从 Finder / Dock 启动的 GUI 进程只继承最小 PATH,裸调 npx 找不到,而 npx 的 shebang 还需要 node;现在按 PATH 加上 Homebrew、/usr/local、nvm / fnm / volta / asdf 等兜底目录解析启动器,并把所在目录补进子进程 PATH。MCP 运行时的要求状态改为真实探测,找不到启动器时给出可操作提示,而不是无条件显示「已就绪」(#449)。
  • 连接树分成「最近连接 / 分组 / 未分组」三段,未分组的连接不再堆在文件夹列表末尾,分区标题带计数,「最近连接」与「未分组」分区可折叠;分组同级排序统一为「自定义顺序 + 名称自然序」,修掉新建分组后层级与顺序漂移的问题。
  • 删除分组改为「提升一层」:子分组与直属连接迁移到被删分组的父级,不再凭空消失或跳到根级;右键「移动到分组」改成按层级展开的子菜单,同名分组会补上父路径,分组过多时给出提示。
  • 终端:SSH / 串口断开或 shell 已退出后,Ctrl+D 可以关闭当前标签页(单窗格关闭整页、分屏只关当前窗格、独立窗口关闭窗口),会话存活时 Ctrl+D 仍照常透传 EOF。此前该分支只判断终端类型是否支持实时输入,SSH 断开后这个值仍为 true,按键根本命中不到关闭逻辑。
  • 终端:分屏窗格的尺寸在切到其它标签再切回来时保持原比例,不再重新均分——尺寸此前只存在窗口元素缓存里,标签切走就丢了。
  • 终端:macOS 上粘贴到远程 bash 偶尔冒出 [200~ 字面文本的问题已修复。此前按渲染帧快照判断是否用 bracketed paste 包装,而 bash 5.1+ 每次执行命令都会翻转该模式,快照滞后就会拿过期状态去包装;现在读取终端的实时模式,只有锁被解析线程占用时才回退快照(#198)。
  • 表设计器:SQL 预览与 DDL 页签可以复制 SQL,按钮移到工具栏紧邻「保存」,内容为空时置灰;两个页签的编辑器由禁用改为只读,可以直接选中片段复制,顺带修掉提示文案直接显示字面 key 的问题。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


What's New

  • Connections now carry an "AI Access" policy (Allowed / Read only / Denied) that decides whether AI may operate them. It applies in three layers: denied connections stay out of the AI resource catalog and are not returned by connections.list / find; read-only connections keep only read tools; and one guard re-checks connection, connection_id, target and session_id at execution time, shared by the built-in chat and external MCP clients, so writes are rejected outright instead of silently allowed. The policy is part of the connection, so it syncs to the cloud with the connection and still holds on another machine; the sidebar badge and context menu switch it directly (#437).
  • Extension connections support custom icons: the connection form offers built-in icons or a local image, falling back to the icon declared in the extension manifest, and forms and manifests gain an Icon field type so extensions can ship their own picker. Connection lists, cards and terminal tabs now share one resolution path, so tabs no longer always show the generic icon — an SSH connection's custom icon now appears on its tab as well (#438).
  • The model dropdown in AI chat shows a search box once it has more than 15 entries (OpenRouter and similar aggregators carry hundreds of models), filtering case-insensitively on provider, model name and hint and ranking model names that start with the query first; the list scrolls within a fixed height and shows an empty state when nothing matches (#405).
  • The home "Recent Connections" section can now be turned off: Settings → General → Connection display adds a switch, and with it off the home page lists only the connections inside their groups — it stays off after a restart (#388).
  • SQL results can now fill in column comments from their sources: with "show column comments in header" enabled, the query's base tables, joins and aliases are analyzed and source comments are mapped onto the result columns; when the analysis is incomplete it degrades to the conservative "column name is unique across the candidate tables" match and shows nothing rather than a comment it cannot attribute correctly (#428).
  • SQL execution now has a clear running state: the result panel switches to running and stays visible, the toolbar shows a spinner and "Running...", and the elapsed time starts ticking immediately, so a long query no longer looks like it was ignored. Establishing an Auto session or a manual transaction counts as running too, and cancelling during that phase really aborts the run (#427).

Fixes and Improvements

  • ClickHouse now runs on an extension driver, and upgrading requires installing that driver: the built-in plugin is gone, so connecting, opening and forms go through the clickhouse driver from the extension market. Existing connection records are kept but need the driver installed before they can open; when it is missing the app offers to install it, following the same policy as DuckDB / TDengine, and the new-connection entry only appears once the driver is installed (#436).
  • Database: an Auto (sticky) session dropped while idle by the server or a firewall no longer requires closing and reopening the connection. The drivers report a disconnect as an ordinary result, the lost-connection signal was only raised on errors, and the editor kept reusing the dead connection so every statement failed within milliseconds. When an entire batch shows the statement never left the client, the session's physical connection is now replaced in place and the run retried once, keeping the session id, tab state and remembered schema; mid-flight disconnects (broken pipe / unexpected EOF) and manual transactions are not retried, so statements cannot be replayed into duplicate writes (#447).
  • Database: fixed unqualified queries landing in public even after a schema was picked in Auto mode. Session setup passed only the database and never aligned the search_path with the schema selected in the dropdown, and later runs do not replay the switch, so the choice had no effect; the schema is now switched before the run, once per session, without overriding a manual SET search_path (#433).
  • Database: result actions (copy as INSERT / UPDATE / DELETE) no longer build schema.schema.table and fail on execution — the table name coming from query analysis may already carry its schema prefix (#400).
  • Notes: images referenced by relative path now render when an external Markdown file is opened. The editor was created without a file path, so the image base directory fell back to the process working directory; it is now bound to the absolute path on open and updated when the document is renamed inside the app (#448).
  • Settings → MCP: "Install Navop Skill" no longer fails with No such file or directory (os error 2) on macOS. A GUI process launched from Finder or Dock inherits a minimal PATH, so a bare npx cannot be found — and npx's shebang needs node — so the launcher is now resolved through PATH plus fallback directories (Homebrew, /usr/local, nvm / fnm / volta / asdf) and its directory is added to the child process PATH. The MCP runtime requirement status is probed for real now, with actionable guidance when the launcher is missing instead of an unconditional "ready" (#449).
  • The connection tree separates Recent connections / Groups / Unassigned, so ungrouped connections no longer pile up at the end of the folder list, and each section header shows a count, with the Recent and Unassigned sections collapsible. Sibling groups now sort consistently by custom order then natural name, fixing the hierarchy and order drifting after a new group was created.
  • Deleting a group now lifts its contents one level: child groups and direct connections move to the deleted group's parent instead of vanishing or jumping to the root. "Move to group" became a hierarchical submenu, with the parent path added to same-named groups and a hint when there are many of them.
  • Terminal: after an SSH or serial disconnect, or once the shell has exited, Ctrl+D closes the current tab (the whole tab for a single pane, only the focused pane in a split, and the window for a standalone terminal), while a live session still passes Ctrl+D through as EOF. The old branch only checked whether the terminal type accepts live input, which stays true after an SSH disconnect, so the key never reached the close logic.
  • Terminal: split pane sizes keep their proportions after switching to another tab and back instead of being reset to equal shares — the sizes only lived in the window element cache and were dropped when the tab was unmounted.
  • Terminal: pasting into a remote bash on macOS no longer occasionally leaks a literal [200~. The paste path used a rendering snapshot to decide whether to wrap the text in a bracketed-paste sequence, but bash 5.1+ toggles that mode around every command, so a stale snapshot wrapped when the remote had it off; the live terminal mode is now read directly, falling back to the snapshot only while the parser holds the lock (#198).
  • Table designer: the SQL preview and DDL tabs can copy their SQL, with the button moved to the toolbar next to Save and greyed ou...
Read more

Navop v0.20.4

Choose a tag to compare

@github-actions github-actions released this 20 Oct 14:44
3222a66

更新内容

  • 扩展连接新增「终端类型」:扩展只需在 extension.json 的 connection 贡献点里声明 terminal(command、args、env、title),不必再提供 provider 运行时,Navop 会直接用已保存的非敏感表单值解析模板并打开普通本地终端页签(例如 tsh-ssh 这类外部 CLI 工具,现在只要一个 extension.json 就够了)。出于安全考虑,模板参数若不以 - 开头,代入值也不允许以 - 开头,避免被同步或共享过来的连接数据注入命令行选项;空的可选参数与环境变量会被丢弃,控制字符一律拒绝。
  • 这类终端页签使用固定标题、支持复制,子进程退出后按回车即可重新启动。扩展连接表单对终端类型隐藏「测试」按钮。

修复与优化

  • Redis 集群:单键命令打到非所属 master 时自动按 MOVED 重定向到正确节点并重试一次(GET / SET / DEL / EXPIRE / PERSIST / RENAME / HSET / HDEL / LPUSH / RPUSH / LSET / SADD / SREM / ZADD / ZREM 以及键详情查看)。控制台里的原始命令仍保持直连,避免写命令被重放(#414 后续反馈)。
  • Redis:点刷新已加载的数据库不再闪退(#424)。行右侧的加载中 / 错误图标是条件插入的子元素,会让同排文本容器的布局序号漂移,导致布局测量缓存未命中并在预绘制阶段直接崩溃;现在这些容器使用稳定 ID。
  • 数据库:修复执行 SQL 成功后进程崩溃。缓存失效最终会走 tokio::fs 删目录,需要在 Tokio 运行时内轮询;此前它在前台任务里直接等待,release 构建(panic = "abort")下只要有一条 DDL 成功就整进程退出。
  • 云同步:修复每次同步后连接总是掉回根目录、需要手动重新分组的问题。云端记录按更新时间倒序下发,连接常常先于所属分组落地而被写到根目录;收尾阶段新增连接层级对齐,在本地未被改动时把连接归位到云端所属分组。
  • 开发构建:debug 构建默认使用独立数据目录 ~/.navop-dev,不再污染已安装的正式实例;--data-dir、--portable、NAVOP_DATA_DIR、NAVOP_PORTABLE 仍优先级更高。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


What's New

  • Extension connections can now declare a terminal instead of a provider runtime: a connection contribution in extension.json may specify terminal (command, args, env, title), and Navop resolves the templates against the saved non-secret form values and opens a regular local terminal tab — external CLI tools such as tsh-ssh need nothing but an extension.json. As a safety guard, an argument whose template does not start with - is rejected when the substituted value does, so shared or synced connection data cannot inject command-line options; empty optional arguments and env entries are dropped, and control characters are rejected.
  • Those terminal tabs get a fixed tab title, can be duplicated, and restart on Enter after the child process exits. The connection form hides its Test button for terminal connections.

Fixes and Improvements

  • Redis cluster: single-key commands sent to a master that does not own the key now follow the MOVED redirection to the right node and retry once (GET / SET / DEL / EXPIRE / PERSIST / RENAME / HSET / HDEL / LPUSH / RPUSH / LSET / SADD / SREM / ZADD / ZREM, plus key detail lookup). Raw commands typed in the console stay direct so write commands are never replayed (#414 follow-up).
  • Redis: refreshing a loaded database no longer crashes (#424). The conditionally inserted loading / error icons shifted the layout index of the sibling text containers, so the measurement cache missed and prepaint crashed; those containers now carry stable IDs.
  • Database: fixed a process crash after a successful SQL execution. Cache invalidation eventually removes directories through tokio::fs, which must be polled inside the Tokio runtime; it used to be awaited from the foreground task, so with release builds (panic = "abort") a single successful DDL terminated the whole process.
  • Cloud sync: fixed connections falling back to the root folder after every sync, which forced a manual regroup. Cloud records arrive in reverse update order, so a connection often lands before its group exists and gets written to the root; the finalize pass now re-aligns connections to their cloud group whenever the local copy was untouched.
  • Development builds: debug builds now default to an isolated data directory (~/.navop-dev) instead of polluting an installed release instance; --data-dir, --portable, NAVOP_DATA_DIR and NAVOP_PORTABLE still take precedence.

Full Changelog: v0.20.3...v0.20.4

Navop v0.20.3

Choose a tag to compare

@github-actions github-actions released this 19 Oct 02:49
9be8b46

更新内容

  • 终端可以用键盘回看历史输出:Ctrl+Shift+↑/↓ 逐行滚动,Shift+PageUp/PageDown 按屏翻页,快捷键可在设置里修改(#409)。
  • Auto 模式的 SQL 编辑器改为粘性会话:同一页签内的多次执行复用同一条数据库连接,SET @变量 这类会话状态不再跨执行丢失(issue #312)。
  • 笔记 / Markdown 编辑器新增右侧可折叠大纲面板(Cmd/Ctrl+Shift+O),并新增 Markdown 代码字体设置;同步上游 velotype 的改进,包括双击按词选择、输入法相关崩溃修复,以及 div 块内图片与链接的排版(#406)。
  • SFTP 本地栏恢复磁盘下拉(仅 Windows),地址栏可以直接输入 C: 这样的裸盘符路径(issue #276、#375)。
  • 同一条 SSH 连接上的文件传输从单并发改为 3 条并发车道,一个卡住的上传不再拖死同服务器上的其它传输(#418)。

修复与优化

  • Redis:「启用 TLS」此前必然失败——客户端根本没有编译 TLS 支持,连 URL 解析阶段就报错,与服务器、证书、网络无关;现在可以正常连接 TLS 服务端。集群模式会汇总所有 master 节点(SCAN / TYPE / DEL 与键计数跨节点生效,并处理 MOVED 重定向,issue #414)。同时修复切换到空库时应用崩溃,以及 zset 类型徽章出现时的同类崩溃(issue #416)。
  • SFTP:上传卡在无响应的服务器上时可以立即取消并快速失败,单条请求超时由 300 秒缩短到 60 秒;包含符号链接的目录上传不再整体失败,文件链接按真实大小上传,目录链接与坏链跳过(#417)。
  • 数据库:清空表(TRUNCATE 或全表 DELETE)后自动刷新表数据页签(#413);修复结果集编辑网格保存时库名前缀被重复拼接、导致 MySQL 报 Table ... doesn't exist(42S02 / 1146)的问题。
  • 剪贴板:复制 JSON 字段不再额外包一层引号,粘贴出来的内容与存储原文一致(#412)。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


What's New

  • Terminals can scroll back with the keyboard: Ctrl+Shift+Up/Down moves one line, Shift+PageUp/PageDown moves a screen, and both are rebindable in Settings (#409).
  • The Auto-mode SQL editor now keeps a sticky session per tab: repeated runs reuse one database connection, so session state such as SET @var survives across executions (issue #312).
  • The Notes / Markdown editor gains a collapsible outline panel on the right (Cmd/Ctrl+Shift+O) and a dedicated Markdown code font setting; upstream velotype improvements are included — double-click word selection, the IME-related crash fix, and image/link layout inside div blocks (#406).
  • The SFTP local pane restores the disk dropdown on Windows, and the address bar accepts bare drive letters such as C: (issues #276, #375).
  • File transfers on a single SSH connection now use three concurrent lanes, so one stalled upload no longer blocks the others to the same server (#418).

Fixes and Improvements

  • Redis: "Enable TLS" used to fail unconditionally — the client was built without TLS support at all, so it errored while parsing the URL before any network request, regardless of server, certificate or network; TLS servers now connect. Cluster mode aggregates every master node (SCAN / TYPE / DEL and key counts span nodes, with MOVED redirection handled, issue #414). Also fixed the crash when switching to an empty database and the same crash triggered when the zset type badge appears (issue #416).
  • SFTP: an upload stuck on an unresponsive server can be cancelled immediately and fails fast, and the single-request timeout drops from 300s to 60s; directory uploads containing symlinks no longer fail as a whole — file links upload at their real size while directory links and broken links are skipped (#417).
  • Database: truncating a table (TRUNCATE or a full-table DELETE) now refreshes the table data tab (#413); saving edits from the result grid no longer repeats the schema prefix and fails with MySQL Table ... doesn't exist (42S02 / 1146).
  • Clipboard: copying a JSON field no longer wraps it in an extra pair of quotes, so the pasted content matches the stored value (#412).

Full Changelog: v0.20.2...v0.20.3

Navop v0.20.2

Choose a tag to compare

@github-actions github-actions released this 13 Oct 15:34
9992205

修复与优化

  • 修复 Windows 版安装后无法启动(issue #397):v0.20.1 的 Windows 产物漏掉了应用程序清单,程序在 main 之前就以「无法定位程序输入点 TaskDialogIndirect」退出,exe、MSI 与便携版全部受影响。现在 navop.exe 自行嵌入 Common-Controls v6 清单(含 asInvoker、Windows 10 兼容声明与 PerMonitorV2 DPI 感知),发布流水线同时新增清单校验,避免它再次被静默丢掉。
  • 「检查更新」不再点了没反应:检查期间按钮显示加载态并自动防重复点击,整轮检查加 20 秒总超时(超时给出明确提示,而不是无限转圈),说明行常驻显示「上次检查」的时间与结果(已是最新 / 发现新版本 / 检查失败 / 检查超时)。顺带修掉一个隐患:主窗口在检查期间被关闭会让 future 一起丢弃,按钮永久转圈且再也回不来。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


Fixes and Improvements

  • Fixed the Windows build failing to start after installation (issue #397): the v0.20.1 Windows artifacts shipped without an application manifest, so the executable exited before main with "the procedure entry point TaskDialogIndirect could not be located" — the exe, MSI and portable packages were all affected. navop.exe now embeds its own Common-Controls v6 manifest (asInvoker, Windows 10 compatibility, PerMonitorV2 DPI awareness), and the release pipeline validates the manifest so it cannot go missing silently again.
  • "Check for updates" no longer appears to do nothing: the button shows a loading state while checking (which also prevents duplicate clicks), the whole check is bounded by a 20-second timeout that reports a clear message instead of spinning forever, and a persistent line reports when the last check ran and what it found (up to date / new version available / failed / timed out). This also fixes a latent case where closing the main window mid-check discarded the future and left the button spinning forever.

Full Changelog: v0.20.1...v0.20.2

Navop v0.20.1

Choose a tag to compare

@github-actions github-actions released this 13 Oct 10:09
94aa0f0

更新内容

  • Windows 原生 RDP 远程桌面改用合成呈现(issue #310):GPUI 的浮层(标签菜单、弹窗、下拉)此前会被原生 RDP 画面「挖孔」盖住,落在下面的控件既看不见也点不到。现在浮层正常画在 RDP 画面之上,附加失败会自动退回子窗口方式,不会留下被遮蔽却不可用的窗口。浮动侧边栏与对话框同步适配。
  • 新增 SQL 库(issue #313):SQL 文件不再依附于连接管理,独立成库可跨连接复用;侧边栏列表采用 dbx 风格的单色书签图标。
  • 主密钥支持修改与重置(issue #371):修改时校验旧密钥后重新加密本地连接、钥匙串条目与已同步数据,中途断网只记待办、下次同步前自动补做;重置需输入 RESET 二次确认,删除范围逐项可勾选。「个人密钥」入口不再转交给「修改主密钥」弹窗,两个入口各司其职。
  • AI 供应商设置重做:新增 OpenRouter / MiniMax / 硅基流动等 6 家供应商并预填 base_url;内置 Navop AI 供应商移除,AI 能力改由用户自备(OpenAI 兼容接口均可接入)。
  • 新增鼠标中键关闭未固定(unpinned)的标签页。
  • DDL 统一由数据库驱动生成,删除宿主兜底拼装。
  • 终端嵌套 shell 场景新增 terminal.control 的 reintegrate,恢复丢失的宿主集成;shell 宿主新增 navop.i18n / navop.theme 两条 host 模块。
  • FTP / Telnet 连接的端口改为普通输入框,移除预设下拉。
  • 语言扩展的 WASM 编译改用专用大栈线程,修复打开高亮文件时崩溃。

修复与优化

  • 表格列筛选 / 隐藏列后操作落到错误行列:筛选生效时「删除记录」删的是另一行——界面提示成功、选中的行还在,刷新后像「删不掉」;隐藏 / 移动列后打开大文本编辑器显示的是别的列的内容(issue #387)。视图层「显示坐标」与数据层「数据坐标」的换算统一收口到委托层:删除、批量删除、新增行、复制行、大文本编辑全部修正,新增行在筛选生效时也照常可见,空筛选值集改为取消该列筛选。
  • 复制 SQL 时限定表名逐段加引号,不再把整段语句的表名一次包进引号。
  • Markdown 编辑器 Cmd/Ctrl+A 一次全选整篇,删除两段式选中循环。
  • 修复 gpui-fast 后端暴露的多处保留渲染契约违规;渲染栈整体迁移到 gpui-fast 0.1.8 自包含快照并同步 gpui-kit 上游修复。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


What's New

  • The Windows native RDP session is presented through composition (issue #310): GPUI overlays (tab menus, popovers, dropdowns) used to be swallowed by the airspace hole of the native RDP surface, leaving controls beneath it invisible and unclickable. Overlays now draw above the RDP content, with an automatic fallback to the plain child-window presentation when attaching fails. The floating sidebar and dialogs are adapted accordingly.
  • New SQL Library (issue #313): SQL files no longer live inside individual connections — they form a standalone library reusable across connections, with dbx-style monochrome bookmark icons in the sidebar.
  • Master key can now be changed and reset (issue #371): changing it verifies the old key and re-encrypts local connections, keychain entries and already-synced data, deferring interrupted re-encryption to the next sync; resetting requires typing RESET and lets you tick exactly what gets wiped. The "personal key" entry no longer hands over to the "change master key" dialog — each entry keeps its own form.
  • AI provider settings reworked: 6 providers including OpenRouter / MiniMax / SiliconFlow are added with prefilled base_url; the built-in Navop AI provider is removed — bring your own key with any OpenAI-compatible endpoint.
  • Middle-click closes unpinned tabs.
  • DDL is now generated uniformly by database drivers; the host-side fallback assembly is gone.
  • Nested shells in the terminal gain terminal.control's reintegrate to restore lost host integration, and the shell host adds navop.i18n / navop.theme host modules.
  • FTP / Telnet port fields become plain inputs instead of a preset dropdown.
  • Language-extension WASM compilation moves to a dedicated large-stack thread, fixing a crash when opening highlighted files.

Fixes and Improvements

  • Table operations no longer land on the wrong row or column while column filters or hidden columns are active: with a filter on, "delete record" deleted a different row — reported success while the selected row survived the refresh; with a column hidden or moved, the large-text editor showed another column's content (issue #387). Display-to-data coordinate translation is now centralized in the delegate layer: delete, batch delete, add row, clone row and large-text editing are all corrected, newly added rows stay visible under active filters, and an empty filter selection now clears that column's filter.
  • Copying SQL quotes each table reference segment individually instead of wrapping the whole statement's identifiers at once.
  • The Markdown editor's Cmd/Ctrl+A selects the whole document in one shot; the two-stage selection loop is gone.
  • Fixed several retained-rendering contract violations surfaced by the gpui-fast backend; the rendering stack moves to the self-contained gpui-fast 0.1.8 snapshot with upstream gpui-kit fixes.

Full Changelog: v0.20.0...v0.20.1

Navop v0.20.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 07:12
abaae54

更新内容

  • Windows 原生 RDP 远程桌面改用窗口组合呈现(issue #310):GPUI 的浮层(标签菜单、弹窗、下拉)此前会被原生 RDP 画面「挖孔」盖住,落在下面的控件既看不见也点不到。现在把 ActiveX 宿主窗口挂成组合表面,浮层正常画在 RDP 画面之上;组合附加失败会自动退回原来的子窗口方式,不会留下一块被遮蔽却不可用的窗口。内部依赖同步到 gpui-pre fork-0.3.126(fork-0.3.125 在 Linux 上编不过:上游 Wayland 重组路径对可选 renderer 直接调方法、没有解包)。
  • 新增 Gbase 8a 数据库支持。
  • 表数据页新增「字段定位」:可按字段名直接定位到对应列,列很多时不用再横向翻找。
  • 列注释改为设置项:此前只有把鼠标悬浮在列名上才看得到注释,现在可以在设置里让注释常驻显示(issue #251)。
  • 终端弹层背景不透明度可配置(issue #73):命令提示 / cd 补全 / Ctrl+R 历史搜索共用的下拉弹层,背景此前是一个写死的 0.72 透明度常量 —— issue #5 时代为「不遮挡终端内容」特意从 0.88 调低,但它会让下层终端文字以 28% 权重透进弹层,与弹层自身文字对比度同量级,亮色主题下整层几乎不可读。先把透出压到 4%,再做成终端侧边栏设置里的「弹层背景不透明度」滑块(范围 0.5–1.0,默认 0.96),两个相反诉求可以各取所需。
  • 展开表快多了:表展开此前会串行查 5 类元数据(列 / 索引 / 外键 / 触发器 / 检查约束)并把结果全部预置。实测 MySQL 5.7 下「外键」那一条 information_schema 查询单独就要 2.9–3.2 秒、且返回 0 行,表展开的 3–6 秒几乎全花在这条白等上。现在只立即查列,其余四类改成点开对应目录时才查(四个目录的展开箭头照常显示,行为不变)。
  • 「执行记录」面板改用虚拟化列表(issue #368):打开执行记录后,SQL 编辑器每敲一个字都要重建最多 1000 条记录(约两万个元素)的 element 树,表现为「每打一个字卡一下」,清空记录后立刻消失。现在只渲染可见的十来行。
  • 个人同步补上真正的跨实例互斥:目录 / Git / WebDAV 这三类后端都可能被同一台机器的两个实例、或两台机器通过 Dropbox / iCloud 共享同一个同步目录指向,此前锁是「永远成功且从不释放」的空实现,两边会并发「读记录 → 改 → 写回」,单文件原子写保不住版本。现在目录 / Git 后端用带 TTL 与 nonce 的锁文件(放在同步包之外,不会被 Git 提交上去),WebDAV 用 PUT 后回读 nonce 裁决;拿不到锁只让路一轮、下一轮自动重试,也可读不到锁基础设施时降级为「本轮不加锁继续」,不会把本来能跑的同步变成失败。
  • 递归分组的父子层级随同步载荷传递(issue #356):分组此前只同步 name / color / icon / sort_order,而 parent 是机器内自增 id,于是另一台电脑应用同步数据后,A/B 两层嵌套会变成两个并列分组。现在载荷带「格式版本 + 父分组云 ID」,祖先优先排序保证父分组先拿到云 ID,应用阶段顺序无关、幂等,旧客户端留下的无层级载荷也不会把本地嵌套拍平;云同步与个人同步(Git / WebDAV / 目录)两条链路一起修。
  • 本地删除遇上「远端之后又改过」时挂冲突而不是抹掉(issue #361):删除事件此前只带数据类型与云 ID,判不出远端在我们删除之后是否又被别的设备改过,于是只能无条件把远端记录推成墓碑、静默抹掉对方刚做的改动。现在删除事件带上删除前的同步基线(真正删行之前读出),远端在基线之后被改过就挂 LocalDeletedRemoteModified 冲突交给用户裁决。
  • 面板分隔条与列宽抓取区改为骑在边界两侧(issue #333):以前命中带只有 2px 且整条缩在边界一侧,鼠标稍动光标与悬停高亮就一起消失,必须像素级对准才拖得动。现在以列边界为中心、两侧各留 4px,数据表格表头、表对象列表、表设计器、Redis 值表、单元格预览分隔条、各面板分隔条一并生效。
  • 复制整行再粘贴不再丢字段(issue #355):可编辑表格与查询结果共用「制表符分列、换行分行」的剪贴板格式,但复制侧原样写出、粘贴侧裸切,字段自身含制表符 / 换行 / 引号时复制那一刻就已经被切乱(表现为「剪贴板里字段是全的,粘进去少了几个」)。现在新增统一的 TSV 编解码(RFC 4180 风格成对转义),四个读写点全部改走它:字段含分隔符才加引号并双写内部引号,普通值保持原样,从别处粘单值(JSON 片段、C:\new\test 这类路径)依旧原样写入。
  • 终端文件侧边栏的连接名标签只显示前两个字符、其余用 ... 省略,完整名称仍由 tooltip 呈现:目标选择器与 SFTP 端点切换按钮此前各自调宽度上限,长连接名仍会把右侧路径栏挤窄。
  • 文件传输面板的「自动跟随终端目录」与「隐藏文件」开关现在开与关一眼可辨(开启用强调色,关闭退回次要前景色),并新增「定位到终端目录」按钮(面板当前目录 → 终端 cd,方向与既有的「同步终端目录」相反)(issue #359)。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


What's New

  • The Windows native RDP session is now presented through window composition (issue #310): GPUI overlays (tab menus, popovers, dropdowns) used to be covered by the airspace hole of the native RDP surface, so controls underneath were neither visible nor clickable. The ActiveX host window is attached as a composition surface so overlays draw above the RDP content; a failed attach falls back to the previous plain child-window presentation and never leaves a cloaked window behind. Internal dependencies were synced to gpui-pre fork-0.3.126 (fork-0.3.125 did not compile on Linux: the upstream Wayland recomposition path called renderer methods on the fork's optional renderer without unwrapping it).
  • Added support for the Gbase 8a database.
  • The table data page gains "locate field", which jumps straight to the column matching a field name — no more horizontal hunting in wide tables.
  • Column comments become a setting: they used to appear only while hovering the column header, and can now be shown permanently from settings (issue #251).
  • The terminal popup background opacity is configurable (issue #73): the dropdown shared by command suggestions, cd completion and Ctrl+R history search drew its background at a hard-coded 0.72 opacity. That value dates back to issue #5, where the popup was lowered from 0.88 so it would not hide the terminal beneath it — but it lets the terminal text bleed through at 28%, on the same order as the popup's own text contrast, leaving the whole layer nearly unreadable in light themes. The bleed-through was first cut to 4%, then turned into a "popup background opacity" slider in the terminal sidebar settings (0.5–1.0, default 0.96), so both opposite requests can be satisfied.
  • Expanding a table is much faster: it used to run five information_schema queries serially (columns, indexes, foreign keys, triggers, check constraints) and pre-populate all of them. Measured on MySQL 5.7 the foreign-key query alone costs 2.9–3.2 s and returns 0 rows, so nearly all of the 3–6 s expand was spent waiting for nothing. Only columns are fetched eagerly now; the other four categories are queried when their folder is expanded (all four folders keep showing their chevron and behave as before).
  • The execution history panel uses a virtualized list (issue #368): with the panel open, the SQL editor rebuilt the element tree of up to 1000 records (~20k elements) on every keystroke, which showed up as a stutter per character and disappeared as soon as the history was cleared. Only the visible dozen rows are rendered now.
  • Personal sync gains real cross-instance exclusion: folder, Git and WebDAV backends can all be pointed at by two instances on one machine, or by two machines sharing one sync directory (Dropbox / iCloud), and the lock used to be an "always succeeds, never released" stub, so both sides ran read → modify → write back concurrently and the atomic single-file write could not protect the version. Folder and Git backends now use a lock file with a TTL and a nonce (kept outside the sync package so the Git backend never commits it), and WebDAV decides by reading the nonce back after PUT; a busy lock only yields this round and retries on the next one, and a broken lock infrastructure degrades to "continue without a lock" instead of failing a sync that used to work.
  • Nested workspaces carry their parent link through the sync payload (issue #356): only name / color / icon / sort_order were synced while parent was a machine-local auto-increment id, so after applying synced data on another computer an A/B nesting became two sibling groups. The payload now carries a format version plus the parent's cloud id, uploads are sorted ancestor-first so parents get their cloud id before children reference it, and applying is order-independent and idempotent — payloads from older clients do not flatten local nesting. Both cloud sync and personal sync (Git / WebDAV / folder) are fixed.
  • A local delete that races a later remote edit now becomes a conflict instead of a silent erase (issue #361): the delete event only carried the data type and cloud id, so it could not tell whether the remote record had been changed by another device after our delete, and the remote record was unconditionally tombstoned — silently wiping a change the other side had just made. The event now carries the sync baseline read before the local row is removed, and a remote edit after that baseline raises a LocalDeletedRemoteModified conflict for the user to decide.
  • Panel dividers and column-resize handles straddle the boundary (issue #333): the hit band used to be 2px wide and fully inset on one side of the boundary, so you had to aim pixel-perfectly and the cursor and hover highlight vanished at the slightest movement. The grab area is now centered on the boundary with 4px on each side, across data grid headers, the table object list, the table designer, Redis value tables, the cell preview divider and every panel divider.
  • Copying a row and pasting it no longer loses fields (issue #355): editable tables and query results share a "tab-separated columns, newline-separated rows" clipboard format, but the copy side wrote values verbatim and the paste side split naively, so a field containing a tab, newline or quote was already cut apart at copy time (the clipboard looked complete while the pasted row lost fields). A shared TSV codec with RFC 4180-style paired escaping now backs all four read/write sites: only fields containing separators are quoted with doubled inner quotes, plain values stay untouched, and pasting a single value from elsewhere (a JSON fragment, a path like C:\new\test) is still written verbatim.
  • The connection-name label in the terminal file sidebar shows only its first two characters with ... for the rest, with the full name still available in the tooltip: the target picker and the SFTP endpoint switcher used to tune their own width caps, and a long connection name still squeezed the path bar on the right.
  • The file transfer panel's "follow terminal directory" and "hidden files" toggles are now obviously on or off (accent color when on, secondary foreground when off), and a "locate terminal directory" button was added (panel directory → terminal cd, the reverse direction of the existing "sync terminal directory") (issue #359).

Fixes and Improvements

  • On macOS, copying files out of a remote desktop session and pasting them in Finder produced an "already pasted " text file instead of the real file: the clipboard writer left only plain-text types, and GPUI's pasteboard reader restores file paths only from NSFilenamesPboardType — so the 500ms local clipboard sync echo-pushed the "file" back to the remote as text (rdpclip churn). The writer now uses the classic declareTypes plus setPropertyList(NSFilenamesPboardType) sequence and ignores late remote text announcements while installed files remain authoritative.
  • The desktop shortcut icon degraded to a generic blank page after installing on Windows (issue #325): the MSI <Shortcut> elements referenced the Icon table, and MSI saves that icon as a separate file which, once cleaned up or once the icon cache goes stale, leaves only the blank icon. Shortcuts no longer reference the Icon table; the icon comes from the embedded resource in navop.exe.
  • In-app updates on Linux always failed with Text file busy (os error 26) (issue #353): the pre-flight check ran open(O_WRONLY) on the running executable itself, which Linux always answers with ETXTBSY. The replacement path only needs directory...
Read more

Navop v0.19.5

Choose a tag to compare

@github-actions github-actions released this 06 Oct 14:02
2f28676

更新内容

  • 个人同步新增 WebDAV:与「文件夹」「Git」并列,填服务器地址、用户名、密码即可用。密码经加密后落盘,不明文保存。协议实现刻意只用 GET / PUT / DELETE 三个基础方法加 Basic 认证,不做 PROPFIND / MKCOL 探测,以规避坚果云、群晖、Nextcloud 与自建服务之间的 WebDAV 方言差异;首次写入前用 MKCOL 建目录,服务端返回 409 会被正确识别为「目录不可用」并提示去服务器上建目录或检查写权限,不再误报成「记录版本冲突」进入反复失败后暂停。设置页只显示当前后端相关的项(选 WebDAV 时隐藏「同步路径」,选文件夹 / Git 时隐藏三项 WebDAV 配置),三个输入框统一宽度,密码框可切换明文 / 掩码。WebDAV 没有本地目录可监听,同步由 60 秒周期扫描驱动。
  • SSH Agent 转发:凭据里的私钥可勾选「通过 ssh-agent 转发此密钥」,连接侧也有「SSH Agent 转发」(ForwardAgent)开关。本地 ssh-agent 转发给远端后,远端(例如跳板机)能代表你用本机私钥向更内层主机认证。对新开的终端会话生效。
  • 表结构设计页新增「刷新表结构」:重新读取最新的列、索引与表信息。设计器里有未保存改动时会先提示「刷新会放弃当前设计器中未保存的更改」,确认后「放弃并刷新」。
  • 终端粘贴确认弹窗补上「打开设置」与「不再提示」:多行粘贴、高危命令、大段粘贴三类提示都能直接跳到对应设置项,被反复拦截时不用再自己找去哪里关。大段粘贴是硬阈值,不提供「不再提示」。
  • SQL 编辑器手动事务的提交 / 回滚按钮、表数据页的「提交更改」,在写库期间显示 loading,能看出是哪一步还在跑,另一个按钮只禁用、不跟着转。
  • 走 IPC 的外部驱动改为按调用类别区分请求超时,并支持连接级配置:查询、执行、游标、导入导出等用户操作类默认 30 分钟,元数据与结构浏览类保持 30 秒;连接的高级设置里新增「请求超时(秒)」(留空按类别默认,0 表示不限制)。慢库上的大查询、大导入不再被此前那个对所有调用一视同仁的 30 秒硬超时打断。

修复与优化

  • macOS(Touch Bar 机型):关闭窗口闪退这次收口到上游修复。上游 zed#65186 修掉了根因——accesskit 不再用动态替换内容视图的类来挂适配器,而那次「还原类」正是破坏 AppKit Touch Bar 观察者状态、让窗口关闭时抛异常的动作。因此「关闭即隐藏」这个实验开关撤掉,macOS 两个架构、Windows、Linux 统一回到「关闭即销毁」,不再为这个修复承担隐藏窗口一直占着原生窗口与渲染层的内存代价。整套机制原样保留、现在恒为关;万一闪退在真机复现,给对应构建打开同一个开关即可,代码不用改。同时把内部依赖同步到 gpui-pre fork-0.3.124 与 gpui-kit v0.7.1(含 37 个上游提交,以及上游对 headless windowing、hang monitor 等一批修复)。
  • 修复 WHERE / ORDER BY 过滤输入框里输入中文导致程序崩溃(#326):补全候选的扫描按字节回退,而中文首字符占三个字节,回退一位会落进字符中间,直接把进程带走。现在一律按 UTF-8 字符边界回退。
  • 修复表数据过滤条的 WHERE / ORDER BY 两个输入框比迁移前高出一行:输入框在组件外部化时从「单行输入」换成了恒为多行的编辑器,行数写在布局模式里、默认 2 行,而过滤条外层是 auto 高度容器,于是直接退化成两行的下界高度——不是内容撑高的。现在行数可配置,过滤条按一行渲染(实测高度 40px → 20px),SQL 高亮与字段补全一点没动。
  • 终端命令输入栏的折叠态提示重做:此前折叠时展示的是输入框的按键提示(↑/↓ 选择 · Tab 补全 · Enter 逐条执行 · Shift+Enter 换行),可输入框这时是隐藏的,看着像是终端自己给的提示,也不容易发现有「命令输入」这个功能。现在折叠态换成可点击的「点击展开 · 命令输入支持批量执行」,点击任意位置即展开;展开后的按键说明并入输入框 placeholder,不再另起一行与 placeholder 重复。
  • 修复 Linux(Arch + Hyprland / Wayland)上每次应用内退出都以 SIGABRT 收尾并留下 core(#336):根因不在退出逻辑,而是线程局部存储的析构顺序——托盘句柄先注册析构器,async-io 的驱动缓存在后,退出时逆序析构,轮到托盘时驱动缓存已经销毁,析构器不能 unwind,只能 abort。现在退出前显式释放托盘与全局快捷键的原生句柄,句柄交出去后托盘命令自动退化为空操作,重复调用幂等。
  • 修复 AI 对话里取消回答后会话被误判为失败:取消时提前丢掉请求 future 会拆掉 JSON-RPC 的响应通道,agent 对 session/cancel 的回应因此变成「连接致命错误」并把会话状态翻成失败。现在在取消握手期间保住这个 future,取消后回到可继续对话的状态。
  • 修复达梦等方言下表设计器改完列注释、界面一直显示旧注释:COMMENT ON 语句此前不在 DDL 关键字里,改注释根本进不到表结构缓存失效那条路径。现在 COMMENT ON COLUMN / TABLE / VIEW 都纳入失效,列注释改动即时生效(定位不到具体对象的类型宁可整库失效,不少失效)。
  • 保存流程不再依赖「窗口会消失」:受保护模式下隐藏失败会把窗口留在屏幕上,而旧保存流程是靠「窗口反正会消失」来结束这一轮的,于是表单没切到「已保存」,用户再点一次「保存」会再插一条连接(redis / mongo / serial / 端口转发最明显,数据库、中间件、扩展、凭据表单则是清掉编辑状态后重建)。现在保存成功即就地切「已保存」、下一次保存走更新而不是新建;异步保存的表单在保存落地后再补一次状态切换,所以提示里能带「已保存」这个事实——窗口没能关闭时会提示「已保存,但窗口没能关闭,可以重试关闭」,取消、红点、Cmd-W 这些裸关窗不受影响。
  • 远端目标选择器改为按可用宽度省略、完整连接名进 tooltip:此前按 12 个字符硬截断,中英文名宽窄不一,同样的上限压不住中文长名(连接名一长就把右侧路径栏挤掉),短英文名又显得空。

国内下载:如果 GitHub 下载较慢,可从 CNB 镜像 下载桌面端安装包


What's New

  • Personal sync gains a WebDAV backend next to "Folder" and "Git": enter the server URL, user name and password and it works. The password is sealed before it is written to disk. The protocol implementation deliberately uses only GET / PUT / DELETE plus Basic auth and never probes with PROPFIND / MKCOL, to avoid the WebDAV dialect differences between Jianguoyun, Synology, Nextcloud and self-hosted servers; a collection is created with MKCOL before the first write, and a 409 from the server is now correctly recognized as "directory unavailable" with a hint to create the directory or check write permissions instead of being misreported as a version conflict that ends in a paused sync. The settings page only shows the items of the selected backend (no sync path for WebDAV, no WebDAV fields for Folder / Git), the three inputs share one width, and the password field can be revealed. WebDAV has no local directory to watch, so a 60-second scan drives syncing.
  • SSH agent forwarding: a key credential can be marked "Forward this key through ssh-agent", and a connection has its own "SSH Agent Forwarding" (ForwardAgent) switch. With the local ssh-agent forwarded to the remote host, that host (a jump host, for example) can authenticate onward to deeper hosts with your local key. Applies to new terminal sessions.
  • The table structure designer gains "Refresh table structure", which reloads the latest columns, indexes and table info. With unsaved edits in the designer it first warns that refreshing discards them, and confirms with "Discard and refresh".
  • The terminal's paste confirmation dialog now offers "Open settings" and "Don't ask again": multi-line paste, high-risk command and large paste prompts all link to the matching setting, so repeated prompts no longer leave you hunting for where to turn them off. Large paste is a hard threshold and offers no "don't ask again".
  • The commit and rollback buttons of the SQL editor's manual transaction, and "Commit changes" in the table data page, show a loading indicator while the write is in flight, so it is clear which step is still running; the other button is merely disabled and does not spin.
  • External drivers reached over IPC can now time out per call category, with a per-connection override: user operations (query, exec, cursor, import/export) default to 30 minutes while metadata and structure browsing keep 30 seconds, and the connection's advanced settings gain a "Request timeout (seconds)" field (empty follows the category defaults, 0 means unlimited). Large queries and imports on slow databases are no longer cut off by the single 30-second timeout that used to apply to every call.

Fixes and Improvements

  • macOS (Touch Bar models): the crash when closing a window is now closed out by the upstream fix. Upstream zed#65186 removed the root cause — accesskit no longer swaps the content view's class to attach its adapter, and that "restore the class" step was what corrupted the AppKit Touch Bar observer state and made window close throw. The "hide on close" experiment switch is therefore gone, and both macOS architectures, Windows and Linux are back to destroying on close, no longer paying the memory cost of hidden windows that keep their native window and rendering layer alive. The whole mechanism is kept and is now permanently off; if the crash ever reproduces on real hardware, passing the same feature to the affected build is enough and no code has to change. Internal dependencies were synced to gpui-pre fork-0.3.124 and gpui-kit v0.7.1 (37 upstream commits, including a batch of upstream fixes for headless windowing and the hang monitor).
  • Fixed the crash when typing Chinese into the WHERE / ORDER BY filter inputs (#326): completion scanning stepped back one byte at a time, and because the first byte of a Chinese character spans three, that landed in the middle of a character and took the process down. It now steps back on UTF-8 character boundaries.
  • Fixed the WHERE / ORDER BY inputs of the table data filter bar being one line taller than before the migration: when the input component was externalized, the single-line input became an always-multiline editor whose row count lives in the layout mode and defaults to 2, while the filter bar sits in an auto-height container — so it collapsed into the two-row lower bound rather than being pushed up by content. The row count is now configurable and the filter bar renders one row (measured 40px → 20px), with SQL highlighting and field completion untouched.
  • Reworked the collapsed hint of the terminal's command input bar: it used to show the input's key hints (↑/↓ to select · Tab to complete · Enter to run all · Shift+Enter for a new line) while that input was hidden, which read like a hint from the terminal itself and made the "command input" feature easy to miss. The collapsed state is now a clickable "Click to expand · the command input runs batches", and expanding happens from a click anywhere on it; the key hints moved into the input's placeholder instead of repeating on a line of their own.
  • Fixed every in-app quit ending in SIGABRT on Linux (Arch + Hyprland / Wayland) with a core file (#336): the cause was not the quit logic but thread-local destruction order — the tray handle registered its destructor first and the async-io driver cache after it, so on exit the cache was already gone when the tray handle was destroyed, and a destructor that cannot unwind can only abort. The tray and global-hotkey native handles are now released explicitly before quitting, and once the handle is handed over the tray commands degrade to no-ops, making repeated calls idempotent.
  • Fixed an AI chat turn being marked as failed after cancelling a reply: dropping the request future early tears down the JSON-RPC response channel, so the agent's reply to session/cancel surfaced as a connection-fatal error and flipped the session to Failed. The future now stays alive through the cancel handshake and the session returns to a usable state.
  • Fixed the table designer showing a stale column comment after editing it on dialects such as Dameng: COMMENT ON statements were not in the DDL keyword list, so a comment edit never reached the path that invalidates the table structure cache. COMMENT ON COLUMN / TABLE / VIEW now all invalidate it, so column comment changes take effect immediately (types whose object cannot be located invalidate the whole database instead — better too much than too little).
  • Save flows no longer rely on "the window is going to disappear": when hiding fails in protected mode the window stays on screen, and the old flow used that disappearance to end the round — so the form never flipped to "saved" and pressing Save again inserted a second connection (most visible with redis / mongo / serial / port forwarding; the database, middleware, extension and credential forms rebuilt from a cleared editing state instead). A successful save now flips the form to its saved state in place, so the next save updates rather than creates; asynchronous save forms flip the state once the save lands, which is what lets the message carry the "saved" ...
Read more