summaryrefslogtreecommitdiffhomepage
path: root/packages/frontend/src/lib/components/SidebarPanel.svelte
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-05-22 15:24:13 +0900
committerAdam Malczewski <[email protected]>2026-05-22 15:24:13 +0900
commit9ecaabd87c0e51b8a7408dabb0133a9344586859 (patch)
tree4b5809ab23948a5e3f558f3aa34c52d5038f4e19 /packages/frontend/src/lib/components/SidebarPanel.svelte
parent8f1dd855f0c4c877bff8d3a4ba193432b268b1c2 (diff)
downloaddispatch-9ecaabd87c0e51b8a7408dabb0133a9344586859.tar.gz
dispatch-9ecaabd87c0e51b8a7408dabb0133a9344586859.zip
feat: agent builder, CWD support, auto-save, UI polish, unavailable tool handling
- Agent Builder: full CRUD with card grid, drag-and-drop model reorder, edit/delete - Auto-save on edit with 600ms debounce, AbortController for concurrency, fieldset disabled until name entered - Agent definitions stored as TOML with cwd field, loaded from global/project dirs - Working directory: per-tab CWD override in Chat Settings, agent default CWD, auto-create on first message - CWD validation: check-dir endpoint with ~ expansion, real-time validity indicator - Subagent CWD validated against parent's effective CWD using path.relative - Unavailable tool calls: caught gracefully, shown as tool call with error badge, model retries - UI: tab bar border radius, sidebar border removed, chat input ghost style, scroll-to-bottom rectangle - Skills dir collapse uses CSS rotation, Model Choice renamed to Chat Settings, System Prompt view removed - Reusable SkillsBrowser/ToolPermissions with external mode for Agent Builder - ModelSelector: Agent/Manual toggle, agent list, Agent Settings link - Page router, skills recursive scanning, bin/up gopass removed, docker volume mounts
Diffstat (limited to 'packages/frontend/src/lib/components/SidebarPanel.svelte')
-rw-r--r--packages/frontend/src/lib/components/SidebarPanel.svelte44
1 files changed, 26 insertions, 18 deletions
diff --git a/packages/frontend/src/lib/components/SidebarPanel.svelte b/packages/frontend/src/lib/components/SidebarPanel.svelte
index a0aeb1d..041679a 100644
--- a/packages/frontend/src/lib/components/SidebarPanel.svelte
+++ b/packages/frontend/src/lib/components/SidebarPanel.svelte
@@ -7,7 +7,6 @@ import ModelSelector from "./ModelSelector.svelte";
import ModelStatus from "./ModelStatus.svelte";
import SettingsPanel from "./SettingsPanel.svelte";
import SkillsBrowser from "./SkillsBrowser.svelte";
-import SystemPromptPanel from "./SystemPromptPanel.svelte";
import TaskListPanel from "./TaskListPanel.svelte";
import ToolPermissions from "./ToolPermissions.svelte";
@@ -19,9 +18,13 @@ const {
activeKeyId = null,
activeModelId = null,
reasoningEffort = "max",
+ activeAgentSlug = null as string | null,
+ workingDirectory = null as string | null,
onKeyChange,
onModelChange,
onReasoningChange,
+ onAgentChange = (_agent: any) => {},
+ onWorkingDirectoryChange = (_dir: string | null) => {},
}: {
keys?: KeyInfo[];
tasks?: TaskItem[];
@@ -30,9 +33,13 @@ const {
activeKeyId?: string | null;
activeModelId?: string | null;
reasoningEffort?: string;
+ activeAgentSlug?: string | null;
+ workingDirectory?: string | null;
onKeyChange: (keyId: string) => void;
onModelChange: (keyId: string, modelId: string) => void;
onReasoningChange: (effort: string) => void;
+ onAgentChange?: (agent: any) => void;
+ onWorkingDirectoryChange?: (dir: string | null) => void;
} = $props();
interface Panel {
@@ -41,11 +48,11 @@ interface Panel {
}
let nextId = 0;
-let panels = $state<Panel[]>([{ id: nextId++, selected: "Model Choice" }]);
+let panels = $state<Panel[]>([{ id: nextId++, selected: "Chat Settings" }]);
const viewOptions = [
"Select a view",
- "Model Choice",
+ "Chat Settings",
"Key Usage",
"Claude Reset",
"Model Status",
@@ -53,7 +60,6 @@ const viewOptions = [
"Config",
"Skills",
"Tools",
- "System Prompt",
"Settings",
];
@@ -104,16 +110,20 @@ function contentClass(selected: string): string {
</div>
<div class={contentClass(panel.selected)}>
- {#if panel.selected === "Model Choice"}
- <ModelSelector
- {keys}
- {activeKeyId}
- {activeModelId}
- {reasoningEffort}
- {onKeyChange}
- {onModelChange}
- {onReasoningChange}
- />
+ {#if panel.selected === "Chat Settings"}
+ <ModelSelector
+ {keys}
+ {activeKeyId}
+ {activeModelId}
+ {reasoningEffort}
+ {onKeyChange}
+ {onModelChange}
+ {onReasoningChange}
+ {activeAgentSlug}
+ {onAgentChange}
+ {workingDirectory}
+ {onWorkingDirectoryChange}
+ />
{:else if panel.selected === "Key Usage"}
<KeyUsage {keys} {apiBase} />
{:else if panel.selected === "Claude Reset"}
@@ -128,16 +138,14 @@ function contentClass(selected: string): string {
<SkillsBrowser {apiBase} />
{:else if panel.selected === "Tools"}
<ToolPermissions entries={permissionLog} {apiBase} />
- {:else if panel.selected === "System Prompt"}
- <SystemPromptPanel {apiBase} />
- {:else if panel.selected === "Settings"}
+ {:else if panel.selected === "Settings"}
<SettingsPanel {keys} {apiBase} />
{/if}
</div>
</div>
{/each}
- <button type="button" class="btn btn-sm btn-ghost w-full" onclick={addPanel}>
+ <button type="button" class="btn bg-base-200 hover:bg-base-300 border-none w-full text-lg" onclick={addPanel}>
+
</button>
</div>