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
@@ -481,7 +481,7 @@ fn session_failed_clears_flag_no_fetches() {
|
||||
assert!(!app.agents[&id].pending_extensions_fetch);
|
||||
}
|
||||
#[test]
|
||||
fn switch_model_without_session_does_nothing() {
|
||||
fn switch_model_without_session_starts_the_session() {
|
||||
let mut app = test_app_with_agent();
|
||||
let id = AgentId(0);
|
||||
app.agents.get_mut(&id).unwrap().session.session_id = None;
|
||||
@@ -493,7 +493,14 @@ fn switch_model_without_session_does_nothing() {
|
||||
},
|
||||
&mut app,
|
||||
);
|
||||
assert!(effects.is_empty());
|
||||
// No create was in flight, so the switch starts the session its stash
|
||||
// drains into (the stash alone dangled forever — the /model-in-Downloads
|
||||
// silent no-op). `model_switch_pending` flips on SessionCreated.
|
||||
assert!(
|
||||
effects
|
||||
.iter()
|
||||
.any(|e| matches!(e, Effect::CreateSession { .. }))
|
||||
);
|
||||
assert!(!app.agents[&id].session.model_switch_pending);
|
||||
}
|
||||
#[test]
|
||||
@@ -668,11 +675,17 @@ fn switch_model_deferred_when_no_session_id() {
|
||||
},
|
||||
&mut app,
|
||||
);
|
||||
assert!(effects.is_empty());
|
||||
// Stashed for SessionCreated — and the session it drains into is started
|
||||
// (no create was in flight; a bare stash never drained).
|
||||
assert_eq!(
|
||||
app.agents[&id].session.deferred_model_switch,
|
||||
Some((model_id, None))
|
||||
);
|
||||
assert!(
|
||||
effects
|
||||
.iter()
|
||||
.any(|e| matches!(e, Effect::CreateSession { .. }))
|
||||
);
|
||||
assert!(!app.agents[&id].session.model_switch_pending);
|
||||
}
|
||||
#[test]
|
||||
|
||||
Reference in new issue
Block a user