diff --git a/implementation-plans/_index.md b/implementation-plans/_index.md
index b3c13cd..37620ba 100644
--- a/implementation-plans/_index.md
+++ b/implementation-plans/_index.md
@@ -14,3 +14,4 @@
| #10 | Final result rendering with artifacts | COMPLETED | [issue-010.md](issue-010.md) |
| #11 | Session creation and ID management | COMPLETED | [issue-011.md](issue-011.md) |
| #12 | Session history sidebar | COMPLETED | [issue-012.md](issue-012.md) |
+| #13 | Session config sidebar component | COMPLETED | [issue-013.md](issue-013.md) |
diff --git a/implementation-plans/issue-013.md b/implementation-plans/issue-013.md
new file mode 100644
index 0000000..60ba107
--- /dev/null
+++ b/implementation-plans/issue-013.md
@@ -0,0 +1,30 @@
+---
+---
+
+# Issue #13: Session config sidebar component
+
+**Status:** COMPLETED
+**Issue:** https://git.shahondin1624.de/llm-multiverse/llm-multiverse-ui/issues/13
+**Branch:** `feature/issue-13-config-sidebar`
+
+## Acceptance Criteria
+
+- [x] Right sidebar component for session configuration
+- [x] Override level selection (None / Relax / All) with radio-style buttons
+- [x] Disabled tools toggle checkboxes using ToolType enum values
+- [x] Granted permissions free-text input with add/remove
+- [x] Toggle button in header with non-default config indicator dot
+- [x] Reset button to restore defaults
+- [x] Config passed to processRequest on send
+
+## Implementation
+
+### Components
+- `ConfigSidebar.svelte` — right sidebar with override level, disabled tools, and granted permissions sections
+- Updated `+page.svelte` — added config toggle button in header, sessionConfig state, and ConfigSidebar integration
+
+### Key Decisions
+- Used `@bufbuild/protobuf` `create()` with `SessionConfigSchema` for immutable config updates
+- Config state lives in `+page.svelte` and is passed down as prop
+- Non-default config indicator (amber dot) shown in both the header toggle button and sidebar header
+- Disabled tools stored as string labels matching ToolType enum display names
diff --git a/src/lib/components/ConfigSidebar.svelte b/src/lib/components/ConfigSidebar.svelte
new file mode 100644
index 0000000..09080fa
--- /dev/null
+++ b/src/lib/components/ConfigSidebar.svelte
@@ -0,0 +1,177 @@
+
+
+
diff --git a/src/routes/chat/+page.svelte b/src/routes/chat/+page.svelte
index fb52cb5..07c01d7 100644
--- a/src/routes/chat/+page.svelte
+++ b/src/routes/chat/+page.svelte
@@ -4,12 +4,17 @@
import { resolveRoute } from '$app/paths';
import type { ChatMessage } from '$lib/types';
import type { SubagentResult } from '$lib/proto/llm_multiverse/v1/common_pb';
+ import { OverrideLevel } from '$lib/proto/llm_multiverse/v1/common_pb';
+ import type { SessionConfig } from '$lib/proto/llm_multiverse/v1/orchestrator_pb';
+ import { SessionConfigSchema } from '$lib/proto/llm_multiverse/v1/orchestrator_pb';
+ import { create } from '@bufbuild/protobuf';
import MessageList from '$lib/components/MessageList.svelte';
import MessageInput from '$lib/components/MessageInput.svelte';
import OrchestrationProgress from '$lib/components/OrchestrationProgress.svelte';
import ThinkingSection from '$lib/components/ThinkingSection.svelte';
import FinalResult from '$lib/components/FinalResult.svelte';
import SessionSidebar from '$lib/components/SessionSidebar.svelte';
+ import ConfigSidebar from '$lib/components/ConfigSidebar.svelte';
import { processRequest, OrchestratorError } from '$lib/services/orchestrator';
import { OrchestrationState } from '$lib/proto/llm_multiverse/v1/orchestrator_pb';
import { sessionStore } from '$lib/stores/sessions.svelte';
@@ -20,6 +25,16 @@
let orchestrationState: OrchestrationState = $state(OrchestrationState.UNSPECIFIED);
let intermediateResult: string = $state('');
let finalResult: SubagentResult | null = $state(null);
+ let sessionConfig: SessionConfig = $state(
+ create(SessionConfigSchema, { overrideLevel: OverrideLevel.NONE })
+ );
+ let showConfig = $state(false);
+
+ const isNonDefaultConfig = $derived(
+ sessionConfig.overrideLevel !== OverrideLevel.NONE ||
+ sessionConfig.disabledTools.length > 0 ||
+ sessionConfig.grantedPermissions.length > 0
+ );
function navigateToSession(sessionId: string, replace = false) {
const url = `${resolveRoute('/chat')}?session=${sessionId}`;
@@ -83,7 +98,7 @@
isStreaming = true;
try {
- for await (const response of processRequest(sessionId, content)) {
+ for await (const response of processRequest(sessionId, content, sessionConfig)) {
orchestrationState = response.state;
if (response.intermediateResult) {
intermediateResult = response.intermediateResult;
@@ -119,8 +134,19 @@