fix(tui): start the session a sessionless model switch defers into
Launching kigi in a non-project directory (~/Downloads, ~, /tmp — anywhere
`is_project_dir` rejects) leaves the agent view session-less behind the
project-picker question, which only a PLAIN prompt can open. Slash
commands still execute there, so `/model <name> <effort>` stashed its
switch in `deferred_model_switch` — a stash that assumes a create is in
flight — and with none pending it dangled forever with zero feedback:
the picker rendered, the user chose model and effort, and nothing
changed. Not a 0.1.10 regression: 0.1.9 pty-reproduces identically; the
report correlated with the upgrade only because every earlier launch
happened to be from a project directory.
Apply the QueueCommand precedent ("queued slash work bypasses the
picker, so create the deferred session or it never drains") to both
deferral sites — Action::SwitchModel in the router and
set_default_model's no-session branch — via
skip_picker_and_create_session, whose in-flight guard already makes it a
no-op while a create is pending, so the racing-create case is unchanged.
SessionCreated then applies the stash through the existing
apply_deferred_model_switch path; pty-verified end-to-end from
~/Downloads (session created, model changed, effort applied).
This commit is contained in:
1 parent
11c3ca9803
commit
f656627c10
4 files changed
+108
-10
No files matched your search
@@ -62,6 +62,7 @@ use super::session::lifecycle::{
|
||||
clear_startup_actions, dispatch_agent_type_mismatch_answered, dispatch_exit_session,
|
||||
dispatch_new_session, dispatch_new_session_inner, dispatch_new_session_with_id,
|
||||
dispatch_new_worktree_session, dispatch_trust_folder, open_new_session_question,
|
||||
skip_picker_and_create_session,
|
||||
};
|
||||
use super::session::load::{
|
||||
dispatch_cycle_session_source_filter, dispatch_load_session, dispatch_pick_content_session,
|
||||
@@ -749,7 +750,12 @@ pub(crate) fn dispatch(action: Action, app: &mut AppView) -> Vec<Effect> {
|
||||
};
|
||||
let Some(session_id) = agent.session.session_id.clone() else {
|
||||
agent.session.deferred_model_switch = Some((model_id, effort));
|
||||
return vec![];
|
||||
// No session bound: with a create in flight this is a no-op
|
||||
// and `SessionCreated` applies the stash; with none in flight
|
||||
// (project question pending — only a plain prompt opens it) a
|
||||
// switch would dangle forever, so start the session like the
|
||||
// QueueCommand arm does for queued slash work.
|
||||
return skip_picker_and_create_session(app, id);
|
||||
};
|
||||
agent.session.model_switch_pending = true;
|
||||
vec![Effect::SwitchModel {
|
||||
|
||||
Reference in new issue
Block a user