Polish sidebar task actions

Move Remote Link and Space Agent into the sidebar dropdown while removing their right-canvas rail actions. Rename Scheduler-facing UI to Tasks and collapse Chat Actions behind a persisted dropdown accordion.

Alessandro committed May 2, 2026 at 17:34 UTC 704c0e9daf113615d9113da6bdf617bdc90f8831
7 files changed +77 -54
extensions/webui/right_canvas_register_surfaces/register-remote-link.js
+2 -17
@@ -1,18 +1,3 @@
1 -const REMOTE_LINK_MODAL_PATH = "settings/tunnel/remote-link.html";
2 -
3 -export default async function registerRemoteLinkAction(canvas) {
4 - canvas.registerSurface({
5 - id: "remote-link",
6 - title: "Remote Link",
7 - icon: "share",
8 - order: 31,
9 - actionOnly: true,
10 - async open() {
11 - if (typeof globalThis.ensureModalOpen === "function") {
12 - await globalThis.ensureModalOpen(REMOTE_LINK_MODAL_PATH);
13 - return;
14 - }
15 - await globalThis.openModal?.(REMOTE_LINK_MODAL_PATH);
16 - },
17 - });
1 +export default async function registerRemoteLinkAction() {
2 + // Remote Link is opened from the sidebar dropdown, not the right canvas rail.
3 }
extensions/webui/right_canvas_register_surfaces/register-space-agent.js
+2 -13
@@ -1,14 +1,3 @@
1 -const SPACE_AGENT_URL = "https://space-agent.ai/";
2 -
3 -export default async function registerSpaceAgentAction(canvas) {
4 - canvas.registerSurface({
5 - id: "space-agent",
6 - title: "Space Agent",
7 - image: "/public/space-agent-icon-512.webp",
8 - order: 32,
9 - actionOnly: true,
10 - open() {
11 - globalThis.open(SPACE_AGENT_URL, "_blank", "noopener,noreferrer");
12 - },
13 - });
1 +export default async function registerSpaceAgentAction() {
2 + // Space Agent is opened from the sidebar dropdown, not the right canvas rail.
3 }
webui/components/modals/scheduler/scheduler-modal.html
+2 -3
@@ -1,6 +1,6 @@
1 <html>
2 <head>
3 - <title>Task Scheduler</title>
3 + <title>Tasks</title>
4 <script type="module">
5 import { store } from "/components/modals/scheduler/scheduler-store.js";
6 </script>
@@ -10,7 +10,7 @@
10 <template x-if="$store.schedulerStore">
11 <div class="scheduler-modal-content">
12 <div id="scheduler-settings-root" class="scheduler-dashboard">
13 - <div class="scheduler-dashboard-description">Manage scheduled tasks and automated processes for Agent Zero.</div>
13 + <div class="scheduler-dashboard-description">Manage tasks and automated processes for Agent Zero.</div>
14 <x-component path="modals/scheduler/scheduler-task-editor.html"></x-component>
15 <x-component path="modals/scheduler/scheduler-task-list.html"></x-component>
16 </div>
@@ -62,4 +62,3 @@
62 </style>
63 </body>
64 </html>
65 -
webui/components/modals/scheduler/scheduler-store.js
+3 -3
@@ -277,11 +277,11 @@ async function callSchedulerEndpoint(endpoint, payload = {}, defaultError) {
277 });
278 const data = await response.json().catch(() => ({}));
279 if (!response.ok) {
280 - return { ok: false, error: data?.error || defaultError || "Scheduler request failed" };
280 + return { ok: false, error: data?.error || defaultError || "Task request failed" };
281 }
282 return { ok: true, data };
283 } catch (error) {
284 - return { ok: false, error: error?.message || defaultError || "Scheduler request failed" };
284 + return { ok: false, error: error?.message || defaultError || "Task request failed" };
285 }
286 }
287
@@ -347,7 +347,7 @@ const notificationChannels = {
347 error: "frontendError",
348 };
349
350 -function pushNotification(type, message, title = "Scheduler", duration) {
350 +function pushNotification(type, message, title = "Tasks", duration) {
351 const channel = notificationChannels[type];
352 if (!channel || typeof notificationsStore[channel] !== "function") return;
353 const ttl = duration ?? NOTIFICATION_DURATION[type] ?? 4;
webui/components/sidebar/sidebar-store.js
+1
@@ -9,6 +9,7 @@ const model = {
9 // Centralized collapse state for all sidebar sections (persisted in localStorage)
10 sectionStates: {
11 tasks: false, // default: collapsed
12 + chatActions: false, // default: collapsed
13 preferences: false // default: collapsed
14 },
15
webui/components/sidebar/top-section/header-icons.html
+66 -17
@@ -88,9 +88,19 @@
88 <span>Files</span>
89 </button>
90
91 + <button class="dropdown-item" @click="ensureModalOpen('settings/tunnel/remote-link.html'); $store.sidebar.menuClose()">
92 + <span class="material-symbols-outlined">share</span>
93 + <span>Remote Link</span>
94 + </button>
95 +
96 + <button class="dropdown-item" @click="open('https://space-agent.ai/', '_blank', 'noopener,noreferrer'); $store.sidebar.menuClose()">
97 + <span class="material-symbols-outlined">rocket_launch</span>
98 + <span>Space Agent</span>
99 + </button>
100 +
101 <button class="dropdown-item" @click="openModal('components/modals/scheduler/scheduler-modal.html'); $store.sidebar.menuClose()">
102 <span class="material-symbols-outlined">schedule</span>
93 - <span>Scheduler</span>
103 + <span>Tasks</span>
104 </button>
105
106 <button class="dropdown-item" @click="openModal('settings/settings.html'); $store.sidebar.menuClose()">
@@ -99,27 +109,42 @@
109 </button>
110
111 <div class="dropdown-separator"></div>
102 - <div class="dropdown-header">Chat Actions</div>
112
104 - <button class="dropdown-item" @click="$store.chats.newChat(); $store.sidebar.menuClose()">
105 - <span class="material-symbols-outlined">chat_add_on</span>
106 - <span>New Chat</span>
113 + <button
114 + type="button"
115 + class="dropdown-item quick-actions-accordion-toggle"
116 + :class="{ 'is-open': $store.sidebar.isSectionOpen('chatActions') }"
117 + :aria-expanded="$store.sidebar.isSectionOpen('chatActions').toString()"
118 + @click="$store.sidebar.toggleSection('chatActions')"
119 + >
120 + <span class="quick-actions-accordion-label">
121 + <span class="material-symbols-outlined">forum</span>
122 + <span>Chat Actions</span>
123 + </span>
124 + <span class="material-symbols-outlined quick-actions-accordion-chevron">expand_more</span>
125 </button>
126
109 - <button class="dropdown-item" @click="$store.chats.loadChats(); $store.sidebar.menuClose()">
110 - <span class="material-symbols-outlined">folder_open</span>
111 - <span>Load Chat</span>
112 - </button>
127 + <div class="quick-actions-accordion-panel" x-show="$store.sidebar.isSectionOpen('chatActions')" style="display: none;">
128 + <button class="dropdown-item" @click="$store.chats.newChat(); $store.sidebar.menuClose()">
129 + <span class="material-symbols-outlined">chat_add_on</span>
130 + <span>New Chat</span>
131 + </button>
132
114 - <button class="dropdown-item" x-show="$store.chats.selected" @click="$store.chats.saveChat(); $store.sidebar.menuClose()">
115 - <span class="material-symbols-outlined">save</span>
116 - <span>Save Chat</span>
117 - </button>
133 + <button class="dropdown-item" @click="$store.chats.loadChats(); $store.sidebar.menuClose()">
134 + <span class="material-symbols-outlined">folder_open</span>
135 + <span>Load Chat</span>
136 + </button>
137
119 - <button class="dropdown-item" x-show="$store.chats.selected" @click="$confirmClick($event, () => { $store.chats.resetChat(); $store.sidebar.menuClose() })">
120 - <span class="material-symbols-outlined">delete_sweep</span>
121 - <span>Clear Chat</span>
122 - </button>
138 + <button class="dropdown-item" x-show="$store.chats.selected" @click="$store.chats.saveChat(); $store.sidebar.menuClose()">
139 + <span class="material-symbols-outlined">save</span>
140 + <span>Save Chat</span>
141 + </button>
142 +
143 + <button class="dropdown-item" x-show="$store.chats.selected" @click="$confirmClick($event, () => { $store.chats.resetChat(); $store.sidebar.menuClose() })">
144 + <span class="material-symbols-outlined">delete_sweep</span>
145 + <span>Clear Chat</span>
146 + </button>
147 + </div>
148
149 <div class="dropdown-separator"></div>
150
@@ -314,6 +339,30 @@
339 transform: scaleY(0.8);
340 }
341
342 + .quick-actions-accordion-toggle {
343 + justify-content: space-between;
344 + }
345 +
346 + .quick-actions-accordion-label {
347 + display: inline-flex;
348 + align-items: center;
349 + gap: var(--spacing-sm);
350 + min-width: 0;
351 + }
352 +
353 + .quick-actions-accordion-chevron {
354 + margin-left: auto;
355 + transition: transform 0.15s ease;
356 + }
357 +
358 + .quick-actions-accordion-toggle.is-open .quick-actions-accordion-chevron {
359 + transform: rotate(180deg);
360 + }
361 +
362 + .quick-actions-accordion-panel .dropdown-item {
363 + padding-left: calc(var(--spacing-md) + 1.55rem);
364 + }
365 +
366 /* --- Desktop Hover Expand --- */
367 @media (min-width: 769px) {
368 .sidebar-header-panel.sidebar-header-panel-open,
webui/components/welcome/welcome-screen.html
+1 -1
@@ -32,7 +32,7 @@
32
33 <div class="welcome-action-card" @click="$store.welcomeStore.executeAction('scheduler')">
34 <span class="material-symbols-outlined welcome-action-icon">schedule</span>
35 - <h3 class="welcome-action-title">Scheduler</h3>
35 + <h3 class="welcome-action-title">Tasks</h3>
36 </div>
37 <div class="welcome-action-card" @click="$store.welcomeStore.executeAction('settings')">
38 <span class="material-symbols-outlined welcome-action-icon">settings</span>