@swiss-ai-hub/web 0.321.1 → 0.323.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/components/Event/Display/AddMemoryToChatHistoryEvent.vue +3 -3
  2. package/components/Event/Display/AttachedFileEvent.vue +42 -0
  3. package/components/Event/Display/AttachedFilesReadEvent.vue +22 -0
  4. package/components/Event/Display/BaseRetrieveMemoryEvent.vue +2 -2
  5. package/components/Event/Display/BaseStoreMemoryEvent.vue +2 -2
  6. package/components/Event/Display/CompleteConversationEvent.vue +35 -0
  7. package/components/Event/Display/ComposeContextEvent.vue +38 -0
  8. package/components/Event/Display/ContextComposedEvent.vue +60 -0
  9. package/components/Event/Display/ContextualizeConversationEvent.vue +26 -0
  10. package/components/Event/Display/ConversationContextualizedEvent.vue +34 -0
  11. package/components/Event/Display/HumanInTheLoopResponseEvent.vue +11 -1
  12. package/components/Event/Display/KnowledgeSearchedEvent.vue +33 -0
  13. package/components/Event/Display/MemoryRecalledEvent.vue +33 -0
  14. package/components/Event/Display/MemoryStorageRequestedEvent.vue +29 -0
  15. package/components/Event/Display/NotAMetaQuestionEvent.vue +20 -0
  16. package/components/Event/Display/Part/Facts.vue +39 -0
  17. package/components/Event/Display/Part/MessageList.vue +50 -0
  18. package/components/Event/Display/Part/ToolCalls.vue +58 -0
  19. package/components/Event/Display/Part/ToolLoopState.vue +36 -0
  20. package/components/Event/Display/ReadAttachedFilesEvent.vue +28 -0
  21. package/components/Event/Display/RecallMemoryEvent.vue +27 -0
  22. package/components/Event/Display/RunToolLoopEvent.vue +34 -0
  23. package/components/Event/Display/SandboxFileDisplayedEvent.vue +46 -0
  24. package/components/Event/Display/SearchKnowledgeEvent.vue +31 -0
  25. package/components/Event/Display/ToolCallApprovedEvent.vue +27 -0
  26. package/components/Event/Display/ToolCallsDecidedEvent.vue +24 -0
  27. package/components/Event/Display/ToolLoopCondensedEvent.vue +31 -0
  28. package/components/Event/Display/ToolLoopFinishedEvent.vue +49 -0
  29. package/components/Event/Display/ToolLoopIterationEvent.vue +18 -0
  30. package/components/Event/Display/ToolLoopStatusEvent.vue +27 -0
  31. package/components/Event/Display/ToolResultEvent.vue +38 -0
  32. package/components/Event/List/EventList.vue +1 -1
  33. package/components/FormKit/DynamicConfiguration.vue +6 -1
  34. package/components/FormKit/KnowledgeCollectionSelector.vue +281 -0
  35. package/components/FormKit/KnowledgeDatabaseSelector.vue +7 -0
  36. package/components/FormKit/LocaleInput.vue +2 -0
  37. package/components/FormKit/SecretFileInput.vue +181 -0
  38. package/components/FormKit/VectorStoreInput.vue +20 -1
  39. package/components/Knowledge/Database/CreateModal.vue +91 -2
  40. package/components/Knowledge/Database/SourceModal.vue +165 -0
  41. package/components/Knowledge/Document/UploadModal.vue +4 -0
  42. package/components/Knowledge/Namespace/Card.vue +4 -4
  43. package/components/Knowledge/Namespace/CreateModal.vue +1 -1
  44. package/components/Knowledge/Namespace/EditModal.vue +3 -4
  45. package/components/Role/AccessRulesEditor.vue +1 -1
  46. package/components/Service/Selection.vue +7 -1
  47. package/components/Support/IncidentButton.vue +37 -0
  48. package/components/Support/IncidentDialog.vue +119 -0
  49. package/components/User/Settings.vue +9 -8
  50. package/components/UserFiles/Browser.vue +361 -0
  51. package/components/UserFiles/MoveDialog.vue +77 -0
  52. package/components/UserFiles/NameDialog.vue +59 -0
  53. package/components/UserFiles/Preview.vue +110 -0
  54. package/composables/auth/useAuth.ts +19 -3
  55. package/composables/document/useDocumentIngestionPolling.ts +64 -0
  56. package/composables/document/useDocuments.ts +3 -0
  57. package/composables/document/useSourcePipelines.ts +23 -0
  58. package/composables/document/useUpdateDatabaseSource.ts +21 -0
  59. package/composables/event/useEventComponent.ts +46 -0
  60. package/composables/form/useFormKitTransform.ts +68 -17
  61. package/composables/openwebui/useOpenWebuiDisclaimer.ts +22 -0
  62. package/composables/suite/useApps.ts +12 -3
  63. package/composables/suite/useSuite.ts +2 -0
  64. package/composables/support/useIncidentAvailability.ts +17 -0
  65. package/composables/support/useIncidentContext.ts +56 -0
  66. package/composables/support/useIncidentForm.ts +45 -0
  67. package/composables/support/useIncidentReport.ts +16 -0
  68. package/composables/support/useOpenWebUIContext.ts +38 -0
  69. package/composables/tenant/useChatDisclaimer.ts +24 -0
  70. package/composables/user/useApplyLocale.ts +23 -0
  71. package/composables/user/useMyLocale.ts +20 -0
  72. package/composables/user/useRestorePreferredLocale.ts +38 -0
  73. package/composables/userFiles/useCreateUserFolder.ts +15 -0
  74. package/composables/userFiles/useDeleteUserFile.ts +15 -0
  75. package/composables/userFiles/useMoveUserFile.ts +15 -0
  76. package/composables/userFiles/useUploadUserFiles.ts +19 -0
  77. package/composables/userFiles/useUserFileContent.ts +24 -0
  78. package/composables/userFiles/useUserFiles.ts +25 -0
  79. package/formkit.config.ts +10 -2
  80. package/i18n/locales/de.yaml +171 -3
  81. package/i18n/locales/en.yaml +172 -3
  82. package/i18n/locales/fr.yaml +173 -3
  83. package/i18n/locales/it.yaml +173 -3
  84. package/layouts/default.vue +7 -1
  85. package/middleware/auth.global.ts +6 -3
  86. package/middleware/home-redirect.ts +15 -4
  87. package/package.json +4 -3
  88. package/pages/[tenant]/service/knowledge/[db]/[namespace].vue +6 -8
  89. package/pages/[tenant]/service/knowledge.vue +33 -7
  90. package/pages/[tenant]/service/openai/[thread_id]/[display_id]/files.vue +51 -0
  91. package/pages/[tenant]/service/openai.vue +61 -17
  92. package/pages/[tenant]/service/user-knowledge.vue +19 -0
  93. package/plugins/api-client.client.ts +5 -0
  94. package/plugins/oidc-client.ts +14 -7
  95. package/sdk/client/index.ts +171 -1
  96. package/sdk/client/schemas.gen.ts +18602 -8560
  97. package/sdk/client/sdk.gen.ts +482 -0
  98. package/sdk/client/types.gen.ts +13616 -7044
  99. package/types/EventFact.ts +4 -0
  100. package/utils/apiResponseGuard.ts +97 -0
