@cat-factory/app 0.221.2 → 0.223.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/layout/NotificationsInbox.vue +5 -0
- package/app/components/panels/ReportsPanel.vue +28 -0
- package/app/components/settings/CapabilityCredentialsPanel.vue +19 -0
- package/app/components/settings/InfrastructureWindow.vue +18 -6
- package/app/components/settings/ToolServerChecklist.vue +264 -0
- package/app/components/slack/SlackPanel.vue +1 -0
- package/app/composables/api/toolServers.ts +21 -0
- package/app/composables/useApi.ts +2 -0
- package/app/stores/toolServers.spec.ts +142 -0
- package/app/stores/toolServers.ts +112 -0
- package/app/types/toolServers.ts +17 -0
- package/i18n/locales/de.json +45 -0
- package/i18n/locales/en.json +45 -0
- package/i18n/locales/es.json +45 -0
- package/i18n/locales/fr.json +45 -0
- package/i18n/locales/he.json +45 -0
- package/i18n/locales/it.json +45 -0
- package/i18n/locales/ja.json +45 -0
- package/i18n/locales/pl.json +45 -0
- package/i18n/locales/tr.json +45 -0
- package/i18n/locales/uk.json +45 -0
- package/package.json +2 -2
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { defineStore } from 'pinia'
|
|
2
|
+
import { computed, ref } from 'vue'
|
|
3
|
+
import type { ToolServerProbeResult, ToolServersView } from '~/types/toolServers'
|
|
4
|
+
import { useWorkspaceStore } from '~/stores/workspace'
|
|
5
|
+
import { apiErrorStatus } from '~/composables/api/errors'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The deployment's tool servers (MCP) and the results of probing them.
|
|
9
|
+
*
|
|
10
|
+
* Two halves with different lifetimes, which is why they are separate refs. The INVENTORY is
|
|
11
|
+
* deployment code: it changes when the deployment redeploys, so it is loaded on demand and re-read
|
|
12
|
+
* rather than patched. A PROBE RESULT is a moment in time and belongs to the operator who asked for
|
|
13
|
+
* it, so results are kept per server id and never fetched eagerly — a probe spends an outbound
|
|
14
|
+
* request under the deployment's own credential, so opening a panel must not fire one.
|
|
15
|
+
*
|
|
16
|
+
* Mirrors the capability-credential store's availability handling deliberately: the two surfaces sit
|
|
17
|
+
* in one tab, gate on the same permission, and a member without it must see neither.
|
|
18
|
+
*/
|
|
19
|
+
export const useToolServersStore = defineStore('toolServers', () => {
|
|
20
|
+
const api = useApi()
|
|
21
|
+
|
|
22
|
+
const view = ref<ToolServersView | null>(null)
|
|
23
|
+
// Probe results by server id. Kept after a re-read of the inventory: a result describes the server
|
|
24
|
+
// rather than the list it arrived in, and dropping it on refresh would erase the answer the
|
|
25
|
+
// operator just asked for.
|
|
26
|
+
const results = ref<Record<string, ToolServerProbeResult>>({})
|
|
27
|
+
const probing = ref<string | null>(null)
|
|
28
|
+
const loading = ref(false)
|
|
29
|
+
// The backend's two definitive refusals: no `secrets.manage` (403), and — unlike the credential
|
|
30
|
+
// store — never a 503, since the inventory needs no encryption key to project a registry. `null`
|
|
31
|
+
// until first probed. A 403 HIDES the surface rather than disabling it, because the inventory
|
|
32
|
+
// names the deployment's credential keys and its endpoints.
|
|
33
|
+
const available = ref<boolean | null>(null)
|
|
34
|
+
let inFlight: Promise<void> | null = null
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Whether there is anything to show. A deployment that registers no tool server has no row to
|
|
38
|
+
* render, and the panel section is hidden rather than rendering an empty heading.
|
|
39
|
+
*
|
|
40
|
+
* No `declarationsIncomplete` counterpart here, unlike the credential checklist: the inventory is
|
|
41
|
+
* read straight off this process's own registry, so an empty answer is an answer rather than
|
|
42
|
+
* possibly an outage.
|
|
43
|
+
*/
|
|
44
|
+
const hasSurface = computed(() => (view.value?.servers.length ?? 0) > 0)
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Refresh the inventory, sharing a read that is already in flight.
|
|
48
|
+
*
|
|
49
|
+
* Coalescing belongs on `load` and not only on `ensureLoaded` because both callers fire on the
|
|
50
|
+
* same interaction: the Infrastructure window calls `ensureLoaded` to decide whether the tab
|
|
51
|
+
* exists at all, and the panel refreshes on mount so a redeploy shows up without a reload. Two
|
|
52
|
+
* identical GETs per open is what a plain "force" would have cost, and a read that started
|
|
53
|
+
* microseconds ago IS the refresh.
|
|
54
|
+
*/
|
|
55
|
+
async function load() {
|
|
56
|
+
if (inFlight) return inFlight
|
|
57
|
+
inFlight = readInventory().finally(() => (inFlight = null))
|
|
58
|
+
return inFlight
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function readInventory() {
|
|
62
|
+
const ws = useWorkspaceStore()
|
|
63
|
+
loading.value = true
|
|
64
|
+
try {
|
|
65
|
+
view.value = await api.listToolServers(ws.requireId())
|
|
66
|
+
available.value = true
|
|
67
|
+
} catch (err) {
|
|
68
|
+
if (apiErrorStatus(err) === 403) {
|
|
69
|
+
// A definitive answer, not a failure: this caller may not manage secrets. Hide the surface
|
|
70
|
+
// and stop probing; resolve normally.
|
|
71
|
+
available.value = false
|
|
72
|
+
view.value = null
|
|
73
|
+
return
|
|
74
|
+
}
|
|
75
|
+
// Any other failure (transient 5xx / network) leaves the state untouched, so it neither hides
|
|
76
|
+
// an available panel nor caches a false "unavailable", and PROPAGATES: the panel is the one
|
|
77
|
+
// surface that can tell a reader it is looking at a list we could not fetch. Same split as the
|
|
78
|
+
// capability-credential store.
|
|
79
|
+
throw err
|
|
80
|
+
} finally {
|
|
81
|
+
loading.value = false
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Load once and stay loaded; `load()` re-reads (both share whatever is in flight). */
|
|
86
|
+
async function ensureLoaded() {
|
|
87
|
+
if (available.value !== null) return
|
|
88
|
+
return load()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Probe ONE server and keep its result.
|
|
93
|
+
*
|
|
94
|
+
* The result is stored for every outcome, failures included: a failure IS the answer the operator
|
|
95
|
+
* asked for, and a store that only kept successes would leave the row looking untouched after the
|
|
96
|
+
* probe reported a dead endpoint. A thrown error (a 404 for a server the deployment has since
|
|
97
|
+
* dropped, a transient 5xx) propagates instead, because those are not probe verdicts.
|
|
98
|
+
*/
|
|
99
|
+
async function probe(id: string) {
|
|
100
|
+
const ws = useWorkspaceStore()
|
|
101
|
+
probing.value = id
|
|
102
|
+
try {
|
|
103
|
+
const result = await api.probeToolServer(ws.requireId(), id)
|
|
104
|
+
results.value = { ...results.value, [id]: result }
|
|
105
|
+
return result
|
|
106
|
+
} finally {
|
|
107
|
+
probing.value = null
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return { view, results, probing, loading, available, hasSurface, load, ensureLoaded, probe }
|
|
112
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Tool server (MCP) operability shapes: what this deployment declared, and what a probe answered.
|
|
2
|
+
//
|
|
3
|
+
// All wire shapes are sourced from @cat-factory/contracts (single source of truth). The probe
|
|
4
|
+
// STATUS and the not-probeable REASON in particular are vocabularies both sides must agree about —
|
|
5
|
+
// the backend decides them, this app maps each member to translated copy plus a remedy — so a
|
|
6
|
+
// member added on one side only renders as a blank chip rather than failing to compile.
|
|
7
|
+
|
|
8
|
+
export type {
|
|
9
|
+
ToolServerAllowedToolsCheck,
|
|
10
|
+
ToolServerCredential,
|
|
11
|
+
ToolServerNotProbeableReason,
|
|
12
|
+
ToolServerProbeResult,
|
|
13
|
+
ToolServerProbeStatus,
|
|
14
|
+
ToolServerTransport,
|
|
15
|
+
ToolServerView,
|
|
16
|
+
ToolServersView,
|
|
17
|
+
} from '@cat-factory/contracts'
|
package/i18n/locales/de.json
CHANGED
|
@@ -606,6 +606,48 @@
|
|
|
606
606
|
"removeFailed": "Der Registry-Eintrag konnte nicht entfernt werden"
|
|
607
607
|
}
|
|
608
608
|
},
|
|
609
|
+
"toolServers": {
|
|
610
|
+
"heading": "Werkzeugserver (MCP)",
|
|
611
|
+
"intro": "Die MCP-Server, die diese Installation für ihre Agenten registriert. Ein Test löst die Zugangsdaten dieses Boards auf und spricht das Protokoll mit dem Server, das Ergebnis entspricht also dem, was ein Lauf erhält.",
|
|
612
|
+
"transport": {
|
|
613
|
+
"stdio": "Im Container",
|
|
614
|
+
"http": "Extern"
|
|
615
|
+
},
|
|
616
|
+
"declaredBy": "Zugewiesen an: {kinds}",
|
|
617
|
+
"declaredByNone": "Kein Agent erhält diesen Server, daher startet ihn kein Lauf.",
|
|
618
|
+
"servableHarnesses": "Läuft mit: {harnesses}",
|
|
619
|
+
"servableHarnessesNone": "Keine Agenten-CLI kann diesen Transport bedienen, daher greift dieser Server in keinem Lauf.",
|
|
620
|
+
"allowedTools": "Eingeschränkt auf: {tools}",
|
|
621
|
+
"credentials": "Zugangsdaten: {keys}",
|
|
622
|
+
"test": "Testen",
|
|
623
|
+
"notProbeable": {
|
|
624
|
+
"stdio": "Läuft im Container des Agenten und kann von hier aus nicht getestet werden.",
|
|
625
|
+
"containerLocal": "Lauscht neben dem Agenten in dessen eigenem Container, der von hier aus nicht erreichbar ist.",
|
|
626
|
+
"urlNotAllowed": "Unter dieser Adresse darf ein Werkzeugserver nicht erreicht werden (https oder einfaches http nur auf localhost)."
|
|
627
|
+
},
|
|
628
|
+
"status": {
|
|
629
|
+
"ok": "Hat geantwortet",
|
|
630
|
+
"credentialsMissing": "Keine Zugangsdaten",
|
|
631
|
+
"credentialRefused": "Zugangsdaten abgelehnt",
|
|
632
|
+
"unreachable": "Keine Antwort",
|
|
633
|
+
"httpError": "Anfrage abgewiesen",
|
|
634
|
+
"protocolError": "Kein MCP-Server",
|
|
635
|
+
"notProbeable": "Von hier nicht testbar"
|
|
636
|
+
},
|
|
637
|
+
"okDetail": "{name} {version}, Protokoll {protocol}, {count} Werkzeuge.",
|
|
638
|
+
"toolsIncomplete": "Der Server hat mehr Werkzeuge, als ein Test liest, diese Zahl ist also ein Mindestwert.",
|
|
639
|
+
"unmatchedTools": "Dieser Server bietet kein Werkzeug namens {tools}, dem Agenten wird also ein Werkzeug angekündigt, das er nicht aufrufen kann.",
|
|
640
|
+
"allowedToolsUnchecked": "Die Werkzeugliste war zu lang, um sie vollständig zu lesen, daher konnten die eingeschränkten Namen nicht geprüft werden.",
|
|
641
|
+
"unresolvedCredentials": "Für {keys} wurde nichts aufgelöst. Trage den Wert unten ein oder setze ihn in der Umgebung der Installation.",
|
|
642
|
+
"refusedCredentials": "{keys} benennt eine Variable, die zur Konfiguration der Plattform selbst gehört, und wird daher nie aufgelöst. Ändere die Deklaration im Code der Installation.",
|
|
643
|
+
"httpStatus": "HTTP {status}",
|
|
644
|
+
"showDetails": "Details anzeigen",
|
|
645
|
+
"hideDetails": "Details verbergen",
|
|
646
|
+
"toast": {
|
|
647
|
+
"loadFailed": "Die Werkzeugserver konnten nicht geladen werden",
|
|
648
|
+
"probeFailed": "Der Werkzeugserver konnte nicht getestet werden"
|
|
649
|
+
}
|
|
650
|
+
},
|
|
609
651
|
"capabilityCredentials": {
|
|
610
652
|
"tab": "Zugangsdaten für Fähigkeiten",
|
|
611
653
|
"intro": "Die Secrets, die die Tool-Server und generativen Integrationen dieser Installation namentlich anfordern. Werte gelten nur für dieses Board, werden verschlüsselt gespeichert und direkt an den Prozess des Agenten übergeben: Sie erscheinen weder in einem Prompt noch in einem Log. Werte lassen sich nur schreiben, nie auslesen, ein gespeicherter Wert wird also durch Eingabe eines neuen ersetzt.",
|
|
@@ -2216,6 +2258,7 @@
|
|
|
2216
2258
|
"judge_review": "Als gelesen markieren",
|
|
2217
2259
|
"pr_review_ready": "Als gelesen markieren",
|
|
2218
2260
|
"budget_paused": "Als gelesen markieren",
|
|
2261
|
+
"budget_threshold": "Als gelesen markieren",
|
|
2219
2262
|
"key_drift": "Veraltete Zugangsdaten entfernen",
|
|
2220
2263
|
"merge_tag_request": "Aufwand erfassen"
|
|
2221
2264
|
},
|
|
@@ -3525,6 +3568,8 @@
|
|
|
3525
3568
|
"spend": {
|
|
3526
3569
|
"byModel": "Kosten nach Modell",
|
|
3527
3570
|
"byAgentKind": "Kosten nach Agententyp",
|
|
3571
|
+
"byRepo": "Kosten nach Repository",
|
|
3572
|
+
"byTicket": "Kosten nach Ticket",
|
|
3528
3573
|
"heading": "Kosten",
|
|
3529
3574
|
"empty": "In diesem Zeitraum wurde keine Nutzung erfasst.",
|
|
3530
3575
|
"calls": "{count} Aufruf | {count} Aufrufe",
|
package/i18n/locales/en.json
CHANGED
|
@@ -1834,6 +1834,8 @@
|
|
|
1834
1834
|
"spend": {
|
|
1835
1835
|
"byModel": "Spend by model",
|
|
1836
1836
|
"byAgentKind": "Spend by agent kind",
|
|
1837
|
+
"byRepo": "Spend by repository",
|
|
1838
|
+
"byTicket": "Spend by ticket",
|
|
1837
1839
|
"heading": "Spend",
|
|
1838
1840
|
"empty": "No recorded usage in this window.",
|
|
1839
1841
|
"calls": "{count} call | {count} calls",
|
|
@@ -2137,6 +2139,7 @@
|
|
|
2137
2139
|
"judge_review": "Mark read",
|
|
2138
2140
|
"pr_review_ready": "Mark read",
|
|
2139
2141
|
"budget_paused": "Mark read",
|
|
2142
|
+
"budget_threshold": "Mark read",
|
|
2140
2143
|
"key_drift": "Drop stale credentials",
|
|
2141
2144
|
"merge_tag_request": "Record effort"
|
|
2142
2145
|
},
|
|
@@ -3083,6 +3086,48 @@
|
|
|
3083
3086
|
"removeFailed": "Could not remove the registry entry"
|
|
3084
3087
|
}
|
|
3085
3088
|
},
|
|
3089
|
+
"toolServers": {
|
|
3090
|
+
"heading": "Tool servers (MCP)",
|
|
3091
|
+
"intro": "The MCP servers this deployment registers for its agents. Testing one resolves this board's credentials and speaks the protocol to the server, so the result is what a run would get.",
|
|
3092
|
+
"transport": {
|
|
3093
|
+
"stdio": "In the container",
|
|
3094
|
+
"http": "Remote"
|
|
3095
|
+
},
|
|
3096
|
+
"declaredBy": "Given to: {kinds}",
|
|
3097
|
+
"declaredByNone": "No agent gets this server, so no run will ever start it.",
|
|
3098
|
+
"servableHarnesses": "Works on: {harnesses}",
|
|
3099
|
+
"servableHarnessesNone": "No agent CLI can serve this transport, so this server never applies to any run.",
|
|
3100
|
+
"allowedTools": "Narrowed to: {tools}",
|
|
3101
|
+
"credentials": "Credentials: {keys}",
|
|
3102
|
+
"test": "Test",
|
|
3103
|
+
"notProbeable": {
|
|
3104
|
+
"stdio": "Runs inside the agent's container, so it cannot be tested from here.",
|
|
3105
|
+
"containerLocal": "Listens beside the agent in its own container, which is not reachable from here.",
|
|
3106
|
+
"urlNotAllowed": "The address is not one a tool server may be reached at (https, or plain http on localhost)."
|
|
3107
|
+
},
|
|
3108
|
+
"status": {
|
|
3109
|
+
"ok": "Answered",
|
|
3110
|
+
"credentialsMissing": "No credential",
|
|
3111
|
+
"credentialRefused": "Credential refused",
|
|
3112
|
+
"unreachable": "No answer",
|
|
3113
|
+
"httpError": "Rejected the request",
|
|
3114
|
+
"protocolError": "Not an MCP server",
|
|
3115
|
+
"notProbeable": "Cannot be tested from here"
|
|
3116
|
+
},
|
|
3117
|
+
"okDetail": "{name} {version}, protocol {protocol}, {count} tools.",
|
|
3118
|
+
"toolsIncomplete": "The server has more tools than one test reads, so this count is a minimum.",
|
|
3119
|
+
"unmatchedTools": "This server exposes no tool called {tools}, so the agent is told about a tool it cannot call.",
|
|
3120
|
+
"allowedToolsUnchecked": "The tool list was too long to read in full, so the narrowed names could not be checked.",
|
|
3121
|
+
"unresolvedCredentials": "Nothing resolved for {keys}. Fill it in below, or set it in the deployment's environment.",
|
|
3122
|
+
"refusedCredentials": "{keys} names a variable the platform's own configuration owns, so it is never resolved. Change the declaration in the deployment's code.",
|
|
3123
|
+
"httpStatus": "HTTP {status}",
|
|
3124
|
+
"showDetails": "Show details",
|
|
3125
|
+
"hideDetails": "Hide details",
|
|
3126
|
+
"toast": {
|
|
3127
|
+
"loadFailed": "Could not load the tool servers",
|
|
3128
|
+
"probeFailed": "Could not test the tool server"
|
|
3129
|
+
}
|
|
3130
|
+
},
|
|
3086
3131
|
"capabilityCredentials": {
|
|
3087
3132
|
"tab": "Capability credentials",
|
|
3088
3133
|
"intro": "The secrets this deployment's tool servers and generative integrations ask for by name. Values are stored for this board only, sealed at rest, and handed straight to the agent's process: they never reach a prompt or a log. Values are write-only, so a stored one is replaced by typing a new one and never read back.",
|
package/i18n/locales/es.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "Gasto por modelo",
|
|
1744
1744
|
"byAgentKind": "Gasto por tipo de agente",
|
|
1745
|
+
"byRepo": "Gasto por repositorio",
|
|
1746
|
+
"byTicket": "Gasto por tique",
|
|
1745
1747
|
"heading": "Gasto",
|
|
1746
1748
|
"empty": "No se registró uso en este periodo.",
|
|
1747
1749
|
"calls": "{count} llamada | {count} llamadas",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "Marcar como leído",
|
|
2037
2039
|
"pr_review_ready": "Marcar como leída",
|
|
2038
2040
|
"budget_paused": "Marcar como leída",
|
|
2041
|
+
"budget_threshold": "Marcar como leída",
|
|
2039
2042
|
"key_drift": "Descartar credenciales obsoletas",
|
|
2040
2043
|
"merge_tag_request": "Registrar esfuerzo"
|
|
2041
2044
|
},
|
|
@@ -2835,6 +2838,48 @@
|
|
|
2835
2838
|
"removeFailed": "No se pudo eliminar la entrada del registro"
|
|
2836
2839
|
}
|
|
2837
2840
|
},
|
|
2841
|
+
"toolServers": {
|
|
2842
|
+
"heading": "Servidores de herramientas (MCP)",
|
|
2843
|
+
"intro": "Los servidores MCP que esta instalación registra para sus agentes. Al probar uno se resuelven las credenciales de este tablero y se habla el protocolo con el servidor, así que el resultado es el que obtendría una ejecución.",
|
|
2844
|
+
"transport": {
|
|
2845
|
+
"stdio": "En el contenedor",
|
|
2846
|
+
"http": "Remoto"
|
|
2847
|
+
},
|
|
2848
|
+
"declaredBy": "Asignado a: {kinds}",
|
|
2849
|
+
"declaredByNone": "Ningún agente recibe este servidor, así que ninguna ejecución lo iniciará.",
|
|
2850
|
+
"servableHarnesses": "Funciona con: {harnesses}",
|
|
2851
|
+
"servableHarnessesNone": "Ninguna CLI de agente puede servir este transporte, así que este servidor nunca se aplica a una ejecución.",
|
|
2852
|
+
"allowedTools": "Limitado a: {tools}",
|
|
2853
|
+
"credentials": "Credenciales: {keys}",
|
|
2854
|
+
"test": "Probar",
|
|
2855
|
+
"notProbeable": {
|
|
2856
|
+
"stdio": "Se ejecuta dentro del contenedor del agente, así que no puede probarse desde aquí.",
|
|
2857
|
+
"containerLocal": "Escucha junto al agente en su propio contenedor, que no es accesible desde aquí.",
|
|
2858
|
+
"urlNotAllowed": "Esta dirección no es válida para un servidor de herramientas (https, o http simple solo en localhost)."
|
|
2859
|
+
},
|
|
2860
|
+
"status": {
|
|
2861
|
+
"ok": "Respondió",
|
|
2862
|
+
"credentialsMissing": "Sin credencial",
|
|
2863
|
+
"credentialRefused": "Credencial rechazada",
|
|
2864
|
+
"unreachable": "Sin respuesta",
|
|
2865
|
+
"httpError": "Rechazó la solicitud",
|
|
2866
|
+
"protocolError": "No es un servidor MCP",
|
|
2867
|
+
"notProbeable": "No se puede probar desde aquí"
|
|
2868
|
+
},
|
|
2869
|
+
"okDetail": "{name} {version}, protocolo {protocol}, {count} herramientas.",
|
|
2870
|
+
"toolsIncomplete": "El servidor tiene más herramientas de las que lee una prueba, así que este número es un mínimo.",
|
|
2871
|
+
"unmatchedTools": "Este servidor no expone ninguna herramienta llamada {tools}, así que al agente se le anuncia una herramienta que no puede invocar.",
|
|
2872
|
+
"allowedToolsUnchecked": "La lista de herramientas era demasiado larga para leerla completa, así que no se pudieron comprobar los nombres limitados.",
|
|
2873
|
+
"unresolvedCredentials": "No se resolvió nada para {keys}. Rellénalo abajo o defínelo en el entorno de la instalación.",
|
|
2874
|
+
"refusedCredentials": "{keys} nombra una variable que pertenece a la configuración de la propia plataforma, así que nunca se resuelve. Cambia la declaración en el código de la instalación.",
|
|
2875
|
+
"httpStatus": "HTTP {status}",
|
|
2876
|
+
"showDetails": "Ver detalles",
|
|
2877
|
+
"hideDetails": "Ocultar detalles",
|
|
2878
|
+
"toast": {
|
|
2879
|
+
"loadFailed": "No se pudieron cargar los servidores de herramientas",
|
|
2880
|
+
"probeFailed": "No se pudo probar el servidor de herramientas"
|
|
2881
|
+
}
|
|
2882
|
+
},
|
|
2838
2883
|
"capabilityCredentials": {
|
|
2839
2884
|
"tab": "Credenciales de capacidades",
|
|
2840
2885
|
"intro": "Los secretos que los servidores de herramientas y las integraciones generativas de esta instalación piden por nombre. Los valores se guardan solo para este tablero, cifrados en reposo, y se entregan directamente al proceso del agente: nunca llegan a un prompt ni a un registro. Los valores son de solo escritura, así que uno guardado se sustituye escribiendo otro y nunca se vuelve a leer.",
|
package/i18n/locales/fr.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "Dépense par modèle",
|
|
1744
1744
|
"byAgentKind": "Dépense par type d’agent",
|
|
1745
|
+
"byRepo": "Dépense par dépôt",
|
|
1746
|
+
"byTicket": "Dépense par ticket",
|
|
1745
1747
|
"heading": "Dépense",
|
|
1746
1748
|
"empty": "Aucune utilisation enregistrée sur cette période.",
|
|
1747
1749
|
"calls": "{count} appel | {count} appels",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "Marquer comme lu",
|
|
2037
2039
|
"pr_review_ready": "Marquer comme lu",
|
|
2038
2040
|
"budget_paused": "Marquer comme lu",
|
|
2041
|
+
"budget_threshold": "Marquer comme lu",
|
|
2039
2042
|
"key_drift": "Supprimer les identifiants obsolètes",
|
|
2040
2043
|
"merge_tag_request": "Enregistrer l’effort"
|
|
2041
2044
|
},
|
|
@@ -2835,6 +2838,48 @@
|
|
|
2835
2838
|
"removeFailed": "Impossible de supprimer l'entrée du registre"
|
|
2836
2839
|
}
|
|
2837
2840
|
},
|
|
2841
|
+
"toolServers": {
|
|
2842
|
+
"heading": "Serveurs d’outils (MCP)",
|
|
2843
|
+
"intro": "Les serveurs MCP que ce déploiement enregistre pour ses agents. Tester un serveur résout les identifiants de ce tableau et parle le protocole avec lui : le résultat est donc celui qu’obtiendrait une exécution.",
|
|
2844
|
+
"transport": {
|
|
2845
|
+
"stdio": "Dans le conteneur",
|
|
2846
|
+
"http": "Distant"
|
|
2847
|
+
},
|
|
2848
|
+
"declaredBy": "Attribué à : {kinds}",
|
|
2849
|
+
"declaredByNone": "Aucun agent ne reçoit ce serveur, donc aucune exécution ne le démarrera.",
|
|
2850
|
+
"servableHarnesses": "Fonctionne avec : {harnesses}",
|
|
2851
|
+
"servableHarnessesNone": "Aucune CLI d’agent ne peut servir ce transport, donc ce serveur ne s’applique à aucune exécution.",
|
|
2852
|
+
"allowedTools": "Restreint à : {tools}",
|
|
2853
|
+
"credentials": "Identifiants : {keys}",
|
|
2854
|
+
"test": "Tester",
|
|
2855
|
+
"notProbeable": {
|
|
2856
|
+
"stdio": "Il s’exécute dans le conteneur de l’agent et ne peut donc pas être testé d’ici.",
|
|
2857
|
+
"containerLocal": "Il écoute à côté de l’agent, dans son propre conteneur, qui n’est pas joignable d’ici.",
|
|
2858
|
+
"urlNotAllowed": "Cette adresse n’est pas autorisée pour un serveur d’outils (https, ou http simple sur localhost uniquement)."
|
|
2859
|
+
},
|
|
2860
|
+
"status": {
|
|
2861
|
+
"ok": "A répondu",
|
|
2862
|
+
"credentialsMissing": "Aucun identifiant",
|
|
2863
|
+
"credentialRefused": "Identifiant refusé",
|
|
2864
|
+
"unreachable": "Aucune réponse",
|
|
2865
|
+
"httpError": "Requête rejetée",
|
|
2866
|
+
"protocolError": "Pas un serveur MCP",
|
|
2867
|
+
"notProbeable": "Non testable d’ici"
|
|
2868
|
+
},
|
|
2869
|
+
"okDetail": "{name} {version}, protocole {protocol}, {count} outils.",
|
|
2870
|
+
"toolsIncomplete": "Le serveur expose plus d’outils qu’un test n’en lit : ce nombre est donc un minimum.",
|
|
2871
|
+
"unmatchedTools": "Ce serveur n’expose aucun outil nommé {tools} : l’agent se voit donc annoncer un outil qu’il ne peut pas appeler.",
|
|
2872
|
+
"allowedToolsUnchecked": "La liste d’outils était trop longue pour être lue en entier, les noms restreints n’ont donc pas pu être vérifiés.",
|
|
2873
|
+
"unresolvedCredentials": "Rien n’a été résolu pour {keys}. Renseignez la valeur ci-dessous, ou définissez-la dans l’environnement du déploiement.",
|
|
2874
|
+
"refusedCredentials": "{keys} désigne une variable qui appartient à la configuration de la plateforme elle-même : elle n’est jamais résolue. Modifiez la déclaration dans le code du déploiement.",
|
|
2875
|
+
"httpStatus": "HTTP {status}",
|
|
2876
|
+
"showDetails": "Afficher les détails",
|
|
2877
|
+
"hideDetails": "Masquer les détails",
|
|
2878
|
+
"toast": {
|
|
2879
|
+
"loadFailed": "Impossible de charger les serveurs d’outils",
|
|
2880
|
+
"probeFailed": "Impossible de tester le serveur d’outils"
|
|
2881
|
+
}
|
|
2882
|
+
},
|
|
2838
2883
|
"capabilityCredentials": {
|
|
2839
2884
|
"tab": "Identifiants des capacités",
|
|
2840
2885
|
"intro": "Les secrets que les serveurs d'outils et les intégrations génératives de ce déploiement réclament par leur nom. Les valeurs ne sont enregistrées que pour ce tableau, chiffrées au repos, et remises directement au processus de l'agent : elles n'apparaissent ni dans un prompt ni dans un journal. Les valeurs sont en écriture seule, une valeur enregistrée se remplace donc en en saisissant une nouvelle et n'est jamais relue.",
|
package/i18n/locales/he.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "עלות לפי מודל",
|
|
1744
1744
|
"byAgentKind": "עלות לפי סוג סוכן",
|
|
1745
|
+
"byRepo": "עלות לפי מאגר",
|
|
1746
|
+
"byTicket": "עלות לפי כרטיס",
|
|
1745
1747
|
"heading": "עלות",
|
|
1746
1748
|
"empty": "לא נרשם שימוש בטווח הזה.",
|
|
1747
1749
|
"calls": "קריאה אחת | שתי קריאות | {count} קריאות",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "סמן כנקרא",
|
|
2037
2039
|
"pr_review_ready": "סמן כנקרא",
|
|
2038
2040
|
"budget_paused": "סמן כנקרא",
|
|
2041
|
+
"budget_threshold": "סמן כנקרא",
|
|
2039
2042
|
"key_drift": "מחק אישורים מיושנים",
|
|
2040
2043
|
"merge_tag_request": "לתעד את המאמץ"
|
|
2041
2044
|
},
|
|
@@ -2976,6 +2979,48 @@
|
|
|
2976
2979
|
"removeFailed": "הסרת רשומת המאגר נכשלה"
|
|
2977
2980
|
}
|
|
2978
2981
|
},
|
|
2982
|
+
"toolServers": {
|
|
2983
|
+
"heading": "שרתי כלים (MCP)",
|
|
2984
|
+
"intro": "שרתי ה-MCP שהתקנה זו רושמת עבור הסוכנים שלה. בדיקה מאתרת את פרטי ההזדהות של לוח זה ומדברת עם השרת בפרוטוקול, כך שהתוצאה היא מה שהרצה תקבל.",
|
|
2985
|
+
"transport": {
|
|
2986
|
+
"stdio": "בתוך המכולה",
|
|
2987
|
+
"http": "מרוחק"
|
|
2988
|
+
},
|
|
2989
|
+
"declaredBy": "משויך אל: {kinds}",
|
|
2990
|
+
"declaredByNone": "אף סוכן אינו מקבל שרת זה, ולכן אף הרצה לא תפעיל אותו.",
|
|
2991
|
+
"servableHarnesses": "עובד עם: {harnesses}",
|
|
2992
|
+
"servableHarnessesNone": "אף CLI של סוכן אינו יכול לשרת תעבורה זו, ולכן שרת זה לא חל על שום הרצה.",
|
|
2993
|
+
"allowedTools": "מוגבל אל: {tools}",
|
|
2994
|
+
"credentials": "פרטי הזדהות: {keys}",
|
|
2995
|
+
"test": "בדיקה",
|
|
2996
|
+
"notProbeable": {
|
|
2997
|
+
"stdio": "רץ בתוך המכולה של הסוכן, ולכן לא ניתן לבדוק אותו מכאן.",
|
|
2998
|
+
"containerLocal": "מאזין לצד הסוכן במכולה שלו, שאינה נגישה מכאן.",
|
|
2999
|
+
"urlNotAllowed": "אין זו כתובת שבה מותר להגיע לשרת כלים (https, או http פשוט רק ב-localhost)."
|
|
3000
|
+
},
|
|
3001
|
+
"status": {
|
|
3002
|
+
"ok": "השיב",
|
|
3003
|
+
"credentialsMissing": "אין פרטי הזדהות",
|
|
3004
|
+
"credentialRefused": "פרטי ההזדהות נדחו",
|
|
3005
|
+
"unreachable": "אין תשובה",
|
|
3006
|
+
"httpError": "דחה את הבקשה",
|
|
3007
|
+
"protocolError": "אינו שרת MCP",
|
|
3008
|
+
"notProbeable": "לא ניתן לבדוק מכאן"
|
|
3009
|
+
},
|
|
3010
|
+
"okDetail": "{name} {version}, פרוטוקול {protocol}, {count} כלים.",
|
|
3011
|
+
"toolsIncomplete": "לשרת יש יותר כלים ממה שבדיקה אחת קוראת, ולכן מספר זה הוא מינימום.",
|
|
3012
|
+
"unmatchedTools": "שרת זה אינו חושף כלי בשם {tools}, ולכן מסופר לסוכן על כלי שאינו יכול לקרוא לו.",
|
|
3013
|
+
"allowedToolsUnchecked": "רשימת הכלים הייתה ארוכה מכדי לקרוא אותה במלואה, ולכן לא ניתן היה לבדוק את השמות המוגבלים.",
|
|
3014
|
+
"unresolvedCredentials": "לא אותר דבר עבור {keys}. מלאו את הערך למטה, או הגדירו אותו בסביבת ההתקנה.",
|
|
3015
|
+
"refusedCredentials": "{keys} מציין משתנה שהוא חלק מהתצורה של הפלטפורמה עצמה, ולכן הוא לעולם אינו מאותר. שנו את ההצהרה בקוד ההתקנה.",
|
|
3016
|
+
"httpStatus": "HTTP {status}",
|
|
3017
|
+
"showDetails": "הצגת פרטים",
|
|
3018
|
+
"hideDetails": "הסתרת פרטים",
|
|
3019
|
+
"toast": {
|
|
3020
|
+
"loadFailed": "לא ניתן לטעון את שרתי הכלים",
|
|
3021
|
+
"probeFailed": "לא ניתן לבדוק את שרת הכלים"
|
|
3022
|
+
}
|
|
3023
|
+
},
|
|
2979
3024
|
"capabilityCredentials": {
|
|
2980
3025
|
"tab": "אישורי גישה ליכולות",
|
|
2981
3026
|
"intro": "הסודות ששרתי הכלים והאינטגרציות הגנרטיביות של הפריסה הזו מבקשים לפי שם. הערכים נשמרים ללוח הזה בלבד, מוצפנים במנוחה ומועברים ישירות לתהליך של הסוכן: הם לעולם לא מגיעים להנחיה או ליומן. הערכים ניתנים לכתיבה בלבד, ולכן ערך שמור מוחלף בהקלדת ערך חדש ולעולם אינו נקרא בחזרה.",
|
package/i18n/locales/it.json
CHANGED
|
@@ -606,6 +606,48 @@
|
|
|
606
606
|
"removeFailed": "Impossibile rimuovere la voce del registry"
|
|
607
607
|
}
|
|
608
608
|
},
|
|
609
|
+
"toolServers": {
|
|
610
|
+
"heading": "Server di strumenti (MCP)",
|
|
611
|
+
"intro": "I server MCP che questa installazione registra per i suoi agenti. Provarne uno risolve le credenziali di questa bacheca e parla il protocollo con il server, quindi il risultato è quello che otterrebbe un’esecuzione.",
|
|
612
|
+
"transport": {
|
|
613
|
+
"stdio": "Nel container",
|
|
614
|
+
"http": "Remoto"
|
|
615
|
+
},
|
|
616
|
+
"declaredBy": "Assegnato a: {kinds}",
|
|
617
|
+
"declaredByNone": "Nessun agente riceve questo server, quindi nessuna esecuzione lo avvierà.",
|
|
618
|
+
"servableHarnesses": "Funziona con: {harnesses}",
|
|
619
|
+
"servableHarnessesNone": "Nessuna CLI di agente può servire questo trasporto, quindi questo server non si applica a nessuna esecuzione.",
|
|
620
|
+
"allowedTools": "Limitato a: {tools}",
|
|
621
|
+
"credentials": "Credenziali: {keys}",
|
|
622
|
+
"test": "Prova",
|
|
623
|
+
"notProbeable": {
|
|
624
|
+
"stdio": "Gira dentro il container dell’agente, quindi non può essere provato da qui.",
|
|
625
|
+
"containerLocal": "Ascolta accanto all’agente nel suo container, che non è raggiungibile da qui.",
|
|
626
|
+
"urlNotAllowed": "Questo indirizzo non è consentito per un server di strumenti (https, oppure http semplice solo su localhost)."
|
|
627
|
+
},
|
|
628
|
+
"status": {
|
|
629
|
+
"ok": "Ha risposto",
|
|
630
|
+
"credentialsMissing": "Nessuna credenziale",
|
|
631
|
+
"credentialRefused": "Credenziale rifiutata",
|
|
632
|
+
"unreachable": "Nessuna risposta",
|
|
633
|
+
"httpError": "Richiesta respinta",
|
|
634
|
+
"protocolError": "Non è un server MCP",
|
|
635
|
+
"notProbeable": "Non provabile da qui"
|
|
636
|
+
},
|
|
637
|
+
"okDetail": "{name} {version}, protocollo {protocol}, {count} strumenti.",
|
|
638
|
+
"toolsIncomplete": "Il server ha più strumenti di quanti una prova ne legga, quindi questo numero è un minimo.",
|
|
639
|
+
"unmatchedTools": "Questo server non espone alcuno strumento chiamato {tools}, quindi all’agente viene annunciato uno strumento che non può invocare.",
|
|
640
|
+
"allowedToolsUnchecked": "L’elenco degli strumenti era troppo lungo per leggerlo tutto, quindi i nomi limitati non hanno potuto essere verificati.",
|
|
641
|
+
"unresolvedCredentials": "Nulla è stato risolto per {keys}. Inseriscilo qui sotto, oppure impostalo nell’ambiente dell’installazione.",
|
|
642
|
+
"refusedCredentials": "{keys} nomina una variabile che appartiene alla configurazione della piattaforma stessa, quindi non viene mai risolta. Modifica la dichiarazione nel codice dell’installazione.",
|
|
643
|
+
"httpStatus": "HTTP {status}",
|
|
644
|
+
"showDetails": "Mostra dettagli",
|
|
645
|
+
"hideDetails": "Nascondi dettagli",
|
|
646
|
+
"toast": {
|
|
647
|
+
"loadFailed": "Impossibile caricare i server di strumenti",
|
|
648
|
+
"probeFailed": "Impossibile provare il server di strumenti"
|
|
649
|
+
}
|
|
650
|
+
},
|
|
609
651
|
"capabilityCredentials": {
|
|
610
652
|
"tab": "Credenziali delle capacità",
|
|
611
653
|
"intro": "I segreti che i server di strumenti e le integrazioni generative di questo deployment richiedono per nome. I valori vengono salvati solo per questa board, cifrati a riposo, e consegnati direttamente al processo dell'agente: non finiscono mai in un prompt né in un log. I valori sono di sola scrittura, quindi uno salvato si sostituisce digitandone uno nuovo e non viene mai riletto.",
|
|
@@ -2216,6 +2258,7 @@
|
|
|
2216
2258
|
"judge_review": "Segna come letto",
|
|
2217
2259
|
"pr_review_ready": "Segna come letto",
|
|
2218
2260
|
"budget_paused": "Segna come letto",
|
|
2261
|
+
"budget_threshold": "Segna come letto",
|
|
2219
2262
|
"key_drift": "Elimina credenziali obsolete",
|
|
2220
2263
|
"merge_tag_request": "Registra l’impegno"
|
|
2221
2264
|
},
|
|
@@ -3525,6 +3568,8 @@
|
|
|
3525
3568
|
"spend": {
|
|
3526
3569
|
"byModel": "Spesa per modello",
|
|
3527
3570
|
"byAgentKind": "Spesa per tipo di agente",
|
|
3571
|
+
"byRepo": "Spesa per repository",
|
|
3572
|
+
"byTicket": "Spesa per ticket",
|
|
3528
3573
|
"heading": "Spesa",
|
|
3529
3574
|
"empty": "Nessun utilizzo registrato in questo periodo.",
|
|
3530
3575
|
"calls": "{count} chiamata | {count} chiamate",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "モデル別の費用",
|
|
1744
1744
|
"byAgentKind": "エージェント種別の費用",
|
|
1745
|
+
"byRepo": "リポジトリ別の費用",
|
|
1746
|
+
"byTicket": "チケット別の費用",
|
|
1745
1747
|
"heading": "費用",
|
|
1746
1748
|
"empty": "この期間に記録された利用はありません。",
|
|
1747
1749
|
"calls": "{count} 件の呼び出し | {count} 件の呼び出し",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "既読にする",
|
|
2037
2039
|
"pr_review_ready": "既読にする",
|
|
2038
2040
|
"budget_paused": "既読にする",
|
|
2041
|
+
"budget_threshold": "既読にする",
|
|
2039
2042
|
"key_drift": "古い認証情報を削除",
|
|
2040
2043
|
"merge_tag_request": "工数を記録"
|
|
2041
2044
|
},
|
|
@@ -2976,6 +2979,48 @@
|
|
|
2976
2979
|
"removeFailed": "レジストリエントリを削除できませんでした"
|
|
2977
2980
|
}
|
|
2978
2981
|
},
|
|
2982
|
+
"toolServers": {
|
|
2983
|
+
"heading": "ツールサーバー (MCP)",
|
|
2984
|
+
"intro": "このデプロイがエージェント向けに登録している MCP サーバーです。テストするとこのボードの認証情報を解決してサーバーとプロトコルで通信するため、結果は実行時に得られるものと同じです。",
|
|
2985
|
+
"transport": {
|
|
2986
|
+
"stdio": "コンテナ内",
|
|
2987
|
+
"http": "リモート"
|
|
2988
|
+
},
|
|
2989
|
+
"declaredBy": "割り当て先: {kinds}",
|
|
2990
|
+
"declaredByNone": "どのエージェントにも渡されていないため、どの実行でも起動されません。",
|
|
2991
|
+
"servableHarnesses": "対応 CLI: {harnesses}",
|
|
2992
|
+
"servableHarnessesNone": "このトランスポートを扱えるエージェント CLI がないため、このサーバーはどの実行にも適用されません。",
|
|
2993
|
+
"allowedTools": "許可されたツール: {tools}",
|
|
2994
|
+
"credentials": "認証情報: {keys}",
|
|
2995
|
+
"test": "テスト",
|
|
2996
|
+
"notProbeable": {
|
|
2997
|
+
"stdio": "エージェントのコンテナ内で動作するため、ここからはテストできません。",
|
|
2998
|
+
"containerLocal": "エージェントと同じコンテナ内で待ち受けているため、ここからは到達できません。",
|
|
2999
|
+
"urlNotAllowed": "ツールサーバーの接続先として許可されていないアドレスです (https、または localhost の平文 http のみ)。"
|
|
3000
|
+
},
|
|
3001
|
+
"status": {
|
|
3002
|
+
"ok": "応答あり",
|
|
3003
|
+
"credentialsMissing": "認証情報なし",
|
|
3004
|
+
"credentialRefused": "認証情報を拒否",
|
|
3005
|
+
"unreachable": "応答なし",
|
|
3006
|
+
"httpError": "リクエストを拒否",
|
|
3007
|
+
"protocolError": "MCP サーバーではない",
|
|
3008
|
+
"notProbeable": "ここからテストできない"
|
|
3009
|
+
},
|
|
3010
|
+
"okDetail": "{name} {version}、プロトコル {protocol}、ツール {count} 個。",
|
|
3011
|
+
"toolsIncomplete": "サーバーは 1 回のテストで読み取れる数を超えるツールを持つため、この数は最小値です。",
|
|
3012
|
+
"unmatchedTools": "このサーバーに {tools} というツールは存在しないため、エージェントは呼び出せないツールを知らされています。",
|
|
3013
|
+
"allowedToolsUnchecked": "ツール一覧が長すぎて全部を読み取れなかったため、絞り込んだ名前は確認できませんでした。",
|
|
3014
|
+
"unresolvedCredentials": "{keys} の値が解決できませんでした。下で入力するか、デプロイの環境変数に設定してください。",
|
|
3015
|
+
"refusedCredentials": "{keys} はプラットフォーム自身の設定に属する変数名なので、決して解決されません。デプロイのコード側の宣言を変更してください。",
|
|
3016
|
+
"httpStatus": "HTTP {status}",
|
|
3017
|
+
"showDetails": "詳細を表示",
|
|
3018
|
+
"hideDetails": "詳細を隠す",
|
|
3019
|
+
"toast": {
|
|
3020
|
+
"loadFailed": "ツールサーバーを読み込めませんでした",
|
|
3021
|
+
"probeFailed": "ツールサーバーをテストできませんでした"
|
|
3022
|
+
}
|
|
3023
|
+
},
|
|
2979
3024
|
"capabilityCredentials": {
|
|
2980
3025
|
"tab": "機能の認証情報",
|
|
2981
3026
|
"intro": "このデプロイのツールサーバーと生成系インテグレーションが名前で要求するシークレットです。値はこのボードにのみ保存され、保管時は暗号化され、エージェントのプロセスへ直接渡されます。プロンプトにもログにも現れません。値は書き込み専用なので、保存済みの値は新しい値を入力して置き換えるだけで、読み出すことはできません。",
|