feat: move sessions to new worktrees
Add a root-session action that creates a generated worktree from the session directory's current branch, transfers uncommitted changes, and moves the parent session plus its descendants through OpenCode's control-plane API. Reuse existing project/worktree topology and quick-create behavior, keep the UI non-blocking, reconcile live and global session state across directories, and roll back partial moves and failed worktree creation safely. Split worktree bootstrap readiness into directory-created, git-ready, and setup-ready phases across web and VS Code. Session moves wait for Git readiness while existing setup-aware flows continue waiting for full setup completion, and worktree removal is serialized with active bootstrap tasks. Expose the move only for idle root sessions, show localized progress and explanatory tooltips in the sidebar, and keep pending/ready worktree metadata synchronized with authoritative session attachments to avoid stale setup indicators. Add coverage for control-plane payloads, session-state migration, bootstrap phase ordering and compatibility, removal races, progress metadata, and fast-ready attachment races.
This commit is contained in:
@@ -457,6 +457,12 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.sidebar.session.menu.copyLink': '링크 복사',
|
||||
'sessions.sidebar.session.menu.unshare': '공유 해제',
|
||||
'sessions.sidebar.session.menu.exportMarkdown': 'Markdown 내보내기',
|
||||
'sessions.sidebar.session.menu.moveToWorktree': '새 worktree로 이동',
|
||||
'sessions.sidebar.session.moveToWorktree.success': '세션을 새 worktree로 이동했습니다',
|
||||
'sessions.sidebar.session.moveToWorktree.failed': '세션을 새 worktree로 이동하지 못했습니다',
|
||||
'sessions.sidebar.session.moveToWorktree.tooltip': '현재 브랜치에서 새 worktree를 만들고 커밋되지 않은 변경 사항과 이 세션 및 하위 세션을 이동합니다.',
|
||||
'sessions.sidebar.session.moveToWorktree.tooltipBusy': '세션이 유휴 상태일 때 사용할 수 있습니다. 현재 작업을 중지하거나 완료될 때까지 기다리세요.',
|
||||
'sessions.sidebar.session.moveToWorktree.tooltipMoving': '이 세션은 이미 새 worktree로 이동 중입니다.',
|
||||
'sessions.sidebar.session.menu.runFusion': 'fusion 실행',
|
||||
'sessions.sidebar.session.menu.openInSidePanel': '사이드 패널에서 열기',
|
||||
'sessions.sidebar.session.actions.openInEditor': '편집기에서 열기',
|
||||
@@ -477,6 +483,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.sidebar.session.status.active': '활성 세션',
|
||||
'sessions.sidebar.session.status.unread': '읽지 않은 업데이트',
|
||||
'sessions.sidebar.session.status.pinned': '고정된 세션',
|
||||
'sessions.sidebar.session.status.movingToWorktree': '세션을 새 worktree로 이동하는 중',
|
||||
'sessions.sidebar.session.status.permissionRequired': '권한 필요',
|
||||
'sessions.sidebar.session.subsessions.collapse': '하위 세션 접기',
|
||||
'sessions.sidebar.session.subsessions.expand': '하위 세션 펼치기',
|
||||
|
||||
Reference in New Issue
Block a user