From ec9738a069e61529be040eff065318972b8a11e2 Mon Sep 17 00:00:00 2001 From: soryu Date: Wed, 4 Mar 2026 16:47:12 +0000 Subject: feat: task slide-out panel, 3-way reconcile toggle, daemon reauth fix (#85) * WIP: heartbeat checkpoint * WIP: heartbeat checkpoint * feat: soryu-co/soryu - makima: Fix daemon reauth flow for new claude setup-token output format * feat: soryu-co/soryu - makima: Update frontend reconcile toggle to three-way switch * feat: soryu-co/soryu - makima: Add task slide-out panel to directive page --- makima/src/server/handlers/mesh_daemon.rs | 8 ++++++-- makima/src/server/handlers/mesh_supervisor.rs | 16 ++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) (limited to 'makima/src/server') diff --git a/makima/src/server/handlers/mesh_daemon.rs b/makima/src/server/handlers/mesh_daemon.rs index 30439a4..d5ef1f9 100644 --- a/makima/src/server/handlers/mesh_daemon.rs +++ b/makima/src/server/handlers/mesh_daemon.rs @@ -354,13 +354,16 @@ pub enum DaemonMessage { ReauthStatus { #[serde(rename = "requestId")] request_id: Uuid, - /// Status: "url_ready", "completed", "failed" + /// Status: "pending", "url_ready", "completed", "failed" status: String, /// OAuth login URL (present when status is "url_ready") #[serde(rename = "loginUrl")] login_url: Option, /// Error message (present when status is "failed") error: Option, + /// Whether the OAuth token has been saved to disk + #[serde(rename = "tokenSaved", default)] + token_saved: bool, }, /// Response to RetryCompletionAction command CompletionActionResult { @@ -1634,13 +1637,14 @@ async fn handle_daemon_connection(socket: WebSocket, state: SharedState, auth_re "OAuth login URL available - user should open this in browser" ); } - Ok(DaemonMessage::ReauthStatus { request_id, status, login_url, error }) => { + Ok(DaemonMessage::ReauthStatus { request_id, status, login_url, error, token_saved }) => { tracing::info!( daemon_id = %daemon_uuid, request_id = %request_id, status = %status, login_url = ?login_url, error = ?error, + token_saved = token_saved, "Daemon reauth status update" ); diff --git a/makima/src/server/handlers/mesh_supervisor.rs b/makima/src/server/handlers/mesh_supervisor.rs index 8c36500..9d2dce7 100644 --- a/makima/src/server/handlers/mesh_supervisor.rs +++ b/makima/src/server/handlers/mesh_supervisor.rs @@ -1715,21 +1715,21 @@ pub async fn ask_question( let is_directive_context = directive_id.is_some() && contract_id.is_none(); // For directive context, check reconcile_mode to determine behavior - let directive_reconcile_mode = if let Some(did) = directive_id { + let directive_reconcile_mode: String = if let Some(did) = directive_id { if is_directive_context { match repository::get_directive_for_owner(pool, owner_id, did).await { - Ok(Some(d)) => d.reconcile_mode, - Ok(None) => false, + Ok(Some(d)) => d.reconcile_mode.clone(), + Ok(None) => "auto".to_string(), Err(e) => { tracing::warn!(error = %e, "Failed to get directive for reconcile_mode check"); - false + "auto".to_string() } } } else { - false + "auto".to_string() } } else { - false + "auto".to_string() }; // Add the question (use Uuid::nil() for contract_id in directive-only context) @@ -1813,7 +1813,7 @@ pub async fn ask_question( } // Determine if we should block indefinitely (phaseguard or directive reconcile mode) - let use_phaseguard = request.phaseguard || (is_directive_context && directive_reconcile_mode); + let use_phaseguard = request.phaseguard || (is_directive_context && (directive_reconcile_mode == "semi-auto" || directive_reconcile_mode == "manual")); // Poll for response with timeout // - Phaseguard: block indefinitely until user responds @@ -1823,7 +1823,7 @@ pub async fn ask_question( // Cap at 5 minutes per HTTP request (well under Claude Code's 10-min limit). // The CLI will automatically reconnect via the poll endpoint. 300 - } else if is_directive_context && !directive_reconcile_mode { + } else if is_directive_context && directive_reconcile_mode == "auto" { 30 } else { request.timeout_seconds.max(1) as u64 -- cgit v1.2.3