feat(workspace,settings): model menu chip in the composer, compact settings panels

The workspace home's composer takes ONE Model chip (ModelMenu: model list
plus Effort) and moves AI Router / Permission / Local-New worktree into the
row under it; Settings drops the General-page cost card and export row,
PricingSettings and the empty states are compacted for settings panels.
This commit is contained in:
2026-10-02 17:49:05 +07:00
parent da1b17778c
commit fadecaddd0
23 changed files with 925 additions and 640 deletions
@@ -642,10 +642,10 @@ exports[`screen snapshots > Activity feed 1`] = `
</div>
</div>
<div
class="flex flex-col items-center justify-center py-20 text-center"
class="flex flex-col items-center justify-center text-center py-20"
>
<div
class="w-14 h-14 rounded-2xl bg-surface-4 flex items-center justify-center mb-5"
class="rounded-2xl bg-surface-4 flex items-center justify-center w-14 h-14 mb-5"
>
<svg
class="lucide lucide-activity w-6 h-6 text-fg-muted"
@@ -2787,82 +2787,11 @@ exports[`screen snapshots > Claude Config 1`] = `
</button>
</div>
</div>
<div
class="card overflow-x-auto mt-4"
<p
class="card mt-4 px-4 py-6 text-center text-xs text-fg-muted"
>
<table
class="w-full min-w-[1000px]"
>
<thead>
<tr
class="border-b border-border text-left"
>
<th
class="px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider"
>
Pattern
</th>
<th
class="px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider"
>
Model
</th>
<th
class="px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider text-right"
>
Input
</th>
<th
class="px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider text-right"
>
Output
</th>
<th
class="px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider text-right"
>
Cache Read
</th>
<th
class="px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider text-right"
>
Cache Write (5m)
</th>
<th
class="px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider text-right"
>
Cache Write (1h)
</th>
<th
class="px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider text-right"
>
Fast Input
</th>
<th
class="px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider text-right"
>
Fast Output
</th>
<th
class="w-24 px-4 py-3 text-[11px] font-semibold text-fg-muted uppercase tracking-wider"
>
Actions
</th>
</tr>
</thead>
<tbody
class="divide-y divide-border"
>
<tr>
<td
class="px-4 py-6 text-center text-xs text-fg-muted"
colspan="10"
>
No Claude model prices. Reset Defaults restores them.
</td>
</tr>
</tbody>
</table>
</div>
No Claude model prices. Reset Defaults restores them.
</p>
</section>
</div>
</div>
@@ -6833,10 +6762,10 @@ exports[`screen snapshots > Sessions 1`] = `
</div>
</div>
<div
class="flex flex-col items-center justify-center py-20 text-center"
class="flex flex-col items-center justify-center text-center py-20"
>
<div
class="w-14 h-14 rounded-2xl bg-surface-4 flex items-center justify-center mb-5"
class="rounded-2xl bg-surface-4 flex items-center justify-center w-14 h-14 mb-5"
>
<svg
class="lucide lucide-folder-open w-6 h-6 text-fg-muted"
@@ -6875,73 +6804,6 @@ exports[`screen snapshots > Settings 1`] = `
<div
class="animate-fade-in space-y-8"
>
<div
class="flex items-center justify-end gap-2"
>
<a
class="inline-flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-md border border-border text-fg-secondary hover:text-fg-primary hover:border-border-light transition-colors"
download=""
href="/api/settings/export"
>
<svg
class="lucide lucide-file-down w-3.5 h-3.5"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"
/>
<path
d="M14 2v4a2 2 0 0 0 2 2h4"
/>
<path
d="M12 18v-6"
/>
<path
d="m9 15 3 3 3-3"
/>
</svg>
Export Data
</a>
<button
class="btn-ghost"
>
<svg
class="lucide lucide-refresh-cw w-4 h-4"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"
/>
<path
d="M21 3v5h-5"
/>
<path
d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"
/>
<path
d="M8 16H3v5"
/>
</svg>
Refresh
</button>
</div>
<section
class="card p-5"
>
@@ -6999,70 +6861,6 @@ exports[`screen snapshots > Settings 1`] = `
</div>
</div>
</section>
<div
class="card p-6"
>
<div
class="flex items-center justify-between flex-wrap gap-4"
>
<div
class="flex items-center gap-4"
>
<div
class="w-12 h-12 rounded-xl bg-status-success/10 border border-status-success/20 flex items-center justify-center"
>
<svg
class="lucide lucide-dollar-sign w-6 h-6 text-status-success"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<line
x1="12"
x2="12"
y1="2"
y2="22"
/>
<path
d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"
/>
</svg>
</div>
<div>
<p
class="text-sm text-fg-muted"
>
Total Estimated Cost
</p>
<p
class="text-2xl font-semibold text-fg-primary"
>
<span
class="relative inline-block cursor-default"
>
$0.00
</span>
</p>
</div>
</div>
<div
class="text-right text-xs text-fg-muted"
>
<p>
Across all tracked sessions
</p>
<p>
Based on per-model token usage
</p>
</div>
</div>
</div>
<section
class="scroll-mt-24"
id="lanes"
@@ -8125,44 +7923,181 @@ exports[`screen snapshots > Settings 1`] = `
class="scroll-mt-24"
id="data"
>
<h3
class="text-sm font-medium text-fg-secondary flex items-center gap-2 mb-1"
<div
class="mb-4 flex flex-wrap items-start justify-between gap-2"
>
<svg
class="lucide lucide-database w-4 h-4 text-fg-muted"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
<div>
<h3
class="text-sm font-medium text-fg-secondary flex items-center gap-2 mb-1"
>
<svg
class="lucide lucide-database w-4 h-4 text-fg-muted"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<ellipse
cx="12"
cy="5"
rx="9"
ry="3"
/>
<path
d="M3 5V19A9 3 0 0 0 21 19V5"
/>
<path
d="M3 12A9 3 0 0 0 21 12"
/>
</svg>
Data Management
</h3>
<p
class="text-xs text-fg-muted"
>
Database info, import/export, and cleanup.
</p>
</div>
<div
class="flex items-center gap-2"
>
<ellipse
cx="12"
cy="5"
rx="9"
ry="3"
/>
<path
d="M3 5V19A9 3 0 0 0 21 19V5"
/>
<path
d="M3 12A9 3 0 0 0 21 12"
/>
</svg>
Data Management
</h3>
<p
class="text-xs text-fg-muted mb-4"
>
Database info, import/export, and cleanup.
</p>
<a
class="inline-flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-md border border-border text-fg-secondary hover:text-fg-primary hover:border-border-light transition-colors"
download=""
href="/api/settings/export"
>
<svg
class="lucide lucide-file-down w-3.5 h-3.5"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"
/>
<path
d="M14 2v4a2 2 0 0 0 2 2h4"
/>
<path
d="M12 18v-6"
/>
<path
d="m9 15 3 3 3-3"
/>
</svg>
Export Data
</a>
<button
class="btn-ghost"
>
<svg
class="lucide lucide-refresh-cw w-4 h-4"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"
/>
<path
d="M21 3v5h-5"
/>
<path
d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"
/>
<path
d="M8 16H3v5"
/>
</svg>
Refresh
</button>
</div>
</div>
<div
class="space-y-4"
>
<div
class="card p-6"
>
<div
class="flex items-center justify-between flex-wrap gap-4"
>
<div
class="flex items-center gap-4"
>
<div
class="w-12 h-12 rounded-xl bg-status-success/10 border border-status-success/20 flex items-center justify-center"
>
<svg
class="lucide lucide-dollar-sign w-6 h-6 text-status-success"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<line
x1="12"
x2="12"
y1="2"
y2="22"
/>
<path
d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"
/>
</svg>
</div>
<div>
<p
class="text-sm text-fg-muted"
>
Total Estimated Cost
</p>
<p
class="text-2xl font-semibold text-fg-primary"
>
<span
class="relative inline-block cursor-default"
>
$0.00
</span>
</p>
</div>
</div>
<div
class="text-right text-xs text-fg-muted"
>
<p>
Across all tracked sessions
</p>
<p>
Based on per-model token usage
</p>
</div>
</div>
</div>
<div
class="card p-5 space-y-4"
>
@@ -9123,10 +9058,10 @@ exports[`screen snapshots > Settings — notifications 1`] = `
</button>
</div>
<div
class="flex flex-col items-center justify-center py-20 text-center"
class="flex flex-col items-center justify-center text-center py-8"
>
<div
class="w-14 h-14 rounded-2xl bg-surface-4 flex items-center justify-center mb-5"
class="rounded-2xl bg-surface-4 flex items-center justify-center w-10 h-10 mb-3"
>
<svg
class="lucide lucide-list-checks w-6 h-6 text-fg-muted"
@@ -9160,10 +9095,10 @@ exports[`screen snapshots > Settings — notifications 1`] = `
<h3
class="text-base font-medium text-fg-secondary mb-2"
>
No alert rules yet. Add one to start monitoring for stuck agents, error bursts, idle sessions, or token spikes.
No alert rules yet
</h3>
<p
class="text-sm text-fg-muted max-w-md mb-6"
class="text-sm text-fg-muted max-w-md "
>
Add a rule to start alerting on errors, inactivity, stuck agents, or token thresholds.
</p>