diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2114e3d56..2b0eb25c6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -775,63 +775,6 @@ jobs: ${{ steps.artifacts.outputs.exe }} ${{ steps.artifacts.outputs.sig }} - desktop-release-smoke: - name: Desktop release smoke - if: github.repository == 'block/buzz' - runs-on: ubuntu-latest - needs: setup - timeout-minutes: 20 - permissions: - contents: read - env: - PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.cache/ms-playwright - steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - with: - ref: ${{ needs.setup.outputs.source_sha }} - persist-credentials: false - - uses: cashapp/activate-hermit@cea9af7913204a965fd488637a8d1811bba2e616 # v1 - - name: Install desktop dependencies - run: just desktop-install-ci - - name: Get Playwright version - id: pw-version - run: echo "version=$(cd desktop && node -e \"console.log(require('@playwright/test/package.json').version)\")" >> "$GITHUB_OUTPUT" - - name: Restore Playwright browser cache - id: playwright-cache - uses: actions/cache/restore@caa296126883cff596d87d8935842f9db880ef25 # v5 - with: - path: ${{ env.PLAYWRIGHT_BROWSERS_PATH }} - key: playwright-${{ runner.os }}-${{ steps.pw-version.outputs.version }} - - name: Install Playwright Chromium - if: steps.playwright-cache.outputs.cache-hit != 'true' - run: cd desktop && pnpm exec playwright install chromium - - name: Install Playwright system dependencies - run: cd desktop && pnpm exec playwright install-deps chromium - - name: Save Playwright browser cache - if: steps.playwright-cache.outputs.cache-hit != 'true' - uses: actions/cache/save@caa296126883cff596d87d8935842f9db880ef25 # v5 - with: - path: ${{ env.PLAYWRIGHT_BROWSERS_PATH }} - key: playwright-${{ runner.os }}-${{ steps.pw-version.outputs.version }} - - name: Build test relay - run: cargo build --profile ci -p buzz-relay - - name: Run deterministic correctness smoke - env: - BUZZ_E2E_RELAY_BIN: ${{ github.workspace }}/target/ci/buzz-relay - BUZZ_RELEASE_SMOKE_ARTIFACT_DIR: ${{ github.workspace }}/release-smoke-artifacts - run: just desktop-release-smoke - - name: Upload release-smoke diagnostics - if: always() - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 - with: - name: desktop-release-smoke - path: | - release-smoke-artifacts - desktop/test-results - desktop/playwright-release-smoke-report - if-no-files-found: warn - retention-days: 14 - assemble-manifest: name: Assemble multi-platform latest.json # Only the tag-bound setup path can reach this job. @@ -842,10 +785,9 @@ jobs: needs.release-macos-x64.result == 'success' && needs.release-linux.result == 'success' && needs.release-windows.result == 'success' && - needs.desktop-release-smoke.result == 'success' && github.ref == format('refs/tags/desktop-v{0}', needs.setup.outputs.version) runs-on: ubuntu-latest - needs: [setup, release, release-macos-x64, release-linux, release-windows, desktop-release-smoke] + needs: [setup, release, release-macos-x64, release-linux, release-windows] timeout-minutes: 10 permissions: contents: write diff --git a/.release/desktop-candidate.json b/.release/desktop-candidate.json index 2cb878328..2c06a06c6 100644 --- a/.release/desktop-candidate.json +++ b/.release/desktop-candidate.json @@ -1,10 +1,10 @@ { "schema": 2, - "version": "0.5.12", - "base_sha": "757779bb1ef22cc4a1c233344baa0946d907e5a6", - "previous_tag": "desktop-v0.5.11", - "previous_base_sha": "4749bc7be3cdb78c2db4ce4864775ba7ab60b4cc", - "previous_merge_sha": "9e0c6b4320190f80b81998e9e5cbf2214d597dd2", - "tag": "desktop-v0.5.12", - "commit_count": 34 + "version": "0.5.14", + "base_sha": "1b3dbcaaea882eeea90359c1db02e306d2f4f50a", + "previous_tag": "desktop-v0.5.13", + "previous_base_sha": "09768100ec3420f0aa7cd278bd00fe0baab5de8d", + "previous_merge_sha": "51beba603886d34e751349d12b33c0c5aeb92c28", + "tag": "desktop-v0.5.14", + "commit_count": 1 } diff --git a/CHANGELOG.md b/CHANGELOG.md index d169c31f2..9248c6fbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,31 @@ # Changelog +## v0.5.14 + +### Desktop and shared changes + +- None + +### Other repository changes + +- ci(release): remove desktop smoke gate ([#5914](https://github.com/block/buzz/pull/5914)) ([`1b3dbcaaea882eeea90359c1db02e306d2f4f50a`](https://github.com/block/buzz/commit/1b3dbcaaea882eeea90359c1db02e306d2f4f50a)) + +[Compare desktop-v0.5.13...desktop-v0.5.14](https://github.com/block/buzz/compare/desktop-v0.5.13...desktop-v0.5.14) + +## v0.5.13 + +### Desktop and shared changes + +- fix(desktop): restore the agent trading-card mint button ([#5900](https://github.com/block/buzz/pull/5900)) ([`263c9bf76c18f0cde6cec9fb43d22f8895319380`](https://github.com/block/buzz/commit/263c9bf76c18f0cde6cec9fb43d22f8895319380)) +- Projects v3: unify sharing, discussions, and issue ownership ([#5792](https://github.com/block/buzz/pull/5792)) ([`122a8b8988869f0b1a7c056a76f7d16bfb0f6fdd`](https://github.com/block/buzz/commit/122a8b8988869f0b1a7c056a76f7d16bfb0f6fdd)) + +### Other repository changes + +- fix(ci): read Playwright version without nested shell quoting ([#5910](https://github.com/block/buzz/pull/5910)) ([`09768100ec3420f0aa7cd278bd00fe0baab5de8d`](https://github.com/block/buzz/commit/09768100ec3420f0aa7cd278bd00fe0baab5de8d)) +- fix(mobile): unwrap batched observer telemetry ([#5805](https://github.com/block/buzz/pull/5805)) ([`0bb7c60f824a05ac4d8c8569ee1e74d200069b45`](https://github.com/block/buzz/commit/0bb7c60f824a05ac4d8c8569ee1e74d200069b45)) + +[Compare desktop-v0.5.12...desktop-v0.5.13](https://github.com/block/buzz/compare/desktop-v0.5.12...desktop-v0.5.13) + ## v0.5.12 ### Desktop and shared changes diff --git a/desktop/package.json b/desktop/package.json index d13366cae..39e93d8a9 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,7 +1,7 @@ { "name": "buzz", "private": true, - "version": "0.5.12", + "version": "0.5.14", "type": "module", "scripts": { "dev": "vite", diff --git a/desktop/playwright.config.ts b/desktop/playwright.config.ts index 131657cbb..7d06c4da9 100644 --- a/desktop/playwright.config.ts +++ b/desktop/playwright.config.ts @@ -20,6 +20,7 @@ export default defineConfig({ name: "smoke", testMatch: [ "**/smoke.spec.ts", + "**/sidebar-offcanvas-rail.spec.ts", "**/search-scope-screenshots.spec.ts", "**/onboarding-docked-cta-screenshots.spec.ts", "**/identity-key-help.spec.ts", diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock index 0527d5b14..887e1282f 100644 --- a/desktop/src-tauri/Cargo.lock +++ b/desktop/src-tauri/Cargo.lock @@ -1081,7 +1081,7 @@ dependencies = [ [[package]] name = "buzz-desktop" -version = "0.5.12" +version = "0.5.14" dependencies = [ "anyhow", "arboard", diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index 0710e63bd..527690df1 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -7,7 +7,7 @@ members = ["crates/buzz-terminal"] [package] name = "buzz-desktop" -version = "0.5.12" +version = "0.5.14" description = "Buzz desktop app" authors = ["you"] edition = "2021" diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index fbf8aa546..2f85c5d51 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Buzz", - "version": "0.5.12", + "version": "0.5.14", "identifier": "xyz.block.buzz.app", "build": { "beforeDevCommand": { diff --git a/desktop/src/features/profile/ui/UserProfileAgentManagementRows.tsx b/desktop/src/features/profile/ui/UserProfileAgentManagementRows.tsx index 8c6b4138c..7b8a58622 100644 --- a/desktop/src/features/profile/ui/UserProfileAgentManagementRows.tsx +++ b/desktop/src/features/profile/ui/UserProfileAgentManagementRows.tsx @@ -4,6 +4,7 @@ import { ArchiveRestore, CopyPlus, Download, + Sparkles, Trash2, type LucideIcon, } from "lucide-react"; @@ -30,6 +31,7 @@ export function UserProfileAgentManagementRows({ canDeleteAgent, isDeletePending, managedAgent, + onCreateCard, onDeleteAgent, onDuplicateAgent, onExportAgent, @@ -39,11 +41,14 @@ export function UserProfileAgentManagementRows({ canDeleteAgent: boolean; isDeletePending: boolean; managedAgent?: ManagedAgent; + /** Mint an agent trading card. Present only for owner-managed personas. */ + onCreateCard?: () => void; onDeleteAgent: () => void; onDuplicateAgent?: () => void; onExportAgent?: () => void; }) { if ( + !onCreateCard && !onDuplicateAgent && !onExportAgent && !canArchiveAgent && @@ -72,6 +77,15 @@ export function UserProfileAgentManagementRows({ testId="user-profile-export-agent-row" /> ) : null} + {onCreateCard ? ( + + ) : null} {canArchiveAgent ? ( ) : null} diff --git a/desktop/src/features/profile/ui/UserProfilePanel.tsx b/desktop/src/features/profile/ui/UserProfilePanel.tsx index 3fae4da26..998ea3232 100644 --- a/desktop/src/features/profile/ui/UserProfilePanel.tsx +++ b/desktop/src/features/profile/ui/UserProfilePanel.tsx @@ -66,7 +66,7 @@ import { useProfileAgentDeletion } from "@/features/profile/ui/UserProfilePanelD import { useProfileFieldBuckets } from "@/features/profile/ui/UserProfilePanelFields"; import { submitProfilePersonaDialog } from "@/features/profile/ui/UserProfilePanelPersonaSubmit"; import { - type CardMintTarget, + useCardMint, UserProfilePersonaDialogs, } from "@/features/profile/ui/UserProfilePersonaDialogs"; import { @@ -179,8 +179,6 @@ export function UserProfilePanel({ React.useState(null); const [personaToExportSnapshot, setPersonaToExportSnapshot] = React.useState(null); - const [cardMintTarget, setCardMintTarget] = - React.useState(null); const [requestedInstancePubkey, setRequestedInstancePubkey] = React.useState< string | null >(null); @@ -712,6 +710,7 @@ export function UserProfilePanel({ resolvedPersona, ); const canManagePersona = isOwner === true && resolvedPersona !== undefined; + const cardMint = useCardMint(resolvedPersona, managedAgent); const canDeletePersona = canManagePersona && !resolvedPersona?.sourceTeam; const canDeleteProfileAgent = isBot && @@ -822,6 +821,7 @@ export function UserProfilePanel({ agentSettingsFields={agentSettingsFields} diagnosticsFields={diagnosticsFields} onAddToChannel={() => setAddToChannelOpen(true)} + onCreateCard={isBot && canManagePersona ? cardMint.create : undefined} onDeleteAgent={handleDeleteProfileAgent} onDuplicateAgent={ isBot && canManagePersona ? handleDuplicatePersona : undefined @@ -935,7 +935,7 @@ export function UserProfilePanel({ const personaDialogs = ( <> setCardMintTarget(null)} + onCloseCardMint={cardMint.close} onCloseDelete={() => setPersonaToDelete(null)} onCloseDialog={() => setPersonaDialogState(null)} onCloseExportSnapshot={() => setPersonaToExportSnapshot(null)} diff --git a/desktop/src/features/profile/ui/UserProfilePanelSections.tsx b/desktop/src/features/profile/ui/UserProfilePanelSections.tsx index 08286a455..dbe17473f 100644 --- a/desktop/src/features/profile/ui/UserProfilePanelSections.tsx +++ b/desktop/src/features/profile/ui/UserProfilePanelSections.tsx @@ -94,6 +94,8 @@ export type ProfileSummaryViewProps = { agentSettingsFields: ProfileField[]; diagnosticsFields: ProfileField[]; onAddToChannel: () => void; + /** Mint an agent trading card. Present only for owner-managed personas. */ + onCreateCard?: () => void; onDeleteAgent: () => void; onDuplicateAgent?: () => void; onExportAgent?: () => void; @@ -168,6 +170,7 @@ export function ProfileSummaryView({ agentSettingsFields, diagnosticsFields, onAddToChannel, + onCreateCard, onDeleteAgent, onDuplicateAgent, onExportAgent, @@ -512,6 +515,7 @@ export function ProfileSummaryView({ isDeleteAgentPending={isAgentActionPending} managedAgent={managedAgent} onEditAgent={handleEditAgent} + onCreateCard={onCreateCard} onDeleteAgent={onDeleteAgent} onDuplicateAgent={onDuplicateAgent} onExportAgent={onExportAgent} diff --git a/desktop/src/features/profile/ui/UserProfilePanelTabs.tsx b/desktop/src/features/profile/ui/UserProfilePanelTabs.tsx index 65626b7fa..0db96a022 100644 --- a/desktop/src/features/profile/ui/UserProfilePanelTabs.tsx +++ b/desktop/src/features/profile/ui/UserProfilePanelTabs.tsx @@ -206,6 +206,7 @@ export function ProfileInfoTabContent({ isArchived, isDeleteAgentPending, managedAgent, + onCreateCard, onDeleteAgent, onDuplicateAgent, onExportAgent, @@ -225,6 +226,8 @@ export function ProfileInfoTabContent({ isArchived: boolean; isDeleteAgentPending: boolean; managedAgent?: ManagedAgent; + /** Mint an agent trading card. Present only for owner-managed personas. */ + onCreateCard?: () => void; onDeleteAgent: () => void; onDuplicateAgent?: () => void; onExportAgent?: () => void; @@ -257,6 +260,7 @@ export function ProfileInfoTabContent({ !hasInfoFields && !showArchiveAction && !canDeleteAgent && + !onCreateCard && !onDuplicateAgent && !onExportAgent && !showActivityIngress && @@ -306,6 +310,7 @@ export function ProfileInfoTabContent({ canDeleteAgent={canDeleteAgent} isDeletePending={isDeleteAgentPending} managedAgent={managedAgent} + onCreateCard={onCreateCard} onDeleteAgent={onDeleteAgent} onDuplicateAgent={onDuplicateAgent} onExportAgent={onExportAgent} diff --git a/desktop/src/features/profile/ui/UserProfilePersonaDialogs.tsx b/desktop/src/features/profile/ui/UserProfilePersonaDialogs.tsx index 9fae1bd88..5038c0600 100644 --- a/desktop/src/features/profile/ui/UserProfilePersonaDialogs.tsx +++ b/desktop/src/features/profile/ui/UserProfilePersonaDialogs.tsx @@ -1,7 +1,10 @@ +import * as React from "react"; + import type { AcpRuntimeCatalogEntry, AgentPersona, CreatePersonaInput, + ManagedAgent, UpdatePersonaInput, } from "@/shared/api/types"; import { AgentCardMintDialog } from "@/features/agents/ui/AgentCardMintDialog"; @@ -17,6 +20,30 @@ export type CardMintTarget = { canLock: boolean; }; +/** + * Card-mint dialog state plus the callback that opens it. `create` is + * undefined when no persona resolves; owner gating is the caller's job. + */ +export function useCardMint( + persona: AgentPersona | undefined, + managedAgent: ManagedAgent | undefined, +) { + const [target, setTarget] = React.useState(null); + const close = React.useCallback(() => setTarget(null), []); + const create = persona + ? () => + setTarget({ + // Prefer the live instance pubkey; fall back to the + // persona/definition id (same resolution as export). + id: managedAgent?.pubkey ?? persona.id, + name: persona.displayName, + // Locking needs an instance keypair to encrypt to. + canLock: Boolean(managedAgent?.pubkey), + }) + : undefined; + return { close, create, target }; +} + export function UserProfilePersonaDialogs({ cardMintTarget, createError, diff --git a/desktop/src/shared/ui/sidebar.tsx b/desktop/src/shared/ui/sidebar.tsx index a52dc067f..203a88e1d 100644 --- a/desktop/src/shared/ui/sidebar.tsx +++ b/desktop/src/shared/ui/sidebar.tsx @@ -351,7 +351,7 @@ const Sidebar = React.forwardRef< data-variant={variant} data-side={side} > - {/* This is what handles the sidebar gap on desktop */} + {/* Sidebar gap on desktop; the offcanvas sibling below also goes invisible, else it paints over the community rail past the overflow-visible shell. */}