PO: @ndoschek
The current AI Configuration view is a tabbed layout that has grown organically. Each tab renders its own layout, spacing, and controls. Detail views vary in shape between tabs. Extensions cannot contribute new categories.
This ticket defines the new structural shape of the view and moves every existing category into it. Detail pages must be functionally complete (all information the current tabs expose is available) even if they are not visually polished beyond primitives-level consistency.
Acceptance scenario
Scenario: The AI Configuration view is the single place for AI configuration
Given a user wants to change any AI-related setting
When the user opens the AI Configuration view directly or through the entry in the Settings UI
Then every AI preference is reachable and searchable inside the view
And the left tree covers the whole AI feature surface with intuitive categories
Scope
View shell
- Top: scope tabs (User / Workspace / Folder; Folder shown when applicable), Open Settings UI icon (can also be a editor/view tool).
- Below the toolbar: Simple / Pro mode toggle (Pro is default here; Simple placeholder from T6).
- Below the toggle: two-column area. Left column has a search input at the top and a flat category list below it. Right is the center pane that pushes and pops as the user navigates.
┌─ AI Configuration ─────────────────────────────────────────────────┐
│ [User] [Workspace] [Folder] [⚙ Settings UI] │
│ Mode: Simple ━━● Pro │
│ ─────────────────────────────────────────────────────────────────── │
│ ┌─────────────┬─────────────────────────────────────────────────┐ │
│ │ Search... │ (center pane, category content) │ │
│ │ ---------- │ │ │
│ │ General │ │ │
│ │ Models │ │ │
│ │ Aliases │ │ │
│ │ Agents │ │ │
│ │ Prompts │ │ │
│ │ & Skills │ │ │
│ │ Variables │ │ │
│ │ MCP │ │ │
│ └─────────────┴─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
The ┃ glyph used in the following sketches stands in for the Settings UI's selection treatment. It does not have to an actual | it can also be usual highlighting, should be aligned with usual Theia stying in the end.
Tree-level search
The left column carries a search input above the category list. It queries across every searchable item exposed by every category (settings, agents, prompts, MCP servers, variables, tool functions, and anything an extension category contributes). Selecting a result navigates to the containing category and highlights the target row or setting.
- The search index is populated by each category via its
AiConfigurationCategoryContribution (see below). The contribution declares which items it exposes for search and how to reach each one.
- Result rendering: a dropdown under the search input showing the item's label, its category, and a small type badge (e.g. "MCP server", "prompt").
- Selecting a result navigates the page-stack to the containing category (list page or detail page as appropriate), highlights the matching row or setting, and clears the search input.
- Complements the per-view filter delivered by T5. Tree-level search is search-as-navigation across the whole view; the per-view filter narrows the current list.
Page primitives
Every category consumes the same primitives:
- Page-stack container: manages push/pop navigation inside the center pane; renders the back affordance (breadcrumb on detail pages).
- Abstract single-page category: header and row container without list/detail push behaviour. Used by General, Models, and Aliases.
- Abstract list page: header, filter input slot (filled in T5), dense rows section, empty state. Used by every collection category.
- Abstract detail page: breadcrumb, header, row container that uses the Settings UI per-setting row renderer.
- Row component: dense row with icon, name, badges, modified indicator, and chevron. Reused inside every list page.
Page shapes
Single-page category (example: General).
┌─ AI Configuration ──────────────────────────────────────────────────┐
│ [User] [Workspace] [Folder] [⚙ Settings UI] │
│ Mode: Simple ━━● Pro │
│ ─────────────────────────────────────────────────────────────────── │
│ ┌─────────────┬─────────────────────────────────────────────────┐ │
│ │ Search... │ │ │
│ │ ---------- │ │ │
│ │ ┃ General │ General │ │
│ │ Models │ ──────────────────────────────────────────── │ │
│ │ Aliases │ │ │
│ │ Agents │ ☑ Enable AI Features │ │
│ │ Prompts │ Turns on AI capabilities across Theia. │ │
│ │ & Skills │ │ │
│ │ Variables │ ☐ Telemetry │ │
│ │ MCP │ Sends anonymous usage data. │ │
│ │ │ │ │
│ │ │ Request Limit [ 100 / minute ▾ ] │ │
│ │ │ Max LLM requests per minute. │ │
│ └─────────────┴─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Collection list page (example: Agents).
┌─ AI Configuration ──────────────────────────────────────────────────┐
│ [User] [Workspace] [Folder] [⚙ Settings UI] │
│ Mode: Simple ━━● Pro │
│ ─────────────────────────────────────────────────────────────────── │
│ ┌─────────────┬─────────────────────────────────────────────────┐ │
│ │ Search... │ │ │
│ │ ---------- │ │ │
│ │ General │ Agents │ │
│ │ Models │ ──────────────────────────────────────────── │ │
│ │ Aliases │ Default chat agent: [ Universal ▾ ] │ │
│ │ ┃ Agents │ Fallback behavior: [ Ask user ▾ ] │ │
│ │ Prompts │ ──────────────────────────────────────────── │ │
│ │ & Skills │ 🔍 Filter agents... │ │
│ │ Variables │ ──────────────────────────────────────────── │ │
│ │ MCP │ Built-in │ │
│ │ │ 🤖 Universal Default chat gpt-4o ● ›│ │
│ │ │ 🛠️ Coder gpt-4o ● ›│ │
│ │ │ 📂 Workspace gpt-4o ○ ›│ │
│ │ │ 📝 Doc Writer gpt-4o ● ›│ │
│ │ │ ───────────────────────────────────────────── │ │
│ │ │ Custom [ + New agent ]│ │
│ │ │ ⚠ My Reviewer needs key custom-llm ○ ›│ │
│ └─────────────┴─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Item detail page (example: Universal agent).
┌─ AI Configuration ──────────────────────────────────────────────────┐
│ [User] [Workspace] [Folder] [⚙ Settings UI] │
│ Mode: Simple ━━● Pro │
│ ─────────────────────────────────────────────────────────────────── │
│ ┌─────────────┬─────────────────────────────────────────────────┐ │
│ │ Search... │ │ │
│ │ ---------- │ │ │
│ │ General │ ← Agents / Universal │ │
│ │ Models │ ──────────────────────────────────────────── │ │
│ │ Aliases │ 🤖 Universal Agent │ │
│ │ ┃ Agents │ Built-in · General-purpose chat agent │ │
│ │ Prompts │ ──────────────────────────────────────────── │ │
│ │ & Skills │ │ │
│ │ Variables │ Enabled [ ● ] On │ │
│ │ MCP │ Whether this agent is available in chat. │ │
│ │ │ │ │
│ │ │ Model [ gpt-4o ▾ ] │ │
│ │ │ LLM used by this agent. │ │
│ │ │ │ │
│ │ │ Prompt Template [ universal-system-default ▾ ]│ │
│ │ │ Active variant of the fragment. │ │
│ │ │ │ │
│ │ │ Tool Functions │ │
│ │ │ ☑ workspace.read │ │
│ │ │ ☑ workspace.edit │ │
│ │ │ ☐ shell.execute │ │
│ │ │ │ │
│ │ │ Variables, MCP allowlist… │ │
│ └─────────────┴─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Shared components
To keep categories consistent, prefer shared components over per-tab implementations. When porting a category, use in this order:
- Existing AI Configuration components that already work (e.g. the agent enable toggle, capabilities checkboxes). Keep them.
- Settings UI elements where reuse is straightforward. The per-setting row renderer is the obvious candidate, since it brings scope-aware read/write, reset-to-default, and modified indicator with it. Only adopt where the fit is easy; otherwise leave it.
- New shared components introduced by this ticket where neither exists and the same building block will recur across detail pages, single-page categories, or list rows.
Standard Theia conventions apply throughout: SelectComponent for enums (no plain <select> anymore), Theia CSS variables for spacing and colors, and designed empty states for collections.
Per-category coverage
Each ported category must expose everything its current tab exposes. Concretely:
- General (single-page): AI features enable, telemetry, and the cross-cutting AI settings that live in
ai-features.* today.
- Models (single-page for now): the full model configuration surface, including provider selection, model list, and per-model settings. Room for the provider model refresh work (#-tbd) to plug in later without redesign.
- Model Aliases (collection): the list of model aliases (showing current set alias); detail page renders the same editability as today.
- Agents (collection): list of agents; detail page renders every section the current Agents tab has (enable, model bindings, prompt template selector, tool functions checklist, capabilities, variables, MCP allowlist).
- Variables (collection): list of variables; currently does not need detail page for variables as no editing is possible etm.
- MCP Servers (collection): list of servers; detail page with server configuration and tool allowlist.
- Tool Functions (collection): list of tool functions, shell allow and deny lists; currently does not need detail page
Prompt Fragments and Skills tabs should be consolidated into a single "Prompts & Skills" category, and is a separate ticket (T4).
Existing detail-page sections from today's tabs are kept; the requirement is that they comply with the conventions above, not that they have to be redesigned. Rebuild the layout on the primitives; keep the content.
Where Settings live
Category-level settings live at the top of the list page. Item-level settings live on the item detail page. Cross-
cutting settings live in General. The tiering applies to every collection category, not only Agents.
| Where |
What lives there |
| General (left tree top) |
Whole system, app-level: AI features on/off, telemetry, request limits, global proxy/endpoint. |
| Agents list page (top section) |
Whole category: default chat agent, notifications |
| Individual agent detail page |
Per-agent: enabled, show in chat, model bindings, prompt template, capabilities etc. |
The same three levels apply to MCP and to Prompts & Skills: category-wide defaults at the top of the list page, per-item settings inside each detail page.
Extension contribution point
AiConfigurationCategoryContribution (working name) providing at minimum id, label, icon, order, a renderer that plugs into the primitives (list page, detail page, or single-page category), and a search-item provider that contributes items to the tree-level search index. Same primitives every built-in category uses; extensions get no privileged path.
- Contribution point is exposed as part of this ticket.
Reference implementation
- One collection category ported end to end as the reference implementation. Recommended: Agents, since it is the most feature-complete and exercises every primitive.
- Other categories can be ported in parallel by category or as a follow-up chunk of this ticket.
Out of scope
- Scope tab wiring to actually read and write per-scope. The strip renders here; behaviour is T3.
- Filter input behaviour. The slot is here; the filter is implemented in T5.
- Simple-mode contents. Placeholder container only.
- Visual polish beyond primitives-level consistency. Detail pages must be complete, not beautiful.
- Prompts & Skills consolidation. T4.
- Cross-links between agent detail and fragment detail. T4.
- Model list refresh states (fetching / refreshing / stale / error). The row component design should not preclude adding these states later, but rendering them is not in this ticket.
PO: @ndoschek
The current AI Configuration view is a tabbed layout that has grown organically. Each tab renders its own layout, spacing, and controls. Detail views vary in shape between tabs. Extensions cannot contribute new categories.
This ticket defines the new structural shape of the view and moves every existing category into it. Detail pages must be functionally complete (all information the current tabs expose is available) even if they are not visually polished beyond primitives-level consistency.
Acceptance scenario
Scope
View shell
The
┃glyph used in the following sketches stands in for the Settings UI's selection treatment. It does not have to an actual | it can also be usual highlighting, should be aligned with usual Theia stying in the end.Tree-level search
The left column carries a search input above the category list. It queries across every searchable item exposed by every category (settings, agents, prompts, MCP servers, variables, tool functions, and anything an extension category contributes). Selecting a result navigates to the containing category and highlights the target row or setting.
AiConfigurationCategoryContribution(see below). The contribution declares which items it exposes for search and how to reach each one.Page primitives
Every category consumes the same primitives:
Page shapes
Single-page category (example: General).
Collection list page (example: Agents).
Item detail page (example: Universal agent).
Shared components
To keep categories consistent, prefer shared components over per-tab implementations. When porting a category, use in this order:
Standard Theia conventions apply throughout:
SelectComponentfor enums (no plain<select>anymore), Theia CSS variables for spacing and colors, and designed empty states for collections.Per-category coverage
Each ported category must expose everything its current tab exposes. Concretely:
ai-features.*today.Prompt Fragments and Skills tabs should be consolidated into a single "Prompts & Skills" category, and is a separate ticket (T4).
Existing detail-page sections from today's tabs are kept; the requirement is that they comply with the conventions above, not that they have to be redesigned. Rebuild the layout on the primitives; keep the content.
Where Settings live
Category-level settings live at the top of the list page. Item-level settings live on the item detail page. Cross-
cutting settings live in General. The tiering applies to every collection category, not only Agents.
The same three levels apply to MCP and to Prompts & Skills: category-wide defaults at the top of the list page, per-item settings inside each detail page.
Extension contribution point
AiConfigurationCategoryContribution(working name) providing at minimumid,label,icon,order, a renderer that plugs into the primitives (list page, detail page, or single-page category), and a search-item provider that contributes items to the tree-level search index. Same primitives every built-in category uses; extensions get no privileged path.Reference implementation
Out of scope