@cat-factory/app 0.270.3 → 0.271.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 +48 -14
- package/app/components/panels/StepMetadataCard.vue +105 -6
- package/i18n/locales/de.json +10 -1
- package/i18n/locales/en.json +10 -1
- package/i18n/locales/es.json +10 -1
- package/i18n/locales/fr.json +10 -1
- package/i18n/locales/he.json +10 -1
- package/i18n/locales/it.json +10 -1
- package/i18n/locales/ja.json +10 -1
- package/i18n/locales/pl.json +10 -1
- package/i18n/locales/tr.json +10 -1
- package/i18n/locales/uk.json +10 -1
- package/package.json +2 -2
|
@@ -13,7 +13,7 @@ import StepFragmentAdherence from '~/components/panels/StepFragmentAdherence.vue
|
|
|
13
13
|
import BinaryOutputReport from '~/components/binaryOutput/BinaryOutputReport.vue'
|
|
14
14
|
import EnvironmentStatusPanel from '~/components/environments/EnvironmentStatusPanel.vue'
|
|
15
15
|
import FrontendBindingsResolved from '~/components/panels/inspector/FrontendBindingsResolved.vue'
|
|
16
|
-
import { UI_TESTER_AGENT_KIND } from '@cat-factory/contracts'
|
|
16
|
+
import { UI_TESTER_AGENT_KIND, blockingReviewComments } from '@cat-factory/contracts'
|
|
17
17
|
import type { GateApprovalRefusal } from '@cat-factory/contracts'
|
|
18
18
|
import ProvisioningLogsDrawer from '~/components/provisioning/ProvisioningLogsDrawer.vue'
|
|
19
19
|
import IterationCapPrompt from '~/components/pipeline/IterationCapPrompt.vue'
|
|
@@ -171,10 +171,31 @@ const proposalEditable = computed(() => step.value?.outputIsRendered !== true)
|
|
|
171
171
|
// approve/request-changes/reject rail, it shows the shared iteration-cap prompt
|
|
172
172
|
// (one more round / proceed / stop & reset), resolved through its own endpoint.
|
|
173
173
|
const companionExceeded = computed(() => approvalPending.value && !!step.value?.companion?.exceeded)
|
|
174
|
+
/**
|
|
175
|
+
* The must-fix findings the reviewer left open on its last round.
|
|
176
|
+
*
|
|
177
|
+
* They are why the cap prompts read differently, and the difference is not cosmetic: a cap
|
|
178
|
+
* reached on the rating alone is the loop reporting that this is as good as it got, while an open
|
|
179
|
+
* blocker is the reviewer saying the work must not go on as it stands. That second one is also the
|
|
180
|
+
* park no risk policy will answer, so the person reading it is the only route past it and should
|
|
181
|
+
* be told what they are being asked to overrule.
|
|
182
|
+
*/
|
|
183
|
+
const blockingFindings = computed(() => blockingReviewComments(latestVerdict.value?.comments))
|
|
174
184
|
// The SAME park, reached for the opposite reason: the loop was abandoned with rounds still on the
|
|
175
185
|
// budget because the producer handed back the work it was asked to change and the rating did not
|
|
176
186
|
// move. The three choices are identical, so this only picks the wording — the cap copy states a
|
|
177
187
|
// spent limit, which is a false claim about this park (`companion.stalled`).
|
|
188
|
+
//
|
|
189
|
+
// It can hold TOGETHER with `blockingFindings`, and that pair is what splits the wording across
|
|
190
|
+
// the two slots rather than ranking them: the HEADING says how the loop ended (a stalled one did
|
|
191
|
+
// not reach its limit, so only it may say so) and the DETAIL says what this person is being asked
|
|
192
|
+
// to decide (an open blocker outranks a bar that went unmet, and its copy claims nothing about
|
|
193
|
+
// rounds). Neither slot can then state something untrue of the park it is describing.
|
|
194
|
+
//
|
|
195
|
+
// Which is why the stalled heading claims nothing about the RATING either. Standing still is
|
|
196
|
+
// unchanged output at an unmoved rating (`companionLoopStalled`), never a rating under the bar: a
|
|
197
|
+
// round held by an open blocker fails at a rating that cleared it, and the copy said "the rating
|
|
198
|
+
// held below the 80% bar" over a 95% one. What the number was is on the verdict card above.
|
|
178
199
|
const companionStalled = computed(() => companionExceeded.value && !!step.value?.companion?.stalled)
|
|
179
200
|
// A park a DEDICATED window owns (fork choice / follow-up triage): the generic approve
|
|
180
201
|
// resolver refuses these server-side, so the rail is replaced by a redirect to that window.
|
|
@@ -492,10 +513,12 @@ async function copyOutput() {
|
|
|
492
513
|
:step-index="ctx?.stepIndex ?? null"
|
|
493
514
|
/>
|
|
494
515
|
|
|
495
|
-
<!-- companion rework budget spent, OR the loop abandoned early as unproductive
|
|
496
|
-
|
|
497
|
-
output / stop & reset). One prompt,
|
|
498
|
-
the
|
|
516
|
+
<!-- companion rework budget spent, OR the loop abandoned early as unproductive,
|
|
517
|
+
with or without must-fix findings still open: the shared iteration-cap decision
|
|
518
|
+
(one more round / proceed with the current output / stop & reset). One prompt,
|
|
519
|
+
and the two slots are picked on different facts — the choices are the same but
|
|
520
|
+
the reason is not, the spent-limit wording is untrue of a stalled loop, and an
|
|
521
|
+
open blocker is what the person is actually being asked to overrule. -->
|
|
499
522
|
<IterationCapPrompt
|
|
500
523
|
v-if="companionExceeded"
|
|
501
524
|
:heading="
|
|
@@ -504,18 +527,29 @@ async function copyOutput() {
|
|
|
504
527
|
agent: agent.label,
|
|
505
528
|
attempts: step.companion?.attempts,
|
|
506
529
|
maxAttempts: step.companion?.maxAttempts,
|
|
507
|
-
threshold: pctOf(latestVerdict?.threshold ?? 0),
|
|
508
|
-
})
|
|
509
|
-
: t('panels.stepDetail.companionCapHeading', {
|
|
510
|
-
agent: agent.label,
|
|
511
|
-
attempts: step.companion?.maxAttempts,
|
|
512
|
-
threshold: pctOf(latestVerdict?.threshold ?? 0),
|
|
513
530
|
})
|
|
531
|
+
: blockingFindings.length
|
|
532
|
+
? t(
|
|
533
|
+
'panels.stepDetail.companionCapBlockedHeading',
|
|
534
|
+
{
|
|
535
|
+
agent: agent.label,
|
|
536
|
+
attempts: step.companion?.maxAttempts,
|
|
537
|
+
count: blockingFindings.length,
|
|
538
|
+
},
|
|
539
|
+
blockingFindings.length,
|
|
540
|
+
)
|
|
541
|
+
: t('panels.stepDetail.companionCapHeading', {
|
|
542
|
+
agent: agent.label,
|
|
543
|
+
attempts: step.companion?.maxAttempts,
|
|
544
|
+
threshold: pctOf(latestVerdict?.threshold ?? 0),
|
|
545
|
+
})
|
|
514
546
|
"
|
|
515
547
|
:detail="
|
|
516
|
-
|
|
517
|
-
? t('panels.stepDetail.
|
|
518
|
-
:
|
|
548
|
+
blockingFindings.length
|
|
549
|
+
? t('panels.stepDetail.companionCapBlockedDetail')
|
|
550
|
+
: companionStalled
|
|
551
|
+
? t('panels.stepDetail.companionStalledDetail')
|
|
552
|
+
: t('panels.stepDetail.companionCapDetail')
|
|
519
553
|
"
|
|
520
554
|
:loading="resolvingCap"
|
|
521
555
|
@resolve="resolveCompanionCap"
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed } from 'vue'
|
|
3
|
+
import {
|
|
4
|
+
bySeverityWorstFirst,
|
|
5
|
+
isReviewCommentSeverity,
|
|
6
|
+
type ReviewCommentSeverity,
|
|
7
|
+
} from '@cat-factory/contracts'
|
|
3
8
|
import type { AgentState, PipelineStep, CompanionVerdict, StepApproval } from '~/types/execution'
|
|
9
|
+
import type { BadgeColor } from '~/utils/badge'
|
|
4
10
|
import { subtaskIconClass } from '~/utils/pipelineRender'
|
|
5
11
|
import StepModelActivity from '~/components/observability/StepModelActivity.vue'
|
|
6
12
|
import StepContainerStatus from '~/components/panels/StepContainerStatus.vue'
|
|
@@ -65,6 +71,71 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
65
71
|
|
|
66
72
|
const pctOf = (n: number) => `${Math.round(n * 100)}%`
|
|
67
73
|
|
|
74
|
+
/**
|
|
75
|
+
* The colour each finding grade renders at. `ungraded` is its own member rather than a fallback
|
|
76
|
+
* arm: a person's comment carries no severity and neither does a verdict recorded before reviewers
|
|
77
|
+
* graded anything, and painting either of those `major` would put a level on the screen that
|
|
78
|
+
* nobody chose. `unrecognized` is the same argument for the other direction (see
|
|
79
|
+
* {@link findingGrade}). An exhaustive `Record` so a severity added to the contract fails to
|
|
80
|
+
* compile here, typed against the shared `BadgeColor` rather than a hand-picked subset of it.
|
|
81
|
+
*/
|
|
82
|
+
const SEVERITY_COLOR: Record<ReviewCommentSeverity | 'ungraded' | 'unrecognized', BadgeColor> = {
|
|
83
|
+
blocker: 'error',
|
|
84
|
+
major: 'warning',
|
|
85
|
+
minor: 'neutral',
|
|
86
|
+
ungraded: 'neutral',
|
|
87
|
+
unrecognized: 'neutral',
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* How one finding's grade renders: the level itself, or which of the two NON-levels it is.
|
|
92
|
+
*
|
|
93
|
+
* `unrecognized` is what a level this build has retired reads as. The severity vocabulary is closed
|
|
94
|
+
* but persisted, and a stored verdict is mapped onto the type rather than re-parsed, so the schema's
|
|
95
|
+
* `major` fallback never runs on this path (contracts' `isReviewCommentSeverity` states the rule).
|
|
96
|
+
* Left unnarrowed the value indexes both maps and comes back `undefined`, which renders an unstyled
|
|
97
|
+
* badge over a raw i18n key; guessed onto a current level it would show an urgency nobody graded, on
|
|
98
|
+
* the panel asking a person to act on it. So it is NAMED, and the copy carries the stored value.
|
|
99
|
+
*/
|
|
100
|
+
function findingGrade(severity: string | undefined): {
|
|
101
|
+
key: ReviewCommentSeverity | 'ungraded' | 'unrecognized'
|
|
102
|
+
level: string
|
|
103
|
+
} {
|
|
104
|
+
if (severity === undefined) return { key: 'ungraded', level: '' }
|
|
105
|
+
if (isReviewCommentSeverity(severity)) return { key: severity, level: severity }
|
|
106
|
+
return { key: 'unrecognized', level: severity }
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Each round paired with its findings, worst first (the order the reviewer's asks should be worked
|
|
111
|
+
* in) and each finding with its resolved grade.
|
|
112
|
+
*
|
|
113
|
+
* A `computed` rather than methods the template calls, because a run panel re-renders on every
|
|
114
|
+
* pushed instance update while the template needs the list twice per round (the `v-if` and the
|
|
115
|
+
* `v-for`) and the grade three times per finding: as methods that is a copy, a sort and a narrowing
|
|
116
|
+
* per reader per push, all off state that only changes when a verdict lands.
|
|
117
|
+
*/
|
|
118
|
+
const verdictRounds = computed(() =>
|
|
119
|
+
props.companionVerdicts.map((verdict) => ({
|
|
120
|
+
verdict,
|
|
121
|
+
findings: bySeverityWorstFirst(verdict.comments ?? []).map((finding) => ({
|
|
122
|
+
body: finding.body,
|
|
123
|
+
grade: findingGrade(finding.severity),
|
|
124
|
+
})),
|
|
125
|
+
})),
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Whether this round's rating actually reached its bar.
|
|
130
|
+
*
|
|
131
|
+
* Distinct from the verdict's own `passed`, which is what the ENGINE decided and can be `false` at a
|
|
132
|
+
* rating well above the threshold: an open `blocker` holds the step whatever the number says. The
|
|
133
|
+
* two were one expression, so the panel printed a false inequality over the findings that explained
|
|
134
|
+
* it. `>=` matches kernel's `disposeCompanionVerdict`, where a threshold typed by an operator must be
|
|
135
|
+
* met exactly by a rating equal to it.
|
|
136
|
+
*/
|
|
137
|
+
const ratingMeetsBar = (verdict: CompanionVerdict) => verdict.rating >= verdict.threshold
|
|
138
|
+
|
|
68
139
|
const APPROVAL_STATUS_KEYS: Record<StepApproval['status'], string> = {
|
|
69
140
|
pending: 'panels.stepMeta.approvalStatus.pending',
|
|
70
141
|
approved: 'panels.stepMeta.approvalStatus.approved',
|
|
@@ -278,17 +349,23 @@ async function copyRunId() {
|
|
|
278
349
|
<span class="text-[11px] uppercase tracking-wide text-slate-500">
|
|
279
350
|
{{ t('panels.stepMeta.companionReview') }}
|
|
280
351
|
</span>
|
|
352
|
+
<!-- The COLOUR is the verdict (`passed`) and the GLYPH is the arithmetic, which are no
|
|
353
|
+
longer the same fact: a round holding an open `blocker` fails at a rating that cleared
|
|
354
|
+
its bar, and reading the inequality off `passed` printed "95% < 80%" over the findings
|
|
355
|
+
explaining why. -->
|
|
281
356
|
<UBadge :color="latestVerdict?.passed ? 'success' : 'warning'" variant="subtle" size="sm">
|
|
282
357
|
{{ pctOf(latestVerdict!.rating) }}
|
|
283
|
-
{{ latestVerdict
|
|
358
|
+
{{ ratingMeetsBar(latestVerdict!) ? '≥' : '<' }} {{ pctOf(latestVerdict!.threshold) }}
|
|
284
359
|
</UBadge>
|
|
285
360
|
</div>
|
|
286
|
-
<!-- One card per correction round: the score on its own line, then the reviewer's
|
|
287
|
-
|
|
288
|
-
line, which turned a multi-point review into one unreadable
|
|
361
|
+
<!-- One card per correction round: the score on its own line, then the reviewer's verdict
|
|
362
|
+
as rendered markdown, then its graded findings worst first. The feedback used to trail
|
|
363
|
+
the score inside the same line, which turned a multi-point review into one unreadable
|
|
364
|
+
run of text; the findings used not to be rendered at all, so a "must fix" holding the
|
|
365
|
+
run was invisible to the person being asked to resolve it. -->
|
|
289
366
|
<ol class="mt-2 space-y-2">
|
|
290
367
|
<li
|
|
291
|
-
v-for="(v, i) in
|
|
368
|
+
v-for="({ verdict: v, findings }, i) in verdictRounds"
|
|
292
369
|
:key="i"
|
|
293
370
|
data-testid="companion-verdict"
|
|
294
371
|
class="relative rounded-lg border border-slate-800 bg-slate-900/60 px-3 py-2"
|
|
@@ -304,14 +381,36 @@ async function copyRunId() {
|
|
|
304
381
|
{{ i + 1 }}
|
|
305
382
|
</span>
|
|
306
383
|
<span :class="v.passed ? 'text-emerald-300' : 'text-amber-300'">
|
|
307
|
-
{{ pctOf(v.rating) }} {{ v
|
|
384
|
+
{{ pctOf(v.rating) }} {{ ratingMeetsBar(v) ? '≥' : '<' }} {{ pctOf(v.threshold) }}
|
|
308
385
|
</span>
|
|
309
386
|
</div>
|
|
310
387
|
<MarkdownProse
|
|
311
388
|
v-if="v.feedback"
|
|
312
389
|
:text="v.feedback"
|
|
390
|
+
data-testid="companion-verdict-summary"
|
|
313
391
|
class="mt-1.5 pe-6 text-[12px] leading-relaxed text-slate-300"
|
|
314
392
|
/>
|
|
393
|
+
<ul v-if="findings.length" class="mt-2 space-y-1.5">
|
|
394
|
+
<li
|
|
395
|
+
v-for="(finding, fi) in findings"
|
|
396
|
+
:key="fi"
|
|
397
|
+
data-testid="companion-finding"
|
|
398
|
+
class="flex gap-2"
|
|
399
|
+
>
|
|
400
|
+
<UBadge
|
|
401
|
+
:color="SEVERITY_COLOR[finding.grade.key]"
|
|
402
|
+
variant="subtle"
|
|
403
|
+
size="sm"
|
|
404
|
+
class="mt-px h-4 shrink-0"
|
|
405
|
+
>
|
|
406
|
+
{{ t(`panels.stepMeta.findingSeverity.${finding.grade.key}`, finding.grade) }}
|
|
407
|
+
</UBadge>
|
|
408
|
+
<MarkdownProse
|
|
409
|
+
:text="finding.body"
|
|
410
|
+
class="min-w-0 text-[12px] leading-relaxed text-slate-300"
|
|
411
|
+
/>
|
|
412
|
+
</li>
|
|
413
|
+
</ul>
|
|
315
414
|
</li>
|
|
316
415
|
</ol>
|
|
317
416
|
<p v-if="companionVerdicts.length > 1" class="mt-1 text-[11px] text-slate-500">
|
package/i18n/locales/de.json
CHANGED
|
@@ -2033,6 +2033,13 @@
|
|
|
2033
2033
|
"awaitingChoice": "Wartet auf eine menschliche Wahl",
|
|
2034
2034
|
"approvalGate": "Freigabe-Gate",
|
|
2035
2035
|
"companionReview": "Begleiter-Prüfung",
|
|
2036
|
+
"findingSeverity": {
|
|
2037
|
+
"blocker": "Muss behoben werden",
|
|
2038
|
+
"major": "Sollte behoben werden",
|
|
2039
|
+
"minor": "Geringfügig",
|
|
2040
|
+
"ungraded": "Kommentar",
|
|
2041
|
+
"unrecognized": "Unbekannte Stufe ({level})"
|
|
2042
|
+
},
|
|
2036
2043
|
"correctionIterations": "{count} Korrekturiteration. | {count} Korrekturiterationen.",
|
|
2037
2044
|
"state": {
|
|
2038
2045
|
"pending": "Ausstehend",
|
|
@@ -2069,7 +2076,9 @@
|
|
|
2069
2076
|
"closeEsc": "Schließen (Esc)",
|
|
2070
2077
|
"companionCapHeading": "{agent} hat sein Überarbeitungslimit von {attempts} Versuchen erreicht, noch unter der {threshold}-Schwelle.",
|
|
2071
2078
|
"companionCapDetail": "Führe eine weitere automatische Überarbeitungsrunde durch, fahre mit dem nächsten Schritt fort und akzeptiere die aktuelle Ausgabe, oder stoppe und setze die Aufgabe zurück, damit du die Eingaben bearbeiten und erneut einreichen kannst.",
|
|
2072
|
-
"
|
|
2079
|
+
"companionCapBlockedHeading": "{agent} hat sein Überarbeitungslimit von {attempts} Versuchen erreicht, {count} zwingender Befund ist weiterhin offen. | {agent} hat sein Überarbeitungslimit von {attempts} Versuchen erreicht, {count} zwingende Befunde sind weiterhin offen.",
|
|
2080
|
+
"companionCapBlockedDetail": "Fortfahren akzeptiert die Arbeit mit diesen ungelösten Befunden, deshalb trifft die Risikorichtlinie dieses Laufs diese Wahl nie für dich. Führe eine weitere automatische Überarbeitungsrunde durch, fahre trotzdem mit der aktuellen Ausgabe fort, oder stoppe und setze die Aufgabe zurück, damit du die Eingaben bearbeiten und erneut einreichen kannst.",
|
|
2081
|
+
"companionStalledHeading": "{agent} hat die Überarbeitungsschleife nach {attempts} von {maxAttempts} Runden gestoppt: Die letzte Überarbeitung kam unverändert zurück und die Bewertung hat sich nicht verändert.",
|
|
2073
2082
|
"companionStalledDetail": "Die restlichen Runden bleiben ungenutzt, weil sie nur ein bereits abgegebenes Urteil wiederholen würden. Führe trotzdem eine weitere Runde durch, fahre mit dem nächsten Schritt fort und akzeptiere die aktuelle Ausgabe, oder stoppe und setze die Aufgabe zurück, damit du die Eingaben bearbeiten und erneut einreichen kannst.",
|
|
2074
2083
|
"infraAttempts": "Infrastruktur-Versuche",
|
|
2075
2084
|
"hideInfraAttempts": "Infrastruktur-Versuche ausblenden",
|
package/i18n/locales/en.json
CHANGED
|
@@ -1458,6 +1458,13 @@
|
|
|
1458
1458
|
"awaitingChoice": "Awaiting a human choice",
|
|
1459
1459
|
"approvalGate": "Approval gate",
|
|
1460
1460
|
"companionReview": "Companion review",
|
|
1461
|
+
"findingSeverity": {
|
|
1462
|
+
"blocker": "Must fix",
|
|
1463
|
+
"major": "Should fix",
|
|
1464
|
+
"minor": "Minor",
|
|
1465
|
+
"ungraded": "Comment",
|
|
1466
|
+
"unrecognized": "Level not recognised ({level})"
|
|
1467
|
+
},
|
|
1461
1468
|
"correctionIterations": "{count} correction iteration. | {count} correction iterations.",
|
|
1462
1469
|
"state": {
|
|
1463
1470
|
"pending": "Pending",
|
|
@@ -1494,7 +1501,9 @@
|
|
|
1494
1501
|
"closeEsc": "Close (Esc)",
|
|
1495
1502
|
"companionCapHeading": "{agent} hit its {attempts}-attempt rework limit, still below the {threshold} bar.",
|
|
1496
1503
|
"companionCapDetail": "Do one more automatic rework round, proceed to the next step accepting the current output, or stop and reset the task so you can edit the inputs and resubmit.",
|
|
1497
|
-
"
|
|
1504
|
+
"companionCapBlockedHeading": "{agent} hit its {attempts}-attempt rework limit with {count} must-fix finding still open. | {agent} hit its {attempts}-attempt rework limit with {count} must-fix findings still open.",
|
|
1505
|
+
"companionCapBlockedDetail": "Proceeding accepts the work with those findings unfixed, which is why this run’s risk policy will never take that choice for you. Do one more automatic rework round, proceed anyway on the current output, or stop and reset the task so you can edit the inputs and resubmit.",
|
|
1506
|
+
"companionStalledHeading": "{agent} stopped the rework loop after {attempts} of {maxAttempts} rounds: the last revision came back unchanged and its rating did not move.",
|
|
1498
1507
|
"companionStalledDetail": "The remaining rounds were left unspent because they would only repeat a verdict already given. Do one more round anyway, proceed to the next step accepting the current output, or stop and reset the task so you can edit the inputs and resubmit.",
|
|
1499
1508
|
"infraAttempts": "Infrastructure attempts",
|
|
1500
1509
|
"hideInfraAttempts": "Hide infrastructure attempts",
|
package/i18n/locales/es.json
CHANGED
|
@@ -1348,6 +1348,13 @@
|
|
|
1348
1348
|
"awaitingChoice": "Esperando una elección humana",
|
|
1349
1349
|
"approvalGate": "Verificación de aprobación",
|
|
1350
1350
|
"companionReview": "Revisión del acompañante",
|
|
1351
|
+
"findingSeverity": {
|
|
1352
|
+
"blocker": "Debe corregirse",
|
|
1353
|
+
"major": "Debería corregirse",
|
|
1354
|
+
"minor": "Menor",
|
|
1355
|
+
"ungraded": "Comentario",
|
|
1356
|
+
"unrecognized": "Nivel no reconocido ({level})"
|
|
1357
|
+
},
|
|
1351
1358
|
"correctionIterations": "{count} iteración de corrección. | {count} iteraciones de corrección.",
|
|
1352
1359
|
"state": {
|
|
1353
1360
|
"pending": "Pendiente",
|
|
@@ -1403,7 +1410,9 @@
|
|
|
1403
1410
|
"closeEsc": "Cerrar (Esc)",
|
|
1404
1411
|
"companionCapHeading": "{agent} alcanzó su límite de {attempts} intentos de reelaboración, aún por debajo del umbral de {threshold}.",
|
|
1405
1412
|
"companionCapDetail": "Haz una ronda más de reelaboración automática, avanza al siguiente paso aceptando la salida actual, o detén y restablece la tarea para que puedas editar las entradas y reenviarla.",
|
|
1406
|
-
"
|
|
1413
|
+
"companionCapBlockedHeading": "{agent} alcanzó su límite de {attempts} intentos de reelaboración con {count} hallazgo obligatorio aún sin resolver. | {agent} alcanzó su límite de {attempts} intentos de reelaboración con {count} hallazgos obligatorios aún sin resolver.",
|
|
1414
|
+
"companionCapBlockedDetail": "Continuar acepta el trabajo con esos hallazgos sin resolver, por eso la política de riesgo de esta ejecución nunca tomará esa decisión por ti. Haz una ronda más de reelaboración automática, continúa igualmente con la salida actual, o detén y restablece la tarea para que puedas editar las entradas y reenviarla.",
|
|
1415
|
+
"companionStalledHeading": "{agent} detuvo el bucle de reelaboración tras {attempts} de {maxAttempts} rondas: la última revisión volvió sin cambios y la puntuación no se movió.",
|
|
1407
1416
|
"companionStalledDetail": "Las rondas restantes quedaron sin usar porque solo repetirían un veredicto ya emitido. Haz una ronda más de todos modos, avanza al siguiente paso aceptando la salida actual, o detén y restablece la tarea para que puedas editar las entradas y reenviarla.",
|
|
1408
1417
|
"infraAttempts": "Intentos de infraestructura",
|
|
1409
1418
|
"hideInfraAttempts": "Ocultar intentos de infraestructura",
|
package/i18n/locales/fr.json
CHANGED
|
@@ -1348,6 +1348,13 @@
|
|
|
1348
1348
|
"awaitingChoice": "En attente d'un choix humain",
|
|
1349
1349
|
"approvalGate": "Gate d'approbation",
|
|
1350
1350
|
"companionReview": "Revue du compagnon",
|
|
1351
|
+
"findingSeverity": {
|
|
1352
|
+
"blocker": "À corriger absolument",
|
|
1353
|
+
"major": "À corriger",
|
|
1354
|
+
"minor": "Mineur",
|
|
1355
|
+
"ungraded": "Commentaire",
|
|
1356
|
+
"unrecognized": "Niveau non reconnu ({level})"
|
|
1357
|
+
},
|
|
1351
1358
|
"correctionIterations": "{count} itération de correction. | {count} itérations de correction.",
|
|
1352
1359
|
"state": {
|
|
1353
1360
|
"pending": "En attente",
|
|
@@ -1403,7 +1410,9 @@
|
|
|
1403
1410
|
"closeEsc": "Fermer (Esc)",
|
|
1404
1411
|
"companionCapHeading": "{agent} a atteint sa limite de {attempts} tentatives de retravail, toujours en dessous du seuil {threshold}.",
|
|
1405
1412
|
"companionCapDetail": "Effectuer un tour de retravail automatique supplémentaire, passer à l'étape suivante en acceptant la sortie actuelle, ou arrêter et réinitialiser la tâche pour modifier les entrées et la resoumettre.",
|
|
1406
|
-
"
|
|
1413
|
+
"companionCapBlockedHeading": "{agent} a atteint sa limite de {attempts} tentatives de retravail avec {count} point bloquant encore ouvert. | {agent} a atteint sa limite de {attempts} tentatives de retravail avec {count} points bloquants encore ouverts.",
|
|
1414
|
+
"companionCapBlockedDetail": "Poursuivre revient à accepter le travail avec ces points non corrigés, c’est pourquoi la politique de risque de cette exécution ne prendra jamais cette décision à votre place. Effectuer un tour de retravail automatique supplémentaire, poursuivre malgré tout avec la sortie actuelle, ou arrêter et réinitialiser la tâche pour modifier les entrées et la resoumettre.",
|
|
1415
|
+
"companionStalledHeading": "{agent} a arrêté la boucle de retravail après {attempts} tours sur {maxAttempts} : la dernière révision est revenue inchangée et la note n'a pas bougé.",
|
|
1407
1416
|
"companionStalledDetail": "Les tours restants n'ont pas été utilisés car ils ne feraient que répéter un verdict déjà rendu. Effectuer tout de même un tour supplémentaire, passer à l'étape suivante en acceptant la sortie actuelle, ou arrêter et réinitialiser la tâche pour modifier les entrées et la resoumettre.",
|
|
1408
1417
|
"infraAttempts": "Tentatives d'infrastructure",
|
|
1409
1418
|
"hideInfraAttempts": "Masquer les tentatives d'infrastructure",
|
package/i18n/locales/he.json
CHANGED
|
@@ -1367,6 +1367,13 @@
|
|
|
1367
1367
|
"awaitingChoice": "ממתין לבחירה אנושית",
|
|
1368
1368
|
"approvalGate": "שער אישור",
|
|
1369
1369
|
"companionReview": "סקירת מלווה",
|
|
1370
|
+
"findingSeverity": {
|
|
1371
|
+
"blocker": "חובה לתקן",
|
|
1372
|
+
"major": "כדאי לתקן",
|
|
1373
|
+
"minor": "מינורי",
|
|
1374
|
+
"ungraded": "הערה",
|
|
1375
|
+
"unrecognized": "רמה לא מזוהה ({level})"
|
|
1376
|
+
},
|
|
1370
1377
|
"correctionIterations": "מחזור תיקון אחד. | שני מחזורי תיקון. | {count} מחזורי תיקון.",
|
|
1371
1378
|
"state": {
|
|
1372
1379
|
"pending": "ממתין",
|
|
@@ -1403,7 +1410,9 @@
|
|
|
1403
1410
|
"closeEsc": "סגור (Esc)",
|
|
1404
1411
|
"companionCapHeading": "{agent} הגיע למגבלת {attempts} ניסיונות עיבוד מחדש, ועדיין מתחת לרף {threshold}.",
|
|
1405
1412
|
"companionCapDetail": "בצע סבב עיבוד אוטומטי נוסף, המשך לשלב הבא תוך קבלת הפלט הנוכחי, או עצור ואפס את המשימה כדי לערוך את הקלטים ולשלוח מחדש.",
|
|
1406
|
-
"
|
|
1413
|
+
"companionCapBlockedHeading": "{agent} הגיע למגבלת {attempts} ניסיונות עיבוד מחדש, וממצא חובה אחד עדיין פתוח. | {agent} הגיע למגבלת {attempts} ניסיונות עיבוד מחדש, ושני ממצאי חובה עדיין פתוחים. | {agent} הגיע למגבלת {attempts} ניסיונות עיבוד מחדש, ו-{count} ממצאי חובה עדיין פתוחים.",
|
|
1414
|
+
"companionCapBlockedDetail": "המשך פירושו קבלת העבודה בלי שהממצאים האלה תוקנו, ולכן מדיניות הסיכון של הריצה הזו לעולם לא תבחר בכך במקומך. בצע סבב עיבוד אוטומטי נוסף, המשך בכל זאת עם הפלט הנוכחי, או עצור ואפס את המשימה כדי לערוך את הקלטים ולשלוח מחדש.",
|
|
1415
|
+
"companionStalledHeading": "{agent} עצר את לופ העיבוד מחדש לאחר {attempts} מתוך {maxAttempts} סבבים: הגרסה האחרונה חזרה ללא שינוי והדירוג לא זז.",
|
|
1407
1416
|
"companionStalledDetail": "הסבבים שנותרו לא נוצלו מפני שהם רק יחזרו על שיפוט שכבר ניתן. אפשר לבצע סבב נוסף בכל זאת, להמשיך לשלב הבא תוך קבלת הפלט הנוכחי, או לעצור ולאפס את המשימה כדי לערוך את הקלטים ולשלוח מחדש.",
|
|
1408
1417
|
"infraAttempts": "ניסיונות תשתית",
|
|
1409
1418
|
"hideInfraAttempts": "הסתר ניסיונות תשתית",
|
package/i18n/locales/it.json
CHANGED
|
@@ -2033,6 +2033,13 @@
|
|
|
2033
2033
|
"awaitingChoice": "In attesa di una scelta umana",
|
|
2034
2034
|
"approvalGate": "Gate di approvazione",
|
|
2035
2035
|
"companionReview": "Revisione companion",
|
|
2036
|
+
"findingSeverity": {
|
|
2037
|
+
"blocker": "Da correggere",
|
|
2038
|
+
"major": "Da sistemare",
|
|
2039
|
+
"minor": "Minore",
|
|
2040
|
+
"ungraded": "Commento",
|
|
2041
|
+
"unrecognized": "Livello non riconosciuto ({level})"
|
|
2042
|
+
},
|
|
2036
2043
|
"correctionIterations": "{count} iterazione di correzione. | {count} iterazioni di correzione.",
|
|
2037
2044
|
"state": {
|
|
2038
2045
|
"pending": "In attesa",
|
|
@@ -2069,7 +2076,9 @@
|
|
|
2069
2076
|
"closeEsc": "Chiudi (Esc)",
|
|
2070
2077
|
"companionCapHeading": "{agent} ha raggiunto il suo limite di {attempts} tentativi di rielaborazione, ancora al di sotto della soglia {threshold}.",
|
|
2071
2078
|
"companionCapDetail": "Esegui un altro ciclo di rielaborazione automatica, procedi al passaggio successivo accettando l'output attuale, oppure arresta e reimposta l'attivita' cosi' da poter modificare gli input e reinviare.",
|
|
2072
|
-
"
|
|
2079
|
+
"companionCapBlockedHeading": "{agent} ha raggiunto il suo limite di {attempts} tentativi di rielaborazione con {count} rilievo bloccante ancora aperto. | {agent} ha raggiunto il suo limite di {attempts} tentativi di rielaborazione con {count} rilievi bloccanti ancora aperti.",
|
|
2080
|
+
"companionCapBlockedDetail": "Procedere significa accettare il lavoro con quei rilievi irrisolti, per questo la policy di rischio di questa esecuzione non prendera' mai quella decisione al posto tuo. Esegui un altro ciclo di rielaborazione automatica, procedi comunque con l'output attuale, oppure arresta e reimposta l'attivita' cosi' da poter modificare gli input e reinviare.",
|
|
2081
|
+
"companionStalledHeading": "{agent} ha interrotto il ciclo di rielaborazione dopo {attempts} round su {maxAttempts}: l'ultima revisione e' tornata identica e il punteggio non e' cambiato.",
|
|
2073
2082
|
"companionStalledDetail": "I round rimanenti non sono stati usati perche' avrebbero solo ripetuto un verdetto gia' espresso. Esegui comunque un altro round, procedi al passaggio successivo accettando l'output attuale, oppure arresta e reimposta l'attivita' cosi' da poter modificare gli input e reinviare.",
|
|
2074
2083
|
"infraAttempts": "Tentativi di infrastruttura",
|
|
2075
2084
|
"hideInfraAttempts": "Nascondi i tentativi di infrastruttura",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -1367,6 +1367,13 @@
|
|
|
1367
1367
|
"awaitingChoice": "人による選択を待機中",
|
|
1368
1368
|
"approvalGate": "承認ゲート",
|
|
1369
1369
|
"companionReview": "コンパニオンレビュー",
|
|
1370
|
+
"findingSeverity": {
|
|
1371
|
+
"blocker": "要修正",
|
|
1372
|
+
"major": "修正推奨",
|
|
1373
|
+
"minor": "軽微",
|
|
1374
|
+
"ungraded": "コメント",
|
|
1375
|
+
"unrecognized": "未知のレベル ({level})"
|
|
1376
|
+
},
|
|
1370
1377
|
"correctionIterations": "{count} 回の修正イテレーション。 | {count} 回の修正イテレーション。",
|
|
1371
1378
|
"state": {
|
|
1372
1379
|
"pending": "保留中",
|
|
@@ -1403,7 +1410,9 @@
|
|
|
1403
1410
|
"closeEsc": "閉じる (Esc)",
|
|
1404
1411
|
"companionCapHeading": "{agent} は {attempts} 回の再作業上限に達しましたが、まだ {threshold} の基準を下回っています。",
|
|
1405
1412
|
"companionCapDetail": "自動の再作業をもう1回実行するか、現在の出力を受け入れて次のステップに進むか、タスクを停止してリセットし、入力を編集して再送信してください。",
|
|
1406
|
-
"
|
|
1413
|
+
"companionCapBlockedHeading": "{agent} は {attempts} 回の再作業上限に達しましたが、要修正の指摘が {count} 件残っています。 | {agent} は {attempts} 回の再作業上限に達しましたが、要修正の指摘が {count} 件残っています。",
|
|
1414
|
+
"companionCapBlockedDetail": "このまま進めると、これらの指摘が未修正のまま作業を受け入れることになります。そのため、この実行のリスクポリシーがこの選択を代わりに行うことはありません。自動の再作業をもう1回実行するか、現在の出力のまま進めるか、タスクを停止してリセットし、入力を編集して再送信してください。",
|
|
1415
|
+
"companionStalledHeading": "{agent} は {maxAttempts} 回のうち {attempts} 回で再作業ループを停止しました。直前の修正が変更されずに返され、評価も動きませんでした。",
|
|
1407
1416
|
"companionStalledDetail": "残りの回数は、すでに出された判定を繰り返すだけなので使われていません。それでももう1回実行するか、現在の出力を受け入れて次のステップに進むか、タスクを停止してリセットし、入力を編集して再送信してください。",
|
|
1408
1417
|
"infraAttempts": "インフラの試行",
|
|
1409
1418
|
"hideInfraAttempts": "インフラの試行を非表示",
|
package/i18n/locales/pl.json
CHANGED
|
@@ -1348,6 +1348,13 @@
|
|
|
1348
1348
|
"awaitingChoice": "Oczekiwanie na wybór człowieka",
|
|
1349
1349
|
"approvalGate": "Bramka zatwierdzenia",
|
|
1350
1350
|
"companionReview": "Recenzja towarzysza",
|
|
1351
|
+
"findingSeverity": {
|
|
1352
|
+
"blocker": "Blokujące",
|
|
1353
|
+
"major": "Do poprawy",
|
|
1354
|
+
"minor": "Drobne",
|
|
1355
|
+
"ungraded": "Komentarz",
|
|
1356
|
+
"unrecognized": "Nierozpoznany poziom ({level})"
|
|
1357
|
+
},
|
|
1351
1358
|
"correctionIterations": "{count} iteracja korekty. | {count} iteracje korekty. | {count} iteracji korekty.",
|
|
1352
1359
|
"state": {
|
|
1353
1360
|
"pending": "Oczekuje",
|
|
@@ -1403,7 +1410,9 @@
|
|
|
1403
1410
|
"closeEsc": "Zamknij (Esc)",
|
|
1404
1411
|
"companionCapHeading": "{agent} osiągnął limit {attempts} prób przeróbki, wciąż poniżej progu {threshold}.",
|
|
1405
1412
|
"companionCapDetail": "Wykonaj jeszcze jedną automatyczną rundę przeróbki, przejdź do następnego kroku akceptując bieżący wynik, albo zatrzymaj i zresetuj zadanie, aby edytować dane wejściowe i przesłać ponownie.",
|
|
1406
|
-
"
|
|
1413
|
+
"companionCapBlockedHeading": "{agent} osiągnął limit {attempts} prób przeróbki, a {count} uwaga blokująca pozostaje otwarta. | {agent} osiągnął limit {attempts} prób przeróbki, a {count} uwagi blokujące pozostają otwarte. | {agent} osiągnął limit {attempts} prób przeróbki, a {count} uwag blokujących pozostaje otwartych.",
|
|
1414
|
+
"companionCapBlockedDetail": "Kontynuacja oznacza przyjęcie pracy z tymi nienaprawionymi uwagami, dlatego polityka ryzyka tego przebiegu nigdy nie podejmie takiej decyzji za ciebie. Wykonaj jeszcze jedną automatyczną rundę przeróbki, kontynuuj mimo to z bieżącym wynikiem, albo zatrzymaj i zresetuj zadanie, aby edytować dane wejściowe i przesłać ponownie.",
|
|
1415
|
+
"companionStalledHeading": "{agent} zatrzymał pętlę przeróbek po {attempts} z {maxAttempts} rund: ostatnia poprawka wróciła bez zmian, a ocena się nie zmieniła.",
|
|
1407
1416
|
"companionStalledDetail": "Pozostałe rundy nie zostały wykorzystane, bo tylko powtórzyłyby już wydaną ocenę. Wykonaj mimo to jeszcze jedną rundę, przejdź do następnego kroku akceptując bieżący wynik, albo zatrzymaj i zresetuj zadanie, aby edytować dane wejściowe i przesłać ponownie.",
|
|
1408
1417
|
"infraAttempts": "Próby infrastrukturalne",
|
|
1409
1418
|
"hideInfraAttempts": "Ukryj próby infrastrukturalne",
|
package/i18n/locales/tr.json
CHANGED
|
@@ -1367,6 +1367,13 @@
|
|
|
1367
1367
|
"awaitingChoice": "Bir kullanıcı seçimi bekleniyor",
|
|
1368
1368
|
"approvalGate": "Onay kapısı",
|
|
1369
1369
|
"companionReview": "Yardımcı incelemesi",
|
|
1370
|
+
"findingSeverity": {
|
|
1371
|
+
"blocker": "Mutlaka düzeltilmeli",
|
|
1372
|
+
"major": "Düzeltilmeli",
|
|
1373
|
+
"minor": "Küçük",
|
|
1374
|
+
"ungraded": "Yorum",
|
|
1375
|
+
"unrecognized": "Tanınmayan düzey ({level})"
|
|
1376
|
+
},
|
|
1370
1377
|
"correctionIterations": "{count} düzeltme yinelemesi. | {count} düzeltme yinelemesi.",
|
|
1371
1378
|
"state": {
|
|
1372
1379
|
"pending": "Beklemede",
|
|
@@ -1403,7 +1410,9 @@
|
|
|
1403
1410
|
"closeEsc": "Kapat (Esc)",
|
|
1404
1411
|
"companionCapHeading": "{agent} {attempts} deneme yeniden çalışma sınırına ulaştı, hâlâ {threshold} barının altında.",
|
|
1405
1412
|
"companionCapDetail": "Bir otomatik yeniden çalışma turu daha yapın, mevcut çıktıyı kabul ederek sonraki adıma geçin ya da durup görevi sıfırlayarak girdileri düzenleyip yeniden gönderin.",
|
|
1406
|
-
"
|
|
1413
|
+
"companionCapBlockedHeading": "{agent} {attempts} deneme yeniden çalışma sınırına ulaştı, mutlaka düzeltilmesi gereken {count} bulgu hâlâ açık. | {agent} {attempts} deneme yeniden çalışma sınırına ulaştı, mutlaka düzeltilmesi gereken {count} bulgu hâlâ açık.",
|
|
1414
|
+
"companionCapBlockedDetail": "Devam etmek, bu bulgular düzeltilmeden işi kabul etmek demektir; bu yüzden bu çalışmanın risk politikası bu seçimi sizin yerinize asla yapmaz. Bir otomatik yeniden çalışma turu daha yapın, mevcut çıktıyla yine de devam edin ya da durup görevi sıfırlayarak girdileri düzenleyip yeniden gönderin.",
|
|
1415
|
+
"companionStalledHeading": "{agent}, {maxAttempts} turun {attempts} turunda yeniden çalışma döngüsünü durdurdu: son revizyon değişmeden döndü ve puan hiç değişmedi.",
|
|
1407
1416
|
"companionStalledDetail": "Kalan turlar kullanılmadı, çünkü yalnızca verilmiş bir kararı yineleyeceklerdi. Yine de bir tur daha yapın, mevcut çıktıyı kabul ederek sonraki adıma geçin ya da durup görevi sıfırlayarak girdileri düzenleyip yeniden gönderin.",
|
|
1408
1417
|
"infraAttempts": "Altyapı denemeleri",
|
|
1409
1418
|
"hideInfraAttempts": "Altyapı denemelerini gizle",
|
package/i18n/locales/uk.json
CHANGED
|
@@ -1348,6 +1348,13 @@
|
|
|
1348
1348
|
"awaitingChoice": "Очікування вибору людини",
|
|
1349
1349
|
"approvalGate": "Гейт затвердження",
|
|
1350
1350
|
"companionReview": "Огляд компаньйона",
|
|
1351
|
+
"findingSeverity": {
|
|
1352
|
+
"blocker": "Блокувальне",
|
|
1353
|
+
"major": "Треба виправити",
|
|
1354
|
+
"minor": "Незначне",
|
|
1355
|
+
"ungraded": "Коментар",
|
|
1356
|
+
"unrecognized": "Нерозпізнаний рівень ({level})"
|
|
1357
|
+
},
|
|
1351
1358
|
"correctionIterations": "{count} ітерація виправлення. | {count} ітерації виправлення. | {count} ітерацій виправлення.",
|
|
1352
1359
|
"state": {
|
|
1353
1360
|
"pending": "Очікує",
|
|
@@ -1403,7 +1410,9 @@
|
|
|
1403
1410
|
"closeEsc": "Закрити (Esc)",
|
|
1404
1411
|
"companionCapHeading": "{agent} досяг ліміту в {attempts} спроб переробки, усе ще нижче планки {threshold}.",
|
|
1405
1412
|
"companionCapDetail": "Виконайте ще один автоматичний раунд переробки, перейдіть до наступного кроку, прийнявши поточний вивід, або зупиніться та скиньте завдання, щоб відредагувати вхідні дані й надіслати повторно.",
|
|
1406
|
-
"
|
|
1413
|
+
"companionCapBlockedHeading": "{agent} досяг ліміту в {attempts} спроб переробки, {count} блокувальне зауваження досі відкрите. | {agent} досяг ліміту в {attempts} спроб переробки, {count} блокувальні зауваження досі відкриті. | {agent} досяг ліміту в {attempts} спроб переробки, {count} блокувальних зауважень досі відкриті.",
|
|
1414
|
+
"companionCapBlockedDetail": "Продовження означає прийняття роботи з невиправленими зауваженнями, тому політика ризику цього запуску ніколи не зробить цей вибір за вас. Виконайте ще один автоматичний раунд переробки, продовжте попри це з поточним виводом, або зупиніться та скиньте завдання, щоб відредагувати вхідні дані й надіслати повторно.",
|
|
1415
|
+
"companionStalledHeading": "{agent} зупинив цикл переробки після {attempts} з {maxAttempts} раундів: остання версія повернулася без змін, а оцінка не змінилася.",
|
|
1407
1416
|
"companionStalledDetail": "Решта раундів залишилися невикористаними, бо лише повторили б уже винесений висновок. Виконайте ще один раунд усе одно, перейдіть до наступного кроку, прийнявши поточний вивід, або зупиніться та скиньте завдання, щоб відредагувати вхідні дані й надіслати повторно.",
|
|
1408
1417
|
"infraAttempts": "Спроби інфраструктури",
|
|
1409
1418
|
"hideInfraAttempts": "Приховати спроби інфраструктури",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.271.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.41",
|
|
42
42
|
"wretch": "^3.0.9",
|
|
43
|
-
"@cat-factory/contracts": "0.
|
|
43
|
+
"@cat-factory/contracts": "0.310.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|