@datatechsolutions/ui 3.6.0 → 3.6.2

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 (131) hide show
  1. package/dist/astrlabe/graph-node.js +8 -5
  2. package/dist/astrlabe/graph-node.mjs +4 -1
  3. package/dist/astrlabe/index.js +115 -114
  4. package/dist/astrlabe/index.mjs +7 -6
  5. package/dist/astrlabe/workflow-canvas.js +7 -6
  6. package/dist/astrlabe/workflow-canvas.mjs +6 -5
  7. package/dist/{chunk-I63NFWIA.mjs → chunk-2OPBUVTQ.mjs} +3 -3
  8. package/dist/{chunk-I63NFWIA.mjs.map → chunk-2OPBUVTQ.mjs.map} +1 -1
  9. package/dist/{chunk-XTXLRQ3H.mjs → chunk-34XRH2FX.mjs} +28 -28
  10. package/dist/chunk-34XRH2FX.mjs.map +1 -0
  11. package/dist/{chunk-QHP2MR2F.js → chunk-3JZGRXSG.js} +4 -4
  12. package/dist/{chunk-QHP2MR2F.js.map → chunk-3JZGRXSG.js.map} +1 -1
  13. package/dist/{chunk-JQYDJ75Q.mjs → chunk-3VYD7QL2.mjs} +3 -3
  14. package/dist/{chunk-JQYDJ75Q.mjs.map → chunk-3VYD7QL2.mjs.map} +1 -1
  15. package/dist/{chunk-MRRFDIUQ.mjs → chunk-4JRMXHPU.mjs} +5 -4
  16. package/dist/chunk-4JRMXHPU.mjs.map +1 -0
  17. package/dist/{chunk-4OFG6POC.mjs → chunk-5LCWQKGQ.mjs} +207 -1128
  18. package/dist/chunk-5LCWQKGQ.mjs.map +1 -0
  19. package/dist/{chunk-W5YCZOXO.js → chunk-7YK4WXHO.js} +79 -78
  20. package/dist/chunk-7YK4WXHO.js.map +1 -0
  21. package/dist/{chunk-YOJIPZ72.js → chunk-BBLBSDPN.js} +9 -9
  22. package/dist/{chunk-YOJIPZ72.js.map → chunk-BBLBSDPN.js.map} +1 -1
  23. package/dist/chunk-BHOT22QL.js +998 -0
  24. package/dist/chunk-BHOT22QL.js.map +1 -0
  25. package/dist/{chunk-DYWSG42B.mjs → chunk-C4AJWDFB.mjs} +11 -10
  26. package/dist/chunk-C4AJWDFB.mjs.map +1 -0
  27. package/dist/{chunk-UOABOFKO.mjs → chunk-CBFK4W4C.mjs} +3 -3
  28. package/dist/{chunk-UOABOFKO.mjs.map → chunk-CBFK4W4C.mjs.map} +1 -1
  29. package/dist/{chunk-P5F257N3.js → chunk-CVZXZK2X.js} +35 -34
  30. package/dist/chunk-CVZXZK2X.js.map +1 -0
  31. package/dist/{chunk-IHHGT3LP.mjs → chunk-CYAAL3BY.mjs} +6 -5
  32. package/dist/chunk-CYAAL3BY.mjs.map +1 -0
  33. package/dist/{chunk-LVK7VXW7.js → chunk-DMPBNWJB.js} +37 -36
  34. package/dist/chunk-DMPBNWJB.js.map +1 -0
  35. package/dist/{chunk-ESLKQJQS.mjs → chunk-DXLATMGD.mjs} +6 -5
  36. package/dist/chunk-DXLATMGD.mjs.map +1 -0
  37. package/dist/{chunk-P4YYEM4B.js → chunk-EZQ2D47U.js} +7 -10
  38. package/dist/chunk-EZQ2D47U.js.map +1 -0
  39. package/dist/{chunk-UWSMHKOF.js → chunk-FUHNEP3Y.js} +164 -163
  40. package/dist/chunk-FUHNEP3Y.js.map +1 -0
  41. package/dist/{chunk-YTE6WCBX.js → chunk-JHN2OUWG.js} +64 -63
  42. package/dist/chunk-JHN2OUWG.js.map +1 -0
  43. package/dist/{chunk-AMYQSPQC.js → chunk-JLECJI7S.js} +18 -17
  44. package/dist/chunk-JLECJI7S.js.map +1 -0
  45. package/dist/{chunk-VPOIX2DY.js → chunk-KMNWPC64.js} +40 -39
  46. package/dist/chunk-KMNWPC64.js.map +1 -0
  47. package/dist/{chunk-VUAGVZJM.mjs → chunk-NJ6HH4QP.mjs} +6 -5
  48. package/dist/chunk-NJ6HH4QP.mjs.map +1 -0
  49. package/dist/{chunk-OZNTQROP.mjs → chunk-PLTLRL2V.mjs} +7 -10
  50. package/dist/chunk-PLTLRL2V.mjs.map +1 -0
  51. package/dist/{chunk-WEZ722BS.mjs → chunk-PMMP76MV.mjs} +7 -6
  52. package/dist/chunk-PMMP76MV.mjs.map +1 -0
  53. package/dist/{chunk-NJZIE4EH.js → chunk-QF6WL7XU.js} +6 -5
  54. package/dist/chunk-QF6WL7XU.js.map +1 -0
  55. package/dist/{chunk-QRNFTG6A.js → chunk-QGLGQXJE.js} +4 -4
  56. package/dist/{chunk-QRNFTG6A.js.map → chunk-QGLGQXJE.js.map} +1 -1
  57. package/dist/{chunk-GCYYGSHU.js → chunk-R4EKPXX3.js} +564 -1525
  58. package/dist/chunk-R4EKPXX3.js.map +1 -0
  59. package/dist/{chunk-S7AV6XEY.js → chunk-RWYG7QHP.js} +128 -138
  60. package/dist/chunk-RWYG7QHP.js.map +1 -0
  61. package/dist/{chunk-WBEZATIB.js → chunk-RZ3NDH5S.js} +13 -13
  62. package/dist/{chunk-WBEZATIB.js.map → chunk-RZ3NDH5S.js.map} +1 -1
  63. package/dist/{chunk-HGWVJ3VB.mjs → chunk-SJVKID3E.mjs} +4 -3
  64. package/dist/chunk-SJVKID3E.mjs.map +1 -0
  65. package/dist/{chunk-7LILNZMR.mjs → chunk-TJEZL72T.mjs} +4 -3
  66. package/dist/chunk-TJEZL72T.mjs.map +1 -0
  67. package/dist/{chunk-3WXMBAGN.js → chunk-UDYEUTJC.js} +50 -50
  68. package/dist/chunk-UDYEUTJC.js.map +1 -0
  69. package/dist/{chunk-UGJZ3M4Q.js → chunk-VDLMWOQM.js} +55 -54
  70. package/dist/chunk-VDLMWOQM.js.map +1 -0
  71. package/dist/{chunk-QTA5I6FC.mjs → chunk-VZIUQE7B.mjs} +54 -64
  72. package/dist/chunk-VZIUQE7B.mjs.map +1 -0
  73. package/dist/chunk-WR55H7DH.mjs +934 -0
  74. package/dist/chunk-WR55H7DH.mjs.map +1 -0
  75. package/dist/{chunk-ZYVDDSAC.mjs → chunk-YRXDETBK.mjs} +6 -6
  76. package/dist/{chunk-ZYVDDSAC.mjs.map → chunk-YRXDETBK.mjs.map} +1 -1
  77. package/dist/{chunk-VDLAZR7S.mjs → chunk-ZYRL3WER.mjs} +5 -4
  78. package/dist/chunk-ZYRL3WER.mjs.map +1 -0
  79. package/dist/index.js +826 -825
  80. package/dist/index.mjs +4 -3
  81. package/dist/platform/admin/index.js +13 -12
  82. package/dist/platform/admin/index.mjs +7 -6
  83. package/dist/platform/agents-workspace.js +10 -9
  84. package/dist/platform/agents-workspace.mjs +9 -8
  85. package/dist/platform/app-shell.js +6 -5
  86. package/dist/platform/app-shell.mjs +5 -4
  87. package/dist/platform/auth/index.js +30 -29
  88. package/dist/platform/auth/index.mjs +7 -6
  89. package/dist/platform/billing/index.js +6 -5
  90. package/dist/platform/billing/index.mjs +5 -4
  91. package/dist/platform/impersonation/index.js +6 -5
  92. package/dist/platform/impersonation/index.mjs +5 -4
  93. package/dist/platform/index.js +87 -93
  94. package/dist/platform/index.js.map +1 -1
  95. package/dist/platform/index.mjs +23 -29
  96. package/dist/platform/index.mjs.map +1 -1
  97. package/dist/platform/pages/index.js +476 -470
  98. package/dist/platform/pages/index.js.map +1 -1
  99. package/dist/platform/pages/index.mjs +326 -320
  100. package/dist/platform/pages/index.mjs.map +1 -1
  101. package/dist/platform/settings/index.js +10 -9
  102. package/dist/platform/settings/index.mjs +9 -8
  103. package/dist/platform/workflow-canvas-shell.js +8 -7
  104. package/dist/platform/workflow-canvas-shell.mjs +7 -6
  105. package/package.json +1 -1
  106. package/dist/chunk-3WXMBAGN.js.map +0 -1
  107. package/dist/chunk-4OFG6POC.mjs.map +0 -1
  108. package/dist/chunk-7LILNZMR.mjs.map +0 -1
  109. package/dist/chunk-AMYQSPQC.js.map +0 -1
  110. package/dist/chunk-DYWSG42B.mjs.map +0 -1
  111. package/dist/chunk-ESLKQJQS.mjs.map +0 -1
  112. package/dist/chunk-GCYYGSHU.js.map +0 -1
  113. package/dist/chunk-HGWVJ3VB.mjs.map +0 -1
  114. package/dist/chunk-IHHGT3LP.mjs.map +0 -1
  115. package/dist/chunk-LVK7VXW7.js.map +0 -1
  116. package/dist/chunk-MRRFDIUQ.mjs.map +0 -1
  117. package/dist/chunk-NJZIE4EH.js.map +0 -1
  118. package/dist/chunk-OZNTQROP.mjs.map +0 -1
  119. package/dist/chunk-P4YYEM4B.js.map +0 -1
  120. package/dist/chunk-P5F257N3.js.map +0 -1
  121. package/dist/chunk-QTA5I6FC.mjs.map +0 -1
  122. package/dist/chunk-S7AV6XEY.js.map +0 -1
  123. package/dist/chunk-UGJZ3M4Q.js.map +0 -1
  124. package/dist/chunk-UWSMHKOF.js.map +0 -1
  125. package/dist/chunk-VDLAZR7S.mjs.map +0 -1
  126. package/dist/chunk-VPOIX2DY.js.map +0 -1
  127. package/dist/chunk-VUAGVZJM.mjs.map +0 -1
  128. package/dist/chunk-W5YCZOXO.js.map +0 -1
  129. package/dist/chunk-WEZ722BS.mjs.map +0 -1
  130. package/dist/chunk-XTXLRQ3H.mjs.map +0 -1
  131. package/dist/chunk-YTE6WCBX.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/platform/session-switcher.tsx","../../src/platform/dock-container.tsx","../../src/hooks/use-locale-switcher.ts","../../src/platform/preferences-controls.tsx","../../src/platform/windsock-mappers.ts","../../src/platform/admin-settings-sections.tsx","../../src/platform/ai-workflow-generate-modal.tsx","../../src/platform/workflow-template-modal.tsx"],"names":["useTranslations","jsxs","jsx","Select","Button","usePathname","useRouter","useAuth","usePlatformPreferences","useState","useMemo","filterByPermission","useCallback","Fragment","AppNavigation","GlassModal","useLocale","applyClientLocale","LOCALE_TO_SHORT","SUPPORTED_LOCALES","LANGUAGE_META","IconButton","SunIcon","MoonIcon","usePlatformState","useNotifications","listUsers","useEffect","UsersPageView","createUser","RolesPageView","addOrganizationMember","listModelProviderConnections","aiGenerateWorkflow","createWorkflow","saveWorkflowDraft","Textarea","listWorkflowTemplates","createWorkflowFromTemplate"],"mappings":"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","file":"index.js","sourcesContent":["import { Select, Button } from '@ui/index'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport type { SessionSwitcherProps } from '@datatechsolutions/shared-domain/common'\n\nexport function SessionSwitcher({\n organizations,\n users,\n organizationId,\n userEmail,\n onOrganizationChange,\n onUserChange,\n}: SessionSwitcherProps) {\n const tSession = useTranslations('platform.session')\n const tCommon = useTranslations('common')\n\n return (\n <div className=\"session-switcher\">\n <Select\n value={organizationId}\n aria-label={tSession('organization')}\n onChange={(event) => {\n onOrganizationChange(event.target.value)\n }}\n options={organizations}\n placeholder={tSession('organization')}\n />\n <Select\n value={userEmail}\n aria-label={tSession('user')}\n onChange={(event) => {\n onUserChange(event.target.value)\n }}\n options={users}\n placeholder={tSession('user')}\n />\n <Button outline onClick={() => globalThis.location.reload()}>\n {tCommon('refresh')}\n </Button>\n </div>\n )\n}\n","import { useMemo, useState, useCallback } from 'react'\nimport { useAuth, usePlatformPreferences } from '../_auth'\nimport type { AuthUser } from '../_auth'\nimport {\n AppNavigation,\n filterByPermission,\n GlassModal,\n type NavigationItem,\n} from '@ui/index'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { usePathname, useRouter } from '@ui/lib/router-context'\n\nexport type PlatformDockContainerProps = {\n /** JWT-derived actor used for permission filtering. */\n actor: AuthUser | null\n /** App-specific navigation items (already translated). */\n navigationItems: NavigationItem[]\n /**\n * Pathname where the dock should be hidden (defaults to `/dashboard`).\n * The dashboard typically owns its own navigation chrome.\n */\n dashboardPath?: string\n /** Path to redirect to on sign-out (defaults to `/login`). */\n signOutPath?: string\n}\n\n/**\n * Floating dock + profile-modal trigger shared by every platform app.\n * Reads the active route from ui's router context and uses windsock for\n * preferences + sign-out, so the consumer only has to wire up navigation\n * items + an optional dashboard/sign-out path.\n */\nexport function PlatformDockContainer({\n actor,\n navigationItems,\n dashboardPath = '/dashboard',\n signOutPath = '/login',\n}: PlatformDockContainerProps) {\n const pathname = usePathname()\n const router = useRouter()\n const { logout } = useAuth()\n const tCommon = useTranslations('common')\n const {\n dockPosition,\n dockAutoHide,\n dockEnabled,\n } = usePlatformPreferences()\n const [profileOpen, setProfileOpen] = useState(false)\n\n const filteredItems = useMemo(\n () => filterByPermission(navigationItems, (actor as { permissions?: string[] } | null)?.permissions ?? []),\n [navigationItems, actor],\n )\n\n const handleNavigate = useCallback((href: string) => router.push(href), [router])\n const handleSignOut = useCallback(() => { void logout(signOutPath) }, [logout, signOutPath])\n\n if (pathname === dashboardPath) return null\n\n return (\n <>\n <AppNavigation\n items={filteredItems}\n pathname={pathname}\n dockEnabled={dockEnabled}\n dockPosition={dockPosition as 'left' | 'right' | 'bottom'}\n dockAutoHide={dockAutoHide}\n showLaunchpad={false}\n onNavigate={handleNavigate}\n onOpenProfile={() => setProfileOpen(true)}\n onSignOut={handleSignOut}\n labels={{\n home: tCommon('home'),\n profile: tCommon('profile'),\n signOut: tCommon('signOut'),\n }}\n />\n <GlassModal\n open={profileOpen}\n onClose={() => setProfileOpen(false)}\n title={tCommon('profile')}\n >\n <div />\n </GlassModal>\n </>\n )\n}\n","import { useCallback } from 'react'\nimport { useAuth as useWindsockAuth } from '../_auth'\nimport type { LocaleCode } from '@datatechsolutions/shared-domain/common'\nimport {\n applyClientLocale,\n LOCALE_TO_SHORT,\n SUPPORTED_LOCALES,\n} from '@datatechsolutions/shared-domain/i18n'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Locale switcher hook — reads the current locale from the i18n context and\n * pushes the user's choice through windsock so the next session inherits it.\n *\n * Lifted from astrlabe; consumers (astrlabe, kori-erp) wrap their tree in\n * `<I18nProvider>` + windsock's `<AuthProvider>` and import this directly.\n */\nexport function useLocaleSwitcher() {\n const locale = useLocale() as LocaleCode\n const { client } = useWindsockAuth()\n\n const setLocale = useCallback(\n (newLocale: LocaleCode | string) => {\n const resolved = applyClientLocale(newLocale)\n client.updateLocale(resolved)\n },\n [client],\n )\n\n return {\n locale,\n shortCode: LOCALE_TO_SHORT[locale] || 'pt',\n setLocale,\n locales: SUPPORTED_LOCALES,\n }\n}\n","import { MoonIcon, SunIcon } from '@heroicons/react/24/outline'\nimport { Select, IconButton } from '@ui/index'\nimport { SUPPORTED_LOCALES, LANGUAGE_META } from '@datatechsolutions/shared-domain/i18n'\nimport { usePlatformPreferences } from '../_auth'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { useLocaleSwitcher } from '@ui/hooks/use-locale-switcher'\n\nconst LOCALE_OPTIONS = SUPPORTED_LOCALES.map((code) => ({\n value: code,\n label: LANGUAGE_META[code].nativeName,\n}))\n\n/**\n * Locale + theme controls used inside the platform preferences drawer.\n * Reads the active locale from the i18n context and the theme/dock\n * preferences from windsock — both shared providers consuming apps must\n * mount above this component.\n */\nexport function PreferencesControls() {\n const { locale, setLocale } = useLocaleSwitcher()\n const { theme, setTheme } = usePlatformPreferences()\n const toggleTheme = () => setTheme(theme === 'dark' ? 'light' : 'dark')\n const t = useTranslations('platform.preferences')\n\n return (\n <div className=\"preferences-controls\">\n <Select\n value={locale}\n options={LOCALE_OPTIONS}\n onChange={(event) => setLocale(event.target.value)}\n />\n <IconButton\n label={t('theme')}\n icon={theme === 'dark' ? <SunIcon /> : <MoonIcon />}\n onClick={toggleTheme}\n variant=\"outline\"\n />\n </div>\n )\n}\n","import type {\n AdminUserSummary,\n AuthOrganization,\n} from '@datatechsolutions/shared-domain'\nimport type { ManagedUser, Organization, UserRole } from '@datatechsolutions/shared-domain/common'\n\n/** Maps a windsock AuthOrganization to the app-level Organization shape used by UI pages. */\nexport function mapAuthOrg(raw: AuthOrganization): Organization {\n return {\n id: raw.id,\n name: raw.displayName ?? raw.name,\n currency: 'BRL',\n country: 'BR',\n } as Organization\n}\n\n/**\n * Maps a windsock AdminUserSummary to the app-level ManagedUser shape.\n * Takes `normalizeRole` as a parameter so each consuming app can plug in\n * the role normalizer produced by its own `createPlatformRbac()` call —\n * we deliberately don't hardcode an app-specific role enum here.\n */\nexport function mapAdminUser(\n row: AdminUserSummary,\n normalizeRole: (input: unknown) => string,\n): ManagedUser {\n return {\n id: row.id,\n email: row.email,\n name: row.name ?? row.email,\n role: normalizeRole(row.role) as UserRole,\n active: row.status === 'active',\n }\n}\n\n/** Maps an app-level UserRole to a windsock AuthOrganizationRole. */\nexport const ORG_ROLE_MAP: Record<string, 'owner' | 'admin' | 'member' | 'viewer'> = {\n owner: 'owner',\n admin: 'admin',\n manager: 'admin',\n analyst: 'member',\n operator: 'member',\n viewer: 'viewer',\n finance: 'member',\n sales: 'member',\n support: 'member',\n member: 'member',\n}\n\nexport function mapRoleToOrgRole(role: string): 'owner' | 'admin' | 'member' | 'viewer' {\n return ORG_ROLE_MAP[role] ?? 'member'\n}\n","import { useEffect, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { useNotifications } from '@ui/components/notifications'\nimport type { ManagedUser } from '@datatechsolutions/shared-domain/common'\nimport {\n listUsers,\n createUser as createUserApi,\n addOrganizationMember,\n} from './windsock-admin-client'\nimport { mapAdminUser, mapRoleToOrgRole } from './windsock-mappers'\nimport { UsersPageView } from './pages/users-page-view'\nimport { RolesPageView } from './pages/roles-page-view'\nimport { usePlatformState } from './platform-state-provider'\nimport type { PlatformRoleDefinition } from './rbac'\n\nexport type UsersSettingsSectionProps = {\n /**\n * Role normalizer produced by each app's `createPlatformRbac()` call.\n * Used to coerce JWT role strings into the app's canonical role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport type RolesSettingsSectionProps = UsersSettingsSectionProps & {\n /** App-defined role definitions (from `createPlatformRbac`). */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /** Display options for the role-assignment select. */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function UsersSettingsSection({ normalizeRole }: UsersSettingsSectionProps) {\n const t = useTranslations('platform.users')\n const { currentOrganizationId } = usePlatformState()\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const [users, setUsers] = useState<ManagedUser[]>([])\n const [loading, setLoading] = useState(true)\n\n const reload = async () => {\n try {\n const result = await listUsers({ organizationId: currentOrganizationId })\n setUsers(result.items.map((row) => mapAdminUser(row, normalizeRole)))\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setLoading(false)\n }\n }\n\n useEffect(() => {\n void reload()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentOrganizationId])\n\n return (\n <UsersPageView\n labels={{\n title: t('title'),\n subtitle: t('subtitle'),\n create: t('create'),\n list: t('list'),\n add: t('add'),\n statusActive: t('statusActive'),\n statusInactive: t('statusInactive'),\n name: t('name'),\n email: t('email'),\n role: t('role'),\n status: t('status'),\n save: t('save'),\n userNamePlaceholder: t('userNamePlaceholder'),\n userEmailPlaceholder: t('userEmailPlaceholder'),\n }}\n users={loading ? [] : users}\n onCreateUser={async ({ name, email, role }) => {\n try {\n await createUserApi({ name, email, role: role as never, organizationId: currentOrganizationId })\n notifySuccess(t('add'))\n await reload()\n } catch (error) {\n notifyError((error as Error).message)\n }\n }}\n onUpdateRole={() => {\n notifyError(t('reassignInRolesTab'))\n }}\n />\n )\n}\n\nexport function RolesSettingsSection({ roleDefinitions, roleOptions, normalizeRole }: RolesSettingsSectionProps) {\n const t = useTranslations('platform.roles')\n const { currentOrganizationId } = usePlatformState()\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const [users, setUsers] = useState<ManagedUser[]>([])\n\n useEffect(() => {\n listUsers({ organizationId: currentOrganizationId })\n .then((result) => setUsers(result.items.map((row) => mapAdminUser(row, normalizeRole))))\n .catch((error: Error) => notifyError(error.message))\n }, [currentOrganizationId, notifyError, normalizeRole])\n\n return (\n <RolesPageView\n roleDefinitions={roleDefinitions}\n roleOptions={roleOptions}\n labels={{\n title: t('title'),\n subtitle: t('subtitle'),\n definitions: t('definitions'),\n assign: t('assign'),\n current: t('current'),\n permissionsEnabled: t('permissionsEnabled'),\n apply: t('apply'),\n role: t('role'),\n description: t('description'),\n user: t('user'),\n email: t('email'),\n userEmail: t('userEmail'),\n }}\n users={users}\n onAssignRole={async ({ email, role }) => {\n const target = users.find((user) => user.email.toLowerCase() === email.toLowerCase())\n if (!target) {\n notifyError(t('userNotFound'))\n return\n }\n try {\n await addOrganizationMember(currentOrganizationId, target.id, mapRoleToOrgRole(role))\n notifySuccess(t('apply'))\n } catch (error) {\n notifyError((error as Error).message)\n }\n }}\n />\n )\n}\n","import { useEffect, useState } from 'react'\nimport { GlassModal, Textarea } from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport type { Workflow } from '@ui/astrlabe/contracts'\nimport {\n aiGenerateWorkflow,\n createWorkflow,\n listModelProviderConnections,\n saveWorkflowDraft,\n type ModelProviderConnection,\n} from './workflow-api-client'\n\ninterface Props {\n open: boolean\n onClose: () => void\n onGenerated: (workflow: Workflow) => void\n}\n\n/**\n * Minimal NL → graph generator surface. Lets the user pick one of the\n * org's model provider connections, enter a prompt, and produces a\n * Workflow row whose `graph` is the LLM's output. The caller navigates\n * the editor to the new workflow once generation succeeds — validation\n * issues are surfaced as notifications so the user can iterate.\n */\nexport function AiWorkflowGenerateModal({ open, onClose, onGenerated }: Props) {\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const t = useTranslations('agents.workflow')\n const [connections, setConnections] = useState<ModelProviderConnection[]>([])\n const [connectionId, setConnectionId] = useState('')\n const [prompt, setPrompt] = useState('')\n const [busy, setBusy] = useState(false)\n\n useEffect(() => {\n if (!open) return\n listModelProviderConnections()\n .then((items) => {\n setConnections(items)\n const firstEnabled = items.find((item) => item.enabled) ?? items[0]\n setConnectionId(firstEnabled?.id ?? '')\n })\n .catch((error: Error) => notifyError(error.message))\n }, [open, notifyError])\n\n async function handleSubmit() {\n if (!connectionId) { notifyError(t('aiErrorMissingConnection')); return }\n if (prompt.trim().length === 0) { notifyError(t('aiErrorMissingPrompt')); return }\n setBusy(true)\n try {\n const generation = await aiGenerateWorkflow({ prompt: prompt.trim(), connectionId })\n const workflow = await createWorkflow({ name: deriveWorkflowName(prompt) })\n const saved = await saveWorkflowDraft(workflow.id, generation.graph, { name: workflow.name })\n if (!generation.ok) {\n notifyError(\n t('aiWarnValidation'),\n [...generation.structuralIssues, ...generation.nodeIssues.map((issue) => `${issue.nodeId}: ${issue.message}`)].join('\\n'),\n )\n } else {\n notifySuccess(t('aiSuccessGenerated'))\n }\n onGenerated(saved)\n onClose()\n setPrompt('')\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={t('aiTitle')}\n subtitle={t('aiSubtitle')}\n onSubmit={handleSubmit}\n showFormFooter\n submitLabel={busy ? t('aiGenerateBusy') : t('aiGenerate')}\n cancelLabel={t('aiCancel')}\n submitDisabled={busy}\n isLoading={busy}\n >\n <div className=\"space-y-4\">\n <label className=\"block text-sm font-medium text-slate-700 dark:text-slate-200\">\n {t('aiConnection')}\n <select\n className=\"mt-1 w-full rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 dark:border-white/10 dark:bg-white/5 dark:text-slate-100\"\n value={connectionId}\n onChange={(event) => setConnectionId(event.target.value)}\n disabled={busy}\n >\n <option value=\"\">{t('aiConnectionPlaceholder')}</option>\n {connections.map((connection) => (\n <option key={connection.id} value={connection.id}>\n {connection.name} {connection.enabled ? '' : t('aiDisabledSuffix')}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block text-sm font-medium text-slate-700 dark:text-slate-200\">\n {t('aiPromptLabel')}\n <Textarea\n rows={6}\n className=\"mt-1 w-full\"\n placeholder={t('aiPromptPlaceholder')}\n value={prompt}\n onChange={(event) => setPrompt(event.target.value)}\n disabled={busy}\n />\n </label>\n\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('aiFooterNote')}\n </p>\n </div>\n </GlassModal>\n )\n}\n\nfunction deriveWorkflowName(prompt: string): string {\n const trimmed = prompt.trim().replace(/\\s+/g, ' ')\n if (trimmed.length <= 60) return trimmed\n return `${trimmed.slice(0, 57)}…`\n}\n","/**\n * WorkflowTemplateModal\n * =====================\n *\n * Lets the user instantiate a pre-built workflow template (e.g. the\n * product-pricing dashboard flow) from the workflows list page. The template\n * requires a `connectionId` that references one of the org's\n * `model_provider_connections` rows — we load the list on open so the\n * picker is always fresh.\n *\n * Why not inline in `workflows-page-client.tsx`? Two reasons:\n * 1. Keeps the modal focused: one component, one responsibility.\n * 2. Makes the flow testable end-to-end without mounting the whole page.\n */\n\n'use client'\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { GlassModal } from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n createWorkflowFromTemplate,\n listModelProviderConnections,\n listWorkflowTemplates,\n type ModelProviderConnection,\n type WorkflowTemplateSummary,\n} from './workflow-api-client'\nimport type { Workflow } from '@ui/astrlabe/contracts'\n\nexport interface WorkflowTemplateModalProps {\n open: boolean\n onClose: () => void\n onCreated: (workflow: Workflow) => void\n}\n\nexport function WorkflowTemplateModal({ open, onClose, onCreated }: WorkflowTemplateModalProps) {\n const tWorkflow = useTranslations('agents.workflow')\n const tCommon = useTranslations('common')\n const { error: notifyError, success: notifySuccess } = useNotifications()\n\n const [templates, setTemplates] = useState<WorkflowTemplateSummary[]>([])\n const [connections, setConnections] = useState<ModelProviderConnection[]>([])\n const [templateId, setTemplateId] = useState<string>('')\n const [connectionId, setConnectionId] = useState<string>('')\n const [name, setName] = useState<string>('')\n const [isLoading, setIsLoading] = useState(false)\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n // Load templates + connections when the modal opens. Clear prior state so\n // reopening feels fresh.\n useEffect(() => {\n if (!open) return\n let cancelled = false\n setIsLoading(true)\n setTemplateId('')\n setConnectionId('')\n setName('')\n ;(async () => {\n try {\n const [tpls, conns] = await Promise.all([\n listWorkflowTemplates(),\n listModelProviderConnections(),\n ])\n if (cancelled) return\n setTemplates(tpls)\n setConnections(conns)\n if (tpls.length > 0) {\n const firstTemplate = tpls[0]\n if (firstTemplate) setTemplateId(firstTemplate.id)\n }\n if (conns.length > 0) {\n const firstConnection = conns[0]\n if (firstConnection) setConnectionId(firstConnection.id)\n }\n } catch (error) {\n if (!cancelled) notifyError((error as Error).message)\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n })()\n return () => {\n cancelled = true\n }\n }, [open, notifyError])\n\n const selectedTemplate = useMemo(\n () => templates.find((t) => t.id === templateId),\n [templates, templateId],\n )\n\n const canSubmit =\n !isLoading && !isSubmitting && templateId.length > 0 && connectionId.length > 0\n\n const handleSubmit = useCallback(async () => {\n if (!canSubmit) return\n setIsSubmitting(true)\n try {\n const created = await createWorkflowFromTemplate(templateId, {\n connectionId,\n name: name.trim().length > 0 ? name.trim() : undefined,\n })\n notifySuccess(tWorkflow('templateCreatedSuccess'))\n onCreated(created)\n onClose()\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setIsSubmitting(false)\n }\n }, [canSubmit, templateId, connectionId, name, onCreated, onClose, notifySuccess, notifyError, tWorkflow])\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={tWorkflow('createFromTemplate')}\n subtitle={selectedTemplate?.description ?? tWorkflow('createFromTemplateSubtitle')}\n gradient=\"from-indigo-500 to-purple-600\"\n showFormFooter\n onSubmit={(event) => {\n event.preventDefault()\n void handleSubmit()\n }}\n isLoading={isSubmitting}\n submitDisabled={!canSubmit}\n submitLabel={tCommon('create')}\n cancelLabel={tCommon('cancel')}\n maxWidth=\"lg\"\n >\n <div className=\"space-y-4\">\n {isLoading ? (\n <div className=\"shimmer h-32 w-full rounded-xl\" />\n ) : templates.length === 0 ? (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {tWorkflow('noTemplatesAvailable')}\n </p>\n ) : (\n <>\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('template')}\n </span>\n <select\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n value={templateId}\n onChange={(event) => setTemplateId(event.target.value)}\n >\n {templates.map((template) => (\n <option key={template.id} value={template.id}>\n {template.name}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('llmConnection')}\n </span>\n {connections.length === 0 ? (\n <p className=\"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200\">\n {tWorkflow('noConnectionsHint')}\n </p>\n ) : (\n <select\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n value={connectionId}\n onChange={(event) => setConnectionId(event.target.value)}\n >\n {connections.map((connection) => (\n <option key={connection.id} value={connection.id}>\n {connection.name}\n {connection.providerSlug ? ` · ${connection.providerSlug}` : ''}\n </option>\n ))}\n </select>\n )}\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('workflowName')}\n <span className=\"ml-1 text-[10px] text-gray-400\">\n ({tCommon('optional')})\n </span>\n </span>\n <input\n type=\"text\"\n value={name}\n placeholder={selectedTemplate?.name ?? ''}\n onChange={(event) => setName(event.target.value)}\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n />\n </label>\n\n {selectedTemplate && selectedTemplate.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {selectedTemplate.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-indigo-500/10 px-2 py-0.5 text-[10px] font-medium text-indigo-600 dark:bg-indigo-500/20 dark:text-indigo-300\"\n >\n {tag}\n </span>\n ))}\n </div>\n ) : null}\n </>\n )}\n </div>\n </GlassModal>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/platform/session-switcher.tsx","../../src/platform/dock-container.tsx","../../src/hooks/use-locale-switcher.ts","../../src/platform/preferences-controls.tsx","../../src/platform/windsock-mappers.ts","../../src/platform/admin-settings-sections.tsx","../../src/platform/ai-workflow-generate-modal.tsx","../../src/platform/workflow-template-modal.tsx"],"names":["useTranslations","jsxs","jsx","Select","Button","usePathname","useRouter","useAuth","usePlatformPreferences","useState","useMemo","filterByPermission","useCallback","Fragment","AppNavigation","GlassModal","useLocale","applyClientLocale","LOCALE_TO_SHORT","SUPPORTED_LOCALES","LANGUAGE_META","IconButton","SunIcon","MoonIcon","usePlatformState","useNotifications","listUsers","useEffect","UsersPageView","createUser","RolesPageView","addOrganizationMember","listModelProviderConnections","aiGenerateWorkflow","createWorkflow","saveWorkflowDraft","Textarea","listWorkflowTemplates","createWorkflowFromTemplate","Badge"],"mappings":"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","file":"index.js","sourcesContent":["import { Select, Button } from '@ui/index'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport type { SessionSwitcherProps } from '@datatechsolutions/shared-domain/common'\n\nexport function SessionSwitcher({\n organizations,\n users,\n organizationId,\n userEmail,\n onOrganizationChange,\n onUserChange,\n}: SessionSwitcherProps) {\n const tSession = useTranslations('platform.session')\n const tCommon = useTranslations('common')\n\n return (\n <div className=\"session-switcher\">\n <Select\n value={organizationId}\n aria-label={tSession('organization')}\n onChange={(event) => {\n onOrganizationChange(event.target.value)\n }}\n options={organizations}\n placeholder={tSession('organization')}\n />\n <Select\n value={userEmail}\n aria-label={tSession('user')}\n onChange={(event) => {\n onUserChange(event.target.value)\n }}\n options={users}\n placeholder={tSession('user')}\n />\n <Button outline onClick={() => globalThis.location.reload()}>\n {tCommon('refresh')}\n </Button>\n </div>\n )\n}\n","import { useMemo, useState, useCallback } from 'react'\nimport { useAuth, usePlatformPreferences } from '../_auth'\nimport type { AuthUser } from '../_auth'\nimport {\n AppNavigation,\n filterByPermission,\n GlassModal,\n type NavigationItem,\n} from '@ui/index'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { usePathname, useRouter } from '@ui/lib/router-context'\n\nexport type PlatformDockContainerProps = {\n /** JWT-derived actor used for permission filtering. */\n actor: AuthUser | null\n /** App-specific navigation items (already translated). */\n navigationItems: NavigationItem[]\n /**\n * Pathname where the dock should be hidden (defaults to `/dashboard`).\n * The dashboard typically owns its own navigation chrome.\n */\n dashboardPath?: string\n /** Path to redirect to on sign-out (defaults to `/login`). */\n signOutPath?: string\n}\n\n/**\n * Floating dock + profile-modal trigger shared by every platform app.\n * Reads the active route from ui's router context and uses windsock for\n * preferences + sign-out, so the consumer only has to wire up navigation\n * items + an optional dashboard/sign-out path.\n */\nexport function PlatformDockContainer({\n actor,\n navigationItems,\n dashboardPath = '/dashboard',\n signOutPath = '/login',\n}: PlatformDockContainerProps) {\n const pathname = usePathname()\n const router = useRouter()\n const { logout } = useAuth()\n const tCommon = useTranslations('common')\n const {\n dockPosition,\n dockAutoHide,\n dockEnabled,\n } = usePlatformPreferences()\n const [profileOpen, setProfileOpen] = useState(false)\n\n const filteredItems = useMemo(\n () => filterByPermission(navigationItems, (actor as { permissions?: string[] } | null)?.permissions ?? []),\n [navigationItems, actor],\n )\n\n const handleNavigate = useCallback((href: string) => router.push(href), [router])\n const handleSignOut = useCallback(() => { void logout(signOutPath) }, [logout, signOutPath])\n\n if (pathname === dashboardPath) return null\n\n return (\n <>\n <AppNavigation\n items={filteredItems}\n pathname={pathname}\n dockEnabled={dockEnabled}\n dockPosition={dockPosition as 'left' | 'right' | 'bottom'}\n dockAutoHide={dockAutoHide}\n showLaunchpad={false}\n onNavigate={handleNavigate}\n onOpenProfile={() => setProfileOpen(true)}\n onSignOut={handleSignOut}\n labels={{\n home: tCommon('home'),\n profile: tCommon('profile'),\n signOut: tCommon('signOut'),\n }}\n />\n <GlassModal\n open={profileOpen}\n onClose={() => setProfileOpen(false)}\n title={tCommon('profile')}\n >\n <div />\n </GlassModal>\n </>\n )\n}\n","import { useCallback } from 'react'\nimport { useAuth as useWindsockAuth } from '../_auth'\nimport type { LocaleCode } from '@datatechsolutions/shared-domain/common'\nimport {\n applyClientLocale,\n LOCALE_TO_SHORT,\n SUPPORTED_LOCALES,\n} from '@datatechsolutions/shared-domain/i18n'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Locale switcher hook — reads the current locale from the i18n context and\n * pushes the user's choice through windsock so the next session inherits it.\n *\n * Lifted from astrlabe; consumers (astrlabe, kori-erp) wrap their tree in\n * `<I18nProvider>` + windsock's `<AuthProvider>` and import this directly.\n */\nexport function useLocaleSwitcher() {\n const locale = useLocale() as LocaleCode\n const { client } = useWindsockAuth()\n\n const setLocale = useCallback(\n (newLocale: LocaleCode | string) => {\n const resolved = applyClientLocale(newLocale)\n client.updateLocale(resolved)\n },\n [client],\n )\n\n return {\n locale,\n shortCode: LOCALE_TO_SHORT[locale] || 'pt',\n setLocale,\n locales: SUPPORTED_LOCALES,\n }\n}\n","import { MoonIcon, SunIcon } from '@heroicons/react/24/outline'\nimport { Select, IconButton } from '@ui/index'\nimport { SUPPORTED_LOCALES, LANGUAGE_META } from '@datatechsolutions/shared-domain/i18n'\nimport { usePlatformPreferences } from '../_auth'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { useLocaleSwitcher } from '@ui/hooks/use-locale-switcher'\n\nconst LOCALE_OPTIONS = SUPPORTED_LOCALES.map((code) => ({\n value: code,\n label: LANGUAGE_META[code].nativeName,\n}))\n\n/**\n * Locale + theme controls used inside the platform preferences drawer.\n * Reads the active locale from the i18n context and the theme/dock\n * preferences from windsock — both shared providers consuming apps must\n * mount above this component.\n */\nexport function PreferencesControls() {\n const { locale, setLocale } = useLocaleSwitcher()\n const { theme, setTheme } = usePlatformPreferences()\n const toggleTheme = () => setTheme(theme === 'dark' ? 'light' : 'dark')\n const t = useTranslations('platform.preferences')\n\n return (\n <div className=\"preferences-controls\">\n <Select\n value={locale}\n options={LOCALE_OPTIONS}\n onChange={(event) => setLocale(event.target.value)}\n />\n <IconButton\n label={t('theme')}\n icon={theme === 'dark' ? <SunIcon /> : <MoonIcon />}\n onClick={toggleTheme}\n variant=\"outline\"\n />\n </div>\n )\n}\n","import type {\n AdminUserSummary,\n AuthOrganization,\n} from '@datatechsolutions/shared-domain'\nimport type { ManagedUser, Organization, UserRole } from '@datatechsolutions/shared-domain/common'\n\n/** Maps a windsock AuthOrganization to the app-level Organization shape used by UI pages. */\nexport function mapAuthOrg(raw: AuthOrganization): Organization {\n return {\n id: raw.id,\n name: raw.displayName ?? raw.name,\n currency: 'BRL',\n country: 'BR',\n } as Organization\n}\n\n/**\n * Maps a windsock AdminUserSummary to the app-level ManagedUser shape.\n * Takes `normalizeRole` as a parameter so each consuming app can plug in\n * the role normalizer produced by its own `createPlatformRbac()` call —\n * we deliberately don't hardcode an app-specific role enum here.\n */\nexport function mapAdminUser(\n row: AdminUserSummary,\n normalizeRole: (input: unknown) => string,\n): ManagedUser {\n return {\n id: row.id,\n email: row.email,\n name: row.name ?? row.email,\n role: normalizeRole(row.role) as UserRole,\n active: row.status === 'active',\n }\n}\n\n/** Maps an app-level UserRole to a windsock AuthOrganizationRole. */\nexport const ORG_ROLE_MAP: Record<string, 'owner' | 'admin' | 'member' | 'viewer'> = {\n owner: 'owner',\n admin: 'admin',\n manager: 'admin',\n analyst: 'member',\n operator: 'member',\n viewer: 'viewer',\n finance: 'member',\n sales: 'member',\n support: 'member',\n member: 'member',\n}\n\nexport function mapRoleToOrgRole(role: string): 'owner' | 'admin' | 'member' | 'viewer' {\n return ORG_ROLE_MAP[role] ?? 'member'\n}\n","import { useEffect, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { useNotifications } from '@ui/components/notifications'\nimport type { ManagedUser } from '@datatechsolutions/shared-domain/common'\nimport {\n listUsers,\n createUser as createUserApi,\n addOrganizationMember,\n} from './windsock-admin-client'\nimport { mapAdminUser, mapRoleToOrgRole } from './windsock-mappers'\nimport { UsersPageView } from './pages/users-page-view'\nimport { RolesPageView } from './pages/roles-page-view'\nimport { usePlatformState } from './platform-state-provider'\nimport type { PlatformRoleDefinition } from './rbac'\n\nexport type UsersSettingsSectionProps = {\n /**\n * Role normalizer produced by each app's `createPlatformRbac()` call.\n * Used to coerce JWT role strings into the app's canonical role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport type RolesSettingsSectionProps = UsersSettingsSectionProps & {\n /** App-defined role definitions (from `createPlatformRbac`). */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /** Display options for the role-assignment select. */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function UsersSettingsSection({ normalizeRole }: UsersSettingsSectionProps) {\n const t = useTranslations('platform.users')\n const { currentOrganizationId } = usePlatformState()\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const [users, setUsers] = useState<ManagedUser[]>([])\n const [loading, setLoading] = useState(true)\n\n const reload = async () => {\n try {\n const result = await listUsers({ organizationId: currentOrganizationId })\n setUsers(result.items.map((row) => mapAdminUser(row, normalizeRole)))\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setLoading(false)\n }\n }\n\n useEffect(() => {\n void reload()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentOrganizationId])\n\n return (\n <UsersPageView\n labels={{\n title: t('title'),\n subtitle: t('subtitle'),\n create: t('create'),\n list: t('list'),\n add: t('add'),\n statusActive: t('statusActive'),\n statusInactive: t('statusInactive'),\n name: t('name'),\n email: t('email'),\n role: t('role'),\n status: t('status'),\n save: t('save'),\n userNamePlaceholder: t('userNamePlaceholder'),\n userEmailPlaceholder: t('userEmailPlaceholder'),\n }}\n users={loading ? [] : users}\n onCreateUser={async ({ name, email, role }) => {\n try {\n await createUserApi({ name, email, role: role as never, organizationId: currentOrganizationId })\n notifySuccess(t('add'))\n await reload()\n } catch (error) {\n notifyError((error as Error).message)\n }\n }}\n onUpdateRole={() => {\n notifyError(t('reassignInRolesTab'))\n }}\n />\n )\n}\n\nexport function RolesSettingsSection({ roleDefinitions, roleOptions, normalizeRole }: RolesSettingsSectionProps) {\n const t = useTranslations('platform.roles')\n const { currentOrganizationId } = usePlatformState()\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const [users, setUsers] = useState<ManagedUser[]>([])\n\n useEffect(() => {\n listUsers({ organizationId: currentOrganizationId })\n .then((result) => setUsers(result.items.map((row) => mapAdminUser(row, normalizeRole))))\n .catch((error: Error) => notifyError(error.message))\n }, [currentOrganizationId, notifyError, normalizeRole])\n\n return (\n <RolesPageView\n roleDefinitions={roleDefinitions}\n roleOptions={roleOptions}\n labels={{\n title: t('title'),\n subtitle: t('subtitle'),\n definitions: t('definitions'),\n assign: t('assign'),\n current: t('current'),\n permissionsEnabled: t('permissionsEnabled'),\n apply: t('apply'),\n role: t('role'),\n description: t('description'),\n user: t('user'),\n email: t('email'),\n userEmail: t('userEmail'),\n }}\n users={users}\n onAssignRole={async ({ email, role }) => {\n const target = users.find((user) => user.email.toLowerCase() === email.toLowerCase())\n if (!target) {\n notifyError(t('userNotFound'))\n return\n }\n try {\n await addOrganizationMember(currentOrganizationId, target.id, mapRoleToOrgRole(role))\n notifySuccess(t('apply'))\n } catch (error) {\n notifyError((error as Error).message)\n }\n }}\n />\n )\n}\n","import { useEffect, useState } from 'react'\nimport { GlassModal, Textarea } from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport type { Workflow } from '@ui/astrlabe/contracts'\nimport {\n aiGenerateWorkflow,\n createWorkflow,\n listModelProviderConnections,\n saveWorkflowDraft,\n type ModelProviderConnection,\n} from './workflow-api-client'\n\ninterface Props {\n open: boolean\n onClose: () => void\n onGenerated: (workflow: Workflow) => void\n}\n\n/**\n * Minimal NL → graph generator surface. Lets the user pick one of the\n * org's model provider connections, enter a prompt, and produces a\n * Workflow row whose `graph` is the LLM's output. The caller navigates\n * the editor to the new workflow once generation succeeds — validation\n * issues are surfaced as notifications so the user can iterate.\n */\nexport function AiWorkflowGenerateModal({ open, onClose, onGenerated }: Props) {\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const t = useTranslations('agents.workflow')\n const [connections, setConnections] = useState<ModelProviderConnection[]>([])\n const [connectionId, setConnectionId] = useState('')\n const [prompt, setPrompt] = useState('')\n const [busy, setBusy] = useState(false)\n\n useEffect(() => {\n if (!open) return\n listModelProviderConnections()\n .then((items) => {\n setConnections(items)\n const firstEnabled = items.find((item) => item.enabled) ?? items[0]\n setConnectionId(firstEnabled?.id ?? '')\n })\n .catch((error: Error) => notifyError(error.message))\n }, [open, notifyError])\n\n async function handleSubmit() {\n if (!connectionId) { notifyError(t('aiErrorMissingConnection')); return }\n if (prompt.trim().length === 0) { notifyError(t('aiErrorMissingPrompt')); return }\n setBusy(true)\n try {\n const generation = await aiGenerateWorkflow({ prompt: prompt.trim(), connectionId })\n const workflow = await createWorkflow({ name: deriveWorkflowName(prompt) })\n const saved = await saveWorkflowDraft(workflow.id, generation.graph, { name: workflow.name })\n if (!generation.ok) {\n notifyError(\n t('aiWarnValidation'),\n [...generation.structuralIssues, ...generation.nodeIssues.map((issue) => `${issue.nodeId}: ${issue.message}`)].join('\\n'),\n )\n } else {\n notifySuccess(t('aiSuccessGenerated'))\n }\n onGenerated(saved)\n onClose()\n setPrompt('')\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={t('aiTitle')}\n subtitle={t('aiSubtitle')}\n onSubmit={handleSubmit}\n showFormFooter\n submitLabel={busy ? t('aiGenerateBusy') : t('aiGenerate')}\n cancelLabel={t('aiCancel')}\n submitDisabled={busy}\n isLoading={busy}\n >\n <div className=\"space-y-4\">\n <label className=\"block text-sm font-medium text-slate-700 dark:text-slate-200\">\n {t('aiConnection')}\n <select\n className=\"mt-1 w-full rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 dark:border-white/10 dark:bg-white/5 dark:text-slate-100\"\n value={connectionId}\n onChange={(event) => setConnectionId(event.target.value)}\n disabled={busy}\n >\n <option value=\"\">{t('aiConnectionPlaceholder')}</option>\n {connections.map((connection) => (\n <option key={connection.id} value={connection.id}>\n {connection.name} {connection.enabled ? '' : t('aiDisabledSuffix')}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block text-sm font-medium text-slate-700 dark:text-slate-200\">\n {t('aiPromptLabel')}\n <Textarea\n rows={6}\n className=\"mt-1 w-full\"\n placeholder={t('aiPromptPlaceholder')}\n value={prompt}\n onChange={(event) => setPrompt(event.target.value)}\n disabled={busy}\n />\n </label>\n\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('aiFooterNote')}\n </p>\n </div>\n </GlassModal>\n )\n}\n\nfunction deriveWorkflowName(prompt: string): string {\n const trimmed = prompt.trim().replace(/\\s+/g, ' ')\n if (trimmed.length <= 60) return trimmed\n return `${trimmed.slice(0, 57)}…`\n}\n","/**\n * WorkflowTemplateModal\n * =====================\n *\n * Lets the user instantiate a pre-built workflow template (e.g. the\n * product-pricing dashboard flow) from the workflows list page. The template\n * requires a `connectionId` that references one of the org's\n * `model_provider_connections` rows — we load the list on open so the\n * picker is always fresh.\n *\n * Why not inline in `workflows-page-client.tsx`? Two reasons:\n * 1. Keeps the modal focused: one component, one responsibility.\n * 2. Makes the flow testable end-to-end without mounting the whole page.\n */\n\n'use client'\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { GlassModal } from '@ui/index'\nimport { Badge } from '@ui/components/badge'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n createWorkflowFromTemplate,\n listModelProviderConnections,\n listWorkflowTemplates,\n type ModelProviderConnection,\n type WorkflowTemplateSummary,\n} from './workflow-api-client'\nimport type { Workflow } from '@ui/astrlabe/contracts'\n\nexport interface WorkflowTemplateModalProps {\n open: boolean\n onClose: () => void\n onCreated: (workflow: Workflow) => void\n}\n\nexport function WorkflowTemplateModal({ open, onClose, onCreated }: WorkflowTemplateModalProps) {\n const tWorkflow = useTranslations('agents.workflow')\n const tCommon = useTranslations('common')\n const { error: notifyError, success: notifySuccess } = useNotifications()\n\n const [templates, setTemplates] = useState<WorkflowTemplateSummary[]>([])\n const [connections, setConnections] = useState<ModelProviderConnection[]>([])\n const [templateId, setTemplateId] = useState<string>('')\n const [connectionId, setConnectionId] = useState<string>('')\n const [name, setName] = useState<string>('')\n const [isLoading, setIsLoading] = useState(false)\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n // Load templates + connections when the modal opens. Clear prior state so\n // reopening feels fresh.\n useEffect(() => {\n if (!open) return\n let cancelled = false\n setIsLoading(true)\n setTemplateId('')\n setConnectionId('')\n setName('')\n ;(async () => {\n try {\n const [tpls, conns] = await Promise.all([\n listWorkflowTemplates(),\n listModelProviderConnections(),\n ])\n if (cancelled) return\n setTemplates(tpls)\n setConnections(conns)\n if (tpls.length > 0) {\n const firstTemplate = tpls[0]\n if (firstTemplate) setTemplateId(firstTemplate.id)\n }\n if (conns.length > 0) {\n const firstConnection = conns[0]\n if (firstConnection) setConnectionId(firstConnection.id)\n }\n } catch (error) {\n if (!cancelled) notifyError((error as Error).message)\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n })()\n return () => {\n cancelled = true\n }\n }, [open, notifyError])\n\n const selectedTemplate = useMemo(\n () => templates.find((t) => t.id === templateId),\n [templates, templateId],\n )\n\n const canSubmit =\n !isLoading && !isSubmitting && templateId.length > 0 && connectionId.length > 0\n\n const handleSubmit = useCallback(async () => {\n if (!canSubmit) return\n setIsSubmitting(true)\n try {\n const created = await createWorkflowFromTemplate(templateId, {\n connectionId,\n name: name.trim().length > 0 ? name.trim() : undefined,\n })\n notifySuccess(tWorkflow('templateCreatedSuccess'))\n onCreated(created)\n onClose()\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setIsSubmitting(false)\n }\n }, [canSubmit, templateId, connectionId, name, onCreated, onClose, notifySuccess, notifyError, tWorkflow])\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={tWorkflow('createFromTemplate')}\n subtitle={selectedTemplate?.description ?? tWorkflow('createFromTemplateSubtitle')}\n gradient=\"from-indigo-500 to-purple-600\"\n showFormFooter\n onSubmit={(event) => {\n event.preventDefault()\n void handleSubmit()\n }}\n isLoading={isSubmitting}\n submitDisabled={!canSubmit}\n submitLabel={tCommon('create')}\n cancelLabel={tCommon('cancel')}\n maxWidth=\"lg\"\n >\n <div className=\"space-y-4\">\n {isLoading ? (\n <div className=\"shimmer h-32 w-full rounded-xl\" />\n ) : templates.length === 0 ? (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {tWorkflow('noTemplatesAvailable')}\n </p>\n ) : (\n <>\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('template')}\n </span>\n <select\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n value={templateId}\n onChange={(event) => setTemplateId(event.target.value)}\n >\n {templates.map((template) => (\n <option key={template.id} value={template.id}>\n {template.name}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('llmConnection')}\n </span>\n {connections.length === 0 ? (\n <p className=\"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200\">\n {tWorkflow('noConnectionsHint')}\n </p>\n ) : (\n <select\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n value={connectionId}\n onChange={(event) => setConnectionId(event.target.value)}\n >\n {connections.map((connection) => (\n <option key={connection.id} value={connection.id}>\n {connection.name}\n {connection.providerSlug ? ` · ${connection.providerSlug}` : ''}\n </option>\n ))}\n </select>\n )}\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('workflowName')}\n <span className=\"ml-1 text-[10px] text-gray-400\">\n ({tCommon('optional')})\n </span>\n </span>\n <input\n type=\"text\"\n value={name}\n placeholder={selectedTemplate?.name ?? ''}\n onChange={(event) => setName(event.target.value)}\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n />\n </label>\n\n {selectedTemplate && selectedTemplate.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {selectedTemplate.tags.map((tag) => (\n <Badge key={tag} color=\"indigo\" size=\"xs\">{tag}</Badge>\n ))}\n </div>\n ) : null}\n </>\n )}\n </div>\n </GlassModal>\n )\n}\n"]}
