<!-- codsh-publication:grok-cli-dsh-rewrite:ticket-58 --> ## Parent https://github.com/Blackman99/codsh/issues/132 **Ticket:** 58 **Status:** ready-for-agent **User Stories:** 60, 61, 62(见父规格) ## What to build 用户显式连接受信任的远程执行环境,通过同一 Rust 界面操作由 dsh 驱动的远端会话并处理断线。 ## Acceptance criteria - [ ] 公开远程连接/控制入口、目录及会话映射对应真实运行实例;验证一种明确配置的安全认证,不把本地文件当远端文件,组织身份集成另票。 - [ ] 远端执行遵守其权限与沙箱能力,不能通过转发扩大本机或远机权限;凭据与附件发送明确。 - [ ] 丢连接、远端重启、任务未知状态和重连不重复执行副作用,显示能力与实际一致。 - [ ] 至少一个可部署替代服务端到端验证,必要远端部署费用需另行批准。 ## Blocked by - #148 — Ticket 16: 共享服务、多客户端与重连 ## Delivery contract 用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。
Activity
feat(rust): remote workspace over SSH with reattach and honest restar…
Blackman99 commentedon Sep 25, 2026
已实现并快进推送到
rewrite/grok-dsh-20260920:14edaca31e535b72bf4de67fc7ff2e16f2a5a532(快进范围6efa5ed..14edaca)。Rebase 说明:分支起点是
92cbe9b。开发期间 #184(ce09b16)、#178(338e9c7)、#205(6efa5ed)先后合入,所以依次 rebase 了三次。冲突都只在main.rs的大帮助字符串(加一行 Remote 说明)、acp.rs中相邻新增的函数、以及package.json的test:rust:pty链(在 scheduler-restart 之后追加 remote)。每次都在最终基线上重跑了下列检查。实现内容
codsh --rust --remote ssh://[user@]host[:port]/abs/path。ACP 子进程是 OpenSSH 客户端,在远端运行codsh --rust agent --leader stdio(可用--remote-command改)。会话和目录都是远端的:cwd 不在本地解析,也不把本地文件当成远端文件。--continue和--resume <id|前缀>走远端session/list和session/load,不读本地会话目录和 owner 租约。--remote-identity,IdentitiesOnly)加钉住的主机密钥(--remote-known-hosts,StrictHostKeyChecking=yes,BatchMode=yes,禁用全局 known_hosts 和 UpdateHostKeys)。没有密码或交互式认证。未知主机密钥和错误的密钥都会被拒。组织身份留给 [Grok/dsh 75] 组织身份连接远程工作区 #207。-T -a -x,不做 agent、X11 或端口转发,SendEnv=-*;ssh 子进程只拿到 PATH/HOME/USER/LOGNAME/SSH_AUTH_SOCK/LANG 这几个环境变量。远端自己的配置、凭据、权限策略和 sandbox 执行每一轮。下列本地策略类参数一律拒绝:--model/--effort/--permission-mode/--always-approve/--auto/--allow/--deny/--sandbox/--cwd/--worktree/--fork-session、规则和系统提示等。@file附件、图片、本地 rules/memory/MCP 都不发送,远端会话中只允许 /remote、/reconnect 和纯本地 UI 类斜杠命令,其余斜杠命令会给出明确理由后拒绝。/reconnect用session/load重新附着:如果那一轮仍在运行,就接收它的结果,不会再发一次;如果远端已重启,就报告"那一轮没有结果、外部效果未知、未重试",并从远端保存的历史恢复。_codsh/runtime_exited和_codsh/leader_disconnected同样按"效果未知、不重试"处理。/remote和codsh --rust remote check <url> [--json]从真实的 initialize 结果(codsh/server)报告远端版本、认证、权限模式、sandbox 和能否重新附着,并列出远端会话中不可用的功能。官方 Computer Hub、云工作区和 Cursor worker(workspace/cursor-worker/agent serve --remote)需要官方私有基础设施,继续明确拒绝。检查(干净环境、最终基线
14edaca)cargo fmt --check通过;pnpm typecheck通过。-D warnings:只有两处已存在的filesystem_sandbox(tail_marker未使用、needless_return)报错;加-A dead_code -A clippy::needless_return后无告警。cargo test --workspace --no-fail-fast:bin 612 通过、4 失败(含新增 6 个 remote 单元测试);其余 crate 498 + 42 + 61 + 2 + 379 + 61 全部通过,2 个 ignored。4 个失败都是已存在问题:filesystem_sandbox2 个(基线就失败)、privacy::drafts_stay_local…(stash 掉本改动后在基线上同样失败)、voice::substitute_route…(fixture 只读一次请求,时序偶发,单独重跑可通过;voice.rs 未改动)。pnpm test:96 个文件,2485 通过、1 跳过、1 失败。失败的是reference-evidence在负载下超时,用--testTimeout=60000单独重跑 11/11 通过。新增的scripts/rust-remote.spec.mjs(真实 sshd)4/4 通过。在最新 debug 构建上单独跑 remote、workflow、scheduler、plan 四个 spec:80 通过、1 跳过。rust-remote-pty-test.py通过,覆盖审批卡片只改远端文件、ssh 中途被杀后 /reconnect 不重复执行(RAN 只出现一次)、leader 重启后报告效果未知且不重试。另外 remote、workflow、goal、plan、queue、background、scheduler 都通过;scheduler-restart第一次在负载下 10 秒等待超时,重跑通过。pnpm run build:rust通过(只在本地暂存 release,没有上传、安装或发布)。未验证 / 限制
#191 和 #207 的阻塞项已经全部关闭,可以开始。