@oh-my-pi/pi-coding-agent 15.11.3 → 15.11.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/cli.js +353 -294
  3. package/dist/types/config/api-key-resolver.d.ts +9 -3
  4. package/dist/types/config/keybindings.d.ts +1 -1
  5. package/dist/types/config/model-discovery.d.ts +6 -4
  6. package/dist/types/config/model-registry.d.ts +7 -4
  7. package/dist/types/config/settings-schema.d.ts +458 -155
  8. package/dist/types/export/html/template.generated.d.ts +1 -1
  9. package/dist/types/mnemopi/config.d.ts +3 -1
  10. package/dist/types/modes/components/settings-defs.d.ts +9 -2
  11. package/dist/types/modes/components/settings-selector.d.ts +9 -4
  12. package/dist/types/modes/components/tool-execution.d.ts +12 -1
  13. package/dist/types/modes/components/transcript-container.d.ts +12 -0
  14. package/dist/types/modes/controllers/input-controller.d.ts +9 -1
  15. package/dist/types/modes/theme/theme.d.ts +23 -3
  16. package/dist/types/session/agent-session.d.ts +14 -7
  17. package/dist/types/session/auth-storage.d.ts +1 -1
  18. package/dist/types/session/snapcompact-inline.d.ts +28 -0
  19. package/dist/types/slash-commands/helpers/active-oauth-account.d.ts +14 -0
  20. package/dist/types/system-prompt.d.ts +3 -1
  21. package/dist/types/task/render.d.ts +16 -6
  22. package/dist/types/tools/gh.d.ts +3 -0
  23. package/dist/types/tools/render-utils.d.ts +8 -16
  24. package/dist/types/utils/session-color.d.ts +15 -3
  25. package/dist/types/web/kagi.d.ts +1 -2
  26. package/dist/types/web/search/providers/codex.d.ts +1 -1
  27. package/dist/types/web/search/providers/gemini.d.ts +9 -6
  28. package/package.json +11 -11
  29. package/src/auto-thinking/classifier.ts +1 -5
  30. package/src/commit/model-selection.ts +3 -6
  31. package/src/config/api-key-resolver.ts +10 -3
  32. package/src/config/keybindings.ts +1 -1
  33. package/src/config/model-discovery.ts +60 -46
  34. package/src/config/model-registry.ts +21 -8
  35. package/src/config/model-resolver.ts +57 -3
  36. package/src/config/settings-schema.ts +601 -153
  37. package/src/eval/completion-bridge.ts +1 -5
  38. package/src/export/html/template.generated.ts +1 -1
  39. package/src/export/html/template.js +13 -6
  40. package/src/internal-urls/docs-index.generated.ts +5 -5
  41. package/src/internal-urls/issue-pr-protocol.ts +10 -4
  42. package/src/memories/index.ts +2 -10
  43. package/src/mnemopi/backend.ts +30 -8
  44. package/src/mnemopi/config.ts +6 -1
  45. package/src/mnemopi/state.ts +6 -0
  46. package/src/modes/components/extensions/inspector-panel.ts +6 -2
  47. package/src/modes/components/plan-review-overlay.ts +15 -17
  48. package/src/modes/components/plugin-settings.ts +22 -5
  49. package/src/modes/components/settings-defs.ts +19 -4
  50. package/src/modes/components/settings-selector.ts +493 -93
  51. package/src/modes/components/status-line/component.ts +3 -1
  52. package/src/modes/components/status-line/segments.ts +3 -1
  53. package/src/modes/components/tool-execution.ts +69 -12
  54. package/src/modes/components/transcript-container.ts +26 -0
  55. package/src/modes/components/tree-selector.ts +16 -6
  56. package/src/modes/controllers/command-controller.ts +37 -7
  57. package/src/modes/controllers/event-controller.ts +1 -0
  58. package/src/modes/controllers/input-controller.ts +68 -6
  59. package/src/modes/controllers/selector-controller.ts +81 -61
  60. package/src/modes/interactive-mode.ts +4 -2
  61. package/src/modes/rpc/rpc-mode.ts +2 -1
  62. package/src/modes/shared.ts +2 -0
  63. package/src/modes/theme/theme.ts +100 -7
  64. package/src/modes/utils/context-usage.ts +3 -1
  65. package/src/modes/utils/hotkeys-markdown.ts +1 -1
  66. package/src/modes/utils/ui-helpers.ts +9 -5
  67. package/src/prompts/system/personalities/default.md +26 -0
  68. package/src/prompts/system/personalities/friendly.md +17 -0
  69. package/src/prompts/system/personalities/pragmatic.md +15 -0
  70. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  71. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  72. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  73. package/src/prompts/system/system-prompt.md +5 -22
  74. package/src/prompts/tools/task.md +3 -3
  75. package/src/sdk.ts +22 -1
  76. package/src/session/agent-session.ts +91 -24
  77. package/src/session/auth-storage.ts +1 -0
  78. package/src/session/session-dump-format.ts +8 -1
  79. package/src/session/session-manager.ts +5 -5
  80. package/src/session/snapcompact-inline.ts +187 -0
  81. package/src/slash-commands/helpers/active-oauth-account.ts +44 -0
  82. package/src/slash-commands/helpers/usage-report.ts +24 -3
  83. package/src/system-prompt.ts +15 -1
  84. package/src/task/render.ts +29 -19
  85. package/src/tool-discovery/tool-index.ts +2 -0
  86. package/src/tools/bash.ts +10 -3
  87. package/src/tools/eval-render.ts +13 -8
  88. package/src/tools/gh.ts +39 -1
  89. package/src/tools/image-gen.ts +114 -78
  90. package/src/tools/inspect-image.ts +1 -5
  91. package/src/tools/job.ts +25 -5
  92. package/src/tools/read.ts +1 -57
  93. package/src/tools/render-utils.ts +29 -31
  94. package/src/tools/ssh.ts +3 -3
  95. package/src/tools/tts.ts +40 -20
  96. package/src/utils/clipboard.ts +56 -4
  97. package/src/utils/commit-message-generator.ts +1 -5
  98. package/src/utils/session-color.ts +83 -9
  99. package/src/utils/title-generator.ts +1 -1
  100. package/src/web/kagi.ts +26 -27
  101. package/src/web/search/providers/codex.ts +42 -40
  102. package/src/web/search/providers/gemini.ts +42 -22
  103. package/src/web/search/providers/perplexity.ts +22 -10
@@ -25,11 +25,15 @@ import { EDIT_MODES } from "../utils/edit-mode";
25
25
  import { SEARCH_PROVIDER_OPTIONS, SEARCH_PROVIDER_PREFERENCES } from "../web/search/types";
26
26
 
27
27
  /** Unified settings schema - single source of truth for all settings.
28
- * Unified settings schema - single source of truth for all settings.
29
28
  *
30
29
  * Each setting is defined once here with:
31
30
  * - Type and default value
32
- * - Optional UI metadata (label, description, tab)
31
+ * - Optional UI metadata (label, description, tab, group)
32
+ *
33
+ * UI metadata places the setting in the settings panel: `tab` picks the
34
+ * panel tab, `group` the titled section within it (registered in
35
+ * TAB_GROUPS). Sections render in TAB_GROUPS order; settings within a
36
+ * section keep declaration order.
33
37
  *
34
38
  * The Settings singleton provides type-safe path-based access:
35
39
  * settings.get("compaction.enabled") // => boolean
@@ -46,7 +50,8 @@ export type SettingTab =
46
50
  | "interaction"
47
51
  | "context"
48
52
  | "memory"
49
- | "editing"
53
+ | "files"
54
+ | "shell"
50
55
  | "tools"
51
56
  | "tasks"
52
57
  | "providers";
@@ -61,7 +66,8 @@ export const SETTING_TABS: SettingTab[] = [
61
66
  "interaction",
62
67
  "context",
63
68
  "memory",
64
- "editing",
69
+ "files",
70
+ "shell",
65
71
  "tools",
66
72
  "tasks",
67
73
  "providers",
@@ -74,12 +80,48 @@ export const TAB_METADATA: Record<SettingTab, { label: string; icon: `tab.${stri
74
80
  interaction: { label: "Interaction", icon: "tab.interaction" },
75
81
  context: { label: "Context", icon: "tab.context" },
76
82
  memory: { label: "Memory", icon: "tab.memory" },
77
- editing: { label: "Editing", icon: "tab.editing" },
83
+ files: { label: "Files", icon: "tab.files" },
84
+ shell: { label: "Shell", icon: "tab.shell" },
78
85
  tools: { label: "Tools", icon: "tab.tools" },
79
86
  tasks: { label: "Tasks", icon: "tab.tasks" },
80
87
  providers: { label: "Providers", icon: "tab.providers" },
81
88
  };
82
89
 
90
+ /**
91
+ * Ordered section groups per tab. Settings declare their section via `ui.group`;
92
+ * the settings UI renders groups in this order with a heading row between them.
93
+ * Ungrouped settings render first, before any section heading.
94
+ */
95
+ export const TAB_GROUPS: Record<SettingTab, readonly string[]> = {
96
+ appearance: ["Theme", "Status Line", "Display", "Images"],
97
+ model: ["Thinking", "Sampling", "Prompt", "Retry & Fallback"],
98
+ interaction: [
99
+ "Input",
100
+ "Approvals",
101
+ "Notifications",
102
+ "Speech",
103
+ "Magic Keywords",
104
+ "Startup & Updates",
105
+ "Power (macOS)",
106
+ ],
107
+ context: ["General", "Compaction", "Rules (TTSR)", "Experimental"],
108
+ memory: ["General", "Mnemopi", "Hindsight"],
109
+ files: ["Editing", "Reading", "Read Summaries", "LSP"],
110
+ shell: ["Bash", "Eval & Python"],
111
+ tools: [
112
+ "Available Tools",
113
+ "Todos",
114
+ "Search & Browser",
115
+ "GitHub",
116
+ "Output Limits",
117
+ "Execution",
118
+ "Discovery & MCP",
119
+ "Developer",
120
+ ],
121
+ tasks: ["Modes", "Subagents", "Isolation", "Commands & Skills"],
122
+ providers: ["Services", "Tiny Model", "Protocol", "Privacy"],
123
+ };
124
+
83
125
  /** Status line segment identifiers */
84
126
  export type StatusLineSegmentId =
85
127
  | "pi"
