@swiss-ai-hub/web 0.290.11

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 (313) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +479 -0
  3. package/app.config.ts +1 -0
  4. package/app.vue +52 -0
  5. package/assets/css/main.css +4 -0
  6. package/assets/images/logo.png +0 -0
  7. package/components/Agent/Avatar.vue +40 -0
  8. package/components/Agent/Card.vue +139 -0
  9. package/components/Agent/Configuration.vue +20 -0
  10. package/components/Agent/CreateModal.vue +287 -0
  11. package/components/Agent/EmptyCard.vue +35 -0
  12. package/components/Agent/List.vue +85 -0
  13. package/components/Agent/TemplateCard.vue +58 -0
  14. package/components/AppLoader.vue +55 -0
  15. package/components/Chat/Message.vue +90 -0
  16. package/components/Chat/SourceNodes.vue +120 -0
  17. package/components/Chat/Thread.vue +134 -0
  18. package/components/Costs/Table.vue +56 -0
  19. package/components/Dashboard/Component/BarChart.vue +46 -0
  20. package/components/Dashboard/Component/LineChart.vue +138 -0
  21. package/components/Dashboard/Component/Number.vue +31 -0
  22. package/components/Dashboard/Grid.vue +214 -0
  23. package/components/Dashboard/Item.vue +75 -0
  24. package/components/Dashboard/Trend.vue +34 -0
  25. package/components/Display/List/DisplayList.vue +93 -0
  26. package/components/Evaluation/Dataset/Card.vue +70 -0
  27. package/components/Evaluation/Dataset/Create.vue +81 -0
  28. package/components/Evaluation/Dataset/Edit.vue +132 -0
  29. package/components/Event/Display/AddMemoryToChatHistoryEvent.vue +60 -0
  30. package/components/Event/Display/AgentInTheLoopRequestEvent.vue +56 -0
  31. package/components/Event/Display/AgentInTheLoopResponseEvent.vue +17 -0
  32. package/components/Event/Display/Base.vue +125 -0
  33. package/components/Event/Display/BaseRetrieveMemoryEvent.vue +101 -0
  34. package/components/Event/Display/BaseStoreMemoryEvent.vue +182 -0
  35. package/components/Event/Display/ChunkEvent.vue +40 -0
  36. package/components/Event/Display/EmbeddingEvent.vue +25 -0
  37. package/components/Event/Display/ExceptionEvent.vue +21 -0
  38. package/components/Event/Display/GuardAcceptEvent.vue +25 -0
  39. package/components/Event/Display/GuardEvent.vue +17 -0
  40. package/components/Event/Display/GuardRejectionEvent.vue +25 -0
  41. package/components/Event/Display/HumanInTheLoopRequestEvent.vue +53 -0
  42. package/components/Event/Display/HumanInTheLoopResponseEvent.vue +40 -0
  43. package/components/Event/Display/LLMCostEvent.vue +25 -0
  44. package/components/Event/Display/LLMEvent.vue +92 -0
  45. package/components/Event/Display/LimitChatHistoryEvent.vue +60 -0
  46. package/components/Event/Display/RAGFailureStopEvent.vue +28 -0
  47. package/components/Event/Display/RAGStartEvent.vue +77 -0
  48. package/components/Event/Display/RAGSuccessStopEvent.vue +16 -0
  49. package/components/Event/Display/RawDataContent.vue +69 -0
  50. package/components/Event/Display/RerankerEvent.vue +39 -0
  51. package/components/Event/Display/RetrieverEvent.vue +22 -0
  52. package/components/Event/Display/RouterEvent.vue +54 -0
  53. package/components/Event/Display/StandaloneQuestionCondenserEvent.vue +38 -0
  54. package/components/Event/Display/StopEvent.vue +16 -0
  55. package/components/Event/Display/ThoughtEvent.vue +20 -0
  56. package/components/Event/Display/ToolEvent.vue +38 -0
  57. package/components/Event/Display/UnknownEvent.vue +17 -0
  58. package/components/Event/Display/UserMessageEvent.vue +35 -0
  59. package/components/Event/List/EventList.vue +249 -0
  60. package/components/Event/Statistics.vue +49 -0
  61. package/components/Event/Timeseries.vue +224 -0
  62. package/components/FormKit/AgentSelector.vue +307 -0
  63. package/components/FormKit/ChipsInput.vue +62 -0
  64. package/components/FormKit/DynamicConfiguration.vue +155 -0
  65. package/components/FormKit/IconSelector.vue +72 -0
  66. package/components/FormKit/KnowledgeDatabaseSelector.vue +92 -0
  67. package/components/FormKit/LocaleInput.vue +150 -0
  68. package/components/FormKit/ModelSelect.vue +110 -0
  69. package/components/FormKit/Repeater.vue +93 -0
  70. package/components/FormKit/VectorStoreInput.vue +247 -0
  71. package/components/Knowledge/Document/List.vue +140 -0
  72. package/components/Knowledge/Document/Overview.vue +28 -0
  73. package/components/Knowledge/Document/UploadModal.vue +298 -0
  74. package/components/Knowledge/Document/WithNodes.vue +105 -0
  75. package/components/Knowledge/Namespace/Card.vue +108 -0
  76. package/components/Knowledge/Namespace/CreateModal.vue +203 -0
  77. package/components/Knowledge/Namespace/EditModal.vue +134 -0
  78. package/components/Knowledge/Namespace/EmptyCard.vue +35 -0
  79. package/components/Knowledge/Node/Content.vue +71 -0
  80. package/components/Markdown/Renderer.vue +87 -0
  81. package/components/Memory/DetailPage.vue +48 -0
  82. package/components/Memory/Edit.vue +241 -0
  83. package/components/Memory/Graph.vue +318 -0
  84. package/components/Memory/List.vue +155 -0
  85. package/components/Memory/MemoryManagementPage.vue +178 -0
  86. package/components/Memory/OpenWebUIContent.vue +96 -0
  87. package/components/Memory/PageLayout.vue +72 -0
  88. package/components/Models/ModelDetailsPanel.vue +250 -0
  89. package/components/Models/NamespaceCard.vue +79 -0
  90. package/components/Navigation/Left.vue +85 -0
  91. package/components/Navigation/Top.vue +31 -0
  92. package/components/Notification/Item.vue +88 -0
  93. package/components/Notification/NotificationsOverlay.vue +164 -0
  94. package/components/Process/Card.vue +119 -0
  95. package/components/Process/Configuration.vue +20 -0
  96. package/components/Process/CreateModal.vue +276 -0
  97. package/components/Process/EmptyCard.vue +35 -0
  98. package/components/Process/Form.vue +153 -0
  99. package/components/Process/Starts.vue +44 -0
  100. package/components/Process/Walkthrough/List.vue +162 -0
  101. package/components/Role/AccessRulesEditor.vue +132 -0
  102. package/components/Role/Card.vue +68 -0
  103. package/components/Role/Create.vue +55 -0
  104. package/components/Role/Edit.vue +82 -0
  105. package/components/Role/UsageLimitsEditor.vue +225 -0
  106. package/components/Service/Selection.vue +148 -0
  107. package/components/Structural/Column.vue +74 -0
  108. package/components/Structural/Screen.vue +10 -0
  109. package/components/Structural/Substructure.vue +5 -0
  110. package/components/Tenant/Switcher.vue +102 -0
  111. package/components/Thread/Details.vue +135 -0
  112. package/components/Thread/Hierarchy.vue +136 -0
  113. package/components/Thread/Info.vue +41 -0
  114. package/components/Thread/List.vue +136 -0
  115. package/components/User/Bar.vue +74 -0
  116. package/components/User/List.vue +86 -0
  117. package/components/User/RoleChips.vue +83 -0
  118. package/components/User/Settings.vue +79 -0
  119. package/components/Workflow/Modal.vue +39 -0
  120. package/components/Workflow/NodeCard.vue +41 -0
  121. package/components/Workflow/StartNode.vue +24 -0
  122. package/components/Workflow/StepNode.vue +27 -0
  123. package/components/Workflow/StopNode.vue +24 -0
  124. package/components/Workflow/Visualization.vue +265 -0
  125. package/components/mdc/MarkdownFigure.vue +9 -0
  126. package/components/mdc/MarkdownTable.vue +9 -0
  127. package/components/mdc/ResolveImageComponent.vue +58 -0
  128. package/composables/agent/useAgentClass.ts +27 -0
  129. package/composables/agent/useAgentClassInstances.ts +27 -0
  130. package/composables/agent/useAgentClasses.ts +27 -0
  131. package/composables/agent/useAgentIconFromThread.ts +8 -0
  132. package/composables/agent/useAgentInstance.ts +28 -0
  133. package/composables/agent/useAgentInstanceThreads.ts +76 -0
  134. package/composables/agent/useAgentInstances.ts +25 -0
  135. package/composables/agent/useAgentNavigation.ts +35 -0
  136. package/composables/agent/useCreateAgentInstance.ts +33 -0
  137. package/composables/agent/useDeleteAgentInstance.ts +31 -0
  138. package/composables/agent/useUpdateAgentInstance.ts +40 -0
  139. package/composables/auth/useAuth.ts +54 -0
  140. package/composables/auth/useAuthProviders.ts +14 -0
  141. package/composables/chat/useChatCompletions.ts +30 -0
  142. package/composables/dashboard/useAgentNameFromDashboardWidget.ts +27 -0
  143. package/composables/dashboard/useDashboardComponent.ts +27 -0
  144. package/composables/dashboard/useSaveDashboard.ts +21 -0
  145. package/composables/document/useCreateNamespace.ts +26 -0
  146. package/composables/document/useDatabases.ts +23 -0
  147. package/composables/document/useDocument.ts +29 -0
  148. package/composables/document/useDocumentUrl.ts +20 -0
  149. package/composables/document/useDocuments.ts +107 -0
  150. package/composables/document/useNodes.ts +29 -0
  151. package/composables/document/useSummaryNodes.ts +32 -0
  152. package/composables/document/useUpdateNamespace.ts +22 -0
  153. package/composables/evaluation/useCreateDataset.ts +19 -0
  154. package/composables/evaluation/useDataset.ts +26 -0
  155. package/composables/evaluation/useDatasets.ts +25 -0
  156. package/composables/evaluation/useUpdateDataset.ts +23 -0
  157. package/composables/event/useBasicEventStatistics.ts +83 -0
  158. package/composables/event/useEventColor.ts +25 -0
  159. package/composables/event/useEventComponent.ts +87 -0
  160. package/composables/event/useEventTimeseries.ts +39 -0
  161. package/composables/event/useEventTimeseriesStats.ts +26 -0
  162. package/composables/file/useFileUpload.ts +91 -0
  163. package/composables/file/useSupportedFileTypes.ts +22 -0
  164. package/composables/form/useCreateInstanceForm.ts +251 -0
  165. package/composables/form/useFormKitTransform.ts +753 -0
  166. package/composables/memory/useMemoryCRUD.ts +88 -0
  167. package/composables/memory/useMemoryFactory.ts +319 -0
  168. package/composables/memory/useMemorySearchFilter.ts +74 -0
  169. package/composables/models/useModelsList.ts +24 -0
  170. package/composables/models/useSingleModel.ts +30 -0
  171. package/composables/notification/useNotificationPoller.ts +58 -0
  172. package/composables/notification/useNotifications.ts +57 -0
  173. package/composables/notification/useUpdateMultipleNotifications.ts +17 -0
  174. package/composables/notification/useUpdateNotification.ts +17 -0
  175. package/composables/process/useCreateProcessInstance.ts +32 -0
  176. package/composables/process/useDeleteProcessInstance.ts +31 -0
  177. package/composables/process/useProcessClasses.ts +27 -0
  178. package/composables/process/useProcessInstance.ts +28 -0
  179. package/composables/process/useProcessInstances.ts +27 -0
  180. package/composables/process/useProcessWalkthroughs.ts +73 -0
  181. package/composables/process/useSendProcessStartForm.ts +43 -0
  182. package/composables/process/useUpdateProcessInstance.ts +40 -0
  183. package/composables/role/useCreateRole.ts +19 -0
  184. package/composables/role/useDeleteRole.ts +21 -0
  185. package/composables/role/useRole.ts +30 -0
  186. package/composables/role/useRoles.ts +25 -0
  187. package/composables/role/useUpdateRole.ts +22 -0
  188. package/composables/suite/useApps.ts +31 -0
  189. package/composables/suite/useSuite.ts +26 -0
  190. package/composables/tenant/useActiveTenant.ts +27 -0
  191. package/composables/tenant/useSysadminNavigation.ts +19 -0
  192. package/composables/tenant/useTenant.ts +38 -0
  193. package/composables/tenant/useTenantMemberships.ts +15 -0
  194. package/composables/tenant/useTenantPath.ts +20 -0
  195. package/composables/tenant/useTenantPolling.ts +30 -0
  196. package/composables/tenant/useTenantReady.ts +12 -0
  197. package/composables/theme/useDarkMode.ts +5 -0
  198. package/composables/thread/useThread.ts +27 -0
  199. package/composables/thread/useThreadEvents.ts +91 -0
  200. package/composables/thread/useThreadUtils.ts +49 -0
  201. package/composables/thread/useThreads.ts +64 -0
  202. package/composables/thread/useThreadsInfinite.ts +56 -0
  203. package/composables/translation/useTranslate.ts +20 -0
  204. package/composables/useRouteReady.ts +21 -0
  205. package/composables/useTimeAgo.ts +40 -0
  206. package/composables/user/useAssignRoleToUser.ts +22 -0
  207. package/composables/user/useMyUser.ts +25 -0
  208. package/composables/user/useRevokeRoleFromUser.ts +21 -0
  209. package/composables/user/useUser.ts +30 -0
  210. package/composables/user/useUsers.ts +63 -0
  211. package/composables/utils/useJsonTree.ts +138 -0
  212. package/formkit.config.ts +44 -0
  213. package/i18n/locales/de.yaml +815 -0
  214. package/i18n/locales/en.yaml +804 -0
  215. package/i18n/locales/fr.yaml +812 -0
  216. package/i18n/locales/it.yaml +808 -0
  217. package/layouts/anonymous.vue +8 -0
  218. package/layouts/default.vue +116 -0
  219. package/middleware/auth.global.ts +62 -0
  220. package/nuxt.config.ts +145 -0
  221. package/package.json +114 -0
  222. package/pages/[tenant]/index.vue +31 -0
  223. package/pages/[tenant]/notifications/index.vue +235 -0
  224. package/pages/[tenant]/service/agents/[agent_class]-[agent_id]/chat.vue +67 -0
  225. package/pages/[tenant]/service/agents/[agent_class]-[agent_id]/configuration.vue +122 -0
  226. package/pages/[tenant]/service/agents/[agent_class]-[agent_id]/memories/[memory_id].vue +3 -0
  227. package/pages/[tenant]/service/agents/[agent_class]-[agent_id]/memories.vue +20 -0
  228. package/pages/[tenant]/service/agents/[agent_class]-[agent_id]/overview.vue +72 -0
  229. package/pages/[tenant]/service/agents/[agent_class]-[agent_id]/threads.vue +52 -0
  230. package/pages/[tenant]/service/agents/[agent_class]-[agent_id]/workflow.vue +19 -0
  231. package/pages/[tenant]/service/agents/[agent_class]-[agent_id].vue +63 -0
  232. package/pages/[tenant]/service/agents/templates.vue +102 -0
  233. package/pages/[tenant]/service/agents.vue +185 -0
  234. package/pages/[tenant]/service/datasets/[dataset_id].vue +81 -0
  235. package/pages/[tenant]/service/datasets.vue +53 -0
  236. package/pages/[tenant]/service/health/index.vue +3 -0
  237. package/pages/[tenant]/service/knowledge/[db]/[namespace]/[document_id]/nodes.vue +20 -0
  238. package/pages/[tenant]/service/knowledge/[db]/[namespace]/[document_id]/overview.vue +40 -0
  239. package/pages/[tenant]/service/knowledge/[db]/[namespace]/[document_id]/summary.vue +88 -0
  240. package/pages/[tenant]/service/knowledge/[db]/[namespace]/[document_id].vue +48 -0
  241. package/pages/[tenant]/service/knowledge/[db]/[namespace].vue +144 -0
  242. package/pages/[tenant]/service/knowledge.vue +126 -0
  243. package/pages/[tenant]/service/models/[model_name].vue +84 -0
  244. package/pages/[tenant]/service/models.vue +61 -0
  245. package/pages/[tenant]/service/my-account.vue +117 -0
  246. package/pages/[tenant]/service/openai/[thread_id]/[display_id]/memories.vue +66 -0
  247. package/pages/[tenant]/service/openai/[thread_id]/[display_id]/sources.vue +100 -0
  248. package/pages/[tenant]/service/openai/[thread_id]/[display_id]/tracing.vue +49 -0
  249. package/pages/[tenant]/service/openai.vue +101 -0
  250. package/pages/[tenant]/service/organization-memories/graph.vue +97 -0
  251. package/pages/[tenant]/service/organization-memories/list/[memory_id].vue +3 -0
  252. package/pages/[tenant]/service/organization-memories/list.vue +150 -0
  253. package/pages/[tenant]/service/organization-memories.vue +3 -0
  254. package/pages/[tenant]/service/processes/[process_class]-[process_id]/[process_walkthrough_id].vue +7 -0
  255. package/pages/[tenant]/service/processes/[process_class]-[process_id]/configuration.vue +106 -0
  256. package/pages/[tenant]/service/processes/[process_class]-[process_id]/overview.vue +67 -0
  257. package/pages/[tenant]/service/processes/[process_class]-[process_id]/start.vue +26 -0
  258. package/pages/[tenant]/service/processes/[process_class]-[process_id]/walkthroughs/[process_walkthrough_id]/overview.vue +14 -0
  259. package/pages/[tenant]/service/processes/[process_class]-[process_id]/walkthroughs.vue +54 -0
  260. package/pages/[tenant]/service/processes/[process_class]-[process_id].vue +60 -0
  261. package/pages/[tenant]/service/processes.vue +129 -0
  262. package/pages/[tenant]/service/roles/[role_id].vue +54 -0
  263. package/pages/[tenant]/service/roles.vue +84 -0
  264. package/pages/[tenant]/service/threads/[thread_id]/chat.vue +51 -0
  265. package/pages/[tenant]/service/threads/[thread_id]/display/[display_id].vue +21 -0
  266. package/pages/[tenant]/service/threads/[thread_id]/display.vue +29 -0
  267. package/pages/[tenant]/service/threads/[thread_id]/hierarchy.vue +14 -0
  268. package/pages/[tenant]/service/threads/[thread_id]/memories/[memory_id].vue +3 -0
  269. package/pages/[tenant]/service/threads/[thread_id]/memories.vue +19 -0
  270. package/pages/[tenant]/service/threads/[thread_id]/overview.vue +100 -0
  271. package/pages/[tenant]/service/threads/[thread_id].vue +54 -0
  272. package/pages/[tenant]/service/threads.vue +52 -0
  273. package/pages/[tenant]/service/user-memories/graph.vue +97 -0
  274. package/pages/[tenant]/service/user-memories/list/[memory_id].vue +3 -0
  275. package/pages/[tenant]/service/user-memories/list.vue +150 -0
  276. package/pages/[tenant]/service/user-memories.vue +3 -0
  277. package/pages/[tenant]/service/users/[user_id].vue +117 -0
  278. package/pages/[tenant]/service/users.vue +88 -0
  279. package/pages/auth/callback.vue +52 -0
  280. package/pages/auth/login.vue +80 -0
  281. package/pages/auth/renew.vue +24 -0
  282. package/pages/index.vue +59 -0
  283. package/pages/select-tenant.vue +76 -0
  284. package/plugins/0.runtime-config.client.ts +55 -0
  285. package/plugins/apexcharts.client.ts +5 -0
  286. package/plugins/api-client.client.ts +38 -0
  287. package/plugins/dark-mode.client.ts +12 -0
  288. package/plugins/keycloak-client.ts +41 -0
  289. package/plugins/oidc-client.ts +78 -0
  290. package/sdk/client/client/client.gen.ts +237 -0
  291. package/sdk/client/client/index.ts +24 -0
  292. package/sdk/client/client/types.gen.ts +213 -0
  293. package/sdk/client/client/utils.gen.ts +407 -0
  294. package/sdk/client/client.gen.ts +25 -0
  295. package/sdk/client/core/auth.gen.ts +42 -0
  296. package/sdk/client/core/bodySerializer.gen.ts +96 -0
  297. package/sdk/client/core/params.gen.ts +181 -0
  298. package/sdk/client/core/pathSerializer.gen.ts +180 -0
  299. package/sdk/client/core/queryKeySerializer.gen.ts +136 -0
  300. package/sdk/client/core/serverSentEvents.gen.ts +265 -0
  301. package/sdk/client/core/types.gen.ts +118 -0
  302. package/sdk/client/core/utils.gen.ts +143 -0
  303. package/sdk/client/index.ts +1013 -0
  304. package/sdk/client/schemas.gen.ts +35395 -0
  305. package/sdk/client/sdk.gen.ts +3438 -0
  306. package/sdk/client/transformers.gen.ts +143 -0
  307. package/sdk/client/types.gen.ts +27567 -0
  308. package/tailwind.config.mjs +27 -0
  309. package/themes/aihub-theme.ts +125 -0
  310. package/types/DashboardWidget.ts +13 -0
  311. package/types/EventChartInput.ts +7 -0
  312. package/types/NavItem.ts +6 -0
  313. package/types/TimeseriesInput.ts +7 -0
