diff --git a/packages/app/pr/screenshots/settings-button-refresh-advanced.png b/packages/app/pr/screenshots/settings-button-refresh-advanced.png
new file mode 100644
index 00000000..16228912
Binary files /dev/null and b/packages/app/pr/screenshots/settings-button-refresh-advanced.png differ
diff --git a/packages/app/pr/screenshots/settings-button-refresh-mobile.png b/packages/app/pr/screenshots/settings-button-refresh-mobile.png
new file mode 100644
index 00000000..8784e4b2
Binary files /dev/null and b/packages/app/pr/screenshots/settings-button-refresh-mobile.png differ
diff --git a/packages/app/pr/screenshots/settings-button-refresh-session-smoke.png b/packages/app/pr/screenshots/settings-button-refresh-session-smoke.png
new file mode 100644
index 00000000..fabf7510
Binary files /dev/null and b/packages/app/pr/screenshots/settings-button-refresh-session-smoke.png differ
diff --git a/packages/app/src/app/pages/dashboard.tsx b/packages/app/src/app/pages/dashboard.tsx
index 3cdaad44..7024978c 100644
--- a/packages/app/src/app/pages/dashboard.tsx
+++ b/packages/app/src/app/pages/dashboard.tsx
@@ -49,6 +49,7 @@ import {
Box,
ChevronDown,
ChevronRight,
+ Circle,
History,
HeartPulse,
Loader2,
@@ -749,12 +750,50 @@ export default function DashboardView(props: DashboardViewProps) {
return "Update available";
});
- const updatePillTone = createMemo(() => {
+ const updatePillButtonTone = createMemo(() => {
const state = props.updateStatus?.state;
if (state === "ready") {
- return "border-transparent bg-green-9 text-white shadow-[0_2px_10px_rgba(22,163,74,0.35)] hover:bg-green-10";
+ return props.anyActiveRuns
+ ? "text-amber-11 hover:text-amber-11 hover:bg-amber-3/35"
+ : "text-green-11 hover:text-green-11 hover:bg-green-3/35";
+ }
+ if (state === "downloading") {
+ return "text-blue-11 hover:text-blue-11 hover:bg-blue-3/35";
+ }
+ return "text-emerald-11 hover:text-emerald-11 hover:bg-emerald-3/35";
+ });
+
+ const updatePillBorderTone = createMemo(() => {
+ const state = props.updateStatus?.state;
+ if (state === "ready") {
+ return props.anyActiveRuns ? "border-amber-7/35" : "border-green-7/35";
+ }
+ if (state === "downloading") {
+ return "border-blue-7/35";
+ }
+ return "border-emerald-7/35";
+ });
+
+ const updatePillDotTone = createMemo(() => {
+ const state = props.updateStatus?.state;
+ if (state === "ready") {
+ return props.anyActiveRuns ? "text-amber-10 fill-amber-10" : "text-green-10 fill-green-10";
+ }
+ if (state === "downloading") {
+ return "text-blue-10";
+ }
+ return "text-emerald-10 fill-emerald-10";
+ });
+
+ const updatePillVersionTone = createMemo(() => {
+ const state = props.updateStatus?.state;
+ if (state === "ready") {
+ return props.anyActiveRuns ? "text-amber-11/75" : "text-green-11/75";
+ }
+ if (state === "downloading") {
+ return "text-blue-11/75";
}
- return "border-transparent bg-dls-accent text-white shadow-[0_2px_10px_rgba(var(--dls-accent-rgb),0.35)] hover:bg-[var(--dls-accent-hover)]";
+ return "text-emerald-11/75";
});
const updatePillTitle = createMemo(() => {
@@ -785,7 +824,7 @@ export default function DashboardView(props: DashboardViewProps) {
+
}
>
-
+
- {updatePillLabel()}
+ {updatePillLabel()}
{(version) => (
- v{version()}
+ v{version()}
)}
@@ -1181,7 +1223,7 @@ export default function DashboardView(props: DashboardViewProps) {
+
}
>
-
+
- {updatePillLabel()}
+ {updatePillLabel()}
{(version) => (
- v{version()}
+ v{version()}
)}
diff --git a/packages/app/src/app/pages/session.tsx b/packages/app/src/app/pages/session.tsx
index 1f1217e7..f6fa8205 100644
--- a/packages/app/src/app/pages/session.tsx
+++ b/packages/app/src/app/pages/session.tsx
@@ -27,6 +27,7 @@ import {
Check,
ChevronDown,
ChevronRight,
+ Circle,
Cpu,
HeartPulse,
HardDrive,
@@ -2121,12 +2122,50 @@ export default function SessionView(props: SessionViewProps) {
return "Update available";
});
- const updatePillTone = createMemo(() => {
+ const updatePillButtonTone = createMemo(() => {
const state = props.updateStatus?.state;
if (state === "ready") {
- return "border-transparent bg-green-9 text-white shadow-[0_2px_10px_rgba(22,163,74,0.35)] hover:bg-green-10";
+ return props.anyActiveRuns
+ ? "text-amber-11 hover:text-amber-11 hover:bg-amber-3/35"
+ : "text-green-11 hover:text-green-11 hover:bg-green-3/35";
+ }
+ if (state === "downloading") {
+ return "text-blue-11 hover:text-blue-11 hover:bg-blue-3/35";
+ }
+ return "text-emerald-11 hover:text-emerald-11 hover:bg-emerald-3/35";
+ });
+
+ const updatePillBorderTone = createMemo(() => {
+ const state = props.updateStatus?.state;
+ if (state === "ready") {
+ return props.anyActiveRuns ? "border-amber-7/35" : "border-green-7/35";
+ }
+ if (state === "downloading") {
+ return "border-blue-7/35";
+ }
+ return "border-emerald-7/35";
+ });
+
+ const updatePillDotTone = createMemo(() => {
+ const state = props.updateStatus?.state;
+ if (state === "ready") {
+ return props.anyActiveRuns ? "text-amber-10 fill-amber-10" : "text-green-10 fill-green-10";
+ }
+ if (state === "downloading") {
+ return "text-blue-10";
+ }
+ return "text-emerald-10 fill-emerald-10";
+ });
+
+ const updatePillVersionTone = createMemo(() => {
+ const state = props.updateStatus?.state;
+ if (state === "ready") {
+ return props.anyActiveRuns ? "text-amber-11/75" : "text-green-11/75";
+ }
+ if (state === "downloading") {
+ return "text-blue-11/75";
}
- return "border-transparent bg-dls-accent text-white shadow-[0_2px_10px_rgba(var(--dls-accent-rgb),0.35)] hover:bg-[var(--dls-accent-hover)]";
+ return "text-emerald-11/75";
});
const updatePillTitle = createMemo(() => {
@@ -2187,7 +2226,7 @@ export default function SessionView(props: SessionViewProps) {
+
}
>
-
+
- {updatePillLabel()}
+ {updatePillLabel()}
{(version) => (
- v{version()}
+ v{version()}
)}
@@ -2572,7 +2614,7 @@ export default function SessionView(props: SessionViewProps) {
+
}
>
-
+
- {updatePillLabel()}
+ {updatePillLabel()}
{(version) => (
- v{version()}
+ v{version()}
)}
diff --git a/packages/app/src/app/pages/settings.tsx b/packages/app/src/app/pages/settings.tsx
index 98a9278b..1f2f01c2 100644
--- a/packages/app/src/app/pages/settings.tsx
+++ b/packages/app/src/app/pages/settings.tsx
@@ -3,7 +3,7 @@ import { For, Match, Show, Switch, createEffect, createMemo, createSignal, onMou
import { formatBytes, formatRelativeTime, isTauriRuntime } from "../utils";
import Button from "../components/button";
-import { HardDrive, MessageCircle, PlugZap, RefreshCcw, Shield, Smartphone, X } from "lucide-solid";
+import { CircleAlert, HardDrive, MessageCircle, PlugZap, RefreshCcw, Smartphone, X, Zap } from "lucide-solid";
import type { OpencodeConnectStatus, ProviderListItem, SettingsTab, StartupPreference } from "../types";
import type {
OpenworkAuditEntry,
@@ -842,10 +842,14 @@ export default function SettingsView(props: SettingsViewProps) {
Enables debug tools, diagnostics, and the Developer tab.
-
{props.developerMode ? "Developer panel enabled." : "Enable this to access the Developer panel."}
@@ -857,23 +861,35 @@ export default function SettingsView(props: SettingsViewProps) {
{props.headerStatus}
{props.baseUrl}
-
-
+
{props.openworkReconnectBusy ? "Reconnecting..." : "Reconnect server"}
-
+
-
+
+
Stop local server
-
+
-
+
Disconnect server
-
+