Skip to content

Commit 4fdb39b

Browse files
authored
Merge pull request #210 from 777genius/dev
dev -> main
2 parents c0a3460 + 8b75625 commit 4fdb39b

158 files changed

Lines changed: 12406 additions & 3962 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/dependency-review.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ name: Dependency Review
33
on:
44
pull_request:
55
paths:
6-
- "**/package.json"
7-
- "**/package-lock.json"
8-
- "**/pnpm-lock.yaml"
9-
- "pnpm-workspace.yaml"
6+
- '**/package.json'
7+
- '**/package-lock.json'
8+
- '**/pnpm-lock.yaml'
9+
- 'pnpm-workspace.yaml'
1010

1111
permissions:
1212
contents: read
@@ -24,5 +24,7 @@ jobs:
2424
with:
2525
fail-on-severity: high
2626
fail-on-scopes: runtime, development, unknown
27+
# Vitest is used via `vitest run`, not Vitest UI/API/browser mode.
28+
allow-ghsas: GHSA-5xrq-8626-4rwp
2729
license-check: false
2830
show-patched-versions: true
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Agent Teams with Claude Opus 4.8
2+
3+
Claude Opus 4.8 made a single agent noticeably stronger. But the real productivity jump comes when this model powers **a whole team of agents** that talk to each other, coordinate, and autonomously carry a task through to the result.
4+
5+
Here's what that looks like in practice.
6+
7+
## A team of agents instead of just one
8+
9+
You assemble a team of several Opus 4.8 agents and assign roles: lead, backend, frontend, reviewer — whatever fits your task. From there they work in parallel, each in their own area.
10+
11+
If you're not ready for a full team yet, there's a solo mode with a single agent that manages its own task list. You can grow it into a full team later.
12+
13+
## They talk and coordinate
14+
15+
This isn't a bunch of independent chats. The agents:
16+
- message each other inside the team
17+
- hand off results and ask each other for clarification
18+
- code-review each other's work
19+
- create and close tasks on a shared kanban board on their own
20+
21+
And here's something you usually don't see anywhere else: **you can run multiple teams at once, and they coordinate between themselves**. Spin up parallel teams for different tracks (say, backend and frontend, or two features at once) — their leads will talk to each other, sync progress, and pass results down the chain.
22+
23+
You set the goal at a high level — breakdown, distribution, and execution happen without you.
24+
25+
## Everything is visible in the UI
26+
27+
In real time:
28+
- **Kanban** with tasks moving across statuses
29+
- **Diff viewer** for every task: accept / reject / comment
30+
- **Agent-to-agent chat** plus direct messages with any of them
31+
- **Detailed logs** for every agent — what it did, which commands it ran, which decisions it made
32+
- **Per-task view**: open a card on the kanban and see everything tied to it — code changes, agent conversations, comments, logs. No confusion about what belongs where
33+
- **Active agent sessions** with open links
34+
- **Notifications** when the team is done or needs your input
35+
36+
## Not just Claude
37+
38+
Beyond Opus 4.8, you can plug **Codex** and **OpenCode** agents into the same team _(200+ models, 70+ LLM providers)_. Different runtimes coexist within a single team — pick the strengths of each where they fit best, without locking yourself into one vendor.
39+
40+
## Under the hood
41+
42+
Local, no cloud, free, open source. It works through the Claude / Codex / OpenCode CLIs you already have installed — no separate app-level API keys required.
43+
44+
---
45+
46+
> Screenshots and video below.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Agent Teams with Claude Opus 4.8
2+
3+
С выходом Claude Opus 4.8 одиночный агент стал заметно сильнее. Но настоящий скачок продуктивности — когда на этой модели работает **целая команда агентов**, которые общаются между собой, координируются и автономно доводят задачу до результата.
4+
5+
Ниже — как это выглядит на практике.
6+
7+
## Команда агентов вместо одного
8+
9+
Вы собираете команду из нескольких Opus 4.8-агентов и распределяете роли: лид, бэкенд, фронтенд, ревьюер — что угодно под вашу задачу. Дальше они работают параллельно, каждый в своей зоне.
10+
11+
Если не хочется сразу команду — есть solo-режим с одним агентом, который сам ведёт свои задачи. Дальше его можно развернуть в полноценную команду.
12+
13+
## Они общаются и координируются
14+
15+
Это не несколько независимых чатов. Агенты:
16+
- пишут друг другу внутри команды
17+
- передают результаты, спрашивают уточнения
18+
- делают код-ревью работы коллег
19+
- сами создают и закрывают задачи на общем канбане
20+
21+
И ещё одна штука, которой обычно нет нигде: **команд может быть несколько, и они координируются между собой**. Можно поднять параллельно несколько команд под разные направления (например, бэкенд и фронтенд, или две фичи сразу) — и их лиды будут общаться друг с другом, синхронизировать работу, передавать результаты по цепочке.
22+
23+
Вы ставите цель на высоком уровне — декомпозиция, распределение и исполнение происходят без вашего участия.
24+
25+
## Всё видно в UI
26+
27+
В реальном времени:
28+
- **Канбан** с движением задач по статусам
29+
- **Diff-вьювер** на каждую задачу: accept / reject / комментарий
30+
- **Переписка** агентов между собой и личные DM с любым из них
31+
- **Подробные логи** каждого агента — что он делал, какие команды запускал, какие решения принимал
32+
- **Срез по задаче**: открываете карточку на канбане и видите всё, что к ней относится — изменения в коде, переписку агентов, комментарии, логи. Никакой путаницы, что к чему привязано
33+
- **Активные сессии агентов** с открытыми ссылками
34+
- **Уведомления**, когда команда закончила или ей нужно ваше решение
35+
36+
## Не только Claude
37+
38+
Помимо Opus 4.8, в команду можно подключать агентов на **Codex** и **OpenCode** _(200+ моделей, 70+ LLM-провайдеров)_. В одной команде спокойно уживаются разные рантаймы — берёте сильные стороны каждого там, где они уместны, без привязки к одному вендору.
39+
40+
## Под капотом
41+
42+
Локально, без облака, бесплатно, open source. Работает через уже установленные у вас CLI Claude / Codex / OpenCode — отдельные API-ключи на уровне приложения не нужны.
43+
44+
---
45+
46+
> Скриншоты и видео — ниже.