@@ -0,0 +1,132 @@
1
+ <template>
2
+ <div class="flex flex-col gap-2 rounded-lg border border-surface-200 p-4 dark:border-surface-700">
3
+ <span class="flex items-center gap-1 font-semibold">
4
+ {{ t('role.access_rules') }}
5
+ <i
6
+ class="pi pi-question-circle text-surface-400"
7
+ @mouseenter="(e: Event) => accessRulesHelp?.show(e)"
8
+ @mouseleave="() => accessRulesHelp?.hide()"
9
+ />
10
+ <Popover ref="accessRulesHelp">
11
+ <div class="text-sm font-normal">
12
+ <p class="mb-2">
13
+ {{ t('role.access_rules_help_intro') }}
14
+ </p>
15
+ <ul class="flex flex-col gap-1">
16
+ <li class="whitespace-nowrap"><Badge
17
+ value="aihub.user.agent.>"
18
+ severity="secondary"
19
+ size="small"
20
+ /> — {{ t('role.access_rules_help_all_agents') }}</li>
21
+ <li class="whitespace-nowrap"><Badge
22
+ value="aihub.user.agent.MyAgent.*"
23
+ severity="secondary"
24
+ size="small"
25
+ /> — {{ t('role.access_rules_help_agent_instances') }}</li>
26
+ <li class="whitespace-nowrap"><Badge
27
+ value="aihub.user.service.knowledge"
28
+ severity="secondary"
29
+ size="small"
30
+ /> — {{ t('role.access_rules_help_service') }}</li>
31
+ <li class="whitespace-nowrap"><Badge
32
+ value="aihub.admin.>"
33
+ severity="secondary"
34
+ size="small"
35
+ /> — {{ t('role.access_rules_help_admin') }}</li>
36
+ </ul>
37
+ </div>
38
+ </Popover>
39
+ </span>
40
+ <DataTable
41
+ v-if="rules.length"
42
+ :value="tableRows"
43
+ data-key="id"
44
+ size="small"
45
+ >
46
+ <Column field="accessRule">
47
+ <template #body="{ data }">
48
+ <Badge
49
+ :value="data.accessRule"
50
+ severity="secondary"
51
+ class="border border-gray-400/30"
52
+ />
53
+ </template>
54
+ </Column>
55
+ <Column class="w-24 !text-end">
56
+ <template #body="{ data }">
57
+ <Tag
58
+ v-if="isNew(data.accessRule)"
59
+ :value="t('role.is_new')"
60
+ severity="success"
61
+ />
62
+ </template>
63
+ </Column>
64
+ <Column class="w-12">
65
+ <template #body="{ data }">
66
+ <Button
67
+ icon="pi pi-times"
68
+ severity="secondary"
69
+ variant="text"
70
+ rounded
71
+ size="small"
72
+ @click="remove(data.accessRule)"
73
+ />
74
+ </template>
75
+ </Column>
76
+ </DataTable>
77
+ <span
78
+ v-else
79
+ class="text-sm italic text-muted-color"
80
+ >
81
+ {{ t('role.no_access_rules') }}
82
+ </span>
83
+ <div class="flex items-center gap-2">
84
+ <InputText
85
+ v-model="newRule"
86
+ :placeholder="t('role.add_access_role')"
87
+ size="small"
88
+ class="flex-1"
89
+ @keyup.enter="add"
90
+ />
91
+ <Button
92
+ type="button"
93
+ icon="pi pi-plus"
94
+ :label="t('role.add_button')"
95
+ size="small"
96
+ :disabled="!newRule"
97
+ @click="add"
98
+ />
99
+ </div>
100
+ </div>
101
+ </template>
102
+
103
+ <script setup lang="ts">
104
+ import { useI18n } from 'vue-i18n'
105
+
106
+ const { t } = useI18n()
107
+
108
+ const accessRulesHelp = ref()
109
+ const rules = defineModel<string[]>('rules', { required: true })
110
+
111
+ const props = defineProps<{
112
+ initialRules: string[]
113
+ }>()
114
+
115
+ const tableRows = computed(() =>
116
+ rules.value.map(accessRule => ({ accessRule, id: accessRule })),
117
+ )
118
+
119
+ const newRule = ref('')
120
+
121
+ const isNew = (rule: string) => !props.initialRules.includes(rule)
122
+
123
+ const add = () => {
124
+ if (!newRule.value) return
125
+ rules.value.push(newRule.value)
126
+ newRule.value = ''
127
+ }
128
+
129
+ const remove = (rule: string) => {
130
+ rules.value = rules.value.filter(r => r !== rule)
131
+ }
132
+ </script>
@@ -0,0 +1,68 @@
1
+ <template>
2
+ <div
3
+ class="flex cursor-pointer flex-col gap-3 rounded-xl border border-surface-200 p-4 hover:bg-surface-100 dark:border-surface-800 hover:dark:bg-surface-800"
4
+ :class="{ 'bg-surface-100 dark:bg-surface-800': isActive }"
5
+ >
6
+ <div class="flex items-start gap-3">
7
+ <div class="flex flex-1 flex-col gap-3">
8
+ <div class="flex items-center gap-2">
9
+ <div
10
+ class="flex items-center justify-center rounded-full bg-white p-3 dark:bg-surface-900"
11
+ >
12
+ <Icon
13
+ name="mage:book"
14
+ size="1.5em"
15
+ />
16
+ </div>
17
+ <h3 class="font-semibold opacity-80">
18
+ {{ role.name }}
19
+ </h3>
20
+ </div>
21
+ <span
22
+ v-if="role.description"
23
+ class="text-xs"
24
+ >
25
+ {{ role.description }}
26
+ </span>
27
+ <div class="flex flex-wrap gap-2 text-sm">
28
+ <Badge
29
+ v-for="access_rule in role.access_rules"
30
+ :key="access_rule"
31
+ :value="access_rule"
32
+ severity="secondary"
33
+ class="border border-surface-200 dark:border-surface-700"
34
+ />
35
+ </div>
36
+ </div>
37
+ <Button
38
+ icon="pi pi-trash"
39
+ severity="contrast"
40
+ variant="text"
41
+ rounded
42
+ :aria-label="t('common.actions.delete')"
43
+ @click.stop="emit('delete', props.role)"
44
+ />
45
+ </div>
46
+ </div>
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import { useI18n } from 'vue-i18n'
51
+
52
+ import type { RoleResponse } from '@core/sdk/client'
53
+
54
+ const props = defineProps<{
55
+ role: RoleResponse
56
+ }>()
57
+
58
+ const emit = defineEmits<{
59
+ delete: [role: RoleResponse]
60
+ }>()
61
+
62
+ const { t } = useI18n()
63
+ const route = useRoute()
64
+
65
+ const isActive = computed(() => {
66
+ return route.params.role_id === props.role.id
67
+ })
68
+ </script>
@@ -0,0 +1,55 @@
1
+ <template>
2
+ <div>
3
+ <span class="mb-8 block text-surface-500 dark:text-surface-400">
4
+ {{ t('role.create_dialog.description') }}
5
+ </span>
6
+ <div class="mb-4 flex flex-col gap-4">
7
+ <RoleEdit
8
+ v-model="role"
9
+ />
10
+ <div class="flex justify-end gap-2">
11
+ <Button
12
+ type="button"
13
+ :label="t('role.create_dialog.cancel')"
14
+ severity="secondary"
15
+ @click="close"
16
+ />
17
+ <Button
18
+ type="button"
19
+ :label="t('role.create_dialog.save')"
20
+ :disabled="!role.name || !role.description || !role.access_rules?.length"
21
+ @click="save"
22
+ />
23
+ </div>
24
+ </div>
25
+ </div>
26
+ </template>
27
+
28
+ <script setup lang="ts">
29
+ import { useI18n } from 'vue-i18n'
30
+
31
+ import type { CreateRoleRequest } from '@core/sdk/client'
32
+
33
+ const { t } = useI18n()
34
+
35
+ const role = ref<CreateRoleRequest>({
36
+ name: '',
37
+ description: '',
38
+ access_rules: [],
39
+ })
40
+
41
+ const emit = defineEmits<{
42
+ close: []
43
+ }>()
44
+
45
+ const { tenantId } = useTenant()
46
+ const { createRole } = useCreateRole()
47
+
48
+ const close = () => {
49
+ emit('close')
50
+ }
51
+ const save = async () => {
52
+ await createRole({ createdRole: role.value, tenantId: tenantId.value! })
53
+ emit('close')
54
+ }
55
+ </script>
@@ -0,0 +1,82 @@
1
+ <template>
2
+ <div class="flex flex-col gap-4">
3
+ <div class="flex flex-col gap-2">
4
+ <FloatLabel variant="in">
5
+ <InputText
6
+ id="in_label_name"
7
+ v-model="role.name"
8
+ rows="5"
9
+ cols="30"
10
+ class="w-full"
11
+ />
12
+ <label for="in_label_name">
13
+ {{ t('role.name') }}
14
+ </label>
15
+ </FloatLabel>
16
+ <FloatLabel variant="in">
17
+ <Textarea
18
+ id="in_label_description"
19
+ v-model="role.description"
20
+ rows="3"
21
+ cols="30"
22
+ class="w-full"
23
+ />
24
+ <label for="in_label_description">
25
+ {{ t('role.description') }}
26
+ </label>
27
+ </FloatLabel>
28
+ </div>
29
+
30
+ <AccessRulesEditor
31
+ v-model:rules="accessRules"
32
+ :initial-rules="initialAccessRules"
33
+ />
34
+
35
+ <UsageLimitsEditor v-model:limits="usageLimits" />
36
+ </div>
37
+ </template>
38
+
39
+ <script setup lang="ts">
40
+ import { useI18n } from 'vue-i18n'
41
+
42
+ import AccessRulesEditor from './AccessRulesEditor.vue'
43
+ import UsageLimitsEditor from './UsageLimitsEditor.vue'
44
+
45
+ import type { CreateRoleRequest, RoleResponse } from '@core/sdk/client'
46
+
47
+ const { t } = useI18n()
48
+
49
+ const props = defineProps<{
50
+ modelValue: RoleResponse | CreateRoleRequest
51
+ }>()
52
+
53
+ const emit = defineEmits<{
54
+ 'update:modelValue': [RoleResponse | CreateRoleRequest]
55
+ }>()
56
+
57
+ const initialAccessRules = ref<string[]>([...(props.modelValue.access_rules ?? [])])
58
+ const role = ref<RoleResponse | CreateRoleRequest>(props.modelValue)
59
+
60
+ watch(() => props.modelValue, (newValue) => {
61
+ role.value = newValue
62
+ }, { deep: true })
63
+
64
+ const accessRules = computed({
65
+ get: () => role.value.access_rules ?? [],
66
+ set: (val) => { role.value.access_rules = val },
67
+ })
68
+
69
+ const usageLimits = computed({
70
+ get: () => role.value.usage_limits ?? [],
71
+ set: (val) => { role.value.usage_limits = val },
72
+ })
73
+
74
+ watch(() => [
75
+ role.value.name,
76
+ role.value.description,
77
+ JSON.stringify(role.value.access_rules),
78
+ JSON.stringify(role.value.usage_limits),
79
+ ], () => {
80
+ emit('update:modelValue', role.value)
81
+ })
82
+ </script>
@@ -0,0 +1,225 @@
1
+ <template>
2
+ <div class="flex flex-col gap-3 rounded-lg border border-surface-200 p-4 dark:border-surface-700">
3
+ <div class="flex items-center justify-between">
4
+ <span class="font-semibold">{{ t('role.usage_limits') }}</span>
5
+ <div class="flex items-center gap-2">
6
+ <label
7
+ for="unlimited"
8
+ class="text-sm"
9
+ >{{ t('role.unlimited') }}</label>
10
+ <ToggleSwitch
11
+ v-model="isUnlimited"
12
+ input-id="unlimited"
13
+ />
14
+ </div>
15
+ </div>
16
+
17
+ <div
18
+ v-if="!isUnlimited"
19
+ class="flex flex-col gap-3"
20
+ >
21
+ <table class="w-full text-sm">
22
+ <colgroup>
23
+ <col>
24
+ <col class="w-24">
25
+ <col class="w-24">
26
+ <col class="w-12">
27
+ </colgroup>
28
+ <thead>
29
+ <tr>
30
+ <th class="py-2 text-start font-medium">
31
+ <span class="flex items-center gap-1">
32
+ {{ t('role.usage_pattern') }}
33
+ <i
34
+ class="pi pi-question-circle text-surface-400"
35
+ @mouseenter="(e: Event) => patternHelp?.show(e)"
36
+ @mouseleave="() => patternHelp?.hide()"
37
+ />
38
+ </span>
39
+ <Popover ref="patternHelp">
40
+ <div class="text-sm font-normal">
41
+ <p class="mb-2">
42
+ {{ t('role.pattern_help_intro') }}
43
+ </p>
44
+ <ul class="flex flex-col gap-1">
45
+ <li class="whitespace-nowrap">
46
+ <Badge
47
+ value=">"
48
+ severity="secondary"
49
+ size="small"
50
+ /> — {{ t('role.pattern_help_all') }}
51
+ </li>
52
+ <li class="whitespace-nowrap">
53
+ <Badge
54
+ value="MyAgent.*"
55
+ severity="secondary"
56
+ size="small"
57
+ /> — {{ t('role.pattern_help_wildcard') }}
58
+ </li>
59
+ <li class="whitespace-nowrap">
60
+ <Badge
61
+ value="MyAgent.prod"
62
+ severity="secondary"
63
+ size="small"
64
+ /> — {{ t('role.pattern_help_specific') }}
65
+ </li>
66
+ </ul>
67
+ </div>
68
+ </Popover>
69
+ </th>
70
+ <th class="py-2 text-start font-medium">
71
+ {{ t('role.usage_limit_value') }}
72
+ </th>
73
+ <th class="py-2 text-start font-medium">
74
+ {{ t('role.usage_period') }}
75
+ </th>
76
+ <th />
77
+ </tr>
78
+ </thead>
79
+ <tbody>
80
+ <tr
81
+ v-for="(ul, index) in limits"
82
+ :key="`${ul.pattern}-${ul.period}-${index}`"
83
+ class="border-b border-surface-200 dark:border-surface-700"
84
+ >
85
+ <td class="py-2">
86
+ <div class="flex items-center gap-2">
87
+ <Badge
88
+ :value="ul.pattern"
89
+ severity="secondary"
90
+ class="border border-gray-400/30"
91
+ />
92
+ <small
93
+ v-if="ul.description"
94
+ class="text-surface-500 dark:text-surface-400"
95
+ >
96
+ {{ ul.description }}
97
+ </small>
98
+ </div>
99
+ </td>
100
+ <td class="py-2">
101
+ {{ ul.limit }} {{ t('role.calls_per') }}
102
+ </td>
103
+ <td class="py-2">
104
+ {{ getPeriodLabel(ul.period) }}
105
+ </td>
106
+ <td class="py-2 text-end">
107
+ <Button
108
+ icon="pi pi-times"
109
+ severity="secondary"
110
+ variant="text"
111
+ rounded
112
+ size="small"
113
+ @click="remove(ul.pattern, ul.period)"
114
+ />
115
+ </td>
116
+ </tr>
117
+ </tbody>
118
+ <tfoot>
119
+ <tr>
120
+ <td class="py-2">
121
+ <div class="flex items-center">
122
+ <span class="whitespace-nowrap rounded-l border border-r-0 border-surface-300 bg-surface-100 px-2 py-1.5 text-xs text-muted-color dark:border-surface-600 dark:bg-surface-800">
123
+ {{ AGENT_PREFIX }}
124
+ </span>
125
+ <InputText
126
+ v-model="newPattern"
127
+ placeholder=">"
128
+ size="small"
129
+ class="w-full rounded-l-none"
130
+ />
131
+ </div>
132
+ </td>
133
+ <td class="py-2">
134
+ <InputText
135
+ v-model.number="newLimit"
136
+ type="number"
137
+ min="1"
138
+ :placeholder="t('role.usage_limit_value')"
139
+ size="small"
140
+ class="w-full"
141
+ />
142
+ </td>
143
+ <td class="py-2">
144
+ <select
145
+ v-model="newPeriod"
146
+ class="w-full rounded border border-surface-300 bg-surface-0 px-2 py-1.5 text-sm dark:border-surface-600 dark:bg-surface-900"
147
+ >
148
+ <option
149
+ v-for="opt in periodOptions"
150
+ :key="opt.value"
151
+ :value="opt.value"
152
+ >
153
+ {{ opt.label }}
154
+ </option>
155
+ </select>
156
+ </td>
157
+ <td class="py-2 text-end">
158
+ <Button
159
+ type="button"
160
+ icon="pi pi-plus"
161
+ :label="t('role.add_button')"
162
+ size="small"
163
+ :disabled="!canAdd"
164
+ @click="add"
165
+ />
166
+ </td>
167
+ </tr>
168
+ </tfoot>
169
+ </table>
170
+ </div>
171
+ </div>
172
+ </template>
173
+
174
+ <script setup lang="ts">
175
+ import { useI18n } from 'vue-i18n'
176
+
177
+ import type { UsageLimitDTO } from '@core/sdk/client'
178
+
179
+ const { t } = useI18n()
180
+
181
+ const patternHelp = ref()
182
+ const AGENT_PREFIX = 'aihub.user.agent.'
183
+ const PERIOD_VALUES = ['1h', '1d', '7d', '1mo'] as const
184
+
185
+ const limits = defineModel<UsageLimitDTO[]>('limits', { required: true })
186
+
187
+ const isUnlimited = ref(limits.value.length === 0)
188
+
189
+ watch(isUnlimited, (val) => {
190
+ if (val) {
191
+ limits.value = []
192
+ }
193
+ })
194
+
195
+ const periodOptions = computed(() =>
196
+ PERIOD_VALUES.map(value => ({ value, label: t(`period.${value}`) })),
197
+ )
198
+
199
+ const getPeriodLabel = (period: string): string => t(`period.${period}`)
200
+
201
+ const newPattern = ref('>')
202
+ const newLimit = ref<number>(100)
203
+ const newPeriod = ref<string>('1d')
204
+
205
+ const canAdd = computed(() => {
206
+ if (!newPattern.value || !newLimit.value || newLimit.value < 1 || !newPeriod.value) {
207
+ return false
208
+ }
209
+ const fullPattern = `${AGENT_PREFIX}${newPattern.value}`
210
+ return !limits.value.some(ul => ul.pattern === fullPattern && ul.period === newPeriod.value)
211
+ })
212
+
213
+ const add = () => {
214
+ if (!canAdd.value) return
215
+ const fullPattern = `${AGENT_PREFIX}${newPattern.value}`
216
+ limits.value.push({ pattern: fullPattern, limit: newLimit.value, period: newPeriod.value })
217
+ newPattern.value = '>'
218
+ newLimit.value = 100
219
+ newPeriod.value = '1d'
220
+ }
221
+
222
+ const remove = (pattern: string, period: string) => {
223
+ limits.value = limits.value.filter(ul => !(ul.pattern === pattern && ul.period === period))
224
+ }
225
+ </script>