@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,100 @@
1
+ <template>
2
+ <ProgressBar
3
+ v-if="threadIsLoading || threadEventsAreLoading || !thread || !threadEvents"
4
+ mode="indeterminate"
5
+ style="height: 2px"
6
+ />
7
+ <div
8
+ v-else
9
+ ref="threadPanelRef"
10
+ class="relative h-[calc(100vh-50px)] w-1/2 min-w-[800px] overflow-y-auto border-l border-surface-200 p-3 dark:border-surface-700"
11
+ >
12
+ <div class="flex flex-col gap-4">
13
+ <div class="flex items-center gap-2 p-3">
14
+ <ToggleSwitch
15
+ v-model="showInactive"
16
+ />
17
+ <p class="text-sm opacity-60">
18
+ Show Unused Nodes
19
+ </p>
20
+ </div>
21
+ <div
22
+ v-for="(docInfo, docId) in documentMap"
23
+ :key="docId"
24
+ >
25
+ <KnowledgeDocumentWithNodes
26
+ :db="docInfo.db"
27
+ :namespace="docInfo.namespace"
28
+ :document-id="docInfo.id"
29
+ :input-nodes="docInfo.nodes"
30
+ :show-inactive="showInactive"
31
+ />
32
+ </div>
33
+ </div>
34
+ <div
35
+ class="fixed top-1/2 -translate-y-1/2"
36
+ :style="{ left: `${panelLeftPosition - 16}px` }"
37
+ >
38
+ <i
39
+ class="pi pi-chevron-right cursor-pointer rounded-full border border-surface-200 bg-surface-0 p-3 hover:bg-surface-100 dark:border-surface-700 dark:bg-surface-900 hover:dark:bg-surface-800"
40
+ @click="closeSources"
41
+ />
42
+ </div>
43
+ </div>
44
+ </template>
45
+
46
+ <script setup lang="ts">
47
+ import type { ContextualizedAgentEvent, RetrieverEventReadable, IngestedNode } from '@core/sdk/client'
48
+
49
+ const route = useRoute()
50
+ const router = useRouter()
51
+ const tenantPath = useTenantPath()
52
+
53
+ const showInactive = ref<boolean>(false)
54
+ const threadPanelRef = ref(null)
55
+ const panelBounding = useElementBounding(threadPanelRef)
56
+ const panelLeftPosition = computed(() => panelBounding.left.value)
57
+
58
+ const { thread, threadIsLoading } = useThread()
59
+ const { threadEvents, threadEventsAreLoading } = useThreadEvents()
60
+
61
+ const closeSources = () => {
62
+ router.push(tenantPath('/service/openai'))
63
+ }
64
+
65
+ const retrieveEvents = computed<ContextualizedAgentEvent[]>(() => {
66
+ return threadEvents.value?.filter((event: ContextualizedAgentEvent) => {
67
+ return event.display_id === route.params.display_id && event.event.nodes
68
+ })
69
+ })
70
+
71
+ type DocumentInfo = {
72
+ db: string
73
+ namespace: string
74
+ id: string
75
+ nodes: IngestedNode[]
76
+ }
77
+
78
+ const extractBucket = (source: string): string => {
79
+ const match = source.match(/(?:s3:\/\/|^\/)([^/]+)/)
80
+ return match?.[1] ?? ''
81
+ }
82
+
83
+ const documentMap = computed<Record<string, DocumentInfo>>(() => {
84
+ const docs: Record<string, DocumentInfo> = {}
85
+ retrieveEvents.value?.forEach((event: ContextualizedAgentEvent & { event: RetrieverEventReadable }) => {
86
+ (event.event.nodes ?? []).forEach((node: IngestedNode) => {
87
+ if (!(node.document_id in docs)) {
88
+ docs[node.document_id] = {
89
+ db: extractBucket(node.source),
90
+ namespace: node.namespace,
91
+ id: node.document_id,
92
+ nodes: [],
93
+ }
94
+ }
95
+ docs[node.document_id].nodes.push(node)
96
+ })
97
+ })
98
+ return docs
99
+ })
100
+ </script>
@@ -0,0 +1,49 @@
1
+ <template>
2
+ <ProgressBar
3
+ v-if="threadIsLoading || threadEventsAreLoading || !thread || !threadEvents"
4
+ mode="indeterminate"
5
+ style="height: 2px"
6
+ />
7
+ <div
8
+ v-else
9
+ ref="threadPanelRef"
10
+ class="relative h-[calc(100vh-50px)] w-1/2 min-w-[800px] overflow-y-auto border-l border-surface-200 p-3 dark:border-surface-700"
11
+ >
12
+ <ThreadDetails
13
+ :key="key"
14
+ :events="threadEvents"
15
+ :thread="thread"
16
+ :display-id="route.params.display_id"
17
+ />
18
+ <div
19
+ class="fixed top-1/2 -translate-y-1/2"
20
+ :style="{ left: `${panelLeftPosition - 16}px` }"
21
+ >
22
+ <i
23
+ class="pi pi-chevron-right cursor-pointer rounded-full border border-surface-200 bg-surface-0 p-3 hover:bg-surface-100 dark:border-surface-700 dark:bg-surface-900 hover:dark:bg-surface-800"
24
+ @click="closeThread"
25
+ />
26
+ </div>
27
+ </div>
28
+ </template>
29
+
30
+ <script setup lang="ts">
31
+ const route = useRoute()
32
+ const router = useRouter()
33
+ const tenantPath = useTenantPath()
34
+
35
+ const { thread, threadIsLoading } = useThread()
36
+ const { threadEvents, threadEventsAreLoading } = useThreadEvents()
37
+
38
+ const threadPanelRef = ref(null)
39
+ const panelBounding = useElementBounding(threadPanelRef)
40
+ const panelLeftPosition = computed(() => panelBounding.left.value)
41
+
42
+ const key = computed(() => {
43
+ return route.params.thread_id + route.params.display_id
44
+ })
45
+
46
+ const closeThread = () => {
47
+ router.push(tenantPath('/service/openai'))
48
+ }
49
+ </script>
@@ -0,0 +1,101 @@
1
+ <template>
2
+ <div class="flex flex-row">
3
+ <div class="h-[calc(100vh-50px)] w-full">
4
+ <iframe
5
+ :src="`${runtimeConfig.public.webui.url}/oauth/oidc/login`"
6
+ width="100%"
7
+ height="100%"
8
+ title="Open WebUI"
9
+ allow="microphone"
10
+ @load="handleIframeLoad"
11
+ />
12
+ </div>
13
+ <NuxtPage />
14
+
15
+ <Dialog
16
+ v-model:visible="mismatchDetected"
17
+ :header="t('tenant.mismatch_warning')"
18
+ modal
19
+ :closable="false"
20
+ >
21
+ <p>{{ t('tenant.mismatch_description', { tenant: backendTenantName }) }}</p>
22
+ <template #footer>
23
+ <Button
24
+ :label="t('tenant.mismatch_switch_action')"
25
+ icon="pi pi-refresh"
26
+ @click="onSwitchToBackendTenant"
27
+ />
28
+ </template>
29
+ </Dialog>
30
+ </div>
31
+ </template>
32
+
33
+ <script setup lang="ts">
34
+ import { onBeforeUnmount, onMounted } from 'vue'
35
+
36
+ const { t } = useI18n()
37
+ const runtimeConfig = useRuntimeConfig()
38
+ const route = useRoute()
39
+ const router = useRouter()
40
+ const tenantPath = useTenantPath()
41
+ const localePath = useLocalePath()
42
+ const { mismatchDetected, backendTenantId, backendTenantName } = useTenantPolling()
43
+ const { setTenant } = useTenant()
44
+
45
+ async function onSwitchToBackendTenant() {
46
+ if (!backendTenantId.value) return
47
+ await setTenant(backendTenantId.value)
48
+ }
49
+
50
+ let initialLoadDone = false
51
+
52
+ const handleIframeLoad = () => {
53
+ // Skip the initial load when iframe first renders OpenWebUI
54
+ if (!initialLoadDone) {
55
+ initialLoadDone = true
56
+ return
57
+ }
58
+
59
+ // Subsequent loads mean the iframe navigated (e.g. Keycloak logout redirect).
60
+ // Redirect to home without destroying the parent session — the local JWT
61
+ // stays valid, so the rest of the app keeps working. When the user navigates
62
+ // back here, the iframe re-triggers OIDC login against Keycloak.
63
+ console.log('OpenWebUI iframe navigated away, redirecting to home')
64
+ router.push(localePath('/'))
65
+ }
66
+
67
+ const handleMessage = (event: MessageEvent) => {
68
+ console.log('received post event', event)
69
+ if (event.origin === runtimeConfig.public.webui.url) {
70
+ const data = event.data
71
+
72
+ if (!['show-traces', 'show-sources', 'show-memories', 'set-context'].includes(data.type)) {
73
+ console.log('Unknown message type:', data.type)
74
+ return
75
+ }
76
+
77
+ const thread_id = data.thread_id as string
78
+ const display_id = data.display_id as string
79
+
80
+ if (data.type === 'show-traces' || route.path.endsWith('/tracing')) {
81
+ router.push(tenantPath(`/service/openai/${thread_id}/${display_id}/tracing`))
82
+ }
83
+ if (data.type === 'show-sources' || route.path.endsWith('/sources')) {
84
+ router.push(tenantPath(`/service/openai/${thread_id}/${display_id}/sources`))
85
+ }
86
+ if (data.type === 'show-memories' || route.path.endsWith('/memories')) {
87
+ router.push(tenantPath(`/service/openai/${thread_id}/${display_id}/memories`))
88
+ }
89
+ }
90
+ }
91
+
92
+ // Set up event listener when component is mounted
93
+ onMounted(() => {
94
+ window.addEventListener('message', handleMessage)
95
+ })
96
+
97
+ // Clean up event listener when component is unmounted
98
+ onBeforeUnmount(() => {
99
+ window.removeEventListener('message', handleMessage)
100
+ })
101
+ </script>
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <StructuralColumn
3
+ :title="t('memory.graph.title')"
4
+ :loading="memoriesAreLoading"
5
+ class="overflow-hidden"
6
+ >
7
+ <div class="flex h-full flex-col gap-2">
8
+ <div class="flex w-full items-center gap-2">
9
+ <IconField class="flex-1">
10
+ <InputIcon>
11
+ <i class="pi pi-search" />
12
+ </InputIcon>
13
+ <InputText
14
+ v-model="searchInput"
15
+ :placeholder="t('memory.search.placeholder')"
16
+ class="w-full"
17
+ @keyup.enter="handleSearch"
18
+ />
19
+ </IconField>
20
+ <Button
21
+ icon="pi pi-search"
22
+ :label="t('memory.search.button')"
23
+ :loading="isSearchButtonLoading"
24
+ @click="handleSearch"
25
+ />
26
+ <Button
27
+ v-if="isSearchActive"
28
+ icon="pi pi-times"
29
+ severity="secondary"
30
+ :label="t('memory.search.clear')"
31
+ @click="handleClearSearch"
32
+ />
33
+ </div>
34
+
35
+ <div class="flex-1">
36
+ <MemoryGraph
37
+ :relations="allRelations"
38
+ :selected-memory-id="selectedMemoryId"
39
+ :highlighted-relations="isSearchActive ? searchData?.relations : undefined"
40
+ @select-node="handleSelectNode"
41
+ />
42
+ </div>
43
+ </div>
44
+ </StructuralColumn>
45
+
46
+ <NuxtPage :selected-memory-id="selectedMemoryId" />
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ const { t } = useI18n()
51
+ const router = useRouter()
52
+ const route = useRoute()
53
+ const tenantPath = useTenantPath()
54
+
55
+ // Create organization memory composables using factory
56
+ const { useMemories, useMemorySearch } = createMemoryComposables({
57
+ type: 'organization',
58
+ })
59
+
60
+ const {
61
+ paginatedMemories,
62
+ allRelations,
63
+ memoriesAreLoading,
64
+ } = useMemories()
65
+
66
+ const {
67
+ searchData,
68
+ searchIsLoading,
69
+ isSearchActive,
70
+ setSearchQuery,
71
+ clearSearch,
72
+ } = useMemorySearch()
73
+
74
+ // Use shared search filter composable
75
+ const {
76
+ searchInput,
77
+ isSearchButtonLoading,
78
+ handleSearch,
79
+ handleClearSearch,
80
+ } = useMemorySearchFilter({
81
+ searchData,
82
+ paginatedMemories,
83
+ isSearchActive,
84
+ setSearchQuery,
85
+ clearSearch,
86
+ searchIsLoading,
87
+ })
88
+
89
+ const selectedMemoryId = computed(() => route.params.memory_id as string | undefined)
90
+
91
+ const handleSelectNode = (nodeId: string) => {
92
+ const memory = paginatedMemories.value.find(m => m.id === nodeId)
93
+ if (memory) {
94
+ router.push(tenantPath(`/service/organization-memories/graph/${memory.id}`))
95
+ }
96
+ }
97
+ </script>
@@ -0,0 +1,3 @@
1
+ <template>
2
+ <MemoryDetailPage memory-type="organization" />
3
+ </template>
@@ -0,0 +1,150 @@
1
+ <template>
2
+ <StructuralColumn
3
+ :title="t('memory.list.title')"
4
+ :loading="memoriesAreLoading"
5
+ >
6
+ <div class="flex h-full flex-col gap-2">
7
+ <div class="flex w-full items-center justify-between gap-2">
8
+ <div class="flex flex-1 items-center gap-2">
9
+ <IconField class="flex-1">
10
+ <InputIcon>
11
+ <i class="pi pi-search" />
12
+ </InputIcon>
13
+ <InputText
14
+ v-model="searchInput"
15
+ :placeholder="t('memory.search.placeholder')"
16
+ class="w-full"
17
+ @keyup.enter="handleSearch"
18
+ />
19
+ </IconField>
20
+ <Button
21
+ icon="pi pi-search"
22
+ :label="t('memory.search.button')"
23
+ :loading="isSearchButtonLoading"
24
+ @click="handleSearch"
25
+ />
26
+ <Button
27
+ v-if="isSearchActive"
28
+ icon="pi pi-times"
29
+ severity="secondary"
30
+ :label="t('memory.search.clear')"
31
+ @click="handleClearSearch"
32
+ />
33
+ </div>
34
+ <Button
35
+ v-tooltip.top="t('memory.delete_all.button')"
36
+ icon="pi pi-trash"
37
+ severity="danger"
38
+ text
39
+ rounded
40
+ @click="handleDeleteAll"
41
+ />
42
+ </div>
43
+
44
+ <div class="flex-1">
45
+ <MemoryList
46
+ :memories="displayedMemories"
47
+ :current-page="displayedCurrentPage"
48
+ :total-pages="displayedTotalPages"
49
+ :selected-memory-id="selectedMemoryId"
50
+ @select-memory="handleSelectMemory"
51
+ @next-page="nextPage"
52
+ @prev-page="prevPage"
53
+ />
54
+ </div>
55
+ </div>
56
+ </StructuralColumn>
57
+
58
+ <NuxtPage :selected-memory-id="selectedMemoryId" />
59
+ </template>
60
+
61
+ <script setup lang="ts">
62
+ import { useConfirm } from 'primevue/useconfirm'
63
+ import { useToast } from 'primevue/usetoast'
64
+
65
+ const { t } = useI18n()
66
+ const router = useRouter()
67
+ const route = useRoute()
68
+ const tenantPath = useTenantPath()
69
+ const confirm = useConfirm()
70
+ const toast = useToast()
71
+
72
+ // Create organization memory composables using factory
73
+ const { useMemories, useMemorySearch, useDeleteMemory } = createMemoryComposables({
74
+ type: 'organization',
75
+ })
76
+
77
+ const {
78
+ paginatedMemories,
79
+ currentPage,
80
+ totalPages,
81
+ memoriesAreLoading,
82
+ nextPage,
83
+ prevPage,
84
+ } = useMemories()
85
+
86
+ const {
87
+ searchData,
88
+ searchIsLoading,
89
+ isSearchActive,
90
+ setSearchQuery,
91
+ clearSearch,
92
+ } = useMemorySearch()
93
+
94
+ const { deleteAllMemories } = useDeleteMemory()
95
+
96
+ // Use shared search filter composable
97
+ const {
98
+ searchInput,
99
+ isSearchButtonLoading,
100
+ displayedMemories,
101
+ displayedCurrentPage,
102
+ displayedTotalPages,
103
+ handleSearch,
104
+ handleClearSearch,
105
+ } = useMemorySearchFilter({
106
+ searchData,
107
+ paginatedMemories,
108
+ isSearchActive,
109
+ setSearchQuery,
110
+ clearSearch,
111
+ searchIsLoading,
112
+ currentPage,
113
+ totalPages,
114
+ })
115
+
116
+ const selectedMemoryId = computed(() => route.params.memory_id as string | undefined)
117
+
118
+ const handleSelectMemory = (memory: { id: string }) => {
119
+ router.push(tenantPath(`/service/organization-memories/list/${memory.id}?q=${searchInput.value ?? ''}`))
120
+ }
121
+
122
+ const handleDeleteAll = () => {
123
+ confirm.require({
124
+ message: t('memory.delete_all.confirm_message'),
125
+ header: t('memory.delete_all.confirm_header'),
126
+ icon: 'pi pi-exclamation-triangle',
127
+ acceptClass: 'p-button-danger',
128
+ accept: async () => {
129
+ try {
130
+ await deleteAllMemories()
131
+ toast.add({
132
+ severity: 'success',
133
+ summary: t('memory.delete_all.success.title'),
134
+ detail: t('memory.delete_all.success.message'),
135
+ life: 3000,
136
+ })
137
+ }
138
+ catch (error) {
139
+ console.error('Failed to delete all memories:', error)
140
+ toast.add({
141
+ severity: 'error',
142
+ summary: t('memory.delete_all.error.title'),
143
+ detail: t('memory.delete_all.error.message'),
144
+ life: 5000,
145
+ })
146
+ }
147
+ },
148
+ })
149
+ }
150
+ </script>
@@ -0,0 +1,3 @@
1
+ <template>
2
+ <MemoryPageLayout memory-type="organization" />
3
+ </template>
@@ -0,0 +1,7 @@
1
+ <template>
2
+ <div>Process Walkthrough</div>
3
+ </template>
4
+
5
+ <script setup lang="ts">
6
+
7
+ </script>
@@ -0,0 +1,106 @@
1
+ <template>
2
+ <StructuralColumn
3
+ :title="t('process.configuration.title')"
4
+ close-route="/service/processes"
5
+ :loading="processInstanceIsLoading"
6
+ size="normal"
7
+ >
8
+ <div class="flex flex-col gap-3">
9
+ <p class="mb-4 text-sm text-surface-500 dark:text-surface-400">
10
+ {{ t('process.configuration.description') }}
11
+ </p>
12
+ <ProcessConfiguration
13
+ v-if="configForm && configForm.length > 0 && !processInstanceIsLoading"
14
+ :title="t('process.configuration.runtimeSettings')"
15
+ :description="processInstance?.process_config.description || ''"
16
+ :form="configForm"
17
+ :initial-data="configurationData"
18
+ @submit="submitConfiguration"
19
+ />
20
+ <div
21
+ v-else-if="processInstanceIsLoading"
22
+ class="text-center text-sm text-surface-500 dark:text-surface-400"
23
+ >
24
+ {{ t('common.loading') }}
25
+ </div>
26
+ <div
27
+ v-else
28
+ class="text-center text-sm text-surface-500 dark:text-surface-400"
29
+ >
30
+ {{ t('process.configuration.noConfiguration') }}
31
+ </div>
32
+ </div>
33
+ </StructuralColumn>
34
+ </template>
35
+
36
+ <script setup lang="ts">
37
+ import type { FullProcessInstanceDtoReadable } from '@core/sdk/client'
38
+
39
+ type FormElement = FullProcessInstanceDtoReadable['form'][number]
40
+
41
+ const route = useRoute()
42
+ const { processInstance, processInstanceIsLoading } = useProcessInstance()
43
+ const { updateProcessInstance } = useUpdateProcessInstance()
44
+ const { t } = useI18n()
45
+ const toast = useToast()
46
+
47
+ const configForm = computed(() => processInstance.value?.form || [])
48
+
49
+ const initializeGroupData = (
50
+ formElements: FormElement[],
51
+ data: Record<string, unknown>,
52
+ ): Record<string, unknown> => {
53
+ const result = { ...data }
54
+
55
+ for (const element of formElements) {
56
+ const elementRecord = element as Record<string, unknown>
57
+ const formkitType = elementRecord.formkit || elementRecord.$formkit
58
+
59
+ if (formkitType === 'group') {
60
+ const name = elementRecord.name as string
61
+ const children = elementRecord.children as FormElement[] | undefined
62
+
63
+ if (result[name] === null || result[name] === undefined) {
64
+ result[name] = {}
65
+ }
66
+
67
+ if (children && Array.isArray(children)) {
68
+ result[name] = initializeGroupData(children, result[name] as Record<string, unknown>)
69
+ }
70
+ }
71
+ }
72
+
73
+ return result
74
+ }
75
+
76
+ const configurationData = computed(() => {
77
+ const rawData = (processInstance.value?.configuration || {}) as Record<string, unknown>
78
+ return initializeGroupData(configForm.value, rawData)
79
+ })
80
+
81
+ const submitConfiguration = async (formData: Record<string, unknown>) => {
82
+ const processClass = route.params.process_class as string
83
+ const processId = route.params.process_id as string
84
+
85
+ try {
86
+ await updateProcessInstance({
87
+ processClass,
88
+ processId,
89
+ configuration: formData,
90
+ })
91
+ toast.add({
92
+ severity: 'success',
93
+ summary: t('process.configuration.saveSuccess'),
94
+ life: 3000,
95
+ })
96
+ }
97
+ catch (error) {
98
+ console.error('Failed to save process configuration:', error)
99
+ toast.add({
100
+ severity: 'error',
101
+ summary: t('process.configuration.saveError'),
102
+ life: 5000,
103
+ })
104
+ }
105
+ }
106
+ </script>
@@ -0,0 +1,67 @@
1
+ <template>
2
+ <StructuralColumn
3
+ :title="processInstance?.process_config.name"
4
+ close-route="/service/processes"
5
+ :loading="processInstanceIsLoading"
6
+ size="large"
7
+ >
8
+ <div class="flex flex-col gap-12">
9
+ <span class="mb-4 block text-sm text-surface-500 dark:text-surface-400">
10
+ {{ processInstance.process_config.description }}
11
+ </span>
12
+ <Panel
13
+ class="panel pt-5"
14
+ >
15
+ <div class="grid grid-cols-2 gap-4 xl:grid-cols-4">
16
+ <div class="flex flex-col items-start gap-2">
17
+ <span class="font-semibold">
18
+ {{ t('process.overview.name') }}
19
+ </span>
20
+ <Tag
21
+ :value="processInstance.process_config.name"
22
+ severity="secondary"
23
+ />
24
+ </div>
25
+ <div class="flex flex-col items-start gap-2">
26
+ <span class="font-semibold">
27
+ {{ t('process.overview.class') }}
28
+ </span>
29
+ <Tag
30
+ :value="processInstance.process_class"
31
+ severity="secondary"
32
+ />
33
+ </div>
34
+ <div class="flex flex-col items-start gap-2">
35
+ <span class="font-semibold">
36
+ {{ t('process.overview.processId') }}
37
+ </span>
38
+ <Tag
39
+ :value="processInstance.process_id"
40
+ severity="secondary"
41
+ />
42
+ </div>
43
+ <div class="flex flex-col items-start gap-2">
44
+ <span class="font-semibold">
45
+ {{ t('process.overview.status') }}
46
+ </span>
47
+ <Tag
48
+ :value="processInstance.is_online ? t('process.overview.online') : t('process.overview.offline')"
49
+ :severity="processInstance.is_online ? 'success' : 'error' "
50
+ />
51
+ </div>
52
+ </div>
53
+ </Panel>
54
+ </div>
55
+ </StructuralColumn>
56
+ </template>
57
+
58
+ <script setup lang="ts">
59
+ const { processInstance, processInstanceIsLoading } = useProcessInstance()
60
+ const { t } = useI18n()
61
+ </script>
62
+
63
+ <style scoped>
64
+ .panel :deep(.p-panel-header) {
65
+ padding: 0 !important;
66
+ }
67
+ </style>