@@ -1,34 +1,35 @@
1
1
  "use client";
2
- export { WorkflowCanvasShell } from '../chunk-I63NFWIA.mjs';
3
- export { AdminOrganizationForm, AdminOrganizationList, AdminPermissionList, AdminUserForm, AdminUserList } from '../chunk-ESLKQJQS.mjs';
4
- export { ConsentScreen, ForgotPassword, MfaChallenge, PasswordlessSignIn, ResetPassword, SignIn, SignUp, SsoConnectorList, SsoEmailForm, UserButton, VerifyEmail } from '../chunk-VUAGVZJM.mjs';
2
+ export { WorkflowCanvasShell } from '../chunk-2OPBUVTQ.mjs';
3
+ export { AdminOrganizationForm, AdminOrganizationList, AdminPermissionList, AdminUserForm, AdminUserList } from '../chunk-DXLATMGD.mjs';
4
+ export { ConsentScreen, ForgotPassword, MfaChallenge, PasswordlessSignIn, ResetPassword, SignIn, SignUp, SsoConnectorList, SsoEmailForm, UserButton, VerifyEmail } from '../chunk-NJ6HH4QP.mjs';
5
5
  export { UpgradePrompt } from '../chunk-DJ33CSGJ.mjs';
6
- export { ImpersonationBanner } from '../chunk-7LILNZMR.mjs';
7
- import { UsersPageView, RolesPageView } from '../chunk-XTXLRQ3H.mjs';
8
- export { WorkflowWorkspace } from '../chunk-XTXLRQ3H.mjs';
9
- export { PlatformSettings } from '../chunk-ZYVDDSAC.mjs';
10
- export { AdminOrganizationDetail } from '../chunk-MRRFDIUQ.mjs';
11
- export { LinkedAccountsTabContent, MfaManage, MfaSetup, ProfileTabContent, SecurityTabContent, SessionsTabContent, UserProfile } from '../chunk-IHHGT3LP.mjs';
12
- export { AuthLayout, BackupCodeGrid, OtpInput, PasswordStrengthMeter, SocialLoginButtons } from '../chunk-JQYDJ75Q.mjs';
13
- export { BillingPanel } from '../chunk-VDLAZR7S.mjs';
14
- export { AgentsWorkspace, applyWorkflowExecutionEventToStore, resetWorkflowRunPresentation, useRunEvents, useWorkflowExecution, useWorkflowRunPresentation } from '../chunk-WEZ722BS.mjs';
15
- import '../chunk-HGWVJ3VB.mjs';
16
- import { usePlatformState } from '../chunk-UOABOFKO.mjs';
17
- export { PlatformAppShell, PlatformStateProvider, usePlatformState } from '../chunk-UOABOFKO.mjs';
6
+ export { ImpersonationBanner } from '../chunk-TJEZL72T.mjs';
7
+ import { UsersPageView, RolesPageView } from '../chunk-34XRH2FX.mjs';
8
+ export { WorkflowWorkspace } from '../chunk-34XRH2FX.mjs';
9
+ export { PlatformSettings } from '../chunk-YRXDETBK.mjs';
10
+ export { AdminOrganizationDetail } from '../chunk-4JRMXHPU.mjs';
11
+ export { LinkedAccountsTabContent, MfaManage, MfaSetup, ProfileTabContent, SecurityTabContent, SessionsTabContent, UserProfile } from '../chunk-CYAAL3BY.mjs';
12
+ export { AuthLayout, BackupCodeGrid, OtpInput, PasswordStrengthMeter, SocialLoginButtons } from '../chunk-3VYD7QL2.mjs';
13
+ export { BillingPanel } from '../chunk-ZYRL3WER.mjs';
14
+ export { AgentsWorkspace, applyWorkflowExecutionEventToStore, resetWorkflowRunPresentation, useRunEvents, useWorkflowExecution, useWorkflowRunPresentation } from '../chunk-PMMP76MV.mjs';
15
+ import '../chunk-SJVKID3E.mjs';
16
+ import { usePlatformState } from '../chunk-CBFK4W4C.mjs';
17
+ export { PlatformAppShell, PlatformStateProvider, usePlatformState } from '../chunk-CBFK4W4C.mjs';
18
18
  export { createPlatformRbac } from '../chunk-BUDZNAKL.mjs';
