generated from nhcarrigan/template
fix: critical permission modal and config issues (#127)
## Summary This PR resolves several critical bugs that were blocking the permission modal and causing config loss: - **Permission modal not appearing** - Fixed z-index issues and runtime errors - **Config store race condition** - Resolved critical race condition causing settings to be lost - **Excessive logging** - Removed redundant fmt layer that was writing to hidden stdout - **System tool prompts** - Prevented unnecessary permission prompts for built-in tools - **Permission batching** - Added support for parallel permission requests - **ExitPlanMode tool** - Fixed ExitPlanMode tool not functioning correctly ## Changes Made ### Permission Modal Fixes - Updated z-index to proper value (9999) to ensure modal appears above all other UI elements - Fixed runtime errors that were preventing modal from rendering - Resolved issues with permission grants not being properly applied ### Config Store Race Condition - Fixed critical race condition where multiple rapid config updates would result in lost settings - Ensured config writes are properly sequenced to prevent data loss - Added proper synchronisation for config store operations ### Logging Cleanup - Removed redundant fmt formatting layer that was outputting to hidden stdout - Cleaned up excessive debug logging added during troubleshooting - Removed temporary debugging documentation files ### UX Improvements - Added close confirmation modal with minimise to tray option - Implemented batching for parallel permission requests - Added debug console for viewing frontend and backend logs ### ExitPlanMode Fix - Fixed ExitPlanMode tool not functioning correctly, ensuring proper transitions out of plan mode ## Issues Resolved Closes #112 - Permission flow now properly handles multiple tool requests Closes #113 - ExitPlanMode tool now functions correctly Closes #126 - Debug console feature added (partial - basic implementation complete) ## Test Plan - [x] Permission modal appears and functions correctly - [x] Config settings persist across app restarts - [x] No excessive logging in production builds - [x] System tools don't trigger permission prompts - [x] Parallel permission requests are properly batched - [x] Debug console displays frontend and backend logs - [x] ExitPlanMode properly exits plan mode --- ✨ This PR was created with help from Hikari~ 🌸 Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com> Reviewed-on: #127 Co-authored-by: Hikari <hikari@nhcarrigan.com> Co-committed-by: Hikari <hikari@nhcarrigan.com>
This commit was merged in pull request #127.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { onMount, onDestroy } from "svelte";
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import { listen } from "@tauri-apps/api/event";
|
||||
import { get } from "svelte/store";
|
||||
import {
|
||||
initializeTauriListeners,
|
||||
@@ -31,12 +32,16 @@
|
||||
import AchievementNotification from "$lib/components/AchievementNotification.svelte";
|
||||
import AchievementsPanel from "$lib/components/AchievementsPanel.svelte";
|
||||
import UpdateNotification from "$lib/components/UpdateNotification.svelte";
|
||||
import CloseAppConfirmModal from "$lib/components/CloseAppConfirmModal.svelte";
|
||||
import { debugConsoleStore } from "$lib/stores/debugConsole";
|
||||
|
||||
let initialized = false;
|
||||
let updateNotification: UpdateNotification | undefined = $state(undefined);
|
||||
let achievementPanelOpen = $state(false);
|
||||
let currentCharacterState: CharacterState = $state("idle");
|
||||
let compactModeActive = $state(false);
|
||||
let closeConfirmModalOpen = $state(false);
|
||||
let hasActiveConversation = $state(false);
|
||||
|
||||
// Editor state
|
||||
const isEditorVisible = editorStore.isEditorVisible;
|
||||
@@ -230,6 +235,13 @@
|
||||
return;
|
||||
}
|
||||
|
||||
// Ctrl+` - Toggle debug console
|
||||
if (event.ctrlKey && event.key === "`") {
|
||||
event.preventDefault();
|
||||
debugConsoleStore.toggle();
|
||||
return;
|
||||
}
|
||||
|
||||
// Ctrl+E - Toggle editor panel (only when connected)
|
||||
if (event.ctrlKey && event.key === "e") {
|
||||
event.preventDefault();
|
||||
@@ -342,6 +354,50 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function handleCloseRequest() {
|
||||
// Check if there's an active conversation with Claude running
|
||||
const activeId = get(claudeStore.activeConversationId);
|
||||
if (activeId) {
|
||||
try {
|
||||
const isRunning = await invoke<boolean>("is_claude_running", {
|
||||
conversationId: activeId,
|
||||
});
|
||||
hasActiveConversation = isRunning;
|
||||
} catch (error) {
|
||||
console.error("Failed to check Claude status:", error);
|
||||
hasActiveConversation = false;
|
||||
}
|
||||
} else {
|
||||
hasActiveConversation = false;
|
||||
}
|
||||
|
||||
// Always show confirmation modal
|
||||
closeConfirmModalOpen = true;
|
||||
}
|
||||
|
||||
async function handleConfirmClose() {
|
||||
closeConfirmModalOpen = false;
|
||||
try {
|
||||
await invoke("close_application");
|
||||
} catch (error) {
|
||||
console.error("Failed to close application:", error);
|
||||
}
|
||||
}
|
||||
|
||||
async function handleMinimizeToTray() {
|
||||
closeConfirmModalOpen = false;
|
||||
try {
|
||||
const window = getCurrentWindow();
|
||||
await window.hide();
|
||||
} catch (error) {
|
||||
console.error("Failed to minimize to tray:", error);
|
||||
}
|
||||
}
|
||||
|
||||
function handleCancelClose() {
|
||||
closeConfirmModalOpen = false;
|
||||
}
|
||||
|
||||
onMount(async () => {
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
@@ -387,6 +443,16 @@
|
||||
|
||||
// Initialize Discord RPC
|
||||
await initializeDiscordRpc();
|
||||
|
||||
// Listen for window close requests
|
||||
const unlisten = await listen("window-close-requested", () => {
|
||||
handleCloseRequest();
|
||||
});
|
||||
|
||||
// Store the unlisten function for cleanup
|
||||
window.addEventListener("beforeunload", () => {
|
||||
unlisten();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -453,6 +519,13 @@
|
||||
onClose={() => (achievementPanelOpen = false)}
|
||||
/>
|
||||
<UpdateNotification bind:this={updateNotification} />
|
||||
<CloseAppConfirmModal
|
||||
isOpen={closeConfirmModalOpen}
|
||||
{hasActiveConversation}
|
||||
onClose={handleConfirmClose}
|
||||
onMinimize={handleMinimizeToTray}
|
||||
onCancel={handleCancelClose}
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user