@@ -115,6 +157,8 @@ export type SubmenuOption<V extends string = string> = {
115
157
 
116
158
  interface UiBase {
117
159
  tab: SettingTab;
160
+ /** Section within the tab; must be listed in TAB_GROUPS[tab]. Ungrouped settings render at the top. */
161
+ group?: string;
118
162
  label: string;
119
163
  description: string;
120
164
  /** Condition function name - setting only shown when true */
@@ -273,6 +317,7 @@ export const SETTINGS_SCHEMA = {
273
317
  default: false,
274
318
  ui: {
275
319
  tab: "interaction",
320
+ group: "Startup & Updates",
276
321
  label: "Auto Resume",
277
322
  description: "Automatically resume the most recent session in the current directory",
278
323
  },
@@ -284,8 +329,9 @@ export const SETTINGS_SCHEMA = {
284
329
  default: true,
285
330
  ui: {
286
331
  tab: "interaction",
287
- label: "Prevent Idle Sleep (macOS)",
288
- description: "caffeinate -i: keep the system awake while a session is open",
332
+ group: "Power (macOS)",
333
+ label: "Prevent Idle Sleep",
334
+ description: "Keep the system awake while a session is open (caffeinate -i)",
289
335
  },
290
336
  },
291
337
  "power.preventSystemSleep": {
@@ -293,8 +339,9 @@ export const SETTINGS_SCHEMA = {
293
339
  default: false,
294
340
  ui: {
295
341
  tab: "interaction",
296
- label: "Prevent System Sleep on AC (macOS)",
297
- description: "caffeinate -s: block all system sleep while on AC power",
342
+ group: "Power (macOS)",
343
+ label: "Prevent System Sleep on AC",
344
+ description: "Block all system sleep while on AC power (caffeinate -s)",
298
345
  },
299
346
  },
300
347
  "power.declareUserActive": {
@@ -302,8 +349,9 @@ export const SETTINGS_SCHEMA = {
302
349
  default: false,
303
350
  ui: {
304
351
  tab: "interaction",
305
- label: "Declare User Active (macOS)",
306
- description: "caffeinate -u: keep the display lit and treat the user as active",
352
+ group: "Power (macOS)",
353
+ label: "Declare User Active",
354
+ description: "Keep the display lit and treat the user as active (caffeinate -u)",
307
355
  },
308
356
  },
309
357
  "power.preventDisplaySleep": {
@@ -311,30 +359,15 @@ export const SETTINGS_SCHEMA = {
311
359
  default: false,
312
360
  ui: {
313
361
  tab: "interaction",
314
- label: "Prevent Display Sleep (macOS)",
315
- description: "caffeinate -d: keep the display from idle-sleeping while a session is open",
362
+ group: "Power (macOS)",
363
+ label: "Prevent Display Sleep",
364
+ description: "Keep the display from idle-sleeping while a session is open (caffeinate -d)",
316
365
  },
317
366
  },
318
367
  shellPath: { type: "string", default: undefined },
319
368
 
320
369
  extensions: { type: "array", default: EMPTY_STRING_ARRAY },
321
370
 
322
- "marketplace.autoUpdate": {
323
- type: "enum",
324
- values: ["off", "notify", "auto"] as const,
325
- default: "notify",
326
- ui: {
327
- tab: "tools",
328
- label: "Marketplace Auto-Update",
329
- description: "Check for plugin updates on startup (off/notify/auto)",
330
- options: [
331
- { value: "off", label: "Off", description: "Don't check for plugin updates" },
332
- { value: "notify", label: "Notify", description: "Check on startup and notify when updates are available" },
333
- { value: "auto", label: "Auto", description: "Check on startup and auto-install updates" },
334
- ],
335
- },
336
- },
337
-
338
371
  enabledModels: { type: "array", default: EMPTY_STRING_ARRAY },
339
372
 
340
373
  disabledProviders: { type: "array", default: EMPTY_STRING_ARRAY },
@@ -359,8 +392,9 @@ export const SETTINGS_SCHEMA = {
359
392
  default: "titanium",
360
393
  ui: {
361
394
  tab: "appearance",
395
+ group: "Theme",
362
396
  label: "Dark Theme",
363
- description: "Theme used when terminal has dark background",
397
+ description: "Theme used when the terminal has a dark background",
364
398
  options: "runtime",
365
399
  },
366
400
  },
@@ -370,8 +404,9 @@ export const SETTINGS_SCHEMA = {
370
404
  default: "light",
371
405
  ui: {
372
406
  tab: "appearance",
407
+ group: "Theme",
373
408
  label: "Light Theme",
374
- description: "Theme used when terminal has light background",
409
+ description: "Theme used when the terminal has a light background",
375
410
  options: "runtime",
376
411
  },
377
412
  },
@@ -382,8 +417,9 @@ export const SETTINGS_SCHEMA = {
382
417
  default: "unicode",
383
418
  ui: {
384
419
  tab: "appearance",
420
+ group: "Theme",
385
421
  label: "Symbol Preset",
386
- description: "Icon/symbol style",
422
+ description: "Glyph set for icons and symbols (Unicode, Nerd Font, or ASCII)",
387
423
  options: [
388
424
  { value: "unicode", label: "Unicode", description: "Standard symbols (default)" },
389
425
  { value: "nerd", label: "Nerd Font", description: "Requires Nerd Font" },
@@ -397,6 +433,7 @@ export const SETTINGS_SCHEMA = {
397
433
  default: false,
398
434
  ui: {
399
435
  tab: "appearance",
436
+ group: "Theme",
400
437
  label: "Color-Blind Mode",
401
438
  description: "Use blue instead of green for diff additions",
402
439
  },
@@ -409,6 +446,7 @@ export const SETTINGS_SCHEMA = {
409
446
  default: "default",
410
447
  ui: {
411
448
  tab: "appearance",
449
+ group: "Status Line",
412
450
  label: "Status Line Preset",
413
451
  description: "Pre-built status line configurations",
414
452
  options: [
@@ -429,6 +467,7 @@ export const SETTINGS_SCHEMA = {
429
467
  default: "powerline-thin",
430
468
  ui: {
431
469
  tab: "appearance",
470
+ group: "Status Line",
432
471
  label: "Status Line Separator",
433
472
  description: "Style of separators between segments",
434
473
  options: [
@@ -448,6 +487,7 @@ export const SETTINGS_SCHEMA = {
448
487
  default: true,
449
488
  ui: {
450
489
  tab: "appearance",
490
+ group: "Status Line",
451
491
  label: "Session Accent",
452
492
  description: "Use the session name color for the editor border and status line gap",
453
493
  },
@@ -458,6 +498,7 @@ export const SETTINGS_SCHEMA = {
458
498
  default: false,
459
499
  ui: {
460
500
  tab: "appearance",
501
+ group: "Status Line",
461
502
  label: "Transparent Status Line",
462
503
  description:
463
504
  "Use the terminal's default background for the status line instead of the theme's `statusLineBg`. Powerline end caps are dropped because they need a contrasting fill to bridge into the surrounding terminal.",
@@ -468,7 +509,8 @@ export const SETTINGS_SCHEMA = {
468
509
  default: 50,
469
510
  ui: {
470
511
  tab: "tools",
471
- label: "Artifact spill threshold (KB)",
512
+ group: "Output Limits",
513
+ label: "Artifact Spill Threshold (KB)",
472
514
  description: "Tool output above this size is saved as an artifact; tail is kept inline",
473
515
  options: [
474
516
  { value: "1", label: "1 KB", description: "~250 tokens" },
@@ -491,7 +533,8 @@ export const SETTINGS_SCHEMA = {
491
533
  default: 20,
492
534
  ui: {
493
535
  tab: "tools",
494
- label: "Artifact tail size (KB)",
536
+ group: "Output Limits",
537
+ label: "Artifact Tail Size (KB)",
495
538
  description: "Amount of tail content kept inline when output spills to artifact",
496
539
  options: [
497
540
  { value: "1", label: "1 KB", description: "~250 tokens" },
@@ -510,7 +553,8 @@ export const SETTINGS_SCHEMA = {
510
553
  default: 20,
511
554
  ui: {
512
555
  tab: "tools",
513
- label: "Artifact head size (KB)",
556
+ group: "Output Limits",
557
+ label: "Artifact Head Size (KB)",
514
558
  description:
515
559
  "Amount of head content kept inline alongside the tail when output spills to artifact (middle elision). 0 disables — keep tail only.",
516
560
  options: [
@@ -531,7 +575,8 @@ export const SETTINGS_SCHEMA = {
531
575
  default: 768,
532
576
  ui: {
533
577
  tab: "tools",
534
- label: "Output column cap",
578
+ group: "Output Limits",
579
+ label: "Output Column Cap",
535
580
  description:
536
581
  "Per-line byte cap for streaming tool outputs (bash, ssh, python, js eval) and `read`. Lines wider than this are ellipsis-truncated; remaining bytes up to the next newline are dropped. 0 disables.",
537
582
  options: [
@@ -550,7 +595,8 @@ export const SETTINGS_SCHEMA = {
550
595
  default: 500,
551
596
  ui: {
552
597
  tab: "tools",
553
- label: "Artifact tail lines",
598
+ group: "Output Limits",
599
+ label: "Artifact Tail Lines",
554
600
  description: "Maximum lines of tail content kept inline when output spills to artifact",
555
601
  options: [
556
602
  { value: "50", label: "50 lines", description: "~250 tokens" },
@@ -569,8 +615,9 @@ export const SETTINGS_SCHEMA = {
569
615
  default: true,
570
616
  ui: {
571
617
  tab: "appearance",
618
+ group: "Status Line",
572
619
  label: "Show Hook Status",
573
- description: "Display hook status messages below status line",
620
+ description: "Display hook status messages below the status line",
574
621
  },
575
622
  },
576
623
 
@@ -586,8 +633,9 @@ export const SETTINGS_SCHEMA = {
586
633
  default: true,
587
634
  ui: {
588
635
  tab: "appearance",
636
+ group: "Images",
589
637
  label: "Show Inline Images",
590
- description: "Render images inline in terminal",
638
+ description: "Render images inline in the terminal",
591
639
  condition: "hasImageProtocol",
592
640
  },
593
641
  },
@@ -597,6 +645,7 @@ export const SETTINGS_SCHEMA = {
597
645
  default: true,
598
646
  ui: {
599
647
  tab: "appearance",
648
+ group: "Images",
600
649
  label: "Auto-Resize Images",
601
650
  description: "Resize large images to 2000x2000 max for better model compatibility",
602
651
  },
@@ -605,7 +654,12 @@ export const SETTINGS_SCHEMA = {
605
654
  "images.blockImages": {
606
655
  type: "boolean",
607
656
  default: false,
608
- ui: { tab: "appearance", label: "Block Images", description: "Prevent images from being sent to LLM providers" },
657
+ ui: {
658
+ tab: "appearance",
659
+ group: "Images",
660
+ label: "Block Images",
661
+ description: "Prevent images from being sent to LLM providers",
662
+ },
609
663
  },
610
664
 
611
665
  "tui.maxInlineImageColumns": {
@@ -634,6 +688,7 @@ export const SETTINGS_SCHEMA = {
634
688
  default: false,
635
689
  ui: {
636
690
  tab: "appearance",
691
+ group: "Display",
637
692
  label: "Large Headings (Kitty)",
638
693
  description:
639
694
  "Render Markdown H1 headings at 2x scale using Kitty's OSC 66 text-sizing protocol. Only takes effect on Kitty terminals; ignored everywhere else. Off by default.",
@@ -646,6 +701,7 @@ export const SETTINGS_SCHEMA = {
646
701
  default: "auto",
647
702
  ui: {
648
703
  tab: "appearance",
704
+ group: "Display",
649
705
  label: "Terminal Hyperlinks",
650
706
  description:
651
707
  "Wrap paths and URLs in OSC 8 hyperlinks for terminal-native click-to-open (auto: detect support; off: never; always: unconditional)",
@@ -663,6 +719,7 @@ export const SETTINGS_SCHEMA = {
663
719
  default: "classic",
664
720
  ui: {
665
721
  tab: "appearance",
722
+ group: "Display",
666
723
  label: "Shimmer",
667
724
  description: "Animation style for working/loading messages",
668
725
  options: [
@@ -678,6 +735,7 @@ export const SETTINGS_SCHEMA = {
678
735
  default: true,
679
736
  ui: {
680
737
  tab: "appearance",
738
+ group: "Display",
681
739
  label: "Smooth Streaming",
682
740
  description: "Reveal assistant text and streamed tool input smoothly while chunks arrive",
683
741
  },
@@ -688,6 +746,7 @@ export const SETTINGS_SCHEMA = {
688
746
  default: false,
689
747
  ui: {
690
748
  tab: "appearance",
749
+ group: "Display",
691
750
  label: "Show Token Usage",
692
751
  description: "Show per-turn token usage on assistant messages",
693
752
  },
@@ -696,7 +755,12 @@ export const SETTINGS_SCHEMA = {
696
755
  showHardwareCursor: {
697
756
  type: "boolean",
698
757
  default: true, // will be computed based on platform if undefined
699
- ui: { tab: "appearance", label: "Show Hardware Cursor", description: "Show terminal cursor for IME support" },
758
+ ui: {
759
+ tab: "appearance",
760
+ group: "Display",
761
+ label: "Show Hardware Cursor",
762
+ description: "Show terminal cursor for IME support",
763
+ },
700
764
  },
701
765
 
702
766
  // ────────────────────────────────────────────────────────────────────────
@@ -710,6 +774,7 @@ export const SETTINGS_SCHEMA = {
710
774
  default: "high",
711
775
  ui: {
712
776
  tab: "model",
777
+ group: "Thinking",
713
778
  label: "Thinking Level",
714
779
  description: "Reasoning depth for thinking-capable models",
715
780
  options: [
@@ -722,7 +787,12 @@ export const SETTINGS_SCHEMA = {
722
787
  hideThinkingBlock: {
723
788
  type: "boolean",
724
789
  default: false,
725
- ui: { tab: "model", label: "Hide Thinking Blocks", description: "Hide thinking blocks in assistant responses" },
790
+ ui: {
791
+ tab: "model",
792
+ group: "Thinking",
793
+ label: "Hide Thinking Blocks",
794
+ description: "Hide thinking blocks in assistant responses",
795
+ },
726
796
  },
727
797
 
728
798
  repeatToolDescriptions: {
@@ -730,6 +800,7 @@ export const SETTINGS_SCHEMA = {
730
800
  default: false,
731
801
  ui: {
732
802
  tab: "model",
803
+ group: "Prompt",
733
804
  label: "Repeat Tool Descriptions",
734
805
  description: "Render full tool descriptions in the system prompt instead of a tool name list",
735
806
  },
@@ -740,17 +811,49 @@ export const SETTINGS_SCHEMA = {
740
811
  default: true,
741
812
  ui: {
742
813
  tab: "model",
743
- label: "Include Model In Prompt",
814
+ group: "Prompt",
815
+ label: "Include Model in Prompt",
744
816
  description: "Surface the active model identifier in the system prompt so the agent knows which model it is",
745
817
  },
746
818
  },
747
819
 
820
+ personality: {
821
+ type: "enum",
822
+ values: ["default", "friendly", "pragmatic", "none"] as const,
823
+ default: "default",
824
+ ui: {
825
+ tab: "model",
826
+ group: "Prompt",
827
+ label: "Personality",
828
+ description: "Communication style rendered into the system prompt's personality block",
829
+ options: [
830
+ {
831
+ value: "default",
832
+ label: "Default",
833
+ description: "Terse, evidence-first engineer; dense, action-oriented replies",
834
+ },
835
+ {
836
+ value: "friendly",
837
+ label: "Friendly",
838
+ description: "Warm, encouraging collaborator focused on momentum and morale",
839
+ },
840
+ {
841
+ value: "pragmatic",
842
+ label: "Pragmatic",
843
+ description: "Direct, efficient engineer focused on clarity and rigor",
844
+ },
845
+ { value: "none", label: "None", description: "Omit the personality block entirely" },
846
+ ],
847
+ },
848
+ },
849
+
748
850
  // Sampling
749
851
  temperature: {
750
852
  type: "number",
751
853
  default: -1,
752
854
  ui: {
753
855
  tab: "model",
856
+ group: "Sampling",
754
857
  label: "Temperature",
755
858
  description: "Sampling temperature (0 = deterministic, 1 = creative, -1 = provider default)",
756
859
  options: [
@@ -769,6 +872,7 @@ export const SETTINGS_SCHEMA = {
769
872
  default: -1,
770
873
  ui: {
771
874
  tab: "model",
875
+ group: "Sampling",
772
876
  label: "Top P",
773
877
  description: "Nucleus sampling cutoff (0-1, -1 = provider default)",
774
878
  options: [
@@ -787,6 +891,7 @@ export const SETTINGS_SCHEMA = {
787
891
  default: -1,
788
892
  ui: {
789
893
  tab: "model",
894
+ group: "Sampling",
790
895
  label: "Top K",
791
896
  description: "Sample from top-K tokens (-1 = provider default)",
792
897
  options: [
@@ -804,6 +909,7 @@ export const SETTINGS_SCHEMA = {
804
909
  default: -1,
805
910
  ui: {
806
911
  tab: "model",
912
+ group: "Sampling",
807
913
  label: "Min P",
808
914
  description: "Minimum probability threshold (0-1, -1 = provider default)",
809
915
  options: [
@@ -820,6 +926,7 @@ export const SETTINGS_SCHEMA = {
820
926
  default: -1,
821
927
  ui: {
822
928
  tab: "model",
929
+ group: "Sampling",
823
930
  label: "Presence Penalty",
824
931
  description: "Penalty for introducing already-present tokens (-1 = provider default)",
825
932
  options: [
@@ -837,6 +944,7 @@ export const SETTINGS_SCHEMA = {
837
944
  default: -1,
838
945
  ui: {
839
946
  tab: "model",
947
+ group: "Sampling",
840
948
  label: "Repetition Penalty",
841
949
  description: "Penalty for repeated tokens (-1 = provider default)",
842
950
  options: [
@@ -856,6 +964,7 @@ export const SETTINGS_SCHEMA = {
856
964
  default: "none",
857
965
  ui: {
858
966
  tab: "model",
967
+ group: "Sampling",
859
968
  label: "Service Tier",
860
969
  description:
861
970
  'Processing priority hint (none = omit). OpenAI accepts the tier values directly; Anthropic realizes `priority` as `speed: "fast"` on supported Opus models. Scoped values target one family.',
@@ -892,6 +1001,7 @@ export const SETTINGS_SCHEMA = {
892
1001
  default: 10,
893
1002
  ui: {
894
1003
  tab: "model",
1004
+ group: "Retry & Fallback",
895
1005
  label: "Retry Attempts",
896
1006
  description: "Maximum retry attempts on API errors",
897
1007
  options: [
@@ -910,6 +1020,7 @@ export const SETTINGS_SCHEMA = {
910
1020
  default: 5 * 60 * 1000,
911
1021
  ui: {
912
1022
  tab: "model",
1023
+ group: "Retry & Fallback",
913
1024
  label: "Max Retry Delay",
914
1025
  description:
915
1026
  "Maximum wait between retries, in ms. When the provider asks us to wait longer than this and no credential or model fallback succeeds, the request fails fast instead of sleeping (e.g. 3-hour Anthropic rate-limit windows).",
@@ -920,6 +1031,7 @@ export const SETTINGS_SCHEMA = {
920
1031
  default: true,
921
1032
  ui: {
922
1033
  tab: "model",
1034
+ group: "Retry & Fallback",
923
1035
  label: "Retry Model Fallback",
924
1036
  description: "Allow retry recovery to switch to configured fallback models",
925
1037
  },
@@ -931,6 +1043,7 @@ export const SETTINGS_SCHEMA = {
931
1043
  default: "cooldown-expiry",
932
1044
  ui: {
933
1045
  tab: "model",
1046
+ group: "Retry & Fallback",
934
1047
  label: "Fallback Revert Policy",
935
1048
  description: "When to return to the primary model after a fallback",
936
1049
  options: [
@@ -955,6 +1068,7 @@ export const SETTINGS_SCHEMA = {
955
1068
  default: "one-at-a-time",
956
1069
  ui: {
957
1070
  tab: "interaction",
1071
+ group: "Input",
958
1072
  label: "Steering Mode",
959
1073
  description: "How to process queued messages while agent is working",
960
1074
  },
@@ -966,6 +1080,7 @@ export const SETTINGS_SCHEMA = {
966
1080
  default: "one-at-a-time",
967
1081
  ui: {
968
1082
  tab: "interaction",
1083
+ group: "Input",
969
1084
  label: "Follow-Up Mode",
970
1085
  description: "How to drain follow-up messages after a turn completes",
971
1086
  },
@@ -977,6 +1092,7 @@ export const SETTINGS_SCHEMA = {
977
1092
  default: "immediate",
978
1093
  ui: {
979
1094
  tab: "interaction",
1095
+ group: "Input",
980
1096
  label: "Interrupt Mode",
981
1097
  description: "When steering messages interrupt tool execution",
982
1098
  },
@@ -988,6 +1104,7 @@ export const SETTINGS_SCHEMA = {
988
1104
  default: "prompt",
989
1105
  ui: {
990
1106
  tab: "interaction",
1107
+ group: "Input",
991
1108
  label: "Loop Mode",
992
1109
  description: "What happens between /loop iterations before re-submitting the prompt",
993
1110
  options: [
@@ -1013,6 +1130,7 @@ export const SETTINGS_SCHEMA = {
1013
1130
  default: "tree",
1014
1131
  ui: {
1015
1132
  tab: "interaction",
1133
+ group: "Input",
1016
1134
  label: "Double-Escape Action",
1017
1135
  description: "Action when pressing Escape twice with empty editor",
1018
1136
  },
@@ -1024,6 +1142,7 @@ export const SETTINGS_SCHEMA = {
1024
1142
  default: "default",
1025
1143
  ui: {
1026
1144
  tab: "interaction",
1145
+ group: "Input",
1027
1146
  label: "Session Tree Filter",
1028
1147
  description: "Default filter mode when opening the session tree",
1029
1148
  },
@@ -1034,6 +1153,7 @@ export const SETTINGS_SCHEMA = {
1034
1153
  default: 5,
1035
1154
  ui: {
1036
1155
  tab: "interaction",
1156
+ group: "Input",
1037
1157
  label: "Autocomplete Items",
1038
1158
  description: "Max visible items in autocomplete dropdown (3-20)",
1039
1159
  options: [
@@ -1052,6 +1172,7 @@ export const SETTINGS_SCHEMA = {
1052
1172
  default: true,
1053
1173
  ui: {
1054
1174
  tab: "interaction",
1175
+ group: "Input",
1055
1176
  label: "Emoji Autocomplete",
1056
1177
  description: "Suggest emojis from `:name:` shortcodes and expand text emoticons like `:D` or `:-)`",
1057
1178
  },
@@ -1062,6 +1183,7 @@ export const SETTINGS_SCHEMA = {
1062
1183
  default: false,
1063
1184
  ui: {
1064
1185
  tab: "interaction",
1186
+ group: "Startup & Updates",
1065
1187
  label: "Quiet Startup",
1066
1188
  description: "Skip welcome screen and startup status messages",
1067
1189
  },
@@ -1072,6 +1194,7 @@ export const SETTINGS_SCHEMA = {
1072
1194
  default: true,
1073
1195
  ui: {
1074
1196
  tab: "interaction",
1197
+ group: "Startup & Updates",
1075
1198
  label: "Setup Wizard",
1076
1199
  description: "Show newly added onboarding steps once per setup version",
1077
1200
  },
@@ -1082,15 +1205,38 @@ export const SETTINGS_SCHEMA = {
1082
1205
  default: true,
1083
1206
  ui: {
1084
1207
  tab: "interaction",
1208
+ group: "Startup & Updates",
1085
1209
  label: "Check for Updates",
1086
- description: "If false, skip update check",
1210
+ description: "Check for omp updates on startup",
1211
+ },
1212
+ },
1213
+
1214
+ "marketplace.autoUpdate": {
1215
+ type: "enum",
1216
+ values: ["off", "notify", "auto"] as const,
1217
+ default: "notify",
1218
+ ui: {
1219
+ tab: "interaction",
1220
+ group: "Startup & Updates",
1221
+ label: "Marketplace Auto-Update",
1222
+ description: "Check for plugin updates on startup",
1223
+ options: [
1224
+ { value: "off", label: "Off", description: "Don't check for plugin updates" },
1225
+ { value: "notify", label: "Notify", description: "Check on startup and notify when updates are available" },
1226
+ { value: "auto", label: "Auto", description: "Check on startup and auto-install updates" },
1227
+ ],
1087
1228
  },
1088
1229
  },
1089
1230
 
1090
1231
  collapseChangelog: {
1091
1232
  type: "boolean",
1092
1233
  default: false,
1093
- ui: { tab: "interaction", label: "Collapse Changelog", description: "Show condensed changelog after updates" },
1234
+ ui: {
1235
+ tab: "interaction",
1236
+ group: "Startup & Updates",
1237
+ label: "Collapse Changelog",
1238
+ description: "Show condensed changelog after updates",
1239
+ },
1094
1240
  },
1095
1241
 
1096
1242
  "magicKeywords.enabled": {
@@ -1098,6 +1244,7 @@ export const SETTINGS_SCHEMA = {
1098
1244
  default: true,
1099
1245
  ui: {
1100
1246
  tab: "interaction",
1247
+ group: "Magic Keywords",
1101
1248
  label: "Magic Keywords",
1102
1249
  description: "Enable hidden notices for standalone ultrathink, orchestrate, and workflowz keywords",
1103
1250
  },
@@ -1108,6 +1255,7 @@ export const SETTINGS_SCHEMA = {
1108
1255
  default: true,
1109
1256
  ui: {
1110
1257
  tab: "interaction",
1258
+ group: "Magic Keywords",
1111
1259
  label: "Ultrathink Keyword",
1112
1260
  description: "Let standalone ultrathink request maximum automatic thinking and append its hidden notice",
1113
1261
  },
@@ -1118,6 +1266,7 @@ export const SETTINGS_SCHEMA = {
1118
1266
  default: true,
1119
1267
  ui: {
1120
1268
  tab: "interaction",
1269
+ group: "Magic Keywords",
1121
1270
  label: "Orchestrate Keyword",
1122
1271
  description: "Let standalone orchestrate append its hidden multi-agent orchestration notice",
1123
1272
  },
@@ -1128,6 +1277,7 @@ export const SETTINGS_SCHEMA = {
1128
1277
  default: true,
1129
1278
  ui: {
1130
1279
  tab: "interaction",
1280
+ group: "Magic Keywords",
1131
1281
  label: "Workflow Keyword",
1132
1282
  description: "Let standalone workflowz append its hidden eval workflow notice",
1133
1283
  },
@@ -1138,7 +1288,12 @@ export const SETTINGS_SCHEMA = {
1138
1288
  type: "enum",
1139
1289
  values: ["on", "off"] as const,
1140
1290
  default: "on",
1141
- ui: { tab: "interaction", label: "Completion Notification", description: "Notify when the agent completes" },
1291
+ ui: {
1292
+ tab: "interaction",
1293
+ group: "Notifications",
1294
+ label: "Completion Notification",
1295
+ description: "Notify when the agent finishes a turn",
1296
+ },
1142
1297
  },
1143
1298
 
1144
1299
  "ask.timeout": {
@@ -1146,8 +1301,9 @@ export const SETTINGS_SCHEMA = {
1146
1301
  default: 0,
1147
1302
  ui: {
1148
1303
  tab: "interaction",
1304
+ group: "Notifications",
1149
1305
  label: "Ask Timeout",
1150
- description: "Auto-select recommended option after timeout (0 to disable)",
1306
+ description: "Auto-select the recommended ask option after this many seconds (0 disables)",
1151
1307
  options: [
1152
1308
  { value: "0", label: "Disabled" },
1153
1309
  { value: "15", label: "15 seconds" },
@@ -1162,14 +1318,24 @@ export const SETTINGS_SCHEMA = {
1162
1318
  type: "enum",
1163
1319
  values: ["on", "off"] as const,
1164
1320
  default: "on",
1165
- ui: { tab: "interaction", label: "Ask Notification", description: "Notify when ask tool is waiting for input" },
1321
+ ui: {
1322
+ tab: "interaction",
1323
+ group: "Notifications",
1324
+ label: "Ask Notification",
1325
+ description: "Notify when the ask tool is waiting for input",
1326
+ },
1166
1327
  },
1167
1328
 
1168
1329
  // Speech-to-text
1169
1330
  "stt.enabled": {
1170
1331
  type: "boolean",
1171
1332
  default: false,
1172
- ui: { tab: "interaction", label: "Speech-to-Text", description: "Enable speech-to-text input via microphone" },
1333
+ ui: {
1334
+ tab: "interaction",
1335
+ group: "Speech",
1336
+ label: "Speech-to-Text",
1337
+ description: "Enable speech-to-text input via microphone",
1338
+ },
1173
1339
  },
1174
1340
 
1175
1341
  "stt.language": {
@@ -1183,6 +1349,7 @@ export const SETTINGS_SCHEMA = {
1183
1349
  default: "base.en",
1184
1350
  ui: {
1185
1351
  tab: "interaction",
1352
+ group: "Speech",
1186
1353
  label: "Speech Model",
1187
1354
  description: "Whisper model size (larger = more accurate but slower)",
1188
1355
  options: [
@@ -1209,6 +1376,7 @@ export const SETTINGS_SCHEMA = {
1209
1376
  default: true,
1210
1377
  ui: {
1211
1378
  tab: "context",
1379
+ group: "General",
1212
1380
  label: "Auto-Promote Context",
1213
1381
  description: "Promote to a larger-context model on context overflow instead of compacting",
1214
1382
  },
@@ -1220,6 +1388,7 @@ export const SETTINGS_SCHEMA = {
1220
1388
  default: true,
1221
1389
  ui: {
1222
1390
  tab: "context",
1391
+ group: "Compaction",
1223
1392
  label: "Auto-Compact",
1224
1393
  description: "Automatically compact context when it gets too large",
1225
1394
  },
@@ -1231,6 +1400,7 @@ export const SETTINGS_SCHEMA = {
1231
1400
  default: "context-full",
1232
1401
  ui: {
1233
1402
  tab: "context",
1403
+ group: "Compaction",
1234
1404
  label: "Compaction Strategy",
1235
1405
  description:
1236
1406
  "Choose in-place context-full maintenance, auto-handoff, surgical shake (drop heavy content), snapcompact (archive history as dense images), or disable auto maintenance (off)",
@@ -1265,6 +1435,7 @@ export const SETTINGS_SCHEMA = {
1265
1435
  default: -1,
1266
1436
  ui: {
1267
1437
  tab: "context",
1438
+ group: "Compaction",
1268
1439
  label: "Compaction Threshold",
1269
1440
  description: "Percent threshold for context maintenance; set to Default to use legacy reserve-based behavior",
1270
1441
  options: [
@@ -1289,6 +1460,7 @@ export const SETTINGS_SCHEMA = {
1289
1460
  default: -1,
1290
1461
  ui: {
1291
1462
  tab: "context",
1463
+ group: "Compaction",
1292
1464
  label: "Compaction Token Limit",
1293
1465
  description: "Fixed token limit for context maintenance; overrides percentage if set",
1294
1466
  options: [
@@ -1309,6 +1481,7 @@ export const SETTINGS_SCHEMA = {
1309
1481
  default: false,
1310
1482
  ui: {
1311
1483
  tab: "context",
1484
+ group: "Compaction",
1312
1485
  label: "Save Handoff Docs",
1313
1486
  description: "Save generated handoff documents to markdown files for the auto-handoff flow",
1314
1487
  },
@@ -1319,6 +1492,7 @@ export const SETTINGS_SCHEMA = {
1319
1492
  default: true,
1320
1493
  ui: {
1321
1494
  tab: "context",
1495
+ group: "Compaction",
1322
1496
  label: "Remote Compaction",
1323
1497
  description: "Use remote compaction endpoints when available instead of local summarization",
1324
1498
  },
@@ -1338,6 +1512,7 @@ export const SETTINGS_SCHEMA = {
1338
1512
  default: false,
1339
1513
  ui: {
1340
1514
  tab: "context",
1515
+ group: "Compaction",
1341
1516
  label: "Idle Compaction",
1342
1517
  description: "Compact context while idle when token count exceeds threshold",
1343
1518
  },
@@ -1348,6 +1523,7 @@ export const SETTINGS_SCHEMA = {
1348
1523
  default: 200000,
1349
1524
  ui: {
1350
1525
  tab: "context",
1526
+ group: "Compaction",
1351
1527
  label: "Idle Compaction Threshold",
1352
1528
  description: "Token count above which idle compaction triggers",
1353
1529
  options: [
@@ -1369,6 +1545,7 @@ export const SETTINGS_SCHEMA = {
1369
1545
  default: 300,
1370
1546
  ui: {
1371
1547
  tab: "context",
1548
+ group: "Compaction",
1372
1549
  label: "Idle Compaction Delay",
1373
1550
  description: "Seconds to wait while idle before compacting",
1374
1551
  options: [
@@ -1387,16 +1564,47 @@ export const SETTINGS_SCHEMA = {
1387
1564
  default: true,
1388
1565
  ui: {
1389
1566
  tab: "context",
1567
+ group: "Compaction",
1390
1568
  label: "Supersede Stale Reads",
1391
1569
  description: "Prune older read results when the same file is read again (cache-aware, runs every turn)",
1392
1570
  },
1393
1571
  },
1394
1572
 
1573
+ // Experimental: snapcompact inline imaging (transient, per-request; never persisted)
1574
+ "snapcompact.systemPrompt": {
1575
+ type: "boolean",
1576
+ default: false,
1577
+ ui: {
1578
+ tab: "context",
1579
+ group: "Experimental",
1580
+ label: "Snapcompact System Prompt",
1581
+ description:
1582
+ "Experimental: render the system prompt as dense PNG image(s) and attach to the first user message (vision models only). Saves tokens; loses system-prompt prompt caching.",
1583
+ },
1584
+ },
1585
+
1586
+ "snapcompact.toolResults": {
1587
+ type: "boolean",
1588
+ default: false,
1589
+ ui: {
1590
+ tab: "context",
1591
+ group: "Experimental",
1592
+ label: "Snapcompact Tool Results",
1593
+ description:
1594
+ "Experimental: render large historical tool results as dense PNG image(s) instead of text (vision models only). Saves tokens on accumulated read/search output.",
1595
+ },
1596
+ },
1597
+
1395
1598
  // Branch summaries
1396
1599
  "branchSummary.enabled": {
1397
1600
  type: "boolean",
1398
1601
  default: false,
1399
- ui: { tab: "context", label: "Branch Summaries", description: "Prompt to summarize when leaving a branch" },
1602
+ ui: {
1603
+ tab: "context",
1604
+ group: "General",
1605
+ label: "Branch Summaries",
1606
+ description: "Prompt to summarize when leaving a branch",
1607
+ },
1400
1608
  },
1401
1609
 
1402
1610
  "branchSummary.reserveTokens": { type: "number", default: 16384 },
@@ -1449,6 +1657,7 @@ export const SETTINGS_SCHEMA = {
1449
1657
  default: "off",
1450
1658
  ui: {
1451
1659
  tab: "memory",
1660
+ group: "General",
1452
1661
  label: "Memory Backend",
1453
1662
  description: "Off, local summary pipeline, Mnemopi SQLite, or Hindsight remote memory",
1454
1663
  options: [
@@ -1470,6 +1679,7 @@ export const SETTINGS_SCHEMA = {
1470
1679
  default: undefined,
1471
1680
  ui: {
1472
1681
  tab: "memory",
1682
+ group: "Mnemopi",
1473
1683
  label: "Mnemopi DB Path",
1474
1684
  description: "Optional SQLite DB path. Defaults to the agent memories directory.",
1475
1685
  condition: "mnemopiActive",
@@ -1480,6 +1690,7 @@ export const SETTINGS_SCHEMA = {
1480
1690
  default: undefined,
1481
1691
  ui: {
1482
1692
  tab: "memory",
1693
+ group: "Mnemopi",
1483
1694
  label: "Mnemopi Bank",
1484
1695
  description: "Optional shared bank base name. Per-project modes derive project-local banks from it.",
1485
1696
  condition: "mnemopiActive",
@@ -1491,6 +1702,7 @@ export const SETTINGS_SCHEMA = {
1491
1702
  default: "per-project",
1492
1703
  ui: {
1493
1704
  tab: "memory",
1705
+ group: "Mnemopi",
1494
1706
  label: "Mnemopi Scoping",
1495
1707
  description:
1496
1708
  "global = one shared bank; per-project = isolated bank per cwd; per-project-tagged = project-local writes plus global recall visibility",
@@ -1519,6 +1731,7 @@ export const SETTINGS_SCHEMA = {
1519
1731
  default: true,
1520
1732
  ui: {
1521
1733
  tab: "memory",
1734
+ group: "Mnemopi",
1522
1735
  label: "Mnemopi Auto Recall",
1523
1736
  description: "Recall local memories into the first turn of each session",
1524
1737
  condition: "mnemopiActive",
@@ -1529,16 +1742,40 @@ export const SETTINGS_SCHEMA = {
1529
1742
  default: true,
1530
1743
  ui: {
1531
1744
  tab: "memory",
1745
+ group: "Mnemopi",
1532
1746
  label: "Mnemopi Auto Retain",
1533
1747
  description: "Retain completed conversation turns into local Mnemopi memory",
1534
1748
  condition: "mnemopiActive",
1535
1749
  },
1536
1750
  },
1751
+ "mnemopi.polyphonicRecall": {
1752
+ type: "boolean",
1753
+ default: false,
1754
+ ui: {
1755
+ tab: "memory",
1756
+ group: "Mnemopi",
1757
+ label: "Mnemopi Polyphonic Recall",
1758
+ description: "Enable 4-voice recall (vector, graph, fact, temporal) fused with reciprocal rank fusion",
1759
+ condition: "mnemopiActive",
1760
+ },
1761
+ },
1762
+ "mnemopi.enhancedRecall": {
1763
+ type: "boolean",
1764
+ default: false,
1765
+ ui: {
1766
+ tab: "memory",
1767
+ group: "Mnemopi",
1768
+ label: "Mnemopi Enhanced Recall",
1769
+ description: "Enable the tiered query result cache for repeated and similar recall queries",
1770
+ condition: "mnemopiActive",
1771
+ },
1772
+ },
1537
1773
  "mnemopi.noEmbeddings": {
1538
1774
  type: "boolean",
1539
1775
  default: false,
1540
1776
  ui: {
1541
1777
  tab: "memory",
1778
+ group: "Mnemopi",
1542
1779
  label: "Mnemopi Disable Embeddings",
1543
1780
  description: "Force deterministic FTS-only recall instead of vector embeddings",
1544
1781
  condition: "mnemopiActive",
@@ -1549,6 +1786,7 @@ export const SETTINGS_SCHEMA = {
1549
1786
  default: undefined,
1550
1787
  ui: {
1551
1788
  tab: "memory",
1789
+ group: "Mnemopi",
1552
1790
  label: "Mnemopi Embedding Model",
1553
1791
  description: "Optional embedding model override passed to Mnemopi",
1554
1792
  condition: "mnemopiActive",
@@ -1559,6 +1797,7 @@ export const SETTINGS_SCHEMA = {
1559
1797
  default: undefined,
1560
1798
  ui: {
1561
1799
  tab: "memory",
1800
+ group: "Mnemopi",
1562
1801
  label: "Mnemopi Embedding API URL",
1563
1802
  description: "Optional OpenAI-compatible embedding endpoint passed to Mnemopi",
1564
1803
  condition: "mnemopiActive",
@@ -1569,6 +1808,7 @@ export const SETTINGS_SCHEMA = {
1569
1808
  default: undefined,
1570
1809
  ui: {
1571
1810
  tab: "memory",
1811
+ group: "Mnemopi",
1572
1812
  label: "Mnemopi Embedding API Key",
1573
1813
  description: "Optional embedding API key passed to Mnemopi",
1574
1814
  condition: "mnemopiActive",
@@ -1580,6 +1820,7 @@ export const SETTINGS_SCHEMA = {
1580
1820
  default: "smol",
1581
1821
  ui: {
1582
1822
  tab: "memory",
1823
+ group: "Mnemopi",
1583
1824
  label: "Mnemopi LLM Mode",
1584
1825
  description: "Use no LLM, the configured smol model, or a remote OpenAI-compatible endpoint",
1585
1826
  condition: "mnemopiActive",
@@ -1595,6 +1836,7 @@ export const SETTINGS_SCHEMA = {
1595
1836
  default: undefined,
1596
1837
  ui: {
1597
1838
  tab: "memory",
1839
+ group: "Mnemopi",
1598
1840
  label: "Mnemopi LLM Base URL",
1599
1841
  description: "Optional OpenAI-compatible LLM endpoint for Mnemopi remote mode",
1600
1842
  condition: "mnemopiActive",
@@ -1605,6 +1847,7 @@ export const SETTINGS_SCHEMA = {
1605
1847
  default: undefined,
1606
1848
  ui: {
1607
1849
  tab: "memory",
1850
+ group: "Mnemopi",
1608
1851
  label: "Mnemopi LLM API Key",
1609
1852
  description: "Optional LLM API key for Mnemopi remote mode",
1610
1853
  condition: "mnemopiActive",
@@ -1615,6 +1858,7 @@ export const SETTINGS_SCHEMA = {
1615
1858
  default: undefined,
1616
1859
  ui: {
1617
1860
  tab: "memory",
1861
+ group: "Mnemopi",
1618
1862
  label: "Mnemopi LLM Model",
1619
1863
  description: "Optional LLM model name for Mnemopi remote mode",
1620
1864
  condition: "mnemopiActive",
@@ -1633,6 +1877,7 @@ export const SETTINGS_SCHEMA = {
1633
1877
  default: "http://localhost:8888",
1634
1878
  ui: {
1635
1879
  tab: "memory",
1880
+ group: "Hindsight",
1636
1881
  label: "Hindsight API URL",
1637
1882
  description: "Hindsight server URL (Cloud or self-hosted)",
1638
1883
  condition: "hindsightActive",
@@ -1646,6 +1891,7 @@ export const SETTINGS_SCHEMA = {
1646
1891
  default: undefined,
1647
1892
  ui: {
1648
1893
  tab: "memory",
1894
+ group: "Hindsight",
1649
1895
  label: "Hindsight Bank ID",
1650
1896
  description: "Memory bank identifier (default: project name)",
1651
1897
  condition: "hindsightActive",
@@ -1659,6 +1905,7 @@ export const SETTINGS_SCHEMA = {
1659
1905
  default: "per-project-tagged",
1660
1906
  ui: {
1661
1907
  tab: "memory",
1908
+ group: "Hindsight",
1662
1909
  label: "Hindsight Scoping",
1663
1910
  description:
1664
1911
  "global = one shared bank; per-project = isolated bank per cwd; per-project-tagged = shared bank with project tags so global + project memories merge on recall",
@@ -1691,6 +1938,7 @@ export const SETTINGS_SCHEMA = {
1691
1938
  default: true,
1692
1939
  ui: {
1693
1940
  tab: "memory",
1941
+ group: "Hindsight",
1694
1942
  label: "Hindsight Auto Recall",
1695
1943
  description: "Recall memories on the first turn of each session",
1696
1944
  condition: "hindsightActive",
@@ -1701,6 +1949,7 @@ export const SETTINGS_SCHEMA = {
1701
1949
  default: true,
1702
1950
  ui: {
1703
1951
  tab: "memory",
1952
+ group: "Hindsight",
1704
1953
  label: "Hindsight Auto Retain",
1705
1954
  description: "Retain transcript every N turns and at session boundaries",
1706
1955
  condition: "hindsightActive",
@@ -1713,6 +1962,7 @@ export const SETTINGS_SCHEMA = {
1713
1962
  default: "full-session",
1714
1963
  ui: {
1715
1964
  tab: "memory",
1965
+ group: "Hindsight",
1716
1966
  label: "Hindsight Retain Mode",
1717
1967
  description: "full-session = upsert one document per session, last-turn = chunked",
1718
1968
  options: [
@@ -1747,6 +1997,7 @@ export const SETTINGS_SCHEMA = {
1747
1997
  default: true,
1748
1998
  ui: {
1749
1999
  tab: "memory",
2000
+ group: "Hindsight",
1750
2001
  label: "Hindsight Mental Models",
1751
2002
  description:
1752
2003
  "Read curated reflect summaries (mental models) into developer instructions at boot. Loads existing models on the bank — does not write. Pair with hindsight.mentalModelAutoSeed to also auto-create the built-in seed set.",
@@ -1758,6 +2009,7 @@ export const SETTINGS_SCHEMA = {
1758
2009
  default: true,
1759
2010
  ui: {
1760
2011
  tab: "memory",
2012
+ group: "Hindsight",
1761
2013
  label: "Hindsight Mental Model Auto-Seed",
1762
2014
  description:
1763
2015
  "At session start, create any built-in mental models (project-conventions, project-decisions, user-preferences) that do not yet exist on the bank.",
@@ -1773,8 +2025,9 @@ export const SETTINGS_SCHEMA = {
1773
2025
  default: true,
1774
2026
  ui: {
1775
2027
  tab: "context",
2028
+ group: "Rules (TTSR)",
1776
2029
  label: "TTSR",
1777
- description: "Time Traveling Stream Rules: interrupt agent when output matches patterns",
2030
+ description: "Interrupt the agent mid-stream when output matches rule patterns (Time-Traveling Stream Rules)",
1778
2031
  },
1779
2032
  },
1780
2033
 
@@ -1784,6 +2037,7 @@ export const SETTINGS_SCHEMA = {
1784
2037
  default: "discard",
1785
2038
  ui: {
1786
2039
  tab: "context",
2040
+ group: "Rules (TTSR)",
1787
2041
  label: "TTSR Context Mode",
1788
2042
  description: "What to do with partial output when TTSR triggers",
1789
2043
  },
@@ -1795,6 +2049,7 @@ export const SETTINGS_SCHEMA = {
1795
2049
  default: "always",
1796
2050
  ui: {
1797
2051
  tab: "context",
2052
+ group: "Rules (TTSR)",
1798
2053
  label: "TTSR Interrupt Mode",
1799
2054
  description: "When to interrupt mid-stream vs inject warning after completion",
1800
2055
  options: [
@@ -1812,6 +2067,7 @@ export const SETTINGS_SCHEMA = {
1812
2067
  default: "once",
1813
2068
  ui: {
1814
2069
  tab: "context",
2070
+ group: "Rules (TTSR)",
1815
2071
  label: "TTSR Repeat Mode",
1816
2072
  description: "How rules can repeat: once per session or after a message gap",
1817
2073
  },
@@ -1822,6 +2078,7 @@ export const SETTINGS_SCHEMA = {
1822
2078
  default: 10,
1823
2079
  ui: {
1824
2080
  tab: "context",
2081
+ group: "Rules (TTSR)",
1825
2082
  label: "TTSR Repeat Gap",
1826
2083
  description: "Messages before a rule can trigger again",
1827
2084
  options: [
@@ -1839,7 +2096,8 @@ export const SETTINGS_SCHEMA = {
1839
2096
  default: true,
1840
2097
  ui: {
1841
2098
  tab: "context",
1842
- label: "Builtin Rules",
2099
+ group: "Rules (TTSR)",
2100
+ label: "Built-in Rules",
1843
2101
  description: "Load the default rules shipped with the agent (override individually with ttsr.disabledRules)",
1844
2102
  },
1845
2103
  },
@@ -1849,6 +2107,7 @@ export const SETTINGS_SCHEMA = {
1849
2107
  default: [] as string[],
1850
2108
  ui: {
1851
2109
  tab: "context",
2110
+ group: "Rules (TTSR)",
1852
2111
  label: "Disabled Rules",
1853
2112
  description: "Rule names to ignore entirely (applies to bundled defaults and your own rules)",
1854
2113
  },
@@ -1864,7 +2123,8 @@ export const SETTINGS_SCHEMA = {
1864
2123
  values: EDIT_MODES,
1865
2124
  default: "hashline",
1866
2125
  ui: {
1867
- tab: "editing",
2126
+ tab: "files",
2127
+ group: "Editing",
1868
2128
  label: "Edit Mode",
1869
2129
  description: "Select the edit tool variant (replace, patch, hashline, or apply_patch)",
1870
2130
  },
@@ -1874,7 +2134,8 @@ export const SETTINGS_SCHEMA = {
1874
2134
  type: "boolean",
1875
2135
  default: true,
1876
2136
  ui: {
1877
- tab: "editing",
2137
+ tab: "files",
2138
+ group: "Editing",
1878
2139
  label: "Fuzzy Match",
1879
2140
  description: "Accept high-confidence fuzzy matches for whitespace differences",
1880
2141
  },
@@ -1884,9 +2145,10 @@ export const SETTINGS_SCHEMA = {
1884
2145
  type: "number",
1885
2146
  default: 0.95,
1886
2147
  ui: {
1887
- tab: "editing",
2148
+ tab: "files",
2149
+ group: "Editing",
1888
2150
  label: "Fuzzy Match Threshold",
1889
- description: "Similarity threshold for fuzzy matches",
2151
+ description: "Similarity threshold (0-1) for accepting fuzzy matches",
1890
2152
  options: [
1891
2153
  { value: "0.85", label: "0.85", description: "Lenient" },
1892
2154
  { value: "0.90", label: "0.90", description: "Moderate" },
@@ -1900,7 +2162,8 @@ export const SETTINGS_SCHEMA = {
1900
2162
  type: "boolean",
1901
2163
  default: false,
1902
2164
  ui: {
1903
- tab: "editing",
2165
+ tab: "files",
2166
+ group: "Editing",
1904
2167
  label: "Abort on Failed Preview",
1905
2168
  description: "Abort streaming edit tool calls when patch preview fails",
1906
2169
  },
@@ -1910,7 +2173,8 @@ export const SETTINGS_SCHEMA = {
1910
2173
  type: "boolean",
1911
2174
  default: true,
1912
2175
  ui: {
1913
- tab: "editing",
2176
+ tab: "files",
2177
+ group: "Editing",
1914
2178
  label: "Block Auto-Generated Files",
1915
2179
  description: "Prevent editing of files that appear to be auto-generated (protoc, sqlc, swagger, etc.)",
1916
2180
  },
@@ -1920,7 +2184,8 @@ export const SETTINGS_SCHEMA = {
1920
2184
  type: "boolean",
1921
2185
  default: false,
1922
2186
  ui: {
1923
- tab: "editing",
2187
+ tab: "files",
2188
+ group: "Reading",
1924
2189
  label: "Line Numbers",
1925
2190
  description: "Prepend line numbers to read tool output by default",
1926
2191
  },
@@ -1930,7 +2195,8 @@ export const SETTINGS_SCHEMA = {
1930
2195
  type: "boolean",
1931
2196
  default: true,
1932
2197
  ui: {
1933
- tab: "editing",
2198
+ tab: "files",
2199
+ group: "Reading",
1934
2200
  label: "Hash Lines",
1935
2201
  description:
1936
2202
  "Include snapshot-tag headers and line numbers in read output for hashline edit mode ([PATH#TAG] plus LINE:content)",
@@ -1941,7 +2207,8 @@ export const SETTINGS_SCHEMA = {
1941
2207
  type: "number",
1942
2208
  default: 300,
1943
2209
  ui: {
1944
- tab: "editing",
2210
+ tab: "files",
2211
+ group: "Reading",
1945
2212
  label: "Default Read Limit",
1946
2213
  description: "Default number of lines returned when agent calls read without a limit",
1947
2214
  options: [
@@ -1958,7 +2225,8 @@ export const SETTINGS_SCHEMA = {
1958
2225
  type: "boolean",
1959
2226
  default: true,
1960
2227
  ui: {
1961
- tab: "editing",
2228
+ tab: "files",
2229
+ group: "Read Summaries",
1962
2230
  label: "Read Summaries",
1963
2231
  description: "Return structural code summaries when read is called without an explicit selector",
1964
2232
  },
@@ -1968,7 +2236,8 @@ export const SETTINGS_SCHEMA = {
1968
2236
  type: "boolean",
1969
2237
  default: false,
1970
2238
  ui: {
1971
- tab: "editing",
2239
+ tab: "files",
2240
+ group: "Read Summaries",
1972
2241
  label: "Prose Summaries",
1973
2242
  description: "Return structural summaries for Markdown and plain text reads",
1974
2243
  },
@@ -1978,7 +2247,8 @@ export const SETTINGS_SCHEMA = {
1978
2247
  type: "number",
1979
2248
  default: 4,
1980
2249
  ui: {
1981
- tab: "editing",
2250
+ tab: "files",
2251
+ group: "Read Summaries",
1982
2252
  label: "Read Summary Body Lines",
1983
2253
  description: "Minimum multiline body or literal length before read summaries collapse it",
1984
2254
  },
@@ -1988,7 +2258,8 @@ export const SETTINGS_SCHEMA = {
1988
2258
  type: "number",
1989
2259
  default: 6,
1990
2260
  ui: {
1991
- tab: "editing",
2261
+ tab: "files",
2262
+ group: "Read Summaries",
1992
2263
  label: "Read Summary Comment Lines",
1993
2264
  description: "Minimum multiline block comment length before read summaries collapse it",
1994
2265
  },
@@ -1998,7 +2269,8 @@ export const SETTINGS_SCHEMA = {
1998
2269
  type: "number",
1999
2270
  default: 100,
2000
2271
  ui: {
2001
- tab: "editing",
2272
+ tab: "files",
2273
+ group: "Read Summaries",
2002
2274
  label: "Read Summary Minimum File Length",
2003
2275
  description: "Files with fewer total lines are read verbatim instead of structurally summarized",
2004
2276
  },
@@ -2008,7 +2280,8 @@ export const SETTINGS_SCHEMA = {
2008
2280
  type: "number",
2009
2281
  default: 50,
2010
2282
  ui: {
2011
- tab: "editing",
2283
+ tab: "files",
2284
+ group: "Read Summaries",
2012
2285
  label: "Read Summary Unfold Target",
2013
2286
  description:
2014
2287
  "BFS-unfold elidable spans until the summary is at least this many visible lines. 0 keeps only the outermost elisions.",
@@ -2019,7 +2292,8 @@ export const SETTINGS_SCHEMA = {
2019
2292
  type: "number",
2020
2293
  default: 100,
2021
2294
  ui: {
2022
- tab: "editing",
2295
+ tab: "files",
2296
+ group: "Read Summaries",
2023
2297
  label: "Read Summary Unfold Ceiling",
2024
2298
  description:
2025
2299
  "Hard ceiling on summary size while BFS-unfolding. An unfold that would exceed this is reverted and unfolding stops.",
@@ -2030,7 +2304,8 @@ export const SETTINGS_SCHEMA = {
2030
2304
  type: "boolean",
2031
2305
  default: false,
2032
2306
  ui: {
2033
- tab: "editing",
2307
+ tab: "files",
2308
+ group: "Reading",
2034
2309
  label: "Inline Read Previews",
2035
2310
  description: "Render read tool results inline in the transcript instead of summary rows",
2036
2311
  },
@@ -2040,14 +2315,20 @@ export const SETTINGS_SCHEMA = {
2040
2315
  "lsp.enabled": {
2041
2316
  type: "boolean",
2042
2317
  default: true,
2043
- ui: { tab: "editing", label: "LSP", description: "Enable the lsp tool for language server protocol" },
2318
+ ui: {
2319
+ tab: "files",
2320
+ group: "LSP",
2321
+ label: "LSP",
2322
+ description: "Enable the lsp tool for code intelligence (definitions, references, diagnostics, rename)",
2323
+ },
2044
2324
  },
2045
2325
 
2046
2326
  "lsp.lazy": {
2047
2327
  type: "boolean",
2048
2328
  default: true,
2049
2329
  ui: {
2050
- tab: "editing",
2330
+ tab: "files",
2331
+ group: "LSP",
2051
2332
  label: "Lazy LSP Startup",
2052
2333
  description:
2053
2334
  "Start language servers on first use (lsp tool or editing a matching file type) instead of at session startup",
@@ -2058,7 +2339,8 @@ export const SETTINGS_SCHEMA = {
2058
2339
  type: "boolean",
2059
2340
  default: false,
2060
2341
  ui: {
2061
- tab: "editing",
2342
+ tab: "files",
2343
+ group: "LSP",
2062
2344
  label: "Format on Write",
2063
2345
  description: "Automatically format code files using LSP after writing",
2064
2346
  },
@@ -2068,7 +2350,8 @@ export const SETTINGS_SCHEMA = {
2068
2350
  type: "boolean",
2069
2351
  default: true,
2070
2352
  ui: {
2071
- tab: "editing",
2353
+ tab: "files",
2354
+ group: "LSP",
2072
2355
  label: "Diagnostics on Write",
2073
2356
  description: "Return LSP diagnostics after writing code files",
2074
2357
  },
@@ -2078,7 +2361,8 @@ export const SETTINGS_SCHEMA = {
2078
2361
  type: "boolean",
2079
2362
  default: false,
2080
2363
  ui: {
2081
- tab: "editing",
2364
+ tab: "files",
2365
+ group: "LSP",
2082
2366
  label: "Diagnostics on Edit",
2083
2367
  description: "Return LSP diagnostics after editing code files",
2084
2368
  },
@@ -2088,17 +2372,45 @@ export const SETTINGS_SCHEMA = {
2088
2372
  type: "boolean",
2089
2373
  default: true,
2090
2374
  ui: {
2091
- tab: "editing",
2375
+ tab: "files",
2376
+ group: "LSP",
2092
2377
  label: "Deduplicate Diagnostics",
2093
2378
  description: "Suppress post-edit LSP diagnostics already shown for a file; only surface new or changed ones",
2094
2379
  },
2095
2380
  },
2096
2381
 
2382
+ "bash.enabled": {
2383
+ type: "boolean",
2384
+ default: true,
2385
+ ui: {
2386
+ tab: "shell",
2387
+ group: "Bash",
2388
+ label: "Bash",
2389
+ description: "Enable the bash tool for shell command execution",
2390
+ },
2391
+ },
2392
+
2393
+ "bash.autoBackground.enabled": {
2394
+ type: "boolean",
2395
+ default: false,
2396
+ ui: {
2397
+ tab: "shell",
2398
+ group: "Bash",
2399
+ label: "Bash Auto-Background",
2400
+ description: "Automatically background long-running bash commands and deliver the result later",
2401
+ },
2402
+ },
2403
+
2097
2404
  // Bash interceptor
2098
2405
  "bashInterceptor.enabled": {
2099
2406
  type: "boolean",
2100
2407
  default: false,
2101
- ui: { tab: "editing", label: "Bash Interceptor", description: "Block shell commands that have dedicated tools" },
2408
+ ui: {
2409
+ tab: "shell",
2410
+ group: "Bash",
2411
+ label: "Bash Interceptor",
2412
+ description: "Block shell commands that have dedicated tools",
2413
+ },
2102
2414
  },
2103
2415
  "bashInterceptor.patterns": { type: "array", default: DEFAULT_BASH_INTERCEPTOR_RULES },
2104
2416
 
@@ -2106,8 +2418,9 @@ export const SETTINGS_SCHEMA = {
2106
2418
  type: "boolean",
2107
2419
  default: true,
2108
2420
  ui: {
2109
- tab: "editing",
2110
- label: "Strip Trailing head/tail",
2421
+ tab: "shell",
2422
+ group: "Bash",
2423
+ label: "Strip head/tail Pipes",
2111
2424
  description:
2112
2425
  "Silently drop trailing `| head`/`| tail` pipes from single-line bash commands. Output is already truncated automatically.",
2113
2426
  },
@@ -2118,7 +2431,8 @@ export const SETTINGS_SCHEMA = {
2118
2431
  type: "boolean",
2119
2432
  default: true,
2120
2433
  ui: {
2121
- tab: "editing",
2434
+ tab: "shell",
2435
+ group: "Bash",
2122
2436
  label: "Shell Minimizer",
2123
2437
  description: "Compress verbose shell output (git, npm, cargo, etc.) before returning it to the agent",
2124
2438
  },
@@ -2138,7 +2452,8 @@ export const SETTINGS_SCHEMA = {
2138
2452
  values: ["default", "aggressive"] as const,
2139
2453
  default: "default",
2140
2454
  ui: {
2141
- tab: "editing",
2455
+ tab: "shell",
2456
+ group: "Bash",
2142
2457
  label: "Shell Minimizer Source Outline",
2143
2458
  description: "Source outline mode for cat/read of source files: default or aggressive",
2144
2459
  },
@@ -2153,9 +2468,10 @@ export const SETTINGS_SCHEMA = {
2153
2468
  type: "boolean",
2154
2469
  default: true,
2155
2470
  ui: {
2156
- tab: "editing",
2157
- label: "Eval: Python backend",
2158
- description: "Allow the eval tool to dispatch to the IPython kernel",
2471
+ tab: "shell",
2472
+ group: "Eval & Python",
2473
+ label: "Python Eval Backend",
2474
+ description: "Allow the eval tool to dispatch Python cells to the IPython kernel",
2159
2475
  },
2160
2476
  },
2161
2477
 
@@ -2163,9 +2479,10 @@ export const SETTINGS_SCHEMA = {
2163
2479
  type: "boolean",
2164
2480
  default: true,
2165
2481
  ui: {
2166
- tab: "editing",
2167
- label: "Eval: JavaScript backend",
2168
- description: "Allow the eval tool to dispatch to the in-process JavaScript runtime",
2482
+ tab: "shell",
2483
+ group: "Eval & Python",
2484
+ label: "JavaScript Eval Backend",
2485
+ description: "Allow the eval tool to dispatch JavaScript cells to the in-process runtime",
2169
2486
  },
2170
2487
  },
2171
2488
 
@@ -2175,16 +2492,18 @@ export const SETTINGS_SCHEMA = {
2175
2492
  values: ["session", "per-call"] as const,
2176
2493
  default: "session",
2177
2494
  ui: {
2178
- tab: "editing",
2495
+ tab: "shell",
2496
+ group: "Eval & Python",
2179
2497
  label: "Python Kernel Mode",
2180
- description: "Whether to keep IPython kernel alive across calls",
2498
+ description: "Keep the IPython kernel alive across eval calls or start fresh each time",
2181
2499
  },
2182
2500
  },
2183
2501
  "python.interpreter": {
2184
2502
  type: "string",
2185
2503
  default: "",
2186
2504
  ui: {
2187
- tab: "editing",
2505
+ tab: "shell",
2506
+ group: "Eval & Python",
2188
2507
  label: "Python Interpreter",
2189
2508
  description:
2190
2509
  "Optional path to an exact Python executable. When set, automatic Python runtime discovery is skipped.",
@@ -2200,7 +2519,8 @@ export const SETTINGS_SCHEMA = {
2200
2519
  type: "record",
2201
2520
  default: {},
2202
2521
  ui: {
2203
- tab: "tools",
2522
+ tab: "interaction",
2523
+ group: "Approvals",
2204
2524
  label: "Tool Approval Policies",
2205
2525
  description:
2206
2526
  "Per-tool approval policies. Set to 'allow' to auto-approve, 'prompt' to require confirmation, or 'deny' to block. Overrides are honored in every approval mode.",
@@ -2217,9 +2537,10 @@ export const SETTINGS_SCHEMA = {
2217
2537
  default: "yolo",
2218
2538
  ui: {
2219
2539
  tab: "interaction",
2540
+ group: "Approvals",
2220
2541
  label: "Tool Approval",
2221
2542
  description:
2222
- "Default approval behaviour for tool calls. 'Always ask' auto-approves read-only tools only. 'Write' auto-approves read and workspace-write tools. 'Yolo' auto-approves all tiers; user policy may still prompt or block.",
2543
+ "Default approval behavior for tool calls. 'Always ask' auto-approves read-only tools only. 'Write' auto-approves read and workspace-write tools. 'Yolo' auto-approves all tiers; user policy may still prompt or block.",
2223
2544
  options: [
2224
2545
  {
2225
2546
  value: "always-ask",
@@ -2246,13 +2567,23 @@ export const SETTINGS_SCHEMA = {
2246
2567
  "todo.enabled": {
2247
2568
  type: "boolean",
2248
2569
  default: true,
2249
- ui: { tab: "tools", label: "Todos", description: "Enable the todo tool for task tracking" },
2570
+ ui: {
2571
+ tab: "tools",
2572
+ group: "Available Tools",
2573
+ label: "Todos",
2574
+ description: "Enable the todo tool for task tracking",
2575
+ },
2250
2576
  },
2251
2577
 
2252
2578
  "todo.reminders": {
2253
2579
  type: "boolean",
2254
2580
  default: true,
2255
- ui: { tab: "tools", label: "Todo Reminders", description: "Remind agent to complete todos before stopping" },
2581
+ ui: {
2582
+ tab: "tools",
2583
+ group: "Todos",
2584
+ label: "Todo Reminders",
2585
+ description: "Remind the agent to complete todos before stopping",
2586
+ },
2256
2587
  },
2257
2588
 
2258
2589
  "todo.reminders.max": {
@@ -2260,8 +2591,9 @@ export const SETTINGS_SCHEMA = {
2260
2591
  default: 3,
2261
2592
  ui: {
2262
2593
  tab: "tools",
2594
+ group: "Todos",
2263
2595
  label: "Todo Reminder Limit",
2264
- description: "Maximum reminders to complete todos before giving up",
2596
+ description: "Maximum number of todo reminders before giving up",
2265
2597
  options: [
2266
2598
  { value: "1", label: "1 reminder" },
2267
2599
  { value: "2", label: "2 reminders" },
@@ -2276,28 +2608,33 @@ export const SETTINGS_SCHEMA = {
2276
2608
  default: false,
2277
2609
  ui: {
2278
2610
  tab: "tools",
2611
+ group: "Todos",
2279
2612
  label: "Create Todos Automatically",
2280
2613
  description: "Automatically create a comprehensive todo list after the first message",
2281
2614
  },
2282
2615
  },
2283
2616
 
2284
- "bash.enabled": {
2285
- type: "boolean",
2286
- default: true,
2287
- ui: { tab: "tools", label: "Bash", description: "Enable the bash tool for shell command execution" },
2288
- },
2289
-
2290
2617
  // Search and AST tools
2291
2618
  "find.enabled": {
2292
2619
  type: "boolean",
2293
2620
  default: true,
2294
- ui: { tab: "tools", label: "Find", description: "Enable the find tool for file searching" },
2621
+ ui: {
2622
+ tab: "tools",
2623
+ group: "Available Tools",
2624
+ label: "Find",
2625
+ description: "Enable the find tool for glob-based file lookup",
2626
+ },
2295
2627
  },
2296
2628
 
2297
2629
  "search.enabled": {
2298
2630
  type: "boolean",
2299
2631
  default: true,
2300
- ui: { tab: "tools", label: "Search", description: "Enable the search tool for content searching" },
2632
+ ui: {
2633
+ tab: "tools",
2634
+ group: "Available Tools",
2635
+ label: "Search",
2636
+ description: "Enable the search tool for regex content search",
2637
+ },
2301
2638
  },
2302
2639
 
2303
2640
  "search.contextBefore": {
@@ -2305,6 +2642,7 @@ export const SETTINGS_SCHEMA = {
2305
2642
  default: 1,
2306
2643
  ui: {
2307
2644
  tab: "tools",
2645
+ group: "Search & Browser",
2308
2646
  label: "Search Context Before",
2309
2647
  description: "Lines of context before each search match",
2310
2648
  options: [
@@ -2322,6 +2660,7 @@ export const SETTINGS_SCHEMA = {
2322
2660
  default: 3,
2323
2661
  ui: {
2324
2662
  tab: "tools",
2663
+ group: "Search & Browser",
2325
2664
  label: "Search Context After",
2326
2665
  description: "Lines of context after each search match",
2327
2666
  options: [
@@ -2340,6 +2679,7 @@ export const SETTINGS_SCHEMA = {
2340
2679
  default: true,
2341
2680
  ui: {
2342
2681
  tab: "tools",
2682
+ group: "Available Tools",
2343
2683
  label: "AST Grep",
2344
2684
  description: "Enable the ast_grep tool for structural AST search",
2345
2685
  },
@@ -2350,28 +2690,12 @@ export const SETTINGS_SCHEMA = {
2350
2690
  default: true,
2351
2691
  ui: {
2352
2692
  tab: "tools",
2693
+ group: "Available Tools",
2353
2694
  label: "AST Edit",
2354
2695
  description: "Enable the ast_edit tool for structural AST rewrites",
2355
2696
  },
2356
2697
  },
2357
2698
 
2358
- "irc.timeoutMs": {
2359
- type: "number",
2360
- default: 120_000,
2361
- ui: {
2362
- tab: "tools",
2363
- label: "IRC Timeout",
2364
- description: "Default timeout for irc wait (and send await:true) in milliseconds; 0 disables the timeout",
2365
- options: [
2366
- { value: "0", label: "Disabled" },
2367
- { value: "30000", label: "30 seconds" },
2368
- { value: "60000", label: "1 minute" },
2369
- { value: "120000", label: "2 minutes" },
2370
- { value: "300000", label: "5 minutes" },
2371
- ],
2372
- },
2373
- },
2374
-
2375
2699
  // Optional tools
2376
2700
 
2377
2701
  "renderMermaid.enabled": {
@@ -2379,6 +2703,7 @@ export const SETTINGS_SCHEMA = {
2379
2703
  default: false,
2380
2704
  ui: {
2381
2705
  tab: "tools",
2706
+ group: "Available Tools",
2382
2707
  label: "Render Mermaid",
2383
2708
  description: "Enable the render_mermaid tool for Mermaid-to-ASCII rendering",
2384
2709
  },
@@ -2389,6 +2714,7 @@ export const SETTINGS_SCHEMA = {
2389
2714
  default: true,
2390
2715
  ui: {
2391
2716
  tab: "tools",
2717
+ group: "Available Tools",
2392
2718
  label: "Debug",
2393
2719
  description: "Enable the debug tool for DAP-based debugging",
2394
2720
  },
@@ -2399,6 +2725,7 @@ export const SETTINGS_SCHEMA = {
2399
2725
  default: false,
2400
2726
  ui: {
2401
2727
  tab: "tools",
2728
+ group: "Available Tools",
2402
2729
  label: "Text-to-Speech",
2403
2730
  description: "Enable the tts tool for xAI Grok Voice speech synthesis",
2404
2731
  },
@@ -2409,6 +2736,7 @@ export const SETTINGS_SCHEMA = {
2409
2736
  default: false,
2410
2737
  ui: {
2411
2738
  tab: "tools",
2739
+ group: "Available Tools",
2412
2740
  label: "Inspect Image",
2413
2741
  description: "Enable the inspect_image tool, delegating image understanding to a vision-capable model",
2414
2742
  },
@@ -2419,6 +2747,7 @@ export const SETTINGS_SCHEMA = {
2419
2747
  default: false,
2420
2748
  ui: {
2421
2749
  tab: "tools",
2750
+ group: "Available Tools",
2422
2751
  label: "Checkpoint/Rewind",
2423
2752
  description: "Enable the checkpoint and rewind tools for context checkpointing",
2424
2753
  },
@@ -2428,7 +2757,12 @@ export const SETTINGS_SCHEMA = {
2428
2757
  "fetch.enabled": {
2429
2758
  type: "boolean",
2430
2759
  default: true,
2431
- ui: { tab: "tools", label: "Read URLs", description: "Allow the read tool to fetch and process URLs" },
2760
+ ui: {
2761
+ tab: "tools",
2762
+ group: "Available Tools",
2763
+ label: "Read URLs",
2764
+ description: "Allow the read tool to fetch and process URLs",
2765
+ },
2432
2766
  },
2433
2767
 
2434
2768
  "vault.enabled": {
@@ -2436,6 +2770,7 @@ export const SETTINGS_SCHEMA = {
2436
2770
  default: false,
2437
2771
  ui: {
2438
2772
  tab: "tools",
2773
+ group: "Available Tools",
2439
2774
  label: "Obsidian Vault",
2440
2775
  description:
2441
2776
  "Enable the vault:// internal URL for reading and editing Obsidian vault content via the Obsidian CLI. When disabled, vault:// resolution is refused and the vault:// entry is omitted from the system prompt.",
@@ -2447,6 +2782,7 @@ export const SETTINGS_SCHEMA = {
2447
2782
  default: false,
2448
2783
  ui: {
2449
2784
  tab: "tools",
2785
+ group: "Available Tools",
2450
2786
  label: "GitHub CLI",
2451
2787
  description:
2452
2788
  "Enable the github tool (op-based dispatch for repository, issue, pull request, diff, search, checkout, push, and Actions watch workflows)",
@@ -2458,7 +2794,8 @@ export const SETTINGS_SCHEMA = {
2458
2794
  default: true,
2459
2795
  ui: {
2460
2796
  tab: "tools",
2461
- label: "GitHub view cache",
2797
+ group: "GitHub",
2798
+ label: "GitHub View Cache",
2462
2799
  description: "Cache rendered issue/PR view output in ~/.omp/cache/github-cache.db so repeated reads are free",
2463
2800
  },
2464
2801
  },
@@ -2468,8 +2805,10 @@ export const SETTINGS_SCHEMA = {
2468
2805
  default: 300,
2469
2806
  ui: {
2470
2807
  tab: "tools",
2471
- label: "GitHub cache soft TTL (seconds)",
2472
- description: "Within this window, cached issue/PR view rows are returned directly. Default 5 minutes.",
2808
+ group: "GitHub",
2809
+ label: "GitHub Cache Soft TTL",
2810
+ description:
2811
+ "Within this window, cached issue/PR view rows are returned directly (seconds; default 5 minutes)",
2473
2812
  },
2474
2813
  },
2475
2814
 
@@ -2478,16 +2817,22 @@ export const SETTINGS_SCHEMA = {
2478
2817
  default: 604800,
2479
2818
  ui: {
2480
2819
  tab: "tools",
2481
- label: "GitHub cache hard TTL (seconds)",
2820
+ group: "GitHub",
2821
+ label: "GitHub Cache Hard TTL",
2482
2822
  description:
2483
- "Past soft TTL but within hard TTL, the tool returns the cached row and refreshes it in the background. Past hard TTL, the row is dropped. Default 7 days.",
2823
+ "Past the soft TTL the cached row is returned and refreshed in the background; past the hard TTL it is dropped (seconds; default 7 days)",
2484
2824
  },
2485
2825
  },
2486
2826
 
2487
2827
  "web_search.enabled": {
2488
2828
  type: "boolean",
2489
2829
  default: true,
2490
- ui: { tab: "tools", label: "Web Search", description: "Enable the web_search tool for web searching" },
2830
+ ui: {
2831
+ tab: "tools",
2832
+ group: "Available Tools",
2833
+ label: "Web Search",
2834
+ description: "Enable the web_search tool for live web results",
2835
+ },
2491
2836
  },
2492
2837
 
2493
2838
  "browser.enabled": {
@@ -2495,8 +2840,9 @@ export const SETTINGS_SCHEMA = {
2495
2840
  default: true,
2496
2841
  ui: {
2497
2842
  tab: "tools",
2843
+ group: "Available Tools",
2498
2844
  label: "Browser",
2499
- description: "Enable the browser tool (Ulixee Hero)",
2845
+ description: "Enable the browser tool for scripted Chromium automation (puppeteer)",
2500
2846
  },
2501
2847
  },
2502
2848
 
@@ -2505,6 +2851,7 @@ export const SETTINGS_SCHEMA = {
2505
2851
  default: true,
2506
2852
  ui: {
2507
2853
  tab: "tools",
2854
+ group: "Search & Browser",
2508
2855
  label: "Headless Browser",
2509
2856
  description: "Launch browser in headless mode (disable to show browser UI)",
2510
2857
  },
@@ -2514,7 +2861,8 @@ export const SETTINGS_SCHEMA = {
2514
2861
  default: undefined,
2515
2862
  ui: {
2516
2863
  tab: "tools",
2517
- label: "Screenshot directory",
2864
+ group: "Search & Browser",
2865
+ label: "Screenshot Directory",
2518
2866
  description:
2519
2867
  "Directory to save screenshots. If unset, screenshots go to a temp file. Supports ~. Examples: ~/Downloads, ~/Desktop, /sdcard/Download (Android)",
2520
2868
  },
@@ -2526,6 +2874,7 @@ export const SETTINGS_SCHEMA = {
2526
2874
  default: true,
2527
2875
  ui: {
2528
2876
  tab: "tools",
2877
+ group: "Execution",
2529
2878
  label: "Intent Tracing",
2530
2879
  description: "Ask the agent to describe the intent of each tool call before executing it",
2531
2880
  },
@@ -2536,6 +2885,7 @@ export const SETTINGS_SCHEMA = {
2536
2885
  default: 0,
2537
2886
  ui: {
2538
2887
  tab: "tools",
2888
+ group: "Execution",
2539
2889
  label: "Max Tool Timeout",
2540
2890
  description: "Maximum timeout in seconds the agent can set for any tool (0 = no limit)",
2541
2891
  options: [
@@ -2555,6 +2905,7 @@ export const SETTINGS_SCHEMA = {
2555
2905
  default: true,
2556
2906
  ui: {
2557
2907
  tab: "tools",
2908
+ group: "Execution",
2558
2909
  label: "Async Execution",
2559
2910
  description: "Enable async bash commands and background task execution",
2560
2911
  },
@@ -2571,6 +2922,7 @@ export const SETTINGS_SCHEMA = {
2571
2922
  default: "30s",
2572
2923
  ui: {
2573
2924
  tab: "tools",
2925
+ group: "Execution",
2574
2926
  label: "Poll Wait Duration",
2575
2927
  description: "How long the poll tool waits for background job updates before returning the current state",
2576
2928
  options: [
@@ -2583,13 +2935,21 @@ export const SETTINGS_SCHEMA = {
2583
2935
  },
2584
2936
  },
2585
2937
 
2586
- "bash.autoBackground.enabled": {
2587
- type: "boolean",
2588
- default: false,
2938
+ "irc.timeoutMs": {
2939
+ type: "number",
2940
+ default: 120_000,
2589
2941
  ui: {
2590
2942
  tab: "tools",
2591
- label: "Bash Auto-Background",
2592
- description: "Automatically background long-running bash commands and deliver the result later",
2943
+ group: "Execution",
2944
+ label: "IRC Timeout",
2945
+ description: "Default timeout for irc wait (and send await:true) in milliseconds; 0 disables the timeout",
2946
+ options: [
2947
+ { value: "0", label: "Disabled" },
2948
+ { value: "30000", label: "30 seconds" },
2949
+ { value: "60000", label: "1 minute" },
2950
+ { value: "120000", label: "2 minutes" },
2951
+ { value: "300000", label: "5 minutes" },
2952
+ ],
2593
2953
  },
2594
2954
  },
2595
2955
 
@@ -2605,6 +2965,7 @@ export const SETTINGS_SCHEMA = {
2605
2965
  default: "auto",
2606
2966
  ui: {
2607
2967
  tab: "tools",
2968
+ group: "Discovery & MCP",
2608
2969
  label: "Tool Discovery",
2609
2970
  description:
2610
2971
  "Hide tools behind a search tool to save tokens. 'auto' hides MCP tools once the tool set has more than 40 tools; 'mcp-only' always hides MCP tools; 'all' hides all non-essential built-ins too.",
@@ -2616,6 +2977,7 @@ export const SETTINGS_SCHEMA = {
2616
2977
  default: [] as string[],
2617
2978
  ui: {
2618
2979
  tab: "tools",
2980
+ group: "Discovery & MCP",
2619
2981
  label: "Essential Tools Override",
2620
2982
  description:
2621
2983
  "Override the always-loaded built-in tools (default: read, bash, edit). Leave empty to use defaults.",
@@ -2626,7 +2988,12 @@ export const SETTINGS_SCHEMA = {
2626
2988
  "mcp.enableProjectConfig": {
2627
2989
  type: "boolean",
2628
2990
  default: true,
2629
- ui: { tab: "tools", label: "MCP Project Config", description: "Load .mcp.json/mcp.json from project root" },
2991
+ ui: {
2992
+ tab: "tools",
2993
+ group: "Discovery & MCP",
2994
+ label: "MCP Project Config",
2995
+ description: "Load .mcp.json/mcp.json from project root",
2996
+ },
2630
2997
  },
2631
2998
 
2632
2999
  "mcp.discoveryMode": {
@@ -2634,6 +3001,7 @@ export const SETTINGS_SCHEMA = {
2634
3001
  default: false,
2635
3002
  ui: {
2636
3003
  tab: "tools",
3004
+ group: "Discovery & MCP",
2637
3005
  label: "MCP Tool Discovery",
2638
3006
  description: "Hide MCP tools by default and expose them through a tool discovery tool",
2639
3007
  },
@@ -2644,6 +3012,7 @@ export const SETTINGS_SCHEMA = {
2644
3012
  default: [] as string[],
2645
3013
  ui: {
2646
3014
  tab: "tools",
3015
+ group: "Discovery & MCP",
2647
3016
  label: "MCP Discovery Default Servers",
2648
3017
  description: "Keep MCP tools from these servers visible while discovery mode hides other MCP tools",
2649
3018
  },
@@ -2654,6 +3023,7 @@ export const SETTINGS_SCHEMA = {
2654
3023
  default: false,
2655
3024
  ui: {
2656
3025
  tab: "tools",
3026
+ group: "Discovery & MCP",
2657
3027
  label: "MCP Update Injection",
2658
3028
  description: "Inject MCP resource updates into the agent conversation",
2659
3029
  },
@@ -2664,8 +3034,10 @@ export const SETTINGS_SCHEMA = {
2664
3034
  default: 500,
2665
3035
  ui: {
2666
3036
  tab: "tools",
3037
+ group: "Discovery & MCP",
2667
3038
  label: "MCP Notification Debounce",
2668
- description: "Debounce window for MCP resource update notifications before injecting into conversation",
3039
+ description:
3040
+ "Debounce window in milliseconds for MCP resource updates before injecting them into the conversation",
2669
3041
  },
2670
3042
  },
2671
3043
 
@@ -2679,6 +3051,7 @@ export const SETTINGS_SCHEMA = {
2679
3051
  default: true,
2680
3052
  ui: {
2681
3053
  tab: "tasks",
3054
+ group: "Modes",
2682
3055
  label: "Plan Mode",
2683
3056
  description: "Enable plan mode for read-only exploration and planning before execution",
2684
3057
  },
@@ -2689,6 +3062,7 @@ export const SETTINGS_SCHEMA = {
2689
3062
  default: true,
2690
3063
  ui: {
2691
3064
  tab: "tasks",
3065
+ group: "Modes",
2692
3066
  label: "Goal Mode",
2693
3067
  description: "Enable per-session goal mode and the hidden goal tool",
2694
3068
  },
@@ -2699,7 +3073,8 @@ export const SETTINGS_SCHEMA = {
2699
3073
  default: true,
2700
3074
  ui: {
2701
3075
  tab: "tasks",
2702
- label: "Goal Status In Footer",
3076
+ group: "Modes",
3077
+ label: "Goal Status in Footer",
2703
3078
  description: "Show token budget alongside the goal indicator in the status line",
2704
3079
  },
2705
3080
  },
@@ -2709,6 +3084,7 @@ export const SETTINGS_SCHEMA = {
2709
3084
  default: ["interactive"],
2710
3085
  ui: {
2711
3086
  tab: "tasks",
3087
+ group: "Modes",
2712
3088
  label: "Goal Continuation Modes",
2713
3089
  description: "Run modes where active goals may auto-continue between turns",
2714
3090
  },
@@ -2732,6 +3108,7 @@ export const SETTINGS_SCHEMA = {
2732
3108
  default: "none",
2733
3109
  ui: {
2734
3110
  tab: "tasks",
3111
+ group: "Isolation",
2735
3112
  label: "Isolation Mode",
2736
3113
  description:
2737
3114
  'Isolation backend for subagents. "auto" lets the native PAL pick the best available backend (CoW-aware filesystems, then overlayfs/ProjFS, then a git worktree / recursive-copy fallback).',
@@ -2768,6 +3145,7 @@ export const SETTINGS_SCHEMA = {
2768
3145
  default: "patch",
2769
3146
  ui: {
2770
3147
  tab: "tasks",
3148
+ group: "Isolation",
2771
3149
  label: "Isolation Merge Strategy",
2772
3150
  description: "How isolated task changes are integrated (patch apply or branch merge)",
2773
3151
  options: [
@@ -2783,6 +3161,7 @@ export const SETTINGS_SCHEMA = {
2783
3161
  default: "generic",
2784
3162
  ui: {
2785
3163
  tab: "tasks",
3164
+ group: "Isolation",
2786
3165
  label: "Isolation Commit Style",
2787
3166
  description: "Commit message style for nested repo changes (generic or AI-generated)",
2788
3167
  options: [
@@ -2797,6 +3176,7 @@ export const SETTINGS_SCHEMA = {
2797
3176
  default: false,
2798
3177
  ui: {
2799
3178
  tab: "tasks",
3179
+ group: "Subagents",
2800
3180
  label: "Prefer Task Delegation",
2801
3181
  description: "Encourage the agent to delegate work to subagents unless changes are trivial",
2802
3182
  },
@@ -2807,6 +3187,7 @@ export const SETTINGS_SCHEMA = {
2807
3187
  default: true,
2808
3188
  ui: {
2809
3189
  tab: "tasks",
3190
+ group: "Subagents",
2810
3191
  label: "Batch Task Calls",
2811
3192
  description:
2812
3193
  "Switch the task tool to its batch shape: one call carries { agent, context, tasks[] } — one subagent per item (with per-item isolation) and a required shared context prepended to every assignment. With async.enabled=true, each spawn runs as an independent background agent with the normal idle/parked lifecycle; otherwise the call blocks for merged results. Disable to restore the flat single-spawn schema.",
@@ -2818,8 +3199,9 @@ export const SETTINGS_SCHEMA = {
2818
3199
  default: 32,
2819
3200
  ui: {
2820
3201
  tab: "tasks",
3202
+ group: "Subagents",
2821
3203
  label: "Max Concurrent Tasks",
2822
- description: "Concurrent limit for subagents",
3204
+ description: "Maximum number of subagents running concurrently",
2823
3205
  options: [
2824
3206
  { value: "0", label: "Unlimited" },
2825
3207
  { value: "1", label: "1 task" },
@@ -2838,6 +3220,7 @@ export const SETTINGS_SCHEMA = {
2838
3220
  default: false,
2839
3221
  ui: {
2840
3222
  tab: "tasks",
3223
+ group: "Subagents",
2841
3224
  label: "LSP in Subagents",
2842
3225
  description:
2843
3226
  "Allow subagents spawned via the task tool to use the lsp tool. Off by default to keep subagents cheap; enable when LSP-aware delegation is worth the extra tokens.",
@@ -2849,6 +3232,7 @@ export const SETTINGS_SCHEMA = {
2849
3232
  default: 2,
2850
3233
  ui: {
2851
3234
  tab: "tasks",
3235
+ group: "Subagents",
2852
3236
  label: "Max Task Recursion",
2853
3237
  description: "How many levels deep subagents can spawn their own subagents",
2854
3238
  options: [
@@ -2866,6 +3250,7 @@ export const SETTINGS_SCHEMA = {
2866
3250
  default: 0,
2867
3251
  ui: {
2868
3252
  tab: "tasks",
3253
+ group: "Subagents",
2869
3254
  label: "Max Subagent Runtime",
2870
3255
  description:
2871
3256
  "Hard wall-clock limit per subagent (ms). 0 disables it. Defense-in-depth against provider-side stream hangs that escape the inference-layer watchdog; triggers a normal subagent abort with a 'timed out' reason.",
@@ -2884,6 +3269,7 @@ export const SETTINGS_SCHEMA = {
2884
3269
  default: 420_000,
2885
3270
  ui: {
2886
3271
  tab: "tasks",
3272
+ group: "Subagents",
2887
3273
  label: "Agent Idle TTL",
2888
3274
  description:
2889
3275
  "How long an idle subagent stays live in memory before being parked to disk (ms). Parked agents are revived automatically when messaged or resumed. 0 keeps idle agents live until exit.",
@@ -2895,6 +3281,7 @@ export const SETTINGS_SCHEMA = {
2895
3281
  default: 90,
2896
3282
  ui: {
2897
3283
  tab: "tasks",
3284
+ group: "Subagents",
2898
3285
  label: "Soft Subagent Request Budget",
2899
3286
  description:
2900
3287
  "Soft per-subagent request budget (assistant requests per run). Crossing it injects one steering notice asking the subagent to wrap up; at 1.5x the budget the run is aborted gracefully, salvaging partial output. 0 disables the guard. Bundled explore/quick_task agents use a lower built-in budget.",
@@ -2921,9 +3308,10 @@ export const SETTINGS_SCHEMA = {
2921
3308
  type: "number",
2922
3309
  default: 60,
2923
3310
  ui: {
2924
- tab: "tasks",
2925
- label: "Todo auto-clear delay",
2926
- description: "How long to wait before removing completed/abandoned tasks from the list",
3311
+ tab: "tools",
3312
+ group: "Todos",
3313
+ label: "Todo Auto-Clear Delay",
3314
+ description: "Delay before completed or abandoned todos are removed from the todo widget",
2927
3315
  options: [
2928
3316
  { value: "0", label: "Instant" },
2929
3317
  { value: "60", label: "1 minute", description: "Default" },
@@ -2941,6 +3329,7 @@ export const SETTINGS_SCHEMA = {
2941
3329
  default: false,
2942
3330
  ui: {
2943
3331
  tab: "appearance",
3332
+ group: "Display",
2944
3333
  label: "Show Resolved Model Badge",
2945
3334
  description: "Display the actual model ID used by each subagent in the task widget status line",
2946
3335
  },
@@ -2952,7 +3341,12 @@ export const SETTINGS_SCHEMA = {
2952
3341
  "skills.enableSkillCommands": {
2953
3342
  type: "boolean",
2954
3343
  default: true,
2955
- ui: { tab: "tasks", label: "Skill Commands", description: "Register skills as /skill:name commands" },
3344
+ ui: {
3345
+ tab: "tasks",
3346
+ group: "Commands & Skills",
3347
+ label: "Skill Commands",
3348
+ description: "Register skills as /skill:name commands",
3349
+ },
2956
3350
  },
2957
3351
 
2958
3352
  "skills.enableCodexUser": { type: "boolean", default: true },
@@ -2975,13 +3369,23 @@ export const SETTINGS_SCHEMA = {
2975
3369
  "commands.enableClaudeUser": {
2976
3370
  type: "boolean",
2977
3371
  default: true,
2978
- ui: { tab: "tasks", label: "Claude User Commands", description: "Load commands from ~/.claude/commands/" },
3372
+ ui: {
3373
+ tab: "tasks",
3374
+ group: "Commands & Skills",
3375
+ label: "Claude User Commands",
3376
+ description: "Load commands from ~/.claude/commands/",
3377
+ },
2979
3378
  },
2980
3379
 
2981
3380
  "commands.enableClaudeProject": {
2982
3381
  type: "boolean",
2983
3382
  default: true,
2984
- ui: { tab: "tasks", label: "Claude Project Commands", description: "Load commands from .claude/commands/" },
3383
+ ui: {
3384
+ tab: "tasks",
3385
+ group: "Commands & Skills",
3386
+ label: "Claude Project Commands",
3387
+ description: "Load commands from .claude/commands/",
3388
+ },
2985
3389
  },
2986
3390
 
2987
3391
  "commands.enableOpencodeUser": {
@@ -2989,6 +3393,7 @@ export const SETTINGS_SCHEMA = {
2989
3393
  default: true,
2990
3394
  ui: {
2991
3395
  tab: "tasks",
3396
+ group: "Commands & Skills",
2992
3397
  label: "OpenCode User Commands",
2993
3398
  description: "Load commands from ~/.config/opencode/commands/",
2994
3399
  },
@@ -2997,7 +3402,12 @@ export const SETTINGS_SCHEMA = {
2997
3402
  "commands.enableOpencodeProject": {
2998
3403
  type: "boolean",
2999
3404
  default: true,
3000
- ui: { tab: "tasks", label: "OpenCode Project Commands", description: "Load commands from .opencode/commands/" },
3405
+ ui: {
3406
+ tab: "tasks",
3407
+ group: "Commands & Skills",
3408
+ label: "OpenCode Project Commands",
3409
+ description: "Load commands from .opencode/commands/",
3410
+ },
3001
3411
  },
3002
3412
 
3003
3413
  // ────────────────────────────────────────────────────────────────────────
@@ -3008,7 +3418,12 @@ export const SETTINGS_SCHEMA = {
3008
3418
  "secrets.enabled": {
3009
3419
  type: "boolean",
3010
3420
  default: false,
3011
- ui: { tab: "providers", label: "Hide Secrets", description: "Obfuscate secrets before sending to AI providers" },
3421
+ ui: {
3422
+ tab: "providers",
3423
+ group: "Privacy",
3424
+ label: "Hide Secrets",
3425
+ description: "Obfuscate secrets before sending to AI providers",
3426
+ },
3012
3427
  },
3013
3428
 
3014
3429
  // Provider selection
@@ -3018,8 +3433,9 @@ export const SETTINGS_SCHEMA = {
3018
3433
  default: "auto",
3019
3434
  ui: {
3020
3435
  tab: "providers",
3436
+ group: "Services",
3021
3437
  label: "Web Search Provider",
3022
- description: "Provider for web search tool",
3438
+ description: "Preferred provider for the web_search tool",
3023
3439
  options: SEARCH_PROVIDER_OPTIONS,
3024
3440
  },
3025
3441
  },
@@ -3029,8 +3445,9 @@ export const SETTINGS_SCHEMA = {
3029
3445
  default: "auto",
3030
3446
  ui: {
3031
3447
  tab: "providers",
3448
+ group: "Services",
3032
3449
  label: "Image Provider",
3033
- description: "Provider for image generation tool",
3450
+ description: "Preferred provider for image generation",
3034
3451
  options: [
3035
3452
  {
3036
3453
  value: "auto",
@@ -3059,6 +3476,7 @@ export const SETTINGS_SCHEMA = {
3059
3476
  default: ONLINE_TINY_TITLE_MODEL_KEY,
3060
3477
  ui: {
3061
3478
  tab: "providers",
3479
+ group: "Tiny Model",
3062
3480
  label: "Tiny Model",
3063
3481
  description: "Session-title model: online pi/smol by default, or a local on-device model",
3064
3482
  options: TINY_TITLE_MODEL_OPTIONS,
@@ -3070,6 +3488,7 @@ export const SETTINGS_SCHEMA = {
3070
3488
  default: TINY_MODEL_DEVICE_DEFAULT,
3071
3489
  ui: {
3072
3490
  tab: "providers",
3491
+ group: "Tiny Model",
3073
3492
  label: "Tiny Model Device",
3074
3493
  description:
3075
3494
  "ONNX execution provider for local tiny models (titles + memory). Default uses CPU-only inference. The PI_TINY_DEVICE env var overrides this.",
@@ -3082,6 +3501,7 @@ export const SETTINGS_SCHEMA = {
3082
3501
  default: TINY_MODEL_DTYPE_DEFAULT,
3083
3502
  ui: {
3084
3503
  tab: "providers",
3504
+ group: "Tiny Model",
3085
3505
  label: "Tiny Model Precision",
3086
3506
  description:
3087
3507
  "ONNX quantization/precision for local tiny models. Default uses each model's shipped dtype (q4); lower precision is faster, higher is more faithful. The PI_TINY_DTYPE env var overrides this.",
@@ -3094,6 +3514,7 @@ export const SETTINGS_SCHEMA = {
3094
3514
  default: ONLINE_MEMORY_MODEL_KEY,
3095
3515
  ui: {
3096
3516
  tab: "memory",
3517
+ group: "General",
3097
3518
  label: "Memory Model",
3098
3519
  description:
3099
3520
  "Mnemopi LLM for fact extraction + consolidation: online (smol/remote) by default, or a local on-device model",
@@ -3108,6 +3529,7 @@ export const SETTINGS_SCHEMA = {
3108
3529
  default: ONLINE_AUTO_THINKING_MODEL_KEY,
3109
3530
  ui: {
3110
3531
  tab: "model",
3532
+ group: "Thinking",
3111
3533
  label: "Auto Thinking Model",
3112
3534
  description:
3113
3535
  "Difficulty classifier for the `auto` thinking level: online smol by default, or a local on-device model",
@@ -3122,6 +3544,7 @@ export const SETTINGS_SCHEMA = {
3122
3544
  default: "anthropic",
3123
3545
  ui: {
3124
3546
  tab: "providers",
3547
+ group: "Protocol",
3125
3548
  label: "Kimi API Format",
3126
3549
  description: "API format for Kimi Code provider",
3127
3550
  options: [
@@ -3137,6 +3560,7 @@ export const SETTINGS_SCHEMA = {
3137
3560
  default: "auto",
3138
3561
  ui: {
3139
3562
  tab: "providers",
3563
+ group: "Protocol",
3140
3564
  label: "OpenAI WebSockets",
3141
3565
  description: "Websocket policy for OpenAI Codex models (auto uses model defaults, on forces, off disables)",
3142
3566
  options: [
@@ -3153,6 +3577,7 @@ export const SETTINGS_SCHEMA = {
3153
3577
  default: "default",
3154
3578
  ui: {
3155
3579
  tab: "providers",
3580
+ group: "Protocol",
3156
3581
  label: "OpenRouter Routing",
3157
3582
  description:
3158
3583
  "Default routing-variant suffix appended to OpenRouter model IDs (overridden when the selector already names a variant)",
@@ -3175,6 +3600,7 @@ export const SETTINGS_SCHEMA = {
3175
3600
  default: "auto",
3176
3601
  ui: {
3177
3602
  tab: "providers",
3603
+ group: "Services",
3178
3604
  label: "Fetch Provider",
3179
3605
  description: "Reader backend priority for the fetch/read URL tool",
3180
3606
  options: [
@@ -3197,6 +3623,7 @@ export const SETTINGS_SCHEMA = {
3197
3623
  default: "auto",
3198
3624
  ui: {
3199
3625
  tab: "providers",
3626
+ group: "Protocol",
3200
3627
  label: "Append-Only Context",
3201
3628
  description:
3202
3629
  "Cache system prompt + tool specs and keep an append-only message log so provider prefix caches (DeepSeek, Xiaomi/SGLang, Anthropic) hit at maximum rate. Auto enables for known prefix-cache providers.",
@@ -3212,25 +3639,40 @@ export const SETTINGS_SCHEMA = {
3212
3639
  "exa.enabled": {
3213
3640
  type: "boolean",
3214
3641
  default: true,
3215
- ui: { tab: "providers", label: "Exa", description: "Master toggle for all Exa search tools" },
3642
+ ui: { tab: "providers", group: "Services", label: "Exa", description: "Master toggle for all Exa search tools" },
3216
3643
  },
3217
3644
 
3218
3645
  "exa.enableSearch": {
3219
3646
  type: "boolean",
3220
3647
  default: true,
3221
- ui: { tab: "providers", label: "Exa Search", description: "Basic search, deep search, code search, crawl" },
3648
+ ui: {
3649
+ tab: "providers",
3650
+ group: "Services",
3651
+ label: "Exa Search",
3652
+ description: "Enable Exa basic search, deep search, code search, and crawl tools",
3653
+ },
3222
3654
  },
3223
3655
 
3224
3656
  "exa.enableResearcher": {
3225
3657
  type: "boolean",
3226
3658
  default: false,
3227
- ui: { tab: "providers", label: "Exa Researcher", description: "AI-powered deep research tasks" },
3659
+ ui: {
3660
+ tab: "providers",
3661
+ group: "Services",
3662
+ label: "Exa Researcher",
3663
+ description: "Enable the Exa researcher tool for AI-powered deep research",
3664
+ },
3228
3665
  },
3229
3666
 
3230
3667
  "exa.enableWebsets": {
3231
3668
  type: "boolean",
3232
3669
  default: false,
3233
- ui: { tab: "providers", label: "Exa Websets", description: "Webset management and enrichment tools" },
3670
+ ui: {
3671
+ tab: "providers",
3672
+ group: "Services",
3673
+ label: "Exa Websets",
3674
+ description: "Enable Exa webset management and enrichment tools",
3675
+ },
3234
3676
  },
3235
3677
 
3236
3678
  // SearXNG
@@ -3239,8 +3681,9 @@ export const SETTINGS_SCHEMA = {
3239
3681
  default: undefined,
3240
3682
  ui: {
3241
3683
  tab: "providers",
3684
+ group: "Services",
3242
3685
  label: "SearXNG Endpoint",
3243
- description: "Self-hosted search base URL",
3686
+ description: "Base URL of a self-hosted SearXNG instance used for web search",
3244
3687
  },
3245
3688
  },
3246
3689
 
@@ -3286,6 +3729,7 @@ export const SETTINGS_SCHEMA = {
3286
3729
  default: false,
3287
3730
  ui: {
3288
3731
  tab: "tools",
3732
+ group: "Developer",
3289
3733
  label: "Auto QA",
3290
3734
  description: "Enable automated tool issue reporting (report_tool_issue) for all agents",
3291
3735
  },
@@ -3299,8 +3743,9 @@ export const SETTINGS_SCHEMA = {
3299
3743
  default: "https://qa.omp.sh/v1/grievances" as const,
3300
3744
  ui: {
3301
3745
  tab: "tools",
3746
+ group: "Developer",
3302
3747
  label: "Auto QA Push Endpoint",
3303
- description: "Full URL that receives the JSON payload (default ships to https://qa.omp.sh/v1/grievances)",
3748
+ description: "Full URL receiving Auto QA JSON reports (default https://qa.omp.sh/v1/grievances)",
3304
3749
  },
3305
3750
  },
3306
3751
 
@@ -3413,6 +3858,9 @@ export type StatusLineSeparatorStyle = SettingValue<"statusLine.separator">;
3413
3858
  /** Tree selector filter mode - derived from schema */
3414
3859
  export type TreeFilterMode = SettingValue<"treeFilterMode">;
3415
3860
 
3861
+ /** Personality preset - derived from schema */
3862
+ export type Personality = SettingValue<"personality">;
3863
+
3416
3864
  // ═══════════════════════════════════════════════════════════════════════════
3417
3865
  // Typed Group Definitions
3418
3866
  // ═══════════════════════════════════════════════════════════════════════════