diff --git a/package.json b/package.json index c427b37a..99fe397f 100644 --- a/package.json +++ b/package.json @@ -134,6 +134,7 @@ "tailwind-merge": "^3.5.0", "tailwindcss-animate": "^1.0.7", "unified": "^11.0.5", + "yet-another-react-lightbox": "^3.29.1", "zustand": "^4.5.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 346399b9..7f916640 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -230,6 +230,9 @@ importers: unified: specifier: ^11.0.5 version: 11.0.5 + yet-another-react-lightbox: + specifier: ^3.29.1 + version: 3.29.1(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) zustand: specifier: ^4.5.0 version: 4.5.7(@types/react@18.3.27)(react@18.3.1) @@ -6164,6 +6167,20 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yet-another-react-lightbox@3.29.1: + resolution: {integrity: sha512-0cpa+wlleiy2cWNjS9qrcY0+SgZQH/4PDx2uupLMI9Ofip1f7pCgZ95PlVp/EsFsO4ufwOTea51bkLhcEXJJSg==} + engines: {node: '>=14'} + peerDependencies: + '@types/react': ^16 || ^17 || ^18 || ^19 + '@types/react-dom': ^16 || ^17 || ^18 || ^19 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: ^16.8.0 || ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -13183,6 +13200,14 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 + yet-another-react-lightbox@3.29.1(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + yocto-queue@0.1.0: {} zip-stream@4.1.1: diff --git a/src/main/services/team/TeamAgentToolsInstaller.ts b/src/main/services/team/TeamAgentToolsInstaller.ts index 02e5b91b..c13ac263 100644 --- a/src/main/services/team/TeamAgentToolsInstaller.ts +++ b/src/main/services/team/TeamAgentToolsInstaller.ts @@ -1516,7 +1516,11 @@ export class TeamAgentToolsInstaller { } if (current?.includes(`TOOL_VERSION = '${APP_VERSION}'`)) { - return toolPath; + // Even when app version is unchanged, the generated script can evolve. + // Keep the installed tool idempotent by content, not only by version. + if (current === desired) { + return toolPath; + } } await atomicWriteAsync(toolPath, desired); diff --git a/src/renderer/components/layout/TeamTabSectionNav.tsx b/src/renderer/components/layout/TeamTabSectionNav.tsx index 17e33035..913fe1ce 100644 --- a/src/renderer/components/layout/TeamTabSectionNav.tsx +++ b/src/renderer/components/layout/TeamTabSectionNav.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; -import { ChevronDown, Columns3, History, MessageSquare, Users } from 'lucide-react'; +import { ChevronDown, Columns3, History, MessageSquare, Terminal, Users } from 'lucide-react'; import type { LucideIcon } from 'lucide-react'; @@ -14,6 +14,7 @@ const SECTIONS: readonly { id: string; label: string; icon: LucideIcon }[] = [ { id: 'team', label: 'Team', icon: Users }, { id: 'sessions', label: 'Sessions', icon: History }, { id: 'kanban', label: 'Kanban', icon: Columns3 }, + { id: 'claude-logs', label: 'Claude Logs', icon: Terminal }, { id: 'messages', label: 'Messages', icon: MessageSquare }, ]; diff --git a/src/renderer/components/sidebar/GlobalTaskList.tsx b/src/renderer/components/sidebar/GlobalTaskList.tsx index 45d585fb..b160e5d8 100644 --- a/src/renderer/components/sidebar/GlobalTaskList.tsx +++ b/src/renderer/components/sidebar/GlobalTaskList.tsx @@ -157,8 +157,17 @@ export const GlobalTaskList = ({ variant: 'danger', }); if (confirmed) { - await softDeleteTask(teamName, taskId); - await fetchAllTasks(); + try { + await softDeleteTask(teamName, taskId); + await fetchAllTasks(); + } catch (err) { + void confirm({ + title: 'Failed to delete task', + message: err instanceof Error ? err.message : 'An unexpected error occurred', + confirmLabel: 'OK', + variant: 'danger', + }); + } } }; diff --git a/src/renderer/components/team/ProvisioningProgressBlock.tsx b/src/renderer/components/team/ProvisioningProgressBlock.tsx index 70450e2a..4fdd94c7 100644 --- a/src/renderer/components/team/ProvisioningProgressBlock.tsx +++ b/src/renderer/components/team/ProvisioningProgressBlock.tsx @@ -191,7 +191,7 @@ export const ProvisioningProgressBlock = ({ {message}
) : null} -