diff --git a/src/components/layout/tab-bar.tsx b/src/components/layout/tab-bar.tsx index 2c18b9e1..6375c20b 100644 --- a/src/components/layout/tab-bar.tsx +++ b/src/components/layout/tab-bar.tsx @@ -391,24 +391,33 @@ export function TabBar() { Below `sm` only the essentials (Settings + Cost) stay — the rest collapse to keep the centered tab cluster from colliding with the right-side icons. New workspace / checklist / archived view stay - reachable via Cmd+T, Cmd+K, and the command palette respectively. */} + reachable via Cmd+T, Cmd+K, and the command palette respectively. + + Everything except Settings is a board/workspace concern — new + workspace, that workspace's checklist, its archived tasks, its + spend. None of them mean anything while you're looking at a global + agent roster, so they come out rather than sit there inert. */}
- - { - setShowAddDialog(true) - }} - /> - - - - {activeWorkspaceId && ( - { - setShowDashboard(true) - }} - /> + {activeSection === 'board' && ( + <> + + { + setShowAddDialog(true) + }} + /> + + + + {activeWorkspaceId && ( + { + setShowDashboard(true) + }} + /> + )} + )}
diff --git a/src/components/roster/agent-dossier.tsx b/src/components/roster/agent-dossier.tsx index d0f925f5..6507e984 100644 --- a/src/components/roster/agent-dossier.tsx +++ b/src/components/roster/agent-dossier.tsx @@ -144,11 +144,13 @@ function LlmSections({ config }: { config: LlmConfig }) { return ( <> -
+
{config.systemPrompt ? ( - // Prose gets a measure cap: the pane is wide enough to run ~150 - // characters per line, which is well past comfortable reading. -

+ // Deliberately NOT spanning both columns: a full-width card ran the + // prose to ~150 characters, and capping the text inside a full-width + // card just made it look cropped. One column is ~75ch — the right + // measure — so the card itself carries it. +

{config.systemPrompt}

) : ( diff --git a/src/components/roster/agent-editor.tsx b/src/components/roster/agent-editor.tsx index 00b261a4..9523c2c3 100644 --- a/src/components/roster/agent-editor.tsx +++ b/src/components/roster/agent-editor.tsx @@ -39,17 +39,23 @@ const GRADIENTS: { from: string; to: string }[] = [ const inputClass = 'w-full rounded-lg border border-border-default bg-bg px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary/50 focus:border-accent focus:outline-none' +/** + * One labelled control. Short inputs sit two-up in the form grid; anything + * that needs room (textareas, lists) takes `full` and spans the row. + */ function Field({ label, hint, + full = false, children, }: { label: string hint?: string + full?: boolean children: ReactNode }) { return ( -
+
{children} {hint &&

{hint}

} @@ -57,6 +63,17 @@ function Field({ ) } +/** Group heading inside the form, so twelve controls read as three groups. */ +function FormSection({ title }: { title: string }) { + return ( +
+

+ {title} +

+
+ ) +} + /** Newline-separated text <-> string[], so lists stay editable as plain text. */ const linesToList = (v: string) => v @@ -176,7 +193,7 @@ export function AgentEditor({ agent, seed, onSave, onCancel }: Props) { aria-modal="true" aria-label={agent ? 'Edit agent' : 'New agent'} data-testid="agent-editor" - className="flex max-h-[85vh] w-full max-w-lg flex-col rounded-xl border border-border-default bg-bg shadow-2xl" + className="flex max-h-[85vh] w-full max-w-3xl flex-col rounded-xl border border-border-default bg-bg shadow-2xl" > {/* Header */}
@@ -198,7 +215,8 @@ export function AgentEditor({ agent, seed, onSave, onCancel }: Props) { {/* Scrollable body */}
-
+
+ - + {llm && ( + + { + patchLlm({ model: e.target.value }) + }} + placeholder="e.g. opus" + /> + + )} + +
{GRADIENTS.map((g) => (