@dreb/coding-agent 2.45.1 → 2.45.3
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 +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +2 -2
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +8 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +13 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +4 -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 +77 -21
- package/docs/rpc.md +5 -3
- package/docs/settings.md +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -81,7 +81,7 @@ Or use a custom provider (corporate proxy, Bedrock, etc.) — see [Custom provid
|
|
|
81
81
|
|
|
82
82
|
Then just talk to dreb. All 11 built-in tools are enabled by default: `read`, `write`, `edit`, `bash`, `grep`, `find`, `ls`, `web_search`, `web_fetch`, `subagent`, and `wait`. Use `--tools` to restrict to a subset (e.g., `--tools read,grep,find,ls` for read-only). Three additional tools — `search`, `skill`, and `tasks_update` — are always active regardless of `--tools`. `suggest_next` is active by default but excluded when `--tools` is specified. The model uses these to fulfill your requests. Add capabilities via [skills](#skills), [prompt templates](#prompt-templates), [extensions](#extensions), or [packages](#packages).
|
|
83
83
|
|
|
84
|
-
**Also available:** [`@dreb/telegram`](https://www.npmjs.com/package/@dreb/telegram) — run dreb as a Telegram bot with live tool status and visible results for user-facing tools (`npm install -g @dreb/telegram`). [`@dreb/dashboard`](https://www.npmjs.com/package/@dreb/dashboard) — run `dreb dashboard` for a browser UI with fleet overview, full chat steering, sanitized
|
|
84
|
+
**Also available:** [`@dreb/telegram`](https://www.npmjs.com/package/@dreb/telegram) — run dreb as a Telegram bot with live tool status and visible results for user-facing tools (`npm install -g @dreb/telegram`). [`@dreb/dashboard`](https://www.npmjs.com/package/@dreb/dashboard) — run `dreb dashboard` for a browser UI with fleet overview, full chat steering, inline provider/API failures with partial output preserved, sanitized raster tool images plus sent user uploads retained as bounded transcript previews by default, subagent observability, host file browser, curated appearance themes (per-browser light/dark), and Tailscale/rotating-code pairing (`npm install -g @dreb/dashboard`; see [docs/dashboard.md](docs/dashboard.md)). Tool images cross browser-facing transport as content-addressed references; browser-local Settings offers placeholders, bounded previews, or informed-opt-in originals, with size disclosure and confirmation above 1 MiB. Full-resolution HTML export remains self-contained. Compact SSE snapshots update live fleet cards without repeatedly fetching the cross-project inventory, and session drill-in hydrates state, messages, and background agents through one ordered snapshot request. Terminal provider failures show their reason on fleet cards, while transient failures clear terminal state when automatic retry begins and remain recorded inline on the failed attempt. Its top bar and persistent session header indicators report connecting, connected, retrying, resyncing, disconnected, or auth failed; bounded SSE replay plus an explicit snapshot barrier restores session state, tasks, and image references after a reload, restart, gap, backpressure disconnect, or stalled stream, while authenticated image routes recover bytes separately from authoritative transcripts.
|
|
85
85
|
|
|
86
86
|
**Platform notes:** [Windows](docs/windows.md) | [Termux (Android)](docs/termux.md) | [tmux](docs/tmux.md) | [Terminal setup](docs/terminal-setup.md) | [Shell aliases](docs/shell-aliases.md)
|
|
87
87
|
|
|
@@ -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\tgetCapabilities,\n\tgetKeybindings,\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 { 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}\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\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\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\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 models\n\t\t// (Opus/Sonnet 4.6+) honor this field, so the entry is gated to those models.\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\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\tgetCapabilities,\n\tgetKeybindings,\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 { 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}\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\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\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\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\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"]}
|
|
@@ -343,8 +343,8 @@ export class SettingsSelectorComponent extends Container {
|
|
|
343
343
|
}),
|
|
344
344
|
},
|
|
345
345
|
];
|
|
346
|
-
// Thinking-display toggle for the current model. Only adaptive-thinking
|
|
347
|
-
//
|
|
346
|
+
// Thinking-display toggle for the current model. Only adaptive-thinking
|
|
347
|
+
// Opus/Sonnet 4.6–4.x and Claude 5 families honor this field.
|
|
348
348
|
// Shown as on ("summarized") by default; off ("omitted") hides thinking for lower latency.
|
|
349
349
|
if (config.thinkingDisplaySupported) {
|
|
350
350
|
const hideThinkingIndex = items.findIndex((item) => item.id === "hide-thinking");
|
|
@@ -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\tgetCapabilities,\n\tgetKeybindings,\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 { 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}\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\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\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\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 models\n\t\t// (Opus/Sonnet 4.6+) honor this field, so the entry is gated to those models.\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\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\tgetCapabilities,\n\tgetKeybindings,\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 { 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}\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\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\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\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\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"]}
|
|
@@ -36,6 +36,14 @@ export declare function getScopedModelsForRpc(session: Pick<AgentSession, "scope
|
|
|
36
36
|
export declare function getResourcesForRpc(session: Pick<AgentSession, "resourceLoader" | "getFilteredSkills" | "promptTemplates">): RpcResources;
|
|
37
37
|
export declare function getPendingMessagesForRpc(session: Pick<AgentSession, "getSteeringMessages" | "getFollowUpMessages" | "getSteeringMessagePayloads" | "getFollowUpMessagePayloads">): RpcPendingMessages;
|
|
38
38
|
export declare function getStateForRpc(session: AgentSession, modelFallbackMessage?: string): RpcSessionState;
|
|
39
|
+
/**
|
|
40
|
+
* Dashboard transcript snapshots use persisted branch context whenever the
|
|
41
|
+
* runtime is not streaming so failed attempts removed from the next provider
|
|
42
|
+
* request remain visible during retry backoff and after recovery. The snapshot
|
|
43
|
+
* state carries retry activity separately, preventing those historical errors
|
|
44
|
+
* from being mistaken for terminal failures.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getDashboardMessagesForRpc(session: AgentSession): import("@dreb/agent-core").AgentMessage[];
|
|
39
47
|
/**
|
|
40
48
|
* Handle the `delete_session` RPC command: wires the active session into the core
|
|
41
49
|
* {@link SessionManager.deleteSession} guard and maps the result to a discriminated
|