docs/team-management/opencode-native-semantic-messaging-plan.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1827,9 +1827,9 @@ OpenCode lead rule:
18271827

18281828
- Mixed team with native Codex/Claude/Gemini lead: keep the existing `relayLeadInboxMessages()` path.
18291829
- OpenCode teammate or secondary lane: use `relayOpenCodeMemberInboxMessages()`.
1830-
- Pure OpenCode lead inbox in v1: do not mark messages read and do not report delivery success unless a real stored OpenCode `team-lead` session exists. Return a diagnostic like `opencode_lead_runtime_session_missing`.
1830+
- Pure OpenCode lead inbox: launch and store a real OpenCode `team-lead` runtime session, then relay through `relayOpenCodeMemberInboxMessages()`. Do not mark messages read unless that delivery is accepted.
18311831
- Do not fake lead delivery by sending to a random teammate session. That would make messages appear delivered while the actual recipient never saw them.
1832-
- A future explicit OpenCode lead lane can reuse this selector by teaching the bridge to create/store a `team-lead` session and by passing `agent: "team-lead"` where the bridge supports it. That is not part of this v1 seam.
1832+
- If the stored `team-lead` session is missing, keep the row retryable instead of falling back to another teammate.
18331833

18341834
FileWatcher change:
18351835

@@ -2967,13 +2967,12 @@ it('routes native lead inbox relay through the legacy stdin path', async () => {
29672967
```
29682968

29692969
```ts
2970-
it('does not silently consume pure OpenCode lead inbox when no lead session exists', async () => {
2971-
// Configure a pure OpenCode runtime-adapter team where isTeamAlive() is true via runtimeAdapterRunByTeam.
2972-
// Ensure there is no stored OpenCode session record for the canonical lead name.
2970+
it('relays pure OpenCode lead inbox through the stored lead session', async () => {
2971+
// Configure a pure OpenCode runtime-adapter team with a stored team-lead session.
29732972
// Seed inboxes/<lead>.json with one unread message.
29742973
// Call relayInboxFileToLiveRecipient(teamName, leadName).
2975-
// Assert diagnostics include opencode_lead_runtime_session_missing.
2976-
// Assert the inbox row remains unread and no teammate session received the prompt.
2974+
// Assert the relay kind is opencode_member and the prompt targets team-lead.
2975+
// Assert the inbox row is marked read only after accepted runtime delivery.
29772976
});
29782977
```
29792978

@@ -3464,8 +3463,8 @@ Avoid heavy E2E until targeted tests pass.
34643463
- UI direct sends to live OpenCode teammates either confirm runtime delivery or show a visible warning; there is no log-only post-send delivery failure.
34653464
- Persisted inbox messages addressed to OpenCode teammates are live-relayed to their runtime lanes, while native teammates keep file-watch behavior and lead keeps lead relay behavior.
34663465
- OpenCode inbox relay is direct-to-runtime and does not reuse native `relayMemberInboxMessages()` / `SendMessage` forwarding.
3467-
- Pure OpenCode lead inbox delivery is not silently consumed: without a real OpenCode lead session, rows remain unread and diagnostics say `opencode_lead_runtime_session_missing` or equivalent.
3466+
- Pure OpenCode lead inbox delivery uses the stored `team-lead` runtime session and does not silently fall back to another teammate.
34683467
- Renderer send-message actions return `SendMessageResult` on success and reject on real send failure, so pending-reply cleanup is not dependent on dead `.catch()` paths.
34693468
- `message_send` cannot create `from: "user", to: "user"` rows; user-directed MCP replies require a configured teammate sender.
34703469
- OpenCode replies appear in Messages UI without frontend fake state.
3471-
- Tests cover native default, OpenCode override, assignment protocol, tool alias canonicalization, tool proof, taskRefs persistence, user-directed sender guard, local recipient canonicalization, direct-message runtime delivery result visibility, OpenCode reply feed projection, OpenCode-targeted inbox relay/dedupe, unsupported OpenCode lead diagnostics, launch identity injection, lane-scoped manifest activeRunId recovery, and runtime delivery team-change event shape.
3470+
- Tests cover native default, OpenCode override, assignment protocol, tool alias canonicalization, tool proof, taskRefs persistence, user-directed sender guard, local recipient canonicalization, direct-message runtime delivery result visibility, OpenCode reply feed projection, OpenCode-targeted inbox relay/dedupe, pure OpenCode lead relay, launch identity injection, lane-scoped manifest activeRunId recovery, and runtime delivery team-change event shape.

landing/components/hero/CyberHeroFeatureStrip.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ const props = defineProps<{
2020
reducedMotion?: boolean;
2121
}>();
2222
23-
const { locale } = useI18n();
23+
const { t, locale } = useI18n();
2424
const localizedHeroFeatureRail = computed(() => getLocalizedHeroFeatureRail(locale.value));
2525
const localizedHeroReviewerFeatureCard = computed(() => getLocalizedHeroReviewerFeatureCard(locale.value));
26-
const statusLabel = computed(() => locale.value === "ru" ? "Статус:" : "Status:");
26+
const statusLabel = computed(() => t("common.statusLabel"));
2727
2828
const icons = [
2929
mdiRobotOutline,

landing/components/hero/CyberHeroRobot.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ const props = defineProps<{
77
activeReceiver?: HeroAgentRole | "video" | null;
88
}>();
99
10-
const { locale } = useI18n();
10+
const { t } = useI18n();
1111
const isSender = computed(() => props.activeSender === props.agent.id);
1212
const isReceiver = computed(() => props.activeReceiver === props.agent.id);
1313
const imageLoading = computed(() => (props.agent.priority ? "eager" : "lazy"));
1414
const imageFetchPriority = computed(() => (props.agent.priority ? "high" : "auto"));
15-
const statusLabel = computed(() => locale.value === "ru" ? "Статус:" : "Status:");
15+
const statusLabel = computed(() => t("common.statusLabel"));
1616
1717
const rootStyle = computed(() => ({
1818
"--agent-x": String(props.agent.desktop.x),

landing/components/hero/CyberHeroVideoFrame.vue

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
<script setup lang="ts">
2-
const { locale } = useI18n();
3-
const isRu = computed(() => locale.value === "ru");
2+
const { t } = useI18n();
43
</script>
54

65
<template>
76
<div
87
id="hero-demo"
98
class="cyber-video-frame"
109
role="region"
11-
:aria-label="isRu ? 'Смотреть демо Agent Teams' : 'Watch Agent Teams demo'"
10+
:aria-label="t('hero.videoFrameLabel')"
1211
>
1312
<div class="cyber-video-frame__bezel" aria-hidden="true" />
1413
<div class="cyber-video-frame__status" aria-hidden="true">
15-
<span>{{ isRu ? 'Командная лента' : 'Team command feed' }}</span>
16-
<span>{{ isRu ? 'Живое демо' : 'Live demo' }}</span>
14+
<span>{{ t('hero.commandFeed') }}</span>
15+
<span>{{ t('hero.liveDemo') }}</span>
1716
</div>
1817
<div class="cyber-video-frame__content">
1918
<HeroDemoVideo />

landing/components/sections/DownloadSection.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ const releaseDate = computed(() => {
251251
day: 'numeric',
252252
});
253253
});
254-
const linuxRobotBubble = computed(() => locale.value === 'ru' ? 'Готов начать!' : 'Ready to start!');
254+
const linuxRobotBubble = computed(() => t('download.readyToStart'));
255255
256256
</script>
257257

landing/components/sections/HeroSection.vue

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,10 @@ const supportedProviders = [
5555
},
5656
] as const;
5757
const supportedProvidersLabel = computed(() => (
58-
locale.value === "ru"
59-
? "Поддерживаем AI-провайдеры"
60-
: "Supported AI providers"
58+
t("hero.supportedProviders")
6159
));
6260
const heroSlogan = computed(() => (
63-
locale.value === "ru"
64-
? "Делайте много, почти ничего не делая"
65-
: "Get a lot done by doing very little"
61+
t("hero.slogan")
6662
));
6763
6864
const heroDownloadUrl = computed(() => {
@@ -79,17 +75,13 @@ const docsHref = computed(() => buildDocsHref({
7975
}));
8076
const downloadActionSubtitle = computed(() => {
8177
if (!selectedDownloadAsset.value) {
82-
return locale.value === "ru"
83-
? "Для вашей платформы"
84-
: "For your platform";
78+
return t("hero.platformDefault");
8579
}
8680
8781
return selectedDownloadAsset.value.actionSubtitle;
8882
});
8983
const docsActionSubtitle = computed(() => (
90-
locale.value === "ru"
91-
? "Гайды и настройка"
92-
: "Guides and setup"
84+
t("hero.guidesSetup")
9385
));
9486
9587
function clearHeroMessageTimers() {

landing/components/sections/ScreenshotsSection.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ const screenshots = computed(() => screenshotData.map((s) => ({
2727
width: s.width,
2828
height: s.height,
2929
})));
30-
const prevLabel = computed(() => locale.value === 'ru' ? 'Предыдущий' : 'Previous');
31-
const nextLabel = computed(() => locale.value === 'ru' ? 'Следующий' : 'Next');
30+
const prevLabel = computed(() => t('common.previous'));
31+
const nextLabel = computed(() => t('common.next'));
3232
3333
const swiperRef = ref<SwiperContainerElement | null>(null);
3434
const swiperReady = ref(false);

0 commit comments

Comments
 (0)