@cntyclub/agent-react 0.4.0 → 0.5.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-client.ts","../src/table-format.tsx","../src/components/message-item.tsx","../src/components/tool-approval-card.tsx","../src/components/agent-panel.tsx","../src/use-agent-chat.ts","../src/components/agent-widget.tsx","../src/config.ts"],"names":["jsx","humanizeToolName","jsxs","React","Button","React3","cn"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AgentConfig,\n AgentPublicConfig,\n ChatResponse,\n ConversationSummary,\n} from \"./types\";\n\nexport class AgentApiError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"AgentApiError\";\n this.status = status;\n }\n}\n\n/**\n * Thin fetch client for the Country Club Agent Mode API.\n *\n * Every request carries the agent client_id (query param — also used by the\n * backend's per-agent CORS middleware, including on preflights) and the\n * logged-in user's bearer token.\n */\nexport class AgentApiClient {\n private config: AgentConfig;\n\n constructor(config: AgentConfig) {\n this.config = config;\n }\n\n private async request<T>(\n path: string,\n options: { method?: string; body?: unknown } = {},\n ): Promise<T> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new AgentApiError(\"You need to be signed in to use the assistant.\", 401);\n }\n\n const base = this.config.apiBaseUrl.replace(/\\/$/, \"\");\n const separator = path.includes(\"?\") ? \"&\" : \"?\";\n const url = `${base}${path}${separator}client_id=${encodeURIComponent(this.config.clientId)}`;\n\n const response = await fetch(url, {\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n \"X-Agent-Client-Id\": this.config.clientId,\n },\n method: options.method ?? \"GET\",\n });\n\n if (response.status === 204) return undefined as T;\n\n let payload: Record<string, unknown> = {};\n try {\n payload = (await response.json()) as Record<string, unknown>;\n } catch {\n // Non-JSON error body — fall through to the status check.\n }\n\n if (!response.ok) {\n const detail =\n (payload.detail as string) ||\n (payload.message as string) ||\n `Request failed (${response.status})`;\n throw new AgentApiError(detail, response.status);\n }\n return payload as T;\n }\n\n getConfig(): Promise<AgentPublicConfig> {\n return this.request<AgentPublicConfig>(\"/agent-mode/config/\");\n }\n\n sendMessage(message: string, conversationId?: string | null): Promise<ChatResponse> {\n return this.request<ChatResponse>(\"/agent-mode/chat/\", {\n body: {\n client_id: this.config.clientId,\n conversation_id: conversationId ?? null,\n message,\n },\n method: \"POST\",\n });\n }\n\n resolveApproval(callId: string, approve: boolean): Promise<ChatResponse> {\n return this.request<ChatResponse>(`/agent-mode/approvals/${callId}/resolve/`, {\n body: { approve, client_id: this.config.clientId },\n method: \"POST\",\n });\n }\n\n listConversations(): Promise<{ conversations: ConversationSummary[] }> {\n return this.request(\"/agent-mode/conversations/\");\n }\n\n getConversation(conversationId: string): Promise<{\n conversation: ConversationSummary;\n messages: ChatResponse[\"messages\"];\n pending_approvals: ChatResponse[\"pending_approvals\"];\n }> {\n return this.request(`/agent-mode/conversations/${conversationId}/`);\n }\n\n deleteConversation(conversationId: string): Promise<void> {\n return this.request(`/agent-mode/conversations/${conversationId}/`, {\n method: \"DELETE\",\n });\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport type { TableBlock } from \"./types\";\n\n/**\n * Turns a raw result-table block from the backend into something a person\n * actually wants to read:\n *\n * - drops plumbing columns (ids, slugs, foreign-key refs, s3 keys, embeddings)\n * that mean nothing to a human,\n * - renders image URLs as thumbnails and other URLs as links,\n * - flattens nested objects/arrays (e.g. `{\"total\": 247, \"customer\": 0}` or\n * `[{\"id\": …, \"name\": \"SaaS\"}]`) into a readable phrase instead of raw JSON,\n * - surfaces the identity columns (name/title/email) first.\n *\n * All of this is presentation-only and lives in the widget on purpose: the\n * backend still keeps the full payload (ids and all) in the model's tool\n * context so follow-up actions can reference rows by id.\n */\n\n/** A column ready for `DataTablePaged`: stable key + human-facing label. */\nexport interface DisplayColumn {\n key: string;\n label: string;\n}\n\nexport interface DisplayTable {\n columns: DisplayColumn[];\n rows: Record<string, React.ReactNode>[];\n}\n\n// Exact column names that are plumbing, never information a person reads.\nconst NOISE_KEYS = new Set([\n \"id\",\n \"pk\",\n \"uuid\",\n \"slug\",\n \"object_id\",\n \"external_id\",\n \"client_id\",\n \"content_type\",\n \"provider_call_id\",\n \"tool_call_id\",\n]);\n\n// Column-name shapes that are always internal references or secrets.\nconst NOISE_PATTERNS = [\n /_id$/i,\n /_ids$/i,\n /_key$/i,\n /_hash$/i,\n /embedding/i,\n /vector/i,\n /password/i,\n /secret/i,\n /(^|_)token(_|$)/i,\n];\n\nconst IMAGE_KEY = /(image|logo|avatar|photo|picture|icon|thumbnail|banner|cover|headshot)/i;\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|svg|avif)(\\?|$)/i;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T|$)/;\nconst URL_RE = /^https?:\\/\\//i;\n// Identity columns worth reading first, in priority order.\nconst PRIORITY_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\"];\n// Keys checked when reducing an object/array-of-objects to a single label.\nconst LABEL_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\", \"code\"];\n\nfunction isUuid(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value);\n}\n\nfunction humanize(key: string): string {\n const text = key.replace(/_/g, \" \").trim();\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/** A column is noise if its name looks internal or every value is a UUID. */\nfunction isNoiseColumn(key: string, rows: Record<string, unknown>[]): boolean {\n if (NOISE_KEYS.has(key.toLowerCase())) return true;\n if (NOISE_PATTERNS.some((pattern) => pattern.test(key))) return true;\n const values = rows\n .map((row) => row[key])\n .filter((value) => value !== null && value !== undefined && value !== \"\");\n return values.length > 0 && values.every(isUuid);\n}\n\nfunction pickLabel(obj: Record<string, unknown>): string | null {\n for (const key of LABEL_KEYS) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value;\n if (typeof value === \"number\") return String(value);\n }\n return null;\n}\n\n/** `{total: 247, customer: 0}` → \"Total 247 · Customer 0\"; prefers a name/title. */\nfunction formatObject(obj: Record<string, unknown>): string {\n const label = pickLabel(obj);\n if (label) return label;\n const parts: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined || value === \"\") continue;\n if (typeof value === \"object\") continue; // keep it shallow and readable\n parts.push(`${humanize(key)} ${value}`);\n if (parts.length >= 6) break;\n }\n return parts.join(\" · \") || \"—\";\n}\n\n/** `[{name: \"SaaS\"}, {name: \"Fintech\"}]` → \"SaaS, Fintech (+N more)\". */\nfunction formatArray(arr: unknown[]): string {\n const items = arr\n .map((item) => {\n if (item === null || item === undefined) return \"\";\n if (Array.isArray(item)) return \"\";\n if (typeof item === \"object\") return pickLabel(item as Record<string, unknown>) ?? \"\";\n return String(item);\n })\n .filter(Boolean);\n if (items.length === 0) return \"—\";\n const shown = items.slice(0, 8);\n const extra = items.length - shown.length;\n return shown.join(\", \") + (extra > 0 ? ` +${extra} more` : \"\");\n}\n\nfunction renderScalar(key: string, value: string | number | boolean): React.ReactNode {\n if (typeof value !== \"string\") return value; // number | boolean → table handles\n\n const text = value.trim();\n if (URL_RE.test(text) && (IMAGE_EXT.test(text) || IMAGE_KEY.test(key))) {\n return (\n <img\n alt={humanize(key)}\n className=\"h-9 w-9 rounded-md border border-border object-cover\"\n loading=\"lazy\"\n src={text}\n />\n );\n }\n if (URL_RE.test(text)) {\n let label = text;\n try {\n label = new URL(text).hostname.replace(/^www\\./, \"\");\n } catch {\n // keep the full string if it isn't a parseable URL\n }\n return (\n <a\n className=\"text-primary underline underline-offset-2\"\n href={text}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {label}\n </a>\n );\n }\n if (ISO_DATE_RE.test(text)) {\n const date = new Date(text);\n if (!Number.isNaN(date.getTime())) return date.toLocaleDateString();\n }\n return text;\n}\n\nfunction formatCellValue(key: string, value: unknown): React.ReactNode {\n if (value === null || value === undefined || value === \"\") return value; // table → \"—\"\n if (Array.isArray(value)) return formatArray(value);\n if (typeof value === \"object\") return formatObject(value as Record<string, unknown>);\n return renderScalar(key, value as string | number | boolean);\n}\n\n/** Build clean, human-facing columns + rows from a raw result-table block. */\nexport function toDisplayTable(block: TableBlock): DisplayTable {\n const rows = block.rows ?? [];\n const kept = (block.columns ?? []).filter((key) => !isNoiseColumn(key, rows));\n // If filtering wiped everything (e.g. a table of pure ids), keep the original\n // columns rather than render an empty table.\n const columnKeys = kept.length > 0 ? kept : block.columns ?? [];\n\n const ordered = [...columnKeys].sort((a, b) => {\n const ra = PRIORITY_KEYS.indexOf(a.toLowerCase());\n const rb = PRIORITY_KEYS.indexOf(b.toLowerCase());\n const pa = ra === -1 ? PRIORITY_KEYS.length : ra;\n const pb = rb === -1 ? PRIORITY_KEYS.length : rb;\n if (pa !== pb) return pa - pb;\n return columnKeys.indexOf(a) - columnKeys.indexOf(b); // stable otherwise\n });\n\n const columns: DisplayColumn[] = ordered.map((key) => ({ key, label: humanize(key) }));\n const displayRows = rows.map((row) => {\n const out: Record<string, React.ReactNode> = {};\n for (const key of ordered) out[key] = formatCellValue(key, row[key]);\n return out;\n });\n\n return { columns, rows: displayRows };\n}\n","\"use client\";\n\nimport {\n ChatMessage,\n ChatMessageBubble,\n ChatToolChip,\n DataTablePaged,\n Markdown,\n} from \"@cntyclub/ui-react\";\nimport { CheckIcon, WrenchIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { toDisplayTable } from \"../table-format\";\nimport type { AgentMessage } from \"../types\";\n\nfunction humanizeToolName(toolName: string): string {\n return toolName.replace(/^[a-z]+_/, \"\").replaceAll(\"_\", \" \");\n}\n\n/** Renders one conversation message: user/assistant bubbles or tool results. */\nexport function MessageItem({ message }: { message: AgentMessage }) {\n if (message.role === \"user\") {\n return (\n <ChatMessage from=\"user\">\n <ChatMessageBubble from=\"user\">{message.content}</ChatMessageBubble>\n </ChatMessage>\n );\n }\n\n if (message.role === \"assistant\") {\n const requestedTools = message.tool_calls ?? [];\n if (!message.content && requestedTools.length === 0) return null;\n return (\n <ChatMessage from=\"assistant\">\n {message.content ? (\n <ChatMessageBubble from=\"assistant\">\n <Markdown>{message.content}</Markdown>\n </ChatMessageBubble>\n ) : null}\n {requestedTools.map((toolCall) => (\n <ChatToolChip icon={<WrenchIcon />} key={toolCall.id ?? toolCall.name}>\n Using {humanizeToolName(toolCall.name ?? \"tool\")}…\n </ChatToolChip>\n ))}\n </ChatMessage>\n );\n }\n\n // Tool result: show table blocks when present, otherwise a completion line.\n const tableBlocks = (message.blocks ?? []).filter((block) => block.type === \"table\");\n return (\n <ChatMessage from=\"assistant\">\n {tableBlocks.length > 0 ? (\n tableBlocks.map((block, index) => {\n const { columns, rows } = toDisplayTable(block);\n return (\n <div className=\"w-full max-w-full\" key={`${message.id}-${index}`}>\n <DataTablePaged\n columns={columns}\n pageSize={8}\n rows={rows}\n totalCount={\n typeof block.pagination?.count === \"number\"\n ? (block.pagination.count as number)\n : block.row_count\n }\n />\n </div>\n );\n })\n ) : (\n <ChatToolChip icon={<CheckIcon />}>\n {humanizeToolName(message.tool_name ?? \"tool\")} finished\n </ChatToolChip>\n )}\n </ChatMessage>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n ChatToolCard,\n ChatToolCardActions,\n ChatToolCardHeader,\n Spinner,\n} from \"@cntyclub/ui-react\";\nimport { ShieldAlertIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { PendingApproval } from \"../types\";\n\nfunction humanizeToolName(toolName: string): string {\n return toolName.replace(/^[a-z]+_/, \"\").replaceAll(\"_\", \" \");\n}\n\nexport interface ToolApprovalCardProps {\n approval: PendingApproval;\n resolving: boolean;\n onResolve: (callId: string, approve: boolean) => void;\n}\n\n/**\n * Approval prompt for a write action the agent wants to perform. The stored\n * arguments are shown so the user knows exactly what will change; nothing runs\n * until they approve.\n */\nexport function ToolApprovalCard({ approval, onResolve, resolving }: ToolApprovalCardProps) {\n const argumentEntries = Object.entries(approval.arguments ?? {});\n\n return (\n <ChatToolCard className=\"border-warning/40\">\n <ChatToolCardHeader>\n <ShieldAlertIcon className=\"size-4 text-warning\" />\n Approval needed\n </ChatToolCardHeader>\n <p className=\"mt-1 text-muted-foreground\">\n The assistant wants to run{\" \"}\n <span className=\"font-medium text-foreground\">{humanizeToolName(approval.tool_name)}</span>{\" \"}\n — this will change your data.\n </p>\n {argumentEntries.length > 0 && (\n <dl className=\"mt-2 space-y-0.5 rounded-lg bg-muted p-2 font-mono text-xs\">\n {argumentEntries.slice(0, 8).map(([key, value]) => (\n <div className=\"flex gap-2\" key={key}>\n <dt className=\"shrink-0 text-muted-foreground\">{key}:</dt>\n <dd className=\"truncate\">{typeof value === \"object\" ? JSON.stringify(value) : String(value)}</dd>\n </div>\n ))}\n {argumentEntries.length > 8 && (\n <div className=\"text-muted-foreground\">…and {argumentEntries.length - 8} more</div>\n )}\n </dl>\n )}\n <ChatToolCardActions>\n <Button\n disabled={resolving}\n onClick={() => onResolve(approval.id, false)}\n size=\"sm\"\n variant=\"outline\"\n >\n Decline\n </Button>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, true)} size=\"sm\">\n {resolving ? <Spinner /> : null}\n Approve\n </Button>\n </ChatToolCardActions>\n </ChatToolCard>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n Chat,\n ChatEmptyState,\n ChatEmptyStateDescription,\n ChatEmptyStateIcon,\n ChatEmptyStateTitle,\n ChatHeader,\n ChatHeaderActions,\n ChatHeaderAvatar,\n ChatHeaderTitle,\n ChatInput,\n ChatMessages,\n ChatSuggestion,\n ChatSuggestions,\n ChatTypingIndicator,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@cntyclub/ui-react\";\nimport {\n HistoryIcon,\n Maximize2Icon,\n Minimize2Icon,\n SquarePenIcon,\n Trash2Icon,\n XIcon,\n} from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { AgentChatActions, AgentChatState } from \"../use-agent-chat\";\nimport type { AgentConfig } from \"../types\";\nimport { MessageItem } from \"./message-item\";\nimport { ToolApprovalCard } from \"./tool-approval-card\";\n\nexport interface AgentPanelProps {\n config: AgentConfig;\n chat: AgentChatState & AgentChatActions;\n /** Fullscreen \"Agent Mode\" is active. */\n agentMode: boolean;\n /** Hide the expand button (mobile is always fullscreen). */\n canToggleAgentMode: boolean;\n onToggleAgentMode: () => void;\n onClose: () => void;\n className?: string;\n}\n\n/**\n * The chat surface shared by the popup panel and fullscreen Agent Mode.\n * Header (title, history, new chat, expand/collapse, close) + messages + input.\n */\nexport function AgentPanel({\n agentMode,\n canToggleAgentMode,\n chat,\n className,\n config,\n onClose,\n onToggleAgentMode,\n}: AgentPanelProps) {\n const [draft, setDraft] = React.useState(\"\");\n const [view, setView] = React.useState<\"chat\" | \"history\">(\"chat\");\n\n const agentName = config.agentName ?? chat.agentInfo?.name ?? \"Assistant\";\n const suggestions = config.suggestions ?? [\n \"What can you help me with?\",\n \"Give me a quick summary of my data.\",\n ];\n\n const handleSubmit = React.useCallback(\n (text: string) => {\n setDraft(\"\");\n void chat.send(text);\n },\n [chat],\n );\n\n const openHistory = React.useCallback(() => {\n setView(\"history\");\n void chat.refreshConversations();\n }, [chat]);\n\n const busy = chat.sending || chat.resolvingApprovalId !== null;\n\n return (\n <div\n className={cn(\n \"flex min-h-0 flex-col overflow-hidden bg-background text-foreground\",\n className,\n )}\n data-slot=\"agent-panel\"\n >\n {/* Header */}\n <ChatHeader>\n <div className=\"flex min-w-0 flex-1 items-center gap-2.5\">\n <ChatHeaderAvatar />\n <ChatHeaderTitle>\n <div className=\"truncate font-medium text-sm\">{agentName}</div>\n {config.tagline ? (\n <div className=\"truncate text-muted-foreground text-xs\">{config.tagline}</div>\n ) : null}\n </ChatHeaderTitle>\n </div>\n\n <ChatHeaderActions>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Conversation history\"\n onClick={view === \"history\" ? () => setView(\"chat\") : openHistory}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <HistoryIcon />\n </Button>\n }\n />\n <TooltipContent>History</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"New chat\"\n onClick={() => {\n chat.newChat();\n setView(\"chat\");\n }}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <SquarePenIcon />\n </Button>\n }\n />\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n\n {canToggleAgentMode ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={agentMode ? \"Exit Agent Mode\" : \"Enter Agent Mode\"}\n onClick={onToggleAgentMode}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n {agentMode ? <Minimize2Icon /> : <Maximize2Icon />}\n </Button>\n }\n />\n <TooltipContent>{agentMode ? \"Exit Agent Mode\" : \"Agent Mode\"}</TooltipContent>\n </Tooltip>\n ) : null}\n\n <Button aria-label=\"Close\" onClick={onClose} size=\"icon-sm\" variant=\"ghost\">\n <XIcon />\n </Button>\n </ChatHeaderActions>\n </ChatHeader>\n\n {view === \"history\" ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto p-2\">\n {chat.conversations.length === 0 ? (\n <p className=\"p-4 text-center text-muted-foreground text-sm\">\n No conversations yet.\n </p>\n ) : (\n chat.conversations.map((conversation) => (\n <div\n className=\"group flex items-center gap-1 rounded-lg hover:bg-accent\"\n key={conversation.id}\n >\n <button\n className=\"min-w-0 flex-1 cursor-pointer px-3 py-2 text-left\"\n onClick={() => {\n void chat.openConversation(conversation.id);\n setView(\"chat\");\n }}\n type=\"button\"\n >\n <span className=\"block truncate text-sm\">{conversation.title || \"Untitled\"}</span>\n <span className=\"block text-muted-foreground text-xs\">\n {new Date(conversation.updated_at).toLocaleString()}\n </span>\n </button>\n <Button\n aria-label=\"Delete conversation\"\n className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={() => void chat.deleteConversation(conversation.id)}\n size=\"icon-xs\"\n variant=\"destructive-ghost\"\n >\n <Trash2Icon />\n </Button>\n </div>\n ))\n )}\n </div>\n ) : (\n <Chat>\n <ChatMessages className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}>\n {chat.messages.length === 0 && !chat.sending ? (\n <ChatEmptyState>\n <ChatEmptyStateIcon />\n <div>\n <ChatEmptyStateTitle>Hi! I'm {agentName}.</ChatEmptyStateTitle>\n <ChatEmptyStateDescription className=\"mt-1\">\n Ask me anything about your data — I can look things up and take actions\n (with your approval).\n </ChatEmptyStateDescription>\n </div>\n <ChatSuggestions>\n {suggestions.slice(0, 4).map((suggestion, index) => (\n <ChatSuggestion\n index={index}\n key={suggestion}\n onClick={() => handleSubmit(suggestion)}\n >\n {suggestion}\n </ChatSuggestion>\n ))}\n </ChatSuggestions>\n </ChatEmptyState>\n ) : (\n <>\n {chat.messages.map((message) => (\n <MessageItem key={message.id} message={message} />\n ))}\n {chat.pendingApprovals.map((approval) => (\n <ToolApprovalCard\n approval={approval}\n key={approval.id}\n onResolve={(callId, approve) => void chat.resolveApproval(callId, approve)}\n resolving={chat.resolvingApprovalId === approval.id}\n />\n ))}\n {busy ? <ChatTypingIndicator /> : null}\n </>\n )}\n </ChatMessages>\n\n {chat.error ? (\n <div className=\"mx-3 mb-1 flex items-center justify-between gap-2 rounded-lg bg-destructive/10 px-3 py-2 text-destructive text-xs\">\n <span className=\"min-w-0 truncate\">{chat.error}</span>\n <button className=\"shrink-0 cursor-pointer font-medium\" onClick={chat.clearError} type=\"button\">\n Dismiss\n </button>\n </div>\n ) : null}\n\n <ChatInput\n className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}\n disabled={busy || chat.pendingApprovals.length > 0}\n onSubmit={handleSubmit}\n onValueChange={setDraft}\n placeholder={\n chat.pendingApprovals.length > 0\n ? \"Approve or decline the pending action first…\"\n : `Ask ${agentName}…`\n }\n value={draft}\n />\n </Chat>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { AgentApiClient, AgentApiError } from \"./api-client\";\nimport type {\n AgentConfig,\n AgentMessage,\n AgentPublicConfig,\n ConversationSummary,\n PendingApproval,\n} from \"./types\";\n\nexport interface AgentChatState {\n agentInfo: AgentPublicConfig | null;\n conversationId: string | null;\n conversations: ConversationSummary[];\n messages: AgentMessage[];\n pendingApprovals: PendingApproval[];\n sending: boolean;\n resolvingApprovalId: string | null;\n error: string | null;\n}\n\nexport interface AgentChatActions {\n send: (text: string) => Promise<void>;\n resolveApproval: (callId: string, approve: boolean) => Promise<void>;\n newChat: () => void;\n openConversation: (conversationId: string) => Promise<void>;\n refreshConversations: () => Promise<void>;\n deleteConversation: (conversationId: string) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * Headless chat state for an Agent Mode agent: message history, sending,\n * pending write-tool approvals, and conversation management. UI-agnostic.\n */\nexport function useAgentChat(config: AgentConfig): AgentChatState & AgentChatActions {\n const client = React.useMemo(() => new AgentApiClient(config), [config]);\n\n const [agentInfo, setAgentInfo] = React.useState<AgentPublicConfig | null>(null);\n const [conversationId, setConversationId] = React.useState<string | null>(null);\n const [conversations, setConversations] = React.useState<ConversationSummary[]>([]);\n const [messages, setMessages] = React.useState<AgentMessage[]>([]);\n const [pendingApprovals, setPendingApprovals] = React.useState<PendingApproval[]>([]);\n const [sending, setSending] = React.useState(false);\n const [resolvingApprovalId, setResolvingApprovalId] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n client\n .getConfig()\n .then((info) => {\n if (!cancelled) setAgentInfo(info);\n })\n .catch(() => {\n // Non-fatal: the panel falls back to config-provided naming.\n });\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n const handleFailure = React.useCallback((err: unknown) => {\n const message =\n err instanceof AgentApiError\n ? err.message\n : \"Something went wrong. Please try again.\";\n setError(message);\n }, []);\n\n const applyResponse = React.useCallback(\n (response: {\n status?: string;\n message?: string;\n conversation_id?: string;\n messages?: AgentMessage[];\n pending_approvals?: PendingApproval[];\n }) => {\n if (response.status === \"error\" && !response.messages?.length) {\n setError(response.message ?? \"The assistant could not answer.\");\n return;\n }\n if (response.conversation_id) setConversationId(response.conversation_id);\n if (response.messages?.length) {\n setMessages((current) => {\n const seen = new Set(current.map((message) => message.id));\n const fresh = response.messages?.filter((message) => !seen.has(message.id)) ?? [];\n return [...current, ...fresh];\n });\n }\n setPendingApprovals(response.pending_approvals ?? []);\n if (response.status === \"error\" && response.message) {\n setError(response.message);\n }\n },\n [],\n );\n\n const send = React.useCallback(\n async (text: string) => {\n if (sending) return;\n setSending(true);\n setError(null);\n try {\n const response = await client.sendMessage(text, conversationId);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setSending(false);\n }\n },\n [applyResponse, client, conversationId, handleFailure, sending],\n );\n\n const resolveApproval = React.useCallback(\n async (callId: string, approve: boolean) => {\n if (resolvingApprovalId) return;\n setResolvingApprovalId(callId);\n setError(null);\n try {\n const response = await client.resolveApproval(callId, approve);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setResolvingApprovalId(null);\n }\n },\n [applyResponse, client, handleFailure, resolvingApprovalId],\n );\n\n const newChat = React.useCallback(() => {\n setConversationId(null);\n setMessages([]);\n setPendingApprovals([]);\n setError(null);\n }, []);\n\n const refreshConversations = React.useCallback(async () => {\n try {\n const { conversations: list } = await client.listConversations();\n setConversations(list);\n } catch (err) {\n handleFailure(err);\n }\n }, [client, handleFailure]);\n\n const openConversation = React.useCallback(\n async (id: string) => {\n setError(null);\n try {\n const payload = await client.getConversation(id);\n setConversationId(id);\n setMessages(payload.messages ?? []);\n setPendingApprovals(payload.pending_approvals ?? []);\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, handleFailure],\n );\n\n const deleteConversation = React.useCallback(\n async (id: string) => {\n try {\n await client.deleteConversation(id);\n setConversations((current) => current.filter((c) => c.id !== id));\n if (conversationId === id) newChat();\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, conversationId, handleFailure, newChat],\n );\n\n const clearError = React.useCallback(() => setError(null), []);\n\n return {\n agentInfo,\n clearError,\n conversationId,\n conversations,\n deleteConversation,\n error,\n messages,\n newChat,\n openConversation,\n pendingApprovals,\n refreshConversations,\n resolveApproval,\n resolvingApprovalId,\n send,\n sending,\n };\n}\n","\"use client\";\n\nimport { cn, Fab, TooltipProvider, useMediaQuery } from \"@cntyclub/ui-react\";\nimport { SparklesIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { AgentConfig, AgentMessage } from \"../types\";\nimport { useAgentChat } from \"../use-agent-chat\";\nimport { AgentPanel } from \"./agent-panel\";\n\nexport interface AgentWidgetProps {\n config: AgentConfig;\n /** Controlled open state (optional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * The embeddable Agent Mode widget.\n *\n * - Closed: a floating round button (bottom-right by default).\n * - Open on desktop: a popup panel anchored to the button, with an\n * \"Agent Mode\" button that expands to a fullscreen chat. While in the popup,\n * the widget can navigate the host app to pages related to the tools the\n * agent uses (via `config.pages` + `config.navigate`).\n * - Open on mobile: fullscreen from the start.\n *\n * All colors come from the host app's UI-kit theme tokens, so light/dark mode\n * follows the dashboard automatically.\n */\nexport function AgentWidget({ config, onOpenChange, open: controlledOpen }: AgentWidgetProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = React.useCallback(\n (next: boolean) => {\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n const [agentMode, setAgentMode] = React.useState(false);\n const isDesktop = useMediaQuery(\"(min-width: 640px)\", {\n defaultSSRValue: true,\n ssr: true,\n });\n const fullscreen = !isDesktop || agentMode;\n\n const chat = useAgentChat(config);\n\n // ----- page-follow navigation (popup mode only) -----\n const lastNavigatedMessageId = React.useRef<string | null>(null);\n const { messages } = chat;\n React.useEffect(() => {\n if (!open || fullscreen || !config.navigate || !config.pages?.length) return;\n const toolMessages = messages.filter((message) => message.role === \"tool\");\n const latest = toolMessages[toolMessages.length - 1];\n if (!latest || latest.id === lastNavigatedMessageId.current) return;\n lastNavigatedMessageId.current = latest.id;\n\n const mapping = config.pages.find((page) => page.tools.includes(latest.tool_name ?? \"\"));\n if (!mapping) return;\n\n const args = findToolArguments(messages, latest);\n const path = mapping.buildRoute ? mapping.buildRoute(args) : mapping.route;\n if (path) config.navigate(path);\n }, [config, fullscreen, messages, open]);\n\n const closePanel = React.useCallback(() => {\n setOpen(false);\n setAgentMode(false);\n }, [setOpen]);\n\n return (\n <TooltipProvider>\n {!open && !config.appearance?.hideLauncher ? (\n <Fab\n aria-label=\"Open assistant\"\n onClick={() => setOpen(true)}\n position={config.appearance?.position ?? \"bottom-right\"}\n >\n <SparklesIcon />\n </Fab>\n ) : null}\n\n {open ? (\n fullscreen ? (\n <div\n aria-modal=\"true\"\n className=\"fixed inset-0 z-50 flex flex-col bg-background\"\n role=\"dialog\"\n >\n <AgentPanel\n agentMode={agentMode}\n canToggleAgentMode={isDesktop}\n chat={chat}\n className=\"flex-1\"\n config={config}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode((value) => !value)}\n />\n </div>\n ) : (\n <div\n className={cn(\n \"fixed z-50 flex flex-col overflow-hidden rounded-2xl border border-border shadow-2xl\",\n (config.appearance?.position ?? \"bottom-right\") === \"bottom-left\"\n ? \"bottom-4 left-4 sm:bottom-6 sm:left-6\"\n : \"right-4 bottom-4 sm:right-6 sm:bottom-6\",\n )}\n role=\"dialog\"\n style={{\n height: `min(${config.appearance?.panelHeight ?? 640}px, calc(100dvh - 3rem))`,\n width: `min(${config.appearance?.panelWidth ?? 400}px, calc(100vw - 2rem))`,\n }}\n >\n <AgentPanel\n agentMode={false}\n canToggleAgentMode\n chat={chat}\n className=\"flex-1\"\n config={config}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode(true)}\n />\n </div>\n )\n ) : null}\n </TooltipProvider>\n );\n}\n\n/** Look up the arguments of the assistant tool_call a tool message answers. */\nfunction findToolArguments(\n messages: AgentMessage[],\n toolMessage: AgentMessage,\n): Record<string, unknown> {\n if (!toolMessage.tool_call_id) return {};\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role !== \"assistant\" || !message.tool_calls) continue;\n const match = message.tool_calls.find((call) => call.id === toolMessage.tool_call_id);\n if (match) return match.arguments ?? {};\n }\n return {};\n}\n","import type { AgentConfig } from \"./types\";\n\n/**\n * Identity helper that gives host apps full type inference/checking when\n * declaring their agent config file.\n */\nexport function defineAgentConfig(config: AgentConfig): AgentConfig {\n return config;\n}\n"]}
1
+ {"version":3,"sources":["../src/api-client.ts","../src/message-group.ts","../src/components/message-item.tsx","../src/table-format.tsx","../src/tool-presentation.ts","../src/components/tool-activity-group.tsx","../src/components/tool-approval-card.tsx","../src/components/agent-panel.tsx","../src/use-agent-chat.ts","../src/use-always-approve.ts","../src/components/agent-widget.tsx","../src/config.ts"],"names":["callId","jsx","UUID_RE","React","jsxs","Fragment","ChevronDownIcon","React2","cn","Button","ChatMessage","React4","React5"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AgentConfig,\n AgentPublicConfig,\n ChatResponse,\n ConversationSummary,\n} from \"./types\";\n\nexport class AgentApiError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"AgentApiError\";\n this.status = status;\n }\n}\n\n/**\n * Thin fetch client for the Country Club Agent Mode API.\n *\n * Every request carries the agent client_id (query param — also used by the\n * backend's per-agent CORS middleware, including on preflights) and the\n * logged-in user's bearer token.\n */\nexport class AgentApiClient {\n private config: AgentConfig;\n\n constructor(config: AgentConfig) {\n this.config = config;\n }\n\n private async request<T>(\n path: string,\n options: { method?: string; body?: unknown } = {},\n ): Promise<T> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new AgentApiError(\"You need to be signed in to use the assistant.\", 401);\n }\n\n const base = this.config.apiBaseUrl.replace(/\\/$/, \"\");\n const separator = path.includes(\"?\") ? \"&\" : \"?\";\n const url = `${base}${path}${separator}client_id=${encodeURIComponent(this.config.clientId)}`;\n\n const response = await fetch(url, {\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n \"X-Agent-Client-Id\": this.config.clientId,\n },\n method: options.method ?? \"GET\",\n });\n\n if (response.status === 204) return undefined as T;\n\n let payload: Record<string, unknown> = {};\n try {\n payload = (await response.json()) as Record<string, unknown>;\n } catch {\n // Non-JSON error body — fall through to the status check.\n }\n\n if (!response.ok) {\n const detail =\n (payload.detail as string) ||\n (payload.message as string) ||\n `Request failed (${response.status})`;\n throw new AgentApiError(detail, response.status);\n }\n return payload as T;\n }\n\n getConfig(): Promise<AgentPublicConfig> {\n return this.request<AgentPublicConfig>(\"/agent-mode/config/\");\n }\n\n sendMessage(message: string, conversationId?: string | null): Promise<ChatResponse> {\n return this.request<ChatResponse>(\"/agent-mode/chat/\", {\n body: {\n client_id: this.config.clientId,\n conversation_id: conversationId ?? null,\n message,\n },\n method: \"POST\",\n });\n }\n\n resolveApproval(callId: string, approve: boolean): Promise<ChatResponse> {\n return this.request<ChatResponse>(`/agent-mode/approvals/${callId}/resolve/`, {\n body: { approve, client_id: this.config.clientId },\n method: \"POST\",\n });\n }\n\n listConversations(): Promise<{ conversations: ConversationSummary[] }> {\n return this.request(\"/agent-mode/conversations/\");\n }\n\n getConversation(conversationId: string): Promise<{\n conversation: ConversationSummary;\n messages: ChatResponse[\"messages\"];\n pending_approvals: ChatResponse[\"pending_approvals\"];\n }> {\n return this.request(`/agent-mode/conversations/${conversationId}/`);\n }\n\n deleteConversation(conversationId: string): Promise<void> {\n return this.request(`/agent-mode/conversations/${conversationId}/`, {\n method: \"DELETE\",\n });\n }\n}\n","import type { AgentMessage, MessageBlock } from \"./types\";\n\n/** One tool invocation inside a tool-activity group. */\nexport interface ToolStep {\n /** Provider tool-call id (matches assistant tool_call ↔ tool result). */\n callId: string;\n name: string;\n args: Record<string, unknown>;\n status: \"running\" | \"done\";\n /** Capped, pretty-printed raw result (for the JSON detail view). */\n result?: string;\n /** Structured blocks (tables) derived from the result. */\n blocks?: MessageBlock[];\n}\n\nexport type RenderItem =\n | { kind: \"user\"; key: string; message: AgentMessage }\n | { kind: \"assistant-text\"; key: string; message: AgentMessage }\n | { kind: \"tool-activity\"; key: string; steps: ToolStep[] };\n\n/**\n * Collapse the raw message stream into render items: user bubbles, assistant\n * text bubbles, and *grouped* tool activity. Consecutive tool calls (assistant\n * tool_calls + their tool results) fold into a single group so a run of ten\n * lookups shows as one collapsible block instead of ten stacked chips.\n *\n * An assistant message that carries visible text flushes the current group and\n * emits a text bubble before starting any new tool steps.\n */\nexport function groupMessages(messages: AgentMessage[]): RenderItem[] {\n const items: RenderItem[] = [];\n\n let group: ToolStep[] | null = null;\n let groupKey = \"\";\n const stepIndexByCallId = new Map<string, number>();\n\n const flush = () => {\n if (group && group.length > 0) {\n items.push({ key: `tools-${groupKey}`, kind: \"tool-activity\", steps: group });\n }\n group = null;\n groupKey = \"\";\n stepIndexByCallId.clear();\n };\n\n for (const message of messages) {\n if (message.role === \"user\") {\n flush();\n items.push({ key: message.id, kind: \"user\", message });\n continue;\n }\n\n if (message.role === \"assistant\") {\n const hasText = Boolean(message.content && message.content.trim());\n if (hasText) {\n flush();\n items.push({ key: message.id, kind: \"assistant-text\", message });\n }\n for (const toolCall of message.tool_calls ?? []) {\n const callId = toolCall.id ?? `${message.id}-${toolCall.name}`;\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n stepIndexByCallId.set(callId, group.length);\n group.push({\n args: (toolCall.arguments ?? {}) as Record<string, unknown>,\n callId,\n name: toolCall.name ?? \"tool\",\n status: \"running\",\n });\n }\n continue;\n }\n\n // Tool result: attach to its pending step, or open a group if orphaned.\n const callId = message.tool_call_id ?? \"\";\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n const existingIndex = callId ? stepIndexByCallId.get(callId) : undefined;\n if (existingIndex !== undefined) {\n const step = group[existingIndex];\n step.status = \"done\";\n step.result = message.result || step.result;\n step.blocks = message.blocks ?? step.blocks;\n } else {\n group.push({\n args: {},\n blocks: message.blocks,\n callId: callId || message.id,\n name: message.tool_name ?? \"tool\",\n result: message.result,\n status: \"done\",\n });\n }\n }\n\n flush();\n return items;\n}\n","\"use client\";\n\nimport { ChatMessage, ChatMessageBubble, Markdown } from \"@cntyclub/ui-react\";\nimport * as React from \"react\";\n\nimport type { AgentMessage } from \"../types\";\n\n/**\n * Renders a user or assistant *text* message. Tool activity (assistant\n * tool_calls and tool results) is grouped and rendered by `ToolActivityGroup`\n * via `groupMessages`, so this component ignores tool messages.\n */\nexport function MessageItem({ message }: { message: AgentMessage }) {\n if (message.role === \"user\") {\n return (\n <ChatMessage from=\"user\">\n <ChatMessageBubble from=\"user\">{message.content}</ChatMessageBubble>\n </ChatMessage>\n );\n }\n\n if (message.role === \"assistant\") {\n if (!message.content || !message.content.trim()) return null;\n return (\n <ChatMessage from=\"assistant\">\n <ChatMessageBubble from=\"assistant\">\n <Markdown>{message.content}</Markdown>\n </ChatMessageBubble>\n </ChatMessage>\n );\n }\n\n return null;\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport type { TableBlock } from \"./types\";\n\n/**\n * Turns a raw result-table block from the backend into something a person\n * actually wants to read:\n *\n * - drops plumbing columns (ids, slugs, foreign-key refs, s3 keys, embeddings)\n * that mean nothing to a human,\n * - renders image URLs as thumbnails and other URLs as links,\n * - flattens nested objects/arrays (e.g. `{\"total\": 247, \"customer\": 0}` or\n * `[{\"id\": …, \"name\": \"SaaS\"}]`) into a readable phrase instead of raw JSON,\n * - surfaces the identity columns (name/title/email) first.\n *\n * All of this is presentation-only and lives in the widget on purpose: the\n * backend still keeps the full payload (ids and all) in the model's tool\n * context so follow-up actions can reference rows by id.\n */\n\n/** A column ready for `DataTablePaged`: stable key + human-facing label. */\nexport interface DisplayColumn {\n key: string;\n label: string;\n}\n\nexport interface DisplayTable {\n columns: DisplayColumn[];\n rows: Record<string, React.ReactNode>[];\n}\n\n// Exact column names that are plumbing, never information a person reads.\nconst NOISE_KEYS = new Set([\n \"id\",\n \"pk\",\n \"uuid\",\n \"slug\",\n \"object_id\",\n \"external_id\",\n \"client_id\",\n \"content_type\",\n \"provider_call_id\",\n \"tool_call_id\",\n]);\n\n// Column-name shapes that are always internal references or secrets.\nconst NOISE_PATTERNS = [\n /_id$/i,\n /_ids$/i,\n /_key$/i,\n /_hash$/i,\n /embedding/i,\n /vector/i,\n /password/i,\n /secret/i,\n /(^|_)token(_|$)/i,\n];\n\nconst IMAGE_KEY = /(image|logo|avatar|photo|picture|icon|thumbnail|banner|cover|headshot)/i;\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|svg|avif)(\\?|$)/i;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T|$)/;\nconst URL_RE = /^https?:\\/\\//i;\n// Identity columns worth reading first, in priority order.\nconst PRIORITY_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\"];\n// Keys checked when reducing an object/array-of-objects to a single label.\nconst LABEL_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\", \"code\"];\n\nfunction isUuid(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value);\n}\n\nfunction humanize(key: string): string {\n const text = key.replace(/_/g, \" \").trim();\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/** A column is noise if its name looks internal or every value is a UUID. */\nfunction isNoiseColumn(key: string, rows: Record<string, unknown>[]): boolean {\n if (NOISE_KEYS.has(key.toLowerCase())) return true;\n if (NOISE_PATTERNS.some((pattern) => pattern.test(key))) return true;\n const values = rows\n .map((row) => row[key])\n .filter((value) => value !== null && value !== undefined && value !== \"\");\n return values.length > 0 && values.every(isUuid);\n}\n\nfunction pickLabel(obj: Record<string, unknown>): string | null {\n for (const key of LABEL_KEYS) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value;\n if (typeof value === \"number\") return String(value);\n }\n return null;\n}\n\n/** `{total: 247, customer: 0}` → \"Total 247 · Customer 0\"; prefers a name/title. */\nfunction formatObject(obj: Record<string, unknown>): string {\n const label = pickLabel(obj);\n if (label) return label;\n const parts: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined || value === \"\") continue;\n if (typeof value === \"object\") continue; // keep it shallow and readable\n parts.push(`${humanize(key)} ${value}`);\n if (parts.length >= 6) break;\n }\n return parts.join(\" · \") || \"—\";\n}\n\n/** `[{name: \"SaaS\"}, {name: \"Fintech\"}]` → \"SaaS, Fintech (+N more)\". */\nfunction formatArray(arr: unknown[]): string {\n const items = arr\n .map((item) => {\n if (item === null || item === undefined) return \"\";\n if (Array.isArray(item)) return \"\";\n if (typeof item === \"object\") return pickLabel(item as Record<string, unknown>) ?? \"\";\n return String(item);\n })\n .filter(Boolean);\n if (items.length === 0) return \"—\";\n const shown = items.slice(0, 8);\n const extra = items.length - shown.length;\n return shown.join(\", \") + (extra > 0 ? ` +${extra} more` : \"\");\n}\n\nfunction renderScalar(key: string, value: string | number | boolean): React.ReactNode {\n if (typeof value !== \"string\") return value; // number | boolean → table handles\n\n const text = value.trim();\n if (URL_RE.test(text) && (IMAGE_EXT.test(text) || IMAGE_KEY.test(key))) {\n return (\n <img\n alt={humanize(key)}\n className=\"h-9 w-9 rounded-md border border-border object-cover\"\n loading=\"lazy\"\n src={text}\n />\n );\n }\n if (URL_RE.test(text)) {\n let label = text;\n try {\n label = new URL(text).hostname.replace(/^www\\./, \"\");\n } catch {\n // keep the full string if it isn't a parseable URL\n }\n return (\n <a\n className=\"text-primary underline underline-offset-2\"\n href={text}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {label}\n </a>\n );\n }\n if (ISO_DATE_RE.test(text)) {\n const date = new Date(text);\n if (!Number.isNaN(date.getTime())) return date.toLocaleDateString();\n }\n return text;\n}\n\nfunction formatCellValue(key: string, value: unknown): React.ReactNode {\n if (value === null || value === undefined || value === \"\") return value; // table → \"—\"\n if (Array.isArray(value)) return formatArray(value);\n if (typeof value === \"object\") return formatObject(value as Record<string, unknown>);\n return renderScalar(key, value as string | number | boolean);\n}\n\n/** Build clean, human-facing columns + rows from a raw result-table block. */\nexport function toDisplayTable(block: TableBlock): DisplayTable {\n const rows = block.rows ?? [];\n const kept = (block.columns ?? []).filter((key) => !isNoiseColumn(key, rows));\n // If filtering wiped everything (e.g. a table of pure ids), keep the original\n // columns rather than render an empty table.\n const columnKeys = kept.length > 0 ? kept : block.columns ?? [];\n\n const ordered = [...columnKeys].sort((a, b) => {\n const ra = PRIORITY_KEYS.indexOf(a.toLowerCase());\n const rb = PRIORITY_KEYS.indexOf(b.toLowerCase());\n const pa = ra === -1 ? PRIORITY_KEYS.length : ra;\n const pb = rb === -1 ? PRIORITY_KEYS.length : rb;\n if (pa !== pb) return pa - pb;\n return columnKeys.indexOf(a) - columnKeys.indexOf(b); // stable otherwise\n });\n\n const columns: DisplayColumn[] = ordered.map((key) => ({ key, label: humanize(key) }));\n const displayRows = rows.map((row) => {\n const out: Record<string, React.ReactNode> = {};\n for (const key of ordered) out[key] = formatCellValue(key, row[key]);\n return out;\n });\n\n return { columns, rows: displayRows };\n}\n","import type { DescribeToolCall, ToolCallDescription, ToolCallDetail } from \"./types\";\n\n/** \"business_target_company_tags_apply\" → \"target company tags apply\". */\nexport function humanizeToolName(toolName: string): string {\n return toolName.replace(/^[a-z]+_/, \"\").replaceAll(\"_\", \" \");\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Keys that are meaningless to a human reader — identifiers and storage keys.\n * These are hidden from the default argument facts (the user complained that\n * \"company_id\" / \"slug\" tell them nothing).\n */\nfunction isTechnicalKey(key: string): boolean {\n const lower = key.toLowerCase();\n return (\n lower === \"id\" ||\n lower === \"client_id\" ||\n lower === \"slug\" ||\n lower.endsWith(\"_id\") ||\n lower.endsWith(\"_ids\") ||\n lower.endsWith(\"_key\") ||\n lower.endsWith(\"_slug\") ||\n lower.endsWith(\"_uuid\") ||\n lower === \"uuid\" ||\n lower.endsWith(\"_s3_key\") ||\n lower === \"embedding\"\n );\n}\n\n/** A value that is itself just an identifier (bare UUID) carries no meaning. */\nfunction isTechnicalValue(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value.trim());\n}\n\n/** \"target_company\" → \"Target company\". */\nfunction humanizeKey(key: string): string {\n const spaced = key.replaceAll(\"_\", \" \").trim();\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (Array.isArray(value)) {\n const items = value\n .filter((item) => !isTechnicalValue(item))\n .map((item) => formatValue(item));\n return items.length ? items.join(\", \") : `${value.length} item${value.length === 1 ? \"\" : \"s\"}`;\n }\n if (typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n for (const key of [\"name\", \"title\", \"label\", \"email\"]) {\n if (typeof record[key] === \"string\") return record[key] as string;\n }\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * Derive human-readable facts from raw arguments, dropping technical keys and\n * bare-identifier values. Long strings are truncated for the card.\n */\nexport function deriveDetails(args: Record<string, unknown>): ToolCallDetail[] {\n const details: ToolCallDetail[] = [];\n for (const [key, value] of Object.entries(args ?? {})) {\n if (isTechnicalKey(key)) continue;\n if (isTechnicalValue(value)) continue;\n if (value === \"\" || value === null || value === undefined) continue;\n const formatted = formatValue(value);\n if (!formatted || formatted === \"—\") continue;\n details.push({ label: humanizeKey(key), value: formatted.length > 140 ? `${formatted.slice(0, 140)}…` : formatted });\n }\n return details;\n}\n\nexport interface ResolvedToolPresentation {\n title: string;\n summary: string | null;\n details: ToolCallDetail[];\n}\n\n/**\n * Resolve how a tool call should be shown: prefer the host app's\n * `describeToolCall`, then fall back to a humanized name plus the non-technical\n * arguments so approvals and the tool log always read conceptually.\n */\nexport function resolveToolPresentation(\n describe: DescribeToolCall | undefined,\n toolName: string,\n args: Record<string, unknown>,\n): ResolvedToolPresentation {\n let description: ToolCallDescription | null | undefined;\n try {\n description = describe?.(toolName, args ?? {});\n } catch {\n description = null;\n }\n\n const title = description?.title?.trim() || humanizeToolName(toolName);\n const summary = description?.summary?.trim() || null;\n\n let details = description?.details ?? [];\n const wantsDerived = description?.showDerivedDetails ?? description?.details === undefined;\n if (details.length === 0 && wantsDerived) {\n details = deriveDetails(args ?? {});\n }\n\n return { details, summary, title };\n}\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsiblePanel,\n CollapsibleTrigger,\n ChatToolChip,\n DataTablePaged,\n cn,\n} from \"@cntyclub/ui-react\";\nimport { CheckIcon, ChevronDownIcon, CodeIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { toDisplayTable } from \"../table-format\";\nimport { humanizeToolName, resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, MessageBlock } from \"../types\";\nimport type { ToolStep } from \"../message-group\";\n\nfunction StepTables({ blocks, stepKey }: { blocks: MessageBlock[] | undefined; stepKey: string }) {\n const tables = (blocks ?? []).filter((block) => block.type === \"table\");\n if (tables.length === 0) return null;\n return (\n <>\n {tables.map((block, index) => {\n const { columns, rows } = toDisplayTable(block);\n return (\n <div className=\"w-full max-w-full\" key={`${stepKey}-table-${index}`}>\n <DataTablePaged\n columns={columns}\n pageSize={8}\n rows={rows}\n totalCount={\n typeof block.pagination?.count === \"number\"\n ? (block.pagination.count as number)\n : block.row_count\n }\n />\n </div>\n );\n })}\n </>\n );\n}\n\nfunction RawJsonDisclosure({ result }: { result: string }) {\n return (\n <Collapsible className=\"mt-1.5\">\n <CollapsibleTrigger className=\"group flex items-center gap-1 text-muted-foreground text-xs hover:text-foreground\">\n <CodeIcon className=\"size-3\" />\n <span>Raw JSON</span>\n <ChevronDownIcon className=\"size-3 transition-transform group-data-[panel-open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsiblePanel>\n <pre className=\"mt-1 max-h-64 overflow-auto rounded-lg bg-muted p-2 font-mono text-[11px] leading-snug text-muted-foreground\">\n {result}\n </pre>\n </CollapsiblePanel>\n </Collapsible>\n );\n}\n\nfunction StepDetail({\n describeToolCall,\n step,\n}: {\n describeToolCall?: DescribeToolCall;\n step: ToolStep;\n}) {\n const { details, summary, title } = resolveToolPresentation(describeToolCall, step.name, step.args);\n return (\n <div className=\"rounded-lg border border-border/72 bg-card p-2.5\">\n <div className=\"flex items-center gap-1.5 font-medium text-sm\">\n {step.status === \"running\" ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon className=\"size-3.5 text-success\" />\n )}\n {title}\n </div>\n {summary ? <p className=\"mt-0.5 text-muted-foreground text-xs\">{summary}</p> : null}\n {details.length > 0 ? (\n <dl className=\"mt-1.5 space-y-0.5 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {step.result ? <RawJsonDisclosure result={step.result} /> : null}\n </div>\n );\n}\n\nexport interface ToolActivityGroupProps {\n steps: ToolStep[];\n describeToolCall?: DescribeToolCall;\n}\n\n/**\n * A collapsed run of tool activity. Normally shows just the latest step as a\n * chip with a disclosure toggle; expanding reveals every step in plain language\n * with a per-step raw-JSON dropdown. Result tables always render below so the\n * data the user asked for is never hidden behind the toggle.\n */\nexport function ToolActivityGroup({ describeToolCall, steps }: ToolActivityGroupProps) {\n const [open, setOpen] = React.useState(false);\n if (steps.length === 0) return null;\n\n const last = steps[steps.length - 1];\n const anyRunning = steps.some((step) => step.status === \"running\");\n const lastTitle =\n resolveToolPresentation(describeToolCall, last.name, last.args).title || humanizeToolName(last.name);\n const chipLabel = anyRunning ? `${lastTitle}…` : steps.length > 1 ? lastTitle : `${lastTitle} finished`;\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <Collapsible onOpenChange={setOpen} open={open}>\n <CollapsibleTrigger\n render={\n <ChatToolChip\n className=\"cursor-pointer pr-2 hover:bg-muted\"\n icon={\n anyRunning ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon />\n )\n }\n >\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"truncate\">{chipLabel}</span>\n {steps.length > 1 ? (\n <span className=\"rounded-full bg-background px-1.5 text-[10px] text-foreground/72\">\n {steps.length} steps\n </span>\n ) : null}\n <ChevronDownIcon className={cn(\"size-3 transition-transform\", open && \"rotate-180\")} />\n </span>\n </ChatToolChip>\n }\n />\n <CollapsiblePanel>\n <div className=\"mt-2 flex flex-col gap-1.5\">\n {steps.map((step) => (\n <StepDetail describeToolCall={describeToolCall} key={step.callId} step={step} />\n ))}\n </div>\n </CollapsiblePanel>\n </Collapsible>\n\n {steps.map((step) => (\n <StepTables blocks={step.blocks} key={`${step.callId}-tables`} stepKey={step.callId} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n ChatToolCard,\n ChatToolCardActions,\n ChatToolCardHeader,\n Group,\n Menu,\n MenuItem,\n MenuPopup,\n MenuTrigger,\n Spinner,\n} from \"@cntyclub/ui-react\";\nimport { CheckCheckIcon, ChevronDownIcon, ShieldAlertIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, PendingApproval } from \"../types\";\n\nexport interface ToolApprovalCardProps {\n approval: PendingApproval;\n resolving: boolean;\n onResolve: (callId: string, approve: boolean) => void;\n /** Host-app hook that turns the tool call into plain language. */\n describeToolCall?: DescribeToolCall;\n /** Remember this tool and auto-approve it from now on. */\n onAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Approval prompt for a write action the agent wants to perform. Arguments are\n * shown in plain language (technical ids/keys hidden, or a host-provided\n * description) so the user understands exactly what will change. The primary\n * action is a split button: \"Approve\" once, or \"Always approve\" this tool.\n */\nexport function ToolApprovalCard({\n approval,\n describeToolCall,\n onAlwaysApprove,\n onResolve,\n resolving,\n}: ToolApprovalCardProps) {\n const { details, summary, title } = resolveToolPresentation(\n describeToolCall,\n approval.tool_name,\n (approval.arguments ?? {}) as Record<string, unknown>,\n );\n\n return (\n <ChatToolCard className=\"border-warning/40\">\n <ChatToolCardHeader>\n <ShieldAlertIcon className=\"size-4 text-warning\" />\n Approval needed\n </ChatToolCardHeader>\n <p className=\"mt-1 text-muted-foreground\">\n {summary ?? (\n <>\n The assistant wants to <span className=\"font-medium text-foreground\">{title.toLowerCase()}</span> — this\n will change your data.\n </>\n )}\n </p>\n {details.length > 0 && (\n <dl className=\"mt-2 space-y-1 rounded-lg bg-muted p-2 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words font-medium text-foreground\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n )}\n <ChatToolCardActions>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, false)} size=\"sm\" variant=\"outline\">\n Decline\n </Button>\n <Group>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, true)} size=\"sm\">\n {resolving ? <Spinner /> : null}\n Approve\n </Button>\n <Menu>\n <MenuTrigger\n render={\n <Button aria-label=\"More approve options\" disabled={resolving} size=\"icon-sm\" variant=\"default\">\n <ChevronDownIcon />\n </Button>\n }\n />\n <MenuPopup align=\"end\">\n <MenuItem\n onClick={() => {\n onAlwaysApprove(approval.tool_name);\n onResolve(approval.id, true);\n }}\n >\n <CheckCheckIcon />\n Always approve “{title}”\n </MenuItem>\n </MenuPopup>\n </Menu>\n </Group>\n </ChatToolCardActions>\n </ChatToolCard>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n Chat,\n ChatEmptyState,\n ChatEmptyStateDescription,\n ChatEmptyStateIcon,\n ChatEmptyStateTitle,\n ChatMessage,\n ChatHeader,\n ChatHeaderActions,\n ChatHeaderAvatar,\n ChatHeaderTitle,\n ChatInput,\n ChatMessages,\n ChatSuggestion,\n ChatSuggestions,\n ChatTypingIndicator,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@cntyclub/ui-react\";\nimport {\n HistoryIcon,\n Maximize2Icon,\n Minimize2Icon,\n SquarePenIcon,\n Trash2Icon,\n XIcon,\n} from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { groupMessages } from \"../message-group\";\nimport type { AgentChatActions, AgentChatState } from \"../use-agent-chat\";\nimport type { AgentConfig } from \"../types\";\nimport { MessageItem } from \"./message-item\";\nimport { ToolActivityGroup } from \"./tool-activity-group\";\nimport { ToolApprovalCard } from \"./tool-approval-card\";\n\nexport interface AgentPanelProps {\n config: AgentConfig;\n chat: AgentChatState & AgentChatActions;\n /** Fullscreen \"Agent Mode\" is active. */\n agentMode: boolean;\n /** Hide the expand button (mobile is always fullscreen). */\n canToggleAgentMode: boolean;\n onToggleAgentMode: () => void;\n onClose: () => void;\n /** Remember a write tool and auto-approve its future prompts. */\n onAlwaysApprove: (toolName: string) => void;\n className?: string;\n}\n\n/**\n * The chat surface shared by the popup panel and fullscreen Agent Mode.\n * Header (title, history, new chat, expand/collapse, close) + messages + input.\n */\nexport function AgentPanel({\n agentMode,\n canToggleAgentMode,\n chat,\n className,\n config,\n onAlwaysApprove,\n onClose,\n onToggleAgentMode,\n}: AgentPanelProps) {\n const [draft, setDraft] = React.useState(\"\");\n const [view, setView] = React.useState<\"chat\" | \"history\">(\"chat\");\n\n const agentName = config.agentName ?? chat.agentInfo?.name ?? \"Assistant\";\n const suggestions = config.suggestions ?? [\n \"What can you help me with?\",\n \"Give me a quick summary of my data.\",\n ];\n\n const handleSubmit = React.useCallback(\n (text: string) => {\n setDraft(\"\");\n void chat.send(text);\n },\n [chat],\n );\n\n const openHistory = React.useCallback(() => {\n setView(\"history\");\n void chat.refreshConversations();\n }, [chat]);\n\n const busy = chat.sending || chat.resolvingApprovalId !== null;\n\n return (\n <div\n className={cn(\n \"flex min-h-0 flex-col overflow-hidden bg-background text-foreground\",\n className,\n )}\n data-slot=\"agent-panel\"\n >\n {/* Header */}\n <ChatHeader>\n <div className=\"flex min-w-0 flex-1 items-center gap-2.5\">\n <ChatHeaderAvatar />\n <ChatHeaderTitle>\n <div className=\"truncate font-medium text-sm\">{agentName}</div>\n {config.tagline ? (\n <div className=\"truncate text-muted-foreground text-xs\">{config.tagline}</div>\n ) : null}\n </ChatHeaderTitle>\n </div>\n\n <ChatHeaderActions>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Conversation history\"\n onClick={view === \"history\" ? () => setView(\"chat\") : openHistory}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <HistoryIcon />\n </Button>\n }\n />\n <TooltipContent>History</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"New chat\"\n onClick={() => {\n chat.newChat();\n setView(\"chat\");\n }}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <SquarePenIcon />\n </Button>\n }\n />\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n\n {canToggleAgentMode ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={agentMode ? \"Exit Agent Mode\" : \"Enter Agent Mode\"}\n onClick={onToggleAgentMode}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n {agentMode ? <Minimize2Icon /> : <Maximize2Icon />}\n </Button>\n }\n />\n <TooltipContent>{agentMode ? \"Exit Agent Mode\" : \"Agent Mode\"}</TooltipContent>\n </Tooltip>\n ) : null}\n\n <Button aria-label=\"Close\" onClick={onClose} size=\"icon-sm\" variant=\"ghost\">\n <XIcon />\n </Button>\n </ChatHeaderActions>\n </ChatHeader>\n\n {view === \"history\" ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto p-2\">\n {chat.conversations.length === 0 ? (\n <p className=\"p-4 text-center text-muted-foreground text-sm\">\n No conversations yet.\n </p>\n ) : (\n chat.conversations.map((conversation) => (\n <div\n className=\"group flex items-center gap-1 rounded-lg hover:bg-accent\"\n key={conversation.id}\n >\n <button\n className=\"min-w-0 flex-1 cursor-pointer px-3 py-2 text-left\"\n onClick={() => {\n void chat.openConversation(conversation.id);\n setView(\"chat\");\n }}\n type=\"button\"\n >\n <span className=\"block truncate text-sm\">{conversation.title || \"Untitled\"}</span>\n <span className=\"block text-muted-foreground text-xs\">\n {new Date(conversation.updated_at).toLocaleString()}\n </span>\n </button>\n <Button\n aria-label=\"Delete conversation\"\n className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={() => void chat.deleteConversation(conversation.id)}\n size=\"icon-xs\"\n variant=\"destructive-ghost\"\n >\n <Trash2Icon />\n </Button>\n </div>\n ))\n )}\n </div>\n ) : (\n <Chat>\n <ChatMessages className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}>\n {chat.messages.length === 0 && !chat.sending ? (\n <ChatEmptyState>\n <ChatEmptyStateIcon />\n <div>\n <ChatEmptyStateTitle>Hi! I'm {agentName}.</ChatEmptyStateTitle>\n <ChatEmptyStateDescription className=\"mt-1\">\n Ask me anything about your data — I can look things up and take actions\n (with your approval).\n </ChatEmptyStateDescription>\n </div>\n <ChatSuggestions>\n {suggestions.slice(0, 4).map((suggestion, index) => (\n <ChatSuggestion\n index={index}\n key={suggestion}\n onClick={() => handleSubmit(suggestion)}\n >\n {suggestion}\n </ChatSuggestion>\n ))}\n </ChatSuggestions>\n </ChatEmptyState>\n ) : (\n <>\n {groupMessages(chat.messages).map((item) =>\n item.kind === \"tool-activity\" ? (\n <ChatMessage from=\"assistant\" key={item.key}>\n <ToolActivityGroup describeToolCall={config.describeToolCall} steps={item.steps} />\n </ChatMessage>\n ) : (\n <MessageItem key={item.key} message={item.message} />\n ),\n )}\n {chat.pendingApprovals.map((approval) => (\n <ToolApprovalCard\n approval={approval}\n describeToolCall={config.describeToolCall}\n key={approval.id}\n onAlwaysApprove={onAlwaysApprove}\n onResolve={(callId, approve) => void chat.resolveApproval(callId, approve)}\n resolving={chat.resolvingApprovalId === approval.id}\n />\n ))}\n {busy ? <ChatTypingIndicator /> : null}\n </>\n )}\n </ChatMessages>\n\n {chat.error ? (\n <div className=\"mx-3 mb-1 flex items-center justify-between gap-2 rounded-lg bg-destructive/10 px-3 py-2 text-destructive text-xs\">\n <span className=\"min-w-0 truncate\">{chat.error}</span>\n <button className=\"shrink-0 cursor-pointer font-medium\" onClick={chat.clearError} type=\"button\">\n Dismiss\n </button>\n </div>\n ) : null}\n\n <ChatInput\n className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}\n disabled={busy || chat.pendingApprovals.length > 0}\n onSubmit={handleSubmit}\n onValueChange={setDraft}\n placeholder={\n chat.pendingApprovals.length > 0\n ? \"Approve or decline the pending action first…\"\n : `Ask ${agentName}…`\n }\n value={draft}\n />\n </Chat>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { AgentApiClient, AgentApiError } from \"./api-client\";\nimport type {\n AgentConfig,\n AgentMessage,\n AgentPublicConfig,\n ConversationSummary,\n PendingApproval,\n} from \"./types\";\n\nexport interface AgentChatState {\n agentInfo: AgentPublicConfig | null;\n conversationId: string | null;\n conversations: ConversationSummary[];\n messages: AgentMessage[];\n pendingApprovals: PendingApproval[];\n sending: boolean;\n resolvingApprovalId: string | null;\n error: string | null;\n}\n\nexport interface AgentChatActions {\n send: (text: string) => Promise<void>;\n resolveApproval: (callId: string, approve: boolean) => Promise<void>;\n newChat: () => void;\n openConversation: (conversationId: string) => Promise<void>;\n refreshConversations: () => Promise<void>;\n deleteConversation: (conversationId: string) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * Headless chat state for an Agent Mode agent: message history, sending,\n * pending write-tool approvals, and conversation management. UI-agnostic.\n */\nexport function useAgentChat(config: AgentConfig): AgentChatState & AgentChatActions {\n const client = React.useMemo(() => new AgentApiClient(config), [config]);\n\n const [agentInfo, setAgentInfo] = React.useState<AgentPublicConfig | null>(null);\n const [conversationId, setConversationId] = React.useState<string | null>(null);\n const [conversations, setConversations] = React.useState<ConversationSummary[]>([]);\n const [messages, setMessages] = React.useState<AgentMessage[]>([]);\n const [pendingApprovals, setPendingApprovals] = React.useState<PendingApproval[]>([]);\n const [sending, setSending] = React.useState(false);\n const [resolvingApprovalId, setResolvingApprovalId] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n client\n .getConfig()\n .then((info) => {\n if (!cancelled) setAgentInfo(info);\n })\n .catch(() => {\n // Non-fatal: the panel falls back to config-provided naming.\n });\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n const handleFailure = React.useCallback((err: unknown) => {\n const message =\n err instanceof AgentApiError\n ? err.message\n : \"Something went wrong. Please try again.\";\n setError(message);\n }, []);\n\n const applyResponse = React.useCallback(\n (response: {\n status?: string;\n message?: string;\n conversation_id?: string;\n messages?: AgentMessage[];\n pending_approvals?: PendingApproval[];\n }) => {\n if (response.status === \"error\" && !response.messages?.length) {\n setError(response.message ?? \"The assistant could not answer.\");\n return;\n }\n if (response.conversation_id) setConversationId(response.conversation_id);\n if (response.messages?.length) {\n setMessages((current) => {\n const seen = new Set(current.map((message) => message.id));\n const fresh = response.messages?.filter((message) => !seen.has(message.id)) ?? [];\n return [...current, ...fresh];\n });\n }\n setPendingApprovals(response.pending_approvals ?? []);\n if (response.status === \"error\" && response.message) {\n setError(response.message);\n }\n },\n [],\n );\n\n const send = React.useCallback(\n async (text: string) => {\n if (sending) return;\n setSending(true);\n setError(null);\n try {\n const response = await client.sendMessage(text, conversationId);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setSending(false);\n }\n },\n [applyResponse, client, conversationId, handleFailure, sending],\n );\n\n const resolveApproval = React.useCallback(\n async (callId: string, approve: boolean) => {\n if (resolvingApprovalId) return;\n setResolvingApprovalId(callId);\n setError(null);\n try {\n const response = await client.resolveApproval(callId, approve);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setResolvingApprovalId(null);\n }\n },\n [applyResponse, client, handleFailure, resolvingApprovalId],\n );\n\n const newChat = React.useCallback(() => {\n setConversationId(null);\n setMessages([]);\n setPendingApprovals([]);\n setError(null);\n }, []);\n\n const refreshConversations = React.useCallback(async () => {\n try {\n const { conversations: list } = await client.listConversations();\n setConversations(list);\n } catch (err) {\n handleFailure(err);\n }\n }, [client, handleFailure]);\n\n const openConversation = React.useCallback(\n async (id: string) => {\n setError(null);\n try {\n const payload = await client.getConversation(id);\n setConversationId(id);\n setMessages(payload.messages ?? []);\n setPendingApprovals(payload.pending_approvals ?? []);\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, handleFailure],\n );\n\n const deleteConversation = React.useCallback(\n async (id: string) => {\n try {\n await client.deleteConversation(id);\n setConversations((current) => current.filter((c) => c.id !== id));\n if (conversationId === id) newChat();\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, conversationId, handleFailure, newChat],\n );\n\n const clearError = React.useCallback(() => setError(null), []);\n\n return {\n agentInfo,\n clearError,\n conversationId,\n conversations,\n deleteConversation,\n error,\n messages,\n newChat,\n openConversation,\n pendingApprovals,\n refreshConversations,\n resolveApproval,\n resolvingApprovalId,\n send,\n sending,\n };\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nconst STORAGE_PREFIX = \"cc-agent-always-approve:\";\n\nfunction storageKey(clientId: string): string {\n return `${STORAGE_PREFIX}${clientId || \"default\"}`;\n}\n\nfunction readStored(clientId: string): Set<string> {\n if (typeof window === \"undefined\") return new Set();\n try {\n const raw = window.localStorage.getItem(storageKey(clientId));\n if (!raw) return new Set();\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? new Set(parsed.filter((v): v is string => typeof v === \"string\")) : new Set();\n } catch {\n return new Set();\n }\n}\n\nexport interface AlwaysApproveStore {\n /** Whether the user chose to always approve this tool for this agent. */\n isAlwaysApproved: (toolName: string) => boolean;\n /** Remember to auto-approve this tool from now on (persisted per agent). */\n setAlwaysApprove: (toolName: string) => void;\n /** Stop auto-approving this tool. */\n clearAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Per-agent \"always approve\" memory for write tools, persisted in localStorage\n * (keyed by client id). Once a tool is trusted the panel auto-resolves its\n * future approval prompts instead of asking again.\n */\nexport function useAlwaysApprove(clientId: string): AlwaysApproveStore {\n const [approved, setApproved] = React.useState<Set<string>>(() => new Set());\n\n // Load once mounted (localStorage is unavailable during SSR).\n React.useEffect(() => {\n setApproved(readStored(clientId));\n }, [clientId]);\n\n const persist = React.useCallback(\n (next: Set<string>) => {\n setApproved(next);\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(storageKey(clientId), JSON.stringify([...next]));\n } catch {\n // Ignore quota/availability errors — trust simply won't persist.\n }\n },\n [clientId],\n );\n\n const isAlwaysApproved = React.useCallback((toolName: string) => approved.has(toolName), [approved]);\n\n const setAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (approved.has(toolName)) return;\n const next = new Set(approved);\n next.add(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n const clearAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (!approved.has(toolName)) return;\n const next = new Set(approved);\n next.delete(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n return { clearAlwaysApprove, isAlwaysApproved, setAlwaysApprove };\n}\n","\"use client\";\n\nimport { cn, Fab, TooltipProvider, useMediaQuery } from \"@cntyclub/ui-react\";\nimport { SparklesIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { AgentConfig, AgentMessage } from \"../types\";\nimport { useAgentChat } from \"../use-agent-chat\";\nimport { useAlwaysApprove } from \"../use-always-approve\";\nimport { AgentPanel } from \"./agent-panel\";\n\nexport interface AgentWidgetProps {\n config: AgentConfig;\n /** Controlled open state (optional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * The embeddable Agent Mode widget.\n *\n * - Closed: a floating round button (bottom-right by default).\n * - Open on desktop: a popup panel anchored to the button, with an\n * \"Agent Mode\" button that expands to a fullscreen chat. While in the popup,\n * the widget can navigate the host app to pages related to the tools the\n * agent uses (via `config.pages` + `config.navigate`).\n * - Open on mobile: fullscreen from the start.\n *\n * All colors come from the host app's UI-kit theme tokens, so light/dark mode\n * follows the dashboard automatically.\n */\nexport function AgentWidget({ config, onOpenChange, open: controlledOpen }: AgentWidgetProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = React.useCallback(\n (next: boolean) => {\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n const [agentMode, setAgentMode] = React.useState(false);\n const isDesktop = useMediaQuery(\"(min-width: 640px)\", {\n defaultSSRValue: true,\n ssr: true,\n });\n const fullscreen = !isDesktop || agentMode;\n\n const chat = useAgentChat(config);\n const alwaysApprove = useAlwaysApprove(config.clientId);\n\n // ----- auto-approve trusted write tools -----\n // When the user has chosen \"Always approve\" for a tool, resolve its pending\n // prompts automatically (one at a time — the backend waits for siblings).\n const { pendingApprovals, resolveApproval, resolvingApprovalId } = chat;\n const { isAlwaysApproved } = alwaysApprove;\n React.useEffect(() => {\n if (!open || resolvingApprovalId) return;\n const target = pendingApprovals.find((approval) => isAlwaysApproved(approval.tool_name));\n if (target) void resolveApproval(target.id, true);\n }, [open, pendingApprovals, resolvingApprovalId, isAlwaysApproved, resolveApproval]);\n\n // ----- page-follow navigation (popup mode only) -----\n const lastNavigatedMessageId = React.useRef<string | null>(null);\n const { messages } = chat;\n React.useEffect(() => {\n if (!open || fullscreen || !config.navigate || !config.pages?.length) return;\n const toolMessages = messages.filter((message) => message.role === \"tool\");\n const latest = toolMessages[toolMessages.length - 1];\n if (!latest || latest.id === lastNavigatedMessageId.current) return;\n lastNavigatedMessageId.current = latest.id;\n\n const mapping = config.pages.find((page) => page.tools.includes(latest.tool_name ?? \"\"));\n if (!mapping) return;\n\n const args = findToolArguments(messages, latest);\n const path = mapping.buildRoute ? mapping.buildRoute(args) : mapping.route;\n if (path) config.navigate(path);\n }, [config, fullscreen, messages, open]);\n\n const closePanel = React.useCallback(() => {\n setOpen(false);\n setAgentMode(false);\n }, [setOpen]);\n\n return (\n <TooltipProvider>\n {!open && !config.appearance?.hideLauncher ? (\n <Fab\n aria-label=\"Open assistant\"\n onClick={() => setOpen(true)}\n position={config.appearance?.position ?? \"bottom-right\"}\n >\n <SparklesIcon />\n </Fab>\n ) : null}\n\n {open ? (\n fullscreen ? (\n <div\n aria-modal=\"true\"\n className=\"fixed inset-0 z-50 flex flex-col bg-background\"\n role=\"dialog\"\n >\n <AgentPanel\n agentMode={agentMode}\n canToggleAgentMode={isDesktop}\n chat={chat}\n className=\"flex-1\"\n config={config}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode((value) => !value)}\n />\n </div>\n ) : (\n <div\n className={cn(\n \"fixed z-50 flex flex-col overflow-hidden rounded-2xl border border-border shadow-2xl\",\n (config.appearance?.position ?? \"bottom-right\") === \"bottom-left\"\n ? \"bottom-4 left-4 sm:bottom-6 sm:left-6\"\n : \"right-4 bottom-4 sm:right-6 sm:bottom-6\",\n )}\n role=\"dialog\"\n style={{\n height: `min(${config.appearance?.panelHeight ?? 640}px, calc(100dvh - 3rem))`,\n width: `min(${config.appearance?.panelWidth ?? 400}px, calc(100vw - 2rem))`,\n }}\n >\n <AgentPanel\n agentMode={false}\n canToggleAgentMode\n chat={chat}\n className=\"flex-1\"\n config={config}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode(true)}\n />\n </div>\n )\n ) : null}\n </TooltipProvider>\n );\n}\n\n/** Look up the arguments of the assistant tool_call a tool message answers. */\nfunction findToolArguments(\n messages: AgentMessage[],\n toolMessage: AgentMessage,\n): Record<string, unknown> {\n if (!toolMessage.tool_call_id) return {};\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role !== \"assistant\" || !message.tool_calls) continue;\n const match = message.tool_calls.find((call) => call.id === toolMessage.tool_call_id);\n if (match) return match.arguments ?? {};\n }\n return {};\n}\n","import type { AgentConfig } from \"./types\";\n\n/**\n * Identity helper that gives host apps full type inference/checking when\n * declaring their agent config file.\n */\nexport function defineAgentConfig(config: AgentConfig): AgentConfig {\n return config;\n}\n"]}
@@ -0,0 +1,37 @@
1
+ import type { AgentMessage, MessageBlock } from "./types";
2
+ /** One tool invocation inside a tool-activity group. */
3
+ export interface ToolStep {
4
+ /** Provider tool-call id (matches assistant tool_call ↔ tool result). */
5
+ callId: string;
6
+ name: string;
7
+ args: Record<string, unknown>;
8
+ status: "running" | "done";
9
+ /** Capped, pretty-printed raw result (for the JSON detail view). */
10
+ result?: string;
11
+ /** Structured blocks (tables) derived from the result. */
12
+ blocks?: MessageBlock[];
13
+ }
14
+ export type RenderItem = {
15
+ kind: "user";
16
+ key: string;
17
+ message: AgentMessage;
18
+ } | {
19
+ kind: "assistant-text";
20
+ key: string;
21
+ message: AgentMessage;
22
+ } | {
23
+ kind: "tool-activity";
24
+ key: string;
25
+ steps: ToolStep[];
26
+ };
27
+ /**
28
+ * Collapse the raw message stream into render items: user bubbles, assistant
29
+ * text bubbles, and *grouped* tool activity. Consecutive tool calls (assistant
30
+ * tool_calls + their tool results) fold into a single group so a run of ten
31
+ * lookups shows as one collapsible block instead of ten stacked chips.
32
+ *
33
+ * An assistant message that carries visible text flushes the current group and
34
+ * emits a text bubble before starting any new tool steps.
35
+ */
36
+ export declare function groupMessages(messages: AgentMessage[]): RenderItem[];
37
+ //# sourceMappingURL=message-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-group.d.ts","sourceRoot":"","sources":["../src/message-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC;AAE9D;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,UAAU,EAAE,CAwEpE"}
@@ -0,0 +1,20 @@
1
+ import type { DescribeToolCall, ToolCallDetail } from "./types";
2
+ /** "business_target_company_tags_apply" → "target company tags apply". */
3
+ export declare function humanizeToolName(toolName: string): string;
4
+ /**
5
+ * Derive human-readable facts from raw arguments, dropping technical keys and
6
+ * bare-identifier values. Long strings are truncated for the card.
7
+ */
8
+ export declare function deriveDetails(args: Record<string, unknown>): ToolCallDetail[];
9
+ export interface ResolvedToolPresentation {
10
+ title: string;
11
+ summary: string | null;
12
+ details: ToolCallDetail[];
13
+ }
14
+ /**
15
+ * Resolve how a tool call should be shown: prefer the host app's
16
+ * `describeToolCall`, then fall back to a humanized name plus the non-technical
17
+ * arguments so approvals and the tool log always read conceptually.
18
+ */
19
+ export declare function resolveToolPresentation(describe: DescribeToolCall | undefined, toolName: string, args: Record<string, unknown>): ResolvedToolPresentation;
20
+ //# sourceMappingURL=tool-presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-presentation.d.ts","sourceRoot":"","sources":["../src/tool-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,cAAc,EAAE,MAAM,SAAS,CAAC;AAErF,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAyDD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,EAAE,CAW7E;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,wBAAwB,CAkB1B"}
package/dist/types.d.ts CHANGED
@@ -29,6 +29,8 @@ export interface ToolCallInfo {
29
29
  export interface AgentMessage extends Omit<AgentModeSchemas["AgentChatMessage"], "blocks" | "tool_calls"> {
30
30
  blocks?: MessageBlock[];
31
31
  tool_calls?: ToolCallInfo[];
32
+ /** Tool messages only: capped, pretty-printed raw result for the JSON detail view. */
33
+ result?: string;
32
34
  }
33
35
  export type PendingApproval = AgentModeSchemas["PendingApproval"];
34
36
  export type ConversationSummary = Required<AgentModeSchemas["ConversationList"]>;
@@ -39,6 +41,41 @@ export interface ChatResponse extends Omit<AgentModeSchemas["AgentChatResponse"]
39
41
  }
