diff --git a/docs/changelog.json b/docs/changelog.json index 3f070e4..6d9f7f6 100644 --- a/docs/changelog.json +++ b/docs/changelog.json @@ -11,6 +11,12 @@ "title": "The agent menu shows the agents you use, with the rest under More agents", "summary": "The agent menu above the message box now lists your six most-used agents instead of every agent at once. More agents opens the full list with a search box; pin agents there to choose exactly which ones the menu shows, or go back to the most-used ones. Cloud agents stay under Cloud unless you pin them. On a phone, the agent sheet gains a search box. The choice is remembered per browser." }, + { + "date": "2026-10-13", + "area": "Chat", + "title": "The new chat page shows what Shell:B can do", + "summary": "Below the agent's starter cards, a new chat now has a What Shell:B can do section with three tabs. Try something offers everyday tasks (prepare for a job interview, polish a cover letter, identify a sea creature, step back into the Neolithic, get notes on your writing, research a topic, summarise a document, make a picture, get a quick answer); each one switches the chat to the agent best at it and sends. Agents lists every agent with what it is for: picking one sets it for the chat and its starter cards change to match. Apps lists every app with a line on what it does, and opens it." + }, { "date": "2026-10-13", "area": "Chat", diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 2199993..6ffca89 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -42,6 +42,7 @@ import { ContextMeter } from './components/composer/ContextMeter'; import { isCell, type GuestPanel } from './cell'; import { GuestPanelHost } from './components/CellGuest'; import { DocPanel } from './components/DocPanel'; +import { NewChatHome } from './components/NewChatHome'; import { onDocView, type DocTarget } from './docView'; const Studio = lazy(() => import('./studio/Studio')); @@ -473,6 +474,15 @@ export function App() { } }, [conv]); + // a "Try something" card on the empty chat: the chat switches to the card's agent, and the prompt goes once it has + const [pendingStart, setPendingStart] = useState<{ agentId: string; prompt: string } | null>(null); + const startWith = useCallback((a: Agent, prompt: string) => { selectAgent(a); setPendingStart({ agentId: a.id, prompt }); }, [selectAgent]); + useEffect(() => { + if (!pendingStart || agent?.id !== pendingStart.agentId) return; + setPendingStart(null); + send(pendingStart.prompt, []); + }, [pendingStart, agent, send]); + /** `incognito`: an incognito copy of the chat (server/privacy.py); the original is left as it was */ const forkChat = useCallback(async (convId: string, messageId?: string, incognito = false) => { try { @@ -891,23 +901,8 @@ export function App() {
- {agent.name} · {agent.description} -
-{t('Overthink. Overcomplicate. Overengineer.')}
-+ {agent.name} · {agent.description} +
++ {t('Each agent is good at something different. Pick one for this chat, or type @ and a name to ask one for a single reply.')} +
+{t('Overthink. Overcomplicate. Overengineer.')}
+- {agent.name} ·{' '} - {agent.description} -
- - {/* Suggestion Chips */} -- {t('Overthink. Overcomplicate. Overengineer.')} -
-