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>