diff --git a/web/app/page.tsx b/web/app/page.tsx index 452b18f..b116039 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -311,11 +311,13 @@ export default function HomePage() { const empty = turns.length === 0 function handleCommand(command: string) { - if (command === "info") { + const [cmd, ...args] = command.trim().split(/\s+/) + if (cmd === "info") { + const windowArg = args[0] setTurns((prev) => [ ...prev, - { mode: "chat", role: "user", content: "/info" }, - { mode: "command", command: "info" }, + { mode: "chat", role: "user", content: `/${command}` }, + { mode: "command", command: "info", window: windowArg }, ]) } } @@ -386,6 +388,7 @@ export default function HomePage() { key={`cmd-${i}`} projectId={project.id} projectName={project.name} + window={t.window} onAction={handleSuggestedAction} /> ) : null diff --git a/web/components/chat/ChatInput.tsx b/web/components/chat/ChatInput.tsx index ffc0d27..12b8e29 100644 --- a/web/components/chat/ChatInput.tsx +++ b/web/components/chat/ChatInput.tsx @@ -48,7 +48,7 @@ export function ChatInput({ const cmdName = trimmed.slice(1).split(/\s/)[0] const match = getFilteredCommands(cmdName).find((c) => c.name === cmdName) if (match) { - executeCommand(match.name) + executeCommand(trimmed.slice(1)) return } } diff --git a/web/components/chat/CommandPicker.tsx b/web/components/chat/CommandPicker.tsx index 5ad2cb8..83513e2 100644 --- a/web/components/chat/CommandPicker.tsx +++ b/web/components/chat/CommandPicker.tsx @@ -11,7 +11,7 @@ export type SlashCommand = { } const COMMANDS: SlashCommand[] = [ - { name: "info", description: "Show project overview (services, timeline, clusters)", icon: }, + { name: "info", description: "Show project overview, optional window like 1h, 24h", icon: }, ] interface CommandPickerProps { diff --git a/web/components/projects/ProjectOverview.tsx b/web/components/projects/ProjectOverview.tsx index dbd80b1..1ee1df3 100644 --- a/web/components/projects/ProjectOverview.tsx +++ b/web/components/projects/ProjectOverview.tsx @@ -50,6 +50,7 @@ function shortDate(iso: string): string { interface ProjectOverviewProps { projectId: string projectName: string + window?: string onAction: (action: SuggestedAction) => void } @@ -59,14 +60,14 @@ interface ProjectOverviewProps { * services, and suggested next actions. Fetched live on mount; not persisted * as a chat message. */ -export function ProjectOverview({ projectId, projectName, onAction }: ProjectOverviewProps) { +export function ProjectOverview({ projectId, projectName, window, onAction }: ProjectOverviewProps) { const [overview, setOverview] = useState(null) const [failed, setFailed] = useState(false) useEffect(() => { let cancelled = false setOverview(null) - api.projects.overview(projectId) + api.projects.overview(projectId, window) .then((d: Overview) => { if (!cancelled) setOverview(d) }) .catch((e: any) => { if (!cancelled) { @@ -75,7 +76,7 @@ export function ProjectOverview({ projectId, projectName, onAction }: ProjectOve } }) return () => { cancelled = true } - }, [projectId]) + }, [projectId, window]) if (failed) return null if (!overview) { diff --git a/web/lib/types.ts b/web/lib/types.ts index 76732b1..80131b8 100644 --- a/web/lib/types.ts +++ b/web/lib/types.ts @@ -122,6 +122,7 @@ export type Turn = | { mode: "command" command: string + window?: string } export type ConversationSummary = {