improvement(i18n): Improve Simplified Chinese localization quality Merge pull request #200 from CharAznable98/main

Improve Simplified Chinese localization quality
This commit is contained in:
Илия 2026-06-03 20:25:29 +03:00 committed by GitHub
commit 3b933058c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
52 changed files with 4192 additions and 3132 deletions

15
.github/codeql/codeql-config.yml vendored Normal file
View file

@ -0,0 +1,15 @@
name: agent-teams-codeql
paths:
- src
- packages
- agent-teams-controller
- mcp-server
- scripts
- .github/workflows
paths-ignore:
- '**/node_modules/**'
- 'test/**'
- 'landing/**'
- 'build/**'

67
.github/workflows/codeql.yml vendored Normal file
View file

@ -0,0 +1,67 @@
name: CodeQL
on:
push:
branches: [main, dev]
paths:
- 'src/**'
- 'packages/**'
- 'agent-teams-controller/**'
- 'mcp-server/**'
- 'scripts/**'
- '.github/workflows/**'
- '.github/codeql/**'
- 'package.json'
- 'pnpm-lock.yaml'
- 'pnpm-workspace.yaml'
- 'tsconfig*.json'
pull_request:
paths:
- 'src/**'
- 'packages/**'
- 'agent-teams-controller/**'
- 'mcp-server/**'
- 'scripts/**'
- '.github/workflows/**'
- '.github/codeql/**'
- 'package.json'
- 'pnpm-lock.yaml'
- 'pnpm-workspace.yaml'
- 'tsconfig*.json'
schedule:
- cron: '34 3 * * 1'
permissions:
contents: read
jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
timeout-minutes: 45
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language:
- actions
- javascript-typescript
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql/codeql-config.yml
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
with:
category: /language:${{ matrix.language }}

View file

@ -21,7 +21,7 @@ jobs:
if: ${{ github.event_name == 'workflow_dispatch' || ((github.event_name != 'issue_comment' || github.event.issue.pull_request) && github.event.comment.user.type != 'Bot') }}
env:
REVIEWROUTER_API_URL: "https://api.reviewrouter.site"
REVIEWROUTER_ACTION_VERSION: "c23ae97660c3674a2ebc9076bb5cd4f1bbd85657"
REVIEWROUTER_ACTION_VERSION: "1603215454b4c5cf3387b40ae674a46eeb7ee96b"
REVIEWROUTER_OIDC_AUDIENCE: "reviewrouter"
REVIEWROUTER_RUNTIME_CONFIG_MODE: "oidc"
REVIEWROUTER_STATIC_CONFIG_FALLBACK: "true"
@ -42,7 +42,7 @@ jobs:
- name: Preflight ReviewRouter interaction
id: preflight
uses: 777genius/review-router@c23ae97660c3674a2ebc9076bb5cd4f1bbd85657
uses: 777genius/review-router@1603215454b4c5cf3387b40ae674a46eeb7ee96b
env:
GITHUB_TOKEN: ${{ github.token }}
REVIEW_ROUTER_MODE: "interaction-preflight"
@ -78,7 +78,7 @@ jobs:
- name: Run ReviewRouter interaction
if: ${{ steps.preflight.outputs.should_run == 'true' }}
uses: 777genius/review-router@c23ae97660c3674a2ebc9076bb5cd4f1bbd85657
uses: 777genius/review-router@1603215454b4c5cf3387b40ae674a46eeb7ee96b
env:
GITHUB_TOKEN: ${{ github.token }}
REVIEW_ROUTER_MODE: "interaction"

View file

@ -14,7 +14,7 @@
<h1 align="center"><a href="https://agentteams.live/">Agent Teams</a></h1>
<p align="center">
<strong><code>You're the CTO, agents are your team. They handle tasks themselves, message each other, review each other. You just look at the kanban board and drink coffee.</code></strong>
<strong><code>You're the boss, agents are your team. They handle tasks themselves, message each other, review each other. You just look at the kanban board and drink coffee.</code></strong>
</p>
<p align="center">

View file

@ -14,6 +14,6 @@
"test:watch": "vitest --config vitest.config.js"
},
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
}
}

1
landing/.gitignore vendored
View file

