From 76de7fea8f0024bad96cf9f28f9fd495772f336d Mon Sep 17 00:00:00 2001 From: Travis James Date: Mon, 28 Sep 2026 14:50:07 -0500 Subject: [PATCH] feat(uar): administer durable team planning boards Package the pinned C09.1 sidecar, add workspace-scoped team setup and administration, and expose the saved board in localized settings. Packaged Mac ARM64 gate created supervisor, bounded map/reduce and peer boards; restart and workspace isolation passed. Assisted-by: Codex:gpt-6-astra [tools] --- build/local-uar-source.json | 2 +- .../.openspec.yaml | 2 + .../uar-c09-team-planning-admin/design.md | 9 + .../uar-c09-team-planning-admin/evidence.md | 7 + .../uar-c09-team-planning-admin/proposal.md | 19 ++ .../uar-c09-team-planning-admin/tasks.md | 6 + .../cadence/uar-team-planning-scenario.mjs | 276 +++++++++++++++ .../runtime/uar/UarAdministrationAdapter.ts | 7 + .../uar/UarStarterAdministrationAdapter.ts | 82 ++++- .../uar/UarTeamsAdministrationAdapter.ts | 154 +++++++++ src/main/ai/runtime/uar/index.ts | 3 +- .../ai/runtime/uar/uarStarterDocuments.ts | 129 ++++++- src/main/core/preboot/userDataLocation.ts | 9 + src/main/ipc/handlers/prometheus.ts | 8 + src/renderer/i18n/locales/de-de.json | 51 +++ src/renderer/i18n/locales/el-gr.json | 51 +++ src/renderer/i18n/locales/en-us.json | 51 +++ src/renderer/i18n/locales/es-es.json | 51 +++ src/renderer/i18n/locales/fr-fr.json | 51 +++ src/renderer/i18n/locales/ja-jp.json | 51 +++ src/renderer/i18n/locales/pt-pt.json | 51 +++ src/renderer/i18n/locales/ro-ro.json | 51 +++ src/renderer/i18n/locales/ru-ru.json | 51 +++ src/renderer/i18n/locales/tr-tr.json | 51 +++ src/renderer/i18n/locales/vi-vn.json | 51 +++ src/renderer/i18n/locales/zh-cn.json | 51 +++ src/renderer/i18n/locales/zh-tw.json | 51 +++ .../UarAdministrationWorkspace.tsx | 8 +- .../PrometheusSettings/UarTeamTaskBoard.tsx | 62 ++++ .../PrometheusSettings/UarTeamTaskForm.tsx | 217 ++++++++++++ .../PrometheusSettings/UarTeamsPanel.tsx | 322 ++++++++++++++++++ .../settings/PrometheusSettings/uar.search.ts | 1 + src/shared/ipc/schemas/prometheus.ts | 43 +++ src/shared/types/uarTeams.ts | 96 ++++++ 34 files changed, 2108 insertions(+), 17 deletions(-) create mode 100644 openspec/changes/uar-c09-team-planning-admin/.openspec.yaml create mode 100644 openspec/changes/uar-c09-team-planning-admin/design.md create mode 100644 openspec/changes/uar-c09-team-planning-admin/evidence.md create mode 100644 openspec/changes/uar-c09-team-planning-admin/proposal.md create mode 100644 openspec/changes/uar-c09-team-planning-admin/tasks.md create mode 100644 scripts/cadence/uar-team-planning-scenario.mjs create mode 100644 src/main/ai/runtime/uar/UarTeamsAdministrationAdapter.ts create mode 100644 src/renderer/pages/settings/PrometheusSettings/UarTeamTaskBoard.tsx create mode 100644 src/renderer/pages/settings/PrometheusSettings/UarTeamTaskForm.tsx create mode 100644 src/renderer/pages/settings/PrometheusSettings/UarTeamsPanel.tsx create mode 100644 src/shared/types/uarTeams.ts diff --git a/build/local-uar-source.json b/build/local-uar-source.json index d72db65b917..f8b3f7ca2c8 100644 --- a/build/local-uar-source.json +++ b/build/local-uar-source.json @@ -2,6 +2,6 @@ "schema": 1, "platform": "darwin-arm64", "repository": "Prometheus-AGS/universal-agent-runtime", - "revision": "ba7233875f8df3b2add68fc487d364428432c07d", + "revision": "ae4db11869efd125dce7f9a2a488d876af0b7b98", "version": "1.0.0" } diff --git a/openspec/changes/uar-c09-team-planning-admin/.openspec.yaml b/openspec/changes/uar-c09-team-planning-admin/.openspec.yaml new file mode 100644 index 00000000000..ee7c5448114 --- /dev/null +++ b/openspec/changes/uar-c09-team-planning-admin/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-09-28 diff --git a/openspec/changes/uar-c09-team-planning-admin/design.md b/openspec/changes/uar-c09-team-planning-admin/design.md new file mode 100644 index 00000000000..9545c15fdab --- /dev/null +++ b/openspec/changes/uar-c09-team-planning-admin/design.md @@ -0,0 +1,9 @@ +# Design + +The Boss verifies workspace IDs against its own workspace store, reads the selected UAR generation and sends requests through its existing authenticated sidecar connection. It parses the returned team documents and refuses a response for another workspace. The renderer receives a typed projection via three fixed IPC routes: snapshot, create, add task. No arbitrary URL or untrusted method is accepted from the renderer. + +The UAR API is the sole writer of team planning state. Create resolves an immutable TeamDefinition and private deployment binding at their exact versions. Task submission supplies an expected team revision and an idempotent command ID. Task dependencies are checked by UAR; the UI only guides entry. Member and task state are displayed as returned, with no local inferred execution status. + +The Teams page uses the current UAR workspace selector and established settings components. It distinguishes a missing team-capable definition, unavailable sidecar, unsupported operation, empty board and failed mutation. All text uses existing locale catalogs. + +The cadence increment records UAR/Boss source refs, then completes code. At its boundary, build with `pnpm build:mac:arm64` using the clean pinned C09 UAR source and launch the resulting app. Exercise create/add/restart/read in the packaged app. Build success alone does not establish durable function. diff --git a/openspec/changes/uar-c09-team-planning-admin/evidence.md b/openspec/changes/uar-c09-team-planning-admin/evidence.md new file mode 100644 index 00000000000..bacf268d9f3 --- /dev/null +++ b/openspec/changes/uar-c09-team-planning-admin/evidence.md @@ -0,0 +1,7 @@ +# C09.1 packaged Mac delivery + +The complete local Mac ARM64 gate passed on 2026-09-28. The exact build, source fingerprints, sidecar archive, DMG checksum/signing state, and packaged-app operation are recorded in `librefang/docs/plans/agent-fabric-convergence/openspec/changes/afc-c09-bounded-teams-and-shared-task-board/c09-1-evidence.md` in the convergence initiative. The cadence run is `adcf4ebd-9fa7-4880-99ae-7545b6bd6bdf`, iteration `8d655a16-c393-44c7-9060-bbe69af76d06`. + +The packaged application installed the immutable starter team and private workspace binding, created supervisor/worker, bounded map/reduce and independent peer planning graphs, recovered them after a managed UAR restart, confirmed isolation of a second workspace, and displayed a recovered board in Teams settings. The local DMG is `dist/The-Boss-2.2.6-mac-arm64.dmg`, SHA-256 `10c2c652fa15fe16d56bfe3cc6b3a494b7aa645f9c3bb4a4033d75e23b7f434e`. + +This is planning-only functionality. Team execution and effect authority remain out of scope for C09.1. No Windows installer or public release is claimed by this receipt. diff --git a/openspec/changes/uar-c09-team-planning-admin/proposal.md b/openspec/changes/uar-c09-team-planning-admin/proposal.md new file mode 100644 index 00000000000..b742dcae176 --- /dev/null +++ b/openspec/changes/uar-c09-team-planning-admin/proposal.md @@ -0,0 +1,19 @@ +# UAR team planning in The Boss + +## Why + +UAR has immutable TeamDefinition documents but no durable team instance or task board visible in The Boss. A customer cannot create or inspect a team plan through the installed application. + +## What changes + +Expose UAR's C09.1 planning API through The Boss's trusted main-process adapter and typed IPC. Add a Teams page within UAR settings to select an installed immutable definition, create a workspace-scoped team instance, add tasks with dependencies and input/output contracts, and inspect the saved board after restart. Package the exact local UAR source in the Mac ARM64 application. + +This increment is planning only. Claiming, delegation, agent turns, budgets and aggregate authority remain C09.2–C09.3 work. The Boss never becomes the board's persistence authority. + +## Owners and boundary + +UAR worktree `/Users/gqadonis/Projects/prometheus/worktrees/agent-fabric-c09-uar` owns the API and durable state under its linked product change. The Boss runtime owner owns `src/main/ai/runtime/uar`, `src/shared/types`, `src/shared/ipc/schemas/prometheus.ts`, `src/main/ipc/handlers/prometheus.ts`, and `build/local-uar-source.json`. The Boss renderer owner owns `UarAdministrationWorkspace.tsx`, a new `UarTeamsPanel.tsx`, settings search, and every locale catalog. Build and functional operation happen once after production wiring. + +## Outcome + +An installed Mac application can create a team plan from an exact installed definition, add two dependent tasks, restart UAR and the app, and read the same isolated workspace board. The build receipt identifies the packaged UAR revision and application artifact. diff --git a/openspec/changes/uar-c09-team-planning-admin/tasks.md b/openspec/changes/uar-c09-team-planning-admin/tasks.md new file mode 100644 index 00000000000..26b3d6b51dd --- /dev/null +++ b/openspec/changes/uar-c09-team-planning-admin/tasks.md @@ -0,0 +1,6 @@ +# Tasks + +- [x] 1. UAR exposes a workspace-scoped, durable planning API for exact team definitions, instances, members and task DAG records; pin its source revision and native payload. +- [x] 2. The Boss adds fixed authenticated main-process routes and typed IPC for list/create/add with workspace scope and capability checks. +- [x] 3. The Boss adds an accessible Teams settings page with actionable creation and task planning, all locale strings and clear saved/error states. +- [x] 4. Build the complete Mac ARM64 application, run the installed planning workflow including restart and two-workspace isolation, then record exact source/artifact evidence at the cadence boundary. diff --git a/scripts/cadence/uar-team-planning-scenario.mjs b/scripts/cadence/uar-team-planning-scenario.mjs new file mode 100644 index 00000000000..206b5c38fb9 --- /dev/null +++ b/scripts/cadence/uar-team-planning-scenario.mjs @@ -0,0 +1,276 @@ +import { randomUUID } from 'node:crypto' +import { mkdtempSync } from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import { setTimeout as delay } from 'node:timers/promises' + +function requestExpression(route, input) { + return `(async () => { + const result = await window.api.ipcApi.request(${JSON.stringify(route)}, ${JSON.stringify(input)}); + return result.ok ? { ok: true, data: result.data } : { ok: false, error: result.error }; + })()` +} + +async function request(evaluate, route, input) { + const result = await evaluate(requestExpression(route, input)) + if (!result?.ok) throw new Error(`${route}: ${JSON.stringify(result?.error ?? 'no response')}`) + return result.data +} + +async function waitFor(evaluate, signal, expression, description, timeoutMs = 30_000) { + const deadline = Date.now() + timeoutMs + while (Date.now() < deadline) { + signal.throwIfAborted() + if (await evaluate(expression)) return + await delay(200, undefined, { signal }) + } + throw new Error(`${description} did not become available in The Boss`) +} + +export default async function run({ evaluate, signal }) { + signal.throwIfAborted() + const directory = mkdtempSync(path.join(os.tmpdir(), 'boss-c09-team-')) + const workspaceResult = await evaluate(`(async () => window.api.dataApi.request({ + id: ${JSON.stringify(randomUUID())}, method: 'POST', path: '/agent-workspaces', + body: { path: ${JSON.stringify(directory)}, name: 'Cadence team planning' } + }))()`) + if (workspaceResult?.error || !workspaceResult?.data?.id) { + throw new Error(`Could not create a Boss workspace: ${JSON.stringify(workspaceResult?.error ?? 'empty response')}`) + } + const workspaceId = workspaceResult.data.id + const binding = await request(evaluate, 'prometheus.uar.teams.setup_starter', { workspaceId }) + if (binding.activationSupported) throw new Error('Starter team unexpectedly advertises execution support') + const snapshot = await request(evaluate, 'prometheus.uar.teams.snapshot', { workspaceId }) + if (!snapshot.capabilities.planning) throw new Error('UAR did not advertise durable team planning') + const definition = snapshot.definitions.find((item) => item.package.digest === binding.package.digest) + if (!definition) throw new Error('Installed starter team definition is missing from the catalog') + const team = await request(evaluate, 'prometheus.uar.teams.create', { + workspaceId, + commandId: randomUUID(), + deploymentBindingId: binding.id, + teamDefinition: { id: definition.id, version: definition.version, digest: definition.digest }, + input: { brief: 'Prepare a local delivery plan' } + }) + if (team.status !== 'inactive' || team.members.length !== 2) { + throw new Error('UAR did not materialize the two-member planning team') + } + const firstId = randomUUID() + const first = await request(evaluate, 'prometheus.uar.teams.add_task', { + workspaceId, + teamInstanceId: team.id, + commandId: randomUUID(), + taskId: firstId, + expectedTeamRevision: team.revision, + title: 'Draft the implementation plan', + role: 'coordinator', + input: { brief: 'Outline the delivery' }, + outputContract: { type: 'object' }, + dependsOn: [] + }) + const secondId = randomUUID() + const second = await request(evaluate, 'prometheus.uar.teams.add_task', { + workspaceId, + teamInstanceId: team.id, + commandId: randomUUID(), + taskId: secondId, + expectedTeamRevision: first.revision, + title: 'Prepare the implementation', + role: 'worker', + input: { brief: 'Use the approved plan' }, + outputContract: { type: 'object' }, + dependsOn: [firstId] + }) + const leftId = randomUUID() + const left = await request(evaluate, 'prometheus.uar.teams.add_task', { + workspaceId, + teamInstanceId: team.id, + commandId: randomUUID(), + taskId: leftId, + expectedTeamRevision: second.revision, + title: 'Map part A', + role: 'worker', + input: { partition: 'A' }, + outputContract: { type: 'object' }, + dependsOn: [] + }) + const rightId = randomUUID() + const right = await request(evaluate, 'prometheus.uar.teams.add_task', { + workspaceId, + teamInstanceId: team.id, + commandId: randomUUID(), + taskId: rightId, + expectedTeamRevision: left.revision, + title: 'Map part B', + role: 'worker', + input: { partition: 'B' }, + outputContract: { type: 'object' }, + dependsOn: [] + }) + const reduceId = randomUUID() + await request(evaluate, 'prometheus.uar.teams.add_task', { + workspaceId, + teamInstanceId: team.id, + commandId: randomUUID(), + taskId: reduceId, + expectedTeamRevision: right.revision, + title: 'Reduce mapped parts', + role: 'coordinator', + input: { combine: ['A', 'B'] }, + outputContract: { type: 'object' }, + dependsOn: [leftId, rightId] + }) + const peer = await request(evaluate, 'prometheus.uar.teams.create', { + workspaceId, + commandId: randomUUID(), + deploymentBindingId: binding.id, + teamDefinition: { id: definition.id, version: definition.version, digest: definition.digest }, + input: { brief: 'Record independent peer work' } + }) + const peerLeft = await request(evaluate, 'prometheus.uar.teams.add_task', { + workspaceId, + teamInstanceId: peer.id, + commandId: randomUUID(), + taskId: randomUUID(), + expectedTeamRevision: peer.revision, + title: 'Peer research', + role: 'coordinator', + input: {}, + outputContract: { type: 'object' }, + dependsOn: [] + }) + await request(evaluate, 'prometheus.uar.teams.add_task', { + workspaceId, + teamInstanceId: peer.id, + commandId: randomUUID(), + taskId: randomUUID(), + expectedTeamRevision: peerLeft.revision, + title: 'Peer design', + role: 'worker', + input: {}, + outputContract: { type: 'object' }, + dependsOn: [] + }) + const saved = await request(evaluate, 'prometheus.uar.teams.snapshot', { workspaceId }) + const persisted = saved.instances.find((item) => item.id === team.id) + const savedPeer = saved.instances.find((item) => item.id === peer.id) + if ( + persisted?.tasks.length !== 5 || + !persisted.tasks[1].dependsOn.includes(firstId) || + !persisted.tasks[4].dependsOn.includes(leftId) || + !persisted.tasks[4].dependsOn.includes(rightId) || + savedPeer?.tasks.length !== 2 || + savedPeer.tasks.some((item) => item.dependsOn.length) + ) { + throw new Error('The saved boards lost supervisor, map/reduce, or peer task dependencies') + } + const secondDirectory = mkdtempSync(path.join(os.tmpdir(), 'boss-c09-isolated-')) + const secondWorkspaceResult = await evaluate(`(async () => window.api.dataApi.request({ + id: ${JSON.stringify(randomUUID())}, method: 'POST', path: '/agent-workspaces', + body: { path: ${JSON.stringify(secondDirectory)}, name: 'Cadence isolated team workspace' } + }))()`) + if (secondWorkspaceResult?.error || !secondWorkspaceResult?.data?.id) { + throw new Error('Could not create a second Boss workspace') + } + const otherWorkspaceId = secondWorkspaceResult.data.id + const beforeRestart = await request(evaluate, 'prometheus.uar.teams.snapshot', { workspaceId: otherWorkspaceId }) + if (beforeRestart.instances.some((item) => item.id === team.id)) { + throw new Error('The first team leaked into another workspace') + } + const restart = await request(evaluate, 'prometheus.integration.start', { action: 'uar-restart' }) + const deadline = Date.now() + 90_000 + let restartStatus + while (Date.now() < deadline) { + signal.throwIfAborted() + const state = await request(evaluate, 'prometheus.integration.snapshot', {}) + restartStatus = state.operations.find((item) => item.id === restart.id)?.status + if (restartStatus === 'succeeded') break + if (['failed', 'cancelled', 'interrupted'].includes(restartStatus)) { + throw new Error(`UAR restart finished with status ${restartStatus}`) + } + await delay(250, undefined, { signal }) + } + if (restartStatus !== 'succeeded') throw new Error('UAR restart did not finish within the delivery window') + const recovered = await request(evaluate, 'prometheus.uar.teams.snapshot', { workspaceId }) + const restoredTeam = recovered.instances.find((item) => item.id === team.id) + const restoredPeer = recovered.instances.find((item) => item.id === peer.id) + if ( + restoredTeam?.tasks.length !== 5 || + !restoredTeam.tasks[1].dependsOn.includes(firstId) || + !restoredTeam.tasks[4].dependsOn.includes(leftId) || + !restoredTeam.tasks[4].dependsOn.includes(rightId) || + restoredPeer?.tasks.length !== 2 + ) { + throw new Error('Team planning state did not survive UAR restart') + } + const isolated = await request(evaluate, 'prometheus.uar.teams.snapshot', { workspaceId: otherWorkspaceId }) + if (isolated.instances.some((item) => item.id === team.id)) { + throw new Error('Team planning scope changed after UAR restart') + } + await waitFor( + evaluate, + signal, + `(() => { + const button = [...document.querySelectorAll('button')].find((item) => item.innerText.trim() === 'Set up later'); + if (!button) return false; button.click(); return true; + })()`, + 'Skip onboarding action' + ) + await waitFor(evaluate, signal, `Boolean(document.querySelector('#app-sidebar'))`, 'Main app sidebar') + await request(evaluate, 'navigation.open_route_in_main', { path: '/settings/uar?panel=teams' }) + await waitFor( + evaluate, + signal, + `(() => { + const button = document.querySelector('button[aria-label="Workspace"]'); + if (!button) return false; button.click(); return true; + })()`, + 'UAR workspace selector' + ) + await waitFor( + evaluate, + signal, + `(() => { + const option = [...document.querySelectorAll('[role="option"]')].find((item) => + item.innerText.includes('Cadence team planning')); + if (!option) return false; option.click(); return true; + })()`, + 'Cadence workspace option' + ) + await waitFor(evaluate, signal, `document.body.innerText.includes('Team instances')`, 'UAR Teams settings') + await waitFor( + evaluate, + signal, + `Boolean(document.querySelector('button[aria-label="Choose a team instance"]'))`, + 'Team instance selector' + ) + await waitFor( + evaluate, + signal, + `(() => { + const button = document.querySelector('button[aria-label="Choose a team instance"]'); + if (!button) return false; button.click(); return true; + })()`, + 'Team instance selector action' + ) + await waitFor( + evaluate, + signal, + `(() => { + const option = [...document.querySelectorAll('[role="option"]')].find((item) => + item.innerText.includes(${JSON.stringify(team.id)})); + if (!option) return false; option.click(); return true; + })()`, + 'Saved team option' + ) + await waitFor( + evaluate, + signal, + `document.body.innerText.includes('Draft the implementation plan') && + document.body.innerText.includes('Prepare the implementation')`, + 'Saved task board in Teams settings' + ) + return { + passed: true, + observedBehavior: `Packaged Boss installed planning-only UAR teams ${team.id} and ${peer.id}, saved supervisor, bounded map/reduce and independent peer task graphs, restarted its sidecar, kept workspace ${otherWorkspaceId} isolated, and displayed the recovered board in Teams settings.` + } +} diff --git a/src/main/ai/runtime/uar/UarAdministrationAdapter.ts b/src/main/ai/runtime/uar/UarAdministrationAdapter.ts index ca8080c7ab3..ca9e6564468 100644 --- a/src/main/ai/runtime/uar/UarAdministrationAdapter.ts +++ b/src/main/ai/runtime/uar/UarAdministrationAdapter.ts @@ -303,6 +303,13 @@ const UAR_ADMIN_METHOD_ALLOWLIST = new Set([ 'collaboration.deployment_bindings.preflight\u0000POST\u0000/api/v1/collaboration/deployment-bindings:preflight\u0000owner\u0000read', 'collaboration.deployment_bindings.install\u0000POST\u0000/api/v1/collaboration/deployment-bindings\u0000owner\u0000live', 'collaboration.deployment_bindings.list\u0000GET\u0000/api/v1/collaboration/deployment-bindings\u0000owner\u0000read', + 'team-definitions.list\u0000GET\u0000/api/v1/collaboration/team-definitions\u0000owner\u0000read', + 'team-instances.list\u0000GET\u0000/api/v1/collaboration/team-instances\u0000owner\u0000read', + 'team-instances.create\u0000POST\u0000/api/v1/collaboration/team-instances\u0000owner\u0000live', + 'team-instances.read\u0000GET\u0000/api/v1/collaboration/team-instances/{id}\u0000owner\u0000read', + 'team-instances.tasks.list\u0000GET\u0000/api/v1/collaboration/team-instances/{id}/tasks\u0000owner\u0000read', + 'team-instances.tasks.create\u0000POST\u0000/api/v1/collaboration/team-instances/{id}/tasks\u0000owner\u0000live', + 'team-instances.tasks.read\u0000GET\u0000/api/v1/collaboration/team-instances/{id}/tasks/{taskId}\u0000owner\u0000read', 'agent-instances.list\u0000GET\u0000/api/uar/agent-instances/v1\u0000owner\u0000read', 'agent-instances.read\u0000GET\u0000/api/uar/agent-instances/v1/{id}\u0000owner\u0000read', 'agent-instances.create\u0000POST\u0000/api/uar/agent-instances/v1\u0000owner\u0000live', diff --git a/src/main/ai/runtime/uar/UarStarterAdministrationAdapter.ts b/src/main/ai/runtime/uar/UarStarterAdministrationAdapter.ts index af56ec92a24..3dad44ecfb5 100644 --- a/src/main/ai/runtime/uar/UarStarterAdministrationAdapter.ts +++ b/src/main/ai/runtime/uar/UarStarterAdministrationAdapter.ts @@ -4,9 +4,10 @@ import * as z from 'zod' import { application } from '@application' import type { UarDurableBinding } from '@shared/types/uarDurableAdministration' +import type { UarTeamBinding } from '@shared/types/uarTeams' import { capabilityState, rawBinding, scopedRequest, workspace } from './UarDurableAdministrationAdapter' -import { starterBinding, starterPackage } from './uarStarterDocuments' +import { starterBinding, starterPackage, starterTeamPackage } from './uarStarterDocuments' const bindingPath = '/api/v1/collaboration/deployment-bindings' @@ -157,3 +158,82 @@ export async function setupUarStarterAgent(workspaceId: string): Promise { + const resolved = workspace(workspaceId) + const state = await capabilityState() + const required = [ + 'collaboration.capabilities', + 'collaboration.packages.list', + 'collaboration.packages.preflight', + 'collaboration.packages.install', + 'collaboration.deployment_bindings.preflight', + 'collaboration.deployment_bindings.install', + 'collaboration.deployment_bindings.list' + ] as const + if (required.some((operation) => !state.operations[operation].available)) { + throw new Error('UAR team setup is unavailable') + } + const capabilities = rawCollaborationCapabilities.parse( + await scopedRequest(resolved, '/api/v1/collaboration/capabilities', state.generation) + ) + const starter = starterTeamPackage() + const packages = z + .array(rawPackage) + .parse(await scopedRequest(resolved, '/api/v1/collaboration/packages', state.generation)) + const existingPackage = packages.find( + (record) => record.identity.id === starter.identity.id && record.identity.version === starter.identity.version + ) + if (existingPackage && existingPackage.identity.digest !== starter.identity.digest) { + throw new Error('The installed starter team differs from this Boss release; update the package before setup') + } + if (!existingPackage) { + const request = { commandId: randomUUID(), manifest: starter.manifest, files: starter.files } + await scopedRequest(resolved, '/api/v1/collaboration/packages:preflight', state.generation, 'POST', request) + const installed = z + .object({ preflight: z.object({ package: rawPackage.shape.identity }) }) + .parse(await scopedRequest(resolved, '/api/v1/collaboration/packages:install', state.generation, 'POST', request)) + if (installed.preflight.package.digest !== starter.identity.digest) { + throw new Error('UAR installed a different starter team package revision') + } + } + + const endpoint = await application.get('UarSidecarService').ensureReady() + if (endpoint.generation !== state.generation) throw new Error('UAR sidecar restarted during starter team setup') + const binding = starterBinding({ + ownerId: capabilities.bindingOwnerId, + workspaceId: resolved, + runtimeInstanceId: capabilities.instance.id, + storageBackend: endpoint.storage.profile.backend, + packageIdentity: starter.identity, + bindingId: `urn:boss:starter:team-binding:${resolved}`, + effectiveLimits: { concurrentTurns: 1, maxMembers: 2, maxDepth: 0, maxPendingTasks: 8 } + }) + const existingBindings = z.array(rawBinding).parse(await scopedRequest(resolved, bindingPath, state.generation)) + if (existingBindings.some((candidate) => candidate.workspaceId !== resolved)) { + throw new Error('UAR binding workspace scope mismatch') + } + const existingBinding = existingBindings.find((candidate) => candidate.id === binding.id) + if (existingBinding) { + if (existingBinding.package.digest !== starter.identity.digest) { + throw new Error('The existing starter team binding points to another package') + } + return existingBinding + } + const request = { commandId: randomUUID(), expectedRevision: 0, binding } + await scopedRequest( + resolved, + '/api/v1/collaboration/deployment-bindings:preflight', + state.generation, + 'POST', + request + ) + const installed = z + .object({ binding: rawBinding }) + .parse(await scopedRequest(resolved, bindingPath, state.generation, 'POST', request)) + if (installed.binding.workspaceId !== resolved || installed.binding.package.digest !== starter.identity.digest) { + throw new Error('UAR returned a starter team binding for another workspace or package') + } + return installed.binding +} diff --git a/src/main/ai/runtime/uar/UarTeamsAdministrationAdapter.ts b/src/main/ai/runtime/uar/UarTeamsAdministrationAdapter.ts new file mode 100644 index 00000000000..6ec207aac88 --- /dev/null +++ b/src/main/ai/runtime/uar/UarTeamsAdministrationAdapter.ts @@ -0,0 +1,154 @@ +import * as z from 'zod' + +import type { UarAddTeamTaskInput, UarCreateTeamInput, UarTeamInstance, UarTeamsSnapshot } from '@shared/types/uarTeams' + +import { capabilityState, rawBinding, scopedRequest, workspace } from './UarDurableAdministrationAdapter' + +const basePath = '/api/v1/collaboration/team-instances' +const identity = z.object({ id: z.string(), version: z.string(), digest: z.string() }) +const definition = identity.extend({ + title: z.string(), + purpose: z.string(), + package: identity, + members: z.array( + z.object({ + role: z.string(), + kind: z.enum(['agent', 'team']), + min: z.number().int().nonnegative(), + max: z.number().int().nonnegative(), + definition: identity + }) + ) +}) +const task = z.object({ + id: z.string(), + title: z.string(), + role: z.string(), + input: z.unknown(), + outputContract: z.unknown(), + output: z.null(), + dependsOn: z.array(z.string()), + status: z.literal('queued'), + revision: z.number().int().nonnegative(), + createdAt: z.string(), + updatedAt: z.string() +}) +const instance = z.object({ + id: z.string(), + ownerId: z.string(), + workspaceId: z.string(), + revision: z.number().int().nonnegative(), + status: z.literal('inactive'), + definition: identity, + package: identity, + binding: z.object({ id: z.string(), revision: z.number().int().nonnegative() }), + input: z.unknown(), + members: z.array( + z.object({ + id: z.string(), + role: z.string(), + ordinal: z.number().int().nonnegative(), + definition: identity, + revision: z.number().int().nonnegative(), + status: z.literal('inactive') + }) + ), + tasks: z.array(task), + createdAt: z.string(), + updatedAt: z.string() +}) + +function scopedTeam(value: unknown, workspaceId: string): UarTeamInstance { + const team = instance.parse(value) + if (team.workspaceId !== workspaceId) throw new Error('UAR team workspace scope mismatch') + return team +} + +async function planningState(workspaceId: string) { + const resolved = workspace(workspaceId) + const state = await capabilityState() + const capabilities = z + .object({ + collaboration: z.object({ + activation: z.object({ teamPlanning: z.boolean().default(false) }) + }) + }) + .parse(await scopedRequest(resolved, '/api/v1/collaboration/capabilities', state.generation)) + return { + workspaceId: resolved, + generation: state.generation, + planning: capabilities.collaboration.activation.teamPlanning + } +} + +export async function readUarTeams(workspaceId: string): Promise { + const state = await planningState(workspaceId) + if (!state.planning) { + return { + schemaVersion: 1, + workspaceId: state.workspaceId, + generation: state.generation, + capabilities: { planning: false }, + unavailableReason: 'team_planning_unsupported', + definitions: [], + bindings: [], + instances: [] + } + } + const [definitions, bindings, instances] = await Promise.all([ + scopedRequest(state.workspaceId, '/api/v1/collaboration/team-definitions', state.generation), + scopedRequest(state.workspaceId, '/api/v1/collaboration/deployment-bindings', state.generation), + scopedRequest(state.workspaceId, basePath, state.generation) + ]) + const scopedBindings = z.array(rawBinding).parse(bindings) + if (scopedBindings.some((binding) => binding.workspaceId !== state.workspaceId)) { + throw new Error('UAR team binding workspace scope mismatch') + } + return { + schemaVersion: 1, + workspaceId: state.workspaceId, + generation: state.generation, + capabilities: { planning: true }, + definitions: z.array(definition).parse(definitions), + bindings: scopedBindings, + instances: z + .array(z.unknown()) + .parse(instances) + .map((value) => scopedTeam(value, state.workspaceId)) + } +} + +export async function createUarTeam(input: UarCreateTeamInput): Promise { + const state = await planningState(input.workspaceId) + if (!state.planning) throw new Error('UAR team planning is unavailable') + return scopedTeam( + await scopedRequest(state.workspaceId, basePath, state.generation, 'POST', { + commandId: input.commandId, + deploymentBindingId: input.deploymentBindingId, + teamDefinition: input.teamDefinition, + input: input.input, + ...(input.memberSlots ? { memberSlots: input.memberSlots } : {}) + }), + state.workspaceId + ) +} + +export async function addUarTeamTask(input: UarAddTeamTaskInput): Promise { + const state = await planningState(input.workspaceId) + if (!state.planning) throw new Error('UAR team planning is unavailable') + const target = `${basePath}/${encodeURIComponent(input.teamInstanceId)}` + scopedTeam(await scopedRequest(state.workspaceId, target, state.generation), state.workspaceId) + return scopedTeam( + await scopedRequest(state.workspaceId, `${target}/tasks`, state.generation, 'POST', { + commandId: input.commandId, + taskId: input.taskId, + expectedTeamRevision: input.expectedTeamRevision, + title: input.title, + role: input.role, + input: input.input, + outputContract: input.outputContract, + dependsOn: input.dependsOn + }), + state.workspaceId + ) +} diff --git a/src/main/ai/runtime/uar/index.ts b/src/main/ai/runtime/uar/index.ts index 55dac3e5771..6aebf6a3085 100644 --- a/src/main/ai/runtime/uar/index.ts +++ b/src/main/ai/runtime/uar/index.ts @@ -12,7 +12,8 @@ export { createUarDurableObserver, readUarDurableWorkspace } from './UarDurableAdministrationAdapter' -export { setupUarStarterAgent } from './UarStarterAdministrationAdapter' +export { addUarTeamTask, createUarTeam, readUarTeams } from './UarTeamsAdministrationAdapter' +export { setupUarStarterAgent, setupUarStarterTeam } from './UarStarterAdministrationAdapter' export { deleteUarProvider, readUarModelSources, diff --git a/src/main/ai/runtime/uar/uarStarterDocuments.ts b/src/main/ai/runtime/uar/uarStarterDocuments.ts index fdeec891689..3c929c6b6fc 100644 --- a/src/main/ai/runtime/uar/uarStarterDocuments.ts +++ b/src/main/ai/runtime/uar/uarStarterDocuments.ts @@ -91,19 +91,121 @@ export function starterPackage() { } } +/** A separate immutable planning package; installing it never changes the existing starter agent binding. */ +export function starterTeamPackage() { + const starter = starterPackage() + const agentSource = starter.files[agentPath] + const agent = JSON.parse(agentSource) as { id: string; version: string; contentDigest: string } + const agentRef = { id: agent.id, version: agent.version, digest: agent.contentDigest } + const teamId = 'urn:boss:starter:team' + const teamPath = 'team-definition.json' + const workflowPath = 'workflow-definition.json' + const workflow = document({ + profile, + kind: 'WorkflowDefinition', + id: 'urn:boss:starter:workflow', + version, + provenance: { source: 'The Boss built-in starter team', authors: ['The Boss'] }, + requiredCapabilities: [], + extensions: {}, + title: 'Plan a workspace task', + input: { type: 'object' }, + output: { type: 'object' }, + steps: [ + { + id: 'plan', + role: 'coordinator', + dependsOn: [], + inputMapping: {}, + output: { type: 'object' }, + effect: 'none', + approval: 'none', + retry: { maxAttempts: 1, onUnknownEffect: 'reconcile-before-retry' }, + completion: 'artifact', + instructions: 'Produce a plan for the workspace task.' + } + ], + failurePolicy: 'stop-dependent', + maxActivations: 1 + }) + const workflowSource = JSON.stringify(workflow) + const workflowRef = { id: workflow.id, version: workflow.version, digest: workflow.contentDigest } + const team = document({ + profile, + kind: 'TeamDefinition', + id: teamId, + version, + provenance: { source: 'The Boss built-in starter team', authors: ['The Boss'] }, + requiredCapabilities: [], + extensions: {}, + title: 'Starter planning team', + purpose: 'Plan a workspace task with a coordinator and a worker.', + members: [ + { role: 'coordinator', kind: 'agent', definition: agentRef, min: 1, max: 1, responsibility: 'Define the plan.' }, + { + role: 'worker', + kind: 'agent', + definition: agentRef, + min: 1, + max: 1, + responsibility: 'Prepare the assigned work.' + } + ], + coordinatorRole: 'coordinator', + communication: [], + taskAcceptance: { mode: 'operator', allowedWorkflows: [workflowRef] }, + routing: { eligibilityFirst: true, strategy: 'operator-role-capacity-cost-stable-id', explain: true }, + limits: { concurrentTurns: 1, maxMembers: 2, maxDepth: 0, maxPendingTasks: 8 }, + budget: { maxTokens: 10000, maxCostMicrounits: 1000000, currency: 'USD', maxElapsedSeconds: 300 }, + input: { type: 'object' }, + output: { type: 'object' } + }) + const teamSource = JSON.stringify(team) + const teamRef = { id: team.id, version: team.version, digest: team.contentDigest } + const manifest = document({ + profile, + kind: 'PackageManifest', + id: 'urn:boss:starter:team-package', + version, + provenance: { source: 'The Boss built-in starter team', authors: ['The Boss'] }, + requiredCapabilities: ['collaboration_definition_packages_v2'], + extensions: {}, + entrypoints: [teamRef], + files: [ + { path: agentPath, kind: 'AgentDefinition', definition: agentRef, byteDigest: digest(agentSource) }, + { path: teamPath, kind: 'TeamDefinition', definition: teamRef, byteDigest: digest(teamSource) }, + { path: workflowPath, kind: 'WorkflowDefinition', definition: workflowRef, byteDigest: digest(workflowSource) } + ], + lock: [ + { requestedBy: teamId, reference: agentRef, resolvedPath: agentPath }, + { requestedBy: teamId, reference: workflowRef, resolvedPath: workflowPath } + ], + capabilityDeclarations: [{ capability: 'collaboration_definition_packages_v2', required: true }], + resolution: 'exact-version-and-digest' + }) + return { + identity: { id: manifest.id, version: manifest.version, digest: manifest.contentDigest }, + definition: teamRef, + manifest: JSON.stringify(manifest), + files: { [agentPath]: agentSource, [teamPath]: teamSource, [workflowPath]: workflowSource } + } +} + export function starterBinding(input: { ownerId: string workspaceId: string runtimeInstanceId: string - providerId: string - modelId: string + providerId?: string + modelId?: string storageBackend: 'embedded' | 'remote' packageIdentity: { id: string; version: string; digest: string } + bindingId?: string + effectiveLimits?: typeof limits }) { return document({ profile, kind: 'DeploymentBinding', - id: `urn:boss:starter:binding:${input.workspaceId}`, + id: input.bindingId ?? `urn:boss:starter:binding:${input.workspaceId}`, version, provenance, requiredCapabilities: ['collaboration_deployment_bindings_v2'], @@ -114,14 +216,17 @@ export function starterBinding(input: { workspaceId: input.workspaceId, runtimeInstanceId: input.runtimeInstanceId, revision: 1, - modelBindings: [ - { - requestedAlias: 'local-default', - providerId: input.providerId, - modelId: input.modelId, - credentialRef: `protected-credential://uar/provider/${input.providerId}` - } - ], + modelBindings: + input.providerId && input.modelId + ? [ + { + requestedAlias: 'local-default', + providerId: input.providerId, + modelId: input.modelId, + credentialRef: `protected-credential://uar/provider/${input.providerId}` + } + ] + : [], skillBindings: [], storage: { backend: input.storageBackend === 'embedded' ? 'surrealkv' : 'surrealdb', @@ -129,7 +234,7 @@ export function starterBinding(input: { durableTransactions: true }, policyRevision: 'boss-starter-v1', - effectiveLimits: limits, + effectiveLimits: input.effectiveLimits ?? limits, effectiveBudget: { maxTokens: 4096, maxCostMicrounits: 100000, currency: 'USD', maxElapsedSeconds: 120 }, contextGrants: [], representationGrantRefs: [], diff --git a/src/main/core/preboot/userDataLocation.ts b/src/main/core/preboot/userDataLocation.ts index 0ef74e34e22..7bbb5f9f742 100644 --- a/src/main/core/preboot/userDataLocation.ts +++ b/src/main/core/preboot/userDataLocation.ts @@ -59,6 +59,15 @@ export function resolveUserDataLocation(): void { return } + const explicitDirectory = process.argv.find((argument) => argument.startsWith('--user-data-dir=')) + if (explicitDirectory) { + const selected = canonicalizeUserDataPath(explicitDirectory.slice('--user-data-dir='.length)) + if (!isUsableDataDir(selected)) throw new Error(`userData directory is unavailable: ${selected}`) + app.setPath('userData', selected) + logger.info('userData set from explicit launch directory', { selected }) + return + } + const exe = getNormalizedExecutablePath() const resolved = bootConfigService.get('app.user_data_path')?.[exe] if (resolved && isUsableDataDir(resolved)) { diff --git a/src/main/ipc/handlers/prometheus.ts b/src/main/ipc/handlers/prometheus.ts index efce1dfa1dc..4dcd20441b4 100644 --- a/src/main/ipc/handlers/prometheus.ts +++ b/src/main/ipc/handlers/prometheus.ts @@ -1,5 +1,6 @@ import { application } from '@application' import { + addUarTeamTask, acknowledgeUarDurableGap, actOnUarDurableInstance, actOnUarDurableObserver, @@ -7,6 +8,7 @@ import { cancelUarRun, createUarDurableInstance, createUarDurableObserver, + createUarTeam, createUarKnowledgeBase, createUarMemory, deleteUarA2uiComponent, @@ -20,6 +22,7 @@ import { diagnoseUarAuthority, readUarAdministrationSnapshot, readUarDurableWorkspace, + readUarTeams, readUarOperations, readUarRunDetail, readUarCatalog, @@ -38,6 +41,7 @@ import { saveUarConversationPolicy, saveUarProvider, setupUarStarterAgent, + setupUarStarterTeam, searchUarKnowledge, uploadUarKnowledgeDocument, setDefaultUarProvider, @@ -141,6 +145,10 @@ const prometheusHandlerImplementations: IpcHandlersFor readUarAdministrationSnapshot(), 'prometheus.uar.durable.read': async ({ workspaceId }) => readUarDurableWorkspace(workspaceId), + 'prometheus.uar.teams.snapshot': async ({ workspaceId }) => readUarTeams(workspaceId), + 'prometheus.uar.teams.setup_starter': async ({ workspaceId }) => setupUarStarterTeam(workspaceId), + 'prometheus.uar.teams.create': async (input) => createUarTeam(input), + 'prometheus.uar.teams.add_task': async (input) => addUarTeamTask(input), 'prometheus.uar.durable.setup_starter': async ({ workspaceId }) => setupUarStarterAgent(workspaceId), 'prometheus.uar.durable.create_instance': async (input) => createUarDurableInstance(input), 'prometheus.uar.durable.instance_action': async (input) => actOnUarDurableInstance(input), diff --git a/src/renderer/i18n/locales/de-de.json b/src/renderer/i18n/locales/de-de.json index 7fd05e87f13..528aef3468e 100644 --- a/src/renderer/i18n/locales/de-de.json +++ b/src/renderer/i18n/locales/de-de.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Laufzeiteinstellungen", "settings.prometheus.integration.uarAdmin.surface.security": "Sicherheit", "settings.prometheus.integration.uarAdmin.surface.skills": "Skills", + "settings.prometheus.integration.uarAdmin.surface.teams": "Teams", "settings.prometheus.integration.uarAdmin.surface.tools": "Werkzeuge und MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Verfügbare UAR-REST-Vorgänge, Zugriffsbereich und Zeitpunkt der Wirksamkeit von Änderungen.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Geplante Aufgabe hinzufügen", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Definieren Sie eine Aufgabe und ihre Abhängigkeiten. Die Planung startet keine Ausführung.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Aufgabe planen", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "Aufgabe wird hinzugefügt…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Bereitstellungsbindung", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Wählen Sie eine Bereitstellungsbindung", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Teamdefinition auswählen", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Teaminstanz auswählen", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Rolle auswählen", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Wählen Sie eine unveränderliche Definition und eine passende Bereitstellungsbindung.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Teaminstanz erstellen", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Team erstellen", + "settings.prometheus.integration.uarAdmin.teams.creating": "Team wird erstellt…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Teamdefinition", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Abhängig von", + "settings.prometheus.integration.uarAdmin.teams.description": "Erstellen Sie ein Team und planen Sie abhängige Aufgaben für diesen Arbeitsbereich.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Prüfsumme", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Mitglieder und geplante Arbeit eines Teams ansehen.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Teaminstanzen", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "Der Ausgabevertrag muss ein JSON-Objekt sein.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "Die Aufgabeneingabe muss gültiges JSON sein.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "Die Teameingabe muss gültiges JSON sein.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Mitglieder", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "In diesem Arbeitsbereich sind keine Bereitstellungsbindungen verfügbar.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "Keine Teamdefinitionen installiert.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "Keine früheren Aufgaben als Abhängigkeit.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "Keine Teaminstanzen in diesem Arbeitsbereich.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "Dieses Team hat keine Mitglieder.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "Noch keine Aufgaben geplant.", + "settings.prometheus.integration.uarAdmin.teams.none": "Keine", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Ausgabevertrag (JSON-Schema)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "Teamplanung ist nicht verfügbar.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Prüfen Sie die Details und versuchen Sie es erneut.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Überarbeitung", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "Starter-Team wird eingerichtet…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Starter-Team einrichten", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "Das Starter-Team ist einsatzbereit.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Aufgabe zum Plan hinzugefügt.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "Abhängigkeiten zeigen die vor der Ausführung erforderliche Reihenfolge.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Aufgabenübersicht", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "Eingabe und Ausgabevertrag anzeigen", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Aufgabeneingabe (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Zugewiesene Rolle", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "In Warteschlange", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Aufgabentitel", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Teaminstanz erstellt.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Teameingabe (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "Die Eingabe wird mit der Teaminstanz gespeichert.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Inaktiv", + "settings.prometheus.integration.uarAdmin.teams.title": "Teams", "settings.prometheus.integration.uarApplied": "Der laufende Sidecar verwendet die gespeicherte Konfiguration", "settings.prometheus.integration.uarApplyHelp": "Speichern Sie zuerst die Konfigurationsänderungen und wenden Sie sie dann an, um den Sidecar neu zu starten. Aktive UAR-Läufe blockieren Anwenden und Neustart.", "settings.prometheus.integration.uarApplyRequired": "Gespeicherte Änderungen wurden noch nicht auf den laufenden Sidecar angewendet", diff --git a/src/renderer/i18n/locales/el-gr.json b/src/renderer/i18n/locales/el-gr.json index ab16d957f6c..1c021e5e705 100644 --- a/src/renderer/i18n/locales/el-gr.json +++ b/src/renderer/i18n/locales/el-gr.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Ρυθμίσεις περιβάλλοντος", "settings.prometheus.integration.uarAdmin.surface.security": "Ασφάλεια", "settings.prometheus.integration.uarAdmin.surface.skills": "Δεξιότητες", + "settings.prometheus.integration.uarAdmin.surface.teams": "Ομάδες", "settings.prometheus.integration.uarAdmin.surface.tools": "Εργαλεία και MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Διαθέσιμες λειτουργίες REST του UAR, εύρος πρόσβασης και χρόνος εφαρμογής των αλλαγών.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Προσθήκη προγραμματισμένης εργασίας", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Ορίστε μια εργασία και τις εξαρτήσεις της. Ο σχεδιασμός δεν ξεκινά την εκτέλεση.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Σχεδιασμός εργασίας", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "Προσθήκη εργασίας…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Δέσμευση ανάπτυξης", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Επιλέξτε μια δέσμευση ανάπτυξης", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Επιλογή ορισμού ομάδας", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Επιλογή παρουσίας ομάδας", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Επιλογή ρόλου", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Επιλέξτε αμετάβλητο ορισμό και αντίστοιχη σύνδεση ανάπτυξης.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Δημιουργία παρουσίας ομάδας", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Δημιουργία ομάδας", + "settings.prometheus.integration.uarAdmin.teams.creating": "Δημιουργία ομάδας…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Ορισμός ομάδας", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Εξαρτάται από", + "settings.prometheus.integration.uarAdmin.teams.description": "Δημιουργήστε ομάδα και σχεδιάστε εξαρτημένες εργασίες για αυτόν τον χώρο εργασίας.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Αποτύπωμα", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Δείτε μέλη και προγραμματισμένη εργασία μιας ομάδας.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Παρουσίες ομάδων", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "Η σύμβαση εξόδου πρέπει να είναι αντικείμενο JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "Η είσοδος εργασίας πρέπει να είναι έγκυρο JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "Η είσοδος ομάδας πρέπει να είναι έγκυρο JSON.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Μέλη", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "Δεν υπάρχουν διαθέσιμες δεσμεύσεις ανάπτυξης σε αυτόν τον χώρο εργασίας.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "Δεν υπάρχουν εγκατεστημένοι ορισμοί ομάδων.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "Δεν υπάρχουν προηγούμενες εργασίες για εξάρτηση.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "Δεν υπάρχουν παρουσίες ομάδων σε αυτόν τον χώρο εργασίας.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "Αυτή η ομάδα δεν έχει μέλη.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "Δεν έχουν σχεδιαστεί εργασίες.", + "settings.prometheus.integration.uarAdmin.teams.none": "Χωρίς", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Σύμβαση εξόδου (Σχήμα JSON)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "Ο σχεδιασμός ομάδας δεν είναι διαθέσιμος.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Ελέγξτε τις λεπτομέρειες και δοκιμάστε ξανά.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Αναθεώρηση", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "Ρύθμιση αρχικής ομάδας…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Ρύθμιση αρχικής ομάδας", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "Η αρχική ομάδα είναι έτοιμη.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Η εργασία προστέθηκε στο σχέδιο.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "Οι εξαρτήσεις δείχνουν τη σειρά που απαιτείται πριν από την εκτέλεση.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Πίνακας εργασιών", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "Προβολή εισόδου και σύμβασης εξόδου", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Είσοδος εργασίας (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Ανατεθειμένος ρόλος", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "Σε αναμονή", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Τίτλος εργασίας", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Η παρουσία ομάδας δημιουργήθηκε.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Είσοδος ομάδας (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "Η είσοδος αποθηκεύεται με την παρουσία ομάδας.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Ανενεργή", + "settings.prometheus.integration.uarAdmin.teams.title": "Ομάδες", "settings.prometheus.integration.uarApplied": "Το ενεργό sidecar χρησιμοποιεί την αποθηκευμένη διαμόρφωση", "settings.prometheus.integration.uarApplyHelp": "Αποθηκεύστε πρώτα τις αλλαγές διαμόρφωσης και μετά εφαρμόστε τις για επανεκκίνηση του sidecar. Οι ενεργές εκτελέσεις UAR εμποδίζουν την εφαρμογή και την επανεκκίνηση.", "settings.prometheus.integration.uarApplyRequired": "Οι αποθηκευμένες αλλαγές δεν έχουν εφαρμοστεί στο ενεργό sidecar", diff --git a/src/renderer/i18n/locales/en-us.json b/src/renderer/i18n/locales/en-us.json index c865d829d17..6aa4003ab0e 100644 --- a/src/renderer/i18n/locales/en-us.json +++ b/src/renderer/i18n/locales/en-us.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Runtime settings", "settings.prometheus.integration.uarAdmin.surface.security": "Security", "settings.prometheus.integration.uarAdmin.surface.skills": "Skills", + "settings.prometheus.integration.uarAdmin.surface.teams": "Teams", "settings.prometheus.integration.uarAdmin.surface.tools": "Tools and MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Available UAR REST operations, access scope, and when changes take effect.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Add planned task", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Define a task and its dependencies. Planning does not start execution.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Plan a task", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "Adding task…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Deployment binding", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Choose a deployment binding", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Choose a team definition", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Choose a team instance", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Choose a role", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Choose an immutable definition and matching deployment binding.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Create team instance", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Create a team", + "settings.prometheus.integration.uarAdmin.teams.creating": "Creating team…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Team definition", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Depends on", + "settings.prometheus.integration.uarAdmin.teams.description": "Create a team and plan dependent tasks for this workspace.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Digest", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Inspect members and planned work for a team.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Team instances", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "Output contract must be a JSON object.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "Task input must be valid JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "Team input must be valid JSON.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Members", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "No deployment bindings are available in this workspace.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "No team definitions are installed.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "No earlier tasks to depend on.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "No team instances in this workspace.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "This team has no members.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "No tasks have been planned.", + "settings.prometheus.integration.uarAdmin.teams.none": "None", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Output contract (JSON Schema)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "Team planning is unavailable.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Review the details and try again.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Revision", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "Setting up starter team…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Set up starter team", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "Starter team is ready to use.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Task added to the plan.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "Dependencies show the order required before execution.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Task board", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "View input and output contract", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Task input (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Assigned role", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "Queued", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Task title", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Team instance created.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Team input (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "Input is stored with the team instance.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Inactive", + "settings.prometheus.integration.uarAdmin.teams.title": "Teams", "settings.prometheus.integration.uarApplied": "The running sidecar uses the saved configuration", "settings.prometheus.integration.uarApplyHelp": "Save configuration changes first, then apply them to restart the sidecar. Active UAR runs block apply and restart.", "settings.prometheus.integration.uarApplyRequired": "Saved changes have not been applied to the running sidecar", diff --git a/src/renderer/i18n/locales/es-es.json b/src/renderer/i18n/locales/es-es.json index 991d57d077b..cf092e1641e 100644 --- a/src/renderer/i18n/locales/es-es.json +++ b/src/renderer/i18n/locales/es-es.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Ajustes del entorno", "settings.prometheus.integration.uarAdmin.surface.security": "Seguridad", "settings.prometheus.integration.uarAdmin.surface.skills": "Habilidades", + "settings.prometheus.integration.uarAdmin.surface.teams": "Equipos", "settings.prometheus.integration.uarAdmin.surface.tools": "Herramientas y MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Operaciones REST de UAR disponibles, ámbito de acceso y momento en que se aplican los cambios.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Añadir tarea planificada", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Define una tarea y sus dependencias. Planificar no inicia la ejecución.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Planificar una tarea", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "Añadiendo tarea…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Enlace de implementación", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Elija un enlace de implementación", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Elegir definición de equipo", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Elegir instancia de equipo", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Elegir un rol", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Elige una definición inmutable y una vinculación de despliegue compatible.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Crear instancia de equipo", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Crear un equipo", + "settings.prometheus.integration.uarAdmin.teams.creating": "Creando equipo…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Definición de equipo", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Depende de", + "settings.prometheus.integration.uarAdmin.teams.description": "Crea un equipo y planifica tareas dependientes para este espacio de trabajo.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Huella digital", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Consulta los miembros y el trabajo planificado de un equipo.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Instancias de equipo", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "El contrato de salida debe ser un objeto JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "La entrada de la tarea debe ser JSON válido.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "La entrada del equipo debe ser JSON válido.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Miembros", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "No hay enlaces de implementación disponibles en este espacio de trabajo.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "No hay definiciones de equipo instaladas.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "No hay tareas anteriores de las que depender.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "No hay instancias de equipo en este espacio de trabajo.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "Este equipo no tiene miembros.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "No se han planificado tareas.", + "settings.prometheus.integration.uarAdmin.teams.none": "Ninguno", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Contrato de salida (esquema JSON)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "La planificación de equipos no está disponible.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Revisa los detalles e inténtalo de nuevo.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Revisión", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "Configurando equipo inicial…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Configurar equipo inicial", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "El equipo inicial está listo para usarse.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Tarea añadida al plan.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "Las dependencias muestran el orden necesario antes de ejecutar.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Tablero de tareas", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "Ver entrada y contrato de salida", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Entrada de la tarea (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Rol asignado", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "En cola", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Título de la tarea", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Instancia de equipo creada.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Entrada del equipo (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "La entrada se guarda con la instancia de equipo.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Inactivo", + "settings.prometheus.integration.uarAdmin.teams.title": "Equipos", "settings.prometheus.integration.uarApplied": "El sidecar en ejecución usa la configuración guardada", "settings.prometheus.integration.uarApplyHelp": "Guarda primero los cambios de configuración y aplícalos después para reiniciar el sidecar. Las ejecuciones activas de UAR impiden aplicar y reiniciar.", "settings.prometheus.integration.uarApplyRequired": "Los cambios guardados no se han aplicado al sidecar en ejecución", diff --git a/src/renderer/i18n/locales/fr-fr.json b/src/renderer/i18n/locales/fr-fr.json index 559e8fd1a86..3e02ba321b7 100644 --- a/src/renderer/i18n/locales/fr-fr.json +++ b/src/renderer/i18n/locales/fr-fr.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Paramètres du moteur", "settings.prometheus.integration.uarAdmin.surface.security": "Sécurité", "settings.prometheus.integration.uarAdmin.surface.skills": "Compétences", + "settings.prometheus.integration.uarAdmin.surface.teams": "Équipes", "settings.prometheus.integration.uarAdmin.surface.tools": "Outils et MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Opérations REST UAR disponibles, portée d’accès et moment d’application des modifications.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Ajouter une tâche planifiée", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Définissez une tâche et ses dépendances. La planification ne lance pas son exécution.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Planifier une tâche", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "Ajout de la tâche…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Liaison de déploiement", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Choisir une liaison de déploiement", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Choisir une définition d’équipe", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Choisir une instance d’équipe", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Choisir un rôle", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Choisissez une définition immuable et une liaison de déploiement correspondante.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Créer une instance d’équipe", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Créer une équipe", + "settings.prometheus.integration.uarAdmin.teams.creating": "Création de l’équipe…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Définition d’équipe", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Dépend de", + "settings.prometheus.integration.uarAdmin.teams.description": "Créez une équipe et planifiez des tâches dépendantes pour cet espace de travail.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Empreinte", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Consultez les membres et le travail planifié d’une équipe.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Instances d’équipe", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "Le contrat de sortie doit être un objet JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "L’entrée de la tâche doit être un JSON valide.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "L’entrée de l’équipe doit être un JSON valide.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Membres", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "Aucune liaison de déploiement n'est disponible dans cet espace de travail.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "Aucune définition d’équipe installée.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "Aucune tâche précédente dont dépendre.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "Aucune instance d’équipe dans cet espace de travail.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "Cette équipe ne compte aucun membre.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "Aucune tâche planifiée.", + "settings.prometheus.integration.uarAdmin.teams.none": "Aucun", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Contrat de sortie (schéma JSON)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "La planification des équipes est indisponible.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Vérifiez les détails et réessayez.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Révision", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "Configuration de l’équipe de départ…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Configurer l’équipe de départ", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "L’équipe de départ est prête.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Tâche ajoutée au plan.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "Les dépendances indiquent l’ordre requis avant l’exécution.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Tableau des tâches", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "Afficher l’entrée et le contrat de sortie", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Entrée de la tâche (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Rôle attribué", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "En attente", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Titre de la tâche", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Instance d’équipe créée.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Entrée de l’équipe (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "L’entrée est enregistrée avec l’instance d’équipe.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Inactive", + "settings.prometheus.integration.uarAdmin.teams.title": "Équipes", "settings.prometheus.integration.uarApplied": "Le sidecar en cours d’exécution utilise la configuration enregistrée", "settings.prometheus.integration.uarApplyHelp": "Enregistrez d’abord les modifications de configuration, puis appliquez-les pour redémarrer le sidecar. Les exécutions UAR actives bloquent l’application et le redémarrage.", "settings.prometheus.integration.uarApplyRequired": "Les modifications enregistrées n’ont pas été appliquées au sidecar en cours d’exécution", diff --git a/src/renderer/i18n/locales/ja-jp.json b/src/renderer/i18n/locales/ja-jp.json index 09a3e222b7b..8487eaad02f 100644 --- a/src/renderer/i18n/locales/ja-jp.json +++ b/src/renderer/i18n/locales/ja-jp.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "ランタイム設定", "settings.prometheus.integration.uarAdmin.surface.security": "セキュリティ", "settings.prometheus.integration.uarAdmin.surface.skills": "スキル", + "settings.prometheus.integration.uarAdmin.surface.teams": "チーム", "settings.prometheus.integration.uarAdmin.surface.tools": "ツールと MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "利用可能な UAR REST 操作、アクセス範囲、変更が反映されるタイミングです。", + "settings.prometheus.integration.uarAdmin.teams.addTask": "計画済みタスクを追加", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "タスクと依存関係を定義します。計画だけでは実行は始まりません。", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "タスクを計画", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "タスクを追加中…", + "settings.prometheus.integration.uarAdmin.teams.binding": "デプロイメントバインディング", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "デプロイメント バインディングを選択する", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "チーム定義を選択", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "チームインスタンスを選択", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "役割を選択", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "変更できない定義と対応するデプロイバインディングを選択します。", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "チームインスタンスを作成", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "チームを作成", + "settings.prometheus.integration.uarAdmin.teams.creating": "チームを作成中…", + "settings.prometheus.integration.uarAdmin.teams.definition": "チーム定義", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "依存先", + "settings.prometheus.integration.uarAdmin.teams.description": "このワークスペースのチームを作成し、依存関係のあるタスクを計画します。", + "settings.prometheus.integration.uarAdmin.teams.digest": "ダイジェスト", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "チームのメンバーと計画済みの作業を確認します。", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "チームインスタンス", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "出力契約は JSON オブジェクトである必要があります。", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "タスク入力は有効な JSON である必要があります。", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "チーム入力は有効な JSON である必要があります。", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "メンバー", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "このワークスペースでは使用できるデプロイメント バインディングはありません。", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "チーム定義がインストールされていません。", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "依存先となる先行タスクはありません。", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "このワークスペースにチームインスタンスはありません。", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "このチームにメンバーはいません。", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "計画済みタスクはありません。", + "settings.prometheus.integration.uarAdmin.teams.none": "無", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "出力契約(JSON Schema)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "チーム計画は利用できません。", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "詳細を確認して再試行してください。", + "settings.prometheus.integration.uarAdmin.teams.revision": "改訂", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "初期チームを設定中…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "初期チームを設定", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "初期チームを利用できます。", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "タスクを計画に追加しました。", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "依存関係は実行前に必要な順序を示します。", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "タスクボード", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "入力と出力契約を表示", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "タスク入力(JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "割り当てられた役割", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "待機中", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "タスク名", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "チームインスタンスを作成しました。", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "チーム入力(JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "入力はチームインスタンスとともに保存されます。", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "非アクティブ", + "settings.prometheus.integration.uarAdmin.teams.title": "チーム", "settings.prometheus.integration.uarApplied": "実行中のサイドカーは保存済みの設定を使用しています", "settings.prometheus.integration.uarApplyHelp": "最初に設定変更を保存し、適用してサイドカーを再起動します。UAR の実行中は適用と再起動がブロックされます。", "settings.prometheus.integration.uarApplyRequired": "保存済みの変更は実行中のサイドカーにまだ適用されていません", diff --git a/src/renderer/i18n/locales/pt-pt.json b/src/renderer/i18n/locales/pt-pt.json index 4601872e0cd..b4e8f325362 100644 --- a/src/renderer/i18n/locales/pt-pt.json +++ b/src/renderer/i18n/locales/pt-pt.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Definições do runtime", "settings.prometheus.integration.uarAdmin.surface.security": "Segurança", "settings.prometheus.integration.uarAdmin.surface.skills": "Competências", + "settings.prometheus.integration.uarAdmin.surface.teams": "Equipas", "settings.prometheus.integration.uarAdmin.surface.tools": "Ferramentas e MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Operações REST do UAR disponíveis, âmbito de acesso e momento em que as alterações entram em vigor.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Adicionar tarefa planeada", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Defina uma tarefa e as suas dependências. O planeamento não inicia a execução.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Planear uma tarefa", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "A adicionar tarefa…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Vinculação de implantação", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Escolha uma ligação de implantação", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Escolher definição da equipa", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Escolher instância da equipa", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Escolher função", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Escolha uma definição imutável e uma associação de implementação correspondente.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Criar instância da equipa", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Criar uma equipa", + "settings.prometheus.integration.uarAdmin.teams.creating": "A criar equipa…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Definição da equipa", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Depende de", + "settings.prometheus.integration.uarAdmin.teams.description": "Crie uma equipa e planeie tarefas dependentes para este espaço de trabalho.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Resumo criptográfico", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Veja os membros e o trabalho planeado de uma equipa.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Instâncias da equipa", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "O contrato de saída tem de ser um objeto JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "A entrada da tarefa tem de ser JSON válido.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "A entrada da equipa tem de ser JSON válido.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Membros", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "Nenhuma ligação de implementação está disponível neste espaço de trabalho.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "Não há definições de equipa instaladas.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "Não há tarefas anteriores das quais depender.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "Não há instâncias de equipa neste espaço de trabalho.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "Esta equipa não tem membros.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "Não há tarefas planeadas.", + "settings.prometheus.integration.uarAdmin.teams.none": "Nenhum", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Contrato de saída (esquema JSON)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "O planeamento de equipas está indisponível.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Reveja os detalhes e tente novamente.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Revisão", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "A configurar equipa inicial…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Configurar equipa inicial", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "A equipa inicial está pronta a usar.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Tarefa adicionada ao plano.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "As dependências mostram a ordem necessária antes da execução.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Quadro de tarefas", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "Ver entrada e contrato de saída", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Entrada da tarefa (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Função atribuída", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "Em fila", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Título da tarefa", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Instância da equipa criada.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Entrada da equipa (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "A entrada é guardada com a instância da equipa.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Inativa", + "settings.prometheus.integration.uarAdmin.teams.title": "Equipas", "settings.prometheus.integration.uarApplied": "O sidecar em execução utiliza a configuração guardada", "settings.prometheus.integration.uarApplyHelp": "Guarde primeiro as alterações de configuração e, em seguida, aplique-as para reiniciar o sidecar. As execuções UAR ativas bloqueiam a aplicação e o reinício.", "settings.prometheus.integration.uarApplyRequired": "As alterações guardadas ainda não foram aplicadas ao sidecar em execução", diff --git a/src/renderer/i18n/locales/ro-ro.json b/src/renderer/i18n/locales/ro-ro.json index 53d07870a09..388bffdb55b 100644 --- a/src/renderer/i18n/locales/ro-ro.json +++ b/src/renderer/i18n/locales/ro-ro.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Setări de execuție", "settings.prometheus.integration.uarAdmin.surface.security": "Securitate", "settings.prometheus.integration.uarAdmin.surface.skills": "Abilități", + "settings.prometheus.integration.uarAdmin.surface.teams": "Echipe", "settings.prometheus.integration.uarAdmin.surface.tools": "Instrumente și MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Operațiuni REST UAR disponibile, domeniul de acces și momentul aplicării modificărilor.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Adaugă sarcină planificată", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Definește o sarcină și dependențele ei. Planificarea nu pornește execuția.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Planifică o sarcină", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "Se adaugă sarcina…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Legarea de implementare", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Alegeți o legătură de implementare", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Alege definiția echipei", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Alege instanța echipei", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Alege un rol", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Alege o definiție imuabilă și o asociere de implementare compatibilă.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Creează instanța echipei", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Creează o echipă", + "settings.prometheus.integration.uarAdmin.teams.creating": "Se creează echipa…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Definiția echipei", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Depinde de", + "settings.prometheus.integration.uarAdmin.teams.description": "Creează o echipă și planifică sarcini dependente pentru acest spațiu de lucru.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Amprentă", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Consultă membrii și lucrările planificate ale unei echipe.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Instanțe ale echipei", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "Contractul de ieșire trebuie să fie un obiect JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "Intrarea sarcinii trebuie să fie JSON valid.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "Intrarea echipei trebuie să fie JSON valid.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Membri", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "Nu sunt disponibile legături de implementare în acest spațiu de lucru.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "Nu sunt instalate definiții de echipă.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "Nu există sarcini anterioare de care să depindă.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "Nu există instanțe ale echipei în acest spațiu de lucru.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "Această echipă nu are membri.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "Nu sunt sarcini planificate.", + "settings.prometheus.integration.uarAdmin.teams.none": "Nimic", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Contract de ieșire (schemă JSON)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "Planificarea echipei nu este disponibilă.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Verifică detaliile și încearcă din nou.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Revizuire", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "Se configurează echipa inițială…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Configurează echipa inițială", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "Echipa inițială este gata de utilizare.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Sarcina a fost adăugată în plan.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "Dependențele indică ordinea necesară înainte de execuție.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Panou de sarcini", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "Vezi intrarea și contractul de ieșire", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Intrarea sarcinii (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Rol atribuit", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "În așteptare", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Titlul sarcinii", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Instanța echipei a fost creată.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Intrarea echipei (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "Intrarea este stocată cu instanța echipei.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Inactivă", + "settings.prometheus.integration.uarAdmin.teams.title": "Echipe", "settings.prometheus.integration.uarApplied": "Sidecar-ul activ folosește configurația salvată", "settings.prometheus.integration.uarApplyHelp": "Salvează mai întâi modificările de configurare, apoi aplică-le pentru a reporni sidecar-ul. Rulările UAR active blochează aplicarea și repornirea.", "settings.prometheus.integration.uarApplyRequired": "Modificările salvate nu au fost aplicate sidecar-ului activ", diff --git a/src/renderer/i18n/locales/ru-ru.json b/src/renderer/i18n/locales/ru-ru.json index 6fe8d21810a..6af0cc5e35a 100644 --- a/src/renderer/i18n/locales/ru-ru.json +++ b/src/renderer/i18n/locales/ru-ru.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Настройки среды", "settings.prometheus.integration.uarAdmin.surface.security": "Безопасность", "settings.prometheus.integration.uarAdmin.surface.skills": "Навыки", + "settings.prometheus.integration.uarAdmin.surface.teams": "Команды", "settings.prometheus.integration.uarAdmin.surface.tools": "Инструменты и MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Доступные операции REST UAR, область доступа и момент применения изменений.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Добавить запланированную задачу", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Укажите задачу и её зависимости. Планирование не запускает выполнение.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Запланировать задачу", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "Добавление задачи…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Привязка развертывания", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Выберите привязку развертывания", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Выбрать определение команды", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Выбрать экземпляр команды", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Выбрать роль", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Выберите неизменяемое определение и подходящую привязку развёртывания.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Создать экземпляр команды", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Создать команду", + "settings.prometheus.integration.uarAdmin.teams.creating": "Создание команды…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Определение команды", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Зависит от", + "settings.prometheus.integration.uarAdmin.teams.description": "Создайте команду и запланируйте зависимые задачи для этого рабочего пространства.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Хеш", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Просмотр участников и запланированной работы команды.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Экземпляры команд", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "Контракт вывода должен быть объектом JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "Входные данные задачи должны быть допустимым JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "Входные данные команды должны быть допустимым JSON.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Участники", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "В этой рабочей области нет привязок развертывания.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "Определения команд не установлены.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "Нет предыдущих задач для зависимости.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "В этом рабочем пространстве нет экземпляров команд.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "В этой команде нет участников.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "Задачи ещё не запланированы.", + "settings.prometheus.integration.uarAdmin.teams.none": "без", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Контракт вывода (схема JSON)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "Планирование команд недоступно.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Проверьте данные и попробуйте ещё раз.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Редакция", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "Настройка стартовой команды…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Настроить стартовую команду", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "Стартовая команда готова к работе.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Задача добавлена в план.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "Зависимости показывают порядок, необходимый перед выполнением.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Доска задач", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "Показать входные данные и контракт вывода", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Входные данные задачи (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Назначенная роль", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "В очереди", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Название задачи", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Экземпляр команды создан.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Входные данные команды (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "Входные данные сохраняются с экземпляром команды.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Неактивна", + "settings.prometheus.integration.uarAdmin.teams.title": "Команды", "settings.prometheus.integration.uarApplied": "Запущенный sidecar использует сохранённую конфигурацию", "settings.prometheus.integration.uarApplyHelp": "Сначала сохраните изменения конфигурации, затем примените их, чтобы перезапустить sidecar. Активные запуски UAR блокируют применение и перезапуск.", "settings.prometheus.integration.uarApplyRequired": "Сохранённые изменения ещё не применены к запущенному sidecar", diff --git a/src/renderer/i18n/locales/tr-tr.json b/src/renderer/i18n/locales/tr-tr.json index a0b46972dfe..bab55eef860 100644 --- a/src/renderer/i18n/locales/tr-tr.json +++ b/src/renderer/i18n/locales/tr-tr.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Çalışma zamanı ayarları", "settings.prometheus.integration.uarAdmin.surface.security": "Güvenlik", "settings.prometheus.integration.uarAdmin.surface.skills": "Beceriler", + "settings.prometheus.integration.uarAdmin.surface.teams": "Ekipler", "settings.prometheus.integration.uarAdmin.surface.tools": "Araçlar ve MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Kullanılabilir UAR REST işlemleri, erişim kapsamı ve değişikliklerin ne zaman uygulanacağı.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Planlanan görevi ekle", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Bir görev ve bağımlılıklarını tanımlayın. Planlama yürütmeyi başlatmaz.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Görev planla", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "Görev ekleniyor…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Dağıtım bağlama", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Bir dağıtım bağlaması seçin", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Ekip tanımını seç", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Ekip örneğini seç", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Rol seç", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Değişmez bir tanım ve eşleşen dağıtım bağını seçin.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Ekip örneği oluştur", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Ekip oluştur", + "settings.prometheus.integration.uarAdmin.teams.creating": "Ekip oluşturuluyor…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Ekip tanımı", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Bağlı olduğu görevler", + "settings.prometheus.integration.uarAdmin.teams.description": "Bu çalışma alanı için ekip oluşturun ve bağımlı görevleri planlayın.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Özet değer", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Bir ekibin üyelerini ve planlanan çalışmalarını inceleyin.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Ekip örnekleri", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "Çıktı sözleşmesi bir JSON nesnesi olmalıdır.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "Görev girdisi geçerli JSON olmalıdır.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "Ekip girdisi geçerli JSON olmalıdır.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Üyeler", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "Bu çalışma alanında herhangi bir dağıtım bağlaması yok.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "Yüklü ekip tanımı yok.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "Bağlanılacak önceki görev yok.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "Bu çalışma alanında ekip örneği yok.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "Bu ekibin üyesi yok.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "Henüz görev planlanmadı.", + "settings.prometheus.integration.uarAdmin.teams.none": "Yok", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Çıktı sözleşmesi (JSON Şeması)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "Ekip planlama kullanılamıyor.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Ayrıntıları gözden geçirip yeniden deneyin.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Revizyon", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "Başlangıç ekibi ayarlanıyor…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Başlangıç ekibini ayarla", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "Başlangıç ekibi kullanıma hazır.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Görev plana eklendi.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "Bağımlılıklar, yürütmeden önce gereken sırayı gösterir.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Görev panosu", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "Girdi ve çıktı sözleşmesini görüntüle", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Görev girdisi (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Atanan rol", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "Kuyrukta", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Görev başlığı", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Ekip örneği oluşturuldu.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Ekip girdisi (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "Girdi, ekip örneğiyle birlikte saklanır.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Etkin değil", + "settings.prometheus.integration.uarAdmin.teams.title": "Ekipler", "settings.prometheus.integration.uarApplied": "Çalışan sidecar kaydedilmiş yapılandırmayı kullanıyor", "settings.prometheus.integration.uarApplyHelp": "Önce yapılandırma değişikliklerini kaydedin, ardından sidecar’ı yeniden başlatmak için uygulayın. Etkin UAR çalışmaları uygulama ve yeniden başlatmayı engeller.", "settings.prometheus.integration.uarApplyRequired": "Kaydedilmiş değişiklikler çalışan sidecar’a uygulanmadı", diff --git a/src/renderer/i18n/locales/vi-vn.json b/src/renderer/i18n/locales/vi-vn.json index 3c53c335875..51fa1b9f1ae 100644 --- a/src/renderer/i18n/locales/vi-vn.json +++ b/src/renderer/i18n/locales/vi-vn.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "Cài đặt runtime", "settings.prometheus.integration.uarAdmin.surface.security": "Bảo mật", "settings.prometheus.integration.uarAdmin.surface.skills": "Kỹ năng", + "settings.prometheus.integration.uarAdmin.surface.teams": "Nhóm", "settings.prometheus.integration.uarAdmin.surface.tools": "Công cụ và MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "Các thao tác REST UAR hiện có, phạm vi truy cập và thời điểm thay đổi có hiệu lực.", + "settings.prometheus.integration.uarAdmin.teams.addTask": "Thêm tác vụ đã lên kế hoạch", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "Xác định tác vụ và các phụ thuộc. Việc lập kế hoạch không bắt đầu thực thi.", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "Lập kế hoạch tác vụ", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "Đang thêm tác vụ…", + "settings.prometheus.integration.uarAdmin.teams.binding": "Ràng buộc triển khai", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "Chọn ràng buộc triển khai", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "Chọn định nghĩa nhóm", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "Chọn phiên bản nhóm", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "Chọn vai trò", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "Chọn định nghĩa bất biến và liên kết triển khai tương ứng.", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "Tạo phiên bản nhóm", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "Tạo nhóm", + "settings.prometheus.integration.uarAdmin.teams.creating": "Đang tạo nhóm…", + "settings.prometheus.integration.uarAdmin.teams.definition": "Định nghĩa nhóm", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "Phụ thuộc vào", + "settings.prometheus.integration.uarAdmin.teams.description": "Tạo nhóm và lập kế hoạch các tác vụ phụ thuộc cho không gian làm việc này.", + "settings.prometheus.integration.uarAdmin.teams.digest": "Mã băm", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "Xem thành viên và công việc đã lên kế hoạch của nhóm.", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "Các phiên bản nhóm", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "Hợp đồng đầu ra phải là đối tượng JSON.", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "Đầu vào tác vụ phải là JSON hợp lệ.", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "Đầu vào nhóm phải là JSON hợp lệ.", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "Thành viên", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "Không có ràng buộc triển khai nào có sẵn trong không gian làm việc này.", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "Chưa cài đặt định nghĩa nhóm nào.", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "Không có tác vụ trước đó để phụ thuộc.", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "Không có phiên bản nhóm trong không gian làm việc này.", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "Nhóm này chưa có thành viên.", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "Chưa có tác vụ nào được lên kế hoạch.", + "settings.prometheus.integration.uarAdmin.teams.none": "Không", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "Hợp đồng đầu ra (Lược đồ JSON)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "Không thể lập kế hoạch nhóm.", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "Xem lại chi tiết rồi thử lại.", + "settings.prometheus.integration.uarAdmin.teams.revision": "Sửa đổi", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "Đang thiết lập nhóm khởi đầu…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "Thiết lập nhóm khởi đầu", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "Nhóm khởi đầu đã sẵn sàng.", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "Đã thêm tác vụ vào kế hoạch.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "Các phụ thuộc thể hiện thứ tự cần thiết trước khi thực thi.", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "Bảng tác vụ", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "Xem đầu vào và hợp đồng đầu ra", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "Đầu vào tác vụ (JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "Vai trò được giao", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "Trong hàng đợi", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "Tiêu đề tác vụ", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "Đã tạo phiên bản nhóm.", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "Đầu vào nhóm (JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "Đầu vào được lưu cùng phiên bản nhóm.", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "Không hoạt động", + "settings.prometheus.integration.uarAdmin.teams.title": "Nhóm", "settings.prometheus.integration.uarApplied": "Sidecar đang chạy sử dụng cấu hình đã lưu", "settings.prometheus.integration.uarApplyHelp": "Trước tiên hãy lưu thay đổi cấu hình, sau đó áp dụng để khởi động lại sidecar. Các phiên UAR đang hoạt động sẽ chặn việc áp dụng và khởi động lại.", "settings.prometheus.integration.uarApplyRequired": "Các thay đổi đã lưu chưa được áp dụng cho sidecar đang chạy", diff --git a/src/renderer/i18n/locales/zh-cn.json b/src/renderer/i18n/locales/zh-cn.json index a41d0bb3a3d..022e5e80ebc 100644 --- a/src/renderer/i18n/locales/zh-cn.json +++ b/src/renderer/i18n/locales/zh-cn.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "运行时设置", "settings.prometheus.integration.uarAdmin.surface.security": "安全", "settings.prometheus.integration.uarAdmin.surface.skills": "技能", + "settings.prometheus.integration.uarAdmin.surface.teams": "团队", "settings.prometheus.integration.uarAdmin.surface.tools": "工具与 MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "可用的 UAR REST 操作、访问范围以及更改生效时间。", + "settings.prometheus.integration.uarAdmin.teams.addTask": "添加计划任务", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "定义任务及其依赖关系。规划不会启动执行。", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "规划任务", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "正在添加任务…", + "settings.prometheus.integration.uarAdmin.teams.binding": "部署绑定", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "选择部署绑定", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "选择团队定义", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "选择团队实例", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "选择角色", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "选择不可变的定义及匹配的部署绑定。", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "创建团队实例", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "创建团队", + "settings.prometheus.integration.uarAdmin.teams.creating": "正在创建团队…", + "settings.prometheus.integration.uarAdmin.teams.definition": "团队定义", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "依赖于", + "settings.prometheus.integration.uarAdmin.teams.description": "为此工作区创建团队并规划有依赖关系的任务。", + "settings.prometheus.integration.uarAdmin.teams.digest": "摘要", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "查看团队成员和计划中的工作。", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "团队实例", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "输出契约必须是 JSON 对象。", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "任务输入必须是有效的 JSON。", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "团队输入必须是有效的 JSON。", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "成员", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "此工作区中没有可用的部署绑定。", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "尚未安装团队定义。", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "没有可依赖的先前任务。", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "此工作区中没有团队实例。", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "此团队没有成员。", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "尚未规划任务。", + "settings.prometheus.integration.uarAdmin.teams.none": "无", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "输出契约(JSON Schema)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "团队规划不可用。", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "检查详细信息后重试。", + "settings.prometheus.integration.uarAdmin.teams.revision": "修订版", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "正在设置入门团队…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "设置入门团队", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "入门团队已就绪。", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "任务已添加到计划。", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "依赖关系表示执行前所需的顺序。", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "任务看板", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "查看输入和输出契约", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "任务输入(JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "分配的角色", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "排队中", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "任务标题", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "已创建团队实例。", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "团队输入(JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "输入与团队实例一起存储。", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "未激活", + "settings.prometheus.integration.uarAdmin.teams.title": "团队", "settings.prometheus.integration.uarApplied": "正在运行的边车使用已保存的配置", "settings.prometheus.integration.uarApplyHelp": "请先保存配置更改,然后应用更改以重启边车。UAR 运行期间无法应用或重启。", "settings.prometheus.integration.uarApplyRequired": "已保存的更改尚未应用到正在运行的边车", diff --git a/src/renderer/i18n/locales/zh-tw.json b/src/renderer/i18n/locales/zh-tw.json index 322bf46944e..d6be1a9aea6 100644 --- a/src/renderer/i18n/locales/zh-tw.json +++ b/src/renderer/i18n/locales/zh-tw.json @@ -5640,8 +5640,59 @@ "settings.prometheus.integration.uarAdmin.surface.runtime-settings": "執行階段設定", "settings.prometheus.integration.uarAdmin.surface.security": "安全性", "settings.prometheus.integration.uarAdmin.surface.skills": "技能", + "settings.prometheus.integration.uarAdmin.surface.teams": "團隊", "settings.prometheus.integration.uarAdmin.surface.tools": "工具與 MCP", "settings.prometheus.integration.uarAdmin.surfaceDescription": "可用的 UAR REST 操作、存取範圍,以及變更生效時間。", + "settings.prometheus.integration.uarAdmin.teams.addTask": "新增規劃任務", + "settings.prometheus.integration.uarAdmin.teams.addTaskDescription": "定義任務及其相依關係。規劃不會啟動執行。", + "settings.prometheus.integration.uarAdmin.teams.addTaskTitle": "規劃任務", + "settings.prometheus.integration.uarAdmin.teams.addingTask": "正在新增任務…", + "settings.prometheus.integration.uarAdmin.teams.binding": "部署綁定", + "settings.prometheus.integration.uarAdmin.teams.chooseBinding": "選擇部署綁定", + "settings.prometheus.integration.uarAdmin.teams.chooseDefinition": "選擇團隊定義", + "settings.prometheus.integration.uarAdmin.teams.chooseInstance": "選擇團隊實例", + "settings.prometheus.integration.uarAdmin.teams.chooseRole": "選擇角色", + "settings.prometheus.integration.uarAdmin.teams.createDescription": "選擇不可變的定義及相符的部署繫結。", + "settings.prometheus.integration.uarAdmin.teams.createTeam": "建立團隊實例", + "settings.prometheus.integration.uarAdmin.teams.createTitle": "建立團隊", + "settings.prometheus.integration.uarAdmin.teams.creating": "正在建立團隊…", + "settings.prometheus.integration.uarAdmin.teams.definition": "團隊定義", + "settings.prometheus.integration.uarAdmin.teams.dependencies": "相依於", + "settings.prometheus.integration.uarAdmin.teams.description": "為此工作區建立團隊並規劃有相依關係的任務。", + "settings.prometheus.integration.uarAdmin.teams.digest": "摘要", + "settings.prometheus.integration.uarAdmin.teams.instancesDescription": "檢視團隊成員和已規劃的工作。", + "settings.prometheus.integration.uarAdmin.teams.instancesTitle": "團隊實例", + "settings.prometheus.integration.uarAdmin.teams.invalidOutputContract": "輸出契約必須是 JSON 物件。", + "settings.prometheus.integration.uarAdmin.teams.invalidTaskInput": "任務輸入必須是有效的 JSON。", + "settings.prometheus.integration.uarAdmin.teams.invalidTeamInput": "團隊輸入必須是有效的 JSON。", + "settings.prometheus.integration.uarAdmin.teams.membersTitle": "成員", + "settings.prometheus.integration.uarAdmin.teams.noBindings": "此工作區中沒有可用的部署綁定。", + "settings.prometheus.integration.uarAdmin.teams.noDefinitions": "尚未安裝團隊定義。", + "settings.prometheus.integration.uarAdmin.teams.noDependencies": "沒有可相依的先前任務。", + "settings.prometheus.integration.uarAdmin.teams.noInstances": "此工作區沒有團隊實例。", + "settings.prometheus.integration.uarAdmin.teams.noMembers": "此團隊沒有成員。", + "settings.prometheus.integration.uarAdmin.teams.noTasks": "尚未規劃任何任務。", + "settings.prometheus.integration.uarAdmin.teams.none": "無", + "settings.prometheus.integration.uarAdmin.teams.outputContract": "輸出契約(JSON Schema)", + "settings.prometheus.integration.uarAdmin.teams.planningUnavailable": "團隊規劃無法使用。", + "settings.prometheus.integration.uarAdmin.teams.retryGuidance": "檢查詳細資料後再試一次。", + "settings.prometheus.integration.uarAdmin.teams.revision": "修訂版", + "settings.prometheus.integration.uarAdmin.teams.settingUpStarter": "正在設定入門團隊…", + "settings.prometheus.integration.uarAdmin.teams.setupStarter": "設定入門團隊", + "settings.prometheus.integration.uarAdmin.teams.starterReady": "入門團隊已就緒。", + "settings.prometheus.integration.uarAdmin.teams.taskAdded": "任務已新增至計畫。", + "settings.prometheus.integration.uarAdmin.teams.taskBoardDescription": "相依關係顯示執行前所需的順序。", + "settings.prometheus.integration.uarAdmin.teams.taskBoardTitle": "任務看板", + "settings.prometheus.integration.uarAdmin.teams.taskDetails": "檢視輸入與輸出契約", + "settings.prometheus.integration.uarAdmin.teams.taskInput": "任務輸入(JSON)", + "settings.prometheus.integration.uarAdmin.teams.taskRole": "指派的角色", + "settings.prometheus.integration.uarAdmin.teams.taskStatus.queued": "佇列中", + "settings.prometheus.integration.uarAdmin.teams.taskTitle": "任務標題", + "settings.prometheus.integration.uarAdmin.teams.teamCreated": "已建立團隊實例。", + "settings.prometheus.integration.uarAdmin.teams.teamInput": "團隊輸入(JSON)", + "settings.prometheus.integration.uarAdmin.teams.teamInputDescription": "輸入會與團隊實例一起儲存。", + "settings.prometheus.integration.uarAdmin.teams.teamStatus.inactive": "未啟用", + "settings.prometheus.integration.uarAdmin.teams.title": "團隊", "settings.prometheus.integration.uarApplied": "執行中的附屬程式使用已儲存的設定", "settings.prometheus.integration.uarApplyHelp": "請先儲存設定變更,再套用變更以重新啟動附屬程式。UAR 執行期間無法套用或重新啟動。", "settings.prometheus.integration.uarApplyRequired": "已儲存的變更尚未套用至執行中的附屬程式", diff --git a/src/renderer/pages/settings/PrometheusSettings/UarAdministrationWorkspace.tsx b/src/renderer/pages/settings/PrometheusSettings/UarAdministrationWorkspace.tsx index 304a78ebe64..7c3b457391c 100644 --- a/src/renderer/pages/settings/PrometheusSettings/UarAdministrationWorkspace.tsx +++ b/src/renderer/pages/settings/PrometheusSettings/UarAdministrationWorkspace.tsx @@ -30,6 +30,7 @@ import { UarPresentationsPanel } from './UarPresentationsPanel' import { UarProvidersModelsPanel } from './UarProvidersModelsPanel' import { UarRuntimeSettingsPanel } from './UarRuntimeSettingsPanel' import { UarSkillsPanel } from './UarSkillsPanel' +import { UarTeamsPanel } from './UarTeamsPanel' const GROUPS = ['runtime', 'agents', 'experience', 'administration'] as const @@ -39,6 +40,7 @@ type NavigationSurface = Pick & { } const EMPTY_SURFACES: UarAdministrationSnapshot['surfaces'] = [] const BOSS_DURABLE_SURFACES: NavigationSurface[] = [ + { id: 'teams', group: 'agents' }, { id: 'durable-agent-instances', group: 'agents' }, { id: 'local-scoped-observers', group: 'agents' } ] @@ -310,7 +312,7 @@ export function UarAdministrationWorkspace({ overview, onReady }: { overview: Re ) : selectedId === 'approvals' ? ( - ) : selectedId === 'durable-agent-instances' || selectedId === 'local-scoped-observers' ? ( + ) : ['teams', 'durable-agent-instances', 'local-scoped-observers'].includes(selectedId) ? (
{navText(t, 'durable.workspaceTitle')} @@ -345,7 +347,9 @@ export function UarAdministrationWorkspace({ overview, onReady }: { overview: Re )} {selectedWorkspaceId && - (selectedId === 'durable-agent-instances' ? ( + (selectedId === 'teams' ? ( + + ) : selectedId === 'durable-agent-instances' ? ( ) : ( diff --git a/src/renderer/pages/settings/PrometheusSettings/UarTeamTaskBoard.tsx b/src/renderer/pages/settings/PrometheusSettings/UarTeamTaskBoard.tsx new file mode 100644 index 00000000000..9f3dd6f5af6 --- /dev/null +++ b/src/renderer/pages/settings/PrometheusSettings/UarTeamTaskBoard.tsx @@ -0,0 +1,62 @@ +import { useTranslation } from 'react-i18next' + +import { Badge } from '@cherrystudio/ui' +import { SettingDescription, SettingGroup, SettingTitle } from '@renderer/components/SettingsPrimitives' +import type { UarTeamInstance } from '@shared/types/uarTeams' + +export function UarTeamTaskBoard({ instance }: { instance: UarTeamInstance }) { + const { t: tr } = useTranslation(undefined, { keyPrefix: 'settings.prometheus.integration.uarAdmin.teams' }) + + return ( + + {tr('taskBoardTitle')} + {tr('taskBoardDescription')} + {instance.tasks.length === 0 ? ( +

{tr('noTasks')}

+ ) : ( +
    + {instance.tasks.map((task) => ( +
  1. +
    +
    +

    {task.title}

    +

    + {task.role} · {task.id} +

    +
    + {tr(`taskStatus.${task.status}`)} +
    +

    + {tr('dependencies')}:{' '} + {task.dependsOn.length + ? task.dependsOn + .map((id) => instance.tasks.find((candidate) => candidate.id === id)?.title ?? id) + .join(', ') + : tr('none')} +

    +
    + + {tr('taskDetails')} + +
    +
    +

    {tr('taskInput')}

    +
    +                      {JSON.stringify(task.input, null, 2)}
    +                    
    +
    +
    +

    {tr('outputContract')}

    +
    +                      {JSON.stringify(task.outputContract, null, 2)}
    +                    
    +
    +
    +
    +
  2. + ))} +
+ )} +
+ ) +} diff --git a/src/renderer/pages/settings/PrometheusSettings/UarTeamTaskForm.tsx b/src/renderer/pages/settings/PrometheusSettings/UarTeamTaskForm.tsx new file mode 100644 index 00000000000..5f453cd61fc --- /dev/null +++ b/src/renderer/pages/settings/PrometheusSettings/UarTeamTaskForm.tsx @@ -0,0 +1,217 @@ +import { useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' + +import { + Button, + Checkbox, + Input, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, + Textarea +} from '@cherrystudio/ui' +import { SettingDescription, SettingGroup, SettingTitle } from '@renderer/components/SettingsPrimitives' +import { ipcApi } from '@renderer/ipc' +import type { UarTeamInstance } from '@shared/types/uarTeams' + +interface Props { + workspaceId: string + instance: UarTeamInstance + planning: boolean + onAdded: () => Promise +} + +export function UarTeamTaskForm({ workspaceId, instance, planning, onAdded }: Props) { + const { t: tr } = useTranslation(undefined, { keyPrefix: 'settings.prometheus.integration.uarAdmin.teams' }) + const [busy, setBusy] = useState(false) + const [error, setError] = useState() + const [status, setStatus] = useState() + const [title, setTitle] = useState('') + const [role, setRole] = useState() + const [inputText, setInputText] = useState('{}') + const [outputText, setOutputText] = useState('{"type":"object"}') + const [dependencies, setDependencies] = useState([]) + const intentRef = useRef< + | { + fingerprint: string + commandId: string + taskId: string + expectedTeamRevision: number + } + | undefined + >(undefined) + const roles = [...new Set(instance.members.map((member) => member.role))] + const selectedRole = roles.includes(role ?? '') ? role : undefined + + const addTask = async () => { + if (!title.trim() || !selectedRole) return + let input: unknown + let outputContract: Record + try { + input = JSON.parse(inputText) + } catch { + setError(tr('invalidTaskInput')) + return + } + try { + const parsed = JSON.parse(outputText) + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('invalid contract') + outputContract = parsed + } catch { + setError(tr('invalidOutputContract')) + return + } + const fingerprint = JSON.stringify([ + workspaceId, + instance.id, + title.trim(), + selectedRole, + input, + outputContract, + dependencies + ]) + const intent = + intentRef.current?.fingerprint === fingerprint + ? intentRef.current + : { + fingerprint, + commandId: crypto.randomUUID(), + taskId: crypto.randomUUID(), + expectedTeamRevision: instance.revision + } + intentRef.current = intent + setBusy(true) + setError(undefined) + setStatus(undefined) + try { + await ipcApi.request('prometheus.uar.teams.add_task', { + workspaceId, + teamInstanceId: instance.id, + commandId: intent.commandId, + taskId: intent.taskId, + expectedTeamRevision: intent.expectedTeamRevision, + title: title.trim(), + role: selectedRole, + input, + outputContract, + dependsOn: dependencies + }) + intentRef.current = undefined + setTitle('') + setInputText('{}') + setOutputText('{"type":"object"}') + setDependencies([]) + setStatus(tr('taskAdded')) + await onAdded() + } catch (cause) { + setError(cause instanceof Error ? cause.message : String(cause)) + } finally { + setBusy(false) + } + } + + return ( + + {tr('addTaskTitle')} + {tr('addTaskDescription')} + {error && ( +

+ {error} {tr('retryGuidance')} +

+ )} + {status && ( +

+ {status} +

+ )} +
+
+ + setTitle(event.target.value)} + disabled={busy} + /> +
+
+ + +
+
+
+
+ + setInputText(event.target.value)} + rows={4} + className="font-mono text-xs" + disabled={busy} + /> +
+
+ + setOutputText(event.target.value)} + rows={4} + className="font-mono text-xs" + disabled={busy} + /> +
+
+
+ {tr('dependencies')} + {instance.tasks.length === 0 ? ( +

{tr('noDependencies')}

+ ) : ( +
+ {instance.tasks.map((task) => ( + + ))} +
+ )} +
+ +
+ ) +} diff --git a/src/renderer/pages/settings/PrometheusSettings/UarTeamsPanel.tsx b/src/renderer/pages/settings/PrometheusSettings/UarTeamsPanel.tsx new file mode 100644 index 00000000000..e92b4c5d42f --- /dev/null +++ b/src/renderer/pages/settings/PrometheusSettings/UarTeamsPanel.tsx @@ -0,0 +1,322 @@ +import { RefreshCw } from 'lucide-react' +import { useCallback, useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' + +import { + Badge, + Button, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, + Textarea +} from '@cherrystudio/ui' +import { SettingDescription, SettingGroup, SettingTitle } from '@renderer/components/SettingsPrimitives' +import { ipcApi } from '@renderer/ipc' +import type { UarTeamsSnapshot } from '@shared/types/uarTeams' + +import { UarTeamTaskBoard } from './UarTeamTaskBoard' +import { UarTeamTaskForm } from './UarTeamTaskForm' + +const definitionKey = (definition: UarTeamsSnapshot['definitions'][number]) => + `${definition.id}:${definition.version}:${definition.digest}` + +export function UarTeamsPanel({ workspaceId }: { workspaceId: string }) { + const { t } = useTranslation() + const { t: tr } = useTranslation(undefined, { keyPrefix: 'settings.prometheus.integration.uarAdmin.teams' }) + const [snapshot, setSnapshot] = useState() + const [loading, setLoading] = useState(true) + const [busy, setBusy] = useState<'setup' | 'create'>() + const [error, setError] = useState() + const [status, setStatus] = useState() + const [selectedDefinitionKey, setSelectedDefinitionKey] = useState() + const [selectedBindingId, setSelectedBindingId] = useState() + const [selectedInstanceId, setSelectedInstanceId] = useState() + const [teamInput, setTeamInput] = useState('{}') + const createIntent = useRef<{ fingerprint: string; commandId: string } | undefined>(undefined) + + const refresh = useCallback(async () => { + setLoading(true) + setError(undefined) + try { + setSnapshot(await ipcApi.request('prometheus.uar.teams.snapshot', { workspaceId })) + } catch (cause) { + setError(cause instanceof Error ? cause.message : String(cause)) + } finally { + setLoading(false) + } + }, [workspaceId]) + + useEffect(() => { + void refresh() + }, [refresh]) + + const selectedDefinition = snapshot?.definitions.find( + (definition) => definitionKey(definition) === selectedDefinitionKey + ) + const eligibleBindings = snapshot?.bindings.filter( + (binding) => + selectedDefinition && + binding.package.id === selectedDefinition.package.id && + binding.package.version === selectedDefinition.package.version && + binding.package.digest === selectedDefinition.package.digest + ) + const selectedBinding = eligibleBindings?.find((binding) => binding.id === selectedBindingId) + const selectedInstance = snapshot?.instances.find((instance) => instance.id === selectedInstanceId) + + const setupStarter = async () => { + setBusy('setup') + setError(undefined) + setStatus(undefined) + try { + await ipcApi.request('prometheus.uar.teams.setup_starter', { workspaceId }) + setStatus(tr('starterReady')) + await refresh() + } catch (cause) { + setError(cause instanceof Error ? cause.message : String(cause)) + } finally { + setBusy(undefined) + } + } + + const createTeam = async () => { + if (!selectedDefinition || !selectedBinding) return + let input: unknown + try { + input = JSON.parse(teamInput) + } catch { + setError(tr('invalidTeamInput')) + return + } + const fingerprint = JSON.stringify([ + workspaceId, + selectedBinding.id, + selectedDefinition.id, + selectedDefinition.version, + selectedDefinition.digest, + input + ]) + const intent = + createIntent.current?.fingerprint === fingerprint + ? createIntent.current + : { fingerprint, commandId: crypto.randomUUID() } + createIntent.current = intent + setBusy('create') + setError(undefined) + setStatus(undefined) + try { + const instance = await ipcApi.request('prometheus.uar.teams.create', { + workspaceId, + commandId: intent.commandId, + deploymentBindingId: selectedBinding.id, + teamDefinition: { + id: selectedDefinition.id, + version: selectedDefinition.version, + digest: selectedDefinition.digest + }, + input + }) + setSelectedInstanceId(instance.id) + createIntent.current = undefined + setStatus(tr('teamCreated')) + await refresh() + } catch (cause) { + setError(cause instanceof Error ? cause.message : String(cause)) + } finally { + setBusy(undefined) + } + } + + return ( +
+ +
+
+ {tr('title')} + {tr('description')} +
+ +
+ {loading && ( +

+ {t('common.loading')} +

+ )} + {error && ( +

+ {error} {tr('retryGuidance')} +

+ )} + {status && ( +

+ {status} +

+ )} + {snapshot && !snapshot.capabilities.planning && ( +

+ {tr('planningUnavailable')} {snapshot.unavailableReason} +

+ )} +
+ + {snapshot && ( + <> + + {tr('createTitle')} + {tr('createDescription')} +
+
+ + + {selectedDefinition && ( +

+ {selectedDefinition.id} · {tr('digest')}: {selectedDefinition.digest} +

+ )} + {snapshot.definitions.length === 0 && ( +
+

{tr('noDefinitions')}

+ +
+ )} +
+
+ + + {selectedDefinition && eligibleBindings?.length === 0 && ( +

{tr('noBindings')}

+ )} +
+
+
+ + setTeamInput(event.target.value)} + rows={3} + className="font-mono text-xs" + /> +

{tr('teamInputDescription')}

+
+ +
+ + + {tr('instancesTitle')} + {tr('instancesDescription')} + {snapshot.instances.length === 0 ? ( +

{tr('noInstances')}

+ ) : ( + + )} + {selectedInstance && ( +
+
+ {tr(`teamStatus.${selectedInstance.status}`)} + + {tr('revision')} {selectedInstance.revision} + + + {selectedInstance.definition.id} · {selectedInstance.definition.version} + +
+
+

{tr('membersTitle')}

+ {selectedInstance.members.length === 0 ? ( +

{tr('noMembers')}

+ ) : ( +
    + {selectedInstance.members.map((member) => ( +
  • + {member.role} + + {tr(`teamStatus.${member.status}`)} + +

    {member.id}

    +
  • + ))} +
+ )} +
+
+ )} +
+ + {selectedInstance && ( + <> + + + + )} + + )} +
+ ) +} diff --git a/src/renderer/pages/settings/PrometheusSettings/uar.search.ts b/src/renderer/pages/settings/PrometheusSettings/uar.search.ts index 311a185c940..c8232fa1e38 100644 --- a/src/renderer/pages/settings/PrometheusSettings/uar.search.ts +++ b/src/renderer/pages/settings/PrometheusSettings/uar.search.ts @@ -23,6 +23,7 @@ export const entries: SettingsSearchEntry[] = [ ['runtime-settings', ['configuration', 'namespace', 'drift', 'policy', 'saved value', 'effective value']], ['agents', ['agent catalog', 'agent definition', 'registry']], ['collaboration-catalog', ['collaboration catalog', 'teams', 'subagents']], + ['teams', ['team instances', 'team planning', 'members', 'task dependencies', 'task board']], [ 'durable-agent-instances', ['durable instance', 'deployment binding', 'activate', 'passivate', 'drain', 'restart'] diff --git a/src/shared/ipc/schemas/prometheus.ts b/src/shared/ipc/schemas/prometheus.ts index d74840ebaaf..9669cc6c94c 100644 --- a/src/shared/ipc/schemas/prometheus.ts +++ b/src/shared/ipc/schemas/prometheus.ts @@ -79,6 +79,7 @@ import { uarInstanceSelectSchema, type UarInstanceInventorySnapshot } from '@shared/types/uarServiceInstance' +import type { UarTeamBinding, UarTeamInstance, UarTeamsSnapshot } from '@shared/types/uarTeams' import { defineRoute } from '../define' @@ -270,6 +271,48 @@ export const prometheusRequestSchemas = { input: z.object({ workspaceId: z.string().min(1).max(256) }).strict(), output: z.custom() }), + 'prometheus.uar.teams.snapshot': defineRoute({ + input: z.object({ workspaceId: z.string().min(1).max(256) }).strict(), + output: z.custom() + }), + 'prometheus.uar.teams.setup_starter': defineRoute({ + input: z.object({ workspaceId: z.string().min(1).max(256) }).strict(), + output: z.custom() + }), + 'prometheus.uar.teams.create': defineRoute({ + input: z + .object({ + workspaceId: z.string().min(1).max(256), + commandId: z.uuid(), + deploymentBindingId: z.string().min(1).max(256), + teamDefinition: z + .object({ id: z.string().min(1), version: z.string().min(1), digest: z.string().min(1) }) + .strict(), + input: z.unknown(), + memberSlots: z + .array(z.object({ role: z.string().min(1), count: z.number().int().positive() }).strict()) + .optional() + }) + .strict(), + output: z.custom() + }), + 'prometheus.uar.teams.add_task': defineRoute({ + input: z + .object({ + workspaceId: z.string().min(1).max(256), + teamInstanceId: z.string().min(1).max(256), + commandId: z.uuid(), + taskId: z.string().min(1).max(256), + expectedTeamRevision: z.number().int().nonnegative(), + title: z.string().min(1).max(512), + role: z.string().min(1).max(256), + input: z.unknown(), + outputContract: z.unknown(), + dependsOn: z.array(z.string().min(1).max(256)).max(128) + }) + .strict(), + output: z.custom() + }), 'prometheus.uar.durable.setup_starter': defineRoute({ input: z.object({ workspaceId: z.string().min(1).max(256) }).strict(), output: z.custom() diff --git a/src/shared/types/uarTeams.ts b/src/shared/types/uarTeams.ts new file mode 100644 index 00000000000..405d75f1c69 --- /dev/null +++ b/src/shared/types/uarTeams.ts @@ -0,0 +1,96 @@ +export interface UarTeamIdentity { + id: string + version: string + digest: string +} + +export interface UarTeamDefinition extends UarTeamIdentity { + title: string + purpose: string + package: UarTeamIdentity + members: Array<{ + role: string + kind: 'agent' | 'team' + min: number + max: number + definition: UarTeamIdentity + }> +} + +export interface UarTeamBinding { + id: string + workspaceId: string + revision: number + activationSupported: boolean + package: UarTeamIdentity +} + +export interface UarTeamTask { + id: string + title: string + role: string + input: unknown + outputContract: unknown + output: null + dependsOn: string[] + status: 'queued' + revision: number + createdAt: string + updatedAt: string +} + +export interface UarTeamInstance { + id: string + ownerId: string + workspaceId: string + revision: number + status: 'inactive' + definition: UarTeamIdentity + package: UarTeamIdentity + binding: { id: string; revision: number } + input: unknown + members: Array<{ + id: string + role: string + ordinal: number + definition: UarTeamIdentity + revision: number + status: 'inactive' + }> + tasks: UarTeamTask[] + createdAt: string + updatedAt: string +} + +export interface UarTeamsSnapshot { + schemaVersion: 1 + workspaceId: string + generation: number + capabilities: { planning: boolean } + unavailableReason?: string + definitions: UarTeamDefinition[] + bindings: UarTeamBinding[] + instances: UarTeamInstance[] +} + +export interface UarCreateTeamInput { + workspaceId: string + commandId: string + deploymentBindingId: string + teamDefinition: UarTeamIdentity + input: unknown + memberSlots?: Array<{ role: string; count: number }> +} + +export interface UarAddTeamTaskInput { + workspaceId: string + teamInstanceId: string + commandId: string + taskId: string + expectedTeamRevision: number + title: string + role: string + input: unknown + outputContract: unknown + dependsOn: string[] +}