@surf-kit/agent 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/index.cjs +625 -204
- package/dist/chat/index.cjs.map +1 -1
- package/dist/chat/index.d.cts +11 -6
- package/dist/chat/index.d.ts +11 -6
- package/dist/chat/index.js +606 -185
- package/dist/chat/index.js.map +1 -1
- package/dist/{chat--OifhIRe.d.ts → chat-BIIDOGrD.d.ts} +10 -1
- package/dist/{chat-ChYl2XjV.d.cts → chat-CGamM7Mz.d.cts} +10 -1
- package/dist/{hooks-DLfF18IU.d.cts → hooks-B1NYoLLs.d.cts} +21 -5
- package/dist/{hooks-BGs8-4GK.d.ts → hooks-CTeEqnBQ.d.ts} +21 -5
- package/dist/hooks.cjs +126 -81
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.cts +3 -3
- package/dist/hooks.d.ts +3 -3
- package/dist/hooks.js +126 -81
- package/dist/hooks.js.map +1 -1
- package/dist/index.cjs +686 -265
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +645 -224
- package/dist/index.js.map +1 -1
- package/dist/layouts/index.cjs +646 -225
- package/dist/layouts/index.cjs.map +1 -1
- package/dist/layouts/index.d.cts +1 -1
- package/dist/layouts/index.d.ts +1 -1
- package/dist/layouts/index.js +622 -201
- package/dist/layouts/index.js.map +1 -1
- package/dist/mcp/index.cjs +1 -1
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/response/index.cjs +66 -12
- package/dist/response/index.cjs.map +1 -1
- package/dist/response/index.d.cts +2 -2
- package/dist/response/index.d.ts +2 -2
- package/dist/response/index.js +64 -10
- package/dist/response/index.js.map +1 -1
- package/dist/sources/index.cjs +30 -1
- package/dist/sources/index.cjs.map +1 -1
- package/dist/sources/index.js +30 -1
- package/dist/sources/index.js.map +1 -1
- package/dist/streaming/index.cjs +202 -93
- package/dist/streaming/index.cjs.map +1 -1
- package/dist/streaming/index.d.cts +4 -3
- package/dist/streaming/index.d.ts +4 -3
- package/dist/streaming/index.js +172 -73
- package/dist/streaming/index.js.map +1 -1
- package/dist/{streaming-DbQxScpi.d.ts → streaming-Bx-ff2tt.d.ts} +1 -1
- package/dist/{streaming-DfT22A0z.d.cts → streaming-x7umFHoP.d.cts} +1 -1
- package/package.json +15 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/response/index.ts","../../src/response/AgentResponse/AgentResponse.tsx","../../src/response/ResponseMessage/ResponseMessage.tsx","../../src/response/StructuredResponse/StructuredResponse.tsx","../../src/sources/SourceList/SourceList.tsx","../../src/sources/SourceCard/SourceCard.tsx","../../src/response/FollowUpChips/FollowUpChips.tsx","../../src/response/ErrorResponse/ErrorResponse.tsx"],"sourcesContent":["export { AgentResponse } from './AgentResponse'\nexport type { AgentResponseProps } from './AgentResponse'\n\nexport { ResponseMessage } from './ResponseMessage'\nexport type { ResponseMessageProps } from './ResponseMessage'\n\nexport { StructuredResponse } from './StructuredResponse'\nexport type { StructuredResponseProps } from './StructuredResponse'\n\nexport { FollowUpChips } from './FollowUpChips'\nexport type { FollowUpChipsProps } from './FollowUpChips'\n\nexport { ErrorResponse } from './ErrorResponse'\nexport type { ErrorResponseProps } from './ErrorResponse'\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { AgentResponse as AgentResponseType } from '../../types/agent'\nimport { ResponseMessage } from '../ResponseMessage'\nimport { StructuredResponse } from '../StructuredResponse'\nimport { SourceList } from '../../sources/SourceList'\nimport { FollowUpChips } from '../FollowUpChips'\n\ntype AgentResponseProps = {\n response: AgentResponseType\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n onFollowUp?: (suggestion: string) => void\n onNavigateSource?: (source: AgentResponseType['sources'][number]) => void\n className?: string\n}\n\nfunction getConfidenceIntent(overall: 'high' | 'medium' | 'low') {\n if (overall === 'high') return 'success' as const\n if (overall === 'medium') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationIntent(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'success' as const\n if (status === 'flagged') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationLabel(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'Verified'\n if (status === 'flagged') return 'Flagged'\n return 'Failed'\n}\n\nfunction AgentResponse({\n response,\n showSources = true,\n showConfidence = false,\n showVerification = false,\n onFollowUp,\n onNavigateSource,\n className,\n}: AgentResponseProps) {\n return (\n <div className={`flex flex-col gap-4 ${className ?? ''}`} data-testid=\"agent-response\">\n {/* Lead message — always shown as a short 1-3 sentence summary */}\n <ResponseMessage content={response.message} />\n\n {/* Structured content — rendered when ui_hint is not plain text */}\n {response.ui_hint !== 'text' && response.structured_data && (\n <StructuredResponse\n uiHint={response.ui_hint}\n data={response.structured_data as Record<string, unknown>}\n />\n )}\n\n {/* Confidence & Verification badges */}\n {(showConfidence || showVerification) && (\n <div className=\"flex flex-wrap items-center gap-2 mt-1\" data-testid=\"response-meta\">\n {showConfidence && (\n <Badge\n intent={getConfidenceIntent(response.confidence.overall)}\n size=\"sm\"\n >\n {response.confidence.overall} confidence\n </Badge>\n )}\n {showVerification && (\n <Badge\n intent={getVerificationIntent(response.verification.status)}\n size=\"sm\"\n >\n {getVerificationLabel(response.verification.status)} ({response.verification.claims_verified}/{response.verification.claims_checked})\n </Badge>\n )}\n </div>\n )}\n\n {/* Sources */}\n {showSources && response.sources.length > 0 && (\n <SourceList\n sources={response.sources}\n variant=\"compact\"\n collapsible\n defaultExpanded={false}\n onNavigate={onNavigateSource}\n />\n )}\n\n {/* Follow-up suggestions */}\n {response.follow_up_suggestions.length > 0 && onFollowUp && (\n <FollowUpChips\n suggestions={response.follow_up_suggestions}\n onSelect={onFollowUp}\n />\n )}\n </div>\n )\n}\n\nexport { AgentResponse }\nexport type { AgentResponseProps }\n","import React from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport rehypeSanitize from 'rehype-sanitize'\nimport { twMerge } from 'tailwind-merge'\n\ntype ResponseMessageProps = {\n content: string\n className?: string\n}\n\nfunction normalizeMarkdownLists(content: string) {\n // Some providers emit compact list markdown like \"Intro: - item 1 - item 2\".\n // Insert a paragraph break before an inline list marker so markdown parses it as a list.\n return content.replace(/:\\s+-\\s+/g, ':\\n\\n- ')\n}\n\nfunction ResponseMessage({ content, className }: ResponseMessageProps) {\n return (\n <div\n className={twMerge(\n 'text-sm leading-relaxed text-text-primary',\n '[&_p]:my-2',\n '[&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6',\n '[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6',\n '[&_li]:my-1',\n '[&_strong]:text-text-primary [&_strong]:font-semibold',\n '[&_em]:text-text-secondary',\n '[&_h1]:text-lg [&_h1]:font-semibold [&_h1]:text-text-primary [&_h1]:mt-4 [&_h1]:mb-2',\n '[&_h2]:text-base [&_h2]:font-semibold [&_h2]:text-text-primary [&_h2]:mt-3 [&_h2]:mb-1.5',\n '[&_h3]:text-sm [&_h3]:font-semibold [&_h3]:text-accent [&_h3]:mt-2 [&_h3]:mb-1',\n '[&_code]:bg-surface-raised [&_code]:text-accent [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_code]:font-mono',\n '[&_pre]:bg-surface-raised [&_pre]:border [&_pre]:border-border [&_pre]:rounded-xl [&_pre]:p-4 [&_pre]:overflow-x-auto',\n '[&_blockquote]:border-l-2 [&_blockquote]:border-border-strong [&_blockquote]:pl-4 [&_blockquote]:text-text-secondary',\n '[&_a]:text-accent [&_a]:underline-offset-2 [&_a]:hover:text-accent/80',\n className,\n )}\n data-testid=\"response-message\"\n >\n <ReactMarkdown\n rehypePlugins={[rehypeSanitize]}\n components={{\n script: () => null,\n iframe: () => null,\n p: ({ children }) => <p className=\"my-2\">{children}</p>,\n ul: ({ children }) => <ul className=\"my-2 list-disc pl-6\">{children}</ul>,\n ol: ({ children }) => <ol className=\"my-2 list-decimal pl-6\">{children}</ol>,\n li: ({ children }) => <li className=\"my-1\">{children}</li>,\n strong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n h1: ({ children }) => <h1 className=\"text-base font-bold mt-4 mb-2\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"text-sm font-bold mt-3 mb-1\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"text-sm font-semibold mt-2 mb-1\">{children}</h3>,\n code: ({ children }) => <code className=\"bg-surface-sunken rounded px-1 py-0.5 text-xs font-mono\">{children}</code>,\n }}\n >\n {normalizeMarkdownLists(content)}\n </ReactMarkdown>\n </div>\n )\n}\n\nexport { ResponseMessage }\nexport type { ResponseMessageProps }\n","import React from 'react'\nimport type { AgentResponse } from '../../types/agent'\n\ntype StructuredResponseProps = {\n uiHint: AgentResponse['ui_hint']\n data: Record<string, unknown> | null\n className?: string\n}\n\n/** Parse a value that may be a JSON-encoded string or already parsed. */\nfunction tryParse<T>(value: unknown): T | null {\n if (value === undefined || value === null) return null\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n }\n return value as T\n}\n\nfunction renderSteps(data: Record<string, unknown>) {\n const steps = tryParse<string[]>(data.steps)\n if (!steps || !Array.isArray(steps)) return null\n return (\n <ol className=\"flex flex-col gap-2\" data-testid=\"structured-steps\">\n {steps.map((step, i) => (\n <li key={i} className=\"flex items-start gap-3\">\n <span\n className=\"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-accent text-[11px] font-semibold text-white\"\n aria-hidden=\"true\"\n >\n {i + 1}\n </span>\n <span className=\"text-sm text-text-primary leading-relaxed\">{step}</span>\n </li>\n ))}\n </ol>\n )\n}\n\nfunction renderTable(data: Record<string, unknown>) {\n const columns = tryParse<string[]>(data.columns)\n // rows may be array-of-arrays or array-of-objects; normalise to array-of-arrays\n const rawRows = tryParse<unknown[]>(data.rows)\n\n if (columns && rawRows && Array.isArray(columns) && Array.isArray(rawRows)) {\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <thead className=\"bg-surface-raised\">\n <tr>\n {columns.map((col) => (\n <th\n key={col}\n className=\"text-left px-4 py-2.5 font-semibold text-text-primary border-b border-border\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rawRows.map((row, i) => {\n const cells = Array.isArray(row)\n ? row\n : columns.map((col) => (row as Record<string, unknown>)[col])\n return (\n <tr key={i} className=\"even:bg-surface-raised/40\">\n {cells.map((cell, j) => (\n <td key={j} className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {String(cell ?? '')}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n }\n\n // Fallback: key-value table\n const entries = Object.entries(data)\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <tbody>\n {entries.map(([key, value]) => (\n <tr key={key} className=\"even:bg-surface-raised/40\">\n <td className=\"px-4 py-2 text-text-primary font-medium border-b border-border w-1/3\">\n {key}\n </td>\n <td className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {typeof value === 'object' ? JSON.stringify(value) : String(value ?? '')}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction renderCard(data: Record<string, unknown>) {\n const title = typeof data.title === 'string' ? data.title : null\n const body = typeof data.body === 'string' ? data.body : null\n const link = typeof data.link === 'string' ? data.link : null\n const linkLabel = typeof data.link_label === 'string' ? data.link_label : 'Learn more'\n\n return (\n <div\n className=\"rounded-xl border border-border bg-surface-raised p-4 flex flex-col gap-2\"\n data-testid=\"structured-card\"\n >\n {title && <p className=\"text-sm font-semibold text-text-primary\">{title}</p>}\n {body && <p className=\"text-sm text-text-secondary leading-relaxed\">{body}</p>}\n {link && (\n <a\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-xs font-medium text-accent hover:text-accent/80 underline-offset-2 hover:underline transition-colors\"\n >\n {linkLabel}\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </a>\n )}\n </div>\n )\n}\n\nfunction renderList(data: Record<string, unknown>) {\n const items = tryParse<string[]>(data.items)\n const title = typeof data.title === 'string' ? data.title : null\n if (!items || !Array.isArray(items)) return null\n\n return (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"structured-list\">\n {title && (\n <p className=\"text-xs font-semibold uppercase tracking-wider text-text-secondary mb-1\">{title}</p>\n )}\n <ul className=\"flex flex-col gap-1.5\">\n {items.map((item, i) => (\n <li key={i} className=\"flex items-start gap-2.5\">\n <span className=\"mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-accent\" aria-hidden=\"true\" />\n <span className=\"text-sm text-text-primary leading-relaxed\">{item}</span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nfunction renderWarning(data: Record<string, unknown>) {\n const severity = typeof data.severity === 'string' ? data.severity : 'medium'\n const action = typeof data.action === 'string' ? data.action : null\n const details = typeof data.details === 'string' ? data.details : null\n const isHigh = severity === 'high'\n\n return (\n <div\n role=\"alert\"\n className={`rounded-xl border p-4 flex gap-3 ${\n isHigh\n ? 'border-red-200 bg-red-50 dark:border-red-900/50 dark:bg-red-950/30'\n : 'border-amber-200 bg-amber-50 dark:border-amber-900/50 dark:bg-amber-950/30'\n }`}\n data-testid=\"structured-warning\"\n >\n <svg\n className={`mt-0.5 h-5 w-5 shrink-0 ${isHigh ? 'text-red-500' : 'text-amber-500'}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n <div className=\"flex flex-col gap-1\">\n {action && (\n <p className={`text-sm font-semibold ${isHigh ? 'text-red-700 dark:text-red-300' : 'text-amber-700 dark:text-amber-300'}`}>\n {action}\n </p>\n )}\n {details && (\n <p className={`text-sm ${isHigh ? 'text-red-600 dark:text-red-400' : 'text-amber-600 dark:text-amber-400'}`}>\n {details}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nfunction StructuredResponse({ uiHint, data, className }: StructuredResponseProps) {\n if (!data) return null\n\n let content: React.ReactNode\n\n switch (uiHint) {\n case 'steps':\n content = renderSteps(data)\n break\n case 'table':\n content = renderTable(data)\n break\n case 'card':\n content = renderCard(data)\n break\n case 'list':\n content = renderList(data)\n break\n case 'warning':\n content = renderWarning(data)\n break\n case 'text':\n content = typeof data.text === 'string'\n ? <p data-testid=\"structured-text\">{data.text}</p>\n : null\n break\n default:\n content = null\n }\n\n if (!content) return null\n\n return (\n <div className={className} data-testid=\"structured-response\">\n {content}\n </div>\n )\n}\n\nexport { StructuredResponse }\nexport type { StructuredResponseProps }\n","'use client'\n\nimport React, { useState } from 'react'\nimport type { Source } from '../../types/agent'\nimport { SourceCard } from '../SourceCard'\n\ntype SourceListProps = {\n sources: Source[]\n variant?: 'compact' | 'expanded'\n collapsible?: boolean\n defaultExpanded?: boolean\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction SourceList({\n sources,\n variant = 'compact',\n collapsible = false,\n defaultExpanded = true,\n onNavigate,\n className,\n}: SourceListProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded)\n\n if (sources.length === 0) return null\n\n const content = (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"source-list-items\">\n {sources.map((source) => (\n <SourceCard\n key={source.document_id}\n source={source}\n variant={variant}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n )\n\n if (!collapsible) {\n return (\n <div className={className} data-testid=\"source-list\">\n {content}\n </div>\n )\n }\n\n return (\n <div className={className} data-testid=\"source-list\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(prev => !prev)}\n aria-expanded={isExpanded}\n className=\"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-text-secondary hover:text-accent mb-2 transition-colors duration-200\"\n >\n <svg\n className={`w-4 h-4 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n Sources ({sources.length})\n </button>\n {isExpanded && content}\n </div>\n )\n}\n\nexport { SourceList }\nexport type { SourceListProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport { twMerge } from 'tailwind-merge'\nimport type { Source } from '../../types/agent'\n\ntype SourceCardProps = {\n source: Source\n variant?: 'compact' | 'expanded'\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction getConfidenceIntent(confidence: number) {\n if (confidence >= 0.8) return 'success' as const\n if (confidence >= 0.5) return 'warning' as const\n return 'error' as const\n}\n\nfunction getConfidenceLabel(confidence: number) {\n if (confidence >= 0.8) return 'High'\n if (confidence >= 0.5) return 'Medium'\n return 'Low'\n}\n\nfunction SourceCard({ source, variant = 'compact', onNavigate, className }: SourceCardProps) {\n const handleClick = () => {\n if (onNavigate) {\n onNavigate(source)\n }\n }\n\n const isCompact = variant === 'compact'\n\n return (\n <div\n className={twMerge(\n 'rounded-xl border transition-all duration-200',\n 'bg-surface border-border',\n onNavigate && 'cursor-pointer hover:border-border-strong',\n className,\n )}\n data-document-id={source.document_id}\n data-testid=\"source-card\"\n >\n <div\n className={isCompact ? 'px-4 py-3' : 'px-6 py-4'}\n onClick={handleClick}\n role={onNavigate ? 'button' : undefined}\n tabIndex={onNavigate ? 0 : undefined}\n onKeyDown={\n onNavigate\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }\n : undefined\n }\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {source.title}\n </p>\n {source.section && (\n <p className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary truncate mt-0.5\">\n {source.section}\n </p>\n )}\n </div>\n <Badge\n intent={getConfidenceIntent(source.confidence)}\n size=\"sm\"\n >\n {getConfidenceLabel(source.confidence)}\n </Badge>\n </div>\n {!isCompact && (\n <p className=\"text-xs text-text-secondary mt-2 line-clamp-3 leading-relaxed\">\n {source.snippet}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nexport { SourceCard }\nexport type { SourceCardProps }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ntype FollowUpChipsProps = {\n suggestions: string[]\n onSelect: (suggestion: string) => void\n className?: string\n}\n\nfunction FollowUpChips({ suggestions, onSelect, className }: FollowUpChipsProps) {\n if (suggestions.length === 0) return null\n\n return (\n <div\n className={twMerge('flex flex-wrap gap-2 py-1', className)}\n role=\"group\"\n aria-label=\"Follow-up suggestions\"\n data-testid=\"follow-up-chips\"\n >\n {suggestions.map(suggestion => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => onSelect(suggestion)}\n className={twMerge(\n 'px-4 py-1.5 rounded-full text-sm whitespace-nowrap',\n 'border border-border bg-transparent text-text-secondary',\n 'hover:bg-accent/10 hover:border-interactive hover:text-text-primary',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n 'transition-all duration-200',\n )}\n >\n {suggestion}\n </button>\n ))}\n </div>\n )\n}\n\nexport { FollowUpChips }\nexport type { FollowUpChipsProps }\n","import React from 'react'\nimport { Alert, Button } from '@surf-kit/core'\nimport type { ChatError } from '../../types/chat'\n\ntype ErrorResponseProps = {\n error: ChatError\n onRetry?: () => void\n className?: string\n}\n\nfunction ErrorResponse({ error, onRetry, className }: ErrorResponseProps) {\n return (\n <div role=\"alert\" className={className} data-testid=\"error-response\">\n <Alert intent=\"error\" title=\"Error\">\n <p>{error.message}</p>\n {error.retryable && onRetry && (\n <div className=\"mt-3\">\n <Button\n intent=\"secondary\"\n size=\"sm\"\n onPress={onRetry}\n aria-label=\"Retry\"\n >\n Retry\n </Button>\n </div>\n )}\n </Alert>\n </div>\n )\n}\n\nexport { ErrorResponse }\nexport type { ErrorResponseProps }\n"],"mappings":"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","names":["import_core","ReactMarkdown","rehypeSanitize","import_jsx_runtime","import_tailwind_merge","import_jsx_runtime","import_jsx_runtime","import_tailwind_merge","import_jsx_runtime","import_jsx_runtime","getConfidenceIntent","import_core","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/response/index.ts","../../src/response/AgentResponse/AgentResponse.tsx","../../src/response/ResponseMessage/ResponseMessage.tsx","../../src/response/StructuredResponse/StructuredResponse.tsx","../../src/sources/SourceList/SourceList.tsx","../../src/sources/SourceCard/SourceCard.tsx","../../src/response/FollowUpChips/FollowUpChips.tsx","../../src/response/ErrorResponse/ErrorResponse.tsx"],"sourcesContent":["export { AgentResponse } from './AgentResponse'\nexport type { AgentResponseProps } from './AgentResponse'\n\nexport { ResponseMessage } from './ResponseMessage'\nexport type { ResponseMessageProps } from './ResponseMessage'\n\nexport { StructuredResponse } from './StructuredResponse'\nexport type { StructuredResponseProps } from './StructuredResponse'\n\nexport { FollowUpChips } from './FollowUpChips'\nexport type { FollowUpChipsProps } from './FollowUpChips'\n\nexport { ErrorResponse } from './ErrorResponse'\nexport type { ErrorResponseProps } from './ErrorResponse'\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { AgentResponse as AgentResponseType } from '../../types/agent'\nimport { ResponseMessage } from '../ResponseMessage'\nimport { StructuredResponse } from '../StructuredResponse'\nimport { SourceList } from '../../sources/SourceList'\nimport { FollowUpChips } from '../FollowUpChips'\n\ntype AgentResponseProps = {\n response: AgentResponseType\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n onFollowUp?: (suggestion: string) => void\n onNavigateSource?: (source: AgentResponseType['sources'][number]) => void\n className?: string\n}\n\nfunction getConfidenceIntent(overall: 'high' | 'medium' | 'low') {\n if (overall === 'high') return 'success' as const\n if (overall === 'medium') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationIntent(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'success' as const\n if (status === 'flagged') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationLabel(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'Verified'\n if (status === 'flagged') return 'Flagged'\n return 'Failed'\n}\n\nfunction AgentResponse({\n response,\n showSources = true,\n showConfidence = false,\n showVerification = false,\n onFollowUp,\n onNavigateSource,\n className,\n}: AgentResponseProps) {\n return (\n <div className={`flex flex-col gap-4 ${className ?? ''}`} data-testid=\"agent-response\">\n {/* Lead message — always shown as a short 1-3 sentence summary */}\n <ResponseMessage content={response.message} />\n\n {/* Structured content — rendered when ui_hint is not plain text */}\n {response.ui_hint !== 'text' && response.structured_data && (() => {\n const parsed = typeof response.structured_data === 'string'\n ? (() => { try { return JSON.parse(response.structured_data) as Record<string, unknown> } catch { return null } })()\n : response.structured_data as Record<string, unknown>\n return parsed ? <StructuredResponse uiHint={response.ui_hint} data={parsed} /> : null\n })()}\n\n {/* Confidence & Verification badges */}\n {(showConfidence || showVerification) && (\n <div className=\"flex flex-wrap items-center gap-2 mt-1\" data-testid=\"response-meta\">\n {showConfidence && (\n <Badge\n intent={getConfidenceIntent(response.confidence.overall)}\n size=\"sm\"\n >\n {response.confidence.overall} confidence\n </Badge>\n )}\n {showVerification && (\n <Badge\n intent={getVerificationIntent(response.verification.status)}\n size=\"sm\"\n >\n {getVerificationLabel(response.verification.status)} ({response.verification.claims_verified}/{response.verification.claims_checked})\n </Badge>\n )}\n </div>\n )}\n\n {/* Sources */}\n {showSources && response.sources.length > 0 && (\n <SourceList\n sources={response.sources}\n variant=\"compact\"\n collapsible\n defaultExpanded={false}\n onNavigate={onNavigateSource}\n />\n )}\n\n {/* Follow-up suggestions */}\n {response.follow_up_suggestions.length > 0 && onFollowUp && (\n <FollowUpChips\n suggestions={response.follow_up_suggestions}\n onSelect={onFollowUp}\n />\n )}\n </div>\n )\n}\n\nexport { AgentResponse }\nexport type { AgentResponseProps }\n","import React from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport rehypeSanitize from 'rehype-sanitize'\nimport { twMerge } from 'tailwind-merge'\n\ntype ResponseMessageProps = {\n content: string\n className?: string\n}\n\nfunction normalizeMarkdownLists(content: string) {\n // Some providers emit compact list markdown like \"Intro: - item 1 - item 2\".\n // Insert a paragraph break before an inline list marker so markdown parses it as a list.\n return content.replace(/:\\s+-\\s+/g, ':\\n\\n- ')\n}\n\nfunction ResponseMessage({ content, className }: ResponseMessageProps) {\n return (\n <div\n className={twMerge(\n 'text-sm leading-relaxed text-text-primary',\n '[&_p]:my-2',\n '[&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6',\n '[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6',\n '[&_li]:my-1',\n '[&_strong]:text-text-primary [&_strong]:font-semibold',\n '[&_em]:text-text-secondary',\n '[&_h1]:text-lg [&_h1]:font-semibold [&_h1]:text-text-primary [&_h1]:mt-4 [&_h1]:mb-2',\n '[&_h2]:text-base [&_h2]:font-semibold [&_h2]:text-text-primary [&_h2]:mt-3 [&_h2]:mb-1.5',\n '[&_h3]:text-sm [&_h3]:font-semibold [&_h3]:text-accent [&_h3]:mt-2 [&_h3]:mb-1',\n '[&_code]:bg-surface-raised [&_code]:text-accent [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_code]:font-mono',\n '[&_pre]:bg-surface-raised [&_pre]:border [&_pre]:border-border [&_pre]:rounded-xl [&_pre]:p-4 [&_pre]:overflow-x-auto',\n '[&_hr]:my-3 [&_hr]:border-border',\n '[&_blockquote]:border-l-2 [&_blockquote]:border-border-strong [&_blockquote]:pl-4 [&_blockquote]:text-text-secondary',\n '[&_a]:text-accent [&_a]:underline-offset-2 [&_a]:hover:text-accent/80',\n className,\n )}\n data-testid=\"response-message\"\n >\n <ReactMarkdown\n rehypePlugins={[rehypeSanitize]}\n components={{\n script: () => null,\n iframe: () => null,\n p: ({ children }) => <p className=\"my-2\">{children}</p>,\n ul: ({ children }) => <ul className=\"my-2 list-disc pl-6\">{children}</ul>,\n ol: ({ children }) => <ol className=\"my-2 list-decimal pl-6\">{children}</ol>,\n li: ({ children, ...props }) => {\n let content = children\n // Strip leading \"N.\" or \"N)\" text that duplicates the ol counter\n if ((props as Record<string, unknown>).ordered) {\n content = React.Children.map(children, (child, i) => {\n if (i === 0 && typeof child === 'string') {\n return child.replace(/^\\d+[.)]\\s*/, '')\n }\n return child\n })\n }\n return <li className=\"my-1\">{content}</li>\n },\n strong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n em: ({ children }) => <em className=\"italic text-text-secondary\">{children}</em>,\n h1: ({ children }) => <h1 className=\"text-base font-bold mt-4 mb-2\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"text-sm font-bold mt-3 mb-1\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"text-sm font-semibold mt-2 mb-1\">{children}</h3>,\n hr: () => <hr className=\"my-3 border-border\" />,\n code: ({ children }) => <code className=\"bg-surface-sunken rounded px-1 py-0.5 text-xs font-mono\">{children}</code>,\n }}\n >\n {normalizeMarkdownLists(content)}\n </ReactMarkdown>\n </div>\n )\n}\n\nexport { ResponseMessage }\nexport type { ResponseMessageProps }\n","import React from 'react'\nimport type { AgentResponse } from '../../types/agent'\n\ntype StructuredResponseProps = {\n uiHint: AgentResponse['ui_hint']\n data: Record<string, unknown> | null\n className?: string\n}\n\n/** Parse a value that may be a JSON-encoded string or already parsed. */\nfunction tryParse<T>(value: unknown): T | null {\n if (value === undefined || value === null) return null\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n }\n return value as T\n}\n\nfunction renderSteps(data: Record<string, unknown>) {\n const steps = tryParse<string[]>(data.steps)\n if (!steps || !Array.isArray(steps)) return null\n return (\n <ol className=\"flex flex-col gap-2\" data-testid=\"structured-steps\">\n {steps.map((step, i) => (\n <li key={i} className=\"flex items-start gap-3\">\n <span\n className=\"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-accent text-[11px] font-semibold text-white\"\n aria-hidden=\"true\"\n >\n {i + 1}\n </span>\n <span className=\"text-sm text-text-primary leading-relaxed\">{step}</span>\n </li>\n ))}\n </ol>\n )\n}\n\nfunction renderTable(data: Record<string, unknown>) {\n const columns = tryParse<string[]>(data.columns)\n // rows may be array-of-arrays or array-of-objects; normalise to array-of-arrays\n const rawRows = tryParse<unknown[]>(data.rows)\n\n if (columns && rawRows && Array.isArray(columns) && Array.isArray(rawRows)) {\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <thead className=\"bg-surface-raised\">\n <tr>\n {columns.map((col) => (\n <th\n key={col}\n className=\"text-left px-4 py-2.5 font-semibold text-text-primary border-b border-border\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rawRows.map((row, i) => {\n const cells = Array.isArray(row)\n ? row\n : columns.map((col) => (row as Record<string, unknown>)[col])\n return (\n <tr key={i} className=\"even:bg-surface-raised/40\">\n {cells.map((cell, j) => (\n <td key={j} className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {String(cell ?? '')}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n }\n\n // Fallback: key-value table\n const entries = Object.entries(data)\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <tbody>\n {entries.map(([key, value]) => (\n <tr key={key} className=\"even:bg-surface-raised/40\">\n <td className=\"px-4 py-2 text-text-primary font-medium border-b border-border w-1/3\">\n {key}\n </td>\n <td className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {typeof value === 'object' ? JSON.stringify(value) : String(value ?? '')}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction renderCard(data: Record<string, unknown>) {\n const title = typeof data.title === 'string' ? data.title : null\n const body = typeof data.body === 'string' ? data.body : null\n const link = typeof data.link === 'string' ? data.link : null\n const linkLabel = typeof data.link_label === 'string' ? data.link_label : 'Learn more'\n\n return (\n <div\n className=\"rounded-xl border border-border bg-surface-raised p-4 flex flex-col gap-2\"\n data-testid=\"structured-card\"\n >\n {title && <p className=\"text-sm font-semibold text-text-primary\">{title}</p>}\n {body && <p className=\"text-sm text-text-secondary leading-relaxed\">{body}</p>}\n {link && (\n <a\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-xs font-medium text-accent hover:text-accent/80 underline-offset-2 hover:underline transition-colors\"\n >\n {linkLabel}\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </a>\n )}\n </div>\n )\n}\n\nfunction renderList(data: Record<string, unknown>) {\n const items = tryParse<string[]>(data.items)\n const title = typeof data.title === 'string' ? data.title : null\n if (!items || !Array.isArray(items)) return null\n\n return (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"structured-list\">\n {title && (\n <p className=\"text-xs font-semibold uppercase tracking-wider text-text-secondary mb-1\">{title}</p>\n )}\n <ul className=\"flex flex-col gap-1.5\">\n {items.map((item, i) => (\n <li key={i} className=\"flex items-start gap-2.5\">\n <span className=\"mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-accent\" aria-hidden=\"true\" />\n <span className=\"text-sm text-text-primary leading-relaxed\">{item}</span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nfunction renderWarning(data: Record<string, unknown>) {\n const severity = typeof data.severity === 'string' ? data.severity : 'medium'\n const action = typeof data.action === 'string' ? data.action : null\n const details = typeof data.details === 'string' ? data.details : null\n const isHigh = severity === 'high'\n\n return (\n <div\n role=\"alert\"\n className={`rounded-xl border p-4 flex gap-3 ${\n isHigh\n ? 'border-red-200 bg-red-50 dark:border-red-900/50 dark:bg-red-950/30'\n : 'border-amber-200 bg-amber-50 dark:border-amber-900/50 dark:bg-amber-950/30'\n }`}\n data-testid=\"structured-warning\"\n >\n <svg\n className={`mt-0.5 h-5 w-5 shrink-0 ${isHigh ? 'text-red-500' : 'text-amber-500'}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n <div className=\"flex flex-col gap-1\">\n {action && (\n <p className={`text-sm font-semibold ${isHigh ? 'text-red-700 dark:text-red-300' : 'text-amber-700 dark:text-amber-300'}`}>\n {action}\n </p>\n )}\n {details && (\n <p className={`text-sm ${isHigh ? 'text-red-600 dark:text-red-400' : 'text-amber-600 dark:text-amber-400'}`}>\n {details}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nfunction StructuredResponse({ uiHint, data: rawData, className }: StructuredResponseProps) {\n // Defensive: data may arrive as a JSON string from the API instead of a parsed object.\n const data = typeof rawData === 'string'\n ? (() => { try { return JSON.parse(rawData) as Record<string, unknown> } catch { return null } })()\n : rawData\n if (!data) return null\n\n let content: React.ReactNode\n\n switch (uiHint) {\n case 'steps':\n content = renderSteps(data)\n break\n case 'table':\n content = renderTable(data)\n break\n case 'card':\n content = renderCard(data)\n break\n case 'list':\n content = renderList(data)\n break\n case 'warning':\n content = renderWarning(data)\n break\n case 'text':\n content = typeof data.text === 'string'\n ? <p data-testid=\"structured-text\">{data.text}</p>\n : null\n break\n default:\n content = null\n }\n\n if (!content) return null\n\n return (\n <div className={className} data-testid=\"structured-response\">\n {content}\n </div>\n )\n}\n\nexport { StructuredResponse }\nexport type { StructuredResponseProps }\n","'use client'\n\nimport React, { useState } from 'react'\nimport type { Source } from '../../types/agent'\nimport { SourceCard } from '../SourceCard'\n\ntype SourceListProps = {\n sources: Source[]\n variant?: 'compact' | 'expanded'\n collapsible?: boolean\n defaultExpanded?: boolean\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction SourceList({\n sources,\n variant = 'compact',\n collapsible = false,\n defaultExpanded = true,\n onNavigate,\n className,\n}: SourceListProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded)\n\n if (sources.length === 0) return null\n\n const content = (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"source-list-items\">\n {sources.map((source) => (\n <SourceCard\n key={source.document_id}\n source={source}\n variant={variant}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n )\n\n if (!collapsible) {\n return (\n <div className={className} data-testid=\"source-list\">\n {content}\n </div>\n )\n }\n\n return (\n <div className={className} data-testid=\"source-list\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(prev => !prev)}\n aria-expanded={isExpanded}\n className=\"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-text-secondary hover:text-accent mb-2 transition-colors duration-200\"\n >\n <svg\n className={`w-4 h-4 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n Sources ({sources.length})\n </button>\n {isExpanded && content}\n </div>\n )\n}\n\nexport { SourceList }\nexport type { SourceListProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport { twMerge } from 'tailwind-merge'\nimport type { Source } from '../../types/agent'\n\ntype SourceCardProps = {\n source: Source\n variant?: 'compact' | 'expanded'\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction getConfidenceIntent(confidence: number) {\n if (confidence >= 0.8) return 'success' as const\n if (confidence >= 0.5) return 'warning' as const\n return 'error' as const\n}\n\nfunction getConfidenceLabel(confidence: number) {\n if (confidence >= 0.8) return 'High'\n if (confidence >= 0.5) return 'Medium'\n return 'Low'\n}\n\nfunction SourceCard({ source, variant = 'compact', onNavigate, className }: SourceCardProps) {\n const handleClick = () => {\n if (onNavigate) {\n onNavigate(source)\n }\n }\n\n const isCompact = variant === 'compact'\n\n return (\n <div\n className={twMerge(\n 'rounded-xl border transition-all duration-200',\n 'bg-surface border-border',\n onNavigate && 'cursor-pointer hover:border-border-strong',\n className,\n )}\n data-document-id={source.document_id}\n data-testid=\"source-card\"\n >\n <div\n className={isCompact ? 'px-4 py-3' : 'px-6 py-4'}\n onClick={handleClick}\n role={onNavigate ? 'button' : undefined}\n tabIndex={onNavigate ? 0 : undefined}\n onKeyDown={\n onNavigate\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }\n : undefined\n }\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n {source.url ? (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-accent hover:underline truncate block\"\n onClick={(e) => e.stopPropagation()}\n >\n {source.title}\n <svg\n className=\"inline-block ml-1 w-3 h-3 opacity-60\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n </a>\n ) : (\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {source.title}\n </p>\n )}\n {source.section && (\n <p className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary truncate mt-0.5\">\n {source.section}\n </p>\n )}\n </div>\n <Badge\n intent={getConfidenceIntent(source.confidence)}\n size=\"sm\"\n >\n {getConfidenceLabel(source.confidence)}\n </Badge>\n </div>\n {!isCompact && (\n <p className=\"text-xs text-text-secondary mt-2 line-clamp-3 leading-relaxed\">\n {source.snippet}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nexport { SourceCard }\nexport type { SourceCardProps }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ntype FollowUpChipsProps = {\n suggestions: string[]\n onSelect: (suggestion: string) => void\n className?: string\n}\n\nfunction FollowUpChips({ suggestions, onSelect, className }: FollowUpChipsProps) {\n if (suggestions.length === 0) return null\n\n return (\n <div\n className={twMerge('flex flex-wrap gap-2 py-1', className)}\n role=\"group\"\n aria-label=\"Follow-up suggestions\"\n data-testid=\"follow-up-chips\"\n >\n {suggestions.map(suggestion => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => onSelect(suggestion)}\n className={twMerge(\n 'px-4 py-1.5 rounded-full text-sm whitespace-nowrap',\n 'border border-border bg-transparent text-text-secondary',\n 'hover:bg-accent/10 hover:border-interactive hover:text-text-primary',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n 'transition-all duration-200',\n )}\n >\n {suggestion}\n </button>\n ))}\n </div>\n )\n}\n\nexport { FollowUpChips }\nexport type { FollowUpChipsProps }\n","import React from 'react'\nimport { Alert, Button } from '@surf-kit/core'\nimport type { ChatError } from '../../types/chat'\n\ntype ErrorResponseProps = {\n error: ChatError\n onRetry?: () => void\n className?: string\n}\n\nfunction ErrorResponse({ error, onRetry, className }: ErrorResponseProps) {\n return (\n <div role=\"alert\" className={className} data-testid=\"error-response\">\n <Alert intent=\"error\" title=\"Error\">\n <p>{error.message}</p>\n {error.retryable && onRetry && (\n <div className=\"mt-3\">\n <Button\n intent=\"secondary\"\n size=\"sm\"\n onPress={onRetry}\n aria-label=\"Retry\"\n >\n Retry\n </Button>\n </div>\n )}\n </Alert>\n </div>\n )\n}\n\nexport { ErrorResponse }\nexport type { ErrorResponseProps }\n"],"mappings":"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","names":["import_core","ReactMarkdown","rehypeSanitize","content","React","import_jsx_runtime","import_react","import_tailwind_merge","import_jsx_runtime","import_jsx_runtime","import_tailwind_merge","import_jsx_runtime","import_jsx_runtime","getConfidenceIntent","import_core","import_jsx_runtime"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { a as AgentResponse$1 } from '../agent-BNSmiexZ.cjs';
|
|
3
|
-
import { C as ChatError } from '../chat-
|
|
3
|
+
import { C as ChatError } from '../chat-CGamM7Mz.cjs';
|
|
4
4
|
import 'react';
|
|
5
5
|
|
|
6
6
|
type AgentResponseProps = {
|
|
@@ -25,7 +25,7 @@ type StructuredResponseProps = {
|
|
|
25
25
|
data: Record<string, unknown> | null;
|
|
26
26
|
className?: string;
|
|
27
27
|
};
|
|
28
|
-
declare function StructuredResponse({ uiHint, data, className }: StructuredResponseProps): react_jsx_runtime.JSX.Element | null;
|
|
28
|
+
declare function StructuredResponse({ uiHint, data: rawData, className }: StructuredResponseProps): react_jsx_runtime.JSX.Element | null;
|
|
29
29
|
|
|
30
30
|
type FollowUpChipsProps = {
|
|
31
31
|
suggestions: string[];
|
package/dist/response/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { a as AgentResponse$1 } from '../agent-BNSmiexZ.js';
|
|
3
|
-
import { C as ChatError } from '../chat
|
|
3
|
+
import { C as ChatError } from '../chat-BIIDOGrD.js';
|
|
4
4
|
import 'react';
|
|
5
5
|
|
|
6
6
|
type AgentResponseProps = {
|
|
@@ -25,7 +25,7 @@ type StructuredResponseProps = {
|
|
|
25
25
|
data: Record<string, unknown> | null;
|
|
26
26
|
className?: string;
|
|
27
27
|
};
|
|
28
|
-
declare function StructuredResponse({ uiHint, data, className }: StructuredResponseProps): react_jsx_runtime.JSX.Element | null;
|
|
28
|
+
declare function StructuredResponse({ uiHint, data: rawData, className }: StructuredResponseProps): react_jsx_runtime.JSX.Element | null;
|
|
29
29
|
|
|
30
30
|
type FollowUpChipsProps = {
|
|
31
31
|
suggestions: string[];
|
package/dist/response/index.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { Badge as Badge2 } from "@surf-kit/core";
|
|
5
5
|
|
|
6
6
|
// src/response/ResponseMessage/ResponseMessage.tsx
|
|
7
|
+
import React from "react";
|
|
7
8
|
import ReactMarkdown from "react-markdown";
|
|
8
9
|
import rehypeSanitize from "rehype-sanitize";
|
|
9
10
|
import { twMerge } from "tailwind-merge";
|
|
@@ -28,6 +29,7 @@ function ResponseMessage({ content, className }) {
|
|
|
28
29
|
"[&_h3]:text-sm [&_h3]:font-semibold [&_h3]:text-accent [&_h3]:mt-2 [&_h3]:mb-1",
|
|
29
30
|
"[&_code]:bg-surface-raised [&_code]:text-accent [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_code]:font-mono",
|
|
30
31
|
"[&_pre]:bg-surface-raised [&_pre]:border [&_pre]:border-border [&_pre]:rounded-xl [&_pre]:p-4 [&_pre]:overflow-x-auto",
|
|
32
|
+
"[&_hr]:my-3 [&_hr]:border-border",
|
|
31
33
|
"[&_blockquote]:border-l-2 [&_blockquote]:border-border-strong [&_blockquote]:pl-4 [&_blockquote]:text-text-secondary",
|
|
32
34
|
"[&_a]:text-accent [&_a]:underline-offset-2 [&_a]:hover:text-accent/80",
|
|
33
35
|
className
|
|
@@ -43,11 +45,24 @@ function ResponseMessage({ content, className }) {
|
|
|
43
45
|
p: ({ children }) => /* @__PURE__ */ jsx("p", { className: "my-2", children }),
|
|
44
46
|
ul: ({ children }) => /* @__PURE__ */ jsx("ul", { className: "my-2 list-disc pl-6", children }),
|
|
45
47
|
ol: ({ children }) => /* @__PURE__ */ jsx("ol", { className: "my-2 list-decimal pl-6", children }),
|
|
46
|
-
li: ({ children }) =>
|
|
48
|
+
li: ({ children, ...props }) => {
|
|
49
|
+
let content2 = children;
|
|
50
|
+
if (props.ordered) {
|
|
51
|
+
content2 = React.Children.map(children, (child, i) => {
|
|
52
|
+
if (i === 0 && typeof child === "string") {
|
|
53
|
+
return child.replace(/^\d+[.)]\s*/, "");
|
|
54
|
+
}
|
|
55
|
+
return child;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return /* @__PURE__ */ jsx("li", { className: "my-1", children: content2 });
|
|
59
|
+
},
|
|
47
60
|
strong: ({ children }) => /* @__PURE__ */ jsx("strong", { className: "font-semibold", children }),
|
|
61
|
+
em: ({ children }) => /* @__PURE__ */ jsx("em", { className: "italic text-text-secondary", children }),
|
|
48
62
|
h1: ({ children }) => /* @__PURE__ */ jsx("h1", { className: "text-base font-bold mt-4 mb-2", children }),
|
|
49
63
|
h2: ({ children }) => /* @__PURE__ */ jsx("h2", { className: "text-sm font-bold mt-3 mb-1", children }),
|
|
50
64
|
h3: ({ children }) => /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold mt-2 mb-1", children }),
|
|
65
|
+
hr: () => /* @__PURE__ */ jsx("hr", { className: "my-3 border-border" }),
|
|
51
66
|
code: ({ children }) => /* @__PURE__ */ jsx("code", { className: "bg-surface-sunken rounded px-1 py-0.5 text-xs font-mono", children })
|
|
52
67
|
},
|
|
53
68
|
children: normalizeMarkdownLists(content)
|
|
@@ -183,7 +198,14 @@ function renderWarning(data) {
|
|
|
183
198
|
}
|
|
184
199
|
);
|
|
185
200
|
}
|
|
186
|
-
function StructuredResponse({ uiHint, data, className }) {
|
|
201
|
+
function StructuredResponse({ uiHint, data: rawData, className }) {
|
|
202
|
+
const data = typeof rawData === "string" ? (() => {
|
|
203
|
+
try {
|
|
204
|
+
return JSON.parse(rawData);
|
|
205
|
+
} catch {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
})() : rawData;
|
|
187
209
|
if (!data) return null;
|
|
188
210
|
let content;
|
|
189
211
|
switch (uiHint) {
|
|
@@ -263,7 +285,36 @@ function SourceCard({ source, variant = "compact", onNavigate, className }) {
|
|
|
263
285
|
children: [
|
|
264
286
|
/* @__PURE__ */ jsxs2("div", { className: "flex items-start justify-between gap-2", children: [
|
|
265
287
|
/* @__PURE__ */ jsxs2("div", { className: "flex-1 min-w-0", children: [
|
|
266
|
-
/* @__PURE__ */
|
|
288
|
+
source.url ? /* @__PURE__ */ jsxs2(
|
|
289
|
+
"a",
|
|
290
|
+
{
|
|
291
|
+
href: source.url,
|
|
292
|
+
target: "_blank",
|
|
293
|
+
rel: "noopener noreferrer",
|
|
294
|
+
className: "text-sm font-medium text-accent hover:underline truncate block",
|
|
295
|
+
onClick: (e) => e.stopPropagation(),
|
|
296
|
+
children: [
|
|
297
|
+
source.title,
|
|
298
|
+
/* @__PURE__ */ jsxs2(
|
|
299
|
+
"svg",
|
|
300
|
+
{
|
|
301
|
+
className: "inline-block ml-1 w-3 h-3 opacity-60",
|
|
302
|
+
viewBox: "0 0 24 24",
|
|
303
|
+
fill: "none",
|
|
304
|
+
stroke: "currentColor",
|
|
305
|
+
strokeWidth: "2",
|
|
306
|
+
strokeLinecap: "round",
|
|
307
|
+
strokeLinejoin: "round",
|
|
308
|
+
children: [
|
|
309
|
+
/* @__PURE__ */ jsx3("path", { d: "M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6" }),
|
|
310
|
+
/* @__PURE__ */ jsx3("polyline", { points: "15 3 21 3 21 9" }),
|
|
311
|
+
/* @__PURE__ */ jsx3("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
|
|
312
|
+
]
|
|
313
|
+
}
|
|
314
|
+
)
|
|
315
|
+
]
|
|
316
|
+
}
|
|
317
|
+
) : /* @__PURE__ */ jsx3("p", { className: "text-sm font-medium text-text-primary truncate", children: source.title }),
|
|
267
318
|
source.section && /* @__PURE__ */ jsx3("p", { className: "text-[11px] font-semibold uppercase tracking-wider text-text-secondary truncate mt-0.5", children: source.section })
|
|
268
319
|
] }),
|
|
269
320
|
/* @__PURE__ */ jsx3(
|
|
@@ -397,13 +448,16 @@ function AgentResponse({
|
|
|
397
448
|
}) {
|
|
398
449
|
return /* @__PURE__ */ jsxs4("div", { className: `flex flex-col gap-4 ${className ?? ""}`, "data-testid": "agent-response", children: [
|
|
399
450
|
/* @__PURE__ */ jsx6(ResponseMessage, { content: response.message }),
|
|
400
|
-
response.ui_hint !== "text" && response.structured_data &&
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
451
|
+
response.ui_hint !== "text" && response.structured_data && (() => {
|
|
452
|
+
const parsed = typeof response.structured_data === "string" ? (() => {
|
|
453
|
+
try {
|
|
454
|
+
return JSON.parse(response.structured_data);
|
|
455
|
+
} catch {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
})() : response.structured_data;
|
|
459
|
+
return parsed ? /* @__PURE__ */ jsx6(StructuredResponse, { uiHint: response.ui_hint, data: parsed }) : null;
|
|
460
|
+
})(),
|
|
407
461
|
(showConfidence || showVerification) && /* @__PURE__ */ jsxs4("div", { className: "flex flex-wrap items-center gap-2 mt-1", "data-testid": "response-meta", children: [
|
|
408
462
|
showConfidence && /* @__PURE__ */ jsxs4(
|
|
409
463
|
Badge2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/response/AgentResponse/AgentResponse.tsx","../../src/response/ResponseMessage/ResponseMessage.tsx","../../src/response/StructuredResponse/StructuredResponse.tsx","../../src/sources/SourceList/SourceList.tsx","../../src/sources/SourceCard/SourceCard.tsx","../../src/response/FollowUpChips/FollowUpChips.tsx","../../src/response/ErrorResponse/ErrorResponse.tsx"],"sourcesContent":["import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { AgentResponse as AgentResponseType } from '../../types/agent'\nimport { ResponseMessage } from '../ResponseMessage'\nimport { StructuredResponse } from '../StructuredResponse'\nimport { SourceList } from '../../sources/SourceList'\nimport { FollowUpChips } from '../FollowUpChips'\n\ntype AgentResponseProps = {\n response: AgentResponseType\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n onFollowUp?: (suggestion: string) => void\n onNavigateSource?: (source: AgentResponseType['sources'][number]) => void\n className?: string\n}\n\nfunction getConfidenceIntent(overall: 'high' | 'medium' | 'low') {\n if (overall === 'high') return 'success' as const\n if (overall === 'medium') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationIntent(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'success' as const\n if (status === 'flagged') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationLabel(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'Verified'\n if (status === 'flagged') return 'Flagged'\n return 'Failed'\n}\n\nfunction AgentResponse({\n response,\n showSources = true,\n showConfidence = false,\n showVerification = false,\n onFollowUp,\n onNavigateSource,\n className,\n}: AgentResponseProps) {\n return (\n <div className={`flex flex-col gap-4 ${className ?? ''}`} data-testid=\"agent-response\">\n {/* Lead message — always shown as a short 1-3 sentence summary */}\n <ResponseMessage content={response.message} />\n\n {/* Structured content — rendered when ui_hint is not plain text */}\n {response.ui_hint !== 'text' && response.structured_data && (\n <StructuredResponse\n uiHint={response.ui_hint}\n data={response.structured_data as Record<string, unknown>}\n />\n )}\n\n {/* Confidence & Verification badges */}\n {(showConfidence || showVerification) && (\n <div className=\"flex flex-wrap items-center gap-2 mt-1\" data-testid=\"response-meta\">\n {showConfidence && (\n <Badge\n intent={getConfidenceIntent(response.confidence.overall)}\n size=\"sm\"\n >\n {response.confidence.overall} confidence\n </Badge>\n )}\n {showVerification && (\n <Badge\n intent={getVerificationIntent(response.verification.status)}\n size=\"sm\"\n >\n {getVerificationLabel(response.verification.status)} ({response.verification.claims_verified}/{response.verification.claims_checked})\n </Badge>\n )}\n </div>\n )}\n\n {/* Sources */}\n {showSources && response.sources.length > 0 && (\n <SourceList\n sources={response.sources}\n variant=\"compact\"\n collapsible\n defaultExpanded={false}\n onNavigate={onNavigateSource}\n />\n )}\n\n {/* Follow-up suggestions */}\n {response.follow_up_suggestions.length > 0 && onFollowUp && (\n <FollowUpChips\n suggestions={response.follow_up_suggestions}\n onSelect={onFollowUp}\n />\n )}\n </div>\n )\n}\n\nexport { AgentResponse }\nexport type { AgentResponseProps }\n","import React from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport rehypeSanitize from 'rehype-sanitize'\nimport { twMerge } from 'tailwind-merge'\n\ntype ResponseMessageProps = {\n content: string\n className?: string\n}\n\nfunction normalizeMarkdownLists(content: string) {\n // Some providers emit compact list markdown like \"Intro: - item 1 - item 2\".\n // Insert a paragraph break before an inline list marker so markdown parses it as a list.\n return content.replace(/:\\s+-\\s+/g, ':\\n\\n- ')\n}\n\nfunction ResponseMessage({ content, className }: ResponseMessageProps) {\n return (\n <div\n className={twMerge(\n 'text-sm leading-relaxed text-text-primary',\n '[&_p]:my-2',\n '[&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6',\n '[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6',\n '[&_li]:my-1',\n '[&_strong]:text-text-primary [&_strong]:font-semibold',\n '[&_em]:text-text-secondary',\n '[&_h1]:text-lg [&_h1]:font-semibold [&_h1]:text-text-primary [&_h1]:mt-4 [&_h1]:mb-2',\n '[&_h2]:text-base [&_h2]:font-semibold [&_h2]:text-text-primary [&_h2]:mt-3 [&_h2]:mb-1.5',\n '[&_h3]:text-sm [&_h3]:font-semibold [&_h3]:text-accent [&_h3]:mt-2 [&_h3]:mb-1',\n '[&_code]:bg-surface-raised [&_code]:text-accent [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_code]:font-mono',\n '[&_pre]:bg-surface-raised [&_pre]:border [&_pre]:border-border [&_pre]:rounded-xl [&_pre]:p-4 [&_pre]:overflow-x-auto',\n '[&_blockquote]:border-l-2 [&_blockquote]:border-border-strong [&_blockquote]:pl-4 [&_blockquote]:text-text-secondary',\n '[&_a]:text-accent [&_a]:underline-offset-2 [&_a]:hover:text-accent/80',\n className,\n )}\n data-testid=\"response-message\"\n >\n <ReactMarkdown\n rehypePlugins={[rehypeSanitize]}\n components={{\n script: () => null,\n iframe: () => null,\n p: ({ children }) => <p className=\"my-2\">{children}</p>,\n ul: ({ children }) => <ul className=\"my-2 list-disc pl-6\">{children}</ul>,\n ol: ({ children }) => <ol className=\"my-2 list-decimal pl-6\">{children}</ol>,\n li: ({ children }) => <li className=\"my-1\">{children}</li>,\n strong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n h1: ({ children }) => <h1 className=\"text-base font-bold mt-4 mb-2\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"text-sm font-bold mt-3 mb-1\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"text-sm font-semibold mt-2 mb-1\">{children}</h3>,\n code: ({ children }) => <code className=\"bg-surface-sunken rounded px-1 py-0.5 text-xs font-mono\">{children}</code>,\n }}\n >\n {normalizeMarkdownLists(content)}\n </ReactMarkdown>\n </div>\n )\n}\n\nexport { ResponseMessage }\nexport type { ResponseMessageProps }\n","import React from 'react'\nimport type { AgentResponse } from '../../types/agent'\n\ntype StructuredResponseProps = {\n uiHint: AgentResponse['ui_hint']\n data: Record<string, unknown> | null\n className?: string\n}\n\n/** Parse a value that may be a JSON-encoded string or already parsed. */\nfunction tryParse<T>(value: unknown): T | null {\n if (value === undefined || value === null) return null\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n }\n return value as T\n}\n\nfunction renderSteps(data: Record<string, unknown>) {\n const steps = tryParse<string[]>(data.steps)\n if (!steps || !Array.isArray(steps)) return null\n return (\n <ol className=\"flex flex-col gap-2\" data-testid=\"structured-steps\">\n {steps.map((step, i) => (\n <li key={i} className=\"flex items-start gap-3\">\n <span\n className=\"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-accent text-[11px] font-semibold text-white\"\n aria-hidden=\"true\"\n >\n {i + 1}\n </span>\n <span className=\"text-sm text-text-primary leading-relaxed\">{step}</span>\n </li>\n ))}\n </ol>\n )\n}\n\nfunction renderTable(data: Record<string, unknown>) {\n const columns = tryParse<string[]>(data.columns)\n // rows may be array-of-arrays or array-of-objects; normalise to array-of-arrays\n const rawRows = tryParse<unknown[]>(data.rows)\n\n if (columns && rawRows && Array.isArray(columns) && Array.isArray(rawRows)) {\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <thead className=\"bg-surface-raised\">\n <tr>\n {columns.map((col) => (\n <th\n key={col}\n className=\"text-left px-4 py-2.5 font-semibold text-text-primary border-b border-border\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rawRows.map((row, i) => {\n const cells = Array.isArray(row)\n ? row\n : columns.map((col) => (row as Record<string, unknown>)[col])\n return (\n <tr key={i} className=\"even:bg-surface-raised/40\">\n {cells.map((cell, j) => (\n <td key={j} className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {String(cell ?? '')}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n }\n\n // Fallback: key-value table\n const entries = Object.entries(data)\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <tbody>\n {entries.map(([key, value]) => (\n <tr key={key} className=\"even:bg-surface-raised/40\">\n <td className=\"px-4 py-2 text-text-primary font-medium border-b border-border w-1/3\">\n {key}\n </td>\n <td className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {typeof value === 'object' ? JSON.stringify(value) : String(value ?? '')}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction renderCard(data: Record<string, unknown>) {\n const title = typeof data.title === 'string' ? data.title : null\n const body = typeof data.body === 'string' ? data.body : null\n const link = typeof data.link === 'string' ? data.link : null\n const linkLabel = typeof data.link_label === 'string' ? data.link_label : 'Learn more'\n\n return (\n <div\n className=\"rounded-xl border border-border bg-surface-raised p-4 flex flex-col gap-2\"\n data-testid=\"structured-card\"\n >\n {title && <p className=\"text-sm font-semibold text-text-primary\">{title}</p>}\n {body && <p className=\"text-sm text-text-secondary leading-relaxed\">{body}</p>}\n {link && (\n <a\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-xs font-medium text-accent hover:text-accent/80 underline-offset-2 hover:underline transition-colors\"\n >\n {linkLabel}\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </a>\n )}\n </div>\n )\n}\n\nfunction renderList(data: Record<string, unknown>) {\n const items = tryParse<string[]>(data.items)\n const title = typeof data.title === 'string' ? data.title : null\n if (!items || !Array.isArray(items)) return null\n\n return (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"structured-list\">\n {title && (\n <p className=\"text-xs font-semibold uppercase tracking-wider text-text-secondary mb-1\">{title}</p>\n )}\n <ul className=\"flex flex-col gap-1.5\">\n {items.map((item, i) => (\n <li key={i} className=\"flex items-start gap-2.5\">\n <span className=\"mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-accent\" aria-hidden=\"true\" />\n <span className=\"text-sm text-text-primary leading-relaxed\">{item}</span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nfunction renderWarning(data: Record<string, unknown>) {\n const severity = typeof data.severity === 'string' ? data.severity : 'medium'\n const action = typeof data.action === 'string' ? data.action : null\n const details = typeof data.details === 'string' ? data.details : null\n const isHigh = severity === 'high'\n\n return (\n <div\n role=\"alert\"\n className={`rounded-xl border p-4 flex gap-3 ${\n isHigh\n ? 'border-red-200 bg-red-50 dark:border-red-900/50 dark:bg-red-950/30'\n : 'border-amber-200 bg-amber-50 dark:border-amber-900/50 dark:bg-amber-950/30'\n }`}\n data-testid=\"structured-warning\"\n >\n <svg\n className={`mt-0.5 h-5 w-5 shrink-0 ${isHigh ? 'text-red-500' : 'text-amber-500'}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n <div className=\"flex flex-col gap-1\">\n {action && (\n <p className={`text-sm font-semibold ${isHigh ? 'text-red-700 dark:text-red-300' : 'text-amber-700 dark:text-amber-300'}`}>\n {action}\n </p>\n )}\n {details && (\n <p className={`text-sm ${isHigh ? 'text-red-600 dark:text-red-400' : 'text-amber-600 dark:text-amber-400'}`}>\n {details}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nfunction StructuredResponse({ uiHint, data, className }: StructuredResponseProps) {\n if (!data) return null\n\n let content: React.ReactNode\n\n switch (uiHint) {\n case 'steps':\n content = renderSteps(data)\n break\n case 'table':\n content = renderTable(data)\n break\n case 'card':\n content = renderCard(data)\n break\n case 'list':\n content = renderList(data)\n break\n case 'warning':\n content = renderWarning(data)\n break\n case 'text':\n content = typeof data.text === 'string'\n ? <p data-testid=\"structured-text\">{data.text}</p>\n : null\n break\n default:\n content = null\n }\n\n if (!content) return null\n\n return (\n <div className={className} data-testid=\"structured-response\">\n {content}\n </div>\n )\n}\n\nexport { StructuredResponse }\nexport type { StructuredResponseProps }\n","'use client'\n\nimport React, { useState } from 'react'\nimport type { Source } from '../../types/agent'\nimport { SourceCard } from '../SourceCard'\n\ntype SourceListProps = {\n sources: Source[]\n variant?: 'compact' | 'expanded'\n collapsible?: boolean\n defaultExpanded?: boolean\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction SourceList({\n sources,\n variant = 'compact',\n collapsible = false,\n defaultExpanded = true,\n onNavigate,\n className,\n}: SourceListProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded)\n\n if (sources.length === 0) return null\n\n const content = (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"source-list-items\">\n {sources.map((source) => (\n <SourceCard\n key={source.document_id}\n source={source}\n variant={variant}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n )\n\n if (!collapsible) {\n return (\n <div className={className} data-testid=\"source-list\">\n {content}\n </div>\n )\n }\n\n return (\n <div className={className} data-testid=\"source-list\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(prev => !prev)}\n aria-expanded={isExpanded}\n className=\"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-text-secondary hover:text-accent mb-2 transition-colors duration-200\"\n >\n <svg\n className={`w-4 h-4 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n Sources ({sources.length})\n </button>\n {isExpanded && content}\n </div>\n )\n}\n\nexport { SourceList }\nexport type { SourceListProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport { twMerge } from 'tailwind-merge'\nimport type { Source } from '../../types/agent'\n\ntype SourceCardProps = {\n source: Source\n variant?: 'compact' | 'expanded'\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction getConfidenceIntent(confidence: number) {\n if (confidence >= 0.8) return 'success' as const\n if (confidence >= 0.5) return 'warning' as const\n return 'error' as const\n}\n\nfunction getConfidenceLabel(confidence: number) {\n if (confidence >= 0.8) return 'High'\n if (confidence >= 0.5) return 'Medium'\n return 'Low'\n}\n\nfunction SourceCard({ source, variant = 'compact', onNavigate, className }: SourceCardProps) {\n const handleClick = () => {\n if (onNavigate) {\n onNavigate(source)\n }\n }\n\n const isCompact = variant === 'compact'\n\n return (\n <div\n className={twMerge(\n 'rounded-xl border transition-all duration-200',\n 'bg-surface border-border',\n onNavigate && 'cursor-pointer hover:border-border-strong',\n className,\n )}\n data-document-id={source.document_id}\n data-testid=\"source-card\"\n >\n <div\n className={isCompact ? 'px-4 py-3' : 'px-6 py-4'}\n onClick={handleClick}\n role={onNavigate ? 'button' : undefined}\n tabIndex={onNavigate ? 0 : undefined}\n onKeyDown={\n onNavigate\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }\n : undefined\n }\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {source.title}\n </p>\n {source.section && (\n <p className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary truncate mt-0.5\">\n {source.section}\n </p>\n )}\n </div>\n <Badge\n intent={getConfidenceIntent(source.confidence)}\n size=\"sm\"\n >\n {getConfidenceLabel(source.confidence)}\n </Badge>\n </div>\n {!isCompact && (\n <p className=\"text-xs text-text-secondary mt-2 line-clamp-3 leading-relaxed\">\n {source.snippet}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nexport { SourceCard }\nexport type { SourceCardProps }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ntype FollowUpChipsProps = {\n suggestions: string[]\n onSelect: (suggestion: string) => void\n className?: string\n}\n\nfunction FollowUpChips({ suggestions, onSelect, className }: FollowUpChipsProps) {\n if (suggestions.length === 0) return null\n\n return (\n <div\n className={twMerge('flex flex-wrap gap-2 py-1', className)}\n role=\"group\"\n aria-label=\"Follow-up suggestions\"\n data-testid=\"follow-up-chips\"\n >\n {suggestions.map(suggestion => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => onSelect(suggestion)}\n className={twMerge(\n 'px-4 py-1.5 rounded-full text-sm whitespace-nowrap',\n 'border border-border bg-transparent text-text-secondary',\n 'hover:bg-accent/10 hover:border-interactive hover:text-text-primary',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n 'transition-all duration-200',\n )}\n >\n {suggestion}\n </button>\n ))}\n </div>\n )\n}\n\nexport { FollowUpChips }\nexport type { FollowUpChipsProps }\n","import React from 'react'\nimport { Alert, Button } from '@surf-kit/core'\nimport type { ChatError } from '../../types/chat'\n\ntype ErrorResponseProps = {\n error: ChatError\n onRetry?: () => void\n className?: string\n}\n\nfunction ErrorResponse({ error, onRetry, className }: ErrorResponseProps) {\n return (\n <div role=\"alert\" className={className} data-testid=\"error-response\">\n <Alert intent=\"error\" title=\"Error\">\n <p>{error.message}</p>\n {error.retryable && onRetry && (\n <div className=\"mt-3\">\n <Button\n intent=\"secondary\"\n size=\"sm\"\n onPress={onRetry}\n aria-label=\"Retry\"\n >\n Retry\n </Button>\n </div>\n )}\n </Alert>\n </div>\n )\n}\n\nexport { ErrorResponse }\nexport type { ErrorResponseProps }\n"],"mappings":"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","names":["Badge","jsx","twMerge","jsx","jsxs","jsx","jsxs","twMerge","jsx","jsx","jsxs","getConfidenceIntent","Badge","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../../src/response/AgentResponse/AgentResponse.tsx","../../src/response/ResponseMessage/ResponseMessage.tsx","../../src/response/StructuredResponse/StructuredResponse.tsx","../../src/sources/SourceList/SourceList.tsx","../../src/sources/SourceCard/SourceCard.tsx","../../src/response/FollowUpChips/FollowUpChips.tsx","../../src/response/ErrorResponse/ErrorResponse.tsx"],"sourcesContent":["import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { AgentResponse as AgentResponseType } from '../../types/agent'\nimport { ResponseMessage } from '../ResponseMessage'\nimport { StructuredResponse } from '../StructuredResponse'\nimport { SourceList } from '../../sources/SourceList'\nimport { FollowUpChips } from '../FollowUpChips'\n\ntype AgentResponseProps = {\n response: AgentResponseType\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n onFollowUp?: (suggestion: string) => void\n onNavigateSource?: (source: AgentResponseType['sources'][number]) => void\n className?: string\n}\n\nfunction getConfidenceIntent(overall: 'high' | 'medium' | 'low') {\n if (overall === 'high') return 'success' as const\n if (overall === 'medium') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationIntent(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'success' as const\n if (status === 'flagged') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationLabel(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'Verified'\n if (status === 'flagged') return 'Flagged'\n return 'Failed'\n}\n\nfunction AgentResponse({\n response,\n showSources = true,\n showConfidence = false,\n showVerification = false,\n onFollowUp,\n onNavigateSource,\n className,\n}: AgentResponseProps) {\n return (\n <div className={`flex flex-col gap-4 ${className ?? ''}`} data-testid=\"agent-response\">\n {/* Lead message — always shown as a short 1-3 sentence summary */}\n <ResponseMessage content={response.message} />\n\n {/* Structured content — rendered when ui_hint is not plain text */}\n {response.ui_hint !== 'text' && response.structured_data && (() => {\n const parsed = typeof response.structured_data === 'string'\n ? (() => { try { return JSON.parse(response.structured_data) as Record<string, unknown> } catch { return null } })()\n : response.structured_data as Record<string, unknown>\n return parsed ? <StructuredResponse uiHint={response.ui_hint} data={parsed} /> : null\n })()}\n\n {/* Confidence & Verification badges */}\n {(showConfidence || showVerification) && (\n <div className=\"flex flex-wrap items-center gap-2 mt-1\" data-testid=\"response-meta\">\n {showConfidence && (\n <Badge\n intent={getConfidenceIntent(response.confidence.overall)}\n size=\"sm\"\n >\n {response.confidence.overall} confidence\n </Badge>\n )}\n {showVerification && (\n <Badge\n intent={getVerificationIntent(response.verification.status)}\n size=\"sm\"\n >\n {getVerificationLabel(response.verification.status)} ({response.verification.claims_verified}/{response.verification.claims_checked})\n </Badge>\n )}\n </div>\n )}\n\n {/* Sources */}\n {showSources && response.sources.length > 0 && (\n <SourceList\n sources={response.sources}\n variant=\"compact\"\n collapsible\n defaultExpanded={false}\n onNavigate={onNavigateSource}\n />\n )}\n\n {/* Follow-up suggestions */}\n {response.follow_up_suggestions.length > 0 && onFollowUp && (\n <FollowUpChips\n suggestions={response.follow_up_suggestions}\n onSelect={onFollowUp}\n />\n )}\n </div>\n )\n}\n\nexport { AgentResponse }\nexport type { AgentResponseProps }\n","import React from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport rehypeSanitize from 'rehype-sanitize'\nimport { twMerge } from 'tailwind-merge'\n\ntype ResponseMessageProps = {\n content: string\n className?: string\n}\n\nfunction normalizeMarkdownLists(content: string) {\n // Some providers emit compact list markdown like \"Intro: - item 1 - item 2\".\n // Insert a paragraph break before an inline list marker so markdown parses it as a list.\n return content.replace(/:\\s+-\\s+/g, ':\\n\\n- ')\n}\n\nfunction ResponseMessage({ content, className }: ResponseMessageProps) {\n return (\n <div\n className={twMerge(\n 'text-sm leading-relaxed text-text-primary',\n '[&_p]:my-2',\n '[&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6',\n '[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6',\n '[&_li]:my-1',\n '[&_strong]:text-text-primary [&_strong]:font-semibold',\n '[&_em]:text-text-secondary',\n '[&_h1]:text-lg [&_h1]:font-semibold [&_h1]:text-text-primary [&_h1]:mt-4 [&_h1]:mb-2',\n '[&_h2]:text-base [&_h2]:font-semibold [&_h2]:text-text-primary [&_h2]:mt-3 [&_h2]:mb-1.5',\n '[&_h3]:text-sm [&_h3]:font-semibold [&_h3]:text-accent [&_h3]:mt-2 [&_h3]:mb-1',\n '[&_code]:bg-surface-raised [&_code]:text-accent [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_code]:font-mono',\n '[&_pre]:bg-surface-raised [&_pre]:border [&_pre]:border-border [&_pre]:rounded-xl [&_pre]:p-4 [&_pre]:overflow-x-auto',\n '[&_hr]:my-3 [&_hr]:border-border',\n '[&_blockquote]:border-l-2 [&_blockquote]:border-border-strong [&_blockquote]:pl-4 [&_blockquote]:text-text-secondary',\n '[&_a]:text-accent [&_a]:underline-offset-2 [&_a]:hover:text-accent/80',\n className,\n )}\n data-testid=\"response-message\"\n >\n <ReactMarkdown\n rehypePlugins={[rehypeSanitize]}\n components={{\n script: () => null,\n iframe: () => null,\n p: ({ children }) => <p className=\"my-2\">{children}</p>,\n ul: ({ children }) => <ul className=\"my-2 list-disc pl-6\">{children}</ul>,\n ol: ({ children }) => <ol className=\"my-2 list-decimal pl-6\">{children}</ol>,\n li: ({ children, ...props }) => {\n let content = children\n // Strip leading \"N.\" or \"N)\" text that duplicates the ol counter\n if ((props as Record<string, unknown>).ordered) {\n content = React.Children.map(children, (child, i) => {\n if (i === 0 && typeof child === 'string') {\n return child.replace(/^\\d+[.)]\\s*/, '')\n }\n return child\n })\n }\n return <li className=\"my-1\">{content}</li>\n },\n strong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n em: ({ children }) => <em className=\"italic text-text-secondary\">{children}</em>,\n h1: ({ children }) => <h1 className=\"text-base font-bold mt-4 mb-2\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"text-sm font-bold mt-3 mb-1\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"text-sm font-semibold mt-2 mb-1\">{children}</h3>,\n hr: () => <hr className=\"my-3 border-border\" />,\n code: ({ children }) => <code className=\"bg-surface-sunken rounded px-1 py-0.5 text-xs font-mono\">{children}</code>,\n }}\n >\n {normalizeMarkdownLists(content)}\n </ReactMarkdown>\n </div>\n )\n}\n\nexport { ResponseMessage }\nexport type { ResponseMessageProps }\n","import React from 'react'\nimport type { AgentResponse } from '../../types/agent'\n\ntype StructuredResponseProps = {\n uiHint: AgentResponse['ui_hint']\n data: Record<string, unknown> | null\n className?: string\n}\n\n/** Parse a value that may be a JSON-encoded string or already parsed. */\nfunction tryParse<T>(value: unknown): T | null {\n if (value === undefined || value === null) return null\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n }\n return value as T\n}\n\nfunction renderSteps(data: Record<string, unknown>) {\n const steps = tryParse<string[]>(data.steps)\n if (!steps || !Array.isArray(steps)) return null\n return (\n <ol className=\"flex flex-col gap-2\" data-testid=\"structured-steps\">\n {steps.map((step, i) => (\n <li key={i} className=\"flex items-start gap-3\">\n <span\n className=\"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-accent text-[11px] font-semibold text-white\"\n aria-hidden=\"true\"\n >\n {i + 1}\n </span>\n <span className=\"text-sm text-text-primary leading-relaxed\">{step}</span>\n </li>\n ))}\n </ol>\n )\n}\n\nfunction renderTable(data: Record<string, unknown>) {\n const columns = tryParse<string[]>(data.columns)\n // rows may be array-of-arrays or array-of-objects; normalise to array-of-arrays\n const rawRows = tryParse<unknown[]>(data.rows)\n\n if (columns && rawRows && Array.isArray(columns) && Array.isArray(rawRows)) {\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <thead className=\"bg-surface-raised\">\n <tr>\n {columns.map((col) => (\n <th\n key={col}\n className=\"text-left px-4 py-2.5 font-semibold text-text-primary border-b border-border\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rawRows.map((row, i) => {\n const cells = Array.isArray(row)\n ? row\n : columns.map((col) => (row as Record<string, unknown>)[col])\n return (\n <tr key={i} className=\"even:bg-surface-raised/40\">\n {cells.map((cell, j) => (\n <td key={j} className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {String(cell ?? '')}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n }\n\n // Fallback: key-value table\n const entries = Object.entries(data)\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <tbody>\n {entries.map(([key, value]) => (\n <tr key={key} className=\"even:bg-surface-raised/40\">\n <td className=\"px-4 py-2 text-text-primary font-medium border-b border-border w-1/3\">\n {key}\n </td>\n <td className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {typeof value === 'object' ? JSON.stringify(value) : String(value ?? '')}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction renderCard(data: Record<string, unknown>) {\n const title = typeof data.title === 'string' ? data.title : null\n const body = typeof data.body === 'string' ? data.body : null\n const link = typeof data.link === 'string' ? data.link : null\n const linkLabel = typeof data.link_label === 'string' ? data.link_label : 'Learn more'\n\n return (\n <div\n className=\"rounded-xl border border-border bg-surface-raised p-4 flex flex-col gap-2\"\n data-testid=\"structured-card\"\n >\n {title && <p className=\"text-sm font-semibold text-text-primary\">{title}</p>}\n {body && <p className=\"text-sm text-text-secondary leading-relaxed\">{body}</p>}\n {link && (\n <a\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-xs font-medium text-accent hover:text-accent/80 underline-offset-2 hover:underline transition-colors\"\n >\n {linkLabel}\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </a>\n )}\n </div>\n )\n}\n\nfunction renderList(data: Record<string, unknown>) {\n const items = tryParse<string[]>(data.items)\n const title = typeof data.title === 'string' ? data.title : null\n if (!items || !Array.isArray(items)) return null\n\n return (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"structured-list\">\n {title && (\n <p className=\"text-xs font-semibold uppercase tracking-wider text-text-secondary mb-1\">{title}</p>\n )}\n <ul className=\"flex flex-col gap-1.5\">\n {items.map((item, i) => (\n <li key={i} className=\"flex items-start gap-2.5\">\n <span className=\"mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-accent\" aria-hidden=\"true\" />\n <span className=\"text-sm text-text-primary leading-relaxed\">{item}</span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nfunction renderWarning(data: Record<string, unknown>) {\n const severity = typeof data.severity === 'string' ? data.severity : 'medium'\n const action = typeof data.action === 'string' ? data.action : null\n const details = typeof data.details === 'string' ? data.details : null\n const isHigh = severity === 'high'\n\n return (\n <div\n role=\"alert\"\n className={`rounded-xl border p-4 flex gap-3 ${\n isHigh\n ? 'border-red-200 bg-red-50 dark:border-red-900/50 dark:bg-red-950/30'\n : 'border-amber-200 bg-amber-50 dark:border-amber-900/50 dark:bg-amber-950/30'\n }`}\n data-testid=\"structured-warning\"\n >\n <svg\n className={`mt-0.5 h-5 w-5 shrink-0 ${isHigh ? 'text-red-500' : 'text-amber-500'}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n <div className=\"flex flex-col gap-1\">\n {action && (\n <p className={`text-sm font-semibold ${isHigh ? 'text-red-700 dark:text-red-300' : 'text-amber-700 dark:text-amber-300'}`}>\n {action}\n </p>\n )}\n {details && (\n <p className={`text-sm ${isHigh ? 'text-red-600 dark:text-red-400' : 'text-amber-600 dark:text-amber-400'}`}>\n {details}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nfunction StructuredResponse({ uiHint, data: rawData, className }: StructuredResponseProps) {\n // Defensive: data may arrive as a JSON string from the API instead of a parsed object.\n const data = typeof rawData === 'string'\n ? (() => { try { return JSON.parse(rawData) as Record<string, unknown> } catch { return null } })()\n : rawData\n if (!data) return null\n\n let content: React.ReactNode\n\n switch (uiHint) {\n case 'steps':\n content = renderSteps(data)\n break\n case 'table':\n content = renderTable(data)\n break\n case 'card':\n content = renderCard(data)\n break\n case 'list':\n content = renderList(data)\n break\n case 'warning':\n content = renderWarning(data)\n break\n case 'text':\n content = typeof data.text === 'string'\n ? <p data-testid=\"structured-text\">{data.text}</p>\n : null\n break\n default:\n content = null\n }\n\n if (!content) return null\n\n return (\n <div className={className} data-testid=\"structured-response\">\n {content}\n </div>\n )\n}\n\nexport { StructuredResponse }\nexport type { StructuredResponseProps }\n","'use client'\n\nimport React, { useState } from 'react'\nimport type { Source } from '../../types/agent'\nimport { SourceCard } from '../SourceCard'\n\ntype SourceListProps = {\n sources: Source[]\n variant?: 'compact' | 'expanded'\n collapsible?: boolean\n defaultExpanded?: boolean\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction SourceList({\n sources,\n variant = 'compact',\n collapsible = false,\n defaultExpanded = true,\n onNavigate,\n className,\n}: SourceListProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded)\n\n if (sources.length === 0) return null\n\n const content = (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"source-list-items\">\n {sources.map((source) => (\n <SourceCard\n key={source.document_id}\n source={source}\n variant={variant}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n )\n\n if (!collapsible) {\n return (\n <div className={className} data-testid=\"source-list\">\n {content}\n </div>\n )\n }\n\n return (\n <div className={className} data-testid=\"source-list\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(prev => !prev)}\n aria-expanded={isExpanded}\n className=\"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-text-secondary hover:text-accent mb-2 transition-colors duration-200\"\n >\n <svg\n className={`w-4 h-4 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n Sources ({sources.length})\n </button>\n {isExpanded && content}\n </div>\n )\n}\n\nexport { SourceList }\nexport type { SourceListProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport { twMerge } from 'tailwind-merge'\nimport type { Source } from '../../types/agent'\n\ntype SourceCardProps = {\n source: Source\n variant?: 'compact' | 'expanded'\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction getConfidenceIntent(confidence: number) {\n if (confidence >= 0.8) return 'success' as const\n if (confidence >= 0.5) return 'warning' as const\n return 'error' as const\n}\n\nfunction getConfidenceLabel(confidence: number) {\n if (confidence >= 0.8) return 'High'\n if (confidence >= 0.5) return 'Medium'\n return 'Low'\n}\n\nfunction SourceCard({ source, variant = 'compact', onNavigate, className }: SourceCardProps) {\n const handleClick = () => {\n if (onNavigate) {\n onNavigate(source)\n }\n }\n\n const isCompact = variant === 'compact'\n\n return (\n <div\n className={twMerge(\n 'rounded-xl border transition-all duration-200',\n 'bg-surface border-border',\n onNavigate && 'cursor-pointer hover:border-border-strong',\n className,\n )}\n data-document-id={source.document_id}\n data-testid=\"source-card\"\n >\n <div\n className={isCompact ? 'px-4 py-3' : 'px-6 py-4'}\n onClick={handleClick}\n role={onNavigate ? 'button' : undefined}\n tabIndex={onNavigate ? 0 : undefined}\n onKeyDown={\n onNavigate\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }\n : undefined\n }\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n {source.url ? (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-accent hover:underline truncate block\"\n onClick={(e) => e.stopPropagation()}\n >\n {source.title}\n <svg\n className=\"inline-block ml-1 w-3 h-3 opacity-60\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n </a>\n ) : (\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {source.title}\n </p>\n )}\n {source.section && (\n <p className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary truncate mt-0.5\">\n {source.section}\n </p>\n )}\n </div>\n <Badge\n intent={getConfidenceIntent(source.confidence)}\n size=\"sm\"\n >\n {getConfidenceLabel(source.confidence)}\n </Badge>\n </div>\n {!isCompact && (\n <p className=\"text-xs text-text-secondary mt-2 line-clamp-3 leading-relaxed\">\n {source.snippet}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nexport { SourceCard }\nexport type { SourceCardProps }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ntype FollowUpChipsProps = {\n suggestions: string[]\n onSelect: (suggestion: string) => void\n className?: string\n}\n\nfunction FollowUpChips({ suggestions, onSelect, className }: FollowUpChipsProps) {\n if (suggestions.length === 0) return null\n\n return (\n <div\n className={twMerge('flex flex-wrap gap-2 py-1', className)}\n role=\"group\"\n aria-label=\"Follow-up suggestions\"\n data-testid=\"follow-up-chips\"\n >\n {suggestions.map(suggestion => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => onSelect(suggestion)}\n className={twMerge(\n 'px-4 py-1.5 rounded-full text-sm whitespace-nowrap',\n 'border border-border bg-transparent text-text-secondary',\n 'hover:bg-accent/10 hover:border-interactive hover:text-text-primary',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n 'transition-all duration-200',\n )}\n >\n {suggestion}\n </button>\n ))}\n </div>\n )\n}\n\nexport { FollowUpChips }\nexport type { FollowUpChipsProps }\n","import React from 'react'\nimport { Alert, Button } from '@surf-kit/core'\nimport type { ChatError } from '../../types/chat'\n\ntype ErrorResponseProps = {\n error: ChatError\n onRetry?: () => void\n className?: string\n}\n\nfunction ErrorResponse({ error, onRetry, className }: ErrorResponseProps) {\n return (\n <div role=\"alert\" className={className} data-testid=\"error-response\">\n <Alert intent=\"error\" title=\"Error\">\n <p>{error.message}</p>\n {error.retryable && onRetry && (\n <div className=\"mt-3\">\n <Button\n intent=\"secondary\"\n size=\"sm\"\n onPress={onRetry}\n aria-label=\"Retry\"\n >\n Retry\n </Button>\n </div>\n )}\n </Alert>\n </div>\n )\n}\n\nexport { ErrorResponse }\nexport type { ErrorResponseProps }\n"],"mappings":"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","names":["Badge","content","jsx","twMerge","jsx","jsxs","jsx","jsxs","twMerge","jsx","jsx","jsxs","getConfidenceIntent","Badge","jsx","jsxs"]}
|
package/dist/sources/index.cjs
CHANGED
|
@@ -77,7 +77,36 @@ function SourceCard({ source, variant = "compact", onNavigate, className }) {
|
|
|
77
77
|
children: [
|
|
78
78
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
|
|
79
79
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
80
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
80
|
+
source.url ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
81
|
+
"a",
|
|
82
|
+
{
|
|
83
|
+
href: source.url,
|
|
84
|
+
target: "_blank",
|
|
85
|
+
rel: "noopener noreferrer",
|
|
86
|
+
className: "text-sm font-medium text-accent hover:underline truncate block",
|
|
87
|
+
onClick: (e) => e.stopPropagation(),
|
|
88
|
+
children: [
|
|
89
|
+
source.title,
|
|
90
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
91
|
+
"svg",
|
|
92
|
+
{
|
|
93
|
+
className: "inline-block ml-1 w-3 h-3 opacity-60",
|
|
94
|
+
viewBox: "0 0 24 24",
|
|
95
|
+
fill: "none",
|
|
96
|
+
stroke: "currentColor",
|
|
97
|
+
strokeWidth: "2",
|
|
98
|
+
strokeLinecap: "round",
|
|
99
|
+
strokeLinejoin: "round",
|
|
100
|
+
children: [
|
|
101
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6" }),
|
|
102
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("polyline", { points: "15 3 21 3 21 9" }),
|
|
103
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-medium text-text-primary truncate", children: source.title }),
|
|
81
110
|
source.section && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[11px] font-semibold uppercase tracking-wider text-text-secondary truncate mt-0.5", children: source.section })
|
|
82
111
|
] }),
|
|
83
112
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|