@cat-factory/app 0.237.1 → 0.239.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/ReportsPanel.vue +72 -4
- 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 +22 -0
- package/i18n/locales/en.json +22 -0
- package/i18n/locales/es.json +22 -0
- package/i18n/locales/fr.json +22 -0
- package/i18n/locales/he.json +22 -0
- package/i18n/locales/it.json +22 -0
- package/i18n/locales/ja.json +22 -0
- package/i18n/locales/pl.json +22 -0
- package/i18n/locales/tr.json +22 -0
- package/i18n/locales/uk.json +22 -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
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, ref, watch } from 'vue'
|
|
3
3
|
import { onKeyStroke } from '@vueuse/core'
|
|
4
|
+
import { lastCompleteRollupDay } from '@cat-factory/contracts'
|
|
4
5
|
import type {
|
|
5
6
|
ReportActivityDimension,
|
|
6
7
|
ReportActivityRow,
|
|
@@ -89,6 +90,29 @@ const activityByDimension = computed<ReportActivityRow[]>(() => {
|
|
|
89
90
|
return activity.byTaskType
|
|
90
91
|
})
|
|
91
92
|
|
|
93
|
+
const DAY_MS = 24 * 60 * 60 * 1000
|
|
94
|
+
|
|
95
|
+
// How the window's SPEND half was answered. The long (TCO) windows read the durable
|
|
96
|
+
// cost-attribution rollup, which is only as fresh as the last retention sweep, so a rollup
|
|
97
|
+
// that has materialised NOTHING must not render as a quiet quarter and one whose watermark is
|
|
98
|
+
// well behind `now` must not render its empty tail as thrift. Same three states as the
|
|
99
|
+
// operator dashboard's daily run rollup.
|
|
100
|
+
//
|
|
101
|
+
// The lag is measured against `lastCompleteRollupDay(generatedAt)`, NOT against `generatedAt`
|
|
102
|
+
// itself, because that is what `rolledUpThrough` counts in: the newest day the sweep could
|
|
103
|
+
// possibly have finished by now. Measuring against the wall clock instead compares a day
|
|
104
|
+
// boundary with an instant, so the very same healthy rollup drifts from ~0h of apparent lag
|
|
105
|
+
// just after midnight to ~24h just before the next one, and any fixed threshold then turns the
|
|
106
|
+
// hour the report happened to be opened into a health verdict. One whole missed day of slack
|
|
107
|
+
// is deliberate: the sweep is a daily cron on one facade, so a single skipped firing is a
|
|
108
|
+
// hiccup the next pass heals, while two in a row is the wedge worth naming.
|
|
109
|
+
const rollupState = computed<'none' | 'stale' | 'current' | null>(() => {
|
|
110
|
+
const v = view.value
|
|
111
|
+
if (!v || v.source !== 'daily-rollup') return null
|
|
112
|
+
if (v.rolledUpThrough == null) return 'none'
|
|
113
|
+
return lastCompleteRollupDay(v.generatedAt) - v.rolledUpThrough > DAY_MS ? 'stale' : 'current'
|
|
114
|
+
})
|
|
115
|
+
|
|
92
116
|
const maxTrend = computed(() => maxOf(view.value?.trend.points ?? [], trendMagnitude))
|
|
93
117
|
const hasSpend = computed(() => (view.value?.totals.calls ?? 0) > 0)
|
|
94
118
|
// Hoisted: every activity bar is scaled against the busiest slice in the SAME list, so this
|
|
@@ -246,6 +270,38 @@ watch(
|
|
|
246
270
|
}}
|
|
247
271
|
</p>
|
|
248
272
|
|
|
273
|
+
<!-- Which store answered, and how far it reaches. An un-materialised rollup and an
|
|
274
|
+
account that spent nothing produce the same empty breakdown. -->
|
|
275
|
+
<p
|
|
276
|
+
v-if="rollupState === 'none'"
|
|
277
|
+
class="rounded-lg border border-amber-800/60 bg-amber-950/30 px-3 py-2 text-xs text-amber-200"
|
|
278
|
+
data-testid="reports-rollup-none"
|
|
279
|
+
>
|
|
280
|
+
{{ t('reports.rollup.none') }}
|
|
281
|
+
</p>
|
|
282
|
+
<p
|
|
283
|
+
v-else-if="rollupState === 'stale'"
|
|
284
|
+
class="rounded-lg border border-amber-800/60 bg-amber-950/30 px-3 py-2 text-xs text-amber-200"
|
|
285
|
+
data-testid="reports-rollup-stale"
|
|
286
|
+
>
|
|
287
|
+
{{
|
|
288
|
+
t('reports.rollup.stale', {
|
|
289
|
+
date: d(new Date(view.rolledUpThrough ?? 0), 'short'),
|
|
290
|
+
})
|
|
291
|
+
}}
|
|
292
|
+
</p>
|
|
293
|
+
<p
|
|
294
|
+
v-else-if="rollupState === 'current'"
|
|
295
|
+
class="text-[11px] text-slate-500"
|
|
296
|
+
data-testid="reports-rollup-current"
|
|
297
|
+
>
|
|
298
|
+
{{
|
|
299
|
+
t('reports.rollup.current', {
|
|
300
|
+
date: d(new Date(view.rolledUpThrough ?? 0), 'short'),
|
|
301
|
+
})
|
|
302
|
+
}}
|
|
303
|
+
</p>
|
|
304
|
+
|
|
249
305
|
<!-- Headline totals. A stat tile, not a chart: these are single numbers. -->
|
|
250
306
|
<section>
|
|
251
307
|
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-slate-500">
|
|
@@ -352,10 +408,11 @@ watch(
|
|
|
352
408
|
</section>
|
|
353
409
|
</div>
|
|
354
410
|
|
|
355
|
-
<!-- The TCO axes: what a repository and a
|
|
356
|
-
pair above, because a run's activity is already sliced by
|
|
357
|
-
the repo and there is no second population to pair a
|
|
358
|
-
|
|
411
|
+
<!-- The TCO axes: what a repository, a ticket and a single run actually cost.
|
|
412
|
+
Spend-only, like the pair above, because a run's activity is already sliced by
|
|
413
|
+
the service that owns the repo and there is no second population to pair a
|
|
414
|
+
ticket with, and a run IS the unit activity counts. -->
|
|
415
|
+
<div class="grid gap-6 md:grid-cols-3">
|
|
359
416
|
<section>
|
|
360
417
|
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-slate-500">
|
|
361
418
|
{{ t('reports.spend.byRepo') }}
|
|
@@ -378,6 +435,17 @@ watch(
|
|
|
378
435
|
:label-of="sliceLabel"
|
|
379
436
|
/>
|
|
380
437
|
</section>
|
|
438
|
+
<section>
|
|
439
|
+
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-slate-500">
|
|
440
|
+
{{ t('reports.spend.byRun') }}
|
|
441
|
+
</h2>
|
|
442
|
+
<ReportsSpendBreakdown
|
|
443
|
+
:rows="view.spend.byRun"
|
|
444
|
+
:currency="currency"
|
|
445
|
+
test-id="reports-spend-run"
|
|
446
|
+
:label-of="sliceLabel"
|
|
447
|
+
/>
|
|
448
|
+
</section>
|
|
381
449
|
</div>
|
|
382
450
|
|
|
383
451
|
<!-- The shared axis: spend AND activity for the same grouping, side by side. -->
|
|
@@ -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.",
|
|
@@ -3624,6 +3640,11 @@
|
|
|
3624
3640
|
"retry": "Erneut versuchen",
|
|
3625
3641
|
"error": "Berichte konnten nicht geladen werden.",
|
|
3626
3642
|
"period": "{from} bis {to}",
|
|
3643
|
+
"rollup": {
|
|
3644
|
+
"none": "Die dauerhafte Kostenaggregation hat noch nichts erzeugt. Dieses Zeitfenster ist also mangels Daten leer, nicht mangels Kosten.",
|
|
3645
|
+
"stale": "Die dauerhafte Kostenaggregation reicht nur bis {date}. Alles danach sind fehlende Daten, keine günstige Woche.",
|
|
3646
|
+
"current": "Aus der dauerhaften Kostenaggregation, vollständig bis {date}. Die Zuordnung zu Repository, Ticket und Lauf ist hier die, die beim Entstehen der Kosten erfasst wurde."
|
|
3647
|
+
},
|
|
3627
3648
|
"unattributed": "Nicht zugeordnet",
|
|
3628
3649
|
"window": {
|
|
3629
3650
|
"oneDay": "Letzte 24 Stunden",
|
|
@@ -3666,6 +3687,7 @@
|
|
|
3666
3687
|
"byAgentKind": "Kosten nach Agententyp",
|
|
3667
3688
|
"byRepo": "Kosten nach Repository",
|
|
3668
3689
|
"byTicket": "Kosten nach Ticket",
|
|
3690
|
+
"byRun": "Kosten nach Lauf",
|
|
3669
3691
|
"heading": "Kosten",
|
|
3670
3692
|
"empty": "In diesem Zeitraum wurde keine Nutzung erfasst.",
|
|
3671
3693
|
"calls": "{count} Aufruf | {count} Aufrufe",
|
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.",
|
|
@@ -1859,6 +1875,11 @@
|
|
|
1859
1875
|
"retry": "Retry",
|
|
1860
1876
|
"error": "Reports could not be loaded.",
|
|
1861
1877
|
"period": "{from} to {to}",
|
|
1878
|
+
"rollup": {
|
|
1879
|
+
"none": "The durable cost rollup has produced nothing yet, so this window is empty for lack of data, not for lack of spend.",
|
|
1880
|
+
"stale": "The durable cost rollup only reaches {date}. Anything after that is missing data, not a cheap week.",
|
|
1881
|
+
"current": "From the durable cost rollup, complete through {date}. Repository, ticket and run attribution here is the one recorded when the spend happened."
|
|
1882
|
+
},
|
|
1862
1883
|
"unattributed": "Unattributed",
|
|
1863
1884
|
"window": {
|
|
1864
1885
|
"oneDay": "Last 24 hours",
|
|
@@ -1901,6 +1922,7 @@
|
|
|
1901
1922
|
"byAgentKind": "Spend by agent kind",
|
|
1902
1923
|
"byRepo": "Spend by repository",
|
|
1903
1924
|
"byTicket": "Spend by ticket",
|
|
1925
|
+
"byRun": "Spend by run",
|
|
1904
1926
|
"heading": "Spend",
|
|
1905
1927
|
"empty": "No recorded usage in this window.",
|
|
1906
1928
|
"calls": "{count} call | {count} calls",
|
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.",
|
|
@@ -1761,6 +1777,11 @@
|
|
|
1761
1777
|
"retry": "Reintentar",
|
|
1762
1778
|
"error": "No se pudieron cargar los informes.",
|
|
1763
1779
|
"period": "Del {from} al {to}",
|
|
1780
|
+
"rollup": {
|
|
1781
|
+
"none": "La agregación de costes duradera aún no ha producido nada, así que esta ventana está vacía por falta de datos, no por falta de gasto.",
|
|
1782
|
+
"stale": "La agregación de costes duradera solo llega hasta {date}. Lo posterior son datos que faltan, no una semana barata.",
|
|
1783
|
+
"current": "De la agregación de costes duradera, completa hasta {date}. La atribución a repositorio, tique y ejecución es la que se registró cuando se produjo el gasto."
|
|
1784
|
+
},
|
|
1764
1785
|
"unattributed": "Sin atribuir",
|
|
1765
1786
|
"window": {
|
|
1766
1787
|
"oneDay": "Últimas 24 horas",
|
|
@@ -1803,6 +1824,7 @@
|
|
|
1803
1824
|
"byAgentKind": "Gasto por tipo de agente",
|
|
1804
1825
|
"byRepo": "Gasto por repositorio",
|
|
1805
1826
|
"byTicket": "Gasto por tique",
|
|
1827
|
+
"byRun": "Gasto por ejecución",
|
|
1806
1828
|
"heading": "Gasto",
|
|
1807
1829
|
"empty": "No se registró uso en este periodo.",
|
|
1808
1830
|
"calls": "{count} llamada | {count} llamadas",
|
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.",
|
|
@@ -1761,6 +1777,11 @@
|
|
|
1761
1777
|
"retry": "Réessayer",
|
|
1762
1778
|
"error": "Impossible de charger les rapports.",
|
|
1763
1779
|
"period": "Du {from} au {to}",
|
|
1780
|
+
"rollup": {
|
|
1781
|
+
"none": "L'agrégation durable des coûts n'a encore rien produit : cette fenêtre est vide faute de données, pas faute de dépenses.",
|
|
1782
|
+
"stale": "L'agrégation durable des coûts ne va que jusqu'au {date}. Ce qui suit correspond à des données manquantes, pas à une semaine bon marché.",
|
|
1783
|
+
"current": "Issu de l'agrégation durable des coûts, complète jusqu'au {date}. L'attribution au dépôt, au ticket et à l'exécution est celle enregistrée au moment de la dépense."
|
|
1784
|
+
},
|
|
1764
1785
|
"unattributed": "Non attribué",
|
|
1765
1786
|
"window": {
|
|
1766
1787
|
"oneDay": "Dernières 24 heures",
|
|
@@ -1803,6 +1824,7 @@
|
|
|
1803
1824
|
"byAgentKind": "Dépense par type d’agent",
|
|
1804
1825
|
"byRepo": "Dépense par dépôt",
|
|
1805
1826
|
"byTicket": "Dépense par ticket",
|
|
1827
|
+
"byRun": "Dépense par exécution",
|
|
1806
1828
|
"heading": "Dépense",
|
|
1807
1829
|
"empty": "Aucune utilisation enregistrée sur cette période.",
|
|
1808
1830
|
"calls": "{count} appel | {count} appels",
|
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": "תקני העבודה המומלצים ששולבו בהנחיה של הסוקר הזה, ועד כמה לפי שיפוטו השינוי עומד בכל אחד מהם.",
|
|
@@ -1761,6 +1777,11 @@
|
|
|
1761
1777
|
"retry": "נסה שוב",
|
|
1762
1778
|
"error": "לא ניתן היה לטעון את הדוחות.",
|
|
1763
1779
|
"period": "מ־{from} עד {to}",
|
|
1780
|
+
"rollup": {
|
|
1781
|
+
"none": "סיכום העלויות המתמיד עוד לא הפיק דבר, ולכן החלון הזה ריק מחוסר נתונים ולא מחוסר הוצאה.",
|
|
1782
|
+
"stale": "סיכום העלויות המתמיד מגיע רק עד {date}. כל מה שאחרי זה הוא נתונים חסרים, לא שבוע זול.",
|
|
1783
|
+
"current": "מתוך סיכום העלויות המתמיד, שלם עד {date}. הייחוס למאגר, לכרטיס ולהרצה הוא זה שנרשם בזמן ההוצאה."
|
|
1784
|
+
},
|
|
1764
1785
|
"unattributed": "ללא שיוך",
|
|
1765
1786
|
"window": {
|
|
1766
1787
|
"oneDay": "24 השעות האחרונות",
|
|
@@ -1803,6 +1824,7 @@
|
|
|
1803
1824
|
"byAgentKind": "עלות לפי סוג סוכן",
|
|
1804
1825
|
"byRepo": "עלות לפי מאגר",
|
|
1805
1826
|
"byTicket": "עלות לפי כרטיס",
|
|
1827
|
+
"byRun": "עלות לפי הרצה",
|
|
1806
1828
|
"heading": "עלות",
|
|
1807
1829
|
"empty": "לא נרשם שימוש בטווח הזה.",
|
|
1808
1830
|
"calls": "קריאה אחת | שתי קריאות | {count} קריאות",
|
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.",
|
|
@@ -3624,6 +3640,11 @@
|
|
|
3624
3640
|
"retry": "Riprova",
|
|
3625
3641
|
"error": "Impossibile caricare i report.",
|
|
3626
3642
|
"period": "Dal {from} al {to}",
|
|
3643
|
+
"rollup": {
|
|
3644
|
+
"none": "L'aggregazione permanente dei costi non ha ancora prodotto nulla: questa finestra è vuota per mancanza di dati, non di spesa.",
|
|
3645
|
+
"stale": "L'aggregazione permanente dei costi arriva solo al {date}. Quello che viene dopo sono dati mancanti, non una settimana economica.",
|
|
3646
|
+
"current": "Dall'aggregazione permanente dei costi, completa fino al {date}. L'attribuzione a repository, ticket ed esecuzione è quella registrata quando la spesa è avvenuta."
|
|
3647
|
+
},
|
|
3627
3648
|
"unattributed": "Non attribuito",
|
|
3628
3649
|
"window": {
|
|
3629
3650
|
"oneDay": "Ultime 24 ore",
|
|
@@ -3666,6 +3687,7 @@
|
|
|
3666
3687
|
"byAgentKind": "Spesa per tipo di agente",
|
|
3667
3688
|
"byRepo": "Spesa per repository",
|
|
3668
3689
|
"byTicket": "Spesa per ticket",
|
|
3690
|
+
"byRun": "Spesa per esecuzione",
|
|
3669
3691
|
"heading": "Spesa",
|
|
3670
3692
|
"empty": "Nessun utilizzo registrato in questo periodo.",
|
|
3671
3693
|
"calls": "{count} chiamata | {count} chiamate",
|
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": "このレビュアーのプロンプトに折り込まれたベストプラクティス標準と、変更が各標準にどれだけ従っているとレビュアーが判断したかです。",
|
|
@@ -1761,6 +1777,11 @@
|
|
|
1761
1777
|
"retry": "再試行",
|
|
1762
1778
|
"error": "レポートを読み込めませんでした。",
|
|
1763
1779
|
"period": "{from} 〜 {to}",
|
|
1780
|
+
"rollup": {
|
|
1781
|
+
"none": "永続的なコスト集計はまだ何も生成していません。この期間が空なのは費用がなかったからではなく、データがないためです。",
|
|
1782
|
+
"stale": "永続的なコスト集計は {date} までしか届いていません。それ以降は費用が少なかったのではなく、欠けているデータです。",
|
|
1783
|
+
"current": "永続的なコスト集計より。{date} まで完全です。ここでのリポジトリ・チケット・実行への割り当ては、費用が発生した時点で記録されたものです。"
|
|
1784
|
+
},
|
|
1764
1785
|
"unattributed": "未割り当て",
|
|
1765
1786
|
"window": {
|
|
1766
1787
|
"oneDay": "過去24時間",
|
|
@@ -1803,6 +1824,7 @@
|
|
|
1803
1824
|
"byAgentKind": "エージェント種別の費用",
|
|
1804
1825
|
"byRepo": "リポジトリ別の費用",
|
|
1805
1826
|
"byTicket": "チケット別の費用",
|
|
1827
|
+
"byRun": "実行別の費用",
|
|
1806
1828
|
"heading": "費用",
|
|
1807
1829
|
"empty": "この期間に記録された利用はありません。",
|
|
1808
1830
|
"calls": "{count} 件の呼び出し | {count} 件の呼び出し",
|
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.",
|
|
@@ -1761,6 +1777,11 @@
|
|
|
1761
1777
|
"retry": "Spróbuj ponownie",
|
|
1762
1778
|
"error": "Nie udało się wczytać raportów.",
|
|
1763
1779
|
"period": "Od {from} do {to}",
|
|
1780
|
+
"rollup": {
|
|
1781
|
+
"none": "Trwałe zestawienie kosztów nie wyprodukowało jeszcze niczego, więc to okno jest puste z braku danych, a nie z braku wydatków.",
|
|
1782
|
+
"stale": "Trwałe zestawienie kosztów sięga tylko do {date}. To, co po tej dacie, to brakujące dane, a nie tani tydzień.",
|
|
1783
|
+
"current": "Z trwałego zestawienia kosztów, kompletnego do {date}. Przypisanie do repozytorium, zgłoszenia i uruchomienia jest tym zapisanym w chwili poniesienia kosztu."
|
|
1784
|
+
},
|
|
1764
1785
|
"unattributed": "Nieprzypisane",
|
|
1765
1786
|
"window": {
|
|
1766
1787
|
"oneDay": "Ostatnie 24 godziny",
|
|
@@ -1803,6 +1824,7 @@
|
|
|
1803
1824
|
"byAgentKind": "Koszty według typu agenta",
|
|
1804
1825
|
"byRepo": "Koszty według repozytorium",
|
|
1805
1826
|
"byTicket": "Koszty według zgłoszenia",
|
|
1827
|
+
"byRun": "Koszty według uruchomienia",
|
|
1806
1828
|
"heading": "Koszty",
|
|
1807
1829
|
"empty": "W tym okresie nie zarejestrowano użycia.",
|
|
1808
1830
|
"calls": "{count} wywołanie | {count} wywołania | {count} wywołań",
|
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.",
|
|
@@ -1761,6 +1777,11 @@
|
|
|
1761
1777
|
"retry": "Yeniden dene",
|
|
1762
1778
|
"error": "Raporlar yüklenemedi.",
|
|
1763
1779
|
"period": "{from} – {to}",
|
|
1780
|
+
"rollup": {
|
|
1781
|
+
"none": "Kalıcı maliyet toplaması henüz hiçbir şey üretmedi; bu pencere harcama olmadığı için değil, veri olmadığı için boş.",
|
|
1782
|
+
"stale": "Kalıcı maliyet toplaması yalnızca {date} tarihine kadar geliyor. Sonrası ucuz geçen bir hafta değil, eksik veri.",
|
|
1783
|
+
"current": "Kalıcı maliyet toplamasından; {date} tarihine kadar eksiksiz. Buradaki depo, bilet ve çalıştırma ataması, harcama yapıldığı anda kaydedilenidir."
|
|
1784
|
+
},
|
|
1764
1785
|
"unattributed": "Atanmamış",
|
|
1765
1786
|
"window": {
|
|
1766
1787
|
"oneDay": "Son 24 saat",
|
|
@@ -1803,6 +1824,7 @@
|
|
|
1803
1824
|
"byAgentKind": "Ajan türüne göre harcama",
|
|
1804
1825
|
"byRepo": "Depoya göre harcama",
|
|
1805
1826
|
"byTicket": "Bilete göre harcama",
|
|
1827
|
+
"byRun": "Çalıştırmaya göre harcama",
|
|
1806
1828
|
"heading": "Harcama",
|
|
1807
1829
|
"empty": "Bu dönemde kayıtlı kullanım yok.",
|
|
1808
1830
|
"calls": "{count} çağrı | {count} çağrı",
|
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": "Стандарти найкращих практик, вплетені в промпт цього рецензента, і наскільки, на його думку, зміна відповідає кожному з них.",
|
|
@@ -1761,6 +1777,11 @@
|
|
|
1761
1777
|
"retry": "Спробувати ще раз",
|
|
1762
1778
|
"error": "Не вдалося завантажити звіти.",
|
|
1763
1779
|
"period": "З {from} по {to}",
|
|
1780
|
+
"rollup": {
|
|
1781
|
+
"none": "Стале зведення витрат ще нічого не сформувало, тож це вікно порожнє через брак даних, а не через брак витрат.",
|
|
1782
|
+
"stale": "Стале зведення витрат сягає лише {date}. Усе після цієї дати означає відсутні дані, а не дешевий тиждень.",
|
|
1783
|
+
"current": "Зі сталого зведення витрат, повного до {date}. Прив’язку до репозиторію, тікета й запуску тут зафіксовано в момент витрати."
|
|
1784
|
+
},
|
|
1764
1785
|
"unattributed": "Без прив’язки",
|
|
1765
1786
|
"window": {
|
|
1766
1787
|
"oneDay": "Останні 24 години",
|
|
@@ -1803,6 +1824,7 @@
|
|
|
1803
1824
|
"byAgentKind": "Витрати за типом агента",
|
|
1804
1825
|
"byRepo": "Витрати за репозиторієм",
|
|
1805
1826
|
"byTicket": "Витрати за тікетом",
|
|
1827
|
+
"byRun": "Витрати за запуском",
|
|
1806
1828
|
"heading": "Витрати",
|
|
1807
1829
|
"empty": "За цей період використання не зафіксовано.",
|
|
1808
1830
|
"calls": "{count} виклик | {count} виклики | {count} викликів",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.239.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.259.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|