@@ -15,18 +15,20 @@ import {
1515 ExperimentsSelectorComponent ,
1616 type ExperimentalFeatureDraftChange ,
1717} from '../components/dialogs/experiments-selector' ;
18+ import { MermaidPreferenceSelectorComponent } from '../components/dialogs/mermaid-preference-selector' ;
1819import { modelDisplayName , segmentsFor } from '../components/dialogs/model-selector' ;
1920import { TabbedModelSelectorComponent } from '../components/dialogs/tabbed-model-selector' ;
2021import { PermissionSelectorComponent } from '../components/dialogs/permission-selector' ;
2122import { SettingsSelectorComponent , type SettingsSelection } from '../components/dialogs/settings-selector' ;
2223import { SurveyPreferenceSelectorComponent } from '../components/dialogs/survey-preference-selector' ;
2324import { ThemeSelectorComponent } from '../components/dialogs/theme-selector' ;
2425import { UpdatePreferenceSelectorComponent } from '../components/dialogs/update-preference-selector' ;
25- import { DEFAULT_TUI_CONFIG , saveTuiConfig , type TuiConfig } from '../config' ;
26+ import { DEFAULT_MARKDOWN_CONFIG , DEFAULT_TUI_CONFIG , saveTuiConfig , type MarkdownConfig , type TuiConfig } from '../config' ;
2627import type { ThemeName } from '#/tui/theme' ;
2728import { currentTheme , isBuiltInTheme , lightColors , loadCustomThemeMerged } from '#/tui/theme' ;
2829import { NO_ACTIVE_SESSION_MESSAGE } from '../constant/kimi-tui' ;
2930import { formatErrorMessage } from '../utils/event-payload' ;
31+ import { setMarkdownMermaidMode , type MermaidRenderMode } from '../utils/markdown-options' ;
3032import { PERMISSION_MODE_DESCRIPTIONS , PERMISSION_MODE_DISPLAY_NAMES } from '../utils/permission-mode' ;
3133import { thinkingEffortToConfig } from '../utils/thinking-config' ;
3234import { showUsage } from './info' ;
@@ -66,6 +68,7 @@ export function currentTuiConfig(host: Pick<SlashCommandHost, 'state'>): TuiConf
6668 notifications : host . state . appState . notifications ,
6769 upgrade : host . state . appState . upgrade ,
6870 statusLine : host . state . appState . statusLine ?? DEFAULT_TUI_CONFIG . statusLine ,
71+ markdown : host . state . appState . markdown ?? DEFAULT_MARKDOWN_CONFIG ,
6972 } ;
7073}
7174
@@ -884,6 +887,65 @@ export async function applySurveyPreferenceChoice(
884887 host . showStatus ( `Feedback survey ${ enabled ? 'enabled' : 'disabled' } .` ) ;
885888}
886889
890+ export function showMermaidPreferencePicker ( host : SlashCommandHost ) : void {
891+ host . mountEditorReplacement (
892+ new MermaidPreferenceSelectorComponent ( {
893+ currentValue : host . state . appState . markdown ?. mermaid !== 'off' ,
894+ onSelect : ( value ) => {
895+ host . restoreEditor ( ) ;
896+ void applyMermaidPreferenceChoice ( host , value ) ;
897+ } ,
898+ onCancel : ( ) => {
899+ host . restoreEditor ( ) ;
900+ } ,
901+ } ) ,
902+ ) ;
903+ }
904+
905+ type MermaidPreferenceHost = {
906+ readonly state : {
907+ readonly appState : Pick <
908+ SlashCommandHost [ 'state' ] [ 'appState' ] ,
909+ 'theme' | 'editorCommand' | 'notifications' | 'upgrade' | 'markdown'
910+ > ;
911+ readonly transcriptContainer : { invalidate ( ) : void } ;
912+ readonly ui : { requestRender ( force ?: boolean ) : void } ;
913+ } ;
914+ setAppState ( patch : Pick < SlashCommandHost [ 'state' ] [ 'appState' ] , 'markdown' > ) : void ;
915+ showStatus ( msg : string , color ?: string ) : void ;
916+ } ;
917+
918+ export async function applyMermaidPreferenceChoice (
919+ host : MermaidPreferenceHost ,
920+ enabled : boolean ,
921+ ) : Promise < void > {
922+ const mermaid : MermaidRenderMode = enabled ? 'final' : 'off' ;
923+ if ( mermaid === ( host . state . appState . markdown ?. mermaid ?? DEFAULT_MARKDOWN_CONFIG . mermaid ) ) {
924+ host . showStatus ( `Mermaid diagrams already ${ enabled ? 'enabled' : 'disabled' } .` ) ;
925+ return ;
926+ }
927+
928+ const markdown : MarkdownConfig = { mermaid } ;
929+ try {
930+ await saveTuiConfig ( {
931+ ...currentTuiConfig ( host as unknown as SlashCommandHost ) ,
932+ markdown,
933+ } ) ;
934+ } catch ( error ) {
935+ host . showStatus (
936+ `Failed to save mermaid diagram setting: ${ formatErrorMessage ( error ) } ` ,
937+ 'error' ,
938+ ) ;
939+ return ;
940+ }
941+
942+ setMarkdownMermaidMode ( mermaid ) ;
943+ host . setAppState ( { markdown } ) ;
944+ host . state . transcriptContainer . invalidate ( ) ;
945+ host . state . ui . requestRender ( true ) ;
946+ host . showStatus ( `Mermaid diagrams ${ enabled ? 'enabled' : 'disabled' } .` ) ;
947+ }
948+
887949export function showSettingsSelector ( host : SlashCommandHost ) : void {
888950 host . mountEditorReplacement (
889951 new SettingsSelectorComponent ( {
@@ -903,6 +965,7 @@ function handleSettingsSelection(host: SlashCommandHost, value: SettingsSelectio
903965 case 'model' : showModelPicker ( host ) ; return ;
904966 case 'permission' : showPermissionPicker ( host ) ; return ;
905967 case 'theme' : showThemePicker ( host ) ; return ;
968+ case 'mermaid' : showMermaidPreferencePicker ( host ) ; return ;
906969 case 'editor' : showEditorPicker ( host ) ; return ;
907970 case 'survey' : showSurveyPreferencePicker ( host ) ; return ;
908971 case 'experiments' : void showExperimentsPanel ( host ) ; return ;
0 commit comments