diff --git a/.github/workflows/build-view.yml b/.github/workflows/build-view.yml index 0a3469ad..f5190e39 100644 --- a/.github/workflows/build-view.yml +++ b/.github/workflows/build-view.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: include: - - os: [self-hosted, macOS, ARM64] + - os: macos-latest arch: arm64 artifact_name: macos-arm64 - os: windows-latest @@ -85,7 +85,13 @@ jobs: - name: Build Release Files (macOS with signing) if: runner.os == 'macOS' timeout-minutes: 90 - run: npm run build -- --arch ${{ matrix.arch }} + run: | + # Increase file descriptor limit to prevent EMFILE errors during signing + # This is needed because electron-builder signs all files recursively, + # and Python venvs contain thousands of files + ulimit -n 65536 || ulimit -n 10240 + echo "File descriptor limit set to: $(ulimit -n)" + npm run build -- --arch ${{ matrix.arch }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CSC_LINK: ${{ secrets.CERT_P12 }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 136ffa2c..2f5b8a15 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -92,7 +92,11 @@ jobs: # Step for macOS builds with signing - name: Build Release Files (macOS with signing) if: runner.os == 'macOS' - run: npm run build -- --arch ${{ matrix.arch }} + run: | + # Increase file descriptor limit to prevent EMFILE errors during signing + ulimit -n 65536 || ulimit -n 10240 + echo "File descriptor limit set to: $(ulimit -n)" + npm run build -- --arch ${{ matrix.arch }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CSC_LINK: ${{ secrets.CERT_P12 }} diff --git a/electron-builder.json b/electron-builder.json index c2c669cb..2704266f 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -65,6 +65,26 @@ "hardenedRuntime": true, "gatekeeperAssess": false, "notarize": false, + "signIgnore": [ + ".*\\.py$", + ".*\\.pyc$", + ".*\\.pyo$", + ".*\\.pyi$", + ".*\\.typed$", + ".*\\.txt$", + ".*\\.md$", + ".*\\.rst$", + ".*\\.json$", + ".*\\.yaml$", + ".*\\.yml$", + ".*\\.toml$", + ".*\\.cfg$", + ".*\\.ini$", + ".*\\.csv$", + ".*\\.html$", + ".*\\.css$", + ".*\\.map$" + ], "extendInfo": { "CFBundleURLTypes": [ { diff --git a/src/components/ChatBox/BottomBox/BoxHeader.tsx b/src/components/ChatBox/BottomBox/BoxHeader.tsx index 79d60860..aa11ced1 100644 --- a/src/components/ChatBox/BottomBox/BoxHeader.tsx +++ b/src/components/ChatBox/BottomBox/BoxHeader.tsx @@ -48,6 +48,7 @@ export interface BoxHeaderConfirmProps { onStartTask?: () => void; onEdit?: () => void; className?: string; + loading?: boolean; } export const BoxHeaderConfirm = ({ @@ -55,6 +56,7 @@ export const BoxHeaderConfirm = ({ onStartTask, onEdit, className, + loading = false, }: BoxHeaderConfirmProps) => { return (
Start Task diff --git a/src/components/ChatBox/BottomBox/index.tsx b/src/components/ChatBox/BottomBox/index.tsx index 2b99dd93..0d0d4998 100644 --- a/src/components/ChatBox/BottomBox/index.tsx +++ b/src/components/ChatBox/BottomBox/index.tsx @@ -93,6 +93,7 @@ export default function BottomBox({ subtitle={subtitle} onStartTask={onStartTask} onEdit={onEdit} + loading={loading} /> )} diff --git a/src/components/Dialog/EndNotice.tsx b/src/components/Dialog/EndNotice.tsx index 1424cd28..e993eec0 100644 --- a/src/components/Dialog/EndNotice.tsx +++ b/src/components/Dialog/EndNotice.tsx @@ -16,9 +16,10 @@ interface Props { onOpenChange: (open: boolean) => void; trigger?: React.ReactNode; onConfirm: () => void; + loading?: boolean; } -export default function EndNoticeDialog({ open, onOpenChange, trigger, onConfirm }: Props) { +export default function EndNoticeDialog({ open, onOpenChange, trigger, onConfirm, loading = false }: Props) { const { t } = useTranslation(); const onSubmit = useCallback(() => { onConfirm(); @@ -36,9 +37,9 @@ export default function EndNoticeDialog({ open, onOpenChange, trigger, onConfirm
- + - + diff --git a/src/components/TopBar/index.tsx b/src/components/TopBar/index.tsx index 860dc60c..778a06c6 100644 --- a/src/components/TopBar/index.tsx +++ b/src/components/TopBar/index.tsx @@ -48,6 +48,7 @@ function HeaderWin() { const [isFullscreen, setIsFullscreen] = useState(false); const { token } = getAuthStore(); const [endDialogOpen, setEndDialogOpen] = useState(false); + const [endProjectLoading, setEndProjectLoading] = useState(false); useEffect(() => { const p = window.electronAPI.getPlatform(); setPlatform(p); @@ -150,6 +151,7 @@ function HeaderWin() { const historyId = projectId ? projectStore.getHistoryId(projectId) : null; + setEndProjectLoading(true); try { const task = chatStore.tasks[taskId]; @@ -197,6 +199,7 @@ function HeaderWin() { closeButton: true, }); } finally { + setEndProjectLoading(false); setEndDialogOpen(false); } }; @@ -414,6 +417,7 @@ function HeaderWin() { open={endDialogOpen} onOpenChange={setEndDialogOpen} onConfirm={handleEndProject} + loading={endProjectLoading} /> );