40
42
  export type ChatRequest = AgentModeSchemas["ChatRequestRequest"];
41
43
  export type ApprovalRequest = AgentModeSchemas["ApprovalRequestRequest"];
44
+ /** One "key: value" fact shown inside a tool/approval card. */
45
+ export interface ToolCallDetail {
46
+ label: string;
47
+ value: string;
48
+ }
49
+ /**
50
+ * A human-readable description of a tool call, used to render approval prompts
51
+ * and the tool-activity log in plain language instead of raw arguments.
52
+ *
53
+ * Return this from {@link AgentConfig.describeToolCall} to turn e.g.
54
+ * `target_company_tags_apply({name:"Potential-Fit", company_id:"861a…"})`
55
+ * into "Tag Acme Corp as 'Potential-Fit'".
56
+ */
57
+ export interface ToolCallDescription {
58
+ /** Short verb-phrase title, e.g. "Tag a company" or "Create product". */
59
+ title?: string;
60
+ /** One-line sentence describing exactly what will happen, in the user's terms. */
61
+ summary?: string;
62
+ /**
63
+ * Structured facts to show under the summary. When omitted the widget derives
64
+ * them from the arguments (hiding technical keys like ids, keys, and slugs).
65
+ */
66
+ details?: ToolCallDetail[];
67
+ /**
68
+ * Set false to keep the auto-derived argument facts hidden even when you
69
+ * provide no `details` (e.g. the summary already says everything). Default true.
70
+ */
71
+ showDerivedDetails?: boolean;
72
+ }
73
+ /**
74
+ * Describes a tool call in plain language for approval prompts and the tool log.
75
+ * Receives the MCP tool name and its arguments; return `null`/`undefined` to
76
+ * fall back to the widget's default (humanized name + non-technical arguments).
77
+ */
78
+ export type DescribeToolCall = (toolName: string, args: Record<string, unknown>) => ToolCallDescription | null | undefined;
42
79
  /** Maps MCP tools to a page in the host app so the agent can navigate alongside chat. */
