Skip to content
Merged
20 changes: 19 additions & 1 deletion apps/puffer-desktop/src-tauri/src/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,9 @@ impl BackendState {
| "workflow_runs_list"
| "workflow_run_show" => workflow_runtime_unavailable(method),
"run_agent_turn" => self.run_agent_turn(events.clone(), params),
"resolve_permission" | "resolve_user_question" => Ok(json!({})),
"resolve_permission" | "resolve_user_question" => anyhow::bail!(
"{method} requires the daemon turn lifecycle; the in-process backend does not host interactive turns"
),
"cancel_turn" => {
let turn_id = string_param(&params, &["turnId", "turn_id"])?;
if let Some(flag) = self.turns.lock().unwrap().get(&turn_id) {
Expand Down Expand Up @@ -2323,6 +2325,22 @@ mod tests {

static TEST_ENV_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());

#[test]
fn resolver_methods_error_instead_of_noop_success() {
let backend = BackendState::new();
for method in ["resolve_permission", "resolve_user_question"] {
let result = backend.handle(
EventEmitter::websocket_only(),
method,
serde_json::json!({
"turnId": "missing-turn",
"requestId": "missing-request"
}),
);
assert!(result.is_err(), "{method} must not silently succeed");
}
}

#[test]
fn generate_media_result_serializes_artifacts_array() {
let result = GenerateMediaResult {
Expand Down
43 changes: 34 additions & 9 deletions apps/puffer-desktop/src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -434,21 +434,46 @@ fn run_agent_turn(

#[tauri::command]
fn resolve_permission(
_turn_id: String,
_request_id: String,
_action: String,
app: AppHandle,
state: State<'_, SharedBackend>,
turn_id: String,
request_id: String,
action: String,
) -> Result<(), String> {
Ok(())
backend_call(
app,
state,
"resolve_permission",
json!({
"turnId": turn_id,
"requestId": request_id,
"action": action,
}),
)
.map(|_| ())
}

#[tauri::command]
fn resolve_user_question(
_turn_id: String,
_request_id: String,
_answers: Value,
_annotations: Value,
app: AppHandle,
state: State<'_, SharedBackend>,
turn_id: String,
request_id: String,
answers: Value,
annotations: Value,
) -> Result<(), String> {
Ok(())
backend_call(
app,
state,
"resolve_user_question",
json!({
"turnId": turn_id,
"requestId": request_id,
"answers": answers,
"annotations": annotations,
}),
)
.map(|_| ())
}

#[tauri::command]
Expand Down
Loading