@ -5,6 +5,7 @@ node_modules
.env
--host/
product-docs/.vitepress/dist/
product-docs/.vitepress/cache/
# Large video files
public/video/*.mp4

View file

@ -14,9 +14,35 @@ pnpm generate
pnpm preview
```
## Render static sites
Landing and docs are deployed as separate Render Static Sites from the `main` branch.
Landing:
```bash
corepack enable && pnpm install --frozen-lockfile --ignore-scripts && NUXT_PUBLIC_SITE_URL=$RENDER_EXTERNAL_URL NUXT_PUBLIC_DOCS_SITE_URL=https://agent-teams-ai-docs.onrender.com NUXT_PUBLIC_ROBOTS="index, follow" pnpm --filter agent-teams-landing generate
```
Publish path: `landing/.output/public`
Docs:
```bash
corepack enable && pnpm install --frozen-lockfile --ignore-scripts && VITEPRESS_BASE=/ VITEPRESS_SITE_URL=$RENDER_EXTERNAL_URL VITEPRESS_LANDING_SITE_URL=https://agent-teams-ai-landing.onrender.com pnpm --filter agent-teams-landing docs:build
```
Publish path: `landing/product-docs/.vitepress/dist`
Both sites set `NODE_VERSION=24.16.0` and `SKIP_INSTALL_DEPS=true`; the build command runs the pnpm install step explicitly with `--ignore-scripts`.
When a custom landing domain is attached, update `VITEPRESS_LANDING_SITE_URL` on the docs site. When a custom docs domain is attached, `VITEPRESS_SITE_URL=$RENDER_EXTERNAL_URL` can stay unchanged for the Render preview URL or be replaced with the custom domain for canonical SEO.
## Notes
- Static-first (SSG) by design.
- Locale auto-detection: cookie -> browser settings -> fallback `en`.
- Theme auto-detection: localStorage -> system preference -> fallback `light`.
- Hero video uses the Mux Player embed. Set `NUXT_PUBLIC_MUX_PLAYBACK_ID` to override the default playback id without changing the code.
- Hero background can use a separate Mux asset via `NUXT_PUBLIC_MUX_BACKGROUND_PLAYBACK_ID`; otherwise it reuses `NUXT_PUBLIC_MUX_PLAYBACK_ID`.
- Set `NUXT_PUBLIC_DOCS_SITE_URL` when the docs are deployed as a separate static site.

View file

@ -1943,8 +1943,12 @@
}
@media (max-width: 767px) {
#hero.cyber-hero {
padding-top: 64px;
}
.cyber-hero {
padding: 84px 0 36px;
padding: 64px 0 8px;
}
.cyber-hero__background {
@ -1962,19 +1966,21 @@
}
.cyber-hero__container {
width: min(100% - 32px, 680px);
width: min(100% - 24px, 680px);
max-width: min(100% - 24px, 680px) !important;
padding-inline: 0 !important;
}
.cyber-hero__layout {
min-width: 0;
gap: 0;
overflow: hidden;
gap: 8px;
overflow: visible;
}
.cyber-hero__copy {
width: 100%;
max-width: 100%;
padding-bottom: 0;
padding: 8px 0 0;
}
.cyber-hero__brand-lockup {
@ -1988,28 +1994,40 @@
}
.cyber-hero__title {
gap: 0.12em;
font-size: clamp(2rem, 9.4vw, 3.1rem);
flex-wrap: wrap;
gap: 0.06em 0.12em;
margin-bottom: 16px;
max-width: 9.4em;
font-size: 2.35rem;
line-height: 0.96;
white-space: normal;
}
.cyber-hero__slogan {
display: flex;
width: 100%;
padding: 10px 14px;
letter-spacing: 0.04em;
margin-bottom: 16px;
padding: 9px 13px;
flex-wrap: wrap;
font-size: 0.72rem;
letter-spacing: 0.03em;
overflow-wrap: anywhere;
}
.cyber-hero__description {
font-size: 1rem;
line-height: 1.62;
margin-bottom: 18px;
max-width: 100%;
font-size: 0.95rem;
line-height: 1.5;
overflow-wrap: break-word;
}
.cyber-hero__providers {
margin-bottom: 22px;
margin-bottom: 18px;
}
.cyber-hero__provider-list {
gap: 12px 18px;
gap: 10px 14px;
}
.cyber-hero__provider {
@ -2033,31 +2051,49 @@
.cyber-hero__actions {
display: grid;
grid-template-columns: 1fr;
gap: 12px;
margin-bottom: 12px;
}
.cyber-action-button.v-btn {
width: 100%;
min-height: 72px !important;
min-height: 60px !important;
min-width: 0 !important;
padding-inline: 20px !important;
padding-inline: 16px !important;
}
.cyber-action-button.v-btn .v-btn__content {
gap: 12px;
}
.cyber-action-button__icon {
width: 30px;
height: 30px;
}
.cyber-action-button__label {
font-size: 0.92rem;
}
.cyber-action-button__subtitle {
font-size: 0.62rem;
}
.cyber-hero__terminal-note {
display: inline-flex;
font-size: 0.68rem;
display: none;
}
.cyber-scene {
min-height: auto;
aspect-ratio: auto;
padding: 96px 0 14px;
padding: 86px 0 2px;
transform: none;
}
.cyber-hero__scene {
width: 100%;
max-width: 100%;
margin-top: 8px;
margin-top: 14px;
overflow: hidden;
}
@ -2070,17 +2106,20 @@
position: relative;
left: auto;
top: auto;
width: 100%;
width: min(100%, 320px);
margin-inline: auto;
transform: none;
}
.cyber-scene__robots {
inset: 0 0 auto;
height: 96px;
z-index: 7;
height: 76px;
display: flex;
align-items: flex-end;
justify-content: center;
gap: clamp(18px, 6vw, 34px);
gap: 18px;
overflow: visible;
}
.cyber-agent {
@ -2089,7 +2128,7 @@
display: none;
left: auto;
top: auto;
width: clamp(58px, 18vw, 74px);
width: 54px;
transform: none;
}
@ -2099,7 +2138,7 @@
.cyber-agent[data-agent="planner"] {
z-index: auto;
width: clamp(58px, 18vw, 74px);
width: 54px;
transform: none;
}
@ -2145,93 +2184,18 @@
display: none;
}
.cyber-feature-rail {
grid-template-columns: 1fr;
gap: 20px;
padding: 0 4px;
}
.cyber-feature-rail-shell {
margin-top: clamp(104px, 24vw, 128px);
}
.cyber-feature-rail__collaboration {
left: 31%;
bottom: calc(100% + 8px);
width: clamp(96px, 30vw, 124px);
}
.cyber-feature-rail__reviewer {
--reviewer-robot-width: clamp(58px, 18vw, 72px);
right: clamp(6px, 3vw, 16px);
bottom: calc(100% + 8px);
gap: 0;
}
.cyber-feature-rail__reviewer-card,
.cyber-feature-rail__reviewer-bubble {
display: none;
}
}
.cyber-feature-rail__robot {
top: 4px;
@media (max-width: 360px) {
.cyber-hero__title {
font-size: 2.1rem;
}
.cyber-feature-rail__item {
grid-template-columns: 48px 44px minmax(0, 1fr);
grid-template-rows: auto;
align-items: center;
justify-items: start;
gap: 10px;
padding: 0;
text-align: left;
}
.cyber-feature-rail__icon {
width: 44px;
height: 44px;
}
.cyber-feature-rail__icon::before,
.cyber-feature-rail__icon::after {
width: 12px;
height: 12px;
}
.cyber-feature-rail__icon .v-icon {
font-size: 26px !important;
}
.cyber-feature-rail__node {
width: 40px;
height: 40px;
font-size: 0.8rem;
}
.cyber-feature-rail__node::before {
display: none;
}
.cyber-feature-rail__copy {
max-width: none;
padding: 8px 10px 9px;
}
.cyber-feature-rail__copy::before {
inset: 0 -6px;
border-radius: 14px;
backdrop-filter: blur(9px) saturate(1.06);
}
.cyber-feature-rail__title {
margin-bottom: 5px;
font-size: 0.92rem;
}
.cyber-feature-rail__text {
font-size: 0.78rem;
line-height: 1.42;
.cyber-hero__provider-list {
gap: 9px 12px;
}
}

View file

@ -1,15 +1,18 @@
<script setup lang="ts">
import robotLeadLounge from "~/assets/images/footer/robot-lead-lounge-v1.webp";
import { buildDocsHref } from "~/utils/docsUrl";
const { t, locale } = useI18n();
const { repoUrl } = useGithubRepo();
const { baseURL } = useRuntimeConfig().app;
const runtimeConfig = useRuntimeConfig();
const { baseURL } = runtimeConfig.app;
const year = new Date().getFullYear();
const authorLabel = computed(() => locale.value === 'ru' ? 'Автор' : 'Author');
const docsHref = computed(() => {
const base = baseURL.replace(/\/?$/, '/');
return `${base}${locale.value === 'ru' ? 'docs/ru/' : 'docs/'}`;
});
const docsHref = computed(() => buildDocsHref({
locale: locale.value,
docsSiteUrl: runtimeConfig.public.docsSiteUrl,
embeddedBaseURL: baseURL,
}));
</script>
<template>

View file

@ -1,13 +1,18 @@
<script setup lang="ts">
import { mdiMenu, mdiClose, mdiGithub } from '@mdi/js';
import { buildDocsHref } from '~/utils/docsUrl';
const { t, locale } = useI18n();
const { repoUrl } = useGithubRepo();
const { baseURL } = useRuntimeConfig().app;
const runtimeConfig = useRuntimeConfig();
const { baseURL } = runtimeConfig.app;
const menuOpen = ref(false);
const withBase = (path: string) => `${baseURL.replace(/\/?$/, '/')}${path.replace(/^\/+/, '')}`;
const docsHref = computed(() => withBase(locale.value === 'ru' ? 'docs/ru/' : 'docs/'));
const docsHref = computed(() => buildDocsHref({
locale: locale.value,
docsSiteUrl: runtimeConfig.public.docsSiteUrl,
embeddedBaseURL: baseURL,
}));
const isRu = computed(() => locale.value === 'ru');
const openMenuLabel = computed(() => (isRu.value ? 'Открыть меню' : 'Open menu'));
const closeMenuLabel = computed(() => (isRu.value ? 'Закрыть меню' : 'Close menu'));
@ -811,6 +816,29 @@ const navItems = computed(() => [
}
}
@media (max-width: 360px) {
.app-header__inner {
width: min(100% - 24px, 680px);
}
.app-header__brand-frame {
padding-left: 10px;
padding-right: 34px;
}
.app-header__brand-frame :deep(.app-logo) {
gap: 8px;
}
.app-header__brand-frame :deep(.app-logo__text) {
font-size: 10px;
}
.app-header__mobile-actions {
margin-left: 8px;
}
}
@media (prefers-reduced-motion: reduce) {
.app-header__hud-energy path {
animation: none;

View file

@ -974,9 +974,13 @@ const linuxRobotBubble = computed(() => locale.value === 'ru' ? 'Готов на
}
.download-section__card {
display: grid;
grid-template-columns: 52px minmax(0, 1fr);
align-items: center;
padding: 20px 22px;
gap: 16px;
border-radius: 16px;
text-align: left;
}
.download-section__card-robot-seat {
@ -989,13 +993,28 @@ const linuxRobotBubble = computed(() => locale.value === 'ru' ? 'Готов на
border-radius: 14px;
}
.download-section__card-info {
min-width: 0;
}
.download-section__card-label {
font-size: 1.05rem;
}
.download-section__btn {
padding: 8px 20px;
grid-column: 1 / -1;
justify-content: center;
width: 100%;
min-width: 0;
padding: 9px 18px;
font-size: 0.85rem;
box-sizing: border-box;
}
.download-section__card-indicator {
grid-column: 1 / -1;
justify-content: center;
margin-top: -4px;
}
}
</style>

View file

@ -4,10 +4,12 @@ import {
mdiDownload,
} from "@mdi/js";
import { getLocalizedHeroMessages, type HeroMessagePhase } from "~/data/heroScene";
import { buildDocsHref } from "~/utils/docsUrl";
const { content } = useLandingContent();
const { t, locale } = useI18n();
const { baseURL } = useRuntimeConfig().app;
const runtimeConfig = useRuntimeConfig();
const { baseURL } = runtimeConfig.app;
const heroRef = ref<HTMLElement | null>(null);
const activeHeroMessageIndex = ref(0);
const heroMessagePhase = ref<HeroMessagePhase>("cooldown");
@ -21,7 +23,6 @@ const downloadStore = useDownloadStore();
const { resolve, data: releaseData } = useReleaseDownloads();
const { latestReleaseUrl, releaseDownloadUrl } = useGithubRepo();
const { selectedDownloadAsset } = useDownloadAssetPresentation();
const withBase = (path: string) => `${baseURL.replace(/\/?$/, "/")}${path.replace(/^\/+/, "")}`;
useCyberHeroParallax(heroRef);
@ -71,7 +72,11 @@ const heroDownloadUrl = computed(() => {
return resolve(asset.os, arch)?.url || releaseDownloadUrl(asset.fileName);
});
const docsHref = computed(() => withBase(locale.value === "ru" ? "docs/ru/" : "docs/"));
const docsHref = computed(() => buildDocsHref({
locale: locale.value,
docsSiteUrl: runtimeConfig.public.docsSiteUrl,
embeddedBaseURL: baseURL,
}));
const downloadActionSubtitle = computed(() => {
if (!selectedDownloadAsset.value) {
return locale.value === "ru"

View file

@ -7,17 +7,30 @@ declare const process: {
env: Record<string, string | undefined>;
};
const siteUrl = process.env.NUXT_PUBLIC_SITE_URL || "https://777genius.github.io/agent-teams-ai";
const siteUrl =
process.env.NUXT_PUBLIC_LANDING_SITE_URL ||
process.env.AGENT_TEAMS_LANDING_SITE_URL ||
process.env.NUXT_PUBLIC_SITE_URL ||
"https://777genius.github.io/agent-teams-ai";
const githubRepo = process.env.NUXT_PUBLIC_GITHUB_REPO || "777genius/agent-teams-ai";
const githubReleasesUrl = `https://github.com/${githubRepo}/releases`;
const muxPlaybackId = process.env.NUXT_PUBLIC_MUX_PLAYBACK_ID || "qyeNuDjFqoDALK8eB02jMTOWUz006BdIhiqiAip3U00x7I";
const muxBackgroundPlaybackId = process.env.NUXT_PUBLIC_MUX_BACKGROUND_PLAYBACK_ID || muxPlaybackId;
const docsSiteUrl =
process.env.AGENT_TEAMS_DOCS_SITE_URL || process.env.NUXT_PUBLIC_DOCS_SITE_URL || "";
process.env.NUXT_PUBLIC_SITE_URL = siteUrl;
if (docsSiteUrl) {
process.env.NUXT_PUBLIC_DOCS_SITE_URL = docsSiteUrl;
}
const baseURL = process.env.NUXT_APP_BASE_URL || "/";
const basePrefixedDocsPath = `${baseURL.replace(/\/?$/, "/")}docs`;
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
const defaultSeoTitle = "Agent Teams - AI Agent Orchestration for Developers";
const defaultSeoDescription = "Free, open-source desktop app for AI agent teams. Start with a free model with no auth, then connect Claude, Codex, or OpenCode when you need more models.";
const defaultSeoImage = `${siteUrl.replace(/\/+$/, "")}/og-image-agent-teams-v6.png`;
const robots = process.env.NUXT_PUBLIC_ROBOTS || "noindex, nofollow";
export default defineNuxtConfig({
compatibilityDate: "2026-01-19",
@ -29,7 +42,7 @@ export default defineNuxtConfig({
title: defaultSeoTitle,
meta: [
{ name: "description", content: defaultSeoDescription },
{ name: "robots", content: "noindex, nofollow" },
{ name: "robots", content: robots },
{ property: "og:title", content: defaultSeoTitle },
{ property: "og:description", content: defaultSeoDescription },
{ property: "og:type", content: "website" },
@ -143,6 +156,7 @@ export default defineNuxtConfig({
siteUrl,
githubRepo,
githubReleasesUrl,
docsSiteUrl,
muxPlaybackId,
muxBackgroundPlaybackId
}

View file

@ -3,7 +3,7 @@
"private": true,
"type": "module",
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
},
"scripts": {
"dev": "nuxt dev",

View file

@ -21,15 +21,21 @@ const normalizeBase = (value: string) => {
const withTrailingSlash = (value: string) => `${trimTrailingSlash(value)}/`;
const appBase = normalizeBase(process.env.NUXT_APP_BASE_URL || "/");
const base = appBase === "/" ? "/docs/" : `${appBase}docs/`;
const siteUrl = trimTrailingSlash(
process.env.NUXT_PUBLIC_SITE_URL || "https://777genius.github.io/agent-teams-ai"
const embeddedDocsBase = appBase === "/" ? "/docs/" : `${appBase}docs/`;
const base = process.env.VITEPRESS_BASE ? normalizeBase(process.env.VITEPRESS_BASE) : embeddedDocsBase;
const landingSiteUrl = trimTrailingSlash(
process.env.AGENT_TEAMS_LANDING_SITE_URL ||
process.env.NUXT_PUBLIC_LANDING_SITE_URL ||
process.env.VITEPRESS_LANDING_SITE_URL ||
process.env.NUXT_PUBLIC_SITE_URL ||
"https://777genius.github.io/agent-teams-ai"
);
const configuredDocsSiteUrl = process.env.AGENT_TEAMS_DOCS_SITE_URL || process.env.VITEPRESS_SITE_URL;
const publicBaseUrl =
appBase === "/" || siteUrl.endsWith(trimTrailingSlash(appBase))
? withTrailingSlash(siteUrl)
: `${withTrailingSlash(siteUrl)}${appBase.replace(/^\/+/, "")}`;
const docsUrl = `${publicBaseUrl}docs/`;
appBase === "/" || landingSiteUrl.endsWith(trimTrailingSlash(appBase))
? withTrailingSlash(landingSiteUrl)
: `${withTrailingSlash(landingSiteUrl)}${appBase.replace(/^\/+/, "")}`;
const docsUrl = configuredDocsSiteUrl ? withTrailingSlash(configuredDocsSiteUrl) : `${publicBaseUrl}docs/`;
const downloadUrl = `${publicBaseUrl}download/`;
const ruDownloadUrl = `${publicBaseUrl}ru/download/`;
const ogImageUrl = `${publicBaseUrl}og-image-agent-teams-v6.png`;
@ -40,6 +46,7 @@ const rootGuide: DefaultTheme.SidebarItem[] = [
text: "Start",
items: [
{ text: "Installation", link: "/guide/installation" },
{ text: "Beginner workflow", link: "/guide/beginner-workflow" },
{ text: "Quickstart", link: "/guide/quickstart" },
{ text: "Runtime setup", link: "/guide/runtime-setup" }
]
@ -47,7 +54,10 @@ const rootGuide: DefaultTheme.SidebarItem[] = [
{
text: "Guide",
items: [
{ text: "Create a team", link: "/guide/create-team" },
{ text: "Create your first team", link: "/guide/create-first-team" },
{ text: "Run and monitor work", link: "/guide/run-and-monitor-work" },
{ text: "Review and approve", link: "/guide/review-and-approve" },
{ text: "Team configuration", link: "/guide/create-team" },
{ text: "Agent workflow", link: "/guide/agent-workflow" },
{ text: "Code review", link: "/guide/code-review" },
{ text: "MCP integration", link: "/guide/mcp-integration" },
@ -83,6 +93,7 @@ const ruGuide: DefaultTheme.SidebarItem[] = [
text: "Старт",
items: [
{ text: "Установка", link: "/ru/guide/installation" },
{ text: "Путь новичка", link: "/ru/guide/beginner-workflow" },
{ text: "Быстрый старт", link: "/ru/guide/quickstart" },
{ text: "Настройка рантайма", link: "/ru/guide/runtime-setup" }
]
@ -90,7 +101,10 @@ const ruGuide: DefaultTheme.SidebarItem[] = [
{
text: "Руководство",
items: [
{ text: "Создание команды", link: "/ru/guide/create-team" },
{ text: "Создать первую команду", link: "/ru/guide/create-first-team" },
{ text: "Запуск и мониторинг", link: "/ru/guide/run-and-monitor-work" },
{ text: "Проверка и approval", link: "/ru/guide/review-and-approve" },
{ text: "Настройка команды", link: "/ru/guide/create-team" },
{ text: "Работа агентов", link: "/ru/guide/agent-workflow" },
{ text: "Код-ревью", link: "/ru/guide/code-review" },
{ text: "Интеграция MCP", link: "/ru/guide/mcp-integration" },
@ -122,7 +136,11 @@ const ruGuide: DefaultTheme.SidebarItem[] = [
];
const rootNav: DefaultTheme.NavItem[] = [
{ text: "Guide", link: "/guide/quickstart", activeMatch: "^/guide/(?!troubleshooting(?:/|$))" },
{
text: "Guide",
link: "/guide/beginner-workflow",
activeMatch: "^/guide/(?!troubleshooting(?:/|$))"
},
{ text: "Developers", link: "/developers/", activeMatch: "^/developers/" },
{ text: "Reference", link: "/reference/concepts", activeMatch: "^/reference/" },
{
@ -136,7 +154,7 @@ const rootNav: DefaultTheme.NavItem[] = [
const ruNav: DefaultTheme.NavItem[] = [
{
text: "Руководство",
link: "/ru/guide/quickstart",
link: "/ru/guide/beginner-workflow",
activeMatch: "^/ru/guide/(?!troubleshooting(?:/|$))"
},
{ text: "Разработчикам", link: "/ru/developers/", activeMatch: "^/ru/developers/" },

View file

@ -6,7 +6,7 @@ const props = withDefaults(defineProps<{ type?: "start" | "reference" }>(), {
type: "start"
});
type CardText = { title: string; desc: string };
type CardText = { title: string; desc: string; icon?: string; link?: string };
// Locales that have their own translated card copy. Anything else falls back to English (root).
const KNOWN_LOCALES = ["ru", "zh", "es", "ja", "fr", "de"] as const;
@ -26,10 +26,12 @@ const REFERENCE_ICONS = ["◈", "⌁", "▦", "⌘", "?"];
const CARD_TEXT: Record<string, { start: CardText[]; reference: CardText[] }> = {
"": {
start: [
{ title: "Quickstart", desc: "Install the app and create your first team." },
{ title: "Installation", desc: "Platforms, releases, and running from source." },
{ title: "Create a team", desc: "Roles, lead prompt, and task boundaries." },
{ title: "Code review", desc: "Review task changes with hunk-level decisions." }
{ icon: "01", title: "Beginner workflow", desc: "Understand the first run from project to approval.", link: "/guide/beginner-workflow" },
{ icon: "02", title: "Quickstart", desc: "Install the app and validate the base launch.", link: "/guide/quickstart" },
{ icon: "03", title: "First team", desc: "Lead, builder, reviewer, roles, models, and Worktree.", link: "/guide/create-first-team" },
{ icon: "04", title: "Run work", desc: "Lead brief, task board, comments, and monitoring.", link: "/guide/run-and-monitor-work" },
{ icon: "05", title: "Review and approve", desc: "Task detail, logs, diff, and hunk-level decisions.", link: "/guide/review-and-approve" },
{ icon: "06", title: "Runtime setup", desc: "Claude, Codex, OpenCode, and multimodel setup.", link: "/guide/runtime-setup" }
],
reference: [
{ title: "Concepts", desc: "Teams, tasks, roles, and autonomy levels." },
@ -41,10 +43,12 @@ const CARD_TEXT: Record<string, { start: CardText[]; reference: CardText[] }> =
},
ru: {
start: [
{ title: "Быстрый старт", desc: "Поставить приложение и создать первую команду." },
{ title: "Установка", desc: "Платформы, релизы и запуск из исходников." },
{ title: "Создание команды", desc: "Роли, lead prompt и границы работы." },
{ title: "Код-ревью", desc: "Проверка изменений по задачам и hunk-level decisions." }
{ icon: "01", title: "Путь новичка", desc: "Понять весь первый запуск от проекта до approval.", link: "/ru/guide/beginner-workflow" },
{ icon: "02", title: "Быстрый старт", desc: "Поставить приложение и проверить базовый запуск.", link: "/ru/guide/quickstart" },
{ icon: "03", title: "Первая команда", desc: "Lead, builder, reviewer, роли, модели и Worktree.", link: "/ru/guide/create-first-team" },
{ icon: "04", title: "Запуск работы", desc: "Brief для lead, task board, comments и monitoring.", link: "/ru/guide/run-and-monitor-work" },
{ icon: "05", title: "Review и approval", desc: "Task detail, logs, diff и hunk-level decisions.", link: "/ru/guide/review-and-approve" },
{ icon: "06", title: "Рантаймы", desc: "Claude, Codex, OpenCode и multimodel setup.", link: "/ru/guide/runtime-setup" }
],
reference: [
{ title: "Концепции", desc: "Команды, задачи, роли и уровни автономности." },
@ -147,10 +151,10 @@ const cards = computed(() => {
const prefix = locale.value ? `/${locale.value}` : "";
return entries.map((entry, index) => ({
icon: icons[index],
icon: entry.icon ?? icons[index] ?? String(index + 1).padStart(2, "0"),
title: entry.title,
desc: entry.desc,
link: `${prefix}${links[index]}`
link: entry.link ?? `${prefix}${links[index]}`
}));
});
</script>

View file

@ -0,0 +1,108 @@
---
title: "Beginner Workflow - Agent Teams Docs"
description: "A structured first-run path for new users. Learn the project, team, task board, task detail, and review surfaces before launching larger teams."
---
# Beginner Workflow
Use this path when you are new to Agent Teams and want a clear sequence from "open the app" to "approve useful work".
The first run should prove four things:
1. The app can open your project.
2. A small team can launch with the selected runtime.
3. Tasks move through the board in a visible way.
4. You can review and approve changes before they are treated as done.
## The basic model
Agent Teams has four working surfaces:
| Surface | What you do there |
| --- | --- |
| Project and team selector | Pick the project and the team that will work on it. |
| Team editor | Name the team, add members, choose roles, models, and worktree settings. |
| Task board | Watch work move through Todo, In Progress, Review, Done, and Approved. |
| Task detail and review | Read the task, inspect logs, check changes, and approve or request fixes. |
<ZoomImage src="/screenshots/guides/task-board-annotated.png" alt="Annotated Agent Teams task board" caption="The board is the main operating surface after launch: messages, columns, review cards, and the task list stay visible together." />
## Recommended guide order
Follow these guides in order for the first successful run:
1. [Create your first team](/guide/create-first-team) - set up a small lead-builder-reviewer team.
2. [Run and monitor work](/guide/run-and-monitor-work) - give the lead a concrete goal and watch the task board.
3. [Review and approve](/guide/review-and-approve) - inspect task details, logs, and code changes.
4. [Troubleshooting](/guide/troubleshooting) - use this if launch, messages, or task logs do not look healthy.
## Before you launch
Start with a Git-tracked project and a known baseline:
```bash
git status --short
```
You do not need a perfectly clean tree, but you should know which files are already changed. That makes review safer after agents start editing.
For the first run, keep the team small:
| Member | Good first responsibility |
| --- | --- |
| Lead | Split the goal into tasks and coordinate status. |
| Builder | Implement scoped tasks. |
| Reviewer | Review completed tasks and ask for fixes. |
Avoid launching many teammates at once. More agents increase logs, concurrent edits, provider usage, and review load.
## First goal template
Use a goal that has clear scope, boundaries, and verification:
```text
Improve the documentation quickstart. Keep edits inside landing/product-docs, add practical examples, preserve existing VitePress syntax, and run `pnpm --dir landing docs:build` before marking tasks done.
```
Good first goals are specific, testable, and limited to a known area. Avoid prompts like "make the app better" until you understand the workflow.
## What healthy progress looks like
During a healthy run:
- The lead creates small tasks rather than one huge task.
- Each teammate posts a plan or progress comment.
- Work moves from Todo to In Progress.
- Finished work moves to Review before approval.
- The task detail shows the description, attachments, changes, and execution logs.
- The final comment includes the verification command and result.
## When to intervene
Intervene when a task is vague, too broad, blocked, or missing verification. Use a task comment when the message belongs to one task. Use a direct message when you need to redirect a teammate or the lead.
Common intervention prompts:
```text
Split this into smaller tasks. Each task should have a narrow file scope and a clear verification step.
```
```text
Before continuing, post the files you plan to change and the command you will run to verify the result.
```
```text
This task is too broad. Keep the change inside the docs guide pages and avoid touching app runtime code.
```
## Completion checklist
Before you call the first run successful, verify:
- The team launched without runtime errors.
- At least one task moved through Review.
- You inspected the task diff.
- The result comment includes a verification result.
- You understand which files changed and why.
Then continue to [Create your first team](/guide/create-first-team).

View file

@ -0,0 +1,111 @@
---
title: "Create Your First Team - Agent Teams Docs"
description: "Step-by-step setup for a first Agent Teams team with lead, builder, reviewer, roles, models, worktree isolation, and a clear launch brief."
---
# Create Your First Team
This guide walks through the first team setup. The goal is not to build the biggest team possible. The goal is to create a small team that launches reliably and produces reviewable tasks.
## 1. Open the target project
Open the project you want agents to work in. Prefer a Git-tracked project so Agent Teams can show diffs, task-linked changes, and review state.
Before launching, check the baseline:
```bash
git status --short
```
If there are existing user changes, keep them in mind during review. Agent Teams can work in a dirty tree, but review is clearer when you know what existed before launch.
## 2. Create the team
Use the team selector, then create a new team for the current project. Give it a short operational name, such as `docs-onboarding`, `landing-fixes`, or `runtime-audit`.
<ZoomImage src="/screenshots/guides/create-team-annotated.png" alt="Annotated Create Team dialog" caption="Create Team: name the team, add members, choose roles and models, then enable Worktree only when you want isolated Git worktrees." />
## 3. Start with three roles
Use this first-team shape:
| Role | Responsibility | Why it helps |
| --- | --- | --- |
| Lead | Splits the goal into tasks, assigns owners, tracks blockers. | Keeps work coordinated. |
| Builder | Implements scoped tasks. | Produces the actual change. |
| Reviewer | Reviews completed tasks and asks for fixes. | Prevents unreviewed output from being treated as complete. |
You can add specialists later. For the first run, a small team is easier to debug and review.
## 4. Choose provider and model per member
Each member needs a provider and model. Use the most reliable runtime for the lead, because the lead controls task breakdown and coordination.
Common first setup:
| Member | Suggested provider style |
| --- | --- |
| Lead | The most reliable model you have available. |
| Builder | A fast model that can handle scoped implementation. |
| Reviewer | A careful model with stronger reasoning. |
If a provider is missing, fix runtime setup before launching. See [Runtime setup](/guide/runtime-setup).
## 5. Decide on Worktree
Enable **Worktree** when teammates may edit the same repository in parallel and you want Git isolation. Keep it off for a very small first run if you want the simplest setup.
Use Worktree when:
- multiple teammates can edit code at the same time
- you want cleaner diffs per member
- the project is already Git-tracked
Avoid Worktree when:
- the project is not a Git repo
- you are only testing the UI flow
- you want the fewest moving parts for the first launch
## 6. Write member instructions
Give each member a short workflow. The member prompt should describe responsibility, not the whole project.
Lead example:
```text
Split the user goal into small tasks. Assign clear owners, avoid broad refactors, keep task comments updated, and request review before approval.
```
Builder example:
```text
Implement only the assigned task. Keep changes scoped, post the files you changed, and include the verification command and result before marking work complete.
```
Reviewer example:
```text
Review completed tasks for correctness, regressions, missing tests, and scope creep. Ask for fixes with specific comments before approving.
```
## 7. Launch with a narrow goal
Use a launch brief with outcome, scope, boundaries, and verification:
```text
Improve the docs onboarding path. Keep changes inside landing/product-docs. Create a beginner-friendly guide sequence, add practical examples, preserve VitePress syntax, and run `pnpm --dir landing docs:build`.
```
## 8. Confirm the launch is healthy
After launch:
- The lead should create tasks.
- At least one teammate should start a task.
- The board should show movement into In Progress.
- Task comments or logs should show what the teammate is doing.
If launch hangs or no tasks appear, go to [Troubleshooting](/guide/troubleshooting#team-does-not-launch).
Next: [Run and monitor work](/guide/run-and-monitor-work).

View file

@ -0,0 +1,88 @@
---
title: "Review and Approve - Agent Teams Docs"
description: "A beginner-friendly review workflow for task details, execution logs, code changes, hunk decisions, approvals, and fix requests."
---
# Review and Approve
Do not treat agent work as finished until you have checked the task result, logs, and changes. Review is where you keep quality and scope under control.
## 1. Open the task
Start from a task in Review or Done. Read the title, owner, status, and description first.
<ZoomImage src="/screenshots/guides/task-detail-annotated.png" alt="Annotated task detail view for review" caption="Start with the task description, then check attachments, changes, and execution logs before approving anything." />
Look for:
- a clear task goal
- files or areas that match the requested scope
- a final comment from the teammate
- a verification command and result
## 2. Check execution evidence
Execution Logs answer the basic trust questions:
| Question | What to look for |
| --- | --- |
| Did the agent actually work on this task? | Tool calls, comments, and status changes inside the task timeline. |
| Did it run verification? | Build, test, lint, or docs commands with visible results. |
| Did it coordinate with others? | Messages or comments that explain handoffs and blockers. |
| Did it touch unexpected files? | Changes that do not match the task description. |
If logs and final comment disagree, ask for clarification before approving.
## 3. Review the diff
Open **Changes** and inspect each changed file.
<ZoomImage src="/screenshots/guides/code-review-annotated.png" alt="Annotated code review screen with changed files, Accept All, and hunk actions" caption="Review each file first. Use Accept All only after you understand the diff. Keep or undo individual hunks when only part of a change is correct." />
Use this order:
1. Read the file list.
2. Open each changed file.
3. Check whether the changes match the task.
4. Keep correct hunks.
5. Undo or reject risky hunks.
6. Approve only after all important files are reviewed.
## 4. Request fixes clearly
When something is wrong, do not just reject the task. Leave a specific fix request:
```text
Please keep the copy improvements, but revert the unrelated runtime wording in the provider table. Add the `pnpm --dir landing docs:build` result before resubmitting.
```
Good fix requests name:
- what to keep
- what to change
- what to avoid
- what verification is required
## 5. Approve only when the result is complete
Approve when:
- the task scope is satisfied
- the diff matches the task
- verification passed or the missing verification is explicitly justified
- no unrelated changes are mixed in
- comments explain important decisions
If the task changed docs or UI, also open the relevant page or app screen before approval.
## 6. Final checklist
Before closing the review:
- Files changed are expected.
- The task has a final result comment.
- Verification result is present.
- Risky hunks were checked individually.
- The lead or reviewer marked the task approved.
If anything is unclear, request changes instead of approving.

View file

@ -0,0 +1,100 @@
---
title: "Run and Monitor Work - Agent Teams Docs"
description: "Learn how to brief the lead, read the task board, use messages and comments, open task details, and keep agent work moving."
---
# Run and Monitor Work
After the team launches, your job is to keep the work visible, scoped, and reviewable. The board is the main operating surface.
## 1. Brief the lead clearly
The lead needs a goal that can be split into tasks. Include:
- the outcome
- the allowed files or product area
- what not to touch
- verification commands
- when to ask for review
Good brief:
```text
Create a beginner docs path. Keep edits inside landing/product-docs. Add screenshots where they clarify actions. Do not touch runtime code. Run `pnpm --dir landing docs:build` before marking tasks complete.
```
Weak brief:
```text
Improve docs.
```
The weak brief can work, but it gives the lead too much freedom and makes review harder.
## 2. Read the board by lane
<ZoomImage src="/screenshots/guides/task-board-annotated.png" alt="Annotated task board with messages, kanban lanes, review cards, and task list" caption="Use the board to scan messages, task state, review-ready work, and the right-side task list without opening raw files." />
| Lane | What it means | What you should do |
| --- | --- | --- |
| Todo | Tasks exist but are not active yet. | Check whether task titles are specific enough. |
| In Progress | A teammate is actively working. | Watch for updates and avoid assigning duplicate work. |
| Review | Work needs inspection. | Open the task and review changes. |
| Done | Work is completed but may still need review flow. | Confirm review state before trusting it. |
| Approved | Review passed. | Treat as completed output. |
## 3. Use messages and comments deliberately
Use task comments for task-specific context:
```text
Please keep this task scoped to the quickstart page. Do not change runtime setup wording in this pass.
```
Use direct messages for coordination:
```text
Lead, pause new task creation until the current review queue is cleared.
```
Prefer task comments when possible. They stay attached to the work and make review easier.
## 4. Open task detail when a card needs attention
Open the task detail when:
- the title is too vague
- the task has been in progress too long
- the task is ready for review
- the output mentions files you did not expect
- you need to inspect attachments, changes, or logs
<ZoomImage src="/screenshots/guides/task-detail-annotated.png" alt="Annotated task detail view with description, attachments, changes, and execution logs" caption="Task detail is where you confirm the task scope, attached context, changed files, and runtime evidence." />
## 5. Keep work unblocked
If a teammate is blocked, ask for the smallest next step:
```text
Post the blocker, the file or command involved, and the next action you need from the lead or user.
```
If the task is too large, ask the lead to split it:
```text
Split this into separate tasks for copy edits, screenshot assets, and navigation updates. Keep each task independently reviewable.
```
## 6. Decide when to stop the team
Stop or pause when:
- the review queue is larger than you can inspect
- the lead creates vague tasks repeatedly
- runtime errors appear in multiple tasks
- agents start editing unrelated files
- verification is missing from completed work
You can always relaunch after tightening the brief.
Next: [Review and approve](/guide/review-and-approve).

View file

@ -8,8 +8,8 @@ hero:
tagline: Create teams, watch work move across a kanban board, review code changes, and coordinate Claude, Codex, OpenCode, and multimodel workflows without giving up local control.
actions:
- theme: brand
text: Quickstart
link: /guide/quickstart
text: Beginner workflow
link: /guide/beginner-workflow
- theme: alt
text: Install
link: /guide/installation
@ -62,6 +62,10 @@ Agent Teams is a free desktop app for orchestrating AI agent teams. You are not
After creating your first team, explore these guides to go further:
- **Runtime setup** - configure Claude, Codex, OpenCode, or multimodel providers: [Configure runtimes](/guide/runtime-setup)
- **Beginner workflow** - follow the complete first-run path from project to approval: [Start the walkthrough](/guide/beginner-workflow)
- **Create your first team** - set up lead, builder, reviewer, roles, models, and Worktree: [Create the team](/guide/create-first-team)
- **Run and monitor work** - read the board, comments, task detail, and logs: [Run the team](/guide/run-and-monitor-work)
- **Review and approve** - inspect task results and code changes before approval: [Review work](/guide/review-and-approve)
- **Agent workflow** - understand how agents coordinate through the task board: [Understand workflow](/guide/agent-workflow)
- **Team brief examples** - learn prompt patterns from real-world briefs: [See examples](/guide/team-brief-examples)
- **Code review** - inspect diffs, accept or reject changes: [Review changes](/guide/code-review)
@ -77,4 +81,4 @@ Use the reference pages when you need exact terminology, provider behavior, cont
## Product preview
<ZoomImage src="/screenshots/1.jpg" alt="Agent Teams kanban board" caption="Task status, teammate activity, and review workflow stay visible in one workspace." />
<ZoomImage src="/screenshots/product-preview.jpg" alt="Agent Teams kanban board" caption="Task status, teammate activity, and review workflow stay visible in one workspace." />

View file

@ -0,0 +1,109 @@
---
title: "Путь новичка - Документация Agent Teams"
description: "Структурированный первый запуск для новых пользователей: проект, команда, доска задач, карточка задачи и ревью."
lang: ru-RU
---
# Путь новичка
Этот маршрут нужен, если вы впервые открыли Agent Teams и хотите пройти путь от запуска приложения до безопасного approval результата.
Первый запуск должен доказать четыре вещи:
1. Приложение открывает ваш проект.
2. Небольшая команда запускается с выбранным runtime.
3. Задачи двигаются по доске и их состояние видно.
4. Вы можете проверить изменения до approval.
## Базовая модель
В Agent Teams есть четыре основные рабочие поверхности:
| Поверхность | Что там делать |
| --- | --- |
| Project и team selector | Выбрать проект и команду, которая будет в нём работать. |
| Team editor | Назвать команду, добавить участников, выбрать роли, модели и worktree-настройки. |
| Task board | Смотреть, как задачи проходят Todo, In Progress, Review, Done и Approved. |
| Task detail и review | Читать задачу, проверять логи, смотреть изменения и approve/request fixes. |
<ZoomImage src="/screenshots/guides/task-board-annotated.png" alt="Аннотированная доска задач Agent Teams" caption="Доска - главная рабочая поверхность после запуска: сообщения, колонки, review-карточки и список задач видны вместе." />
## Рекомендуемый порядок гайдов
Для первого успешного запуска идите в таком порядке:
1. [Создать первую команду](/ru/guide/create-first-team) - собрать небольшую команду lead-builder-reviewer.
2. [Запустить и отслеживать работу](/ru/guide/run-and-monitor-work) - дать lead конкретную цель и следить за task board.
3. [Проверить и approve](/ru/guide/review-and-approve) - проверить task detail, logs и code changes.
4. [Диагностика](/ru/guide/troubleshooting) - если запуск, сообщения или task logs выглядят неправильно.
## Перед запуском
Начинайте с Git-проекта и понятного baseline:
```bash
git status --short
```
Чистое дерево не обязательно, но важно понимать, какие изменения уже были до запуска агентов.
Для первого запуска держите команду маленькой:
| Участник | Первая ответственность |
| --- | --- |
| Lead | Разбивает цель на задачи и координирует статус. |
| Builder | Делает ограниченные implementation tasks. |
| Reviewer | Проверяет завершённые задачи и просит исправления. |
Не запускайте сразу много участников. Больше агентов - больше логов, параллельных правок, provider usage и review-нагрузки.
## Шаблон первой цели
Цель должна иметь scope, границы и verification:
```text
Improve the documentation quickstart. Keep edits inside landing/product-docs, add practical examples, preserve existing VitePress syntax, and run `pnpm --dir landing docs:build` before marking tasks done.
```
Хорошая первая цель конкретная, проверяемая и ограничена известной областью.
## Как выглядит здоровый прогресс
В здоровом запуске:
- lead создаёт маленькие задачи, а не одну огромную
- каждый teammate пишет план или progress comment
- работа двигается из Todo в In Progress
- завершённая работа попадает в Review до approval
- task detail показывает description, attachments, changes и execution logs
- финальный comment содержит verification command и result
## Когда вмешиваться
Вмешивайтесь, если задача слишком широкая, размытая, заблокирована или без verification. Пишите task comment, если сообщение относится к конкретной задаче. Пишите direct message, если надо перенаправить teammate или lead.
Примеры:
```text
Split this into smaller tasks. Each task should have a narrow file scope and a clear verification step.
```
```text
Before continuing, post the files you plan to change and the command you will run to verify the result.
```
```text
This task is too broad. Keep the change inside the docs guide pages and avoid touching app runtime code.
```
## Checklist завершения
Первый запуск можно считать успешным, если:
- команда запустилась без runtime errors
- хотя бы одна задача прошла через Review
- вы открыли и проверили diff
- result comment содержит verification result
- понятно, какие файлы изменились и почему
Дальше: [Создать первую команду](/ru/guide/create-first-team).

View file

@ -0,0 +1,112 @@
---
title: "Создать первую команду - Документация Agent Teams"
description: "Пошаговая настройка первой команды: lead, builder, reviewer, роли, модели, worktree isolation и launch brief."
lang: ru-RU
---
# Создать первую команду
Цель первого setup - не собрать самую большую команду, а создать маленькую команду, которая стабильно запускается и делает reviewable tasks.
## 1. Откройте проект
Откройте проект, в котором агенты будут работать. Лучше использовать Git-проект, чтобы Agent Teams мог показывать diff, task-linked changes и review state.
Перед запуском проверьте baseline:
```bash
git status --short
```
Если уже есть ваши изменения, учитывайте их при review.
## 2. Создайте команду
Через team selector создайте новую команду для текущего проекта. Название держите коротким и рабочим: `docs-onboarding`, `landing-fixes`, `runtime-audit`.
<ZoomImage src="/screenshots/guides/create-team-annotated.png" alt="Аннотированный диалог Create Team" caption="Create Team: назовите команду, добавьте участников, выберите роли и модели, затем включайте Worktree только если нужна Git-изоляция." />
## 3. Начните с трёх ролей
Рекомендуемая первая форма команды:
| Роль | Ответственность | Зачем |
| --- | --- | --- |
| Lead | Делит цель на задачи, назначает owners, отслеживает blockers. | Держит работу скоординированной. |
| Builder | Делает scoped implementation tasks. | Создаёт основное изменение. |
| Reviewer | Проверяет completed tasks и просит fixes. | Не даёт непроверенному результату стать финальным. |
Специалистов можно добавить позже. Для первого запуска маленькую команду легче диагностировать и ревьюить.
## 4. Выберите provider и model для каждого
Каждому участнику нужен provider и model. Для lead выбирайте самый надёжный runtime, потому что lead управляет decomposition и coordination.
Обычная первая настройка:
| Участник | Какой provider выбрать |
| --- | --- |
| Lead | Самую надёжную модель из доступных. |
| Builder | Быструю модель для scoped implementation. |
| Reviewer | Более аккуратную модель с сильным reasoning. |
Если provider отсутствует, сначала исправьте runtime setup: [Настройка рантайма](/ru/guide/runtime-setup).
## 5. Решите, нужен ли Worktree
Включайте **Worktree**, когда участники могут параллельно менять один репозиторий и нужна Git-изоляция. Для самого простого первого запуска можно оставить выключенным.
Worktree полезен, когда:
- несколько teammates могут одновременно менять код
- нужны более чистые diffs по участникам
- проект уже является Git-репозиторием
Не включайте Worktree, если:
- проект не в Git
- вы только проверяете UI flow
- хотите минимум движущихся частей в первом запуске
## 6. Напишите инструкции участникам
Member prompt должен описывать ответственность участника, а не весь проект.
Lead:
```text
Split the user goal into small tasks. Assign clear owners, avoid broad refactors, keep task comments updated, and request review before approval.
```
Builder:
```text
Implement only the assigned task. Keep changes scoped, post the files you changed, and include the verification command and result before marking work complete.
```
Reviewer:
```text
Review completed tasks for correctness, regressions, missing tests, and scope creep. Ask for fixes with specific comments before approving.
```
## 7. Запустите с узкой целью
Launch brief должен содержать outcome, scope, boundaries и verification:
```text
Improve the docs onboarding path. Keep changes inside landing/product-docs. Create a beginner-friendly guide sequence, add practical examples, preserve VitePress syntax, and run `pnpm --dir landing docs:build`.
```
## 8. Проверьте, что запуск здоровый
После запуска:
- lead создаёт задачи
- хотя бы один teammate начинает задачу
- board показывает движение в In Progress
- task comments или logs показывают, что делает teammate
Если запуск завис или задач нет, откройте [Диагностику](/ru/guide/troubleshooting#team-does-not-launch).
Дальше: [Запустить и отслеживать работу](/ru/guide/run-and-monitor-work).

View file

@ -0,0 +1,89 @@
---
title: "Проверить и approve - Документация Agent Teams"
description: "Понятный workflow ревью: task detail, execution logs, code changes, hunk decisions, approvals и fix requests."
lang: ru-RU
---
# Проверить и approve
Не считайте работу агента завершённой, пока не проверили результат задачи, logs и changes. Review удерживает качество и scope.
## 1. Откройте задачу
Начните с задачи в Review или Done. Сначала прочитайте title, owner, status и description.
<ZoomImage src="/screenshots/guides/task-detail-annotated.png" alt="Аннотированный task detail для review" caption="Начните с task description, затем проверьте attachments, changes и execution logs до approval." />
Проверьте:
- понятная ли цель задачи
- совпадают ли файлы с ожидаемым scope
- есть ли final comment от teammate
- есть ли verification command и result
## 2. Проверьте execution evidence
Execution Logs отвечают на базовые вопросы доверия:
| Вопрос | Что искать |
| --- | --- |
| Агент реально работал над этой задачей? | Tool calls, comments и status changes внутри task timeline. |
| Он запускал verification? | Build, test, lint или docs commands с результатом. |
| Он координировался с другими? | Messages или comments с handoffs и blockers. |
| Он трогал неожиданные файлы? | Changes, которые не совпадают с task description. |
Если logs и final comment расходятся, попросите уточнение до approval.
## 3. Проверьте diff
Откройте **Changes** и просмотрите каждый changed file.
<ZoomImage src="/screenshots/guides/code-review-annotated.png" alt="Аннотированный code review screen с changed files, Accept All и hunk actions" caption="Сначала проверьте каждый file. Accept All используйте только после понимания diff. Keep или undo применяйте для отдельных hunks." />
Порядок:
1. Прочитать file list.
2. Открыть каждый changed file.
3. Проверить, что изменения совпадают с задачей.
4. Keep для правильных hunks.
5. Undo или reject для рискованных hunks.
6. Approve только после проверки важных files.
## 4. Просите fixes конкретно
Если что-то не так, не ограничивайтесь reject. Оставьте конкретный fix request:
```text
Please keep the copy improvements, but revert the unrelated runtime wording in the provider table. Add the `pnpm --dir landing docs:build` result before resubmitting.
```
Хороший fix request называет:
- что оставить
- что изменить
- чего избегать
- какая verification обязательна
## 5. Approve только полный результат
Approve уместен, когда:
- task scope закрыт
- diff совпадает с задачей
- verification прошёл или отсутствие verification объяснено
- нет unrelated changes
- comments объясняют важные решения
Если task менял docs или UI, перед approval откройте соответствующую страницу или экран приложения.
## 6. Финальный checklist
Перед закрытием review:
- изменённые files ожидаемые
- есть final result comment
- есть verification result
- risky hunks проверены отдельно
- lead или reviewer поставил approved
Если что-то непонятно, request changes лучше, чем approve.

View file

@ -0,0 +1,101 @@
---
title: "Запустить и отслеживать работу - Документация Agent Teams"
description: "Как дать lead понятный brief, читать task board, использовать messages и comments, открывать task detail и удерживать работу в движении."
lang: ru-RU
---
# Запустить и отслеживать работу
После запуска команды ваша задача - держать работу видимой, ограниченной и готовой к review. Главная поверхность - board.
## 1. Дайте lead понятный brief
Lead нужна цель, которую можно разбить на задачи. Укажите:
- outcome
- разрешённые файлы или область продукта
- что не трогать
- verification commands
- когда просить review
Хороший brief:
```text
Create a beginner docs path. Keep edits inside landing/product-docs. Add screenshots where they clarify actions. Do not touch runtime code. Run `pnpm --dir landing docs:build` before marking tasks complete.
```
Слабый brief:
```text
Improve docs.
```
Слабый brief даёт lead слишком много свободы и усложняет review.
## 2. Читайте board по колонкам
<ZoomImage src="/screenshots/guides/task-board-annotated.png" alt="Аннотированная доска с messages, kanban lanes, review cards и task list" caption="Board помогает одновременно видеть messages, task state, review-ready work и правый task list без чтения raw-файлов." />
| Колонка | Что значит | Что делать |
| --- | --- | --- |
| Todo | Задачи есть, но ещё не активны. | Проверить, достаточно ли конкретные titles. |
| In Progress | Teammate активно работает. | Смотреть updates и не назначать duplicate work. |
| Review | Работу нужно проверить. | Открыть task и review changes. |
| Done | Работа завершена, но может требовать review flow. | Проверить review state перед доверием результату. |
| Approved | Review прошёл. | Считать результат завершённым. |
## 3. Используйте messages и comments осознанно
Task comments подходят для контекста конкретной задачи:
```text
Please keep this task scoped to the quickstart page. Do not change runtime setup wording in this pass.
```
Direct messages подходят для координации:
```text
Lead, pause new task creation until the current review queue is cleared.
```
Если возможно, предпочитайте task comments. Они остаются привязанными к работе.
## 4. Открывайте task detail, когда карточке нужно внимание
Открывайте task detail, если:
- title слишком размытый
- задача слишком долго in progress
- задача готова к review
- output упоминает неожиданные файлы
- нужно проверить attachments, changes или logs
<ZoomImage src="/screenshots/guides/task-detail-annotated.png" alt="Аннотированная карточка задачи с description, attachments, changes и execution logs" caption="Task detail помогает подтвердить scope, attached context, changed files и runtime evidence." />
## 5. Разблокируйте работу
Если teammate заблокирован, попросите минимальный следующий шаг:
```text
Post the blocker, the file or command involved, and the next action you need from the lead or user.
```
Если задача слишком большая, попросите lead разделить её:
```text
Split this into separate tasks for copy edits, screenshot assets, and navigation updates. Keep each task independently reviewable.
```
## 6. Когда остановить команду
Остановите или поставьте на паузу, если:
- review queue больше, чем вы можете проверить
- lead повторно создаёт размытые задачи
- runtime errors появляются в нескольких задачах
- агенты начали менять unrelated files
- completed work не содержит verification
Команду можно перезапустить после уточнения brief.
Дальше: [Проверить и approve](/ru/guide/review-and-approve).

View file

@ -9,8 +9,8 @@ hero:
tagline: Создавайте команды, наблюдайте за канбан-доской, ревьюйте изменения и координируйте Claude, Codex, OpenCode и multimodel workflows без потери локального контроля.
actions:
- theme: brand
text: Быстрый старт
link: /ru/guide/quickstart
text: Путь новичка
link: /ru/guide/beginner-workflow
- theme: alt
text: Установка
link: /ru/guide/installation
@ -63,6 +63,10 @@ Agent Teams - бесплатное desktop-приложение для орке
После создания первой команды изучите эти руководства:
- **Настройка рантайма** - настройте Claude, Codex, OpenCode или multimodel-провайдеров: [Настроить рантаймы](/ru/guide/runtime-setup)
- **Путь новичка** - полный первый маршрут от проекта до approval: [Начать walkthrough](/ru/guide/beginner-workflow)
- **Создать первую команду** - lead, builder, reviewer, роли, модели и Worktree: [Создать команду](/ru/guide/create-first-team)
- **Запустить и отслеживать работу** - board, comments, task detail и logs: [Запустить работу](/ru/guide/run-and-monitor-work)
- **Проверить и approve** - task results и code changes до approval: [Проверить работу](/ru/guide/review-and-approve)
- **Workflow агентов** - как агенты координируются через task board: [Разобрать workflow](/ru/guide/agent-workflow)
- **Примеры team briefs** - паттерны промптов из реальных примеров: [Примеры](/ru/guide/team-brief-examples)
- **Код-ревью** - проверяйте diff, принимайте или отклоняйте изменения: [Ревью изменений](/ru/guide/code-review)
@ -78,4 +82,4 @@ Agent Teams - бесплатное desktop-приложение для орке
## Превью продукта
<ZoomImage src="/screenshots/1.jpg" alt="Канбан-доска Agent Teams" caption="Статусы задач, активность агентов и review workflow видны в одном рабочем пространстве." />
<ZoomImage src="/screenshots/product-preview.jpg" alt="Канбан-доска Agent Teams" caption="Статусы задач, активность агентов и review workflow видны в одном рабочем пространстве." />

View file

@ -0,0 +1,15 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"types": ["vitepress/client"],
"strict": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true
},
"include": [".vitepress/**/*.ts", ".vitepress/**/*.vue"]
}

