@datatechsolutions/ui 2.11.83 → 2.11.84

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 (101) hide show
  1. package/dist/astrlabe/index.d.mts +3 -52
  2. package/dist/astrlabe/index.d.ts +3 -52
  3. package/dist/astrlabe/index.js +107 -107
  4. package/dist/astrlabe/index.mjs +4 -4
  5. package/dist/astrlabe/workflow-canvas.js +4 -4
  6. package/dist/astrlabe/workflow-canvas.mjs +3 -3
  7. package/dist/chunk-3T2WGL47.js +44 -0
  8. package/dist/chunk-3T2WGL47.js.map +1 -0
  9. package/dist/{chunk-UVGMKHWH.mjs → chunk-63AL2RN5.mjs} +4 -4
  10. package/dist/{chunk-UVGMKHWH.mjs.map → chunk-63AL2RN5.mjs.map} +1 -1
  11. package/dist/chunk-64G2HBRQ.mjs +481 -0
  12. package/dist/chunk-64G2HBRQ.mjs.map +1 -0
  13. package/dist/{chunk-J3OYJ44D.mjs → chunk-BH2AU3LG.mjs} +3 -3
  14. package/dist/{chunk-J3OYJ44D.mjs.map → chunk-BH2AU3LG.mjs.map} +1 -1
  15. package/dist/chunk-CCRBT7TA.mjs +941 -0
  16. package/dist/chunk-CCRBT7TA.mjs.map +1 -0
  17. package/dist/chunk-CHLJUSXX.mjs +128 -0
  18. package/dist/chunk-CHLJUSXX.mjs.map +1 -0
  19. package/dist/chunk-CXIQWPBH.js +214 -0
  20. package/dist/chunk-CXIQWPBH.js.map +1 -0
  21. package/dist/chunk-EDE36MKE.mjs +412 -0
  22. package/dist/chunk-EDE36MKE.mjs.map +1 -0
  23. package/dist/{chunk-M7P2TQ6X.js → chunk-EFREXNZB.js} +64 -64
  24. package/dist/{chunk-M7P2TQ6X.js.map → chunk-EFREXNZB.js.map} +1 -1
  25. package/dist/chunk-FAGDZEKM.js +23 -0
  26. package/dist/chunk-FAGDZEKM.js.map +1 -0
  27. package/dist/{chunk-TUEYBNWL.js → chunk-GV6WJCEB.js} +3 -3
  28. package/dist/{chunk-TUEYBNWL.js.map → chunk-GV6WJCEB.js.map} +1 -1
  29. package/dist/chunk-HU3EAHFO.mjs +20 -0
  30. package/dist/chunk-HU3EAHFO.mjs.map +1 -0
  31. package/dist/{chunk-LLFU42KC.mjs → chunk-I6WYV2AN.mjs} +3 -3
  32. package/dist/{chunk-LLFU42KC.mjs.map → chunk-I6WYV2AN.mjs.map} +1 -1
  33. package/dist/chunk-JJWFMKZY.js +132 -0
  34. package/dist/chunk-JJWFMKZY.js.map +1 -0
  35. package/dist/{chunk-JFWZHROG.js → chunk-L6FVIWAJ.js} +128 -128
  36. package/dist/{chunk-JFWZHROG.js.map → chunk-L6FVIWAJ.js.map} +1 -1
  37. package/dist/chunk-MNQEZL7B.mjs +210 -0
  38. package/dist/chunk-MNQEZL7B.mjs.map +1 -0
  39. package/dist/chunk-SGJ24J2Q.js +943 -0
  40. package/dist/chunk-SGJ24J2Q.js.map +1 -0
  41. package/dist/chunk-SW6TVAIJ.js +418 -0
  42. package/dist/chunk-SW6TVAIJ.js.map +1 -0
  43. package/dist/chunk-SYNVNTLJ.mjs +20 -0
  44. package/dist/chunk-SYNVNTLJ.mjs.map +1 -0
  45. package/dist/chunk-UQXVCVAN.mjs +41 -0
  46. package/dist/chunk-UQXVCVAN.mjs.map +1 -0
  47. package/dist/chunk-WGELLCOZ.js +22 -0
  48. package/dist/chunk-WGELLCOZ.js.map +1 -0
  49. package/dist/chunk-YXPHJ2BQ.js +541 -0
  50. package/dist/chunk-YXPHJ2BQ.js.map +1 -0
  51. package/dist/index.d.mts +3 -47
  52. package/dist/index.d.ts +3 -47
  53. package/dist/index.js +765 -765
  54. package/dist/index.mjs +2 -2
  55. package/dist/navigation-BiWVffAN.d.mts +49 -0
  56. package/dist/navigation-BiWVffAN.d.ts +49 -0
  57. package/dist/platform/agents-workspace.d.mts +19 -0
  58. package/dist/platform/agents-workspace.d.ts +19 -0
  59. package/dist/platform/agents-workspace.js +26 -0
  60. package/dist/platform/agents-workspace.js.map +1 -0
  61. package/dist/platform/agents-workspace.mjs +17 -0
  62. package/dist/platform/agents-workspace.mjs.map +1 -0
  63. package/dist/platform/app-shell.d.mts +58 -0
  64. package/dist/platform/app-shell.d.ts +58 -0
  65. package/dist/platform/app-shell.js +17 -0
  66. package/dist/platform/app-shell.js.map +1 -0
  67. package/dist/platform/app-shell.mjs +8 -0
  68. package/dist/platform/app-shell.mjs.map +1 -0
  69. package/dist/platform/index.d.mts +100 -3
  70. package/dist/platform/index.d.ts +100 -3
  71. package/dist/platform/index.js +499 -28
  72. package/dist/platform/index.js.map +1 -1
  73. package/dist/platform/index.mjs +472 -27
  74. package/dist/platform/index.mjs.map +1 -1
  75. package/dist/platform/pages/index.d.mts +243 -82
  76. package/dist/platform/pages/index.d.ts +243 -82
  77. package/dist/platform/pages/index.js +886 -614
  78. package/dist/platform/pages/index.js.map +1 -1
  79. package/dist/platform/pages/index.mjs +756 -511
  80. package/dist/platform/pages/index.mjs.map +1 -1
  81. package/dist/platform/utils/index.js +18 -56
  82. package/dist/platform/utils/index.js.map +1 -1
  83. package/dist/platform/utils/index.mjs +3 -53
  84. package/dist/platform/utils/index.mjs.map +1 -1
  85. package/dist/platform/workflow-api-client.d.mts +6 -0
  86. package/dist/platform/workflow-api-client.d.ts +6 -0
  87. package/dist/platform/workflow-api-client.js +246 -0
  88. package/dist/platform/workflow-api-client.js.map +1 -0
  89. package/dist/platform/workflow-api-client.mjs +5 -0
  90. package/dist/platform/workflow-api-client.mjs.map +1 -0
  91. package/dist/platform/workflow-canvas-shell.d.mts +18 -0
  92. package/dist/platform/workflow-canvas-shell.d.ts +18 -0
  93. package/dist/platform/workflow-canvas-shell.js +20 -0
  94. package/dist/platform/workflow-canvas-shell.js.map +1 -0
  95. package/dist/platform/workflow-canvas-shell.mjs +11 -0
  96. package/dist/platform/workflow-canvas-shell.mjs.map +1 -0
  97. package/dist/{rule-form-F5jBOeqk.d.mts → rule-form-BYJzyork.d.mts} +50 -1
  98. package/dist/{rule-form-F5jBOeqk.d.ts → rule-form-BYJzyork.d.ts} +50 -1
  99. package/dist/workflow-api-client-C8gPn_D1.d.mts +386 -0
  100. package/dist/workflow-api-client-Dy1Ph8W-.d.ts +386 -0
  101. package/package.json +21 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/platform/session-switcher.tsx","../../src/platform/platform-state-provider.tsx","../../src/platform/windsock-mappers.ts"],"names":["jsx"],"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 { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { useAuth, type AuthUser } from '@datatechsolutions/windsock/client'\n\ntype PlatformState = {\n currentOrganizationId: string\n actor: AuthUser | null\n}\n\nconst PlatformStateContext = createContext<PlatformState | null>(null)\n\nexport type PlatformStateProviderProps = {\n children: ReactNode\n /**\n * Function that converts a JWT role claim to the app's canonical role\n * union (the same `normalizePlatformRole` produced by\n * `createPlatformRbac()` in this app). Lifted out as a prop because\n * each consuming app uses its own role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport function PlatformStateProvider({ children, normalizeRole }: PlatformStateProviderProps) {\n const { user } = useAuth()\n\n const state = useMemo<PlatformState>(() => {\n const organizationId = user?.organizationId ?? ''\n\n const actor: AuthUser | null = user\n ? {\n ...user,\n role: normalizeRole(user.role),\n organizationId,\n }\n : null\n\n return {\n currentOrganizationId: organizationId,\n actor,\n }\n }, [user, normalizeRole])\n\n return (\n <PlatformStateContext.Provider value={state}>\n {children}\n </PlatformStateContext.Provider>\n )\n}\n\nexport function usePlatformState() {\n const context = useContext(PlatformStateContext)\n if (!context) throw new Error('usePlatformState must be used inside PlatformStateProvider')\n return context\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"]}
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","useWindsockAuth","useCallback","SUPPORTED_LOCALES","usePlatformPreferences","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 '@datatechsolutions/windsock/client'\nimport type { AuthUser } from '@datatechsolutions/windsock/client'\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 '@datatechsolutions/windsock/client'\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 '@datatechsolutions/windsock/client'\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 * fuel-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,9 +1,16 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { UsersPageViewProps, DataSource } from '@datatechsolutions/shared-domain/common';
3
- import { AgentModel, AgentTool, AgentRule } from '../../astrlabe/contracts.mjs';
2
+ import { UsersPageViewProps, DataSource, RolesPageViewProps, WorkflowsPageViewProps } from '@datatechsolutions/shared-domain/common';
3
+ import { AgentModel, AgentTool, AgentRule, WorkflowRun, ModelProviderType } from '../../astrlabe/contracts.mjs';
4
4
  import { A as AgentWithPrompts } from '../../index-AioB90qq.mjs';
5
5
  import { AgentPrompt } from '@datatechsolutions/shared-domain/ports/workflow';
6
- import { R as RuleFormValue } from '../../rule-form-F5jBOeqk.mjs';
6
+ import { R as RuleFormValue, E as ExecutionTimelineLabels } from '../../rule-form-BYJzyork.mjs';
7
+ import { D as DatasourceFormData, A as AnalyticsSummary, R as RunTimelineEntry, M as ModelProviderConnection } from '../../workflow-api-client-C8gPn_D1.mjs';
8
+ export { a as DIALECT_CATEGORIES, b as DatasourceFormModal, c as DatasourceFormModalProps, d as DatasourceModal, e as DatasourceModalProps, f as findCategory, g as findDialect } from '../../workflow-api-client-C8gPn_D1.mjs';
9
+ import { ReactNode } from 'react';
10
+ import { PlatformRoleDefinition } from '../rbac.mjs';
11
+ import { SecretSummary } from '../windsock-admin-client.mjs';
12
+ import '@datatechsolutions/windsock/client';
13
+ import '@datatechsolutions/shared-domain';
7
14
 
8
15
  declare function UsersPageView({ labels, users, onCreateUser, onUpdateRole }: UsersPageViewProps): react_jsx_runtime.JSX.Element;
9
16
 
@@ -15,12 +22,12 @@ type AgentsModelsLabels = {
15
22
  disabled: string;
16
23
  empty: string;
17
24
  };
18
- type Props$4 = {
25
+ type Props$9 = {
19
26
  labels: AgentsModelsLabels;
20
27
  models: AgentModel[];
21
28
  loading: boolean;
22
29
  };
23
- declare function AgentsModelsPageView({ labels, models, loading }: Props$4): react_jsx_runtime.JSX.Element;
30
+ declare function AgentsModelsPageView({ labels, models, loading }: Props$9): react_jsx_runtime.JSX.Element;
24
31
 
25
32
  type AgentConfigFormInput = {
26
33
  agentId?: string;
@@ -51,7 +58,7 @@ type AgentsConfigLabels = {
51
58
  activeVersion: string;
52
59
  empty: string;
53
60
  };
54
- type Props$3 = {
61
+ type Props$8 = {
55
62
  labels: AgentsConfigLabels;
56
63
  agents: AgentWithPrompts[];
57
64
  models: AgentModel[];
@@ -60,7 +67,7 @@ type Props$3 = {
60
67
  onUpdate: (agentId: string, input: AgentConfigFormInput) => void;
61
68
  onDelete: (agent: AgentWithPrompts) => void;
62
69
  };
63
- declare function AgentsConfigPageView({ labels, agents, models, loading, onCreate, onUpdate, onDelete }: Props$3): react_jsx_runtime.JSX.Element;
70
+ declare function AgentsConfigPageView({ labels, agents, models, loading, onCreate, onUpdate, onDelete }: Props$8): react_jsx_runtime.JSX.Element;
64
71
 
65
72
  type PromptFormInput = {
66
73
  agentId: string;
@@ -91,7 +98,7 @@ type AgentsPromptsLabels = {
91
98
  deleteConfirm: string;
92
99
  empty: string;
93
100
  };
94
- type Props$2 = {
101
+ type Props$7 = {
95
102
  labels: AgentsPromptsLabels;
96
103
  agents: AgentWithPrompts[];
97
104
  prompts: AgentPrompt[];
@@ -100,7 +107,7 @@ type Props$2 = {
100
107
  onActivate: (prompt: AgentPrompt) => void;
101
108
  onDelete: (prompt: AgentPrompt) => void;
102
109
  };
103
- declare function AgentsPromptsPageView({ labels, agents, prompts, loading, onCreate, onActivate, onDelete }: Props$2): react_jsx_runtime.JSX.Element;
110
+ declare function AgentsPromptsPageView({ labels, agents, prompts, loading, onCreate, onActivate, onDelete }: Props$7): react_jsx_runtime.JSX.Element;
104
111
 
105
112
  declare const TOOL_TYPES: readonly ["http", "function", "database_query", "code_execution", "api_call"];
106
113
  type ToolType = (typeof TOOL_TYPES)[number];
@@ -144,7 +151,7 @@ type AgentsToolDefinitionsLabels = {
144
151
  deleteConfirm: string;
145
152
  empty: string;
146
153
  };
147
- type Props$1 = {
154
+ type Props$6 = {
148
155
  labels: AgentsToolDefinitionsLabels;
149
156
  tools: AgentTool[];
150
157
  loading: boolean;
@@ -152,7 +159,7 @@ type Props$1 = {
152
159
  onUpdate: (toolId: string, input: ToolDefinitionFormInput) => void;
153
160
  onDelete: (tool: AgentTool) => void;
154
161
  };
155
- declare function AgentsToolDefinitionsPageView({ labels, tools, loading, onCreate, onUpdate, onDelete }: Props$1): react_jsx_runtime.JSX.Element;
162
+ declare function AgentsToolDefinitionsPageView({ labels, tools, loading, onCreate, onUpdate, onDelete }: Props$6): react_jsx_runtime.JSX.Element;
156
163
  /**
157
164
  * Build a JSON Schema object from the parameter list. Mirrors the
158
165
  * format the backend validator (`validate_input_schema`) expects —
@@ -180,7 +187,7 @@ type RulesLabels = {
180
187
  disabled: string;
181
188
  order: string;
182
189
  };
183
- type Props = {
190
+ type Props$5 = {
184
191
  labels: RulesLabels;
185
192
  rules: AgentRule[];
186
193
  loading: boolean;
@@ -188,85 +195,239 @@ type Props = {
188
195
  onUpdate: (ruleId: string, input: RuleFormValue) => void;
189
196
  onDelete: (rule: AgentRule) => void;
190
197
  };
191
- declare function RulesPageView({ labels, rules, loading, onCreate, onUpdate, onDelete }: Props): react_jsx_runtime.JSX.Element;
198
+ declare function RulesPageView({ labels, rules, loading, onCreate, onUpdate, onDelete }: Props$5): react_jsx_runtime.JSX.Element;
192
199
 
193
- type DialectCategory = {
194
- id: string;
195
- labelKey: string;
196
- icon: React.ComponentType<{
197
- className?: string;
200
+ type Labels = Record<string, string>;
201
+ type DatasourcesPageViewProps = {
202
+ labels: Labels;
203
+ datasources?: DataSource[];
204
+ useSampleData?: boolean;
205
+ onCreate?: (data: DatasourceFormData) => void;
206
+ };
207
+ declare function DatasourcesPageView({ labels, datasources: externalDatasources, useSampleData, onCreate, }: DatasourcesPageViewProps): react_jsx_runtime.JSX.Element;
208
+
209
+ type DashboardLabels = {
210
+ title: string;
211
+ subtitle: string;
212
+ totalRuns: string;
213
+ successRate: string;
214
+ avgDuration: string;
215
+ runsByStatus: string;
216
+ perWorkflow: string;
217
+ noData: string;
218
+ runs: string;
219
+ };
220
+ type Props$4 = {
221
+ labels: DashboardLabels;
222
+ summary: AnalyticsSummary | null;
223
+ loading: boolean;
224
+ /**
225
+ * App-branded logo node rendered in the dashboard hero. Each app passes
226
+ * its own logo (typically a pair of light/dark <img> tags toggled via
227
+ * Tailwind `dark:` classes) so this view stays brand-agnostic.
228
+ */
229
+ appLogo: ReactNode;
230
+ };
231
+ /**
232
+ * Platform dashboard — a centered hero with the app's logo + subtitle.
233
+ * Metrics and workflow tables live on dedicated pages (Analytics /
234
+ * Workflow Runs); this view intentionally renders only the landing chrome.
235
+ *
236
+ * `summary` and `loading` are kept on the prop type so the page that
237
+ * mounts this view doesn't have to change, but we intentionally don't
238
+ * render them here.
239
+ */
240
+ declare function DashboardPageView({ labels, appLogo }: Props$4): react_jsx_runtime.JSX.Element;
241
+
242
+ type AgentsIndexLabels = {
243
+ title: string;
244
+ subtitle: string;
245
+ configTitle: string;
246
+ configSubtitle: string;
247
+ toolDefinitionsTitle: string;
248
+ toolDefinitionsSubtitle: string;
249
+ modelsTitle: string;
250
+ modelsSubtitle: string;
251
+ promptsTitle: string;
252
+ promptsSubtitle: string;
253
+ };
254
+ declare function AgentsIndexPageView({ labels }: {
255
+ labels: AgentsIndexLabels;
256
+ }): react_jsx_runtime.JSX.Element;
257
+
258
+ type RolesPageViewExtraProps = {
259
+ /**
260
+ * App-defined role definitions, e.g. `{ admin: { id, label, description }, ... }`.
261
+ * Each app passes the output of its own `createPlatformRbac()` call.
262
+ */
263
+ roleDefinitions: Record<string, PlatformRoleDefinition<string>>;
264
+ /**
265
+ * Display options surfaced in the role-assignment modal select. Each
266
+ * entry is `{ value: roleId, label: localizedLabel }`.
267
+ */
268
+ roleOptions: Array<{
269
+ value: string;
270
+ label: string;
198
271
  }>;
199
- gradient: string;
200
- dialects: DialectOption[];
201
272
  };
202
- type DialectOption = {
203
- value: string;
204
- label: string;
205
- defaultPort?: number;
206
- /** 'standard' = host/port/db, 'connection-string' = single URL, 'cloud' = project/dataset/key */
207
- formType: 'standard' | 'connection-string' | 'cloud-bigquery' | 'cloud-snowflake' | 'cloud-key' | 'vector-key';
273
+ declare function RolesPageView({ labels, users, onAssignRole, roleDefinitions, roleOptions, }: RolesPageViewProps & RolesPageViewExtraProps): react_jsx_runtime.JSX.Element;
274
+
275
+ declare function WorkflowsPageView({ labels, workflows, onCreate, onUpdateMeta, onPublish }: WorkflowsPageViewProps): react_jsx_runtime.JSX.Element;
276
+
277
+ type WorkflowRunsLabels = {
278
+ title: string;
279
+ subtitle: string;
280
+ status: string;
281
+ duration: string;
282
+ triggeredBy: string;
283
+ startedAt: string;
284
+ cancel: string;
285
+ replay: string;
286
+ view: string;
287
+ statusPending: string;
288
+ statusRunning: string;
289
+ statusCompleted: string;
290
+ statusFailed: string;
291
+ statusCancelled: string;
292
+ filterAll: string;
293
+ filterStatus: string;
294
+ empty: string;
295
+ timeline?: string;
296
+ };
297
+ type Props$3 = {
298
+ labels: WorkflowRunsLabels;
299
+ runs: WorkflowRun[];
300
+ loading: boolean;
301
+ onCancel: (run: WorkflowRun) => void;
302
+ onReplay: (run: WorkflowRun) => void;
303
+ onView?: (run: WorkflowRun) => void;
304
+ onViewTimeline?: (run: WorkflowRun) => void;
305
+ };
306
+ declare function WorkflowRunsPageView({ labels, runs, loading, onCancel, onReplay, onView, onViewTimeline }: Props$3): react_jsx_runtime.JSX.Element;
307
+
308
+ type RunTimelineLabels = ExecutionTimelineLabels & {
309
+ title: string;
310
+ subtitle: string;
311
+ };
312
+ type Props$2 = {
313
+ labels: RunTimelineLabels;
314
+ entries: RunTimelineEntry[];
315
+ loading: boolean;
316
+ runId: string;
208
317
  };
209
- declare const DIALECT_CATEGORIES: DialectCategory[];
210
- declare function findDialect(value: string): DialectOption | undefined;
211
- declare function findCategory(dialectValue: string): DialectCategory | undefined;
212
- type DatasourceFormData = {
318
+ /**
319
+ * Astrlabe-shaped wrapper around the shared `ExecutionTimelinePanel`
320
+ * (#68). Adds the page chrome (HeroSection + ManagementPageLayout) so
321
+ * the runs page renders consistently with the rest of the platform.
322
+ * Other apps (fuel-price-ai, kori-erp) can drop `ExecutionTimelinePanel`
323
+ * directly inside their own card layouts without taking on this page
324
+ * wrapper.
325
+ */
326
+ declare function RunTimelinePageView({ labels, entries, loading, runId }: Props$2): react_jsx_runtime.JSX.Element;
327
+
328
+ type CreateConnectionInput = {
329
+ providerSlug: string;
213
330
  name: string;
214
- dialect: string;
215
- host?: string;
216
- port?: number;
217
- database?: string;
218
- username?: string;
219
- password?: string;
220
- schema?: string;
221
- ssl?: boolean;
222
- readOnly?: boolean;
223
- connectionString?: string;
224
- projectId?: string;
225
- dataset?: string;
226
- keyFile?: string;
227
- account?: string;
228
- warehouse?: string;
229
331
  region?: string;
230
- bucket?: string;
231
- token?: string;
232
- apiKey?: string;
233
- environment?: string;
234
- index?: string;
235
- url?: string;
236
- /** Whitelist of tables the engine is allowed to query. Empty/undef =
237
- * allow every table the credential can see. */
238
- allowedTables?: string[];
239
- /** Columns the engine MUST NOT surface to workflows. Applied at the
240
- * driver layer — trying to SELECT a blocked column still fails. */
241
- blockedColumns?: string[];
242
- /** Max concurrent connections in the org's cached pool (default 5). */
243
- maxPoolSize?: number;
244
- /** Query/connect timeout in ms (default 5000). */
245
- timeoutMs?: number;
332
+ endpoint?: string;
333
+ credentialRef?: string;
334
+ apiKeyRef?: string;
335
+ modelFilter?: string[];
336
+ config?: Record<string, unknown>;
246
337
  };
247
- type Labels$1 = Record<string, string>;
248
- type DatasourceFormModalProps = {
249
- open: boolean;
250
- onClose: () => void;
251
- labels: Labels$1;
252
- onSave: (data: DatasourceFormData) => void;
338
+ type UpdateConnectionInput = Partial<Omit<CreateConnectionInput, 'providerSlug'>> & {
339
+ enabled?: boolean;
253
340
  };
254
- declare function DatasourceFormModal({ open, onClose, labels, onSave }: DatasourceFormModalProps): react_jsx_runtime.JSX.Element;
255
- type DatasourceModalProps = {
256
- open: boolean;
257
- onClose: () => void;
258
- labels: Labels$1;
259
- onSave: (data: DatasourceFormData) => void;
341
+ type ConnectionFormValue = {
342
+ providerSlug: ModelProviderType;
343
+ name: string;
344
+ region: string;
345
+ endpoint: string;
346
+ /** Plaintext only present when the user is entering a NEW key. On
347
+ * save we push this to `/organizations/{id}/secrets` and replace
348
+ * with the returned UUID before calling the connections API. */
349
+ apiKey: string;
350
+ /** Vault secret UUID — displayed as "••• (set)" in the UI. */
351
+ credentialRef: string;
352
+ modelFilter: string;
353
+ configJson: string;
260
354
  };
261
- declare function DatasourceModal({ open, onClose, labels, onSave }: DatasourceModalProps): react_jsx_runtime.JSX.Element;
355
+ type ConnectionsLabels = {
356
+ title: string;
357
+ subtitle: string;
358
+ add: string;
359
+ createTitle: string;
360
+ editTitle: string;
361
+ save: string;
362
+ delete: string;
363
+ edit: string;
364
+ enable: string;
365
+ disable: string;
366
+ deleteConfirm: string;
367
+ empty: string;
368
+ };
369
+ type CreateSecret = (name: string, value: string) => Promise<{
370
+ id: string;
371
+ }>;
372
+ type Props$1 = {
373
+ labels: ConnectionsLabels;
374
+ connections: ModelProviderConnection[];
375
+ loading: boolean;
376
+ onCreate: (input: CreateConnectionInput) => Promise<void>;
377
+ onUpdate: (id: string, input: UpdateConnectionInput) => Promise<void>;
378
+ onDelete: (connection: ModelProviderConnection) => Promise<void>;
379
+ /** Takes a secret name + plaintext value, stores it in the vault and
380
+ * returns the UUID the connections API should reference. */
381
+ onCreateSecret: CreateSecret;
382
+ /**
383
+ * Prefix for auto-generated secret names when the user enters a new
384
+ * API key. Final shape is `${prefix}-${providerSlug}-${timestamp}`.
385
+ * Defaults to `'platform'` so consumers that don't override land on a
386
+ * sensible namespace.
387
+ */
388
+ secretNamePrefix?: string;
389
+ };
390
+ declare function ConnectionsPageView({ labels, connections, loading, onCreate, onUpdate, onDelete, onCreateSecret, secretNamePrefix, }: Props$1): react_jsx_runtime.JSX.Element;
262
391
 
263
- type Labels = Record<string, string>;
264
- type DatasourcesPageViewProps = {
265
- labels: Labels;
266
- datasources?: DataSource[];
267
- useSampleData?: boolean;
268
- onCreate?: (data: DatasourceFormData) => void;
392
+ type CredentialFormInput = {
393
+ name: string;
394
+ value: string;
395
+ secretType: string;
396
+ description?: string;
269
397
  };
270
- declare function DatasourcesPageView({ labels, datasources: externalDatasources, useSampleData, onCreate, }: DatasourcesPageViewProps): react_jsx_runtime.JSX.Element;
398
+ type CredentialsPageViewLabels = {
399
+ title: string;
400
+ subtitle: string;
401
+ addCredential: string;
402
+ createTitle: string;
403
+ name: string;
404
+ namePlaceholder: string;
405
+ value: string;
406
+ valuePlaceholder: string;
407
+ type: string;
408
+ typeGeneric: string;
409
+ typeApiKey: string;
410
+ typeOAuth: string;
411
+ typePassword: string;
412
+ description: string;
413
+ descriptionPlaceholder: string;
414
+ save: string;
415
+ rotate: string;
416
+ disable: string;
417
+ disableConfirm: string;
418
+ expiresAt: string;
419
+ createdAt: string;
420
+ neverExpires: string;
421
+ empty: string;
422
+ };
423
+ type Props = {
424
+ labels: CredentialsPageViewLabels;
425
+ credentials: SecretSummary[];
426
+ loading: boolean;
427
+ onCreate: (input: CredentialFormInput) => void;
428
+ onRotate: (secret: SecretSummary, newValue: string) => void;
429
+ onDisable: (secret: SecretSummary) => void;
430
+ };
431
+ declare function CredentialsPageView({ labels, credentials, loading, onCreate, onRotate, onDisable }: Props): react_jsx_runtime.JSX.Element;
271
432
 
272
- export { type AgentConfigFormInput, type AgentsConfigLabels, AgentsConfigPageView, type AgentsModelsLabels, AgentsModelsPageView, type AgentsPromptsLabels, AgentsPromptsPageView, type AgentsToolDefinitionsLabels, AgentsToolDefinitionsPageView, DIALECT_CATEGORIES, type DatasourceFormData, DatasourceFormModal, type DatasourceFormModalProps, DatasourceModal, type DatasourceModalProps, DatasourcesPageView, type DatasourcesPageViewProps, type PromptFormInput, RuleFormValue, type RulesLabels, RulesPageView, TOOL_TYPES, type ToolDefinitionFormInput, type ToolParameter, type ToolType, UsersPageView, findCategory, findDialect, jsonSchemaToParameters, parametersToJsonSchema };
433
+ export { type AgentConfigFormInput, type AgentsConfigLabels, AgentsConfigPageView, type AgentsIndexLabels, AgentsIndexPageView, type AgentsModelsLabels, AgentsModelsPageView, type AgentsPromptsLabels, AgentsPromptsPageView, type AgentsToolDefinitionsLabels, AgentsToolDefinitionsPageView, type ConnectionFormValue, type ConnectionsLabels, ConnectionsPageView, type CreateConnectionInput, type CredentialFormInput, CredentialsPageView, type CredentialsPageViewLabels, type DashboardLabels, DashboardPageView, DatasourceFormData, DatasourcesPageView, type DatasourcesPageViewProps, type PromptFormInput, RolesPageView, type RolesPageViewExtraProps, RuleFormValue, type RulesLabels, RulesPageView, type RunTimelineLabels, RunTimelinePageView, TOOL_TYPES, type ToolDefinitionFormInput, type ToolParameter, type ToolType, type UpdateConnectionInput, UsersPageView, type WorkflowRunsLabels, WorkflowRunsPageView, WorkflowsPageView, jsonSchemaToParameters, parametersToJsonSchema };