@cat-factory/app 0.237.1 → 0.238.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/panels/AgentStepDetail.vue +11 -0
- package/app/components/panels/StepToolServers.logic.spec.ts +60 -0
- package/app/components/panels/StepToolServers.logic.ts +58 -0
- package/app/components/panels/StepToolServers.vue +105 -0
- package/app/types/toolServers.ts +2 -0
- package/i18n/locales/de.json +16 -0
- package/i18n/locales/en.json +16 -0
- package/i18n/locales/es.json +16 -0
- package/i18n/locales/fr.json +16 -0
- package/i18n/locales/he.json +16 -0
- package/i18n/locales/it.json +16 -0
- package/i18n/locales/ja.json +16 -0
- package/i18n/locales/pl.json +16 -0
- package/i18n/locales/tr.json +16 -0
- package/i18n/locales/uk.json +16 -0
- package/package.json +2 -2
|
@@ -7,6 +7,7 @@ import StepRestartControl from '~/components/panels/StepRestartControl.vue'
|
|
|
7
7
|
import StepMetadataCard from '~/components/panels/StepMetadataCard.vue'
|
|
8
8
|
import StepTestReport from '~/components/panels/StepTestReport.vue'
|
|
9
9
|
import StepEffortReport from '~/components/panels/StepEffortReport.vue'
|
|
10
|
+
import StepToolServers from '~/components/panels/StepToolServers.vue'
|
|
10
11
|
import StepReproductionReport from '~/components/panels/StepReproductionReport.vue'
|
|
11
12
|
import StepFragmentAdherence from '~/components/panels/StepFragmentAdherence.vue'
|
|
12
13
|
import BinaryOutputReport from '~/components/binaryOutput/BinaryOutputReport.vue'
|
|
@@ -613,6 +614,16 @@ async function copyOutput() {
|
|
|
613
614
|
effectiveness, key obstacles). Only when the agent reported one. -->
|
|
614
615
|
<StepEffortReport v-if="step.effortReport" :report="step.effortReport" />
|
|
615
616
|
|
|
617
|
+
<!-- the tool servers (MCP) this dispatch wired, and the ones it dropped with the
|
|
618
|
+
reason. Only on a container step, and self-hiding when the record holds
|
|
619
|
+
nothing: a recorded pair of empty lists is a kind that declared none, which is
|
|
620
|
+
every step on a deployment that registers no tool servers at all. -->
|
|
621
|
+
<StepToolServers
|
|
622
|
+
v-if="step.toolServers"
|
|
623
|
+
:tool-servers="step.toolServers"
|
|
624
|
+
:step-agent-kind="step.agentKind"
|
|
625
|
+
/>
|
|
626
|
+
|
|
616
627
|
<!-- the bugfix REPRODUCTION PROOF: the declared reproducing check run against the
|
|
617
628
|
pre-fix tree and the final one, with both captured outputs, or the agent's
|
|
618
629
|
structural declaration that the bug cannot be reproduced. This panel is the
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { KNOWN_REASONS, REASON_KEY, reasonText } from './StepToolServers.logic'
|
|
3
|
+
import type { ToolServerUnavailableReason } from '~/types/toolServers'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A dropped tool server is the whole point of this surface: until it existed, a run that quietly
|
|
7
|
+
* went without its issue tracker was stated only in the agent's own prompt and one backend warn
|
|
8
|
+
* line. These pin the two ways that could regress: a reason with no copy, and a reason this build
|
|
9
|
+
* does not know rendering as nothing at all.
|
|
10
|
+
*/
|
|
11
|
+
describe('tool-server unavailability reasons', () => {
|
|
12
|
+
it('gives every reason in the wire vocabulary its own copy', () => {
|
|
13
|
+
// Derived from the schema the backend decides against, not from a list retyped here: a member
|
|
14
|
+
// added on the backend then fails THIS assertion instead of shipping as a blank chip.
|
|
15
|
+
expect(Object.keys(REASON_KEY).sort()).toEqual([...KNOWN_REASONS].sort())
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('never points two reasons at one line', () => {
|
|
19
|
+
// Each member names a different fix (a variable to set, a declaration to change, a person to
|
|
20
|
+
// press Connect), so two sharing copy would send an operator to the wrong place.
|
|
21
|
+
const keys = Object.values(REASON_KEY)
|
|
22
|
+
expect(new Set(keys).size).toBe(keys.length)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('renders a retired reason as unknown, naming the raw code', () => {
|
|
26
|
+
// The vocabulary is persisted on a run, so a step recorded under a member since retired reads
|
|
27
|
+
// back with that member. Dropping it would report a withheld tool as one never declared.
|
|
28
|
+
expect(render('legacy_reason')).toEqual([
|
|
29
|
+
{
|
|
30
|
+
key: 'panels.stepDetail.toolServers.reason.unknown',
|
|
31
|
+
params: { reason: 'legacy_reason' },
|
|
32
|
+
},
|
|
33
|
+
])
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('takes the same path for a reason that names an Object.prototype member', () => {
|
|
37
|
+
// The mapping is an ordinary object literal, so `REASON_KEY['constructor']` reads back a
|
|
38
|
+
// truthy inherited function. A truthiness check on the lookup would hand THAT to `t` as a
|
|
39
|
+
// translation key, taking the retired-member path away from the one input shape most likely
|
|
40
|
+
// to reach it from a hand-edited or corrupted row.
|
|
41
|
+
for (const inherited of ['constructor', 'toString', 'hasOwnProperty', '__proto__']) {
|
|
42
|
+
expect(render(inherited)).toEqual([
|
|
43
|
+
{
|
|
44
|
+
key: 'panels.stepDetail.toolServers.reason.unknown',
|
|
45
|
+
params: { reason: inherited },
|
|
46
|
+
},
|
|
47
|
+
])
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
/** Every `t` call `reasonText` made, so the assertion is about the key it CHOSE, not the copy. */
|
|
53
|
+
function render(reason: string): { key: string; params?: Record<string, unknown> }[] {
|
|
54
|
+
const seen: { key: string; params?: Record<string, unknown> }[] = []
|
|
55
|
+
reasonText(reason as ToolServerUnavailableReason, (key, params) => {
|
|
56
|
+
seen.push({ key, ...(params ? { params } : {}) })
|
|
57
|
+
return key
|
|
58
|
+
})
|
|
59
|
+
return seen
|
|
60
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { toolServerUnavailableReasonSchema } from '@cat-factory/contracts'
|
|
2
|
+
import type { ToolServerUnavailableReason } from '~/types/toolServers'
|
|
3
|
+
|
|
4
|
+
// The step surface's tool-server (MCP) reason mapping. Kept out of the SFC on the same seam as
|
|
5
|
+
// `StepTestReport.logic.ts`, so the vocabulary rule can be asserted without mounting a component.
|
|
6
|
+
//
|
|
7
|
+
// The rule: a dropped tool server is reported with the reason it was dropped for, and a reason
|
|
8
|
+
// this build does not recognise is rendered as unknown rather than dropped or folded onto a
|
|
9
|
+
// neighbour. The vocabulary is CLOSED and PERSISTED on a run, so a step recorded before a member
|
|
10
|
+
// was retired still carries that member, and a chip that silently vanished would report a
|
|
11
|
+
// withheld capability as one that was never declared, which is the confusion this surface exists
|
|
12
|
+
// to end.
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The i18n key per reason. An exhaustive `Record` rather than a lookup with a default, so a member
|
|
16
|
+
* added to the wire vocabulary fails to compile here instead of rendering as a blank chip.
|
|
17
|
+
*/
|
|
18
|
+
export const REASON_KEY: Record<ToolServerUnavailableReason, string> = {
|
|
19
|
+
harness_unsupported: 'panels.stepDetail.toolServers.reason.harnessUnsupported',
|
|
20
|
+
transport_unsupported: 'panels.stepDetail.toolServers.reason.transportUnsupported',
|
|
21
|
+
missing_secret: 'panels.stepDetail.toolServers.reason.missingSecret',
|
|
22
|
+
reserved_secret: 'panels.stepDetail.toolServers.reason.reservedSecret',
|
|
23
|
+
oauth_not_connected: 'panels.stepDetail.toolServers.reason.oauthNotConnected',
|
|
24
|
+
oauth_token_failed: 'panels.stepDetail.toolServers.reason.oauthTokenFailed',
|
|
25
|
+
over_budget: 'panels.stepDetail.toolServers.reason.overBudget',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** The reason vocabulary as the SCHEMA states it: what a parity assertion grades {@link REASON_KEY} against. */
|
|
29
|
+
export const KNOWN_REASONS = toolServerUnavailableReasonSchema.options
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Whether a persisted reason is a member THIS build knows, derived from the picklist's own options
|
|
33
|
+
* rather than from a list retyped here.
|
|
34
|
+
*
|
|
35
|
+
* A predicate rather than a truthiness check on the lookup, because `REASON_KEY` is an ordinary
|
|
36
|
+
* object literal: a persisted value that happens to name an inherited `Object.prototype` member
|
|
37
|
+
* (`constructor`, `toString`) reads back as a truthy non-key and would be handed to `t` as though
|
|
38
|
+
* it were a translation key, taking the retired-member path away from exactly the case it exists
|
|
39
|
+
* for. Narrowing at the boundary keeps the exhaustive `Record` compile-time guard intact.
|
|
40
|
+
*/
|
|
41
|
+
export function isKnownReason(reason: string): reason is ToolServerUnavailableReason {
|
|
42
|
+
return (KNOWN_REASONS as readonly string[]).includes(reason)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Render one reason, falling back to the retired-member line that names the raw code.
|
|
47
|
+
*
|
|
48
|
+
* `t` is passed in rather than composed here so this stays a pure function: the component owns the
|
|
49
|
+
* i18n instance, and the fallback branch is the one worth testing without one.
|
|
50
|
+
*/
|
|
51
|
+
export function reasonText(
|
|
52
|
+
reason: ToolServerUnavailableReason,
|
|
53
|
+
t: (key: string, params?: Record<string, unknown>) => string,
|
|
54
|
+
): string {
|
|
55
|
+
return isKnownReason(reason)
|
|
56
|
+
? t(REASON_KEY[reason])
|
|
57
|
+
: t('panels.stepDetail.toolServers.reason.unknown', { reason })
|
|
58
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// The tool servers (MCP) one dispatch gave its agent, and the ones it declared and dropped.
|
|
3
|
+
// Recorded on the step at dispatch (`step.toolServers`).
|
|
4
|
+
//
|
|
5
|
+
// The unavailable half is the reason this exists. A dropped server was, until now, stated in the
|
|
6
|
+
// agent's own prompt and in one backend warn line, and nowhere a person looks: a run that quietly
|
|
7
|
+
// went without its issue tracker read as a run whose agent simply did not use it. So an
|
|
8
|
+
// unavailable server is a chip of its own with its own translated reason, never a shorter list of
|
|
9
|
+
// the wired ones: "absent" and "zero" must not render the same.
|
|
10
|
+
//
|
|
11
|
+
// SELF-HIDING when the record holds nothing, like the sibling panels around it. The record is
|
|
12
|
+
// written on EVERY container dispatch, so both lists empty is the state of every step on every
|
|
13
|
+
// deployment that registers no tool servers at all — the overwhelming default. That state is a
|
|
14
|
+
// fact about the DECLARATION rather than about this run (the dispatched kind declares none), and
|
|
15
|
+
// the Infrastructure window is where declarations are read; rendering it here would put an empty
|
|
16
|
+
// section on every step of every run to say nothing happened. The distinction absent-vs-empty is
|
|
17
|
+
// still carried on the wire and answered by the debug API, which is where a reader asking it looks.
|
|
18
|
+
import type { StepToolServers, ToolServerUnavailableReason } from '~/types/toolServers'
|
|
19
|
+
import { reasonText } from '~/components/panels/StepToolServers.logic'
|
|
20
|
+
import { agentKindMeta } from '~/utils/catalog'
|
|
21
|
+
|
|
22
|
+
const props = defineProps<{
|
|
23
|
+
toolServers: StepToolServers
|
|
24
|
+
/**
|
|
25
|
+
* The kind the STEP is named for. The record carries the kind that was DISPATCHED, and the two
|
|
26
|
+
* differ whenever a helper ran on this step (a gate escalating to `ci-fixer`, the tester handing
|
|
27
|
+
* off to `fixer`, a fork's second phase). Each of those resolves its own kind's declarations and
|
|
28
|
+
* overwrites the record, so the surface names whose capabilities these are instead of letting
|
|
29
|
+
* them read as the step's.
|
|
30
|
+
*/
|
|
31
|
+
stepAgentKind: string
|
|
32
|
+
}>()
|
|
33
|
+
|
|
34
|
+
const { t } = useI18n()
|
|
35
|
+
|
|
36
|
+
const hasAny = computed(
|
|
37
|
+
() => props.toolServers.wired.length > 0 || props.toolServers.unavailable.length > 0,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
/** Set only when a helper re-dispatch owns this record, so the ordinary case renders no extra line. */
|
|
41
|
+
const dispatchedAs = computed(() =>
|
|
42
|
+
props.toolServers.agentKind && props.toolServers.agentKind !== props.stepAgentKind
|
|
43
|
+
? agentKindMeta(props.toolServers.agentKind).label
|
|
44
|
+
: null,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
/** Bind this component's i18n instance onto the pure mapping (see `StepToolServers.logic.ts`). */
|
|
48
|
+
const describeReason = (reason: ToolServerUnavailableReason) =>
|
|
49
|
+
reasonText(reason, (key, params) => t(key, params ?? {}))
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<template>
|
|
53
|
+
<section
|
|
54
|
+
v-if="hasAny"
|
|
55
|
+
data-testid="step-tool-servers"
|
|
56
|
+
class="scroll-mt-4 rounded-xl border border-slate-800 bg-slate-900/50 p-4"
|
|
57
|
+
>
|
|
58
|
+
<div
|
|
59
|
+
class="mb-2 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-400"
|
|
60
|
+
>
|
|
61
|
+
<UIcon name="i-lucide-plug" class="h-3.5 w-3.5" />
|
|
62
|
+
<span>{{ t('panels.stepDetail.toolServers.heading') }}</span>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<p
|
|
66
|
+
v-if="dispatchedAs"
|
|
67
|
+
data-testid="step-tool-servers-dispatched-as"
|
|
68
|
+
class="mb-2 text-[12px] text-slate-400"
|
|
69
|
+
>
|
|
70
|
+
{{ t('panels.stepDetail.toolServers.dispatchedAs', { agent: dispatchedAs }) }}
|
|
71
|
+
</p>
|
|
72
|
+
|
|
73
|
+
<ul v-if="toolServers.wired.length" class="flex flex-wrap gap-1.5">
|
|
74
|
+
<li
|
|
75
|
+
v-for="server in toolServers.wired"
|
|
76
|
+
:key="server.id"
|
|
77
|
+
data-testid="step-tool-server-wired"
|
|
78
|
+
class="inline-flex items-center gap-1.5 rounded-full border border-emerald-500/30 bg-emerald-500/10 px-2 py-0.5 text-[12px] text-emerald-200"
|
|
79
|
+
:title="
|
|
80
|
+
server.tools?.length
|
|
81
|
+
? t('panels.stepDetail.toolServers.narrowed', { tools: server.tools.join(', ') })
|
|
82
|
+
: t('panels.stepDetail.toolServers.allTools')
|
|
83
|
+
"
|
|
84
|
+
>
|
|
85
|
+
<UIcon name="i-lucide-check" class="h-3.5 w-3.5" />
|
|
86
|
+
<span>{{ server.label || server.id }}</span>
|
|
87
|
+
</li>
|
|
88
|
+
</ul>
|
|
89
|
+
|
|
90
|
+
<ul v-if="toolServers.unavailable.length" class="mt-2 space-y-1">
|
|
91
|
+
<li
|
|
92
|
+
v-for="server in toolServers.unavailable"
|
|
93
|
+
:key="server.id"
|
|
94
|
+
data-testid="step-tool-server-unavailable"
|
|
95
|
+
class="flex items-start gap-1.5 text-[12px] text-slate-300"
|
|
96
|
+
>
|
|
97
|
+
<UIcon name="i-lucide-plug-zap" class="mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-400/80" />
|
|
98
|
+
<span>
|
|
99
|
+
<span class="font-medium text-slate-200">{{ server.label || server.id }}</span>
|
|
100
|
+
<span class="text-slate-400"> {{ describeReason(server.reason) }}</span>
|
|
101
|
+
</span>
|
|
102
|
+
</li>
|
|
103
|
+
</ul>
|
|
104
|
+
</section>
|
|
105
|
+
</template>
|
package/app/types/toolServers.ts
CHANGED
package/i18n/locales/de.json
CHANGED
|
@@ -1983,6 +1983,22 @@
|
|
|
1983
1983
|
"reduced": "Was die Effektivität verringert hat",
|
|
1984
1984
|
"obstacles": "Wichtigste Hindernisse"
|
|
1985
1985
|
},
|
|
1986
|
+
"toolServers": {
|
|
1987
|
+
"heading": "Tool-Server (MCP)",
|
|
1988
|
+
"dispatchedAs": "Ermittelt für den Agenten {agent}, den dieser Schritt gestartet hat.",
|
|
1989
|
+
"allTools": "Alle Tools, die dieser Server bereitstellt.",
|
|
1990
|
+
"narrowed": "Eingeschränkt auf: {tools}",
|
|
1991
|
+
"reason": {
|
|
1992
|
+
"harnessUnsupported": "war nicht verfügbar: die Agenten-CLI dieses Schritts hat keinen MCP-Client.",
|
|
1993
|
+
"transportUnsupported": "war nicht verfügbar: die Agenten-CLI dieses Schritts erreicht Server dieser Art nicht.",
|
|
1994
|
+
"missingSecret": "war nicht verfügbar: eine benötigte Zugangsinformation ist für dieses Board nicht hinterlegt.",
|
|
1995
|
+
"reservedSecret": "war nicht verfügbar: er verlangt eine Variable, die zur Konfiguration der Plattform gehört; die Deklaration muss geändert werden.",
|
|
1996
|
+
"oauthNotConnected": "war nicht verfügbar: dieses Board wurde noch nicht damit verbunden.",
|
|
1997
|
+
"oauthTokenFailed": "war nicht verfügbar: die Verbindung liefert kein Zugriffstoken mehr.",
|
|
1998
|
+
"overBudget": "war nicht verfügbar: dieser Agent deklariert mehr Tool-Server, als ein Lauf mitführt.",
|
|
1999
|
+
"unknown": "war nicht verfügbar ({reason})."
|
|
2000
|
+
}
|
|
2001
|
+
},
|
|
1986
2002
|
"adherence": {
|
|
1987
2003
|
"heading": "Einhaltung der Best Practices",
|
|
1988
2004
|
"headingHint": "Die Best-Practice-Standards, die in den Prompt dieses Reviewers eingefügt wurden, und wie genau die Änderung ihnen nach seinem Urteil folgt.",
|
package/i18n/locales/en.json
CHANGED
|
@@ -1505,6 +1505,22 @@
|
|
|
1505
1505
|
"reduced": "What reduced effectiveness",
|
|
1506
1506
|
"obstacles": "Key obstacles"
|
|
1507
1507
|
},
|
|
1508
|
+
"toolServers": {
|
|
1509
|
+
"heading": "Tool servers (MCP)",
|
|
1510
|
+
"dispatchedAs": "Resolved for the {agent} agent this step dispatched.",
|
|
1511
|
+
"allTools": "Every tool this server exposes.",
|
|
1512
|
+
"narrowed": "Narrowed to: {tools}",
|
|
1513
|
+
"reason": {
|
|
1514
|
+
"harnessUnsupported": "was not available: the agent CLI this step ran on has no MCP client.",
|
|
1515
|
+
"transportUnsupported": "was not available: the agent CLI this step ran on cannot reach this kind of server.",
|
|
1516
|
+
"missingSecret": "was not available: a credential it needs is not set for this board.",
|
|
1517
|
+
"reservedSecret": "was not available: it asks for a variable the platform's own configuration owns, so the declaration has to change.",
|
|
1518
|
+
"oauthNotConnected": "was not available: nobody has connected this board to it yet.",
|
|
1519
|
+
"oauthTokenFailed": "was not available: the connection stopped producing an access token.",
|
|
1520
|
+
"overBudget": "was not available: this agent declares more tool servers than one run carries.",
|
|
1521
|
+
"unknown": "was not available ({reason})."
|
|
1522
|
+
}
|
|
1523
|
+
},
|
|
1508
1524
|
"adherence": {
|
|
1509
1525
|
"heading": "Best-practice adherence",
|
|
1510
1526
|
"headingHint": "The best-practice standards folded into this reviewer's prompt, and how closely it judged the change to follow each one.",
|
package/i18n/locales/es.json
CHANGED
|
@@ -1414,6 +1414,22 @@
|
|
|
1414
1414
|
"reduced": "Qué redujo la efectividad",
|
|
1415
1415
|
"obstacles": "Obstáculos clave"
|
|
1416
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "Servidores de herramientas (MCP)",
|
|
1419
|
+
"dispatchedAs": "Resuelto para el agente {agent} que este paso ejecutó.",
|
|
1420
|
+
"allTools": "Todas las herramientas que expone este servidor.",
|
|
1421
|
+
"narrowed": "Limitado a: {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "no estuvo disponible: la CLI del agente de este paso no tiene cliente MCP.",
|
|
1424
|
+
"transportUnsupported": "no estuvo disponible: la CLI del agente de este paso no puede alcanzar este tipo de servidor.",
|
|
1425
|
+
"missingSecret": "no estuvo disponible: falta en este tablero una credencial que necesita.",
|
|
1426
|
+
"reservedSecret": "no estuvo disponible: pide una variable que pertenece a la configuración de la plataforma, así que hay que cambiar la declaración.",
|
|
1427
|
+
"oauthNotConnected": "no estuvo disponible: nadie ha conectado este tablero con él todavía.",
|
|
1428
|
+
"oauthTokenFailed": "no estuvo disponible: la conexión dejó de producir un token de acceso.",
|
|
1429
|
+
"overBudget": "no estuvo disponible: este agente declara más servidores de los que lleva una ejecución.",
|
|
1430
|
+
"unknown": "no estuvo disponible ({reason})."
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1417
1433
|
"adherence": {
|
|
1418
1434
|
"heading": "Cumplimiento de buenas prácticas",
|
|
1419
1435
|
"headingHint": "Los estandares de buenas practicas incorporados al prompt de este revisor, y con cuanta fidelidad juzgo que el cambio sigue cada uno.",
|
package/i18n/locales/fr.json
CHANGED
|
@@ -1414,6 +1414,22 @@
|
|
|
1414
1414
|
"reduced": "Ce qui a réduit l'efficacité",
|
|
1415
1415
|
"obstacles": "Principaux obstacles"
|
|
1416
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "Serveurs d'outils (MCP)",
|
|
1419
|
+
"dispatchedAs": "Résolu pour l’agent {agent} lancé par cette étape.",
|
|
1420
|
+
"allTools": "Tous les outils exposés par ce serveur.",
|
|
1421
|
+
"narrowed": "Limité à : {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "n'était pas disponible : la CLI d'agent de cette étape n'a pas de client MCP.",
|
|
1424
|
+
"transportUnsupported": "n'était pas disponible : la CLI d'agent de cette étape ne peut pas atteindre ce type de serveur.",
|
|
1425
|
+
"missingSecret": "n'était pas disponible : un identifiant dont il a besoin n'est pas renseigné pour ce tableau.",
|
|
1426
|
+
"reservedSecret": "n'était pas disponible : il demande une variable qui appartient à la configuration de la plateforme, la déclaration doit donc changer.",
|
|
1427
|
+
"oauthNotConnected": "n'était pas disponible : personne n'a encore connecté ce tableau à ce serveur.",
|
|
1428
|
+
"oauthTokenFailed": "n'était pas disponible : la connexion ne produit plus de jeton d'accès.",
|
|
1429
|
+
"overBudget": "n'était pas disponible : cet agent déclare plus de serveurs d'outils qu'une exécution n'en transporte.",
|
|
1430
|
+
"unknown": "n'était pas disponible ({reason})."
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1417
1433
|
"adherence": {
|
|
1418
1434
|
"heading": "Respect des bonnes pratiques",
|
|
1419
1435
|
"headingHint": "Les standards de bonnes pratiques integres au prompt de ce relecteur, et le degre de respect de chacun qu'il a estime pour la modification.",
|
package/i18n/locales/he.json
CHANGED
|
@@ -1414,6 +1414,22 @@
|
|
|
1414
1414
|
"reduced": "מה הפחית את היעילות",
|
|
1415
1415
|
"obstacles": "מכשולים עיקריים"
|
|
1416
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "שרתי כלים (MCP)",
|
|
1419
|
+
"dispatchedAs": "נקבע עבור סוכן {agent} שהופעל בשלב הזה.",
|
|
1420
|
+
"allTools": "כל הכלים שהשרת הזה חושף.",
|
|
1421
|
+
"narrowed": "מוגבל אל: {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "לא היה זמין: לממשק הסוכן שבו רץ השלב הזה אין לקוח MCP.",
|
|
1424
|
+
"transportUnsupported": "לא היה זמין: ממשק הסוכן שבו רץ השלב הזה אינו יכול להגיע לשרת מסוג זה.",
|
|
1425
|
+
"missingSecret": "לא היה זמין: אישור גישה שהוא צריך אינו מוגדר עבור הלוח הזה.",
|
|
1426
|
+
"reservedSecret": "לא היה זמין: הוא מבקש משתנה ששייך לתצורת הפלטפורמה עצמה, ולכן יש לשנות את ההצהרה.",
|
|
1427
|
+
"oauthNotConnected": "לא היה זמין: איש עדיין לא חיבר את הלוח הזה אליו.",
|
|
1428
|
+
"oauthTokenFailed": "לא היה זמין: החיבור הפסיק להנפיק אסימון גישה.",
|
|
1429
|
+
"overBudget": "לא היה זמין: הסוכן הזה מצהיר על יותר שרתי כלים ממה שריצה אחת נושאת.",
|
|
1430
|
+
"unknown": "לא היה זמין ({reason})."
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1417
1433
|
"adherence": {
|
|
1418
1434
|
"heading": "עמידה בשיטות עבודה מומלצות",
|
|
1419
1435
|
"headingHint": "תקני העבודה המומלצים ששולבו בהנחיה של הסוקר הזה, ועד כמה לפי שיפוטו השינוי עומד בכל אחד מהם.",
|
package/i18n/locales/it.json
CHANGED
|
@@ -1983,6 +1983,22 @@
|
|
|
1983
1983
|
"reduced": "Cosa ha ridotto l'efficacia",
|
|
1984
1984
|
"obstacles": "Ostacoli principali"
|
|
1985
1985
|
},
|
|
1986
|
+
"toolServers": {
|
|
1987
|
+
"heading": "Server di strumenti (MCP)",
|
|
1988
|
+
"dispatchedAs": "Risolto per l’agente {agent} avviato da questo passaggio.",
|
|
1989
|
+
"allTools": "Tutti gli strumenti esposti da questo server.",
|
|
1990
|
+
"narrowed": "Limitato a: {tools}",
|
|
1991
|
+
"reason": {
|
|
1992
|
+
"harnessUnsupported": "non era disponibile: la CLI dell'agente di questo passo non ha un client MCP.",
|
|
1993
|
+
"transportUnsupported": "non era disponibile: la CLI dell'agente di questo passo non riesce a raggiungere server di questo tipo.",
|
|
1994
|
+
"missingSecret": "non era disponibile: una credenziale che gli serve non è impostata per questa lavagna.",
|
|
1995
|
+
"reservedSecret": "non era disponibile: chiede una variabile che appartiene alla configurazione della piattaforma, quindi va cambiata la dichiarazione.",
|
|
1996
|
+
"oauthNotConnected": "non era disponibile: nessuno ha ancora collegato questa lavagna al server.",
|
|
1997
|
+
"oauthTokenFailed": "non era disponibile: la connessione ha smesso di produrre un token di accesso.",
|
|
1998
|
+
"overBudget": "non era disponibile: questo agente dichiara più server di strumenti di quanti ne porti una singola esecuzione.",
|
|
1999
|
+
"unknown": "non era disponibile ({reason})."
|
|
2000
|
+
}
|
|
2001
|
+
},
|
|
1986
2002
|
"adherence": {
|
|
1987
2003
|
"heading": "Aderenza alle best practice",
|
|
1988
2004
|
"headingHint": "Gli standard di buone pratiche inseriti nel prompt di questo revisore, e quanto fedelmente ha giudicato che la modifica segua ciascuno.",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -1414,6 +1414,22 @@
|
|
|
1414
1414
|
"reduced": "効果を下げた要因",
|
|
1415
1415
|
"obstacles": "主な障害"
|
|
1416
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "ツールサーバー(MCP)",
|
|
1419
|
+
"dispatchedAs": "このステップが起動した {agent} エージェント向けに解決されました。",
|
|
1420
|
+
"allTools": "このサーバーが公開するすべてのツール。",
|
|
1421
|
+
"narrowed": "次に限定: {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "は利用できませんでした: このステップを実行したエージェント CLI に MCP クライアントがありません。",
|
|
1424
|
+
"transportUnsupported": "は利用できませんでした: このステップを実行したエージェント CLI はこの種類のサーバーに接続できません。",
|
|
1425
|
+
"missingSecret": "は利用できませんでした: 必要な認証情報がこのボードに設定されていません。",
|
|
1426
|
+
"reservedSecret": "は利用できませんでした: プラットフォーム自身の設定が使う変数を要求しているため、宣言側を変更する必要があります。",
|
|
1427
|
+
"oauthNotConnected": "は利用できませんでした: このボードはまだ接続されていません。",
|
|
1428
|
+
"oauthTokenFailed": "は利用できませんでした: 接続からアクセストークンが発行されなくなりました。",
|
|
1429
|
+
"overBudget": "は利用できませんでした: このエージェントは 1 回の実行が運べる数を超えるツールサーバーを宣言しています。",
|
|
1430
|
+
"unknown": "は利用できませんでした({reason})。"
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1417
1433
|
"adherence": {
|
|
1418
1434
|
"heading": "ベストプラクティスの遵守",
|
|
1419
1435
|
"headingHint": "このレビュアーのプロンプトに折り込まれたベストプラクティス標準と、変更が各標準にどれだけ従っているとレビュアーが判断したかです。",
|
package/i18n/locales/pl.json
CHANGED
|
@@ -1414,6 +1414,22 @@
|
|
|
1414
1414
|
"reduced": "Co obniżyło skuteczność",
|
|
1415
1415
|
"obstacles": "Kluczowe przeszkody"
|
|
1416
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "Serwery narzędzi (MCP)",
|
|
1419
|
+
"dispatchedAs": "Ustalone dla agenta {agent} uruchomionego przez ten krok.",
|
|
1420
|
+
"allTools": "Wszystkie narzędzia udostępniane przez ten serwer.",
|
|
1421
|
+
"narrowed": "Ograniczone do: {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "nie był dostępny: CLI agenta, na którym działał ten krok, nie ma klienta MCP.",
|
|
1424
|
+
"transportUnsupported": "nie był dostępny: CLI agenta, na którym działał ten krok, nie dosięga serwera tego rodzaju.",
|
|
1425
|
+
"missingSecret": "nie był dostępny: potrzebne mu poświadczenie nie jest ustawione dla tej tablicy.",
|
|
1426
|
+
"reservedSecret": "nie był dostępny: prosi o zmienną należącą do konfiguracji samej platformy, więc trzeba zmienić deklarację.",
|
|
1427
|
+
"oauthNotConnected": "nie był dostępny: nikt jeszcze nie połączył z nim tej tablicy.",
|
|
1428
|
+
"oauthTokenFailed": "nie był dostępny: połączenie przestało wydawać token dostępu.",
|
|
1429
|
+
"overBudget": "nie był dostępny: ten agent deklaruje więcej serwerów narzędzi, niż niesie jedno uruchomienie.",
|
|
1430
|
+
"unknown": "nie był dostępny ({reason})."
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1417
1433
|
"adherence": {
|
|
1418
1434
|
"heading": "Zgodność z najlepszymi praktykami",
|
|
1419
1435
|
"headingHint": "Standardy dobrych praktyk wplecione w prompt tego recenzenta oraz to, jak ściśle jego zdaniem zmiana trzyma się każdego z nich.",
|
package/i18n/locales/tr.json
CHANGED
|
@@ -1414,6 +1414,22 @@
|
|
|
1414
1414
|
"reduced": "Etkinliği azaltan etkenler",
|
|
1415
1415
|
"obstacles": "Başlıca engeller"
|
|
1416
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "Araç sunucuları (MCP)",
|
|
1419
|
+
"dispatchedAs": "Bu adımın çalıştırdığı {agent} ajanı için çözümlendi.",
|
|
1420
|
+
"allTools": "Bu sunucunun sunduğu tüm araçlar.",
|
|
1421
|
+
"narrowed": "Şunlarla sınırlandı: {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "kullanılamadı: bu adımın çalıştığı ajan CLI'sinde MCP istemcisi yok.",
|
|
1424
|
+
"transportUnsupported": "kullanılamadı: bu adımın çalıştığı ajan CLI'si bu türden bir sunucuya erişemiyor.",
|
|
1425
|
+
"missingSecret": "kullanılamadı: ihtiyaç duyduğu kimlik bilgisi bu pano için ayarlanmamış.",
|
|
1426
|
+
"reservedSecret": "kullanılamadı: platformun kendi yapılandırmasına ait bir değişken istiyor, bu yüzden bildirimin değişmesi gerekiyor.",
|
|
1427
|
+
"oauthNotConnected": "kullanılamadı: bu panoyu henüz kimse ona bağlamadı.",
|
|
1428
|
+
"oauthTokenFailed": "kullanılamadı: bağlantı artık erişim jetonu üretmiyor.",
|
|
1429
|
+
"overBudget": "kullanılamadı: bu ajan tek bir çalıştırmanın taşıdığından fazla araç sunucusu bildiriyor.",
|
|
1430
|
+
"unknown": "kullanılamadı ({reason})."
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1417
1433
|
"adherence": {
|
|
1418
1434
|
"heading": "En iyi uygulamalara uyum",
|
|
1419
1435
|
"headingHint": "Bu gözden geçirenin istemine eklenen iyi uygulama standartları ve değişikliğin her birine ne kadar uyduğuna dair değerlendirmesi.",
|
package/i18n/locales/uk.json
CHANGED
|
@@ -1414,6 +1414,22 @@
|
|
|
1414
1414
|
"reduced": "Що знизило ефективність",
|
|
1415
1415
|
"obstacles": "Основні перешкоди"
|
|
1416
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "Сервери інструментів (MCP)",
|
|
1419
|
+
"dispatchedAs": "Визначено для агента {agent}, якого запустив цей крок.",
|
|
1420
|
+
"allTools": "Усі інструменти, які надає цей сервер.",
|
|
1421
|
+
"narrowed": "Обмежено до: {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "був недоступний: у CLI агента, на якому виконувався цей крок, немає клієнта MCP.",
|
|
1424
|
+
"transportUnsupported": "був недоступний: CLI агента, на якому виконувався цей крок, не досягає сервера такого типу.",
|
|
1425
|
+
"missingSecret": "був недоступний: потрібні йому облікові дані не задані для цієї дошки.",
|
|
1426
|
+
"reservedSecret": "був недоступний: він просить змінну, що належить власній конфігурації платформи, тож потрібно змінити оголошення.",
|
|
1427
|
+
"oauthNotConnected": "був недоступний: цю дошку ще ніхто до нього не під’єднав.",
|
|
1428
|
+
"oauthTokenFailed": "був недоступний: з’єднання перестало видавати токен доступу.",
|
|
1429
|
+
"overBudget": "був недоступний: цей агент оголошує більше серверів інструментів, ніж несе один запуск.",
|
|
1430
|
+
"unknown": "був недоступний ({reason})."
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1417
1433
|
"adherence": {
|
|
1418
1434
|
"heading": "Дотримання найкращих практик",
|
|
1419
1435
|
"headingHint": "Стандарти найкращих практик, вплетені в промпт цього рецензента, і наскільки, на його думку, зміна відповідає кожному з них.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.238.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.
|
|
43
|
+
"@cat-factory/contracts": "0.258.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|