diff --git a/packages/ui/src/apps/MobileSessionsSheet.tsx b/packages/ui/src/apps/MobileSessionsSheet.tsx
index 5b27ff41..f2d80e9b 100644
--- a/packages/ui/src/apps/MobileSessionsSheet.tsx
+++ b/packages/ui/src/apps/MobileSessionsSheet.tsx
@@ -269,6 +269,31 @@ const NewWorktreeIconButton: React.FC<{
);
};
+/** Starts a session draft already pointed at this project — the mobile twin of
+ the desktop sidebar's per-project "+". */
+const NewSessionIconButton: React.FC<{
+ label: string;
+ onClick: () => void;
+ className?: string;
+}> = ({ label, onClick, className }) => (
+
+);
+
// Width of the swipe-revealed action area (rename + archive + delete buttons).
const ROW_ACTIONS_WIDTH = 144;
const ROW_SWIPE_SNAP_MS = 180;
@@ -1387,6 +1412,15 @@ export const MobileSessionsSheet: React.FC = ({ open,
onOpenChange(false);
};
+ // Same contract as the desktop sidebar's per-project "+": the draft carries
+ // the project and its directory, so the app's current directory is not
+ // switched out from under the session that is still open behind the drawer.
+ const handleNewSessionInProject = (project: ProjectMeta) => {
+ setActiveProjectIdOnly(project.id);
+ openNewSessionDraft({ selectedProjectId: project.id, directoryOverride: project.path });
+ onOpenChange(false);
+ };
+
const filteredNodes = React.useMemo(() => {
if (!normalizedQuery) return projectNodes;
return projectNodes.filter((node) => {
@@ -1418,18 +1452,10 @@ export const MobileSessionsSheet: React.FC = ({ open,
);
}, [normalizedQuery, pinnedSessionIds, projectsMeta, sessionOrderRanks, sessions]);
- const searchProjectMatches = React.useMemo(() => {
- if (!normalizedQuery) return [] as Array;
- return rankByQuery(projectsMeta, normalizedQuery, (project) => [project.label, project.path])
- .map((project) => ({
- ...project,
- sessionCount: sessions.filter((session) => {
- if (getParentId(session)) return false;
- const directory = normalizePath(getSessionDirectory(session));
- return projectMatchesExactDirectory(project, directory);
- }).length,
- }));
- }, [normalizedQuery, projectsMeta, sessions]);
+ const searchProjectMatches = React.useMemo(() => {
+ if (!normalizedQuery) return [];
+ return rankByQuery(projectsMeta, normalizedQuery, (project) => [project.label, project.path]);
+ }, [normalizedQuery, projectsMeta]);
const hasNoMatches =
normalizedQuery && searchSessionMatches.length === 0 && searchProjectMatches.length === 0;
@@ -1592,16 +1618,15 @@ export const MobileSessionsSheet: React.FC = ({ open,
{project.label}
-
- {project.sessionCount}
-
{project.isGitRepo ? (
- handleNewWorktree(project.id)}
- />
+ handleNewWorktree(project.id)} />
) : null}
+ handleNewSessionInProject(project)}
+ />
))}
@@ -1773,17 +1798,15 @@ export const MobileSessionsSheet: React.FC = ({ open,
{node.project.label}
- {node.isActive ? : null}
-
- {node.totalSessions}
-
{node.project.isGitRepo ? (
- handleNewWorktree(node.project.id)}
- />
+ handleNewWorktree(node.project.id)} />
) : null}
+ handleNewSessionInProject(node.project)}
+ />
diff --git a/packages/ui/src/lib/i18n/messages/de.ts b/packages/ui/src/lib/i18n/messages/de.ts
index 6acc77b3..9061a916 100644
--- a/packages/ui/src/lib/i18n/messages/de.ts
+++ b/packages/ui/src/lib/i18n/messages/de.ts
@@ -127,13 +127,13 @@ export const dict = {
'mobile.sessions.showArchived': 'Archivierte anzeigen ({count})',
'mobile.sessions.hideArchived': 'Archivierte ausblenden',
'mobile.sessions.activeWorktreeAria': 'Aktives Worktree',
- 'mobile.sessions.activeProjectAria': 'Aktives Projekt',
'mobile.sessions.startNewChat': 'Neuen Chat starten',
'mobile.sessions.newChat': 'Neuer Chat',
'mobile.sessions.editOrder': 'Projekte neu anordnen',
'mobile.sessions.doneEditing': 'Fertig',
'mobile.sessions.editOrderHint': 'Ziehe den Griff, um die Projekte neu anzuordnen. Tippe auf das Häkchen, um zu beenden.',
'mobile.sessions.editProjectAria': '{label} bearbeiten',
+ 'mobile.sessions.newSessionInProjectAria': 'Neue Sitzung in {label}',
'mobile.sessions.dragHandleAria': '{label} ziehen, um neu anzuordnen',
'mobile.sessions.moveUpAria': '{label} nach oben verschieben',
'mobile.sessions.moveDownAria': '{label} nach unten verschieben',
diff --git a/packages/ui/src/lib/i18n/messages/en.ts b/packages/ui/src/lib/i18n/messages/en.ts
index ba5702fc..5de91593 100644
--- a/packages/ui/src/lib/i18n/messages/en.ts
+++ b/packages/ui/src/lib/i18n/messages/en.ts
@@ -157,13 +157,13 @@ export const dict = {
'mobile.sessions.showArchived': 'Show archived ({count})',
'mobile.sessions.hideArchived': 'Hide archived',
'mobile.sessions.activeWorktreeAria': 'Active worktree',
- 'mobile.sessions.activeProjectAria': 'Active project',
'mobile.sessions.startNewChat': 'Start new chat',
'mobile.sessions.newChat': 'New chat',
'mobile.sessions.editOrder': 'Reorder projects',
'mobile.sessions.doneEditing': 'Done',
'mobile.sessions.editOrderHint': 'Drag the handle to reorder projects. Tap a project to show its worktrees and drag those too. Tap the check to finish.',
'mobile.sessions.editProjectAria': 'Edit {label}',
+ 'mobile.sessions.newSessionInProjectAria': 'New session in {label}',
'mobile.sessions.dragHandleAria': 'Drag {label} to reorder',
'mobile.sessions.moveUpAria': 'Move {label} up',
'mobile.sessions.moveDownAria': 'Move {label} down',
diff --git a/packages/ui/src/lib/i18n/messages/es.ts b/packages/ui/src/lib/i18n/messages/es.ts
index 444c721c..dfdfdf94 100644
--- a/packages/ui/src/lib/i18n/messages/es.ts
+++ b/packages/ui/src/lib/i18n/messages/es.ts
@@ -158,7 +158,6 @@ export const dict: Record = {
"mobile.sessions.showArchived": "Mostrar archivadas ({count})",
"mobile.sessions.hideArchived": "Ocultar archivadas",
"mobile.sessions.activeWorktreeAria": "Worktree activo",
- "mobile.sessions.activeProjectAria": "Proyecto activo",
"mobile.sessions.startNewChat": "Iniciar nuevo chat",
"mobile.sessions.newChat": "Nuevo chat",
"mobile.sessions.editOrder": "Reordenar proyectos",
@@ -177,6 +176,7 @@ export const dict: Record = {
"mobile.sessions.deleteSessionAria": "Eliminar {title}",
"mobile.sessions.confirmDeleteSessionAria": "Confirmar eliminación de {title}",
"mobile.sessions.editProjectAria": "Editar {label}",
+ "mobile.sessions.newSessionInProjectAria": "Nueva sesión en {label}",
"mobile.projectEdit.worktreesTitle": "Worktrees",
"mobile.projectEdit.worktreesEmpty": "Este proyecto aún no tiene worktrees.",
"mobile.projectEdit.reorderHint": "Arrastra para reordenar los worktrees.",
diff --git a/packages/ui/src/lib/i18n/messages/fr.ts b/packages/ui/src/lib/i18n/messages/fr.ts
index 55076e88..b399343c 100644
--- a/packages/ui/src/lib/i18n/messages/fr.ts
+++ b/packages/ui/src/lib/i18n/messages/fr.ts
@@ -3009,13 +3009,13 @@ export const dict = {
'mobile.sessions.showArchived': 'Afficher les archivées ({count})',
'mobile.sessions.hideArchived': 'Masquer les archivées',
'mobile.sessions.activeWorktreeAria': 'Worktree actif',
- 'mobile.sessions.activeProjectAria': 'Projet actif',
'mobile.sessions.startNewChat': 'Démarrer un nouveau chat',
'mobile.sessions.newChat': 'Nouveau chat',
'mobile.sessions.editOrder': 'Réordonner les projets',
'mobile.sessions.doneEditing': 'Terminé',
'mobile.sessions.editOrderHint': 'Faites glisser la poignée pour réorganiser les projets. Touchez un projet pour afficher ses worktrees et les faire glisser aussi. Touchez la coche pour terminer.',
'mobile.sessions.editProjectAria': 'Modifier {label}',
+ 'mobile.sessions.newSessionInProjectAria': 'Nouvelle session dans {label}',
'mobile.sessions.dragHandleAria': 'Faire glisser {label} pour réordonner',
'mobile.sessions.moveUpAria': 'Déplacer {label} vers le haut',
'mobile.sessions.moveDownAria': 'Déplacer {label} vers le bas',
diff --git a/packages/ui/src/lib/i18n/messages/ja.ts b/packages/ui/src/lib/i18n/messages/ja.ts
index f13df2ef..ac77e4bd 100644
--- a/packages/ui/src/lib/i18n/messages/ja.ts
+++ b/packages/ui/src/lib/i18n/messages/ja.ts
@@ -158,13 +158,13 @@ export const dict: Record = {
'mobile.sessions.showArchived': 'アーカイブを表示({count})',
'mobile.sessions.hideArchived': 'アーカイブを非表示',
'mobile.sessions.activeWorktreeAria': 'アクティブなワークツリー',
- 'mobile.sessions.activeProjectAria': 'アクティブなプロジェクト',
'mobile.sessions.startNewChat': '新しいチャットを開始',
'mobile.sessions.newChat': '新しいチャット',
'mobile.sessions.editOrder': 'プロジェクトの並び替え',
'mobile.sessions.doneEditing': '完了',
'mobile.sessions.editOrderHint': 'ハンドルをドラッグしてプロジェクトを並べ替えます。プロジェクトをタップするとワークツリーが表示され、同様にドラッグできます。チェックをタップして完了します。',
'mobile.sessions.editProjectAria': '{label}を編集',
+ 'mobile.sessions.newSessionInProjectAria': '{label}で新しいセッション',
'mobile.sessions.dragHandleAria': '{label}をドラッグして並び替え',
'mobile.sessions.moveUpAria': '{label}を上に移動',
'mobile.sessions.moveDownAria': '{label}を下に移動',
diff --git a/packages/ui/src/lib/i18n/messages/ko.ts b/packages/ui/src/lib/i18n/messages/ko.ts
index 5d75be56..9108bb48 100644
--- a/packages/ui/src/lib/i18n/messages/ko.ts
+++ b/packages/ui/src/lib/i18n/messages/ko.ts
@@ -158,7 +158,6 @@ export const dict: Record = {
'mobile.sessions.showArchived': '보관된 항목 표시 ({count})',
'mobile.sessions.hideArchived': '보관된 항목 숨기기',
'mobile.sessions.activeWorktreeAria': '활성 워크트리',
- 'mobile.sessions.activeProjectAria': '활성 프로젝트',
'mobile.sessions.startNewChat': '새 채팅 시작',
'mobile.sessions.newChat': '새 채팅',
'mobile.sessions.editOrder': '프로젝트 순서 변경',
@@ -177,6 +176,7 @@ export const dict: Record = {
'mobile.sessions.deleteSessionAria': '{title} 삭제',
'mobile.sessions.confirmDeleteSessionAria': '{title} 삭제 확인',
'mobile.sessions.editProjectAria': '{label} 편집',
+ 'mobile.sessions.newSessionInProjectAria': '{label}에서 새 세션',
'mobile.projectEdit.worktreesTitle': '워크트리',
'mobile.projectEdit.worktreesEmpty': '이 프로젝트에는 아직 워크트리가 없습니다.',
'mobile.projectEdit.reorderHint': '드래그하여 워크트리 순서를 변경합니다.',
diff --git a/packages/ui/src/lib/i18n/messages/pl.ts b/packages/ui/src/lib/i18n/messages/pl.ts
index cf344edf..08c14fd3 100644
--- a/packages/ui/src/lib/i18n/messages/pl.ts
+++ b/packages/ui/src/lib/i18n/messages/pl.ts
@@ -159,7 +159,6 @@ export const dict: Record = {
'mobile.sessions.showArchived': 'Pokaż zarchiwizowane ({count})',
'mobile.sessions.hideArchived': 'Ukryj zarchiwizowane',
'mobile.sessions.activeWorktreeAria': 'Aktywny worktree',
- 'mobile.sessions.activeProjectAria': 'Aktywny projekt',
'mobile.sessions.startNewChat': 'Rozpocznij nowy czat',
'mobile.sessions.newChat': 'Nowy czat',
'mobile.sessions.editOrder': 'Zmień kolejność projektów',
@@ -178,6 +177,7 @@ export const dict: Record = {
'mobile.sessions.deleteSessionAria': 'Usuń {title}',
'mobile.sessions.confirmDeleteSessionAria': 'Potwierdź usunięcie {title}',
'mobile.sessions.editProjectAria': 'Edytuj {label}',
+ 'mobile.sessions.newSessionInProjectAria': 'Nowa sesja w {label}',
'mobile.projectEdit.worktreesTitle': 'Worktree',
'mobile.projectEdit.worktreesEmpty': 'Ten projekt nie ma jeszcze worktree.',
'mobile.projectEdit.reorderHint': 'Przeciągnij, aby zmienić kolejność worktree.',
diff --git a/packages/ui/src/lib/i18n/messages/pt-BR.ts b/packages/ui/src/lib/i18n/messages/pt-BR.ts
index 98fa9a9a..6961b221 100644
--- a/packages/ui/src/lib/i18n/messages/pt-BR.ts
+++ b/packages/ui/src/lib/i18n/messages/pt-BR.ts
@@ -158,7 +158,6 @@ export const dict: Record = {
"mobile.sessions.showArchived": "Mostrar arquivadas ({count})",
"mobile.sessions.hideArchived": "Ocultar arquivadas",
"mobile.sessions.activeWorktreeAria": "Worktree ativa",
- "mobile.sessions.activeProjectAria": "Projeto ativo",
"mobile.sessions.startNewChat": "Iniciar novo chat",
"mobile.sessions.newChat": "Novo chat",
"mobile.sessions.editOrder": "Reordenar projetos",
@@ -177,6 +176,7 @@ export const dict: Record = {
"mobile.sessions.deleteSessionAria": "Excluir {title}",
"mobile.sessions.confirmDeleteSessionAria": "Confirmar exclusão de {title}",
"mobile.sessions.editProjectAria": "Editar {label}",
+ "mobile.sessions.newSessionInProjectAria": "Nova sessão em {label}",
"mobile.projectEdit.worktreesTitle": "Worktrees",
"mobile.projectEdit.worktreesEmpty": "Este projeto ainda não tem worktrees.",
"mobile.projectEdit.reorderHint": "Arraste para reordenar os worktrees.",
diff --git a/packages/ui/src/lib/i18n/messages/tr.ts b/packages/ui/src/lib/i18n/messages/tr.ts
index a5920625..b1b87f19 100644
--- a/packages/ui/src/lib/i18n/messages/tr.ts
+++ b/packages/ui/src/lib/i18n/messages/tr.ts
@@ -144,13 +144,13 @@ export const dict = {
'mobile.sessions.showArchived': 'Arşivlenenleri göster ({count})',
'mobile.sessions.hideArchived': 'Arşivlenenleri gizle',
'mobile.sessions.activeWorktreeAria': 'Etkin worktree',
- 'mobile.sessions.activeProjectAria': 'Etkin proje',
'mobile.sessions.startNewChat': 'Yeni sohbet başlat',
'mobile.sessions.newChat': 'Yeni sohbet',
'mobile.sessions.editOrder': 'Projeleri yeniden sırala',
'mobile.sessions.doneEditing': 'Tamam',
'mobile.sessions.editOrderHint': 'Projeleri yeniden sıralamak için tutamacı sürükleyin. Worktree\'lerini görmek için bir projeye dokunun ve onları da sürükleyin. Bitirmek için onay işaretine dokunun.',
'mobile.sessions.editProjectAria': '{label} öğesini düzenle',
+ 'mobile.sessions.newSessionInProjectAria': '{label} içinde yeni session',
'mobile.sessions.dragHandleAria': '{label} öğesini yeniden sıralamak için sürükleyin',
'mobile.sessions.moveUpAria': '{label} öğesini yukarı taşı',
'mobile.sessions.moveDownAria': '{label} öğesini aşağı taşı',
diff --git a/packages/ui/src/lib/i18n/messages/uk.ts b/packages/ui/src/lib/i18n/messages/uk.ts
index ce537831..28c48962 100644
--- a/packages/ui/src/lib/i18n/messages/uk.ts
+++ b/packages/ui/src/lib/i18n/messages/uk.ts
@@ -158,7 +158,6 @@ export const dict: Record = {
"mobile.sessions.showArchived": "Показати архівовані ({count})",
"mobile.sessions.hideArchived": "Сховати архівовані",
"mobile.sessions.activeWorktreeAria": "Активний worktree",
- "mobile.sessions.activeProjectAria": "Активний проєкт",
"mobile.sessions.startNewChat": "Почати новий чат",
"mobile.sessions.newChat": "Новий чат",
"mobile.sessions.editOrder": "Змінити порядок проєктів",
@@ -177,6 +176,7 @@ export const dict: Record = {
"mobile.sessions.deleteSessionAria": "Видалити {title}",
"mobile.sessions.confirmDeleteSessionAria": "Підтвердити видалення {title}",
"mobile.sessions.editProjectAria": "Редагувати {label}",
+ "mobile.sessions.newSessionInProjectAria": "Нова сесія в {label}",
"mobile.projectEdit.worktreesTitle": "Ворктрі",
"mobile.projectEdit.worktreesEmpty": "У цьому проєкті ще немає ворктрі.",
"mobile.projectEdit.reorderHint": "Перетягніть, щоб змінити порядок ворктрі.",
diff --git a/packages/ui/src/lib/i18n/messages/zh-CN.ts b/packages/ui/src/lib/i18n/messages/zh-CN.ts
index 98628f3e..dbc39115 100644
--- a/packages/ui/src/lib/i18n/messages/zh-CN.ts
+++ b/packages/ui/src/lib/i18n/messages/zh-CN.ts
@@ -158,7 +158,6 @@ export const dict: Record = {
'mobile.sessions.showArchived': '显示已归档 ({count})',
'mobile.sessions.hideArchived': '隐藏已归档',
'mobile.sessions.activeWorktreeAria': '活动工作树',
- 'mobile.sessions.activeProjectAria': '活动项目',
'mobile.sessions.startNewChat': '开始新会话',
'mobile.sessions.newChat': '新会话',
'mobile.sessions.editOrder': '重新排序项目',
@@ -177,6 +176,7 @@ export const dict: Record = {
'mobile.sessions.deleteSessionAria': '删除 {title}',
'mobile.sessions.confirmDeleteSessionAria': '确认删除 {title}',
'mobile.sessions.editProjectAria': '编辑 {label}',
+ 'mobile.sessions.newSessionInProjectAria': '在 {label} 中新建会话',
'mobile.projectEdit.worktreesTitle': '工作树',
'mobile.projectEdit.worktreesEmpty': '此项目还没有工作树。',
'mobile.projectEdit.reorderHint': '拖动以重新排序工作树。',
diff --git a/packages/ui/src/lib/i18n/messages/zh-TW.ts b/packages/ui/src/lib/i18n/messages/zh-TW.ts
index 781beb4f..78495baf 100644
--- a/packages/ui/src/lib/i18n/messages/zh-TW.ts
+++ b/packages/ui/src/lib/i18n/messages/zh-TW.ts
@@ -158,7 +158,6 @@ export const dict: Record = {
'mobile.sessions.showArchived': '顯示已封存 ({count})',
'mobile.sessions.hideArchived': '隱藏已封存',
'mobile.sessions.activeWorktreeAria': '作用中的工作樹',
- 'mobile.sessions.activeProjectAria': '作用中的專案',
'mobile.sessions.startNewChat': '開始新聊天',
'mobile.sessions.newChat': '新聊天',
'mobile.sessions.editOrder': '重新排序專案',
@@ -177,6 +176,7 @@ export const dict: Record = {
'mobile.sessions.deleteSessionAria': '刪除 {title}',
'mobile.sessions.confirmDeleteSessionAria': '確認刪除 {title}',
'mobile.sessions.editProjectAria': '編輯 {label}',
+ 'mobile.sessions.newSessionInProjectAria': '在 {label} 中新增會話',
'mobile.projectEdit.worktreesTitle': '工作樹',
'mobile.projectEdit.worktreesEmpty': '此專案還沒有工作樹。',
'mobile.projectEdit.reorderHint': '拖曳以重新排序工作樹。',