43
80
  export interface AgentPageMapping {
44
81
  /** MCP tool names whose execution relates to this page. */
@@ -71,6 +108,13 @@ export interface AgentConfig {
71
108
  navigate?: (path: string) => void;
72
109
  /** Tool → page mappings used for page-follow navigation and hints. */
73
110
  pages?: AgentPageMapping[];
111
+ /**
112
+ * Turn raw tool calls into plain-language descriptions for approval prompts
113
+ * and the tool-activity log. Without it the widget still hides technical
114
+ * arguments (ids, keys, slugs, UUIDs) and humanizes the tool name, but this
115
+ * hook lets each dashboard say exactly what an action means to its users.
116
+ */
117
+ describeToolCall?: DescribeToolCall;
74
118
  /** Widget appearance tweaks. All styling comes from the host's UI-kit theme tokens. */
75
119
  appearance?: {
76
120
  /** Floating button position. Default: "bottom-right". */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface AlwaysApproveStore {
2
+ /** Whether the user chose to always approve this tool for this agent. */
3
+ isAlwaysApproved: (toolName: string) => boolean;
4
+ /** Remember to auto-approve this tool from now on (persisted per agent). */
5
+ setAlwaysApprove: (toolName: string) => void;
6
+ /** Stop auto-approving this tool. */
7
+ clearAlwaysApprove: (toolName: string) => void;
8
+ }
9
+ /**
10
+ * Per-agent "always approve" memory for write tools, persisted in localStorage
11
+ * (keyed by client id). Once a tool is trusted the panel auto-resolves its
12
+ * future approval prompts instead of asking again.
13
+ */
14
+ export declare function useAlwaysApprove(clientId: string): AlwaysApproveStore;
15
+ //# sourceMappingURL=use-always-approve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-always-approve.d.ts","sourceRoot":"","sources":["../src/use-always-approve.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,4EAA4E;IAC5E,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,qCAAqC;IACrC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CA4CrE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cntyclub/agent-react",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Embeddable AI agent chat widget for Country Club dashboards — floating button, popup panel, fullscreen Agent Mode, MCP tool approvals, and paginated result tables. Built exclusively on @cntyclub/ui-react.",
5
5
  "type": "module",
6
6
  "sideEffects": false,