inspect: restore model selection in the advanced picker · Entire
inspect: restore model selection in the advanced picker
3e4d73d→main·
dipree·4w ago·2 files·+60 added/-16 removed
The --edit picker was preserving existing per-inspector models but no longer let users change them. Restore model selection there using the same Default / advertised / current custom / Custom flow as guided setup, and keep current custom models selectable so editing doesn't silently drop them.
Sessions
ab4aeff7836fView transcript
[?
Checkout the hand off doc that I just added.Pi·Opus 4.8·1 step](/content/gh/entireio/cli/session/019eca64-8c2c-7b00-90c6-3aa49738c497#timeline-ab4aeff7836f/index.html)
Changes
2
cmd/entire/cli/review
Mpicker.go+32/-16
Apicker_internal_test.go+28
514 unmodified lines
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
19 unmodified lines
556
557
558
543
544
545
546
547
548
549
550
551
552
553
559
560
561
562
563
564
565
286 unmodified lines
852
853
854
846
847
848
849
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
860
872
873
874
875
876
877
878
879
880
881
882
883
884
885
514 unmodified lines
// promptCrewModel picks a model for a slot: Default, an advertised model, or a
// Custom… free-text value. Returns "" for the agent's own default.
func promptCrewModel(ctx context.Context, agentName, seedModel string) (string, error) {
opions, picked := reviewModelSelectOptions(ctx, agentName, seedModel)
form := newAccessibleForm(huh.NewGroup(
huh.NewSelect[string]().
Title("Model for " + labelForSimpleAgent(agentName)).
Description("Pick a model, Default, or Custom… to type any value.").
Options(options...).
Height(reviewPickerHeight(len(options))).
Value(&picked),
))
if err := form.RunWithContext(ctx); err != nil {
return "", fmt.Errorf("review inspector model: %w", err)
}
return resolvePickedReviewModel(ctx, agentName, picked)
}
func reviewModelSelectOptions(ctx context.Context, agentName, seedModel string) ([]huh.Option[string], string) {
models := listAgentModelOptions(ctx, agentName)
options := make([]huh.Option[string], 0, len(models)+2)
options = append(options, huh.NewOption("Default (agent's own default model)", reviewModelDefaultSentinel))
19 unmodified lines
if seedModel != "" {
picked = seedModel
}
form := newAccessibleForm(huh.NewGroup(
huh.NewSelect[string]().
Title("Model for " + labelForSimpleAgent(agentName)).
Description("Pick a model, Default, or Custom… to type any value.").
Options(options...).
Height(reviewPickerHeight(len(options))).
Value(&picked),
))
if err := form.RunWithContext(ctx); err != nil {
return "", fmt.Errorf("review inspector model: %w", err)
}
return options, picked
}
func resolvePickedReviewModel(ctx context.Context, agentName, picked string) (string, error) {
switch picked {
case reviewModelDefaultSentinel:
return "", nil
}
286 unmodified lines
existing[string(c.name)].Skills, curated, discovered,
)
prompt := existing[string(c.name)].Prompt
// Inspectors run on the agent's default model (guided setup no longer asks
// for one), so the advanced picker doesn't prompt for a model either. Any
// model set via scripted config is preserved untouched.
model := existing[string(c.name)].Model
modelOptions, pickedModel := reviewModelSelectOptions(ctx, string(c.name), existing[string(c.name)].Model)
fields := BuildReviewPickerFields(
string(c.name), curated, discovered, activeHints, prompt,
&builtinPicks, &discoveredPicks, &prompt,
)
fields = append(fields, huh.NewSelect[string]().
Title("Model for "+string(c.ag.Type())).
Description("Pick a model, Default, or Custom… to type any value.").
Options(modelOptions...).
Height(reviewPickerHeight(len(modelOptions))).
Value(&pickedModel))
// Prepend a non-blocking header Note so the agent being configured
// is always clearly visible.
theader := huh.NewNote().
Title(string(c.ag.Type())).
Description(fmt.Sprintf("Agent %d of %d · pick review skills and optional instructions", i+1, len(configurable)))
Description(fmt.Sprintf("Agent %d of %d · pick review skills, model, and optional instructions", i+1, len(configurable)))
fields = append([]huh.Field{header}, fields...)
form := newAccessibleForm(huh.NewGroup(fields...))
if err := form.RunWithContext(ctx); err != nil {
return nil, fmt.Errorf("picker for %s: %w", c.name, err)
}
model, err := resolvePickedReviewModel(ctx, string(c.name), pickedModel)
if err != nil {
return nil, err
}
cfg := settings.ReviewConfig{
Model: strings.TrimSpace(model),
"""
Mcmd/entire/cli/review/picker.go+32/-16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
package review
import ( "context" "testing" )
func TestReviewModelSelectOptionsPreservesCurrentCustomModel(t *testing.T) { t.Parallel() const current = "my-custom-model" options, picked := reviewModelSelectOptions(context.Background(), "unknown-agent", current) if picked != current { t.Fatalf("picked = %q, want current custom model %q", picked, current) } values := make(map[string]bool, len(options)) for _, opt := range options { values[opt.Value] = true } if !values[reviewModelDefaultSentinel] { t.Fatal("default model option missing") } if !values[current] { t.Fatalf("current custom model option %q missing", current) } if !values[reviewModelCustomSentinel] { t.Fatal("custom model option missing") } }