@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 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-download"
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 { activeTenant, activeTenantIsLoading } = useActiveTenantQuery()
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 || activeTenantIsLoading.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
- [activeTenant, () => props.context.value],
55
+ [tenantId, () => props.context.value],
56
56
  ([active, current]) => {
57
- if (!current && active?.id) {
58
- props.context.node.input(active.id)
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 && checkedDocuments.value.length === deletableDocuments.value.length,
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
- checkedDocuments.value = checked ? [...deletableDocuments.value] : []
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. When both match a single number is
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 uiVersion = useRuntimeConfig().public.appVersion as string
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(element: FormElement, label: string | undefined): Record<string, unknown> {
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
- return isNullable ? applyNullableToggle(element, groupNode, label) : groupNode
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
- return applyNullableToggle(element, cleanNode as FormKitSchemaNode, label)
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
- return isNullable ? applyNullableToggle(element, groupNode, label) : groupNode
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, {
@@ -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
@@ -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
@@ -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
@@ -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.317.1",
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-download"
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'),
@@ -17,7 +17,7 @@
17
17
  />
18
18
  <div class="flex items-center gap-4">
19
19
  <Button
20
- icon="pi pi-upload"
20
+ icon="pi pi-file-import"
21
21
  severity="secondary"
22
22
  :label="t('agent.import.button')"
23
23
  @click="triggerImport"
@@ -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'),
@@ -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,