@@ -0,0 +1,56 @@
1
+ import { format } from 'date-fns'
2
+
3
+ interface UserAgentBrand {
4
+ brand: string
5
+ version: string
6
+ }
7
+
8
+ interface UserAgentData {
9
+ brands?: UserAgentBrand[]
10
+ platform?: string
11
+ }
12
+
13
+ // "Chrome 129 · Windows" rather than the 120-character user-agent string: a support engineer
14
+ // reads the short form faster, and the raw string tells them nothing extra. Falls back to the
15
+ // full agent on browsers without the (Chromium-only) hints API.
16
+ const describeBrowser = (): string => {
17
+ if (!import.meta.client) return ''
18
+ const data = (navigator as Navigator & { userAgentData?: UserAgentData }).userAgentData
19
+ const brand = data?.brands?.find(candidate => !/not.?a.?brand/i.test(candidate.brand))
20
+ if (!brand) return navigator.userAgent
21
+ return data?.platform ? `${brand.brand} ${brand.version} · ${data.platform}` : `${brand.brand} ${brand.version}`
22
+ }
23
+
24
+ // The half of the report context only the browser knows. Its counterpart is filled server-side
25
+ // from the caller's token — tenant and reporter identity — because those are the two the
26
+ // reporter must not be able to get wrong by accident.
27
+ //
28
+ // Every key here is a question `id` in packages/core/.../incident/incident_form.yml. That naming
29
+ // is the whole contract: a key with no matching question is silently dropped.
30
+ export const useIncidentContext = () => {
31
+ const { locale } = useI18n()
32
+ const runtimeConfig = useRuntimeConfig()
33
+ const { versionDisplay } = useAppVersion()
34
+ const { context: openWebUIContext } = useOpenWebUIContext()
35
+
36
+ // Deliberately a snapshot rather than a computed: the reported time has to be the moment the
37
+ // reporter raised the report, and a computed over a non-reactive clock would freeze at whenever
38
+ // the page last rendered — hours earlier on a tab left open, which is exactly the kind of tab a
39
+ // bug gets reported from.
40
+ const buildIncidentContext = (): Record<string, string> => ({
41
+ // With the offset, because this field exists to find the request in logs that are in UTC
42
+ // while the reporter and whoever reads it are rarely in the same zone.
43
+ occurred_at: format(new Date(), 'yyyy-MM-dd HH:mm XXX'),
44
+ page_url: globalThis.location?.href ?? '',
45
+ version: versionDisplay.value ?? '',
46
+ environment: (runtimeConfig.public.env as string) ?? '',
47
+ agent_class: openWebUIContext.value?.agentClass ?? '',
48
+ agent_name: openWebUIContext.value?.agentName ?? '',
49
+ model: openWebUIContext.value?.model ?? '',
50
+ conversation_id: openWebUIContext.value?.threadId ?? '',
51
+ browser: describeBrowser(),
52
+ locale: locale.value,
53
+ })
54
+
55
+ return { buildIncidentContext }
56
+ }
@@ -0,0 +1,45 @@
1
+ import { createIncident, getIncidentForm, type CreatedIncidentDto, type IncidentFormDto } from '@core/sdk/client'
2
+ import { minutesToMilliseconds } from 'date-fns'
3
+
4
+ // The form is a file shipped with the platform, so it changes on release, not per request —
5
+ // except for the prefilled values, which is why this is still fetched rather than bundled.
6
+ export const useIncidentForm = defineQuery(() => {
7
+ const isOpen = useIncidentReport().isOpen
8
+
9
+ const {
10
+ data: incidentForm,
11
+ isPending: incidentFormIsLoading,
12
+ error: incidentFormError,
13
+ } = useQuery<IncidentFormDto>({
14
+ key: () => ['incident-form'],
15
+ staleTime: minutesToMilliseconds(5),
16
+ // Only while the dialog is open: a deployment with no incident repository answers 404 here,
17
+ // and there is no reason to ask on every page load for a form nobody has opened.
18
+ enabled: isOpen,
19
+ query: async () => await getIncidentForm({ composable: '$fetch' }),
20
+ })
21
+
22
+ return { incidentForm, incidentFormIsLoading, incidentFormError }
23
+ })
24
+
25
+ export const useSubmitIncident = defineMutation(() => {
26
+ const { mutateAsync: submitIncident, isLoading: incidentIsSubmitting } = useMutation({
27
+ mutation: async ({
28
+ submission,
29
+ attachments,
30
+ }: {
31
+ submission: Record<string, unknown>
32
+ attachments: File[]
33
+ }): Promise<CreatedIncidentDto> => {
34
+ // Multipart, so the answers travel as one JSON field beside the files. The API validates
35
+ // that JSON against the form's own schema; sending the fields individually would make the
36
+ // endpoint's shape depend on the form definition.
37
+ return await createIncident({
38
+ composable: '$fetch',
39
+ body: { submission: JSON.stringify(submission), attachments },
40
+ })
41
+ },
42
+ })
43
+
44
+ return { submitIncident, incidentIsSubmitting }
45
+ })
@@ -0,0 +1,16 @@
1
+ // Opening the report dialog. Shared state rather than a prop, because it is raised from three
2
+ // places — the app rail, the settings popover, and a per-message action inside the chat iframe —
3
+ // while the dialog itself is mounted once by the layout.
4
+ export const useIncidentReport = () => {
5
+ const isOpen = useState<boolean>('incident-dialog-open', () => false)
6
+
7
+ const open = (): void => {
8
+ isOpen.value = true
9
+ }
10
+
11
+ const close = (): void => {
12
+ isOpen.value = false
13
+ }
14
+
15
+ return { isOpen, open, close }
16
+ }
@@ -0,0 +1,38 @@
1
+ export interface OpenWebUIContext {
2
+ threadId: string
3
+ displayId: string
4
+ // Split rather than one "model or agent" string: an investigation starts from a different
5
+ // place depending on which it was, and the acceptance criteria ask for all three.
6
+ agentClass?: string
7
+ agentName?: string
8
+ model?: string
9
+ }
10
+
11
+ // The chat UI runs inside an iframe (pages/[tenant]/service/openai.vue), so the shell never
12
+ // sees which conversation the user is looking at — the pipe tells it, by posting `set-context`
13
+ // as each message streams. Keeping the last one is what lets a bug report name the exact
14
+ // thread, the one field in the whole report that survives the reporter's own retelling:
15
+ // support can replay that run's events and its trace from it.
16
+ export const useOpenWebUIContext = () => {
17
+ const context = useState<OpenWebUIContext | null>('openwebui-context', () => null)
18
+
19
+ // Replaces, deliberately: the inlet filter sends every field on every turn, and a field it
20
+ // leaves empty has to clear the previous turn's value rather than survive into a report about
21
+ // this one.
22
+ const setOpenWebUIContext = (next: OpenWebUIContext): void => {
23
+ context.value = next
24
+ }
25
+
26
+ // Merges, for the one producer that knows a single field: the agent pipe learns the thread
27
+ // after the filter has already described the turn.
28
+ const updateOpenWebUIContext = (partial: Partial<OpenWebUIContext>): void => {
29
+ const current = context.value
30
+ context.value = current ? { ...current, ...partial } : { threadId: '', displayId: '', ...partial }
31
+ }
32
+
33
+ const clearOpenWebUIContext = (): void => {
34
+ context.value = null
35
+ }
36
+
37
+ return { context, setOpenWebUIContext, updateOpenWebUIContext, clearOpenWebUIContext }
38
+ }
@@ -0,0 +1,24 @@
1
+ import { getChatDisclaimer } from '@core/sdk/client'
2
+
3
+ export const useChatDisclaimer = defineQuery(() => {
4
+ const { tenantId } = useTenant()
5
+ const { locale, t } = useI18n()
6
+ const { data } = useQuery({
7
+ key: () => ['tenant', tenantId.value ?? '', 'chat-disclaimer', locale.value],
8
+ enabled: useTenantReady(),
9
+ staleTime: 0,
10
+ query: () => {
11
+ const language = locale.value
12
+ return getChatDisclaimer({
13
+ composable: '$fetch',
14
+ path: { tenant_id: tenantId.value! },
15
+ onRequest: ({ options }) => {
16
+ options.headers.set('lang', language)
17
+ },
18
+ })
19
+ },
20
+ })
21
+
22
+ const disclaimer = computed(() => data.value ?? t('openwebui.default_disclaimer'))
23
+ return { disclaimer }
24
+ })
@@ -0,0 +1,23 @@
1
+ import { changeLocale } from '@formkit/vue'
2
+
3
+ /**
4
+ * Switches every place the UI language lives, so a restored language and a
5
+ * manual switch cannot drift apart: FormKit's validation messages, the locale
6
+ * route prefix, and query data the API already translated.
7
+ */
8
+ export const useApplyLocale = () => {
9
+ const queryCache = useQueryCache()
10
+ const switchLocalePath = useSwitchLocalePath()
11
+ const router = useRouter()
12
+
13
+ const applyLocale = async (code: string) => {
14
+ changeLocale(code)
15
+ await router.push(switchLocalePath(code))
16
+ // Query keys carry no locale, so data the API translated under the old
17
+ // `lang` header would otherwise stay cached. Invalidate only after the
18
+ // route change, because the header is read from the live locale.
19
+ queryCache.invalidateQueries()
20
+ }
21
+
22
+ return { applyLocale }
23
+ }
@@ -0,0 +1,20 @@
1
+ import { updateMyLocale } from '@core/sdk/client'
2
+
3
+ export const useUpdateMyLocale = defineMutation(() => {
4
+ const { tenantId } = useTenant()
5
+
6
+ const { mutateAsync, isLoading } = useMutation({
7
+ mutation: async ({ locale }: { locale: string }) => {
8
+ await updateMyLocale({
9
+ composable: '$fetch',
10
+ path: { tenant_id: tenantId.value! },
11
+ body: { locale },
12
+ })
13
+ },
14
+ })
15
+
16
+ return {
17
+ updateMyLocale: mutateAsync,
18
+ updateMyLocaleIsLoading: isLoading,
19
+ }
20
+ })
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Applies the language persisted against the Keycloak account once per session.
3
+ *
4
+ * The `i18n_redirected` cookie alone cannot carry the choice across a logout: a
5
+ * round trip through Keycloak can land on a different locale prefix, and
6
+ * @nuxtjs/i18n then rewrites the cookie from that prefix. The server-side value
7
+ * is the only copy that survives that, a cleared cookie, or a second device.
8
+ */
9
+ export const useRestorePreferredLocale = () => {
10
+ const { locale } = useI18n()
11
+ const { applyLocale } = useApplyLocale()
12
+ const { myUser } = useMyUser()
13
+ const { updateMyLocale } = useUpdateMyLocale()
14
+ // useState, not a plain ref: the layout may remount, and reapplying would
15
+ // fight a language the user switched to in the meantime.
16
+ const alreadyApplied = useState('preferred-locale-applied', () => false)
17
+
18
+ watch(myUser, (user) => {
19
+ if (!user || alreadyApplied.value) return
20
+ alreadyApplied.value = true
21
+
22
+ const persisted = user.preferred_locale
23
+ if (!persisted) {
24
+ // First login since the feature shipped: adopt whatever the browser chose
25
+ // so the next logout has something to restore.
26
+ updateMyLocale({ locale: locale.value }).catch((error) => {
27
+ console.error('Failed to seed preferred locale', error)
28
+ })
29
+ return
30
+ }
31
+
32
+ if (persisted !== locale.value) {
33
+ // The same full switch as the language selector: without it, FormKit and
34
+ // queries already fetched under the old `lang` header stay untranslated.
35
+ applyLocale(persisted)
36
+ }
37
+ }, { immediate: true })
38
+ }
@@ -0,0 +1,15 @@
1
+ import { createUserFolder } from '@core/sdk/client'
2
+
3
+ export const useCreateUserFolder = defineMutation(() => {
4
+ const queryCache = useQueryCache()
5
+ const { tenantId } = useTenant()
6
+
7
+ const { mutateAsync: createUserFolderMutation } = useMutation({
8
+ mutation: async (folderPath: string) => {
9
+ await createUserFolder({ composable: '$fetch', path: { tenant_id: tenantId.value! }, body: { path: folderPath } })
10
+ },
11
+ onSettled: () => queryCache.invalidateQueries({ key: ['tenant', tenantId.value, 'user-files'] }),
12
+ })
13
+
14
+ return { createUserFolder: createUserFolderMutation }
15
+ })
@@ -0,0 +1,15 @@
1
+ import { deleteUserFile } from '@core/sdk/client'
2
+
3
+ export const useDeleteUserFile = defineMutation(() => {
4
+ const queryCache = useQueryCache()
5
+ const { tenantId } = useTenant()
6
+
7
+ const { mutateAsync: deleteUserFileMutation } = useMutation({
8
+ mutation: async (filePath: string) => {
9
+ await deleteUserFile({ composable: '$fetch', path: { tenant_id: tenantId.value! }, query: { path: filePath } })
10
+ },
11
+ onSettled: () => queryCache.invalidateQueries({ key: ['tenant', tenantId.value, 'user-files'] }),
12
+ })
13
+
14
+ return { deleteUserFile: deleteUserFileMutation }
15
+ })
@@ -0,0 +1,15 @@
1
+ import { moveUserFile } from '@core/sdk/client'
2
+
3
+ export const useMoveUserFile = defineMutation(() => {
4
+ const queryCache = useQueryCache()
5
+ const { tenantId } = useTenant()
6
+
7
+ const { mutateAsync: moveUserFileMutation } = useMutation({
8
+ mutation: async ({ source, destination }: { source: string, destination: string }) => {
9
+ await moveUserFile({ composable: '$fetch', path: { tenant_id: tenantId.value! }, body: { source, destination } })
10
+ },
11
+ onSettled: () => queryCache.invalidateQueries({ key: ['tenant', tenantId.value, 'user-files'] }),
12
+ })
13
+
14
+ return { moveUserFile: moveUserFileMutation }
15
+ })
@@ -0,0 +1,19 @@
1
+ import { uploadUserFile } from '@core/sdk/client'
2
+
3
+ export const useUploadUserFiles = defineMutation(() => {
4
+ const queryCache = useQueryCache()
5
+ const { tenantId } = useTenant()
6
+
7
+ const { mutateAsync: uploadUserFilesMutation, isLoading: isUploading } = useMutation({
8
+ mutation: async ({ folder, files }: { folder: string, files: File[] }) => {
9
+ await Promise.all(
10
+ files.map(file =>
11
+ uploadUserFile({ composable: '$fetch', path: { tenant_id: tenantId.value! }, query: { folder }, body: { file } }),
12
+ ),
13
+ )
14
+ },
15
+ onSettled: () => queryCache.invalidateQueries({ key: ['tenant', tenantId.value, 'user-files'] }),
16
+ })
17
+
18
+ return { uploadUserFiles: uploadUserFilesMutation, isUploading }
19
+ })
@@ -0,0 +1,24 @@
1
+ import { getUserFileContent } from '@core/sdk/client'
2
+
3
+ export const useUserFileContent = () => {
4
+ const { tenantId } = useTenant()
5
+
6
+ const fetchBlob = async (filePath: string, download = false): Promise<Blob> =>
7
+ await getUserFileContent({
8
+ composable: '$fetch',
9
+ path: { tenant_id: tenantId.value! },
10
+ query: { path: filePath, download },
11
+ responseType: 'blob',
12
+ }) as Blob
13
+
14
+ const download = async (filePath: string, name: string) => {
15
+ const url = URL.createObjectURL(await fetchBlob(filePath, true))
16
+ const link = document.createElement('a')
17
+ link.href = url
18
+ link.download = name
19
+ link.click()
20
+ URL.revokeObjectURL(url)
21
+ }
22
+
23
+ return { fetchBlob, download }
24
+ }
@@ -0,0 +1,25 @@
1
+ import { listUserFiles } from '@core/sdk/client'
2
+ import { minutesToMilliseconds } from 'date-fns'
3
+
4
+ export const useUserFiles = defineQuery(() => {
5
+ const { tenantId } = useTenant()
6
+ const folder = ref('.')
7
+
8
+ const filesQuery = useQuery({
9
+ key: () => ['tenant', tenantId.value, 'user-files', folder.value],
10
+ staleTime: minutesToMilliseconds(5),
11
+ enabled: useTenantReady(),
12
+ query: async () =>
13
+ await listUserFiles({
14
+ composable: '$fetch',
15
+ path: { tenant_id: tenantId.value! },
16
+ query: { folder: folder.value },
17
+ }),
18
+ })
19
+
20
+ const entries = computed(() => filesQuery.state.value?.data?.entries ?? [])
21
+ const folderTitle = computed(() => filesQuery.state.value?.data?.folder_title ?? null)
22
+ const isLoading = computed(() => filesQuery.asyncStatus.value === 'loading')
23
+
24
+ return { folder, entries, folderTitle, isLoading, error: filesQuery.error, refresh: filesQuery.refetch }
25
+ })
package/formkit.config.ts CHANGED
@@ -2,9 +2,11 @@ import AgentSelector from '@core/components/FormKit/AgentSelector.vue'
2
2
  import ChipsInput from '@core/components/FormKit/ChipsInput.vue'
