@mdxui/do 2.1.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +253 -266
  2. package/dist/{agents-xcIn2dUB.d.ts → agents-2_r9e9i7.d.ts} +213 -2
  3. package/dist/app/index.d.ts +347 -0
  4. package/dist/app/index.js +13 -0
  5. package/dist/app/index.js.map +1 -0
  6. package/dist/chunk-4KXVN3EQ.js +56 -0
  7. package/dist/chunk-4KXVN3EQ.js.map +1 -0
  8. package/dist/chunk-5AWTQDRF.js +76 -0
  9. package/dist/chunk-5AWTQDRF.js.map +1 -0
  10. package/dist/chunk-EQVOEEQO.js +95 -0
  11. package/dist/chunk-EQVOEEQO.js.map +1 -0
  12. package/dist/chunk-FO3N7SXV.js +469 -0
  13. package/dist/chunk-FO3N7SXV.js.map +1 -0
  14. package/dist/chunk-IESVTECE.js +536 -0
  15. package/dist/chunk-IESVTECE.js.map +1 -0
  16. package/dist/chunk-JWKIONEO.js +234 -0
  17. package/dist/chunk-JWKIONEO.js.map +1 -0
  18. package/dist/chunk-NTSEARBC.js +715 -0
  19. package/dist/chunk-NTSEARBC.js.map +1 -0
  20. package/dist/chunk-OWEAW4U6.js +116 -0
  21. package/dist/chunk-OWEAW4U6.js.map +1 -0
  22. package/dist/chunk-VRLUXCLD.js +31 -0
  23. package/dist/chunk-VRLUXCLD.js.map +1 -0
  24. package/dist/chunk-Y52IEYVM.js +131 -0
  25. package/dist/chunk-Y52IEYVM.js.map +1 -0
  26. package/dist/chunk-YGIBMNRH.js +1991 -0
  27. package/dist/chunk-YGIBMNRH.js.map +1 -0
  28. package/dist/components/index.d.ts +1 -738
  29. package/dist/components/index.js +2 -6
  30. package/dist/config-CmZBQQaT.d.ts +122 -0
  31. package/dist/{do-CaQVueZw.d.ts → do-C-t9UgjT.d.ts} +31 -33
  32. package/dist/errors-B4Oyyj4Z.d.ts +346 -0
  33. package/dist/hooks/index.d.ts +428 -696
  34. package/dist/hooks/index.js +6 -4
  35. package/dist/hooks/things/index.d.ts +298 -0
  36. package/dist/hooks/things/index.js +8 -0
  37. package/dist/hooks/things/index.js.map +1 -0
  38. package/dist/index.d.ts +21 -1010
  39. package/dist/index.js +11 -839
  40. package/dist/index.js.map +1 -1
  41. package/dist/lib/index.d.ts +100 -0
  42. package/dist/lib/index.js +6 -0
  43. package/dist/lib/index.js.map +1 -0
  44. package/dist/providers/index.d.ts +244 -32
  45. package/dist/providers/index.js +3 -2
  46. package/dist/query-keys-BC901wog.d.ts +153 -0
  47. package/dist/schemas/index.d.ts +1 -1
  48. package/dist/schemas/index.js +2 -2
  49. package/dist/schemas/index.js.map +1 -1
  50. package/dist/{thing-DtI25yZh.d.ts → thing-BVhCTzOi.d.ts} +4 -4
  51. package/dist/types/index.d.ts +251 -216
  52. package/dist/types/index.js +1 -2
  53. package/dist/views/index.d.ts +131 -0
  54. package/dist/views/index.js +11 -0
  55. package/dist/views/index.js.map +1 -0
  56. package/package.json +39 -17
  57. package/dist/__test-utils__/index.d.ts +0 -399
  58. package/dist/__test-utils__/index.js +0 -34641
  59. package/dist/__test-utils__/index.js.map +0 -1
  60. package/dist/chunk-EEDMN7UF.js +0 -1351
  61. package/dist/chunk-EEDMN7UF.js.map +0 -1
  62. package/dist/chunk-G3PMV62Z.js +0 -33
  63. package/dist/chunk-G3PMV62Z.js.map +0 -1
  64. package/dist/chunk-NXPXL5NA.js +0 -3789
  65. package/dist/chunk-NXPXL5NA.js.map +0 -1
  66. package/dist/chunk-PC5FJY6M.js +0 -20
  67. package/dist/chunk-PC5FJY6M.js.map +0 -1
  68. package/dist/chunk-XF6LKY2M.js +0 -445
  69. package/dist/chunk-XF6LKY2M.js.map +0 -1
  70. package/dist/magic-string.es-J7BYFTTJ.js +0 -1307
  71. package/dist/magic-string.es-J7BYFTTJ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/context.tsx","../src/app/identity-provider.tsx","../src/app/app-providers.tsx","../src/app/user-menu.tsx","../src/app/do-shell-nav.tsx","../src/app/auth-gate.tsx","../src/app/do-shell.tsx","../src/app/pages/overview-page.tsx","../src/app/pages/things-page.tsx","../src/app/pages/databases-page.tsx","../src/app/pages/document-page.tsx","../src/app/pages/functions-page.tsx","../src/app/pages/placeholder-page.tsx","../src/app/do-app.tsx","../src/app/route-params.ts","../src/app/routes.ts"],"names":["useState","jsx","useAuth","UserIcon","Settings","jsxs","SidebarMenuButton","NavLink","Database","Shapes","Activity","Network","Code","Users","CreditCard","Building","useParams","useNavigate","Card","CardHeader","CardTitle","CardDescription","CardContent"],"mappings":"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","file":"chunk-NTSEARBC.js","sourcesContent":["'use client'\n\nimport { createContext, type ReactNode, useContext, useMemo, useState } from 'react'\nimport type { DOShellConfig, DOShellContextValue } from '../types/config'\n\nconst DOShellContext = createContext<DOShellContextValue | null>(null)\n\ninterface DOShellProviderProps {\n config: DOShellConfig\n children: ReactNode\n}\n\n/**\n * Default values for DOShell configuration\n */\nconst defaultIdentity = {\n clientId: '',\n devMode: false,\n required: true,\n onUnauthenticated: 'landing' as const,\n}\n\nconst defaultConfig = {\n basePath: '/',\n defaultNamespace: 'default',\n branding: { name: 'DO Admin' },\n theme: { mode: 'system' as const },\n routes: {},\n customRoutes: [],\n}\n\n/**\n * DOShellProvider - Context provider for DOShell configuration\n *\n * Provides shell configuration to all child components.\n * Should be used inside the DOAppProviders composition.\n */\nexport function DOShellProvider({ config, children }: DOShellProviderProps) {\n const [namespace, setNamespace] = useState(config.defaultNamespace ?? 'default')\n\n const value = useMemo<DOShellContextValue>(() => {\n const mergedConfig: DOShellConfig = {\n ...defaultConfig,\n ...config,\n branding: { ...defaultConfig.branding, ...config.branding },\n theme: { ...defaultConfig.theme, ...config.theme },\n identity: { ...defaultIdentity, ...config.identity },\n }\n\n return {\n config: mergedConfig,\n namespace,\n setNamespace,\n }\n }, [config, namespace])\n\n return <DOShellContext.Provider value={value}>{children}</DOShellContext.Provider>\n}\n\n/**\n * Hook to access DOShell configuration\n */\nexport function useDOShell(): DOShellContextValue {\n const context = useContext(DOShellContext)\n if (!context) {\n throw new Error('useDOShell must be used within a DOShellProvider')\n }\n return context\n}\n\n/**\n * Hook to access enabled routes configuration\n */\nexport function useDOShellRoutes() {\n const { config } = useDOShell()\n return config.routes ?? {}\n}\n\n/**\n * Hook to access custom routes\n */\nexport function useDOShellCustomRoutes() {\n const { config } = useDOShell()\n return config.customRoutes ?? []\n}\n","'use client'\n\nimport { AuthKitProvider, useAuth } from '@workos-inc/authkit-react'\nimport { WorkOsWidgets } from '@workos-inc/widgets'\nimport { type ReactNode, useEffect, useState } from 'react'\nimport { useDOShell } from './context'\n\n/**\n * Hook to access identity/auth state.\n * Re-exports useAuth from WorkOS AuthKit for convenience.\n */\nexport const useIdentity = useAuth\n\nexport interface DOIdentityProviderProps {\n children: ReactNode\n}\n\n/**\n * Inner provider that sets up identity widgets with theme detection\n */\nfunction IdentityWidgetsWrapper({ children }: { children: ReactNode }) {\n const [mounted, setMounted] = useState(false)\n const [isDark, setIsDark] = useState(false)\n\n // Detect theme from document class or system preference\n useEffect(() => {\n setMounted(true)\n\n const checkDarkMode = () => {\n const isDarkClass = document.documentElement.classList.contains('dark')\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\n setIsDark(isDarkClass || (!document.documentElement.classList.contains('light') && prefersDark))\n }\n\n checkDarkMode()\n\n // Watch for class changes on html element\n const observer = new MutationObserver(checkDarkMode)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n\n // Watch for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n mediaQuery.addEventListener('change', checkDarkMode)\n\n return () => {\n observer.disconnect()\n mediaQuery.removeEventListener('change', checkDarkMode)\n }\n }, [])\n\n // Use \"inherit\" until mounted to avoid hydration mismatch\n const appearance = mounted ? (isDark ? 'dark' : 'light') : 'inherit'\n\n return (\n <WorkOsWidgets\n theme={{\n appearance,\n radius: 'medium',\n scaling: '100%',\n }}\n elements={{\n primaryButton: {\n variant: 'solid',\n },\n secondaryButton: {\n variant: 'outline',\n },\n }}\n >\n {children}\n </WorkOsWidgets>\n )\n}\n\n/**\n * Identity provider that wraps the shell with WorkOS AuthKit authentication.\n *\n * Provides authentication context to all child components.\n */\nexport function DOIdentityProvider({ children }: DOIdentityProviderProps) {\n const { config } = useDOShell()\n const { identity } = config\n\n // Build redirect URI - defaults to current origin + basePath\n const redirectUri =\n identity.redirectUri ??\n (typeof window !== 'undefined'\n ? `${window.location.origin}${config.basePath ?? '/'}`\n : undefined)\n\n // Handle redirect callback - clear URL params after successful auth\n const onRedirectCallback = () => {\n // Remove auth params from URL to prevent issues on refresh\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n }\n\n return (\n <AuthKitProvider\n clientId={identity.clientId}\n apiHostname={identity.apiHostname}\n devMode={identity.devMode}\n redirectUri={redirectUri}\n onRedirectCallback={onRedirectCallback}\n >\n <IdentityWidgetsWrapper>{children}</IdentityWidgetsWrapper>\n </AuthKitProvider>\n )\n}\n","'use client'\n\nimport { ThemeProvider } from 'next-themes'\nimport type { ReactNode } from 'react'\nimport { DOProvider } from '../providers/do-provider'\nimport type { DOShellConfig } from '../types/config'\nimport { DOShellProvider } from './context'\nimport { DOIdentityProvider } from './identity-provider'\n\nexport interface AppProvidersProps {\n config: DOShellConfig\n children: ReactNode\n}\n\n/**\n * AppProviders - Composed provider hierarchy for DOShell\n *\n * Provider hierarchy:\n * - ThemeProvider (next-themes) - Theme mode (light/dark/system)\n * - DOShellProvider - Shell config context\n * - DOIdentityProvider - WorkOS AuthKit authentication\n * - DOProvider - RPC client, namespace, TanStack Query\n *\n * @example\n * ```tsx\n * <AppProviders\n * config={{\n * do: { apiEndpoint: '...', authMethod: 'jwt', bindings: [], realTimeUpdates: true },\n * identity: { clientId: 'client_xxx', devMode: true },\n * }}\n * >\n * <DOShell />\n * </AppProviders>\n * ```\n */\nexport function AppProviders({ config, children }: AppProvidersProps) {\n const themeMode = config.theme?.mode ?? 'system'\n\n return (\n <ThemeProvider\n attribute=\"class\"\n defaultTheme={themeMode}\n enableSystem={themeMode === 'system'}\n disableTransitionOnChange\n >\n <DOShellProvider config={config}>\n <DOIdentityProvider>\n <DOProvider\n config={config.do}\n initialNamespace={config.defaultNamespace}\n >\n {children}\n </DOProvider>\n </DOIdentityProvider>\n </DOShellProvider>\n </ThemeProvider>\n )\n}\n\n// Keep old name for backward compatibility\nexport const DOAppProviders = AppProviders\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n SidebarMenuButton,\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from '@mdxui/primitives'\nimport { ChevronsUpDown, LogOut, Settings, User as UserIcon } from 'lucide-react'\n\ninterface UserMenuProps {\n /** Whether to show in compact mode (icon only) */\n compact?: boolean\n}\n\n/**\n * Get initials from a name (first letter of first and last name)\n */\nfunction getInitials(name: string | undefined): string {\n if (!name) return '?'\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0].charAt(0).toUpperCase()\n return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase()\n}\n\n/**\n * UserMenu - User dropdown with profile info and sign out\n *\n * Displays the current user's avatar and name, with options for\n * settings and signing out.\n */\nexport function UserMenu({ compact = false }: UserMenuProps) {\n const { user, signOut, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center gap-2 p-2\">\n <div className=\"h-8 w-8 animate-pulse rounded-full bg-muted\" />\n {!compact && <div className=\"h-4 w-24 animate-pulse rounded bg-muted\" />}\n </div>\n )\n }\n\n if (!user) {\n return null\n }\n\n const displayName = user.firstName\n ? `${user.firstName}${user.lastName ? ` ${user.lastName}` : ''}`\n : user.email\n\n const initials = getInitials(user.firstName ? `${user.firstName} ${user.lastName ?? ''}` : user.email)\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\"\n >\n <Avatar className=\"h-8 w-8 rounded-lg\">\n <AvatarImage src={user.profilePictureUrl ?? undefined} alt={displayName} />\n <AvatarFallback className=\"rounded-lg\">{initials}</AvatarFallback>\n </Avatar>\n {!compact && (\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">{displayName}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{user.email}</span>\n </div>\n )}\n <ChevronsUpDown className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-[var(--radius)]\"\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"p-0 font-normal\">\n <div className=\"flex items-center gap-2 px-1 py-1.5 text-left text-sm\">\n <Avatar className=\"h-8 w-8 rounded-lg\">\n <AvatarImage src={user.profilePictureUrl ?? undefined} alt={displayName} />\n <AvatarFallback className=\"rounded-lg\">{initials}</AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">{displayName}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{user.email}</span>\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem>\n <UserIcon className=\"mr-2 size-4\" />\n Account\n </DropdownMenuItem>\n <DropdownMenuItem>\n <Settings className=\"mr-2 size-4\" />\n Settings\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => signOut()}>\n <LogOut className=\"mr-2 size-4\" />\n Sign Out\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { NavLink, useLocation } from 'react-router-dom'\nimport {\n Home,\n Bot,\n Code,\n GitBranch,\n Database,\n Shapes,\n Network,\n Activity,\n Users,\n CreditCard,\n Plug,\n Building,\n UserCog,\n Key,\n Settings,\n // Additional icons for missing routes\n BookOpen,\n Zap,\n Play,\n Shield,\n} from 'lucide-react'\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from '@mdxui/primitives'\nimport { useDOShell, useDOShellRoutes } from './context'\nimport { UserMenu } from './user-menu'\n\n/**\n * Navigation item definition\n */\ninterface NavItem {\n title: string\n url: string\n icon: React.ComponentType<{ className?: string }>\n routeKey?: string // Key in routes config for enable/disable\n}\n\n/**\n * Navigation structure for the DO Shell.\n * Organized into logical groups.\n */\nconst navGroups: Record<string, NavItem[]> = {\n main: [{ title: 'Overview', url: '/', icon: Home, routeKey: 'overview' }],\n development: [\n { title: 'Agents', url: '/agents', icon: Bot, routeKey: 'agents' },\n { title: 'Functions', url: '/functions', icon: Code, routeKey: 'functions' },\n { title: 'Workflows', url: '/workflows', icon: GitBranch, routeKey: 'workflows' },\n { title: 'Databases', url: '/databases', icon: Database, routeKey: 'databases' },\n ],\n dataModel: [\n { title: 'Things', url: '/things', icon: Shapes, routeKey: 'things' },\n { title: 'Nouns', url: '/nouns', icon: BookOpen, routeKey: 'nouns' },\n { title: 'Verbs', url: '/verbs', icon: Zap, routeKey: 'verbs' },\n { title: 'Actions', url: '/actions', icon: Play, routeKey: 'actions' },\n { title: 'Relationships', url: '/relationships', icon: Network, routeKey: 'relationships' },\n { title: 'Events', url: '/events', icon: Activity, routeKey: 'events' },\n ],\n saas: [\n { title: 'Customers', url: '/customers', icon: Users, routeKey: 'customers' },\n { title: 'Subscriptions', url: '/subscriptions', icon: CreditCard, routeKey: 'subscriptions' },\n { title: 'Integrations', url: '/integrations', icon: Plug, routeKey: 'integrations' },\n ],\n admin: [\n { title: 'Organizations', url: '/orgs', icon: Building, routeKey: 'orgs' },\n { title: 'Roles', url: '/roles', icon: Shield, routeKey: 'roles' },\n { title: 'Users', url: '/users', icon: UserCog, routeKey: 'users' },\n { title: 'API Keys', url: '/api-keys', icon: Key, routeKey: 'apiKeys' },\n { title: 'Settings', url: '/settings', icon: Settings, routeKey: 'settings' },\n ],\n}\n\nexport interface DOShellNavProps extends React.ComponentProps<typeof Sidebar> {\n /** Optional header content to display at the top of the sidebar */\n headerContent?: React.ReactNode\n}\n\n/**\n * DOShellNav - Sidebar navigation component for the DO Shell.\n *\n * Features:\n * - Highlights active route based on current location\n * - Uses lucide-react icons for each navigation item\n * - Collapsible on mobile via the Sidebar component\n * - Supports custom header content\n * - Routes can be enabled/disabled via config\n */\nexport function DOShellNav({ headerContent, ...props }: DOShellNavProps) {\n const location = useLocation()\n const { config } = useDOShell()\n const routesConfig = useDOShellRoutes()\n\n const branding = config.branding\n\n /**\n * Determines if a navigation item is active based on the current route.\n * For the overview page, requires exact match. For other pages, uses prefix matching.\n */\n const isActive = (url: string): boolean => {\n if (url === '/') {\n return location.pathname === '/' || location.pathname === ''\n }\n return location.pathname.startsWith(url)\n }\n\n /**\n * Check if a route is enabled\n */\n const isRouteEnabled = (routeKey: string | undefined): boolean => {\n if (!routeKey) return true\n // If explicitly set to false, hide it\n if (routesConfig[routeKey] === false) return false\n return true\n }\n\n /**\n * Filter nav items by enabled routes\n */\n const filterNavItems = (items: NavItem[]): NavItem[] => {\n return items.filter((item) => isRouteEnabled(item.routeKey))\n }\n\n return (\n <Sidebar variant=\"inset\" {...props}>\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" asChild>\n <NavLink to=\"/\">\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-(--radius)\">\n {branding?.logo ?? <Database className=\"size-4\" />}\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{branding?.name ?? 'DO Admin'}</span>\n <span className=\"truncate text-xs\">Dashboard</span>\n </div>\n </NavLink>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n {headerContent}\n </SidebarHeader>\n\n <SidebarContent>\n {/* Main navigation - no label */}\n <SidebarGroup>\n <SidebarMenu>\n {filterNavItems(navGroups.main).map((item) => (\n <SidebarMenuItem key={item.title}>\n <SidebarMenuButton asChild isActive={isActive(item.url)} tooltip={item.title}>\n <NavLink to={item.url}>\n <item.icon className=\"size-4\" />\n <span>{item.title}</span>\n </NavLink>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n\n {/* Development group */}\n {filterNavItems(navGroups.development).length > 0 && (\n <SidebarGroup>\n <SidebarGroupLabel>Development</SidebarGroupLabel>\n <SidebarMenu>\n {filterNavItems(navGroups.development).map((item) => (\n <SidebarMenuItem key={item.title}>\n <SidebarMenuButton asChild isActive={isActive(item.url)} tooltip={item.title}>\n <NavLink to={item.url}>\n <item.icon className=\"size-4\" />\n <span>{item.title}</span>\n </NavLink>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n )}\n\n {/* Data Model group */}\n {filterNavItems(navGroups.dataModel).length > 0 && (\n <SidebarGroup>\n <SidebarGroupLabel>Data Model</SidebarGroupLabel>\n <SidebarMenu>\n {filterNavItems(navGroups.dataModel).map((item) => (\n <SidebarMenuItem key={item.title}>\n <SidebarMenuButton asChild isActive={isActive(item.url)} tooltip={item.title}>\n <NavLink to={item.url}>\n <item.icon className=\"size-4\" />\n <span>{item.title}</span>\n </NavLink>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n )}\n\n {/* SaaS group */}\n {filterNavItems(navGroups.saas).length > 0 && (\n <SidebarGroup>\n <SidebarGroupLabel>SaaS</SidebarGroupLabel>\n <SidebarMenu>\n {filterNavItems(navGroups.saas).map((item) => (\n <SidebarMenuItem key={item.title}>\n <SidebarMenuButton asChild isActive={isActive(item.url)} tooltip={item.title}>\n <NavLink to={item.url}>\n <item.icon className=\"size-4\" />\n <span>{item.title}</span>\n </NavLink>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n )}\n\n {/* Admin group */}\n {filterNavItems(navGroups.admin).length > 0 && (\n <SidebarGroup>\n <SidebarGroupLabel>Admin</SidebarGroupLabel>\n <SidebarMenu>\n {filterNavItems(navGroups.admin).map((item) => (\n <SidebarMenuItem key={item.title}>\n <SidebarMenuButton asChild isActive={isActive(item.url)} tooltip={item.title}>\n <NavLink to={item.url}>\n <item.icon className=\"size-4\" />\n <span>{item.title}</span>\n </NavLink>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n )}\n </SidebarContent>\n\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem>\n <UserMenu />\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n </Sidebar>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { ReactNode } from 'react'\nimport { useDOShell } from './context'\n\nexport interface AuthGateProps {\n children: ReactNode\n}\n\n/**\n * Default landing page component shown when user is not authenticated\n */\nfunction DefaultLandingPage() {\n const { signIn } = useAuth()\n\n return (\n <div className=\"min-h-screen bg-background flex flex-col items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <h1 className=\"text-3xl font-bold tracking-tight mb-4\">DO Admin</h1>\n <p className=\"text-muted-foreground mb-8\">\n Sign in to access the admin dashboard and manage your Durable Objects.\n </p>\n <button\n type=\"button\"\n onClick={() => signIn()}\n className=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-6\"\n >\n Sign In\n </button>\n </div>\n </div>\n )\n}\n\n/**\n * AuthGate handles authentication state and shows appropriate UI:\n * - Loading state while checking auth\n * - Landing page or redirect when not authenticated\n * - Children (dashboard) when authenticated\n */\nexport function AuthGate({ children }: AuthGateProps) {\n const { config } = useDOShell()\n const { user, isLoading } = useAuth()\n\n const { identity } = config\n const required = identity.required ?? true\n const onUnauthenticated = identity.onUnauthenticated ?? 'landing'\n\n // If auth is not required, always show children\n if (!required) {\n return <>{children}</>\n }\n\n // Show loading state while checking authentication\n if (isLoading) {\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-sm text-muted-foreground\">Loading...</p>\n </div>\n </div>\n )\n }\n\n // User is authenticated, show dashboard\n if (user) {\n return <>{children}</>\n }\n\n // User is not authenticated - handle based on config\n switch (onUnauthenticated) {\n case 'redirect':\n // Redirect to external URL\n if (identity.unauthenticatedRedirectUrl && typeof window !== 'undefined') {\n window.location.href = identity.unauthenticatedRedirectUrl\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <p className=\"text-sm text-muted-foreground\">Redirecting...</p>\n </div>\n )\n }\n // Fall through to landing if no redirect URL\n return identity.landingComponent ? <>{identity.landingComponent}</> : <DefaultLandingPage />\n\n case 'allow':\n // Allow access even without auth (rare use case)\n return <>{children}</>\n\n case 'landing':\n default:\n // Show landing page (custom or default)\n return identity.landingComponent ? <>{identity.landingComponent}</> : <DefaultLandingPage />\n }\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Outlet } from 'react-router-dom'\nimport {\n SidebarProvider,\n SidebarInset,\n SidebarTrigger,\n Separator,\n Toaster,\n} from '@mdxui/primitives'\nimport { DOShellNav } from './do-shell-nav'\nimport { AuthGate } from './auth-gate'\n\nexport interface DOShellProps {\n /** Optional children to render instead of using Outlet */\n children?: React.ReactNode\n /** Optional header content for the sidebar */\n sidebarHeaderContent?: React.ReactNode\n /** Optional content to render in the header after breadcrumbs */\n headerContent?: React.ReactNode\n /** Breadcrumb items to display (future enhancement) */\n breadcrumbs?: Array<{ label: string; href?: string }>\n}\n\n/**\n * DOShell - Main layout wrapper for the DO Admin Dashboard.\n *\n * This layout provides:\n * - Authentication gate (shows landing page if not authenticated)\n * - A collapsible sidebar with navigation on the left\n * - A main content area with a header containing breadcrumbs\n * - Toast notifications via Sonner\n * - Responsive design that works on mobile and desktop\n *\n * The layout uses react-router-dom's Outlet for nested routes.\n *\n * @example\n * ```tsx\n * // As a route layout using Outlet\n * <DOShell />\n *\n * // With custom children\n * <DOShell>\n * <CustomContent />\n * </DOShell>\n *\n * // With header content\n * <DOShell headerContent={<SearchBar />} />\n * ```\n */\nexport function DOShell({\n children,\n sidebarHeaderContent,\n headerContent,\n breadcrumbs,\n}: DOShellProps) {\n return (\n <AuthGate>\n <SidebarProvider className=\"h-svh!\">\n <DOShellNav headerContent={sidebarHeaderContent} />\n <SidebarInset className=\"overflow-hidden\">\n <header className=\"flex h-16 shrink-0 items-center gap-2 border-b bg-background transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12\">\n <div className=\"flex items-center gap-2 px-4\">\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\n {/* Breadcrumbs placeholder - can be enhanced later */}\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"flex items-center gap-1 text-sm\">\n {breadcrumbs.map((crumb, index) => (\n <React.Fragment key={crumb.label}>\n {index > 0 && <span className=\"text-muted-foreground\">/</span>}\n {crumb.href ? (\n <a\n href={crumb.href}\n className=\"text-muted-foreground hover:text-foreground transition-colors\"\n >\n {crumb.label}\n </a>\n ) : (\n <span className=\"text-foreground\">{crumb.label}</span>\n )}\n </React.Fragment>\n ))}\n </nav>\n )}\n </div>\n {headerContent && (\n <div className=\"ml-auto flex items-center gap-2 px-4\">{headerContent}</div>\n )}\n </header>\n <main className=\"flex-1 overflow-auto p-4\">{children ?? <Outlet />}</main>\n </SidebarInset>\n <Toaster closeButton position=\"top-right\" />\n </SidebarProvider>\n </AuthGate>\n )\n}\n","'use client'\n\n/**\n * OverviewPage\n *\n * Dashboard home page with stats and quick actions.\n */\n\nimport * as React from 'react'\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@mdxui/primitives'\nimport { Database, Code, Users, Activity, Shapes, Network, CreditCard, Building } from 'lucide-react'\nimport { NavLink } from 'react-router-dom'\nimport { useDO } from '../../providers/do-provider'\nimport { useNamespaces, useTypes, useThings } from '../../hooks'\n\ninterface StatCardProps {\n title: string\n value: string | number\n description?: string\n icon: React.ComponentType<{ className?: string }>\n href?: string\n}\n\nfunction StatCard({ title, value, description, icon: Icon, href }: StatCardProps) {\n const content = (\n <Card className=\"hover:bg-muted/50 transition-colors\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">{title}</CardTitle>\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{value}</div>\n {description && (\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n )}\n </CardContent>\n </Card>\n )\n\n if (href) {\n return (\n <NavLink to={href} className=\"block\">\n {content}\n </NavLink>\n )\n }\n\n return content\n}\n\ninterface QuickActionProps {\n title: string\n description: string\n icon: React.ComponentType<{ className?: string }>\n href: string\n}\n\nfunction QuickAction({ title, description, icon: Icon, href }: QuickActionProps) {\n return (\n <NavLink\n to={href}\n className=\"flex items-center gap-4 rounded-(--radius) border p-4 hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-(--radius) bg-primary/10\">\n <Icon className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <h3 className=\"font-medium\">{title}</h3>\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n </NavLink>\n )\n}\n\n/**\n * OverviewPage - Main dashboard landing page\n *\n * Shows stats, quick actions, and recent activity.\n */\nexport function OverviewPage() {\n const { namespace, isConnected } = useDO()\n\n // Fetch stats data\n const { data: namespaces } = useNamespaces()\n const { data: types } = useTypes({ ns: namespace })\n const { data: thingsResult } = useThings({ ns: namespace, limit: 1 })\n\n const namespaceCount = namespaces?.length ?? 0\n const typeCount = types?.length ?? 0\n const thingCount = thingsResult?.total ?? 0\n\n return (\n <div className=\"space-y-8\">\n {/* Header */}\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">Dashboard</h1>\n <p className=\"text-muted-foreground\">\n Welcome to DO Admin. Manage your Durable Objects and data.\n </p>\n </div>\n\n {/* Connection Status */}\n {!isConnected && (\n <Card className=\"border-destructive\">\n <CardHeader>\n <CardTitle className=\"text-destructive\">Connection Error</CardTitle>\n <CardDescription>\n Unable to connect to the backend. Please check your configuration.\n </CardDescription>\n </CardHeader>\n </Card>\n )}\n\n {/* Stats Grid */}\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Namespaces\"\n value={namespaceCount}\n description=\"Active namespaces\"\n icon={Database}\n href=\"/databases\"\n />\n <StatCard\n title=\"Types\"\n value={typeCount}\n description=\"Defined types\"\n icon={Shapes}\n href=\"/things\"\n />\n <StatCard\n title=\"Things\"\n value={thingCount}\n description=\"Total records\"\n icon={Activity}\n href=\"/things\"\n />\n <StatCard\n title=\"Namespace\"\n value={namespace}\n description=\"Currently selected\"\n icon={Network}\n />\n </div>\n\n {/* Quick Actions */}\n <div>\n <h2 className=\"text-lg font-semibold mb-4\">Quick Actions</h2>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n <QuickAction\n title=\"Browse Things\"\n description=\"View and manage all your Things\"\n icon={Shapes}\n href=\"/things\"\n />\n <QuickAction\n title=\"Query Database\"\n description=\"Run queries on your data\"\n icon={Database}\n href=\"/databases\"\n />\n <QuickAction\n title=\"Run Functions\"\n description=\"Execute code against your DO\"\n icon={Code}\n href=\"/functions\"\n />\n <QuickAction\n title=\"Manage Customers\"\n description=\"View and manage customers\"\n icon={Users}\n href=\"/customers\"\n />\n <QuickAction\n title=\"View Subscriptions\"\n description=\"Manage billing and subscriptions\"\n icon={CreditCard}\n href=\"/subscriptions\"\n />\n <QuickAction\n title=\"Organizations\"\n description=\"Manage organizations and teams\"\n icon={Building}\n href=\"/orgs\"\n />\n </div>\n </div>\n\n {/* Current Namespace Info */}\n <Card>\n <CardHeader>\n <CardTitle>Current Namespace: {namespace}</CardTitle>\n <CardDescription>\n You are currently working in the \"{namespace}\" namespace.\n Switch namespaces from the Things or Databases view.\n </CardDescription>\n </CardHeader>\n </Card>\n </div>\n )\n}\n","'use client'\n\n/**\n * ThingsPage\n *\n * Page wrapper for DataBrowserView that extracts route params.\n */\n\nimport { useParams, useNavigate } from 'react-router-dom'\nimport { DataBrowserView } from '../../views'\nimport type { Thing } from '../../types'\n\n/**\n * ThingsPage - Renders DataBrowserView with route params\n *\n * Route: /things/:ns?/:type?\n */\nexport function ThingsPage() {\n const { ns, type } = useParams<{ ns?: string; type?: string }>()\n const navigate = useNavigate()\n\n const handleOpen = (thing: Thing) => {\n // Navigate to document editor view\n navigate(`/things/${thing.ns}/${thing.type}/${thing.id}`)\n }\n\n return (\n <DataBrowserView\n initialNamespace={ns}\n initialType={type}\n onOpen={handleOpen}\n className=\"h-full\"\n />\n )\n}\n","'use client'\n\n/**\n * DatabasesPage\n *\n * Page wrapper for DataGridView that extracts route params.\n */\n\nimport { useParams } from 'react-router-dom'\nimport { DataGridView } from '../../views'\n\n/**\n * DatabasesPage - Renders DataGridView with route params\n *\n * Route: /databases/:ns?/:type?\n */\nexport function DatabasesPage() {\n const { ns, type } = useParams<{ ns?: string; type?: string }>()\n\n return (\n <DataGridView\n initialNamespace={ns}\n initialType={type}\n className=\"h-full\"\n />\n )\n}\n","'use client'\n\n/**\n * DocumentPage\n *\n * Page wrapper for DocumentEditorView that extracts route params.\n */\n\nimport { useParams, useNavigate } from 'react-router-dom'\nimport { DocumentEditorView } from '../../views'\n\n/**\n * DocumentPage - Renders DocumentEditorView with route params\n *\n * Route: /things/:ns/:type/:id\n */\nexport function DocumentPage() {\n const { ns, type, id } = useParams<{ ns: string; type: string; id: string }>()\n const navigate = useNavigate()\n\n const handleBack = () => {\n // Navigate back to things browse view\n navigate(`/things/${ns}/${type}`)\n }\n\n const handleDelete = () => {\n // Navigate back to things browse view after delete\n navigate(`/things/${ns}/${type}`)\n }\n\n return (\n <DocumentEditorView\n initialNamespace={ns}\n initialType={type}\n initialId={id}\n onBack={handleBack}\n onDelete={handleDelete}\n className=\"h-full\"\n />\n )\n}\n","'use client'\n\n/**\n * FunctionsPage\n *\n * Page wrapper for FunctionEditorView.\n */\n\nimport { FunctionEditorView } from '../../views'\n\n/**\n * FunctionsPage - Renders FunctionEditorView\n *\n * Route: /functions\n */\nexport function FunctionsPage() {\n return <FunctionEditorView className=\"h-full\" />\n}\n","'use client'\n\n/**\n * PlaceholderPage\n *\n * Placeholder component for routes that are not yet implemented.\n */\n\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@mdxui/primitives'\nimport { Construction } from 'lucide-react'\n\ninterface PlaceholderPageProps {\n /** Title for the page */\n title: string\n /** Description of what this page will contain */\n description?: string\n}\n\n/**\n * PlaceholderPage - Shows a \"coming soon\" message for unimplemented routes\n */\nexport function PlaceholderPage({ title, description }: PlaceholderPageProps) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Card className=\"max-w-md\">\n <CardHeader className=\"text-center\">\n <div className=\"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-muted\">\n <Construction className=\"h-8 w-8 text-muted-foreground\" />\n </div>\n <CardTitle>{title}</CardTitle>\n <CardDescription>\n {description ?? 'This feature is coming soon.'}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"text-center text-sm text-muted-foreground\">\n <p>We're working hard to bring you this functionality.</p>\n <p>Check back soon for updates.</p>\n </CardContent>\n </Card>\n </div>\n )\n}\n\n// Pre-configured placeholder pages for specific routes\n\nexport function AgentsPage() {\n return (\n <PlaceholderPage\n title=\"Agents\"\n description=\"Manage AI agents and their configurations.\"\n />\n )\n}\n\nexport function WorkflowsPage() {\n return (\n <PlaceholderPage\n title=\"Workflows\"\n description=\"Create and manage automated workflows.\"\n />\n )\n}\n\nexport function RelationshipsPage() {\n return (\n <PlaceholderPage\n title=\"Relationships\"\n description=\"View and manage relationships between Things.\"\n />\n )\n}\n\nexport function EventsPage() {\n return (\n <PlaceholderPage\n title=\"Events\"\n description=\"Browse and manage events in your system.\"\n />\n )\n}\n\nexport function CustomersPage() {\n return (\n <PlaceholderPage\n title=\"Customers\"\n description=\"View and manage your customers.\"\n />\n )\n}\n\nexport function SubscriptionsPage() {\n return (\n <PlaceholderPage\n title=\"Subscriptions\"\n description=\"Manage customer subscriptions and billing.\"\n />\n )\n}\n\nexport function IntegrationsPage() {\n return (\n <PlaceholderPage\n title=\"Integrations\"\n description=\"Configure third-party integrations.\"\n />\n )\n}\n\nexport function OrgsPage() {\n return (\n <PlaceholderPage\n title=\"Organizations\"\n description=\"Manage organizations and their settings.\"\n />\n )\n}\n\nexport function RolesPage() {\n return (\n <PlaceholderPage\n title=\"Roles\"\n description=\"Configure roles and permissions.\"\n />\n )\n}\n\nexport function UsersPage() {\n return (\n <PlaceholderPage\n title=\"Users\"\n description=\"Manage users and their access.\"\n />\n )\n}\n\nexport function ApiKeysPage() {\n return (\n <PlaceholderPage\n title=\"API Keys\"\n description=\"Generate and manage API keys.\"\n />\n )\n}\n\nexport function SettingsPage() {\n return (\n <PlaceholderPage\n title=\"Settings\"\n description=\"Configure system settings.\"\n />\n )\n}\n","'use client'\n\n/**\n * DOApp - Complete routed application entry point\n *\n * This component provides a complete DO Admin Dashboard with:\n * - WorkOS AuthKit authentication\n * - Theme support (light/dark/system)\n * - TanStack Query for data fetching\n * - React Router DOM for navigation\n * - All shell components and pages\n */\n\nimport * as React from 'react'\nimport { BrowserRouter, Routes, Route } from 'react-router-dom'\nimport type { DOShellConfig } from '../types/config'\nimport { AppProviders } from './app-providers'\nimport { DOShell } from './do-shell'\nimport { OverviewPage } from './pages/overview-page'\nimport { ThingsPage } from './pages/things-page'\nimport { DatabasesPage } from './pages/databases-page'\nimport { DocumentPage } from './pages/document-page'\nimport { FunctionsPage } from './pages/functions-page'\nimport { PlaceholderPage } from './pages/placeholder-page'\n\nexport interface DOAppProps {\n /** Shell configuration */\n config: DOShellConfig\n /** Optional custom content to render in the shell header */\n headerContent?: React.ReactNode\n /** Optional custom content to render in the sidebar header */\n sidebarHeaderContent?: React.ReactNode\n}\n\n/**\n * DOApp - Complete routed DO Admin Dashboard application with authentication\n *\n * This is the main entry point for using DO Admin with WorkOS authentication and routing.\n * It sets up all necessary providers, routing, and the shell.\n *\n * @example\n * ```tsx\n * import { DOApp } from '@mdxui/do'\n *\n * function App() {\n * return (\n * <DOApp\n * config={{\n * do: {\n * apiEndpoint: 'https://api.do.ai',\n * authMethod: 'jwt',\n * bindings: [],\n * realTimeUpdates: true,\n * },\n * identity: {\n * clientId: 'client_xxx',\n * devMode: true,\n * },\n * branding: {\n * name: 'My DO Admin',\n * },\n * defaultNamespace: 'production',\n * }}\n * />\n * )\n * }\n * ```\n */\nexport function DOApp({ config, headerContent, sidebarHeaderContent }: DOAppProps) {\n const basePath = config.basePath ?? ''\n\n return (\n <AppProviders config={config}>\n <BrowserRouter basename={basePath}>\n <Routes>\n <Route\n path=\"/\"\n element={\n <DOShell\n headerContent={headerContent}\n sidebarHeaderContent={sidebarHeaderContent}\n />\n }\n >\n {/* Main */}\n <Route index element={<OverviewPage />} />\n\n {/* Development */}\n <Route path=\"agents\" element={<PlaceholderPage title=\"Agents\" description=\"Autonomous AI workers\" />} />\n <Route path=\"functions\" element={<FunctionsPage />} />\n <Route path=\"workflows\" element={<PlaceholderPage title=\"Workflows\" description=\"Business process orchestration\" />} />\n <Route path=\"databases\" element={<DatabasesPage />} />\n <Route path=\"databases/:ns/:type\" element={<DatabasesPage />} />\n\n {/* Data Model */}\n <Route path=\"things\" element={<ThingsPage />} />\n <Route path=\"things/:ns\" element={<ThingsPage />} />\n <Route path=\"things/:ns/:type\" element={<ThingsPage />} />\n <Route path=\"things/:ns/:type/:id\" element={<DocumentPage />} />\n <Route path=\"nouns\" element={<PlaceholderPage title=\"Nouns\" description=\"Semantic entities and concepts\" />} />\n <Route path=\"verbs\" element={<PlaceholderPage title=\"Verbs\" description=\"Actions and operations\" />} />\n <Route path=\"actions\" element={<PlaceholderPage title=\"Actions\" description=\"Executable operations\" />} />\n <Route path=\"relationships\" element={<PlaceholderPage title=\"Relationships\" description=\"Entity connections and graph\" />} />\n <Route path=\"events\" element={<PlaceholderPage title=\"Events\" description=\"Operation log and semantic events\" />} />\n\n {/* SaaS */}\n <Route path=\"customers\" element={<PlaceholderPage title=\"Customers\" description=\"Customer management\" />} />\n <Route path=\"subscriptions\" element={<PlaceholderPage title=\"Subscriptions\" description=\"Subscription management\" />} />\n <Route path=\"integrations\" element={<PlaceholderPage title=\"Integrations\" description=\"External service connections\" />} />\n\n {/* Admin */}\n <Route path=\"orgs\" element={<PlaceholderPage title=\"Organizations\" description=\"Organization management\" />} />\n <Route path=\"roles\" element={<PlaceholderPage title=\"Roles\" description=\"Role-based access control\" />} />\n <Route path=\"users\" element={<PlaceholderPage title=\"Users\" description=\"User management\" />} />\n <Route path=\"api-keys\" element={<PlaceholderPage title=\"API Keys\" description=\"API key management\" />} />\n <Route path=\"settings\" element={<PlaceholderPage title=\"Settings\" description=\"Application settings\" />} />\n </Route>\n </Routes>\n </BrowserRouter>\n </AppProviders>\n )\n}\n","/**\n * Route parameter schemas for DO Shell routes\n *\n * These Zod schemas define and validate route parameters.\n */\n\nimport { z } from 'zod'\n\n/**\n * Schema for database route params\n */\nexport const DatabaseRouteParams = z.object({\n ns: z.string().optional(),\n type: z.string().optional(),\n})\n\nexport type DatabaseRouteParamsType = z.infer<typeof DatabaseRouteParams>\n\n/**\n * Schema for things browse route params\n */\nexport const ThingsRouteParams = z.object({\n ns: z.string().optional(),\n type: z.string().optional(),\n})\n\nexport type ThingsRouteParamsType = z.infer<typeof ThingsRouteParams>\n\n/**\n * Schema for document route params\n */\nexport const DocumentRouteParams = z.object({\n ns: z.string(),\n type: z.string(),\n id: z.string(),\n})\n\nexport type DocumentRouteParamsType = z.infer<typeof DocumentRouteParams>\n\n/**\n * Schema for generic type-filtered route params\n */\nexport const TypeFilteredRouteParams = z.object({\n type: z.string().optional(),\n})\n\nexport type TypeFilteredRouteParamsType = z.infer<typeof TypeFilteredRouteParams>\n","/**\n * DO Shell Routes\n *\n * Route definitions and parameter schemas for the DO Admin Dashboard.\n */\n\nexport {\n DatabaseRouteParams,\n ThingsRouteParams,\n DocumentRouteParams,\n TypeFilteredRouteParams,\n type DatabaseRouteParamsType,\n type ThingsRouteParamsType,\n type DocumentRouteParamsType,\n type TypeFilteredRouteParamsType,\n} from './route-params'\n\n/**\n * Route paths for DO Shell navigation\n *\n * These paths are used throughout the shell for navigation links\n * and route matching.\n */\nexport const doRoutePaths = {\n // Main\n overview: '/',\n\n // Development\n agents: '/agents',\n functions: '/functions',\n workflows: '/workflows',\n databases: '/databases',\n databaseTable: '/databases/:ns/:type',\n\n // Data Model\n things: '/things',\n thingsBrowse: '/things/:ns/:type?',\n document: '/things/:ns/:type/:id',\n nouns: '/nouns',\n verbs: '/verbs',\n actions: '/actions',\n relationships: '/relationships',\n events: '/events',\n\n // SaaS\n customers: '/customers',\n subscriptions: '/subscriptions',\n integrations: '/integrations',\n\n // Admin\n orgs: '/orgs',\n roles: '/roles',\n users: '/users',\n apiKeys: '/api-keys',\n settings: '/settings',\n} as const\n\nexport type DORoutePath = typeof doRoutePaths[keyof typeof doRoutePaths]\n"]}
@@ -0,0 +1,116 @@
1
+ import { retryWithBackoff } from './chunk-Y52IEYVM.js';
2
+ import { useState, useRef, useCallback, useEffect } from 'react';
3
+
4
+ // src/lib/url-utils.ts
5
+ function deriveRpcUrl(url) {
6
+ let rpcUrl = url.replace(/^wss:/, "https:").replace(/^ws:/, "http:");
7
+ rpcUrl = rpcUrl.replace(/\/(sync|rpc)$/, "");
8
+ rpcUrl = rpcUrl.replace(/\/$/, "");
9
+ return `${rpcUrl}/rpc`;
10
+ }
11
+
12
+ // src/lib/fetch-with-timeout.ts
13
+ var DEFAULT_REQUEST_TIMEOUT = 3e4;
14
+ async function fetchWithTimeout(url, options = {}) {
15
+ const { timeout = DEFAULT_REQUEST_TIMEOUT, signal: existingSignal, ...fetchOptions } = options;
16
+ const controller = new AbortController();
17
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
18
+ const existingAbortHandler = existingSignal ? () => controller.abort(existingSignal.reason) : null;
19
+ if (existingSignal) {
20
+ if (existingSignal.aborted) {
21
+ clearTimeout(timeoutId);
22
+ controller.abort(existingSignal.reason);
23
+ } else {
24
+ existingSignal.addEventListener("abort", existingAbortHandler);
25
+ }
26
+ }
27
+ try {
28
+ const response = await fetch(url, {
29
+ ...fetchOptions,
30
+ signal: controller.signal
31
+ });
32
+ return response;
33
+ } finally {
34
+ clearTimeout(timeoutId);
35
+ if (existingSignal && existingAbortHandler) {
36
+ existingSignal.removeEventListener("abort", existingAbortHandler);
37
+ }
38
+ }
39
+ }
40
+ function createFetchWithTimeout(defaultTimeout) {
41
+ return (url, options = {}) => fetchWithTimeout(url, { timeout: defaultTimeout, ...options });
42
+ }
43
+ function useHealthCheck(config) {
44
+ const [isConnected, setIsConnected] = useState(false);
45
+ const [connectionError, setConnectionError] = useState();
46
+ const [isChecking, setIsChecking] = useState(true);
47
+ const { apiEndpoint, authToken, requestTimeout, healthCheckRetries = 3 } = config;
48
+ const abortControllerRef = useRef(null);
49
+ const performHealthCheck = useCallback(async () => {
50
+ const response = await fetchWithTimeout(apiEndpoint, {
51
+ method: "GET",
52
+ headers: {
53
+ "Content-Type": "application/json",
54
+ ...authToken ? { Authorization: `Bearer ${authToken}` } : {}
55
+ },
56
+ timeout: requestTimeout ?? DEFAULT_REQUEST_TIMEOUT
57
+ });
58
+ if (!response.ok) {
59
+ throw new Error(`Health check failed: ${response.status}`);
60
+ }
61
+ }, [apiEndpoint, authToken, requestTimeout]);
62
+ const checkConnection = useCallback(async () => {
63
+ setIsChecking(true);
64
+ try {
65
+ await retryWithBackoff(performHealthCheck, {
66
+ maxRetries: healthCheckRetries,
67
+ backoffMultiplier: 1e3
68
+ });
69
+ setIsConnected(true);
70
+ setConnectionError(void 0);
71
+ } catch (error) {
72
+ setIsConnected(false);
73
+ setConnectionError(error instanceof Error ? error : new Error("Connection failed"));
74
+ } finally {
75
+ setIsChecking(false);
76
+ }
77
+ }, [performHealthCheck, healthCheckRetries]);
78
+ useEffect(() => {
79
+ abortControllerRef.current = new AbortController();
80
+ const { signal } = abortControllerRef.current;
81
+ async function runCheck() {
82
+ try {
83
+ await retryWithBackoff(performHealthCheck, {
84
+ maxRetries: healthCheckRetries,
85
+ backoffMultiplier: 1e3,
86
+ signal
87
+ });
88
+ if (!signal.aborted) {
89
+ setIsConnected(true);
90
+ setConnectionError(void 0);
91
+ setIsChecking(false);
92
+ }
93
+ } catch (error) {
94
+ if (!signal.aborted) {
95
+ setIsConnected(false);
96
+ setConnectionError(error instanceof Error ? error : new Error("Connection failed"));
97
+ setIsChecking(false);
98
+ }
99
+ }
100
+ }
101
+ runCheck();
102
+ return () => {
103
+ abortControllerRef.current?.abort();
104
+ };
105
+ }, [performHealthCheck, healthCheckRetries]);
106
+ return {
107
+ isConnected,
108
+ connectionError,
109
+ checkConnection,
110
+ isChecking
111
+ };
112
+ }
113
+
114
+ export { DEFAULT_REQUEST_TIMEOUT, createFetchWithTimeout, deriveRpcUrl, fetchWithTimeout, useHealthCheck };
115
+ //# sourceMappingURL=chunk-OWEAW4U6.js.map
116
+ //# sourceMappingURL=chunk-OWEAW4U6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/url-utils.ts","../src/lib/fetch-with-timeout.ts","../src/lib/use-health-check.ts"],"names":[],"mappings":"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","file":"chunk-OWEAW4U6.js","sourcesContent":["/**\n * URL utilities for @mdxui/do\n *\n * Provides functions to normalize and derive URLs from the configuration.\n * These utilities ensure consistent URL formatting across the package.\n *\n * @module\n */\n\n/**\n * Normalize a URL to an RPC endpoint\n *\n * Transforms various URL formats into a consistent RPC endpoint URL:\n * - Converts wss:// to https:// and ws:// to http://\n * - Strips trailing /sync or /rpc if present\n * - Appends /rpc\n *\n * @param url - The base URL (e.g., 'https://api.do/admin' or 'wss://api.do/do/workspace')\n * @returns The normalized RPC URL (e.g., 'https://api.do/admin/rpc')\n *\n * @example\n * ```typescript\n * deriveRpcUrl('https://api.do/admin')\n * // => 'https://api.do/admin/rpc'\n *\n * deriveRpcUrl('wss://api.do/do/workspace/sync')\n * // => 'https://api.do/do/workspace/rpc'\n *\n * deriveRpcUrl('https://api.do/admin/rpc')\n * // => 'https://api.do/admin/rpc' (unchanged)\n * ```\n */\nexport function deriveRpcUrl(url: string): string {\n // Convert WebSocket to HTTP if needed\n let rpcUrl = url.replace(/^wss:/, 'https:').replace(/^ws:/, 'http:')\n // Strip any existing /sync or /rpc suffix\n rpcUrl = rpcUrl.replace(/\\/(sync|rpc)$/, '')\n // Strip trailing slash\n rpcUrl = rpcUrl.replace(/\\/$/, '')\n // Append /rpc\n return `${rpcUrl}/rpc`\n}\n","/**\n * Fetch wrapper with configurable timeout\n *\n * Prevents indefinite hangs on slow networks or unresponsive servers\n * by wrapping fetch with AbortController-based timeout.\n *\n * @module\n */\n\n/**\n * Default timeout in milliseconds (30 seconds)\n */\nexport const DEFAULT_REQUEST_TIMEOUT = 30000\n\n/**\n * Extended RequestInit that includes optional timeout\n */\nexport interface FetchWithTimeoutOptions extends RequestInit {\n /** Timeout in milliseconds. Defaults to 30000 (30 seconds) */\n timeout?: number\n}\n\n/**\n * Fetch wrapper with configurable timeout\n *\n * Uses AbortController to cancel requests that exceed the timeout.\n * If the request already has a signal, a composite abort will be used\n * that respects both the existing signal and the timeout.\n *\n * @param url - The URL to fetch\n * @param options - Fetch options including optional timeout\n * @returns Promise resolving to the Response\n * @throws {DOMException} AbortError if the request times out\n *\n * @example\n * ```typescript\n * // Basic usage with default 30s timeout\n * const response = await fetchWithTimeout('https://api.example.com/data')\n *\n * // Custom timeout\n * const response = await fetchWithTimeout('https://api.example.com/data', {\n * timeout: 5000, // 5 seconds\n * })\n *\n * // With other fetch options\n * const response = await fetchWithTimeout('https://api.example.com/data', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ key: 'value' }),\n * timeout: 10000,\n * })\n * ```\n */\nexport async function fetchWithTimeout(\n url: string,\n options: FetchWithTimeoutOptions = {}\n): Promise<Response> {\n const { timeout = DEFAULT_REQUEST_TIMEOUT, signal: existingSignal, ...fetchOptions } = options\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n // If there's an existing signal, listen for its abort\n const existingAbortHandler = existingSignal\n ? () => controller.abort(existingSignal.reason)\n : null\n\n if (existingSignal) {\n if (existingSignal.aborted) {\n clearTimeout(timeoutId)\n controller.abort(existingSignal.reason)\n } else {\n existingSignal.addEventListener('abort', existingAbortHandler!)\n }\n }\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n signal: controller.signal,\n })\n return response\n } finally {\n clearTimeout(timeoutId)\n if (existingSignal && existingAbortHandler) {\n existingSignal.removeEventListener('abort', existingAbortHandler)\n }\n }\n}\n\n/**\n * Create a fetch wrapper with a default timeout from config\n *\n * Useful for creating a configured fetch function that can be shared\n * across multiple hooks/components with consistent timeout behavior.\n *\n * @param defaultTimeout - Default timeout in milliseconds\n * @returns A fetch function with the default timeout applied\n *\n * @example\n * ```typescript\n * // Create a configured fetch\n * const configuredFetch = createFetchWithTimeout(5000)\n *\n * // Use it (timeout defaults to 5000ms)\n * const response = await configuredFetch('https://api.example.com/data')\n *\n * // Override the default timeout\n * const response = await configuredFetch('https://api.example.com/data', {\n * timeout: 10000,\n * })\n * ```\n */\nexport function createFetchWithTimeout(defaultTimeout: number) {\n return (url: string, options: FetchWithTimeoutOptions = {}): Promise<Response> =>\n fetchWithTimeout(url, { timeout: defaultTimeout, ...options })\n}\n","'use client'\n\n/**\n * Health check hook for @mdxui/do\n *\n * Provides a reusable hook for checking API endpoint connectivity\n * with retry logic and exponential backoff.\n *\n * @module\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\nimport { fetchWithTimeout, DEFAULT_REQUEST_TIMEOUT } from './fetch-with-timeout'\nimport { retryWithBackoff } from './utils'\n\n/**\n * Configuration for health check behavior\n */\nexport interface HealthCheckConfig {\n /** API endpoint base URL (e.g., 'https://api.do/admin') */\n apiEndpoint: string\n /** Optional auth token for Bearer authentication */\n authToken?: string\n /** Request timeout in milliseconds (defaults to DEFAULT_REQUEST_TIMEOUT) */\n requestTimeout?: number\n /** Number of retry attempts (defaults to 3) */\n healthCheckRetries?: number\n}\n\n/**\n * Result of the health check hook\n */\nexport interface HealthCheckResult {\n /** Whether the API is reachable */\n isConnected: boolean\n /** Error from the last failed attempt, if any */\n connectionError?: Error\n /** Manually trigger a health check */\n checkConnection: () => Promise<void>\n /** Whether a check is currently in progress */\n isChecking: boolean\n}\n\n/**\n * Hook to perform health checks against an API endpoint\n *\n * Automatically checks connection on mount with retry and exponential backoff.\n * Can also be manually triggered via the returned `checkConnection` function.\n *\n * @param config - Health check configuration\n * @returns Health check state and manual trigger function\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isConnected, connectionError, checkConnection } = useHealthCheck({\n * apiEndpoint: 'https://api.do/admin',\n * authToken: 'my-token',\n * healthCheckRetries: 3,\n * })\n *\n * if (connectionError) {\n * return <div>Connection failed: {connectionError.message}</div>\n * }\n *\n * if (!isConnected) {\n * return <div>Connecting...</div>\n * }\n *\n * return <div>Connected!</div>\n * }\n * ```\n */\nexport function useHealthCheck(config: HealthCheckConfig): HealthCheckResult {\n const [isConnected, setIsConnected] = useState(false)\n const [connectionError, setConnectionError] = useState<Error>()\n const [isChecking, setIsChecking] = useState(true)\n\n const { apiEndpoint, authToken, requestTimeout, healthCheckRetries = 3 } = config\n\n // AbortController for cancellation support in useEffect\n const abortControllerRef = useRef<AbortController | null>(null)\n\n /**\n * Performs a single health check request\n * Shared between manual checkConnection and useEffect\n * Uses root endpoint (/) for broader compatibility\n */\n const performHealthCheck = useCallback(async (): Promise<void> => {\n const response = await fetchWithTimeout(apiEndpoint, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n timeout: requestTimeout ?? DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n throw new Error(`Health check failed: ${response.status}`)\n }\n }, [apiEndpoint, authToken, requestTimeout])\n\n const checkConnection = useCallback(async () => {\n setIsChecking(true)\n\n try {\n await retryWithBackoff(performHealthCheck, {\n maxRetries: healthCheckRetries,\n backoffMultiplier: 1000,\n })\n\n setIsConnected(true)\n setConnectionError(undefined)\n } catch (error) {\n setIsConnected(false)\n setConnectionError(error instanceof Error ? error : new Error('Connection failed'))\n } finally {\n setIsChecking(false)\n }\n }, [performHealthCheck, healthCheckRetries])\n\n // Check connection on mount\n useEffect(() => {\n abortControllerRef.current = new AbortController()\n const { signal } = abortControllerRef.current\n\n async function runCheck() {\n try {\n await retryWithBackoff(performHealthCheck, {\n maxRetries: healthCheckRetries,\n backoffMultiplier: 1000,\n signal,\n })\n\n if (!signal.aborted) {\n setIsConnected(true)\n setConnectionError(undefined)\n setIsChecking(false)\n }\n } catch (error) {\n if (!signal.aborted) {\n setIsConnected(false)\n setConnectionError(error instanceof Error ? error : new Error('Connection failed'))\n setIsChecking(false)\n }\n }\n }\n\n runCheck()\n\n return () => {\n abortControllerRef.current?.abort()\n }\n }, [performHealthCheck, healthCheckRetries])\n\n return {\n isConnected,\n connectionError,\n checkConnection,\n isChecking,\n }\n}\n"]}
@@ -0,0 +1,31 @@
1
+ // src/types/export.ts
2
+ var EXPORT_FORMATS = [
3
+ { value: "json", label: "JSON", extension: "json", mime: "application/json" },
4
+ { value: "yaml", label: "YAML", extension: "yaml", mime: "text/yaml" },
5
+ { value: "csv", label: "CSV", extension: "csv", mime: "text/csv" },
6
+ { value: "jsonl", label: "JSON Lines", extension: "jsonl", mime: "application/jsonl" }
7
+ ];
8
+ function getFormatMeta(format) {
9
+ return EXPORT_FORMATS.find((f) => f.value === format);
10
+ }
11
+
12
+ // src/types/index.ts
13
+ function isValidationErrorData(error) {
14
+ return error.code === "VALIDATION_ERROR";
15
+ }
16
+ function isNotFoundError(error) {
17
+ return error.code === "NOT_FOUND";
18
+ }
19
+ function isPermissionError(error) {
20
+ return error.code === "PERMISSION_DENIED";
21
+ }
22
+ function isRateLimitError(error) {
23
+ return error.code === "RATE_LIMITED";
24
+ }
25
+ function isAppError(error) {
26
+ return typeof error === "object" && error !== null && "code" in error && typeof error.code === "string" && "message" in error && typeof error.message === "string";
27
+ }
28
+
29
+ export { EXPORT_FORMATS, getFormatMeta, isAppError, isNotFoundError, isPermissionError, isRateLimitError, isValidationErrorData };
30
+ //# sourceMappingURL=chunk-VRLUXCLD.js.map
31
+ //# sourceMappingURL=chunk-VRLUXCLD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/export.ts","../src/types/index.ts"],"names":[],"mappings":";AAiCO,IAAM,cAAA,GAAqC;AAAA,EAChD,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,SAAA,EAAW,MAAA,EAAQ,MAAM,kBAAA,EAAmB;AAAA,EAC5E,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,SAAA,EAAW,MAAA,EAAQ,MAAM,WAAA,EAAY;AAAA,EACrE,EAAE,OAAO,KAAA,EAAO,KAAA,EAAO,OAAO,SAAA,EAAW,KAAA,EAAO,MAAM,UAAA,EAAW;AAAA,EACjE,EAAE,OAAO,OAAA,EAAS,KAAA,EAAO,cAAc,SAAA,EAAW,OAAA,EAAS,MAAM,mBAAA;AACnE;AAGO,SAAS,cAAc,MAAA,EAAoD;AAChF,EAAA,OAAO,eAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,MAAM,CAAA;AACtD;;;ACuRO,SAAS,sBAAsB,KAAA,EAA+C;AACnF,EAAA,OAAO,MAAM,IAAA,KAAS,kBAAA;AACxB;AAGO,SAAS,gBAAgB,KAAA,EAAyC;AACvE,EAAA,OAAO,MAAM,IAAA,KAAS,WAAA;AACxB;AAGO,SAAS,kBAAkB,KAAA,EAA2C;AAC3E,EAAA,OAAO,MAAM,IAAA,KAAS,mBAAA;AACxB;AAGO,SAAS,iBAAiB,KAAA,EAA0C;AACzE,EAAA,OAAO,MAAM,IAAA,KAAS,cAAA;AACxB;AAmBO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,QACV,MAAA,IAAU,KAAA,IACV,OAAQ,KAAA,CAAmB,SAAS,QAAA,IACpC,SAAA,IAAa,KAAA,IACb,OAAQ,MAAmB,OAAA,KAAY,QAAA;AAE3C","file":"chunk-VRLUXCLD.js","sourcesContent":["/**\n * Export Types\n *\n * Type definitions for data export functionality.\n */\n\n/** Supported export formats */\nexport type ExportFormat = 'json' | 'yaml' | 'csv' | 'jsonl'\n\n/** Scope of data to export */\nexport type ExportScope = 'visible' | 'filtered' | 'all'\n\n/** Export configuration */\nexport interface ExportConfig {\n /** Output format */\n format: ExportFormat\n /** Data scope to export */\n scope: ExportScope\n}\n\n/** Format metadata for display and file operations */\nexport interface ExportFormatMeta {\n /** Format identifier */\n value: ExportFormat\n /** Display label */\n label: string\n /** File extension (without dot) */\n extension: string\n /** MIME type */\n mime: string\n}\n\n/** Available export formats with metadata */\nexport const EXPORT_FORMATS: ExportFormatMeta[] = [\n { value: 'json', label: 'JSON', extension: 'json', mime: 'application/json' },\n { value: 'yaml', label: 'YAML', extension: 'yaml', mime: 'text/yaml' },\n { value: 'csv', label: 'CSV', extension: 'csv', mime: 'text/csv' },\n { value: 'jsonl', label: 'JSON Lines', extension: 'jsonl', mime: 'application/jsonl' },\n]\n\n/** Get format metadata by format value */\nexport function getFormatMeta(format: ExportFormat): ExportFormatMeta | undefined {\n return EXPORT_FORMATS.find((f) => f.value === format)\n}\n","/**\n * @mdxui/do Type Definitions\n *\n * Comprehensive type system for the .do platform admin interface.\n * Covers all domain entities: DOs, Things, Relationships, Functions,\n * Workflows, Agents, Events, Integrations, and Auth.\n */\n\n// Filter types (for data views)\nexport * from './filter'\n\n// Export types (for data export)\nexport * from './export'\n\n// Common types (shared across domains)\nexport * from './common'\nimport type { SortDirection } from './common'\n\n// Durable Objects management\nexport * from './do'\n\n// Things/Nouns (semantic entities)\nexport * from './things'\n\n// Relationships (semantic graph)\n// Note: EntityReference is exported from ./common (re-exported by ./relationships for domain API)\nexport type {\n Relationship,\n SemanticPredicateCategory,\n SemanticPredicate,\n PredicateDefinition,\n RelationshipMetadata,\n SemanticTriple,\n GraphPattern,\n RelationshipCreateInput,\n RelationshipFilter,\n GraphTraversalResult,\n GraphPath,\n GraphStats,\n} from './relationships'\n\n// Functions (Code, Generative, Agentic, Human)\n// Note: TokenUsage and ExecutionError are exported from ./common (re-exported by ./functions for domain API)\nexport type {\n FunctionCategory,\n FunctionBase,\n CodeFunction,\n AIModel,\n GenerativeFunction,\n ToolDefinition,\n AgenticFunction,\n AgentClassification as FunctionAgentClassification,\n AgentGuardrail as FunctionAgentGuardrail,\n HandoffRule as FunctionHandoffRule,\n HumanFunction,\n EscalationRule,\n ReminderRule,\n Function,\n FunctionExecutionStatus,\n FunctionExecution,\n FunctionFilter,\n} from './functions'\n\n// Workflows (business process orchestration)\nexport * from './workflows'\n\n// Agents (autonomous AI workers) - these are the main agent types\nexport * from './agents'\n\n// Events (operation log & semantic events)\n// Note: EntityReference is exported from ./common (re-exported by ./events for domain API)\nexport type {\n OperationEventType,\n OperationEvent,\n EventMetadata,\n SemanticEvent,\n EventSource,\n EventDefinition,\n EventSubscription,\n EventFilter,\n EventQueryResult,\n EventStream,\n EventReplayRequest,\n ReplayTarget,\n EventStats,\n EventTimelineEntry,\n} from './events'\n\n// Integrations (external service connections)\nexport * from './integrations'\n\n// Auth (Users, Orgs, APIKeys)\nexport * from './auth'\n\n// Data Grid types (DatabaseColumnDef, DataType, GridCellValue)\nexport type {\n DataType,\n GridCellValue,\n DatabaseColumnDef,\n GridRowData,\n GridSelection,\n GridSortState,\n GridFilterState,\n GridEditState,\n GridPendingChange,\n} from './data-grid'\n\n// Database Editor (Supabase-style spreadsheet UI)\n// Note: CellValue and DatabaseEditorProps are also exported from components/database-editor\n// We export them here with different names to avoid conflicts\nexport type {\n SQLiteStorageClass,\n SQLiteTypeAffinity,\n SQLiteDataType,\n DataTypeCategory,\n MongoComparisonOperators,\n MongoLogicalOperators,\n MongoElementOperators,\n MongoStringOperators,\n MongoArrayOperators,\n MongoFieldOperators,\n MongoQuery,\n MongoSort,\n MongoProjection,\n MongoUpdateOperators,\n SQLOperator,\n SQLCondition,\n SQLWhereClause,\n SQLOrderBy,\n QueryStyle,\n UnifiedQuery,\n ForeignKeyReference,\n TableColumn,\n TableIndex,\n TableConstraint,\n TableTrigger,\n TableDefinition,\n DOStorageSchema,\n CellEditorType,\n CellValue as DBCellValue,\n DBRecord,\n CellEditorProps,\n CellRendererProps,\n SortSpec,\n FilterSpec,\n DatabaseGridProps,\n DatabaseToolbarProps,\n DatabaseSidebarProps,\n ColumnEditorPanelProps,\n RowEditorPanelProps,\n RelationshipsPanelProps,\n SQLEditorPanelProps,\n TableNode,\n RelationshipEdge,\n SchemaVisualizerProps,\n DatabaseEditorProps as DBEditorProps,\n SchemaOperation,\n TableAlterChanges,\n EditOperation,\n EditHistoryState,\n UseEditHistoryReturn,\n DOStorageInfo,\n DOSQLResult,\n} from './database-editor'\n\n// Configuration types (DOShellConfig, DOIdentity, etc.)\nexport * from './config'\n\n// Zod Validation Schemas\n// Note: types/schemas.ts contains Zod schemas for input validation and response parsing.\n// For the new schema-first approach where types are derived from schemas,\n// import from '@mdxui/do/schemas' instead.\nexport * from './schemas'\n\n/**\n * Common utility types\n */\n\n/** Pagination parameters */\nexport interface PaginationParams {\n page?: number\n perPage?: number\n cursor?: string\n}\n\n/** Paginated result */\nexport interface PaginatedResult<T> {\n data: T[]\n total: number\n page: number\n perPage: number\n totalPages: number\n hasMore: boolean\n cursor?: string\n}\n\n/** Sort parameters */\nexport interface SortParams<T = string> {\n field: T\n order: SortDirection\n}\n\n/** Date range filter */\nexport interface DateRangeFilter {\n after?: Date\n before?: Date\n}\n\n/** Common record metadata */\nexport interface RecordMetadata {\n createdAt: Date\n updatedAt: Date\n createdBy?: string\n updatedBy?: string\n}\n\n/** Soft-deletable record */\nexport interface SoftDeletable {\n deletedAt?: Date | null\n deletedBy?: string\n}\n\n/** Audit trail entry */\nexport interface AuditEntry {\n action: 'create' | 'update' | 'delete' | 'read'\n userId: string\n timestamp: Date\n resourceType: string\n resourceId: string\n changes?: Record<string, { old: unknown; new: unknown }>\n metadata?: Record<string, unknown>\n}\n\n/**\n * Semantic ID helpers\n */\n\n/** Parse a semantic ID (ns/type/id) into components */\nexport interface SemanticIdComponents {\n ns: string\n type: string\n id: string\n}\n\n/** Build a semantic ID from components */\nexport type SemanticId = `${string}/${string}/${string}`\n\n/**\n * Error types\n */\n\n/** Base error */\nexport interface BaseError {\n code: string\n message: string\n details?: Record<string, unknown>\n}\n\n/**\n * Validation error data structure (interface)\n *\n * This interface represents validation error data in API responses.\n * For throwing validation errors in code, use the `ValidationError` class\n * from the main package export.\n *\n * @see ValidationError class in lib/errors.ts for throwable errors\n */\nexport interface ValidationErrorData extends BaseError {\n code: 'VALIDATION_ERROR'\n field?: string\n errors: Array<{\n field: string\n message: string\n code: string\n }>\n}\n\n/** Not found error */\nexport interface NotFoundError extends BaseError {\n code: 'NOT_FOUND'\n resourceType: string\n resourceId: string\n}\n\n/** Permission error */\nexport interface PermissionError extends BaseError {\n code: 'PERMISSION_DENIED'\n requiredPermission: string\n resource?: string\n}\n\n/** Rate limit error */\nexport interface RateLimitError extends BaseError {\n code: 'RATE_LIMITED'\n retryAfter: number\n limit: number\n remaining: number\n}\n\n/** Union of all error types */\nexport type AppError = ValidationErrorData | NotFoundError | PermissionError | RateLimitError | BaseError\n\n/**\n * Type guard functions for AppError discriminated union\n *\n * These functions enable type-safe narrowing when handling errors:\n *\n * @example\n * ```typescript\n * function handleError(error: AppError) {\n * if (isValidationErrorData(error)) {\n * // TypeScript knows error.errors exists here\n * console.log(error.errors)\n * } else if (isNotFoundError(error)) {\n * // TypeScript knows error.resourceType and resourceId exist here\n * console.log(`${error.resourceType}/${error.resourceId} not found`)\n * }\n * }\n * ```\n */\n\n/** Type guard for ValidationErrorData */\nexport function isValidationErrorData(error: AppError): error is ValidationErrorData {\n return error.code === 'VALIDATION_ERROR'\n}\n\n/** Type guard for NotFoundError */\nexport function isNotFoundError(error: AppError): error is NotFoundError {\n return error.code === 'NOT_FOUND'\n}\n\n/** Type guard for PermissionError */\nexport function isPermissionError(error: AppError): error is PermissionError {\n return error.code === 'PERMISSION_DENIED'\n}\n\n/** Type guard for RateLimitError */\nexport function isRateLimitError(error: AppError): error is RateLimitError {\n return error.code === 'RATE_LIMITED'\n}\n\n/**\n * Generic type guard to check if an unknown value is an AppError\n *\n * Useful for catch blocks where the error type is unknown:\n *\n * @example\n * ```typescript\n * try {\n * await someOperation()\n * } catch (error) {\n * if (isAppError(error)) {\n * // TypeScript knows error is AppError here\n * console.log(error.code, error.message)\n * }\n * }\n * ```\n */\nexport function isAppError(error: unknown): error is AppError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as AppError).code === 'string' &&\n 'message' in error &&\n typeof (error as AppError).message === 'string'\n )\n}\n"]}
@@ -0,0 +1,131 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ // src/lib/utils.ts
5
+ function cn(...inputs) {
6
+ return twMerge(clsx(inputs));
7
+ }
8
+ function formatSemanticId(ns, type, id) {
9
+ return `${ns}/${type}/${id}`;
10
+ }
11
+ function parseSemanticId(semanticId) {
12
+ const parts = semanticId.split("/");
13
+ if (parts.length < 3) {
14
+ throw new Error(`Invalid semantic ID format: ${semanticId}`);
15
+ }
16
+ const type = parts[0];
17
+ const id = parts[parts.length - 1];
18
+ const namespace = parts.slice(1, -1).join("/");
19
+ return { type, namespace, id };
20
+ }
21
+ function formatDate(date, options) {
22
+ const d = typeof date === "string" ? new Date(date) : date;
23
+ return d.toLocaleDateString(void 0, options ?? {
24
+ year: "numeric",
25
+ month: "short",
26
+ day: "numeric"
27
+ });
28
+ }
29
+ function formatDateTime(date, options) {
30
+ const d = typeof date === "string" ? new Date(date) : date;
31
+ return d.toLocaleString(void 0, options ?? {
32
+ year: "numeric",
33
+ month: "short",
34
+ day: "numeric",
35
+ hour: "2-digit",
36
+ minute: "2-digit"
37
+ });
38
+ }
39
+ function formatRelativeTime(date) {
40
+ const d = typeof date === "string" ? new Date(date) : date;
41
+ const now = /* @__PURE__ */ new Date();
42
+ const diffMs = now.getTime() - d.getTime();
43
+ const diffSec = Math.floor(diffMs / 1e3);
44
+ const diffMin = Math.floor(diffSec / 60);
45
+ const diffHour = Math.floor(diffMin / 60);
46
+ const diffDay = Math.floor(diffHour / 24);
47
+ if (diffSec < 60) return `${diffSec} ${diffSec === 1 ? "second" : "seconds"} ago`;
48
+ if (diffMin < 60) return `${diffMin} ${diffMin === 1 ? "minute" : "minutes"} ago`;
49
+ if (diffHour < 24) return `${diffHour} ${diffHour === 1 ? "hour" : "hours"} ago`;
50
+ if (diffDay < 7) return `${diffDay} ${diffDay === 1 ? "day" : "days"} ago`;
51
+ return formatDate(d);
52
+ }
53
+ function formatDecimal(value, decimals = 1) {
54
+ const fixed = value.toFixed(decimals);
55
+ return fixed.endsWith(".0") ? fixed.slice(0, -2) : fixed;
56
+ }
57
+ function formatNumber(num) {
58
+ if (num < 0) return `-${formatNumber(-num)}`;
59
+ if (num >= 1e6) return `${formatDecimal(num / 1e6)}M`;
60
+ if (num >= 1e3) return `${formatDecimal(num / 1e3)}K`;
61
+ return num.toString();
62
+ }
63
+ function formatBytes(bytes) {
64
+ if (bytes === 0) return "0 B";
65
+ const k = 1024;
66
+ const sizes = ["B", "KB", "MB", "GB", "TB"];
67
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
68
+ return `${formatDecimal(bytes / Math.pow(k, i))} ${sizes[i]}`;
69
+ }
70
+ function formatDuration(ms) {
71
+ if (ms < 1e3) return `${ms}ms`;
72
+ if (ms < 6e4) return `${formatDecimal(ms / 1e3)}s`;
73
+ if (ms < 36e5) return `${Math.floor(ms / 6e4)}m ${Math.floor(ms % 6e4 / 1e3)}s`;
74
+ return `${Math.floor(ms / 36e5)}h ${Math.floor(ms % 36e5 / 6e4)}m`;
75
+ }
76
+ function truncate(text, maxLength, suffix = "...") {
77
+ if (text.length <= maxLength) return text;
78
+ return text.slice(0, maxLength) + suffix;
79
+ }
80
+ function capitalize(text) {
81
+ return text.charAt(0).toUpperCase() + text.slice(1);
82
+ }
83
+ function camelToTitle(text) {
84
+ return text.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase()).trim();
85
+ }
86
+ function generateId(prefix) {
87
+ const id = Math.random().toString(36).substring(2, 15);
88
+ return prefix ? `${prefix}_${id}` : id;
89
+ }
90
+ function debounce(fn, delay) {
91
+ let timeoutId;
92
+ return (...args) => {
93
+ clearTimeout(timeoutId);
94
+ timeoutId = setTimeout(() => fn(...args), delay);
95
+ };
96
+ }
97
+ function groupBy(array, keyFn) {
98
+ return array.reduce((acc, item) => {
99
+ const key = keyFn(item);
100
+ if (!acc[key]) acc[key] = [];
101
+ acc[key].push(item);
102
+ return acc;
103
+ }, {});
104
+ }
105
+ async function retryWithBackoff(fn, config = {}) {
106
+ const { maxRetries = 3, backoffMultiplier = 1e3, signal, onRetry } = config;
107
+ let lastError;
108
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
109
+ if (signal?.aborted) {
110
+ throw lastError ?? new Error("Retry cancelled");
111
+ }
112
+ try {
113
+ return await fn();
114
+ } catch (error) {
115
+ lastError = error instanceof Error ? error : new Error("Retry failed");
116
+ if (attempt < maxRetries - 1) {
117
+ onRetry?.(lastError, attempt + 1);
118
+ const delay = Math.pow(2, attempt) * backoffMultiplier;
119
+ await new Promise((resolve) => setTimeout(resolve, delay));
120
+ if (signal?.aborted) {
121
+ throw lastError ?? new Error("Retry cancelled");
122
+ }
123
+ }
124
+ }
125
+ }
126
+ throw lastError;
127
+ }
128
+
129
+ export { camelToTitle, capitalize, cn, debounce, formatBytes, formatDate, formatDateTime, formatDuration, formatNumber, formatRelativeTime, formatSemanticId, generateId, groupBy, parseSemanticId, retryWithBackoff, truncate };
130
+ //# sourceMappingURL=chunk-Y52IEYVM.js.map
131
+ //# sourceMappingURL=chunk-Y52IEYVM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts"],"names":[],"mappings":"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","file":"chunk-Y52IEYVM.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Merge class names with Tailwind CSS support\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * Format a semantic ID (ns/type/id)\n */\nexport function formatSemanticId(ns: string, type: string, id: string): string {\n return `${ns}/${type}/${id}`\n}\n\n/**\n * Parse a semantic ID into components\n * Format: type/namespace/id where namespace can contain slashes\n * @throws Error if the semantic ID format is invalid\n */\nexport function parseSemanticId(semanticId: string): { type: string; namespace: string; id: string } {\n const parts = semanticId.split('/')\n if (parts.length < 3) {\n throw new Error(`Invalid semantic ID format: ${semanticId}`)\n }\n\n // Format is type/namespace.../id\n // Type is first, id is last, namespace is everything in between\n const type = parts[0]\n const id = parts[parts.length - 1]\n const namespace = parts.slice(1, -1).join('/')\n\n return { type, namespace, id }\n}\n\n/**\n * Format a date for display\n */\nexport function formatDate(date: Date | string, options?: Intl.DateTimeFormatOptions): string {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleDateString(undefined, options ?? {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })\n}\n\n/**\n * Format a date and time for display\n */\nexport function formatDateTime(date: Date | string, options?: Intl.DateTimeFormatOptions): string {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleString(undefined, options ?? {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\n/**\n * Format a relative time (e.g., \"2 hours ago\")\n */\nexport function formatRelativeTime(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const now = new Date()\n const diffMs = now.getTime() - d.getTime()\n const diffSec = Math.floor(diffMs / 1000)\n const diffMin = Math.floor(diffSec / 60)\n const diffHour = Math.floor(diffMin / 60)\n const diffDay = Math.floor(diffHour / 24)\n\n if (diffSec < 60) return `${diffSec} ${diffSec === 1 ? 'second' : 'seconds'} ago`\n if (diffMin < 60) return `${diffMin} ${diffMin === 1 ? 'minute' : 'minutes'} ago`\n if (diffHour < 24) return `${diffHour} ${diffHour === 1 ? 'hour' : 'hours'} ago`\n if (diffDay < 7) return `${diffDay} ${diffDay === 1 ? 'day' : 'days'} ago`\n return formatDate(d)\n}\n\n/**\n * Format a decimal, removing trailing .0 for whole numbers\n */\nfunction formatDecimal(value: number, decimals: number = 1): string {\n const fixed = value.toFixed(decimals)\n // Remove trailing .0 for whole numbers\n return fixed.endsWith('.0') ? fixed.slice(0, -2) : fixed\n}\n\n/**\n * Format a number with abbreviation (1K, 1M, etc.)\n */\nexport function formatNumber(num: number): string {\n if (num < 0) return `-${formatNumber(-num)}`\n if (num >= 1_000_000) return `${formatDecimal(num / 1_000_000)}M`\n if (num >= 1_000) return `${formatDecimal(num / 1_000)}K`\n return num.toString()\n}\n\n/**\n * Format bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${formatDecimal(bytes / Math.pow(k, i))} ${sizes[i]}`\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n if (ms < 60_000) return `${formatDecimal(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m ${Math.floor((ms % 60_000) / 1000)}s`\n return `${Math.floor(ms / 3_600_000)}h ${Math.floor((ms % 3_600_000) / 60_000)}m`\n}\n\n/**\n * Truncate text with ellipsis\n */\nexport function truncate(text: string, maxLength: number, suffix: string = '...'): string {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength) + suffix\n}\n\n/**\n * Capitalize first letter\n */\nexport function capitalize(text: string): string {\n return text.charAt(0).toUpperCase() + text.slice(1)\n}\n\n/**\n * Convert camelCase to Title Case\n */\nexport function camelToTitle(text: string): string {\n return text\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (str) => str.toUpperCase())\n .trim()\n}\n\n/**\n * Generate a random ID\n */\nexport function generateId(prefix?: string): string {\n const id = Math.random().toString(36).substring(2, 15)\n return prefix ? `${prefix}_${id}` : id\n}\n\n/**\n * Debounce function\n *\n * Creates a debounced version of the function that delays execution\n * until after the specified delay has passed since the last call.\n *\n * @example\n * ```ts\n * const debouncedSearch = debounce((query: string) => {\n * fetch(`/search?q=${query}`)\n * }, 300)\n *\n * // Only the last call within 300ms will execute\n * debouncedSearch('h')\n * debouncedSearch('he')\n * debouncedSearch('hello') // Only this one runs\n * ```\n */\nexport function debounce<Args extends unknown[]>(\n fn: (...args: Args) => unknown,\n delay: number\n): (...args: Args) => void {\n let timeoutId: ReturnType<typeof setTimeout>\n return (...args: Args) => {\n clearTimeout(timeoutId)\n timeoutId = setTimeout(() => fn(...args), delay)\n }\n}\n\n/**\n * Group array by key\n */\nexport function groupBy<T, K extends string | number>(\n array: T[],\n keyFn: (item: T) => K\n): Record<K, T[]> {\n return array.reduce((acc, item) => {\n const key = keyFn(item)\n if (!acc[key]) acc[key] = []\n acc[key].push(item)\n return acc\n }, {} as Record<K, T[]>)\n}\n\n/**\n * Configuration for retry with exponential backoff\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries?: number\n /** Base multiplier for backoff in ms (default: 1000). Backoff = 2^attempt * multiplier */\n backoffMultiplier?: number\n /** Optional AbortSignal for cancellation */\n signal?: AbortSignal\n /** Callback invoked before each retry with the error and attempt number */\n onRetry?: (error: Error, attempt: number) => void\n}\n\n/**\n * Execute an async function with retry and exponential backoff\n *\n * Retries the provided function on failure with exponential backoff delays.\n * Backoff formula: 2^attempt * backoffMultiplier (default: 1s, 2s, 4s, etc.)\n *\n * @param fn - Async function to execute\n * @param config - Retry configuration\n * @returns Promise resolving to the function result\n * @throws Last error if all retries exhausted\n *\n * @example\n * ```ts\n * // Basic usage\n * const result = await retryWithBackoff(\n * () => fetch('/api/health'),\n * { maxRetries: 3 }\n * )\n *\n * // With cancellation\n * const controller = new AbortController()\n * const result = await retryWithBackoff(\n * () => fetch('/api/health'),\n * { maxRetries: 3, signal: controller.signal }\n * )\n * // Later: controller.abort()\n *\n * // With retry callback\n * const result = await retryWithBackoff(\n * () => fetch('/api/health'),\n * {\n * maxRetries: 3,\n * onRetry: (error, attempt) => console.log(`Retry ${attempt}: ${error.message}`)\n * }\n * )\n * ```\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n config: RetryConfig = {}\n): Promise<T> {\n const { maxRetries = 3, backoffMultiplier = 1000, signal, onRetry } = config\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n // Check for cancellation before each attempt\n if (signal?.aborted) {\n throw lastError ?? new Error('Retry cancelled')\n }\n\n try {\n return await fn()\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('Retry failed')\n\n // Don't wait after last attempt\n if (attempt < maxRetries - 1) {\n // Notify before retry\n onRetry?.(lastError, attempt + 1)\n\n // Exponential backoff: 2^0 * mult, 2^1 * mult, 2^2 * mult, etc.\n const delay = Math.pow(2, attempt) * backoffMultiplier\n\n // Wait with timeout\n await new Promise<void>((resolve) => setTimeout(resolve, delay))\n\n // Check for cancellation after waiting\n if (signal?.aborted) {\n throw lastError ?? new Error('Retry cancelled')\n }\n }\n }\n }\n\n throw lastError\n}\n"]}