docs(docs-site): 更新到 v0.19.5

首页三语言发布亮点整体更新:个人同步 WebDAV 后端、SSH Agent 转发、表设计器「刷新表结构」、终端粘贴确认弹窗「打开设置 / 不再提示」、外部驱动按调用类别区分请求超时(连接高级设置新增「请求超时(秒)」)、事务提交按钮 loading,以及中文过滤输入崩溃、Linux 退出 SIGABRT、macOS Touch Bar 关窗闪退等修复。

指南章节:teams-sync-security 补 WebDAV 后端与「目录不可用」处理;ssh-terminal 补 ssh-agent 转发与 ForwardAgent;schema-tools 补「刷新表结构」;database-connections 补按调用类别的请求超时与连接级覆盖。
This commit is contained in:
胡飞
2026-10-06 23:21:51 +08:00
parent 74d0e05951
commit c1db9f1cd1
18 changed files with 51 additions and 229 deletions
-2
View File
@@ -31,7 +31,6 @@ The normal release sequence is:
6. The workflow checks the application version and tagged changelog entry before starting expensive builds.
7. macOS ARM64, macOS x86_64, Linux x86_64, Linux ARM64, and Windows x86_64 build in parallel in one matrix.
8. After all requested platforms finish, the workflow extracts the tagged entry, uses it as the GitHub Release body, and writes the same Markdown to the R2 `latest.json` `release_notes` field.
9. Once every uploaded object has been verified, R2 keeps only the tag that was just uploaded: the other `releases/<tag>/` prefixes are pruned, so the bucket carries one version's installers instead of the whole history. Nothing becomes unreachable — `updates/latest.json` only ever points at the tag being uploaded, and older installers stay on their GitHub Release and on the CNB mirror.
The build workflow checks out the requested tag, while the workflow itself runs from `main`. This keeps Cargo input caches and sccache data reusable across tags and repair runs.
@@ -118,6 +117,5 @@ For a failed matrix job in the same workflow run, prefer **Re-run failed jobs**.
- A new release tag must contain a valid bilingual `CHANGELOG.md` entry before builds begin.
- GitHub Release notes and R2 updater `release_notes` are extracted from the same tagged changelog entry.
- Publishing uses `--clobber` only for newly built platform files and `sha256sums.txt`.
- R2 keeps only the newest release. The prune step runs after the upload has been verified object by object and never carries `always()`, so a failed upload leaves the existing objects alone; it refuses to delete anything when its own tag is missing from R2, and a non-stable tag (for example `v0.20.0-rc.1`) skips pruning so it cannot take the last stable installers with it.
- Legacy pre-changelog repairs preserve their existing GitHub Release body.
- All five primary platform builds belong to one matrix, so they start in parallel and a failed job can be rerun without rebuilding successful matrix jobs.
-71
View File
@@ -398,74 +398,3 @@ jobs:
done
upload_object "artifacts/updates/latest.json" "updates/latest.json" "application/json; charset=utf-8" "no-store, max-age=0"
# 桶里只留这次上传的版本:旧安装包在 R2 上只占空间,下载入口都不依赖它们
# —— updates/latest.json 只指向本次 tag,旧版本另有 GitHub Release 与 CNB
# 镜像作为存档。这一步必须待在上传与逐对象校验之后,且不能加 always():
# 上传没成功就一个对象都不许删,否则桶里可能新旧两份都不完整。
- name: Prune older R2 releases
if: ${{ steps.r2_config.outputs.skip != 'true' && steps.release.outputs.skip != 'true' }}
env:
AWS_ACCESS_KEY_ID: ${{ secrets.CLOUDFLARE_R2_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.CLOUDFLARE_R2_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: auto
AWS_REGION: auto
AWS_EC2_METADATA_DISABLED: true
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
CLOUDFLARE_R2_BUCKET: ${{ secrets.CLOUDFLARE_R2_BUCKET }}
RELEASE_TAG: ${{ steps.release.outputs.tag }}
run: |
set -euo pipefail
endpoint="https://${CLOUDFLARE_ACCOUNT_ID}.r2.cloudflarestorage.com"
# 所有删除都限定在这个前缀下:更新清单(latest.json 在另一条前缀里)
# 永远不碰。
prefix="releases"
# 预发布(v0.20.0-rc.1 之类)不清理:它不该把上一个稳定版本的安装包
# 带走,而它的对象本来也只是临时放一下。
if ! [[ "${RELEASE_TAG}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "::warning::Skipping R2 prune for non-stable release tag '${RELEASE_TAG}'."
exit 0
fi
# 列出 releases/ 下的版本前缀(delimiter 让每页只回顶层目录名)。
list_release_prefixes() {
aws s3api list-objects-v2 \
--bucket "${CLOUDFLARE_R2_BUCKET}" \
--prefix "${prefix}/" \
--delimiter "/" \
--endpoint-url "${endpoint}" \
--query "CommonPrefixes[].Prefix" \
--output text \
| sed -n "s|^${prefix}/\\([^/]*\\)/\$|\\1|p" \
| sort -u
}
tags="$(list_release_prefixes)"
# 本次 tag 不在桶里就什么都不删:宁可留下旧版本,也不能在「新版本其实
# 没上传成功」时把最后一份可用安装包清掉。
if ! grep -Fxq "${RELEASE_TAG}" <<< "${tags}"; then
echo "::error::Refusing to prune: ${prefix}/${RELEASE_TAG}/ is not present in R2"
exit 1
fi
# 注意这里的 for 依赖分词逐行遍历。
for tag in ${tags}; do
if [ "${tag}" = "${RELEASE_TAG}" ]; then
continue
fi
echo "Deleting ${prefix}/${tag}/"
aws s3 rm "s3://${CLOUDFLARE_R2_BUCKET}/${prefix}/${tag}/" \
--recursive \
--endpoint-url "${endpoint}"
done
for tag in $(list_release_prefixes); do
if [ "${tag}" != "${RELEASE_TAG}" ]; then
echo "::error::R2 still holds ${prefix}/${tag}/ after pruning"
exit 1
fi
done
echo "R2 now keeps only ${prefix}/${RELEASE_TAG}/"
@@ -33,3 +33,5 @@ After certificate rotation, retest the connection and confirm that an extension
Schema filters can hide system objects, include selected schemas, exclude selected schemas, or show everything. They affect navigation only; they do not change account permissions or prevent direct SQL access. When an object appears missing, check the current database, schema, name case, permissions, and filter.
Close dependent editors, data tabs, and comparison jobs before changing connection parameters so active sessions do not continue with stale settings.
External (IPC) drivers time out per call category: user operations such as query, exec, cursor, and import/export default to 30 minutes, while metadata and structure browsing keep 30 seconds. The connection's advanced settings expose a "Request timeout (seconds)" field that overrides the category defaults — leave it empty to follow the defaults, or set 0 for no limit — so large queries and imports on slow databases are no longer cut off by the single 30-second cap.
@@ -12,6 +12,8 @@ Refresh before a change so an old tab does not hide modifications made by anothe
Create or modify columns and indexes, plus supported engine, character-set, and collation settings. Before narrowing a type or changing nullability, confirm that existing data can convert. Check for duplicates before creating a unique index.
"Refresh table structure" reloads the latest columns, indexes, and table info from the server. If the designer has unsaved edits it warns that refreshing discards them, and confirms with "Discard and refresh". After a teammate or an external tool changes the schema, refreshing is usually faster than closing and reopening the designer.
Review the SQL/DDL preview. Navop warns about destructive statements such as DROP, but automated detection cannot understand every business impact. Validate migrations in a test database and prepare rollback or restore procedures.
## Build ER diagrams
@@ -8,6 +8,8 @@ SSH authentication supports passwords, private-key files, inline private-key con
The SSH connection's Advanced Settings include an "Allow Legacy SSH Algorithms" compatibility option (off by default). Enable it per connection only when a server supports only older algorithms such as DSA host keys, SHA-1 key exchange/MAC, or 1024-bit DH group negotiation; Windows also supports Pageant authentication. Enabling it lowers cryptographic strength, so do not keep it on for servers that can be upgraded.
A key credential can be marked "Forward this key through ssh-agent", and the connection's Advanced Settings also carry an "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; the setting applies to newly opened terminal sessions, so reconnect existing ones.
Local profiles include the system shell, PowerShell, CMD, WSL, Git Bash, or a custom program. Select the profile when opening a terminal; unavailable platform-specific choices are hidden. Use trusted executables and safely parsed arguments, and do not place passwords in command-line parameters.
The terminal AI sidebar works with both SSH and local sessions and uses the active terminal as its default resource context. Verify the shell, operating system, host, and current directory before running generated commands; local PowerShell, custom programs, and remote Linux shells are not interchangeable.
@@ -14,6 +14,8 @@ The master key encrypts database passwords, SSH private keys, and related secret
Back it up through a secure offline method. Never send it through chat, email, shared Notes, or reuse it as an account password. The home workspace groups personal and team keys separately, so confirm which key type a connection uses before opening or creating it; a team key only applies to authorized shared connections.
Personal sync can target a Folder, a Git repository, or a WebDAV server: Folder and Git need a local directory or repository, while WebDAV only needs a server URL, user name, and password — the password is sealed to disk rather than stored in the clear, which suits Jianguoyun, Synology, Nextcloud, and self-hosted servers. WebDAV has no local directory to watch, so a 60-second scan drives syncing; a collection is created on the server before the first write, and if the server reports the directory as unavailable, create it or check write permission rather than retrying. The settings page shows only the items of the selected backend.
## Resolve sync conflicts
Conflicts occur when both sides edit a record, or when one deletes while the other edits. Before choosing local or remote, compare device, time, target, and fields. Record both versions manually if necessary.
+9 -9
View File
@@ -2,18 +2,18 @@
Navop is the dev and ops workspace for the AI era, bringing databases, Redis, MongoDB, SSH, SFTP, terminals, remote desktops, Notes, AI, and team sync into one native workspace.
## Current release: v0.19.1
## Current release: v0.19.5
Download the latest stable release from the [official Download Center](https://navop.dev/en-US/extensions).
- Fixed frequent Windows terminal stuttering (git bash, PowerShell freezing after actions until later): rows with highlight/search decorations are rebuilt incrementally, custom highlight rules rescan only changed rows per frame, and the synchronous directory reads behind local-terminal hover detection moved to a background thread.
- Table data find: press Cmd/Ctrl+F while browsing table data to open the find bar; matched cells get an outlined highlight, Cmd/Ctrl+G / Cmd/Ctrl+Shift+G jump between matches and scroll the hit column into view, and hits are re-scanned after paging/refresh. Field filtering for table data preview: a column-header dropdown selects visible fields, so wide tables show only the columns you care about.
- SQL editor object details reworked: hover popups are off by default (enable in settings; when on they require a 600ms dwell), replaced by a right-click "View object details" that opens a standalone dialog with selectable, copyable content. Right-click also gains "Copy DDL"; selecting a table name and right-clicking resolves it too.
- New shortcut Cmd/Ctrl+Shift+W closes the active tab, rebindable in settings; the "Workspace" field in connection forms is now consistently called "Group".
- Fixed SSH MFA logins answering the verification-code prompt with the saved password and failing auth; fixed legacy-device (Huawei VRP etc.) SSH connections dying with `` `mpint` encoding invalid ``.
- Database connection robustness: the pre-reuse ping has a 10-second cap, the disconnect path a 5-second cap, and MySQL/PostgreSQL connections enable 30s TCP keepalive, so connections dropped by NAT/firewalls during long idle periods no longer hang forever; manually-started transactions killed by a disconnect are finalized automatically.
- Fixed SQLite WITHOUT ROWID tables and views showing an empty preview page, the PostgreSQL sequence catalogue always being empty, and MCP client configs being written with a removed positional argument; the default HTTP client now follows system and environment-variable proxies.
- Packaging: Linux packages no longer link WebKitGTK 4.1; rendering dependencies ship as a separate gpu-stack archive installed on demand (the installer only adds libraries the host is missing, with --dry-run/--uninstall support). The HTML preview webview is off by default on all platforms while "Open in browser" and "Download HTML" keep working.
- Personal sync gains a WebDAV backend next to "Folder" and "Git": enter the server URL, user name and password and it works, with the password sealed to disk rather than stored in the clear. The protocol uses only GET / PUT / DELETE plus Basic auth and never probes with PROPFIND, so it fits Jianguoyun, Synology, Nextcloud and self-hosted servers; a collection is created with MKCOL before the first write, and a 409 is reported as "directory unavailable" instead of a bogus version conflict. The settings page shows only the items of the selected backend, the password field can be revealed, and since WebDAV has no local directory to watch, 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; it applies to newly opened terminal sessions.
- The table structure designer gains "Refresh table structure", which reloads the latest columns, indexes and table info; with unsaved edits it warns first 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. Large paste is a hard threshold and offers no "don't ask again".
- External drivers 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 advanced connection settings gain a "Request timeout (seconds)" field (empty follows the category defaults, 0 means unlimited), so large queries and imports on slow databases are no longer cut off by a single 30-second cap.
- 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, making it clear which step is still running; the other button is only disabled and does not spin.
- Fixed the crash when typing Chinese into the WHERE / ORDER BY filters (#326) and the filter-bar inputs sitting one line taller than before the migration (40px → 20px); fixed an AI chat turn being marked as failed after cancelling a reply, and stale column comments after editing them on dialects such as Dameng.
- Fixed every in-app quit ending in SIGABRT with a core file on Linux (Arch + Hyprland / Wayland, #336); the macOS Touch Bar crash on window close is closed out by upstream zed#65186, so the "hide on close" experiment switch is gone and both macOS architectures, Windows and Linux are back to destroying on close.
## Start here
@@ -40,6 +40,8 @@ Schema 过滤可自动隐藏系统对象、仅包含指定 Schema、排除指定
连接建立后,先浏览数据库与 Schema,再打开只读查询确认默认上下文。需要修改连接时先关闭依赖它的 SQL 编辑器、表数据页和比较任务,避免活动会话仍使用旧参数。
外部驱动(走 IPC 的驱动)的请求超时按调用类别区分:查询、执行、游标、导入导出等用户操作默认 30 分钟,元数据与结构浏览类保持 30 秒。连接的高级设置里可填「请求超时(秒)」按连接覆盖类别默认值——留空跟随默认,填 0 表示不限制;慢库上的大查询或大导入可据此放宽,不必再担心被统一的 30 秒硬超时打断。
## 通用字段说明
| 字段 | 常见值 | 什么时候需要特别确认 |
+2
View File
@@ -14,6 +14,8 @@
表设计器用于新建或修改列、索引以及数据库支持的引擎、字符集和排序规则。修改字段类型、长度、可空性或默认值前,评估已有数据能否转换;新增唯一索引前先检查重复数据。
表设计器提供「刷新表结构」,用于重新读取最新的列、索引与表信息。设计器里有未保存改动时会先提示「刷新会放弃当前设计器中未保存的更改」,确认后选择「放弃并刷新」。多人协作或外部工具改过结构后,刷新往往比关闭重开更快。
切换到 SQL/DDL 预览查看生成语句。Navop 会识别 DROP 等破坏性 SQL 并要求在预览页确认,但风险检测不能理解全部业务影响。复杂迁移应拆分步骤,在测试库验证,并准备回滚或恢复方案。
## ER 图与关系理解
+2
View File
@@ -10,6 +10,8 @@ SSH 连接可使用密码、私钥文件、私钥内容、SSH Agent 或默认 `~
SSH 连接的高级设置中提供「允许旧版 SSH 算法」兼容选项(默认关闭),仅当服务器只支持 DSA 主机密钥、SHA-1 密钥交换/MAC 或 1024 位 DH 组协商等旧算法时才按连接启用;Windows 上还可使用 Pageant 认证。启用兼容选项会降低加密强度,不要对可升级的服务器长期开启。
凭据中的私钥可以勾选「通过 ssh-agent 转发此密钥」,连接的高级设置里另有「SSH Agent 转发」(ForwardAgent)开关。开启后本地 ssh-agent 会转发给远端,远端主机(例如跳板机)可以代表你使用本机私钥继续向更内层主机认证;该设置对新打开的终端会话生效,已连接的会话需要重新连接。
本地 Terminal profile 可选择系统默认 Shell、PowerShell、CMD、WSL、Git Bash 或自定义程序;打开终端时可以直接选择当前会话使用的 Profile,列表会按本机平台隐藏不可用选项。自定义程序及参数应使用可信可执行文件,不要把密码直接放在命令参数中。系统请求本地网络权限时,仅按实际 SSH 目标范围授权。
终端 AI 侧边栏同时支持 SSH 与本地终端,并把当前终端作为默认资源上下文。生成命令前仍要核对当前 Shell、操作系统、主机和目录;本地 PowerShell、自定义程序与远程 Linux Shell 的语法不能互换。
@@ -14,6 +14,8 @@ Navop 支持个人同步与团队连接共享。官网用于 OTP 登录、团队
个人同步用于在自己的设备间同步连接配置。新设备登录后仍需要正确主密钥才能解密。不要把主密钥发到聊天、邮件或团队 Notes,也不要与账户密码混用。
个人同步的后端可在「文件夹」「Git」与「WebDAV」之间选择:文件夹与 Git 需要本地目录或仓库,WebDAV 只需填写服务器地址、用户名和密码,密码加密后落盘、不明文保存,适合坚果云、群晖、Nextcloud 等常见服务与自建服务器。WebDAV 没有本地目录可以监听,同步由 60 秒周期扫描驱动;首次写入前会在服务器上创建同步目录,如果服务端返回「目录不可用」,请先在服务器上建好目录或检查写权限,而不是反复重试。设置页只显示当前后端相关的项。
首页会把个人密钥与团队密钥分组展示,创建或打开连接前先确认当前使用的是哪一类密钥。团队密钥只适用于被授权的共享连接,不会替代个人同步的主密钥。
## 同步冲突
+9 -9
View File
@@ -2,18 +2,18 @@
Navop 是 AI 时代的开发和运维工作台,将数据库、Redis、MongoDB、SSH、SFTP、终端、远程桌面、Notes、AI 和团队同步放在同一个原生工作区。
## 当前版本:v0.19.1
## 当前版本:v0.19.5
前往[官网下载中心](https://navop.dev/zh-CN/extensions)下载最新稳定版。
- 修复 Windows 下终端频繁卡顿的问题(git bash、PowerShell,操作后切换界面即卡、过会才恢复):存在高亮/搜索等装饰时只重建发生变化的行,自定义高亮规则只重扫本帧变化的行,本地终端悬停检测目录条目的同步读盘移到后台线程。
- 表格数据支持查找:浏览表数据时按 Cmd/Ctrl+F 打开查找面板,命中单元格高亮描边,Cmd/Ctrl+G / Cmd/Ctrl+Shift+G 在命中间跳转并把所在列横向滚入视口,换页/刷新后按当前词重扫;表数据预览支持字段过滤隐藏列,宽表只看关心的列。
- SQL 编辑器对象详情体验重做:悬停弹详情默认关闭(设置里可开,开启后须停驻 600ms 才显示),改由右键菜单「查看对象详情」打开独立弹窗,内容可选中复制;右键新增「复制 DDL」,选中表名右键也能解析。
- 新增关闭当前页签快捷键 Cmd/Ctrl+Shift+W,可在设置里改绑;连接表单「工作区」字段统一改称「分组」。
- 修复 SSH MFA 登录把保存的密码当作验证码应答导致认证失败的问题;修复老设备(华为 VRP 系等)SSH 连接报 `` `mpint` encoding invalid `` 失败的问题。
- 数据库连接健壮性:复用前 ping 10 秒上限、超时判死并丢弃会话,断开 5 秒上限、超时强制回收,MySQL/PostgreSQL 连接启用 30 秒 TCP keepalive,长时间挂机后的死连接不再永久挂起;修复断连杀死的手工事务卡在死循环。
- 修复 SQLite WITHOUT ROWID 表、视图预览整页空白,PostgreSQL 序列目录一直为空,MCP 客户端配置写入已废弃参数;默认 HTTP 客户端改为跟随系统代理与环境变量代理。
- 打包:Linux 发布包不再链接 WebKitGTK 4.1,渲染依赖独立成 gpu-stack 包按需安装(安装脚本只补宿主缺失的库,支持 --dry-run/--uninstall);HTML 预览 webview 改为全平台默认关闭,弹窗降级提示「用浏览器打开」「下载 HTML」不受影响。
- 个人同步新增 WebDAV 后端:与「文件夹」「Git」并列,填服务器地址、用户名、密码即可用,密码加密后落盘、不明文保存。协议只用 GET / PUT / DELETE 加 Basic 认证,不做 PROPFIND 探测,以兼容坚果云、群晖、Nextcloud 与自建服务;首次写入用 MKCOL 建目录,服务端返回 409 会提示「目录不可用」而不是误报版本冲突。设置页只显示当前后端的项,密码框可切换明文/掩码,WebDAV 没有本地目录可监听,同步由 60 秒周期扫描驱动。
- SSH Agent 转发:凭据里的私钥可勾选「通过 ssh-agent 转发此密钥」,连接侧也有「SSH Agent 转发」(ForwardAgent)开关。本地 ssh-agent 转发给远端后,远端(例如跳板机)能代表你用本机私钥向更内层主机认证,对新开的终端会话生效。
- 表结构设计页新增「刷新表结构」:重新读取最新的列、索引与表信息;设计器里有未保存改动时会先提示,确认后「放弃并刷新」。
- 终端粘贴确认弹窗补上「打开设置」与「不再提示」:多行粘贴、高危命令、大段粘贴三类提示都能直接跳到对应设置项;大段粘贴是硬阈值,不提供「不再提示」。
- 外部驱动改为按调用类别区分请求超时,并支持连接级覆盖:查询、执行、游标、导入导出等用户操作默认 30 分钟,元数据与结构浏览保持 30 秒;连接高级设置新增「请求超时(秒)」(留空按类别默认,0 表示不限制),慢库上的大查询、大导入不再被统一的 30 秒硬超时打断。
- SQL 编辑器手动事务的提交/回滚按钮、表数据页的「提交更改」在写库期间显示 loading,能看出哪一步还在跑,另一个按钮只禁用、不跟着转。
- 修复 WHERE / ORDER BY 过滤输入框里输入中文导致崩溃(#326),过滤条输入框比迁移前高出一行的问题也已修正(40px → 20px);修复 AI 对话取消回答后会话被误判为失败、达梦等方言改完列注释仍显示旧注释。
- 修复 Linux(Arch + Hyprland / Wayland)应用内退出以 SIGABRT 收尾并留下 core(#336);macOS Touch Bar 机型关闭窗口闪退交由上游 zed#65186 修复,撤销「关闭即隐藏」实验开关,macOS 两个架构、Windows、Linux 统一回到「关闭即销毁」。
## 从这里开始
@@ -33,3 +33,5 @@ SSH 通道可引用已儲存的 SSH/SFTP 連線,或手動設定跳板機;支
可自動隱藏系統物件、只包含指定 Schema、排除指定 Schema 或顯示全部。過濾只影響導覽,不改變帳號權限。物件不可見時同時檢查目前資料庫、Schema、大小寫、權限與過濾規則。
修改連線參數前先關閉依賴它的編輯器、資料頁與比較工作,避免活動工作階段仍使用舊設定。
外部驅動(走 IPC 的驅動)的請求逾時依呼叫類別區分:查詢、執行、游標、匯入匯出等使用者操作預設 30 分鐘,中繼資料與結構瀏覽維持 30 秒。連線的進階設定可填「請求逾時(秒)」依連線覆寫類別預設值——留空依預設,填 0 表示不限制;慢庫上的大查詢或大匯入可據此放寬,不必再擔心被統一的 30 秒硬逾時打斷。
@@ -12,6 +12,8 @@
新增或修改欄位、索引,以及支援的引擎、字元集和排序規則。縮小類型或改變可空性前確認既有資料可轉換;建立唯一索引前先清除重複資料。
表設計器提供「重新整理表結構」,重新讀取最新欄位、索引與資料表資訊。設計器中有未儲存變更時會先提示「重新整理會放棄目前設計器中未儲存的變更」,確認後選擇「放棄並重新整理」。多人協作或外部工具改過結構後,重新整理通常比關閉重開更快。
切換 SQL/DDL 預覽檢查產生語句。Navop 會提示 DROP 等破壞性操作,但無法理解所有業務影響。遷移應先在測試庫驗證並準備回復或還原方案。
## 建立 ER 圖
@@ -8,6 +8,8 @@ SSH 支援密碼、私鑰檔、私鑰內容、SSH Agent 和預設 `~/.ssh`;互
SSH 連線的進階設定提供「允許舊版 SSH 演算法」相容選項(預設關閉),僅當伺服器只支援 DSA 主機金鑰、SHA-1 金鑰交換/MAC 或 1024 位元 DH 組協商等舊演算法時才按連線啟用;Windows 上還可使用 Pageant 驗證。啟用相容選項會降低加密強度,不要對可升級的伺服器長期開啟。
憑證中的私鑰可勾選「透過 ssh-agent 轉送此密鑰」,連線的進階設定也有「SSH Agent 轉送」(ForwardAgent)開關。開啟後本機 ssh-agent 會轉送給遠端,遠端主機(例如跳板機)能代表你以本機私鑰向更內層主機認證;該設定對新開啟的終端工作階段生效,已連線的工作階段需重新連線。
本機 profile 可選系統 Shell、PowerShell、CMD、WSL、Git Bash 或自訂程式;開啟終端時可直接選擇目前工作階段使用的 Profile,並會隱藏本機平台不可用的選項。自訂可執行檔必須可信,不要把密碼放在命令參數。
終端 AI 側邊欄同時支援 SSH 與本機終端,並把目前終端作為預設資源上下文。執行產生的命令前仍要核對 Shell、作業系統、主機與目錄;本機 PowerShell、自訂程式和遠端 Linux Shell 的語法不能混用。
@@ -14,6 +14,8 @@ Navop 支援個人同步和團隊共享連線設定。官網負責 OTP 登入、
使用安全離線方式備份,不要透過聊天、電子郵件或共享 Notes 傳送,也不要與帳戶密碼共用。首頁會分開顯示個人密鑰與團隊密鑰,建立或開啟連線前先確認使用的密鑰類型;團隊密鑰只適用於獲授權的共享連線。
個人同步的後端可選「資料夾」「Git」或「WebDAV」:資料夾與 Git 需要本機目錄或儲存庫,WebDAV 只需填伺服器位址、使用者名稱和密碼,密碼加密後落盤、不以明文保存,適合堅果雲、群暉、Nextcloud 等常見服務與自建伺服器。WebDAV 沒有本機目錄可監聽,同步由 60 秒週期掃描驅動;首次寫入前會在伺服器上建立同步目錄,若伺服器回報目錄不可用,請先建立目錄或檢查寫入權限,而不是反覆重試。設定頁只顯示目前後端相關的項目。
## 同步衝突
兩側同時修改,或一側刪除而另一側修改時會出現衝突。選擇本機或遠端前比較裝置、時間、目標和欄位,必要時手動保留兩個版本。
+9 -9
View File
@@ -2,18 +2,18 @@
Navop 是 AI 時代的開發和運維工作台,將資料庫、Redis、MongoDB、SSH、SFTP、終端、遠端桌面、Notes、AI 和團隊同步放在同一個原生工作區。
## 目前版本:v0.19.1
## 目前版本:v0.19.5
前往[官網下載中心](https://navop.dev/zh-TW/extensions)下載最新穩定版。
- 修復 Windows 下終端頻繁卡頓的問題(git bash、PowerShell,操作後切換介面即卡、過會才恢復):存在高亮/搜尋等裝飾時只重建發生變化的行,自訂高亮規則只重掃本幀變化的行,本機終端懸停偵測目錄項目的同步讀盤移到背景執行緒。
- 表格資料支援查找:瀏覽表資料時按 Cmd/Ctrl+F 開啟查找面板,命中儲存格高亮描邊,Cmd/Ctrl+G / Cmd/Ctrl+Shift+G 在命中間跳轉並把所在列橫向滾入視埠,換頁/重新整理後按當前詞重掃;表資料預覽支援欄位過濾隱藏列,寬表只看關心的列。
- SQL 編輯器物件詳情體驗重做:懸停彈詳情預設關閉(設定里可開,開啟後須停駐 600ms 才顯示),改由右鍵選單「查看物件詳情」開啟獨立視窗,內容可選取複製;右鍵新增「複製 DDL」,選取表名右鍵也能解析。
- 新增關閉當前頁籤快捷鍵 Cmd/Ctrl+Shift+W,可在設定里改綁;連線表單「工作區」欄位統一改稱「分組」。
- 修復 SSH MFA 登入把儲存的密碼當作驗證碼應答導致認證失敗的問題;修復老裝置(華為 VRP 系等)SSH 連線報 `` `mpint` encoding invalid `` 失敗的問題。
- 資料庫連線健壯性:複用前 ping 10 秒上限、超時判死並丟棄會話,斷開 5 秒上限、超時強制回收,MySQL/PostgreSQL 連線啟用 30 秒 TCP keepalive,長時間掛機後的死連線不再永久掛起;修復斷連殺死的手動交易卡在死循環。
- 修復 SQLite WITHOUT ROWID 表、視圖預覽整頁空白,PostgreSQL 序列目錄一直為空,MCP 客戶端設定寫入已廢棄參數;預設 HTTP 客戶端改為跟隨系統代理與環境變數代理。
- 打包:Linux 發佈包不再連結 WebKitGTK 4.1,渲染相依獨立成 gpu-stack 包按需安裝(安裝指令碼只補主機缺少的程式库,支援 --dry-run/--uninstall);HTML 預覽 webview 改為全平台預設關閉,視窗降級提示「用瀏覽器開啟」「下載 HTML」不受影響。
- 個人同步新增 WebDAV 後端:與「資料夾」「Git」並列,填伺服器位址、使用者名稱、密碼即可用,密碼加密後落盤、不以明文保存。協定只用 GET / PUT / DELETE 加 Basic 認證,不做 PROPFIND 探測,以相容堅果雲、群暉、Nextcloud 與自建服務;首次寫入用 MKCOL 建立目錄,伺服器回傳 409 會提示「目錄不可用」而非誤報版本衝突。設定頁只顯示目前後端的項目,密碼框可切換明文/遮罩,WebDAV 沒有本機目錄可監聽,同步由 60 秒週期掃描驅動。
- SSH Agent 轉送:憑證中的私鑰可勾選「透過 ssh-agent 轉送此密鑰」,連線側也有「SSH Agent 轉送」(ForwardAgent)開關。本機 ssh-agent 轉送給遠端後,遠端(例如跳板機)能代表你以本機私鑰向更內層主機認證,對新開啟的終端工作階段生效。
- 表結構設計頁新增「重新整理表結構」:重新讀取最新欄位、索引與資料表資訊;設計器中有未儲存變更時會先提示,確認後「放棄並重新整理」。
- 終端貼上確認視窗補上「開啟設定」與「不再提示」:多行貼上、高危命令、大段貼上三類提示都能直接跳到對應設定項;大段貼上是硬閾值,不提供「不再提示」。
- 外部驅動改為依呼叫類別區分請求逾時,並支援連線層級覆寫:查詢、執行、游標、匯入匯出等使用者操作預設 30 分鐘,中繼資料與結構瀏覽維持 30 秒;連線進階設定新增「請求逾時(秒)」(留空依類別預設,0 表示不限制),慢庫上的大查詢、大匯入不再被統一的 30 秒硬逾時打斷。
- SQL 編輯器手動交易的提交/回復按鈕、表資料頁的「提交變更」在寫入期間顯示 loading,能看出哪一步還在跑,另一個按鈕只停用、不跟著轉。
- 修復 WHERE / ORDER BY 過濾輸入框輸入中文導致崩潰(#326),過濾列輸入框比遷移前高出一行的問題也已修正(40px → 20px);修復 AI 對話取消回答後工作階段被誤判為失敗、達夢等方言改完欄位註解仍顯示舊註解。
- 修復 Linux(Arch + Hyprland / Wayland)應用內退出以 SIGABRT 收尾並留下 core(#336);macOS Touch Bar 機型關閉視窗閃退交由上游 zed#65186 修復,撤銷「關閉即隱藏」實驗開關,macOS 兩個架構、Windows、Linux 統一回到「關閉即銷毀」。
## 從這裡開始
-129
View File
@@ -1082,135 +1082,6 @@ test("R2 uploads are single-dispatch, revalidated, and verified after overwrite"
assert.doesNotMatch(upload, /max-age=31536000, immutable/);
});
test("R2 keeps only the release it just uploaded", () => {
const upload = read(".github/workflows/upload-r2.yml");
// 清理必须排在上传与逐对象校验之后,而且不能总是执行:上传失败时一个对象
// 都不能删,否则桶里可能新旧两份都不完整。
assert.ok(
upload.indexOf("Prune older R2 releases") >
upload.indexOf("Upload update archives and manifest to R2"),
);
const pruneStep = workflowStep(upload, "Prune older R2 releases");
assert.doesNotMatch(pruneStep, /always\(\)/);
assert.doesNotMatch(pruneStep, /continue-on-error/);
assert.match(
pruneStep,
/if: \$\{\{ steps\.r2_config\.outputs\.skip != 'true' && steps\.release\.outputs\.skip != 'true' \}\}/,
);
// 只动 releases/<tag>/:updates/latest.json 是更新入口,任何时候都不能删。
assert.match(pruneStep, /prefix="releases"/);
assert.doesNotMatch(pruneStep, /updates\//);
// 只有稳定版本号才清理,预发布不能把上一个稳定版本的安装包带走。
assert.match(pruneStep, /=\~ \^v\[0-9\]\+\\\.\[0-9\]\+\\\.\[0-9\]\+\$ \]\]/);
assert.match(pruneStep, /Skipping R2 prune for non-stable release tag/);
const pruneRun = pruneStep
.match(/run: \|\n([\s\S]*)/)?.[1]
.split("\n")
.map((line) => line.replace(/^ {10}/, ""))
.join("\n");
assert.ok(pruneRun, "prune step must have a run script");
const fixtureDir = fs.mkdtempSync(path.join(os.tmpdir(), "navop-r2-prune-"));
const statePath = path.join(fixtureDir, "bucket");
const deletedPath = path.join(fixtureDir, "deleted");
const fakeAws = path.join(fixtureDir, "aws");
// 假 aws 只实现这一步用到的两条命令:列出版本前缀、递归删掉一个前缀。删除
// 会真的从 fixture 里拿掉版本,所以脚本最后的复查也一起被验证到。
fs.writeFileSync(
fakeAws,
`#!/usr/bin/env bash
set -euo pipefail
case "\${1:-} \${2:-}" in
"s3api list-objects-v2")
grep -v '^$' "\${FAKE_R2_STATE}" | while read -r tag; do
printf 'releases/%s/\\n' "\$tag"
done
;;
"s3 rm")
target=""
for argument in "\$@"; do
case "\$argument" in s3://*) target="\$argument" ;; esac
done
key="\${target#s3://*/}"
key="\${key%/}"
echo "\$key" >> "\${FAKE_R2_DELETED}"
grep -Fxv "\${key#releases/}" "\${FAKE_R2_STATE}" > "\${FAKE_R2_STATE}.tmp"
mv "\${FAKE_R2_STATE}.tmp" "\${FAKE_R2_STATE}"
;;
*)
echo "unexpected aws invocation: \$*" >&2
exit 42
;;
esac
`,
{ mode: 0o755 },
);
const runPrune = (tags, releaseTag = "v0.19.5") => {
fs.writeFileSync(statePath, `${tags.join("\n")}\n`);
fs.writeFileSync(deletedPath, "");
const result = spawnSync("bash", ["-c", pruneRun], {
encoding: "utf8",
env: {
...process.env,
PATH: `${fixtureDir}:${process.env.PATH}`,
FAKE_R2_STATE: statePath,
FAKE_R2_DELETED: deletedPath,
CLOUDFLARE_ACCOUNT_ID: "test-account",
CLOUDFLARE_R2_BUCKET: "test-bucket",
RELEASE_TAG: releaseTag,
},
});
return {
result,
remaining: fs
.readFileSync(statePath, "utf8")
.trim()
.split("\n")
.filter(Boolean),
deleted: fs
.readFileSync(deletedPath, "utf8")
.trim()
.split("\n")
.filter(Boolean)
.sort(),
};
};
try {
const pruned = runPrune(["v0.19.5", "v0.19.4", "v0.19.3"]);
assert.equal(pruned.result.status, 0, pruned.result.stderr);
assert.deepEqual(pruned.remaining, ["v0.19.5"]);
assert.deepEqual(pruned.deleted, [
"releases/v0.19.3",
"releases/v0.19.4",
]);
assert.match(pruned.result.stdout, /R2 now keeps only releases\/v0\.19\.5\//);
// 本次 tag 不在桶里(上传其实没成功)时,一个旧版本都不能删。
const missing = runPrune(["v0.19.4", "v0.19.3"]);
assert.notEqual(missing.result.status, 0);
assert.match(missing.result.stdout, /Refusing to prune/);
assert.deepEqual(missing.deleted, []);
assert.deepEqual(missing.remaining, ["v0.19.4", "v0.19.3"]);
// 预发布不清理,既有稳定版本原样保留。
const prerelease = runPrune(["v0.19.5", "v0.19.4"], "v0.20.0-rc.1");
assert.equal(prerelease.result.status, 0, prerelease.result.stderr);
assert.deepEqual(prerelease.deleted, []);
assert.deepEqual(prerelease.remaining, ["v0.19.5", "v0.19.4"]);
assert.match(
prerelease.result.stdout,
/Skipping R2 prune for non-stable release tag/,
);
} finally {
fs.rmSync(fixtureDir, { recursive: true, force: true });
}
});
test("CNB release synchronization replaces moved tags before syncing assets", () => {
const sync = read(".github/workflows/sync-cnb-release-assets.yml");