diff --git a/.github/badges/version.svg b/.github/badges/version.svg index a1eaa7cd..2db07150 100644 --- a/.github/badges/version.svg +++ b/.github/badges/version.svg @@ -1 +1 @@ -version: v2.1.0versionv2.1.0 +version: v2.1.1versionv2.1.1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 796eaca6..5a1a00c7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -687,17 +687,53 @@ jobs: ["agent-teams-ai.pacman"]="agent-teams-ai-${VERSION}.pacman" ) - for ALIAS_NAME in "${!STABLE_ALIASES[@]}"; do - VERSIONED_NAME="${STABLE_ALIASES[$ALIAS_NAME]}" - echo "Uploading stable alias: ${ALIAS_NAME} -> ${VERSIONED_NAME}" + declare -A LEGACY_STABLE_ALIASES=( + ["Claude-Agent-Teams-UI-arm64.dmg"]="Agent.Teams.AI-${VERSION}-arm64.dmg" + ["Claude-Agent-Teams-UI-x64.dmg"]="Agent.Teams.AI-${VERSION}-x64.dmg" + ["Claude-Agent-Teams-UI-Setup.exe"]="Agent.Teams.AI.Setup.${VERSION}.exe" + ["Claude-Agent-Teams-UI.AppImage"]="Agent.Teams.AI-${VERSION}.AppImage" + ["Claude-Agent-Teams-UI-amd64.deb"]="agent-teams-ai_${VERSION}_amd64.deb" + ["Claude-Agent-Teams-UI-x86_64.rpm"]="agent-teams-ai-${VERSION}.x86_64.rpm" + ["Claude-Agent-Teams-UI.pacman"]="agent-teams-ai-${VERSION}.pacman" + ) + + declare -A LEGACY_UPDATER_ALIASES=( + ["Claude.Agent.Teams.UI-${VERSION}-arm64-mac.zip"]="Agent.Teams.AI-${VERSION}-arm64-mac.zip" + ["Claude.Agent.Teams.UI-${VERSION}-arm64.dmg"]="Agent.Teams.AI-${VERSION}-arm64.dmg" + ["Claude.Agent.Teams.UI-${VERSION}-mac.zip"]="Agent.Teams.AI-${VERSION}-x64-mac.zip" + ["Claude.Agent.Teams.UI-${VERSION}.dmg"]="Agent.Teams.AI-${VERSION}-x64.dmg" + ["Claude.Agent.Teams.UI.Setup.${VERSION}.exe"]="Agent.Teams.AI.Setup.${VERSION}.exe" + ["Claude.Agent.Teams.UI-${VERSION}.AppImage"]="Agent.Teams.AI-${VERSION}.AppImage" + ) + + upload_aliases() { + local label="$1" + local -n aliases="$2" + + for ALIAS_NAME in "${!aliases[@]}"; do + VERSIONED_NAME="${aliases[$ALIAS_NAME]}" + echo "Uploading ${label} alias: ${ALIAS_NAME} -> ${VERSIONED_NAME}" + download_once "${VERSIONED_NAME}" + cp "${TMP_DIR}/${VERSIONED_NAME}" "${TMP_DIR}/${ALIAS_NAME}" + gh release upload "${TAG}" "${TMP_DIR}/${ALIAS_NAME}" --repo "$REPO" --clobber + done + } + + download_once() { + local name="$1" + if [[ -f "${TMP_DIR}/${name}" ]]; then + return + fi gh release download "${TAG}" \ --repo "$REPO" \ - --pattern "${VERSIONED_NAME}" \ + --pattern "${name}" \ --dir "$TMP_DIR" \ --clobber - cp "${TMP_DIR}/${VERSIONED_NAME}" "${TMP_DIR}/${ALIAS_NAME}" - gh release upload "${TAG}" "${TMP_DIR}/${ALIAS_NAME}" --repo "$REPO" --clobber - done + } + + upload_aliases "stable" STABLE_ALIASES + upload_aliases "legacy stable" LEGACY_STABLE_ALIASES + upload_aliases "legacy updater" LEGACY_UPDATER_ALIASES - name: Publish canonical updater metadata env: @@ -761,26 +797,37 @@ jobs: EOF # Canonical macOS feed. - # electron-updater on GitHub still consumes a single latest-mac.yml, so we - # publish the Apple Silicon feed here and suppress Intel auto-update in-app - # until we switch to universal packaging or an arch-aware provider. + # Include both architectures so legacy Intel builds can see the + # update without downloading the Apple Silicon zip. download_asset "Agent.Teams.AI-${VERSION}-arm64-mac.zip" download_asset "Agent.Teams.AI-${VERSION}-arm64.dmg" - MAC_ZIP_SHA="$(sha512_base64 "Agent.Teams.AI-${VERSION}-arm64-mac.zip")" - MAC_ZIP_SIZE="$(file_size "Agent.Teams.AI-${VERSION}-arm64-mac.zip")" - MAC_DMG_SHA="$(sha512_base64 "Agent.Teams.AI-${VERSION}-arm64.dmg")" - MAC_DMG_SIZE="$(file_size "Agent.Teams.AI-${VERSION}-arm64.dmg")" + download_asset "Agent.Teams.AI-${VERSION}-x64-mac.zip" + download_asset "Agent.Teams.AI-${VERSION}-x64.dmg" + MAC_ARM64_ZIP_SHA="$(sha512_base64 "Agent.Teams.AI-${VERSION}-arm64-mac.zip")" + MAC_ARM64_ZIP_SIZE="$(file_size "Agent.Teams.AI-${VERSION}-arm64-mac.zip")" + MAC_ARM64_DMG_SHA="$(sha512_base64 "Agent.Teams.AI-${VERSION}-arm64.dmg")" + MAC_ARM64_DMG_SIZE="$(file_size "Agent.Teams.AI-${VERSION}-arm64.dmg")" + MAC_X64_ZIP_SHA="$(sha512_base64 "Agent.Teams.AI-${VERSION}-x64-mac.zip")" + MAC_X64_ZIP_SIZE="$(file_size "Agent.Teams.AI-${VERSION}-x64-mac.zip")" + MAC_X64_DMG_SHA="$(sha512_base64 "Agent.Teams.AI-${VERSION}-x64.dmg")" + MAC_X64_DMG_SIZE="$(file_size "Agent.Teams.AI-${VERSION}-x64.dmg")" cat > latest-mac.yml <
- May trigger SmartScreen — click "More info" → "Run anyway" + May trigger SmartScreen - click "More info" -> "Run anyway" +
+ Windows required: launch Agent Teams AI as Administrator, especially when using OpenCode runtimes. diff --git a/hero-robots-restored.png b/hero-robots-restored.png new file mode 100644 index 00000000..265fcce2 Binary files /dev/null and b/hero-robots-restored.png differ diff --git a/landing/components/hero/CyberHeroFeatureStrip.vue b/landing/components/hero/CyberHeroFeatureStrip.vue index cdc354ff..2e7eab41 100644 --- a/landing/components/hero/CyberHeroFeatureStrip.vue +++ b/landing/components/hero/CyberHeroFeatureStrip.vue @@ -6,10 +6,24 @@ import { mdiShieldCheckOutline, mdiMonitorDashboard, } from "@mdi/js"; -import { getLocalizedHeroFeatureRail } from "~/data/heroScene"; +import { + heroCollaborationFeature, + getLocalizedHeroFeatureRail, + getLocalizedHeroReviewerFeatureCard, + type HeroMessage, + type HeroMessagePhase, +} from "~/data/heroScene"; + +const props = defineProps<{ + activeMessage?: HeroMessage | null; + phase?: HeroMessagePhase; + reducedMotion?: boolean; +}>(); const { locale } = useI18n(); const localizedHeroFeatureRail = computed(() => getLocalizedHeroFeatureRail(locale.value)); +const localizedHeroReviewerFeatureCard = computed(() => getLocalizedHeroReviewerFeatureCard(locale.value)); +const statusLabel = computed(() => locale.value === "ru" ? "Статус:" : "Status:"); const icons = [ mdiRobotOutline, @@ -18,10 +32,74 @@ const icons = [ mdiShieldCheckOutline, mdiMonitorDashboard, ] as const; + +const reviewerIsSender = computed(() => + props.activeMessage?.from === "reviewer" && props.phase !== "cooldown", +); +const reviewerIsReceiver = computed(() => + props.activeMessage?.to === "reviewer" && props.phase === "receiver", +); +const reviewerIsActive = computed(() => reviewerIsSender.value || reviewerIsReceiver.value); +const reviewerBubbleText = computed(() => { + if (!props.activeMessage || props.reducedMotion) return null; + if (props.activeMessage.from === "reviewer" && (props.phase === "sender" || props.phase === "packet")) { + return props.activeMessage.text; + } + if (props.activeMessage.to === "reviewer" && props.phase === "receiver") { + return props.activeMessage.response; + } + return null; +});