From 88e5d5f9587fc2dd9ff773c584806b64a95efcdc Mon Sep 17 00:00:00 2001 From: earayu Date: Sat, 23 May 2026 18:13:57 +0800 Subject: [PATCH 01/48] =?UTF-8?q?chore:=20=E5=B0=86=20Issue=20=E5=92=8C=20?= =?UTF-8?q?PR=20=E6=A8=A1=E6=9D=BF=E6=94=B9=E4=B8=BA=E4=B8=AD=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 落实 ApeCloud Goose fork 的中文 Issue / PR 协作规则。 --- .github/ISSUE_TEMPLATE/bug_report.md | 50 +++++++++++------------ .github/ISSUE_TEMPLATE/feature_request.md | 24 ++++++----- .github/pull_request_template.md | 23 ++++++----- 3 files changed, 50 insertions(+), 47 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6f464634ad92..da04a5d5d76a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,50 +1,50 @@ --- -name: Bug report -about: Create a report to help us improve +name: Bug 报告 +about: 反馈一个需要修复的问题 title: '' labels: bug assignees: '' --- -**Describe the bug** +> 请用中文填写 Issue 标题和正文。代码标识、命令、日志和上游英文术语可以保留原文。 -💡 Before filing, please check common issues: +**问题描述** + +💡 提交前可以先查看常见问题: https://goose-docs.ai/docs/troubleshooting -📦 To help us debug faster, attach your **diagnostics zip** if possible. -👉 How to capture it: https://goose-docs.ai/docs/troubleshooting/diagnostics-and-reporting/ +📦 为了方便排查,如有可能请附上 **diagnostics zip**。 +👉 获取方式:https://goose-docs.ai/docs/troubleshooting/diagnostics-and-reporting/ -A clear and concise description of what the bug is. +请清楚描述遇到的问题。 --- -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error +**复现步骤** +1. 打开 / 执行 `...` +2. 点击 / 输入 `...` +3. 观察到 `...` --- -**Expected behavior** -A clear and concise description of what you expected to happen. +**预期行为** +请描述你期望发生什么。 --- -**Screenshots** -If applicable, add screenshots to help explain your problem. +**截图 / 日志** +如有截图、日志或命令输出,请贴在这里。 --- -**Please provide the following information** -- **OS & Arch:** [e.g. Ubuntu 22.04 x86] -- **Interface:** [UI / CLI] -- **Version:** [e.g. v1.0.2] -- **Extensions enabled:** [e.g. Computer Controller, Figma] -- **Provider & Model:** [e.g. Google – gemini-1.5-pro] +**环境信息** +- **操作系统与架构**:[例如 Ubuntu 22.04 x86] +- **使用界面**:[UI / CLI] +- **版本**:[例如 v1.0.2] +- **启用的扩展**:[例如 Computer Controller, Figma] +- **Provider 与模型**:[例如 Google – gemini-1.5-pro] --- -**Additional context** -Add any other context about the problem here. +**补充信息** +其他有助于定位的信息。 diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index fbbcc255b8c4..054a5f4416fc 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,22 +1,24 @@ --- -name: Feature request -about: Suggest an idea for this project +name: 功能建议 +about: 提出一个新功能或改进建议 title: '' labels: 'enhancement' assignees: '' --- -**Please explain the motivation behind the feature request.** -Does this feature solve a particular problem you have been experiencing? What opportunities or use cases would be unlocked with this feature? +> 请用中文填写 Issue 标题和正文。代码标识、命令、日志和上游英文术语可以保留原文。 -**Describe the solution you'd like** -A clear and concise description of what you want to happen. +**为什么需要这个功能** +这个功能要解决什么问题?会解锁什么使用场景? -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. +**期望方案** +请描述你希望它如何工作。 -**Additional context** -Add any other context or screenshots about the feature request here. +**考虑过的替代方案** +如果你考虑过其他方案,请写在这里。 -- [x] I have verified this does not duplicate an existing feature request +**补充信息** +其他上下文、截图或相关链接。 + +- [x] 我已确认这不是重复的功能建议 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ef2d9de62162..c04770af5c99 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,16 +1,17 @@ -## Summary - +## 变更摘要 + -### Testing - +### 验证方式 + -### Related Issues -Relates to #ISSUE_ID -Discussion: LINK (if any) +### 关联 Issue +关联:#ISSUE_ID +讨论:LINK(如有) +### 改动边界 + -### Screenshots/Demos (for UX changes) -Before: - -After: +### 截图 / Demo(涉及 UI 时填写) +改动前: +改动后: From d125b8fbbcad61e08a874f91571cda554052d952 Mon Sep 17 00:00:00 2001 From: earayu Date: Sat, 23 May 2026 18:20:49 +0800 Subject: [PATCH 02/48] =?UTF-8?q?ci:=20=E8=B7=B3=E8=BF=87=20dry-run=20?= =?UTF-8?q?=E9=98=B6=E6=AE=B5=E9=9C=80=E8=A6=81=E7=AD=BE=E5=90=8D=E7=9A=84?= =?UTF-8?q?=E6=A1=8C=E9=9D=A2=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 ApeCloud fork 的 release dry-run 保留 CLI、Linux Desktop 和安装脚本产物,暂时跳过当前缺少签名证书的 macOS / Windows Desktop job。 --- .github/workflows/release.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ab4f88116e88..0092f3dd200c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,6 +44,7 @@ jobs: # 3) Bundle Desktop App (macOS) # ------------------------------------------------------------ bundle-desktop: + if: false # ApeCloud fork dry-run: skip signed macOS Apple Silicon Desktop until signing is configured. uses: ./.github/workflows/bundle-desktop.yml permissions: id-token: write @@ -57,6 +58,7 @@ jobs: # 4) Bundle Desktop App (macOS) # ------------------------------------------------------------ bundle-desktop-intel: + if: false # ApeCloud fork dry-run: skip signed macOS Intel Desktop until signing is configured. uses: ./.github/workflows/bundle-desktop-intel.yml permissions: id-token: write @@ -76,6 +78,7 @@ jobs: # # 6) Bundle Desktop App (Windows) # # ------------------------------------------------------------ bundle-desktop-windows: + if: false # ApeCloud fork dry-run: skip signed Windows Desktop until signing is configured. uses: ./.github/workflows/bundle-desktop-windows.yml permissions: id-token: write @@ -86,6 +89,7 @@ jobs: secrets: inherit bundle-desktop-windows-cuda: + if: false # ApeCloud fork dry-run: skip signed Windows CUDA Desktop until signing is configured. uses: ./.github/workflows/bundle-desktop-windows.yml permissions: id-token: write @@ -102,7 +106,7 @@ jobs: release: name: Release runs-on: ubuntu-latest - needs: [build-cli, install-script, bundle-desktop, bundle-desktop-intel, bundle-desktop-linux, bundle-desktop-windows, bundle-desktop-windows-cuda] + needs: [build-cli, install-script, bundle-desktop-linux] permissions: contents: write id-token: write # Required for Sigstore OIDC signing From d0d1a738ec9ac9f7e8fa4d925e47eb379934a177 Mon Sep 17 00:00:00 2001 From: earayu Date: Sun, 24 May 2026 00:50:59 +0800 Subject: [PATCH 03/48] chore(ci): Rename Docker image and install-script REPO for ApeCloud fork (#6) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part of #5 category 5 (打包分发) — minimal first slice. Pure path / name changes, no Rust code or build-matrix output cascading. - publish-docker.yml: image path `/goose` → `/apemind-agent` (product display name ApeMind Agent confirmed 2026-05-23). After this lands, Docker dry-runs publish to `ghcr.io/apecloud/apemind-agent` instead of `ghcr.io/apecloud/goose`. - download_cli.sh / download_cli.ps1: REPO `aaif-goose/goose` → `apecloud/goose` so the install script downloads release artifacts from this fork, not upstream. Deferred to follow-up PR (heavier cascade through build-cli.yml + release.yml glob + Cargo [[bin]] name): - Asset filename rename goose-${TARGET}-... → apemind-agent-${TARGET}-... - CLI binary rename goose → apemind - download_cli.sh FILE-pattern / OUT_FILE updates (depend on asset filenames first) - Desktop installer name rename .deb / .rpm (bundle-desktop-linux.yml) 5-cat compliance: category 5 (打包分发) only. No Rust internals touched. Signed-off-by: earayu --- .github/workflows/publish-docker.yml | 4 ++-- download_cli.ps1 | 4 ++-- download_cli.sh | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index 0c08ed6eeff9..9cbb9d56aa3c 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -39,7 +39,7 @@ jobs: id: meta uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: - images: ghcr.io/${{ github.repository_owner }}/goose + images: ghcr.io/${{ github.repository_owner }}/apemind-agent tags: | # For main branch: latest, main, and sha type=ref,event=branch @@ -67,6 +67,6 @@ jobs: - name: Attest Docker image uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0 with: - subject-name: ghcr.io/${{ github.repository_owner }}/goose + subject-name: ghcr.io/${{ github.repository_owner }}/apemind-agent subject-digest: ${{ steps.docker-push.outputs.digest }} push-to-registry: true diff --git a/download_cli.ps1 b/download_cli.ps1 index e40993475c1f..c3742d6a96f4 100644 --- a/download_cli.ps1 +++ b/download_cli.ps1 @@ -8,7 +8,7 @@ # Supported Architectures: x86_64 # # Usage: -# Invoke-WebRequest -Uri "https://github.com/aaif-goose/goose/releases/download/stable/download_cli.ps1" -OutFile "download_cli.ps1"; .\download_cli.ps1 +# Invoke-WebRequest -Uri "https://github.com/apecloud/goose/releases/download/stable/download_cli.ps1" -OutFile "download_cli.ps1"; .\download_cli.ps1 # Or simply: .\download_cli.ps1 # # Environment variables: @@ -25,7 +25,7 @@ $ErrorActionPreference = "Stop" # --- 1) Variables --- -$REPO = "aaif-goose/goose" +$REPO = "apecloud/goose" $OUT_FILE = "goose.exe" # Set default bin directory if not specified diff --git a/download_cli.sh b/download_cli.sh index a995d1d09602..f9e64350c5a5 100755 --- a/download_cli.sh +++ b/download_cli.sh @@ -11,7 +11,7 @@ set -eu # Supported Architectures: x86_64, arm64 # # Usage: -# curl -fsSL https://github.com/aaif-goose/goose/releases/download/stable/download_cli.sh | bash +# curl -fsSL https://github.com/apecloud/goose/releases/download/stable/download_cli.sh | bash # # Environment variables: # GOOSE_BIN_DIR - Directory to which goose will be installed (default: $HOME/.local/bin) @@ -54,7 +54,7 @@ fi # --- 2) Variables --- -REPO="aaif-goose/goose" +REPO="apecloud/goose" OUT_FILE="goose" # Set default bin directory based on detected OS environment @@ -220,7 +220,7 @@ echo "Downloading $RELEASE_TAG release: $FILE..." if ! curl -sLf "$DOWNLOAD_URL" --output "$FILE"; then # If the download fails, only fall back to latest stable when no version was specified and canary was not requested). if ! [ -n "${GOOSE_VERSION:-}" ] && [ "${CANARY:-false}" != "true" ]; then - LATEST_TAG=$(curl -s https://api.github.com/repos/aaif-goose/goose/releases/latest | \ + LATEST_TAG=$(curl -s https://api.github.com/repos/apecloud/goose/releases/latest | \ grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') if [ -z "$LATEST_TAG" ]; then echo "Error: Failed to download $DOWNLOAD_URL and latest tag unavailable" From d9b121f21b41573593fa7299bb73433c589a4611 Mon Sep 17 00:00:00 2001 From: earayu Date: Sun, 24 May 2026 01:25:17 +0800 Subject: [PATCH 04/48] Brand desktop as ApeMind Agent (#7) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * brand desktop as ApeMind Agent * ci: skip external smoke jobs without Anthropic secret --------- Co-authored-by: 梅西 --- .github/workflows/pr-smoke-test.yml | 58 ++++++++ README.md | 88 ++++++------ ...nager__tests__all_platform_extensions.snap | 4 +- ..._agents__prompt_manager__tests__basic.snap | 4 +- ..._prompt_manager__tests__one_extension.snap | 4 +- ..._prompt_manager__tests__typical_setup.snap | 5 +- crates/goose/src/prompts/subagent_system.md | 11 +- crates/goose/src/prompts/system.md | 5 +- crates/goose/src/prompts/tiny_model_system.md | 4 +- ui/desktop/forge.config.ts | 4 +- ui/desktop/package.json | 4 +- ui/desktop/src/App.test.tsx | 2 +- ui/desktop/src/App.tsx | 15 +- ui/desktop/src/built-in-extensions.json | 2 +- .../src/components/ElicitationRequest.tsx | 2 +- ui/desktop/src/components/ErrorBoundary.tsx | 2 +- ui/desktop/src/components/GooseLogo.tsx | 19 +-- .../GroupedExtensionLoadingToast.tsx | 2 +- ui/desktop/src/components/ImagePreview.tsx | 2 +- ui/desktop/src/components/LauncherView.tsx | 2 +- ui/desktop/src/components/LoadingGoose.tsx | 10 +- .../src/components/TelemetryConsentPrompt.tsx | 4 +- .../src/components/ToolCallConfirmation.tsx | 2 +- .../components/extensions/ExtensionsView.tsx | 2 +- .../components/onboarding/OnboardingGuard.tsx | 4 +- .../onboarding/OnboardingSuccess.tsx | 4 +- .../onboarding/PrivacyInfoModal.tsx | 4 +- .../components/recipes/ImportRecipeForm.tsx | 2 +- .../sessions/SessionHistoryView.tsx | 2 +- .../settings/PromptsSettingsSection.tsx | 2 +- .../settings/app/AppSettingsSection.tsx | 36 ++--- .../settings/app/ExternalBackendSection.tsx | 6 +- .../settings/app/TelemetrySettings.tsx | 2 +- .../settings/chat/ChatSettingsSection.tsx | 4 +- .../keyboard/KeyboardShortcutsSection.tsx | 10 +- .../mode/ConversationLimitsDropdown.tsx | 2 +- .../providers/ProviderSettingsPage.tsx | 2 +- .../modal/ProviderConfigurationModal.tsx | 4 +- .../buttons/DefaultCardButtons.tsx | 2 +- .../src/components/skills/SkillsView.tsx | 2 +- ui/desktop/src/hooks/useChatStream.ts | 4 +- ui/desktop/src/i18n/messages/en.json | 104 +++++++------- ui/desktop/src/i18n/messages/zh-CN.json | 134 +++++++++--------- ui/desktop/src/images/glyph.svg | 11 +- ui/desktop/src/images/icon-512.png | Bin 308971 -> 104020 bytes ui/desktop/src/images/icon-light.icns | Bin 1832970 -> 593357 bytes ui/desktop/src/images/icon-light.png | Bin 1515519 -> 299864 bytes ui/desktop/src/images/icon.icns | Bin 1256400 -> 593357 bytes ui/desktop/src/images/icon.ico | Bin 107653 -> 58027 bytes ui/desktop/src/images/icon.png | Bin 985559 -> 299864 bytes ui/desktop/src/images/icon.svg | 14 +- ui/desktop/src/images/icon@2x.png | Bin 883459 -> 859771 bytes ui/desktop/src/images/iconTemplate.png | Bin 649 -> 2241 bytes ui/desktop/src/images/iconTemplate@2x.png | Bin 1795 -> 4267 bytes ui/desktop/src/images/iconTemplateUpdate.png | Bin 630 -> 2241 bytes .../src/images/iconTemplateUpdate@2x.png | Bin 1403 -> 4267 bytes ui/desktop/src/images/logo.png | Bin 0 -> 42306 bytes ui/desktop/src/images/logo_dark_en_US.png | Bin 0 -> 17641 bytes ui/desktop/src/images/logo_light_en_US.png | Bin 0 -> 37516 bytes ui/desktop/src/main.ts | 30 ++-- ui/desktop/src/renderer.tsx | 2 +- ui/desktop/src/toasts.tsx | 2 +- ui/desktop/src/types/message.ts | 2 +- ui/desktop/src/utils/githubUpdater.ts | 4 +- 64 files changed, 355 insertions(+), 297 deletions(-) create mode 100644 ui/desktop/src/images/logo.png create mode 100644 ui/desktop/src/images/logo_dark_en_US.png create mode 100644 ui/desktop/src/images/logo_light_en_US.png diff --git a/.github/workflows/pr-smoke-test.yml b/.github/workflows/pr-smoke-test.yml index 814658875f71..4eb030f4fe37 100644 --- a/.github/workflows/pr-smoke-test.yml +++ b/.github/workflows/pr-smoke-test.yml @@ -88,33 +88,52 @@ jobs: runs-on: ubuntu-latest needs: build-binary steps: + - name: Check Anthropic secret + id: check-secrets + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + run: | + if [ -n "$ANTHROPIC_API_KEY" ]; then + echo "has_anthropic=true" >> "$GITHUB_OUTPUT" + else + echo "has_anthropic=false" >> "$GITHUB_OUTPUT" + echo "Skipping smoke tests because ANTHROPIC_API_KEY is not configured for this repository." + fi + - name: Checkout Code + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ github.event.inputs.branch || github.ref }} - name: Download Binary + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: goose-binary path: target/debug - name: Make Binary Executable + if: steps.check-secrets.outputs.has_anthropic == 'true' run: chmod +x target/debug/goose - name: Set up Node.js + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: actions/setup-node@v4 with: node-version: '22' - name: Install agentic providers + if: steps.check-secrets.outputs.has_anthropic == 'true' run: npm install -g @anthropic-ai/claude-code @zed-industries/claude-agent-acp @zed-industries/codex-acp - name: Install Node.js Dependencies + if: steps.check-secrets.outputs.has_anthropic == 'true' run: source ../../bin/activate-hermit && pnpm install --frozen-lockfile working-directory: ui/desktop - name: Run Smoke Tests (Normal Mode) + if: steps.check-secrets.outputs.has_anthropic == 'true' env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} @@ -137,14 +156,17 @@ jobs: working-directory: ui/desktop - name: Set up Python + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: actions/setup-python@v6 with: python-version: '3.12' - name: Install uv + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # v7.2.0 - name: Run MCP Tests + if: steps.check-secrets.outputs.has_anthropic == 'true' env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} @@ -161,6 +183,7 @@ jobs: bash scripts/test_mcp.sh - name: Run Subrecipe Tests + if: steps.check-secrets.outputs.has_anthropic == 'true' env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GOOSE_PROVIDER: anthropic @@ -219,29 +242,47 @@ jobs: runs-on: ubuntu-latest needs: build-binary steps: + - name: Check Anthropic secret + id: check-secrets + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + run: | + if [ -n "$ANTHROPIC_API_KEY" ]; then + echo "has_anthropic=true" >> "$GITHUB_OUTPUT" + else + echo "has_anthropic=false" >> "$GITHUB_OUTPUT" + echo "Skipping compaction tests because ANTHROPIC_API_KEY is not configured for this repository." + fi + - name: Checkout Code + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ github.event.inputs.branch || github.ref }} - name: Download Binary + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: goose-binary path: target/debug - name: Make Binary Executable + if: steps.check-secrets.outputs.has_anthropic == 'true' run: chmod +x target/debug/goose - name: Set up Python + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: actions/setup-python@v6 with: python-version: '3.12' - name: Install uv + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # v7.2.0 - name: Run Compaction Tests + if: steps.check-secrets.outputs.has_anthropic == 'true' env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GOOSE_PROVIDER: anthropic @@ -259,25 +300,42 @@ jobs: runs-on: ubuntu-latest needs: build-binary steps: + - name: Check Anthropic secret + id: check-secrets + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + run: | + if [ -n "$ANTHROPIC_API_KEY" ]; then + echo "has_anthropic=true" >> "$GITHUB_OUTPUT" + else + echo "has_anthropic=false" >> "$GITHUB_OUTPUT" + echo "Skipping goose server HTTP integration tests because ANTHROPIC_API_KEY is not configured for this repository." + fi + - name: Checkout Code + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ github.event.inputs.branch || github.ref }} - name: Download Binary + if: steps.check-secrets.outputs.has_anthropic == 'true' uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: goosed-binary path: target/debug - name: Make Binary Executable + if: steps.check-secrets.outputs.has_anthropic == 'true' run: chmod +x target/debug/goosed - name: Install Node.js Dependencies + if: steps.check-secrets.outputs.has_anthropic == 'true' run: source ../../bin/activate-hermit && pnpm install --frozen-lockfile working-directory: ui/desktop - name: Run Integration Tests + if: steps.check-secrets.outputs.has_anthropic == 'true' env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GOOSED_BINARY: ../../target/debug/goosed diff --git a/README.md b/README.md index e6c4f056081f..e7315503477f 100644 --- a/README.md +++ b/README.md @@ -1,61 +1,57 @@ -> **🦆 goose has moved!** This project has moved from `block/goose` to the [Agentic AI Foundation (AAIF)](https://aaif.io/) at the Linux Foundation. Some links and references are still being updated — please bear with us during the transition. +# ApeMind Agent -
+ApeMind Agent is an ApeCloud desktop agent distribution based on upstream +[Goose](https://github.com/aaif-goose/goose). It runs on the user's own machine +and provides a local desktop entry point for agent workflows. -# goose +The first PoC focuses on desktop branding and safe packaging defaults while +keeping the fork shallow enough to continue tracking upstream. -_your native open source AI agent — desktop app, CLI, and API — for code, workflows, and everything in between_ +## What This Fork Changes -

- - Discord - CI - - Packaging status -

-
+- ApeMind Agent product name and desktop-facing copy. +- ApeCloud/ApeMind visual assets for desktop packaging. +- Build defaults that avoid telemetry, OTel, and AWS provider features unless + explicitly enabled. -goose is a general-purpose AI agent that runs on your machine. Not just for code — use it for research, writing, automation, data analysis, or anything you need to get done. +Packaging artifact names for desktop installers, CLI downloads, and Docker +images are tracked separately as distribution work. -A native desktop app for macOS, Linux, and Windows. A full CLI for terminal workflows. An API to embed it anywhere. Built in Rust for performance and portability. +## What Stays Upstream-Compatible -goose works with 15+ providers — Anthropic, OpenAI, Google, Ollama, OpenRouter, Azure, Bedrock, and more. Use API keys or your existing Claude, ChatGPT, or Gemini subscriptions via [ACP](https://goose-docs.ai/docs/guides/acp-providers). Connect to 70+ extensions via the [Model Context Protocol](https://modelcontextprotocol.io/) open standard. +- Core agent loop. +- Tool execution behavior. +- Provider runtime internals. +- MCP runtime internals. +- Cargo crate names and repository path. -goose is part of the [Agentic AI Foundation (AAIF)](https://aaif.io/) at the Linux Foundation. +## Target Users -# Get started +The main user entry point is the desktop app: -**[Download the desktop app](https://goose-docs.ai/docs/getting-started/installation)** for macOS, Linux, and Windows. +- macOS Desktop for internal team validation. +- Windows Desktop for customer validation. +- CLI for debugging and automation. +- Docker for distribution and automated smoke checks. -Or install the CLI: +## Build Notes + +The PoC CLI profile uses upstream feature flags and release settings: ```bash -curl -fsSL https://github.com/aaif-goose/goose/releases/download/stable/download_cli.sh | bash +source ./bin/activate-hermit >/tmp/hermit.log 2>&1 +CARGO_PROFILE_RELEASE_LTO=true \ +CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1 \ +CARGO_PROFILE_RELEASE_OPT_LEVEL=z \ +CARGO_PROFILE_RELEASE_STRIP=true \ + cargo build --release --package goose-cli --bin goose \ + --no-default-features --features rustls-tls ``` -# Quick links -- [Quickstart](https://goose-docs.ai/docs/quickstart) -- [Installation](https://goose-docs.ai/docs/getting-started/installation) -- [Tutorials](https://goose-docs.ai/docs/category/tutorials) -- [Documentation](https://goose-docs.ai/docs/category/getting-started) -- [Governance](https://github.com/aaif-goose/goose/blob/main/GOVERNANCE.md) -- [Custom Distributions](https://github.com/aaif-goose/goose/blob/main/CUSTOM_DISTROS.md) — build your own goose distro with preconfigured providers, extensions, and branding - -## Need help? -- [Diagnostics & Reporting](https://goose-docs.ai/docs/troubleshooting/diagnostics-and-reporting) -- [Known Issues](https://goose-docs.ai/docs/troubleshooting/known-issues) - -# a little goose humor 🪿 - -> Why did the developer choose goose as their AI agent? -> -> Because it always helps them "migrate" their code to production! 🚀 - -# goose around with us -- [Discord](https://discord.gg/goose-oss) -- [YouTube](https://www.youtube.com/@goose-oss) -- [LinkedIn](https://www.linkedin.com/company/goose-oss) -- [Twitter/X](https://x.com/goose_oss) +This keeps AWS provider, telemetry, and OTel out of the default PoC build. + +## Upstream + +This project is a branded distribution of Goose, an Apache-2.0 licensed open +source project from the Agentic AI Foundation at the Linux Foundation. Keep the +upstream license and notices intact when distributing ApeMind Agent. diff --git a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__all_platform_extensions.snap b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__all_platform_extensions.snap index 9b28abafa0a4..1ffd74ec38df 100644 --- a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__all_platform_extensions.snap +++ b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__all_platform_extensions.snap @@ -3,8 +3,8 @@ source: crates/goose/src/agents/prompt_manager.rs assertion_line: 458 expression: system_prompt --- -You are a general-purpose AI agent called goose, created by AAIF (Agentic AI Foundation). -goose is being developed as an open-source software project. +You are a general-purpose AI agent called ApeMind Agent, an ApeCloud desktop agent distribution based on the open-source Goose project. +ApeMind Agent is designed to run on the user's own machine. # Extensions diff --git a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__basic.snap b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__basic.snap index 03c0549415f0..bb2f15575c51 100644 --- a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__basic.snap +++ b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__basic.snap @@ -2,8 +2,8 @@ source: crates/goose/src/agents/prompt_manager.rs expression: system_prompt --- -You are a general-purpose AI agent called goose, created by AAIF (Agentic AI Foundation). -goose is being developed as an open-source software project. +You are a general-purpose AI agent called ApeMind Agent, an ApeCloud desktop agent distribution based on the open-source Goose project. +ApeMind Agent is designed to run on the user's own machine. # Extensions diff --git a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__one_extension.snap b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__one_extension.snap index 306fd7dc7dfd..1a0dcfcc8b98 100644 --- a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__one_extension.snap +++ b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__one_extension.snap @@ -2,8 +2,8 @@ source: crates/goose/src/agents/prompt_manager.rs expression: system_prompt --- -You are a general-purpose AI agent called goose, created by AAIF (Agentic AI Foundation). -goose is being developed as an open-source software project. +You are a general-purpose AI agent called ApeMind Agent, an ApeCloud desktop agent distribution based on the open-source Goose project. +ApeMind Agent is designed to run on the user's own machine. # Extensions diff --git a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__typical_setup.snap b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__typical_setup.snap index f26bbb850369..9ad0b67274b8 100644 --- a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__typical_setup.snap +++ b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__typical_setup.snap @@ -2,8 +2,8 @@ source: crates/goose/src/agents/prompt_manager.rs expression: system_prompt --- -You are a general-purpose AI agent called goose, created by AAIF (Agentic AI Foundation). -goose is being developed as an open-source software project. +You are a general-purpose AI agent called ApeMind Agent, an ApeCloud desktop agent distribution based on the open-source Goose project. +ApeMind Agent is designed to run on the user's own machine. # Extensions @@ -26,6 +26,7 @@ extension_A supports resources. ### Instructions + # Suggestion The user has 6 extensions with 51 tools enabled, exceeding recommended limits (5 extensions or 50 tools). diff --git a/crates/goose/src/prompts/subagent_system.md b/crates/goose/src/prompts/subagent_system.md index 192f94f2eef7..6ea7054f627f 100644 --- a/crates/goose/src/prompts/subagent_system.md +++ b/crates/goose/src/prompts/subagent_system.md @@ -1,34 +1,41 @@ -You are a specialized subagent within the goose AI framework, created by AAIF (Agentic AI Foundation). You were spawned by the main goose agent to handle a specific task efficiently. +You are a specialized subagent within ApeMind Agent, an ApeCloud desktop agent distribution based on the open-source Goose project. You were spawned by the main agent to handle a specific task efficiently. # Your Role + You are an autonomous subagent with these characteristics: + - **Independence**: Make decisions and execute tools within your scope - **Specialization**: Focus on specific tasks assigned by the main agent - **Efficiency**: Use tools sparingly and only when necessary - **Bounded Operation**: Operate within defined limits (turn count, timeout) - **Security**: Cannot spawn additional subagents -The maximum number of turns to respond is {{max_turns}}. + The maximum number of turns to respond is {{max_turns}}. {% if subagent_id is defined %} **Subagent ID**: {{subagent_id}} {% endif %} {% if task_instructions %} + # Task Instructions + {{task_instructions}} {% endif %} # Tool Usage Guidelines + **CRITICAL**: Be efficient with tool usage. Use tools only when absolutely necessary to complete your task. Here are the available tools you have access to: You have access to {{tool_count}} tools: {{available_tools}} **Tool Efficiency Rules**: + - Use the minimum number of tools needed to complete your task - Avoid exploratory tool usage unless explicitly required - Stop using tools once you have sufficient information - Provide clear, concise responses without excessive tool calls # Communication Guidelines + - **Progress Updates**: Report progress clearly and concisely - **Completion**: Clearly indicate when your task is complete - **Scope**: Stay focused on your assigned task diff --git a/crates/goose/src/prompts/system.md b/crates/goose/src/prompts/system.md index aa9d0ae8b249..16062f693b40 100644 --- a/crates/goose/src/prompts/system.md +++ b/crates/goose/src/prompts/system.md @@ -1,5 +1,5 @@ -You are a general-purpose AI agent called goose, created by AAIF (Agentic AI Foundation). -goose is being developed as an open-source software project. +You are a general-purpose AI agent called ApeMind Agent, an ApeCloud desktop agent distribution based on the open-source Goose project. +ApeMind Agent is designed to run on the user's own machine. {% if not code_execution_mode %} # Extensions @@ -31,6 +31,7 @@ No extensions are defined. You should let the user know that they should add ext {% if extension_tool_limits is defined and not code_execution_mode %} {% with (extension_count, tool_count) = extension_tool_limits %} + # Suggestion The user has {{extension_count}} extensions with {{tool_count}} tools enabled, exceeding recommended limits ({{max_extensions}} extensions or {{max_tools}} tools). diff --git a/crates/goose/src/prompts/tiny_model_system.md b/crates/goose/src/prompts/tiny_model_system.md index 2a05d84160a5..75db89d6bd29 100644 --- a/crates/goose/src/prompts/tiny_model_system.md +++ b/crates/goose/src/prompts/tiny_model_system.md @@ -1,4 +1,4 @@ -You are goose, an autonomous AI agent created by AAIF (Agentic AI Foundation). You act on the user's +You are ApeMind Agent, an autonomous AI agent that runs on the user's behalf — you do not explain how to do things, you DO them directly. The OS is {{os}}, the shell is {{shell}}, and the working directory is {{working_directory}} @@ -19,4 +19,4 @@ $ ls -1 /tmp | wc -l After a command runs, you will see its output. Use the output to answer the user or take the next step. Do not repeat commands you have already run. -Do not use shell commands if you already know the answer. \ No newline at end of file +Do not use shell commands if you already know the answer. diff --git a/ui/desktop/forge.config.ts b/ui/desktop/forge.config.ts index 63a8e8ceea76..ff0497d7011b 100644 --- a/ui/desktop/forge.config.ts +++ b/ui/desktop/forge.config.ts @@ -36,9 +36,9 @@ let cfg = { ], // Usage descriptions for macOS TCC (Transparency, Consent, and Control) NSCalendarsUsageDescription: - 'Goose needs access to your calendars to help manage and query calendar events.', + 'ApeMind Agent needs access to your calendars to help manage and query calendar events.', NSRemindersUsageDescription: - 'Goose needs access to your reminders to help manage and query reminders.', + 'ApeMind Agent needs access to your reminders to help manage and query reminders.', }, }; diff --git a/ui/desktop/package.json b/ui/desktop/package.json index d8aefa6dbd65..ca762b463116 100644 --- a/ui/desktop/package.json +++ b/ui/desktop/package.json @@ -1,8 +1,8 @@ { "name": "goose-app", - "productName": "Goose", + "productName": "ApeMind Agent", "version": "1.35.0", - "description": "Goose App", + "description": "ApeMind Agent Desktop", "engines": { "node": "^24.10.0", "pnpm": ">=10.30.0" diff --git a/ui/desktop/src/App.test.tsx b/ui/desktop/src/App.test.tsx index 93838699329e..8524d781d689 100644 --- a/ui/desktop/src/App.test.tsx +++ b/ui/desktop/src/App.test.tsx @@ -251,7 +251,7 @@ describe('App Component - Brand New State', () => { expect(mockElectron.reactReady).toHaveBeenCalled(); }); - expect(screen.getByText(/^Welcome to goose/)).toBeInTheDocument(); + expect(screen.getByText(/^Welcome to ApeMind Agent/)).toBeInTheDocument(); }); it('should not redirect when provider is configured', async () => { diff --git a/ui/desktop/src/App.tsx b/ui/desktop/src/App.tsx index e53dcde476ac..dca6bba5503d 100644 --- a/ui/desktop/src/App.tsx +++ b/ui/desktop/src/App.tsx @@ -486,13 +486,18 @@ export function AppInner() { // Show a toast if mesh is the configured provider but isn't running. useEffect(() => { const handler = () => { - toast.warn('Inference Mesh is set as your provider but isn\'t running. Open Settings → Mesh to start it. Keep goose running to stay connected.', { - autoClose: false, - toastId: 'mesh-not-running', - }); + toast.warn( + "Inference Mesh is set as your provider but isn't running. Open Settings -> Mesh to start it. Keep ApeMind Agent running to stay connected.", + { + autoClose: false, + toastId: 'mesh-not-running', + } + ); }; window.electron.on('mesh-not-running', handler); - return () => { window.electron.off('mesh-not-running', handler); }; + return () => { + window.electron.off('mesh-not-running', handler); + }; }, []); // Prevent default drag and drop behavior globally to avoid opening files in new windows diff --git a/ui/desktop/src/built-in-extensions.json b/ui/desktop/src/built-in-extensions.json index d47e3265f691..f6b2812d1881 100644 --- a/ui/desktop/src/built-in-extensions.json +++ b/ui/desktop/src/built-in-extensions.json @@ -29,7 +29,7 @@ { "id": "memory", "name": "Memory", - "description": "Teach goose your preferences as you go.", + "description": "Teach ApeMind Agent your preferences as you go.", "enabled": false, "type": "builtin", "env_keys": [], diff --git a/ui/desktop/src/components/ElicitationRequest.tsx b/ui/desktop/src/components/ElicitationRequest.tsx index 4eefffd95a53..8e131f3a8f18 100644 --- a/ui/desktop/src/components/ElicitationRequest.tsx +++ b/ui/desktop/src/components/ElicitationRequest.tsx @@ -20,7 +20,7 @@ const i18n = defineMessages({ }, defaultMessage: { id: 'elicitationRequest.defaultMessage', - defaultMessage: 'Goose needs some information from you.', + defaultMessage: 'ApeMind Agent needs some information from you.', }, submit: { id: 'elicitationRequest.submit', diff --git a/ui/desktop/src/components/ErrorBoundary.tsx b/ui/desktop/src/components/ErrorBoundary.tsx index 8a9dd001e30c..6701785244ff 100644 --- a/ui/desktop/src/components/ErrorBoundary.tsx +++ b/ui/desktop/src/components/ErrorBoundary.tsx @@ -12,7 +12,7 @@ const i18n = defineMessages({ }, errorWithVersion: { id: 'errorBoundary.errorWithVersion', - defaultMessage: 'An error occurred in Goose v{version}.', + defaultMessage: 'An error occurred in ApeMind Agent v{version}.', }, errorGeneric: { id: 'errorBoundary.errorGeneric', diff --git a/ui/desktop/src/components/GooseLogo.tsx b/ui/desktop/src/components/GooseLogo.tsx index b82a0384986e..acbc0157baec 100644 --- a/ui/desktop/src/components/GooseLogo.tsx +++ b/ui/desktop/src/components/GooseLogo.tsx @@ -1,5 +1,5 @@ -import { Goose, Rain } from './icons/Goose'; import { cn } from '../utils'; +import apeCloudLogo from '../images/logo.png'; interface GooseLogoProps { className?: string; @@ -15,12 +15,10 @@ export default function GooseLogo({ const sizes = { default: { frame: 'w-16 h-16', - rain: 'w-[275px] h-[275px]', goose: 'w-16 h-16', }, small: { frame: 'w-8 h-8', - rain: 'w-[150px] h-[150px]', goose: 'w-8 h-8', }, } as const; @@ -32,18 +30,15 @@ export default function GooseLogo({ className={cn( className, currentSize.frame, - 'relative overflow-hidden', - hover && 'group/with-hover' + 'relative overflow-hidden rounded-xl', + hover && 'transition-transform duration-200 hover:scale-105' )} > - - ); } diff --git a/ui/desktop/src/components/GroupedExtensionLoadingToast.tsx b/ui/desktop/src/components/GroupedExtensionLoadingToast.tsx index 87e96dde15cc..9cc09cefcc41 100644 --- a/ui/desktop/src/components/GroupedExtensionLoadingToast.tsx +++ b/ui/desktop/src/components/GroupedExtensionLoadingToast.tsx @@ -32,7 +32,7 @@ const i18n = defineMessages({ }, askGoose: { id: 'groupedExtensionLoadingToast.askGoose', - defaultMessage: 'Ask goose', + defaultMessage: 'Ask ApeMind Agent', }, copied: { id: 'groupedExtensionLoadingToast.copied', diff --git a/ui/desktop/src/components/ImagePreview.tsx b/ui/desktop/src/components/ImagePreview.tsx index 8c89748cfcc9..cfa762d18127 100644 --- a/ui/desktop/src/components/ImagePreview.tsx +++ b/ui/desktop/src/components/ImagePreview.tsx @@ -8,7 +8,7 @@ const i18n = defineMessages({ }, altText: { id: 'imagePreview.altText', - defaultMessage: 'goose image', + defaultMessage: 'ApeMind Agent image', }, clickToCollapse: { id: 'imagePreview.clickToCollapse', diff --git a/ui/desktop/src/components/LauncherView.tsx b/ui/desktop/src/components/LauncherView.tsx index 6f079b6eb4dc..9045a1277b68 100644 --- a/ui/desktop/src/components/LauncherView.tsx +++ b/ui/desktop/src/components/LauncherView.tsx @@ -5,7 +5,7 @@ import { getInitialWorkingDir } from '../utils/workingDir'; const messages = defineMessages({ placeholder: { id: 'launcher.placeholder', - defaultMessage: 'Ask goose anything...', + defaultMessage: 'Ask ApeMind Agent anything...', }, }); diff --git a/ui/desktop/src/components/LoadingGoose.tsx b/ui/desktop/src/components/LoadingGoose.tsx index caff7ccedd36..db022aae9f27 100644 --- a/ui/desktop/src/components/LoadingGoose.tsx +++ b/ui/desktop/src/components/LoadingGoose.tsx @@ -16,23 +16,23 @@ const i18n = defineMessages({ }, thinking: { id: 'loadingGoose.thinking', - defaultMessage: 'goose is thinking…', + defaultMessage: 'ApeMind Agent is thinking...', }, streaming: { id: 'loadingGoose.streaming', - defaultMessage: 'goose is working on it…', + defaultMessage: 'ApeMind Agent is working on it...', }, waiting: { id: 'loadingGoose.waiting', - defaultMessage: 'goose is waiting…', + defaultMessage: 'ApeMind Agent is waiting...', }, compacting: { id: 'loadingGoose.compacting', - defaultMessage: 'goose is compacting the conversation...', + defaultMessage: 'ApeMind Agent is compacting the conversation...', }, idle: { id: 'loadingGoose.idle', - defaultMessage: 'goose is working on it…', + defaultMessage: 'ApeMind Agent is working on it...', }, restartingAgent: { id: 'loadingGoose.restartingAgent', diff --git a/ui/desktop/src/components/TelemetryConsentPrompt.tsx b/ui/desktop/src/components/TelemetryConsentPrompt.tsx index 56128077dc20..600961eaff35 100644 --- a/ui/desktop/src/components/TelemetryConsentPrompt.tsx +++ b/ui/desktop/src/components/TelemetryConsentPrompt.tsx @@ -13,12 +13,12 @@ import { defineMessages, useIntl } from '../i18n'; const i18n = defineMessages({ heading: { id: 'telemetryConsentPrompt.heading', - defaultMessage: 'Help improve goose', + defaultMessage: 'Help improve ApeMind Agent', }, description: { id: 'telemetryConsentPrompt.description', defaultMessage: - 'Would you like to share anonymous usage data to help improve goose? We never collect your conversations, code, or personal data.', + 'Would you like to share anonymous usage data to help improve ApeMind Agent? We never collect your conversations, code, or personal data.', }, learnMore: { id: 'telemetryConsentPrompt.learnMore', diff --git a/ui/desktop/src/components/ToolCallConfirmation.tsx b/ui/desktop/src/components/ToolCallConfirmation.tsx index a91f75955b0c..159e86414686 100644 --- a/ui/desktop/src/components/ToolCallConfirmation.tsx +++ b/ui/desktop/src/components/ToolCallConfirmation.tsx @@ -10,7 +10,7 @@ const i18n = defineMessages({ }, gooseWouldLikeToCallWithName: { id: 'toolConfirmation.gooseWouldLikeToCallWithName', - defaultMessage: 'Goose would like to call {toolName}. Allow?', + defaultMessage: 'ApeMind Agent would like to call {toolName}. Allow?', }, }); diff --git a/ui/desktop/src/components/extensions/ExtensionsView.tsx b/ui/desktop/src/components/extensions/ExtensionsView.tsx index b1606a5c4a12..ed493d880692 100644 --- a/ui/desktop/src/components/extensions/ExtensionsView.tsx +++ b/ui/desktop/src/components/extensions/ExtensionsView.tsx @@ -27,7 +27,7 @@ const i18n = defineMessages({ description: { id: 'extensionsView.description', defaultMessage: - "These extensions use the Model Context Protocol (MCP). They can expand Goose's capabilities using three main components: Prompts, Resources, and Tools. {searchShortcut} to search.", + "These extensions use the Model Context Protocol (MCP). They can expand ApeMind Agent's capabilities using three main components: Prompts, Resources, and Tools. {searchShortcut} to search.", }, defaultNote: { id: 'extensionsView.defaultNote', diff --git a/ui/desktop/src/components/onboarding/OnboardingGuard.tsx b/ui/desktop/src/components/onboarding/OnboardingGuard.tsx index 59e543679a36..36878af5d7b6 100644 --- a/ui/desktop/src/components/onboarding/OnboardingGuard.tsx +++ b/ui/desktop/src/components/onboarding/OnboardingGuard.tsx @@ -18,7 +18,7 @@ import { defineMessages, useIntl } from '../../i18n'; const i18n = defineMessages({ welcomeTitle: { id: 'onboardingGuard.welcomeTitle', - defaultMessage: 'Welcome to goose', + defaultMessage: 'Welcome to ApeMind Agent', }, welcomeDescription: { id: 'onboardingGuard.welcomeDescription', @@ -26,7 +26,7 @@ const i18n = defineMessages({ }, checkProviderErrorTitle: { id: 'onboardingGuard.checkProviderErrorTitle', - defaultMessage: 'Unable to connect to Goose server', + defaultMessage: 'Unable to connect to ApeMind Agent server', }, checkProviderErrorDescription: { id: 'onboardingGuard.checkProviderErrorDescription', diff --git a/ui/desktop/src/components/onboarding/OnboardingSuccess.tsx b/ui/desktop/src/components/onboarding/OnboardingSuccess.tsx index 5f0b121c5ebd..4c732db5aa3e 100644 --- a/ui/desktop/src/components/onboarding/OnboardingSuccess.tsx +++ b/ui/desktop/src/components/onboarding/OnboardingSuccess.tsx @@ -16,7 +16,7 @@ const i18n = defineMessages({ }, allSet: { id: 'onboardingSuccess.allSet', - defaultMessage: "You're all set to start using goose.", + defaultMessage: "You're all set to start using ApeMind Agent.", }, privacyTitle: { id: 'onboardingSuccess.privacyTitle', @@ -24,7 +24,7 @@ const i18n = defineMessages({ }, privacyDescription: { id: 'onboardingSuccess.privacyDescription', - defaultMessage: 'Anonymous usage data helps improve goose. We never collect your conversations, code, or personal data.', + defaultMessage: 'Anonymous usage data helps improve ApeMind Agent. We never collect your conversations, code, or personal data.', }, learnMore: { id: 'onboardingSuccess.learnMore', diff --git a/ui/desktop/src/components/onboarding/PrivacyInfoModal.tsx b/ui/desktop/src/components/onboarding/PrivacyInfoModal.tsx index 739fd69e105d..dfe2d1ed0ede 100644 --- a/ui/desktop/src/components/onboarding/PrivacyInfoModal.tsx +++ b/ui/desktop/src/components/onboarding/PrivacyInfoModal.tsx @@ -8,7 +8,7 @@ const i18n = defineMessages({ }, description: { id: 'privacyInfoModal.description', - defaultMessage: 'Anonymous usage data helps us understand how goose is used and identify areas for improvement.', + defaultMessage: 'Anonymous usage data helps us understand how ApeMind Agent is used and identify areas for improvement.', }, whatWeCollect: { id: 'privacyInfoModal.whatWeCollect', @@ -20,7 +20,7 @@ const i18n = defineMessages({ }, collectVersion: { id: 'privacyInfoModal.collectVersion', - defaultMessage: 'goose version and install method', + defaultMessage: 'ApeMind Agent version and install method', }, collectProvider: { id: 'privacyInfoModal.collectProvider', diff --git a/ui/desktop/src/components/recipes/ImportRecipeForm.tsx b/ui/desktop/src/components/recipes/ImportRecipeForm.tsx index 174a0f0cdde3..d67a14fd4956 100644 --- a/ui/desktop/src/components/recipes/ImportRecipeForm.tsx +++ b/ui/desktop/src/components/recipes/ImportRecipeForm.tsx @@ -47,7 +47,7 @@ const i18n = defineMessages({ }, reviewWarning: { id: 'importRecipeForm.reviewWarning', - defaultMessage: 'Ensure you review contents of recipe files before adding them to your goose interface.', + defaultMessage: 'Ensure you review contents of recipe files before adding them to ApeMind Agent.', }, cancel: { id: 'importRecipeForm.cancel', diff --git a/ui/desktop/src/components/sessions/SessionHistoryView.tsx b/ui/desktop/src/components/sessions/SessionHistoryView.tsx index 562af8a18005..37ee0bf936e2 100644 --- a/ui/desktop/src/components/sessions/SessionHistoryView.tsx +++ b/ui/desktop/src/components/sessions/SessionHistoryView.tsx @@ -82,7 +82,7 @@ const i18n = defineMessages({ }, shareSessionDescription: { id: 'sessionHistory.shareModal.description', - defaultMessage: 'Share this session link to give others a read only view of your goose chat.', + defaultMessage: 'Share this session link to give others a read only view of your ApeMind Agent chat.', }, copy: { id: 'sessionHistory.copy', diff --git a/ui/desktop/src/components/settings/PromptsSettingsSection.tsx b/ui/desktop/src/components/settings/PromptsSettingsSection.tsx index 610fb4032de3..03600e8c9c0a 100644 --- a/ui/desktop/src/components/settings/PromptsSettingsSection.tsx +++ b/ui/desktop/src/components/settings/PromptsSettingsSection.tsx @@ -108,7 +108,7 @@ const i18n = defineMessages({ }, promptEditingDescription: { id: 'promptsSettings.promptEditingDescription', - defaultMessage: "Customize the prompts that define goose's behavior in different contexts. These prompts use Jinja2 templating syntax. Be careful when modifying template variables, as incorrect changes can break functionality. Please share any improvements with the community.", + defaultMessage: "Customize the prompts that define ApeMind Agent's behavior in different contexts. These prompts use Jinja2 templating syntax. Be careful when modifying template variables, as incorrect changes can break functionality.", }, resetAll: { id: 'promptsSettings.resetAll', diff --git a/ui/desktop/src/components/settings/app/AppSettingsSection.tsx b/ui/desktop/src/components/settings/app/AppSettingsSection.tsx index bc3f5e8126d8..0b8d8f540779 100644 --- a/ui/desktop/src/components/settings/app/AppSettingsSection.tsx +++ b/ui/desktop/src/components/settings/app/AppSettingsSection.tsx @@ -9,8 +9,8 @@ import UpdateSection from './UpdateSection'; import { COST_TRACKING_ENABLED, UPDATES_ENABLED } from '../../../updates'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../ui/card'; import ThemeSelector from '../../GooseSidebar/ThemeSelector'; -import BlockLogoBlack from './icons/block-lockup_black.png'; -import BlockLogoWhite from './icons/block-lockup_white.png'; +import ApeCloudLogoDark from '../../../images/logo_dark_en_US.png'; +import ApeCloudLogoLight from '../../../images/logo_light_en_US.png'; import TelemetrySettings from './TelemetrySettings'; import { trackSettingToggled } from '../../../utils/analytics'; import { NavigationModeSelector } from './NavigationModeSelector'; @@ -23,7 +23,7 @@ const i18n = defineMessages({ appearanceTitle: { id: 'settings.appearance.title', defaultMessage: 'Appearance' }, appearanceDesc: { id: 'settings.appearance.description', - defaultMessage: 'Configure how goose appears on your system', + defaultMessage: 'Configure how ApeMind Agent appears on your system', }, notifications: { id: 'settings.notifications.title', defaultMessage: 'Notifications' }, notificationsDesc: { @@ -38,20 +38,24 @@ const i18n = defineMessages({ }, taskNotificationsDesc: { id: 'settings.notifications.task.description', - defaultMessage: 'Notify when Goose finishes a task while the window is in the background', + defaultMessage: + 'Notify when ApeMind Agent finishes a task while the window is in the background', }, menuBarIcon: { id: 'settings.menuBarIcon.title', defaultMessage: 'Menu bar icon' }, menuBarIconDesc: { id: 'settings.menuBarIcon.description', - defaultMessage: 'Show goose in the menu bar', + defaultMessage: 'Show ApeMind Agent in the menu bar', }, dockIcon: { id: 'settings.dockIcon.title', defaultMessage: 'Dock icon' }, - dockIconDesc: { id: 'settings.dockIcon.description', defaultMessage: 'Show goose in the dock' }, + dockIconDesc: { + id: 'settings.dockIcon.description', + defaultMessage: 'Show ApeMind Agent in the dock', + }, preventSleep: { id: 'settings.preventSleep.title', defaultMessage: 'Prevent Sleep' }, preventSleepDesc: { id: 'settings.preventSleep.description', defaultMessage: - 'Keep your computer awake while goose is running a task (screen can still lock)', + 'Keep your computer awake while ApeMind Agent is running a task (screen can still lock)', }, costTracking: { id: 'settings.costTracking.title', defaultMessage: 'Cost Tracking' }, costTrackingDesc: { @@ -61,7 +65,7 @@ const i18n = defineMessages({ themeTitle: { id: 'settings.theme.title', defaultMessage: 'Theme' }, themeDesc: { id: 'settings.theme.description', - defaultMessage: 'Customize the look and feel of goose', + defaultMessage: 'Customize the look and feel of ApeMind Agent', }, navigationTitle: { id: 'settings.navigation.title', defaultMessage: 'Navigation' }, navigationDesc: { @@ -75,7 +79,7 @@ const i18n = defineMessages({ helpTitle: { id: 'settings.help.title', defaultMessage: 'Help & feedback' }, helpDesc: { id: 'settings.help.description', - defaultMessage: 'Help us improve goose by reporting issues or requesting new features', + defaultMessage: 'Help us improve ApeMind Agent by reporting issues or requesting new features', }, reportBug: { id: 'settings.help.reportBug', defaultMessage: 'Report a Bug' }, requestFeature: { id: 'settings.help.requestFeature', defaultMessage: 'Request a Feature' }, @@ -83,7 +87,7 @@ const i18n = defineMessages({ updatesTitle: { id: 'settings.updates.title', defaultMessage: 'Updates' }, updatesDesc: { id: 'settings.updates.description', - defaultMessage: 'Check for and install updates to keep goose running at its best', + defaultMessage: 'Check for and install updates to keep ApeMind Agent running at its best', }, notificationsModalTitle: { id: 'settings.notifications.modal.title', @@ -103,7 +107,7 @@ const i18n = defineMessages({ }, notificationsMacStep3: { id: 'settings.notifications.modal.macStep3', - defaultMessage: 'Find and select goose in the application list', + defaultMessage: 'Find and select ApeMind Agent in the application list', }, notificationsMacStep4: { id: 'settings.notifications.modal.macStep4', @@ -123,7 +127,7 @@ const i18n = defineMessages({ }, notificationsWinStep3: { id: 'settings.notifications.modal.winStep3', - defaultMessage: 'Find and select goose in the application list', + defaultMessage: 'Find and select ApeMind Agent in the application list', }, notificationsWinStep4: { id: 'settings.notifications.modal.winStep4', @@ -506,7 +510,7 @@ export default function AppSettingsSection({ scrollToSection }: AppSettingsSecti )} {hasBoth && ( diff --git a/ui/desktop/src/types/message.ts b/ui/desktop/src/types/message.ts index dd41bc0a9ea1..2ad265481e74 100644 --- a/ui/desktop/src/types/message.ts +++ b/ui/desktop/src/types/message.ts @@ -15,7 +15,7 @@ export type ToolConfirmationRequestContent = ToolConfirmationRequest & { export type NotificationEvent = Extract; // Compaction response message - must match backend constant -const COMPACTION_THINKING_TEXT = 'goose is compacting the conversation...'; +const COMPACTION_THINKING_TEXT = 'ApeMind Agent is compacting the conversation...'; export interface ImageData { data: string; // base64 encoded image data diff --git a/ui/desktop/src/utils/githubUpdater.ts b/ui/desktop/src/utils/githubUpdater.ts index a5d2ce3f9282..41220f38ca28 100644 --- a/ui/desktop/src/utils/githubUpdater.ts +++ b/ui/desktop/src/utils/githubUpdater.ts @@ -29,7 +29,7 @@ interface UpdateCheckResult { export class GitHubUpdater { private readonly owner = process.env.GITHUB_OWNER || 'block'; private readonly repo = process.env.GITHUB_REPO || 'goose'; - private readonly bundleName = process.env.GOOSE_BUNDLE_NAME || 'Goose'; + private readonly bundleName = process.env.GOOSE_BUNDLE_NAME || 'ApeMind Agent'; private readonly apiUrl = `https://api.github.com/repos/${this.owner}/${this.repo}/releases/latest`; async checkForUpdates(): Promise { @@ -50,7 +50,7 @@ export class GitHubUpdater { const response = await fetch(this.apiUrl, { headers: { Accept: 'application/vnd.github.v3+json', - 'User-Agent': `Goose-Desktop/${app.getVersion()}`, + 'User-Agent': `ApeMind-Agent-Desktop/${app.getVersion()}`, }, signal: controller.signal, }); From b44084102a0a2102b72cb82d58567e4e1217ce61 Mon Sep 17 00:00:00 2001 From: earayu Date: Sun, 24 May 2026 02:55:06 +0800 Subject: [PATCH 05/48] Fix Linux desktop package executable lookup Keep Electron Packager executableName stable so Linux package makers can find the binary after the ApeMind Agent productName change. --- ui/desktop/forge.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/desktop/forge.config.ts b/ui/desktop/forge.config.ts index ff0497d7011b..5bc24d3a9e75 100644 --- a/ui/desktop/forge.config.ts +++ b/ui/desktop/forge.config.ts @@ -6,6 +6,7 @@ const isLinuxVulkanBuild = process.env.GOOSE_DESKTOP_LINUX_VARIANT === 'vulkan'; let cfg = { asar: true, + executableName: 'Goose', extraResource: ['src/bin', 'src/images'], icon: 'src/images/icon', // Windows specific configuration From 135f47d6d38408be298ebd54ff96cf34b30ce287 Mon Sep 17 00:00:00 2001 From: earayu Date: Sun, 24 May 2026 12:11:12 +0800 Subject: [PATCH 06/48] chore: point fork links at apemind-agent repo (#9) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 梅西 --- Dockerfile | 8 ++++---- download_cli.ps1 | 4 ++-- download_cli.sh | 6 +++--- ui/desktop/forge.config.ts | 4 ++-- .../settings/app/AppSettingsSection.tsx | 4 ++-- ui/desktop/src/components/ui/Diagnostics.tsx | 17 +++++++++++------ ui/desktop/src/utils/githubUpdater.ts | 4 ++-- ui/desktop/vite.main.config.mts | 8 +++++--- 8 files changed, 31 insertions(+), 24 deletions(-) diff --git a/Dockerfile b/Dockerfile index 05429deeea17..6714b64c703a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -70,7 +70,7 @@ ENTRYPOINT ["/usr/local/bin/goose"] CMD ["--help"] # Labels for metadata -LABEL org.opencontainers.image.title="goose" -LABEL org.opencontainers.image.description="goose CLI" -LABEL org.opencontainers.image.vendor="AAIF" -LABEL org.opencontainers.image.source="https://github.com/aaif-goose/goose" +LABEL org.opencontainers.image.title="ApeMind Agent" +LABEL org.opencontainers.image.description="ApeMind Agent CLI" +LABEL org.opencontainers.image.vendor="ApeCloud" +LABEL org.opencontainers.image.source="https://github.com/apecloud/apemind-agent" diff --git a/download_cli.ps1 b/download_cli.ps1 index c3742d6a96f4..c0b7902390fe 100644 --- a/download_cli.ps1 +++ b/download_cli.ps1 @@ -8,7 +8,7 @@ # Supported Architectures: x86_64 # # Usage: -# Invoke-WebRequest -Uri "https://github.com/apecloud/goose/releases/download/stable/download_cli.ps1" -OutFile "download_cli.ps1"; .\download_cli.ps1 +# Invoke-WebRequest -Uri "https://github.com/apecloud/apemind-agent/releases/download/stable/download_cli.ps1" -OutFile "download_cli.ps1"; .\download_cli.ps1 # Or simply: .\download_cli.ps1 # # Environment variables: @@ -25,7 +25,7 @@ $ErrorActionPreference = "Stop" # --- 1) Variables --- -$REPO = "apecloud/goose" +$REPO = "apecloud/apemind-agent" $OUT_FILE = "goose.exe" # Set default bin directory if not specified diff --git a/download_cli.sh b/download_cli.sh index f9e64350c5a5..f6b5319bcad5 100755 --- a/download_cli.sh +++ b/download_cli.sh @@ -11,7 +11,7 @@ set -eu # Supported Architectures: x86_64, arm64 # # Usage: -# curl -fsSL https://github.com/apecloud/goose/releases/download/stable/download_cli.sh | bash +# curl -fsSL https://github.com/apecloud/apemind-agent/releases/download/stable/download_cli.sh | bash # # Environment variables: # GOOSE_BIN_DIR - Directory to which goose will be installed (default: $HOME/.local/bin) @@ -54,7 +54,7 @@ fi # --- 2) Variables --- -REPO="apecloud/goose" +REPO="apecloud/apemind-agent" OUT_FILE="goose" # Set default bin directory based on detected OS environment @@ -220,7 +220,7 @@ echo "Downloading $RELEASE_TAG release: $FILE..." if ! curl -sLf "$DOWNLOAD_URL" --output "$FILE"; then # If the download fails, only fall back to latest stable when no version was specified and canary was not requested). if ! [ -n "${GOOSE_VERSION:-}" ] && [ "${CANARY:-false}" != "true" ]; then - LATEST_TAG=$(curl -s https://api.github.com/repos/apecloud/goose/releases/latest | \ + LATEST_TAG=$(curl -s "https://api.github.com/repos/$REPO/releases/latest" | \ grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') if [ -z "$LATEST_TAG" ]; then echo "Error: Failed to download $DOWNLOAD_URL and latest tag unavailable" diff --git a/ui/desktop/forge.config.ts b/ui/desktop/forge.config.ts index 5bc24d3a9e75..4c3a77401896 100644 --- a/ui/desktop/forge.config.ts +++ b/ui/desktop/forge.config.ts @@ -66,8 +66,8 @@ module.exports = { name: '@electron-forge/publisher-github', config: { repository: { - owner: process.env.GITHUB_OWNER || 'aaif-goose', - name: process.env.GITHUB_REPO || 'goose', + owner: process.env.GITHUB_OWNER || 'apecloud', + name: process.env.GITHUB_REPO || 'apemind-agent', }, prerelease: false, draft: true, diff --git a/ui/desktop/src/components/settings/app/AppSettingsSection.tsx b/ui/desktop/src/components/settings/app/AppSettingsSection.tsx index 0b8d8f540779..55ed35168946 100644 --- a/ui/desktop/src/components/settings/app/AppSettingsSection.tsx +++ b/ui/desktop/src/components/settings/app/AppSettingsSection.tsx @@ -510,7 +510,7 @@ export default function AppSettingsSection({ scrollToSection }: AppSettingsSecti - diff --git a/ui/desktop/src/components/settings/extensions/ExtensionsSection.tsx b/ui/desktop/src/components/settings/extensions/ExtensionsSection.tsx index 6c5606f06445..38f576a85d36 100644 --- a/ui/desktop/src/components/settings/extensions/ExtensionsSection.tsx +++ b/ui/desktop/src/components/settings/extensions/ExtensionsSection.tsx @@ -1,7 +1,6 @@ import { useEffect, useState, useCallback, useMemo } from 'react'; import { Button } from '../../ui/button'; import { Plus } from 'lucide-react'; -import { GPSIcon } from '../../ui/icons'; import { useConfig, FixedExtensionEntry } from '../../ConfigContext'; import { defineMessages, useIntl } from '../../../i18n'; import ExtensionList from './subcomponents/ExtensionList'; @@ -21,10 +20,6 @@ const i18n = defineMessages({ id: 'extensionsSection.addCustomExtension', defaultMessage: 'Add custom extension', }, - browseExtensions: { - id: 'extensionsSection.browseExtensions', - defaultMessage: 'Browse extensions', - }, updateExtension: { id: 'extensionsSection.updateExtension', defaultMessage: 'Update Extension', @@ -225,14 +220,6 @@ export default function ExtensionsSection({ {intl.formatMessage(i18n.addCustomExtension)} - )} From 1868577ef5389a18b7810b4a904f1cb14dd5e59a Mon Sep 17 00:00:00 2001 From: earayu Date: Sun, 24 May 2026 22:23:09 +0800 Subject: [PATCH 10/48] =?UTF-8?q?=E9=9A=90=E8=97=8F=20Apps=E3=80=81?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=8E=A8=E7=90=86=E5=92=8C=20Mesh=EF=BC=8C?= =?UTF-8?q?=E9=85=8D=E6=96=B9=E6=94=B9=E5=B7=A5=E4=BD=9C=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 隐藏 Apps 入口和 /apps 直达页\n- 将用户可见的 Recipe/配方 文案改为 Workflow/工作流,底层 recipe 协议保持不变\n- 隐藏 Settings 里的本地推理和 Mesh Tab,底层能力代码保留\n- 补充 SettingsView 测试和 workflow 文案测试更新\n\n验证:\n- pnpm -C ui/desktop run lint:check\n- pnpm -C ui/desktop run test:run --- ui/desktop/src/App.test.tsx | 1 + ui/desktop/src/App.tsx | 4 +- ui/desktop/src/components/BaseChat.tsx | 25 +- ui/desktop/src/components/ChatInput.tsx | 8 +- .../components/Layout/NavigationContext.tsx | 15 +- .../src/components/ParameterInputModal.tsx | 12 +- ui/desktop/src/components/RecipeHeader.tsx | 2 +- .../recipes/CreateEditRecipeModal.tsx | 38 +-- .../recipes/CreateRecipeFromSessionModal.tsx | 35 +-- .../components/recipes/ImportRecipeForm.tsx | 46 ++-- .../recipes/RecipeActivityEditor.tsx | 12 +- .../src/components/recipes/RecipesView.tsx | 86 ++++--- .../recipes/shared/CreateSubRecipeInline.tsx | 63 +++-- .../shared/RecipeExtensionSelector.tsx | 11 +- .../recipes/shared/RecipeFormFields.tsx | 22 +- .../recipes/shared/RecipeNameField.tsx | 6 +- .../recipes/shared/SubRecipeEditor.tsx | 25 +- .../recipes/shared/SubRecipeModal.tsx | 35 ++- .../__tests__/RecipeFormFields.test.tsx | 8 +- .../recipes/shared/recipeNameUtils.ts | 2 +- .../schedule/ScheduleDetailView.tsx | 2 +- .../src/components/schedule/ScheduleModal.tsx | 6 +- .../src/components/schedule/SchedulesView.tsx | 4 +- .../components/settings/SettingsView.test.tsx | 80 ++++++ .../src/components/settings/SettingsView.tsx | 68 +---- .../app/NavigationCustomizationSettings.tsx | 94 +++---- .../src/components/ui/RecipeWarningModal.tsx | 10 +- ui/desktop/src/hooks/useNavigationItems.ts | 20 +- ui/desktop/src/i18n/messages/en.json | 236 +++++++++--------- ui/desktop/src/i18n/messages/zh-CN.json | 226 ++++++++--------- ui/desktop/src/recipe/index.ts | 7 +- ui/desktop/src/recipe/validation.ts | 8 +- 32 files changed, 631 insertions(+), 586 deletions(-) create mode 100644 ui/desktop/src/components/settings/SettingsView.test.tsx diff --git a/ui/desktop/src/App.test.tsx b/ui/desktop/src/App.test.tsx index 8524d781d689..1e150509cdc3 100644 --- a/ui/desktop/src/App.test.tsx +++ b/ui/desktop/src/App.test.tsx @@ -139,6 +139,7 @@ vi.mock('react-router-dom', () => ({ HashRouter: ({ children }: { children: React.ReactNode }) => <>{children}, Routes: ({ children }: { children: React.ReactNode }) => <>{children}, Route: ({ element }: { element: React.ReactNode }) => element, + Navigate: () => null, useNavigate: () => mockNavigate, useLocation: () => ({ state: null, pathname: '/' }), useSearchParams: () => [mockSearchParams, mockSetSearchParams], diff --git a/ui/desktop/src/App.tsx b/ui/desktop/src/App.tsx index dca6bba5503d..098ac5aaf2bb 100644 --- a/ui/desktop/src/App.tsx +++ b/ui/desktop/src/App.tsx @@ -2,6 +2,7 @@ import { useEffect, useState, useRef } from 'react'; import { IpcRendererEvent } from 'electron'; import { HashRouter, + Navigate, Routes, Route, useNavigate, @@ -45,7 +46,6 @@ import PermissionSettingsView from './components/settings/permission/PermissionS import ExtensionsView, { ExtensionsViewOptions } from './components/extensions/ExtensionsView'; import RecipesView from './components/recipes/RecipesView'; import SkillsView from './components/skills/SkillsView'; -import AppsView from './components/apps/AppsView'; import StandaloneAppView from './components/apps/StandaloneAppView'; import { View, ViewOptions } from './utils/navigationUtils'; @@ -691,7 +691,7 @@ export function AppInner() { } /> - } /> + } /> } /> } /> } /> diff --git a/ui/desktop/src/components/BaseChat.tsx b/ui/desktop/src/components/BaseChat.tsx index f80ec0e0b746..ba37462ccdcf 100644 --- a/ui/desktop/src/components/BaseChat.tsx +++ b/ui/desktop/src/components/BaseChat.tsx @@ -1,11 +1,5 @@ import { AppEvents } from '../constants/events'; -import React, { - useCallback, - useEffect, - useMemo, - useRef, - useState, -} from 'react'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { defineMessages, useIntl } from '../i18n'; import { useLocation, useNavigate } from 'react-router-dom'; import { SearchView } from './conversation/SearchView'; @@ -54,7 +48,7 @@ const i18n = defineMessages({ }, recipeCreatedTitle: { id: 'baseChat.recipeCreatedTitle', - defaultMessage: 'Recipe created successfully!', + defaultMessage: 'Workflow created successfully!', }, recipeCreatedMessage: { id: 'baseChat.recipeCreatedMessage', @@ -199,7 +193,11 @@ export default function BaseChat({ const latestInference = useMemo(() => { for (let i = messages.length - 1; i >= 0; i--) { const message = messages[i]; - if (message.role === 'assistant' && message.metadata.userVisible && message.metadata.inference) { + if ( + message.role === 'assistant' && + message.metadata.userVisible && + message.metadata.inference + ) { return message.metadata.inference; } } @@ -373,7 +371,9 @@ export default function BaseChat({
-

{intl.formatMessage(i18n.failedToLoadSession)}

+

+ {intl.formatMessage(i18n.failedToLoadSession)} +

{sessionLoadError}

- {isCreateMode ? intl.formatMessage(i18n.createRecipeTitle) : intl.formatMessage(i18n.viewEditRecipeTitle)} + {isCreateMode + ? intl.formatMessage(i18n.createRecipeTitle) + : intl.formatMessage(i18n.viewEditRecipeTitle)}

{isCreateMode @@ -589,7 +597,9 @@ export default function CreateEditRecipeModal({ className="inline-flex items-center justify-center gap-2 px-4 py-2" > - {isSaving ? intl.formatMessage(i18n.saving) : intl.formatMessage(i18n.saveAndRunRecipe)} + {isSaving + ? intl.formatMessage(i18n.saving) + : intl.formatMessage(i18n.saveAndRunRecipe)}

diff --git a/ui/desktop/src/components/recipes/CreateRecipeFromSessionModal.tsx b/ui/desktop/src/components/recipes/CreateRecipeFromSessionModal.tsx index 9d1b46228f0f..054b6db2665a 100644 --- a/ui/desktop/src/components/recipes/CreateRecipeFromSessionModal.tsx +++ b/ui/desktop/src/components/recipes/CreateRecipeFromSessionModal.tsx @@ -16,11 +16,11 @@ import { defineMessages, useIntl } from '../../i18n'; const i18n = defineMessages({ title: { id: 'createRecipeFromSession.title', - defaultMessage: 'Create Recipe from Session', + defaultMessage: 'Create Workflow from Session', }, subtitle: { id: 'createRecipeFromSession.subtitle', - defaultMessage: 'Create a reusable recipe based on your current conversation.', + defaultMessage: 'Create a reusable workflow based on your current conversation.', }, analyzingTitle: { id: 'createRecipeFromSession.analyzingTitle', @@ -40,7 +40,7 @@ const i18n = defineMessages({ }, stageGenerating: { id: 'createRecipeFromSession.stageGenerating', - defaultMessage: 'Generating recipe structure...', + defaultMessage: 'Generating workflow structure...', }, stageFinalizing: { id: 'createRecipeFromSession.stageFinalizing', @@ -64,19 +64,19 @@ const i18n = defineMessages({ }, createRecipe: { id: 'createRecipeFromSession.createRecipe', - defaultMessage: 'Create Recipe', + defaultMessage: 'Create Workflow', }, createAndRunRecipe: { id: 'createRecipeFromSession.createAndRunRecipe', - defaultMessage: 'Create & Run Recipe', + defaultMessage: 'Create & Run Workflow', }, failedToCreateTitle: { id: 'createRecipeFromSession.failedToCreateTitle', - defaultMessage: 'Failed to create recipe', + defaultMessage: 'Failed to create workflow', }, failedToCreateDefaultMsg: { id: 'createRecipeFromSession.failedToCreateDefaultMsg', - defaultMessage: 'An unexpected error occurred while creating the recipe. Please try again.', + defaultMessage: 'An unexpected error occurred while creating the workflow. Please try again.', }, }); @@ -279,10 +279,7 @@ export default function CreateRecipeFromSessionModal({ console.error('Failed to create recipe:', error); toastError({ title: intl.formatMessage(i18n.failedToCreateTitle), - msg: errorMessage( - error, - intl.formatMessage(i18n.failedToCreateDefaultMsg) - ), + msg: errorMessage(error, intl.formatMessage(i18n.failedToCreateDefaultMsg)), }); } finally { setIsCreating(false); @@ -307,10 +304,10 @@ export default function CreateRecipeFromSessionModal({
-

{intl.formatMessage(i18n.title)}

-

- {intl.formatMessage(i18n.subtitle)} -

+

+ {intl.formatMessage(i18n.title)} +

+

{intl.formatMessage(i18n.subtitle)}

)} diff --git a/ui/desktop/src/components/recipes/ImportRecipeForm.tsx b/ui/desktop/src/components/recipes/ImportRecipeForm.tsx index d67a14fd4956..8461f4ed69fe 100644 --- a/ui/desktop/src/components/recipes/ImportRecipeForm.tsx +++ b/ui/desktop/src/components/recipes/ImportRecipeForm.tsx @@ -15,11 +15,11 @@ import { defineMessages, useIntl } from '../../i18n'; const i18n = defineMessages({ importRecipeTitle: { id: 'importRecipeForm.importRecipeTitle', - defaultMessage: 'Import Recipe', + defaultMessage: 'Import Workflow', }, recipeDeeplinkLabel: { id: 'importRecipeForm.recipeDeeplinkLabel', - defaultMessage: 'Recipe Deeplink', + defaultMessage: 'Workflow Deeplink', }, deeplinkPlaceholder: { id: 'importRecipeForm.deeplinkPlaceholder', @@ -27,7 +27,7 @@ const i18n = defineMessages({ }, deeplinkHint: { id: 'importRecipeForm.deeplinkHint', - defaultMessage: 'Paste a recipe deeplink starting with "goose://recipe?config="', + defaultMessage: 'Paste a workflow deeplink starting with "goose://recipe?config="', }, or: { id: 'importRecipeForm.or', @@ -35,11 +35,11 @@ const i18n = defineMessages({ }, recipeFileLabel: { id: 'importRecipeForm.recipeFileLabel', - defaultMessage: 'Recipe File', + defaultMessage: 'Workflow File', }, recipeFileHint: { id: 'importRecipeForm.recipeFileHint', - defaultMessage: 'Upload a YAML or JSON file containing the recipe structure', + defaultMessage: 'Upload a YAML or JSON file containing the workflow structure', }, example: { id: 'importRecipeForm.example', @@ -47,7 +47,8 @@ const i18n = defineMessages({ }, reviewWarning: { id: 'importRecipeForm.reviewWarning', - defaultMessage: 'Ensure you review contents of recipe files before adding them to ApeMind Agent.', + defaultMessage: + 'Ensure you review contents of workflow files before adding them to ApeMind Agent.', }, cancel: { id: 'importRecipeForm.cancel', @@ -59,15 +60,16 @@ const i18n = defineMessages({ }, importRecipeButton: { id: 'importRecipeForm.importRecipeButton', - defaultMessage: 'Import Recipe', + defaultMessage: 'Import Workflow', }, expectedRecipeStructure: { id: 'importRecipeForm.expectedRecipeStructure', - defaultMessage: 'Expected Recipe Structure', + defaultMessage: 'Expected Workflow Structure', }, schemaDescription: { id: 'importRecipeForm.schemaDescription', - defaultMessage: 'Your YAML or JSON file should follow this structure. Required fields are: title, description, and either instructions or prompt.', + defaultMessage: + 'Your YAML or JSON file should follow this structure. Required fields are: title, description, and either instructions or prompt.', }, }); @@ -95,7 +97,7 @@ const importRecipeSchema = z }, 'File is too large, max size is 1MB'), }) .refine((data) => (data.deeplink && data.deeplink.trim()) || data.recipeUploadFile, { - message: 'Either of deeplink or recipe file are required', + message: 'Either a deeplink or workflow file is required', path: ['deeplink'], }); @@ -119,11 +121,11 @@ export default function ImportRecipeForm({ isOpen, onClose, onSuccess }: ImportR try { let recipe: Recipe; - // Parse recipe from either deeplink or recipe file + // Parse workflow from either deeplink or file. if (value.deeplink && value.deeplink.trim()) { const parsedRecipe = await parseDeeplink(value.deeplink.trim()); if (!parsedRecipe) { - throw new Error('Invalid deeplink or recipe format'); + throw new Error('Invalid deeplink or workflow format'); } recipe = parsedRecipe; } else { @@ -144,14 +146,14 @@ export default function ImportRecipeForm({ isOpen, onClose, onSuccess }: ImportR toastSuccess({ title: recipe.title.trim(), - msg: 'Recipe imported successfully', + msg: 'Workflow imported successfully', }); } catch (error) { - console.error('Failed to import recipe:', error); + console.error('Failed to import workflow:', error); toastError({ title: 'Import Failed', - msg: `Failed to import recipe: ${errorMessage(error, 'Unknown error')}`, + msg: `Failed to import workflow: ${errorMessage(error, 'Unknown error')}`, traceback: errorMessage(error), }); } finally { @@ -195,7 +197,7 @@ export default function ImportRecipeForm({ isOpen, onClose, onSuccess }: ImportR await parseRecipeFromFile(fileContent); } catch (error) { toastError({ - title: 'Invalid Recipe File', + title: 'Invalid Workflow File', msg: errorMessage(error, 'Unknown error'), }); } @@ -208,7 +210,9 @@ export default function ImportRecipeForm({ isOpen, onClose, onSuccess }: ImportR <>
-

{intl.formatMessage(i18n.importRecipeTitle)}

+

+ {intl.formatMessage(i18n.importRecipeTitle)} +

{ @@ -354,7 +358,9 @@ export default function ImportRecipeForm({ isOpen, onClose, onSuccess }: ImportR disabled={!canSubmit || importing || isSubmitting} variant="default" > - {importing || isSubmitting ? intl.formatMessage(i18n.importing) : intl.formatMessage(i18n.importRecipeButton)} + {importing || isSubmitting + ? intl.formatMessage(i18n.importing) + : intl.formatMessage(i18n.importRecipeButton)} )} @@ -368,7 +374,9 @@ export default function ImportRecipeForm({ isOpen, onClose, onSuccess }: ImportR
-

{intl.formatMessage(i18n.expectedRecipeStructure)}

+

+ {intl.formatMessage(i18n.expectedRecipeStructure)} +

@@ -815,7 +822,11 @@ export default function RecipesView() { variant={schedule_cron ? 'default' : 'outline'} size="sm" className="h-8 w-8 p-0" - title={schedule_cron ? intl.formatMessage(i18n.editSchedule) : intl.formatMessage(i18n.addSchedule)} + title={ + schedule_cron + ? intl.formatMessage(i18n.editSchedule) + : intl.formatMessage(i18n.addSchedule) + } > @@ -888,7 +899,9 @@ export default function RecipesView() { return (

{intl.formatMessage(i18n.noSavedRecipes)}

-

{intl.formatMessage(i18n.noSavedRecipesDescription)}

+

+ {intl.formatMessage(i18n.noSavedRecipesDescription)} +

); } @@ -944,7 +957,10 @@ export default function RecipesView() {
- setSearchTerm(term)} placeholder={intl.formatMessage(i18n.searchRecipesPlaceholder)}> + setSearchTerm(term)} + placeholder={intl.formatMessage(i18n.searchRecipesPlaceholder)} + >
- {intl.formatMessage(i18n.scheduleDialogTitle, { action: scheduleRecipeManifest.schedule_cron ? 'Edit' : 'Add' })} + {intl.formatMessage(i18n.scheduleDialogTitle, { + action: scheduleRecipeManifest.schedule_cron ? 'Edit' : 'Add', + })}
diff --git a/ui/desktop/src/components/recipes/shared/CreateSubRecipeInline.tsx b/ui/desktop/src/components/recipes/shared/CreateSubRecipeInline.tsx index e02b70ab6c29..4f94c6d59d2b 100644 --- a/ui/desktop/src/components/recipes/shared/CreateSubRecipeInline.tsx +++ b/ui/desktop/src/components/recipes/shared/CreateSubRecipeInline.tsx @@ -13,15 +13,15 @@ import { defineMessages, useIntl } from '../../../i18n'; const i18n = defineMessages({ title: { id: 'createSubRecipeInline.title', - defaultMessage: 'Create New Subrecipe', + defaultMessage: 'Create New Sub-workflow', }, subtitle: { id: 'createSubRecipeInline.subtitle', - defaultMessage: 'Create a simple recipe to use as a callable tool in your main recipe', + defaultMessage: 'Create a simple workflow to use as a callable tool in your main workflow', }, closeModal: { id: 'createSubRecipeInline.closeModal', - defaultMessage: 'Close create subrecipe modal', + defaultMessage: 'Close create sub-workflow modal', }, nameLabel: { id: 'createSubRecipeInline.nameLabel', @@ -37,7 +37,7 @@ const i18n = defineMessages({ }, recipeTitleLabel: { id: 'createSubRecipeInline.recipeTitleLabel', - defaultMessage: 'Recipe Title', + defaultMessage: 'Workflow Title', }, recipeTitlePlaceholder: { id: 'createSubRecipeInline.recipeTitlePlaceholder', @@ -45,11 +45,11 @@ const i18n = defineMessages({ }, recipeDescriptionLabel: { id: 'createSubRecipeInline.recipeDescriptionLabel', - defaultMessage: 'Recipe Description', + defaultMessage: 'Workflow Description', }, recipeDescriptionPlaceholder: { id: 'createSubRecipeInline.recipeDescriptionPlaceholder', - defaultMessage: 'What this recipe does when executed', + defaultMessage: 'What this workflow does when executed', }, instructionsLabel: { id: 'createSubRecipeInline.instructionsLabel', @@ -57,7 +57,7 @@ const i18n = defineMessages({ }, instructionsPlaceholder: { id: 'createSubRecipeInline.instructionsPlaceholder', - defaultMessage: 'Instructions for the AI when this subrecipe is called...', + defaultMessage: 'Instructions for the AI when this sub-workflow is called...', }, toolDescriptionLabel: { id: 'createSubRecipeInline.toolDescriptionLabel', @@ -81,7 +81,7 @@ const i18n = defineMessages({ }, preconfiguredValuesHint: { id: 'createSubRecipeInline.preconfiguredValuesHint', - defaultMessage: 'Optional parameter values that are always passed to the subrecipe', + defaultMessage: 'Optional parameter values that are always passed to the sub-workflow', }, cancel: { id: 'createSubRecipeInline.cancel', @@ -93,7 +93,7 @@ const i18n = defineMessages({ }, createAndAdd: { id: 'createSubRecipeInline.createAndAdd', - defaultMessage: 'Create & Add Subrecipe', + defaultMessage: 'Create & Add Sub-workflow', }, validationFailed: { id: 'createSubRecipeInline.validationFailed', @@ -101,7 +101,7 @@ const i18n = defineMessages({ }, validationMsg: { id: 'createSubRecipeInline.validationMsg', - defaultMessage: 'Name, title, recipe description, and instructions are required.', + defaultMessage: 'Name, title, workflow description, and instructions are required.', }, duplicateName: { id: 'createSubRecipeInline.duplicateName', @@ -109,11 +109,11 @@ const i18n = defineMessages({ }, duplicateNameMsg: { id: 'createSubRecipeInline.duplicateNameMsg', - defaultMessage: 'A subrecipe named "{name}" already exists. Please use a unique name.', + defaultMessage: 'A sub-workflow named "{name}" already exists. Please use a unique name.', }, createdSuccess: { id: 'createSubRecipeInline.createdSuccess', - defaultMessage: 'Subrecipe created successfully', + defaultMessage: 'Sub-workflow created successfully', }, saveFailed: { id: 'createSubRecipeInline.saveFailed', @@ -121,7 +121,7 @@ const i18n = defineMessages({ }, saveFailedMsg: { id: 'createSubRecipeInline.saveFailedMsg', - defaultMessage: 'Failed to save subrecipe: {error}', + defaultMessage: 'Failed to save sub-workflow: {error}', }, }); @@ -221,12 +221,24 @@ export default function CreateSubRecipeInline({ toastError({ title: intl.formatMessage(i18n.saveFailed), - msg: intl.formatMessage(i18n.saveFailedMsg, { error: error instanceof Error ? error.message : 'Unknown error' }), + msg: intl.formatMessage(i18n.saveFailedMsg, { + error: error instanceof Error ? error.message : 'Unknown error', + }), }); } finally { setIsSaving(false); } - }, [form, name, toolDescription, sequentialWhenRepeated, values, existingSubRecipes, onSubRecipeSaved, onClose, intl]); + }, [ + form, + name, + toolDescription, + sequentialWhenRepeated, + values, + existingSubRecipes, + onSubRecipeSaved, + onClose, + intl, + ]); if (!isOpen) return null; @@ -236,10 +248,10 @@ export default function CreateSubRecipeInline({ {/* Header */}
-

{intl.formatMessage(i18n.title)}

-

- {intl.formatMessage(i18n.subtitle)} -

+

+ {intl.formatMessage(i18n.title)} +

+

{intl.formatMessage(i18n.subtitle)}

{/* Title Field */} @@ -283,7 +293,8 @@ export default function CreateSubRecipeInline({ htmlFor="subrecipe-title" className="block text-sm font-medium text-text-standard mb-2" > - {intl.formatMessage(i18n.recipeTitleLabel)} * + {intl.formatMessage(i18n.recipeTitleLabel)}{' '} + * - {intl.formatMessage(i18n.recipeDescriptionLabel)} * + {intl.formatMessage(i18n.recipeDescriptionLabel)}{' '} + * - {intl.formatMessage(i18n.instructionsLabel)} * + {intl.formatMessage(i18n.instructionsLabel)}{' '} + *