@swiss-ai-hub/web 0.317.1 → 0.319.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.
- package/README.md +2 -2
- package/components/Agent/Card.vue +2 -4
- package/components/FormKit/DynamicConfiguration.vue +17 -0
- package/components/FormKit/LocaleInput.vue +11 -1
- package/components/FormKit/TenantSelect.vue +5 -5
- package/components/Knowledge/Document/List.vue +8 -2
- package/composables/app/useAppVersion.ts +19 -4
- package/composables/form/useFormKitTransform.ts +62 -7
- package/formkit.config.ts +30 -0
- package/i18n/locales/de.yaml +4 -0
- package/i18n/locales/en.yaml +3 -0
- package/i18n/locales/fr.yaml +4 -0
- package/i18n/locales/it.yaml +4 -0
- package/package.json +1 -2
- package/pages/[tenant]/service/agents/[agent_class]-[agent_id]/configuration.vue +4 -1
- package/pages/[tenant]/service/agents.vue +1 -1
- package/pages/[tenant]/service/processes/[process_class]-[process_id]/configuration.vue +2 -0
- package/sdk/client/index.ts +5 -0
- package/sdk/client/schemas.gen.ts +715 -3
- package/sdk/client/types.gen.ts +507 -2
package/README.md
CHANGED
|
@@ -155,8 +155,8 @@ The same single-instance requirement applies to **PrimeVue** (its theme system i
|
|
|
155
155
|
> { "dependencies": { "vue-router": "4.6.4" } }
|
|
156
156
|
> ```
|
|
157
157
|
>
|
|
158
|
-
> Verify with `pnpm why vue-router` (`@vueuse/router` must show `4.6.4`) and `pnpm build` (`nuxt generate` must succeed
|
|
159
|
-
> forcing a single `vue-router` major instead breaks `@nuxtjs/i18n`, which needs 5.x).
|
|
158
|
+
> Verify with `pnpm why vue-router` (`@vueuse/router` must show `4.6.4`) and `pnpm build` (`nuxt generate` must succeed
|
|
159
|
+
> — forcing a single `vue-router` major instead breaks `@nuxtjs/i18n`, which needs 5.x).
|
|
160
160
|
|
|
161
161
|
## Quick start
|
|
162
162
|
|
|
@@ -6,9 +6,7 @@
|
|
|
6
6
|
>
|
|
7
7
|
<div class="flex items-center justify-between gap-4">
|
|
8
8
|
<div class="flex items-center justify-start gap-2">
|
|
9
|
-
<div
|
|
10
|
-
class="flex items-center justify-center rounded-full bg-white p-3 dark:bg-surface-900"
|
|
11
|
-
>
|
|
9
|
+
<div class="flex items-center justify-center rounded-full bg-white p-3 dark:bg-surface-900">
|
|
12
10
|
<Icon
|
|
13
11
|
:name="agent.agent_config.icon"
|
|
14
12
|
size="1.5em"
|
|
@@ -45,7 +43,7 @@
|
|
|
45
43
|
/>
|
|
46
44
|
<Button
|
|
47
45
|
v-tooltip.top="t('agent.export.button')"
|
|
48
|
-
icon="pi pi-
|
|
46
|
+
icon="pi pi-file-export"
|
|
49
47
|
severity="secondary"
|
|
50
48
|
text
|
|
51
49
|
rounded
|
|
@@ -54,6 +54,13 @@ import type { FormKitSchemaDefinition } from '@formkit/core'
|
|
|
54
54
|
|
|
55
55
|
const { t } = useI18n()
|
|
56
56
|
|
|
57
|
+
// Fields with a known platform issue, keyed by the backend element id. Frontend-only on
|
|
58
|
+
// purpose: the notice is temporary and carries no config semantics, so it stays out of the
|
|
59
|
+
// agent's form schema. Drop the entry once the underlying issue is fixed.
|
|
60
|
+
const FIELD_WARNING_KEYS: Record<string, string> = {
|
|
61
|
+
org_memory: 'form.warnings.org_memory_performance',
|
|
62
|
+
}
|
|
63
|
+
|
|
57
64
|
const props = defineProps<{
|
|
58
65
|
form: FormkitElement[]
|
|
59
66
|
initialData?: Record<string, unknown>
|
|
@@ -98,9 +105,15 @@ function replaceLabelVariables(label: string): string {
|
|
|
98
105
|
})
|
|
99
106
|
}
|
|
100
107
|
|
|
108
|
+
function fieldWarning(element: FormElement): string | undefined {
|
|
109
|
+
const warningKey = FIELD_WARNING_KEYS[element.id as string]
|
|
110
|
+
return warningKey ? t(warningKey) : undefined
|
|
111
|
+
}
|
|
112
|
+
|
|
101
113
|
const schema = computed<FormKitSchemaDefinition>(() => {
|
|
102
114
|
return buildFormKitSchema(props.form as FormElement[], {
|
|
103
115
|
labelTransform: replaceLabelVariables,
|
|
116
|
+
fieldWarning,
|
|
104
117
|
})
|
|
105
118
|
})
|
|
106
119
|
|
|
@@ -138,6 +151,10 @@ async function submitHandler() {
|
|
|
138
151
|
@apply pt-3 pb-1;
|
|
139
152
|
}
|
|
140
153
|
|
|
154
|
+
.content :deep(.formkit-field-warning) {
|
|
155
|
+
@apply flex items-start gap-1.5 pb-1 text-xs text-amber-600 dark:text-amber-400;
|
|
156
|
+
}
|
|
157
|
+
|
|
141
158
|
.content :deep(.formkit-group-fieldset) {
|
|
142
159
|
@apply border border-surface-300 dark:border-surface-600 rounded-lg p-4 mb-4;
|
|
143
160
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
:options="localeOptions"
|
|
8
8
|
option-label="label"
|
|
9
9
|
option-value="value"
|
|
10
|
+
:allow-empty="false"
|
|
10
11
|
size="small"
|
|
11
12
|
>
|
|
12
13
|
<template #option="{ option }">
|
|
@@ -100,15 +101,24 @@ const localeOptions = locales.map(lang => ({
|
|
|
100
101
|
|
|
101
102
|
const activeLocale = ref<Locale>('en')
|
|
102
103
|
|
|
104
|
+
function isLocale(value: unknown): value is Locale {
|
|
105
|
+
return locales.includes(value as Locale)
|
|
106
|
+
}
|
|
107
|
+
|
|
103
108
|
// Get the current locale string value
|
|
104
109
|
const localeValue = computed<LocaleStringDto>(() => {
|
|
105
110
|
return props.context.value ?? { de: null, en: null, fr: null, it: null }
|
|
106
111
|
})
|
|
107
112
|
|
|
108
113
|
// Current input value for the active locale
|
|
114
|
+
// The guard is belt-and-braces next to `:allow-empty="false"`: with an unset `activeLocale`
|
|
115
|
+
// this setter used to write under the key `"null"`, producing a value whose four locales
|
|
116
|
+
// were all empty but which no longer looked like a locale object to the backend's
|
|
117
|
+
// normalization — so it slipped past validation and saved a blank name (issue #135).
|
|
109
118
|
const currentValue = computed({
|
|
110
|
-
get: () => localeValue.value[activeLocale.value] ?? '',
|
|
119
|
+
get: () => (isLocale(activeLocale.value) ? localeValue.value[activeLocale.value] ?? '' : ''),
|
|
111
120
|
set: (newVal: string) => {
|
|
121
|
+
if (!isLocale(activeLocale.value)) return
|
|
112
122
|
const updated: LocaleStringDto = {
|
|
113
123
|
...localeValue.value,
|
|
114
124
|
[activeLocale.value]: newVal || null,
|
|
@@ -36,11 +36,11 @@ const props = defineProps<TenantSelectProps>()
|
|
|
36
36
|
const { t } = useI18n()
|
|
37
37
|
|
|
38
38
|
const { tenants, tenantsAreLoading } = useTenantMemberships()
|
|
39
|
-
const {
|
|
39
|
+
const { tenantId } = useTenant()
|
|
40
40
|
|
|
41
41
|
const placeholder = computed(() => props.context.placeholder)
|
|
42
42
|
const filter = computed(() => props.context.filter ?? true)
|
|
43
|
-
const isLoading = computed(() => tenantsAreLoading.value
|
|
43
|
+
const isLoading = computed(() => tenantsAreLoading.value)
|
|
44
44
|
|
|
45
45
|
const selectedTenant = computed({
|
|
46
46
|
get: () => props.context.value ?? null,
|
|
@@ -52,10 +52,10 @@ const selectedTenant = computed({
|
|
|
52
52
|
// Pre-select the user's active tenant on a fresh field, while leaving an
|
|
53
53
|
// already-configured value (editing an existing instance) untouched.
|
|
54
54
|
watch(
|
|
55
|
-
[
|
|
55
|
+
[tenantId, () => props.context.value],
|
|
56
56
|
([active, current]) => {
|
|
57
|
-
if (!current && active
|
|
58
|
-
props.context.node.input(active
|
|
57
|
+
if (!current && active) {
|
|
58
|
+
props.context.node.input(active)
|
|
59
59
|
}
|
|
60
60
|
},
|
|
61
61
|
{ immediate: true },
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
<DataTable
|
|
19
19
|
v-model:selection="checkedDocuments"
|
|
20
20
|
:value="documents"
|
|
21
|
+
data-key="id"
|
|
21
22
|
table-style="min-width: 50rem"
|
|
22
23
|
:row-class="getRowClass"
|
|
23
24
|
:sort-field="sortField ?? undefined"
|
|
@@ -185,11 +186,16 @@ watch(
|
|
|
185
186
|
const deletableDocuments = computed(() => props.documents.filter(isDocumentDeletable))
|
|
186
187
|
|
|
187
188
|
const allDeletableSelected = computed(
|
|
188
|
-
() => deletableDocuments.value.length > 0
|
|
189
|
+
() => deletableDocuments.value.length > 0
|
|
190
|
+
&& deletableDocuments.value.every(document => checkedDocuments.value.some(selected => selected.id === document.id)),
|
|
189
191
|
)
|
|
190
192
|
|
|
191
193
|
const onSelectAllChange = ({ checked }: { checked: boolean }) => {
|
|
192
|
-
|
|
194
|
+
const pageIds = new Set(deletableDocuments.value.map(document => document.id))
|
|
195
|
+
const selectionFromOtherPages = checkedDocuments.value.filter(selected => !pageIds.has(selected.id))
|
|
196
|
+
checkedDocuments.value = checked
|
|
197
|
+
? [...selectionFromOtherPages, ...deletableDocuments.value]
|
|
198
|
+
: selectionFromOtherPages
|
|
193
199
|
}
|
|
194
200
|
|
|
195
201
|
const handleRowClick = (event: DataTableRowClickEvent) => {
|
|
@@ -3,10 +3,21 @@ import { minutesToMilliseconds } from 'date-fns'
|
|
|
3
3
|
|
|
4
4
|
// Surfaces the running version of both services. The UI service version is baked
|
|
5
5
|
// into the static bundle at build time (runtimeConfig.public.appVersion); the API
|
|
6
|
-
// version is read from the health endpoint
|
|
6
|
+
// version is read from the health endpoint, which reports the channel tag (e.g.
|
|
7
|
+
// `latest`) the running image was pulled as. When both match a single number is
|
|
7
8
|
// shown, otherwise both are shown as `UI / API`.
|
|
9
|
+
//
|
|
10
|
+
// A release is promoted onto the `latest` channel by retagging the exact `-rc.N`
|
|
11
|
+
// build that was tested, so the baked version keeps its release-candidate suffix
|
|
12
|
+
// (e.g. `v0.317.0-rc.3`) even though the artifact IS the final release. Strip that
|
|
13
|
+
// suffix only on the `latest` channel, so a promoted build shows its release
|
|
14
|
+
// version (`v0.317.0`). On any other channel the build is genuinely a candidate or
|
|
15
|
+
// rolling build, so keep the suffix to stay identifiable.
|
|
16
|
+
const RELEASE_CHANNEL = 'latest'
|
|
17
|
+
const toReleaseVersion = (version: string): string => version.replace(/-rc\.\d+$/, '')
|
|
18
|
+
|
|
8
19
|
export const useAppVersion = defineQuery(() => {
|
|
9
|
-
const
|
|
20
|
+
const bakedUiVersion = useRuntimeConfig().public.appVersion as string
|
|
10
21
|
|
|
11
22
|
const { data: apiVersion } = useQuery<string>({
|
|
12
23
|
key: () => ['app-version', 'api'],
|
|
@@ -17,10 +28,14 @@ export const useAppVersion = defineQuery(() => {
|
|
|
17
28
|
},
|
|
18
29
|
})
|
|
19
30
|
|
|
31
|
+
const uiVersion = computed(() =>
|
|
32
|
+
apiVersion.value === RELEASE_CHANNEL ? toReleaseVersion(bakedUiVersion) : bakedUiVersion,
|
|
33
|
+
)
|
|
34
|
+
|
|
20
35
|
const versionDisplay = computed(() => {
|
|
21
36
|
const api = apiVersion.value
|
|
22
|
-
if (!api || api === uiVersion) return uiVersion
|
|
23
|
-
return `${uiVersion} / ${api}`
|
|
37
|
+
if (!api || api === uiVersion.value) return uiVersion.value
|
|
38
|
+
return `${uiVersion.value} / ${api}`
|
|
24
39
|
})
|
|
25
40
|
|
|
26
41
|
return { uiVersion, apiVersion, versionDisplay }
|
|
@@ -132,6 +132,43 @@ export interface TransformOptions {
|
|
|
132
132
|
locale?: string
|
|
133
133
|
labelTransform?: (label: string) => string
|
|
134
134
|
optionsResolver?: (element: FormElement) => unknown[] | undefined
|
|
135
|
+
// Resolves a frontend-only warning for an element. The backend form schema carries no
|
|
136
|
+
// warning of its own, so notices about known platform issues are attached here.
|
|
137
|
+
fieldWarning?: (element: FormElement) => string | undefined
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Warning notice rendered next to a field, styled like a `Message severity="warn"
|
|
142
|
+
* variant="simple"` (see `.formkit-field-warning` in FormKit/DynamicConfiguration.vue).
|
|
143
|
+
* A plain `$el` node rather than `$cmp: 'Message'`: PrimeVue components are auto-imported
|
|
144
|
+
* per component, so FormKitSchema cannot resolve them by name.
|
|
145
|
+
*/
|
|
146
|
+
function buildFieldWarningNode(element: FormElement, text: string): FormKitSchemaNode {
|
|
147
|
+
const base = (element.id as string | undefined) ?? (element.name as string)
|
|
148
|
+
return {
|
|
149
|
+
$el: 'div',
|
|
150
|
+
key: `${base}__warning`,
|
|
151
|
+
attrs: { class: 'formkit-field-warning' },
|
|
152
|
+
children: [
|
|
153
|
+
{ $el: 'i', attrs: { class: 'pi pi-exclamation-triangle' } },
|
|
154
|
+
{ $el: 'span', children: text },
|
|
155
|
+
],
|
|
156
|
+
} as unknown as FormKitSchemaNode
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Places the warning directly under the "Enable X" toggle for a nullable element — the
|
|
161
|
+
* toggle stays mounted when the section is switched off, so the warning remains readable
|
|
162
|
+
* before the user opts in. Non-nullable elements get it above their own node.
|
|
163
|
+
*/
|
|
164
|
+
function withFieldWarning(
|
|
165
|
+
nodes: FormKitSchemaNode | FormKitSchemaNode[],
|
|
166
|
+
warning: FormKitSchemaNode | undefined,
|
|
167
|
+
afterToggle: boolean,
|
|
168
|
+
): FormKitSchemaNode | FormKitSchemaNode[] {
|
|
169
|
+
if (!warning) return nodes
|
|
170
|
+
const nodeArray = Array.isArray(nodes) ? nodes : [nodes]
|
|
171
|
+
return afterToggle ? [nodeArray[0], warning, ...nodeArray.slice(1)] : [warning, ...nodeArray]
|
|
135
172
|
}
|
|
136
173
|
|
|
137
174
|
function createGroupNode(
|
|
@@ -311,7 +348,11 @@ function combineConditions(toggleCondition: string, existing: string | undefined
|
|
|
311
348
|
return `$: ${toggleCondition.slice(1)} && (${existing.slice(1)})`
|
|
312
349
|
}
|
|
313
350
|
|
|
314
|
-
function buildNullableToggleNode(
|
|
351
|
+
function buildNullableToggleNode(
|
|
352
|
+
element: FormElement,
|
|
353
|
+
label: string | undefined,
|
|
354
|
+
help: string | undefined,
|
|
355
|
+
): Record<string, unknown> {
|
|
315
356
|
const fieldName = element.name as string
|
|
316
357
|
const toggleId = nullableToggleId(element)
|
|
317
358
|
return {
|
|
@@ -320,17 +361,24 @@ function buildNullableToggleNode(element: FormElement, label: string | undefined
|
|
|
320
361
|
id: toggleId,
|
|
321
362
|
key: toggleId,
|
|
322
363
|
label: label ? `Enable ${label}` : 'Enable',
|
|
364
|
+
...(help ? { help } : {}),
|
|
323
365
|
binary: true,
|
|
324
366
|
}
|
|
325
367
|
}
|
|
326
368
|
|
|
369
|
+
/**
|
|
370
|
+
* `help` is only supplied for groups: a group's own node renders no help, so the toggle is the
|
|
371
|
+
* only place to hang it. Nullable leaves already render their help on the input itself — passing
|
|
372
|
+
* it here too would print the same sentence twice.
|
|
373
|
+
*/
|
|
327
374
|
function applyNullableToggle(
|
|
328
375
|
element: FormElement,
|
|
329
376
|
baseNode: FormKitSchemaNode | FormKitSchemaNode[],
|
|
330
377
|
label: string | undefined,
|
|
378
|
+
help?: string,
|
|
331
379
|
): FormKitSchemaNode[] {
|
|
332
380
|
const nodeArray = Array.isArray(baseNode) ? baseNode : [baseNode]
|
|
333
|
-
return [buildNullableToggleNode(element, label) as FormKitSchemaNode, ...nodeArray]
|
|
381
|
+
return [buildNullableToggleNode(element, label, help) as FormKitSchemaNode, ...nodeArray]
|
|
334
382
|
}
|
|
335
383
|
|
|
336
384
|
function gateElement(element: FormElement, toggleCondition: string): FormElement {
|
|
@@ -351,7 +399,7 @@ export function transformElementToSchema(
|
|
|
351
399
|
const formkitType = getFormkitType(element)
|
|
352
400
|
if (formkitType === 'repeater') return []
|
|
353
401
|
|
|
354
|
-
const { locale = 'en', labelTransform, optionsResolver } = options
|
|
402
|
+
const { locale = 'en', labelTransform, optionsResolver, fieldWarning } = options
|
|
355
403
|
|
|
356
404
|
const children = (element.children as FormElement[] || []).flatMap(
|
|
357
405
|
child => transformElementToSchema(child, options),
|
|
@@ -365,20 +413,26 @@ export function transformElementToSchema(
|
|
|
365
413
|
const isNullable = element.nullable === true
|
|
366
414
|
const toggleCondition = isNullable ? `$get(${nullableToggleId(element)}).value` : undefined
|
|
367
415
|
|
|
416
|
+
const warningText = fieldWarning?.(element)
|
|
417
|
+
const warningNode = warningText ? buildFieldWarningNode(element, warningText) : undefined
|
|
418
|
+
|
|
368
419
|
if (formkitType === 'group') {
|
|
369
420
|
const gatedElement = isNullable ? gateElement(element, toggleCondition!) : element
|
|
370
421
|
const groupNode = createGroupNode(gatedElement, children, label)
|
|
371
|
-
|
|
422
|
+
if (!isNullable) return withFieldWarning(groupNode, warningNode, false)
|
|
423
|
+
const toggledNodes = applyNullableToggle(element, groupNode, label, getLocalizedString(element.help, locale))
|
|
424
|
+
return withFieldWarning(toggledNodes, warningNode, true)
|
|
372
425
|
}
|
|
373
426
|
|
|
374
427
|
const cleanNode = buildNodeProperties(element, formkitType, label, locale, optionsResolver)
|
|
375
428
|
if (children.length > 0) cleanNode.children = children
|
|
376
429
|
if (isNullable) {
|
|
377
430
|
cleanNode.if = combineConditions(toggleCondition!, element.if as string | undefined)
|
|
378
|
-
|
|
431
|
+
const toggledNodes = applyNullableToggle(element, cleanNode as FormKitSchemaNode, label)
|
|
432
|
+
return withFieldWarning(toggledNodes, warningNode, true)
|
|
379
433
|
}
|
|
380
434
|
|
|
381
|
-
return cleanNode as FormKitSchemaNode
|
|
435
|
+
return withFieldWarning(cleanNode as FormKitSchemaNode, warningNode, false)
|
|
382
436
|
}
|
|
383
437
|
|
|
384
438
|
function buildLeafNodeForRepeater(
|
|
@@ -427,7 +481,8 @@ export function transformElementForRepeater(
|
|
|
427
481
|
if (formkitType === 'group') {
|
|
428
482
|
const gatedElement = isNullable ? gateElement(element, toggleCondition!) : element
|
|
429
483
|
const groupNode = createGroupNode(gatedElement, children, label)
|
|
430
|
-
|
|
484
|
+
if (!isNullable) return groupNode
|
|
485
|
+
return applyNullableToggle(element, groupNode, label, getLocalizedString(element.help, locale))
|
|
431
486
|
}
|
|
432
487
|
|
|
433
488
|
const cleanNode = buildLeafNodeForRepeater(element, formkitType, label, locale, children)
|
package/formkit.config.ts
CHANGED
|
@@ -10,9 +10,39 @@ import { en, de, fr, it } from '@formkit/i18n'
|
|
|
10
10
|
import { createInput } from '@formkit/vue'
|
|
11
11
|
import { primeInputs } from '@sfxcode/formkit-primevue'
|
|
12
12
|
|
|
13
|
+
import type { FormKitNode } from '@formkit/core'
|
|
13
14
|
import type { DefaultConfigOptions } from '@formkit/vue'
|
|
14
15
|
|
|
16
|
+
const LOCALES = ['de', 'en', 'fr', 'it'] as const
|
|
17
|
+
|
|
18
|
+
// FormKit's built-in `required` rule only asks whether a value is present, and a localeInput's
|
|
19
|
+
// value is always a `{de, en, fr, it}` object — non-empty, so `required` passes even when every
|
|
20
|
+
// locale inside it is blank. Backend `LocaleInput` elements emit `localeRequired` instead
|
|
21
|
+
// (see packages/core/swiss_ai_hub/core/form/elements/locale_input.py).
|
|
22
|
+
function localeRequired(node: FormKitNode): boolean {
|
|
23
|
+
const value = node.value as Record<string, string | null> | null | undefined
|
|
24
|
+
if (!value) return false
|
|
25
|
+
return LOCALES.some(locale => !!value[locale]?.trim())
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// FormKit skips a rule entirely when the node's value is empty, unless the rule opts out —
|
|
29
|
+
// which is why the built-in `required` sets this too. Without it the rule would never run on a
|
|
30
|
+
// never-touched field, whose value is still `null`, and a blank Name would pass on a fresh
|
|
31
|
+
// create form: precisely the case this rule exists to catch.
|
|
32
|
+
localeRequired.skipEmpty = false
|
|
33
|
+
|
|
34
|
+
const localeRequiredMessages = {
|
|
35
|
+
de: 'Mindestens eine Sprache muss ausgefüllt sein.',
|
|
36
|
+
en: 'At least one language must be filled in.',
|
|
37
|
+
fr: 'Au moins une langue doit être renseignée.',
|
|
38
|
+
it: 'Almeno una lingua deve essere compilata.',
|
|
39
|
+
}
|
|
40
|
+
|
|
15
41
|
const config: DefaultConfigOptions = {
|
|
42
|
+
rules: { localeRequired },
|
|
43
|
+
messages: Object.fromEntries(
|
|
44
|
+
LOCALES.map(locale => [locale, { validation: { localeRequired: localeRequiredMessages[locale] } }]),
|
|
45
|
+
),
|
|
16
46
|
inputs: {
|
|
17
47
|
...primeInputs,
|
|
18
48
|
agentSelector: createInput(AgentSelector, {
|
package/i18n/locales/de.yaml
CHANGED
|
@@ -790,6 +790,10 @@ process:
|
|
|
790
790
|
form:
|
|
791
791
|
locale_input:
|
|
792
792
|
translate_tooltip: In alle Sprachen übersetzen
|
|
793
|
+
warnings:
|
|
794
|
+
org_memory_performance: Diese Funktion funktioniert in manchen Fällen möglicherweise
|
|
795
|
+
nicht wie erwartet. Um unerwartetes Verhalten zu vermeiden, deaktivieren Sie
|
|
796
|
+
sie bitte vorübergehend, bis eine Korrektur veröffentlicht wird.
|
|
793
797
|
lib:
|
|
794
798
|
vectorStore:
|
|
795
799
|
label: Vektorspeicher
|
package/i18n/locales/en.yaml
CHANGED
|
@@ -778,6 +778,9 @@ process:
|
|
|
778
778
|
form:
|
|
779
779
|
locale_input:
|
|
780
780
|
translate_tooltip: Translate to all languages
|
|
781
|
+
warnings:
|
|
782
|
+
org_memory_performance: This feature may not work as expected in some cases. To
|
|
783
|
+
avoid unexpected behavior, please temporarily disable it until a fix is released.
|
|
781
784
|
lib:
|
|
782
785
|
vectorStore:
|
|
783
786
|
label: Vector Store
|
package/i18n/locales/fr.yaml
CHANGED
|
@@ -790,6 +790,10 @@ process:
|
|
|
790
790
|
form:
|
|
791
791
|
locale_input:
|
|
792
792
|
translate_tooltip: Traduire dans toutes les langues
|
|
793
|
+
warnings:
|
|
794
|
+
org_memory_performance: Cette fonctionnalité peut ne pas fonctionner comme prévu
|
|
795
|
+
dans certains cas. Pour éviter tout comportement inattendu, veuillez la désactiver
|
|
796
|
+
temporairement jusqu'à la publication d'un correctif.
|
|
793
797
|
lib:
|
|
794
798
|
vectorStore:
|
|
795
799
|
label: Stockage vectoriel
|
package/i18n/locales/it.yaml
CHANGED
|
@@ -786,6 +786,10 @@ process:
|
|
|
786
786
|
form:
|
|
787
787
|
locale_input:
|
|
788
788
|
translate_tooltip: Traduci in tutte le lingue
|
|
789
|
+
warnings:
|
|
790
|
+
org_memory_performance: Questa funzionalità potrebbe non funzionare come previsto
|
|
791
|
+
in alcuni casi. Per evitare comportamenti inattesi, disattivala temporaneamente
|
|
792
|
+
fino al rilascio di una correzione.
|
|
789
793
|
lib:
|
|
790
794
|
vectorStore:
|
|
791
795
|
label: Archivio vettoriale
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"license": "AGPL-3.0-or-later",
|
|
4
4
|
"author": "bbv Software Services AG (https://www.bbv.ch)",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.319.0",
|
|
7
7
|
"description": "Swiss AI Hub - Admin & Management UI (Nuxt 3 layer)",
|
|
8
8
|
"main": "./nuxt.config.ts",
|
|
9
9
|
"repository": {
|
|
@@ -43,7 +43,6 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@formkit/i18n": "^1.7.2",
|
|
45
45
|
"@formkit/nuxt": "^2.0.0",
|
|
46
|
-
"@hey-api/nuxt": "^0.2.1",
|
|
47
46
|
"@nuxt/fonts": "^0.14.0",
|
|
48
47
|
"@nuxt/icon": "^1.15.0",
|
|
49
48
|
"@nuxtjs/i18n": "10.3.0",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
{{ t('agent.configuration.description') }}
|
|
12
12
|
</p>
|
|
13
13
|
<Button
|
|
14
|
-
icon="pi pi-
|
|
14
|
+
icon="pi pi-file-export"
|
|
15
15
|
severity="secondary"
|
|
16
16
|
:label="t('agent.export.button')"
|
|
17
17
|
class="shrink-0"
|
|
@@ -117,6 +117,9 @@ const submitConfiguration = async (formData: Record<string, unknown>) => {
|
|
|
117
117
|
}
|
|
118
118
|
catch (error) {
|
|
119
119
|
console.error('Failed to save agent configuration:', error)
|
|
120
|
+
// No `detail` here on purpose: the SDK's global onResponseError (app.vue) already toasts the
|
|
121
|
+
// backend's `detail`, and formats pydantic's array-shaped errors while doing it. Passing
|
|
122
|
+
// `error.message` would only add a second toast reading `[PUT] "<url>": 400 Bad Request`.
|
|
120
123
|
toast.add({
|
|
121
124
|
severity: 'error',
|
|
122
125
|
summary: t('agent.configuration.saveError'),
|
|
@@ -96,6 +96,8 @@ const submitConfiguration = async (formData: Record<string, unknown>) => {
|
|
|
96
96
|
}
|
|
97
97
|
catch (error) {
|
|
98
98
|
console.error('Failed to save process configuration:', error)
|
|
99
|
+
// See the agent configuration page: the SDK's global onResponseError already surfaces the
|
|
100
|
+
// backend `detail`, so adding `error.message` here would only duplicate the toast with a URL.
|
|
99
101
|
toast.add({
|
|
100
102
|
severity: 'error',
|
|
101
103
|
summary: t('process.configuration.saveError'),
|
package/sdk/client/index.ts
CHANGED
|
@@ -313,6 +313,8 @@ export {
|
|
|
313
313
|
type CreateTranscriptionErrors,
|
|
314
314
|
type CreateTranscriptionResponse,
|
|
315
315
|
type CreateTranscriptionResponses,
|
|
316
|
+
type CronInput,
|
|
317
|
+
type CronInputWritable,
|
|
316
318
|
type CustomOutput,
|
|
317
319
|
type DashboardDto,
|
|
318
320
|
type DashboardItemDto,
|
|
@@ -743,6 +745,7 @@ export {
|
|
|
743
745
|
type MailBatchDraftedEventWritable,
|
|
744
746
|
type MailFetchedEvent,
|
|
745
747
|
type MailFetchedEventWritable,
|
|
748
|
+
type MailMessageRef,
|
|
746
749
|
type MailMovedEvent,
|
|
747
750
|
type MailMovedEventWritable,
|
|
748
751
|
type MemoriesResponse,
|
|
@@ -883,6 +886,8 @@ export {
|
|
|
883
886
|
type RouterEventWritable,
|
|
884
887
|
type RunStatistics,
|
|
885
888
|
type RunStatisticsWritable,
|
|
889
|
+
type ScheduledStartEvent,
|
|
890
|
+
type ScheduledStartEventWritable,
|
|
886
891
|
type SearchContextCostPerQueryDto,
|
|
887
892
|
type SearchOrganizationMemoriesData,
|
|
888
893
|
type SearchOrganizationMemoriesError,
|