feat(settings): sync v15.13 feature surfaces and close YAML/UI gaps#2622
feat(settings): sync v15.13 feature surfaces and close YAML/UI gaps#2622metaphorics wants to merge 1 commit into
Conversation
The v15.13.x line merged a large body of features (speech/STT/TTS, mnemopi memory, auto-learn, exa toggles, guided goals, configurable /fast scope, task role specialization, work-aware IRC roster) but several landed without syncing their settings-panel / slash-help / doc surfaces. Auditing the settings schema also surfaced user-facing settings reachable only from the YAML config, never the /settings panel. Settings panel: - Consolidate all speech settings under Interaction -> Speech and gate dependent rows (vocalization Mode/Voice on speech.enabled; Local TTS Voice off under the xAI provider; Local TTS Model on the local-or-vocalization predicate). - Gate mnemopi remote-LLM fields to remote mode and embedding-endpoint fields to embeddings-enabled; gate exa sub-tools on the exa master. - Drop the redundant mcp.discoveryMode panel row (subsumed by tools.discoveryMode); the config key is still honored for back-compat. - Surface previously config-only settings: retry.enabled, skills.enabled, stt.language, shellPath, searxng.categories/language, compaction.autoContinue, compaction.remoteEndpoint (gated on remote compaction), and the Hindsight recall/retain knobs (recall budget, bank/retain missions, retain context; gated on the Hindsight backend). - Add a settings-layout test asserting every ui.condition resolves to a CONDITIONS predicate (guards the silent-typo gating failure mode). TUI: - Add speech (speech.enabled) and auto-learn (autolearn.enabled) status-line indicators after the model name, across the unicode, nerd-font, and ascii symbol presets. Help & docs: - /fast help notes fastModeScope controls the target provider family; /guided-goal help describes the guided interview. - Document the Ctrl+J newline shortcut (in-app hotkeys + keybindings.md). - Sync tool docs: add the role param to task.md, the activity field to irc.md (and the model prompt), add the missing learn/manage-skill tool docs, and add settings catalog entries for fastModeScope, task.eager, todo.eager. memories.enabled was deliberately NOT surfaced: it is a legacy back-compat migration flag explicitly hidden in favor of memory.backend (the live runtime selector, already in the panel). Verified with `bun run check:ts` (all workspaces) plus the settings-layout and tool-discovery test suites.
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Surfaces additional config-only settings in the /settings UI, adds status-line glyph indicators for speech/auto-learn, and updates/help-syncs various docs and command descriptions.
Changes:
- Add UI metadata (tab/group/label/description/conditions) for multiple settings keys and introduce/extend condition predicates.
- Add theme-aware status-line icons for
speech.enabledandautolearn.enabled. - Update tool/docs/help text (IRC list output fields, hotkeys/keybindings, slash-command descriptions) and add new tool docs for
learnandmanage_skill.
Reviewed changes
Copilot reviewed 15 out of 15 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/coding-agent/test/modes/components/settings-layout.test.ts | Adds a regression test ensuring ui.condition strings map to a CONDITIONS predicate. |
| packages/coding-agent/src/slash-commands/builtin-registry.ts | Updates help text for /guided-goal and /fast. |
| packages/coding-agent/src/prompts/tools/irc.md | Updates model-facing IRC tool prompt to include peer activity in list output. |
| packages/coding-agent/src/modes/utils/hotkeys-markdown.ts | Documents Ctrl+J as an additional newline shortcut. |
| packages/coding-agent/src/modes/theme/theme.ts | Adds new theme symbols and icon mappings for “speak” and “learn”. |
| packages/coding-agent/src/modes/components/status-line/segments.ts | Displays speech/auto-learn indicators in the status line when enabled. |
| packages/coding-agent/src/modes/components/settings-defs.ts | Exports CONDITIONS and adds multiple new condition predicates. |
| packages/coding-agent/src/config/settings-schema.ts | Adds UI metadata and conditional visibility for many settings, reorganizes speech settings, and removes a redundant UI row. |
| packages/coding-agent/CHANGELOG.md | Documents user-visible additions/changes/fixes introduced by this PR. |
| docs/tools/task.md | Documents the role field for task items. |
| docs/tools/manage-skill.md | Adds user-facing documentation for the manage_skill tool. |
| docs/tools/learn.md | Adds user-facing documentation for the learn tool. |
| docs/tools/irc.md | Updates IRC tool docs to include peer activity in list. |
| docs/settings.md | Adds catalog entries for fastModeScope, task.eager, and todo.eager. |
| docs/keybindings.md | Documents tui.input.newLine (Shift+Enter, Ctrl+J). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| speechEnabled: () => { | ||
| try { | ||
| return Settings.instance.get("speech.enabled") === true; | ||
| } catch { | ||
| return false; | ||
| } | ||
| }, |
| exaEnabled: () => { | ||
| try { | ||
| return Settings.instance.get("exa.enabled") === true; | ||
| } catch { | ||
| return false; | ||
| } | ||
| }, | ||
| compactionRemoteActive: () => { | ||
| try { | ||
| return Settings.instance.get("compaction.remoteEnabled") === true; | ||
| } catch { | ||
| return false; | ||
| } | ||
| }, |
| localTtsActive: () => { | ||
| try { | ||
| return Settings.instance.get("providers.tts") !== "xai"; | ||
| } catch { | ||
| return false; | ||
| } | ||
| }, | ||
| localTtsModelActive: () => { | ||
| try { | ||
| return Settings.instance.get("providers.tts") !== "xai" || Settings.instance.get("speech.enabled") === true; | ||
| } catch { | ||
| return false; | ||
| } | ||
| }, |
| interface UiShape { | ||
| tab: SettingTab; | ||
| group?: string; | ||
| condition?: string; | ||
| } |
roboomp
left a comment
There was a problem hiding this comment.
P2: coherent settings/help/docs surface sync, but it changes default UI/status-line surfaces and needs maintainer confirmation.
Found one should-fix: stt.language is surfaced without the stt.enabled gate promised by the PR premise.
Verification: inspected diff and surrounding code; targeted settings-layout test could not run in this checkout because Bun cannot resolve workspace package imports (@oh-my-pi/pi-ai / @oh-my-pi/pi-tui).
Thanks for the broad sync work.
| "stt.language": { | ||
| type: "string", | ||
| default: "en", | ||
| ui: { |
There was a problem hiding this comment.
should-fix: stt.language is now surfaced unconditionally. The PR premise says newly surfaced dependent settings are gated on their master where applicable, and this language hint has no effect unless stt.enabled is true. Add a sttEnabled predicate in CONDITIONS and set condition: "sttEnabled" here so the Speech tab does not show an inactive STT-only knob when speech-to-text is off.
Summary
Brings the settings panel, slash help, and docs back in sync with the features merged in v15.13.x, and closes the YAML/UI gaps found while auditing the settings schema.
Closes #2621.
Settings panel
speech.enabled; Local TTS Voice off under the xAI provider; Local TTS Model on a local-or-vocalization predicate.exa.enabledmaster.mcp.discoveryModepanel row (subsumed bytools.discoveryMode); the config key is still honored for back-compat.retry.enabled,skills.enabled,stt.language,shellPath,searxng.categories/searxng.language,compaction.autoContinue,compaction.remoteEndpoint, and the Hindsight recall/retain knobs (recallBudget,bankMission,retainMission,retainContext).TUI
speech.enabled) and auto-learn (autolearn.enabled) status-line indicators after the model name, across the unicode / nerd-font / ascii symbol presets.Help & docs
/fasthelp notesfastModeScopecontrols the target provider family;/guided-goalhelp describes the guided interview.Ctrl+Jnewline shortcut (in-app hotkeys +docs/keybindings.md).roleparam intask.md,activityfield inirc.md(and the model prompt), newlearn/manage-skilltool docs, andfastModeScope/task.eager/todo.eagerindocs/settings.md.Deliberately out of scope
memories.enabledstays config-only — it is a legacy back-compat migration flag explicitly superseded bymemory.backend(already in the panel).skills.enable*toggles and the granular per-backend number knobs stay config-only.Tests
settings-layouttest asserts everyui.conditionresolves to a realCONDITIONSpredicate (guards the silent-typo gating failure mode where a bad name disables gating and the row always shows).bun run check:tsgreen across all workspaces;settings-layout(3/3) andtool-discovery(49/49, incl.mcp.discoveryModeback-compat) pass.