View file

@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=https://agent-teams-ai-docs.onrender.com/">
<link rel="canonical" href="https://agent-teams-ai-docs.onrender.com/">
<title>Redirecting to Agent Teams Docs</title>
</head>
<body>
<a href="https://agent-teams-ai-docs.onrender.com/">Agent Teams Docs</a>
</body>
</html>

View file

@ -0,0 +1,12 @@
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=https://agent-teams-ai-docs.onrender.com/ru/">
<link rel="canonical" href="https://agent-teams-ai-docs.onrender.com/ru/">
<title>Redirecting to Agent Teams Docs</title>
</head>
<body>
<a href="https://agent-teams-ai-docs.onrender.com/ru/">Agent Teams Docs</a>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

View file

@ -1,4 +1,5 @@
import { defaultLocale, getLocalizedPagePath, sitemapPages, supportedLocales } from "~/data/i18n";
import { normalizeDocsSiteUrl } from "~/utils/docsUrl";
const trimTrailingSlash = (value: string) => value.replace(/\/+$/, "");
@ -11,6 +12,7 @@ export default defineEventHandler((event) => {
const githubUrl = `https://github.com/${githubRepo}`;
const releasesUrl = `${githubUrl}/releases`;
const toSiteUrl = (path: string) => `${siteUrl}${path === "/" ? "/" : `/${path.replace(/^\/+/, "")}`}`;
const docsSiteUrl = normalizeDocsSiteUrl(config.public.docsSiteUrl) || toSiteUrl("/docs/");
setHeader(event, "content-type", "text/plain; charset=utf-8");
@ -32,8 +34,8 @@ export default defineEventHandler((event) => {
- Homepage (${defaultLocale}): ${toSiteUrl("/")}
- Download: ${toSiteUrl("/download")}
- Documentation: ${toSiteUrl("/docs/")}
- Documentation llms.txt: ${toSiteUrl("/docs/llms.txt")}
- Documentation: ${docsSiteUrl}
- Documentation llms.txt: ${docsSiteUrl}llms.txt
- GitHub repository: ${githubUrl}
- Releases: ${releasesUrl}
- Sitemap: ${toSiteUrl("/sitemap.xml")}

View file

@ -1,12 +1,15 @@
import { normalizeDocsSiteUrl } from "~/utils/docsUrl";
export default defineEventHandler((event) => {
const config = useRuntimeConfig();
const siteUrl = ((config.public.siteUrl as string) || "https://777genius.github.io/agent-teams-ai").replace(/\/+$/, "");
const docsSiteUrl = normalizeDocsSiteUrl(config.public.docsSiteUrl) || `${siteUrl}/docs/`;
setHeader(event, "content-type", "text/plain; charset=utf-8");
return `User-agent: *
Allow: /
Sitemap: ${siteUrl}/sitemap.xml
Sitemap: ${siteUrl}/docs/sitemap.xml
Sitemap: ${docsSiteUrl}sitemap.xml
`;
});

29
landing/utils/docsUrl.ts Normal file
View file

@ -0,0 +1,29 @@
type DocsLocale = string | undefined;
const trimTrailingSlash = (value: string) => value.replace(/\/+$/, '');
const withTrailingSlash = (value: string) => `${trimTrailingSlash(value)}/`;
export function normalizeDocsSiteUrl(value: unknown): string | null {
if (typeof value !== 'string') return null;
const trimmed = value.trim();
if (!trimmed) return null;
return withTrailingSlash(trimmed);
}
export function buildDocsHref(args: {
locale?: DocsLocale;
docsSiteUrl?: unknown;
embeddedBaseURL: string;
}): string {
const localizedPath = args.locale === 'ru' ? 'ru/' : '';
const externalDocsUrl = normalizeDocsSiteUrl(args.docsSiteUrl);
if (externalDocsUrl) {
return `${externalDocsUrl}${localizedPath}`;
}
const base = args.embeddedBaseURL.replace(/\/?$/, '/');
return `${base}${args.locale === 'ru' ? 'docs/ru/' : 'docs/'}`;
}

View file

@ -48,6 +48,6 @@
"vitest": "^3.1.4"
},
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
}
}

View file

@ -17,7 +17,7 @@
"url": "https://github.com/777genius/agent-teams-ai/issues"
},
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
},
"main": "dist-electron/main/index.cjs",
"scripts": {

View file

@ -4,7 +4,7 @@
"private": true,
"type": "module",
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
},
"main": "src/index.ts",
"types": "src/index.ts",

