diff --git a/apps/server/src/routes/app-spec/generate-spec.ts b/apps/server/src/routes/app-spec/generate-spec.ts index ea53be85..e7577413 100644 --- a/apps/server/src/routes/app-spec/generate-spec.ts +++ b/apps/server/src/routes/app-spec/generate-spec.ts @@ -208,18 +208,25 @@ ${getStructuredSpecPromptInstruction()}`; throw new Error("No response text and no structured output - cannot generate spec"); } - xmlContent = responseText; const xmlStart = responseText.indexOf(""); const xmlEnd = responseText.lastIndexOf(""); if (xmlStart !== -1 && xmlEnd !== -1) { - // Extract just the XML content + // Extract just the XML content, discarding any conversational text before/after xmlContent = responseText.substring(xmlStart, xmlEnd + "".length); logger.info(`Extracted XML content: ${xmlContent.length} chars (from position ${xmlStart})`); - } else if (xmlStart === -1) { - logger.warn("⚠️ Response does not contain tag - saving raw response"); } else { - logger.warn("⚠️ Response has incomplete XML (missing closing tag) - saving raw response"); + // No valid XML structure found in the response text + // This happens when structured output was expected but not received, and the agent + // output conversational text instead of XML (e.g., "The project directory appears to be empty...") + // We should NOT save this conversational text as it's not a valid spec + logger.error("❌ Response does not contain valid XML structure"); + logger.error("This typically happens when structured output failed and the agent produced conversational text instead of XML"); + throw new Error( + "Failed to generate spec: No valid XML structure found in response. " + + "The response contained conversational text but no tags. " + + "Please try again." + ); } } diff --git a/apps/ui/src/components/layout/sidebar.tsx b/apps/ui/src/components/layout/sidebar.tsx index 74e297df..2efd6972 100644 --- a/apps/ui/src/components/layout/sidebar.tsx +++ b/apps/ui/src/components/layout/sidebar.tsx @@ -1872,9 +1872,6 @@ export function Sidebar() { title={!sidebarOpen ? item.label : undefined} data-testid={`nav-${item.id}`} > - {isActive && ( -
- )} - {isActiveRoute("wiki") && ( -
- )} - {isActiveRoute("running-agents") && ( -
- )}
- {isActiveRoute("settings") && ( -
- )} @@ -498,7 +498,7 @@ export function InterviewView() {
- +
diff --git a/apps/ui/src/lib/log-parser.ts b/apps/ui/src/lib/log-parser.ts index 85fa96c6..0c3d7242 100644 --- a/apps/ui/src/lib/log-parser.ts +++ b/apps/ui/src/lib/log-parser.ts @@ -662,7 +662,7 @@ export function getLogTypeColors(type: LogEntryType): { case "prompt": return { bg: "bg-blue-500/10", - border: "border-l-blue-500", + border: "border-blue-500/30", text: "text-blue-300", icon: "text-blue-400", badge: "bg-blue-500/20 text-blue-300", @@ -670,7 +670,7 @@ export function getLogTypeColors(type: LogEntryType): { case "tool_call": return { bg: "bg-amber-500/10", - border: "border-l-amber-500", + border: "border-amber-500/30", text: "text-amber-300", icon: "text-amber-400", badge: "bg-amber-500/20 text-amber-300", @@ -678,7 +678,7 @@ export function getLogTypeColors(type: LogEntryType): { case "tool_result": return { bg: "bg-slate-500/10", - border: "border-l-slate-400", + border: "border-slate-400/30", text: "text-slate-300", icon: "text-slate-400", badge: "bg-slate-500/20 text-slate-300", @@ -686,7 +686,7 @@ export function getLogTypeColors(type: LogEntryType): { case "phase": return { bg: "bg-cyan-500/10", - border: "border-l-cyan-500", + border: "border-cyan-500/30", text: "text-cyan-300", icon: "text-cyan-400", badge: "bg-cyan-500/20 text-cyan-300", @@ -694,7 +694,7 @@ export function getLogTypeColors(type: LogEntryType): { case "error": return { bg: "bg-red-500/10", - border: "border-l-red-500", + border: "border-red-500/30", text: "text-red-300", icon: "text-red-400", badge: "bg-red-500/20 text-red-300", @@ -702,7 +702,7 @@ export function getLogTypeColors(type: LogEntryType): { case "success": return { bg: "bg-emerald-500/10", - border: "border-l-emerald-500", + border: "border-emerald-500/30", text: "text-emerald-300", icon: "text-emerald-400", badge: "bg-emerald-500/20 text-emerald-300", @@ -710,7 +710,7 @@ export function getLogTypeColors(type: LogEntryType): { case "warning": return { bg: "bg-orange-500/10", - border: "border-l-orange-500", + border: "border-orange-500/30", text: "text-orange-300", icon: "text-orange-400", badge: "bg-orange-500/20 text-orange-300", @@ -718,7 +718,7 @@ export function getLogTypeColors(type: LogEntryType): { case "thinking": return { bg: "bg-indigo-500/10", - border: "border-l-indigo-500", + border: "border-indigo-500/30", text: "text-indigo-300", icon: "text-indigo-400", badge: "bg-indigo-500/20 text-indigo-300", @@ -726,7 +726,7 @@ export function getLogTypeColors(type: LogEntryType): { case "debug": return { bg: "bg-primary/10", - border: "border-l-primary", + border: "border-primary/30", text: "text-primary", icon: "text-primary", badge: "bg-primary/20 text-primary", @@ -734,7 +734,7 @@ export function getLogTypeColors(type: LogEntryType): { default: return { bg: "bg-zinc-500/10", - border: "border-l-zinc-500", + border: "border-zinc-500/30", text: "text-zinc-300", icon: "text-zinc-400", badge: "bg-zinc-500/20 text-zinc-300", diff --git a/package-lock.json b/package-lock.json index 257bd1f2..54afdd99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1003,7 +1003,7 @@ }, "node_modules/@electron/node-gyp": { "version": "10.2.0-electron.1", - "resolved": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", "integrity": "sha512-4MSBTT8y07YUDqf69/vSh80Hh791epYqGtWHO3zSKhYFwQg+gx9wi1PqbqP6YqC4WMsNxZ5l9oDmnWdK5pfCKQ==", "dev": true, "license": "MIT",