19
19
  import { createUser, listUsers, addOrganizationMember } from '../chunk-UHHPBREK.mjs';
20
20
  export { addOrganizationDomain, addOrganizationMember, createOrganization, createOrganizationInvitation, createPermission, createSecret, createUser, deleteOrganization, deletePermission, deleteUser, disableSecret, getSecret, getUserPermissions, listOrganizationDomains, listOrganizationInvitations, listOrganizationMembers, listOrganizations, listPermissions, listSecrets, listUsers, removeOrganizationMember, resetUserPassword, rotateSecret, setUserPermissions, setWindsockAdminClient, updateOrganization, updatePermission, updateUser, verifyOrganizationDomain } from '../chunk-UHHPBREK.mjs';
21
- import '../chunk-DYWSG42B.mjs';
21
+ import '../chunk-C4AJWDFB.mjs';
22
22
  import '../chunk-JB6RNAD2.mjs';
23
23
  import '../chunk-LEXBTVGM.mjs';
24
- import '../chunk-QTA5I6FC.mjs';
25
- import { Select, Button, useAuth, usePlatformPreferences, filterByPermission, AppNavigation, GlassModal, IconButton, useNotifications, Textarea } from '../chunk-4OFG6POC.mjs';
26
- import '../chunk-D2JF6C3E.mjs';
24
+ import '../chunk-VZIUQE7B.mjs';
25
+ import { Select, useAuth, usePlatformPreferences, filterByPermission, AppNavigation, GlassModal, useNotifications, Textarea } from '../chunk-5LCWQKGQ.mjs';
27
26
  import { useTranslations, useLocale } from '../chunk-7VJ7CMMT.mjs';
