terminalkeeper

给 AI 用的持久终端:tmux 常驻会话 + DSH 面板 + 审计链 + 引用库

View the Project on GitHub Mrtime-gege/terminalkeeper

使用指南

层级:用户指南 适用:0.1.x(具体变化见 CHANGELOG) 权威性:使用流程的唯一来源;参数细节见《工具与参数》

从安装到日常操作:面板、工具、引用库、宏、工作区、审计、键位与已知限制。

目录

↑ 回到顶部

1. 使用细节

参数的权威定义见 工具与参数。 本文只讲「怎么用、要注意什么」,不复述实现。

1. 它是什么

一个 DSH 插件:私有 tmux 服务端持有若干持久 shell,关页面 / 换对话 / 热重载 / 重启 DSH 都不丢; 另有 7 个模型工具、一个真终端面板、一条可检测篡改的审计链、一个只能由人写入的引用库(vault)。

2. 安装、升级、卸载

npx -y terminalkeeper install [--profile web]   # 登记进 profile、装依赖、检查 tmux
npx -y terminalkeeper doctor                    # 体检
npx -y terminalkeeper uninstall                 # 反向移除(数据保留)

3. 配置

两种入口:设置页(面板 ⚙,7 个分区)与 cordis.patch.yml 的 config。设置页写入的覆盖值优先。 分区:功能开关 / 终端与会话 / 界面与外观 / 面板与显示 / 审计与留痕 / 安全 / 服务端与集成。

常用项与默认值:

键 默认 说明
shell / shellArgs bash / [] 新会话用的 shell 与参数(写进 tmux 服务端配置,改了要重启)
cols / rows 120 / 32 新会话尺寸(范围 20–1000 × 5–500)
historyLimit 100000 每会话保留的历史行数(改了要重启)
maxSessions 8 全局存活上限(1–64);超出后新建整批拒绝
idleClose / idleCloseMinutes false / 60 空闲自动回收总开关与兜底分钟数
guardDangerousCommands true 危险命令守卫(启发式,不是沙箱)
redactSecrets true 输出打码
audit / auditRetentionDays true / 30 审计链与保留期
captureOutput true 终端输出留痕(默认上限 64 MiB/会话)
replayCapture true 屏幕帧回放录制(占磁盘,可关)
panelPollMs 800 面板轮询节奏(有 SSE 推送时只作兜底)
allowedHosts [] 面板 HTTP 允许的额外 Host(默认只认回环)

清理执行二次确认:设置页的「立即执行」第一次点击只进入确认态,第二次才真正按策略删除/轮转文件;API 上对应 action:'apply', confirm:true。

安全项二次确认:guardDangerousCommands / audit / redactSecrets / auditDir / allowedHosts / shell / shellArgs 等影响安全边界的项,值变化时第一次保存会被拒绝(409 needConfirm),再保存一次即确认;auditDir 必须是绝对路径且不能含 ..。

立即生效 vs 重启:改尺寸、空闲、审计、开关、面板外观等下次调用/渲染即生效; shell / shellArgs / defaultTerminal / historyLimit / extendedKeys 写在 tmux 服务端配置里,必须重启 dsh 才重建服务端。

4. 面板(人这一侧)

右下角胶囊 >_ N 🔒:N 是会话数,🔒 表示当前锁着(点一下解锁即可直接打字)。

5. 工具(AI 这一侧)

插件不提供对话授权页面或按对话规则。是否能用写工具由 DSH 的沙箱模式决定:完全控制(danger-full-access)下直接可用;工作区/只读模式下改动类工具会被模式闸门拒绝。只读工具(shell_state / shell_read / shell_audit)始终可用。

所有工具共用 { tasks: [{ target, action, wait, output, safety }] } 结构:

