generated from nhcarrigan/template
bf411adeb7
## 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>
79 lines
1.9 KiB
Rust
79 lines
1.9 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use std::sync::Arc;
|
|
use tauri::{AppHandle, Emitter};
|
|
use tracing::{Level, Subscriber};
|
|
use tracing_subscriber::layer::{Context, Layer};
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct DebugLogEvent {
|
|
pub level: String,
|
|
pub message: String,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct TauriLogLayer {
|
|
app: Arc<AppHandle>,
|
|
}
|
|
|
|
impl TauriLogLayer {
|
|
pub fn new(app: AppHandle) -> Self {
|
|
Self {
|
|
app: Arc::new(app),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<S> Layer<S> for TauriLogLayer
|
|
where
|
|
S: Subscriber,
|
|
{
|
|
fn on_event(
|
|
&self,
|
|
event: &tracing::Event<'_>,
|
|
_ctx: Context<'_, S>,
|
|
) {
|
|
let metadata = event.metadata();
|
|
let level = match *metadata.level() {
|
|
Level::ERROR => "error",
|
|
Level::WARN => "warn",
|
|
Level::INFO => "info",
|
|
Level::DEBUG => "debug",
|
|
Level::TRACE => "debug",
|
|
};
|
|
|
|
// Extract message from the event
|
|
struct MessageVisitor {
|
|
message: String,
|
|
}
|
|
|
|
impl tracing::field::Visit for MessageVisitor {
|
|
fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) {
|
|
if field.name() == "message" {
|
|
self.message = format!("{:?}", value);
|
|
}
|
|
}
|
|
}
|
|
|
|
let mut visitor = MessageVisitor {
|
|
message: String::new(),
|
|
};
|
|
event.record(&mut visitor);
|
|
|
|
// If we couldn't extract a message, try to format the whole event
|
|
if visitor.message.is_empty() {
|
|
visitor.message = metadata.name().to_string();
|
|
}
|
|
|
|
// Strip quotes from the message
|
|
let message = visitor.message.trim_matches('"').to_string();
|
|
|
|
let log_event = DebugLogEvent {
|
|
level: level.to_string(),
|
|
message,
|
|
};
|
|
|
|
// Emit to frontend
|
|
let _ = self.app.emit("debug:log", log_event);
|
|
}
|
|
}
|