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

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 (135) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/dist/cli.js +692 -607
  3. package/dist/types/cli/usage-cli.d.ts +10 -1
  4. package/dist/types/commands/usage.d.ts +9 -0
  5. package/dist/types/config/api-key-resolver.d.ts +9 -3
  6. package/dist/types/config/keybindings.d.ts +1 -1
  7. package/dist/types/config/model-discovery.d.ts +6 -4
  8. package/dist/types/config/model-registry.d.ts +7 -4
  9. package/dist/types/config/settings-schema.d.ts +508 -155
  10. package/dist/types/export/html/template.generated.d.ts +1 -1
  11. package/dist/types/mnemopi/config.d.ts +3 -1
  12. package/dist/types/modes/components/reset-usage-selector.d.ts +12 -0
  13. package/dist/types/modes/components/session-selector.d.ts +1 -1
  14. package/dist/types/modes/components/settings-defs.d.ts +9 -2
  15. package/dist/types/modes/components/settings-selector.d.ts +9 -4
  16. package/dist/types/modes/components/tool-execution.d.ts +26 -1
  17. package/dist/types/modes/components/transcript-container.d.ts +12 -0
  18. package/dist/types/modes/controllers/input-controller.d.ts +9 -1
  19. package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
  20. package/dist/types/modes/interactive-mode.d.ts +10 -0
  21. package/dist/types/modes/session-observer-registry.d.ts +2 -0
  22. package/dist/types/modes/theme/theme.d.ts +23 -3
  23. package/dist/types/modes/types.d.ts +2 -0
  24. package/dist/types/modes/utils/context-usage.d.ts +6 -1
  25. package/dist/types/session/agent-session.d.ts +28 -8
  26. package/dist/types/session/auth-storage.d.ts +1 -1
  27. package/dist/types/session/codex-auto-reset.d.ts +107 -0
  28. package/dist/types/session/snapcompact-inline.d.ts +129 -0
  29. package/dist/types/slash-commands/helpers/active-oauth-account.d.ts +14 -0
  30. package/dist/types/slash-commands/helpers/reset-usage.d.ts +27 -0
  31. package/dist/types/system-prompt.d.ts +3 -1
  32. package/dist/types/task/render.d.ts +17 -6
  33. package/dist/types/tools/gh.d.ts +3 -0
  34. package/dist/types/tools/render-utils.d.ts +8 -16
  35. package/dist/types/tools/todo.d.ts +0 -11
  36. package/dist/types/utils/session-color.d.ts +15 -3
  37. package/dist/types/web/kagi.d.ts +1 -2
  38. package/dist/types/web/search/providers/codex.d.ts +1 -1
  39. package/dist/types/web/search/providers/gemini.d.ts +9 -6
  40. package/package.json +11 -11
  41. package/src/auto-thinking/classifier.ts +1 -5
  42. package/src/cli/usage-cli.ts +187 -16
  43. package/src/commands/usage.ts +8 -0
  44. package/src/commit/model-selection.ts +3 -6
  45. package/src/config/api-key-resolver.ts +10 -3
  46. package/src/config/keybindings.ts +1 -1
  47. package/src/config/model-discovery.ts +60 -46
  48. package/src/config/model-registry.ts +21 -8
  49. package/src/config/model-resolver.ts +57 -3
  50. package/src/config/settings-schema.ts +654 -153
  51. package/src/config/settings.ts +9 -0
  52. package/src/eval/completion-bridge.ts +1 -5
  53. package/src/export/html/template.generated.ts +1 -1
  54. package/src/export/html/template.js +13 -6
  55. package/src/internal-urls/docs-index.generated.ts +6 -6
  56. package/src/internal-urls/issue-pr-protocol.ts +10 -4
  57. package/src/memories/index.ts +2 -10
  58. package/src/mnemopi/backend.ts +30 -8
  59. package/src/mnemopi/config.ts +6 -1
  60. package/src/mnemopi/state.ts +6 -0
  61. package/src/modes/components/extensions/inspector-panel.ts +6 -2
  62. package/src/modes/components/plan-review-overlay.ts +15 -17
  63. package/src/modes/components/plugin-settings.ts +22 -5
  64. package/src/modes/components/reset-usage-selector.ts +161 -0
  65. package/src/modes/components/session-selector.ts +8 -2
  66. package/src/modes/components/settings-defs.ts +19 -4
  67. package/src/modes/components/settings-selector.ts +510 -95
  68. package/src/modes/components/status-line/component.ts +3 -1
  69. package/src/modes/components/status-line/segments.ts +3 -1
  70. package/src/modes/components/tool-execution.ts +87 -12
  71. package/src/modes/components/transcript-container.ts +49 -1
  72. package/src/modes/components/tree-selector.ts +16 -6
  73. package/src/modes/controllers/command-controller.ts +61 -8
  74. package/src/modes/controllers/event-controller.ts +1 -0
  75. package/src/modes/controllers/input-controller.ts +68 -6
  76. package/src/modes/controllers/selector-controller.ts +149 -61
  77. package/src/modes/interactive-mode.ts +63 -2
  78. package/src/modes/rpc/rpc-mode.ts +2 -1
  79. package/src/modes/session-observer-registry.ts +61 -3
  80. package/src/modes/shared.ts +2 -0
  81. package/src/modes/theme/theme.ts +102 -9
  82. package/src/modes/types.ts +2 -0
  83. package/src/modes/utils/context-usage.ts +78 -2
  84. package/src/modes/utils/hotkeys-markdown.ts +1 -1
  85. package/src/modes/utils/ui-helpers.ts +9 -5
  86. package/src/prompts/system/personalities/default.md +26 -0
  87. package/src/prompts/system/personalities/friendly.md +17 -0
  88. package/src/prompts/system/personalities/pragmatic.md +15 -0
  89. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  90. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  91. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  92. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  93. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  94. package/src/prompts/system/system-prompt.md +5 -22
  95. package/src/prompts/tools/browser.md +33 -43
  96. package/src/prompts/tools/eval.md +27 -50
  97. package/src/prompts/tools/irc.md +29 -31
  98. package/src/prompts/tools/read.md +31 -37
  99. package/src/prompts/tools/task.md +3 -3
  100. package/src/prompts/tools/todo.md +1 -2
  101. package/src/sdk.ts +23 -1
  102. package/src/session/agent-session.ts +221 -29
  103. package/src/session/auth-storage.ts +4 -0
  104. package/src/session/codex-auto-reset.ts +190 -0
  105. package/src/session/session-dump-format.ts +8 -1
  106. package/src/session/session-manager.ts +5 -5
  107. package/src/session/snapcompact-inline.ts +524 -0
  108. package/src/slash-commands/builtin-registry.ts +145 -8
  109. package/src/slash-commands/helpers/active-oauth-account.ts +44 -0
  110. package/src/slash-commands/helpers/context-report.ts +28 -1
  111. package/src/slash-commands/helpers/reset-usage.ts +66 -0
  112. package/src/slash-commands/helpers/usage-report.ts +36 -3
  113. package/src/system-prompt.ts +15 -1
  114. package/src/task/index.ts +30 -7
  115. package/src/task/render.ts +57 -32
  116. package/src/tool-discovery/tool-index.ts +2 -0
  117. package/src/tools/bash.ts +10 -3
  118. package/src/tools/eval-render.ts +13 -8
  119. package/src/tools/gh.ts +39 -1
  120. package/src/tools/image-gen.ts +114 -78
  121. package/src/tools/inspect-image.ts +1 -5
  122. package/src/tools/job.ts +25 -5
  123. package/src/tools/read.ts +1 -57
  124. package/src/tools/render-utils.ts +29 -31
  125. package/src/tools/ssh.ts +3 -3
  126. package/src/tools/todo.ts +8 -128
  127. package/src/tools/tts.ts +40 -20
  128. package/src/utils/clipboard.ts +56 -4
  129. package/src/utils/commit-message-generator.ts +1 -5
  130. package/src/utils/session-color.ts +83 -9
  131. package/src/utils/title-generator.ts +1 -1
  132. package/src/web/kagi.ts +26 -27
  133. package/src/web/search/providers/codex.ts +42 -40
  134. package/src/web/search/providers/gemini.ts +42 -22
  135. 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,61 @@ 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: "enum",
1576
+ values: ["none", "agents-md", "all"] as const,
1577
+ default: "none",
1578
+ ui: {
1579
+ tab: "context",
1580
+ group: "Experimental",
1581
+ label: "Snapcompact System Prompt",
1582
+ description:
1583
+ "Experimental: render selected system prompt text as dense PNG image(s) and attach to the first user message (vision models only). Saves tokens; loses prompt caching for imaged text.",
1584
+ options: [
1585
+ { value: "none", label: "None", description: "Keep the system prompt as text." },
1586
+ {
1587
+ value: "agents-md",
1588
+ label: "AGENTS.md",
1589
+ description: "Only move loaded context-file instructions to images, when that saves tokens.",
1590
+ },
1591
+ {
1592
+ value: "all",
1593
+ label: "All",
1594
+ description: "Move the full system prompt to images, when that saves tokens.",
1595
+ },
1596
+ ],
1597
+ },
1598
+ },
1599
+
1600
+ "snapcompact.toolResults": {
1601
+ type: "boolean",
1602
+ default: false,
1603
+ ui: {
1604
+ tab: "context",
1605
+ group: "Experimental",
1606
+ label: "Snapcompact Tool Results",
1607
+ description:
1608
+ "Experimental: render large historical tool results as dense PNG image(s) instead of text (vision models only). Saves tokens on accumulated read/search output.",
1609
+ },
1610
+ },
1611
+
1395
1612
  // Branch summaries
