diff --git a/electron/main.ts b/electron/main.ts index e4fb5ff..cc97492 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -50,7 +50,9 @@ function verifyPreloadAllowlist(): void { const preloadPath = path.join(__dirname, '..', 'electron', 'preload.cjs'); const preloadSrc = fs.readFileSync(preloadPath, 'utf8'); const enumValues = new Set(Object.values(IPC)); - const missing = [...enumValues].filter((v) => !preloadSrc.includes(`"${v}"`)); + const hasChannel = (channel: string) => + preloadSrc.includes(`'${channel}'`) || preloadSrc.includes(`"${channel}"`); + const missing = [...enumValues].filter((v) => !hasChannel(v)); if (missing.length > 0) { console.warn( `[preload-sync] IPC channels missing from preload.cjs ALLOWED_CHANNELS: ${missing.join(', ')}`, diff --git a/electron/vite.config.electron.ts b/electron/vite.config.electron.ts index 02b08a9..f56db7b 100644 --- a/electron/vite.config.electron.ts +++ b/electron/vite.config.electron.ts @@ -1,6 +1,10 @@ +import path from 'path'; import { defineConfig } from 'vite'; import solid from 'vite-plugin-solid'; +const rootDir = path.resolve(process.cwd()); +const siblingWorktreesDir = path.resolve(rootDir, '..'); + export default defineConfig({ base: './', plugins: [solid()], @@ -8,5 +12,11 @@ export default defineConfig({ server: { port: 1421, strictPort: true, + watch: { + ignored: (watchedPath) => { + const resolvedPath = path.resolve(watchedPath); + return resolvedPath.startsWith(siblingWorktreesDir) && !resolvedPath.startsWith(rootDir); + }, + }, }, }); diff --git a/src/store/tasks.ts b/src/store/tasks.ts index 55b6fd8..19a2524 100644 --- a/src/store/tasks.ts +++ b/src/store/tasks.ts @@ -2,6 +2,7 @@ import { produce } from 'solid-js/store'; import { invoke } from '../lib/ipc'; import { IPC } from '../../electron/ipc/channels'; import { store, setStore, updateWindowTitle, cleanupPanelEntries } from './core'; +import { saveState } from './persistence'; import { setTaskFocusedPanel } from './focus'; import { getProject, getProjectPath, getProjectBranchPrefix, isProjectMissing } from './projects'; import { setPendingShellCommand } from '../lib/bookmarks'; @@ -125,6 +126,7 @@ export async function createTask(opts: CreateTaskOptions): Promise { // Mark as busy immediately; terminal output may arrive later. markAgentSpawned(agentId); rescheduleTaskStatusPolling(); + await saveState(); updateWindowTitle(name); return result.id; } @@ -194,6 +196,7 @@ export async function createDirectTask(opts: CreateDirectTaskOptions): Promise