28
- import { usePathname, useRouter } from '../chunk-QWG2FMUN.mjs';
29
27
  import { listModelProviderConnections, listWorkflowTemplates, createWorkflowFromTemplate, aiGenerateWorkflow, createWorkflow, saveWorkflowDraft } from '../chunk-RHRJXK5R.mjs';
30
28
  import '../chunk-3AY5HIQ6.mjs';
31
- import '../chunk-OZNTQROP.mjs';
29
+ import '../chunk-PLTLRL2V.mjs';
30
+ import { Button, IconButton, Badge } from '../chunk-WR55H7DH.mjs';
31
+ import '../chunk-D2JF6C3E.mjs';
32
+ import { usePathname, useRouter } from '../chunk-QWG2FMUN.mjs';
32
33
  import '../chunk-G7JQ4OCE.mjs';
33
34
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
34
35
  import { useState, useMemo, useCallback, useEffect } from 'react';
@@ -544,14 +545,7 @@ function WorkflowTemplateModal({ open, onClose, onCreated }) {
544
545
  }
545
546
  )
546
547
  ] }),
547
- selectedTemplate && selectedTemplate.tags.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: selectedTemplate.tags.map((tag) => /* @__PURE__ */ jsx(
548
- "span",
549
- {
550
- className: "rounded-full bg-indigo-500/10 px-2 py-0.5 text-[10px] font-medium text-indigo-600 dark:bg-indigo-500/20 dark:text-indigo-300",
551
- children: tag
552
- },
553
- tag
554
- )) }) : null
548
+ selectedTemplate && selectedTemplate.tags.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: selectedTemplate.tags.map((tag) => /* @__PURE__ */ jsx(Badge, { color: "indigo", size: "xs", children: tag }, tag)) }) : null
555
549
  ] }) })
556
550
  }
