Prompt file imported from aktsmm/Agent-Customization (
.github/prompts/cleanup-old-chat-sessions.prompt.md). Copyright stays with the author.
古いチャットセッションを安全に削除
現在の workspace に属するローカル VS Code チャットセッションから、保持期間を過ぎ、かつピン留めされていないものだけを削除する。セッションのアーカイブは削除と別操作なので、この prompt では実行しない。
引数と実行モード
- 保持日数は引数の正の整数を使い、省略時は
5日とする。 - 明示呼び出しで mode 省略時は apply を選ぶ。
--applyは互換 alias とする。mode 選択だけで削除承認済みとはみなさず、実操作は下記の着手時承認後に行う。 --dry-runがある場合だけ、候補と検証方法を報告して変更せず停止する。- apply でも read-only preflight は必須。承認は着手時の 1 回にまとめる。実行開始時に offline mode になり得ること(VS Code の close / restart、backup・quarantine 後の local DB 変更、cloud deletion は未確認)を提示して承認を取り、以降は mode 判定やフェーズ移行で再確認しない。
- 引数が曖昧、または
archiveを求めている場合は削除せず確認する。 - cutoff は apply 直前の時刻から保持日数を引き、
lastMessageDate <= cutoffを「古い」と判定する。
対象と正本
- 対象は現在の workspace に対応する
workspaceStorageのみ。VS Code が公開する user-data location を優先し、取得できない場合だけ platform の storage root 候補を列挙してworkspace.jsonの folder URI と現在の workspace を照合する。固定パスや別 workspace の storage を使わない。 - セッション一覧の正本は対象
state.vscdbのchat.ChatSessionStore.index。ファイルの更新日時を年齢判定に使わない。 - ピン留め状態の正本は同じ DB の
agentSessions.state.cache。vscode-chat-session://local/resource の base64 session ID を構造的に復元し、pinned: trueの ID を必ず除外する。cache の読取・JSON parse・resource 復元・schema 検証のいずれかに失敗した場合は pin 状態不明として削除を停止する。正常に全件解析できた空の pin set は許容する。 archived: trueはピン留めを意味せず、表示から隠す状態であって永続保護ではない。未ピン留めならアーカイブ済みセッションも候補になり得る。- 検索・要約用の session store は pin 状態や VS Code の削除実体の正本ではないため、候補判定や削除に使わない。
github.copilot.sessionSync.*は検索用 session store / cloud mapping の操作であり、local chat history 削除の代用にしない。
安全な判定
最初に read-only で次を集計し、apply では削除直前にも再計算する。
- workspace に属する local session ID、title、
lastMessageDate、isEmpty、hasPendingEdits - cutoff 以下の候補、pin により除外した ID、external session、現在アクティブな session、保留中編集の session
- active session は現在の Copilot chat session resource と、Chat editor で開いている session resource から exact ID を取得する。どちらかの取得可否が不明なら削除全体を停止する。
- 削除対象は「local」「古い」「未ピン留め」「非アクティブ」「保留中編集なし」の全条件を満たすものだけ
isEmptyは報告用の属性であり、年齢条件を免除しない。- 候補を
file-backed(.jsonl/.jsonの片方以上あり)とstale-index(両方なし)に分類する。片方だけある状態は不整合ではなく、実在する representation だけを扱う。
現在の会話と保留中編集の session は削除対象から除外する。pin 状態不明、候補 scope 不明、JSON/schema 破損がある場合は削除全体を停止する。apply では変更前に候補数、title 集約、除外件数、全 ID/title を含む候補 manifest をチャットに提示するが、そこで停止しない。
経路選択
- 全候補を GUI row と一意照合でき、visible GUI 操作が可能なら GUI mode を既定にする。
agentSession.deleteはcontext.sessionsで複数選択をまとめて削除できるため、件数だけを理由に offline mode へ倒さない。 - GUI の削除単位は、exact ID と全 row を一意照合できる選択集合(1件以上)とする。候補が多い場合は、pin / active / 保留中編集を挟まない日時連続ブロックへ分ける。各集合の全IDについて GUI mode の直前検証を行い、native confirmation の件数が集合の件数と一致する場合だけ確定する。
stale-indexは GUI row に現れない可能性があるため、GUI 削除後に index を再読して残存を確認し、残った場合だけ offline mode を提案する。- GUI の一意照合または操作が成立しない候補が1件でもある場合は offline mode を提案する。
- 候補
0件は no-op。--dry-runは選択予定の mode と、その理由も報告する。 - offline mode の影響は着手時の承認で提示済みとして扱い、mode 確定時に再確認せず進む。着手時の承認が得られていない場合だけ停止する。
GUI mode
- Agent Sessions の対象 row / selection から VS Code 標準の
Delete...action を使う。session object / selection context を受けて内部状態を更新する経路に限り、実行は手順5以降の照合と検証後に行う。 - 現在の agent が row を選択して context action を実行できる visible GUI 操作経路を持つか確認する。agent 自身で操作できない場合は exact 候補を提示してユーザーの GUI 操作を待ち、keyboard sequence や raw command 呼び出しで代用しない。
- GUI mode では window の close / reload / restart、renderer 終了、
state.vscdbや session file の直接変更を行わない。 agentSession.deleteに raw ID / URI / keybinding args を渡せると推測しない。viewer フォーカス時のDeleteキーはagentSession.archiveでアーカイブになるため、削除は row の context menu のDelete...を使う。workbench.action.chat.clearHistoryは保持期間や保護条件を無視して全件削除するため使わない。- 削除前に候補を GUI row と照合する。title、表示日時、provider などの組み合わせが一意でない候補、GUI に表示されない候補、scope を確認できない候補が1件でもあれば、その集合を削除せず経路選択へ戻る。offline mode は着手時承認の範囲内でのみ使う。
- native action 自体は pin / active session を削除から保護しない。各集合の削除直前に index、pin cache、active resource を再読し、選択された全 row と exact ID 集合が一致すること、全IDが local・古い・未ピン留め・非アクティブ・保留中編集なしを保つことを確認する。全件確認できた場合だけ選択集合に
Delete...を実行する。 - native confirmation の件数が検証済み集合の件数と一致することを確認して承認し、操作後に index を再読する。削除前後の差分が想定した exact ID 集合と一致し、pin / active / pending-edit session が残ることを確認してから次の集合へ進む。1件でも不一致・未確認なら停止する。
- キャンセル、候補変化、想定外 ID の消失、検証不能が起きたら残りを削除せず停止する。
- workspace 外、global storage、debug logs、他 provider resource は触らない。native action の cloud deletion は best effort で失敗が表面化しない場合があるため、正式な同期状態を別途確認できない限り未確認と報告する。
Offline mode
- 承認後に
workbench.action.files.saveAllを実行し、VS Code から独立した durable one-shot helper を OS temp に作る。helper、manifest、status、backup、quarantine の path を確定し、window close で agent turn が切れるため artifact path と再開手順をチャットへ提示してから window close を開始する。 - VS Code の main process は、window を閉じた後も全 workspace の
state.vscdbハンドルを保持し、process が終了するまで解放しない。そのため対象 window だけを閉じても DB は unlock されない。他 window が同じ main process を共有する場合は、全 window を閉じる明示承認を得るか、offline mode を諦めて GUI mode へ切り替える。承認なく他 workspace の window を閉じない。close は通常の close を送り、強制 kill は使わない。対象 window の消滅、Codeプロセスの終了、state.vscdbの unlock を順に確認し、いずれかがタイムアウトしたら変更せず停止して、ロック保持プロセスを Restart Manager で記録する。 - window 停止後に
workspace.jsonの folder URI と現在の workspace を再照合し、state.vscdbと pin cache を再読する。workspace binding 不一致、preflight と exact candidate ID 集合が変化、pin 追加、candidate の active / pending-edit 化、schema 破損があれば変更せず再起動する。 - SQLite backup を作成し、file-backed session を quarantine へ移動してから、transaction で exact index entries だけを削除する。
stale-indexは index entry だけを削除する。VS Code は同じフォルダのstate.vscdb.backupから workspace storage を復元するため、state.vscdbだけを変更すると次の起動で全件戻る。同じ index 削除をstate.vscdb.backupにも適用するか、その backup を quarantine へ退避して VS Code に再生成させる。 - mutation の途中で失敗した場合は DB backup と quarantine file を復元する。rollback の各結果を status に残し、復元不能が1件でもあれば自動 cleanup せず報告する。
- offline 検証で削除 ID が index / session files から消え、保護対象が残ることを確認してから同じ workspace を再起動する。再起動後に DB を再読し、削除 ID が復活していないことを確認する。復活していたら追加削除せず、quarantine を戻して rollback し、offline mode 失敗として復活の供給元とともに報告する。
- 手順6と検証節にある再起動後の DB / Agent Sessions view 確認が両方成功した後だけ、backup、quarantine、manifest、status、helper を削除する。失敗時は復旧に必要な artifact を残し、その場所と次の操作を報告する。
- offline mode は local history のみを変更する。GUI mode と違い
github.copilot.sessionSync.deleteSessionFromCloudは呼ばれないため、cloud sync は未確認と報告し、cloud mapping を推測で直接変更しない。
検証
削除後は次を実行してから完了にする。
- index と session files を再読し、削除した ID が両方から消えたことを確認する。
- 「local・古い・未ピン留め・非アクティブ・保留中編集なし」を満たす候補が 0 件であること、除外した pin / active / pending-edit session が残ることを確認する。
- GUI mode は Agent Sessions view を refresh し、削除対象の specific title / 表示日時が残っていないことを確認する。window reload / restart は行わない。
- offline mode は再起動前後の DB 検証と、再起動後の Agent Sessions view の双方で削除対象が復活していないことを確認する。
- UI と index の結果が一致しない場合は追加削除せず、削除済み ID と不一致内容を報告する。
最終報告
次を簡潔に報告する。
- mode(dry-run / apply)、workspace、cutoff、候補数、file-backed / stale-index 内訳、pin 除外数、実削除数
- 選択 mode と理由、GUI mode は再起動なし、offline mode は承認・再起動・rollback status、cloud sync の確認可否
- 検証結果、保持した保護対象、残るリスク