工具 用途
shell_open 开持久 shell(label/cwd/cols/rows/idleMinutes/watch/from)
shell_run 跑命令:run(配 command)/ steps(短交互序列)/ retry
shell_send 像人一样输入:preKeys → text → keys(text 不自动回车)
shell_read 读屏幕/历史/增量;subscribe / unsubscribe 订阅新输出
shell_manage 生命周期与资源:rename/resize/respawn/close/reap/idle/snapshot(-list)/doctor/宏/工作区/vault-list
shell_state 看会话状态与归属(只读,扁平过滤参数)
shell_audit 读审计链(按 actor/source/days 过滤,可 export)

长任务的推荐流程(异步启动 → 期间读增量 → 事后取退出码):

// 1) 开
{ "tasks": [{ "action": { "kind": "open", "label": "build", "cwd": "/repo" } }] }
// 2) 异步启动(立即返回,返回里带 run=<id>)
{ "tasks": [{ "target": { "sessions": "dsh-ab12cd" },
              "action": { "kind": "run", "command": "make -j8" },
              "wait": { "kind": "none" } }] }
// 3) 期间读增量(不要读整屏)
{ "tasks": [{ "target": { "sessions": "dsh-ab12cd" },
              "action": { "kind": "read", "mode": "since" } }] }
// 4) 结束后取退出码(runId 绑定到第 2 步那次运行)
{ "tasks": [{ "target": { "sessions": "dsh-ab12cd" },
              "action": { "kind": "read" },
              "wait": { "kind": "exit", "runId": "ab12cd34", "timeoutMs": 180000 } }] }
// 5) 关
{ "tasks": [{ "target": { "sessions": "dsh-ab12cd" }, "action": { "kind": "close" } }] }

三个必须知道的坑:

  1. 命令里不要写 exit —— 它结束的是 shell 本身,退出码标记就永远不会出现;需要提前返回用子 shell ( … )。
  2. 含 / 的命令不会被包装(拿不到退出码标记):要退出码用 wait.kind="idle",或包一层 sh -c "…"。
  3. 同一 shell 在一次调用里重复出现 = 整次拒绝;多任务请拆成多次调用。

6. 引用库(vault)

只有人能写:面板「🔑 引用库」或 CLI;AI 没有写入入口,默认只看到键名。

先记住边界:引用库只防止敏感值直接进入模型上下文,不防拿到 shell 的 AI 主动读取。它适合降低“顺手把密码贴进对话”的风险,不是秘密隔离。

7. 宏(可复用的命令片段)

8. 工作区与快照

9. 审计与留痕

10. HTTP API(面板用的那套)

路由挂在 /plugins/shell/* 下,没有独立鉴权,防线是 DSH 的浏览器会话 + 本地围栏(Host 必须回环、拒绝跨站、写请求必须 Content-Type: application/json)。 被拒的请求会记进面板「闸门拒绝」。

路由一览(按用途):

11. 什么时候需要重启

情况 要做的事
面板页面、按钮之类的更新 刷新页面,或等面板自动热重载
插件后台逻辑更新 通常会自动热重载;没生效再重启 dsh web
升级插件版本 装完后重启一次 dsh web 最稳
改了启动方式、systemd scope 等服务配置 重启 dsh web
改了 shell/shellArgs/historyLimit/extendedKeys 重启(要重建 tmux 服务端)
面板提示「DSH 的代码比面板旧 / 面板比 DSH 旧」 重启 dsh web

12. 已知限制(不假装能挡)

↑ 回到目录

2. 键位

当前为固定绑定;自定义键位在规划中。焦点不在面板时,按键照常交给终端。

面板快捷键:

动作 默认键
新建 shell Ctrl+Shift+T
关闭当前 shell Ctrl+Shift+W
上一个 / 下一个 shell Ctrl+Shift+↑ / ↓
跳到第 N 个 shell Ctrl+Shift+1…9
会话选择器 Ctrl+Shift+P
详情 Ctrl+Shift+D
引用库 Ctrl+Shift+K
日志管理 Ctrl+Shift+L
锁定 / 解锁 Ctrl+Shift+M
重命名当前 shell F2
面板内搜索 Ctrl+F
关闭浮层 Esc

终端键位与 tmux 直通(^b 前缀等)不改动;完整三组键位表在面板「详情 → 键位帮助」。

↑ 回到目录

相关文档