Surface session working directory / context on `SessionMetadata` so persisted sessions can be resumed by id
- 主要语言
- Java
- 星标
- 10.5k
- 派生
- 1.5k
- 平均合并
- 1 天 14 小时
- 30 天内合并 PR
- 129
描述
## Summary
`Client::list_sessions` and `Client::get_session_metadata` return `SessionMetadata`, which today carries only:
```rust
pub struct SessionMetadata {
pub session_id: SessionId,
pub start_time: String,
pub modified_time: String,
pub summary: Option,
pub is_remote: bool,
}
```
There is no way to recover a persisted session's **working directory** (or its repository / git-root / branch context) from these calls. This makes it impossible to faithfully resume a session by id after the consuming process has restarted.
## Why this is a gap
`ResumeSessionConfig` asks the caller to supply the working directory:
```rust
pub struct ResumeSessionConfig {
pub session_id: SessionId,
pub working_directory: Option,
// ...
}
```
A consumer that persists only a `session_id` (the documented, stable handle for resume) and later wants to resume it has a chicken-and-egg problem: it needs the session's original working directory to resume correctly, but the SDK provides no way to look that up from the id. After a restart, the in-memory mapping from id to working directory is gone, and `list_sessions` / `get_session_metadata` don't return it.
## The data already appears to exist server-side
Two public-surface signals suggest the working directory / context is already tracked per session and just isn't surfaced on `SessionMetadata`:
1. `SessionListFilter` already lets callers **filter** `list_sessions` by `cwd`, `git_root`, `repository`, and `branch`:
```rust
pub struct SessionListFilter {
pub cwd: Option,
pub git_root: Option,
pub repository: Option,
pub branch: Option,
}
```
i.e. the server can match on these fields, but the returned metadata omits them — an asymmetry between what you can filter on and what you get back.
2. The experimental `session.metadata.snapshot` RPC (`SessionRpcMetadata::snapshot`) already returns `working_directory` plus a `workspace` summary (cwd / git_root / repository / branch / name), `selected_model`, and more — but only for an **active** (already-resumed) session, so it can't be used to discover where a dormant session should be resumed.
## Proposed change
Surface the session's working directory and context on the dormant-session metadata path, so it can be recovered by id without first resuming:
- Add the working directory (and ideally the `cwd` / `git_root` / `repository` / `branch` context, and the user-provided `name`) to `SessionMetadata`, returned by both `list_sessions` and `get_session_metadata`.
- All new fields optional / additive, so this is backward compatible for existing consumers.
This lets a consumer that persisted a `session_id` look up the session's working directory and resume it faithfully across restarts, and render accurate session lists (working directory, title) without having to resume each session first.
## Alternatives considered
- Persisting an id-to-working-directory map in the consumer. Works, but duplicates state the runtime already owns and can drift from the on-disk source of truth — hence this request to make the SDK the single source of truth.
贡献指南
调研方向
从 SessionMetadata 以及 list_sessions 和 get_session_metadata 入口点开始,然后将它们与 ResumeSessionConfig、SessionListFilter 和 SessionRpcMetadata::snapshot 进行比较。跟踪休眠会话元数据在哪里组装,以及现有上下文字段是如何表示的。完成标准是:两个元数据调用都返回可选的、附加性的工作目录和上下文字段,并支持通过 id 恢复持久化的会话。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- java, rust
- 领域
- api, backend-api-design
- Issue 类型
- 功能
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 52/100