File diff suppressed because it is too large Load diff

View file

@ -1,17 +1,17 @@
{
"cliStatus": {
"actions": {
"alreadyLoggedIn": "已经登录了吗?",
"becomeSponsor": "成为提案国",
"alreadyLoggedIn": "已经登录",
"becomeSponsor": "成为赞助商",
"cancel": "取消",
"checkNow": "现在检查",
"checkNow": "立即查看",
"checkUpdates": "检查更新",
"checking": "正在检查...",
"checking": "检查…",
"connect": "连接",
"extensions": "扩展",
"login": "登录",
"manage": "管理",
"manageProviders": "管理商",
"manageProviders": "管理供商",
"plan": "计划",
"recheck": "重新检查",
"recheckProvider": "重新检查 {{provider}}",
@ -20,161 +20,161 @@
"useCode": "使用代码"
},
"atlas": {
"alt": "地图集云",
"description": "Atlas Cloud是一个全模式的AI推论平台,它让开发者获得一个单一的AI API来访问视频生成,图像生成,以及LLM API. 与其管理多个供应商集成,不如连接一次,并获得所有模式300+全方位模型的统一访问. 请检查access-date=中的日期值 (帮助) Atlas Cloud新编码计划推广 更方便预算 API访问.",
"openCodeProvider": "打开代码提供者",
"plan": "阿特拉斯云编码计划",
"sponsor": "发起人"
"alt": "Atlas Cloud",
"description": "Atlas Cloud 是一个全模态 AI 推理平台,为开发者提供单一 AI API 来访问视频生成、图像生成和 LLM API。您无需管理多个提供商集成只需连接一次即可统一访问跨所有模态的 300 多个精选模型。查看 Atlas Cloud 的新编码计划促销活动,以获取更实惠的 API 访问权限。",
"openCodeProvider": "OpenCode 提供商",
"plan": "Atlas Cloud 编码计划",
"sponsor": "赞助"
},
"errors": {
"checkStatusFailed": "检查 CLI 状态失败",
"checkStatusFailed": "无法检查 CLI 状态",
"installationFailed": "安装失败",
"refreshFailed": "检查更新失败 。 检查您的网络连接并再次尝试 。",
"runtimeUpdatedRefreshFailed": "运行时间已更新, 但无法刷新提供者状态 。"
"refreshFailed": "无法检查更新。检查您的网络连接并重试。",
"runtimeUpdatedRefreshFailed": "运行时已更新,但无法刷新提供商状态。"
},
"hints": {
"backgroundStatus": "{{runtime}}状态将在背景中检查.",
"codexApiKeyFallback": "{{hint}} ZXCV 1ZXCV 如果您切换了认证模式,则可以使用密钥倒置。",
"codexAutoApiKey": "{{hint}} 苏维埃社会主义共和国 自动会继续使用API密钥,直到ChatGPT连接.",
"codexFinishLogin": "在浏览器中完成 ChatGPT 登录 。 如果提示, 请输入显示的代码 。",
"codexNoActiveLogin": "用法限制仅在Codex CLI看到一个活动中的ChatGPT账户后出现. 现在它没有报告ChatGPT的登录。",
"codexNoActiveManagedSession": "用法限制仅在Codex CLI看到一个活动中的ChatGPT账户后出现. 本地 Codex 账户数据已存在, 但目前没有选择活动管理会话 。",
"codexReconnectNeeded": "用法限制仅在 Codex 刷新当前选中的 ChatGPT 会话后才会出现 。 现在本地会议需要重新连接。",
"firstCheckSlow": "第一次检查可能要30秒",
"loginRequiredForTeams": "浏览会话和项目在不登录的情况下工作. 只需要登录即可运行代理团队.",
"troubleshootTitle": "如果你确定你登录, 尝试这些步骤:"
"backgroundStatus": "{{runtime}} 状态将在后台检查。",
"codexApiKeyFallback": "如果您切换认证模式,{{hint}} API 密钥备用选项可用。",
"codexAutoApiKey": "{{hint}} Auto 将继续使用 API 密钥,直到连接 ChatGPT。",
"codexFinishLogin": "在浏览器中完成 ChatGPT 登录。如有提示,请输入显示的代码。",
"codexNoActiveLogin": "仅当 Codex CLI 看到有效的 ChatGPT 帐户后,才会出现用量限制。目前,它报告没有有效的 ChatGPT 登录。",
"codexNoActiveManagedSession": "仅当 Codex CLI 看到有效的 ChatGPT 帐户后,才会出现用量限制。本地 Codex 帐户数据存在,但目前未选择有效的托管会话。",
"codexReconnectNeeded": "仅在 Codex 刷新当前选定的 ChatGPT 会话后才会出现用量限制。现在本地会话需要重新连接。",
"firstCheckSlow": "第一次检查最多可能 30 秒",
"loginRequiredForTeams": "无需登录即可浏览会话和项目。仅需要登录才能运行 Agent Team。",
"troubleshootTitle": "如果您确定已登录,请尝试以下步骤:"
},
"installer": {
"checkingLatest": "正在检查最新版本...",
"downloading": "正在下载 {{runtime}}...",
"installing": "正在安装 {{runtime}}...",
"checkingLatest": "正在检查最新版本",
"downloading": "正在下载 {{runtime}}",
"installing": "正在安装 {{runtime}}",
"success": "成功安装 {{runtime}} v{{version}}",
"verifying": "正在验证校验和..."
"verifying": "正在验证校验和"
},
"labels": {
"apiKeyRequired": "需要 API 密钥",
"comingSoon": "马上就来",
"collapseProviderDetails": "折叠提供者细节",
"expandProviderDetails": "扩展提供者细节",
"apiKeyRequired": "需要 API 密钥",
"comingSoon": "即将推出",
"collapseProviderDetails": "折叠提供商详细信息",
"expandProviderDetails": "展开提供商详细信息",
"generateLink": "生成链接",
"loadingRateLimits": "速率限制加载",
"loggedOut": "供应商已登录",
"loggedOut": "提供商已注销",
"loginAuthFailed": "认证失败",
"loginAuthUpdated": "更新认证",
"loginAuthUpdated": "认证已更新",
"loginComplete": "登录完成",
"loginFailed": "登录失败",
"loginTitle": "登录",
"logoutFailed": "注销失败",
"logoutTitle": "注销",
"logoutTitle": "退出",
"notLoggedIn": "未登录",
"openLogin": "打开登录",
"providerActionRequired": "需要提供者采取的行动",
"resets": "重新发送 {{time}}",
"runtimeLoginTitle": "{{runtime}} 苏维埃社会主义共和国 登录"
"providerActionRequired": "需要提供商采取行动",
"resets": "复位 {{time}}",
"runtimeLoginTitle": "{{runtime}} 登录"
},
"loading": {
"aiProviders": "正在检查 AI 提供者...",
"claudeCli": "正在检查克劳德CLI..."
"aiProviders": "检查 AI 提供商…",
"claudeCli": "检查 Claude CLI…"
},
"provider": {
"authenticated": "已认证",
"backend": "后端: {{backend}}",
"checkingAuthentication": "正在检查认证...",
"checkingProviders": "正在检查提供者...",
"configuredLocalCount": "{{count}} 本地配置",
"configuredLocalCount_few": "{{count}} 本地配置",
"configuredLocalCount_many": "{{count}} 本地配置",
"configuredLocalCount_one": "{{count}} 本地配置",
"configuredLocalCount_other": "{{count}} 本地配置",
"configuredLocalTitle": "从您的 OpenCode 配置导入本地 OpenCode 路由 。",
"connectedCount": "供应商:{{connected}}/{{denominator}}连接",
"freeModels": "免费模",
"freeModelsTitle": "OpenCode 包含一些免费的模型选项, 如在您的设置中可用时的 Big Pickle 。 通过OpenCode的OpenRouter也可以曝光自由模型,但并不是每个OpenCode/OpenRouter模型都是免费的. 可用性和限制可能会改变。",
"loadingModels": "正在装入模型...",
"modelsUnavailable": "此运行时构建无法使用的模型",
"runtime": "运行时间: {{runtime}}",
"verifiedCount": "{{count}} 经核查",
"verifiedCount_few": "{{count}} 经核查",
"verifiedCount_many": "{{count}} 经核查",
"verifiedCount_one": "{{count}} 经核查",
"verifiedCount_other": "{{count}} 经核查",
"verifiedTitle": "带有成功执行证明的 OpenCode 路由 。"
"backend": "后端{{backend}}",
"checkingAuthentication": "正在检查认证",
"checkingProviders": "正在检查提供商…",
"configuredLocalCount": "{{count}} 配置本地",
"configuredLocalCount_few": "{{count}} 配置本地",
"configuredLocalCount_many": "{{count}} 配置本地",
"configuredLocalCount_one": "{{count}} 配置本地",
"configuredLocalCount_other": "{{count}} 配置本地",
"configuredLocalTitle": "从 OpenCode 配置导入本地 OpenCode 路由。",
"connectedCount": "提供商:{{connected}}/{{denominator}} 连接",
"freeModels": "免费模",
"freeModelsTitle": "OpenCode 包含免费模型选项,例如您的设置中可用的 Big Pickle。 OpenRouter 通过 OpenCode 也可以公开免费模型,但并非每个 OpenCode/OpenRouter 模型都是免费的。可用性和限制可能会发生变化。",
"loadingModels": "正在加载模型…",
"modelsUnavailable": "模型不适用于此运行时构建",
"runtime": "运行时{{runtime}}",
"verifiedCount": "{{count}} 已验证",
"verifiedCount_few": "{{count}} 已验证",
"verifiedCount_many": "{{count}} 已验证",
"verifiedCount_one": "{{count}} 已验证",
"verifiedCount_other": "{{count}} 已验证",
"verifiedTitle": "OpenCode 路由具有成功的执行证明。"
},
"runtime": {
"configuredHealthCheckFailed": "配置的 {{runtime}} 失败启动健康检查.",
"configuredNotFound": "未找到配置的 {{runtime}} 。",
"foundButFailed": "发现 {{runtime}} 失败启动",
"healthCheckFailedDescription": "该应用程序发现了配置的{{runtime}},但其启动健康检查失败. 修理或重新安装,然后重试。",
"configuredHealthCheckFailed": "配置的 {{runtime}} 启动运行状况检查失败。",
"configuredNotFound": "未找到配置的 {{runtime}}。",
"foundButFailed": "找到 {{runtime}} 但启动失败",
"healthCheckFailedDescription": "应用找到配置的 {{runtime}},但其启动健康检查失败。修复或重新安装,然后重试。",
"install": "安装 {{runtime}}",
"installRequiredDescription": "{{runtime}}是团队提供和会话管理所需的. 安装开始 。",
"isRequired": "需要{{runtime}}",
"reinstall": "莱因斯托尔 {{runtime}}"
"installRequiredDescription": "团队配置和会话管理需要 {{runtime}}。安装它即可开始。",
"isRequired": "{{runtime}} 为必填项",
"reinstall": "重新安装 {{runtime}}"
},
"runtimeInstall": {
"checking": "检查",
"codexTitle": "在应用数据中安装代码CLI",
"downloading": "下载",
"downloadingPercent": "下载 {{percent}}%",
"checking": "检查",
"codexTitle": "将 Codex CLI 安装到应用数据中",
"downloading": "正在下载",
"downloadingPercent": "正在下载 {{percent}}%",
"install": "安装",
"installing": "安装",
"openCodeTitle": "安装 OpenCode 运行时间到应用数据",
"installing": "安装",
"openCodeTitle": "将 OpenCode 运行时安装到应用数据中",
"retryInstall": "重试安装"
},
"troubleshoot": {
"again": "再来一次",
"authStatusCommand": "您配置的 CLI 认证状态命令",
"checkLoggedIn": "- 检查它是否显示\"Logged in\"",
"click": "击",
"loginCommand": "运行时登录命令",
"logoutCommand": "运行时间登录命令",
"openTerminal": "打开终端并运行:",
"reloginPrefix": "如果上面写着登录但应用程序看不到的话,请试试:",
"sameRuntime": "确保您的终端中的 CLI 与应用程序使用的运行时相同",
"again": "再次",
"authStatusCommand": "您配置的 CLI 认证状态命令",
"checkLoggedIn": "- 检查是否显示“已登录”",
"click": "击",
"loginCommand": "运行时登录命令",
"logoutCommand": "运行时注销命令",
"openTerminal": "打开终端并运行",
"reloginPrefix": "如果显示已登录,但应用看不到它,请尝试:",
"sameRuntime": "确保终端中的 CLI 与应用使用的运行时相同",
"statusCacheHint": "- 有时状态会缓存几秒钟",
"then": "接下来"
"then": "然后"
},
"warnings": {
"multipleApiKeysMissing": "一个或多个提供者被设定为API密钥模式,但没有配置API密钥. 打开管理供应商以添加密钥或切换连接模式.",
"multipleApiKeysNeedAttention": "一个或多个提供者被设定为API密钥模式,需要关注. 打开管理供应商来审查保存的密钥或切换连接模式 。",
"notAuthenticated": "{{runtime}}已经安装,但您没有认证 。 团队提供和AI功能需要登录.",
"singleApiKeyMissing": "{{provider}}被设定为API密钥模式,但没有配置API密钥. 打开管理供应商以添加密钥或切换连接模式 。",
"singleApiKeyNeedsAttention": "{{provider}}设定为API密钥模式,但没有连接. 打开管理提供者来审查保存的密钥或切换连接模式 。"
"multipleApiKeysMissing": "一个或多个提供商设置为 API 密钥模式,但未配置 API 密钥。打开管理提供商以添加密钥或切换连接模式。",
"multipleApiKeysNeedAttention": "一个或多个提供商已设置为 API 密钥模式,需要引起注意。打开管理提供商以查看保存的密钥或切换连接模式。",
"notAuthenticated": "{{runtime}} 已安装,但您未经过认证。团队配置和 AI 功能需要登录。",
"singleApiKeyMissing": "{{provider}} 设置为 API 密钥模式,但未配置 API 密钥。打开管理提供商以添加密钥或切换连接模式。",
"singleApiKeyNeedsAttention": "{{provider}} 设置为 API 密钥模式,但未连接。打开管理提供商以查看保存的密钥或切换连接模式。"
}
},
"recentProjects": {
"selectFolderTitle": "选择工程文件夹",
"selectFolderTitle": "选择项目文件夹",
"selectFolder": "选择文件夹",
"failedToLoad": "装入工程失败",
"failedToLoad": "无法加载项目",
"retry": "重试",
"noProjects": "未找到工程",
"noMatches": "没有 {{query}}” 的匹配",
"noProjects": "未找到项目",
"noMatches": "没有匹配“{{query}}”",
"noRecentProjects": "未找到最近的项目",
"emptyDescription": "最近Claude和Codex的活动会在这里出现.",
"loadMore": "装入更多",
"emptyDescription": "最近的 Claude 和 Codex 活动将出现在这里。",
"loadMore": "加载更多",
"card": {
"deleted": "删除",
"projectFolderMissing": "项目文件夹不存在",
"deleted": "删除",
"projectFolderMissing": "项目文件夹存在",
"taskCounts": {
"active": "{{count}}活动",
"active_one": "{{count}}活动",
"active_other": "{{count}}活动",
"active_few": "{{count}}活动",
"active_many": "{{count}}活动",
"pending": "{{count}}待处理",
"pending_one": "{{count}}待处理",
"pending_other": "{{count}}待处理",
"pending_few": "{{count}}待处理",
"pending_many": "{{count}}待处理",
"done": "{{count}}已执行",
"done_one": "{{count}}已执行",
"done_other": "{{count}}已执行",
"done_few": "{{count}}已执行",
"done_many": "{{count}}已执行"
"active": "{{count}} 活跃",
"active_one": "{{count}} 活跃",
"active_other": "{{count}} 活跃",
"active_few": "{{count}} 活跃",
"active_many": "{{count}} 活跃",
"pending": "{{count}} 待定",
"pending_one": "{{count}} 待定",
"pending_other": "{{count}} 待定",
"pending_few": "{{count}} 待定",
"pending_many": "{{count}} 待定",
"done": "{{count}} 完成",
"done_one": "{{count}} 完成",
"done_other": "{{count}} 完成",
"done_few": "{{count}} 完成",
"done_many": "{{count}} 完成"
}
},
"title": "最近的项目",
"searchResults": "搜索结果",
"searchPlaceholder": "搜索项目..."
"searchPlaceholder": "搜索项目"
},
"actions": {
"selectTeam": "选择团队",
@ -182,16 +182,16 @@
"clearSearch": "清除搜索"
},
"windowsAdmin": {
"title": "建议使用 Windows 管理员模式",
"description": "OpenCode 运行时间检查可以在代理 Teams AI 没有提升时超时. 在启动 OpenCode 团队前以管理员身份重新启动应用程序 。"
"title": "推荐使用 Windows 管理员模式",
"description": "当 Agent Teams AI 未提升时OpenCode 运行时检查可能会超时。在启动 OpenCode 团队之前,使用以管理员身份运行重新启动应用。"
},
"webPreview": {
"title": "打开桌面应用程序以完整功能",
"description": "浏览器版本仍在开发中. 这里的项目行动、整合和现场状态更新可能有限。 使用桌面应用程序可靠地访问所有特性 。"
"title": "打开桌面应用获取完整功能",
"description": "浏览器版本仍在开发中。项目操作、集成和实时状态更新可能会受到限制。使用桌面应用可靠地访问所有功能。"
},
"updateBanner": {
"newVersionAvailable": "新版本可用",
"restartNow": "重新开始",
"viewDetails": "查看细节"
"restartNow": "立即重新启动",
"viewDetails": "查看详情"
}
}

