@cat-factory/app 0.149.0 → 0.150.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.
@@ -210,6 +210,23 @@ async function add() {
210
210
  }
211
211
  }
212
212
 
213
+ /** Route an update to the scope the key lives in (account / workspace / user). */
214
+ async function updateKey(k: ApiKey, patch: { enabled?: boolean; isDefault?: boolean }) {
215
+ try {
216
+ if (k.scope === 'account') await keys.updateAccountKey(k.id, patch)
217
+ else if (k.scope === 'workspace') await keys.updateWorkspaceKey(k.id, patch)
218
+ else await keys.updateUserKey(k.id, patch)
219
+ // Enabling/disabling changes provider selectability in the picker — refresh it.
220
+ if (workspace.workspaceId) await models.refresh(workspace.workspaceId)
221
+ } catch (e) {
222
+ toast.add({
223
+ title: t('providers.apiKeys.toast.updateFailed'),
224
+ description: e instanceof Error ? e.message : String(e),
225
+ color: 'error',
226
+ })
227
+ }
228
+ }
229
+
213
230
  async function remove(k: ApiKey) {
214
231
  const noun = t('providers.apiKeys.keyNoun')
215
232
  if (!(await confirmAction('remove', noun))) return
@@ -352,10 +369,14 @@ async function remove(k: ApiKey) {
352
369
  v-for="k in connected"
353
370
  :key="k.id"
354
371
  class="flex items-center justify-between rounded-md border border-slate-700 bg-slate-900/50 px-3 py-2 text-sm"
372
+ :class="{ 'opacity-55': !k.enabled }"
355
373
  >
356
374
  <div>
357
375
  <span class="font-medium text-slate-200">{{ k.label }}</span>
358
376
  <span class="ms-2 text-xs text-slate-500">{{ providerLabel(k.provider) }}</span>
377
+ <UBadge v-if="!k.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
378
+ {{ t('providers.apiKeys.disabledBadge') }}
379
+ </UBadge>
359
380
  <div class="text-[11px] tabular-nums text-slate-500">
360
381
  {{
361
382
  t(
@@ -366,13 +387,32 @@ async function remove(k: ApiKey) {
366
387
  }}
367
388
  </div>
368
389
  </div>
369
- <UButton
370
- icon="i-lucide-trash-2"
371
- color="error"
372
- variant="ghost"
373
- size="xs"
374
- @click="remove(k)"
375
- />
390
+ <div class="flex items-center gap-2">
391
+ <UButton
392
+ :icon="k.isDefault ? 'i-lucide-star' : 'i-lucide-star-off'"
393
+ :color="k.isDefault ? 'primary' : 'neutral'"
394
+ :variant="k.isDefault ? 'subtle' : 'ghost'"
395
+ size="xs"
396
+ @click="updateKey(k, { isDefault: !k.isDefault })"
397
+ >
398
+ {{
399
+ k.isDefault ? t('providers.apiKeys.defaultBadge') : t('providers.apiKeys.pinDefault')
400
+ }}
401
+ </UButton>
402
+ <USwitch
403
+ :model-value="k.enabled"
404
+ size="sm"
405
+ :aria-label="t('providers.apiKeys.enableToggle')"
406
+ @update:model-value="(v: boolean) => updateKey(k, { enabled: v })"
407
+ />
408
+ <UButton
409
+ icon="i-lucide-trash-2"
410
+ color="error"
411
+ variant="ghost"
412
+ size="xs"
413
+ @click="remove(k)"
414
+ />
415
+ </div>
376
416
  </div>
377
417
  </div>
378
418
  </div>
@@ -141,6 +141,30 @@ async function add() {
141
141
  }
142
142
  }
143
143
 
144
+ async function toggleEnabled(cred: { id: string }, enabled: boolean) {
145
+ try {
146
+ await creds.update(cred.id, { enabled })
147
+ } catch (e) {
148
+ toast.add({
149
+ title: t('providers.vendorCredentials.toast.updateFailed'),
150
+ description: e instanceof Error ? e.message : String(e),
151
+ color: 'error',
152
+ })
153
+ }
154
+ }
155
+
156
+ async function toggleDefault(cred: { id: string; isDefault: boolean }) {
157
+ try {
158
+ await creds.update(cred.id, { isDefault: !cred.isDefault })
159
+ } catch (e) {
160
+ toast.add({
161
+ title: t('providers.vendorCredentials.toast.updateFailed'),
162
+ description: e instanceof Error ? e.message : String(e),
163
+ color: 'error',
164
+ })
165
+ }
166
+ }
167
+
144
168
  async function remove(cred: { id: string; label: string }) {
145
169
  const ok = await confirm({
146
170
  title: t('providers.vendorCredentials.confirmRemove.title'),
@@ -245,10 +269,14 @@ function vendorLabel(v: SubscriptionVendor): string {
245
269
  v-for="c in creds.credentials"
246
270
  :key="c.id"
247
271
  class="flex items-center justify-between rounded-md border border-slate-700 bg-slate-900/50 px-3 py-2 text-sm"
272
+ :class="{ 'opacity-55': !c.enabled }"
248
273
  >
249
274
  <div>
250
275
  <span class="font-medium text-slate-200">{{ c.label }}</span>
251
276
  <span class="ms-2 text-xs text-slate-500">{{ vendorLabel(c.vendor) }}</span>
277
+ <UBadge v-if="!c.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
278
+ {{ t('providers.vendorCredentials.disabledBadge') }}
279
+ </UBadge>
252
280
  <div class="text-[11px] tabular-nums text-slate-500">
253
281
  {{
254
282
  t(
@@ -262,13 +290,34 @@ function vendorLabel(v: SubscriptionVendor): string {
262
290
  }}
263
291
  </div>
264
292
  </div>
265
- <UButton
266
- icon="i-lucide-trash-2"
267
- color="error"
268
- variant="ghost"
269
- size="xs"
270
- @click="remove(c)"
271
- />
293
+ <div class="flex items-center gap-2">
294
+ <UButton
295
+ :icon="c.isDefault ? 'i-lucide-star' : 'i-lucide-star-off'"
296
+ :color="c.isDefault ? 'primary' : 'neutral'"
297
+ :variant="c.isDefault ? 'subtle' : 'ghost'"
298
+ size="xs"
299
+ @click="toggleDefault(c)"
300
+ >
301
+ {{
302
+ c.isDefault
303
+ ? t('providers.vendorCredentials.defaultBadge')
304
+ : t('providers.vendorCredentials.pinDefault')
305
+ }}
306
+ </UButton>
307
+ <USwitch
308
+ :model-value="c.enabled"
309
+ size="sm"
310
+ :aria-label="t('providers.vendorCredentials.enableToggle')"
311
+ @update:model-value="(v: boolean) => toggleEnabled(c, v)"
312
+ />
313
+ <UButton
314
+ icon="i-lucide-trash-2"
315
+ color="error"
316
+ variant="ghost"
317
+ size="xs"
318
+ @click="remove(c)"
319
+ />
320
+ </div>
272
321
  </div>
273
322
  </div>
274
323
  </div>
@@ -23,6 +23,10 @@ import {
23
23
  setServiceFragmentDefaultsContract,
24
24
  storePersonalSubscriptionContract,
25
25
  testLocalModelEndpointContract,
26
+ updateAccountApiKeyContract,
27
+ updateUserApiKeyContract,
28
+ updateVendorCredentialContract,
29
+ updateWorkspaceApiKeyContract,
26
30
  upsertLocalModelEndpointContract,
27
31
  upsertOpenRouterCatalogContract,
28
32
  } from '@cat-factory/contracts'
@@ -30,6 +34,8 @@ import type {
30
34
  AddApiKeyInput,
31
35
  StorePersonalSubscriptionInput,
32
36
  SubscriptionVendor,
37
+ UpdateApiKeyInput,
38
+ UpdateVendorCredentialInput,
33
39
  } from '~/types/domain'
34
40
  import type {
35
41
  LocalRunner,
@@ -60,16 +66,26 @@ export function modelsApi({ send, ws }: ApiContext) {
60
66
  send(listWorkspaceApiKeysContract, { pathPrefix: ws(workspaceId) }),
61
67
  addWorkspaceApiKey: (workspaceId: string, body: AddApiKeyInput) =>
62
68
  send(addWorkspaceApiKeyContract, { pathPrefix: ws(workspaceId), body }),
69
+ updateWorkspaceApiKey: (workspaceId: string, id: string, body: UpdateApiKeyInput) =>
70
+ send(updateWorkspaceApiKeyContract, {
71
+ pathPrefix: ws(workspaceId),
72
+ pathParams: { id },
73
+ body,
74
+ }),
63
75
  removeWorkspaceApiKey: (workspaceId: string, id: string) =>
64
76
  send(removeWorkspaceApiKeyContract, { pathPrefix: ws(workspaceId), pathParams: { id } }),
65
77
  listMyApiKeys: () => send(listUserApiKeysContract, {}),
66
78
  addMyApiKey: (body: AddApiKeyInput) => send(addUserApiKeyContract, { body }),
79
+ updateMyApiKey: (id: string, body: UpdateApiKeyInput) =>
80
+ send(updateUserApiKeyContract, { pathParams: { id }, body }),
67
81
  removeMyApiKey: (id: string) => send(removeUserApiKeyContract, { pathParams: { id } }),
68
82
  // Account-scoped keys (shared by every workspace in the account); admin-only.
69
83
  listAccountApiKeys: (accountId: string) =>
70
84
  send(listAccountApiKeysContract, { pathParams: { accountId } }),
71
85
  addAccountApiKey: (accountId: string, body: AddApiKeyInput) =>
72
86
  send(addAccountApiKeyContract, { pathParams: { accountId }, body }),
87
+ updateAccountApiKey: (accountId: string, id: string, body: UpdateApiKeyInput) =>
88
+ send(updateAccountApiKeyContract, { pathParams: { accountId, id }, body }),
73
89
  removeAccountApiKey: (accountId: string, id: string) =>
74
90
  send(removeAccountApiKeyContract, { pathParams: { accountId, id } }),
75
91
 
@@ -80,6 +96,12 @@ export function modelsApi({ send, ws }: ApiContext) {
80
96
  workspaceId: string,
81
97
  body: { vendor: SubscriptionVendor; label: string; token: string },
82
98
  ) => send(addVendorCredentialContract, { pathPrefix: ws(workspaceId), body }),
99
+ updateVendorCredential: (workspaceId: string, id: string, body: UpdateVendorCredentialInput) =>
100
+ send(updateVendorCredentialContract, {
101
+ pathPrefix: ws(workspaceId),
102
+ pathParams: { id },
103
+ body,
104
+ }),
83
105
  removeVendorCredential: (workspaceId: string, id: string) =>
84
106
  send(removeVendorCredentialContract, { pathPrefix: ws(workspaceId), pathParams: { id } }),
85
107
 
@@ -1,6 +1,6 @@
1
1
  import { defineStore } from 'pinia'
2
2
  import { computed, ref } from 'vue'
3
- import type { AddApiKeyInput, ApiKey, ApiKeyProvider } from '~/types/domain'
3
+ import type { AddApiKeyInput, ApiKey, ApiKeyProvider, UpdateApiKeyInput } from '~/types/domain'
4
4
 
5
5
  /**
6
6
  * The direct-provider API keys reachable from a workspace: the workspace's own keys
@@ -48,12 +48,30 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
48
48
  workspaceKeys.value = workspaceKeys.value.filter((k) => k.id !== id)
49
49
  }
50
50
 
51
+ // Pinning a default clears any prior default of the same scope+provider server-side, so a
52
+ // default change reloads the affected scope to reflect the single-default invariant; a plain
53
+ // enable/disable patches the one row in place.
54
+ async function updateWorkspaceKey(id: string, patch: UpdateApiKeyInput) {
55
+ if (!workspaceId.value) return
56
+ const updated = await api.updateWorkspaceApiKey(workspaceId.value, id, patch)
57
+ if (patch.isDefault !== undefined) await load(workspaceId.value)
58
+ else workspaceKeys.value = workspaceKeys.value.map((k) => (k.id === id ? updated : k))
59
+ return updated
60
+ }
61
+
51
62
  async function addUserKey(input: AddApiKeyInput) {
52
63
  const created = await api.addMyApiKey(input)
53
64
  userKeys.value = [...userKeys.value, created]
54
65
  return created
55
66
  }
56
67
 
68
+ async function updateUserKey(id: string, patch: UpdateApiKeyInput) {
69
+ const updated = await api.updateMyApiKey(id, patch)
70
+ if (patch.isDefault !== undefined && workspaceId.value) await load(workspaceId.value)
71
+ else userKeys.value = userKeys.value.map((k) => (k.id === id ? updated : k))
72
+ return updated
73
+ }
74
+
57
75
  async function removeUserKey(id: string) {
58
76
  await api.removeMyApiKey(id)
59
77
  userKeys.value = userKeys.value.filter((k) => k.id !== id)
@@ -72,6 +90,14 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
72
90
  accountKeys.value = [...accountKeys.value, created]
73
91
  }
74
92
 
93
+ async function updateAccountKey(id: string, patch: UpdateApiKeyInput) {
94
+ if (!accountId.value) return
95
+ const updated = await api.updateAccountApiKey(accountId.value, id, patch)
96
+ if (patch.isDefault !== undefined) await loadAccountKeys(accountId.value)
97
+ else accountKeys.value = accountKeys.value.map((k) => (k.id === id ? updated : k))
98
+ return updated
99
+ }
100
+
75
101
  async function removeAccountKey(id: string) {
76
102
  if (!accountId.value) return
77
103
  await api.removeAccountApiKey(accountId.value, id)
@@ -98,11 +124,14 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
98
124
  loading,
99
125
  load,
100
126
  addWorkspaceKey,
127
+ updateWorkspaceKey,
101
128
  removeWorkspaceKey,
102
129
  addUserKey,
130
+ updateUserKey,
103
131
  removeUserKey,
104
132
  loadAccountKeys,
105
133
  addAccountKey,
134
+ updateAccountKey,
106
135
  removeAccountKey,
107
136
  configuredProviders,
108
137
  hasProvider,
@@ -1,6 +1,10 @@
1
1
  import { defineStore } from 'pinia'
2
2
  import { computed, ref } from 'vue'
3
- import type { SubscriptionVendor, VendorCredential } from '~/types/domain'
3
+ import type {
4
+ SubscriptionVendor,
5
+ UpdateVendorCredentialInput,
6
+ VendorCredential,
7
+ } from '~/types/domain'
4
8
 
5
9
  /**
6
10
  * The workspace's connected LLM-vendor subscription credentials (the token pool
@@ -33,6 +37,22 @@ export const useVendorCredentialsStore = defineStore('vendorCredentials', () =>
33
37
  credentials.value = [...credentials.value, created]
34
38
  }
35
39
 
40
+ /**
41
+ * Enable/disable and/or (un)pin a token as its vendor's default. Because pinning a
42
+ * default clears any prior default of the same vendor server-side, we reload the pool so
43
+ * the whole vendor group reflects the single-default invariant rather than patching one row.
44
+ */
45
+ async function update(id: string, patch: UpdateVendorCredentialInput) {
46
+ if (!workspaceId.value) return
47
+ const updated = await api.updateVendorCredential(workspaceId.value, id, patch)
48
+ if (patch.isDefault !== undefined) {
49
+ await load(workspaceId.value)
50
+ } else {
51
+ credentials.value = credentials.value.map((c) => (c.id === id ? updated : c))
52
+ }
53
+ return updated
54
+ }
55
+
36
56
  async function remove(id: string) {
37
57
  if (!workspaceId.value) return
38
58
  await api.removeVendorCredential(workspaceId.value, id)
@@ -50,5 +70,15 @@ export const useVendorCredentialsStore = defineStore('vendorCredentials', () =>
50
70
  return credentials.value.filter((c) => c.vendor === vendor)
51
71
  }
52
72
 
53
- return { credentials, loading, load, add, remove, configuredVendors, hasVendor, forVendor }
73
+ return {
74
+ credentials,
75
+ loading,
76
+ load,
77
+ add,
78
+ update,
79
+ remove,
80
+ configuredVendors,
81
+ hasVendor,
82
+ forVendor,
83
+ }
54
84
  })
@@ -15,6 +15,8 @@ export type {
15
15
  ApiKeyProvider,
16
16
  ApiKey,
17
17
  AddApiKeyInput,
18
+ UpdateApiKeyInput,
18
19
  VendorCredential,
20
+ UpdateVendorCredentialInput,
19
21
  PromptFragment,
20
22
  } from '@cat-factory/contracts'
@@ -2452,7 +2452,8 @@
2452
2452
  "toast": {
2453
2453
  "connected": "API-Schlüssel verbunden",
2454
2454
  "connectFailed": "Schlüssel konnte nicht verbunden werden",
2455
- "removeFailed": "Schlüssel konnte nicht entfernt werden"
2455
+ "removeFailed": "Schlüssel konnte nicht entfernt werden",
2456
+ "updateFailed": "Schlüssel konnte nicht aktualisiert werden"
2456
2457
  },
2457
2458
  "providers": {
2458
2459
  "openai": {
@@ -2491,7 +2492,11 @@
2491
2492
  "step2": "Die Basis-URL des Gateways wird von Ihrem Deployment-Betreiber festgelegt (LITELLM_BASE_URL), nicht hier."
2492
2493
  }
2493
2494
  },
2494
- "keyNoun": "diesen API-Schlüssel"
2495
+ "keyNoun": "diesen API-Schlüssel",
2496
+ "defaultBadge": "Standard",
2497
+ "pinDefault": "Als Standard festlegen",
2498
+ "disabledBadge": "Deaktiviert",
2499
+ "enableToggle": "Diesen Schlüssel aktivieren oder deaktivieren"
2495
2500
  },
2496
2501
  "vendorCredentials": {
2497
2502
  "title": "LLM-Vendors",
@@ -2514,7 +2519,8 @@
2514
2519
  "toast": {
2515
2520
  "connected": "Token verbunden",
2516
2521
  "connectFailed": "Token konnte nicht verbunden werden",
2517
- "removeFailed": "Token konnte nicht entfernt werden"
2522
+ "removeFailed": "Token konnte nicht entfernt werden",
2523
+ "updateFailed": "Token konnte nicht aktualisiert werden"
2518
2524
  },
2519
2525
  "vendors": {
2520
2526
  "kimi": {
@@ -2533,7 +2539,11 @@
2533
2539
  "confirmRemove": {
2534
2540
  "title": "Diese Zugangsdaten entfernen?",
2535
2541
  "body": "\"{name}\" wird entfernt. Dies kann nicht rückgängig gemacht werden."
2536
- }
2542
+ },
2543
+ "defaultBadge": "Standard",
2544
+ "pinDefault": "Als Standard festlegen",
2545
+ "disabledBadge": "Deaktiviert",
2546
+ "enableToggle": "Dieses Token aktivieren oder deaktivieren"
2537
2547
  }
2538
2548
  },
2539
2549
  "github": {
@@ -2979,7 +2979,8 @@
2979
2979
  "toast": {
2980
2980
  "connected": "API key connected",
2981
2981
  "connectFailed": "Could not connect key",
2982
- "removeFailed": "Could not remove key"
2982
+ "removeFailed": "Could not remove key",
2983
+ "updateFailed": "Could not update key"
2983
2984
  },
2984
2985
  "providers": {
2985
2986
  "openai": {
@@ -3018,7 +3019,11 @@
3018
3019
  "step2": "The gateway's base URL is set by your deployment operator (LITELLM_BASE_URL), not here."
3019
3020
  }
3020
3021
  },
3021
- "keyNoun": "this API key"
3022
+ "keyNoun": "this API key",
3023
+ "defaultBadge": "Default",
3024
+ "pinDefault": "Set as default",
3025
+ "disabledBadge": "Disabled",
3026
+ "enableToggle": "Enable or disable this key"
3022
3027
  },
3023
3028
  "vendorCredentials": {
3024
3029
  "title": "LLM Vendors",
@@ -3044,7 +3049,8 @@
3044
3049
  "toast": {
3045
3050
  "connected": "Token connected",
3046
3051
  "connectFailed": "Could not connect token",
3047
- "removeFailed": "Could not remove token"
3052
+ "removeFailed": "Could not remove token",
3053
+ "updateFailed": "Could not update token"
3048
3054
  },
3049
3055
  "vendors": {
3050
3056
  "kimi": {
@@ -3063,7 +3069,11 @@
3063
3069
  "confirmRemove": {
3064
3070
  "title": "Remove this credential?",
3065
3071
  "body": "\"{name}\" will be removed. This can't be undone."
3066
- }
3072
+ },
3073
+ "defaultBadge": "Default",
3074
+ "pinDefault": "Set as default",
3075
+ "disabledBadge": "Disabled",
3076
+ "enableToggle": "Enable or disable this token"
3067
3077
  }
3068
3078
  },
3069
3079
  "github": {
@@ -2895,7 +2895,8 @@
2895
2895
  "toast": {
2896
2896
  "connected": "Clave de API conectada",
2897
2897
  "connectFailed": "No se pudo conectar la clave",
2898
- "removeFailed": "No se pudo eliminar la clave"
2898
+ "removeFailed": "No se pudo eliminar la clave",
2899
+ "updateFailed": "No se pudo actualizar la clave"
2899
2900
  },
2900
2901
  "providers": {
2901
2902
  "openai": {
@@ -2934,7 +2935,11 @@
2934
2935
  "step2": "La URL base de la pasarela la establece el operador de tu despliegue (LITELLM_BASE_URL), no aquí."
2935
2936
  }
2936
2937
  },
2937
- "keyNoun": "esta clave de API"
2938
+ "keyNoun": "esta clave de API",
2939
+ "defaultBadge": "Predeterminada",
2940
+ "pinDefault": "Establecer como predeterminada",
2941
+ "disabledBadge": "Desactivada",
2942
+ "enableToggle": "Activar o desactivar esta clave"
2938
2943
  },
2939
2944
  "vendorCredentials": {
2940
2945
  "title": "Proveedores de LLM",
@@ -2957,7 +2962,8 @@
2957
2962
  "toast": {
2958
2963
  "connected": "Token conectado",
2959
2964
  "connectFailed": "No se pudo conectar el token",
2960
- "removeFailed": "No se pudo eliminar el token"
2965
+ "removeFailed": "No se pudo eliminar el token",
2966
+ "updateFailed": "No se pudo actualizar el token"
2961
2967
  },
2962
2968
  "vendors": {
2963
2969
  "kimi": {
@@ -2976,7 +2982,11 @@
2976
2982
  "confirmRemove": {
2977
2983
  "title": "¿Quitar esta credencial?",
2978
2984
  "body": "Se eliminará \"{name}\". Esta acción no se puede deshacer."
2979
- }
2985
+ },
2986
+ "defaultBadge": "Predeterminada",
2987
+ "pinDefault": "Establecer como predeterminada",
2988
+ "disabledBadge": "Desactivada",
2989
+ "enableToggle": "Activar o desactivar este token"
2980
2990
  }
2981
2991
  },
2982
2992
  "github": {
@@ -2895,7 +2895,8 @@
2895
2895
  "toast": {
2896
2896
  "connected": "Clé d'API connectée",
2897
2897
  "connectFailed": "Impossible de connecter la clé",
2898
- "removeFailed": "Impossible de supprimer la clé"
2898
+ "removeFailed": "Impossible de supprimer la clé",
2899
+ "updateFailed": "Impossible de mettre à jour la clé"
2899
2900
  },
2900
2901
  "providers": {
2901
2902
  "openai": {
@@ -2934,7 +2935,11 @@
2934
2935
  "step2": "L'URL de base de la passerelle est définie par l'opérateur de votre déploiement (LITELLM_BASE_URL), pas ici."
2935
2936
  }
2936
2937
  },
2937
- "keyNoun": "cette clé API"
2938
+ "keyNoun": "cette clé API",
2939
+ "defaultBadge": "Par défaut",
2940
+ "pinDefault": "Définir par défaut",
2941
+ "disabledBadge": "Désactivée",
2942
+ "enableToggle": "Activer ou désactiver cette clé"
2938
2943
  },
2939
2944
  "vendorCredentials": {
2940
2945
  "title": "Fournisseurs de LLM",
@@ -2957,7 +2962,8 @@
2957
2962
  "toast": {
2958
2963
  "connected": "Token connecté",
2959
2964
  "connectFailed": "Impossible de connecter le token",
2960
- "removeFailed": "Impossible de supprimer le token"
2965
+ "removeFailed": "Impossible de supprimer le token",
2966
+ "updateFailed": "Impossible de mettre à jour le jeton"
2961
2967
  },
2962
2968
  "vendors": {
2963
2969
  "kimi": {
@@ -2976,7 +2982,11 @@
2976
2982
  "confirmRemove": {
2977
2983
  "title": "Retirer ces identifiants ?",
2978
2984
  "body": "\"{name}\" sera supprimé. Cette action est irréversible."
2979
- }
2985
+ },
2986
+ "defaultBadge": "Par défaut",
2987
+ "pinDefault": "Définir par défaut",
2988
+ "disabledBadge": "Désactivée",
2989
+ "enableToggle": "Activer ou désactiver ce jeton"
2980
2990
  }
2981
2991
  },
2982
2992
  "github": {
@@ -2906,7 +2906,8 @@
2906
2906
  "toast": {
2907
2907
  "connected": "מפתח API חובר",
2908
2908
  "connectFailed": "לא ניתן לחבר את המפתח",
2909
- "removeFailed": "לא ניתן להסיר את המפתח"
2909
+ "removeFailed": "לא ניתן להסיר את המפתח",
2910
+ "updateFailed": "לא ניתן לעדכן את המפתח"
2910
2911
  },
2911
2912
  "providers": {
2912
2913
  "openai": {
@@ -2945,7 +2946,11 @@
2945
2946
  "step2": "כתובת הבסיס של השער נקבעת על ידי מפעיל הפריסה שלך (LITELLM_BASE_URL), ולא כאן."
2946
2947
  }
2947
2948
  },
2948
- "keyNoun": "מפתח API זה"
2949
+ "keyNoun": "מפתח API זה",
2950
+ "defaultBadge": "ברירת מחדל",
2951
+ "pinDefault": "הגדר כברירת מחדל",
2952
+ "disabledBadge": "מושבת",
2953
+ "enableToggle": "הפעל או השבת מפתח זה"
2949
2954
  },
2950
2955
  "vendorCredentials": {
2951
2956
  "title": "ספקי LLM",
@@ -2968,7 +2973,8 @@
2968
2973
  "toast": {
2969
2974
  "connected": "הטוקן חובר",
2970
2975
  "connectFailed": "לא ניתן לחבר את הטוקן",
2971
- "removeFailed": "לא ניתן להסיר את הטוקן"
2976
+ "removeFailed": "לא ניתן להסיר את הטוקן",
2977
+ "updateFailed": "לא ניתן לעדכן את האסימון"
2972
2978
  },
2973
2979
  "vendors": {
2974
2980
  "kimi": {
@@ -2987,7 +2993,11 @@
2987
2993
  "confirmRemove": {
2988
2994
  "title": "להסיר את פרטי הגישה האלה?",
2989
2995
  "body": "\"{name}\" יימחק. לא ניתן לבטל פעולה זו."
2990
- }
2996
+ },
2997
+ "defaultBadge": "ברירת מחדל",
2998
+ "pinDefault": "הגדר כברירת מחדל",
2999
+ "disabledBadge": "מושבת",
3000
+ "enableToggle": "הפעל או השבת אסימון זה"
2991
3001
  }
2992
3002
  },
2993
3003
  "github": {
@@ -2452,7 +2452,8 @@
2452
2452
  "toast": {
2453
2453
  "connected": "Chiave API collegata",
2454
2454
  "connectFailed": "Impossibile collegare la chiave",
2455
- "removeFailed": "Impossibile rimuovere la chiave"
2455
+ "removeFailed": "Impossibile rimuovere la chiave",
2456
+ "updateFailed": "Impossibile aggiornare la chiave"
2456
2457
  },
2457
2458
  "providers": {
2458
2459
  "openai": {
@@ -2491,7 +2492,11 @@
2491
2492
  "step2": "L'URL di base del gateway viene impostato dall'operatore del tuo deployment (LITELLM_BASE_URL), non qui."
2492
2493
  }
2493
2494
  },
2494
- "keyNoun": "questa chiave API"
2495
+ "keyNoun": "questa chiave API",
2496
+ "defaultBadge": "Predefinita",
2497
+ "pinDefault": "Imposta come predefinita",
2498
+ "disabledBadge": "Disattivata",
2499
+ "enableToggle": "Attiva o disattiva questa chiave"
2495
2500
  },
2496
2501
  "vendorCredentials": {
2497
2502
  "title": "Vendor LLM",
@@ -2514,7 +2519,8 @@
2514
2519
  "toast": {
2515
2520
  "connected": "Token collegato",
2516
2521
  "connectFailed": "Impossibile collegare il token",
2517
- "removeFailed": "Impossibile rimuovere il token"
2522
+ "removeFailed": "Impossibile rimuovere il token",
2523
+ "updateFailed": "Impossibile aggiornare il token"
2518
2524
  },
2519
2525
  "vendors": {
2520
2526
  "kimi": {
@@ -2533,7 +2539,11 @@
2533
2539
  "confirmRemove": {
2534
2540
  "title": "Rimuovere questa credenziale?",
2535
2541
  "body": "\"{name}\" verrà rimossa. Questa operazione non può essere annullata."
2536
- }
2542
+ },
2543
+ "defaultBadge": "Predefinita",
2544
+ "pinDefault": "Imposta come predefinita",
2545
+ "disabledBadge": "Disattivata",
2546
+ "enableToggle": "Attiva o disattiva questo token"
2537
2547
  }
2538
2548
  },
2539
2549
  "github": {
@@ -2907,7 +2907,8 @@
2907
2907
  "toast": {
2908
2908
  "connected": "API キーを接続しました",
2909
2909
  "connectFailed": "キーを接続できませんでした",
2910
- "removeFailed": "キーを削除できませんでした"
2910
+ "removeFailed": "キーを削除できませんでした",
2911
+ "updateFailed": "キーを更新できませんでした"
2911
2912
  },
2912
2913
  "providers": {
2913
2914
  "openai": {
@@ -2946,7 +2947,11 @@
2946
2947
  "step2": "ゲートウェイのベース URL は、ここではなくデプロイ運用者が設定します (LITELLM_BASE_URL)。"
2947
2948
  }
2948
2949
  },
2949
- "keyNoun": "この API キー"
2950
+ "keyNoun": "この API キー",
2951
+ "defaultBadge": "デフォルト",
2952
+ "pinDefault": "デフォルトに設定",
2953
+ "disabledBadge": "無効",
2954
+ "enableToggle": "このキーを有効または無効にする"
2950
2955
  },
2951
2956
  "vendorCredentials": {
2952
2957
  "title": "LLM ベンダー",
@@ -2969,7 +2974,8 @@
2969
2974
  "toast": {
2970
2975
  "connected": "トークンを接続しました",
2971
2976
  "connectFailed": "トークンを接続できませんでした",
2972
- "removeFailed": "トークンを削除できませんでした"
2977
+ "removeFailed": "トークンを削除できませんでした",
2978
+ "updateFailed": "トークンを更新できませんでした"
2973
2979
  },
2974
2980
  "vendors": {
2975
2981
  "kimi": {
@@ -2988,7 +2994,11 @@
2988
2994
  "confirmRemove": {
2989
2995
  "title": "この認証情報を削除しますか?",
2990
2996
  "body": "「{name}」が削除されます。 この操作は取り消せません。"
2991
- }
2997
+ },
2998
+ "defaultBadge": "デフォルト",
2999
+ "pinDefault": "デフォルトに設定",
3000
+ "disabledBadge": "無効",
3001
+ "enableToggle": "このトークンを有効または無効にする"
2992
3002
  }
2993
3003
  },
2994
3004
  "github": {
@@ -2895,7 +2895,8 @@
2895
2895
  "toast": {
2896
2896
  "connected": "Klucz API podłączony",
2897
2897
  "connectFailed": "Nie udało się podłączyć klucza",
2898
- "removeFailed": "Nie udało się usunąć klucza"
2898
+ "removeFailed": "Nie udało się usunąć klucza",
2899
+ "updateFailed": "Nie udało się zaktualizować klucza"
2899
2900
  },
2900
2901
  "providers": {
2901
2902
  "openai": {
@@ -2934,7 +2935,11 @@
2934
2935
  "step2": "Bazowy URL bramy ustawia operator Twojego wdrożenia (LITELLM_BASE_URL), nie tutaj."
2935
2936
  }
2936
2937
  },
2937
- "keyNoun": "ten klucz API"
2938
+ "keyNoun": "ten klucz API",
2939
+ "defaultBadge": "Domyślny",
2940
+ "pinDefault": "Ustaw jako domyślny",
2941
+ "disabledBadge": "Wyłączony",
2942
+ "enableToggle": "Włącz lub wyłącz ten klucz"
2938
2943
  },
2939
2944
  "vendorCredentials": {
2940
2945
  "title": "Dostawcy LLM",
@@ -2957,7 +2962,8 @@
2957
2962
  "toast": {
2958
2963
  "connected": "Token podłączony",
2959
2964
  "connectFailed": "Nie udało się podłączyć tokenu",
2960
- "removeFailed": "Nie udało się usunąć tokenu"
2965
+ "removeFailed": "Nie udało się usunąć tokenu",
2966
+ "updateFailed": "Nie udało się zaktualizować tokena"
2961
2967
  },
2962
2968
  "vendors": {
2963
2969
  "kimi": {
@@ -2976,7 +2982,11 @@
2976
2982
  "confirmRemove": {
2977
2983
  "title": "Usunąć te dane logowania?",
2978
2984
  "body": "\"{name}\" zostanie usunięty. Tej operacji nie można cofnąć."
2979
- }
2985
+ },
2986
+ "defaultBadge": "Domyślny",
2987
+ "pinDefault": "Ustaw jako domyślny",
2988
+ "disabledBadge": "Wyłączony",
2989
+ "enableToggle": "Włącz lub wyłącz ten token"
2980
2990
  }
2981
2991
  },
2982
2992
  "github": {
@@ -2907,7 +2907,8 @@
2907
2907
  "toast": {
2908
2908
  "connected": "API anahtarı bağlandı",
2909
2909
  "connectFailed": "Anahtar bağlanamadı",
2910
- "removeFailed": "Anahtar kaldırılamadı"
2910
+ "removeFailed": "Anahtar kaldırılamadı",
2911
+ "updateFailed": "Anahtar güncellenemedi"
2911
2912
  },
2912
2913
  "providers": {
2913
2914
  "openai": {
@@ -2946,7 +2947,11 @@
2946
2947
  "step2": "Ağ geçidinin temel URL'si burada değil, dağıtım operatörünüz tarafından ayarlanır (LITELLM_BASE_URL)."
2947
2948
  }
2948
2949
  },
2949
- "keyNoun": "bu API anahtarı"
2950
+ "keyNoun": "bu API anahtarı",
2951
+ "defaultBadge": "Varsayılan",
2952
+ "pinDefault": "Varsayılan yap",
2953
+ "disabledBadge": "Devre dışı",
2954
+ "enableToggle": "Bu anahtarı etkinleştir veya devre dışı bırak"
2950
2955
  },
2951
2956
  "vendorCredentials": {
2952
2957
  "title": "LLM Sağlayıcıları",
@@ -2969,7 +2974,8 @@
2969
2974
  "toast": {
2970
2975
  "connected": "Token bağlandı",
2971
2976
  "connectFailed": "Token bağlanamadı",
2972
- "removeFailed": "Token kaldırılamadı"
2977
+ "removeFailed": "Token kaldırılamadı",
2978
+ "updateFailed": "Belirteç güncellenemedi"
2973
2979
  },
2974
2980
  "vendors": {
2975
2981
  "kimi": {
@@ -2988,7 +2994,11 @@
2988
2994
  "confirmRemove": {
2989
2995
  "title": "Bu kimlik bilgisi kaldırılsın mı?",
2990
2996
  "body": "\"{name}\" kaldırılacak. Bu işlem geri alınamaz."
2991
- }
2997
+ },
2998
+ "defaultBadge": "Varsayılan",
2999
+ "pinDefault": "Varsayılan yap",
3000
+ "disabledBadge": "Devre dışı",
3001
+ "enableToggle": "Bu belirteci etkinleştir veya devre dışı bırak"
2992
3002
  }
2993
3003
  },
2994
3004
  "github": {
@@ -2895,7 +2895,8 @@
2895
2895
  "toast": {
2896
2896
  "connected": "Ключ API підключено",
2897
2897
  "connectFailed": "Не вдалося підключити ключ",
2898
- "removeFailed": "Не вдалося видалити ключ"
2898
+ "removeFailed": "Не вдалося видалити ключ",
2899
+ "updateFailed": "Не вдалося оновити ключ"
2899
2900
  },
2900
2901
  "providers": {
2901
2902
  "openai": {
@@ -2934,7 +2935,11 @@
2934
2935
  "step2": "Базову URL-адресу шлюзу задає оператор вашого розгортання (LITELLM_BASE_URL), а не тут."
2935
2936
  }
2936
2937
  },
2937
- "keyNoun": "цей ключ API"
2938
+ "keyNoun": "цей ключ API",
2939
+ "defaultBadge": "За замовчуванням",
2940
+ "pinDefault": "Зробити за замовчуванням",
2941
+ "disabledBadge": "Вимкнено",
2942
+ "enableToggle": "Увімкнути або вимкнути цей ключ"
2938
2943
  },
2939
2944
  "vendorCredentials": {
2940
2945
  "title": "Постачальники LLM",
@@ -2957,7 +2962,8 @@
2957
2962
  "toast": {
2958
2963
  "connected": "Токен підключено",
2959
2964
  "connectFailed": "Не вдалося підключити токен",
2960
- "removeFailed": "Не вдалося видалити токен"
2965
+ "removeFailed": "Не вдалося видалити токен",
2966
+ "updateFailed": "Не вдалося оновити токен"
2961
2967
  },
2962
2968
  "vendors": {
2963
2969
  "kimi": {
@@ -2976,7 +2982,11 @@
2976
2982
  "confirmRemove": {
2977
2983
  "title": "Прибрати ці облікові дані?",
2978
2984
  "body": "\"{name}\" буде видалено. Цю дію не можна скасувати."
2979
- }
2985
+ },
2986
+ "defaultBadge": "За замовчуванням",
2987
+ "pinDefault": "Зробити за замовчуванням",
2988
+ "disabledBadge": "Вимкнено",
2989
+ "enableToggle": "Увімкнути або вимкнути цей токен"
2980
2990
  }
2981
2991
  },
2982
2992
  "github": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.149.0",
3
+ "version": "0.150.0",
4
4
  "description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,7 +40,7 @@
40
40
  "valibot": "^1.4.2",
41
41
  "vue": "3.5.40",
42
42
  "wretch": "^3.0.9",
43
- "@cat-factory/contracts": "0.157.0"
43
+ "@cat-factory/contracts": "0.158.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@toad-contracts/testing": "0.3.2",