故障排除
颜色档位、同步输出、Linux 沙箱、内存与 GC、会话恢复以及工具链版本的常见问题。
排查问题前先知道两个位置:
- 错误 / 崩溃日志:
~/.dsh/qialike.log(含[watchdog]、[row]等诊断行;超过阈值会轮转为.log.1)。 - harness home:
$DSH_HOME,默认~/.dsh(设置、凭据、会话与主题都在这里)。
tail -n 100 ~/.dsh/qialike.log颜色档位不对
症状:颜色发灰、卡片与页面同色、整体看起来像 256 色而不是你终端的原生 24 位。
原因:主题色是 hex,由 Ink/chalk 输出,而 chalk 从环境变量判断色深。Ubuntu 24.04 上的 GNOME Terminal / VTE 支持 24 位却不导出 COLORTERM,于是落到 256 色档。另外,COLORTERM=24bit 不会被识别为 24 位——只认精确的 truecolor。
处理:
export COLORTERM=truecolor # 标准信号# 或只对这一次运行:QIALIKE_COLOR=24bit qialike可以用 QIALIKE_COLOR=256 或 QIALIKE_COLOR=16 预览低色终端下的效果。
终端不支持同步输出
症状:输入卡片的边框 / 状态行从浮层里「透出来」,或在重绘时看到半绘制的帧、画面撕裂。
原因:qialike 每一帧都用终端的同步输出模式(ESC[?2026h … ESC[?2026l)括起来。一帧是整宽重绘(120×30 下约 5.5 KB),而 pty 会把超过约 4095 字节的写入拆成多次交给终端,没有这个模式时半绘制的帧会短暂可见。
多数不认识该模式的终端会直接忽略它。若某个终端处理不当:
QIALIKE_NO_SYNC=1 qialike这会改写普通帧。若画面看起来「卡死」但其实 agent 仍在工作,按任意键可立即强制重绘;内置看门狗也会自动两级强制重绘并在日志记 [watchdog] 行。
Linux 沙箱不可用(SANDBOX_UNAVAILABLE)
症状:应用启动正常、非 shell 工具可用,但每条 bash 都报 SANDBOX_UNAVAILABLE。
原因:受限 bash 优先经 bwrap(bubblewrap)运行并要求内核开启非特权 user namespace;没有 bubblewrap 时会落到 qialike 自带的 Landlock(需内核启用该 LSM,≥5.13)。两级都不可用时才会 fail-closed——这是设计,不是静默降级。
处理:
# 安装 bubblewrapsudo apt install bubblewrap # Debian / Ubuntusudo dnf install bubblewrap # Fedora / RHELsudo pacman -S bubblewrap # Arch
# 验证 user namespacecat /proc/sys/kernel/unprivileged_userns_clone # 期望 1装好后重开 qialike。若你确认环境无法满足,临时切到 danger-full-access 可以让 bash 运行,但会放弃文件隔离。详见 沙箱与权限。
内存占用与 GC 行为
症状:RSS 随使用缓慢上升并停在一个较高的平台,看起来「越来越高」。
原因:运行时是 Bun/JSC,不会及时把已释放页面还给系统。实测同一负载下 RSS 上升后趋于平台,这是 GC 策略,不是泄漏。
处理:
BUN_JSC_collectContinuously=1 qialike实测该变量让 RSS 不升反降,代价是 GC 更频繁。参考量级(整棵进程树、静置 12 秒):
| 场景 | 峰值 | 稳态 |
|---|---|---|
| 启动 hero | 约 250–290 MB | 约 170 MB |
| 超大会话 | 约 330–345 MB | 约 225 MB |
建议 ≥1 GB 内存;512 MB 可用但偏紧;低于 512 MB 不受支持。
会话恢复不符合预期
先确认三条语义:
- 裸执行
qialike永远开新会话(hero 首屏),从不自动续接。 qialike resume继续当前目录下最近使用过的会话(按最后活动时间)。qialike --resume <sessionId>恢复指定会话,优先级最高。
/sessions 与 resume 都只列当前工作目录的会话。如果你在别的目录运行,自然看不到原来的会话——用 --workspace 指回去,或先 cd 到那个目录:
qialike --workspace ~/proj resume若你希望每次启动都自动续接:
{ "resume_last": true}写入 ~/.dsh/qialike.json,或用 QIALIKE_RESUME_LAST=1。默认是 false。详见 快速开始。
复制与粘贴
qialike 不读终端自己的选择区:复制(拖选松开、Ctrl+Y)和粘贴(对话框里的 Shift + 右键)都走平台剪贴板工具。macOS 与 Windows 自带这些工具,Linux 不自带——所以 Linux 上「复制粘贴不生效」几乎都是没装工具,而不是 qialike 的缺陷。
Linux:先看会话类型,再装对应的工具
echo $XDG_SESSION_TYPE # wayland 或 x11# Waylandsudo apt install wl-clipboard # 提供 wl-copy / wl-paste
# X11sudo apt install xclip # 或 xselFedora / RHEL 把 apt 换成 dnf,Arch 换成 pacman -S。
两条容易踩的坑:
- Wayland 下只装
xclip不够。X11 工具读的是 X 的 selection,在 Wayland 会话里通常是空的,于是能复制、粘贴却提示clipboard is empty——必须装wl-clipboard。 - X11 下装了
wl-clipboard不影响。qialike 按wl-paste→xclip→xsel的顺序尝试,前一个失败会自动落到下一个,两边都装也没问题。
自测时别用裸 xclip -o:它默认读 PRIMARY(鼠标中键那个选择区),不是 Ctrl+V 用的剪贴板。要加 -selection clipboard:
wl-paste --no-newline # Waylandxclip -o -selection clipboard # X11上面这条命令输出刚复制的内容,就说明工具这一侧是通的。
症状与处理
| 症状 | 原因与处理 |
|---|---|
状态栏提示 clipboard unavailable — no clipboard tool found (install wl-clipboard, xclip or xsel) | 一个工具都没装。按上一节装。 |
状态栏提示 clipboard is empty | 工具装上了,但读到的选择区为空。Wayland 会话只装了 xclip 时最典型——补装 wl-clipboard。 |
拖选复制时状态栏有 Copied: …,粘到别的应用却没内容 | 当时没有任何工具可用,复制走了 OSC 52 回退,而你的终端不支持或未启用它。装上 wl-clipboard / xclip 即可走原生路径。 |
| 对话框里点右键没反应 | 这是刻意设计:普通右键太容易误触,不粘贴;用 Shift + 右键。 |
| 拖选没选中想要的文本 | TUI 开启了鼠标跟踪,终端不会自己处理拖选。起点落在消息列时随指针跨列继续选择;落在右侧 Steps 栏时只选该栏。 |
不装任何工具也能粘贴
终端自身的粘贴快捷键(macOS Cmd+V;Linux / Windows 终端通常是 Ctrl+Shift+V,个别为 Ctrl+V 或 Shift+Insert)走 bracketed paste——由终端自己读剪贴板,不经过上面这些工具。赶时间时这是最省事的路径;但它只解决「粘进来」,复制仍需工具或 OSC 52。
复制
- 拖选后松开即复制:写入的是框架高亮的原始单元格,不受终端自身选区影响。
Ctrl+Y:复制当前选区的键盘等价方式(某些终端会丢失松开事件,例如 macOS Terminal.app)。- 成功后状态栏短暂显示
Copied: <摘要>,内容长时附带字符数。进剪贴板的是完整内容,不截断。 - 写入顺序:macOS
pbcopy;Windowsclip;Linuxwl-copy→xclip -selection clipboard→xsel --clipboard --input;都不可用时回退 OSC 52(iTerm2 / Kitty / Alacritty / Windows Terminal 支持;macOS Terminal.app 不支持,故那里必须靠pbcopy)。
粘贴
- 粘贴内容先被清洗:转义序列与控制字节被剥离(剪贴板内容可能来自任意程序),单行输入框里的换行会折成空格,单次插入上限 4096 字符。成功后状态栏显示
pasted N chars。 - 读取剪贴板需要平台工具(仅
Shift+ 右键 这条路径):macOS 用系统自带的pbpaste,Windows 用powershell.exe,Linux 见上。 - 粘贴图片:把图片文件拖进输入框(终端会把其路径作为文本粘贴),或直接粘贴一个本地图片路径——qialike 会识别并读取该文件,以
[Image: 文件名]附件挂在输入框上,随消息作为图片内容块发出。
其他症状
| 症状 | 可能原因与处理 |
|---|---|
模型显示 not set | 没有激活的供应商(key 被删或供应商被隐藏)。用 /models 配置一个 key。 |
| 模型输出到长度上限且没有正文 | 发送任意消息继续,或用 Ctrl+T 调低推理档减少额度消耗。 |
| 审批对话框从不出现 | 沙箱能正常强制时,通常没有工具会请求审批。但执行器不提供内核隔离时,逐次 shell 审批会接管——此时对话框会出现,并在提示里说明该命令拥有你的完整用户权限。 |
| 仓库 overlay 导致启动被拒绝 | 仓库级 overlay 里可能含会 spawn 进程的行。运行 qialike plugin list 查看状态,或 qialike plugin trust-overlay 审阅后信任。 |
qialike web 拒绝启动 | 未安装 dsh CLI,或版本与本 qialike 内嵌的 harness 不一致;按提示安装匹配版本。 |
qialike: command not found(刚装完) | PATH 写进了 profile,但当前 shell 还没读到——source ~/.bashrc(zsh 用 ~/.zshrc)或重开终端。 |
Terminal too small — keys paused | 终端高度不足:此界面最小需要 14 行(宽 ≥110 列才显示右侧栏)。把窗口调高即可,按键会自动恢复。 |
EADDRINUSE | 端口被占。服务端冲突用 qialike web --port <n> 换端口;只在本机冲突则只改 SSH 映射即可(-L 8080:localhost:3080),服务端不必重启、token URL 也不变。 |
401 dsh web authentication required | 用了不带 token 的地址——用服务启动时打印的那条 URL,且别在 127.0.0.1 与 localhost 之间切换。 |
| 自动更新一直没来 | 要么这份二进制没人管(源码构建、手动解压的 zip 永远不会被替换;curl 安装器那份也只在 Linux / macOS 自动更新),要么 qialike-update.auto 是 false 或 "notify",要么设了 QIALIKE_DISABLE_AUTOUPDATE=1。Windows 上只有 npm 装的副本会自动更新。见 更新。 |
| 想知道有哪些请求离开本机、以及怎么关掉 | qialike 自身没有分析或遥测;harness 的遥测是反馈门控(FEEDBACK_ONLY),只有新的显式反馈才会释放一段有界会话前缀。用 DSH_TELEMETRY_MODE=DISABLED 关闭。见 配置 → 数据与责任。 |
下一步
- 配置 —— 全部环境变量
- 沙箱与权限 —— 三档模式与升权
- Windows 与 WSL —— 平台相关注意点