A local-first private AI assistant for everyday use. Runs on-device models with encrypted P2P sync, and supports sharing chats publicly on ATProto.
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: Fixed last line vanishing issue

- This is due to the cursor is not moved after that and
so it could be override. So we explicitly add double newline to
move cursor down.

madclaws eb380330 6153dea9

+14 -12
+14 -12
tiles/src/runtime/mlx.rs
··· 432 432 // called `Result::unwrap()` on an `Err` value: Os { code: 32, kind: BrokenPipe, message: "Broken pipe" } 433 433 // 434 434 // User pressed Ctrl+C or Ctrl+D 435 - // let end_payload = json!({ 436 - // "type": "abort", 437 - // }); 438 - // let payload_str = format!("{}\n", serde_json::to_string(&end_payload)?); 439 - // pi_stdin.write_all(payload_str.as_bytes())?; 440 - // pi_stdin.flush()?; 435 + let end_payload = json!({ 436 + "type": "abort", 437 + }); 438 + let payload_str = format!("{}\n", serde_json::to_string(&end_payload)?); 439 + pi_stdin.write_all(payload_str.as_bytes())?; 440 + pi_stdin.flush()?; 441 441 println!("Exiting interactive mode"); 442 442 if !cfg!(debug_assertions) { 443 443 let _res = mlx_runtime.stop_server_daemon().await; ··· 452 452 match handle_input(&input) { 453 453 InputType::Skip => continue, 454 454 InputType::Exit => { 455 - // let end_payload = json!({ 456 - // "type": "abort", 457 - // }); 458 - // let payload_str = format!("{}\n", serde_json::to_string(&end_payload)?); 459 - // pi_stdin.write_all(payload_str.as_bytes())?; 460 - // pi_stdin.flush()?; 455 + let end_payload = json!({ 456 + "type": "abort", 457 + }); 458 + let payload_str = format!("{}\n", serde_json::to_string(&end_payload)?); 459 + pi_stdin.write_all(payload_str.as_bytes())?; 460 + pi_stdin.flush()?; 461 461 println!("Exiting interactive mode"); 462 462 if !cfg!(debug_assertions) { 463 463 let _res = mlx_runtime.stop_server_daemon().await; ··· 530 530 && msg_update.assistant_message_event.delta.is_some() 531 531 { 532 532 let delta = msg_update.assistant_message_event.delta.unwrap(); 533 + 533 534 if delta.contains("**[Answer]**") { 534 535 has_answer_start = true; 535 536 } ··· 547 548 break; 548 549 } 549 550 PiResponse::TurnEnd(turn_event) => { 551 + println!("\n"); 550 552 session_turn_count += 1; 551 553 552 554 // on agent end create a new session entry, only for the