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 @@
-
+

Chat

+
@@ -157,4 +183,11 @@
+ + {#if showConfig} + (sessionConfig = c)} + /> + {/if}