@agent-native/dispatch 0.13.7 → 0.13.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-control-plane.js","sourceRoot":"","sources":["../../src/components/dispatch-control-plane.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n PromptComposer,\n agentNativePath,\n isInBuilderFrame,\n useActionQuery,\n useChangeVersions,\n useChatModels,\n useChatThreads,\n type ChatThreadSummary,\n} from \"@agent-native/core/client\";\nimport { RunsTray } from \"@agent-native/core/client/progress\";\nimport {\n IconActivity,\n IconAlertTriangle,\n IconArrowUpRight,\n IconBolt,\n IconBroadcast,\n IconCheck,\n IconClockHour4,\n IconListCheck,\n IconMessages,\n IconPlayerPlay,\n IconPlugConnected,\n IconPlus,\n IconRobot,\n IconRocket,\n IconSettingsAutomation,\n IconShieldCheck,\n IconStack3,\n IconUsersGroup,\n type IconProps,\n} from \"@tabler/icons-react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { toast } from \"sonner\";\n\nimport type { ConnectedAgent } from \"@/components/agents-panel\";\nimport { CreateAppPopover } from \"@/components/create-app-popover\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { WorkspaceAppCard } from \"@/components/workspace-app-card\";\nimport {\n listDispatchAutomations,\n setDispatchAutomationEnabled,\n type DispatchAutomationItem,\n type SetDispatchAutomationEnabledInput,\n} from \"@/lib/automations\";\nimport { submitOverviewPrompt } from \"@/lib/overview-chat\";\nimport { cn } from \"@/lib/utils\";\nimport type { WorkspaceAppSummary } from \"@/lib/workspace-apps\";\n\ninterface DispatchOverview {\n counts?: {\n destinations?: number;\n pendingApprovals?: number;\n linkedIdentities?: number;\n activeTokens?: number;\n };\n recentApprovals?: Array<{\n id: string;\n summary: string;\n status: string;\n requestedBy?: string;\n }>;\n recentAudit?: RecentAuditEvent[];\n settings?: {\n enabled?: boolean;\n };\n vault?: {\n secretCount?: number;\n activeGrantCount?: number;\n accessMode?: string;\n };\n}\n\ninterface RecentAuditEvent {\n id: string;\n summary: string;\n actor: string;\n action?: string;\n createdAt: string;\n}\n\ninterface TaskQueueRecentFailure {\n id: string;\n platform: string;\n error: string;\n attempts: number;\n}\n\ninterface TaskQueueStats {\n pending: number;\n processing: number;\n completed_last_hour: number;\n failed_last_hour: number;\n oldest_pending_age_seconds: number;\n recent_failures: TaskQueueRecentFailure[];\n}\n\ntype AutomationItem = DispatchAutomationItem;\n\nconst ZERO_TASK_QUEUE_STATS: TaskQueueStats = {\n pending: 0,\n processing: 0,\n completed_last_hour: 0,\n failed_last_hour: 0,\n oldest_pending_age_seconds: 0,\n recent_failures: [],\n};\n\nconst PROMPT_SUGGESTIONS = [\n \"Summarize the current workspace health\",\n \"Create an app for onboarding requests\",\n \"Check which agents can help with analytics\",\n];\n\nconst AUTOMATIONS_QUERY_KEY = [\n \"dispatch-control-plane\",\n \"automations\",\n] as const;\n\nfunction formatNumber(value: number): string {\n return new Intl.NumberFormat(undefined, {\n notation: value >= 10_000 ? \"compact\" : \"standard\",\n maximumFractionDigits: value >= 10_000 ? 1 : 0,\n }).format(value);\n}\n\nfunction formatAgeSeconds(seconds: number): string {\n if (!seconds || seconds < 0) return \"0s\";\n if (seconds < 60) return `${Math.floor(seconds)}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m`;\n}\n\nfunction timeAgo(value: number | string | null | undefined): string {\n if (value == null || value === \"\") return \"never\";\n const timestamp =\n typeof value === \"number\" ? value : new Date(value).getTime();\n if (!Number.isFinite(timestamp)) return \"never\";\n const diff = Math.max(0, Date.now() - timestamp);\n if (diff < 60_000) return \"now\";\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h`;\n return `${Math.floor(diff / 86_400_000)}d`;\n}\n\nfunction relativeRunTime(value: string | null | undefined): string {\n if (!value) return \"never\";\n const timestamp = new Date(value).getTime();\n if (!Number.isFinite(timestamp)) return \"never\";\n const diff = timestamp - Date.now();\n const abs = Math.abs(diff);\n const suffix = diff >= 0 ? \"from now\" : \"ago\";\n if (abs < 60_000) return diff >= 0 ? \"soon\" : \"now\";\n if (abs < 3_600_000) return `${Math.floor(abs / 60_000)}m ${suffix}`;\n if (abs < 86_400_000) return `${Math.floor(abs / 3_600_000)}h ${suffix}`;\n return `${Math.floor(abs / 86_400_000)}d ${suffix}`;\n}\n\nfunction dateTimeTitle(value: string | null | undefined): string | undefined {\n if (!value) return undefined;\n const timestamp = new Date(value).getTime();\n if (!Number.isFinite(timestamp)) return undefined;\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(timestamp);\n}\n\nfunction threadUpdatedAt(thread: ChatThreadSummary): number {\n return Number.isFinite(thread.updatedAt)\n ? thread.updatedAt\n : Number.isFinite(thread.createdAt)\n ? thread.createdAt\n : 0;\n}\n\nfunction threadTitle(thread: ChatThreadSummary): string {\n return thread.title || thread.preview || \"New chat\";\n}\n\nfunction automationTarget(item: AutomationItem): string {\n if (item.triggerType === \"event\" && item.event) return item.event;\n if (item.scheduleDescription) return item.scheduleDescription;\n if (item.schedule) return item.schedule;\n return item.triggerType || \"schedule\";\n}\n\nfunction automationLastRun(item: AutomationItem): string {\n return item.lastRun ? relativeRunTime(item.lastRun) : \"never\";\n}\n\nfunction automationNextRun(item: AutomationItem): string {\n if (!item.enabled) return \"paused\";\n if (item.triggerType === \"event\") return \"on event\";\n return item.nextRun ? relativeRunTime(item.nextRun) : \"not scheduled\";\n}\n\nfunction automationStatus(item: AutomationItem): {\n label: string;\n tone: \"default\" | \"success\" | \"warning\" | \"danger\" | \"muted\";\n} {\n if (!item.enabled) return { label: \"Paused\", tone: \"muted\" };\n if (item.lastStatus === \"error\") return { label: \"Error\", tone: \"danger\" };\n if (item.lastStatus === \"running\")\n return { label: \"Running\", tone: \"warning\" };\n if (item.lastStatus === \"skipped\")\n return { label: \"Skipped\", tone: \"warning\" };\n if (item.lastStatus === \"success\")\n return { label: \"Healthy\", tone: \"success\" };\n return { label: \"Ready\", tone: \"default\" };\n}\n\nfunction automationIdentity(\n item: Pick<AutomationItem, \"owner\" | \"path\">,\n): string {\n return `${item.owner}:${item.path}`;\n}\n\nfunction StatusDot({\n tone = \"default\",\n}: {\n tone?: \"default\" | \"success\" | \"warning\" | \"danger\" | \"muted\";\n}) {\n return (\n <span\n className={cn(\n \"size-2 rounded-full\",\n tone === \"success\" && \"bg-emerald-500\",\n tone === \"warning\" && \"bg-amber-500\",\n tone === \"danger\" && \"bg-destructive\",\n tone === \"muted\" && \"bg-muted-foreground/35\",\n tone === \"default\" && \"bg-primary\",\n )}\n />\n );\n}\n\nfunction useAutomationsStatus() {\n const version = useChangeVersions([\"action\", \"screen-refresh\"]);\n return useQuery<AutomationItem[]>({\n queryKey: [...AUTOMATIONS_QUERY_KEY, version],\n queryFn: listDispatchAutomations,\n placeholderData: (prev) => prev,\n refetchInterval: 15_000,\n staleTime: 5_000,\n });\n}\n\nfunction useToggleAutomation() {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: setDispatchAutomationEnabled,\n onMutate: async (input: SetDispatchAutomationEnabledInput) => {\n await queryClient.cancelQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n const snapshots = queryClient.getQueriesData<AutomationItem[]>({\n queryKey: AUTOMATIONS_QUERY_KEY,\n });\n\n queryClient.setQueriesData<AutomationItem[]>(\n { queryKey: AUTOMATIONS_QUERY_KEY },\n (rows) =>\n rows?.map((item) =>\n automationIdentity(item) === automationIdentity(input)\n ? { ...item, enabled: input.enabled }\n : item,\n ),\n );\n\n return { snapshots };\n },\n onError: (err, _input, context) => {\n for (const [queryKey, data] of context?.snapshots ?? []) {\n queryClient.setQueryData(queryKey, data);\n }\n toast.error(\n `Could not update automation: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n },\n onSuccess: (updated) => {\n queryClient.setQueriesData<AutomationItem[]>(\n { queryKey: AUTOMATIONS_QUERY_KEY },\n (rows) =>\n rows?.map((item) =>\n automationIdentity(item) === automationIdentity(updated)\n ? updated\n : item,\n ),\n );\n },\n onSettled: () => {\n void queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n },\n });\n}\n\nfunction useTaskQueueStats() {\n return useQuery<TaskQueueStats>({\n queryKey: [\"dispatch-control-plane\", \"task-queue\"],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\"/_agent-native/integrations/task-queue/status\"),\n );\n if (!res.ok) return ZERO_TASK_QUEUE_STATS;\n const stats = await res.json();\n if (!stats || typeof stats !== \"object\") return ZERO_TASK_QUEUE_STATS;\n return {\n pending: Number(stats.pending ?? 0),\n processing: Number(stats.processing ?? 0),\n completed_last_hour: Number(stats.completed_last_hour ?? 0),\n failed_last_hour: Number(stats.failed_last_hour ?? 0),\n oldest_pending_age_seconds: Number(\n stats.oldest_pending_age_seconds ?? 0,\n ),\n recent_failures: Array.isArray(stats.recent_failures)\n ? stats.recent_failures\n : [],\n };\n },\n placeholderData: (prev) => prev,\n refetchInterval: 15_000,\n staleTime: 5_000,\n });\n}\n\nfunction CommandPanel() {\n const { selectedModel } = useChatModels();\n const navigate = useNavigate();\n\n function send(message: string) {\n const trimmed = message.trim();\n if (!trimmed) return;\n\n if (isInBuilderFrame()) {\n submitOverviewPrompt(trimmed, selectedModel);\n return;\n }\n\n navigate(\"/chat\", {\n state: {\n dispatchPrompt: {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n message: trimmed,\n selectedModel,\n },\n },\n });\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <IconBroadcast size={16} className=\"text-muted-foreground\" />\n <h2 className=\"text-sm font-semibold text-foreground\">\n Ask Dispatch\n </h2>\n </div>\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/chat\">\n Open chat\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n </div>\n <PromptComposer\n placeholder=\"Route work, inspect status, or create an app...\"\n onSubmit={(text) => send(text)}\n />\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {PROMPT_SUGGESTIONS.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => send(suggestion)}\n className=\"cursor-pointer rounded-md border border-border bg-background px-2.5 py-1.5 text-xs text-muted-foreground transition hover:border-foreground/30 hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </section>\n );\n}\n\nfunction MetricCard({\n label,\n value,\n detail,\n icon: Icon,\n to,\n tone = \"default\",\n}: {\n label: string;\n value: ReactNode;\n detail: string;\n icon: React.ComponentType<IconProps>;\n to?: string;\n tone?: \"default\" | \"success\" | \"warning\" | \"danger\";\n}) {\n const body = (\n <>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Icon size={15} />\n <span className=\"truncate\">{label}</span>\n </div>\n <StatusDot\n tone={\n tone === \"success\"\n ? \"success\"\n : tone === \"warning\"\n ? \"warning\"\n : tone === \"danger\"\n ? \"danger\"\n : \"default\"\n }\n />\n </div>\n <div className=\"mt-3 text-2xl font-semibold tracking-tight text-foreground\">\n {value}\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {detail}\n </div>\n </>\n );\n\n const className = cn(\n \"block min-w-0 rounded-lg border bg-card p-4 transition\",\n to && \"hover:border-foreground/30 hover:bg-muted/20\",\n );\n\n if (to) {\n return (\n <Link to={to} className={className}>\n {body}\n </Link>\n );\n }\n\n return <div className={className}>{body}</div>;\n}\n\nfunction ControlPlaneMetrics({\n overview,\n apps,\n agents,\n automations,\n threads,\n taskQueue,\n}: {\n overview?: DispatchOverview;\n apps: WorkspaceAppSummary[];\n agents: ConnectedAgent[];\n automations: AutomationItem[];\n threads: ChatThreadSummary[];\n taskQueue: TaskQueueStats;\n}) {\n const activeApps = apps.filter((app) => !app.isDispatch && !app.archived);\n const pendingApps = activeApps.filter((app) => app.status === \"pending\");\n const enabledAutomations = automations.filter((item) => item.enabled);\n const automationErrors = automations.filter(\n (item) => item.enabled && item.lastStatus === \"error\",\n );\n const pendingApprovals = overview?.counts?.pendingApprovals ?? 0;\n const activeRuns = taskQueue.processing;\n\n return (\n <section className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-6\">\n <MetricCard\n label=\"Chats\"\n value={formatNumber(threads.length)}\n detail={`${threads.filter((thread) => thread.messageCount > 0).length} with messages`}\n icon={IconMessages}\n to=\"/chat\"\n />\n <MetricCard\n label=\"Runs\"\n value={formatNumber(activeRuns)}\n detail={`${formatNumber(taskQueue.pending)} queued`}\n icon={IconPlayerPlay}\n tone={\n taskQueue.failed_last_hour > 0\n ? \"danger\"\n : taskQueue.pending > 5\n ? \"warning\"\n : \"default\"\n }\n />\n <MetricCard\n label=\"Apps\"\n value={formatNumber(activeApps.length)}\n detail={`${formatNumber(pendingApps.length)} building`}\n icon={IconStack3}\n to=\"/apps\"\n tone={pendingApps.length > 0 ? \"warning\" : \"default\"}\n />\n <MetricCard\n label=\"Agents\"\n value={formatNumber(agents.length)}\n detail={`${formatNumber(agents.filter((agent) => agent.source === \"custom\").length)} custom`}\n icon={IconRobot}\n to=\"/agents\"\n />\n <MetricCard\n label=\"Automations\"\n value={formatNumber(enabledAutomations.length)}\n detail={`${formatNumber(automationErrors.length)} need attention`}\n icon={IconSettingsAutomation}\n tone={automationErrors.length > 0 ? \"danger\" : \"success\"}\n />\n <MetricCard\n label=\"Approvals\"\n value={formatNumber(pendingApprovals)}\n detail={\n overview?.settings?.enabled ? \"review mode\" : \"immediate changes\"\n }\n icon={IconShieldCheck}\n to=\"/approvals\"\n tone={pendingApprovals > 0 ? \"warning\" : \"default\"}\n />\n </section>\n );\n}\n\nfunction SectionHeader({\n icon: Icon,\n title,\n detail,\n action,\n}: {\n icon: React.ComponentType<IconProps>;\n title: string;\n detail?: string;\n action?: ReactNode;\n}) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Icon size={16} className=\"shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-sm font-semibold text-foreground\">\n {title}\n </h2>\n {detail ? (\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {detail}\n </p>\n ) : null}\n </div>\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n );\n}\n\nfunction RecentChatsPanel() {\n const navigate = useNavigate();\n const { threads, activeThreadId, createThread, switchThread } =\n useChatThreads(undefined, undefined, undefined, { autoCreate: false });\n const [creating, setCreating] = useState(false);\n\n const visibleThreads = useMemo(\n () =>\n threads\n .filter(\n (thread) => thread.messageCount > 0 || thread.id === activeThreadId,\n )\n .sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))\n .slice(0, 5),\n [activeThreadId, threads],\n );\n\n function openThread(threadId: string, isNew = false) {\n switchThread(threadId);\n navigate(\"/chat\", {\n state: {\n dispatchThread: {\n id: `${Date.now()}-${threadId}`,\n threadId,\n },\n },\n });\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId, newThread: isNew },\n }),\n );\n });\n }\n\n async function handleNewChat() {\n setCreating(true);\n try {\n const threadId = await createThread();\n if (threadId) openThread(threadId, true);\n } finally {\n setCreating(false);\n }\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconMessages}\n title=\"Chats\"\n detail={`${visibleThreads.length} recent`}\n action={\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleNewChat}\n disabled={creating}\n >\n <IconPlus size={14} />\n New\n </Button>\n }\n />\n <div className=\"mt-3 divide-y rounded-md border\">\n {visibleThreads.length > 0 ? (\n visibleThreads.map((thread) => (\n <button\n key={thread.id}\n type=\"button\"\n onClick={() => openThread(thread.id)}\n className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] gap-3 px-3 py-2.5 text-left transition hover:bg-muted/40\"\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium text-foreground\">\n {threadTitle(thread)}\n </span>\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">\n {thread.preview || `${thread.messageCount} messages`}\n </span>\n </span>\n <span className=\"text-[11px] text-muted-foreground\">\n {timeAgo(threadUpdatedAt(thread))}\n </span>\n </button>\n ))\n ) : (\n <button\n type=\"button\"\n onClick={handleNewChat}\n className=\"block w-full px-3 py-8 text-center text-sm text-muted-foreground transition hover:bg-muted/40\"\n >\n Start a Dispatch chat\n </button>\n )}\n </div>\n </section>\n );\n}\n\nfunction RunsPanel({ taskQueue }: { taskQueue: TaskQueueStats }) {\n const hasFailure = taskQueue.failed_last_hour > 0;\n const hasBacklog =\n taskQueue.pending > 5 || taskQueue.oldest_pending_age_seconds > 300;\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconPlayerPlay}\n title=\"Runs\"\n detail={\n hasFailure\n ? `${taskQueue.failed_last_hour} failed in the last hour`\n : `${taskQueue.processing} processing`\n }\n action={\n <RunsTray\n triggerVariant=\"pill\"\n hideWhenIdle={false}\n showRecent\n limit={8}\n />\n }\n />\n <div className=\"mt-3 grid grid-cols-4 gap-2\">\n <QueueCell label=\"Queued\" value={taskQueue.pending} />\n <QueueCell label=\"Active\" value={taskQueue.processing} />\n <QueueCell label=\"Done 1h\" value={taskQueue.completed_last_hour} />\n <QueueCell\n label=\"Failed 1h\"\n value={taskQueue.failed_last_hour}\n danger={hasFailure}\n />\n </div>\n <div\n className={cn(\n \"mt-3 rounded-md border px-3 py-2 text-xs\",\n hasFailure\n ? \"border-destructive/30 bg-destructive/5 text-destructive\"\n : hasBacklog\n ? \"border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n : \"bg-muted/20 text-muted-foreground\",\n )}\n >\n Oldest queued: {formatAgeSeconds(taskQueue.oldest_pending_age_seconds)}\n </div>\n {taskQueue.recent_failures.length > 0 ? (\n <div className=\"mt-3 divide-y rounded-md border\">\n {taskQueue.recent_failures.slice(0, 3).map((failure) => (\n <div key={failure.id} className=\"px-3 py-2\">\n <div className=\"flex items-center justify-between gap-3 text-xs\">\n <span className=\"font-medium text-foreground\">\n {failure.platform}\n </span>\n <span className=\"text-muted-foreground\">\n {failure.attempts} attempts\n </span>\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {failure.error || \"(no error message)\"}\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction QueueCell({\n label,\n value,\n danger,\n}: {\n label: string;\n value: number;\n danger?: boolean;\n}) {\n return (\n <div className=\"rounded-md border bg-background px-2 py-2\">\n <div\n className={cn(\n \"text-lg font-semibold text-foreground\",\n danger && \"text-destructive\",\n )}\n >\n {formatNumber(value)}\n </div>\n <div className=\"truncate text-[11px] text-muted-foreground\">{label}</div>\n </div>\n );\n}\n\nfunction AppsPanel({\n apps,\n isLoading,\n}: {\n apps: WorkspaceAppSummary[];\n isLoading: boolean;\n}) {\n const visibleApps = apps\n .filter((app) => !app.isDispatch && !app.archived)\n .slice(0, 4);\n const showSkeletons = isLoading && visibleApps.length === 0;\n\n return (\n <section className=\"space-y-3\">\n <SectionHeader\n icon={IconStack3}\n title=\"Projects and apps\"\n detail={`${apps.filter((app) => !app.isDispatch && !app.archived).length} active`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/apps\">\n View all\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n {showSkeletons ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {Array.from({ length: 4 }).map((_, index) => (\n <div key={index} className=\"rounded-lg border bg-card p-4\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"mt-3 h-3 w-24\" />\n <Skeleton className=\"mt-3 h-3 w-full\" />\n </div>\n ))}\n </div>\n ) : visibleApps.length > 0 ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {visibleApps.map((app) => (\n <WorkspaceAppCard key={app.id} app={app} className=\"min-h-32\" />\n ))}\n </div>\n ) : (\n <CreateAppPopover />\n )}\n </section>\n );\n}\n\nfunction AutomationsPanel({\n automations,\n isLoading,\n}: {\n automations: AutomationItem[];\n isLoading: boolean;\n}) {\n const toggleAutomation = useToggleAutomation();\n const ordered = useMemo(\n () =>\n [...automations].sort((a, b) => {\n const aError = a.enabled && a.lastStatus === \"error\" ? 1 : 0;\n const bError = b.enabled && b.lastStatus === \"error\" ? 1 : 0;\n if (aError !== bError) return bError - aError;\n return (b.lastRun || \"\").localeCompare(a.lastRun || \"\");\n }),\n [automations],\n );\n const enabled = automations.filter((item) => item.enabled).length;\n const errors = automations.filter(\n (item) => item.enabled && item.lastStatus === \"error\",\n ).length;\n const pendingToggleIdentity = toggleAutomation.isPending\n ? toggleAutomation.variables\n ? automationIdentity(toggleAutomation.variables)\n : null\n : null;\n\n function handleToggle(item: AutomationItem, enabled: boolean) {\n toggleAutomation.mutate({\n owner: item.owner,\n path: item.path,\n enabled,\n });\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconSettingsAutomation}\n title=\"Automations\"\n detail={`${enabled} enabled · ${errors} errors`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/chat\">\n Create\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n <div className=\"mt-3 divide-y rounded-md border\">\n {isLoading && ordered.length === 0 ? (\n Array.from({ length: 4 }).map((_, index) => (\n <div key={index} className=\"px-3 py-2.5\">\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"mt-2 h-3 w-28\" />\n </div>\n ))\n ) : ordered.length > 0 ? (\n ordered.slice(0, 6).map((item) => {\n const status = automationStatus(item);\n const canUpdate = item.canUpdate !== false;\n const isToggling =\n pendingToggleIdentity === automationIdentity(item);\n return (\n <div\n key={item.id}\n className=\"grid grid-cols-[minmax(0,1fr)_auto] gap-3 px-3 py-2.5\"\n >\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <StatusDot tone={status.tone} />\n <span className=\"truncate text-sm font-medium text-foreground\">\n {item.name}\n </span>\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {automationTarget(item)}\n </div>\n <div className=\"mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px] text-muted-foreground\">\n <span title={dateTimeTitle(item.lastRun)}>\n Last {automationLastRun(item)}\n </span>\n <span title={dateTimeTitle(item.nextRun)}>\n Next {automationNextRun(item)}\n </span>\n </div>\n {item.lastError ? (\n <div className=\"mt-1 truncate text-xs text-destructive\">\n {item.lastError}\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-col items-end gap-1\">\n <Badge\n variant={\n status.tone === \"danger\" ? \"destructive\" : \"outline\"\n }\n className=\"h-5\"\n >\n {status.label}\n </Badge>\n <Switch\n checked={!!item.enabled}\n disabled={!canUpdate || isToggling}\n aria-label={`${item.enabled ? \"Disable\" : \"Enable\"} automation ${item.name}`}\n onCheckedChange={(checked) => handleToggle(item, checked)}\n />\n </div>\n </div>\n );\n })\n ) : (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n No automations yet\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction AgentsPanelSummary({ agents }: { agents: ConnectedAgent[] }) {\n const builtin = agents.filter((agent) => agent.source === \"builtin\");\n const extra = agents.filter((agent) => agent.source !== \"builtin\");\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconPlugConnected}\n title=\"Agents\"\n detail={`${builtin.length} built in · ${extra.length} added`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/agents\">\n Manage\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {agents.slice(0, 12).map((agent) => (\n <span\n key={agent.id}\n className=\"inline-flex max-w-full items-center gap-2 rounded-md border bg-background px-2.5 py-1.5 text-xs text-muted-foreground\"\n >\n <span\n className=\"size-2 shrink-0 rounded-full\"\n style={{ backgroundColor: agent.color || \"hsl(var(--primary))\" }}\n />\n <span className=\"truncate\">{agent.name}</span>\n </span>\n ))}\n {agents.length === 0 ? (\n <div className=\"w-full rounded-md border border-dashed px-3 py-6 text-center text-sm text-muted-foreground\">\n No agents detected\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction ApprovalsAndAuditPanel({\n overview,\n isLoading,\n}: {\n overview?: DispatchOverview;\n isLoading: boolean;\n}) {\n const approvals = overview?.recentApprovals ?? [];\n const audit = overview?.recentAudit ?? [];\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconActivity}\n title=\"Activity\"\n detail={`${approvals.length} approvals · ${audit.length} audit rows`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/audit\">\n Audit\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n <div className=\"mt-3 grid gap-3 lg:grid-cols-2\">\n <div className=\"rounded-md border\">\n <div className=\"flex items-center justify-between gap-3 border-b px-3 py-2\">\n <div className=\"text-xs font-medium uppercase text-muted-foreground\">\n Approvals\n </div>\n <Button variant=\"ghost\" size=\"sm\" asChild>\n <Link to=\"/approvals\">Open</Link>\n </Button>\n </div>\n <div className=\"divide-y\">\n {isLoading && approvals.length === 0 ? (\n Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"px-3 py-2.5\">\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"mt-2 h-3 w-24\" />\n </div>\n ))\n ) : approvals.length > 0 ? (\n approvals.slice(0, 4).map((approval) => (\n <div key={approval.id} className=\"px-3 py-2.5\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {approval.summary}\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <StatusDot\n tone={approval.status === \"pending\" ? \"warning\" : \"muted\"}\n />\n <span>{approval.status}</span>\n </div>\n </div>\n ))\n ) : (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n No approval requests\n </div>\n )}\n </div>\n </div>\n\n <div className=\"rounded-md border\">\n <div className=\"border-b px-3 py-2 text-xs font-medium uppercase text-muted-foreground\">\n Recent audit\n </div>\n <div className=\"divide-y\">\n {isLoading && audit.length === 0 ? (\n Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"px-3 py-2.5\">\n <Skeleton className=\"h-4 w-44\" />\n <Skeleton className=\"mt-2 h-3 w-28\" />\n </div>\n ))\n ) : audit.length > 0 ? (\n audit.slice(0, 4).map((event) => (\n <div key={event.id} className=\"px-3 py-2.5\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {event.summary}\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {event.actor} · {timeAgo(event.createdAt)}\n </div>\n </div>\n ))\n ) : (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n No audit entries\n </div>\n )}\n </div>\n </div>\n </div>\n </section>\n );\n}\n\nfunction ReadinessPanel({\n overview,\n apps,\n agents,\n automations,\n}: {\n overview?: DispatchOverview;\n apps: WorkspaceAppSummary[];\n agents: ConnectedAgent[];\n automations: AutomationItem[];\n}) {\n const rows = [\n {\n label: \"Vault\",\n detail:\n (overview?.vault?.secretCount ?? 0) > 0\n ? `${overview?.vault?.secretCount ?? 0} secrets`\n : \"no secrets\",\n ok: (overview?.vault?.secretCount ?? 0) > 0,\n to: \"/vault\",\n icon: IconShieldCheck,\n },\n {\n label: \"Apps\",\n detail: `${apps.filter((app) => !app.isDispatch && !app.archived).length} active`,\n ok: apps.some((app) => !app.isDispatch && !app.archived),\n to: \"/apps\",\n icon: IconRocket,\n },\n {\n label: \"Agents\",\n detail: `${agents.length} available`,\n ok: agents.length > 0,\n to: \"/agents\",\n icon: IconRobot,\n },\n {\n label: \"Automations\",\n detail: `${automations.filter((item) => item.enabled).length} enabled`,\n ok: automations.every(\n (item) => !item.enabled || item.lastStatus !== \"error\",\n ),\n to: \"/chat\",\n icon: IconBolt,\n },\n {\n label: \"Team\",\n detail: `${overview?.counts?.linkedIdentities ?? 0} linked identities`,\n ok: (overview?.counts?.linkedIdentities ?? 0) > 0,\n to: \"/settings#team\",\n icon: IconUsersGroup,\n },\n ];\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader icon={IconListCheck} title=\"Readiness\" />\n <div className=\"mt-3 divide-y rounded-md border\">\n {rows.map((row) => {\n const Icon = row.icon;\n return (\n <Link\n key={row.label}\n to={row.to}\n className=\"flex items-center gap-3 px-3 py-2.5 transition hover:bg-muted/40\"\n >\n <span\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-md border\",\n row.ok\n ? \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\"\n : \"bg-background text-muted-foreground\",\n )}\n >\n {row.ok ? <IconCheck size={14} /> : <Icon size={14} />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-foreground\">\n {row.label}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {row.detail}\n </span>\n </span>\n <IconArrowUpRight size={14} className=\"text-muted-foreground\" />\n </Link>\n );\n })}\n </div>\n </section>\n );\n}\n\nexport function DispatchControlPlane() {\n const { data: overviewData, isLoading: overviewLoading } =\n useActionQuery<DispatchOverview>(\"list-dispatch-overview\", {});\n const { data: connectedAgents = [] } = useActionQuery<ConnectedAgent[]>(\n \"list-connected-agents\",\n {},\n );\n const { data: workspaceApps = [], isLoading: appsLoading } = useActionQuery<\n WorkspaceAppSummary[]\n >(\n \"list-workspace-apps\",\n { includeAgentCards: false, includeArchived: true },\n { refetchInterval: 2_000 },\n );\n const { threads } = useChatThreads(undefined, undefined, undefined, {\n autoCreate: false,\n });\n const automationsQuery = useAutomationsStatus();\n const taskQueueQuery = useTaskQueueStats();\n\n const overview = overviewData;\n const apps = workspaceApps ?? [];\n const agents = connectedAgents ?? [];\n const automations = automationsQuery.data ?? [];\n const taskQueue = taskQueueQuery.data ?? ZERO_TASK_QUEUE_STATS;\n const visibleThreads = threads.filter((thread) => thread.messageCount > 0);\n\n useEffect(() => {\n const handleRunning = () => {\n void taskQueueQuery.refetch();\n };\n window.addEventListener(\"agentNative.chatRunning\", handleRunning);\n return () => {\n window.removeEventListener(\"agentNative.chatRunning\", handleRunning);\n };\n }, [taskQueueQuery]);\n\n return (\n <DispatchShell\n title=\"Control plane\"\n description=\"Dispatch is the workspace shell for chats, runs, apps, agents, automations, approvals, and resources.\"\n >\n <div className=\"space-y-6\">\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1.08fr)_minmax(360px,0.92fr)]\">\n <CommandPanel />\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <MetricCard\n label=\"Vault\"\n value={formatNumber(overview?.vault?.secretCount ?? 0)}\n detail={`${formatNumber(overview?.vault?.activeGrantCount ?? 0)} active grants`}\n icon={IconShieldCheck}\n to=\"/vault\"\n tone={\n (overview?.vault?.secretCount ?? 0) > 0 ? \"success\" : \"default\"\n }\n />\n <MetricCard\n label=\"Resources\"\n value={formatNumber(overview?.counts?.destinations ?? 0)}\n detail=\"destinations\"\n icon={IconArrowUpRight}\n to=\"/destinations\"\n />\n </div>\n </div>\n\n <ControlPlaneMetrics\n overview={overview}\n apps={apps}\n agents={agents}\n automations={automations}\n threads={visibleThreads}\n taskQueue={taskQueue}\n />\n\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1.15fr)_minmax(340px,0.85fr)]\">\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <RecentChatsPanel />\n <RunsPanel taskQueue={taskQueue} />\n </div>\n <AppsPanel apps={apps} isLoading={appsLoading} />\n <ApprovalsAndAuditPanel\n overview={overview}\n isLoading={overviewLoading}\n />\n </div>\n\n <div className=\"space-y-4\">\n <AutomationsPanel\n automations={automations}\n isLoading={automationsQuery.isLoading}\n />\n <AgentsPanelSummary agents={agents} />\n <ReadinessPanel\n overview={overview}\n apps={apps}\n agents={agents}\n automations={automations}\n />\n {taskQueue.failed_last_hour > 0 ? (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"flex items-center gap-2 font-medium\">\n <IconAlertTriangle size={16} />\n Integration failures detected\n </div>\n <div className=\"mt-1 text-xs\">\n Check credentials, destinations, and recent queue errors.\n </div>\n </div>\n ) : null}\n </div>\n </div>\n </div>\n </DispatchShell>\n );\n}\n"]}
1
+ {"version":3,"file":"dispatch-control-plane.js","sourceRoot":"","sources":["../../src/components/dispatch-control-plane.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n PromptComposer,\n isInBuilderFrame,\n useActionQuery,\n useChatModels,\n} from \"@agent-native/core/client\";\nimport {\n IconArrowUpRight,\n IconBroadcast,\n IconStack3,\n type IconProps,\n} from \"@tabler/icons-react\";\nimport type { ReactNode } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\n\nimport { CreateAppPopover } from \"@/components/create-app-popover\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { Button } from \"@/components/ui/button\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { WorkspaceAppCard } from \"@/components/workspace-app-card\";\nimport { submitOverviewPrompt } from \"@/lib/overview-chat\";\nimport type { WorkspaceAppSummary } from \"@/lib/workspace-apps\";\n\nconst PROMPT_SUGGESTIONS = [\n \"Summarize the current workspace health\",\n \"Create an app for onboarding requests\",\n \"Check which agents can help with analytics\",\n];\n\nfunction SectionHeader({\n icon: Icon,\n title,\n detail,\n action,\n}: {\n icon: React.ComponentType<IconProps>;\n title: string;\n detail?: string;\n action?: ReactNode;\n}) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Icon size={16} className=\"shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-sm font-semibold text-foreground\">\n {title}\n </h2>\n {detail ? (\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {detail}\n </p>\n ) : null}\n </div>\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n );\n}\n\nfunction CommandPanel() {\n const { selectedModel } = useChatModels();\n const navigate = useNavigate();\n\n function send(message: string) {\n const trimmed = message.trim();\n if (!trimmed) return;\n\n if (isInBuilderFrame()) {\n submitOverviewPrompt(trimmed, selectedModel);\n return;\n }\n\n navigate(\"/chat\", {\n state: {\n dispatchPrompt: {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n message: trimmed,\n selectedModel,\n },\n },\n });\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <IconBroadcast size={16} className=\"text-muted-foreground\" />\n <h2 className=\"text-sm font-semibold text-foreground\">\n Ask Dispatch\n </h2>\n </div>\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/chat\">\n Open chat\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n </div>\n <PromptComposer\n placeholder=\"Route work, inspect status, or create an app...\"\n onSubmit={(text) => send(text)}\n />\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {PROMPT_SUGGESTIONS.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => send(suggestion)}\n className=\"cursor-pointer rounded-md border border-border bg-background px-2.5 py-1.5 text-xs text-muted-foreground transition hover:border-foreground/30 hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </section>\n );\n}\n\nfunction AppsPanel({\n apps,\n isLoading,\n}: {\n apps: WorkspaceAppSummary[];\n isLoading: boolean;\n}) {\n const visibleApps = apps.filter((app) => !app.isDispatch && !app.archived);\n const showSkeletons = isLoading && visibleApps.length === 0;\n\n return (\n <section className=\"flex flex-col gap-3\">\n <SectionHeader\n icon={IconStack3}\n title=\"Apps\"\n detail={\n visibleApps.length === 1 ? \"1 active\" : `${visibleApps.length} active`\n }\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/apps\">\n View all\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n {showSkeletons ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {Array.from({ length: 4 }).map((_, index) => (\n <div key={index} className=\"rounded-lg border bg-card p-4\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"mt-3 h-3 w-24\" />\n <Skeleton className=\"mt-3 h-3 w-full\" />\n </div>\n ))}\n </div>\n ) : visibleApps.length > 0 ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {visibleApps.map((app) => (\n <WorkspaceAppCard key={app.id} app={app} className=\"min-h-32\" />\n ))}\n </div>\n ) : (\n <CreateAppPopover />\n )}\n </section>\n );\n}\n\nexport function DispatchControlPlane() {\n const { data: workspaceApps = [], isLoading: appsLoading } = useActionQuery<\n WorkspaceAppSummary[]\n >(\n \"list-workspace-apps\",\n { includeAgentCards: false, includeArchived: true },\n { refetchInterval: 2_000 },\n );\n\n return (\n <DispatchShell\n title=\"Overview\"\n description=\"Ask Dispatch or jump into a workspace app.\"\n >\n <div className=\"flex flex-col gap-6\">\n <CommandPanel />\n <AppsPanel apps={workspaceApps ?? []} isLoading={appsLoading} />\n </div>\n </DispatchShell>\n );\n}\n"]}
@@ -131,7 +131,7 @@ const OPERATIONS_NAV_ITEMS = [
131
131
  const EMPTY_NAV_ITEMS = [];
132
132
  const CHROMELESS_PATHS = ["/approval"];
133
133
  const SIDEBAR_COLLAPSE_KEY = "dispatch.sidebar.collapsed";
134
- // Routes whose page renders its own toolbar (with NotificationsBell + AgentToggleButton).
134
+ // Routes whose page renders its own toolbar.
135
135
  // Layout still mounts the sidebar + AgentSidebar, but skips its own Header so
136
136
  // there's no double-header.
137
137
  function pageOwnsToolbar(pathname) {
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AgentSidebar,\n FeedbackButton,\n appBasePath,\n appPath,\n focusAgentChat,\n navigateWithAgentChatViewTransition,\n useActionQuery,\n useAgentChatHomeHandoff,\n useAgentChatHomeHandoffLinks,\n useChatThreads,\n useFormatters,\n useT,\n type ChatThreadSummary,\n} from \"@agent-native/core/client\";\nimport { ExtensionsSidebarSection } from \"@agent-native/core/client/extensions\";\nimport { InvitationBanner, OrgSwitcher } from \"@agent-native/core/client/org\";\nimport {\n IconArrowUpRight,\n IconApps,\n IconBrain,\n IconChartBar,\n IconBrandTelegram,\n IconKey,\n IconChevronDown,\n IconDots,\n IconEdit,\n IconLayersSubtract,\n IconMessageQuestion,\n IconMessages,\n IconPlus,\n IconPlugConnected,\n IconBroadcast,\n IconFingerprint,\n IconHistory,\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarLeftExpand,\n IconPuzzle,\n IconSettings,\n IconShieldCheck,\n} from \"@tabler/icons-react\";\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport { NavLink, useLocation, useNavigate } from \"react-router\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetTitle,\n} from \"@/components/ui/sheet\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nimport { Header } from \"./Header\";\nimport { HeaderActionsProvider } from \"./HeaderActions\";\n\nexport type DispatchNavSection = \"primary\" | \"operations\";\n\nexport type DispatchNavIcon = ComponentType<{\n size?: number | string;\n className?: string;\n}>;\n\nexport interface DispatchNavItem {\n /** Stable id used for keys and navigation.view. Avoid built-in ids. */\n id: string;\n /** React Router path for the tab, usually backed by an app/routes/*.tsx file. */\n to: string;\n label: string;\n icon?: DispatchNavIcon;\n /** Defaults to \"operations\", which is where local management tools usually fit. */\n section?: DispatchNavSection;\n /** Override active matching for nested or multi-route tools. */\n match?: (pathname: string) => boolean;\n}\n\nexport interface DispatchExtensionConfig {\n /** Extra sidebar tabs supplied by the generated workspace. */\n navItems?: readonly DispatchNavItem[];\n /** Extra React Query keys to invalidate when Dispatch receives DB sync events. */\n queryKeys?: readonly string[];\n}\n\nconst PRIMARY_NAV_ITEMS = [\n {\n id: \"chat\",\n to: \"/chat\",\n label: \"Chat\",\n icon: IconMessageQuestion,\n section: \"primary\",\n },\n {\n id: \"overview\",\n to: \"/overview\",\n label: \"Overview\",\n icon: IconBroadcast,\n section: \"primary\",\n },\n {\n id: \"apps\",\n to: \"/apps\",\n label: \"Apps\",\n icon: IconApps,\n section: \"primary\",\n },\n {\n id: \"metrics\",\n to: \"/metrics\",\n label: \"Metrics\",\n icon: IconChartBar,\n section: \"primary\",\n },\n {\n id: \"vault\",\n to: \"/vault\",\n label: \"Vault\",\n icon: IconKey,\n section: \"primary\",\n },\n {\n id: \"integrations\",\n to: \"/integrations\",\n label: \"Integrations\",\n icon: IconPuzzle,\n section: \"primary\",\n },\n {\n id: \"agents\",\n to: \"/agents\",\n label: \"Agents\",\n icon: IconPlugConnected,\n section: \"primary\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst OPERATIONS_NAV_ITEMS = [\n {\n id: \"workspace\",\n to: \"/workspace\",\n label: \"Resources\",\n icon: IconLayersSubtract,\n section: \"operations\",\n },\n {\n id: \"messaging\",\n to: \"/messaging\",\n label: \"Messaging\",\n icon: IconBrandTelegram,\n section: \"operations\",\n },\n {\n id: \"destinations\",\n to: \"/destinations\",\n label: \"Destinations\",\n icon: IconArrowUpRight,\n section: \"operations\",\n },\n {\n id: \"identities\",\n to: \"/identities\",\n label: \"Identities\",\n icon: IconFingerprint,\n section: \"operations\",\n },\n {\n id: \"approvals\",\n to: \"/approvals\",\n label: \"Approvals\",\n icon: IconShieldCheck,\n section: \"operations\",\n },\n {\n id: \"audit\",\n to: \"/audit\",\n label: \"Audit\",\n icon: IconHistory,\n section: \"operations\",\n },\n {\n id: \"dreams\",\n to: \"/dreams\",\n label: \"Dreams\",\n icon: IconBrain,\n section: \"operations\",\n },\n {\n id: \"thread-debug\",\n to: \"/thread-debug\",\n label: \"Thread Debug\",\n icon: IconMessages,\n section: \"operations\",\n },\n {\n id: \"settings\",\n to: \"/settings\",\n label: \"Settings\",\n icon: IconSettings,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst EMPTY_NAV_ITEMS: readonly DispatchNavItem[] = [];\n\nconst CHROMELESS_PATHS = [\"/approval\"];\nconst SIDEBAR_COLLAPSE_KEY = \"dispatch.sidebar.collapsed\";\n\n// Routes whose page renders its own toolbar (with NotificationsBell + AgentToggleButton).\n// Layout still mounts the sidebar + AgentSidebar, but skips its own Header so\n// there's no double-header.\nfunction pageOwnsToolbar(pathname: string): boolean {\n if (pathname === \"/tools\" || pathname.startsWith(\"/tools/\")) return true;\n if (pathname === \"/extensions\" || pathname.startsWith(\"/extensions/\"))\n return true;\n return false;\n}\n\ninterface WorkspaceInfo {\n name: string | null;\n displayName: string | null;\n appCount: number;\n}\n\nfunction sectionFor(item: DispatchNavItem): DispatchNavSection {\n return item.section ?? \"operations\";\n}\n\nfunction navItemMatchesPath(item: DispatchNavItem, pathname: string): boolean {\n if (item.match) {\n try {\n if (item.match(pathname)) return true;\n } catch {\n return false;\n }\n }\n return pathname === item.to || pathname.startsWith(`${item.to}/`);\n}\n\nfunction navItemsForSection(\n items: readonly DispatchNavItem[],\n section: DispatchNavSection,\n): DispatchNavItem[] {\n return items.filter((item) => sectionFor(item) === section);\n}\n\nfunction localDispatchPath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction dispatchNavLinkTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n // Mirror the basename calculation entry.client.tsx uses to configure the\n // router (basePath iff the current URL is under that mount, \"\" otherwise).\n // Reading the live URL directly avoids races with the previous check on\n // `__reactRouterContext.basename`, which could read undefined before the\n // entry script set it — that race produced /dispatch/dispatch/<route>\n // history entries that 404'd on back-button navigation.\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\nfunction chatThreadPath(threadId: string): string {\n return `/chat/${encodeURIComponent(threadId)}`;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = pathname.match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nfunction formatThreadAge(\n updatedAt: number,\n formatDate: ReturnType<typeof useFormatters>[\"formatDate\"],\n) {\n const diffMs = Math.max(0, Date.now() - updatedAt);\n const minutes = Math.floor(diffMs / 60_000);\n if (minutes < 1) return \"now\";\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d`;\n return formatDate(updatedAt, {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction threadTitle(thread: ChatThreadSummary, fallback: string) {\n return thread.title || thread.preview || fallback;\n}\n\nfunction threadUpdatedAt(thread: ChatThreadSummary) {\n return Number.isFinite(thread.updatedAt)\n ? thread.updatedAt\n : Number.isFinite(thread.createdAt)\n ? thread.createdAt\n : 0;\n}\n\nfunction DispatchChatsSection({ onNavigate }: { onNavigate?: () => void }) {\n const t = useT();\n const { formatDate } = useFormatters();\n const navigate = useNavigate();\n const location = useLocation();\n const {\n threads,\n activeThreadId,\n createThread,\n switchThread,\n renameThread,\n refreshThreads,\n } = useChatThreads(undefined, \"dispatch\", undefined, { autoCreate: false });\n const [renamingThreadId, setRenamingThreadId] = useState<string | null>(null);\n const [renameDraft, setRenameDraft] = useState(\"\");\n const renameInputRef = useRef<HTMLInputElement | null>(null);\n const committingRenameRef = useRef(false);\n\n const visibleThreads = useMemo(\n () =>\n threads\n .filter(\n (thread) => thread.messageCount > 0 || thread.id === activeThreadId,\n )\n .sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))\n .slice(0, 8),\n [activeThreadId, threads],\n );\n\n useEffect(() => {\n const refresh = () => refreshThreads();\n const handleRunning = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | { isRunning?: unknown }\n | undefined;\n if (detail?.isRunning === false) refreshThreads();\n };\n\n window.addEventListener(\"agent-chat:threads-updated\", refresh);\n window.addEventListener(\"agentNative.chatRunning\", handleRunning);\n window.addEventListener(\"focus\", refresh);\n return () => {\n window.removeEventListener(\"agent-chat:threads-updated\", refresh);\n window.removeEventListener(\"agentNative.chatRunning\", handleRunning);\n window.removeEventListener(\"focus\", refresh);\n };\n }, [refreshThreads]);\n\n useEffect(() => {\n if (!renamingThreadId) return;\n requestAnimationFrame(() => {\n renameInputRef.current?.focus();\n renameInputRef.current?.select();\n });\n }, [renamingThreadId]);\n\n function openThread(threadId: string, options?: { isNew?: boolean }) {\n switchThread(threadId);\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\n options?.isNew ? \"/chat\" : chatThreadPath(threadId),\n ),\n );\n onNavigate?.();\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId, newThread: options?.isNew === true },\n }),\n );\n });\n }\n\n async function handleNewChat() {\n const threadId = await createThread();\n if (threadId) openThread(threadId, { isNew: true });\n }\n\n function startRenameThread(thread: ChatThreadSummary) {\n committingRenameRef.current = false;\n setRenameDraft(threadTitle(thread, t(\"dispatch.sidebar.newChat\")));\n setRenamingThreadId(thread.id);\n }\n\n function cancelRenameThread() {\n committingRenameRef.current = true;\n setRenamingThreadId(null);\n setRenameDraft(\"\");\n }\n\n async function commitRenameThread() {\n if (committingRenameRef.current) return;\n const threadId = renamingThreadId;\n const title = renameDraft.trim();\n if (!threadId) return;\n committingRenameRef.current = true;\n setRenamingThreadId(null);\n setRenameDraft(\"\");\n if (title) await renameThread(threadId, title);\n committingRenameRef.current = false;\n }\n\n function handleRenameSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n void commitRenameThread();\n }\n\n return (\n <div className=\"mt-2 border-s border-sidebar-border/70 ps-3\">\n <div className=\"mb-1 flex h-7 items-center gap-2 pe-1\">\n <div className=\"min-w-0 flex-1 text-xs font-medium text-sidebar-foreground/70\">\n {t(\"dispatch.sidebar.chats\")}\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handleNewChat}\n className=\"flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n aria-label={t(\"dispatch.sidebar.newDispatchChat\")}\n >\n <IconPlus className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t(\"dispatch.sidebar.newChat\")}</TooltipContent>\n </Tooltip>\n </div>\n <div className=\"grid gap-0.5\">\n {visibleThreads.length > 0 ? (\n visibleThreads.map((thread) => {\n const localPathname = localDispatchPath(location.pathname);\n const isActive =\n thread.id ===\n (threadIdFromPath(localPathname) ??\n (localPathname === \"/chat\" ? null : activeThreadId));\n const isRenaming = thread.id === renamingThreadId;\n return (\n <div\n key={thread.id}\n className={cn(\n \"group flex h-8 min-w-0 items-center rounded-md text-sm transition-colors\",\n isActive\n ? \"bg-sidebar-accent text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/80 hover:bg-sidebar-accent/65 hover:text-sidebar-accent-foreground\",\n )}\n >\n {isRenaming ? (\n <form\n onSubmit={handleRenameSubmit}\n className=\"flex h-full min-w-0 flex-1 items-center px-1.5\"\n >\n <Input\n ref={renameInputRef}\n value={renameDraft}\n onChange={(event) => setRenameDraft(event.target.value)}\n onBlur={() => void commitRenameThread()}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancelRenameThread();\n }\n }}\n maxLength={160}\n aria-label={t(\"dispatch.sidebar.renameThread\", {\n title: threadTitle(\n thread,\n t(\"dispatch.sidebar.newChat\"),\n ),\n })}\n className=\"h-6 min-w-0 rounded-sm border-sidebar-border bg-background px-1.5 text-xs\"\n />\n </form>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => openThread(thread.id)}\n className=\"flex h-full min-w-0 flex-1 cursor-pointer items-center px-2 text-start outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {threadTitle(thread, t(\"dispatch.sidebar.newChat\"))}\n </span>\n </button>\n <div className=\"relative flex size-7 shrink-0 items-center justify-end pe-1\">\n <span className=\"text-[11px] text-sidebar-foreground/50 transition-opacity group-hover:opacity-0 group-focus-within:opacity-0\">\n {isActive\n ? \"\"\n : formatThreadAge(\n threadUpdatedAt(thread),\n formatDate,\n )}\n </span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={t(\"dispatch.sidebar.chatOptions\", {\n title: threadTitle(\n thread,\n t(\"dispatch.sidebar.newChat\"),\n ),\n })}\n className=\"absolute end-1 flex size-6 cursor-pointer items-center justify-center rounded-md text-sidebar-foreground/65 opacity-0 transition-opacity hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100 group-focus-within:opacity-100 data-[state=open]:opacity-100\"\n >\n <IconDots className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n side=\"right\"\n sideOffset={6}\n >\n <DropdownMenuItem\n onSelect={() => startRenameThread(thread)}\n >\n <IconEdit className=\"size-4\" />\n {t(\"dispatch.sidebar.renameChat\")}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </>\n )}\n </div>\n );\n })\n ) : (\n <button\n type=\"button\"\n onClick={handleNewChat}\n className=\"flex h-8 cursor-pointer items-center rounded-md px-2 text-start text-sm text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent/65 hover:text-sidebar-accent-foreground\"\n >\n <span className=\"truncate\">{t(\"dispatch.sidebar.newChat\")}</span>\n </button>\n )}\n </div>\n </div>\n );\n}\n\nexport function NavContent({\n onNavigate,\n extensions,\n collapsed = false,\n collapsible = false,\n onCollapsedChange,\n}: {\n onNavigate?: () => void;\n extensions?: DispatchExtensionConfig;\n collapsed?: boolean;\n collapsible?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const { data: workspace } = useActionQuery(\n \"get-workspace-info\",\n {},\n { staleTime: 60_000 },\n );\n const ws = workspace as WorkspaceInfo | undefined;\n const workspaceLabel = ws?.displayName ?? ws?.name ?? null;\n const extensionNavItems = extensions?.navItems ?? EMPTY_NAV_ITEMS;\n const primaryNavItems = [\n ...PRIMARY_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"primary\"),\n ];\n const operationsNavItems = [\n ...OPERATIONS_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"operations\"),\n ];\n const localPathname = localDispatchPath(location.pathname);\n const operationsOpen = operationsNavItems.some((item) =>\n navItemMatchesPath(item, localPathname),\n );\n const navLabel = (item: DispatchNavItem) => {\n const key =\n item.id === \"thread-debug\"\n ? \"threadDebug\"\n : item.id === \"workspace\"\n ? \"resources\"\n : item.id;\n return t(`dispatch.nav.${key}`, { defaultValue: item.label });\n };\n\n const renderNavItem = (item: DispatchNavItem) => {\n const Icon = item.icon;\n const itemMatchesLocalPath = navItemMatchesPath(item, localPathname);\n const label = navLabel(item);\n return (\n <li key={item.id}>\n {collapsed ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n aria-label={label}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-10 w-10 items-center justify-center rounded-md text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n </NavLink>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{label}</TooltipContent>\n </Tooltip>\n ) : (\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-8 w-full items-center gap-2 rounded-md px-2 text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n <span className=\"truncate\">{label}</span>\n </NavLink>\n )}\n {!collapsed && item.id === \"chat\" && itemMatchesLocalPath ? (\n <DispatchChatsSection onNavigate={onNavigate} />\n ) : null}\n </li>\n );\n };\n\n return (\n <>\n <div className={cn(\"border-b py-3\", collapsed ? \"px-1\" : \"px-4\")}>\n <div\n className={cn(\n \"flex items-center\",\n collapsed ? \"justify-center\" : \"gap-3\",\n )}\n >\n {!collapsed && (\n <>\n <div className=\"flex h-9 w-9 items-center justify-center rounded-xl border bg-card text-foreground\">\n <img\n src={appPath(\"/agent-native-icon-light.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"block h-4 w-auto shrink-0 dark:hidden\"\n />\n <img\n src={appPath(\"/agent-native-icon-dark.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"hidden h-4 w-auto shrink-0 dark:block\"\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-semibold text-foreground\">\n {workspaceLabel ?? \"Dispatch\"}\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {workspaceLabel\n ? t(\"dispatch.sidebar.workspaceSubtitle\", {\n count: ws?.appCount ?? 0,\n })\n : t(\"dispatch.sidebar.workspaceControlPlane\")}\n </div>\n </div>\n </>\n )}\n {collapsible ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => onCollapsedChange?.(!collapsed)}\n aria-label={\n collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")\n }\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n {collapsed ? (\n <IconLayoutSidebarLeftExpand className=\"h-4 w-4 rtl:-scale-x-100\" />\n ) : (\n <IconLayoutSidebarLeftCollapse className=\"h-4 w-4 rtl:-scale-x-100\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n {collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <nav className={cn(\"py-3\", collapsed ? \"px-1\" : \"px-2\")}>\n <ul\n className={cn(\n \"space-y-0.5\",\n collapsed && \"flex flex-col items-center\",\n )}\n >\n {(collapsed\n ? [...primaryNavItems, ...operationsNavItems]\n : primaryNavItems\n ).map(renderNavItem)}\n </ul>\n </nav>\n\n {!collapsed ? (\n <div className=\"mt-auto shrink-0\">\n <div className=\"px-2 py-2\">\n <details className=\"group\" open={operationsOpen}>\n <summary className=\"flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium uppercase text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden\">\n <span>{t(\"dispatch.nav.operations\")}</span>\n <IconChevronDown\n size={14}\n className=\"transition-transform group-open:rotate-180\"\n />\n </summary>\n <ul className=\"mt-1 space-y-0.5\">\n {operationsNavItems.map(renderNavItem)}\n </ul>\n </details>\n </div>\n\n <div className=\"px-2 py-1\">\n <ExtensionsSidebarSection />\n </div>\n\n <div className=\"px-3 py-2\">\n <OrgSwitcher />\n </div>\n\n <div className=\"px-3 py-2\">\n <FeedbackButton />\n </div>\n </div>\n ) : null}\n </div>\n </>\n );\n}\n\nexport function Layout({\n children,\n extensions,\n}: {\n children: ReactNode;\n extensions?: DispatchExtensionConfig;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const [mobileOpen, setMobileOpen] = useState(false);\n const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {\n if (typeof window === \"undefined\") return false;\n try {\n return window.localStorage.getItem(SIDEBAR_COLLAPSE_KEY) === \"1\";\n } catch {\n return false;\n }\n });\n const localPathname = localDispatchPath(location.pathname);\n const isChatRoute =\n localPathname === \"/chat\" || localPathname.startsWith(\"/chat/\");\n const chatHomeHandoffActive = useAgentChatHomeHandoff({\n storageKey: \"dispatch\",\n activePath: localPathname,\n enabled: !isChatRoute,\n });\n const chatHandoffLinkOptions = {\n storageKey: \"dispatch\",\n isChatPath: (pathname: string) =>\n pathname === \"/chat\" || pathname.startsWith(\"/chat/\"),\n };\n useAgentChatHomeHandoffLinks(chatHandoffLinkOptions);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(\n SIDEBAR_COLLAPSE_KEY,\n sidebarCollapsed ? \"1\" : \"0\",\n );\n } catch {\n // Ignore storage failures; the in-memory preference still works.\n }\n }, [sidebarCollapsed]);\n\n if (CHROMELESS_PATHS.some((path) => localPathname === path)) {\n return <>{children}</>;\n }\n\n const showHeader = !isChatRoute && !pageOwnsToolbar(localPathname);\n function openAskAgentFullscreen() {\n focusAgentChat();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n }\n const sidebarSuggestions = [\n t(\"dispatch.sidebar.suggestionBuildApp\"),\n t(\"dispatch.sidebar.suggestionRouteSlack\"),\n t(\"dispatch.sidebar.suggestionGrantKey\"),\n ];\n const appContent = (\n <div className=\"flex h-full min-w-0 flex-1 flex-col overflow-hidden\">\n {showHeader ? <Header onOpenMobile={() => setMobileOpen(true)} /> : null}\n <InvitationBanner />\n <main\n className={cn(\n \"flex-1\",\n isChatRoute ? \"min-h-0 overflow-hidden\" : \"overflow-y-auto\",\n )}\n >\n {showHeader ? (\n <div className=\"mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6\">\n {children}\n </div>\n ) : (\n children\n )}\n </main>\n </div>\n );\n const content = isChatRoute ? (\n <div className=\"agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden\">\n {appContent}\n </div>\n ) : (\n <AgentSidebar\n position=\"right\"\n defaultOpen={false}\n chatViewTransition\n storageKey=\"dispatch\"\n openOnChatRunning={chatHomeHandoffActive}\n onFullscreenRequest={openAskAgentFullscreen}\n emptyStateText={t(\"dispatch.sidebar.emptyAgentText\")}\n suggestions={sidebarSuggestions}\n >\n {appContent}\n </AgentSidebar>\n );\n\n return (\n <HeaderActionsProvider>\n <div className=\"agent-layout-shell flex h-screen w-full overflow-hidden bg-background\">\n <aside\n data-collapsed={sidebarCollapsed ? \"true\" : \"false\"}\n className={cn(\n \"agent-layout-left-drawer hidden shrink-0 flex-col border-e bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex\",\n sidebarCollapsed ? \"w-12\" : \"w-64\",\n )}\n >\n <NavContent\n extensions={extensions}\n collapsed={sidebarCollapsed}\n collapsible\n onCollapsedChange={setSidebarCollapsed}\n />\n </aside>\n\n <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>\n <SheetContent\n side=\"left\"\n className=\"w-72 p-0 bg-sidebar text-sidebar-foreground [&>button]:hidden\"\n >\n <SheetTitle className=\"sr-only\">\n {t(\"dispatch.nav.navigation\")}\n </SheetTitle>\n <SheetDescription className=\"sr-only\">\n {t(\"dispatch.nav.navigationDescription\")}\n </SheetDescription>\n <div className=\"flex h-full w-full flex-col\">\n <NavContent\n extensions={extensions}\n collapsed={false}\n onNavigate={() => setMobileOpen(false)}\n />\n </div>\n </SheetContent>\n </Sheet>\n\n {content}\n </div>\n </HeaderActionsProvider>\n );\n}\n"]}
1
+ {"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AgentSidebar,\n FeedbackButton,\n appBasePath,\n appPath,\n focusAgentChat,\n navigateWithAgentChatViewTransition,\n useActionQuery,\n useAgentChatHomeHandoff,\n useAgentChatHomeHandoffLinks,\n useChatThreads,\n useFormatters,\n useT,\n type ChatThreadSummary,\n} from \"@agent-native/core/client\";\nimport { ExtensionsSidebarSection } from \"@agent-native/core/client/extensions\";\nimport { InvitationBanner, OrgSwitcher } from \"@agent-native/core/client/org\";\nimport {\n IconArrowUpRight,\n IconApps,\n IconBrain,\n IconChartBar,\n IconBrandTelegram,\n IconKey,\n IconChevronDown,\n IconDots,\n IconEdit,\n IconLayersSubtract,\n IconMessageQuestion,\n IconMessages,\n IconPlus,\n IconPlugConnected,\n IconBroadcast,\n IconFingerprint,\n IconHistory,\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarLeftExpand,\n IconPuzzle,\n IconSettings,\n IconShieldCheck,\n} from \"@tabler/icons-react\";\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport { NavLink, useLocation, useNavigate } from \"react-router\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetTitle,\n} from \"@/components/ui/sheet\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nimport { Header } from \"./Header\";\nimport { HeaderActionsProvider } from \"./HeaderActions\";\n\nexport type DispatchNavSection = \"primary\" | \"operations\";\n\nexport type DispatchNavIcon = ComponentType<{\n size?: number | string;\n className?: string;\n}>;\n\nexport interface DispatchNavItem {\n /** Stable id used for keys and navigation.view. Avoid built-in ids. */\n id: string;\n /** React Router path for the tab, usually backed by an app/routes/*.tsx file. */\n to: string;\n label: string;\n icon?: DispatchNavIcon;\n /** Defaults to \"operations\", which is where local management tools usually fit. */\n section?: DispatchNavSection;\n /** Override active matching for nested or multi-route tools. */\n match?: (pathname: string) => boolean;\n}\n\nexport interface DispatchExtensionConfig {\n /** Extra sidebar tabs supplied by the generated workspace. */\n navItems?: readonly DispatchNavItem[];\n /** Extra React Query keys to invalidate when Dispatch receives DB sync events. */\n queryKeys?: readonly string[];\n}\n\nconst PRIMARY_NAV_ITEMS = [\n {\n id: \"chat\",\n to: \"/chat\",\n label: \"Chat\",\n icon: IconMessageQuestion,\n section: \"primary\",\n },\n {\n id: \"overview\",\n to: \"/overview\",\n label: \"Overview\",\n icon: IconBroadcast,\n section: \"primary\",\n },\n {\n id: \"apps\",\n to: \"/apps\",\n label: \"Apps\",\n icon: IconApps,\n section: \"primary\",\n },\n {\n id: \"metrics\",\n to: \"/metrics\",\n label: \"Metrics\",\n icon: IconChartBar,\n section: \"primary\",\n },\n {\n id: \"vault\",\n to: \"/vault\",\n label: \"Vault\",\n icon: IconKey,\n section: \"primary\",\n },\n {\n id: \"integrations\",\n to: \"/integrations\",\n label: \"Integrations\",\n icon: IconPuzzle,\n section: \"primary\",\n },\n {\n id: \"agents\",\n to: \"/agents\",\n label: \"Agents\",\n icon: IconPlugConnected,\n section: \"primary\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst OPERATIONS_NAV_ITEMS = [\n {\n id: \"workspace\",\n to: \"/workspace\",\n label: \"Resources\",\n icon: IconLayersSubtract,\n section: \"operations\",\n },\n {\n id: \"messaging\",\n to: \"/messaging\",\n label: \"Messaging\",\n icon: IconBrandTelegram,\n section: \"operations\",\n },\n {\n id: \"destinations\",\n to: \"/destinations\",\n label: \"Destinations\",\n icon: IconArrowUpRight,\n section: \"operations\",\n },\n {\n id: \"identities\",\n to: \"/identities\",\n label: \"Identities\",\n icon: IconFingerprint,\n section: \"operations\",\n },\n {\n id: \"approvals\",\n to: \"/approvals\",\n label: \"Approvals\",\n icon: IconShieldCheck,\n section: \"operations\",\n },\n {\n id: \"audit\",\n to: \"/audit\",\n label: \"Audit\",\n icon: IconHistory,\n section: \"operations\",\n },\n {\n id: \"dreams\",\n to: \"/dreams\",\n label: \"Dreams\",\n icon: IconBrain,\n section: \"operations\",\n },\n {\n id: \"thread-debug\",\n to: \"/thread-debug\",\n label: \"Thread Debug\",\n icon: IconMessages,\n section: \"operations\",\n },\n {\n id: \"settings\",\n to: \"/settings\",\n label: \"Settings\",\n icon: IconSettings,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst EMPTY_NAV_ITEMS: readonly DispatchNavItem[] = [];\n\nconst CHROMELESS_PATHS = [\"/approval\"];\nconst SIDEBAR_COLLAPSE_KEY = \"dispatch.sidebar.collapsed\";\n\n// Routes whose page renders its own toolbar.\n// Layout still mounts the sidebar + AgentSidebar, but skips its own Header so\n// there's no double-header.\nfunction pageOwnsToolbar(pathname: string): boolean {\n if (pathname === \"/tools\" || pathname.startsWith(\"/tools/\")) return true;\n if (pathname === \"/extensions\" || pathname.startsWith(\"/extensions/\"))\n return true;\n return false;\n}\n\ninterface WorkspaceInfo {\n name: string | null;\n displayName: string | null;\n appCount: number;\n}\n\nfunction sectionFor(item: DispatchNavItem): DispatchNavSection {\n return item.section ?? \"operations\";\n}\n\nfunction navItemMatchesPath(item: DispatchNavItem, pathname: string): boolean {\n if (item.match) {\n try {\n if (item.match(pathname)) return true;\n } catch {\n return false;\n }\n }\n return pathname === item.to || pathname.startsWith(`${item.to}/`);\n}\n\nfunction navItemsForSection(\n items: readonly DispatchNavItem[],\n section: DispatchNavSection,\n): DispatchNavItem[] {\n return items.filter((item) => sectionFor(item) === section);\n}\n\nfunction localDispatchPath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction dispatchNavLinkTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n // Mirror the basename calculation entry.client.tsx uses to configure the\n // router (basePath iff the current URL is under that mount, \"\" otherwise).\n // Reading the live URL directly avoids races with the previous check on\n // `__reactRouterContext.basename`, which could read undefined before the\n // entry script set it — that race produced /dispatch/dispatch/<route>\n // history entries that 404'd on back-button navigation.\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\nfunction chatThreadPath(threadId: string): string {\n return `/chat/${encodeURIComponent(threadId)}`;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = pathname.match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nfunction formatThreadAge(\n updatedAt: number,\n formatDate: ReturnType<typeof useFormatters>[\"formatDate\"],\n) {\n const diffMs = Math.max(0, Date.now() - updatedAt);\n const minutes = Math.floor(diffMs / 60_000);\n if (minutes < 1) return \"now\";\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d`;\n return formatDate(updatedAt, {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction threadTitle(thread: ChatThreadSummary, fallback: string) {\n return thread.title || thread.preview || fallback;\n}\n\nfunction threadUpdatedAt(thread: ChatThreadSummary) {\n return Number.isFinite(thread.updatedAt)\n ? thread.updatedAt\n : Number.isFinite(thread.createdAt)\n ? thread.createdAt\n : 0;\n}\n\nfunction DispatchChatsSection({ onNavigate }: { onNavigate?: () => void }) {\n const t = useT();\n const { formatDate } = useFormatters();\n const navigate = useNavigate();\n const location = useLocation();\n const {\n threads,\n activeThreadId,\n createThread,\n switchThread,\n renameThread,\n refreshThreads,\n } = useChatThreads(undefined, \"dispatch\", undefined, { autoCreate: false });\n const [renamingThreadId, setRenamingThreadId] = useState<string | null>(null);\n const [renameDraft, setRenameDraft] = useState(\"\");\n const renameInputRef = useRef<HTMLInputElement | null>(null);\n const committingRenameRef = useRef(false);\n\n const visibleThreads = useMemo(\n () =>\n threads\n .filter(\n (thread) => thread.messageCount > 0 || thread.id === activeThreadId,\n )\n .sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))\n .slice(0, 8),\n [activeThreadId, threads],\n );\n\n useEffect(() => {\n const refresh = () => refreshThreads();\n const handleRunning = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | { isRunning?: unknown }\n | undefined;\n if (detail?.isRunning === false) refreshThreads();\n };\n\n window.addEventListener(\"agent-chat:threads-updated\", refresh);\n window.addEventListener(\"agentNative.chatRunning\", handleRunning);\n window.addEventListener(\"focus\", refresh);\n return () => {\n window.removeEventListener(\"agent-chat:threads-updated\", refresh);\n window.removeEventListener(\"agentNative.chatRunning\", handleRunning);\n window.removeEventListener(\"focus\", refresh);\n };\n }, [refreshThreads]);\n\n useEffect(() => {\n if (!renamingThreadId) return;\n requestAnimationFrame(() => {\n renameInputRef.current?.focus();\n renameInputRef.current?.select();\n });\n }, [renamingThreadId]);\n\n function openThread(threadId: string, options?: { isNew?: boolean }) {\n switchThread(threadId);\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\n options?.isNew ? \"/chat\" : chatThreadPath(threadId),\n ),\n );\n onNavigate?.();\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId, newThread: options?.isNew === true },\n }),\n );\n });\n }\n\n async function handleNewChat() {\n const threadId = await createThread();\n if (threadId) openThread(threadId, { isNew: true });\n }\n\n function startRenameThread(thread: ChatThreadSummary) {\n committingRenameRef.current = false;\n setRenameDraft(threadTitle(thread, t(\"dispatch.sidebar.newChat\")));\n setRenamingThreadId(thread.id);\n }\n\n function cancelRenameThread() {\n committingRenameRef.current = true;\n setRenamingThreadId(null);\n setRenameDraft(\"\");\n }\n\n async function commitRenameThread() {\n if (committingRenameRef.current) return;\n const threadId = renamingThreadId;\n const title = renameDraft.trim();\n if (!threadId) return;\n committingRenameRef.current = true;\n setRenamingThreadId(null);\n setRenameDraft(\"\");\n if (title) await renameThread(threadId, title);\n committingRenameRef.current = false;\n }\n\n function handleRenameSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n void commitRenameThread();\n }\n\n return (\n <div className=\"mt-2 border-s border-sidebar-border/70 ps-3\">\n <div className=\"mb-1 flex h-7 items-center gap-2 pe-1\">\n <div className=\"min-w-0 flex-1 text-xs font-medium text-sidebar-foreground/70\">\n {t(\"dispatch.sidebar.chats\")}\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handleNewChat}\n className=\"flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n aria-label={t(\"dispatch.sidebar.newDispatchChat\")}\n >\n <IconPlus className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t(\"dispatch.sidebar.newChat\")}</TooltipContent>\n </Tooltip>\n </div>\n <div className=\"grid gap-0.5\">\n {visibleThreads.length > 0 ? (\n visibleThreads.map((thread) => {\n const localPathname = localDispatchPath(location.pathname);\n const isActive =\n thread.id ===\n (threadIdFromPath(localPathname) ??\n (localPathname === \"/chat\" ? null : activeThreadId));\n const isRenaming = thread.id === renamingThreadId;\n return (\n <div\n key={thread.id}\n className={cn(\n \"group flex h-8 min-w-0 items-center rounded-md text-sm transition-colors\",\n isActive\n ? \"bg-sidebar-accent text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/80 hover:bg-sidebar-accent/65 hover:text-sidebar-accent-foreground\",\n )}\n >\n {isRenaming ? (\n <form\n onSubmit={handleRenameSubmit}\n className=\"flex h-full min-w-0 flex-1 items-center px-1.5\"\n >\n <Input\n ref={renameInputRef}\n value={renameDraft}\n onChange={(event) => setRenameDraft(event.target.value)}\n onBlur={() => void commitRenameThread()}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancelRenameThread();\n }\n }}\n maxLength={160}\n aria-label={t(\"dispatch.sidebar.renameThread\", {\n title: threadTitle(\n thread,\n t(\"dispatch.sidebar.newChat\"),\n ),\n })}\n className=\"h-6 min-w-0 rounded-sm border-sidebar-border bg-background px-1.5 text-xs\"\n />\n </form>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => openThread(thread.id)}\n className=\"flex h-full min-w-0 flex-1 cursor-pointer items-center px-2 text-start outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {threadTitle(thread, t(\"dispatch.sidebar.newChat\"))}\n </span>\n </button>\n <div className=\"relative flex size-7 shrink-0 items-center justify-end pe-1\">\n <span className=\"text-[11px] text-sidebar-foreground/50 transition-opacity group-hover:opacity-0 group-focus-within:opacity-0\">\n {isActive\n ? \"\"\n : formatThreadAge(\n threadUpdatedAt(thread),\n formatDate,\n )}\n </span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={t(\"dispatch.sidebar.chatOptions\", {\n title: threadTitle(\n thread,\n t(\"dispatch.sidebar.newChat\"),\n ),\n })}\n className=\"absolute end-1 flex size-6 cursor-pointer items-center justify-center rounded-md text-sidebar-foreground/65 opacity-0 transition-opacity hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100 group-focus-within:opacity-100 data-[state=open]:opacity-100\"\n >\n <IconDots className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n side=\"right\"\n sideOffset={6}\n >\n <DropdownMenuItem\n onSelect={() => startRenameThread(thread)}\n >\n <IconEdit className=\"size-4\" />\n {t(\"dispatch.sidebar.renameChat\")}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </>\n )}\n </div>\n );\n })\n ) : (\n <button\n type=\"button\"\n onClick={handleNewChat}\n className=\"flex h-8 cursor-pointer items-center rounded-md px-2 text-start text-sm text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent/65 hover:text-sidebar-accent-foreground\"\n >\n <span className=\"truncate\">{t(\"dispatch.sidebar.newChat\")}</span>\n </button>\n )}\n </div>\n </div>\n );\n}\n\nexport function NavContent({\n onNavigate,\n extensions,\n collapsed = false,\n collapsible = false,\n onCollapsedChange,\n}: {\n onNavigate?: () => void;\n extensions?: DispatchExtensionConfig;\n collapsed?: boolean;\n collapsible?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const { data: workspace } = useActionQuery(\n \"get-workspace-info\",\n {},\n { staleTime: 60_000 },\n );\n const ws = workspace as WorkspaceInfo | undefined;\n const workspaceLabel = ws?.displayName ?? ws?.name ?? null;\n const extensionNavItems = extensions?.navItems ?? EMPTY_NAV_ITEMS;\n const primaryNavItems = [\n ...PRIMARY_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"primary\"),\n ];\n const operationsNavItems = [\n ...OPERATIONS_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"operations\"),\n ];\n const localPathname = localDispatchPath(location.pathname);\n const operationsOpen = operationsNavItems.some((item) =>\n navItemMatchesPath(item, localPathname),\n );\n const navLabel = (item: DispatchNavItem) => {\n const key =\n item.id === \"thread-debug\"\n ? \"threadDebug\"\n : item.id === \"workspace\"\n ? \"resources\"\n : item.id;\n return t(`dispatch.nav.${key}`, { defaultValue: item.label });\n };\n\n const renderNavItem = (item: DispatchNavItem) => {\n const Icon = item.icon;\n const itemMatchesLocalPath = navItemMatchesPath(item, localPathname);\n const label = navLabel(item);\n return (\n <li key={item.id}>\n {collapsed ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n aria-label={label}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-10 w-10 items-center justify-center rounded-md text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n </NavLink>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{label}</TooltipContent>\n </Tooltip>\n ) : (\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-8 w-full items-center gap-2 rounded-md px-2 text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n <span className=\"truncate\">{label}</span>\n </NavLink>\n )}\n {!collapsed && item.id === \"chat\" && itemMatchesLocalPath ? (\n <DispatchChatsSection onNavigate={onNavigate} />\n ) : null}\n </li>\n );\n };\n\n return (\n <>\n <div className={cn(\"border-b py-3\", collapsed ? \"px-1\" : \"px-4\")}>\n <div\n className={cn(\n \"flex items-center\",\n collapsed ? \"justify-center\" : \"gap-3\",\n )}\n >\n {!collapsed && (\n <>\n <div className=\"flex h-9 w-9 items-center justify-center rounded-xl border bg-card text-foreground\">\n <img\n src={appPath(\"/agent-native-icon-light.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"block h-4 w-auto shrink-0 dark:hidden\"\n />\n <img\n src={appPath(\"/agent-native-icon-dark.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"hidden h-4 w-auto shrink-0 dark:block\"\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-semibold text-foreground\">\n {workspaceLabel ?? \"Dispatch\"}\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {workspaceLabel\n ? t(\"dispatch.sidebar.workspaceSubtitle\", {\n count: ws?.appCount ?? 0,\n })\n : t(\"dispatch.sidebar.workspaceControlPlane\")}\n </div>\n </div>\n </>\n )}\n {collapsible ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => onCollapsedChange?.(!collapsed)}\n aria-label={\n collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")\n }\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n {collapsed ? (\n <IconLayoutSidebarLeftExpand className=\"h-4 w-4 rtl:-scale-x-100\" />\n ) : (\n <IconLayoutSidebarLeftCollapse className=\"h-4 w-4 rtl:-scale-x-100\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n {collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <nav className={cn(\"py-3\", collapsed ? \"px-1\" : \"px-2\")}>\n <ul\n className={cn(\n \"space-y-0.5\",\n collapsed && \"flex flex-col items-center\",\n )}\n >\n {(collapsed\n ? [...primaryNavItems, ...operationsNavItems]\n : primaryNavItems\n ).map(renderNavItem)}\n </ul>\n </nav>\n\n {!collapsed ? (\n <div className=\"mt-auto shrink-0\">\n <div className=\"px-2 py-2\">\n <details className=\"group\" open={operationsOpen}>\n <summary className=\"flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium uppercase text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden\">\n <span>{t(\"dispatch.nav.operations\")}</span>\n <IconChevronDown\n size={14}\n className=\"transition-transform group-open:rotate-180\"\n />\n </summary>\n <ul className=\"mt-1 space-y-0.5\">\n {operationsNavItems.map(renderNavItem)}\n </ul>\n </details>\n </div>\n\n <div className=\"px-2 py-1\">\n <ExtensionsSidebarSection />\n </div>\n\n <div className=\"px-3 py-2\">\n <OrgSwitcher />\n </div>\n\n <div className=\"px-3 py-2\">\n <FeedbackButton />\n </div>\n </div>\n ) : null}\n </div>\n </>\n );\n}\n\nexport function Layout({\n children,\n extensions,\n}: {\n children: ReactNode;\n extensions?: DispatchExtensionConfig;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const [mobileOpen, setMobileOpen] = useState(false);\n const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {\n if (typeof window === \"undefined\") return false;\n try {\n return window.localStorage.getItem(SIDEBAR_COLLAPSE_KEY) === \"1\";\n } catch {\n return false;\n }\n });\n const localPathname = localDispatchPath(location.pathname);\n const isChatRoute =\n localPathname === \"/chat\" || localPathname.startsWith(\"/chat/\");\n const chatHomeHandoffActive = useAgentChatHomeHandoff({\n storageKey: \"dispatch\",\n activePath: localPathname,\n enabled: !isChatRoute,\n });\n const chatHandoffLinkOptions = {\n storageKey: \"dispatch\",\n isChatPath: (pathname: string) =>\n pathname === \"/chat\" || pathname.startsWith(\"/chat/\"),\n };\n useAgentChatHomeHandoffLinks(chatHandoffLinkOptions);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(\n SIDEBAR_COLLAPSE_KEY,\n sidebarCollapsed ? \"1\" : \"0\",\n );\n } catch {\n // Ignore storage failures; the in-memory preference still works.\n }\n }, [sidebarCollapsed]);\n\n if (CHROMELESS_PATHS.some((path) => localPathname === path)) {\n return <>{children}</>;\n }\n\n const showHeader = !isChatRoute && !pageOwnsToolbar(localPathname);\n function openAskAgentFullscreen() {\n focusAgentChat();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n }\n const sidebarSuggestions = [\n t(\"dispatch.sidebar.suggestionBuildApp\"),\n t(\"dispatch.sidebar.suggestionRouteSlack\"),\n t(\"dispatch.sidebar.suggestionGrantKey\"),\n ];\n const appContent = (\n <div className=\"flex h-full min-w-0 flex-1 flex-col overflow-hidden\">\n {showHeader ? <Header onOpenMobile={() => setMobileOpen(true)} /> : null}\n <InvitationBanner />\n <main\n className={cn(\n \"flex-1\",\n isChatRoute ? \"min-h-0 overflow-hidden\" : \"overflow-y-auto\",\n )}\n >\n {showHeader ? (\n <div className=\"mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6\">\n {children}\n </div>\n ) : (\n children\n )}\n </main>\n </div>\n );\n const content = isChatRoute ? (\n <div className=\"agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden\">\n {appContent}\n </div>\n ) : (\n <AgentSidebar\n position=\"right\"\n defaultOpen={false}\n chatViewTransition\n storageKey=\"dispatch\"\n openOnChatRunning={chatHomeHandoffActive}\n onFullscreenRequest={openAskAgentFullscreen}\n emptyStateText={t(\"dispatch.sidebar.emptyAgentText\")}\n suggestions={sidebarSuggestions}\n >\n {appContent}\n </AgentSidebar>\n );\n\n return (\n <HeaderActionsProvider>\n <div className=\"agent-layout-shell flex h-screen w-full overflow-hidden bg-background\">\n <aside\n data-collapsed={sidebarCollapsed ? \"true\" : \"false\"}\n className={cn(\n \"agent-layout-left-drawer hidden shrink-0 flex-col border-e bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex\",\n sidebarCollapsed ? \"w-12\" : \"w-64\",\n )}\n >\n <NavContent\n extensions={extensions}\n collapsed={sidebarCollapsed}\n collapsible\n onCollapsedChange={setSidebarCollapsed}\n />\n </aside>\n\n <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>\n <SheetContent\n side=\"left\"\n className=\"w-72 p-0 bg-sidebar text-sidebar-foreground [&>button]:hidden\"\n >\n <SheetTitle className=\"sr-only\">\n {t(\"dispatch.nav.navigation\")}\n </SheetTitle>\n <SheetDescription className=\"sr-only\">\n {t(\"dispatch.nav.navigationDescription\")}\n </SheetDescription>\n <div className=\"flex h-full w-full flex-col\">\n <NavContent\n extensions={extensions}\n collapsed={false}\n onNavigate={() => setMobileOpen(false)}\n />\n </div>\n </SheetContent>\n </Sheet>\n\n {content}\n </div>\n </HeaderActionsProvider>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/settings.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,IAAI;;IAEnB;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,oDA6EpC"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/settings.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,IAAI;;IAEnB;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,oDA+DpC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { ChangelogSettingsCard, LanguagePicker, SettingsTabsPage, openAgentSettings, useT, } from "@agent-native/core/client";
2
+ import { ChangelogSettingsCard, LanguagePicker, SettingsTabsPage, useAgentSettingsTabs, useT, } from "@agent-native/core/client";
3
3
  import { TeamPage } from "@agent-native/core/client/org";
4
4
  import { Link } from "react-router";
5
5
  import { DispatchShell } from "../../components/dispatch-shell.js";
@@ -12,6 +12,7 @@ export function meta() {
12
12
  }
13
13
  export default function SettingsRoute() {
14
14
  const t = useT();
15
- return (_jsx(DispatchShell, { title: t("settings.title"), description: t("settings.description"), children: _jsx(SettingsTabsPage, { general: _jsxs("div", { className: "mx-auto w-full max-w-3xl space-y-6", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: t("settings.languageTitle") }), _jsx(CardDescription, { children: t("settings.languageDescription") })] }), _jsxs(CardContent, { className: "max-w-xs space-y-1.5", children: [_jsx(Label, { children: t("settings.languageLabel") }), _jsx(LanguagePicker, { label: t("settings.languageLabel") })] })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: t("settings.workspaceTitle") }), _jsx(CardDescription, { children: t("settings.workspaceDescription") })] }), _jsx(CardContent, { children: _jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/workspace", children: t("settings.openResourceSettings") }) }) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: t("settings.agentTitle") }), _jsx(CardDescription, { children: t("settings.agentDescription") })] }), _jsx(CardContent, { children: _jsx(Button, { variant: "outline", onClick: () => openAgentSettings(), children: t("settings.openAgentSettings") }) })] })] }), team: _jsx("div", { className: "mx-auto w-full max-w-3xl", children: _jsx(TeamPage, { showTitle: false, createOrgDescription: "Set up a team to share dispatch destinations and approvals with your colleagues." }) }), whatsNew: _jsx("div", { className: "mx-auto w-full max-w-3xl", children: _jsx(ChangelogSettingsCard, { markdown: changelog }) }) }) }));
15
+ const agentSettingsTabs = useAgentSettingsTabs();
16
+ return (_jsx(DispatchShell, { title: t("settings.title"), description: t("settings.description"), children: _jsx(SettingsTabsPage, { extraTabs: agentSettingsTabs, general: _jsxs("div", { className: "mx-auto w-full max-w-3xl space-y-6", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: t("settings.languageTitle") }), _jsx(CardDescription, { children: t("settings.languageDescription") })] }), _jsxs(CardContent, { className: "max-w-xs space-y-1.5", children: [_jsx(Label, { children: t("settings.languageLabel") }), _jsx(LanguagePicker, { label: t("settings.languageLabel") })] })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: t("settings.workspaceTitle") }), _jsx(CardDescription, { children: t("settings.workspaceDescription") })] }), _jsx(CardContent, { children: _jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/workspace", children: t("settings.openResourceSettings") }) }) })] })] }), team: _jsx("div", { className: "mx-auto w-full max-w-3xl", children: _jsx(TeamPage, { showTitle: false, createOrgDescription: "Set up a team to share dispatch destinations and approvals with your colleagues." }) }), whatsNew: _jsx("div", { className: "mx-auto w-full max-w-3xl", children: _jsx(ChangelogSettingsCard, { markdown: changelog }) }) }) }));
16
17
  }
17
18
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/routes/pages/settings.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,IAAI,GACL,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,IAAI,EACJ,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,OAAO,SAAS,MAAM,2BAA2B,CAAC;AAElD,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,aAAa;IACnC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IAEjB,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAC1B,WAAW,EAAE,CAAC,CAAC,sBAAsB,CAAC,YAEtC,KAAC,gBAAgB,IACf,OAAO,EACL,eAAK,SAAS,EAAC,oCAAoC,aACjD,MAAC,IAAI,eACH,MAAC,UAAU,eACT,KAAC,SAAS,IAAC,SAAS,EAAC,WAAW,YAC7B,CAAC,CAAC,wBAAwB,CAAC,GAClB,EACZ,KAAC,eAAe,cACb,CAAC,CAAC,8BAA8B,CAAC,GAClB,IACP,EACb,MAAC,WAAW,IAAC,SAAS,EAAC,sBAAsB,aAC3C,KAAC,KAAK,cAAE,CAAC,CAAC,wBAAwB,CAAC,GAAS,EAC5C,KAAC,cAAc,IAAC,KAAK,EAAE,CAAC,CAAC,wBAAwB,CAAC,GAAI,IAC1C,IACT,EAEP,MAAC,IAAI,eACH,MAAC,UAAU,eACT,KAAC,SAAS,IAAC,SAAS,EAAC,WAAW,YAC7B,CAAC,CAAC,yBAAyB,CAAC,GACnB,EACZ,KAAC,eAAe,cACb,CAAC,CAAC,+BAA+B,CAAC,GACnB,IACP,EACb,KAAC,WAAW,cACV,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,kBAC/B,KAAC,IAAI,IAAC,EAAE,EAAC,YAAY,YAClB,CAAC,CAAC,+BAA+B,CAAC,GAC9B,GACA,GACG,IACT,EAEP,MAAC,IAAI,eACH,MAAC,UAAU,eACT,KAAC,SAAS,IAAC,SAAS,EAAC,WAAW,YAC7B,CAAC,CAAC,qBAAqB,CAAC,GACf,EACZ,KAAC,eAAe,cACb,CAAC,CAAC,2BAA2B,CAAC,GACf,IACP,EACb,KAAC,WAAW,cACV,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,EAAE,YACzD,CAAC,CAAC,4BAA4B,CAAC,GACzB,GACG,IACT,IACH,EAER,IAAI,EACF,cAAK,SAAS,EAAC,0BAA0B,YACvC,KAAC,QAAQ,IACP,SAAS,EAAE,KAAK,EAChB,oBAAoB,EAAC,kFAAkF,GACvG,GACE,EAER,QAAQ,EACN,cAAK,SAAS,EAAC,0BAA0B,YACvC,KAAC,qBAAqB,IAAC,QAAQ,EAAE,SAAS,GAAI,GAC1C,GAER,GACY,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import {\n ChangelogSettingsCard,\n LanguagePicker,\n SettingsTabsPage,\n openAgentSettings,\n useT,\n} from \"@agent-native/core/client\";\nimport { TeamPage } from \"@agent-native/core/client/org\";\nimport { Link } from \"react-router\";\n\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { Label } from \"@/components/ui/label\";\n\nimport changelog from \"../../../CHANGELOG.md?raw\";\n\nexport function meta() {\n return [{ title: \"Settings - Dispatch\" }];\n}\n\nexport default function SettingsRoute() {\n const t = useT();\n\n return (\n <DispatchShell\n title={t(\"settings.title\")}\n description={t(\"settings.description\")}\n >\n <SettingsTabsPage\n general={\n <div className=\"mx-auto w-full max-w-3xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {t(\"settings.languageTitle\")}\n </CardTitle>\n <CardDescription>\n {t(\"settings.languageDescription\")}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"max-w-xs space-y-1.5\">\n <Label>{t(\"settings.languageLabel\")}</Label>\n <LanguagePicker label={t(\"settings.languageLabel\")} />\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {t(\"settings.workspaceTitle\")}\n </CardTitle>\n <CardDescription>\n {t(\"settings.workspaceDescription\")}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <Button variant=\"outline\" asChild>\n <Link to=\"/workspace\">\n {t(\"settings.openResourceSettings\")}\n </Link>\n </Button>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {t(\"settings.agentTitle\")}\n </CardTitle>\n <CardDescription>\n {t(\"settings.agentDescription\")}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <Button variant=\"outline\" onClick={() => openAgentSettings()}>\n {t(\"settings.openAgentSettings\")}\n </Button>\n </CardContent>\n </Card>\n </div>\n }\n team={\n <div className=\"mx-auto w-full max-w-3xl\">\n <TeamPage\n showTitle={false}\n createOrgDescription=\"Set up a team to share dispatch destinations and approvals with your colleagues.\"\n />\n </div>\n }\n whatsNew={\n <div className=\"mx-auto w-full max-w-3xl\">\n <ChangelogSettingsCard markdown={changelog} />\n </div>\n }\n />\n </DispatchShell>\n );\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/routes/pages/settings.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,IAAI,GACL,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,IAAI,EACJ,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,OAAO,SAAS,MAAM,2BAA2B,CAAC;AAElD,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,aAAa;IACnC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IAEjD,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAC1B,WAAW,EAAE,CAAC,CAAC,sBAAsB,CAAC,YAEtC,KAAC,gBAAgB,IACf,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EACL,eAAK,SAAS,EAAC,oCAAoC,aACjD,MAAC,IAAI,eACH,MAAC,UAAU,eACT,KAAC,SAAS,IAAC,SAAS,EAAC,WAAW,YAC7B,CAAC,CAAC,wBAAwB,CAAC,GAClB,EACZ,KAAC,eAAe,cACb,CAAC,CAAC,8BAA8B,CAAC,GAClB,IACP,EACb,MAAC,WAAW,IAAC,SAAS,EAAC,sBAAsB,aAC3C,KAAC,KAAK,cAAE,CAAC,CAAC,wBAAwB,CAAC,GAAS,EAC5C,KAAC,cAAc,IAAC,KAAK,EAAE,CAAC,CAAC,wBAAwB,CAAC,GAAI,IAC1C,IACT,EAEP,MAAC,IAAI,eACH,MAAC,UAAU,eACT,KAAC,SAAS,IAAC,SAAS,EAAC,WAAW,YAC7B,CAAC,CAAC,yBAAyB,CAAC,GACnB,EACZ,KAAC,eAAe,cACb,CAAC,CAAC,+BAA+B,CAAC,GACnB,IACP,EACb,KAAC,WAAW,cACV,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,kBAC/B,KAAC,IAAI,IAAC,EAAE,EAAC,YAAY,YAClB,CAAC,CAAC,+BAA+B,CAAC,GAC9B,GACA,GACG,IACT,IACH,EAER,IAAI,EACF,cAAK,SAAS,EAAC,0BAA0B,YACvC,KAAC,QAAQ,IACP,SAAS,EAAE,KAAK,EAChB,oBAAoB,EAAC,kFAAkF,GACvG,GACE,EAER,QAAQ,EACN,cAAK,SAAS,EAAC,0BAA0B,YACvC,KAAC,qBAAqB,IAAC,QAAQ,EAAE,SAAS,GAAI,GAC1C,GAER,GACY,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import {\n ChangelogSettingsCard,\n LanguagePicker,\n SettingsTabsPage,\n useAgentSettingsTabs,\n useT,\n} from \"@agent-native/core/client\";\nimport { TeamPage } from \"@agent-native/core/client/org\";\nimport { Link } from \"react-router\";\n\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { Label } from \"@/components/ui/label\";\n\nimport changelog from \"../../../CHANGELOG.md?raw\";\n\nexport function meta() {\n return [{ title: \"Settings - Dispatch\" }];\n}\n\nexport default function SettingsRoute() {\n const t = useT();\n const agentSettingsTabs = useAgentSettingsTabs();\n\n return (\n <DispatchShell\n title={t(\"settings.title\")}\n description={t(\"settings.description\")}\n >\n <SettingsTabsPage\n extraTabs={agentSettingsTabs}\n general={\n <div className=\"mx-auto w-full max-w-3xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {t(\"settings.languageTitle\")}\n </CardTitle>\n <CardDescription>\n {t(\"settings.languageDescription\")}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"max-w-xs space-y-1.5\">\n <Label>{t(\"settings.languageLabel\")}</Label>\n <LanguagePicker label={t(\"settings.languageLabel\")} />\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {t(\"settings.workspaceTitle\")}\n </CardTitle>\n <CardDescription>\n {t(\"settings.workspaceDescription\")}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <Button variant=\"outline\" asChild>\n <Link to=\"/workspace\">\n {t(\"settings.openResourceSettings\")}\n </Link>\n </Button>\n </CardContent>\n </Card>\n </div>\n }\n team={\n <div className=\"mx-auto w-full max-w-3xl\">\n <TeamPage\n showTitle={false}\n createOrgDescription=\"Set up a team to share dispatch destinations and approvals with your colleagues.\"\n />\n </div>\n }\n whatsNew={\n <div className=\"mx-auto w-full max-w-3xl\">\n <ChangelogSettingsCard markdown={changelog} />\n </div>\n }\n />\n </DispatchShell>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/dispatch",
3
- "version": "0.13.7",
3
+ "version": "0.13.9",
4
4
  "description": "Dispatch — workspace control plane for agent-native apps. Vault, integrations, destinations, scheduled jobs, and cross-app delegation, shipped as a single drop-in package.",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -94,7 +94,7 @@
94
94
  "typescript": "^6.0.3",
95
95
  "vite": "8.1.0",
96
96
  "vitest": "^4.1.5",
97
- "@agent-native/core": "0.87.0"
97
+ "@agent-native/core": "0.90.9"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "@agent-native/core": ">=0.8.0",