✨ feat(vscode): 五种会话 id 行都能用橡皮擦清除本机记录,别的机器上的旧会话不再挡着新起

This commit is contained in:
cruldra committed 2026-09-24 19:29:39 +08:00
1 parent 4d905ff16e
commit d604b6f426
12 files changed
+169 -64

No files matched your search

+18 -13
View File
@@ -1,6 +1,7 @@
import type { IssueColumn } from '../../gitea/types'
import type { LockedReason } from '../issueLock'
import type { KanbanWebviewPanel } from '../KanbanPanel'
import type { SessionTabKind } from './terminals'
import { Buffer } from 'node:buffer'
import { randomUUID } from 'node:crypto'
import * as fs from 'node:fs'
@@ -39,6 +40,7 @@ import { pickRandomIssueColor, themeColorIdToIconUri } from '../issueColor'
import { evaluateLockedReason } from '../issueLock'
import { makeNonce } from '../KanbanPanel'
import { cleanupFeatureBranch } from './branchCleanup'
import { clearSessionConfirmText, clearSessionDoneText, SESSION_KINDS } from './sessionKinds'
import * as sessions from './sessions'
import { canResetToTodo, todoResetStateExtra, todoResetUiPatch } from './todoReset'
@@ -1971,17 +1973,20 @@ export async function handleUpdateProfilePath(panel: KanbanWebviewPanel, issueNu
}
/**
* 清掉工单记的头脑风暴会话 id,下次点 ▶ 续聊就新开一个会话。
* 清掉工单记的某种会话 id,之后该行可以新起一个会话。
*
* 用处:旧会话的历史被 `claude --resume` 原样带回来(里面可能还留着几个版本
* 之前的提示词和它报的错),想从干净的上下文重新聊需求时用。会话文件本身不动,
* 手上有 id 仍可用 `claude --resume <id>` 找回。
* 用处:会话 id 是别的机器上开的、本机没有会话文件,resume 不了又挡着新起;
* 或者旧会话历史太杂(头脑风暴里还留着几个版本之前的提示词和报错),想从干净
* 的上下文重来。只写本机记录('' 墓碑盖住共享值),别的机器不受影响;会话文件
* 本身不动,手上有 id 仍可 resume 找回。
*/
export async function handleClearBrainstormSession(panel: KanbanWebviewPanel, issueNumber: number): Promise<void> {
export async function handleClearSession(panel: KanbanWebviewPanel, issueNumber: number, kind: SessionTabKind): Promise<void> {
const { field, role } = SESSION_KINDS[kind]
let previousValue: string | undefined
try {
const existingState = await panel.readIssueState(issueNumber)
previousValue = typeof existingState.sessionId === 'string' ? existingState.sessionId : undefined
const value = existingState[field]
previousValue = typeof value === 'string' && value.length > 0 ? value : undefined
}
catch {
previousValue = undefined
@@ -1992,14 +1997,14 @@ export async function handleClearBrainstormSession(panel: KanbanWebviewPanel, is
type: 'toast/show',
id: makeNonce(),
level: 'info',
message: `工单 #${issueNumber} 本来就没有头脑风暴会话`,
message: `工单 #${issueNumber} 本来就没有${role}会话`,
dismissOnTimer: 4000,
})
return
}
const choice = await window.showWarningMessage(
`确定清除工单 #${issueNumber} 的头脑风暴会话 id(${previousValue})?下次续聊会新开一个会话,旧会话记录还在,可用 claude --resume 找回。`,
clearSessionConfirmText(issueNumber, kind, previousValue),
{ modal: true },
'清除',
)
@@ -2007,21 +2012,21 @@ export async function handleClearBrainstormSession(panel: KanbanWebviewPanel, is
return
try {
await panel.mergeIssueState(issueNumber, { sessionId: '' })
await panel.mergeIssueState(issueNumber, { [field]: '' })
}
catch (err) {
const message = err instanceof Error ? err.message : String(err)
logger.add({
level: 'error',
source: 'panel',
message: `清除 sessionId 失败 (issue #${issueNumber})`,
message: `清除 ${field} 失败 (issue #${issueNumber})`,
details: message,
})
panel.postMessage({
type: 'toast/show',
id: makeNonce(),
level: 'error',
message: `清除工单 #${issueNumber} 头脑风暴会话失败: ${message}`,
message: `清除工单 #${issueNumber} ${role}会话失败: ${message}`,
dismissOnTimer: 6000,
})
return
@@ -2030,13 +2035,13 @@ export async function handleClearBrainstormSession(panel: KanbanWebviewPanel, is
panel.postMessage({
type: 'issue/patch',
issueNumber,
patch: { sessionId: null },
patch: { [field]: null },
})
panel.postMessage({
type: 'toast/show',
id: makeNonce(),
level: 'success',
message: `工单 #${issueNumber} 头脑风暴会话已清除,下次续聊将新开会话`,
message: clearSessionDoneText(issueNumber, kind),
dismissOnTimer: 5000,
})
}