557
551
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/platform/session-switcher.tsx","../../src/platform/dock-container.tsx","../../src/hooks/use-locale-switcher.ts","../../src/platform/preferences-controls.tsx","../../src/platform/windsock-mappers.ts","../../src/platform/admin-settings-sections.tsx","../../src/platform/ai-workflow-generate-modal.tsx","../../src/platform/workflow-template-modal.tsx"],"names":["jsxs","jsx","useCallback","SUPPORTED_LOCALES","useState","useEffect","useMemo","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["import { Select, Button } from '@ui/index'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport type { SessionSwitcherProps } from '@datatechsolutions/shared-domain/common'\n\nexport function SessionSwitcher({\n organizations,\n users,\n organizationId,\n userEmail,\n onOrganizationChange,\n onUserChange,\n}: SessionSwitcherProps) {\n const tSession = useTranslations('platform.session')\n const tCommon = useTranslations('common')\n\n return (\n <div className=\"session-switcher\">\n <Select\n value={organizationId}\n aria-label={tSession('organization')}\n onChange={(event) => {\n onOrganizationChange(event.target.value)\n }}\n options={organizations}\n placeholder={tSession('organization')}\n />\n <Select\n value={userEmail}\n aria-label={tSession('user')}\n onChange={(event) => {\n onUserChange(event.target.value)\n }}\n options={users}\n placeholder={tSession('user')}\n />\n <Button outline onClick={() => globalThis.location.reload()}>\n {tCommon('refresh')}\n </Button>\n </div>\n )\n}\n","import { useMemo, useState, useCallback } from 'react'\nimport { useAuth, usePlatformPreferences } from '../_auth'\nimport type { AuthUser } from '../_auth'\nimport {\n AppNavigation,\n filterByPermission,\n GlassModal,\n type NavigationItem,\n} from '@ui/index'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { usePathname, useRouter } from '@ui/lib/router-context'\n\nexport type PlatformDockContainerProps = {\n /** JWT-derived actor used for permission filtering. */\n actor: AuthUser | null\n /** App-specific navigation items (already translated). */\n navigationItems: NavigationItem[]\n /**\n * Pathname where the dock should be hidden (defaults to `/dashboard`).\n * The dashboard typically owns its own navigation chrome.\n */\n dashboardPath?: string\n /** Path to redirect to on sign-out (defaults to `/login`). */\n signOutPath?: string\n}\n\n/**\n * Floating dock + profile-modal trigger shared by every platform app.\n * Reads the active route from ui's router context and uses windsock for\n * preferences + sign-out, so the consumer only has to wire up navigation\n * items + an optional dashboard/sign-out path.\n */\nexport function PlatformDockContainer({\n actor,\n navigationItems,\n dashboardPath = '/dashboard',\n signOutPath = '/login',\n}: PlatformDockContainerProps) {\n const pathname = usePathname()\n const router = useRouter()\n const { logout } = useAuth()\n const tCommon = useTranslations('common')\n const {\n dockPosition,\n dockAutoHide,\n dockEnabled,\n } = usePlatformPreferences()\n const [profileOpen, setProfileOpen] = useState(false)\n\n const filteredItems = useMemo(\n () => filterByPermission(navigationItems, (actor as { permissions?: string[] } | null)?.permissions ?? []),\n [navigationItems, actor],\n )\n\n const handleNavigate = useCallback((href: string) => router.push(href), [router])\n const handleSignOut = useCallback(() => { void logout(signOutPath) }, [logout, signOutPath])\n\n if (pathname === dashboardPath) return null\n\n return (\n <>\n <AppNavigation\n items={filteredItems}\n pathname={pathname}\n dockEnabled={dockEnabled}\n dockPosition={dockPosition as 'left' | 'right' | 'bottom'}\n dockAutoHide={dockAutoHide}\n showLaunchpad={false}\n onNavigate={handleNavigate}\n onOpenProfile={() => setProfileOpen(true)}\n onSignOut={handleSignOut}\n labels={{\n home: tCommon('home'),\n profile: tCommon('profile'),\n signOut: tCommon('signOut'),\n }}\n />\n <GlassModal\n open={profileOpen}\n onClose={() => setProfileOpen(false)}\n title={tCommon('profile')}\n >\n <div />\n </GlassModal>\n </>\n )\n}\n","import { useCallback } from 'react'\nimport { useAuth as useWindsockAuth } from '../_auth'\nimport type { LocaleCode } from '@datatechsolutions/shared-domain/common'\nimport {\n applyClientLocale,\n LOCALE_TO_SHORT,\n SUPPORTED_LOCALES,\n} from '@datatechsolutions/shared-domain/i18n'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Locale switcher hook — reads the current locale from the i18n context and\n * pushes the user's choice through windsock so the next session inherits it.\n *\n * Lifted from astrlabe; consumers (astrlabe, kori-erp) wrap their tree in\n * `<I18nProvider>` + windsock's `<AuthProvider>` and import this directly.\n */\nexport function useLocaleSwitcher() {\n const locale = useLocale() as LocaleCode\n const { client } = useWindsockAuth()\n\n const setLocale = useCallback(\n (newLocale: LocaleCode | string) => {\n const resolved = applyClientLocale(newLocale)\n client.updateLocale(resolved)\n },\n [client],\n )\n\n return {\n locale,\n shortCode: LOCALE_TO_SHORT[locale] || 'pt',\n setLocale,\n locales: SUPPORTED_LOCALES,\n }\n}\n","import { MoonIcon, SunIcon } from '@heroicons/react/24/outline'\nimport { Select, IconButton } from '@ui/index'\nimport { SUPPORTED_LOCALES, LANGUAGE_META } from '@datatechsolutions/shared-domain/i18n'\nimport { usePlatformPreferences } from '../_auth'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { useLocaleSwitcher } from '@ui/hooks/use-locale-switcher'\n\nconst LOCALE_OPTIONS = SUPPORTED_LOCALES.map((code) => ({\n value: code,\n label: LANGUAGE_META[code].nativeName,\n}))\n\n/**\n * Locale + theme controls used inside the platform preferences drawer.\n * Reads the active locale from the i18n context and the theme/dock\n * preferences from windsock — both shared providers consuming apps must\n * mount above this component.\n */\nexport function PreferencesControls() {\n const { locale, setLocale } = useLocaleSwitcher()\n const { theme, setTheme } = usePlatformPreferences()\n const toggleTheme = () => setTheme(theme === 'dark' ? 'light' : 'dark')\n const t = useTranslations('platform.preferences')\n\n return (\n <div className=\"preferences-controls\">\n <Select\n value={locale}\n options={LOCALE_OPTIONS}\n onChange={(event) => setLocale(event.target.value)}\n />\n <IconButton\n label={t('theme')}\n icon={theme === 'dark' ? <SunIcon /> : <MoonIcon />}\n onClick={toggleTheme}\n variant=\"outline\"\n />\n </div>\n )\n}\n","import type {\n AdminUserSummary,\n AuthOrganization,\n} from '@datatechsolutions/shared-domain'\nimport type { ManagedUser, Organization, UserRole } from '@datatechsolutions/shared-domain/common'\n\n/** Maps a windsock AuthOrganization to the app-level Organization shape used by UI pages. */\nexport function mapAuthOrg(raw: AuthOrganization): Organization {\n return {\n id: raw.id,\n name: raw.displayName ?? raw.name,\n currency: 'BRL',\n country: 'BR',\n } as Organization\n}\n\n/**\n * Maps a windsock AdminUserSummary to the app-level ManagedUser shape.\n * Takes `normalizeRole` as a parameter so each consuming app can plug in\n * the role normalizer produced by its own `createPlatformRbac()` call —\n * we deliberately don't hardcode an app-specific role enum here.\n */\nexport function mapAdminUser(\n row: AdminUserSummary,\n normalizeRole: (input: unknown) => string,\n): ManagedUser {\n return {\n id: row.id,\n email: row.email,\n name: row.name ?? row.email,\n role: normalizeRole(row.role) as UserRole,\n active: row.status === 'active',\n }\n}\n\n/** Maps an app-level UserRole to a windsock AuthOrganizationRole. */\nexport const ORG_ROLE_MAP: Record<string, 'owner' | 'admin' | 'member' | 'viewer'> = {\n owner: 'owner',\n admin: 'admin',\n manager: 'admin',\n analyst: 'member',\n operator: 'member',\n viewer: 'viewer',\n finance: 'member',\n sales: 'member',\n support: 'member',\n member: 'member',\n}\n\nexport function mapRoleToOrgRole(role: string): 'owner' | 'admin' | 'member' | 'viewer' {\n return ORG_ROLE_MAP[role] ?? 'member'\n}\n","import { useEffect, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { useNotifications } from '@ui/components/notifications'\nimport type { ManagedUser } from '@datatechsolutions/shared-domain/common'\nimport {\n listUsers,\n createUser as createUserApi,\n addOrganizationMember,\n} from './windsock-admin-client'\nimport { mapAdminUser, mapRoleToOrgRole } from './windsock-mappers'\nimport { UsersPageView } from './pages/users-page-view'\nimport { RolesPageView } from './pages/roles-page-view'\nimport { usePlatformState } from './platform-state-provider'\nimport type { PlatformRoleDefinition } from './rbac'\n\nexport type UsersSettingsSectionProps = {\n /**\n * Role normalizer produced by each app's `createPlatformRbac()` call.\n * Used to coerce JWT role strings into the app's canonical role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport type RolesSettingsSectionProps = UsersSettingsSectionProps & {\n /** App-defined role definitions (from `createPlatformRbac`). */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /** Display options for the role-assignment select. */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function UsersSettingsSection({ normalizeRole }: UsersSettingsSectionProps) {\n const t = useTranslations('platform.users')\n const { currentOrganizationId } = usePlatformState()\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const [users, setUsers] = useState<ManagedUser[]>([])\n const [loading, setLoading] = useState(true)\n\n const reload = async () => {\n try {\n const result = await listUsers({ organizationId: currentOrganizationId })\n setUsers(result.items.map((row) => mapAdminUser(row, normalizeRole)))\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setLoading(false)\n }\n }\n\n useEffect(() => {\n void reload()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentOrganizationId])\n\n return (\n <UsersPageView\n labels={{\n title: t('title'),\n subtitle: t('subtitle'),\n create: t('create'),\n list: t('list'),\n add: t('add'),\n statusActive: t('statusActive'),\n statusInactive: t('statusInactive'),\n name: t('name'),\n email: t('email'),\n role: t('role'),\n status: t('status'),\n save: t('save'),\n userNamePlaceholder: t('userNamePlaceholder'),\n userEmailPlaceholder: t('userEmailPlaceholder'),\n }}\n users={loading ? [] : users}\n onCreateUser={async ({ name, email, role }) => {\n try {\n await createUserApi({ name, email, role: role as never, organizationId: currentOrganizationId })\n notifySuccess(t('add'))\n await reload()\n } catch (error) {\n notifyError((error as Error).message)\n }\n }}\n onUpdateRole={() => {\n notifyError(t('reassignInRolesTab'))\n }}\n />\n )\n}\n\nexport function RolesSettingsSection({ roleDefinitions, roleOptions, normalizeRole }: RolesSettingsSectionProps) {\n const t = useTranslations('platform.roles')\n const { currentOrganizationId } = usePlatformState()\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const [users, setUsers] = useState<ManagedUser[]>([])\n\n useEffect(() => {\n listUsers({ organizationId: currentOrganizationId })\n .then((result) => setUsers(result.items.map((row) => mapAdminUser(row, normalizeRole))))\n .catch((error: Error) => notifyError(error.message))\n }, [currentOrganizationId, notifyError, normalizeRole])\n\n return (\n <RolesPageView\n roleDefinitions={roleDefinitions}\n roleOptions={roleOptions}\n labels={{\n title: t('title'),\n subtitle: t('subtitle'),\n definitions: t('definitions'),\n assign: t('assign'),\n current: t('current'),\n permissionsEnabled: t('permissionsEnabled'),\n apply: t('apply'),\n role: t('role'),\n description: t('description'),\n user: t('user'),\n email: t('email'),\n userEmail: t('userEmail'),\n }}\n users={users}\n onAssignRole={async ({ email, role }) => {\n const target = users.find((user) => user.email.toLowerCase() === email.toLowerCase())\n if (!target) {\n notifyError(t('userNotFound'))\n return\n }\n try {\n await addOrganizationMember(currentOrganizationId, target.id, mapRoleToOrgRole(role))\n notifySuccess(t('apply'))\n } catch (error) {\n notifyError((error as Error).message)\n }\n }}\n />\n )\n}\n","import { useEffect, useState } from 'react'\nimport { GlassModal, Textarea } from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport type { Workflow } from '@ui/astrlabe/contracts'\nimport {\n aiGenerateWorkflow,\n createWorkflow,\n listModelProviderConnections,\n saveWorkflowDraft,\n type ModelProviderConnection,\n} from './workflow-api-client'\n\ninterface Props {\n open: boolean\n onClose: () => void\n onGenerated: (workflow: Workflow) => void\n}\n\n/**\n * Minimal NL → graph generator surface. Lets the user pick one of the\n * org's model provider connections, enter a prompt, and produces a\n * Workflow row whose `graph` is the LLM's output. The caller navigates\n * the editor to the new workflow once generation succeeds — validation\n * issues are surfaced as notifications so the user can iterate.\n */\nexport function AiWorkflowGenerateModal({ open, onClose, onGenerated }: Props) {\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const t = useTranslations('agents.workflow')\n const [connections, setConnections] = useState<ModelProviderConnection[]>([])\n const [connectionId, setConnectionId] = useState('')\n const [prompt, setPrompt] = useState('')\n const [busy, setBusy] = useState(false)\n\n useEffect(() => {\n if (!open) return\n listModelProviderConnections()\n .then((items) => {\n setConnections(items)\n const firstEnabled = items.find((item) => item.enabled) ?? items[0]\n setConnectionId(firstEnabled?.id ?? '')\n })\n .catch((error: Error) => notifyError(error.message))\n }, [open, notifyError])\n\n async function handleSubmit() {\n if (!connectionId) { notifyError(t('aiErrorMissingConnection')); return }\n if (prompt.trim().length === 0) { notifyError(t('aiErrorMissingPrompt')); return }\n setBusy(true)\n try {\n const generation = await aiGenerateWorkflow({ prompt: prompt.trim(), connectionId })\n const workflow = await createWorkflow({ name: deriveWorkflowName(prompt) })\n const saved = await saveWorkflowDraft(workflow.id, generation.graph, { name: workflow.name })\n if (!generation.ok) {\n notifyError(\n t('aiWarnValidation'),\n [...generation.structuralIssues, ...generation.nodeIssues.map((issue) => `${issue.nodeId}: ${issue.message}`)].join('\\n'),\n )\n } else {\n notifySuccess(t('aiSuccessGenerated'))\n }\n onGenerated(saved)\n onClose()\n setPrompt('')\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={t('aiTitle')}\n subtitle={t('aiSubtitle')}\n onSubmit={handleSubmit}\n showFormFooter\n submitLabel={busy ? t('aiGenerateBusy') : t('aiGenerate')}\n cancelLabel={t('aiCancel')}\n submitDisabled={busy}\n isLoading={busy}\n >\n <div className=\"space-y-4\">\n <label className=\"block text-sm font-medium text-slate-700 dark:text-slate-200\">\n {t('aiConnection')}\n <select\n className=\"mt-1 w-full rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 dark:border-white/10 dark:bg-white/5 dark:text-slate-100\"\n value={connectionId}\n onChange={(event) => setConnectionId(event.target.value)}\n disabled={busy}\n >\n <option value=\"\">{t('aiConnectionPlaceholder')}</option>\n {connections.map((connection) => (\n <option key={connection.id} value={connection.id}>\n {connection.name} {connection.enabled ? '' : t('aiDisabledSuffix')}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block text-sm font-medium text-slate-700 dark:text-slate-200\">\n {t('aiPromptLabel')}\n <Textarea\n rows={6}\n className=\"mt-1 w-full\"\n placeholder={t('aiPromptPlaceholder')}\n value={prompt}\n onChange={(event) => setPrompt(event.target.value)}\n disabled={busy}\n />\n </label>\n\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('aiFooterNote')}\n </p>\n </div>\n </GlassModal>\n )\n}\n\nfunction deriveWorkflowName(prompt: string): string {\n const trimmed = prompt.trim().replace(/\\s+/g, ' ')\n if (trimmed.length <= 60) return trimmed\n return `${trimmed.slice(0, 57)}…`\n}\n","/**\n * WorkflowTemplateModal\n * =====================\n *\n * Lets the user instantiate a pre-built workflow template (e.g. the\n * product-pricing dashboard flow) from the workflows list page. The template\n * requires a `connectionId` that references one of the org's\n * `model_provider_connections` rows — we load the list on open so the\n * picker is always fresh.\n *\n * Why not inline in `workflows-page-client.tsx`? Two reasons:\n * 1. Keeps the modal focused: one component, one responsibility.\n * 2. Makes the flow testable end-to-end without mounting the whole page.\n */\n\n'use client'\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { GlassModal } from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n createWorkflowFromTemplate,\n listModelProviderConnections,\n listWorkflowTemplates,\n type ModelProviderConnection,\n type WorkflowTemplateSummary,\n} from './workflow-api-client'\nimport type { Workflow } from '@ui/astrlabe/contracts'\n\nexport interface WorkflowTemplateModalProps {\n open: boolean\n onClose: () => void\n onCreated: (workflow: Workflow) => void\n}\n\nexport function WorkflowTemplateModal({ open, onClose, onCreated }: WorkflowTemplateModalProps) {\n const tWorkflow = useTranslations('agents.workflow')\n const tCommon = useTranslations('common')\n const { error: notifyError, success: notifySuccess } = useNotifications()\n\n const [templates, setTemplates] = useState<WorkflowTemplateSummary[]>([])\n const [connections, setConnections] = useState<ModelProviderConnection[]>([])\n const [templateId, setTemplateId] = useState<string>('')\n const [connectionId, setConnectionId] = useState<string>('')\n const [name, setName] = useState<string>('')\n const [isLoading, setIsLoading] = useState(false)\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n // Load templates + connections when the modal opens. Clear prior state so\n // reopening feels fresh.\n useEffect(() => {\n if (!open) return\n let cancelled = false\n setIsLoading(true)\n setTemplateId('')\n setConnectionId('')\n setName('')\n ;(async () => {\n try {\n const [tpls, conns] = await Promise.all([\n listWorkflowTemplates(),\n listModelProviderConnections(),\n ])\n if (cancelled) return\n setTemplates(tpls)\n setConnections(conns)\n if (tpls.length > 0) {\n const firstTemplate = tpls[0]\n if (firstTemplate) setTemplateId(firstTemplate.id)\n }\n if (conns.length > 0) {\n const firstConnection = conns[0]\n if (firstConnection) setConnectionId(firstConnection.id)\n }\n } catch (error) {\n if (!cancelled) notifyError((error as Error).message)\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n })()\n return () => {\n cancelled = true\n }\n }, [open, notifyError])\n\n const selectedTemplate = useMemo(\n () => templates.find((t) => t.id === templateId),\n [templates, templateId],\n )\n\n const canSubmit =\n !isLoading && !isSubmitting && templateId.length > 0 && connectionId.length > 0\n\n const handleSubmit = useCallback(async () => {\n if (!canSubmit) return\n setIsSubmitting(true)\n try {\n const created = await createWorkflowFromTemplate(templateId, {\n connectionId,\n name: name.trim().length > 0 ? name.trim() : undefined,\n })\n notifySuccess(tWorkflow('templateCreatedSuccess'))\n onCreated(created)\n onClose()\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setIsSubmitting(false)\n }\n }, [canSubmit, templateId, connectionId, name, onCreated, onClose, notifySuccess, notifyError, tWorkflow])\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={tWorkflow('createFromTemplate')}\n subtitle={selectedTemplate?.description ?? tWorkflow('createFromTemplateSubtitle')}\n gradient=\"from-indigo-500 to-purple-600\"\n showFormFooter\n onSubmit={(event) => {\n event.preventDefault()\n void handleSubmit()\n }}\n isLoading={isSubmitting}\n submitDisabled={!canSubmit}\n submitLabel={tCommon('create')}\n cancelLabel={tCommon('cancel')}\n maxWidth=\"lg\"\n >\n <div className=\"space-y-4\">\n {isLoading ? (\n <div className=\"shimmer h-32 w-full rounded-xl\" />\n ) : templates.length === 0 ? (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {tWorkflow('noTemplatesAvailable')}\n </p>\n ) : (\n <>\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('template')}\n </span>\n <select\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n value={templateId}\n onChange={(event) => setTemplateId(event.target.value)}\n >\n {templates.map((template) => (\n <option key={template.id} value={template.id}>\n {template.name}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('llmConnection')}\n </span>\n {connections.length === 0 ? (\n <p className=\"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200\">\n {tWorkflow('noConnectionsHint')}\n </p>\n ) : (\n <select\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n value={connectionId}\n onChange={(event) => setConnectionId(event.target.value)}\n >\n {connections.map((connection) => (\n <option key={connection.id} value={connection.id}>\n {connection.name}\n {connection.providerSlug ? ` · ${connection.providerSlug}` : ''}\n </option>\n ))}\n </select>\n )}\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('workflowName')}\n <span className=\"ml-1 text-[10px] text-gray-400\">\n ({tCommon('optional')})\n </span>\n </span>\n <input\n type=\"text\"\n value={name}\n placeholder={selectedTemplate?.name ?? ''}\n onChange={(event) => setName(event.target.value)}\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n />\n </label>\n\n {selectedTemplate && selectedTemplate.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {selectedTemplate.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-indigo-500/10 px-2 py-0.5 text-[10px] font-medium text-indigo-600 dark:bg-indigo-500/20 dark:text-indigo-300\"\n >\n {tag}\n </span>\n ))}\n </div>\n ) : null}\n </>\n )}\n </div>\n </GlassModal>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/platform/session-switcher.tsx","../../src/platform/dock-container.tsx","../../src/hooks/use-locale-switcher.ts","../../src/platform/preferences-controls.tsx","../../src/platform/windsock-mappers.ts","../../src/platform/admin-settings-sections.tsx","../../src/platform/ai-workflow-generate-modal.tsx","../../src/platform/workflow-template-modal.tsx"],"names":["jsxs","jsx","useCallback","SUPPORTED_LOCALES","useState","useEffect","useMemo","Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,eAAA,CAAgB;AAAA,EAC9B,aAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,QAAA,GAAW,gBAAgB,kBAAkB,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,gBAAgB,QAAQ,CAAA;AAExC,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,cAAA;AAAA,QACP,YAAA,EAAY,SAAS,cAAc,CAAA;AAAA,QACnC,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,oBAAA,CAAqB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QACzC,CAAA;AAAA,QACA,OAAA,EAAS,aAAA;AAAA,QACT,WAAA,EAAa,SAAS,cAAc;AAAA;AAAA,KACtC;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,SAAA;AAAA,QACP,YAAA,EAAY,SAAS,MAAM,CAAA;AAAA,QAC3B,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,YAAA,CAAa,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QACjC,CAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,SAAS,MAAM;AAAA;AAAA,KAC9B;AAAA,oBACA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAO,IAAA,EAAC,OAAA,EAAS,MAAM,UAAA,CAAW,QAAA,CAAS,MAAA,EAAO,EACvD,QAAA,EAAA,OAAA,CAAQ,SAAS,CAAA,EACpB;AAAA,GAAA,EACF,CAAA;AAEJ;ACRO,SAAS,qBAAA,CAAsB;AAAA,EACpC,KAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA,GAAgB,YAAA;AAAA,EAChB,WAAA,GAAc;AAChB,CAAA,EAA+B;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,OAAA,EAAQ;AAC3B,EAAA,MAAM,OAAA,GAAU,gBAAgB,QAAQ,CAAA;AACxC,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,MACE,sBAAA,EAAuB;AAC3B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MAAM,kBAAA,CAAmB,eAAA,EAAkB,KAAA,EAA6C,WAAA,IAAe,EAAE,CAAA;AAAA,IACzG,CAAC,iBAAiB,KAAK;AAAA,GACzB;AAEA,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,CAAC,IAAA,KAAiB,MAAA,CAAO,KAAK,IAAI,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAChF,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AAAE,IAAA,KAAK,OAAO,WAAW,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAE3F,EAAA,IAAI,QAAA,KAAa,eAAe,OAAO,IAAA;AAEvC,EAAA,uBACEA,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,aAAA;AAAA,QACP,QAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA,EAAe,KAAA;AAAA,QACf,UAAA,EAAY,cAAA;AAAA,QACZ,aAAA,EAAe,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,QACxC,SAAA,EAAW,aAAA;AAAA,QACX,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,QAAQ,MAAM,CAAA;AAAA,UACpB,OAAA,EAAS,QAAQ,SAAS,CAAA;AAAA,UAC1B,OAAA,EAAS,QAAQ,SAAS;AAAA;AAC5B;AAAA,KACF;AAAA,oBACAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,QACnC,KAAA,EAAO,QAAQ,SAAS,CAAA;AAAA,QAExB,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI;AAAA;AAAA;AACP,GAAA,EACF,CAAA;AAEJ;ACrEO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,OAAA,EAAgB;AAEnC,EAAA,MAAM,SAAA,GAAYC,WAAAA;AAAA,IAChB,CAAC,SAAA,KAAmC;AAClC,MAAA,MAAM,QAAA,GAAW,kBAAkB,SAAS,CAAA;AAC5C,MAAA,MAAA,CAAO,aAAa,QAAQ,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA,EAAW,eAAA,CAAgB,MAAM,CAAA,IAAK,IAAA;AAAA,IACtC,SAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AACF;AC5BA,IAAM,cAAA,GAAiBC,iBAAAA,CAAkB,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,EACtD,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,aAAA,CAAc,IAAI,CAAA,CAAE;AAC7B,CAAA,CAAE,CAAA;AAQK,SAAS,mBAAA,GAAsB;AACpC,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,iBAAA,EAAkB;AAChD,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,sBAAA,EAAuB;AACnD,EAAA,MAAM,cAAc,MAAM,QAAA,CAAS,KAAA,KAAU,MAAA,GAAS,UAAU,MAAM,CAAA;AACtE,EAAA,MAAM,CAAA,GAAI,gBAAgB,sBAAsB,CAAA;AAEhD,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS,cAAA;AAAA,QACT,UAAU,CAAC,KAAA,KAAU,SAAA,CAAU,KAAA,CAAM,OAAO,KAAK;AAAA;AAAA,KACnD;AAAA,oBACAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,QAChB,IAAA,EAAM,UAAU,MAAA,mBAASA,IAAC,OAAA,EAAA,EAAQ,CAAA,mBAAKA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAAA,QACjD,OAAA,EAAS,WAAA;AAAA,QACT,OAAA,EAAQ;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;;;AChCO,SAAS,WAAW,GAAA,EAAqC;AAC9D,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,IAAA,EAAM,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,IAAA;AAAA,IAC7B,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AACF;AAQO,SAAS,YAAA,CACd,KACA,aAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,IAAA,EAAM,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,KAAA;AAAA,IACtB,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,IAC5B,MAAA,EAAQ,IAAI,MAAA,KAAW;AAAA,GACzB;AACF;AAGO,IAAM,YAAA,GAAwE;AAAA,EACnF,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA,EACT,KAAA,EAAO,QAAA;AAAA,EACP,OAAA,EAAS,QAAA;AAAA,EACT,MAAA,EAAQ;AACV;AAEO,SAAS,iBAAiB,IAAA,EAAuD;AACtF,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,QAAA;AAC/B;ACrBO,SAAS,oBAAA,CAAqB,EAAE,aAAA,EAAc,EAA8B;AACjF,EAAA,MAAM,CAAA,GAAI,gBAAgB,gBAAgB,CAAA;AAC1C,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,gBAAA,EAAiB;AACnD,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,aAAA,KAAkB,gBAAA,EAAiB;AACxE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,QAAAA,CAAwB,EAAE,CAAA;AACpD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAE3C,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,SAAA,CAAU,EAAE,cAAA,EAAgB,uBAAuB,CAAA;AACxE,MAAA,QAAA,CAAS,MAAA,CAAO,MAAM,GAAA,CAAI,CAAC,QAAQ,YAAA,CAAa,GAAA,EAAK,aAAa,CAAC,CAAC,CAAA;AAAA,IACtE,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAa,MAAgB,OAAO,CAAA;AAAA,IACtC,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,KAAK,MAAA,EAAO;AAAA,EAEd,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAA,uBACEH,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,QAChB,QAAA,EAAU,EAAE,UAAU,CAAA;AAAA,QACtB,MAAA,EAAQ,EAAE,QAAQ,CAAA;AAAA,QAClB,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,QACd,GAAA,EAAK,EAAE,KAAK,CAAA;AAAA,QACZ,YAAA,EAAc,EAAE,cAAc,CAAA;AAAA,QAC9B,cAAA,EAAgB,EAAE,gBAAgB,CAAA;AAAA,QAClC,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,QACd,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,QAChB,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,QACd,MAAA,EAAQ,EAAE,QAAQ,CAAA;AAAA,QAClB,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,QACd,mBAAA,EAAqB,EAAE,qBAAqB,CAAA;AAAA,QAC5C,oBAAA,EAAsB,EAAE,sBAAsB;AAAA,OAChD;AAAA,MACA,KAAA,EAAO,OAAA,GAAU,EAAC,GAAI,KAAA;AAAA,MACtB,cAAc,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAK,KAAM;AAC7C,QAAA,IAAI;AACF,UAAA,MAAM,WAAc,EAAE,IAAA,EAAM,OAAO,IAAA,EAAqB,cAAA,EAAgB,uBAAuB,CAAA;AAC/F,UAAA,aAAA,CAAc,CAAA,CAAE,KAAK,CAAC,CAAA;AACtB,UAAA,MAAM,MAAA,EAAO;AAAA,QACf,SAAS,KAAA,EAAO;AACd,UAAA,WAAA,CAAa,MAAgB,OAAO,CAAA;AAAA,QACtC;AAAA,MACF,CAAA;AAAA,MACA,cAAc,MAAM;AAClB,QAAA,WAAA,CAAY,CAAA,CAAE,oBAAoB,CAAC,CAAA;AAAA,MACrC;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,oBAAA,CAAqB,EAAE,eAAA,EAAiB,WAAA,EAAa,eAAc,EAA8B;AAC/G,EAAA,MAAM,CAAA,GAAI,gBAAgB,gBAAgB,CAAA;AAC1C,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,gBAAA,EAAiB;AACnD,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,aAAA,KAAkB,gBAAA,EAAiB;AACxE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,QAAAA,CAAwB,EAAE,CAAA;AAEpD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,EAAE,cAAA,EAAgB,qBAAA,EAAuB,CAAA,CAChD,IAAA,CAAK,CAAC,MAAA,KAAW,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,YAAA,CAAa,GAAA,EAAK,aAAa,CAAC,CAAC,CAAC,CAAA,CACtF,KAAA,CAAM,CAAC,KAAA,KAAiB,WAAA,CAAY,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,qBAAA,EAAuB,WAAA,EAAa,aAAa,CAAC,CAAA;AAEtD,EAAA,uBACEH,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,eAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,QAChB,QAAA,EAAU,EAAE,UAAU,CAAA;AAAA,QACtB,WAAA,EAAa,EAAE,aAAa,CAAA;AAAA,QAC5B,MAAA,EAAQ,EAAE,QAAQ,CAAA;AAAA,QAClB,OAAA,EAAS,EAAE,SAAS,CAAA;AAAA,QACpB,kBAAA,EAAoB,EAAE,oBAAoB,CAAA;AAAA,QAC1C,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,QAChB,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,QACd,WAAA,EAAa,EAAE,aAAa,CAAA;AAAA,QAC5B,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,QACd,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,QAChB,SAAA,EAAW,EAAE,WAAW;AAAA,OAC1B;AAAA,MACA,KAAA;AAAA,MACA,YAAA,EAAc,OAAO,EAAE,KAAA,EAAO,MAAK,KAAM;AACvC,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY,KAAM,KAAA,CAAM,WAAA,EAAa,CAAA;AACpF,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,WAAA,CAAY,CAAA,CAAE,cAAc,CAAC,CAAA;AAC7B,UAAA;AAAA,QACF;AACA,QAAA,IAAI;AACF,UAAA,MAAM,sBAAsB,qBAAA,EAAuB,MAAA,CAAO,EAAA,EAAI,gBAAA,CAAiB,IAAI,CAAC,CAAA;AACpF,UAAA,aAAA,CAAc,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA,QAC1B,SAAS,KAAA,EAAO;AACd,UAAA,WAAA,CAAa,MAAgB,OAAO,CAAA;AAAA,QACtC;AAAA,MACF;AAAA;AAAA,GACF;AAEJ;AC5GO,SAAS,uBAAA,CAAwB,EAAE,IAAA,EAAM,OAAA,EAAS,aAAY,EAAU;AAC7E,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,aAAA,KAAkB,gBAAA,EAAiB;AACxE,EAAA,MAAM,CAAA,GAAI,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIG,QAAAA,CAAoC,EAAE,CAAA;AAC5E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEtC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,4BAAA,EAA6B,CAC1B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,OAAO,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA;AAClE,MAAA,eAAA,CAAgB,YAAA,EAAc,MAAM,EAAE,CAAA;AAAA,IACxC,CAAC,EACA,KAAA,CAAM,CAAC,UAAiB,WAAA,CAAY,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AAEtB,EAAA,eAAe,YAAA,GAAe;AAC5B,IAAA,IAAI,CAAC,YAAA,EAAc;AAAE,MAAA,WAAA,CAAY,CAAA,CAAE,0BAA0B,CAAC,CAAA;AAAG,MAAA;AAAA,IAAO;AACxE,IAAA,IAAI,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAAE,MAAA,WAAA,CAAY,CAAA,CAAE,sBAAsB,CAAC,CAAA;AAAG,MAAA;AAAA,IAAO;AACjF,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,EAAE,QAAQ,MAAA,CAAO,IAAA,EAAK,EAAG,YAAA,EAAc,CAAA;AACnF,MAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,EAAE,MAAM,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAC1E,MAAA,MAAM,KAAA,GAAQ,MAAM,iBAAA,CAAkB,QAAA,CAAS,EAAA,EAAI,UAAA,CAAW,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,CAAA;AAC5F,MAAA,IAAI,CAAC,WAAW,EAAA,EAAI;AAClB,QAAA,WAAA;AAAA,UACE,EAAE,kBAAkB,CAAA;AAAA,UACpB,CAAC,GAAG,UAAA,CAAW,gBAAA,EAAkB,GAAG,UAAA,CAAW,UAAA,CAAW,IAAI,CAAC,KAAA,KAAU,GAAG,KAAA,CAAM,MAAM,KAAK,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA,CAAE,KAAK,IAAI;AAAA,SAC1H;AAAA,MACF,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,CAAA,CAAE,oBAAoB,CAAC,CAAA;AAAA,MACvC;AACA,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,OAAA,EAAQ;AACR,MAAA,SAAA,CAAU,EAAE,CAAA;AAAA,IACd,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAa,MAAgB,OAAO,CAAA;AAAA,IACtC,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,uBACEJ,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,EAAE,SAAS,CAAA;AAAA,MAClB,QAAA,EAAU,EAAE,YAAY,CAAA;AAAA,MACxB,QAAA,EAAU,YAAA;AAAA,MACV,cAAA,EAAc,IAAA;AAAA,MACd,aAAa,IAAA,GAAO,CAAA,CAAE,gBAAgB,CAAA,GAAI,EAAE,YAAY,CAAA;AAAA,MACxD,WAAA,EAAa,EAAE,UAAU,CAAA;AAAA,MACzB,cAAA,EAAgB,IAAA;AAAA,MAChB,SAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8DAAA,EACd,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,cAAc,CAAA;AAAA,0BACjBA,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,mJAAA;AAAA,cACV,KAAA,EAAO,YAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACvD,QAAA,EAAU,IAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAC,IAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAI,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE,CAAA;AAAA,gBAC9C,WAAA,CAAY,IAAI,CAAC,UAAA,qBAChBD,IAAAA,CAAC,QAAA,EAAA,EAA2B,KAAA,EAAO,UAAA,CAAW,EAAA,EAC3C,QAAA,EAAA;AAAA,kBAAA,UAAA,CAAW,IAAA;AAAA,kBAAK,GAAA;AAAA,kBAAE,UAAA,CAAW,OAAA,GAAU,EAAA,GAAK,CAAA,CAAE,kBAAkB;AAAA,iBAAA,EAAA,EADtD,UAAA,CAAW,EAExB,CACD;AAAA;AAAA;AAAA;AACH,SAAA,EACF,CAAA;AAAA,wBAEAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8DAAA,EACd,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,eAAe,CAAA;AAAA,0BAClBC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,CAAA;AAAA,cACN,SAAA,EAAU,aAAA;AAAA,cACV,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,cACpC,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,SAAA,CAAU,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACjD,QAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EACF,CAAA;AAAA,wBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,4CAAA,EACV,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EACnB;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,mBAAmB,MAAA,EAAwB;AAClD,EAAA,MAAM,UAAU,MAAA,CAAO,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACjD,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,EAAA,EAAI,OAAO,OAAA;AACjC,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,MAAA,CAAA;AAChC;ACzFO,SAAS,qBAAA,CAAsB,EAAE,IAAA,EAAM,OAAA,EAAS,WAAU,EAA+B;AAC9F,EAAA,MAAM,SAAA,GAAY,gBAAgB,iBAAiB,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,gBAAgB,QAAQ,CAAA;AACxC,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,aAAA,KAAkB,gBAAA,EAAiB;AAExE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIG,QAAAA,CAAoC,EAAE,CAAA;AACxE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,CAAoC,EAAE,CAAA;AAC5E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAiB,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAiB,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAiB,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AAItD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,IAAA,OAAA,CAAQ,EAAE,CAAA;AACT,IAAA,CAAC,YAAY;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,UACtC,qBAAA,EAAsB;AAAA,UACtB,4BAAA;AAA6B,SAC9B,CAAA;AACD,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAA,MAAM,aAAA,GAAgB,KAAK,CAAC,CAAA;AAC5B,UAAA,IAAI,aAAA,EAAe,aAAA,CAAc,aAAA,CAAc,EAAE,CAAA;AAAA,QACnD;AACA,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,UAAA,MAAM,eAAA,GAAkB,MAAM,CAAC,CAAA;AAC/B,UAAA,IAAI,eAAA,EAAiB,eAAA,CAAgB,eAAA,CAAgB,EAAE,CAAA;AAAA,QACzD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,CAAC,SAAA,EAAW,WAAA,CAAa,KAAA,CAAgB,OAAO,CAAA;AAAA,MACtD,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAAA,MACpC;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AAEtB,EAAA,MAAM,gBAAA,GAAmBC,OAAAA;AAAA,IACvB,MAAM,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,UAAU,CAAA;AAAA,IAC/C,CAAC,WAAW,UAAU;AAAA,GACxB;AAEA,EAAA,MAAM,SAAA,GACJ,CAAC,SAAA,IAAa,CAAC,gBAAgB,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,YAAA,CAAa,MAAA,GAAS,CAAA;AAEhF,EAAA,MAAM,YAAA,GAAeJ,YAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,0BAAA,CAA2B,UAAA,EAAY;AAAA,QAC3D,YAAA;AAAA,QACA,IAAA,EAAM,KAAK,IAAA,EAAK,CAAE,SAAS,CAAA,GAAI,IAAA,CAAK,MAAK,GAAI,KAAA;AAAA,OAC9C,CAAA;AACD,MAAA,aAAA,CAAc,SAAA,CAAU,wBAAwB,CAAC,CAAA;AACjD,MAAA,SAAA,CAAU,OAAO,CAAA;AACjB,MAAA,OAAA,EAAQ;AAAA,IACV,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAa,MAAgB,OAAO,CAAA;AAAA,IACtC,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,UAAA,EAAY,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,SAAS,CAAC,CAAA;AAEzG,EAAA,uBACED,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,UAAU,oBAAoB,CAAA;AAAA,MACrC,QAAA,EAAU,gBAAA,EAAkB,WAAA,IAAe,SAAA,CAAU,4BAA4B,CAAA;AAAA,MACjF,QAAA,EAAS,+BAAA;AAAA,MACT,cAAA,EAAc,IAAA;AAAA,MACd,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,KAAK,YAAA,EAAa;AAAA,MACpB,CAAA;AAAA,MACA,SAAA,EAAW,YAAA;AAAA,MACX,gBAAgB,CAAC,SAAA;AAAA,MACjB,WAAA,EAAa,QAAQ,QAAQ,CAAA;AAAA,MAC7B,WAAA,EAAa,QAAQ,QAAQ,CAAA;AAAA,MAC7B,QAAA,EAAS,IAAA;AAAA,MAET,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,SAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC,CAAA,GAC9C,SAAA,CAAU,MAAA,KAAW,CAAA,mBACvBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EACV,QAAA,EAAA,SAAA,CAAU,sBAAsB,CAAA,EACnC,CAAA,mBAEAD,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAP,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,OAAA,EACf,QAAA,EAAA;AAAA,0BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA,SAAA,CAAU,UAAU,CAAA,EACvB,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,qJAAA;AAAA,cACV,KAAA,EAAO,UAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,aAAA,CAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cAEpD,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,qBACdA,GAAAA,CAAC,QAAA,EAAA,EAAyB,KAAA,EAAO,QAAA,CAAS,EAAA,EACvC,QAAA,EAAA,QAAA,CAAS,IAAA,EAAA,EADC,QAAA,CAAS,EAEtB,CACD;AAAA;AAAA;AACH,SAAA,EACF,CAAA;AAAA,wBAEAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,OAAA,EACf,QAAA,EAAA;AAAA,0BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA,SAAA,CAAU,eAAe,CAAA,EAC5B,CAAA;AAAA,UACC,WAAA,CAAY,MAAA,KAAW,CAAA,mBACtBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mJAAA,EACV,QAAA,EAAA,SAAA,CAAU,mBAAmB,CAAA,EAChC,CAAA,mBAEAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,qJAAA;AAAA,cACV,KAAA,EAAO,YAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cAEtD,QAAA,EAAA,WAAA,CAAY,IAAI,CAAC,UAAA,qBAChBD,IAAAA,CAAC,QAAA,EAAA,EAA2B,KAAA,EAAO,UAAA,CAAW,EAAA,EAC3C,QAAA,EAAA;AAAA,gBAAA,UAAA,CAAW,IAAA;AAAA,gBACX,UAAA,CAAW,YAAA,GAAe,CAAA,MAAA,EAAM,UAAA,CAAW,YAAY,CAAA,CAAA,GAAK;AAAA,eAAA,EAAA,EAFlD,UAAA,CAAW,EAGxB,CACD;AAAA;AAAA;AACH,SAAA,EAEJ,CAAA;AAAA,wBAEAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,OAAA,EACf,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,YAAA,SAAA,CAAU,cAAc,CAAA;AAAA,4BACzBA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAC7C,QAAQ,UAAU,CAAA;AAAA,cAAE;AAAA,aAAA,EACxB;AAAA,WAAA,EACF,CAAA;AAAA,0BACAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,IAAA;AAAA,cACP,WAAA,EAAa,kBAAkB,IAAA,IAAQ,EAAA;AAAA,cACvC,UAAU,CAAC,KAAA,KAAU,OAAA,CAAQ,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cAC/C,SAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EACF,CAAA;AAAA,QAEC,gBAAA,IAAoB,gBAAA,CAAiB,IAAA,CAAK,MAAA,GAAS,CAAA,mBAClDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,gBAAA,CAAiB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBAC1BA,GAAAA,CAAC,KAAA,EAAA,EAAgB,KAAA,EAAM,QAAA,EAAS,IAAA,EAAK,IAAA,EAAM,QAAA,EAAA,GAAA,EAAA,EAA/B,GAAmC,CAChD,CAAA,EACH,CAAA,GACE;AAAA,OAAA,EACN,CAAA,EAEJ;AAAA;AAAA,GACF;AAEJ","file":"index.mjs","sourcesContent":["import { Select, Button } from '@ui/index'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport type { SessionSwitcherProps } from '@datatechsolutions/shared-domain/common'\n\nexport function SessionSwitcher({\n organizations,\n users,\n organizationId,\n userEmail,\n onOrganizationChange,\n onUserChange,\n}: SessionSwitcherProps) {\n const tSession = useTranslations('platform.session')\n const tCommon = useTranslations('common')\n\n return (\n <div className=\"session-switcher\">\n <Select\n value={organizationId}\n aria-label={tSession('organization')}\n onChange={(event) => {\n onOrganizationChange(event.target.value)\n }}\n options={organizations}\n placeholder={tSession('organization')}\n />\n <Select\n value={userEmail}\n aria-label={tSession('user')}\n onChange={(event) => {\n onUserChange(event.target.value)\n }}\n options={users}\n placeholder={tSession('user')}\n />\n <Button outline onClick={() => globalThis.location.reload()}>\n {tCommon('refresh')}\n </Button>\n </div>\n )\n}\n","import { useMemo, useState, useCallback } from 'react'\nimport { useAuth, usePlatformPreferences } from '../_auth'\nimport type { AuthUser } from '../_auth'\nimport {\n AppNavigation,\n filterByPermission,\n GlassModal,\n type NavigationItem,\n} from '@ui/index'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { usePathname, useRouter } from '@ui/lib/router-context'\n\nexport type PlatformDockContainerProps = {\n /** JWT-derived actor used for permission filtering. */\n actor: AuthUser | null\n /** App-specific navigation items (already translated). */\n navigationItems: NavigationItem[]\n /**\n * Pathname where the dock should be hidden (defaults to `/dashboard`).\n * The dashboard typically owns its own navigation chrome.\n */\n dashboardPath?: string\n /** Path to redirect to on sign-out (defaults to `/login`). */\n signOutPath?: string\n}\n\n/**\n * Floating dock + profile-modal trigger shared by every platform app.\n * Reads the active route from ui's router context and uses windsock for\n * preferences + sign-out, so the consumer only has to wire up navigation\n * items + an optional dashboard/sign-out path.\n */\nexport function PlatformDockContainer({\n actor,\n navigationItems,\n dashboardPath = '/dashboard',\n signOutPath = '/login',\n}: PlatformDockContainerProps) {\n const pathname = usePathname()\n const router = useRouter()\n const { logout } = useAuth()\n const tCommon = useTranslations('common')\n const {\n dockPosition,\n dockAutoHide,\n dockEnabled,\n } = usePlatformPreferences()\n const [profileOpen, setProfileOpen] = useState(false)\n\n const filteredItems = useMemo(\n () => filterByPermission(navigationItems, (actor as { permissions?: string[] } | null)?.permissions ?? []),\n [navigationItems, actor],\n )\n\n const handleNavigate = useCallback((href: string) => router.push(href), [router])\n const handleSignOut = useCallback(() => { void logout(signOutPath) }, [logout, signOutPath])\n\n if (pathname === dashboardPath) return null\n\n return (\n <>\n <AppNavigation\n items={filteredItems}\n pathname={pathname}\n dockEnabled={dockEnabled}\n dockPosition={dockPosition as 'left' | 'right' | 'bottom'}\n dockAutoHide={dockAutoHide}\n showLaunchpad={false}\n onNavigate={handleNavigate}\n onOpenProfile={() => setProfileOpen(true)}\n onSignOut={handleSignOut}\n labels={{\n home: tCommon('home'),\n profile: tCommon('profile'),\n signOut: tCommon('signOut'),\n }}\n />\n <GlassModal\n open={profileOpen}\n onClose={() => setProfileOpen(false)}\n title={tCommon('profile')}\n >\n <div />\n </GlassModal>\n </>\n )\n}\n","import { useCallback } from 'react'\nimport { useAuth as useWindsockAuth } from '../_auth'\nimport type { LocaleCode } from '@datatechsolutions/shared-domain/common'\nimport {\n applyClientLocale,\n LOCALE_TO_SHORT,\n SUPPORTED_LOCALES,\n} from '@datatechsolutions/shared-domain/i18n'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Locale switcher hook — reads the current locale from the i18n context and\n * pushes the user's choice through windsock so the next session inherits it.\n *\n * Lifted from astrlabe; consumers (astrlabe, kori-erp) wrap their tree in\n * `<I18nProvider>` + windsock's `<AuthProvider>` and import this directly.\n */\nexport function useLocaleSwitcher() {\n const locale = useLocale() as LocaleCode\n const { client } = useWindsockAuth()\n\n const setLocale = useCallback(\n (newLocale: LocaleCode | string) => {\n const resolved = applyClientLocale(newLocale)\n client.updateLocale(resolved)\n },\n [client],\n )\n\n return {\n locale,\n shortCode: LOCALE_TO_SHORT[locale] || 'pt',\n setLocale,\n locales: SUPPORTED_LOCALES,\n }\n}\n","import { MoonIcon, SunIcon } from '@heroicons/react/24/outline'\nimport { Select, IconButton } from '@ui/index'\nimport { SUPPORTED_LOCALES, LANGUAGE_META } from '@datatechsolutions/shared-domain/i18n'\nimport { usePlatformPreferences } from '../_auth'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { useLocaleSwitcher } from '@ui/hooks/use-locale-switcher'\n\nconst LOCALE_OPTIONS = SUPPORTED_LOCALES.map((code) => ({\n value: code,\n label: LANGUAGE_META[code].nativeName,\n}))\n\n/**\n * Locale + theme controls used inside the platform preferences drawer.\n * Reads the active locale from the i18n context and the theme/dock\n * preferences from windsock — both shared providers consuming apps must\n * mount above this component.\n */\nexport function PreferencesControls() {\n const { locale, setLocale } = useLocaleSwitcher()\n const { theme, setTheme } = usePlatformPreferences()\n const toggleTheme = () => setTheme(theme === 'dark' ? 'light' : 'dark')\n const t = useTranslations('platform.preferences')\n\n return (\n <div className=\"preferences-controls\">\n <Select\n value={locale}\n options={LOCALE_OPTIONS}\n onChange={(event) => setLocale(event.target.value)}\n />\n <IconButton\n label={t('theme')}\n icon={theme === 'dark' ? <SunIcon /> : <MoonIcon />}\n onClick={toggleTheme}\n variant=\"outline\"\n />\n </div>\n )\n}\n","import type {\n AdminUserSummary,\n AuthOrganization,\n} from '@datatechsolutions/shared-domain'\nimport type { ManagedUser, Organization, UserRole } from '@datatechsolutions/shared-domain/common'\n\n/** Maps a windsock AuthOrganization to the app-level Organization shape used by UI pages. */\nexport function mapAuthOrg(raw: AuthOrganization): Organization {\n return {\n id: raw.id,\n name: raw.displayName ?? raw.name,\n currency: 'BRL',\n country: 'BR',\n } as Organization\n}\n\n/**\n * Maps a windsock AdminUserSummary to the app-level ManagedUser shape.\n * Takes `normalizeRole` as a parameter so each consuming app can plug in\n * the role normalizer produced by its own `createPlatformRbac()` call —\n * we deliberately don't hardcode an app-specific role enum here.\n */\nexport function mapAdminUser(\n row: AdminUserSummary,\n normalizeRole: (input: unknown) => string,\n): ManagedUser {\n return {\n id: row.id,\n email: row.email,\n name: row.name ?? row.email,\n role: normalizeRole(row.role) as UserRole,\n active: row.status === 'active',\n }\n}\n\n/** Maps an app-level UserRole to a windsock AuthOrganizationRole. */\nexport const ORG_ROLE_MAP: Record<string, 'owner' | 'admin' | 'member' | 'viewer'> = {\n owner: 'owner',\n admin: 'admin',\n manager: 'admin',\n analyst: 'member',\n operator: 'member',\n viewer: 'viewer',\n finance: 'member',\n sales: 'member',\n support: 'member',\n member: 'member',\n}\n\nexport function mapRoleToOrgRole(role: string): 'owner' | 'admin' | 'member' | 'viewer' {\n return ORG_ROLE_MAP[role] ?? 'member'\n}\n","import { useEffect, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { useNotifications } from '@ui/components/notifications'\nimport type { ManagedUser } from '@datatechsolutions/shared-domain/common'\nimport {\n listUsers,\n createUser as createUserApi,\n addOrganizationMember,\n} from './windsock-admin-client'\nimport { mapAdminUser, mapRoleToOrgRole } from './windsock-mappers'\nimport { UsersPageView } from './pages/users-page-view'\nimport { RolesPageView } from './pages/roles-page-view'\nimport { usePlatformState } from './platform-state-provider'\nimport type { PlatformRoleDefinition } from './rbac'\n\nexport type UsersSettingsSectionProps = {\n /**\n * Role normalizer produced by each app's `createPlatformRbac()` call.\n * Used to coerce JWT role strings into the app's canonical role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport type RolesSettingsSectionProps = UsersSettingsSectionProps & {\n /** App-defined role definitions (from `createPlatformRbac`). */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /** Display options for the role-assignment select. */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function UsersSettingsSection({ normalizeRole }: UsersSettingsSectionProps) {\n const t = useTranslations('platform.users')\n const { currentOrganizationId } = usePlatformState()\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const [users, setUsers] = useState<ManagedUser[]>([])\n const [loading, setLoading] = useState(true)\n\n const reload = async () => {\n try {\n const result = await listUsers({ organizationId: currentOrganizationId })\n setUsers(result.items.map((row) => mapAdminUser(row, normalizeRole)))\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setLoading(false)\n }\n }\n\n useEffect(() => {\n void reload()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentOrganizationId])\n\n return (\n <UsersPageView\n labels={{\n title: t('title'),\n subtitle: t('subtitle'),\n create: t('create'),\n list: t('list'),\n add: t('add'),\n statusActive: t('statusActive'),\n statusInactive: t('statusInactive'),\n name: t('name'),\n email: t('email'),\n role: t('role'),\n status: t('status'),\n save: t('save'),\n userNamePlaceholder: t('userNamePlaceholder'),\n userEmailPlaceholder: t('userEmailPlaceholder'),\n }}\n users={loading ? [] : users}\n onCreateUser={async ({ name, email, role }) => {\n try {\n await createUserApi({ name, email, role: role as never, organizationId: currentOrganizationId })\n notifySuccess(t('add'))\n await reload()\n } catch (error) {\n notifyError((error as Error).message)\n }\n }}\n onUpdateRole={() => {\n notifyError(t('reassignInRolesTab'))\n }}\n />\n )\n}\n\nexport function RolesSettingsSection({ roleDefinitions, roleOptions, normalizeRole }: RolesSettingsSectionProps) {\n const t = useTranslations('platform.roles')\n const { currentOrganizationId } = usePlatformState()\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const [users, setUsers] = useState<ManagedUser[]>([])\n\n useEffect(() => {\n listUsers({ organizationId: currentOrganizationId })\n .then((result) => setUsers(result.items.map((row) => mapAdminUser(row, normalizeRole))))\n .catch((error: Error) => notifyError(error.message))\n }, [currentOrganizationId, notifyError, normalizeRole])\n\n return (\n <RolesPageView\n roleDefinitions={roleDefinitions}\n roleOptions={roleOptions}\n labels={{\n title: t('title'),\n subtitle: t('subtitle'),\n definitions: t('definitions'),\n assign: t('assign'),\n current: t('current'),\n permissionsEnabled: t('permissionsEnabled'),\n apply: t('apply'),\n role: t('role'),\n description: t('description'),\n user: t('user'),\n email: t('email'),\n userEmail: t('userEmail'),\n }}\n users={users}\n onAssignRole={async ({ email, role }) => {\n const target = users.find((user) => user.email.toLowerCase() === email.toLowerCase())\n if (!target) {\n notifyError(t('userNotFound'))\n return\n }\n try {\n await addOrganizationMember(currentOrganizationId, target.id, mapRoleToOrgRole(role))\n notifySuccess(t('apply'))\n } catch (error) {\n notifyError((error as Error).message)\n }\n }}\n />\n )\n}\n","import { useEffect, useState } from 'react'\nimport { GlassModal, Textarea } from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport type { Workflow } from '@ui/astrlabe/contracts'\nimport {\n aiGenerateWorkflow,\n createWorkflow,\n listModelProviderConnections,\n saveWorkflowDraft,\n type ModelProviderConnection,\n} from './workflow-api-client'\n\ninterface Props {\n open: boolean\n onClose: () => void\n onGenerated: (workflow: Workflow) => void\n}\n\n/**\n * Minimal NL → graph generator surface. Lets the user pick one of the\n * org's model provider connections, enter a prompt, and produces a\n * Workflow row whose `graph` is the LLM's output. The caller navigates\n * the editor to the new workflow once generation succeeds — validation\n * issues are surfaced as notifications so the user can iterate.\n */\nexport function AiWorkflowGenerateModal({ open, onClose, onGenerated }: Props) {\n const { error: notifyError, success: notifySuccess } = useNotifications()\n const t = useTranslations('agents.workflow')\n const [connections, setConnections] = useState<ModelProviderConnection[]>([])\n const [connectionId, setConnectionId] = useState('')\n const [prompt, setPrompt] = useState('')\n const [busy, setBusy] = useState(false)\n\n useEffect(() => {\n if (!open) return\n listModelProviderConnections()\n .then((items) => {\n setConnections(items)\n const firstEnabled = items.find((item) => item.enabled) ?? items[0]\n setConnectionId(firstEnabled?.id ?? '')\n })\n .catch((error: Error) => notifyError(error.message))\n }, [open, notifyError])\n\n async function handleSubmit() {\n if (!connectionId) { notifyError(t('aiErrorMissingConnection')); return }\n if (prompt.trim().length === 0) { notifyError(t('aiErrorMissingPrompt')); return }\n setBusy(true)\n try {\n const generation = await aiGenerateWorkflow({ prompt: prompt.trim(), connectionId })\n const workflow = await createWorkflow({ name: deriveWorkflowName(prompt) })\n const saved = await saveWorkflowDraft(workflow.id, generation.graph, { name: workflow.name })\n if (!generation.ok) {\n notifyError(\n t('aiWarnValidation'),\n [...generation.structuralIssues, ...generation.nodeIssues.map((issue) => `${issue.nodeId}: ${issue.message}`)].join('\\n'),\n )\n } else {\n notifySuccess(t('aiSuccessGenerated'))\n }\n onGenerated(saved)\n onClose()\n setPrompt('')\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={t('aiTitle')}\n subtitle={t('aiSubtitle')}\n onSubmit={handleSubmit}\n showFormFooter\n submitLabel={busy ? t('aiGenerateBusy') : t('aiGenerate')}\n cancelLabel={t('aiCancel')}\n submitDisabled={busy}\n isLoading={busy}\n >\n <div className=\"space-y-4\">\n <label className=\"block text-sm font-medium text-slate-700 dark:text-slate-200\">\n {t('aiConnection')}\n <select\n className=\"mt-1 w-full rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 dark:border-white/10 dark:bg-white/5 dark:text-slate-100\"\n value={connectionId}\n onChange={(event) => setConnectionId(event.target.value)}\n disabled={busy}\n >\n <option value=\"\">{t('aiConnectionPlaceholder')}</option>\n {connections.map((connection) => (\n <option key={connection.id} value={connection.id}>\n {connection.name} {connection.enabled ? '' : t('aiDisabledSuffix')}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block text-sm font-medium text-slate-700 dark:text-slate-200\">\n {t('aiPromptLabel')}\n <Textarea\n rows={6}\n className=\"mt-1 w-full\"\n placeholder={t('aiPromptPlaceholder')}\n value={prompt}\n onChange={(event) => setPrompt(event.target.value)}\n disabled={busy}\n />\n </label>\n\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('aiFooterNote')}\n </p>\n </div>\n </GlassModal>\n )\n}\n\nfunction deriveWorkflowName(prompt: string): string {\n const trimmed = prompt.trim().replace(/\\s+/g, ' ')\n if (trimmed.length <= 60) return trimmed\n return `${trimmed.slice(0, 57)}…`\n}\n","/**\n * WorkflowTemplateModal\n * =====================\n *\n * Lets the user instantiate a pre-built workflow template (e.g. the\n * product-pricing dashboard flow) from the workflows list page. The template\n * requires a `connectionId` that references one of the org's\n * `model_provider_connections` rows — we load the list on open so the\n * picker is always fresh.\n *\n * Why not inline in `workflows-page-client.tsx`? Two reasons:\n * 1. Keeps the modal focused: one component, one responsibility.\n * 2. Makes the flow testable end-to-end without mounting the whole page.\n */\n\n'use client'\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { GlassModal } from '@ui/index'\nimport { Badge } from '@ui/components/badge'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n createWorkflowFromTemplate,\n listModelProviderConnections,\n listWorkflowTemplates,\n type ModelProviderConnection,\n type WorkflowTemplateSummary,\n} from './workflow-api-client'\nimport type { Workflow } from '@ui/astrlabe/contracts'\n\nexport interface WorkflowTemplateModalProps {\n open: boolean\n onClose: () => void\n onCreated: (workflow: Workflow) => void\n}\n\nexport function WorkflowTemplateModal({ open, onClose, onCreated }: WorkflowTemplateModalProps) {\n const tWorkflow = useTranslations('agents.workflow')\n const tCommon = useTranslations('common')\n const { error: notifyError, success: notifySuccess } = useNotifications()\n\n const [templates, setTemplates] = useState<WorkflowTemplateSummary[]>([])\n const [connections, setConnections] = useState<ModelProviderConnection[]>([])\n const [templateId, setTemplateId] = useState<string>('')\n const [connectionId, setConnectionId] = useState<string>('')\n const [name, setName] = useState<string>('')\n const [isLoading, setIsLoading] = useState(false)\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n // Load templates + connections when the modal opens. Clear prior state so\n // reopening feels fresh.\n useEffect(() => {\n if (!open) return\n let cancelled = false\n setIsLoading(true)\n setTemplateId('')\n setConnectionId('')\n setName('')\n ;(async () => {\n try {\n const [tpls, conns] = await Promise.all([\n listWorkflowTemplates(),\n listModelProviderConnections(),\n ])\n if (cancelled) return\n setTemplates(tpls)\n setConnections(conns)\n if (tpls.length > 0) {\n const firstTemplate = tpls[0]\n if (firstTemplate) setTemplateId(firstTemplate.id)\n }\n if (conns.length > 0) {\n const firstConnection = conns[0]\n if (firstConnection) setConnectionId(firstConnection.id)\n }\n } catch (error) {\n if (!cancelled) notifyError((error as Error).message)\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n })()\n return () => {\n cancelled = true\n }\n }, [open, notifyError])\n\n const selectedTemplate = useMemo(\n () => templates.find((t) => t.id === templateId),\n [templates, templateId],\n )\n\n const canSubmit =\n !isLoading && !isSubmitting && templateId.length > 0 && connectionId.length > 0\n\n const handleSubmit = useCallback(async () => {\n if (!canSubmit) return\n setIsSubmitting(true)\n try {\n const created = await createWorkflowFromTemplate(templateId, {\n connectionId,\n name: name.trim().length > 0 ? name.trim() : undefined,\n })\n notifySuccess(tWorkflow('templateCreatedSuccess'))\n onCreated(created)\n onClose()\n } catch (error) {\n notifyError((error as Error).message)\n } finally {\n setIsSubmitting(false)\n }\n }, [canSubmit, templateId, connectionId, name, onCreated, onClose, notifySuccess, notifyError, tWorkflow])\n\n return (\n <GlassModal\n open={open}\n onClose={onClose}\n title={tWorkflow('createFromTemplate')}\n subtitle={selectedTemplate?.description ?? tWorkflow('createFromTemplateSubtitle')}\n gradient=\"from-indigo-500 to-purple-600\"\n showFormFooter\n onSubmit={(event) => {\n event.preventDefault()\n void handleSubmit()\n }}\n isLoading={isSubmitting}\n submitDisabled={!canSubmit}\n submitLabel={tCommon('create')}\n cancelLabel={tCommon('cancel')}\n maxWidth=\"lg\"\n >\n <div className=\"space-y-4\">\n {isLoading ? (\n <div className=\"shimmer h-32 w-full rounded-xl\" />\n ) : templates.length === 0 ? (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {tWorkflow('noTemplatesAvailable')}\n </p>\n ) : (\n <>\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('template')}\n </span>\n <select\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n value={templateId}\n onChange={(event) => setTemplateId(event.target.value)}\n >\n {templates.map((template) => (\n <option key={template.id} value={template.id}>\n {template.name}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('llmConnection')}\n </span>\n {connections.length === 0 ? (\n <p className=\"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200\">\n {tWorkflow('noConnectionsHint')}\n </p>\n ) : (\n <select\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n value={connectionId}\n onChange={(event) => setConnectionId(event.target.value)}\n >\n {connections.map((connection) => (\n <option key={connection.id} value={connection.id}>\n {connection.name}\n {connection.providerSlug ? ` · ${connection.providerSlug}` : ''}\n </option>\n ))}\n </select>\n )}\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow('workflowName')}\n <span className=\"ml-1 text-[10px] text-gray-400\">\n ({tCommon('optional')})\n </span>\n </span>\n <input\n type=\"text\"\n value={name}\n placeholder={selectedTemplate?.name ?? ''}\n onChange={(event) => setName(event.target.value)}\n className=\"w-full rounded-lg border border-white/20 bg-white/70 px-3 py-2 text-sm text-gray-900 shadow-sm backdrop-blur dark:bg-gray-800/70 dark:text-gray-100\"\n />\n </label>\n\n {selectedTemplate && selectedTemplate.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {selectedTemplate.tags.map((tag) => (\n <Badge key={tag} color=\"indigo\" size=\"xs\">{tag}</Badge>\n ))}\n </div>\n ) : null}\n </>\n )}\n </div>\n </GlassModal>\n )\n}\n"]}