1396
1613
  "branchSummary.enabled": {
1397
1614
  type: "boolean",
1398
1615
  default: false,
1399
- ui: { tab: "context", label: "Branch Summaries", description: "Prompt to summarize when leaving a branch" },
1616
+ ui: {
1617
+ tab: "context",
1618
+ group: "General",
1619
+ label: "Branch Summaries",
1620
+ description: "Prompt to summarize when leaving a branch",
1621
+ },
1400
1622
  },
1401
1623
 
1402
1624
  "branchSummary.reserveTokens": { type: "number", default: 16384 },
@@ -1449,6 +1671,7 @@ export const SETTINGS_SCHEMA = {
1449
1671
  default: "off",
1450
1672
  ui: {
1451
1673
  tab: "memory",
1674
+ group: "General",
1452
1675
  label: "Memory Backend",
1453
1676
  description: "Off, local summary pipeline, Mnemopi SQLite, or Hindsight remote memory",
1454
1677
  options: [
@@ -1470,6 +1693,7 @@ export const SETTINGS_SCHEMA = {
1470
1693
  default: undefined,
1471
1694
  ui: {
1472
1695
  tab: "memory",
1696
+ group: "Mnemopi",
1473
1697
  label: "Mnemopi DB Path",
1474
1698
  description: "Optional SQLite DB path. Defaults to the agent memories directory.",
1475
1699
  condition: "mnemopiActive",
@@ -1480,6 +1704,7 @@ export const SETTINGS_SCHEMA = {
1480
1704
  default: undefined,
1481
1705
  ui: {
1482
1706
  tab: "memory",
1707
+ group: "Mnemopi",
1483
1708
  label: "Mnemopi Bank",
1484
1709
  description: "Optional shared bank base name. Per-project modes derive project-local banks from it.",
1485
1710
  condition: "mnemopiActive",
@@ -1491,6 +1716,7 @@ export const SETTINGS_SCHEMA = {
1491
1716
  default: "per-project",
1492
1717
  ui: {
1493
1718
  tab: "memory",
1719
+ group: "Mnemopi",
1494
1720
  label: "Mnemopi Scoping",
1495
1721
  description:
1496
1722
  "global = one shared bank; per-project = isolated bank per cwd; per-project-tagged = project-local writes plus global recall visibility",
@@ -1519,6 +1745,7 @@ export const SETTINGS_SCHEMA = {
1519
1745
  default: true,
1520
1746
  ui: {
1521
1747
  tab: "memory",
1748
+ group: "Mnemopi",
1522
1749
  label: "Mnemopi Auto Recall",
1523
1750
  description: "Recall local memories into the first turn of each session",
1524
1751
  condition: "mnemopiActive",
@@ -1529,16 +1756,40 @@ export const SETTINGS_SCHEMA = {
1529
1756
  default: true,
1530
1757
  ui: {
1531
1758
  tab: "memory",
1759
+ group: "Mnemopi",
1532
1760
  label: "Mnemopi Auto Retain",
1533
1761
  description: "Retain completed conversation turns into local Mnemopi memory",
1534
1762
  condition: "mnemopiActive",
1535
1763
  },
1536
1764
  },
1765
+ "mnemopi.polyphonicRecall": {
1766
+ type: "boolean",
1767
+ default: false,
1768
+ ui: {
1769
+ tab: "memory",
1770
+ group: "Mnemopi",
1771
+ label: "Mnemopi Polyphonic Recall",
1772
+ description: "Enable 4-voice recall (vector, graph, fact, temporal) fused with reciprocal rank fusion",
1773
+ condition: "mnemopiActive",
1774
+ },
1775
+ },
1776
+ "mnemopi.enhancedRecall": {
1777
+ type: "boolean",
1778
+ default: false,
1779
+ ui: {
1780
+ tab: "memory",
1781
+ group: "Mnemopi",
1782
+ label: "Mnemopi Enhanced Recall",
1783
+ description: "Enable the tiered query result cache for repeated and similar recall queries",
1784
+ condition: "mnemopiActive",
1785
+ },
1786
+ },
1537
1787
  "mnemopi.noEmbeddings": {
1538
1788
  type: "boolean",
1539
1789
  default: false,
1540
1790
  ui: {
1541
1791
  tab: "memory",
1792
+ group: "Mnemopi",
1542
1793
  label: "Mnemopi Disable Embeddings",
1543
1794
  description: "Force deterministic FTS-only recall instead of vector embeddings",
1544
1795
  condition: "mnemopiActive",
@@ -1549,6 +1800,7 @@ export const SETTINGS_SCHEMA = {
1549
1800
  default: undefined,
1550
1801
  ui: {
1551
1802
  tab: "memory",
1803
+ group: "Mnemopi",
1552
1804
  label: "Mnemopi Embedding Model",
1553
1805
  description: "Optional embedding model override passed to Mnemopi",
1554
1806
  condition: "mnemopiActive",
@@ -1559,6 +1811,7 @@ export const SETTINGS_SCHEMA = {
1559
1811
  default: undefined,
1560
1812
  ui: {
1561
1813
  tab: "memory",
1814
+ group: "Mnemopi",
1562
1815
  label: "Mnemopi Embedding API URL",
1563
1816
  description: "Optional OpenAI-compatible embedding endpoint passed to Mnemopi",
1564
1817
  condition: "mnemopiActive",
@@ -1569,6 +1822,7 @@ export const SETTINGS_SCHEMA = {
1569
1822
  default: undefined,
1570
1823
  ui: {
1571
1824
  tab: "memory",
1825
+ group: "Mnemopi",
1572
1826
  label: "Mnemopi Embedding API Key",
1573
1827
  description: "Optional embedding API key passed to Mnemopi",
1574
1828
  condition: "mnemopiActive",
@@ -1580,6 +1834,7 @@ export const SETTINGS_SCHEMA = {
1580
1834
  default: "smol",
1581
1835
  ui: {
1582
1836
  tab: "memory",
1837
+ group: "Mnemopi",
1583
1838
  label: "Mnemopi LLM Mode",
1584
1839
  description: "Use no LLM, the configured smol model, or a remote OpenAI-compatible endpoint",
1585
1840
  condition: "mnemopiActive",
@@ -1595,6 +1850,7 @@ export const SETTINGS_SCHEMA = {
1595
1850
  default: undefined,
1596
1851
  ui: {
1597
1852
  tab: "memory",
1853
+ group: "Mnemopi",
1598
1854
  label: "Mnemopi LLM Base URL",
1599
1855
  description: "Optional OpenAI-compatible LLM endpoint for Mnemopi remote mode",
1600
1856
  condition: "mnemopiActive",
@@ -1605,6 +1861,7 @@ export const SETTINGS_SCHEMA = {
1605
1861
  default: undefined,
1606
1862
  ui: {
1607
1863
  tab: "memory",
1864
+ group: "Mnemopi",
1608
1865
  label: "Mnemopi LLM API Key",
1609
1866
  description: "Optional LLM API key for Mnemopi remote mode",
1610
1867
  condition: "mnemopiActive",
@@ -1615,6 +1872,7 @@ export const SETTINGS_SCHEMA = {
1615
1872
  default: undefined,
1616
1873
  ui: {
1617
1874
  tab: "memory",
1875
+ group: "Mnemopi",
1618
1876
  label: "Mnemopi LLM Model",
1619
1877
  description: "Optional LLM model name for Mnemopi remote mode",
1620
1878
  condition: "mnemopiActive",
@@ -1633,6 +1891,7 @@ export const SETTINGS_SCHEMA = {
1633
1891
  default: "http://localhost:8888",
1634
1892
  ui: {
1635
1893
  tab: "memory",
1894
+ group: "Hindsight",
1636
1895
  label: "Hindsight API URL",
1637
1896
  description: "Hindsight server URL (Cloud or self-hosted)",
1638
1897
  condition: "hindsightActive",
@@ -1646,6 +1905,7 @@ export const SETTINGS_SCHEMA = {
1646
1905
  default: undefined,
1647
1906
  ui: {
1648
1907
  tab: "memory",
1908
+ group: "Hindsight",
1649
1909
  label: "Hindsight Bank ID",
1650
1910
  description: "Memory bank identifier (default: project name)",
1651
1911
  condition: "hindsightActive",
@@ -1659,6 +1919,7 @@ export const SETTINGS_SCHEMA = {
1659
1919
  default: "per-project-tagged",
1660
1920
  ui: {
1661
1921
  tab: "memory",
1922
+ group: "Hindsight",
1662
1923
  label: "Hindsight Scoping",
1663
1924
  description:
1664
1925
  "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 +1952,7 @@ export const SETTINGS_SCHEMA = {
1691
1952
  default: true,
1692
1953
  ui: {
1693
1954
  tab: "memory",
1955
+ group: "Hindsight",
1694
1956
  label: "Hindsight Auto Recall",
1695
1957
  description: "Recall memories on the first turn of each session",
1696
1958
  condition: "hindsightActive",
@@ -1701,6 +1963,7 @@ export const SETTINGS_SCHEMA = {
1701
1963
  default: true,
1702
1964
  ui: {
1703
1965
  tab: "memory",
1966
+ group: "Hindsight",
1704
1967
  label: "Hindsight Auto Retain",
1705
1968
  description: "Retain transcript every N turns and at session boundaries",
1706
1969
  condition: "hindsightActive",
@@ -1713,6 +1976,7 @@ export const SETTINGS_SCHEMA = {
1713
1976
  default: "full-session",
1714
1977
  ui: {
1715
1978
  tab: "memory",
1979
+ group: "Hindsight",
1716
1980
  label: "Hindsight Retain Mode",
1717
1981
  description: "full-session = upsert one document per session, last-turn = chunked",
1718
1982
  options: [
@@ -1747,6 +2011,7 @@ export const SETTINGS_SCHEMA = {
1747
2011
  default: true,
1748
2012
  ui: {
1749
2013
  tab: "memory",
2014
+ group: "Hindsight",
1750
2015
  label: "Hindsight Mental Models",
1751
2016
  description:
1752
2017
  "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 +2023,7 @@ export const SETTINGS_SCHEMA = {
1758
2023
  default: true,
1759
2024
  ui: {
1760
2025
  tab: "memory",
2026
+ group: "Hindsight",
1761
2027
  label: "Hindsight Mental Model Auto-Seed",
1762
2028
  description:
1763
2029
  "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 +2039,9 @@ export const SETTINGS_SCHEMA = {
1773
2039
  default: true,
1774
2040
  ui: {
1775
2041
  tab: "context",
2042
+ group: "Rules (TTSR)",
1776
2043
  label: "TTSR",
1777
- description: "Time Traveling Stream Rules: interrupt agent when output matches patterns",
2044
+ description: "Interrupt the agent mid-stream when output matches rule patterns (Time-Traveling Stream Rules)",
1778
2045
  },
1779
2046
  },
1780
2047
 
@@ -1784,6 +2051,7 @@ export const SETTINGS_SCHEMA = {
1784
2051
  default: "discard",
1785
2052
  ui: {
1786
2053
  tab: "context",
2054
+ group: "Rules (TTSR)",
1787
2055
  label: "TTSR Context Mode",
1788
2056
  description: "What to do with partial output when TTSR triggers",
1789
2057
  },
@@ -1795,6 +2063,7 @@ export const SETTINGS_SCHEMA = {
1795
2063
  default: "always",
1796
2064
  ui: {
1797
2065
  tab: "context",
2066
+ group: "Rules (TTSR)",
1798
2067
  label: "TTSR Interrupt Mode",
1799
2068
  description: "When to interrupt mid-stream vs inject warning after completion",
1800
2069
  options: [
@@ -1812,6 +2081,7 @@ export const SETTINGS_SCHEMA = {
1812
2081
  default: "once",
1813
2082
  ui: {
1814
2083
  tab: "context",
2084
+ group: "Rules (TTSR)",
1815
2085
  label: "TTSR Repeat Mode",
1816
2086
  description: "How rules can repeat: once per session or after a message gap",
1817
2087
  },
@@ -1822,6 +2092,7 @@ export const SETTINGS_SCHEMA = {
1822
2092
  default: 10,
1823
2093
  ui: {
1824
2094
  tab: "context",
2095
+ group: "Rules (TTSR)",
1825
2096
  label: "TTSR Repeat Gap",
1826
2097
  description: "Messages before a rule can trigger again",
1827
2098
  options: [
@@ -1839,7 +2110,8 @@ export const SETTINGS_SCHEMA = {
1839
2110
  default: true,
1840
2111
  ui: {
1841
2112
  tab: "context",
1842
- label: "Builtin Rules",
2113
+ group: "Rules (TTSR)",
2114
+ label: "Built-in Rules",
1843
2115
  description: "Load the default rules shipped with the agent (override individually with ttsr.disabledRules)",
1844
2116
  },
1845
2117
  },
@@ -1849,6 +2121,7 @@ export const SETTINGS_SCHEMA = {
1849
2121
  default: [] as string[],
1850
2122
  ui: {
1851
2123
  tab: "context",
2124
+ group: "Rules (TTSR)",
1852
2125
  label: "Disabled Rules",
1853
2126
  description: "Rule names to ignore entirely (applies to bundled defaults and your own rules)",
1854
2127
  },
@@ -1864,7 +2137,8 @@ export const SETTINGS_SCHEMA = {
1864
2137
  values: EDIT_MODES,
1865
2138
  default: "hashline",
1866
2139
  ui: {
1867
- tab: "editing",
2140
+ tab: "files",
2141
+ group: "Editing",
1868
2142
  label: "Edit Mode",
1869
2143
  description: "Select the edit tool variant (replace, patch, hashline, or apply_patch)",
1870
2144
  },
@@ -1874,7 +2148,8 @@ export const SETTINGS_SCHEMA = {
1874
2148
  type: "boolean",
1875
2149
  default: true,
1876
2150
  ui: {
1877
- tab: "editing",
2151
+ tab: "files",
2152
+ group: "Editing",
1878
2153
  label: "Fuzzy Match",
1879
2154
  description: "Accept high-confidence fuzzy matches for whitespace differences",
1880
2155
  },
@@ -1884,9 +2159,10 @@ export const SETTINGS_SCHEMA = {
1884
2159
  type: "number",
1885
2160
  default: 0.95,
1886
2161
  ui: {
1887
- tab: "editing",
2162
+ tab: "files",
2163
+ group: "Editing",
1888
2164
  label: "Fuzzy Match Threshold",
1889
- description: "Similarity threshold for fuzzy matches",
2165
+ description: "Similarity threshold (0-1) for accepting fuzzy matches",
1890
2166
  options: [
1891
2167
  { value: "0.85", label: "0.85", description: "Lenient" },
1892
2168
  { value: "0.90", label: "0.90", description: "Moderate" },
@@ -1900,7 +2176,8 @@ export const SETTINGS_SCHEMA = {
1900
2176
  type: "boolean",
1901
2177
  default: false,
1902
2178
  ui: {
1903
- tab: "editing",
2179
+ tab: "files",
2180
+ group: "Editing",
1904
2181
  label: "Abort on Failed Preview",
1905
2182
  description: "Abort streaming edit tool calls when patch preview fails",
1906
2183
  },
@@ -1910,7 +2187,8 @@ export const SETTINGS_SCHEMA = {
1910
2187
  type: "boolean",
1911
2188
  default: true,
1912
2189
  ui: {
1913
- tab: "editing",
2190
+ tab: "files",
2191
+ group: "Editing",
1914
2192
  label: "Block Auto-Generated Files",
1915
2193
  description: "Prevent editing of files that appear to be auto-generated (protoc, sqlc, swagger, etc.)",
1916
2194
  },
@@ -1920,7 +2198,8 @@ export const SETTINGS_SCHEMA = {
1920
2198
  type: "boolean",
1921
2199
  default: false,
1922
2200
  ui: {
1923
- tab: "editing",
2201
+ tab: "files",
2202
+ group: "Reading",
1924
2203
  label: "Line Numbers",
1925
2204
  description: "Prepend line numbers to read tool output by default",
1926
2205
  },
@@ -1930,7 +2209,8 @@ export const SETTINGS_SCHEMA = {
1930
2209
  type: "boolean",
1931
2210
  default: true,
1932
2211
  ui: {
1933
- tab: "editing",
2212
+ tab: "files",
2213
+ group: "Reading",
1934
2214
  label: "Hash Lines",
1935
2215
  description:
1936
2216
  "Include snapshot-tag headers and line numbers in read output for hashline edit mode ([PATH#TAG] plus LINE:content)",
@@ -1941,7 +2221,8 @@ export const SETTINGS_SCHEMA = {
1941
2221
  type: "number",
1942
2222
  default: 300,
1943
2223
  ui: {
1944
- tab: "editing",
2224
+ tab: "files",
2225
+ group: "Reading",
1945
2226
  label: "Default Read Limit",
1946
2227
  description: "Default number of lines returned when agent calls read without a limit",
1947
2228
  options: [
@@ -1958,7 +2239,8 @@ export const SETTINGS_SCHEMA = {
1958
2239
  type: "boolean",
1959
2240
  default: true,
1960
2241
  ui: {
1961
- tab: "editing",
2242
+ tab: "files",
2243
+ group: "Read Summaries",
1962
2244
  label: "Read Summaries",
1963
2245
  description: "Return structural code summaries when read is called without an explicit selector",
1964
2246
  },
@@ -1968,7 +2250,8 @@ export const SETTINGS_SCHEMA = {
1968
2250
  type: "boolean",
1969
2251
  default: false,
1970
2252
  ui: {
1971
- tab: "editing",
2253
+ tab: "files",
2254
+ group: "Read Summaries",
1972
2255
  label: "Prose Summaries",
1973
2256
  description: "Return structural summaries for Markdown and plain text reads",
1974
2257
  },
@@ -1978,7 +2261,8 @@ export const SETTINGS_SCHEMA = {
1978
2261
  type: "number",
1979
2262
  default: 4,
1980
2263
  ui: {
1981
- tab: "editing",
2264
+ tab: "files",
2265
+ group: "Read Summaries",
1982
2266
  label: "Read Summary Body Lines",
1983
2267
  description: "Minimum multiline body or literal length before read summaries collapse it",
1984
2268
  },
@@ -1988,7 +2272,8 @@ export const SETTINGS_SCHEMA = {
1988
2272
  type: "number",
1989
2273
  default: 6,
1990
2274
  ui: {
1991
- tab: "editing",
2275
+ tab: "files",
2276
+ group: "Read Summaries",
1992
2277
  label: "Read Summary Comment Lines",
1993
2278
  description: "Minimum multiline block comment length before read summaries collapse it",
1994
2279
  },
@@ -1998,7 +2283,8 @@ export const SETTINGS_SCHEMA = {
1998
2283
  type: "number",
1999
2284
  default: 100,
2000
2285
  ui: {
2001
- tab: "editing",
2286
+ tab: "files",
2287
+ group: "Read Summaries",
2002
2288
  label: "Read Summary Minimum File Length",
2003
2289
  description: "Files with fewer total lines are read verbatim instead of structurally summarized",
2004
2290
  },
@@ -2008,7 +2294,8 @@ export const SETTINGS_SCHEMA = {
2008
2294
  type: "number",
2009
2295
  default: 50,
2010
2296
  ui: {
2011
- tab: "editing",
2297
+ tab: "files",
2298
+ group: "Read Summaries",
2012
2299
  label: "Read Summary Unfold Target",
2013
2300
  description:
2014
2301
  "BFS-unfold elidable spans until the summary is at least this many visible lines. 0 keeps only the outermost elisions.",
@@ -2019,7 +2306,8 @@ export const SETTINGS_SCHEMA = {
2019
2306
  type: "number",
2020
2307
  default: 100,
2021
2308
  ui: {
2022
- tab: "editing",
2309
+ tab: "files",
2310
+ group: "Read Summaries",
2023
2311
  label: "Read Summary Unfold Ceiling",
2024
2312
  description:
2025
2313
  "Hard ceiling on summary size while BFS-unfolding. An unfold that would exceed this is reverted and unfolding stops.",
@@ -2030,7 +2318,8 @@ export const SETTINGS_SCHEMA = {
2030
2318
  type: "boolean",
2031
2319
  default: false,
2032
2320
  ui: {
2033
- tab: "editing",
2321
+ tab: "files",
2322
+ group: "Reading",
2034
2323
  label: "Inline Read Previews",
2035
2324
  description: "Render read tool results inline in the transcript instead of summary rows",
2036
2325
  },
@@ -2040,14 +2329,20 @@ export const SETTINGS_SCHEMA = {
2040
2329
  "lsp.enabled": {
2041
2330
  type: "boolean",
2042
2331
  default: true,
2043
- ui: { tab: "editing", label: "LSP", description: "Enable the lsp tool for language server protocol" },
2332
+ ui: {
2333
+ tab: "files",
2334
+ group: "LSP",
2335
+ label: "LSP",
2336
+ description: "Enable the lsp tool for code intelligence (definitions, references, diagnostics, rename)",
2337
+ },
2044
2338
  },
2045
2339
 
2046
2340
  "lsp.lazy": {
2047
2341
  type: "boolean",
2048
2342
  default: true,
2049
2343
  ui: {
2050
- tab: "editing",
2344
+ tab: "files",
2345
+ group: "LSP",
2051
2346
  label: "Lazy LSP Startup",
2052
2347
  description:
2053
2348
  "Start language servers on first use (lsp tool or editing a matching file type) instead of at session startup",
@@ -2058,7 +2353,8 @@ export const SETTINGS_SCHEMA = {
2058
2353
  type: "boolean",
2059
2354
  default: false,
2060
2355
  ui: {
2061
- tab: "editing",
2356
+ tab: "files",
2357
+ group: "LSP",
2062
2358
  label: "Format on Write",
2063
2359
  description: "Automatically format code files using LSP after writing",
2064
2360
  },
@@ -2068,7 +2364,8 @@ export const SETTINGS_SCHEMA = {
2068
2364
  type: "boolean",
2069
2365
  default: true,
2070
2366
  ui: {
2071
- tab: "editing",
2367
+ tab: "files",
2368
+ group: "LSP",
2072
2369
  label: "Diagnostics on Write",
2073
2370
  description: "Return LSP diagnostics after writing code files",
2074
2371
  },
@@ -2078,7 +2375,8 @@ export const SETTINGS_SCHEMA = {
2078
2375
  type: "boolean",
2079
2376
  default: false,
2080
2377
  ui: {
2081
- tab: "editing",
2378
+ tab: "files",
2379
+ group: "LSP",
2082
2380
  label: "Diagnostics on Edit",
2083
2381
  description: "Return LSP diagnostics after editing code files",
2084
2382
  },
@@ -2088,17 +2386,45 @@ export const SETTINGS_SCHEMA = {
2088
2386
  type: "boolean",
2089
2387
  default: true,
2090
2388
  ui: {
2091
- tab: "editing",
2389
+ tab: "files",
2390
+ group: "LSP",
2092
2391
  label: "Deduplicate Diagnostics",
2093
2392
  description: "Suppress post-edit LSP diagnostics already shown for a file; only surface new or changed ones",
2094
2393
  },
2095
2394
  },
2096
2395
 
2396
+ "bash.enabled": {
2397
+ type: "boolean",
2398
+ default: true,
2399
+ ui: {
2400
+ tab: "shell",
2401
+ group: "Bash",
2402
+ label: "Bash",
2403
+ description: "Enable the bash tool for shell command execution",
2404
+ },
2405
+ },
2406
+
2407
+ "bash.autoBackground.enabled": {
2408
+ type: "boolean",
2409
+ default: false,
2410
+ ui: {
2411
+ tab: "shell",
2412
+ group: "Bash",
2413
+ label: "Bash Auto-Background",
2414
+ description: "Automatically background long-running bash commands and deliver the result later",
2415
+ },
2416
+ },
2417
+
2097
2418
  // Bash interceptor
2098
2419
  "bashInterceptor.enabled": {
2099
2420
  type: "boolean",
2100
2421
  default: false,
2101
- ui: { tab: "editing", label: "Bash Interceptor", description: "Block shell commands that have dedicated tools" },
2422
+ ui: {
2423
+ tab: "shell",
2424
+ group: "Bash",
2425
+ label: "Bash Interceptor",
2426
+ description: "Block shell commands that have dedicated tools",
2427
+ },
2102
2428
  },
2103
2429
  "bashInterceptor.patterns": { type: "array", default: DEFAULT_BASH_INTERCEPTOR_RULES },
2104
2430
 
@@ -2106,8 +2432,9 @@ export const SETTINGS_SCHEMA = {
2106
2432
  type: "boolean",
2107
2433
  default: true,
2108
2434
  ui: {
2109
- tab: "editing",
2110
- label: "Strip Trailing head/tail",
2435
+ tab: "shell",
2436
+ group: "Bash",
2437
+ label: "Strip head/tail Pipes",
2111
2438
  description:
2112
2439
  "Silently drop trailing `| head`/`| tail` pipes from single-line bash commands. Output is already truncated automatically.",
2113
2440
  },
@@ -2118,7 +2445,8 @@ export const SETTINGS_SCHEMA = {
2118
2445
  type: "boolean",
2119
2446
  default: true,
2120
2447
  ui: {
2121
- tab: "editing",
2448
+ tab: "shell",
2449
+ group: "Bash",
2122
2450
  label: "Shell Minimizer",
2123
2451
  description: "Compress verbose shell output (git, npm, cargo, etc.) before returning it to the agent",
2124
2452
  },
@@ -2138,7 +2466,8 @@ export const SETTINGS_SCHEMA = {
2138
2466
  values: ["default", "aggressive"] as const,
2139
2467
  default: "default",
2140
2468
  ui: {
2141
- tab: "editing",
2469
+ tab: "shell",
2470
+ group: "Bash",
2142
2471
  label: "Shell Minimizer Source Outline",
2143
2472
  description: "Source outline mode for cat/read of source files: default or aggressive",
2144
2473
  },
@@ -2153,9 +2482,10 @@ export const SETTINGS_SCHEMA = {
2153
2482
  type: "boolean",
2154
2483
  default: true,
2155
2484
  ui: {
2156
- tab: "editing",
2157
- label: "Eval: Python backend",
2158
- description: "Allow the eval tool to dispatch to the IPython kernel",
2485
+ tab: "shell",
2486
+ group: "Eval & Python",
2487
+ label: "Python Eval Backend",
2488
+ description: "Allow the eval tool to dispatch Python cells to the IPython kernel",
2159
2489
  },
2160
2490
  },
2161
2491
 
@@ -2163,9 +2493,10 @@ export const SETTINGS_SCHEMA = {
2163
2493
  type: "boolean",
2164
2494
  default: true,
2165
2495
  ui: {
2166
- tab: "editing",
2167
- label: "Eval: JavaScript backend",
2168
- description: "Allow the eval tool to dispatch to the in-process JavaScript runtime",
2496
+ tab: "shell",
2497
+ group: "Eval & Python",
2498
+ label: "JavaScript Eval Backend",
2499
+ description: "Allow the eval tool to dispatch JavaScript cells to the in-process runtime",
2169
2500
  },
2170
2501
  },
2171
2502
 
@@ -2175,16 +2506,18 @@ export const SETTINGS_SCHEMA = {
2175
2506
  values: ["session", "per-call"] as const,
2176
2507
  default: "session",
2177
2508
  ui: {
2178
- tab: "editing",
2509
+ tab: "shell",
2510
+ group: "Eval & Python",
2179
2511
  label: "Python Kernel Mode",
2180
- description: "Whether to keep IPython kernel alive across calls",
2512
+ description: "Keep the IPython kernel alive across eval calls or start fresh each time",
2181
2513
  },
2182
2514
  },
2183
2515
  "python.interpreter": {
2184
2516
  type: "string",
2185
2517
  default: "",
2186
2518
  ui: {
2187
- tab: "editing",
2519
+ tab: "shell",
2520
+ group: "Eval & Python",
2188
2521
  label: "Python Interpreter",
2189
2522
  description:
2190
2523
  "Optional path to an exact Python executable. When set, automatic Python runtime discovery is skipped.",
@@ -2200,7 +2533,8 @@ export const SETTINGS_SCHEMA = {
2200
2533
  type: "record",
2201
2534
  default: {},
2202
2535
  ui: {
2203
- tab: "tools",
2536
+ tab: "interaction",
2537
+ group: "Approvals",
2204
2538
  label: "Tool Approval Policies",
2205
2539
  description:
2206
2540
  "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 +2551,10 @@ export const SETTINGS_SCHEMA = {
2217
2551
  default: "yolo",
2218
2552
  ui: {
2219
2553
  tab: "interaction",
2554
+ group: "Approvals",
2220
2555
  label: "Tool Approval",
2221
2556
  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.",
2557
+ "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
2558
  options: [
2224
2559
  {
2225
2560
  value: "always-ask",
@@ -2246,13 +2581,23 @@ export const SETTINGS_SCHEMA = {
2246
2581
  "todo.enabled": {
2247
2582
  type: "boolean",
2248
2583
  default: true,
2249
- ui: { tab: "tools", label: "Todos", description: "Enable the todo tool for task tracking" },
2584
+ ui: {
2585
+ tab: "tools",
2586
+ group: "Available Tools",
2587
+ label: "Todos",
2588
+ description: "Enable the todo tool for task tracking",
2589
+ },
2250
2590
  },
2251
2591
 
2252
2592
  "todo.reminders": {
2253
2593
  type: "boolean",
2254
2594
  default: true,
2255
- ui: { tab: "tools", label: "Todo Reminders", description: "Remind agent to complete todos before stopping" },
2595
+ ui: {
2596
+ tab: "tools",
2597
+ group: "Todos",
2598
+ label: "Todo Reminders",
2599
+ description: "Remind the agent to complete todos before stopping",
2600
+ },
2256
2601
  },
2257
2602
 
2258
2603
  "todo.reminders.max": {
@@ -2260,8 +2605,9 @@ export const SETTINGS_SCHEMA = {
2260
2605
  default: 3,
2261
2606
  ui: {
2262
2607
  tab: "tools",
2608
+ group: "Todos",
2263
2609
  label: "Todo Reminder Limit",
2264
- description: "Maximum reminders to complete todos before giving up",
2610
+ description: "Maximum number of todo reminders before giving up",
2265
2611
  options: [
2266
2612
  { value: "1", label: "1 reminder" },
2267
2613
  { value: "2", label: "2 reminders" },
@@ -2276,28 +2622,33 @@ export const SETTINGS_SCHEMA = {
2276
2622
  default: false,
2277
2623
  ui: {
2278
2624
  tab: "tools",
2625
+ group: "Todos",
2279
2626
  label: "Create Todos Automatically",
2280
2627
  description: "Automatically create a comprehensive todo list after the first message",
2281
2628
  },
2282
2629
  },
2283
2630
 
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
2631
  // Search and AST tools
2291
2632
  "find.enabled": {
2292
2633
  type: "boolean",
2293
2634
  default: true,
2294
- ui: { tab: "tools", label: "Find", description: "Enable the find tool for file searching" },
2635
+ ui: {
2636
+ tab: "tools",
2637
+ group: "Available Tools",
2638
+ label: "Find",
2639
+ description: "Enable the find tool for glob-based file lookup",
2640
+ },
2295
2641
  },
2296
2642
 
2297
2643
  "search.enabled": {
2298
2644
  type: "boolean",
2299
2645
  default: true,
2300
- ui: { tab: "tools", label: "Search", description: "Enable the search tool for content searching" },
2646
+ ui: {
2647
+ tab: "tools",
2648
+ group: "Available Tools",
2649
+ label: "Search",
2650
+ description: "Enable the search tool for regex content search",
2651
+ },
2301
2652
  },
2302
2653
 
2303
2654
  "search.contextBefore": {
@@ -2305,6 +2656,7 @@ export const SETTINGS_SCHEMA = {
2305
2656
  default: 1,
2306
2657
  ui: {
2307
2658
  tab: "tools",
2659
+ group: "Search & Browser",
2308
2660
  label: "Search Context Before",
2309
2661
  description: "Lines of context before each search match",
2310
2662
  options: [
@@ -2322,6 +2674,7 @@ export const SETTINGS_SCHEMA = {
2322
2674
  default: 3,
2323
2675
  ui: {
2324
2676
  tab: "tools",
2677
+ group: "Search & Browser",
2325
2678
  label: "Search Context After",
2326
2679
  description: "Lines of context after each search match",
2327
2680
  options: [
@@ -2340,6 +2693,7 @@ export const SETTINGS_SCHEMA = {
2340
2693
  default: true,
2341
2694
  ui: {
2342
2695
  tab: "tools",
2696
+ group: "Available Tools",
2343
2697
  label: "AST Grep",
2344
2698
  description: "Enable the ast_grep tool for structural AST search",
2345
2699
  },
@@ -2350,28 +2704,12 @@ export const SETTINGS_SCHEMA = {
2350
2704
  default: true,
2351
2705
  ui: {
2352
2706
  tab: "tools",
2707
+ group: "Available Tools",
2353
2708
  label: "AST Edit",
2354
2709
  description: "Enable the ast_edit tool for structural AST rewrites",
2355
2710
  },
2356
2711
  },
2357
2712
 
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
2713
  // Optional tools
2376
2714
 
2377
2715
  "renderMermaid.enabled": {
@@ -2379,6 +2717,7 @@ export const SETTINGS_SCHEMA = {
2379
2717
  default: false,
2380
2718
  ui: {
2381
2719
  tab: "tools",
2720
+ group: "Available Tools",
2382
2721
  label: "Render Mermaid",
2383
2722
  description: "Enable the render_mermaid tool for Mermaid-to-ASCII rendering",
2384
2723
  },
@@ -2389,6 +2728,7 @@ export const SETTINGS_SCHEMA = {
2389
2728
  default: true,
2390
2729
  ui: {
2391
2730
  tab: "tools",
2731
+ group: "Available Tools",
2392
2732
  label: "Debug",
2393
2733
  description: "Enable the debug tool for DAP-based debugging",
2394
2734
  },
@@ -2399,6 +2739,7 @@ export const SETTINGS_SCHEMA = {
2399
2739
  default: false,
2400
2740
  ui: {
2401
2741
  tab: "tools",
2742
+ group: "Available Tools",
2402
2743
  label: "Text-to-Speech",
2403
2744
  description: "Enable the tts tool for xAI Grok Voice speech synthesis",
2404
2745
  },
@@ -2409,6 +2750,7 @@ export const SETTINGS_SCHEMA = {
2409
2750
  default: false,
2410
2751
  ui: {
2411
2752
  tab: "tools",
2753
+ group: "Available Tools",
2412
2754
  label: "Inspect Image",
2413
2755
  description: "Enable the inspect_image tool, delegating image understanding to a vision-capable model",
2414
2756
  },
@@ -2419,6 +2761,7 @@ export const SETTINGS_SCHEMA = {
2419
2761
  default: false,
2420
2762
  ui: {
2421
2763
  tab: "tools",
2764
+ group: "Available Tools",
2422
2765
  label: "Checkpoint/Rewind",
2423
2766
  description: "Enable the checkpoint and rewind tools for context checkpointing",
2424
2767
  },
@@ -2428,7 +2771,12 @@ export const SETTINGS_SCHEMA = {
2428
2771
  "fetch.enabled": {
2429
2772
  type: "boolean",
2430
2773
  default: true,
2431
- ui: { tab: "tools", label: "Read URLs", description: "Allow the read tool to fetch and process URLs" },
2774
+ ui: {
2775
+ tab: "tools",
2776
+ group: "Available Tools",
2777
+ label: "Read URLs",
2778
+ description: "Allow the read tool to fetch and process URLs",
2779
+ },
2432
2780
  },
2433
2781
 
2434
2782
  "vault.enabled": {
@@ -2436,6 +2784,7 @@ export const SETTINGS_SCHEMA = {
2436
2784
  default: false,
2437
2785
  ui: {
2438
2786
  tab: "tools",
2787
+ group: "Available Tools",
2439
2788
  label: "Obsidian Vault",
2440
2789
  description:
2441
2790
  "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 +2796,7 @@ export const SETTINGS_SCHEMA = {
2447
2796
  default: false,
2448
2797
  ui: {
2449
2798
  tab: "tools",
2799
+ group: "Available Tools",
2450
2800
  label: "GitHub CLI",
2451
2801
  description:
2452
2802
  "Enable the github tool (op-based dispatch for repository, issue, pull request, diff, search, checkout, push, and Actions watch workflows)",
@@ -2458,7 +2808,8 @@ export const SETTINGS_SCHEMA = {
2458
2808
  default: true,
2459
2809
  ui: {
2460
2810
  tab: "tools",
2461
- label: "GitHub view cache",
2811
+ group: "GitHub",
2812
+ label: "GitHub View Cache",
2462
2813
  description: "Cache rendered issue/PR view output in ~/.omp/cache/github-cache.db so repeated reads are free",
2463
2814
  },
2464
2815
  },
@@ -2468,8 +2819,10 @@ export const SETTINGS_SCHEMA = {
2468
2819
  default: 300,
2469
2820
  ui: {
2470
2821
  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.",
2822
+ group: "GitHub",
2823
+ label: "GitHub Cache Soft TTL",
2824
+ description:
2825
+ "Within this window, cached issue/PR view rows are returned directly (seconds; default 5 minutes)",
2473
2826
  },
2474
2827
  },
2475
2828
 
@@ -2478,16 +2831,22 @@ export const SETTINGS_SCHEMA = {
2478
2831
  default: 604800,
2479
2832
  ui: {
2480
2833
  tab: "tools",
2481
- label: "GitHub cache hard TTL (seconds)",
2834
+ group: "GitHub",
2835
+ label: "GitHub Cache Hard TTL",
2482
2836
  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.",
2837
+ "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
2838
  },
2485
2839
  },
2486
2840
 
2487
2841
  "web_search.enabled": {
2488
2842
  type: "boolean",
2489
2843
  default: true,
2490
- ui: { tab: "tools", label: "Web Search", description: "Enable the web_search tool for web searching" },
2844
+ ui: {
2845
+ tab: "tools",
2846
+ group: "Available Tools",
2847
+ label: "Web Search",
2848
+ description: "Enable the web_search tool for live web results",
2849
+ },
2491
2850
  },
2492
2851
 
2493
2852
  "browser.enabled": {
@@ -2495,8 +2854,9 @@ export const SETTINGS_SCHEMA = {
2495
2854
  default: true,
2496
2855
  ui: {
2497
2856
  tab: "tools",
2857
+ group: "Available Tools",
2498
2858
  label: "Browser",
2499
- description: "Enable the browser tool (Ulixee Hero)",
2859
+ description: "Enable the browser tool for scripted Chromium automation (puppeteer)",
2500
2860
  },
2501
2861
  },
2502
2862
 
@@ -2505,6 +2865,7 @@ export const SETTINGS_SCHEMA = {
2505
2865
  default: true,
2506
2866
  ui: {
2507
2867
  tab: "tools",
2868
+ group: "Search & Browser",
2508
2869
  label: "Headless Browser",
2509
2870
  description: "Launch browser in headless mode (disable to show browser UI)",
2510
2871
  },
@@ -2514,7 +2875,8 @@ export const SETTINGS_SCHEMA = {
2514
2875
  default: undefined,
2515
2876
  ui: {
2516
2877
  tab: "tools",
2517
- label: "Screenshot directory",
2878
+ group: "Search & Browser",
2879
+ label: "Screenshot Directory",
2518
2880
  description:
2519
2881
  "Directory to save screenshots. If unset, screenshots go to a temp file. Supports ~. Examples: ~/Downloads, ~/Desktop, /sdcard/Download (Android)",
2520
2882
  },
@@ -2526,6 +2888,7 @@ export const SETTINGS_SCHEMA = {
2526
2888
  default: true,
2527
2889
  ui: {
2528
2890
  tab: "tools",
2891
+ group: "Execution",
2529
2892
  label: "Intent Tracing",
2530
2893
  description: "Ask the agent to describe the intent of each tool call before executing it",
2531
2894
  },
@@ -2536,6 +2899,7 @@ export const SETTINGS_SCHEMA = {
2536
2899
  default: 0,
2537
2900
  ui: {
2538
2901
  tab: "tools",
2902
+ group: "Execution",
2539
2903
  label: "Max Tool Timeout",
2540
2904
  description: "Maximum timeout in seconds the agent can set for any tool (0 = no limit)",
2541
2905
  options: [
@@ -2555,6 +2919,7 @@ export const SETTINGS_SCHEMA = {
2555
2919
  default: true,
2556
2920
  ui: {
2557
2921
  tab: "tools",
2922
+ group: "Execution",
2558
2923
  label: "Async Execution",
2559
2924
  description: "Enable async bash commands and background task execution",
2560
2925
  },
@@ -2571,6 +2936,7 @@ export const SETTINGS_SCHEMA = {
2571
2936
  default: "30s",
2572
2937
  ui: {
2573
2938
  tab: "tools",
2939
+ group: "Execution",
2574
2940
  label: "Poll Wait Duration",
2575
2941
  description: "How long the poll tool waits for background job updates before returning the current state",
2576
2942
  options: [
@@ -2583,13 +2949,21 @@ export const SETTINGS_SCHEMA = {
2583
2949
  },
2584
2950
  },
2585
2951
 
2586
- "bash.autoBackground.enabled": {
2587
- type: "boolean",
2588
- default: false,
2952
+ "irc.timeoutMs": {
2953
+ type: "number",
2954
+ default: 120_000,
2589
2955
  ui: {
2590
2956
  tab: "tools",
2591
- label: "Bash Auto-Background",
2592
- description: "Automatically background long-running bash commands and deliver the result later",
2957
+ group: "Execution",
2958
+ label: "IRC Timeout",
2959
+ description: "Default timeout for irc wait (and send await:true) in milliseconds; 0 disables the timeout",
2960
+ options: [
2961
+ { value: "0", label: "Disabled" },
2962
+ { value: "30000", label: "30 seconds" },
2963
+ { value: "60000", label: "1 minute" },
2964
+ { value: "120000", label: "2 minutes" },
2965
+ { value: "300000", label: "5 minutes" },
2966
+ ],
2593
2967
  },
2594
2968
  },
2595
2969
 
@@ -2605,6 +2979,7 @@ export const SETTINGS_SCHEMA = {
2605
2979
  default: "auto",
2606
2980
  ui: {
2607
2981
  tab: "tools",
2982
+ group: "Discovery & MCP",
2608
2983
  label: "Tool Discovery",
2609
2984
  description:
2610
2985
  "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 +2991,7 @@ export const SETTINGS_SCHEMA = {
2616
2991
  default: [] as string[],
2617
2992
  ui: {
2618
2993
  tab: "tools",
2994
+ group: "Discovery & MCP",
2619
2995
  label: "Essential Tools Override",
2620
2996
  description:
2621
2997
  "Override the always-loaded built-in tools (default: read, bash, edit). Leave empty to use defaults.",
@@ -2626,7 +3002,12 @@ export const SETTINGS_SCHEMA = {
2626
3002
  "mcp.enableProjectConfig": {
2627
3003
  type: "boolean",
2628
3004
  default: true,
2629
- ui: { tab: "tools", label: "MCP Project Config", description: "Load .mcp.json/mcp.json from project root" },
3005
+ ui: {
3006
+ tab: "tools",
3007
+ group: "Discovery & MCP",
3008
+ label: "MCP Project Config",
3009
+ description: "Load .mcp.json/mcp.json from project root",
3010
+ },
2630
3011
  },
2631
3012
 
2632
3013
  "mcp.discoveryMode": {
@@ -2634,6 +3015,7 @@ export const SETTINGS_SCHEMA = {
2634
3015
  default: false,
2635
3016
  ui: {
2636
3017
  tab: "tools",
3018
+ group: "Discovery & MCP",
2637
3019
  label: "MCP Tool Discovery",
2638
3020
  description: "Hide MCP tools by default and expose them through a tool discovery tool",
2639
3021
  },
@@ -2644,6 +3026,7 @@ export const SETTINGS_SCHEMA = {
2644
3026
  default: [] as string[],
2645
3027
  ui: {
2646
3028
  tab: "tools",
3029
+ group: "Discovery & MCP",
2647
3030
  label: "MCP Discovery Default Servers",
2648
3031
  description: "Keep MCP tools from these servers visible while discovery mode hides other MCP tools",
2649
3032
  },
@@ -2654,6 +3037,7 @@ export const SETTINGS_SCHEMA = {
2654
3037
  default: false,
2655
3038
  ui: {
2656
3039
  tab: "tools",
3040
+ group: "Discovery & MCP",
2657
3041
  label: "MCP Update Injection",
2658
3042
  description: "Inject MCP resource updates into the agent conversation",
2659
3043
  },
@@ -2664,8 +3048,10 @@ export const SETTINGS_SCHEMA = {
2664
3048
  default: 500,
2665
3049
  ui: {
2666
3050
  tab: "tools",
3051
+ group: "Discovery & MCP",
2667
3052
  label: "MCP Notification Debounce",
2668
- description: "Debounce window for MCP resource update notifications before injecting into conversation",
3053
+ description:
3054
+ "Debounce window in milliseconds for MCP resource updates before injecting them into the conversation",
2669
3055
  },
2670
3056
  },
2671
3057
 
@@ -2679,6 +3065,7 @@ export const SETTINGS_SCHEMA = {
2679
3065
  default: true,
2680
3066
  ui: {
2681
3067
  tab: "tasks",
3068
+ group: "Modes",
2682
3069
  label: "Plan Mode",
2683
3070
  description: "Enable plan mode for read-only exploration and planning before execution",
2684
3071
  },
@@ -2689,6 +3076,7 @@ export const SETTINGS_SCHEMA = {
2689
3076
  default: true,
2690
3077
  ui: {
2691
3078
  tab: "tasks",
3079
+ group: "Modes",
2692
3080
  label: "Goal Mode",
2693
3081
  description: "Enable per-session goal mode and the hidden goal tool",
2694
3082
  },
@@ -2699,7 +3087,8 @@ export const SETTINGS_SCHEMA = {
2699
3087
  default: true,
2700
3088
  ui: {
2701
3089
  tab: "tasks",
2702
- label: "Goal Status In Footer",
3090
+ group: "Modes",
3091
+ label: "Goal Status in Footer",
2703
3092
  description: "Show token budget alongside the goal indicator in the status line",
2704
3093
  },
2705
3094
  },
@@ -2709,6 +3098,7 @@ export const SETTINGS_SCHEMA = {
2709
3098
  default: ["interactive"],
2710
3099
  ui: {
2711
3100
  tab: "tasks",
3101
+ group: "Modes",
2712
3102
  label: "Goal Continuation Modes",
2713
3103
  description: "Run modes where active goals may auto-continue between turns",
2714
3104
  },
@@ -2732,6 +3122,7 @@ export const SETTINGS_SCHEMA = {
2732
3122
  default: "none",
2733
3123
  ui: {
2734
3124
  tab: "tasks",
3125
+ group: "Isolation",
2735
3126
  label: "Isolation Mode",
2736
3127
  description:
2737
3128
  '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 +3159,7 @@ export const SETTINGS_SCHEMA = {
2768
3159
  default: "patch",
2769
3160
  ui: {
2770
3161
  tab: "tasks",
3162
+ group: "Isolation",
2771
3163
  label: "Isolation Merge Strategy",
2772
3164
  description: "How isolated task changes are integrated (patch apply or branch merge)",
2773
3165
  options: [
@@ -2783,6 +3175,7 @@ export const SETTINGS_SCHEMA = {
2783
3175
  default: "generic",
2784
3176
  ui: {
2785
3177
  tab: "tasks",
3178
+ group: "Isolation",
2786
3179
  label: "Isolation Commit Style",
2787
3180
  description: "Commit message style for nested repo changes (generic or AI-generated)",
2788
3181
  options: [
@@ -2797,6 +3190,7 @@ export const SETTINGS_SCHEMA = {
2797
3190
  default: false,
2798
3191
  ui: {
2799
3192
  tab: "tasks",
3193
+ group: "Subagents",
2800
3194
  label: "Prefer Task Delegation",
2801
3195
  description: "Encourage the agent to delegate work to subagents unless changes are trivial",
2802
3196
  },
@@ -2807,6 +3201,7 @@ export const SETTINGS_SCHEMA = {
2807
3201
  default: true,
2808
3202
  ui: {
2809
3203
  tab: "tasks",
3204
+ group: "Subagents",
2810
3205
  label: "Batch Task Calls",
2811
3206
  description:
2812
3207
  "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 +3213,9 @@ export const SETTINGS_SCHEMA = {
2818
3213
  default: 32,
2819
3214
  ui: {
2820
3215
  tab: "tasks",
3216
+ group: "Subagents",
2821
3217
  label: "Max Concurrent Tasks",
2822
- description: "Concurrent limit for subagents",
3218
+ description: "Maximum number of subagents running concurrently",
2823
3219
  options: [
2824
3220
  { value: "0", label: "Unlimited" },
2825
3221
  { value: "1", label: "1 task" },
@@ -2838,6 +3234,7 @@ export const SETTINGS_SCHEMA = {
2838
3234
  default: false,
2839
3235
  ui: {
2840
3236
  tab: "tasks",
3237
+ group: "Subagents",
2841
3238
  label: "LSP in Subagents",
2842
3239
  description:
2843
3240
  "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 +3246,7 @@ export const SETTINGS_SCHEMA = {
2849
3246
  default: 2,
2850
3247
  ui: {
2851
3248
  tab: "tasks",
3249
+ group: "Subagents",
2852
3250
  label: "Max Task Recursion",
2853
3251
  description: "How many levels deep subagents can spawn their own subagents",
2854
3252
  options: [
@@ -2866,6 +3264,7 @@ export const SETTINGS_SCHEMA = {
2866
3264
  default: 0,
2867
3265
  ui: {
2868
3266
  tab: "tasks",
3267
+ group: "Subagents",
2869
3268
  label: "Max Subagent Runtime",
2870
3269
  description:
2871
3270
  "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 +3283,7 @@ export const SETTINGS_SCHEMA = {
2884
3283
  default: 420_000,
2885
3284
  ui: {
2886
3285
  tab: "tasks",
3286
+ group: "Subagents",
2887
3287
  label: "Agent Idle TTL",
2888
3288
  description:
2889
3289
  "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 +3295,7 @@ export const SETTINGS_SCHEMA = {
2895
3295
  default: 90,
2896
3296
  ui: {
2897
3297
  tab: "tasks",
3298
+ group: "Subagents",
2898
3299
  label: "Soft Subagent Request Budget",
2899
3300
  description:
2900
3301
  "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 +3322,10 @@ export const SETTINGS_SCHEMA = {
2921
3322
  type: "number",
2922
3323
  default: 60,
2923
3324
  ui: {
2924
- tab: "tasks",
2925
- label: "Todo auto-clear delay",
2926
- description: "How long to wait before removing completed/abandoned tasks from the list",
3325
+ tab: "tools",
3326
+ group: "Todos",
3327
+ label: "Todo Auto-Clear Delay",
3328
+ description: "Delay before completed or abandoned todos are removed from the todo widget",
2927
3329
  options: [
2928
3330
  { value: "0", label: "Instant" },
2929
3331
  { value: "60", label: "1 minute", description: "Default" },
@@ -2941,6 +3343,7 @@ export const SETTINGS_SCHEMA = {
2941
3343
  default: false,
2942
3344
  ui: {
2943
3345
  tab: "appearance",
3346
+ group: "Display",
2944
3347
  label: "Show Resolved Model Badge",
2945
3348
  description: "Display the actual model ID used by each subagent in the task widget status line",
2946
3349
  },
@@ -2952,7 +3355,12 @@ export const SETTINGS_SCHEMA = {
2952
3355
  "skills.enableSkillCommands": {
2953
3356
  type: "boolean",
2954
3357
  default: true,
2955
- ui: { tab: "tasks", label: "Skill Commands", description: "Register skills as /skill:name commands" },
3358
+ ui: {
3359
+ tab: "tasks",
3360
+ group: "Commands & Skills",
3361
+ label: "Skill Commands",
3362
+ description: "Register skills as /skill:name commands",
3363
+ },
2956
3364
  },
2957
3365
 
2958
3366
  "skills.enableCodexUser": { type: "boolean", default: true },
@@ -2975,13 +3383,23 @@ export const SETTINGS_SCHEMA = {
2975
3383
  "commands.enableClaudeUser": {
2976
3384
  type: "boolean",
2977
3385
  default: true,
2978
- ui: { tab: "tasks", label: "Claude User Commands", description: "Load commands from ~/.claude/commands/" },
3386
+ ui: {
3387
+ tab: "tasks",
3388
+ group: "Commands & Skills",
3389
+ label: "Claude User Commands",
3390
+ description: "Load commands from ~/.claude/commands/",
3391
+ },
2979
3392
  },
2980
3393
 
2981
3394
  "commands.enableClaudeProject": {
2982
3395
  type: "boolean",
2983
3396
  default: true,
2984
- ui: { tab: "tasks", label: "Claude Project Commands", description: "Load commands from .claude/commands/" },
3397
+ ui: {
3398
+ tab: "tasks",
3399
+ group: "Commands & Skills",
3400
+ label: "Claude Project Commands",
3401
+ description: "Load commands from .claude/commands/",
3402
+ },
2985
3403
  },
2986
3404
 
2987
3405
  "commands.enableOpencodeUser": {
@@ -2989,6 +3407,7 @@ export const SETTINGS_SCHEMA = {
2989
3407
  default: true,
2990
3408
  ui: {
2991
3409
  tab: "tasks",
3410
+ group: "Commands & Skills",
2992
3411
  label: "OpenCode User Commands",
2993
3412
  description: "Load commands from ~/.config/opencode/commands/",
2994
3413
  },
@@ -2997,7 +3416,12 @@ export const SETTINGS_SCHEMA = {
2997
3416
  "commands.enableOpencodeProject": {
2998
3417
  type: "boolean",
2999
3418
  default: true,
3000
- ui: { tab: "tasks", label: "OpenCode Project Commands", description: "Load commands from .opencode/commands/" },
3419
+ ui: {
3420
+ tab: "tasks",
3421
+ group: "Commands & Skills",
3422
+ label: "OpenCode Project Commands",
3423
+ description: "Load commands from .opencode/commands/",
3424
+ },
3001
3425
  },
3002
3426
 
3003
3427
  // ────────────────────────────────────────────────────────────────────────
@@ -3008,7 +3432,12 @@ export const SETTINGS_SCHEMA = {
3008
3432
  "secrets.enabled": {
3009
3433
  type: "boolean",
3010
3434
  default: false,
3011
- ui: { tab: "providers", label: "Hide Secrets", description: "Obfuscate secrets before sending to AI providers" },
3435
+ ui: {
3436
+ tab: "providers",
3437
+ group: "Privacy",
3438
+ label: "Hide Secrets",
3439
+ description: "Obfuscate secrets before sending to AI providers",
3440
+ },
3012
3441
  },
3013
3442
 
3014
3443
  // Provider selection
@@ -3018,8 +3447,9 @@ export const SETTINGS_SCHEMA = {
3018
3447
  default: "auto",
3019
3448
  ui: {
3020
3449
  tab: "providers",
3450
+ group: "Services",
3021
3451
  label: "Web Search Provider",
3022
- description: "Provider for web search tool",
3452
+ description: "Preferred provider for the web_search tool",
3023
3453
  options: SEARCH_PROVIDER_OPTIONS,
3024
3454
  },
3025
3455
  },
@@ -3029,8 +3459,9 @@ export const SETTINGS_SCHEMA = {
3029
3459
  default: "auto",
3030
3460
  ui: {
3031
3461
  tab: "providers",
3462
+ group: "Services",
3032
3463
  label: "Image Provider",
3033
- description: "Provider for image generation tool",
3464
+ description: "Preferred provider for image generation",
3034
3465
  options: [
3035
3466
  {
3036
3467
  value: "auto",
@@ -3059,6 +3490,7 @@ export const SETTINGS_SCHEMA = {
3059
3490
  default: ONLINE_TINY_TITLE_MODEL_KEY,
3060
3491
  ui: {
3061
3492
  tab: "providers",
3493
+ group: "Tiny Model",
3062
3494
  label: "Tiny Model",
3063
3495
  description: "Session-title model: online pi/smol by default, or a local on-device model",
3064
3496
  options: TINY_TITLE_MODEL_OPTIONS,
@@ -3070,6 +3502,7 @@ export const SETTINGS_SCHEMA = {
3070
3502
  default: TINY_MODEL_DEVICE_DEFAULT,
3071
3503
  ui: {
3072
3504
  tab: "providers",
3505
+ group: "Tiny Model",
3073
3506
  label: "Tiny Model Device",
3074
3507
  description:
3075
3508
  "ONNX execution provider for local tiny models (titles + memory). Default uses CPU-only inference. The PI_TINY_DEVICE env var overrides this.",
@@ -3082,6 +3515,7 @@ export const SETTINGS_SCHEMA = {
3082
3515
  default: TINY_MODEL_DTYPE_DEFAULT,
3083
3516
  ui: {
3084
3517
  tab: "providers",
3518
+ group: "Tiny Model",
3085
3519
  label: "Tiny Model Precision",
3086
3520
  description:
3087
3521
  "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 +3528,7 @@ export const SETTINGS_SCHEMA = {
3094
3528
  default: ONLINE_MEMORY_MODEL_KEY,
3095
3529
  ui: {
3096
3530
  tab: "memory",
3531
+ group: "General",
3097
3532
  label: "Memory Model",
3098
3533
  description:
3099
3534
  "Mnemopi LLM for fact extraction + consolidation: online (smol/remote) by default, or a local on-device model",
@@ -3108,6 +3543,7 @@ export const SETTINGS_SCHEMA = {
3108
3543
  default: ONLINE_AUTO_THINKING_MODEL_KEY,
3109
3544
  ui: {
3110
3545
  tab: "model",
3546
+ group: "Thinking",
3111
3547
  label: "Auto Thinking Model",
3112
3548
  description:
3113
3549
  "Difficulty classifier for the `auto` thinking level: online smol by default, or a local on-device model",
@@ -3122,6 +3558,7 @@ export const SETTINGS_SCHEMA = {
3122
3558
  default: "anthropic",
3123
3559
  ui: {
3124
3560
  tab: "providers",
3561
+ group: "Protocol",
3125
3562
  label: "Kimi API Format",
3126
3563
  description: "API format for Kimi Code provider",
3127
3564
  options: [
@@ -3137,6 +3574,7 @@ export const SETTINGS_SCHEMA = {
3137
3574
  default: "auto",
3138
3575
  ui: {
3139
3576
  tab: "providers",
3577
+ group: "Protocol",
3140
3578
  label: "OpenAI WebSockets",
3141
3579
  description: "Websocket policy for OpenAI Codex models (auto uses model defaults, on forces, off disables)",
3142
3580
  options: [
@@ -3153,6 +3591,7 @@ export const SETTINGS_SCHEMA = {
3153
3591
  default: "default",
3154
3592
  ui: {
3155
3593
  tab: "providers",
3594
+ group: "Protocol",
3156
3595
  label: "OpenRouter Routing",
3157
3596
  description:
3158
3597
  "Default routing-variant suffix appended to OpenRouter model IDs (overridden when the selector already names a variant)",
@@ -3175,6 +3614,7 @@ export const SETTINGS_SCHEMA = {
3175
3614
  default: "auto",
3176
3615
  ui: {
3177
3616
  tab: "providers",
3617
+ group: "Services",
3178
3618
  label: "Fetch Provider",
3179
3619
  description: "Reader backend priority for the fetch/read URL tool",
3180
3620
  options: [
@@ -3191,12 +3631,46 @@ export const SETTINGS_SCHEMA = {
3191
3631
  ],
3192
3632
  },
3193
3633
  },
3634
+ // Codex saved rate-limit resets (auto-redeem)
3635
+ "codexResets.autoRedeem": {
3636
+ type: "boolean",
3637
+ default: false,
3638
+ ui: {
3639
+ tab: "providers",
3640
+ group: "Services",
3641
+ label: "Codex Auto-Redeem Saved Resets",
3642
+ description:
3643
+ "When a turn is blocked by the Codex weekly limit on the active account and no other account is available, automatically spend one saved rate-limit reset (ChatGPT 'save rate limit resets'). Conservative: never fires for 5-hour-only or Spark limits, near a natural reset, or twice for the same block. Requires retries enabled.",
3644
+ },
3645
+ },
3646
+ "codexResets.minBlockedMinutes": {
3647
+ type: "number",
3648
+ default: 60,
3649
+ ui: {
3650
+ tab: "providers",
3651
+ group: "Services",
3652
+ label: "Codex Auto-Redeem Min Block",
3653
+ description:
3654
+ "Only auto-redeem when the natural weekly reset is at least this many minutes away (don't spend a ~30-day credit to save a short wait).",
3655
+ },
3656
+ },
3657
+ "codexResets.keepCredits": {
3658
+ type: "number",
3659
+ default: 0,
3660
+ ui: {
3661
+ tab: "providers",
3662
+ group: "Services",
3663
+ label: "Codex Auto-Redeem Reserve",
3664
+ description: "Never auto-spend below this many saved resets (0 = the last credit may be spent automatically).",
3665
+ },
3666
+ },
3194
3667
  "provider.appendOnlyContext": {
3195
3668
  type: "enum",
3196
3669
  values: ["auto", "on", "off"] as const,
3197
3670
  default: "auto",
3198
3671
  ui: {
3199
3672
  tab: "providers",
3673
+ group: "Protocol",
3200
3674
  label: "Append-Only Context",
3201
3675
  description:
3202
3676
  "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 +3686,40 @@ export const SETTINGS_SCHEMA = {
3212
3686
  "exa.enabled": {
3213
3687
  type: "boolean",
3214
3688
  default: true,
3215
- ui: { tab: "providers", label: "Exa", description: "Master toggle for all Exa search tools" },
3689
+ ui: { tab: "providers", group: "Services", label: "Exa", description: "Master toggle for all Exa search tools" },
3216
3690
  },
3217
3691
 
3218
3692
  "exa.enableSearch": {
3219
3693
  type: "boolean",
3220
3694
  default: true,
3221
- ui: { tab: "providers", label: "Exa Search", description: "Basic search, deep search, code search, crawl" },
3695
+ ui: {
3696
+ tab: "providers",
3697
+ group: "Services",
3698
+ label: "Exa Search",
3699
+ description: "Enable Exa basic search, deep search, code search, and crawl tools",
3700
+ },
3222
3701
  },
3223
3702
 
3224
3703
  "exa.enableResearcher": {
3225
3704
  type: "boolean",
3226
3705
  default: false,
3227
- ui: { tab: "providers", label: "Exa Researcher", description: "AI-powered deep research tasks" },
3706
+ ui: {
3707
+ tab: "providers",
3708
+ group: "Services",
3709
+ label: "Exa Researcher",
3710
+ description: "Enable the Exa researcher tool for AI-powered deep research",
3711
+ },
3228
3712
  },
3229
3713
 
3230
3714
  "exa.enableWebsets": {
3231
3715
  type: "boolean",
3232
3716
  default: false,
3233
- ui: { tab: "providers", label: "Exa Websets", description: "Webset management and enrichment tools" },
3717
+ ui: {
3718
+ tab: "providers",
3719
+ group: "Services",
3720
+ label: "Exa Websets",
3721
+ description: "Enable Exa webset management and enrichment tools",
3722
+ },
3234
3723
  },
3235
3724
 
3236
3725
  // SearXNG
@@ -3239,8 +3728,9 @@ export const SETTINGS_SCHEMA = {
3239
3728
  default: undefined,
3240
3729
  ui: {
3241
3730
  tab: "providers",
3731
+ group: "Services",
3242
3732
  label: "SearXNG Endpoint",
3243
- description: "Self-hosted search base URL",
3733
+ description: "Base URL of a self-hosted SearXNG instance used for web search",
3244
3734
  },
3245
3735
  },
3246
3736
 
@@ -3286,6 +3776,7 @@ export const SETTINGS_SCHEMA = {
3286
3776
  default: false,
3287
3777
  ui: {
3288
3778
  tab: "tools",
3779
+ group: "Developer",
3289
3780
  label: "Auto QA",
3290
3781
  description: "Enable automated tool issue reporting (report_tool_issue) for all agents",
3291
3782
  },
@@ -3299,8 +3790,9 @@ export const SETTINGS_SCHEMA = {
3299
3790
  default: "https://qa.omp.sh/v1/grievances" as const,
3300
3791
  ui: {
3301
3792
  tab: "tools",
3793
+ group: "Developer",
3302
3794
  label: "Auto QA Push Endpoint",
3303
- description: "Full URL that receives the JSON payload (default ships to https://qa.omp.sh/v1/grievances)",
3795
+ description: "Full URL receiving Auto QA JSON reports (default https://qa.omp.sh/v1/grievances)",
3304
3796
  },
3305
3797
  },
3306
3798
 
@@ -3413,6 +3905,9 @@ export type StatusLineSeparatorStyle = SettingValue<"statusLine.separator">;
3413
3905
  /** Tree selector filter mode - derived from schema */
3414
3906
  export type TreeFilterMode = SettingValue<"treeFilterMode">;
3415
3907
 
3908
+ /** Personality preset - derived from schema */
3909
+ export type Personality = SettingValue<"personality">;
3910
+
3416
3911
  // ═══════════════════════════════════════════════════════════════════════════
3417
3912
  // Typed Group Definitions
3418
3913
  // ═══════════════════════════════════════════════════════════════════════════
@@ -3557,6 +4052,11 @@ export interface ShellMinimizerSettings {
3557
4052
  sourceOutlineLevel: "default" | "aggressive";
3558
4053
  legacyFilters: boolean | undefined;
3559
4054
  }
4055
+ export interface CodexResetsSettings {
4056
+ autoRedeem: boolean;
4057
+ minBlockedMinutes: number;
4058
+ keepCredits: number;
4059
+ }
3560
4060
 
3561
4061
  /** Map group prefix -> typed settings interface */
3562
4062
  export interface GroupTypeMap {
@@ -3576,6 +4076,7 @@ export interface GroupTypeMap {
3576
4076
  modelTags: ModelTagsSettings;
3577
4077
  cycleOrder: string[];
3578
4078
  shellMinimizer: ShellMinimizerSettings;
4079
+ codexResets: CodexResetsSettings;
3579
4080
  }
3580
4081
 
3581
4082
  export type GroupPrefix = keyof GroupTypeMap;