3
3
  import CronInput from '@core/components/FormKit/CronInput.vue'
4
4
  import IconSelector from '@core/components/FormKit/IconSelector.vue'
5
+ import KnowledgeCollectionSelector from '@core/components/FormKit/KnowledgeCollectionSelector.vue'
5
6
  import KnowledgeDatabaseSelector from '@core/components/FormKit/KnowledgeDatabaseSelector.vue'
6
7
  import LocaleInput from '@core/components/FormKit/LocaleInput.vue'
7
8
  import ModelSelect from '@core/components/FormKit/ModelSelect.vue'
9
+ import SecretFileInput from '@core/components/FormKit/SecretFileInput.vue'
8
10
  import TenantSelect from '@core/components/FormKit/TenantSelect.vue'
9
11
  import VectorStoreInput from '@core/components/FormKit/VectorStoreInput.vue'
10
12
  import { en, de, fr, it } from '@formkit/i18n'
@@ -97,7 +99,7 @@ const config: DefaultConfigOptions = {
97
99
  inputs: {
98
100
  ...primeInputs,
99
101
  agentSelector: createInput(AgentSelector, {
100
- props: ['startEvent', 'classPlaceholder', 'idPlaceholder', 'filter'],
102
+ props: ['startEvent', 'agentClass', 'classPlaceholder', 'idPlaceholder', 'filter'],
101
103
  }),
102
104
  chipsInput: createInput(ChipsInput, {
103
105
  props: ['placeholder'],
@@ -105,6 +107,9 @@ const config: DefaultConfigOptions = {
105
107
  cronInput: createInput(CronInput, {
106
108
  props: ['timezonePlaceholder', 'filter'],
107
109
  }),
110
+ knowledgeCollectionSelector: createInput(KnowledgeCollectionSelector, {
111
+ props: ['agentRef', 'placeholder', 'filter'],
112
+ }),
108
113
  knowledgeDatabaseSelector: createInput(KnowledgeDatabaseSelector, {
109
114
  props: ['placeholder', 'filter'],
110
115
  }),
@@ -112,11 +117,14 @@ const config: DefaultConfigOptions = {
112
117
  props: ['options', 'placeholder'],
113
118
  }),
114
119
  localeInput: createInput(LocaleInput, {
115
- props: ['inputType', 'rows', 'placeholder'],
120
+ props: ['inputType', 'rows', 'placeholder', 'allowTranslation'],
116
121
  }),
117
122
  modelSelect: createInput(ModelSelect, {
118
123
  props: ['mode', 'placeholder', 'filter', 'showClear'],
119
124
  }),
125
+ secretFileInput: createInput(SecretFileInput, {
126
+ props: ['accept', 'maxSizeBytes', 'placeholder'],
127
+ }),
120
128
  tenantSelect: createInput(TenantSelect, {
121
129
  props: ['placeholder', 'filter'],
122
130
  }),