Skip to content

[Grok/dsh 58] 远程工作区连接与执行 #190

Closed

Description

@Blackman99

Parent

#132

Ticket: 58

Status: ready-for-agent

User Stories: 60, 61, 62(见父规格)

What to build

用户显式连接受信任的远程执行环境,通过同一 Rust 界面操作由 dsh 驱动的远端会话并处理断线。

Acceptance criteria

  • 公开远程连接/控制入口、目录及会话映射对应真实运行实例;验证一种明确配置的安全认证,不把本地文件当远端文件,组织身份集成另票。
  • 远端执行遵守其权限与沙箱能力,不能通过转发扩大本机或远机权限;凭据与附件发送明确。
  • 丢连接、远端重启、任务未知状态和重连不重复执行副作用,显示能力与实际一致。
  • 至少一个可部署替代服务端到端验证,必要远端部署费用需另行批准。

Blocked by

Delivery contract

用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。

Activity

  1. Blackman99 commented on Sep 25, 2026

    @Blackman99
    OwnerAuthor

    已实现并快进推送到 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)需要官方私有基础设施,继续明确拒绝。
    • 可部署替身的端到端验证:用本机无特权运行的真实 OpenSSH 10.0 sshd(密钥认证、回环端口,不需要任何付费服务或官方设施)。

    检查(干净环境、最终基线 14edaca)

    • cargo fmt --check 通过;pnpm typecheck 通过。
    • clippy -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_sandbox 2 个(基线就失败)、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 跳过。
    • PTY(Linux):新增的 rust-remote-pty-test.py 通过,覆盖审批卡片只改远端文件、ssh 中途被杀后 /reconnect 不重复执行(RAN 只出现一次)、leader 重启后报告效果未知且不重试。另外 remote、workflow、goal、plan、queue、background、scheduler 都通过;scheduler-restart 第一次在负载下 10 秒等待超时,重跑通过。
    • pnpm run build:rust 通过(只在本地暂存 release,没有上传、安装或发布)。

    未验证 / 限制

    • 没有第二台物理机器,远端是本机回环上的真实 sshd。
    • 没有在 macOS/Windows 上跑;只能在 macOS 上运行的 PTY 脚本也没跑。
    • 远端 sandbox 不是 off 的配置只会如实报告,没有做端到端验证。
    • 没有使用真实付费模型服务(用的是 mock LLM)。
    • 官方 Computer Hub、云工作区和 Cursor worker 仍然拒绝,inventory 里对应的行保持 pending-parity(没有改 inventory)。
    • 没有改 main、npm 发布和默认版本;没有编辑 PR test(reference): pin Grok provenance and compatibility inventory #213(它的 head 就是集成分支,会随推送自动更新)。

    #191 和 #207 的阻塞项已经全部关闭,可以开始。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions