@dreb/coding-agent 2.57.1 → 2.58.1
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.
- package/README.md +4 -2
- package/dist/core/agent-session.d.ts +10 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +28 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +5 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +26 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts +2 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +6 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/subagent.d.ts +29 -0
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +48 -25
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +11 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +15 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +12 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +3 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/docs/dashboard.md +1 -1
- package/docs/rpc.md +11 -1
- package/docs/sdk.md +1 -1
- package/docs/settings.md +5 -1
- package/package.json +1 -1
|
@@ -28,6 +28,8 @@ export interface SettingsConfig {
|
|
|
28
28
|
quietStartup: boolean;
|
|
29
29
|
/** Whether nested AGENTS.md/CLAUDE.md auto-loading is enabled. */
|
|
30
30
|
autoLoadNestedContext: boolean;
|
|
31
|
+
/** Maximum children a new parent session may run concurrently; zero disables subagents. */
|
|
32
|
+
maxConcurrentSubagents: number;
|
|
31
33
|
/** Per-agent model overrides from agentModels settings */
|
|
32
34
|
agentModels: Record<string, string[]>;
|
|
33
35
|
/** Known agent names for the mach6 models submenu */
|
|
@@ -58,6 +60,7 @@ export interface SettingsCallbacks {
|
|
|
58
60
|
onAutocompleteMaxVisibleChange: (maxVisible: number) => void;
|
|
59
61
|
onQuietStartupChange: (enabled: boolean) => void;
|
|
60
62
|
onAutoLoadNestedContextChange: (enabled: boolean) => void;
|
|
63
|
+
onMaxConcurrentSubagentsChange: (value: number) => boolean;
|
|
61
64
|
onAgentModelsChange: (agentName: string, models: string[]) => void;
|
|
62
65
|
onSubagentArbiterChange: (settings: SubagentArbiterSettings) => boolean | Promise<boolean>;
|
|
63
66
|
onCancel: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@dreb/agent-core\";\nimport type { Transport } from \"@dreb/ai\";\nimport {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tgetCapabilities,\n\tgetKeybindings,\n\tInput,\n\ttype RankedItem,\n\tRankedList,\n\ttype RankedListTheme,\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SettingItem,\n\tSettingsList,\n\tSpacer,\n\tText,\n} from \"@dreb/tui\";\nimport type { SubagentArbiterSettings } from \"../../../core/settings-manager.js\";\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SETTINGS_SUBMENU_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\n\toff: \"No reasoning\",\n\tminimal: \"Very brief reasoning (~1k tokens)\",\n\tlow: \"Light reasoning (~2k tokens)\",\n\tmedium: \"Moderate reasoning (~8k tokens)\",\n\thigh: \"Deep reasoning (~16k tokens)\",\n\txhigh: \"Maximum reasoning (~32k tokens)\",\n};\n\nexport interface SettingsConfig {\n\tautoCompact: boolean;\n\tshowImages: boolean;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\tenableSkillCommands: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\ttransport: Transport;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: ThinkingLevel[];\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\t/** Whether the current model supports adaptive thinking (gates the thinking-display toggle). */\n\tthinkingDisplaySupported: boolean;\n\t/** Effective thinking-display value for the current model (\"summarized\" shown as on). */\n\tthinkingDisplay: \"summarized\" | \"omitted\";\n\tdoubleEscapeAction: \"fork\" | \"tree\" | \"none\";\n\ttreeFilterMode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\t/** Whether nested AGENTS.md/CLAUDE.md auto-loading is enabled. */\n\tautoLoadNestedContext: boolean;\n\t/** Per-agent model overrides from agentModels settings */\n\tagentModels: Record<string, string[]>;\n\t/** Known agent names for the mach6 models submenu */\n\tagentNames: string[];\n\t/** Available model IDs for selection in the ranked list */\n\tavailableModelIds: string[];\n\t/** Global-only Dispatch Arbiter policy. */\n\tsubagentArbiter: SubagentArbiterSettings;\n}\n\nexport interface SettingsCallbacks {\n\tonAutoCompactChange: (enabled: boolean) => void;\n\tonShowImagesChange: (enabled: boolean) => void;\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\n\tonBlockImagesChange: (blocked: boolean) => void;\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonTransportChange: (transport: Transport) => void;\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\n\tonThemeChange: (theme: string) => void;\n\tonThemePreview?: (theme: string) => void;\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\n\tonThinkingDisplayChange: (display: \"summarized\" | \"omitted\") => void;\n\tonDoubleEscapeActionChange: (action: \"fork\" | \"tree\" | \"none\") => void;\n\tonTreeFilterModeChange: (mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\") => void;\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\n\tonEditorPaddingXChange: (padding: number) => void;\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\n\tonQuietStartupChange: (enabled: boolean) => void;\n\tonAutoLoadNestedContextChange: (enabled: boolean) => void;\n\tonAgentModelsChange: (agentName: string, models: string[]) => void;\n\tonSubagentArbiterChange: (settings: SubagentArbiterSettings) => boolean | Promise<boolean>;\n\tonCancel: () => void;\n}\n\n/**\n * A submenu component for selecting from a list of options.\n */\nclass SelectSubmenu extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\toptions: SelectItem[],\n\t\tcurrentValue: string,\n\t\tonSelect: (value: string) => void,\n\t\tonCancel: () => void,\n\t\tonSelectionChange?: (value: string) => void,\n\t) {\n\t\tsuper();\n\n\t\t// Title\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\n\t\t// Description\n\t\tif (description) {\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\t}\n\n\t\t// Spacer\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Select list\n\t\tthis.selectList = new SelectList(\n\t\t\toptions,\n\t\t\tMath.min(options.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\t// Pre-select current value\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = onCancel;\n\n\t\tif (onSelectionChange) {\n\t\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\t\tonSelectionChange(item.value);\n\t\t\t};\n\t\t}\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · Esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n\nclass TextInputSubmenu extends Container implements Focusable {\n\tprivate readonly input = new Input();\n\tprivate readonly onSubmit: (value: string) => void;\n\tprivate readonly onCancel: () => void;\n\tprivate _focused = false;\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\tcurrentValue: string,\n\t\tonSubmit: (value: string) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tsuper();\n\t\tthis.onSubmit = onSubmit;\n\t\tthis.onCancel = onCancel;\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.input.setValue(currentValue);\n\t\tthis.addChild(this.input);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to save · Esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(data, \"tui.select.confirm\") || data === \"\\n\") this.onSubmit(this.input.getValue());\n\t\telse if (kb.matches(data, \"tui.select.cancel\")) this.onCancel();\n\t\telse this.input.handleInput(data);\n\t}\n}\n\nfunction getRankedListTheme(): RankedListTheme {\n\treturn {\n\t\tselectedText: (t: string) => theme.bold(t),\n\t\trank: (t: string) => theme.fg(\"muted\", t),\n\t\tdescription: (t: string) => theme.fg(\"dim\", t),\n\t\thint: (t: string) => theme.fg(\"dim\", t),\n\t\tempty: (t: string) => theme.fg(\"dim\", t),\n\t};\n}\n\n/**\n * Top-level Mach6 Models submenu. Shows a list of agents, selecting one opens\n * a RankedList editor for that agent's model fallback list.\n *\n * Navigation: Agent list → RankedList → (optional) Add Model picker\n */\nexport class AgentModelsSubmenu implements Component {\n\tprivate agentList: SelectList;\n\tprivate rankedList: RankedList | null = null;\n\tprivate addList: SelectList | null = null;\n\tprivate addListSearchQuery = \"\";\n\t// Transient notice shown in the ranked view when an add was attempted but no\n\t// models are available to add. Cleared on the next ranked-view input.\n\tprivate rankedNotice: string | null = null;\n\tprivate activeView: \"agents\" | \"ranked\" | \"add\" = \"agents\";\n\tprivate currentAgentName: string | null = null;\n\tprivate agentNames: string[];\n\tprivate agentModels: Record<string, string[]>;\n\tprivate availableModelIds: string[];\n\tprivate onModelsChange: (agentName: string, models: string[]) => void;\n\tprivate onCancel: () => void;\n\n\tconstructor(\n\t\tagentNames: string[],\n\t\tagentModels: Record<string, string[]>,\n\t\tavailableModelIds: string[],\n\t\tonModelsChange: (agentName: string, models: string[]) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tthis.agentNames = agentNames;\n\t\tthis.agentModels = agentModels;\n\t\tthis.availableModelIds = availableModelIds;\n\t\tthis.onModelsChange = onModelsChange;\n\t\tthis.onCancel = onCancel;\n\n\t\tthis.agentList = this.buildAgentList();\n\t}\n\n\tprivate buildAgentList(): SelectList {\n\t\tconst agentItems: SelectItem[] = this.agentNames.map((name) => {\n\t\t\tconst models = this.agentModels[name];\n\t\t\tconst desc = models && models.length > 0 ? models.join(\", \") : \"default\";\n\t\t\treturn { value: name, label: name, description: desc };\n\t\t});\n\n\t\tconst list = new SelectList(agentItems, Math.min(agentItems.length, 12), getSelectListTheme(), {\n\t\t\tminPrimaryColumnWidth: 20,\n\t\t\tmaxPrimaryColumnWidth: 30,\n\t\t});\n\n\t\tlist.onSelect = (item) => {\n\t\t\tthis.openRankedList(item.value);\n\t\t};\n\n\t\tlist.onCancel = this.onCancel;\n\t\treturn list;\n\t}\n\n\tprivate openRankedList(agentName: string): void {\n\t\tthis.currentAgentName = agentName;\n\t\tconst currentModels = this.agentModels[agentName] ?? [];\n\t\tconst items: RankedItem[] = currentModels.map((m) => ({ value: m, label: m }));\n\t\tthis.rankedList = new RankedList(items, 10, getRankedListTheme());\n\n\t\tthis.rankedList.onReorder = (reorderedItems) => {\n\t\t\tthis.saveModels(\n\t\t\t\tagentName,\n\t\t\t\treorderedItems.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.rankedList.onRemove = (_removed, remaining) => {\n\t\t\tthis.saveModels(\n\t\t\t\tagentName,\n\t\t\t\tremaining.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.rankedList.onSelect = () => {\n\t\t\tthis.openAddModelPicker();\n\t\t};\n\n\t\tthis.rankedList.onCancel = () => {\n\t\t\tthis.rankedList = null;\n\t\t\tthis.currentAgentName = null;\n\t\t\tthis.activeView = \"agents\";\n\t\t\t// Rebuild agent list so descriptions reflect any changes made\n\t\t\tthis.agentList = this.buildAgentList();\n\t\t};\n\n\t\tthis.activeView = \"ranked\";\n\t}\n\n\tprivate openAddModelPicker(): void {\n\t\tif (!this.rankedList) return;\n\n\t\tconst existingValues = new Set(this.rankedList.getItems().map((i) => i.value));\n\t\tconst allOptions = this.availableModelIds\n\t\t\t.filter((m) => !existingValues.has(m))\n\t\t\t.map((m) => ({ value: m, label: m }));\n\n\t\tif (allOptions.length === 0) {\n\t\t\t// Don't silently swallow the \"add\" intent — tell the user why nothing happened.\n\t\t\tthis.rankedNotice =\n\t\t\t\tthis.availableModelIds.length === 0\n\t\t\t\t\t? \"No models available to add (no authenticated providers)\"\n\t\t\t\t\t: \"All available models are already in the list\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.addList = new SelectList(\n\t\t\tallOptions,\n\t\t\tMath.min(allOptions.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\tthis.addListSearchQuery = \"\";\n\n\t\tthis.addList.onSelect = (item) => {\n\t\t\tif (!this.rankedList || !this.currentAgentName) return;\n\t\t\tconst newItems = [...this.rankedList.getItems(), { value: item.value, label: item.value }];\n\t\t\tthis.rankedList.setItems(newItems);\n\t\t\tthis.addList = null;\n\t\t\tthis.addListSearchQuery = \"\";\n\t\t\tthis.activeView = \"ranked\";\n\t\t\tthis.saveModels(\n\t\t\t\tthis.currentAgentName,\n\t\t\t\tnewItems.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.addList.onCancel = () => {\n\t\t\tthis.addList = null;\n\t\t\tthis.addListSearchQuery = \"\";\n\t\t\tthis.activeView = \"ranked\";\n\t\t};\n\n\t\tthis.activeView = \"add\";\n\t}\n\n\tprivate saveModels(agentName: string, models: string[]): void {\n\t\tthis.agentModels[agentName] = models;\n\t\tthis.onModelsChange(agentName, models);\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\n\t\tif (this.activeView === \"add\" && this.addList) {\n\t\t\tlines.push(theme.bold(theme.fg(\"accent\", \"Add Model\")));\n\t\t\tlines.push(\"\");\n\t\t\tconst searchDisplay = this.addListSearchQuery\n\t\t\t\t? ` Search: ${this.addListSearchQuery}▋`\n\t\t\t\t: theme.fg(\"dim\", \" Type to filter · ↑↓: navigate · Enter: add · Esc: back\");\n\t\t\tlines.push(searchDisplay);\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...this.addList.render(width));\n\t\t\treturn lines;\n\t\t}\n\n\t\tif (this.activeView === \"ranked\" && this.rankedList && this.currentAgentName) {\n\t\t\tlines.push(theme.bold(theme.fg(\"accent\", `Agent Models › ${this.currentAgentName}`)));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(theme.fg(\"muted\", \"Configure model fallback priority (first = preferred)\"));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...this.rankedList.render(width));\n\t\t\tif (this.rankedNotice) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tlines.push(theme.fg(\"warning\", ` ${this.rankedNotice}`));\n\t\t\t}\n\t\t\treturn lines;\n\t\t}\n\n\t\t// Default: agent list\n\t\tlines.push(theme.bold(theme.fg(\"accent\", \"Agent Models\")));\n\t\tlines.push(\"\");\n\t\tlines.push(theme.fg(\"muted\", \"Select an agent to configure its model fallback list\"));\n\t\tlines.push(\"\");\n\t\tlines.push(...this.agentList.render(width));\n\t\tlines.push(\"\");\n\t\tlines.push(theme.fg(\"dim\", \" Enter to configure · Esc to go back\"));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.activeView === \"add\" && this.addList) {\n\t\t\tconst kb = getKeybindings();\n\t\t\tif (\n\t\t\t\tkb.matches(data, \"tui.select.cancel\") ||\n\t\t\t\tkb.matches(data, \"tui.select.up\") ||\n\t\t\t\tkb.matches(data, \"tui.select.down\") ||\n\t\t\t\tkb.matches(data, \"tui.select.confirm\")\n\t\t\t) {\n\t\t\t\tthis.addList.handleInput(data);\n\t\t\t} else if (data === \"\\x7f\" || data === \"\\x08\") {\n\t\t\t\t// Backspace — remove last char from search\n\t\t\t\tthis.addListSearchQuery = this.addListSearchQuery.slice(0, -1);\n\t\t\t\tthis.addList.setFilter(this.addListSearchQuery);\n\t\t\t} else if (data.length === 1 && data >= \" \") {\n\t\t\t\t// Printable char — add to search\n\t\t\t\tthis.addListSearchQuery += data;\n\t\t\t\tthis.addList.setFilter(this.addListSearchQuery);\n\t\t\t}\n\t\t} else if (this.activeView === \"ranked\" && this.rankedList) {\n\t\t\t// Clear any stale \"nothing to add\" notice; openAddModelPicker re-sets it\n\t\t\t// if this input is another failed add attempt.\n\t\t\tthis.rankedNotice = null;\n\t\t\tthis.rankedList.handleInput(data);\n\t\t} else {\n\t\t\tthis.agentList.handleInput(data);\n\t\t}\n\t}\n}\n\n/**\n * Main settings selector component.\n */\nexport class SettingsSelectorComponent extends Container {\n\tprivate settingsList: SettingsList;\n\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n\t\tsuper();\n\n\t\tconst supportsImages = getCapabilities().images;\n\t\tlet arbiterSettings = { ...config.subagentArbiter };\n\t\tconst updateArbiter = async (patch: Partial<SubagentArbiterSettings>): Promise<boolean> => {\n\t\t\tconst next = { ...arbiterSettings, ...patch };\n\t\t\tif (!(await callbacks.onSubagentArbiterChange(next))) return false;\n\t\t\tarbiterSettings = next;\n\t\t\treturn true;\n\t\t};\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"autocompact\",\n\t\t\t\tlabel: \"Auto-compact\",\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"auto-load-nested-context\",\n\t\t\t\tlabel: \"Unrestricted nested context loading (expert)\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"OFF by default. Expert-only: automatically loads AGENTS.md/CLAUDE.md from every tool target; untrusted files can contain prompt injection.\",\n\t\t\t\tcurrentValue: config.autoLoadNestedContext ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"steering-mode\",\n\t\t\t\tlabel: \"Steering mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.steeringMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"follow-up-mode\",\n\t\t\t\tlabel: \"Follow-up mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.followUpMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"transport\",\n\t\t\t\tlabel: \"Transport\",\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\n\t\t\t\tcurrentValue: config.transport,\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"auto\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"hide-thinking\",\n\t\t\t\tlabel: \"Hide thinking\",\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"quiet-startup\",\n\t\t\t\tlabel: \"Quiet startup\",\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"double-escape-action\",\n\t\t\t\tlabel: \"Double-escape action\",\n\t\t\t\tdescription: \"Action when pressing Escape twice with empty editor\",\n\t\t\t\tcurrentValue: config.doubleEscapeAction,\n\t\t\t\tvalues: [\"tree\", \"fork\", \"none\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"tree-filter-mode\",\n\t\t\t\tlabel: \"Tree filter mode\",\n\t\t\t\tdescription: \"Default filter when opening /tree\",\n\t\t\t\tcurrentValue: config.treeFilterMode,\n\t\t\t\tvalues: [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"thinking\",\n\t\t\t\tlabel: \"Thinking level\",\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\n\t\t\t\tcurrentValue: config.thinkingLevel,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Thinking Level\",\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"theme\",\n\t\t\t\tlabel: \"Theme\",\n\t\t\t\tdescription: \"Color theme for the interface\",\n\t\t\t\tcurrentValue: config.currentTheme,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Theme\",\n\t\t\t\t\t\t\"Select color theme\",\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\n\t\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\t\tlabel: t,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// Restore original theme on cancel\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentValue);\n\t\t\t\t\t\t\tdone();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\t// Preview theme on selection change\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t},\n\t\t];\n\n\t\t// Thinking-display toggle for the current model. Only adaptive-thinking\n\t\t// Opus/Sonnet 4.6–4.x and Claude 5 families honor this field.\n\t\t// Shown as on (\"summarized\") by default; off (\"omitted\") hides thinking for lower latency.\n\t\tif (config.thinkingDisplaySupported) {\n\t\t\tconst hideThinkingIndex = items.findIndex((item) => item.id === \"hide-thinking\");\n\t\t\titems.splice(hideThinkingIndex + 1, 0, {\n\t\t\t\tid: \"thinking-display\",\n\t\t\t\tlabel: \"Show thinking summary\",\n\t\t\t\tdescription: \"Show summarized thinking for this model (off hides it for lower latency)\",\n\t\t\t\tcurrentValue: config.thinkingDisplay === \"summarized\" ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t});\n\t\t}\n\n\t\titems.push(\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-enabled\",\n\t\t\t\tlabel: \"Dispatch Arbiter\",\n\t\t\t\tdescription: arbiterSettings.model\n\t\t\t\t\t? \"Global-only fail-closed pre-spawn routing (configure model, thinking, and guide below)\"\n\t\t\t\t\t: \"Global-only; choose an arbiter model before enabling\",\n\t\t\t\tcurrentValue: arbiterSettings.enabled === true ? \"true\" : \"false\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter\",\n\t\t\t\t\t\t\"Enable only when the exact model, live scope, and guide are ready; failures do not persist\",\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ value: \"false\", label: \"off\", description: \"Disabled (default)\" },\n\t\t\t\t\t\t\t{ value: \"true\", label: \"on\", description: \"Fail closed before every child spawn\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ enabled: value === \"true\" })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-model\",\n\t\t\t\tlabel: \"Dispatch Arbiter model\",\n\t\t\t\tdescription: \"Exact authenticated provider/model; no fallback\",\n\t\t\t\tcurrentValue: arbiterSettings.model ?? \"not set\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Model\",\n\t\t\t\t\t\t\"Select the exact model used for the tool-less pre-spawn decision\",\n\t\t\t\t\t\tconfig.availableModelIds.map((model) => ({ value: model, label: model })),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ model: value })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-thinking\",\n\t\t\t\tlabel: \"Dispatch Arbiter thinking\",\n\t\t\t\tdescription: \"Reasoning level for the arbiter call; validated against its model\",\n\t\t\t\tcurrentValue: arbiterSettings.thinking ?? \"off\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Thinking\",\n\t\t\t\t\t\t\"Select reasoning depth for the headless arbiter call\",\n\t\t\t\t\t\t([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as ThinkingLevel[]).map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ thinking: value as ThinkingLevel })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-guide\",\n\t\t\t\tlabel: \"Dispatch Arbiter guide\",\n\t\t\t\tdescription: \"Routing-guide path; blank uses ~/.dreb/agent/model-routing-guide.md\",\n\t\t\t\tcurrentValue: arbiterSettings.guidePath ?? \"default\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew TextInputSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Guide Path\",\n\t\t\t\t\t\t\"Enter a path, or leave blank for ~/.dreb/agent/model-routing-guide.md\",\n\t\t\t\t\t\tcurrentValue === \"default\" ? \"\" : currentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tconst guidePath = value.trim();\n\t\t\t\t\t\t\tif (await updateArbiter({ guidePath: guidePath || undefined })) done(guidePath || \"default\");\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t);\n\n\t\t// Single \"Agent Models\" entry that opens the agent picker submenu\n\t\tif (config.agentNames.length > 0) {\n\t\t\titems.push({\n\t\t\t\tid: \"agent-models\",\n\t\t\t\tlabel: \"Agent Models\",\n\t\t\t\tdescription: \"Configure model fallback lists for subagents\",\n\t\t\t\tcurrentValue: \"\",\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew AgentModelsSubmenu(\n\t\t\t\t\t\tconfig.agentNames,\n\t\t\t\t\t\tconfig.agentModels,\n\t\t\t\t\t\tconfig.availableModelIds,\n\t\t\t\t\t\t(agentName, models) => {\n\t\t\t\t\t\t\tcallbacks.onAgentModelsChange(agentName, models);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t});\n\t\t}\n\n\t\t// Only show image toggle if terminal supports it\n\t\tif (supportsImages) {\n\t\t\t// Insert after autocompact\n\t\t\titems.splice(1, 0, {\n\t\t\t\tid: \"show-images\",\n\t\t\t\tlabel: \"Show images\",\n\t\t\t\tdescription: \"Render images inline in terminal\",\n\t\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t});\n\t\t}\n\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\n\t\titems.splice(supportsImages ? 2 : 1, 0, {\n\t\t\tid: \"auto-resize-images\",\n\t\t\tlabel: \"Auto-resize images\",\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Block images toggle (always available, insert after auto-resize-images)\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\n\t\titems.splice(autoResizeIndex + 1, 0, {\n\t\t\tid: \"block-images\",\n\t\t\tlabel: \"Block images\",\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Skill commands toggle (insert after block-images)\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\n\t\titems.splice(blockImagesIndex + 1, 0, {\n\t\t\tid: \"skill-commands\",\n\t\t\tlabel: \"Skill commands\",\n\t\t\tdescription: \"Register skills as /skill:name commands\",\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Hardware cursor toggle (insert after skill-commands)\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"skill-commands\");\n\t\titems.splice(skillCommandsIndex + 1, 0, {\n\t\t\tid: \"show-hardware-cursor\",\n\t\t\tlabel: \"Show hardware cursor\",\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\n\t\t\tid: \"editor-padding\",\n\t\t\tlabel: \"Editor padding\",\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\n\t\t\tcurrentValue: String(config.editorPaddingX),\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\n\t\t});\n\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\n\t\titems.splice(editorPaddingIndex + 1, 0, {\n\t\t\tid: \"autocomplete-max-visible\",\n\t\t\tlabel: \"Autocomplete max items\",\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\n\t\t});\n\n\t\t// Add borders\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\t10,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"autocompact\":\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-load-nested-context\":\n\t\t\t\t\t\tcallbacks.onAutoLoadNestedContextChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-images\":\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-resize-images\":\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"block-images\":\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"skill-commands\":\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"steering-mode\":\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"follow-up-mode\":\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transport\":\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hide-thinking\":\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"thinking-display\":\n\t\t\t\t\t\tcallbacks.onThinkingDisplayChange(newValue === \"true\" ? \"summarized\" : \"omitted\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"quiet-startup\":\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"double-escape-action\":\n\t\t\t\t\t\tcallbacks.onDoubleEscapeActionChange(newValue as \"fork\" | \"tree\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tree-filter-mode\":\n\t\t\t\t\t\tcallbacks.onTreeFilterModeChange(\n\t\t\t\t\t\t\tnewValue as \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-hardware-cursor\":\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"editor-padding\":\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"autocomplete-max-visible\":\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallbacks.onCancel,\n\t\t\t{ enableSearch: true },\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSettingsList(): SettingsList {\n\t\treturn this.settingsList;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"settings-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@dreb/agent-core\";\nimport type { Transport } from \"@dreb/ai\";\nimport {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tgetCapabilities,\n\tgetKeybindings,\n\tInput,\n\ttype RankedItem,\n\tRankedList,\n\ttype RankedListTheme,\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SettingItem,\n\tSettingsList,\n\tSpacer,\n\tText,\n} from \"@dreb/tui\";\nimport type { SubagentArbiterSettings } from \"../../../core/settings-manager.js\";\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SETTINGS_SUBMENU_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\n\toff: \"No reasoning\",\n\tminimal: \"Very brief reasoning (~1k tokens)\",\n\tlow: \"Light reasoning (~2k tokens)\",\n\tmedium: \"Moderate reasoning (~8k tokens)\",\n\thigh: \"Deep reasoning (~16k tokens)\",\n\txhigh: \"Maximum reasoning (~32k tokens)\",\n};\n\nexport interface SettingsConfig {\n\tautoCompact: boolean;\n\tshowImages: boolean;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\tenableSkillCommands: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\ttransport: Transport;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: ThinkingLevel[];\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\t/** Whether the current model supports adaptive thinking (gates the thinking-display toggle). */\n\tthinkingDisplaySupported: boolean;\n\t/** Effective thinking-display value for the current model (\"summarized\" shown as on). */\n\tthinkingDisplay: \"summarized\" | \"omitted\";\n\tdoubleEscapeAction: \"fork\" | \"tree\" | \"none\";\n\ttreeFilterMode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\t/** Whether nested AGENTS.md/CLAUDE.md auto-loading is enabled. */\n\tautoLoadNestedContext: boolean;\n\t/** Maximum children a new parent session may run concurrently; zero disables subagents. */\n\tmaxConcurrentSubagents: number;\n\t/** Per-agent model overrides from agentModels settings */\n\tagentModels: Record<string, string[]>;\n\t/** Known agent names for the mach6 models submenu */\n\tagentNames: string[];\n\t/** Available model IDs for selection in the ranked list */\n\tavailableModelIds: string[];\n\t/** Global-only Dispatch Arbiter policy. */\n\tsubagentArbiter: SubagentArbiterSettings;\n}\n\nexport interface SettingsCallbacks {\n\tonAutoCompactChange: (enabled: boolean) => void;\n\tonShowImagesChange: (enabled: boolean) => void;\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\n\tonBlockImagesChange: (blocked: boolean) => void;\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonTransportChange: (transport: Transport) => void;\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\n\tonThemeChange: (theme: string) => void;\n\tonThemePreview?: (theme: string) => void;\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\n\tonThinkingDisplayChange: (display: \"summarized\" | \"omitted\") => void;\n\tonDoubleEscapeActionChange: (action: \"fork\" | \"tree\" | \"none\") => void;\n\tonTreeFilterModeChange: (mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\") => void;\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\n\tonEditorPaddingXChange: (padding: number) => void;\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\n\tonQuietStartupChange: (enabled: boolean) => void;\n\tonAutoLoadNestedContextChange: (enabled: boolean) => void;\n\tonMaxConcurrentSubagentsChange: (value: number) => boolean;\n\tonAgentModelsChange: (agentName: string, models: string[]) => void;\n\tonSubagentArbiterChange: (settings: SubagentArbiterSettings) => boolean | Promise<boolean>;\n\tonCancel: () => void;\n}\n\n/**\n * A submenu component for selecting from a list of options.\n */\nclass SelectSubmenu extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\toptions: SelectItem[],\n\t\tcurrentValue: string,\n\t\tonSelect: (value: string) => void,\n\t\tonCancel: () => void,\n\t\tonSelectionChange?: (value: string) => void,\n\t) {\n\t\tsuper();\n\n\t\t// Title\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\n\t\t// Description\n\t\tif (description) {\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\t}\n\n\t\t// Spacer\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Select list\n\t\tthis.selectList = new SelectList(\n\t\t\toptions,\n\t\t\tMath.min(options.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\t// Pre-select current value\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = onCancel;\n\n\t\tif (onSelectionChange) {\n\t\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\t\tonSelectionChange(item.value);\n\t\t\t};\n\t\t}\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · Esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n\nclass TextInputSubmenu extends Container implements Focusable {\n\tprivate readonly input = new Input();\n\tprivate readonly onSubmit: (value: string) => void;\n\tprivate readonly onCancel: () => void;\n\tprivate _focused = false;\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\tcurrentValue: string,\n\t\tonSubmit: (value: string) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tsuper();\n\t\tthis.onSubmit = onSubmit;\n\t\tthis.onCancel = onCancel;\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.input.setValue(currentValue);\n\t\tthis.addChild(this.input);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to save · Esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(data, \"tui.select.confirm\") || data === \"\\n\") this.onSubmit(this.input.getValue());\n\t\telse if (kb.matches(data, \"tui.select.cancel\")) this.onCancel();\n\t\telse this.input.handleInput(data);\n\t}\n}\n\nfunction getRankedListTheme(): RankedListTheme {\n\treturn {\n\t\tselectedText: (t: string) => theme.bold(t),\n\t\trank: (t: string) => theme.fg(\"muted\", t),\n\t\tdescription: (t: string) => theme.fg(\"dim\", t),\n\t\thint: (t: string) => theme.fg(\"dim\", t),\n\t\tempty: (t: string) => theme.fg(\"dim\", t),\n\t};\n}\n\n/**\n * Top-level Mach6 Models submenu. Shows a list of agents, selecting one opens\n * a RankedList editor for that agent's model fallback list.\n *\n * Navigation: Agent list → RankedList → (optional) Add Model picker\n */\nexport class AgentModelsSubmenu implements Component {\n\tprivate agentList: SelectList;\n\tprivate rankedList: RankedList | null = null;\n\tprivate addList: SelectList | null = null;\n\tprivate addListSearchQuery = \"\";\n\t// Transient notice shown in the ranked view when an add was attempted but no\n\t// models are available to add. Cleared on the next ranked-view input.\n\tprivate rankedNotice: string | null = null;\n\tprivate activeView: \"agents\" | \"ranked\" | \"add\" = \"agents\";\n\tprivate currentAgentName: string | null = null;\n\tprivate agentNames: string[];\n\tprivate agentModels: Record<string, string[]>;\n\tprivate availableModelIds: string[];\n\tprivate onModelsChange: (agentName: string, models: string[]) => void;\n\tprivate onCancel: () => void;\n\n\tconstructor(\n\t\tagentNames: string[],\n\t\tagentModels: Record<string, string[]>,\n\t\tavailableModelIds: string[],\n\t\tonModelsChange: (agentName: string, models: string[]) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tthis.agentNames = agentNames;\n\t\tthis.agentModels = agentModels;\n\t\tthis.availableModelIds = availableModelIds;\n\t\tthis.onModelsChange = onModelsChange;\n\t\tthis.onCancel = onCancel;\n\n\t\tthis.agentList = this.buildAgentList();\n\t}\n\n\tprivate buildAgentList(): SelectList {\n\t\tconst agentItems: SelectItem[] = this.agentNames.map((name) => {\n\t\t\tconst models = this.agentModels[name];\n\t\t\tconst desc = models && models.length > 0 ? models.join(\", \") : \"default\";\n\t\t\treturn { value: name, label: name, description: desc };\n\t\t});\n\n\t\tconst list = new SelectList(agentItems, Math.min(agentItems.length, 12), getSelectListTheme(), {\n\t\t\tminPrimaryColumnWidth: 20,\n\t\t\tmaxPrimaryColumnWidth: 30,\n\t\t});\n\n\t\tlist.onSelect = (item) => {\n\t\t\tthis.openRankedList(item.value);\n\t\t};\n\n\t\tlist.onCancel = this.onCancel;\n\t\treturn list;\n\t}\n\n\tprivate openRankedList(agentName: string): void {\n\t\tthis.currentAgentName = agentName;\n\t\tconst currentModels = this.agentModels[agentName] ?? [];\n\t\tconst items: RankedItem[] = currentModels.map((m) => ({ value: m, label: m }));\n\t\tthis.rankedList = new RankedList(items, 10, getRankedListTheme());\n\n\t\tthis.rankedList.onReorder = (reorderedItems) => {\n\t\t\tthis.saveModels(\n\t\t\t\tagentName,\n\t\t\t\treorderedItems.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.rankedList.onRemove = (_removed, remaining) => {\n\t\t\tthis.saveModels(\n\t\t\t\tagentName,\n\t\t\t\tremaining.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.rankedList.onSelect = () => {\n\t\t\tthis.openAddModelPicker();\n\t\t};\n\n\t\tthis.rankedList.onCancel = () => {\n\t\t\tthis.rankedList = null;\n\t\t\tthis.currentAgentName = null;\n\t\t\tthis.activeView = \"agents\";\n\t\t\t// Rebuild agent list so descriptions reflect any changes made\n\t\t\tthis.agentList = this.buildAgentList();\n\t\t};\n\n\t\tthis.activeView = \"ranked\";\n\t}\n\n\tprivate openAddModelPicker(): void {\n\t\tif (!this.rankedList) return;\n\n\t\tconst existingValues = new Set(this.rankedList.getItems().map((i) => i.value));\n\t\tconst allOptions = this.availableModelIds\n\t\t\t.filter((m) => !existingValues.has(m))\n\t\t\t.map((m) => ({ value: m, label: m }));\n\n\t\tif (allOptions.length === 0) {\n\t\t\t// Don't silently swallow the \"add\" intent — tell the user why nothing happened.\n\t\t\tthis.rankedNotice =\n\t\t\t\tthis.availableModelIds.length === 0\n\t\t\t\t\t? \"No models available to add (no authenticated providers)\"\n\t\t\t\t\t: \"All available models are already in the list\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.addList = new SelectList(\n\t\t\tallOptions,\n\t\t\tMath.min(allOptions.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\tthis.addListSearchQuery = \"\";\n\n\t\tthis.addList.onSelect = (item) => {\n\t\t\tif (!this.rankedList || !this.currentAgentName) return;\n\t\t\tconst newItems = [...this.rankedList.getItems(), { value: item.value, label: item.value }];\n\t\t\tthis.rankedList.setItems(newItems);\n\t\t\tthis.addList = null;\n\t\t\tthis.addListSearchQuery = \"\";\n\t\t\tthis.activeView = \"ranked\";\n\t\t\tthis.saveModels(\n\t\t\t\tthis.currentAgentName,\n\t\t\t\tnewItems.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.addList.onCancel = () => {\n\t\t\tthis.addList = null;\n\t\t\tthis.addListSearchQuery = \"\";\n\t\t\tthis.activeView = \"ranked\";\n\t\t};\n\n\t\tthis.activeView = \"add\";\n\t}\n\n\tprivate saveModels(agentName: string, models: string[]): void {\n\t\tthis.agentModels[agentName] = models;\n\t\tthis.onModelsChange(agentName, models);\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\n\t\tif (this.activeView === \"add\" && this.addList) {\n\t\t\tlines.push(theme.bold(theme.fg(\"accent\", \"Add Model\")));\n\t\t\tlines.push(\"\");\n\t\t\tconst searchDisplay = this.addListSearchQuery\n\t\t\t\t? ` Search: ${this.addListSearchQuery}▋`\n\t\t\t\t: theme.fg(\"dim\", \" Type to filter · ↑↓: navigate · Enter: add · Esc: back\");\n\t\t\tlines.push(searchDisplay);\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...this.addList.render(width));\n\t\t\treturn lines;\n\t\t}\n\n\t\tif (this.activeView === \"ranked\" && this.rankedList && this.currentAgentName) {\n\t\t\tlines.push(theme.bold(theme.fg(\"accent\", `Agent Models › ${this.currentAgentName}`)));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(theme.fg(\"muted\", \"Configure model fallback priority (first = preferred)\"));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...this.rankedList.render(width));\n\t\t\tif (this.rankedNotice) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tlines.push(theme.fg(\"warning\", ` ${this.rankedNotice}`));\n\t\t\t}\n\t\t\treturn lines;\n\t\t}\n\n\t\t// Default: agent list\n\t\tlines.push(theme.bold(theme.fg(\"accent\", \"Agent Models\")));\n\t\tlines.push(\"\");\n\t\tlines.push(theme.fg(\"muted\", \"Select an agent to configure its model fallback list\"));\n\t\tlines.push(\"\");\n\t\tlines.push(...this.agentList.render(width));\n\t\tlines.push(\"\");\n\t\tlines.push(theme.fg(\"dim\", \" Enter to configure · Esc to go back\"));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.activeView === \"add\" && this.addList) {\n\t\t\tconst kb = getKeybindings();\n\t\t\tif (\n\t\t\t\tkb.matches(data, \"tui.select.cancel\") ||\n\t\t\t\tkb.matches(data, \"tui.select.up\") ||\n\t\t\t\tkb.matches(data, \"tui.select.down\") ||\n\t\t\t\tkb.matches(data, \"tui.select.confirm\")\n\t\t\t) {\n\t\t\t\tthis.addList.handleInput(data);\n\t\t\t} else if (data === \"\\x7f\" || data === \"\\x08\") {\n\t\t\t\t// Backspace — remove last char from search\n\t\t\t\tthis.addListSearchQuery = this.addListSearchQuery.slice(0, -1);\n\t\t\t\tthis.addList.setFilter(this.addListSearchQuery);\n\t\t\t} else if (data.length === 1 && data >= \" \") {\n\t\t\t\t// Printable char — add to search\n\t\t\t\tthis.addListSearchQuery += data;\n\t\t\t\tthis.addList.setFilter(this.addListSearchQuery);\n\t\t\t}\n\t\t} else if (this.activeView === \"ranked\" && this.rankedList) {\n\t\t\t// Clear any stale \"nothing to add\" notice; openAddModelPicker re-sets it\n\t\t\t// if this input is another failed add attempt.\n\t\t\tthis.rankedNotice = null;\n\t\t\tthis.rankedList.handleInput(data);\n\t\t} else {\n\t\t\tthis.agentList.handleInput(data);\n\t\t}\n\t}\n}\n\n/**\n * Main settings selector component.\n */\nexport class SettingsSelectorComponent extends Container {\n\tprivate settingsList: SettingsList;\n\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n\t\tsuper();\n\n\t\tconst supportsImages = getCapabilities().images;\n\t\tlet arbiterSettings = { ...config.subagentArbiter };\n\t\tconst updateArbiter = async (patch: Partial<SubagentArbiterSettings>): Promise<boolean> => {\n\t\t\tconst next = { ...arbiterSettings, ...patch };\n\t\t\tif (!(await callbacks.onSubagentArbiterChange(next))) return false;\n\t\t\tarbiterSettings = next;\n\t\t\treturn true;\n\t\t};\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"autocompact\",\n\t\t\t\tlabel: \"Auto-compact\",\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"auto-load-nested-context\",\n\t\t\t\tlabel: \"Unrestricted nested context loading (expert)\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"OFF by default. Expert-only: automatically loads AGENTS.md/CLAUDE.md from every tool target; untrusted files can contain prompt injection.\",\n\t\t\t\tcurrentValue: config.autoLoadNestedContext ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"steering-mode\",\n\t\t\t\tlabel: \"Steering mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.steeringMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"follow-up-mode\",\n\t\t\t\tlabel: \"Follow-up mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.followUpMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"transport\",\n\t\t\t\tlabel: \"Transport\",\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\n\t\t\t\tcurrentValue: config.transport,\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"auto\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"hide-thinking\",\n\t\t\t\tlabel: \"Hide thinking\",\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"quiet-startup\",\n\t\t\t\tlabel: \"Quiet startup\",\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"double-escape-action\",\n\t\t\t\tlabel: \"Double-escape action\",\n\t\t\t\tdescription: \"Action when pressing Escape twice with empty editor\",\n\t\t\t\tcurrentValue: config.doubleEscapeAction,\n\t\t\t\tvalues: [\"tree\", \"fork\", \"none\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"tree-filter-mode\",\n\t\t\t\tlabel: \"Tree filter mode\",\n\t\t\t\tdescription: \"Default filter when opening /tree\",\n\t\t\t\tcurrentValue: config.treeFilterMode,\n\t\t\t\tvalues: [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"thinking\",\n\t\t\t\tlabel: \"Thinking level\",\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\n\t\t\t\tcurrentValue: config.thinkingLevel,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Thinking Level\",\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"theme\",\n\t\t\t\tlabel: \"Theme\",\n\t\t\t\tdescription: \"Color theme for the interface\",\n\t\t\t\tcurrentValue: config.currentTheme,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Theme\",\n\t\t\t\t\t\t\"Select color theme\",\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\n\t\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\t\tlabel: t,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// Restore original theme on cancel\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentValue);\n\t\t\t\t\t\t\tdone();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\t// Preview theme on selection change\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t},\n\t\t];\n\n\t\t// Thinking-display toggle for the current model. Only adaptive-thinking\n\t\t// Opus/Sonnet 4.6–4.x and Claude 5 families honor this field.\n\t\t// Shown as on (\"summarized\") by default; off (\"omitted\") hides thinking for lower latency.\n\t\tif (config.thinkingDisplaySupported) {\n\t\t\tconst hideThinkingIndex = items.findIndex((item) => item.id === \"hide-thinking\");\n\t\t\titems.splice(hideThinkingIndex + 1, 0, {\n\t\t\t\tid: \"thinking-display\",\n\t\t\t\tlabel: \"Show thinking summary\",\n\t\t\t\tdescription: \"Show summarized thinking for this model (off hides it for lower latency)\",\n\t\t\t\tcurrentValue: config.thinkingDisplay === \"summarized\" ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t});\n\t\t}\n\n\t\titems.push(\n\t\t\t{\n\t\t\t\tid: \"max-concurrent-subagents\",\n\t\t\t\tlabel: \"Max concurrent subagents\",\n\t\t\t\tdescription: \"Applies to new parent sessions; 0 removes the subagent tool\",\n\t\t\t\tcurrentValue: String(config.maxConcurrentSubagents),\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew TextInputSubmenu(\n\t\t\t\t\t\t\"Max Concurrent Subagents\",\n\t\t\t\t\t\t\"Enter a non-negative whole number. Zero disables subagents in new parent sessions.\",\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tconst normalized = value.trim();\n\t\t\t\t\t\t\tconst parsed = normalized.length > 0 ? Number(normalized) : Number.NaN;\n\t\t\t\t\t\t\tif (callbacks.onMaxConcurrentSubagentsChange(parsed)) done(String(parsed));\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-enabled\",\n\t\t\t\tlabel: \"Dispatch Arbiter\",\n\t\t\t\tdescription: arbiterSettings.model\n\t\t\t\t\t? \"Global-only fail-closed pre-spawn routing (configure model, thinking, and guide below)\"\n\t\t\t\t\t: \"Global-only; choose an arbiter model before enabling\",\n\t\t\t\tcurrentValue: arbiterSettings.enabled === true ? \"true\" : \"false\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter\",\n\t\t\t\t\t\t\"Enable only when the exact model, live scope, and guide are ready; failures do not persist\",\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ value: \"false\", label: \"off\", description: \"Disabled (default)\" },\n\t\t\t\t\t\t\t{ value: \"true\", label: \"on\", description: \"Fail closed before every child spawn\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ enabled: value === \"true\" })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-model\",\n\t\t\t\tlabel: \"Dispatch Arbiter model\",\n\t\t\t\tdescription: \"Exact authenticated provider/model; no fallback\",\n\t\t\t\tcurrentValue: arbiterSettings.model ?? \"not set\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Model\",\n\t\t\t\t\t\t\"Select the exact model used for the tool-less pre-spawn decision\",\n\t\t\t\t\t\tconfig.availableModelIds.map((model) => ({ value: model, label: model })),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ model: value })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-thinking\",\n\t\t\t\tlabel: \"Dispatch Arbiter thinking\",\n\t\t\t\tdescription: \"Reasoning level for the arbiter call; validated against its model\",\n\t\t\t\tcurrentValue: arbiterSettings.thinking ?? \"off\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Thinking\",\n\t\t\t\t\t\t\"Select reasoning depth for the headless arbiter call\",\n\t\t\t\t\t\t([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as ThinkingLevel[]).map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ thinking: value as ThinkingLevel })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-guide\",\n\t\t\t\tlabel: \"Dispatch Arbiter guide\",\n\t\t\t\tdescription: \"Routing-guide path; blank uses ~/.dreb/agent/model-routing-guide.md\",\n\t\t\t\tcurrentValue: arbiterSettings.guidePath ?? \"default\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew TextInputSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Guide Path\",\n\t\t\t\t\t\t\"Enter a path, or leave blank for ~/.dreb/agent/model-routing-guide.md\",\n\t\t\t\t\t\tcurrentValue === \"default\" ? \"\" : currentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tconst guidePath = value.trim();\n\t\t\t\t\t\t\tif (await updateArbiter({ guidePath: guidePath || undefined })) done(guidePath || \"default\");\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t);\n\n\t\t// Single \"Agent Models\" entry that opens the agent picker submenu\n\t\tif (config.agentNames.length > 0) {\n\t\t\titems.push({\n\t\t\t\tid: \"agent-models\",\n\t\t\t\tlabel: \"Agent Models\",\n\t\t\t\tdescription: \"Configure model fallback lists for subagents\",\n\t\t\t\tcurrentValue: \"\",\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew AgentModelsSubmenu(\n\t\t\t\t\t\tconfig.agentNames,\n\t\t\t\t\t\tconfig.agentModels,\n\t\t\t\t\t\tconfig.availableModelIds,\n\t\t\t\t\t\t(agentName, models) => {\n\t\t\t\t\t\t\tcallbacks.onAgentModelsChange(agentName, models);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t});\n\t\t}\n\n\t\t// Only show image toggle if terminal supports it\n\t\tif (supportsImages) {\n\t\t\t// Insert after autocompact\n\t\t\titems.splice(1, 0, {\n\t\t\t\tid: \"show-images\",\n\t\t\t\tlabel: \"Show images\",\n\t\t\t\tdescription: \"Render images inline in terminal\",\n\t\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t});\n\t\t}\n\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\n\t\titems.splice(supportsImages ? 2 : 1, 0, {\n\t\t\tid: \"auto-resize-images\",\n\t\t\tlabel: \"Auto-resize images\",\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Block images toggle (always available, insert after auto-resize-images)\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\n\t\titems.splice(autoResizeIndex + 1, 0, {\n\t\t\tid: \"block-images\",\n\t\t\tlabel: \"Block images\",\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Skill commands toggle (insert after block-images)\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\n\t\titems.splice(blockImagesIndex + 1, 0, {\n\t\t\tid: \"skill-commands\",\n\t\t\tlabel: \"Skill commands\",\n\t\t\tdescription: \"Register skills as /skill:name commands\",\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Hardware cursor toggle (insert after skill-commands)\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"skill-commands\");\n\t\titems.splice(skillCommandsIndex + 1, 0, {\n\t\t\tid: \"show-hardware-cursor\",\n\t\t\tlabel: \"Show hardware cursor\",\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\n\t\t\tid: \"editor-padding\",\n\t\t\tlabel: \"Editor padding\",\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\n\t\t\tcurrentValue: String(config.editorPaddingX),\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\n\t\t});\n\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\n\t\titems.splice(editorPaddingIndex + 1, 0, {\n\t\t\tid: \"autocomplete-max-visible\",\n\t\t\tlabel: \"Autocomplete max items\",\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\n\t\t});\n\n\t\t// Add borders\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\t10,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"autocompact\":\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-load-nested-context\":\n\t\t\t\t\t\tcallbacks.onAutoLoadNestedContextChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-images\":\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-resize-images\":\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"block-images\":\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"skill-commands\":\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"steering-mode\":\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"follow-up-mode\":\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transport\":\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hide-thinking\":\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"thinking-display\":\n\t\t\t\t\t\tcallbacks.onThinkingDisplayChange(newValue === \"true\" ? \"summarized\" : \"omitted\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"quiet-startup\":\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"double-escape-action\":\n\t\t\t\t\t\tcallbacks.onDoubleEscapeActionChange(newValue as \"fork\" | \"tree\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tree-filter-mode\":\n\t\t\t\t\t\tcallbacks.onTreeFilterModeChange(\n\t\t\t\t\t\t\tnewValue as \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-hardware-cursor\":\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"editor-padding\":\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"autocomplete-max-visible\":\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallbacks.onCancel,\n\t\t\t{ enableSearch: true },\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSettingsList(): SettingsList {\n\t\treturn this.settingsList;\n\t}\n}\n"]}
|
|
@@ -400,6 +400,17 @@ export class SettingsSelectorComponent extends Container {
|
|
|
400
400
|
});
|
|
401
401
|
}
|
|
402
402
|
items.push({
|
|
403
|
+
id: "max-concurrent-subagents",
|
|
404
|
+
label: "Max concurrent subagents",
|
|
405
|
+
description: "Applies to new parent sessions; 0 removes the subagent tool",
|
|
406
|
+
currentValue: String(config.maxConcurrentSubagents),
|
|
407
|
+
submenu: (currentValue, done) => new TextInputSubmenu("Max Concurrent Subagents", "Enter a non-negative whole number. Zero disables subagents in new parent sessions.", currentValue, (value) => {
|
|
408
|
+
const normalized = value.trim();
|
|
409
|
+
const parsed = normalized.length > 0 ? Number(normalized) : Number.NaN;
|
|
410
|
+
if (callbacks.onMaxConcurrentSubagentsChange(parsed))
|
|
411
|
+
done(String(parsed));
|
|
412
|
+
}, () => done()),
|
|
413
|
+
}, {
|
|
403
414
|
id: "dispatch-arbiter-enabled",
|
|
404
415
|
label: "Dispatch Arbiter",
|
|
405
416
|
description: arbiterSettings.model
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@dreb/agent-core\";\nimport type { Transport } from \"@dreb/ai\";\nimport {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tgetCapabilities,\n\tgetKeybindings,\n\tInput,\n\ttype RankedItem,\n\tRankedList,\n\ttype RankedListTheme,\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SettingItem,\n\tSettingsList,\n\tSpacer,\n\tText,\n} from \"@dreb/tui\";\nimport type { SubagentArbiterSettings } from \"../../../core/settings-manager.js\";\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SETTINGS_SUBMENU_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\n\toff: \"No reasoning\",\n\tminimal: \"Very brief reasoning (~1k tokens)\",\n\tlow: \"Light reasoning (~2k tokens)\",\n\tmedium: \"Moderate reasoning (~8k tokens)\",\n\thigh: \"Deep reasoning (~16k tokens)\",\n\txhigh: \"Maximum reasoning (~32k tokens)\",\n};\n\nexport interface SettingsConfig {\n\tautoCompact: boolean;\n\tshowImages: boolean;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\tenableSkillCommands: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\ttransport: Transport;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: ThinkingLevel[];\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\t/** Whether the current model supports adaptive thinking (gates the thinking-display toggle). */\n\tthinkingDisplaySupported: boolean;\n\t/** Effective thinking-display value for the current model (\"summarized\" shown as on). */\n\tthinkingDisplay: \"summarized\" | \"omitted\";\n\tdoubleEscapeAction: \"fork\" | \"tree\" | \"none\";\n\ttreeFilterMode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\t/** Whether nested AGENTS.md/CLAUDE.md auto-loading is enabled. */\n\tautoLoadNestedContext: boolean;\n\t/** Per-agent model overrides from agentModels settings */\n\tagentModels: Record<string, string[]>;\n\t/** Known agent names for the mach6 models submenu */\n\tagentNames: string[];\n\t/** Available model IDs for selection in the ranked list */\n\tavailableModelIds: string[];\n\t/** Global-only Dispatch Arbiter policy. */\n\tsubagentArbiter: SubagentArbiterSettings;\n}\n\nexport interface SettingsCallbacks {\n\tonAutoCompactChange: (enabled: boolean) => void;\n\tonShowImagesChange: (enabled: boolean) => void;\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\n\tonBlockImagesChange: (blocked: boolean) => void;\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonTransportChange: (transport: Transport) => void;\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\n\tonThemeChange: (theme: string) => void;\n\tonThemePreview?: (theme: string) => void;\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\n\tonThinkingDisplayChange: (display: \"summarized\" | \"omitted\") => void;\n\tonDoubleEscapeActionChange: (action: \"fork\" | \"tree\" | \"none\") => void;\n\tonTreeFilterModeChange: (mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\") => void;\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\n\tonEditorPaddingXChange: (padding: number) => void;\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\n\tonQuietStartupChange: (enabled: boolean) => void;\n\tonAutoLoadNestedContextChange: (enabled: boolean) => void;\n\tonAgentModelsChange: (agentName: string, models: string[]) => void;\n\tonSubagentArbiterChange: (settings: SubagentArbiterSettings) => boolean | Promise<boolean>;\n\tonCancel: () => void;\n}\n\n/**\n * A submenu component for selecting from a list of options.\n */\nclass SelectSubmenu extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\toptions: SelectItem[],\n\t\tcurrentValue: string,\n\t\tonSelect: (value: string) => void,\n\t\tonCancel: () => void,\n\t\tonSelectionChange?: (value: string) => void,\n\t) {\n\t\tsuper();\n\n\t\t// Title\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\n\t\t// Description\n\t\tif (description) {\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\t}\n\n\t\t// Spacer\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Select list\n\t\tthis.selectList = new SelectList(\n\t\t\toptions,\n\t\t\tMath.min(options.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\t// Pre-select current value\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = onCancel;\n\n\t\tif (onSelectionChange) {\n\t\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\t\tonSelectionChange(item.value);\n\t\t\t};\n\t\t}\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · Esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n\nclass TextInputSubmenu extends Container implements Focusable {\n\tprivate readonly input = new Input();\n\tprivate readonly onSubmit: (value: string) => void;\n\tprivate readonly onCancel: () => void;\n\tprivate _focused = false;\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\tcurrentValue: string,\n\t\tonSubmit: (value: string) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tsuper();\n\t\tthis.onSubmit = onSubmit;\n\t\tthis.onCancel = onCancel;\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.input.setValue(currentValue);\n\t\tthis.addChild(this.input);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to save · Esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(data, \"tui.select.confirm\") || data === \"\\n\") this.onSubmit(this.input.getValue());\n\t\telse if (kb.matches(data, \"tui.select.cancel\")) this.onCancel();\n\t\telse this.input.handleInput(data);\n\t}\n}\n\nfunction getRankedListTheme(): RankedListTheme {\n\treturn {\n\t\tselectedText: (t: string) => theme.bold(t),\n\t\trank: (t: string) => theme.fg(\"muted\", t),\n\t\tdescription: (t: string) => theme.fg(\"dim\", t),\n\t\thint: (t: string) => theme.fg(\"dim\", t),\n\t\tempty: (t: string) => theme.fg(\"dim\", t),\n\t};\n}\n\n/**\n * Top-level Mach6 Models submenu. Shows a list of agents, selecting one opens\n * a RankedList editor for that agent's model fallback list.\n *\n * Navigation: Agent list → RankedList → (optional) Add Model picker\n */\nexport class AgentModelsSubmenu implements Component {\n\tprivate agentList: SelectList;\n\tprivate rankedList: RankedList | null = null;\n\tprivate addList: SelectList | null = null;\n\tprivate addListSearchQuery = \"\";\n\t// Transient notice shown in the ranked view when an add was attempted but no\n\t// models are available to add. Cleared on the next ranked-view input.\n\tprivate rankedNotice: string | null = null;\n\tprivate activeView: \"agents\" | \"ranked\" | \"add\" = \"agents\";\n\tprivate currentAgentName: string | null = null;\n\tprivate agentNames: string[];\n\tprivate agentModels: Record<string, string[]>;\n\tprivate availableModelIds: string[];\n\tprivate onModelsChange: (agentName: string, models: string[]) => void;\n\tprivate onCancel: () => void;\n\n\tconstructor(\n\t\tagentNames: string[],\n\t\tagentModels: Record<string, string[]>,\n\t\tavailableModelIds: string[],\n\t\tonModelsChange: (agentName: string, models: string[]) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tthis.agentNames = agentNames;\n\t\tthis.agentModels = agentModels;\n\t\tthis.availableModelIds = availableModelIds;\n\t\tthis.onModelsChange = onModelsChange;\n\t\tthis.onCancel = onCancel;\n\n\t\tthis.agentList = this.buildAgentList();\n\t}\n\n\tprivate buildAgentList(): SelectList {\n\t\tconst agentItems: SelectItem[] = this.agentNames.map((name) => {\n\t\t\tconst models = this.agentModels[name];\n\t\t\tconst desc = models && models.length > 0 ? models.join(\", \") : \"default\";\n\t\t\treturn { value: name, label: name, description: desc };\n\t\t});\n\n\t\tconst list = new SelectList(agentItems, Math.min(agentItems.length, 12), getSelectListTheme(), {\n\t\t\tminPrimaryColumnWidth: 20,\n\t\t\tmaxPrimaryColumnWidth: 30,\n\t\t});\n\n\t\tlist.onSelect = (item) => {\n\t\t\tthis.openRankedList(item.value);\n\t\t};\n\n\t\tlist.onCancel = this.onCancel;\n\t\treturn list;\n\t}\n\n\tprivate openRankedList(agentName: string): void {\n\t\tthis.currentAgentName = agentName;\n\t\tconst currentModels = this.agentModels[agentName] ?? [];\n\t\tconst items: RankedItem[] = currentModels.map((m) => ({ value: m, label: m }));\n\t\tthis.rankedList = new RankedList(items, 10, getRankedListTheme());\n\n\t\tthis.rankedList.onReorder = (reorderedItems) => {\n\t\t\tthis.saveModels(\n\t\t\t\tagentName,\n\t\t\t\treorderedItems.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.rankedList.onRemove = (_removed, remaining) => {\n\t\t\tthis.saveModels(\n\t\t\t\tagentName,\n\t\t\t\tremaining.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.rankedList.onSelect = () => {\n\t\t\tthis.openAddModelPicker();\n\t\t};\n\n\t\tthis.rankedList.onCancel = () => {\n\t\t\tthis.rankedList = null;\n\t\t\tthis.currentAgentName = null;\n\t\t\tthis.activeView = \"agents\";\n\t\t\t// Rebuild agent list so descriptions reflect any changes made\n\t\t\tthis.agentList = this.buildAgentList();\n\t\t};\n\n\t\tthis.activeView = \"ranked\";\n\t}\n\n\tprivate openAddModelPicker(): void {\n\t\tif (!this.rankedList) return;\n\n\t\tconst existingValues = new Set(this.rankedList.getItems().map((i) => i.value));\n\t\tconst allOptions = this.availableModelIds\n\t\t\t.filter((m) => !existingValues.has(m))\n\t\t\t.map((m) => ({ value: m, label: m }));\n\n\t\tif (allOptions.length === 0) {\n\t\t\t// Don't silently swallow the \"add\" intent — tell the user why nothing happened.\n\t\t\tthis.rankedNotice =\n\t\t\t\tthis.availableModelIds.length === 0\n\t\t\t\t\t? \"No models available to add (no authenticated providers)\"\n\t\t\t\t\t: \"All available models are already in the list\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.addList = new SelectList(\n\t\t\tallOptions,\n\t\t\tMath.min(allOptions.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\tthis.addListSearchQuery = \"\";\n\n\t\tthis.addList.onSelect = (item) => {\n\t\t\tif (!this.rankedList || !this.currentAgentName) return;\n\t\t\tconst newItems = [...this.rankedList.getItems(), { value: item.value, label: item.value }];\n\t\t\tthis.rankedList.setItems(newItems);\n\t\t\tthis.addList = null;\n\t\t\tthis.addListSearchQuery = \"\";\n\t\t\tthis.activeView = \"ranked\";\n\t\t\tthis.saveModels(\n\t\t\t\tthis.currentAgentName,\n\t\t\t\tnewItems.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.addList.onCancel = () => {\n\t\t\tthis.addList = null;\n\t\t\tthis.addListSearchQuery = \"\";\n\t\t\tthis.activeView = \"ranked\";\n\t\t};\n\n\t\tthis.activeView = \"add\";\n\t}\n\n\tprivate saveModels(agentName: string, models: string[]): void {\n\t\tthis.agentModels[agentName] = models;\n\t\tthis.onModelsChange(agentName, models);\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\n\t\tif (this.activeView === \"add\" && this.addList) {\n\t\t\tlines.push(theme.bold(theme.fg(\"accent\", \"Add Model\")));\n\t\t\tlines.push(\"\");\n\t\t\tconst searchDisplay = this.addListSearchQuery\n\t\t\t\t? ` Search: ${this.addListSearchQuery}▋`\n\t\t\t\t: theme.fg(\"dim\", \" Type to filter · ↑↓: navigate · Enter: add · Esc: back\");\n\t\t\tlines.push(searchDisplay);\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...this.addList.render(width));\n\t\t\treturn lines;\n\t\t}\n\n\t\tif (this.activeView === \"ranked\" && this.rankedList && this.currentAgentName) {\n\t\t\tlines.push(theme.bold(theme.fg(\"accent\", `Agent Models › ${this.currentAgentName}`)));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(theme.fg(\"muted\", \"Configure model fallback priority (first = preferred)\"));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...this.rankedList.render(width));\n\t\t\tif (this.rankedNotice) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tlines.push(theme.fg(\"warning\", ` ${this.rankedNotice}`));\n\t\t\t}\n\t\t\treturn lines;\n\t\t}\n\n\t\t// Default: agent list\n\t\tlines.push(theme.bold(theme.fg(\"accent\", \"Agent Models\")));\n\t\tlines.push(\"\");\n\t\tlines.push(theme.fg(\"muted\", \"Select an agent to configure its model fallback list\"));\n\t\tlines.push(\"\");\n\t\tlines.push(...this.agentList.render(width));\n\t\tlines.push(\"\");\n\t\tlines.push(theme.fg(\"dim\", \" Enter to configure · Esc to go back\"));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.activeView === \"add\" && this.addList) {\n\t\t\tconst kb = getKeybindings();\n\t\t\tif (\n\t\t\t\tkb.matches(data, \"tui.select.cancel\") ||\n\t\t\t\tkb.matches(data, \"tui.select.up\") ||\n\t\t\t\tkb.matches(data, \"tui.select.down\") ||\n\t\t\t\tkb.matches(data, \"tui.select.confirm\")\n\t\t\t) {\n\t\t\t\tthis.addList.handleInput(data);\n\t\t\t} else if (data === \"\\x7f\" || data === \"\\x08\") {\n\t\t\t\t// Backspace — remove last char from search\n\t\t\t\tthis.addListSearchQuery = this.addListSearchQuery.slice(0, -1);\n\t\t\t\tthis.addList.setFilter(this.addListSearchQuery);\n\t\t\t} else if (data.length === 1 && data >= \" \") {\n\t\t\t\t// Printable char — add to search\n\t\t\t\tthis.addListSearchQuery += data;\n\t\t\t\tthis.addList.setFilter(this.addListSearchQuery);\n\t\t\t}\n\t\t} else if (this.activeView === \"ranked\" && this.rankedList) {\n\t\t\t// Clear any stale \"nothing to add\" notice; openAddModelPicker re-sets it\n\t\t\t// if this input is another failed add attempt.\n\t\t\tthis.rankedNotice = null;\n\t\t\tthis.rankedList.handleInput(data);\n\t\t} else {\n\t\t\tthis.agentList.handleInput(data);\n\t\t}\n\t}\n}\n\n/**\n * Main settings selector component.\n */\nexport class SettingsSelectorComponent extends Container {\n\tprivate settingsList: SettingsList;\n\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n\t\tsuper();\n\n\t\tconst supportsImages = getCapabilities().images;\n\t\tlet arbiterSettings = { ...config.subagentArbiter };\n\t\tconst updateArbiter = async (patch: Partial<SubagentArbiterSettings>): Promise<boolean> => {\n\t\t\tconst next = { ...arbiterSettings, ...patch };\n\t\t\tif (!(await callbacks.onSubagentArbiterChange(next))) return false;\n\t\t\tarbiterSettings = next;\n\t\t\treturn true;\n\t\t};\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"autocompact\",\n\t\t\t\tlabel: \"Auto-compact\",\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"auto-load-nested-context\",\n\t\t\t\tlabel: \"Unrestricted nested context loading (expert)\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"OFF by default. Expert-only: automatically loads AGENTS.md/CLAUDE.md from every tool target; untrusted files can contain prompt injection.\",\n\t\t\t\tcurrentValue: config.autoLoadNestedContext ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"steering-mode\",\n\t\t\t\tlabel: \"Steering mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.steeringMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"follow-up-mode\",\n\t\t\t\tlabel: \"Follow-up mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.followUpMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"transport\",\n\t\t\t\tlabel: \"Transport\",\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\n\t\t\t\tcurrentValue: config.transport,\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"auto\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"hide-thinking\",\n\t\t\t\tlabel: \"Hide thinking\",\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"quiet-startup\",\n\t\t\t\tlabel: \"Quiet startup\",\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"double-escape-action\",\n\t\t\t\tlabel: \"Double-escape action\",\n\t\t\t\tdescription: \"Action when pressing Escape twice with empty editor\",\n\t\t\t\tcurrentValue: config.doubleEscapeAction,\n\t\t\t\tvalues: [\"tree\", \"fork\", \"none\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"tree-filter-mode\",\n\t\t\t\tlabel: \"Tree filter mode\",\n\t\t\t\tdescription: \"Default filter when opening /tree\",\n\t\t\t\tcurrentValue: config.treeFilterMode,\n\t\t\t\tvalues: [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"thinking\",\n\t\t\t\tlabel: \"Thinking level\",\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\n\t\t\t\tcurrentValue: config.thinkingLevel,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Thinking Level\",\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"theme\",\n\t\t\t\tlabel: \"Theme\",\n\t\t\t\tdescription: \"Color theme for the interface\",\n\t\t\t\tcurrentValue: config.currentTheme,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Theme\",\n\t\t\t\t\t\t\"Select color theme\",\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\n\t\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\t\tlabel: t,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// Restore original theme on cancel\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentValue);\n\t\t\t\t\t\t\tdone();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\t// Preview theme on selection change\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t},\n\t\t];\n\n\t\t// Thinking-display toggle for the current model. Only adaptive-thinking\n\t\t// Opus/Sonnet 4.6–4.x and Claude 5 families honor this field.\n\t\t// Shown as on (\"summarized\") by default; off (\"omitted\") hides thinking for lower latency.\n\t\tif (config.thinkingDisplaySupported) {\n\t\t\tconst hideThinkingIndex = items.findIndex((item) => item.id === \"hide-thinking\");\n\t\t\titems.splice(hideThinkingIndex + 1, 0, {\n\t\t\t\tid: \"thinking-display\",\n\t\t\t\tlabel: \"Show thinking summary\",\n\t\t\t\tdescription: \"Show summarized thinking for this model (off hides it for lower latency)\",\n\t\t\t\tcurrentValue: config.thinkingDisplay === \"summarized\" ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t});\n\t\t}\n\n\t\titems.push(\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-enabled\",\n\t\t\t\tlabel: \"Dispatch Arbiter\",\n\t\t\t\tdescription: arbiterSettings.model\n\t\t\t\t\t? \"Global-only fail-closed pre-spawn routing (configure model, thinking, and guide below)\"\n\t\t\t\t\t: \"Global-only; choose an arbiter model before enabling\",\n\t\t\t\tcurrentValue: arbiterSettings.enabled === true ? \"true\" : \"false\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter\",\n\t\t\t\t\t\t\"Enable only when the exact model, live scope, and guide are ready; failures do not persist\",\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ value: \"false\", label: \"off\", description: \"Disabled (default)\" },\n\t\t\t\t\t\t\t{ value: \"true\", label: \"on\", description: \"Fail closed before every child spawn\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ enabled: value === \"true\" })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-model\",\n\t\t\t\tlabel: \"Dispatch Arbiter model\",\n\t\t\t\tdescription: \"Exact authenticated provider/model; no fallback\",\n\t\t\t\tcurrentValue: arbiterSettings.model ?? \"not set\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Model\",\n\t\t\t\t\t\t\"Select the exact model used for the tool-less pre-spawn decision\",\n\t\t\t\t\t\tconfig.availableModelIds.map((model) => ({ value: model, label: model })),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ model: value })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-thinking\",\n\t\t\t\tlabel: \"Dispatch Arbiter thinking\",\n\t\t\t\tdescription: \"Reasoning level for the arbiter call; validated against its model\",\n\t\t\t\tcurrentValue: arbiterSettings.thinking ?? \"off\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Thinking\",\n\t\t\t\t\t\t\"Select reasoning depth for the headless arbiter call\",\n\t\t\t\t\t\t([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as ThinkingLevel[]).map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ thinking: value as ThinkingLevel })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-guide\",\n\t\t\t\tlabel: \"Dispatch Arbiter guide\",\n\t\t\t\tdescription: \"Routing-guide path; blank uses ~/.dreb/agent/model-routing-guide.md\",\n\t\t\t\tcurrentValue: arbiterSettings.guidePath ?? \"default\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew TextInputSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Guide Path\",\n\t\t\t\t\t\t\"Enter a path, or leave blank for ~/.dreb/agent/model-routing-guide.md\",\n\t\t\t\t\t\tcurrentValue === \"default\" ? \"\" : currentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tconst guidePath = value.trim();\n\t\t\t\t\t\t\tif (await updateArbiter({ guidePath: guidePath || undefined })) done(guidePath || \"default\");\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t);\n\n\t\t// Single \"Agent Models\" entry that opens the agent picker submenu\n\t\tif (config.agentNames.length > 0) {\n\t\t\titems.push({\n\t\t\t\tid: \"agent-models\",\n\t\t\t\tlabel: \"Agent Models\",\n\t\t\t\tdescription: \"Configure model fallback lists for subagents\",\n\t\t\t\tcurrentValue: \"\",\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew AgentModelsSubmenu(\n\t\t\t\t\t\tconfig.agentNames,\n\t\t\t\t\t\tconfig.agentModels,\n\t\t\t\t\t\tconfig.availableModelIds,\n\t\t\t\t\t\t(agentName, models) => {\n\t\t\t\t\t\t\tcallbacks.onAgentModelsChange(agentName, models);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t});\n\t\t}\n\n\t\t// Only show image toggle if terminal supports it\n\t\tif (supportsImages) {\n\t\t\t// Insert after autocompact\n\t\t\titems.splice(1, 0, {\n\t\t\t\tid: \"show-images\",\n\t\t\t\tlabel: \"Show images\",\n\t\t\t\tdescription: \"Render images inline in terminal\",\n\t\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t});\n\t\t}\n\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\n\t\titems.splice(supportsImages ? 2 : 1, 0, {\n\t\t\tid: \"auto-resize-images\",\n\t\t\tlabel: \"Auto-resize images\",\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Block images toggle (always available, insert after auto-resize-images)\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\n\t\titems.splice(autoResizeIndex + 1, 0, {\n\t\t\tid: \"block-images\",\n\t\t\tlabel: \"Block images\",\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Skill commands toggle (insert after block-images)\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\n\t\titems.splice(blockImagesIndex + 1, 0, {\n\t\t\tid: \"skill-commands\",\n\t\t\tlabel: \"Skill commands\",\n\t\t\tdescription: \"Register skills as /skill:name commands\",\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Hardware cursor toggle (insert after skill-commands)\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"skill-commands\");\n\t\titems.splice(skillCommandsIndex + 1, 0, {\n\t\t\tid: \"show-hardware-cursor\",\n\t\t\tlabel: \"Show hardware cursor\",\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\n\t\t\tid: \"editor-padding\",\n\t\t\tlabel: \"Editor padding\",\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\n\t\t\tcurrentValue: String(config.editorPaddingX),\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\n\t\t});\n\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\n\t\titems.splice(editorPaddingIndex + 1, 0, {\n\t\t\tid: \"autocomplete-max-visible\",\n\t\t\tlabel: \"Autocomplete max items\",\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\n\t\t});\n\n\t\t// Add borders\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\t10,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"autocompact\":\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-load-nested-context\":\n\t\t\t\t\t\tcallbacks.onAutoLoadNestedContextChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-images\":\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-resize-images\":\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"block-images\":\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"skill-commands\":\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"steering-mode\":\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"follow-up-mode\":\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transport\":\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hide-thinking\":\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"thinking-display\":\n\t\t\t\t\t\tcallbacks.onThinkingDisplayChange(newValue === \"true\" ? \"summarized\" : \"omitted\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"quiet-startup\":\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"double-escape-action\":\n\t\t\t\t\t\tcallbacks.onDoubleEscapeActionChange(newValue as \"fork\" | \"tree\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tree-filter-mode\":\n\t\t\t\t\t\tcallbacks.onTreeFilterModeChange(\n\t\t\t\t\t\t\tnewValue as \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-hardware-cursor\":\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"editor-padding\":\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"autocomplete-max-visible\":\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallbacks.onCancel,\n\t\t\t{ enableSearch: true },\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSettingsList(): SettingsList {\n\t\treturn this.settingsList;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"settings-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@dreb/agent-core\";\nimport type { Transport } from \"@dreb/ai\";\nimport {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tgetCapabilities,\n\tgetKeybindings,\n\tInput,\n\ttype RankedItem,\n\tRankedList,\n\ttype RankedListTheme,\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SettingItem,\n\tSettingsList,\n\tSpacer,\n\tText,\n} from \"@dreb/tui\";\nimport type { SubagentArbiterSettings } from \"../../../core/settings-manager.js\";\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SETTINGS_SUBMENU_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\n\toff: \"No reasoning\",\n\tminimal: \"Very brief reasoning (~1k tokens)\",\n\tlow: \"Light reasoning (~2k tokens)\",\n\tmedium: \"Moderate reasoning (~8k tokens)\",\n\thigh: \"Deep reasoning (~16k tokens)\",\n\txhigh: \"Maximum reasoning (~32k tokens)\",\n};\n\nexport interface SettingsConfig {\n\tautoCompact: boolean;\n\tshowImages: boolean;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\tenableSkillCommands: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\ttransport: Transport;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: ThinkingLevel[];\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\t/** Whether the current model supports adaptive thinking (gates the thinking-display toggle). */\n\tthinkingDisplaySupported: boolean;\n\t/** Effective thinking-display value for the current model (\"summarized\" shown as on). */\n\tthinkingDisplay: \"summarized\" | \"omitted\";\n\tdoubleEscapeAction: \"fork\" | \"tree\" | \"none\";\n\ttreeFilterMode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\t/** Whether nested AGENTS.md/CLAUDE.md auto-loading is enabled. */\n\tautoLoadNestedContext: boolean;\n\t/** Maximum children a new parent session may run concurrently; zero disables subagents. */\n\tmaxConcurrentSubagents: number;\n\t/** Per-agent model overrides from agentModels settings */\n\tagentModels: Record<string, string[]>;\n\t/** Known agent names for the mach6 models submenu */\n\tagentNames: string[];\n\t/** Available model IDs for selection in the ranked list */\n\tavailableModelIds: string[];\n\t/** Global-only Dispatch Arbiter policy. */\n\tsubagentArbiter: SubagentArbiterSettings;\n}\n\nexport interface SettingsCallbacks {\n\tonAutoCompactChange: (enabled: boolean) => void;\n\tonShowImagesChange: (enabled: boolean) => void;\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\n\tonBlockImagesChange: (blocked: boolean) => void;\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonTransportChange: (transport: Transport) => void;\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\n\tonThemeChange: (theme: string) => void;\n\tonThemePreview?: (theme: string) => void;\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\n\tonThinkingDisplayChange: (display: \"summarized\" | \"omitted\") => void;\n\tonDoubleEscapeActionChange: (action: \"fork\" | \"tree\" | \"none\") => void;\n\tonTreeFilterModeChange: (mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\") => void;\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\n\tonEditorPaddingXChange: (padding: number) => void;\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\n\tonQuietStartupChange: (enabled: boolean) => void;\n\tonAutoLoadNestedContextChange: (enabled: boolean) => void;\n\tonMaxConcurrentSubagentsChange: (value: number) => boolean;\n\tonAgentModelsChange: (agentName: string, models: string[]) => void;\n\tonSubagentArbiterChange: (settings: SubagentArbiterSettings) => boolean | Promise<boolean>;\n\tonCancel: () => void;\n}\n\n/**\n * A submenu component for selecting from a list of options.\n */\nclass SelectSubmenu extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\toptions: SelectItem[],\n\t\tcurrentValue: string,\n\t\tonSelect: (value: string) => void,\n\t\tonCancel: () => void,\n\t\tonSelectionChange?: (value: string) => void,\n\t) {\n\t\tsuper();\n\n\t\t// Title\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\n\t\t// Description\n\t\tif (description) {\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\t}\n\n\t\t// Spacer\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Select list\n\t\tthis.selectList = new SelectList(\n\t\t\toptions,\n\t\t\tMath.min(options.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\t// Pre-select current value\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = onCancel;\n\n\t\tif (onSelectionChange) {\n\t\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\t\tonSelectionChange(item.value);\n\t\t\t};\n\t\t}\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · Esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n\nclass TextInputSubmenu extends Container implements Focusable {\n\tprivate readonly input = new Input();\n\tprivate readonly onSubmit: (value: string) => void;\n\tprivate readonly onCancel: () => void;\n\tprivate _focused = false;\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\tcurrentValue: string,\n\t\tonSubmit: (value: string) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tsuper();\n\t\tthis.onSubmit = onSubmit;\n\t\tthis.onCancel = onCancel;\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.input.setValue(currentValue);\n\t\tthis.addChild(this.input);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to save · Esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(data, \"tui.select.confirm\") || data === \"\\n\") this.onSubmit(this.input.getValue());\n\t\telse if (kb.matches(data, \"tui.select.cancel\")) this.onCancel();\n\t\telse this.input.handleInput(data);\n\t}\n}\n\nfunction getRankedListTheme(): RankedListTheme {\n\treturn {\n\t\tselectedText: (t: string) => theme.bold(t),\n\t\trank: (t: string) => theme.fg(\"muted\", t),\n\t\tdescription: (t: string) => theme.fg(\"dim\", t),\n\t\thint: (t: string) => theme.fg(\"dim\", t),\n\t\tempty: (t: string) => theme.fg(\"dim\", t),\n\t};\n}\n\n/**\n * Top-level Mach6 Models submenu. Shows a list of agents, selecting one opens\n * a RankedList editor for that agent's model fallback list.\n *\n * Navigation: Agent list → RankedList → (optional) Add Model picker\n */\nexport class AgentModelsSubmenu implements Component {\n\tprivate agentList: SelectList;\n\tprivate rankedList: RankedList | null = null;\n\tprivate addList: SelectList | null = null;\n\tprivate addListSearchQuery = \"\";\n\t// Transient notice shown in the ranked view when an add was attempted but no\n\t// models are available to add. Cleared on the next ranked-view input.\n\tprivate rankedNotice: string | null = null;\n\tprivate activeView: \"agents\" | \"ranked\" | \"add\" = \"agents\";\n\tprivate currentAgentName: string | null = null;\n\tprivate agentNames: string[];\n\tprivate agentModels: Record<string, string[]>;\n\tprivate availableModelIds: string[];\n\tprivate onModelsChange: (agentName: string, models: string[]) => void;\n\tprivate onCancel: () => void;\n\n\tconstructor(\n\t\tagentNames: string[],\n\t\tagentModels: Record<string, string[]>,\n\t\tavailableModelIds: string[],\n\t\tonModelsChange: (agentName: string, models: string[]) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tthis.agentNames = agentNames;\n\t\tthis.agentModels = agentModels;\n\t\tthis.availableModelIds = availableModelIds;\n\t\tthis.onModelsChange = onModelsChange;\n\t\tthis.onCancel = onCancel;\n\n\t\tthis.agentList = this.buildAgentList();\n\t}\n\n\tprivate buildAgentList(): SelectList {\n\t\tconst agentItems: SelectItem[] = this.agentNames.map((name) => {\n\t\t\tconst models = this.agentModels[name];\n\t\t\tconst desc = models && models.length > 0 ? models.join(\", \") : \"default\";\n\t\t\treturn { value: name, label: name, description: desc };\n\t\t});\n\n\t\tconst list = new SelectList(agentItems, Math.min(agentItems.length, 12), getSelectListTheme(), {\n\t\t\tminPrimaryColumnWidth: 20,\n\t\t\tmaxPrimaryColumnWidth: 30,\n\t\t});\n\n\t\tlist.onSelect = (item) => {\n\t\t\tthis.openRankedList(item.value);\n\t\t};\n\n\t\tlist.onCancel = this.onCancel;\n\t\treturn list;\n\t}\n\n\tprivate openRankedList(agentName: string): void {\n\t\tthis.currentAgentName = agentName;\n\t\tconst currentModels = this.agentModels[agentName] ?? [];\n\t\tconst items: RankedItem[] = currentModels.map((m) => ({ value: m, label: m }));\n\t\tthis.rankedList = new RankedList(items, 10, getRankedListTheme());\n\n\t\tthis.rankedList.onReorder = (reorderedItems) => {\n\t\t\tthis.saveModels(\n\t\t\t\tagentName,\n\t\t\t\treorderedItems.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.rankedList.onRemove = (_removed, remaining) => {\n\t\t\tthis.saveModels(\n\t\t\t\tagentName,\n\t\t\t\tremaining.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.rankedList.onSelect = () => {\n\t\t\tthis.openAddModelPicker();\n\t\t};\n\n\t\tthis.rankedList.onCancel = () => {\n\t\t\tthis.rankedList = null;\n\t\t\tthis.currentAgentName = null;\n\t\t\tthis.activeView = \"agents\";\n\t\t\t// Rebuild agent list so descriptions reflect any changes made\n\t\t\tthis.agentList = this.buildAgentList();\n\t\t};\n\n\t\tthis.activeView = \"ranked\";\n\t}\n\n\tprivate openAddModelPicker(): void {\n\t\tif (!this.rankedList) return;\n\n\t\tconst existingValues = new Set(this.rankedList.getItems().map((i) => i.value));\n\t\tconst allOptions = this.availableModelIds\n\t\t\t.filter((m) => !existingValues.has(m))\n\t\t\t.map((m) => ({ value: m, label: m }));\n\n\t\tif (allOptions.length === 0) {\n\t\t\t// Don't silently swallow the \"add\" intent — tell the user why nothing happened.\n\t\t\tthis.rankedNotice =\n\t\t\t\tthis.availableModelIds.length === 0\n\t\t\t\t\t? \"No models available to add (no authenticated providers)\"\n\t\t\t\t\t: \"All available models are already in the list\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.addList = new SelectList(\n\t\t\tallOptions,\n\t\t\tMath.min(allOptions.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\tthis.addListSearchQuery = \"\";\n\n\t\tthis.addList.onSelect = (item) => {\n\t\t\tif (!this.rankedList || !this.currentAgentName) return;\n\t\t\tconst newItems = [...this.rankedList.getItems(), { value: item.value, label: item.value }];\n\t\t\tthis.rankedList.setItems(newItems);\n\t\t\tthis.addList = null;\n\t\t\tthis.addListSearchQuery = \"\";\n\t\t\tthis.activeView = \"ranked\";\n\t\t\tthis.saveModels(\n\t\t\t\tthis.currentAgentName,\n\t\t\t\tnewItems.map((i) => i.value),\n\t\t\t);\n\t\t};\n\n\t\tthis.addList.onCancel = () => {\n\t\t\tthis.addList = null;\n\t\t\tthis.addListSearchQuery = \"\";\n\t\t\tthis.activeView = \"ranked\";\n\t\t};\n\n\t\tthis.activeView = \"add\";\n\t}\n\n\tprivate saveModels(agentName: string, models: string[]): void {\n\t\tthis.agentModels[agentName] = models;\n\t\tthis.onModelsChange(agentName, models);\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\n\t\tif (this.activeView === \"add\" && this.addList) {\n\t\t\tlines.push(theme.bold(theme.fg(\"accent\", \"Add Model\")));\n\t\t\tlines.push(\"\");\n\t\t\tconst searchDisplay = this.addListSearchQuery\n\t\t\t\t? ` Search: ${this.addListSearchQuery}▋`\n\t\t\t\t: theme.fg(\"dim\", \" Type to filter · ↑↓: navigate · Enter: add · Esc: back\");\n\t\t\tlines.push(searchDisplay);\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...this.addList.render(width));\n\t\t\treturn lines;\n\t\t}\n\n\t\tif (this.activeView === \"ranked\" && this.rankedList && this.currentAgentName) {\n\t\t\tlines.push(theme.bold(theme.fg(\"accent\", `Agent Models › ${this.currentAgentName}`)));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(theme.fg(\"muted\", \"Configure model fallback priority (first = preferred)\"));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...this.rankedList.render(width));\n\t\t\tif (this.rankedNotice) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tlines.push(theme.fg(\"warning\", ` ${this.rankedNotice}`));\n\t\t\t}\n\t\t\treturn lines;\n\t\t}\n\n\t\t// Default: agent list\n\t\tlines.push(theme.bold(theme.fg(\"accent\", \"Agent Models\")));\n\t\tlines.push(\"\");\n\t\tlines.push(theme.fg(\"muted\", \"Select an agent to configure its model fallback list\"));\n\t\tlines.push(\"\");\n\t\tlines.push(...this.agentList.render(width));\n\t\tlines.push(\"\");\n\t\tlines.push(theme.fg(\"dim\", \" Enter to configure · Esc to go back\"));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.activeView === \"add\" && this.addList) {\n\t\t\tconst kb = getKeybindings();\n\t\t\tif (\n\t\t\t\tkb.matches(data, \"tui.select.cancel\") ||\n\t\t\t\tkb.matches(data, \"tui.select.up\") ||\n\t\t\t\tkb.matches(data, \"tui.select.down\") ||\n\t\t\t\tkb.matches(data, \"tui.select.confirm\")\n\t\t\t) {\n\t\t\t\tthis.addList.handleInput(data);\n\t\t\t} else if (data === \"\\x7f\" || data === \"\\x08\") {\n\t\t\t\t// Backspace — remove last char from search\n\t\t\t\tthis.addListSearchQuery = this.addListSearchQuery.slice(0, -1);\n\t\t\t\tthis.addList.setFilter(this.addListSearchQuery);\n\t\t\t} else if (data.length === 1 && data >= \" \") {\n\t\t\t\t// Printable char — add to search\n\t\t\t\tthis.addListSearchQuery += data;\n\t\t\t\tthis.addList.setFilter(this.addListSearchQuery);\n\t\t\t}\n\t\t} else if (this.activeView === \"ranked\" && this.rankedList) {\n\t\t\t// Clear any stale \"nothing to add\" notice; openAddModelPicker re-sets it\n\t\t\t// if this input is another failed add attempt.\n\t\t\tthis.rankedNotice = null;\n\t\t\tthis.rankedList.handleInput(data);\n\t\t} else {\n\t\t\tthis.agentList.handleInput(data);\n\t\t}\n\t}\n}\n\n/**\n * Main settings selector component.\n */\nexport class SettingsSelectorComponent extends Container {\n\tprivate settingsList: SettingsList;\n\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n\t\tsuper();\n\n\t\tconst supportsImages = getCapabilities().images;\n\t\tlet arbiterSettings = { ...config.subagentArbiter };\n\t\tconst updateArbiter = async (patch: Partial<SubagentArbiterSettings>): Promise<boolean> => {\n\t\t\tconst next = { ...arbiterSettings, ...patch };\n\t\t\tif (!(await callbacks.onSubagentArbiterChange(next))) return false;\n\t\t\tarbiterSettings = next;\n\t\t\treturn true;\n\t\t};\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"autocompact\",\n\t\t\t\tlabel: \"Auto-compact\",\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"auto-load-nested-context\",\n\t\t\t\tlabel: \"Unrestricted nested context loading (expert)\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"OFF by default. Expert-only: automatically loads AGENTS.md/CLAUDE.md from every tool target; untrusted files can contain prompt injection.\",\n\t\t\t\tcurrentValue: config.autoLoadNestedContext ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"steering-mode\",\n\t\t\t\tlabel: \"Steering mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.steeringMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"follow-up-mode\",\n\t\t\t\tlabel: \"Follow-up mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.followUpMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"transport\",\n\t\t\t\tlabel: \"Transport\",\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\n\t\t\t\tcurrentValue: config.transport,\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"auto\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"hide-thinking\",\n\t\t\t\tlabel: \"Hide thinking\",\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"quiet-startup\",\n\t\t\t\tlabel: \"Quiet startup\",\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"double-escape-action\",\n\t\t\t\tlabel: \"Double-escape action\",\n\t\t\t\tdescription: \"Action when pressing Escape twice with empty editor\",\n\t\t\t\tcurrentValue: config.doubleEscapeAction,\n\t\t\t\tvalues: [\"tree\", \"fork\", \"none\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"tree-filter-mode\",\n\t\t\t\tlabel: \"Tree filter mode\",\n\t\t\t\tdescription: \"Default filter when opening /tree\",\n\t\t\t\tcurrentValue: config.treeFilterMode,\n\t\t\t\tvalues: [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"thinking\",\n\t\t\t\tlabel: \"Thinking level\",\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\n\t\t\t\tcurrentValue: config.thinkingLevel,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Thinking Level\",\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"theme\",\n\t\t\t\tlabel: \"Theme\",\n\t\t\t\tdescription: \"Color theme for the interface\",\n\t\t\t\tcurrentValue: config.currentTheme,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Theme\",\n\t\t\t\t\t\t\"Select color theme\",\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\n\t\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\t\tlabel: t,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// Restore original theme on cancel\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentValue);\n\t\t\t\t\t\t\tdone();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\t// Preview theme on selection change\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t},\n\t\t];\n\n\t\t// Thinking-display toggle for the current model. Only adaptive-thinking\n\t\t// Opus/Sonnet 4.6–4.x and Claude 5 families honor this field.\n\t\t// Shown as on (\"summarized\") by default; off (\"omitted\") hides thinking for lower latency.\n\t\tif (config.thinkingDisplaySupported) {\n\t\t\tconst hideThinkingIndex = items.findIndex((item) => item.id === \"hide-thinking\");\n\t\t\titems.splice(hideThinkingIndex + 1, 0, {\n\t\t\t\tid: \"thinking-display\",\n\t\t\t\tlabel: \"Show thinking summary\",\n\t\t\t\tdescription: \"Show summarized thinking for this model (off hides it for lower latency)\",\n\t\t\t\tcurrentValue: config.thinkingDisplay === \"summarized\" ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t});\n\t\t}\n\n\t\titems.push(\n\t\t\t{\n\t\t\t\tid: \"max-concurrent-subagents\",\n\t\t\t\tlabel: \"Max concurrent subagents\",\n\t\t\t\tdescription: \"Applies to new parent sessions; 0 removes the subagent tool\",\n\t\t\t\tcurrentValue: String(config.maxConcurrentSubagents),\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew TextInputSubmenu(\n\t\t\t\t\t\t\"Max Concurrent Subagents\",\n\t\t\t\t\t\t\"Enter a non-negative whole number. Zero disables subagents in new parent sessions.\",\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tconst normalized = value.trim();\n\t\t\t\t\t\t\tconst parsed = normalized.length > 0 ? Number(normalized) : Number.NaN;\n\t\t\t\t\t\t\tif (callbacks.onMaxConcurrentSubagentsChange(parsed)) done(String(parsed));\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-enabled\",\n\t\t\t\tlabel: \"Dispatch Arbiter\",\n\t\t\t\tdescription: arbiterSettings.model\n\t\t\t\t\t? \"Global-only fail-closed pre-spawn routing (configure model, thinking, and guide below)\"\n\t\t\t\t\t: \"Global-only; choose an arbiter model before enabling\",\n\t\t\t\tcurrentValue: arbiterSettings.enabled === true ? \"true\" : \"false\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter\",\n\t\t\t\t\t\t\"Enable only when the exact model, live scope, and guide are ready; failures do not persist\",\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ value: \"false\", label: \"off\", description: \"Disabled (default)\" },\n\t\t\t\t\t\t\t{ value: \"true\", label: \"on\", description: \"Fail closed before every child spawn\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ enabled: value === \"true\" })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-model\",\n\t\t\t\tlabel: \"Dispatch Arbiter model\",\n\t\t\t\tdescription: \"Exact authenticated provider/model; no fallback\",\n\t\t\t\tcurrentValue: arbiterSettings.model ?? \"not set\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Model\",\n\t\t\t\t\t\t\"Select the exact model used for the tool-less pre-spawn decision\",\n\t\t\t\t\t\tconfig.availableModelIds.map((model) => ({ value: model, label: model })),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ model: value })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-thinking\",\n\t\t\t\tlabel: \"Dispatch Arbiter thinking\",\n\t\t\t\tdescription: \"Reasoning level for the arbiter call; validated against its model\",\n\t\t\t\tcurrentValue: arbiterSettings.thinking ?? \"off\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Thinking\",\n\t\t\t\t\t\t\"Select reasoning depth for the headless arbiter call\",\n\t\t\t\t\t\t([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as ThinkingLevel[]).map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tif (await updateArbiter({ thinking: value as ThinkingLevel })) done(value);\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"dispatch-arbiter-guide\",\n\t\t\t\tlabel: \"Dispatch Arbiter guide\",\n\t\t\t\tdescription: \"Routing-guide path; blank uses ~/.dreb/agent/model-routing-guide.md\",\n\t\t\t\tcurrentValue: arbiterSettings.guidePath ?? \"default\",\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew TextInputSubmenu(\n\t\t\t\t\t\t\"Dispatch Arbiter Guide Path\",\n\t\t\t\t\t\t\"Enter a path, or leave blank for ~/.dreb/agent/model-routing-guide.md\",\n\t\t\t\t\t\tcurrentValue === \"default\" ? \"\" : currentValue,\n\t\t\t\t\t\tasync (value) => {\n\t\t\t\t\t\t\tconst guidePath = value.trim();\n\t\t\t\t\t\t\tif (await updateArbiter({ guidePath: guidePath || undefined })) done(guidePath || \"default\");\n\t\t\t\t\t\t\telse done();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t);\n\n\t\t// Single \"Agent Models\" entry that opens the agent picker submenu\n\t\tif (config.agentNames.length > 0) {\n\t\t\titems.push({\n\t\t\t\tid: \"agent-models\",\n\t\t\t\tlabel: \"Agent Models\",\n\t\t\t\tdescription: \"Configure model fallback lists for subagents\",\n\t\t\t\tcurrentValue: \"\",\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew AgentModelsSubmenu(\n\t\t\t\t\t\tconfig.agentNames,\n\t\t\t\t\t\tconfig.agentModels,\n\t\t\t\t\t\tconfig.availableModelIds,\n\t\t\t\t\t\t(agentName, models) => {\n\t\t\t\t\t\t\tcallbacks.onAgentModelsChange(agentName, models);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t});\n\t\t}\n\n\t\t// Only show image toggle if terminal supports it\n\t\tif (supportsImages) {\n\t\t\t// Insert after autocompact\n\t\t\titems.splice(1, 0, {\n\t\t\t\tid: \"show-images\",\n\t\t\t\tlabel: \"Show images\",\n\t\t\t\tdescription: \"Render images inline in terminal\",\n\t\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t});\n\t\t}\n\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\n\t\titems.splice(supportsImages ? 2 : 1, 0, {\n\t\t\tid: \"auto-resize-images\",\n\t\t\tlabel: \"Auto-resize images\",\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Block images toggle (always available, insert after auto-resize-images)\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\n\t\titems.splice(autoResizeIndex + 1, 0, {\n\t\t\tid: \"block-images\",\n\t\t\tlabel: \"Block images\",\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Skill commands toggle (insert after block-images)\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\n\t\titems.splice(blockImagesIndex + 1, 0, {\n\t\t\tid: \"skill-commands\",\n\t\t\tlabel: \"Skill commands\",\n\t\t\tdescription: \"Register skills as /skill:name commands\",\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Hardware cursor toggle (insert after skill-commands)\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"skill-commands\");\n\t\titems.splice(skillCommandsIndex + 1, 0, {\n\t\t\tid: \"show-hardware-cursor\",\n\t\t\tlabel: \"Show hardware cursor\",\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\n\t\t\tid: \"editor-padding\",\n\t\t\tlabel: \"Editor padding\",\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\n\t\t\tcurrentValue: String(config.editorPaddingX),\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\n\t\t});\n\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\n\t\titems.splice(editorPaddingIndex + 1, 0, {\n\t\t\tid: \"autocomplete-max-visible\",\n\t\t\tlabel: \"Autocomplete max items\",\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\n\t\t});\n\n\t\t// Add borders\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\t10,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"autocompact\":\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-load-nested-context\":\n\t\t\t\t\t\tcallbacks.onAutoLoadNestedContextChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-images\":\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-resize-images\":\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"block-images\":\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"skill-commands\":\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"steering-mode\":\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"follow-up-mode\":\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transport\":\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hide-thinking\":\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"thinking-display\":\n\t\t\t\t\t\tcallbacks.onThinkingDisplayChange(newValue === \"true\" ? \"summarized\" : \"omitted\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"quiet-startup\":\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"double-escape-action\":\n\t\t\t\t\t\tcallbacks.onDoubleEscapeActionChange(newValue as \"fork\" | \"tree\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tree-filter-mode\":\n\t\t\t\t\t\tcallbacks.onTreeFilterModeChange(\n\t\t\t\t\t\t\tnewValue as \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-hardware-cursor\":\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"editor-padding\":\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"autocomplete-max-visible\":\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallbacks.onCancel,\n\t\t\t{ enableSearch: true },\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSettingsList(): SettingsList {\n\t\treturn this.settingsList;\n\t}\n}\n"]}
|