Add BRAIN_DISABLED flag and fix Ollama tool call formatting

Features:
  - Add BRAIN_DISABLED feature flag to hide all Brain functionality
  - When enabled, hides Brain banner, status indicator, menu, and commands
  - Flag location: src/constants/brain.ts

  Fixes:
  - Fix Ollama 400 error by properly formatting tool_calls in messages
  - Update OllamaMessage type to include tool_calls field
  - Fix Brain menu keyboard not working (add missing modes to isMenuOpen)

  UI Changes:
  - Remove "^Tab toggle mode" hint from status bar
  - Remove "ctrl+t to hide todos" hint from status bar

  Files modified:
  - src/constants/brain.ts (add BRAIN_DISABLED flag)
  - src/types/ollama.ts (add tool_calls to OllamaMessage)
  - src/providers/ollama/chat.ts (format tool_calls in messages)
  - src/tui-solid/components/header.tsx (hide Brain UI when disabled)
  - src/tui-solid/components/status-bar.tsx (remove hints)
  - src/tui-solid/components/command-menu.tsx (filter brain command)
  - src/tui-solid/components/input-area.tsx (fix isMenuOpen modes)
  - src/tui-solid/routes/session.tsx (skip brain menu when disabled)
  - src/services/brain.ts (early return when disabled)
  - src/services/chat-tui/initialize.ts (skip brain init when disabled)
This commit is contained in:
2026-02-02 13:25:38 -05:00
parent 2eadda584a
commit c839fc4d68
114 changed files with 17243 additions and 273 deletions

View File

@@ -44,23 +44,41 @@ const PROVIDER_ENV_VARS: Record<Provider, string> = {
* Config state (singleton pattern using closure)
*/
let configState: Config = getDefaults();
let configLoaded = false;
let configLoadPromise: Promise<void> | null = null;
/**
* Load configuration from file
* Load configuration from file (with caching)
*/
export const loadConfig = async (): Promise<void> => {
try {
const data = await fs.readFile(FILES.config, "utf-8");
const loaded = JSON.parse(data);
// Clean up deprecated keys
delete loaded.models;
configState = { ...getDefaults(), ...loaded };
} catch {
// Config file doesn't exist or is invalid, use defaults
configState = getDefaults();
// Return cached config if already loaded
if (configLoaded) {
return;
}
// If loading is in progress, wait for it
if (configLoadPromise) {
return configLoadPromise;
}
// Start loading
configLoadPromise = (async () => {
try {
const data = await fs.readFile(FILES.config, "utf-8");
const loaded = JSON.parse(data);
// Clean up deprecated keys
delete loaded.models;
configState = { ...getDefaults(), ...loaded };
} catch {
// Config file doesn't exist or is invalid, use defaults
configState = getDefaults();
}
configLoaded = true;
})();
return configLoadPromise;
};
/**