@cat-factory/app 0.148.1 → 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.
- package/app/components/fragments/FragmentLibraryManager.vue +188 -18
- package/app/components/panels/AgentStepDetail.vue +11 -0
- package/app/components/panels/StepEffortReport.vue +86 -0
- package/app/components/panels/StepFragmentAdherence.vue +85 -0
- package/app/components/prReview/PrReviewWindow.vue +8 -0
- package/app/components/providers/ApiKeysSection.vue +47 -7
- package/app/components/providers/VendorCredentialsModal.vue +56 -7
- package/app/composables/api/fragments.ts +17 -0
- package/app/composables/api/models.ts +22 -0
- package/app/stores/apiKeys.ts +30 -1
- package/app/stores/fragmentLibrary.ts +16 -0
- package/app/stores/vendorCredentials.ts +32 -2
- package/app/types/execution.ts +3 -0
- package/app/types/fragments.ts +2 -0
- package/app/types/models.ts +2 -0
- package/i18n/locales/de.json +37 -8
- package/i18n/locales/en.json +37 -8
- package/i18n/locales/es.json +37 -8
- package/i18n/locales/fr.json +37 -8
- package/i18n/locales/he.json +37 -8
- package/i18n/locales/it.json +37 -8
- package/i18n/locales/ja.json +37 -8
- package/i18n/locales/pl.json +37 -8
- package/i18n/locales/tr.json +37 -8
- package/i18n/locales/uk.json +37 -8
- package/package.json +2 -2
|
@@ -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
|
|
package/app/stores/apiKeys.ts
CHANGED
|
@@ -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,
|
|
@@ -111,6 +111,21 @@ function fragmentLibrarySetup(kind: FragmentOwnerKind, resolveOwnerId: () => str
|
|
|
111
111
|
await Promise.all([reloadTier(), refreshResolved()])
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
+
/**
|
|
115
|
+
* Auto-generate a title for a fragment from its content (an inline LLM call). Returns the
|
|
116
|
+
* suggested title for the caller to drop into the editor; performs no write. At the account
|
|
117
|
+
* scope the model resolves against `viaWorkspaceId`'s credential scope.
|
|
118
|
+
*/
|
|
119
|
+
async function generateTitle(input: { body: string; summary?: string }): Promise<string> {
|
|
120
|
+
const { title } = await api.generateFragmentTitle(
|
|
121
|
+
kind,
|
|
122
|
+
requireOwnerId(),
|
|
123
|
+
input,
|
|
124
|
+
viaWorkspaceId.value,
|
|
125
|
+
)
|
|
126
|
+
return title
|
|
127
|
+
}
|
|
128
|
+
|
|
114
129
|
/** Link an external document as a living (dynamically-resolved) fragment. */
|
|
115
130
|
async function createDocumentFragment(input: CreateDocumentFragmentInput) {
|
|
116
131
|
loading.value = true
|
|
@@ -203,6 +218,7 @@ function fragmentLibrarySetup(kind: FragmentOwnerKind, resolveOwnerId: () => str
|
|
|
203
218
|
createDocumentFragment,
|
|
204
219
|
refreshDocumentFragment,
|
|
205
220
|
update,
|
|
221
|
+
generateTitle,
|
|
206
222
|
remove,
|
|
207
223
|
linkSource,
|
|
208
224
|
unlinkSource,
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { defineStore } from 'pinia'
|
|
2
2
|
import { computed, ref } from 'vue'
|
|
3
|
-
import type {
|
|
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 {
|
|
73
|
+
return {
|
|
74
|
+
credentials,
|
|
75
|
+
loading,
|
|
76
|
+
load,
|
|
77
|
+
add,
|
|
78
|
+
update,
|
|
79
|
+
remove,
|
|
80
|
+
configuredVendors,
|
|
81
|
+
hasVendor,
|
|
82
|
+
forVendor,
|
|
83
|
+
}
|
|
54
84
|
})
|
package/app/types/execution.ts
CHANGED
package/app/types/fragments.ts
CHANGED
package/app/types/models.ts
CHANGED
package/i18n/locales/de.json
CHANGED
|
@@ -1476,7 +1476,20 @@
|
|
|
1476
1476
|
"confirmReject": "Ablehnung bestätigen",
|
|
1477
1477
|
"requestChanges": "Änderungen anfordern",
|
|
1478
1478
|
"reject": "Ablehnen",
|
|
1479
|
-
"requestChangesHint": "Änderungen anfordern führt diesen Schritt mit deinem Feedback & deinen Kommentaren erneut aus. Ablehnen stoppt den Lauf vollständig."
|
|
1479
|
+
"requestChangesHint": "Änderungen anfordern führt diesen Schritt mit deinem Feedback & deinen Kommentaren erneut aus. Ablehnen stoppt den Lauf vollständig.",
|
|
1480
|
+
"effort": {
|
|
1481
|
+
"heading": "Agenten-Aufwand",
|
|
1482
|
+
"difficulty": "Schwierigkeit",
|
|
1483
|
+
"outOfTen": "{value}/10",
|
|
1484
|
+
"reduced": "Was die Effektivität verringert hat",
|
|
1485
|
+
"obstacles": "Wichtigste Hindernisse"
|
|
1486
|
+
},
|
|
1487
|
+
"adherence": {
|
|
1488
|
+
"heading": "Einhaltung der Best Practices",
|
|
1489
|
+
"outOfTen": "{value}/10",
|
|
1490
|
+
"relatedFindings": "Zugehörige Befunde",
|
|
1491
|
+
"unnamed": "Standard"
|
|
1492
|
+
}
|
|
1480
1493
|
},
|
|
1481
1494
|
"inspector": {
|
|
1482
1495
|
"frameStatus": {
|
|
@@ -2439,7 +2452,8 @@
|
|
|
2439
2452
|
"toast": {
|
|
2440
2453
|
"connected": "API-Schlüssel verbunden",
|
|
2441
2454
|
"connectFailed": "Schlüssel konnte nicht verbunden werden",
|
|
2442
|
-
"removeFailed": "Schlüssel konnte nicht entfernt werden"
|
|
2455
|
+
"removeFailed": "Schlüssel konnte nicht entfernt werden",
|
|
2456
|
+
"updateFailed": "Schlüssel konnte nicht aktualisiert werden"
|
|
2443
2457
|
},
|
|
2444
2458
|
"providers": {
|
|
2445
2459
|
"openai": {
|
|
@@ -2478,7 +2492,11 @@
|
|
|
2478
2492
|
"step2": "Die Basis-URL des Gateways wird von Ihrem Deployment-Betreiber festgelegt (LITELLM_BASE_URL), nicht hier."
|
|
2479
2493
|
}
|
|
2480
2494
|
},
|
|
2481
|
-
"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"
|
|
2482
2500
|
},
|
|
2483
2501
|
"vendorCredentials": {
|
|
2484
2502
|
"title": "LLM-Vendors",
|
|
@@ -2501,7 +2519,8 @@
|
|
|
2501
2519
|
"toast": {
|
|
2502
2520
|
"connected": "Token verbunden",
|
|
2503
2521
|
"connectFailed": "Token konnte nicht verbunden werden",
|
|
2504
|
-
"removeFailed": "Token konnte nicht entfernt werden"
|
|
2522
|
+
"removeFailed": "Token konnte nicht entfernt werden",
|
|
2523
|
+
"updateFailed": "Token konnte nicht aktualisiert werden"
|
|
2505
2524
|
},
|
|
2506
2525
|
"vendors": {
|
|
2507
2526
|
"kimi": {
|
|
@@ -2520,7 +2539,11 @@
|
|
|
2520
2539
|
"confirmRemove": {
|
|
2521
2540
|
"title": "Diese Zugangsdaten entfernen?",
|
|
2522
2541
|
"body": "\"{name}\" wird entfernt. Dies kann nicht rückgängig gemacht werden."
|
|
2523
|
-
}
|
|
2542
|
+
},
|
|
2543
|
+
"defaultBadge": "Standard",
|
|
2544
|
+
"pinDefault": "Als Standard festlegen",
|
|
2545
|
+
"disabledBadge": "Deaktiviert",
|
|
2546
|
+
"enableToggle": "Dieses Token aktivieren oder deaktivieren"
|
|
2524
2547
|
}
|
|
2525
2548
|
},
|
|
2526
2549
|
"github": {
|
|
@@ -3565,7 +3588,10 @@
|
|
|
3565
3588
|
"summaryPlaceholder": "Einzeilige Zusammenfassung (vom Selektor verwendet)",
|
|
3566
3589
|
"bodyPlaceholder": "Richtlinientext (in den Prompt injiziert)",
|
|
3567
3590
|
"tagsPlaceholder": "Tags, kommagetrennt (z. B. backend, db)",
|
|
3568
|
-
"add": "Fragment hinzufügen"
|
|
3591
|
+
"add": "Fragment hinzufügen",
|
|
3592
|
+
"generateTitle": "Generieren",
|
|
3593
|
+
"generateTitleHint": "Titel aus dem Inhalt des Fragments vorschlagen",
|
|
3594
|
+
"titleGenFailed": "Titel konnte nicht generiert werden"
|
|
3569
3595
|
},
|
|
3570
3596
|
"documents": {
|
|
3571
3597
|
"intro": "Verknüpfen Sie eine Confluence-/Notion-Seite oder eine GitHub-Datei als Best-Practice-Fragment. Ihre Richtlinie wird zur Laufzeit aus der Quelle neu aufgelöst: Bearbeiten Sie das Dokument, und der nächste Agentenlauf folgt der neuen Version (kein erneuter Import).",
|
|
@@ -3615,7 +3641,9 @@
|
|
|
3615
3641
|
"checkSourceFailed": "Quelle konnte nicht geprüft werden",
|
|
3616
3642
|
"sourceUnlinked": "Quelle-Verknüpfung aufgehoben",
|
|
3617
3643
|
"unlinkSourceFailed": "Quelle-Verknüpfung konnte nicht aufgehoben werden",
|
|
3618
|
-
"documentsLinked": "{count} Dokument als lebendes Fragment verknüpft | {count} Dokumente als lebende Fragmente verknüpft"
|
|
3644
|
+
"documentsLinked": "{count} Dokument als lebendes Fragment verknüpft | {count} Dokumente als lebende Fragmente verknüpft",
|
|
3645
|
+
"updated": "Fragment aktualisiert",
|
|
3646
|
+
"updateFailed": "Fragment konnte nicht aktualisiert werden"
|
|
3619
3647
|
},
|
|
3620
3648
|
"confirmRemove": {
|
|
3621
3649
|
"title": "Dieses Fragment löschen?",
|
|
@@ -3984,7 +4012,8 @@
|
|
|
3984
4012
|
"body": "Du hast Änderungen vorgenommen, die noch nicht gespeichert wurden. Schließen und verlieren?",
|
|
3985
4013
|
"confirm": "Verwerfen",
|
|
3986
4014
|
"keep": "Weiter bearbeiten"
|
|
3987
|
-
}
|
|
4015
|
+
},
|
|
4016
|
+
"edit": "Bearbeiten"
|
|
3988
4017
|
},
|
|
3989
4018
|
"access": {
|
|
3990
4019
|
"noBoardWrite": "Nur-Lese-Zugriff: Sie können dieses Board ansehen, aber nicht bearbeiten.",
|
package/i18n/locales/en.json
CHANGED
|
@@ -82,7 +82,8 @@
|
|
|
82
82
|
"body": "You've made changes that haven't been saved. Close this and lose them?",
|
|
83
83
|
"confirm": "Discard",
|
|
84
84
|
"keep": "Keep editing"
|
|
85
|
-
}
|
|
85
|
+
},
|
|
86
|
+
"edit": "Edit"
|
|
86
87
|
},
|
|
87
88
|
"access": {
|
|
88
89
|
"noBoardWrite": "Read-only access: you can view this board but can't edit it.",
|
|
@@ -1251,7 +1252,20 @@
|
|
|
1251
1252
|
"confirmReject": "Confirm reject",
|
|
1252
1253
|
"requestChanges": "Request changes",
|
|
1253
1254
|
"reject": "Reject",
|
|
1254
|
-
"requestChangesHint": "Request changes re-runs this step with your feedback & comments. Reject stops the run entirely."
|
|
1255
|
+
"requestChangesHint": "Request changes re-runs this step with your feedback & comments. Reject stops the run entirely.",
|
|
1256
|
+
"effort": {
|
|
1257
|
+
"heading": "Agent effort",
|
|
1258
|
+
"difficulty": "Difficulty",
|
|
1259
|
+
"outOfTen": "{value}/10",
|
|
1260
|
+
"reduced": "What reduced effectiveness",
|
|
1261
|
+
"obstacles": "Key obstacles"
|
|
1262
|
+
},
|
|
1263
|
+
"adherence": {
|
|
1264
|
+
"heading": "Best-practice adherence",
|
|
1265
|
+
"outOfTen": "{value}/10",
|
|
1266
|
+
"relatedFindings": "Related findings",
|
|
1267
|
+
"unnamed": "Standard"
|
|
1268
|
+
}
|
|
1255
1269
|
},
|
|
1256
1270
|
"inspector": {
|
|
1257
1271
|
"frameStatus": {
|
|
@@ -2965,7 +2979,8 @@
|
|
|
2965
2979
|
"toast": {
|
|
2966
2980
|
"connected": "API key connected",
|
|
2967
2981
|
"connectFailed": "Could not connect key",
|
|
2968
|
-
"removeFailed": "Could not remove key"
|
|
2982
|
+
"removeFailed": "Could not remove key",
|
|
2983
|
+
"updateFailed": "Could not update key"
|
|
2969
2984
|
},
|
|
2970
2985
|
"providers": {
|
|
2971
2986
|
"openai": {
|
|
@@ -3004,7 +3019,11 @@
|
|
|
3004
3019
|
"step2": "The gateway's base URL is set by your deployment operator (LITELLM_BASE_URL), not here."
|
|
3005
3020
|
}
|
|
3006
3021
|
},
|
|
3007
|
-
"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"
|
|
3008
3027
|
},
|
|
3009
3028
|
"vendorCredentials": {
|
|
3010
3029
|
"title": "LLM Vendors",
|
|
@@ -3030,7 +3049,8 @@
|
|
|
3030
3049
|
"toast": {
|
|
3031
3050
|
"connected": "Token connected",
|
|
3032
3051
|
"connectFailed": "Could not connect token",
|
|
3033
|
-
"removeFailed": "Could not remove token"
|
|
3052
|
+
"removeFailed": "Could not remove token",
|
|
3053
|
+
"updateFailed": "Could not update token"
|
|
3034
3054
|
},
|
|
3035
3055
|
"vendors": {
|
|
3036
3056
|
"kimi": {
|
|
@@ -3049,7 +3069,11 @@
|
|
|
3049
3069
|
"confirmRemove": {
|
|
3050
3070
|
"title": "Remove this credential?",
|
|
3051
3071
|
"body": "\"{name}\" will be removed. This can't be undone."
|
|
3052
|
-
}
|
|
3072
|
+
},
|
|
3073
|
+
"defaultBadge": "Default",
|
|
3074
|
+
"pinDefault": "Set as default",
|
|
3075
|
+
"disabledBadge": "Disabled",
|
|
3076
|
+
"enableToggle": "Enable or disable this token"
|
|
3053
3077
|
}
|
|
3054
3078
|
},
|
|
3055
3079
|
"github": {
|
|
@@ -4565,7 +4589,10 @@
|
|
|
4565
4589
|
"summaryPlaceholder": "One-line summary (used by the selector)",
|
|
4566
4590
|
"bodyPlaceholder": "Guidance body (injected into the prompt)",
|
|
4567
4591
|
"tagsPlaceholder": "Tags, comma-separated (e.g. backend, db)",
|
|
4568
|
-
"add": "Add fragment"
|
|
4592
|
+
"add": "Add fragment",
|
|
4593
|
+
"generateTitle": "Generate",
|
|
4594
|
+
"generateTitleHint": "Suggest a title from the fragment's content",
|
|
4595
|
+
"titleGenFailed": "Couldn't generate a title"
|
|
4569
4596
|
},
|
|
4570
4597
|
"documents": {
|
|
4571
4598
|
"intro": "Link a Confluence/Notion page or a GitHub file as a best-practice fragment. Its guidance is re-resolved from the source at run time: edit the doc and the next agent run follows the new version (no re-import).",
|
|
@@ -4615,7 +4642,9 @@
|
|
|
4615
4642
|
"checkSourceFailed": "Could not check source",
|
|
4616
4643
|
"sourceUnlinked": "Source unlinked",
|
|
4617
4644
|
"unlinkSourceFailed": "Could not unlink source",
|
|
4618
|
-
"documentsLinked": "Linked {count} document as a living fragment | Linked {count} documents as living fragments"
|
|
4645
|
+
"documentsLinked": "Linked {count} document as a living fragment | Linked {count} documents as living fragments",
|
|
4646
|
+
"updated": "Fragment updated",
|
|
4647
|
+
"updateFailed": "Couldn't update the fragment"
|
|
4619
4648
|
},
|
|
4620
4649
|
"confirmRemove": {
|
|
4621
4650
|
"title": "Delete this fragment?",
|
package/i18n/locales/es.json
CHANGED
|
@@ -73,7 +73,8 @@
|
|
|
73
73
|
"body": "Has hecho cambios que no se han guardado. ¿Cerrar y perderlos?",
|
|
74
74
|
"confirm": "Descartar",
|
|
75
75
|
"keep": "Seguir editando"
|
|
76
|
-
}
|
|
76
|
+
},
|
|
77
|
+
"edit": "Editar"
|
|
77
78
|
},
|
|
78
79
|
"access": {
|
|
79
80
|
"noBoardWrite": "Acceso de solo lectura: puedes ver este tablero pero no editarlo.",
|
|
@@ -1194,7 +1195,20 @@
|
|
|
1194
1195
|
"confirmReject": "Confirmar rechazo",
|
|
1195
1196
|
"requestChanges": "Solicitar cambios",
|
|
1196
1197
|
"reject": "Rechazar",
|
|
1197
|
-
"requestChangesHint": "Solicitar cambios vuelve a ejecutar este paso con tus comentarios y observaciones. Rechazar detiene la ejecución por completo."
|
|
1198
|
+
"requestChangesHint": "Solicitar cambios vuelve a ejecutar este paso con tus comentarios y observaciones. Rechazar detiene la ejecución por completo.",
|
|
1199
|
+
"effort": {
|
|
1200
|
+
"heading": "Esfuerzo del agente",
|
|
1201
|
+
"difficulty": "Dificultad",
|
|
1202
|
+
"outOfTen": "{value}/10",
|
|
1203
|
+
"reduced": "Qué redujo la efectividad",
|
|
1204
|
+
"obstacles": "Obstáculos clave"
|
|
1205
|
+
},
|
|
1206
|
+
"adherence": {
|
|
1207
|
+
"heading": "Cumplimiento de buenas prácticas",
|
|
1208
|
+
"outOfTen": "{value}/10",
|
|
1209
|
+
"relatedFindings": "Hallazgos relacionados",
|
|
1210
|
+
"unnamed": "Estándar"
|
|
1211
|
+
}
|
|
1198
1212
|
},
|
|
1199
1213
|
"inspector": {
|
|
1200
1214
|
"frameStatus": {
|
|
@@ -2881,7 +2895,8 @@
|
|
|
2881
2895
|
"toast": {
|
|
2882
2896
|
"connected": "Clave de API conectada",
|
|
2883
2897
|
"connectFailed": "No se pudo conectar la clave",
|
|
2884
|
-
"removeFailed": "No se pudo eliminar la clave"
|
|
2898
|
+
"removeFailed": "No se pudo eliminar la clave",
|
|
2899
|
+
"updateFailed": "No se pudo actualizar la clave"
|
|
2885
2900
|
},
|
|
2886
2901
|
"providers": {
|
|
2887
2902
|
"openai": {
|
|
@@ -2920,7 +2935,11 @@
|
|
|
2920
2935
|
"step2": "La URL base de la pasarela la establece el operador de tu despliegue (LITELLM_BASE_URL), no aquí."
|
|
2921
2936
|
}
|
|
2922
2937
|
},
|
|
2923
|
-
"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"
|
|
2924
2943
|
},
|
|
2925
2944
|
"vendorCredentials": {
|
|
2926
2945
|
"title": "Proveedores de LLM",
|
|
@@ -2943,7 +2962,8 @@
|
|
|
2943
2962
|
"toast": {
|
|
2944
2963
|
"connected": "Token conectado",
|
|
2945
2964
|
"connectFailed": "No se pudo conectar el token",
|
|
2946
|
-
"removeFailed": "No se pudo eliminar el token"
|
|
2965
|
+
"removeFailed": "No se pudo eliminar el token",
|
|
2966
|
+
"updateFailed": "No se pudo actualizar el token"
|
|
2947
2967
|
},
|
|
2948
2968
|
"vendors": {
|
|
2949
2969
|
"kimi": {
|
|
@@ -2962,7 +2982,11 @@
|
|
|
2962
2982
|
"confirmRemove": {
|
|
2963
2983
|
"title": "¿Quitar esta credencial?",
|
|
2964
2984
|
"body": "Se eliminará \"{name}\". Esta acción no se puede deshacer."
|
|
2965
|
-
}
|
|
2985
|
+
},
|
|
2986
|
+
"defaultBadge": "Predeterminada",
|
|
2987
|
+
"pinDefault": "Establecer como predeterminada",
|
|
2988
|
+
"disabledBadge": "Desactivada",
|
|
2989
|
+
"enableToggle": "Activar o desactivar este token"
|
|
2966
2990
|
}
|
|
2967
2991
|
},
|
|
2968
2992
|
"github": {
|
|
@@ -4389,7 +4413,10 @@
|
|
|
4389
4413
|
"summaryPlaceholder": "Resumen de una línea (usado por el selector)",
|
|
4390
4414
|
"bodyPlaceholder": "Cuerpo de la guía (inyectado en el prompt)",
|
|
4391
4415
|
"tagsPlaceholder": "Etiquetas, separadas por comas (p. ej., backend, db)",
|
|
4392
|
-
"add": "Añadir fragmento"
|
|
4416
|
+
"add": "Añadir fragmento",
|
|
4417
|
+
"generateTitle": "Generar",
|
|
4418
|
+
"generateTitleHint": "Sugerir un título a partir del contenido del fragmento",
|
|
4419
|
+
"titleGenFailed": "No se pudo generar un título"
|
|
4393
4420
|
},
|
|
4394
4421
|
"documents": {
|
|
4395
4422
|
"intro": "Vincula una página de Confluence/Notion o un archivo de GitHub como fragmento de buenas prácticas. Su guía se vuelve a resolver desde la fuente en tiempo de ejecución: edita el documento y la siguiente ejecución del agente sigue la nueva versión (sin reimportar).",
|
|
@@ -4439,7 +4466,9 @@
|
|
|
4439
4466
|
"checkSourceFailed": "No se pudo comprobar el origen",
|
|
4440
4467
|
"sourceUnlinked": "Origen desvinculado",
|
|
4441
4468
|
"unlinkSourceFailed": "No se pudo desvincular el origen",
|
|
4442
|
-
"documentsLinked": "{count} documento vinculado como fragmento vivo | {count} documentos vinculados como fragmentos vivos"
|
|
4469
|
+
"documentsLinked": "{count} documento vinculado como fragmento vivo | {count} documentos vinculados como fragmentos vivos",
|
|
4470
|
+
"updated": "Fragmento actualizado",
|
|
4471
|
+
"updateFailed": "No se pudo actualizar el fragmento"
|
|
4443
4472
|
},
|
|
4444
4473
|
"confirmRemove": {
|
|
4445
4474
|
"title": "¿Eliminar este fragmento?",
|
package/i18n/locales/fr.json
CHANGED
|
@@ -73,7 +73,8 @@
|
|
|
73
73
|
"body": "Vous avez effectué des modifications non enregistrées. Fermer et les perdre ?",
|
|
74
74
|
"confirm": "Ignorer",
|
|
75
75
|
"keep": "Continuer l'édition"
|
|
76
|
-
}
|
|
76
|
+
},
|
|
77
|
+
"edit": "Modifier"
|
|
77
78
|
},
|
|
78
79
|
"access": {
|
|
79
80
|
"noBoardWrite": "Accès en lecture seule : vous pouvez consulter ce tableau mais pas le modifier.",
|
|
@@ -1194,7 +1195,20 @@
|
|
|
1194
1195
|
"confirmReject": "Confirmer le rejet",
|
|
1195
1196
|
"requestChanges": "Demander des modifications",
|
|
1196
1197
|
"reject": "Rejeter",
|
|
1197
|
-
"requestChangesHint": "Demander des modifications relance cette étape avec votre retour et vos commentaires. Rejeter arrête complètement l'exécution."
|
|
1198
|
+
"requestChangesHint": "Demander des modifications relance cette étape avec votre retour et vos commentaires. Rejeter arrête complètement l'exécution.",
|
|
1199
|
+
"effort": {
|
|
1200
|
+
"heading": "Effort de l'agent",
|
|
1201
|
+
"difficulty": "Difficulté",
|
|
1202
|
+
"outOfTen": "{value}/10",
|
|
1203
|
+
"reduced": "Ce qui a réduit l'efficacité",
|
|
1204
|
+
"obstacles": "Principaux obstacles"
|
|
1205
|
+
},
|
|
1206
|
+
"adherence": {
|
|
1207
|
+
"heading": "Respect des bonnes pratiques",
|
|
1208
|
+
"outOfTen": "{value}/10",
|
|
1209
|
+
"relatedFindings": "Constats associés",
|
|
1210
|
+
"unnamed": "Standard"
|
|
1211
|
+
}
|
|
1198
1212
|
},
|
|
1199
1213
|
"inspector": {
|
|
1200
1214
|
"frameStatus": {
|
|
@@ -2881,7 +2895,8 @@
|
|
|
2881
2895
|
"toast": {
|
|
2882
2896
|
"connected": "Clé d'API connectée",
|
|
2883
2897
|
"connectFailed": "Impossible de connecter la clé",
|
|
2884
|
-
"removeFailed": "Impossible de supprimer la clé"
|
|
2898
|
+
"removeFailed": "Impossible de supprimer la clé",
|
|
2899
|
+
"updateFailed": "Impossible de mettre à jour la clé"
|
|
2885
2900
|
},
|
|
2886
2901
|
"providers": {
|
|
2887
2902
|
"openai": {
|
|
@@ -2920,7 +2935,11 @@
|
|
|
2920
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."
|
|
2921
2936
|
}
|
|
2922
2937
|
},
|
|
2923
|
-
"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é"
|
|
2924
2943
|
},
|
|
2925
2944
|
"vendorCredentials": {
|
|
2926
2945
|
"title": "Fournisseurs de LLM",
|
|
@@ -2943,7 +2962,8 @@
|
|
|
2943
2962
|
"toast": {
|
|
2944
2963
|
"connected": "Token connecté",
|
|
2945
2964
|
"connectFailed": "Impossible de connecter le token",
|
|
2946
|
-
"removeFailed": "Impossible de supprimer le token"
|
|
2965
|
+
"removeFailed": "Impossible de supprimer le token",
|
|
2966
|
+
"updateFailed": "Impossible de mettre à jour le jeton"
|
|
2947
2967
|
},
|
|
2948
2968
|
"vendors": {
|
|
2949
2969
|
"kimi": {
|
|
@@ -2962,7 +2982,11 @@
|
|
|
2962
2982
|
"confirmRemove": {
|
|
2963
2983
|
"title": "Retirer ces identifiants ?",
|
|
2964
2984
|
"body": "\"{name}\" sera supprimé. Cette action est irréversible."
|
|
2965
|
-
}
|
|
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"
|
|
2966
2990
|
}
|
|
2967
2991
|
},
|
|
2968
2992
|
"github": {
|
|
@@ -4389,7 +4413,10 @@
|
|
|
4389
4413
|
"summaryPlaceholder": "Résumé en une ligne (utilisé par le sélecteur)",
|
|
4390
4414
|
"bodyPlaceholder": "Corps de la consigne (injecté dans le prompt)",
|
|
4391
4415
|
"tagsPlaceholder": "Étiquettes, séparées par des virgules (par ex. backend, db)",
|
|
4392
|
-
"add": "Ajouter le fragment"
|
|
4416
|
+
"add": "Ajouter le fragment",
|
|
4417
|
+
"generateTitle": "Générer",
|
|
4418
|
+
"generateTitleHint": "Proposer un titre à partir du contenu du fragment",
|
|
4419
|
+
"titleGenFailed": "Impossible de générer un titre"
|
|
4393
4420
|
},
|
|
4394
4421
|
"documents": {
|
|
4395
4422
|
"intro": "Liez une page Confluence/Notion ou un fichier GitHub comme fragment de bonnes pratiques. Sa consigne est re-résolue depuis la source à l'exécution : modifiez le document et la prochaine exécution d'agent suit la nouvelle version (sans réimport).",
|
|
@@ -4439,7 +4466,9 @@
|
|
|
4439
4466
|
"checkSourceFailed": "Impossible de vérifier la source",
|
|
4440
4467
|
"sourceUnlinked": "Source dissociée",
|
|
4441
4468
|
"unlinkSourceFailed": "Impossible de dissocier la source",
|
|
4442
|
-
"documentsLinked": "{count} document lié comme fragment vivant | {count} documents liés comme fragments vivants"
|
|
4469
|
+
"documentsLinked": "{count} document lié comme fragment vivant | {count} documents liés comme fragments vivants",
|
|
4470
|
+
"updated": "Fragment mis à jour",
|
|
4471
|
+
"updateFailed": "Impossible de mettre à jour le fragment"
|
|
4443
4472
|
},
|
|
4444
4473
|
"confirmRemove": {
|
|
4445
4474
|
"title": "Supprimer ce fragment ?",
|