diff --git a/api/src/chat/chat.prompts.ts b/api/src/chat/chat.prompts.ts index 5945a12..1feefba 100644 --- a/api/src/chat/chat.prompts.ts +++ b/api/src/chat/chat.prompts.ts @@ -18,11 +18,21 @@ export function buildChatPrompt(p: { .join('\n\n'); return [ - `You are Hermes, a capable autonomous assistant in an interactive chat. Help with research, questions, analysis, and general engineering work.`, - workspaceNote, - `Use your full toolset — web access, file reading, and shell — as needed to answer well. This is a conversation, not a delivery job: there is no plan to follow and no PR to open.`, - `--- CONVERSATION SO FAR ---\n${transcript}\n--- END CONVERSATION ---`, - `Respond to the latest user message above. Output only your reply in GitHub-flavored Markdown — no preamble, no sign-off.`, + `# Role + +You are Hermes, a capable autonomous assistant in an interactive chat. Help with research, questions, analysis, and general engineering work. + +${workspaceNote} + +Use your full toolset — web access, file reading, and shell — as needed to answer well. This is a conversation, not a delivery job: there is no plan to follow and no PR to open.`, + `# Context + +--- CONVERSATION SO FAR --- +${transcript} +--- END CONVERSATION ---`, + `# Responding + +Respond to the latest user message above. Output only your reply in GitHub-flavored Markdown — no preamble, no sign-off.`, ].join('\n\n'); } @@ -32,8 +42,16 @@ export function buildChatPrompt(p: { */ export function buildTitlePrompt(firstMessage: string): string { return [ - `Generate a short, descriptive title for a chat conversation that opens with the message below.`, - `Rules:\n- Output ONLY the title — no quotes, no markdown, no trailing punctuation, no preamble.\n- 4 to 8 words, Title Case.\n- Do NOT use any tools; just reply with the title.`, - `--- FIRST MESSAGE ---\n${firstMessage}\n--- END ---`, + `# Task + +Generate a short, descriptive title for a chat conversation that opens with the message below.`, + `--- FIRST MESSAGE --- +${firstMessage} +--- END FIRST MESSAGE ---`, + `# Rules + +- Output ONLY the title — no quotes, no markdown, no trailing punctuation, no preamble. +- 4 to 8 words, Title Case. +- Do NOT use any tools; just reply with the title.`, ].join('\n\n'); } diff --git a/app/src/components/AgentRunRow.tsx b/app/src/components/AgentRunRow.tsx index f65eb37..d0e2b4c 100644 --- a/app/src/components/AgentRunRow.tsx +++ b/app/src/components/AgentRunRow.tsx @@ -6,19 +6,9 @@ interface Props { jobId: string; } -const PHASE_COLOURS: Record = { - PLAN: 'bg-blue-900/60 text-blue-300', - IMPLEMENT: 'bg-sky-900/60 text-sky-300', - REVIEW: 'bg-violet-900/60 text-violet-300', - REVISE: 'bg-sky-900/60 text-sky-300', - VERIFY: 'bg-teal-900/60 text-teal-300', - SUMMARY: 'bg-zinc-800 text-zinc-300', - JUDGE: 'bg-pink-900/60 text-pink-300', -}; - -function phasePill(phase: string): string { - return PHASE_COLOURS[phase] ?? 'bg-zinc-800 text-zinc-300'; -} +// Phase badges are neutral labels — the phase name carries the meaning, so they all share one zinc +// style rather than a per-phase rainbow. +const PHASE_PILL = 'bg-zinc-800 text-zinc-300'; function formatDuration(ms: number | null): string { if (ms === null) return ''; @@ -42,20 +32,20 @@ export default function AgentRunRow({ run, jobId }: Props) { return (
{/* Phase badge */} - + {run.phase} {/* Status, with model + duration on a meta line beneath */}
{isRunning ? ( - - + + Running ) : isJudge && run.status === 'SUCCEEDED' ? ( diff --git a/app/src/components/Chat.tsx b/app/src/components/Chat.tsx index 641749e..578be01 100644 --- a/app/src/components/Chat.tsx +++ b/app/src/components/Chat.tsx @@ -180,7 +180,7 @@ export default function Chat() {

Chat not found