View file

@ -1,3 +1,3 @@
{
"fallback": "出了点问题"
"fallback": "出了点问题"
}

File diff suppressed because it is too large Load diff

View file

@ -1,31 +1,31 @@
{
"cost": {
"breakdownTitle": "成本细目(每100个令牌)",
"cacheRead": "缓存读",
"cacheWrite": "快取写入",
"cost": "费用",
"input": "入",
"noCommits": "无承诺",
"noLinesChanged": "无行更改",
"output": "出",
"parent": "父母:{{cost}}",
"parentCost": "父母费用",
"perCommit": "提交",
"perCommitFormula": "{{count}}总费用",
"perCommitFormula_few": "{{count}}总费用",
"perCommitFormula_many": "{{count}}总费用",
"perCommitFormula_one": "{{count}}总费用",
"perCommitFormula_other": "{{count}}总费用",
"perLineChanged": "每行变化",
"perLineFormula": "{{count}}项目",
"perLineFormula_few": "{{count}}线路",
"perLineFormula_many": "{{count}}线路",
"perLineFormula_one": "{{count}}项目",
"perLineFormula_other": "{{count}}线路",
"subagent": "副剂: {{cost}}",
"subagentCost": "亚剂费用",
"breakdownTitle": "成本明细(每 100 万个 Token",
"cacheRead": "缓存",
"cacheWrite": "缓存写入",
"cost": "成本",
"input": "入",
"noCommits": "没有提交",
"noLinesChanged": "没有改变行",
"output": "出",
"parent": "父级:{{cost}}",
"parentCost": "父级成本",
"perCommit": "每次提交",
"perCommitFormula": "总成本 ÷ {{count}} 提交",
"perCommitFormula_few": "总成本 ÷ {{count}} 提交",
"perCommitFormula_many": "总成本 ÷ {{count}} 提交",
"perCommitFormula_one": "总成本 ÷ {{count}} 提交",
"perCommitFormula_other": "总成本 ÷ {{count}} 提交",
"perLineChanged": "每行更改",
"perLineFormula": "总成本 ÷ {{count}} 行",
"perLineFormula_few": "总成本 ÷ {{count}} 行",
"perLineFormula_many": "总成本 ÷ {{count}} 行",
"perLineFormula_one": "总成本 ÷ {{count}} 行",
"perLineFormula_other": "总成本 ÷ {{count}} 行",
"subagent": "子智能体:{{cost}}",
"subagentCost": "子智能体成本",
"title": "成本分析",
"total": "计"
"total": "计"
},
"insights": {
"agent": "代理人",
@ -33,185 +33,185 @@
"agent_many": "代理人",
"agent_one": "代理人",
"agent_other": "代理人",
"agentTree": "代理树 ({{count}}) 代理树 ({{unit}})",
"background": "(背景情况)",
"agentTree": "智能体树 ({{count}} {{unit}})",
"background": "(后台)",
"bashCommands": "Bash 命令",
"outOfScopeFindings": "范围外调查结果({{count}})",
"questionsAsked": "提出的问题({{count}})",
"outOfScopeFindings": "超出范围的调查结果 ({{count}})",
"questionsAsked": "提出的问题 ({{count}})",
"repeated": "重复",
"skillsInvoked": "被举报技能({{count}})",
"taskDispatches": "任务调度({{count}})",
"tasksCreated": "创建任务( {{count}})",
"skillsInvoked": "调用的技能 ({{count}})",
"taskDispatches": "任务调度 ({{count}})",
"tasksCreated": "创建任务 ({{count}})",
"teamMode": "团队模式",
"teams": "团队:{{teams}}",
"title": "会话透视",
"total": "计",
"unique": "独一无二",
"skillsInvoked_few": "被举报技能({{count}})",
"skillsInvoked_many": "被举报技能({{count}})",
"skillsInvoked_one": "被举报技能({{count}})",
"skillsInvoked_other": "被举报技能({{count}})",
"taskDispatches_few": "任务调度({{count}})",
"taskDispatches_many": "任务调度({{count}})",
"taskDispatches_one": "任务调度({{count}})",
"taskDispatches_other": "任务调度({{count}})",
"tasksCreated_few": "创建任务( {{count}})",
"tasksCreated_many": "创建任务( {{count}})",
"tasksCreated_one": "创建任务( {{count}})",
"tasksCreated_other": "创建任务( {{count}})",
"questionsAsked_few": "提出的问题({{count}})",
"questionsAsked_many": "提出的问题({{count}})",
"questionsAsked_one": "提出的问题({{count}})",
"questionsAsked_other": "提出的问题({{count}})",
"agentTree_few": "代理树 ({{count}}) 代理树 ({{unit}})",
"agentTree_many": "代理树 ({{count}}) 代理树 ({{unit}})",
"agentTree_one": "代理树 ({{count}}) 代理树 ({{unit}})",
"agentTree_other": "代理树 ({{count}}) 代理树 ({{unit}})",
"outOfScopeFindings_few": "范围外调查结果({{count}})",
"outOfScopeFindings_many": "范围外调查结果({{count}})",
"outOfScopeFindings_one": "范围外调查结果({{count}})",
"outOfScopeFindings_other": "范围外调查结果({{count}})",
"keyTakeaways": "关键外卖"
"teams": "队伍:{{teams}}",
"title": "会话见解",
"total": "计",
"unique": "唯一",
"skillsInvoked_few": "调用的技能 ({{count}})",
"skillsInvoked_many": "调用的技能 ({{count}})",
"skillsInvoked_one": "调用的技能 ({{count}})",
"skillsInvoked_other": "调用的技能 ({{count}})",
"taskDispatches_few": "任务调度 ({{count}})",
"taskDispatches_many": "任务调度 ({{count}})",
"taskDispatches_one": "任务调度 ({{count}})",
"taskDispatches_other": "任务调度 ({{count}})",
"tasksCreated_few": "创建任务 ({{count}})",
"tasksCreated_many": "创建任务 ({{count}})",
"tasksCreated_one": "创建任务 ({{count}})",
"tasksCreated_other": "创建任务 ({{count}})",
"questionsAsked_few": "提出的问题 ({{count}})",
"questionsAsked_many": "提出的问题 ({{count}})",
"questionsAsked_one": "提出的问题 ({{count}})",
"questionsAsked_other": "提出的问题 ({{count}})",
"agentTree_few": "智能体树 ({{count}} {{unit}})",
"agentTree_many": "智能体树 ({{count}} {{unit}})",
"agentTree_one": "智能体树 ({{count}} {{unit}})",
"agentTree_other": "智能体树 ({{count}} {{unit}})",
"outOfScopeFindings_few": "超出范围的调查结果 ({{count}})",
"outOfScopeFindings_many": "超出范围的调查结果 ({{count}})",
"outOfScopeFindings_one": "超出范围的调查结果 ({{count}})",
"outOfScopeFindings_other": "超出范围的调查结果 ({{count}})",
"keyTakeaways": "要点"
},
"quality": {
"chars": "字符",
"corrections": "惩戒",
"corrections": "修正",
"failed": "失败",
"fileReadRedundancy": "文件读取冗余",
"firstMessage": "第一消息",
"firstRun": "第一运行",
"firstMessage": "第一消息",
"firstRun": "第一运行",
"frictionRate": "摩擦率",
"lastRun": "次运行",
"messagesBeforeWork": "工作前的信件",
"lastRun": "最后一次运行",
"messagesBeforeWork": "开始工作前消息",
"passed": "通过",
"promptQuality": "提示质量",
"readsPerUniqueFile": "读取/ 唯一文件",
"snapshot": "简介",
"promptQuality": "提示质量",
"readsPerUniqueFile": "读取/唯一文件",
"snapshot": "快照",
"snapshot_few": "快照",
"snapshot_many": "快照",
"snapshot_one": "简介",
"snapshot_one": "快照",
"snapshot_other": "快照",
"startupOverhead": "启动间接费用",
"testProgression": "测试进",
"startupOverhead": "启动开销",
"testProgression": "测试进",
"title": "质量信号",
"tokensBeforeWork": "工作前托肯斯语Name",
"totalReads": "读数共计",
"uniqueFiles": "独一无二的文件",
"userMessages": "用户信件",
"percentOfTotal": "占总数的百分比"
"tokensBeforeWork": "工作前的 Token",
"totalReads": "取次数",
"uniqueFiles": "唯一文件",
"userMessages": "用户消息",
"percentOfTotal": "占总数的%"
},
"tokens": {
"apiCalls": "API 苏维埃社会主义共和国 电话",
"apiCalls": "API 调用",
"cacheCreate": "缓存创建",
"cacheEfficiency": "缓存效率",
"cacheRead": "缓存读",
"cacheReadPct": "快取读取%",
"cacheRead": "缓存",
"cacheReadPct": "缓存读取率",
"coldStart": "冷启动",
"cost": "费用",
"input": "入",
"model": "",
"no": "没有",
"output": "出",
"readWriteRatio": "R/W比率",
"title": "用",
"total": "计",
"yes": ""
"cost": "成本",
"input": "入",
"model": "型",
"no": "",
"output": "出",
"readWriteRatio": "读/写比",
"title": "Token 使用",
"total": "计",
"yes": ""
},
"subagents": {
"title": "副剂",
"title": "子智能体",
"metrics": {
"count": "数",
"totalTokens": "共计",
"totalDuration": "期间共计",
"totalCost": "费用共计"
"count": "",
"totalTokens": "Token 总数",
"totalDuration": "总持续时间",
"totalCost": "总成本"
},
"table": {
"description": "说明",
"description": "描述",
"type": "类型",
"tokens": "",
"duration": "会期",
"cost": "费用"
"tokens": "Token",
"duration": "持续时间",
"cost": "成本"
}
},
"overview": {
"title": "概",
"yes": "",
"no": "没有",
"title": "概",
"yes": "",
"no": "",
"metrics": {
"duration": "会期",
"messages": "信件",
"contextUsage": "背景使用情况",
"duration": "持续时间",
"messages": "消息",
"contextUsage": "上下文使用",
"compactions": "压缩",
"branch": "",
"subagents": "副剂",
"branch": "分支",
"subagents": "子智能体",
"project": "项目",
"sessionId": "会话编号"
"sessionId": "会话 ID"
}
},
"timeline": {
"title": "时间线和活动( A)",
"title": "时间线与活动",
"idleAnalysis": "空闲分析",
"metrics": {
"idleGaps": "空闲差距",
"totalIdle": "闲置共计",
"activeTime": "活时间",
"idlePercent": "闲置%"
"idleGaps": "空闲间隙",
"totalIdle": "总空闲时间",
"activeTime": "活时间",
"idlePercent": "空闲率"
},
"modelSwitches": "型号开关({{count}})",
"modelSwitches_one": "型号开关({{count}})",
"modelSwitches_other": "型号开关({{count}})",
"messageNumber": "# 迈克 #{{number}}",
"keyEvents": "关键事件",
"modelSwitches_few": "型号开关({{count}})",
"modelSwitches_many": "型号开关({{count}})"
"modelSwitches": "模型切换({{count}}",
"modelSwitches_one": "模型切换({{count}}",
"modelSwitches_other": "模型切换({{count}}",
"messageNumber": "消息#{{number}}",
"keyEvents": "重要事件",
"modelSwitches_few": "模型切换({{count}}",
"modelSwitches_many": "模型切换({{count}}"
},
"tools": {
"title": "工具使用",
"summary": "{{formattedCount}} 跨越{{toolCount}}工具的总通话量",
"summary": "共 {{formattedCount}} 次调用,涵盖 {{toolCount}} 个工具",
"columns": {
"tool": "工具",
"calls": "电话",
"calls": "调用次数",
"errors": "错误",
"successPercent": "成功率(%)",
"health": "卫生"
"successPercent": "成功率",
"health": "健康状态"
}
},
"git": {
"title": "Git 活动",
"commits": "提交",
"pushes": "推",
"linesAdded": "添加的行数",
"linesRemoved": "删除行",
"branchesCreated": "创建分支"
"pushes": "推",
"linesAdded": "新增行数",
"linesRemoved": "删除",
"branchesCreated": "创建分支"
},
"friction": {
"title": "Friction 信号",
"rate": "滑动率:{{rate}}百分比(%)",
"correctionsCount": "{{count}}正",
"correctionsCount_one": "{{count}}正",
"corrections": "惩戒",
"thrashingSignals": "闪烁信号",
"repeatedBashCommands": "重复的巴什命令",
"reworkedFiles": "重修的文件( 3+编辑)",
"correctionsCount_few": "{{count}}正",
"correctionsCount_many": "{{count}}正",
"correctionsCount_other": "{{count}}正"
"title": "摩擦信号",
"rate": "摩擦率:{{rate}}%",
"correctionsCount": "{{count}}正",
"correctionsCount_one": "{{count}}正",
"corrections": "修正",
"thrashingSignals": "反复修改信号",
"repeatedBashCommands": "重复的 Bash 命令",
"reworkedFiles": "返工文件3 次以上编辑)",
"correctionsCount_few": "{{count}}正",
"correctionsCount_many": "{{count}}正",
"correctionsCount_other": "{{count}}正"
},
"errors": {
"title": "错误",
"permissionDenied": "拒绝权限",
"messageIndex": "# 迈克 #{{index}}",
"input": "入",
"permissionDenied": "权限被拒绝",
"messageIndex": "消息#{{index}}",
"input": "入",
"error": "错误",
"count": "{{count}}错误",
"count": "{{count}} 错误",
"count_one": "{{count}} 错误",
"permissionDenialCount": "{{count}} 许可拒绝",
"permissionDenialCount_one": "{{count}} 许可被拒绝",
"count_few": "{{count}}错误",
"count_many": "{{count}}错误",
"count_other": "{{count}}错误",
"permissionDenialCount_few": "{{count}} 许可拒绝",
"permissionDenialCount_many": "{{count}} 许可拒绝",
"permissionDenialCount_other": "{{count}} 许可拒绝"
"permissionDenialCount": "{{count}} 权限拒绝次数",
"permissionDenialCount_one": "{{count}} 权限拒绝次数",
"count_few": "{{count}} 错误",
"count_many": "{{count}} 错误",
"count_other": "{{count}} 错误",
"permissionDenialCount_few": "{{count}} 权限拒绝次数",
"permissionDenialCount_many": "{{count}} 权限拒绝次数",
"permissionDenialCount_other": "{{count}} 权限拒绝次数"
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1096,7 +1096,10 @@ export class AgentTeamsRuntimeProviderManagementCliClient implements RuntimeProv
if (process.platform === 'win32' && isOpenCodeNodeModulesSymlinkError(failure.message)) {
const profileId = extractProfileIdFromSymlinkError(failure.message);
if (profileId) {
const junctionReady = ensureOpenCodeProfileNodeModulesJunction(profileId, failure.message);
const junctionReady = ensureOpenCodeProfileNodeModulesJunction(
profileId,
failure.message
);
if (junctionReady) {
try {
const retryResult = await execCli(
@ -1116,7 +1119,8 @@ export class AgentTeamsRuntimeProviderManagementCliClient implements RuntimeProv
}
}
const retryResponse = extractJsonObjectFromError<RuntimeProviderManagementViewResponse>(error);
const retryResponse =
extractJsonObjectFromError<RuntimeProviderManagementViewResponse>(error);
if (retryResponse) {
return retryResponse;
}
@ -1176,7 +1180,10 @@ export class AgentTeamsRuntimeProviderManagementCliClient implements RuntimeProv
if (process.platform === 'win32' && isOpenCodeNodeModulesSymlinkError(failure.message)) {
const profileId = extractProfileIdFromSymlinkError(failure.message);
if (profileId) {
const junctionReady = ensureOpenCodeProfileNodeModulesJunction(profileId, failure.message);
const junctionReady = ensureOpenCodeProfileNodeModulesJunction(
profileId,
failure.message
);
if (junctionReady) {
try {
const retryResult = await execCli(

View file

@ -21,9 +21,7 @@
* - synthetic assistant messages (model='<synthetic>')
*/
import {
HARD_NOISE_TAGS,
} from '@main/constants/messageTags';
import { HARD_NOISE_TAGS } from '@main/constants/messageTags';
import { LocalFileSystemProvider } from '@main/services/infrastructure/LocalFileSystemProvider';
import { type ChatHistoryEntry, type ContentBlock } from '@main/types';
import { createLogger } from '@shared/utils/logger';

View file

@ -181,10 +181,7 @@ export class SubagentResolver {
}
private isAuthoredUserMessage(message: ParsedMessage): boolean {
return (
isHumanAuthoredParsedUserMessage(message) ||
isDisplayableTeammateProtocol(message)
);
return isHumanAuthoredParsedUserMessage(message) || isDisplayableTeammateProtocol(message);
}
private extractUserText(message: ParsedMessage): string {

View file

@ -405,7 +405,10 @@ export function buildDisplayItemsFromMessages(
// Check for teammate messages (non-meta user messages with <teammate-message> content)
// One user message may contain multiple <teammate-message> blocks
if (msg.type === 'user' && (isHumanAuthoredUserTurn(msg) || isDisplayableTeammateProtocol(msg))) {
if (
msg.type === 'user' &&
(isHumanAuthoredUserTurn(msg) || isDisplayableTeammateProtocol(msg))
) {
const rawText =
typeof msg.content === 'string'
? msg.content

View file

@ -66,9 +66,7 @@ export function classifyUserTurnProvenance(
return originKind;
}
const legacyProtocolKind = classifyLegacyProtocolText(
getTextContent(getMessageContent(message))
);
const legacyProtocolKind = classifyLegacyProtocolText(getTextContent(getMessageContent(message)));
if (legacyProtocolKind) {
return legacyProtocolKind;
}
@ -97,9 +95,7 @@ export function isSyntheticReplayNoise(message: UserTurnProvenanceInput): boolea
);
}
export function isDisplayableTeammateProtocol(
message: UserTurnProvenanceInput
): boolean {
export function isDisplayableTeammateProtocol(message: UserTurnProvenanceInput): boolean {
return (
classifyUserTurnProvenance(message) === 'teammate-protocol' &&
message.isMeta !== true &&
@ -149,9 +145,7 @@ function normalizeOriginKind(
}
}
function classifyLegacyProtocolText(
text: string | undefined
): UserTurnProvenanceKind | undefined {
function classifyLegacyProtocolText(text: string | undefined): UserTurnProvenanceKind | undefined {
if (!text) {
return undefined;
}
@ -215,9 +209,7 @@ function hasSystemOutputContent(content: unknown): boolean {
Array.isArray(content) &&
content.some(
(block) =>
isContentBlock(block) &&
block.type === 'text' &&
startsWithSystemOutputTag(block.text)
isContentBlock(block) && block.type === 'text' && startsWithSystemOutputTag(block.text)
)
);
}