Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 40 additions & 4 deletions client/DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ client/
├── main.py # 顶层 argv -> subcommand dispatch(含 chat/run/script 主路径)
├── README.md # 使用说明与退出码约定
├── session.py # CLISessionState / ExecutionMode / SessionStatus
├── session_store.py # workspace 级 session snapshot 持久化与恢复
├── parser/
│ ├── command.py # 交互命令解析(/mode /approve ...)
│ └── kv.py # key=value 参数解析
Expand All @@ -114,9 +115,10 @@ client/
### 5.1 顶层命令树

```text
dare chat [options]
dare run --task "..."
dare script --file demo.txt
dare chat [--resume [session-id|latest]] [options]
dare run --task "..." [--resume [session-id|latest]]
dare script --file demo.txt [--resume [session-id|latest]]
dare sessions list

dare approvals list
dare approvals poll [--timeout-ms 30000]
Expand Down Expand Up @@ -147,6 +149,7 @@ dare doctor
6. `/tools list`、`/skills list`、`/config show`、`/model show`
7. `/interrupt`
8. `/help`、`/quit`
9. `/sessions list`

普通文本行视为任务输入。

Expand Down Expand Up @@ -177,6 +180,32 @@ dare doctor
2. `/approvals poll|grant|deny|revoke`
3. `/interrupt`

### 6.4 Session Snapshot And Resume

`client/` 需要把“单进程内 STM 连续性”提升为“跨进程可恢复”的 CLI contract。

第一版设计:

1. session snapshot 固定写到 `<workspace_dir>/.dare/sessions/<session-id>.json`
2. snapshot 至少包含:
- `schema_version`
- `session_id`
- `mode`
- `created_at`
- `updated_at`
- `workspace_dir`
- `messages`
3. `chat/run/script` 都支持 `--resume [session-id|latest]`
4. `--resume` 不带值时默认解析为 `latest`

恢复边界:

1. 会恢复:STM/history、`session_id`、`mode`
2. 不恢复:`pending_plan`、`pending_task_description`、`pending_runtime_approvals`、后台 task
3. 恢复后 `CLISessionState.status` 统一回到 `idle`

这样可以对齐 Claude/Codex CLI 的基础“继续上一次对话”体验,同时避免把 runtime checkpoint 语义混进 CLI session restore。

## 7. 配置模型与优先级

### 7.1 来源
Expand Down Expand Up @@ -215,6 +244,12 @@ CLI 层不自行定义“平行配置模型”,只对 `Config` 做覆盖合并
4. `3`:`doctor` 检查失败(环境或配置探测失败)
5. `130`:用户中断(Ctrl+C)

resume 相关错误保持落在退出码 `2`:

1. `--resume latest` 但没有任何 snapshot
2. `--resume <session-id>` 找不到目标文件
3. snapshot JSON 损坏或 `schema_version` 不兼容

### 8.3 宿主编排协议基线(planned)

> 本节记录 Issue #135 宿主编排协议的当前设计基线。
Expand Down Expand Up @@ -344,7 +379,8 @@ v1 设计选择:优先支持 `--control-stdin`,即 stdin 一行一个 JSON
2. 配置覆盖优先级。
3. action/control 响应解析。
4. session 状态机(plan/approve/reject/background)。
5. 输出渲染(human/json)。
5. session snapshot / `--resume` 选择与错误语义。
6. 输出渲染(human/json)。

### 10.2 集成测试

Expand Down
33 changes: 33 additions & 0 deletions client/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,17 @@
```bash
# 交互模式
.venv/bin/python -m client chat
# 恢复最近一次会话
.venv/bin/python -m client chat --resume
# 恢复指定会话
.venv/bin/python -m client chat --resume <session-id>
# 列出当前 workspace 可恢复会话
.venv/bin/python -m client sessions list

# 一次性执行
.venv/bin/python -m client run --task "读取 README 并总结"
# 在已有会话历史上继续执行一次任务
.venv/bin/python -m client run --resume latest --task "继续上一轮,补充测试计划"
# 一次性执行(审批等待超时,默认 120s)
.venv/bin/python -m client run --task "读取 README 并总结" --approval-timeout-seconds 120
# 一次性执行(自动审批指定工具,例如 run_command)
Expand All @@ -36,6 +44,8 @@
.venv/bin/python -m client script --file /abs/path/to/demo.txt
# 仓库内示例脚本
.venv/bin/python -m client chat --script client/examples/basic.script.txt
# 在已有会话上继续跑脚本
.venv/bin/python -m client script --resume latest --file /abs/path/to/demo.txt

# 审批控制
.venv/bin/python -m client approvals list
Expand All @@ -51,6 +61,29 @@
.venv/bin/python -m client doctor
```

## 会话持久化与 Resume

`client/` 现在支持基础的跨进程会话恢复:

1. 每个 workspace 会把 CLI session snapshot 写到 `<workspace>/.dare/sessions/<session-id>.json`。
2. `chat/run/script` 都支持 `--resume [session-id|latest]`。
3. `--resume` 不带值时等价于 `--resume latest`。
4. 恢复后会继续同一条对话历史,并复用原 `session_id`。
5. 可以通过 `sessions list` 查看当前 workspace 里有哪些 session 可恢复。

第一版明确 **只恢复可安全恢复的 CLI 状态**:

- 会恢复:消息历史(STM)、执行模式(`plan|execute`)、session id
- 不恢复:运行中的任务、待审批请求、pending plan preview

因此它对齐的是 Claude/Codex CLI 那类“继续上一条对话”的基础能力,而不是 runtime checkpoint 断点续跑。

常见错误语义:

- `--resume latest` 但当前 workspace 没有任何 session:退出码 `2`
- `--resume <session-id>` 找不到对应文件:退出码 `2`
- snapshot 文件损坏或 schema 不兼容:退出码 `2`

## 配置

### 配置文件位置与覆盖顺序
Expand Down
Loading
Loading