From df2fb3ca38f09629960213f14ca90ef1c9bb0a13 Mon Sep 17 00:00:00 2001 From: Huarch Date: Wed, 15 Jul 2026 18:30:21 +0800 Subject: [PATCH] feat(agent): refine ready state actions --- DESIGN.md | 2 + app/globals.css | 40 +++++++++++++ .../agent/components/agent-command-panel.tsx | 59 ++++++++++++++----- .../components/agent-message-details.tsx | 14 +++-- features/agent/frontend-action/index.ts | 4 +- .../agent/ui-envelope/map-actions.test.ts | 8 +++ features/agent/ui-envelope/map-actions.ts | 27 ++++++++- features/agent/ui-envelope/validator.test.ts | 5 +- features/agent/ui-envelope/validator.ts | 8 +-- features/workbench/map-workbench-page.tsx | 23 ++++++-- 10 files changed, 149 insertions(+), 41 deletions(-) diff --git a/DESIGN.md b/DESIGN.md index 69b97ba..b7c2136 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -372,6 +372,8 @@ Required sections: - Confirmation controls. - Conversation or command input. +Empty Agent conversations use a centered readiness introduction with one identity mark and a compact 2-by-2 capability summary. Keep suggested questions in their existing action strip above the prompt input instead of turning capability cards into duplicate actions. The identity mark may use a slow orbit and low-amplitude core breathing animation, but it must become static under reduced-motion preferences. + Agent recommendation cards should show: - Action name. diff --git a/app/globals.css b/app/globals.css index d9b79e7..cf4eab4 100644 --- a/app/globals.css +++ b/app/globals.css @@ -368,6 +368,20 @@ input:focus-visible { background: var(--surface-reading); } +.agent-ready-orbit, +.agent-ready-core { + transform-box: fill-box; + transform-origin: center; +} + +.agent-ready-orbit { + animation: agent-ready-orbit 9s linear infinite; +} + +.agent-ready-core { + animation: agent-ready-core 2.8s ease-in-out infinite; +} + .agent-panel-icon-button { border: 1px solid var(--surface-divider); background: var(--surface-control); @@ -664,6 +678,25 @@ input:focus-visible { } } +@keyframes agent-ready-orbit { + to { + transform: rotate(360deg); + } +} + +@keyframes agent-ready-core { + 0%, + 100% { + opacity: 0.72; + transform: scale(0.94); + } + + 50% { + opacity: 1; + transform: scale(1.04); + } +} + @media (prefers-reduced-motion: reduce) { .agent-panel-enter, .agent-panel-collapse, @@ -699,6 +732,13 @@ input:focus-visible { opacity: 1; transform: none; } + + .agent-ready-orbit, + .agent-ready-core { + animation: none; + opacity: 1; + transform: none; + } } .maplibregl-ctrl-group { diff --git a/features/agent/components/agent-command-panel.tsx b/features/agent/components/agent-command-panel.tsx index 3e50e9c..1460d8b 100644 --- a/features/agent/components/agent-command-panel.tsx +++ b/features/agent/components/agent-command-panel.tsx @@ -170,8 +170,8 @@ export function AgentCommandPanel({
{messages.length === 0 && !streaming ? ( -
+
{AGENT_PROMPT_SUGGESTIONS.map((suggestion) => (