@cat-factory/app 0.311.2 → 0.312.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/README.md +92 -4
- package/app/app.config.ts +7 -0
- package/app/components/assistant/AssistantModal.vue +2 -5
- package/app/components/auth/AuthGate.vue +2 -1
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +14 -15
- package/app/components/binaryOutput/StoredAssetView.vue +1 -3
- package/app/components/board/AddTaskModal.vue +3 -10
- package/app/components/board/AgentFailureCard.vue +4 -5
- package/app/components/board/AgentStopButton.vue +5 -7
- package/app/components/board/BoardCanvas.vue +31 -30
- package/app/components/board/CreateInitiativeModal.vue +2 -4
- package/app/components/board/RecurringPipelineModal.vue +2 -7
- package/app/components/board/nodes/AgentChip.vue +3 -2
- package/app/components/board/nodes/BlockNode.vue +14 -11
- package/app/components/board/nodes/InitiativeCard.vue +6 -3
- package/app/components/board/nodes/TaskCard.vue +45 -212
- package/app/components/bootstrap/AdoptionReviewModal.vue +2 -5
- package/app/components/bootstrap/BootstrapModal.vue +6 -15
- package/app/components/bootstrap/BootstrapRunSteps.vue +3 -1
- package/app/components/brainstorm/BrainstormWindow.vue +32 -26
- package/app/components/bugFishing/BugFishingWindow.vue +15 -13
- package/app/components/clarity/ClarityReviewWindow.vue +31 -26
- package/app/components/common/ClarificationItem.vue +3 -1
- package/app/components/common/EmptyState.vue +41 -19
- package/app/components/common/InterviewGateNotice.vue +3 -1
- package/app/components/common/Spinner.vue +28 -0
- package/app/components/consensus/ConsensusSessionWindow.vue +5 -5
- package/app/components/docs/DocInterviewWindow.vue +6 -6
- package/app/components/documents/ContextDocumentPicker.vue +2 -2
- package/app/components/documents/DocumentImportModal.vue +9 -8
- package/app/components/documents/DocumentSourceConnectModal.vue +10 -10
- package/app/components/documents/DocumentTemplatesModal.vue +13 -7
- package/app/components/documents/RepoContextDocPicker.vue +2 -2
- package/app/components/documents/SpawnPreviewModal.vue +4 -6
- package/app/components/documents/StartFromDesignModal.vue +2 -1
- package/app/components/documents/TaskContextDocs.vue +4 -5
- package/app/components/environments/EnvironmentStatusPanel.vue +11 -8
- package/app/components/environments/steps/EnvPickStep.vue +7 -3
- package/app/components/environments/steps/EnvPreflightStep.vue +6 -5
- package/app/components/focus/BlockFocusView.vue +6 -5
- package/app/components/followUp/FollowUpWindow.vue +7 -9
- package/app/components/forkDecision/ForkDecisionWindow.vue +9 -8
- package/app/components/foundational/FoundationalServiceCatalogList.vue +9 -5
- package/app/components/foundational/FoundationalServiceRegistry.vue +11 -7
- package/app/components/foundational/FoundationalServiceSources.vue +20 -22
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/foundational/ServiceCatalogConnection.vue +15 -15
- package/app/components/fragments/FragmentLibraryManager.vue +36 -34
- package/app/components/fragments/FragmentSelector.vue +7 -3
- package/app/components/gates/GateResultView.vue +6 -9
- package/app/components/github/AddServiceFromRepoModal.vue +6 -10
- package/app/components/github/GitHubConnect.vue +10 -17
- package/app/components/github/GitHubPanel.vue +44 -47
- package/app/components/github/RepoTreeBrowser.vue +9 -5
- package/app/components/guidedReview/GuidedReviewModal.vue +16 -6
- package/app/components/guidedReview/GuidedReviewOverview.vue +2 -1
- package/app/components/guidedReview/GuidedReviewPicker.vue +10 -7
- package/app/components/guidedReview/GuidedReviewThread.vue +9 -4
- package/app/components/humanTest/HumanTestWindow.vue +2 -1
- package/app/components/initiative/InitiativePlanningWindow.vue +6 -6
- package/app/components/initiative/InitiativeTrackerWindow.vue +11 -11
- package/app/components/judge/JudgeResultView.vue +2 -7
- package/app/components/kaizen/KaizenPanel.vue +20 -5
- package/app/components/kaizen/KaizenStepStatus.vue +2 -1
- package/app/components/layout/AccountAuditLog.vue +11 -3
- package/app/components/layout/AccountDeploymentSettings.vue +17 -62
- package/app/components/layout/AccountFailureKindRules.vue +6 -5
- package/app/components/layout/AccountModelPolicySettings.vue +2 -6
- package/app/components/layout/AccountPlatformAlertSettings.vue +5 -13
- package/app/components/layout/AccountRiskPolicySettings.vue +13 -14
- package/app/components/layout/AccountRunCredentialSettings.vue +2 -2
- package/app/components/layout/AccountTeamSettings.vue +12 -9
- package/app/components/layout/BoardSwitcher.vue +2 -2
- package/app/components/layout/BoardToolbar.vue +27 -37
- package/app/components/layout/BoardTopOverlays.vue +8 -2
- package/app/components/layout/CommandBar.vue +7 -3
- package/app/components/layout/ConnectionStatusBanner.vue +2 -1
- package/app/components/layout/IntegrationsHub.vue +7 -3
- package/app/components/layout/ModelProvidersHub.vue +7 -3
- package/app/components/layout/NotificationsInbox.vue +3 -11
- package/app/components/layout/SideBar.vue +5 -0
- package/app/components/layout/WorkViewSwitcher.vue +64 -0
- package/app/components/layout/WorkspaceMembersSettings.vue +12 -5
- package/app/components/media/ArtifactLightbox.vue +4 -3
- package/app/components/notifications/NotificationSettingsPanel.vue +4 -11
- package/app/components/observability/ToolCallList.vue +12 -17
- package/app/components/panels/AgentStepDetail.vue +5 -5
- package/app/components/panels/GenericStructuredResultView.vue +6 -9
- package/app/components/panels/InspectorPanel.vue +2 -1
- package/app/components/panels/MergerResultView.vue +5 -6
- package/app/components/panels/ObservabilityPanel.vue +26 -41
- package/app/components/panels/OperatorDashboardPanel.vue +29 -17
- package/app/components/panels/ReportsPanel.vue +17 -11
- package/app/components/panels/ReportsSpendBreakdown.vue +7 -3
- package/app/components/panels/RunDetailLoadState.vue +4 -3
- package/app/components/panels/StepContainerStatus.vue +4 -3
- package/app/components/panels/StepDelegatedStatus.vue +3 -2
- package/app/components/panels/StepMetadataCard.vue +6 -8
- package/app/components/panels/StepRunMeta.vue +2 -5
- package/app/components/panels/inspector/ContainerSummary.vue +7 -1
- package/app/components/panels/inspector/EpicChildren.vue +7 -3
- package/app/components/panels/inspector/FrontendConfig.vue +7 -3
- package/app/components/panels/inspector/InitiativeInspector.vue +5 -2
- package/app/components/panels/inspector/ServiceConnections.vue +7 -3
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -6
- package/app/components/panels/inspector/ServiceTestSecrets.vue +2 -6
- package/app/components/panels/inspector/ServiceTestingContext.vue +2 -6
- package/app/components/panels/inspector/ServiceValidationConfig.vue +38 -39
- package/app/components/panels/inspector/TaskExecution.vue +5 -6
- package/app/components/panels/inspector/TaskRunSettings.vue +7 -3
- package/app/components/panels/inspector/TaskStructure.vue +0 -1
- package/app/components/pipeline/AgentPromptEditor.vue +25 -18
- package/app/components/pipeline/PipelineBuilder.vue +14 -24
- package/app/components/pipeline/PipelineProgress.vue +16 -17
- package/app/components/prReview/PrReviewPhaseBadge.vue +3 -2
- package/app/components/prReview/PrReviewWindow.vue +16 -20
- package/app/components/providers/ApiKeysSection.vue +2 -6
- package/app/components/providers/PersonalCredentialModal.vue +2 -6
- package/app/components/providers/PersonalSubscriptionSection.vue +3 -7
- package/app/components/providers/VendorCredentialsModal.vue +2 -6
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -6
- package/app/components/queue/QueueCard.vue +269 -0
- package/app/components/queue/QueueView.vue +192 -0
- package/app/components/ralph/RalphLoopResultView.vue +2 -7
- package/app/components/requirements/RequirementsReviewWindow.vue +44 -39
- package/app/components/sandbox/SandboxPanel.vue +37 -25
- package/app/components/settings/AccountSettingsPanel.vue +6 -3
- package/app/components/settings/ApiTokensPanel.vue +2 -6
- package/app/components/settings/BudgetSettings.vue +2 -2
- package/app/components/settings/CapabilityCredentialsPanel.vue +2 -6
- package/app/components/settings/CloudflareHandlerSection.vue +3 -7
- package/app/components/settings/ConsensusGroupsSection.vue +7 -3
- package/app/components/settings/CustomManifestTypeEditor.vue +7 -3
- package/app/components/settings/DefaultProvisionTypeSection.vue +2 -2
- package/app/components/settings/InfraHandlersConfigurator.vue +8 -11
- package/app/components/settings/IssueTrackerPanel.vue +9 -9
- package/app/components/settings/LocalContainerPoolSettings.vue +2 -6
- package/app/components/settings/LocalModelEndpointsPanel.vue +5 -7
- package/app/components/settings/McpAuthorizeScreen.vue +8 -3
- package/app/components/settings/McpOAuthCallbackScreen.vue +2 -1
- package/app/components/settings/ModelConfigurationPanel.vue +45 -17
- package/app/components/settings/ObservabilityConnectionPanel.vue +4 -15
- package/app/components/settings/OpenRouterCatalogPanel.vue +8 -24
- package/app/components/settings/PackageRegistriesPanel.vue +2 -6
- package/app/components/settings/ProviderConnectionTab.vue +3 -7
- package/app/components/settings/RiskPolicyPanel.vue +4 -16
- package/app/components/settings/SharedStacksPanel.vue +8 -18
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +10 -6
- package/app/components/settings/UsageSettings.vue +11 -2
- package/app/components/settings/UserSecretsSection.vue +5 -7
- package/app/components/settings/WorkspaceMetadataSettings.vue +9 -9
- package/app/components/settings/WorkspaceSettingsPanel.vue +3 -11
- package/app/components/skills/ReviewSkillQueue.vue +7 -3
- package/app/components/skills/SkillLibraryManager.vue +20 -18
- package/app/components/slack/SlackPanel.vue +5 -8
- package/app/components/spec/ServiceSpecWindow.vue +32 -29
- package/app/components/tasks/BugHuntModal.vue +23 -19
- package/app/components/tasks/ContextIssuePicker.vue +2 -2
- package/app/components/tasks/TaskContextIssues.vue +4 -5
- package/app/components/tasks/TaskImportModal.vue +10 -8
- package/app/components/tasks/TaskSourceConnectModal.vue +11 -11
- package/app/components/testing/TestReportWindow.vue +6 -12
- package/app/components/tutorial/TutorialCatalogue.vue +7 -3
- package/app/components/tutorial/TutorialOverlay.vue +2 -1
- package/app/components/tutorial/TutorialPrompt.vue +7 -3
- package/app/components/vcs/GitLabConnect.vue +2 -6
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +9 -4
- package/app/composables/toastTitleKeys.spec.ts +143 -0
- package/app/composables/useActionToast.spec.ts +71 -0
- package/app/composables/useActionToast.ts +101 -0
- package/app/composables/useBlockDeletion.ts +3 -6
- package/app/composables/useConfirmAction.ts +5 -3
- package/app/composables/useContextLinking.spec.ts +3 -0
- package/app/composables/useContextLinking.ts +11 -16
- package/app/composables/useCopyToClipboard.ts +4 -3
- package/app/composables/useFrameLanes.ts +6 -82
- package/app/composables/useNavContributions.ts +6 -5
- package/app/composables/usePipelineErrorToast.spec.ts +24 -0
- package/app/composables/usePipelineErrorToast.ts +26 -2
- package/app/composables/usePipelineLibraryActions.ts +8 -9
- package/app/composables/useTaskActions.ts +254 -0
- package/app/composables/useTaskLaneClassifier.ts +88 -0
- package/app/modular/nav-contributions.spec.ts +4 -0
- package/app/modular/nav-contributions.ts +31 -0
- package/app/modular/tutorial-tours.ts +10 -0
- package/app/pages/index.vue +42 -8
- package/app/stores/board/context.ts +4 -3
- package/app/stores/board/placement.ts +8 -20
- package/app/stores/board/removal.ts +4 -13
- package/app/stores/board.spec.ts +10 -1
- package/app/stores/board.ts +3 -2
- package/app/stores/workView.ts +51 -0
- package/app/stores/workspaceQueue.ts +148 -0
- package/app/utils/bootstrapSteps.ts +11 -2
- package/app/utils/pipelineRender.ts +21 -8
- package/app/utils/queueSections.spec.ts +111 -0
- package/app/utils/queueSections.ts +117 -0
- package/app/utils/workView.spec.ts +16 -0
- package/app/utils/workView.ts +25 -0
- package/i18n/locales/de.json +73 -32
- package/i18n/locales/en.json +73 -32
- package/i18n/locales/es.json +73 -32
- package/i18n/locales/fr.json +73 -32
- package/i18n/locales/he.json +73 -32
- package/i18n/locales/it.json +73 -32
- package/i18n/locales/ja.json +73 -32
- package/i18n/locales/pl.json +73 -32
- package/i18n/locales/tr.json +73 -32
- package/i18n/locales/uk.json +73 -32
- package/package.json +1 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { Block } from '~/types/domain'
|
|
2
|
+
import { sortLaneTasks, type LaneTaskEntry } from '~/utils/laneSort'
|
|
3
|
+
import {
|
|
4
|
+
selectDoneLaneTasks,
|
|
5
|
+
type DoneLaneCaps,
|
|
6
|
+
type LaneReason,
|
|
7
|
+
type TaskLane,
|
|
8
|
+
} from '~/utils/swimlanes'
|
|
9
|
+
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// The workspace queue: the swimlane model lifted out of the service frames.
|
|
12
|
+
//
|
|
13
|
+
// A frame's lanes answer "what is the state of THIS service". The queue answers "what needs
|
|
14
|
+
// me, across every service", which is the question a person asks first when they open the
|
|
15
|
+
// app. It reads the SAME `classifyTask` verdict the frame does (see
|
|
16
|
+
// `useTaskLaneClassifier`), so a task never sits in one column here and another lane there.
|
|
17
|
+
//
|
|
18
|
+
// It splits the verdict differently in one place, on purpose: a pull request waiting to be
|
|
19
|
+
// merged is in the frame's `needs_you` lane, and here it has its own column. Answering a
|
|
20
|
+
// decision and landing a finished change are different jobs done at different moments (one
|
|
21
|
+
// unblocks an agent within minutes, the other is a review session), and a single column that
|
|
22
|
+
// mixed them would put "merge this" between two questions an agent is parked on.
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
/** The queue's sections, in reading order. */
|
|
26
|
+
export const QUEUE_SECTIONS = [
|
|
27
|
+
'needs_you',
|
|
28
|
+
'in_flight',
|
|
29
|
+
'waiting',
|
|
30
|
+
'ready_to_merge',
|
|
31
|
+
'done',
|
|
32
|
+
] as const
|
|
33
|
+
export type QueueSection = (typeof QUEUE_SECTIONS)[number]
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Each lane reason's queue section. Exhaustive, so a new reason cannot ship without deciding
|
|
37
|
+
* where the queue files it.
|
|
38
|
+
*/
|
|
39
|
+
export const QUEUE_SECTION_BY_REASON: Record<LaneReason, QueueSection> = {
|
|
40
|
+
unstarted: 'waiting',
|
|
41
|
+
dependencies: 'waiting',
|
|
42
|
+
running: 'in_flight',
|
|
43
|
+
background_review: 'in_flight',
|
|
44
|
+
decision: 'needs_you',
|
|
45
|
+
approval: 'needs_you',
|
|
46
|
+
failed: 'needs_you',
|
|
47
|
+
budget_paused: 'needs_you',
|
|
48
|
+
parked: 'needs_you',
|
|
49
|
+
unclassified: 'needs_you',
|
|
50
|
+
pr_awaiting_merge: 'ready_to_merge',
|
|
51
|
+
merged: 'done',
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The frame lane whose `smart` order each section borrows. The queue adds no comparator of its
|
|
56
|
+
* own: an order that differed from the frame's would make the two surfaces disagree about what
|
|
57
|
+
* to look at first. Done takes the Done lane's own selection and order (below).
|
|
58
|
+
*/
|
|
59
|
+
const SORT_LANE_BY_SECTION: Record<Exclude<QueueSection, 'done'>, TaskLane> = {
|
|
60
|
+
needs_you: 'needs_you',
|
|
61
|
+
in_flight: 'in_progress',
|
|
62
|
+
waiting: 'not_started',
|
|
63
|
+
ready_to_merge: 'needs_you',
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** One queue entry: the lane entry plus the service the task belongs to. */
|
|
67
|
+
export interface QueueEntry extends LaneTaskEntry {
|
|
68
|
+
/** The enclosing service frame, or null for a task the board holds outside any service. */
|
|
69
|
+
readonly service: Pick<Block, 'id' | 'title'> | null
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** The assembled queue. */
|
|
73
|
+
export interface QueueAssembly {
|
|
74
|
+
readonly sections: Record<QueueSection, QueueEntry[]>
|
|
75
|
+
/** Every merged task inside the retention window, before the item cap. */
|
|
76
|
+
readonly doneInWindow: number
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Bucket and order classified entries into queue sections. Pure, so the ordering rules are
|
|
81
|
+
* testable without a Pinia instance.
|
|
82
|
+
*
|
|
83
|
+
* The Done section is the frames' Done lane over every service: the same selection
|
|
84
|
+
* (`selectDoneLaneTasks`) under the same workspace caps, so the queue and a frame never disagree
|
|
85
|
+
* about which merges are recent.
|
|
86
|
+
*/
|
|
87
|
+
export function assembleQueue(
|
|
88
|
+
entries: readonly QueueEntry[],
|
|
89
|
+
now: number,
|
|
90
|
+
doneCaps: DoneLaneCaps,
|
|
91
|
+
): QueueAssembly {
|
|
92
|
+
const sections = Object.fromEntries(QUEUE_SECTIONS.map((s) => [s, [] as QueueEntry[]])) as Record<
|
|
93
|
+
QueueSection,
|
|
94
|
+
QueueEntry[]
|
|
95
|
+
>
|
|
96
|
+
for (const entry of entries) sections[QUEUE_SECTION_BY_REASON[entry.reason]].push(entry)
|
|
97
|
+
|
|
98
|
+
const byId = new Map(sections.done.map((e) => [e.task.id, e]))
|
|
99
|
+
const done = selectDoneLaneTasks(
|
|
100
|
+
sections.done.map((e) => e.task),
|
|
101
|
+
doneCaps,
|
|
102
|
+
now,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
for (const section of QUEUE_SECTIONS) {
|
|
106
|
+
if (section === 'done') continue
|
|
107
|
+
sections[section] = sortLaneTasks(
|
|
108
|
+
sections[section],
|
|
109
|
+
'smart',
|
|
110
|
+
SORT_LANE_BY_SECTION[section],
|
|
111
|
+
) as QueueEntry[]
|
|
112
|
+
}
|
|
113
|
+
// Newest completion first, as the frame's Done lane orders it.
|
|
114
|
+
sections.done = done.shown.map((task) => byId.get(task.id)!)
|
|
115
|
+
|
|
116
|
+
return { sections, doneInWindow: done.shown.length + done.hiddenByCap }
|
|
117
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { DEFAULT_WORK_VIEW, isWorkView } from '~/utils/workView'
|
|
3
|
+
|
|
4
|
+
describe('isWorkView', () => {
|
|
5
|
+
it('accepts the two views and nothing else', () => {
|
|
6
|
+
expect(isWorkView('queue')).toBe(true)
|
|
7
|
+
expect(isWorkView('board')).toBe(true)
|
|
8
|
+
// A retired or hand-edited persisted value is not a view, so the store falls back.
|
|
9
|
+
expect(isWorkView('setup')).toBe(false)
|
|
10
|
+
expect(isWorkView(null)).toBe(false)
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('lands a person who has not chosen on the queue', () => {
|
|
14
|
+
expect(DEFAULT_WORK_VIEW).toBe('queue')
|
|
15
|
+
})
|
|
16
|
+
})
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// The two views of a board (issue #2258): the QUEUE (every task across every service, in the
|
|
3
|
+
// column that says what it needs) and the BOARD (the canvas, where the work is planned).
|
|
4
|
+
//
|
|
5
|
+
// They are two views of one board, not two products: the queue reads the same lane verdict the
|
|
6
|
+
// canvas's swimlanes do. Which one a person opens on is THEIR choice, remembered as the view they
|
|
7
|
+
// used last, because the jobs differ: someone who reviews all day wants the list, someone who
|
|
8
|
+
// plans the next service wants the map.
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
export const WORK_VIEWS = ['queue', 'board'] as const
|
|
12
|
+
export type WorkView = (typeof WORK_VIEWS)[number]
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Where a person lands before they have chosen. The queue: it answers the first question a
|
|
16
|
+
* person opens the app with ("what needs me?"), and the canvas is one click away.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_WORK_VIEW: WorkView = 'queue'
|
|
19
|
+
|
|
20
|
+
export function isWorkView(value: unknown): value is WorkView {
|
|
21
|
+
return typeof value === 'string' && (WORK_VIEWS as readonly string[]).includes(value)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** The query parameter that opens a view, so a link can say "look at the queue". */
|
|
25
|
+
export const WORK_VIEW_PARAM = 'view'
|
package/i18n/locales/de.json
CHANGED
|
@@ -53,7 +53,6 @@
|
|
|
53
53
|
"intro": "Jedes Preset legt für jeden Agenten ein {baseModel} fest, mit optionalen Overrides je Agent. Ein an einer einzelnen Aufgabe angeheftetes Modell überschreibt weiterhin das Preset.",
|
|
54
54
|
"introBaseModel": "Basismodell",
|
|
55
55
|
"newPreset": "Neues Preset",
|
|
56
|
-
"loadingCatalog": "Modellkatalog wird geladen…",
|
|
57
56
|
"default": "Standard",
|
|
58
57
|
"setDefaultTitle": "Als Workspace-Standard festlegen",
|
|
59
58
|
"editTitle": "Preset bearbeiten",
|
|
@@ -62,7 +61,8 @@
|
|
|
62
61
|
"basePrefix": "Basis:",
|
|
63
62
|
"overrideCount": "{count} Override | {count} Overrides",
|
|
64
63
|
"empty": "Noch keine Presets. Erstelle eines, um Modelle deinen Agenten zuzuordnen.",
|
|
65
|
-
"customRouteOrder": "eigene Routen-Reihenfolge"
|
|
64
|
+
"customRouteOrder": "eigene Routen-Reihenfolge",
|
|
65
|
+
"catalogFailed": "Der Modellkatalog wurde nicht geladen. Versuchen Sie es erneut, um die Presets zu sehen."
|
|
66
66
|
},
|
|
67
67
|
"editor": {
|
|
68
68
|
"useBaseModel": "Basismodell verwenden",
|
|
@@ -82,7 +82,8 @@
|
|
|
82
82
|
"deleteFailed": "Preset konnte nicht gelöscht werden",
|
|
83
83
|
"nameRequiredTitle": "Name erforderlich",
|
|
84
84
|
"nameRequiredBody": "Gib dem Preset einen Namen.",
|
|
85
|
-
"saveFailed": "Preset konnte nicht gespeichert werden"
|
|
85
|
+
"saveFailed": "Preset konnte nicht gespeichert werden",
|
|
86
|
+
"catalogFailed": "Modellkatalog konnte nicht geladen werden"
|
|
86
87
|
},
|
|
87
88
|
"routes": {
|
|
88
89
|
"direct": "Die eigene Provider-API des Modells",
|
|
@@ -237,7 +238,6 @@
|
|
|
237
238
|
"overrideActive": "Aktiv",
|
|
238
239
|
"personalOverrideHint": "Überschreibe den Workspace-Handler für diesen Provisioning-Typ auf deiner eigenen Maschine. Pro Benutzer gespeichert.",
|
|
239
240
|
"removeOverride": "Override entfernen",
|
|
240
|
-
"loading": "Infrastruktureinstellungen werden geladen…",
|
|
241
241
|
"kubeNoun": "der Kubernetes-Handler",
|
|
242
242
|
"kubeOverrideNoun": "der Kubernetes-Override",
|
|
243
243
|
"customNoun": "dieser Handler",
|
|
@@ -416,7 +416,6 @@
|
|
|
416
416
|
},
|
|
417
417
|
"taskTypeSuppressions": {
|
|
418
418
|
"intro": "Wählen Sie aus, welche wiederverwendbaren Operationen dieses Deployments auf diesem Board angeboten werden. Wird eine ausgeblendet, verschwindet sie hier aus der Aufgabenauswahl und das Anlegen von Arbeit darunter wird abgelehnt; andere Boards bleiben unberührt.",
|
|
419
|
-
"loading": "Operationen werden geladen…",
|
|
420
419
|
"empty": "Dieses Deployment registriert keine wiederverwendbaren Operationen.",
|
|
421
420
|
"offer": "Auf diesem Board anbieten",
|
|
422
421
|
"saveFailed": "Die angebotenen Operationen konnten nicht geändert werden"
|
|
@@ -1025,9 +1024,7 @@
|
|
|
1025
1024
|
"toast": {
|
|
1026
1025
|
"connected": "OpenRouter-Schlüssel verbunden",
|
|
1027
1026
|
"connectFailed": "Schlüssel konnte nicht verbunden werden",
|
|
1028
|
-
"rejected": "OpenRouter hat den Schlüssel abgelehnt.",
|
|
1029
1027
|
"unreachable": "OpenRouter konnte nicht erreicht werden",
|
|
1030
|
-
"connectFirst": "Verbinde zuerst einen OpenRouter-Schlüssel.",
|
|
1031
1028
|
"saved": "OpenRouter-Katalog gespeichert",
|
|
1032
1029
|
"saveFailed": "Katalog konnte nicht gespeichert werden"
|
|
1033
1030
|
}
|
|
@@ -2776,7 +2773,9 @@
|
|
|
2776
2773
|
"toggleUiMode": "Oberflächenmodus wechseln",
|
|
2777
2774
|
"chooseRole": "Rolle wechseln",
|
|
2778
2775
|
"foundationalServices": "Basisdienste",
|
|
2779
|
-
"notificationSettings": "Benachrichtigungs-Routing verwalten"
|
|
2776
|
+
"notificationSettings": "Benachrichtigungs-Routing verwalten",
|
|
2777
|
+
"queueView": "Warteschlangen-Ansicht öffnen",
|
|
2778
|
+
"boardView": "Board-Ansicht öffnen"
|
|
2780
2779
|
},
|
|
2781
2780
|
"keywords": {
|
|
2782
2781
|
"newPipeline": "pipeline agents chain",
|
|
@@ -2804,7 +2803,9 @@
|
|
|
2804
2803
|
"chooseRole": "rolle entwickler produktmanager designer persona einfachere ansicht",
|
|
2805
2804
|
"tutorial": "tutorial tour einführung hilfe onboarding lernen grundlagen",
|
|
2806
2805
|
"foundationalServices": "gemeinsame Fähigkeit Plattform Dienst API Vertrag OpenAPI Katalog",
|
|
2807
|
-
"notificationSettings": "benachrichtigungen e-mail routing kanäle posteingang"
|
|
2806
|
+
"notificationSettings": "benachrichtigungen e-mail routing kanäle posteingang",
|
|
2807
|
+
"queueView": "warteschlange ansicht wartet auf dich liste",
|
|
2808
|
+
"boardView": "board canvas karte ansicht planen"
|
|
2808
2809
|
}
|
|
2809
2810
|
},
|
|
2810
2811
|
"shortcuts": {
|
|
@@ -3675,7 +3676,6 @@
|
|
|
3675
3676
|
"connect": {
|
|
3676
3677
|
"yourInstallations": "Ihre Installationen",
|
|
3677
3678
|
"refresh": "Aktualisieren",
|
|
3678
|
-
"lookingForInstallations": "Suche nach Installationen…",
|
|
3679
3679
|
"noInstallations": "Noch keine Installationen für die App gefunden. Installieren Sie sie unten oder verbinden Sie per ID.",
|
|
3680
3680
|
"installationMeta": "{targetType} · Installation {id}",
|
|
3681
3681
|
"linked": "verknüpft",
|
|
@@ -3702,14 +3702,12 @@
|
|
|
3702
3702
|
"resync": "Neu synchronisieren",
|
|
3703
3703
|
"backfill": "Backfill",
|
|
3704
3704
|
"disconnect": "Trennen",
|
|
3705
|
-
"loading": "Wird geladen…",
|
|
3706
3705
|
"tabs": {
|
|
3707
3706
|
"repos": "Repositorys",
|
|
3708
3707
|
"issues": "Issues"
|
|
3709
3708
|
},
|
|
3710
3709
|
"linkedToBoard": "Mit diesem Board verknüpft",
|
|
3711
3710
|
"manageRepos": "Repos verwalten",
|
|
3712
|
-
"loadingRepos": "Repositorys werden geladen…",
|
|
3713
3711
|
"private": "privat",
|
|
3714
3712
|
"saveSelection": "Auswahl speichern",
|
|
3715
3713
|
"noLinkedRepos": "Noch keine Repositorys verknüpft. Verwenden Sie \"Repos verwalten\", um auszuwählen, welche Repositorys dieses Board verfolgt.",
|
|
@@ -3792,7 +3790,6 @@
|
|
|
3792
3790
|
},
|
|
3793
3791
|
"repoTree": {
|
|
3794
3792
|
"root": "root",
|
|
3795
|
-
"loading": "Wird geladen…",
|
|
3796
3793
|
"noSubdirectories": "Keine Unterverzeichnisse hier.",
|
|
3797
3794
|
"empty": "Nichts hier.",
|
|
3798
3795
|
"select": "Auswählen",
|
|
@@ -3875,8 +3872,6 @@
|
|
|
3875
3872
|
"exportJson": "JSON exportieren",
|
|
3876
3873
|
"exportHint": "Einen LLM-freundlichen JSON-Export dieses Laufs herunterladen",
|
|
3877
3874
|
"closeEsc": "Schließen (Esc)",
|
|
3878
|
-
"loadingActivity": "Modellaktivität wird geladen…",
|
|
3879
|
-
"loadingContext": "Bereitgestellter Kontext wird geladen…",
|
|
3880
3875
|
"noCalls": "Für diesen Lauf wurden keine Modellaufrufe aufgezeichnet.",
|
|
3881
3876
|
"noContext": "Für diesen Lauf ist kein Agent-Kontext gespeichert. Er wird pro Dispatch erfasst, wenn im Workspace 'Vollständigen Agent-Kontext speichern' aktiviert ist.",
|
|
3882
3877
|
"contextError": "Der bereitgestellte Kontext konnte nicht geladen werden.",
|
|
@@ -3968,7 +3963,6 @@
|
|
|
3968
3963
|
"details": "Details"
|
|
3969
3964
|
},
|
|
3970
3965
|
"webSearch": "Websuche",
|
|
3971
|
-
"loadingSearch": "Websuchen werden geladen…",
|
|
3972
3966
|
"noSearch": "Für diesen Lauf wurden keine Websuchen aufgezeichnet. Anfragen werden erfasst, wenn die Websuche läuft und im Workspace 'Vollständigen Agent-Kontext speichern' aktiviert ist.",
|
|
3973
3967
|
"search": {
|
|
3974
3968
|
"available": "Verfügbar",
|
|
@@ -4007,7 +4001,6 @@
|
|
|
4007
4001
|
"toolCalls": {
|
|
4008
4002
|
"title": "Werkzeugaufrufe",
|
|
4009
4003
|
"subtitle": "was die Agenten getan haben, in der Reihenfolge, in der sie es taten",
|
|
4010
|
-
"loading": "Werkzeugaufrufe werden geladen…",
|
|
4011
4004
|
"error": "Die Werkzeugaufrufe konnten nicht geladen werden.",
|
|
4012
4005
|
"none": "Für diesen Lauf wurden keine Werkzeugaufrufe aufgezeichnet.",
|
|
4013
4006
|
"noneMatching": "Keine Werkzeugaufrufe entsprechen diesem Filter.",
|
|
@@ -4028,7 +4021,6 @@
|
|
|
4028
4021
|
"title": "Plattform-Observability",
|
|
4029
4022
|
"refresh": "Aktualisieren",
|
|
4030
4023
|
"close": "Schließen",
|
|
4031
|
-
"loading": "Plattformzustand wird geladen…",
|
|
4032
4024
|
"retry": "Erneut versuchen",
|
|
4033
4025
|
"window": {
|
|
4034
4026
|
"oneHour": "Letzte Stunde",
|
|
@@ -4109,7 +4101,6 @@
|
|
|
4109
4101
|
"reports": {
|
|
4110
4102
|
"title": "Berichte",
|
|
4111
4103
|
"refresh": "Aktualisieren",
|
|
4112
|
-
"loading": "Berichte werden geladen…",
|
|
4113
4104
|
"retry": "Erneut versuchen",
|
|
4114
4105
|
"error": "Berichte konnten nicht geladen werden.",
|
|
4115
4106
|
"period": "{from} bis {to}",
|
|
@@ -4353,7 +4344,8 @@
|
|
|
4353
4344
|
"scopes": "Du wirst um folgende Berechtigungen gebeten: {scopes}",
|
|
4354
4345
|
"fallback": "Lieber ein Token? Nutze stattdessen die Felder unten.",
|
|
4355
4346
|
"failed": "Die Anmeldung bei {source} konnte nicht gestartet werden"
|
|
4356
|
-
}
|
|
4347
|
+
},
|
|
4348
|
+
"disconnectFailed": "Trennen nicht möglich"
|
|
4357
4349
|
},
|
|
4358
4350
|
"spawn": {
|
|
4359
4351
|
"title": "Struktur-Vorschau",
|
|
@@ -4501,7 +4493,8 @@
|
|
|
4501
4493
|
"updateConnection": "Verbindung aktualisieren",
|
|
4502
4494
|
"connect": "Verbinden",
|
|
4503
4495
|
"oauthButton": "Mit {label} verbinden",
|
|
4504
|
-
"oauthOr": "oder mit einem API-Schlüssel verbinden"
|
|
4496
|
+
"oauthOr": "oder mit einem API-Schlüssel verbinden",
|
|
4497
|
+
"disconnectFailed": "Trennen nicht möglich"
|
|
4505
4498
|
}
|
|
4506
4499
|
},
|
|
4507
4500
|
"bugHunt": {
|
|
@@ -4610,12 +4603,10 @@
|
|
|
4610
4603
|
"guidedReview": {
|
|
4611
4604
|
"title": "Geführtes Review",
|
|
4612
4605
|
"titleFor": "{repo} #{number}: {title}",
|
|
4613
|
-
"loading": "Review wird geladen…",
|
|
4614
4606
|
"outOfDate": "Live-Updates sind fehlgeschlagen, daher ist diese Ansicht möglicherweise veraltet.",
|
|
4615
4607
|
"openFromTask": "Mit geführtem Review erkunden",
|
|
4616
4608
|
"picker": {
|
|
4617
4609
|
"intro": "Wähle ein Repository und einen Pull Request. Du erhältst einen Überblick über die Änderung und kannst in separaten Threads Fragen dazu stellen.",
|
|
4618
|
-
"loading": "Repositories werden geladen…",
|
|
4619
4610
|
"noRepos": "Mit diesem Workspace sind noch keine Repositories verknüpft.",
|
|
4620
4611
|
"repo": "Repository",
|
|
4621
4612
|
"openPulls": "Offene Pull Requests",
|
|
@@ -5120,7 +5111,6 @@
|
|
|
5120
5111
|
"answerVerb": "Beantworten",
|
|
5121
5112
|
"dismissVerb": "verwerfen",
|
|
5122
5113
|
"empty": "Noch keine Prüfung. Der Prüfer läuft automatisch als erster Schritt, wenn die Pipeline dieser Aufgabe startet.",
|
|
5123
|
-
"loadingReview": "Prüfung wird geladen…",
|
|
5124
5114
|
"reviewing": "Anforderungen werden geprüft…",
|
|
5125
5115
|
"settled": "Die Anforderungen sind festgelegt. Das folgende Dokument verwendet jeder nachgelagerte Agentenschritt.",
|
|
5126
5116
|
"exceeded": {
|
|
@@ -5836,7 +5826,6 @@
|
|
|
5836
5826
|
"awaiting": "{total} Kandidaten wurden erzeugt und warten auf den Vergleich."
|
|
5837
5827
|
},
|
|
5838
5828
|
"asset": {
|
|
5839
|
-
"loading": "Datei wird geladen …",
|
|
5840
5829
|
"loadFailed": "Die gespeicherte Datei konnte nicht geladen werden.",
|
|
5841
5830
|
"retry": "Erneut versuchen",
|
|
5842
5831
|
"open": "Öffnen",
|
|
@@ -5862,7 +5851,6 @@
|
|
|
5862
5851
|
"introChoose": "Wählen",
|
|
5863
5852
|
"introDismiss": "verwerfen",
|
|
5864
5853
|
"empty": "Noch kein Brainstorm. Es läuft automatisch, wenn die Pipeline dieser Aufgabe den Brainstorm-Schritt erreicht.",
|
|
5865
|
-
"loading": "Brainstorm wird geladen…",
|
|
5866
5854
|
"generating": "Optionen werden generiert…",
|
|
5867
5855
|
"settledBanner": "Der {doc} ist festgelegt. Das folgende Dokument verwendet die nächste Phase.",
|
|
5868
5856
|
"exceeded": {
|
|
@@ -5946,7 +5934,6 @@
|
|
|
5946
5934
|
"introAnswer": "Beantworten",
|
|
5947
5935
|
"introDismiss": "verwerfen",
|
|
5948
5936
|
"empty": "Noch keine Prüfung. Der Prüfer läuft automatisch als erster Schritt, wenn die Pipeline dieser Aufgabe startet.",
|
|
5949
|
-
"loadingReview": "Prüfung wird geladen…",
|
|
5950
5937
|
"triaging": "Bug-Report wird triagiert…",
|
|
5951
5938
|
"converged": "Der Bug-Report ist geklärt. Der folgende Bericht verwendet jeder nachgelagerte Agentenschritt.",
|
|
5952
5939
|
"capHeading": "Das {max}-Iterationen-Limit wurde mit noch offenen Befunden erreicht.",
|
|
@@ -6213,7 +6200,6 @@
|
|
|
6213
6200
|
}
|
|
6214
6201
|
},
|
|
6215
6202
|
"common": {
|
|
6216
|
-
"loading": "Wird geladen…",
|
|
6217
6203
|
"save": "Speichern",
|
|
6218
6204
|
"cancel": "Abbrechen",
|
|
6219
6205
|
"retry": "Erneut versuchen",
|
|
@@ -6534,6 +6520,9 @@
|
|
|
6534
6520
|
"title": "Diese Ansicht konnte nicht geladen werden",
|
|
6535
6521
|
"body": "Ihr Code konnte nicht geladen werden. Meist wurde die Anwendung aktualisiert, während dieser Tab geöffnet war, sodass die angeforderten Dateien nicht mehr auf dem Server liegen. Laden Sie neu, um die aktuelle Version zu erhalten.",
|
|
6536
6522
|
"reload": "Neu laden"
|
|
6523
|
+
},
|
|
6524
|
+
"reported": {
|
|
6525
|
+
"description": "Der Vorgang lief und meldete einen Fehler. „Details anzeigen“ zeigt, was er gemeldet hat."
|
|
6537
6526
|
}
|
|
6538
6527
|
},
|
|
6539
6528
|
"slack": {
|
|
@@ -6850,7 +6839,6 @@
|
|
|
6850
6839
|
"consensus": {
|
|
6851
6840
|
"titlePrefix": "Konsens",
|
|
6852
6841
|
"participantCount": "keine Teilnehmer | ein Teilnehmer | {count} Teilnehmer",
|
|
6853
|
-
"loading": "Konsens-Sitzung wird geladen…",
|
|
6854
6842
|
"empty": "Für diesen Schritt wurde noch keine Konsens-Sitzung ausgeführt.",
|
|
6855
6843
|
"failed": "Konsens fehlgeschlagen: {error}",
|
|
6856
6844
|
"unknownError": "unbekannter Fehler",
|
|
@@ -6882,7 +6870,6 @@
|
|
|
6882
6870
|
},
|
|
6883
6871
|
"spec": {
|
|
6884
6872
|
"title": "Anforderungen",
|
|
6885
|
-
"loading": "Spezifikation wird geladen…",
|
|
6886
6873
|
"error": "Die Spezifikation konnte nicht geladen werden. Versuche, dieses Fenster erneut zu öffnen.",
|
|
6887
6874
|
"overview": "Übersicht",
|
|
6888
6875
|
"noFeatureGroups": "Keine Feature-Gruppen",
|
|
@@ -7072,8 +7059,7 @@
|
|
|
7072
7059
|
},
|
|
7073
7060
|
"shot": {
|
|
7074
7061
|
"failed": "Fehlgeschlagen",
|
|
7075
|
-
"failedToLoad": "Laden fehlgeschlagen"
|
|
7076
|
-
"loading": "Wird geladen…"
|
|
7062
|
+
"failedToLoad": "Laden fehlgeschlagen"
|
|
7077
7063
|
},
|
|
7078
7064
|
"screenshotAlt": "{view} (Screenshot)",
|
|
7079
7065
|
"screenshots": "Screenshots",
|
|
@@ -8133,6 +8119,10 @@
|
|
|
8133
8119
|
"title": "Das Board",
|
|
8134
8120
|
"body": "Services, Module und Aufgaben liegen auf dieser Fläche. Ziehe zum Verschieben, scrolle zum Zoomen und klicke auf eine Karte, um Details zu sehen."
|
|
8135
8121
|
},
|
|
8122
|
+
"views": {
|
|
8123
|
+
"title": "Zwei Ansichten",
|
|
8124
|
+
"body": "Das Board hat eine zweite Ansicht. Die Warteschlange zeigt, was über alle Services hinweg auf dich wartet. Nach der Tour wechselst du hier zwischen der Warteschlange und dieser Arbeitsfläche. Die App öffnet die Ansicht, die du zuletzt genutzt hast."
|
|
8125
|
+
},
|
|
8136
8126
|
"sidebar": {
|
|
8137
8127
|
"title": "Die Seitenleiste",
|
|
8138
8128
|
"body": "Alles Weitere findest du hier: Pipelines erstellen, Repositories und Integrationen verbinden, Workspace-Einstellungen."
|
|
@@ -8752,5 +8742,56 @@
|
|
|
8752
8742
|
"unsupportedVersion": "Dieses Design stammt aus einem neueren Editor-Format, als diese App versteht."
|
|
8753
8743
|
}
|
|
8754
8744
|
}
|
|
8745
|
+
},
|
|
8746
|
+
"queue": {
|
|
8747
|
+
"title": "Warteschlange",
|
|
8748
|
+
"summary": "{needsYou} warten auf dich · {ready} bereit zum Mergen",
|
|
8749
|
+
"filter": {
|
|
8750
|
+
"allServices": "Alle Services",
|
|
8751
|
+
"service": "Nach Service filtern"
|
|
8752
|
+
},
|
|
8753
|
+
"columns": {
|
|
8754
|
+
"needsYou": {
|
|
8755
|
+
"label": "Wartet auf dich",
|
|
8756
|
+
"empty": "Nichts wartet auf dich."
|
|
8757
|
+
},
|
|
8758
|
+
"inFlight": {
|
|
8759
|
+
"label": "In Arbeit",
|
|
8760
|
+
"empty": "Derzeit arbeitet kein Agent."
|
|
8761
|
+
},
|
|
8762
|
+
"readyToMerge": {
|
|
8763
|
+
"label": "Bereit zum Mergen",
|
|
8764
|
+
"empty": "Kein Pull Request wartet auf den Merge."
|
|
8765
|
+
}
|
|
8766
|
+
},
|
|
8767
|
+
"waiting": {
|
|
8768
|
+
"label": "Nicht begonnen ({count})",
|
|
8769
|
+
"empty": "Nichts wartet auf den Start."
|
|
8770
|
+
},
|
|
8771
|
+
"done": {
|
|
8772
|
+
"count": "Seit {date} gemergt: {count}",
|
|
8773
|
+
"countAll": "Gemergt: {count}",
|
|
8774
|
+
"show": "Anzeigen",
|
|
8775
|
+
"hide": "Ausblenden",
|
|
8776
|
+
"capped": "Zeigt die neuesten {shown} von {total}."
|
|
8777
|
+
},
|
|
8778
|
+
"card": {
|
|
8779
|
+
"waited": "wartete {duration}",
|
|
8780
|
+
"active": "vor {duration} aktiv",
|
|
8781
|
+
"merged": "vor {duration} gemergt",
|
|
8782
|
+
"step": "Schritt {current} von {total}",
|
|
8783
|
+
"showOnBoard": "Auf dem Board zeigen",
|
|
8784
|
+
"answer": "Antworten",
|
|
8785
|
+
"budgetPaused": "Das Ausgabenlimit hat diesen Durchlauf angehalten. Er läuft weiter, sobald das Limit erhöht wird.",
|
|
8786
|
+
"parked": "Der Durchlauf wartet auf einen Menschen. Öffne die Aufgabe, um zu sehen, was fehlt.",
|
|
8787
|
+
"waitingOn": "Wartet auf {deps}",
|
|
8788
|
+
"pr": "Pull Request #{number}"
|
|
8789
|
+
}
|
|
8790
|
+
},
|
|
8791
|
+
"views": {
|
|
8792
|
+
"title": "Ansichten",
|
|
8793
|
+
"queue": "Warteschlange",
|
|
8794
|
+
"board": "Board",
|
|
8795
|
+
"openQueue": "Warteschlangen-Ansicht öffnen"
|
|
8755
8796
|
}
|
|
8756
8797
|
}
|