copilot --resume can't use the Copilot-Session commit trailer id (it's the cloud mc_session_id, not the local session id)
- 主要語言
- Shell
- 星號
- 11.2k
- 分支
- 1.9k
- 平均合併
- 14 小時 16 分鐘
- 30 天內合併 PR
- 6
描述
### Describe the bug
When Copilot CLI creates a git commit, it appends a `Copilot-Session: ` trailer to the commit message. That trailer value is the **cloud** session id (`mc_session_id`), but `copilot --resume ` only accepts the **local** session id (`id`). The two are different UUIDs for the same session, so anyone who takes the id from a commit (or from a PR that shows the trailer) and runs `copilot --resume ` fails to resume — even when the session is present locally under its local id. There is no user-facing mapping between the two ids, so the failure looks like "the session is gone" when it is not.
Concretely, a session run in `github/bosun` produced a commit whose trailer read `Copilot-Session: 127c5458-0152-411a-84f9-8f747e96ee55`. Running `copilot --resume 127c5458-0152-411a-84f9-8f747e96ee55` finds nothing: that id exists only in the cloud session store, not in the local `session-store.db` and with no local `session-state/` folder. The actual local, resumable session is `a795500d-0486-4d1c-8366-0cb5eac4e312`. The link between them is only discoverable inside the local `workspace.yaml`:
```yaml
id: a795500d-0486-4d1c-8366-0cb5eac4e312 # local id — what --resume accepts
mc_task_id: 23ce7957-5241-4990-802c-34d2a64db821 # cloud task id
mc_session_id: 127c5458-0152-411a-84f9-8f747e96ee55 # cloud id — what lands in the commit trailer
```
So the id the CLI writes into git history is not the id its own `--resume` command accepts, and nothing surfaces the correspondence to the user.
### Affected version
1.0.71-2 (also reproduced against sessions created by earlier versions on the same machine)
### Steps to reproduce the behavior
1. Start a session that has a cloud counterpart (e.g. a session with an `mc_session_id`, such as one launched from / synced with a cloud task) and let it create a git commit.
2. Inspect the commit message and copy the `Copilot-Session: ` trailer value.
3. Run `copilot --resume `.
4. Observe that the session cannot be resumed, even though the session still exists locally under a different id.
### Expected behavior
The id recorded in the `Copilot-Session` commit trailer should be resumable. Either:
- `copilot --resume ` should also match a session by its `mc_session_id` (and resolve to the corresponding local session), or
- the commit trailer should record the local `id` that `--resume` accepts, or
- when a lookup by cloud id fails, the CLI should tell the user the corresponding local id (or resume it directly).
### Additional context
Current workaround — map the trailer id back to the local, resumable id by grepping the `mc_session_id` field across local session state:
```bash
grep -rl "mc_session_id: " ~/.copilot/session-state/*/workspace.yaml
```
The folder name (and the `id:` field inside that `workspace.yaml`) is the id to pass to `copilot --resume`.
This is related to but distinct from #3671 (local changes after resuming a cloud agent session are not resumable) and #3689 (generic "can't resume session"). The core issue here is specifically that the CLI writes a non-resumable id into git commits with no surfaced mapping to the resumable local id.
貢獻指南
研究方向
從 `copilot --resume` 的查找邏輯以及寫入 `Copilot-Session` commit trailer 的程式碼開始。檢查 `session-store.db`、本機的 `session-state/*/workspace.yaml` 以及 `id`/`mc_session_id` 欄位,追蹤這兩個識別碼之間的關係。完成的標準是:從提交中複製的 id 能夠恢復相符的本機工作階段,或明確顯示其可恢復的 id,並且已驗證所報告的重現。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- git, shell
- 領域
- cli, developer-experience
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 48/100