Browse Source

Merge branch 'dev' into brendan/desktop-electron-refactor

Brendan Allan 3 months ago
parent
commit
bf353e8c77
100 changed files with 204 additions and 550 deletions
  1. 10 10
      .github/workflows/publish.yml
  2. 17 108
      bun.lock
  3. 1 1
      package.json
  4. 1 1
      packages/app/package.json
  5. 147 132
      packages/app/src/components/titlebar.tsx
  6. 1 1
      packages/console/app/package.json
  7. 4 11
      packages/console/app/src/routes/download/[channel]/[platform].ts
  8. 1 1
      packages/console/core/package.json
  9. 1 1
      packages/console/function/package.json
  10. 1 1
      packages/console/mail/package.json
  11. 1 1
      packages/core/package.json
  12. 2 0
      packages/core/src/global.ts
  13. 0 28
      packages/desktop-electron/.gitignore
  14. 0 4
      packages/desktop-electron/AGENTS.md
  15. 0 32
      packages/desktop-electron/README.md
  16. 0 69
      packages/desktop-electron/package.json
  17. 0 12
      packages/desktop-electron/scripts/copy-bundles.ts
  18. 0 5
      packages/desktop-electron/scripts/predev.ts
  19. 0 9
      packages/desktop-electron/scripts/prepare.ts
  20. 0 77
      packages/desktop-electron/scripts/utils.ts
  21. 0 10
      packages/desktop-electron/sst-env.d.ts
  22. 0 23
      packages/desktop-electron/tsconfig.json
  23. 4 0
      packages/desktop/.gitignore
  24. 2 2
      packages/desktop/AGENTS.md
  25. 11 11
      packages/desktop/README.md
  26. 0 0
      packages/desktop/electron-builder.config.ts
  27. 0 0
      packages/desktop/electron.vite.config.ts
  28. 0 0
      packages/desktop/icons/README.md
  29. 0 0
      packages/desktop/icons/beta/128x128.png
  30. 0 0
      packages/desktop/icons/beta/128x128@2x.png
  31. 0 0
      packages/desktop/icons/beta/32x32.png
  32. 0 0
      packages/desktop/icons/beta/64x64.png
  33. 0 0
      packages/desktop/icons/beta/Square107x107Logo.png
  34. 0 0
      packages/desktop/icons/beta/Square142x142Logo.png
  35. 0 0
      packages/desktop/icons/beta/Square150x150Logo.png
  36. 0 0
      packages/desktop/icons/beta/Square284x284Logo.png
  37. 0 0
      packages/desktop/icons/beta/Square30x30Logo.png
  38. 0 0
      packages/desktop/icons/beta/Square310x310Logo.png
  39. 0 0
      packages/desktop/icons/beta/Square44x44Logo.png
  40. 0 0
      packages/desktop/icons/beta/Square71x71Logo.png
  41. 0 0
      packages/desktop/icons/beta/Square89x89Logo.png
  42. 0 0
      packages/desktop/icons/beta/StoreLogo.png
  43. 0 0
      packages/desktop/icons/beta/android/mipmap-anydpi-v26/ic_launcher.xml
  44. 0 0
      packages/desktop/icons/beta/android/mipmap-hdpi/ic_launcher.png
  45. 0 0
      packages/desktop/icons/beta/android/mipmap-hdpi/ic_launcher_foreground.png
  46. 0 0
      packages/desktop/icons/beta/android/mipmap-hdpi/ic_launcher_round.png
  47. 0 0
      packages/desktop/icons/beta/android/mipmap-mdpi/ic_launcher.png
  48. 0 0
      packages/desktop/icons/beta/android/mipmap-mdpi/ic_launcher_foreground.png
  49. 0 0
      packages/desktop/icons/beta/android/mipmap-mdpi/ic_launcher_round.png
  50. 0 0
      packages/desktop/icons/beta/android/mipmap-xhdpi/ic_launcher.png
  51. 0 0
      packages/desktop/icons/beta/android/mipmap-xhdpi/ic_launcher_foreground.png
  52. 0 0
      packages/desktop/icons/beta/android/mipmap-xhdpi/ic_launcher_round.png
  53. 0 0
      packages/desktop/icons/beta/android/mipmap-xxhdpi/ic_launcher.png
  54. 0 0
      packages/desktop/icons/beta/android/mipmap-xxhdpi/ic_launcher_foreground.png
  55. 0 0
      packages/desktop/icons/beta/android/mipmap-xxhdpi/ic_launcher_round.png
  56. 0 0
      packages/desktop/icons/beta/android/mipmap-xxxhdpi/ic_launcher.png
  57. 0 0
      packages/desktop/icons/beta/android/mipmap-xxxhdpi/ic_launcher_foreground.png
  58. 0 0
      packages/desktop/icons/beta/android/mipmap-xxxhdpi/ic_launcher_round.png
  59. 0 0
      packages/desktop/icons/beta/android/values/ic_launcher_background.xml
  60. 0 0
      packages/desktop/icons/beta/dock.png
  61. 0 0
      packages/desktop/icons/beta/icon.icns
  62. 0 0
      packages/desktop/icons/beta/icon.ico
  63. 0 0
      packages/desktop/icons/beta/icon.png
  64. 0 0
      packages/desktop/icons/beta/ios/AppIcon-20x20@1x.png
  65. 0 0
      packages/desktop/icons/beta/ios/AppIcon-20x20@2x-1.png
  66. 0 0
      packages/desktop/icons/beta/ios/AppIcon-20x20@2x.png
  67. 0 0
      packages/desktop/icons/beta/ios/AppIcon-20x20@3x.png
  68. 0 0
      packages/desktop/icons/beta/ios/AppIcon-29x29@1x.png
  69. 0 0
      packages/desktop/icons/beta/ios/AppIcon-29x29@2x-1.png
  70. 0 0
      packages/desktop/icons/beta/ios/AppIcon-29x29@2x.png
  71. 0 0
      packages/desktop/icons/beta/ios/AppIcon-29x29@3x.png
  72. 0 0
      packages/desktop/icons/beta/ios/AppIcon-40x40@1x.png
  73. 0 0
      packages/desktop/icons/beta/ios/AppIcon-40x40@2x-1.png
  74. 0 0
      packages/desktop/icons/beta/ios/AppIcon-40x40@2x.png
  75. 0 0
      packages/desktop/icons/beta/ios/AppIcon-40x40@3x.png
  76. 0 0
      packages/desktop/icons/beta/ios/AppIcon-512@2x.png
  77. 0 0
      packages/desktop/icons/beta/ios/AppIcon-60x60@2x.png
  78. 0 0
      packages/desktop/icons/beta/ios/AppIcon-60x60@3x.png
  79. 0 0
      packages/desktop/icons/beta/ios/AppIcon-76x76@1x.png
  80. 0 0
      packages/desktop/icons/beta/ios/AppIcon-76x76@2x.png
  81. 0 0
      packages/desktop/icons/beta/ios/AppIcon-83.5x83.5@2x.png
  82. 0 0
      packages/desktop/icons/dev/128x128.png
  83. 0 0
      packages/desktop/icons/dev/128x128@2x.png
  84. 0 0
      packages/desktop/icons/dev/32x32.png
  85. 0 0
      packages/desktop/icons/dev/64x64.png
  86. 0 0
      packages/desktop/icons/dev/Square107x107Logo.png
  87. 0 0
      packages/desktop/icons/dev/Square142x142Logo.png
  88. 0 0
      packages/desktop/icons/dev/Square150x150Logo.png
  89. 0 0
      packages/desktop/icons/dev/Square284x284Logo.png
  90. 0 0
      packages/desktop/icons/dev/Square30x30Logo.png
  91. 0 0
      packages/desktop/icons/dev/Square310x310Logo.png
  92. 0 0
      packages/desktop/icons/dev/Square44x44Logo.png
  93. 0 0
      packages/desktop/icons/dev/Square71x71Logo.png
  94. 0 0
      packages/desktop/icons/dev/Square89x89Logo.png
  95. 0 0
      packages/desktop/icons/dev/StoreLogo.png
  96. 0 0
      packages/desktop/icons/dev/android/mipmap-anydpi-v26/ic_launcher.xml
  97. 0 0
      packages/desktop/icons/dev/android/mipmap-hdpi/ic_launcher.png
  98. 0 0
      packages/desktop/icons/dev/android/mipmap-hdpi/ic_launcher_foreground.png
  99. 0 0
      packages/desktop/icons/dev/android/mipmap-hdpi/ic_launcher_round.png
  100. 0 0
      packages/desktop/icons/dev/android/mipmap-mdpi/ic_launcher.png

+ 10 - 10
.github/workflows/publish.yml

@@ -304,7 +304,7 @@ jobs:
 
       - name: Prepare
         run: bun ./scripts/prepare.ts
-        working-directory: packages/desktop-electron
+        working-directory: packages/desktop
         env:
           OPENCODE_VERSION: ${{ needs.version.outputs.version }}
           OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
@@ -315,7 +315,7 @@ jobs:
 
       - name: Build
         run: bun run build
-        working-directory: packages/desktop-electron
+        working-directory: packages/desktop
         env:
           OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
           SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
@@ -329,7 +329,7 @@ jobs:
       - name: Package and publish
         if: needs.version.outputs.release
         run: npx electron-builder ${{ matrix.settings.platform_flag }} --publish always --config electron-builder.config.ts
-        working-directory: packages/desktop-electron
+        working-directory: packages/desktop
         timeout-minutes: 60
         env:
           OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
@@ -343,14 +343,14 @@ jobs:
       - name: Package (no publish)
         if: ${{ !needs.version.outputs.release }}
         run: npx electron-builder ${{ matrix.settings.platform_flag }} --publish never --config electron-builder.config.ts
-        working-directory: packages/desktop-electron
+        working-directory: packages/desktop
         timeout-minutes: 60
         env:
           OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
 
       - name: Create and upload macOS .app.tar.gz
         if: runner.os == 'macOS' && needs.version.outputs.release
-        working-directory: packages/desktop-electron/dist
+        working-directory: packages/desktop/dist
         env:
           GH_TOKEN: ${{ steps.committer.outputs.token }}
         run: |
@@ -377,9 +377,9 @@ jobs:
         shell: pwsh
         run: |
           $files = @()
-          $files += Get-ChildItem "${{ github.workspace }}\packages\desktop-electron\dist\*.exe" | Select-Object -ExpandProperty FullName
-          $files += Get-ChildItem "${{ github.workspace }}\packages\desktop-electron\dist\*unpacked\*.exe" | Select-Object -ExpandProperty FullName
-          $files += Get-ChildItem "${{ github.workspace }}\packages\desktop-electron\dist\*unpacked\resources\opencode-cli.exe" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName
+          $files += Get-ChildItem "${{ github.workspace }}\packages\desktop\dist\*.exe" | Select-Object -ExpandProperty FullName
+          $files += Get-ChildItem "${{ github.workspace }}\packages\desktop\dist\*unpacked\*.exe" | Select-Object -ExpandProperty FullName
+          $files += Get-ChildItem "${{ github.workspace }}\packages\desktop\dist\*unpacked\resources\opencode-cli.exe" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName
 
           foreach ($file in $files | Select-Object -Unique) {
             $sig = Get-AuthenticodeSignature $file
@@ -391,13 +391,13 @@ jobs:
       - uses: actions/upload-artifact@v4
         with:
           name: opencode-desktop-${{ matrix.settings.target }}
-          path: packages/desktop-electron/dist/*
+          path: packages/desktop/dist/*
 
       - uses: actions/upload-artifact@v4
         if: needs.version.outputs.release
         with:
           name: latest-yml-${{ matrix.settings.target }}
-          path: packages/desktop-electron/dist/latest*.yml
+          path: packages/desktop/dist/latest*.yml
 
   publish:
     needs:

+ 17 - 108
bun.lock

@@ -29,7 +29,7 @@
     },
     "packages/app": {
       "name": "@opencode-ai/app",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@kobalte/core": "catalog:",
         "@opencode-ai/core": "workspace:*",
@@ -85,7 +85,7 @@
     },
     "packages/console/app": {
       "name": "@opencode-ai/console-app",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@cloudflare/vite-plugin": "1.15.2",
         "@ibm/plex": "6.4.1",
@@ -119,7 +119,7 @@
     },
     "packages/console/core": {
       "name": "@opencode-ai/console-core",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@aws-sdk/client-sts": "3.782.0",
         "@jsx-email/render": "1.1.1",
@@ -146,7 +146,7 @@
     },
     "packages/console/function": {
       "name": "@opencode-ai/console-function",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@ai-sdk/anthropic": "3.0.64",
         "@ai-sdk/openai": "3.0.48",
@@ -170,7 +170,7 @@
     },
     "packages/console/mail": {
       "name": "@opencode-ai/console-mail",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@jsx-email/all": "2.2.3",
         "@jsx-email/cli": "1.4.3",
@@ -194,7 +194,7 @@
     },
     "packages/core": {
       "name": "@opencode-ai/core",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "bin": {
         "opencode": "./bin/opencode",
       },
@@ -228,42 +228,7 @@
     },
     "packages/desktop": {
       "name": "@opencode-ai/desktop",
-      "version": "1.14.34",
-      "dependencies": {
-        "@opencode-ai/app": "workspace:*",
-        "@opencode-ai/ui": "workspace:*",
-        "@sentry/solid": "catalog:",
-        "@solid-primitives/i18n": "2.2.1",
-        "@solid-primitives/storage": "catalog:",
-        "@solidjs/meta": "catalog:",
-        "@tauri-apps/api": "^2",
-        "@tauri-apps/plugin-clipboard-manager": "~2",
-        "@tauri-apps/plugin-deep-link": "~2",
-        "@tauri-apps/plugin-dialog": "~2",
-        "@tauri-apps/plugin-http": "~2",
-        "@tauri-apps/plugin-notification": "~2",
-        "@tauri-apps/plugin-opener": "^2",
-        "@tauri-apps/plugin-os": "~2",
-        "@tauri-apps/plugin-process": "~2",
-        "@tauri-apps/plugin-shell": "~2",
-        "@tauri-apps/plugin-store": "~2",
-        "@tauri-apps/plugin-updater": "~2",
-        "@tauri-apps/plugin-window-state": "~2",
-        "solid-js": "catalog:",
-      },
-      "devDependencies": {
-        "@actions/artifact": "4.0.0",
-        "@sentry/vite-plugin": "catalog:",
-        "@tauri-apps/cli": "^2",
-        "@types/bun": "catalog:",
-        "@typescript/native-preview": "catalog:",
-        "typescript": "~5.6.2",
-        "vite": "catalog:",
-      },
-    },
-    "packages/desktop-electron": {
-      "name": "@opencode-ai/desktop-electron",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@effect/platform-node": "catalog:",
         "drizzle-orm": "catalog:",
@@ -310,7 +275,7 @@
     },
     "packages/enterprise": {
       "name": "@opencode-ai/enterprise",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@opencode-ai/core": "workspace:*",
         "@opencode-ai/ui": "workspace:*",
@@ -339,7 +304,7 @@
     },
     "packages/function": {
       "name": "@opencode-ai/function",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@octokit/auth-app": "8.0.1",
         "@octokit/rest": "catalog:",
@@ -355,7 +320,7 @@
     },
     "packages/opencode": {
       "name": "opencode",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "bin": {
         "opencode": "./bin/opencode",
       },
@@ -497,7 +462,7 @@
     },
     "packages/plugin": {
       "name": "@opencode-ai/plugin",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@opencode-ai/sdk": "workspace:*",
         "effect": "catalog:",
@@ -532,7 +497,7 @@
     },
     "packages/sdk/js": {
       "name": "@opencode-ai/sdk",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "cross-spawn": "catalog:",
       },
@@ -547,7 +512,7 @@
     },
     "packages/slack": {
       "name": "@opencode-ai/slack",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@opencode-ai/sdk": "workspace:*",
         "@slack/bolt": "^3.17.1",
@@ -582,7 +547,7 @@
     },
     "packages/ui": {
       "name": "@opencode-ai/ui",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@kobalte/core": "catalog:",
         "@opencode-ai/core": "workspace:*",
@@ -631,7 +596,7 @@
     },
     "packages/web": {
       "name": "@opencode-ai/web",
-      "version": "1.14.34",
+      "version": "1.14.35",
       "dependencies": {
         "@astrojs/cloudflare": "12.6.3",
         "@astrojs/markdown-remark": "6.3.1",
@@ -1571,8 +1536,6 @@
 
     "@opencode-ai/desktop": ["@opencode-ai/desktop@workspace:packages/desktop"],
 
-    "@opencode-ai/desktop-electron": ["@opencode-ai/desktop-electron@workspace:packages/desktop-electron"],
-
     "@opencode-ai/enterprise": ["@opencode-ai/enterprise@workspace:packages/enterprise"],
 
     "@opencode-ai/function": ["@opencode-ai/function@workspace:packages/function"],
@@ -2271,54 +2234,8 @@
 
     "@tauri-apps/api": ["@tauri-apps/api@2.10.1", "", {}, "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw=="],
 
-    "@tauri-apps/cli": ["@tauri-apps/cli@2.10.1", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.10.1", "@tauri-apps/cli-darwin-x64": "2.10.1", "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.1", "@tauri-apps/cli-linux-arm64-gnu": "2.10.1", "@tauri-apps/cli-linux-arm64-musl": "2.10.1", "@tauri-apps/cli-linux-riscv64-gnu": "2.10.1", "@tauri-apps/cli-linux-x64-gnu": "2.10.1", "@tauri-apps/cli-linux-x64-musl": "2.10.1", "@tauri-apps/cli-win32-arm64-msvc": "2.10.1", "@tauri-apps/cli-win32-ia32-msvc": "2.10.1", "@tauri-apps/cli-win32-x64-msvc": "2.10.1" }, "bin": { "tauri": "tauri.js" } }, "sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g=="],
-
-    "@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.10.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ=="],
-
-    "@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.10.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw=="],
-
-    "@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.10.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w=="],
-
-    "@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.10.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA=="],
-
-    "@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.10.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg=="],
-
-    "@tauri-apps/cli-linux-riscv64-gnu": ["@tauri-apps/cli-linux-riscv64-gnu@2.10.1", "", { "os": "linux", "cpu": "none" }, "sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw=="],
-
-    "@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.10.1", "", { "os": "linux", "cpu": "x64" }, "sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw=="],
-
-    "@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.10.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ=="],
-
-    "@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.10.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg=="],
-
-    "@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.10.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw=="],
-
-    "@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.10.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg=="],
-
-    "@tauri-apps/plugin-clipboard-manager": ["@tauri-apps/plugin-clipboard-manager@2.3.2", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-CUlb5Hqi2oZbcZf4VUyUH53XWPPdtpw43EUpCza5HWZJwxEoDowFzNUDt1tRUXA8Uq+XPn17Ysfptip33sG4eQ=="],
-
-    "@tauri-apps/plugin-deep-link": ["@tauri-apps/plugin-deep-link@2.4.8", "", { "dependencies": { "@tauri-apps/api": "^2.10.1" } }, "sha512-Cd2Cs960MGuGONeIwxOPx9wqwedetAHOGlwK5boJ/SMTfAtAyfErpfVPEn+EJzgXsJun8EKzsEumHjr+64V4fw=="],
-
-    "@tauri-apps/plugin-dialog": ["@tauri-apps/plugin-dialog@2.7.0", "", { "dependencies": { "@tauri-apps/api": "^2.10.1" } }, "sha512-4nS/hfGMGCXiAS3LtVjH9AgsSAPJeG/7R+q8agTFqytjnMa4Zq95Bq8WzVDkckpanX+yyRHXnRtrKXkANKDHvw=="],
-
-    "@tauri-apps/plugin-http": ["@tauri-apps/plugin-http@2.5.8", "", { "dependencies": { "@tauri-apps/api": "^2.10.1" } }, "sha512-oxd7oypzQeu8kAfFCrw534Kq7Cw+NzozcnCY21O4rz3A+veJiIiuSCMIprgGcZOcLAXFP9GmDhKUbhuKWcunRw=="],
-
-    "@tauri-apps/plugin-notification": ["@tauri-apps/plugin-notification@2.3.3", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-Zw+ZH18RJb41G4NrfHgIuofJiymusqN+q8fGUIIV7vyCH+5sSn5coqRv/MWB9qETsUs97vmU045q7OyseCV3Qg=="],
-
-    "@tauri-apps/plugin-opener": ["@tauri-apps/plugin-opener@2.5.3", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ=="],
-
-    "@tauri-apps/plugin-os": ["@tauri-apps/plugin-os@2.3.2", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-n+nXWeuSeF9wcEsSPmRnBEGrRgOy6jjkSU+UVCOV8YUGKb2erhDOxis7IqRXiRVHhY8XMKks00BJ0OAdkpf6+A=="],
-
-    "@tauri-apps/plugin-process": ["@tauri-apps/plugin-process@2.3.1", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-nCa4fGVaDL/B9ai03VyPOjfAHRHSBz5v6F/ObsB73r/dA3MHHhZtldaDMIc0V/pnUw9ehzr2iEG+XkSEyC0JJA=="],
-
-    "@tauri-apps/plugin-shell": ["@tauri-apps/plugin-shell@2.3.5", "", { "dependencies": { "@tauri-apps/api": "^2.10.1" } }, "sha512-jewtULhiQ7lI7+owCKAjc8tYLJr92U16bPOeAa472LHJdgaibLP83NcfAF2e+wkEcA53FxKQAZ7byDzs2eeizg=="],
-
     "@tauri-apps/plugin-store": ["@tauri-apps/plugin-store@2.4.2", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-0ClHS50Oq9HEvLPhNzTNFxbWVOqoAp3dRvtewQBeqfIQ0z5m3JRnOISIn2ZVPCrQC0MyGyhTS9DWhHjpigQE7A=="],
 
-    "@tauri-apps/plugin-updater": ["@tauri-apps/plugin-updater@2.10.1", "", { "dependencies": { "@tauri-apps/api": "^2.10.1" } }, "sha512-NFYMg+tWOZPJdzE/PpFj2qfqwAWwNS3kXrb1tm1gnBJ9mYzZ4WDRrwy8udzWoAnfGCHLuePNLY1WVCNHnh3eRA=="],
-
-    "@tauri-apps/plugin-window-state": ["@tauri-apps/plugin-window-state@2.4.1", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-OuvdrzyY8Q5Dbzpj+GcrnV1iCeoZbcFdzMjanZMMcAEUNy/6PH5pxZPXpaZLOR7whlzXiuzx0L9EKZbH7zpdRw=="],
-
     "@tediousjs/connection-string": ["@tediousjs/connection-string@0.5.0", "", {}, "sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ=="],
 
     "@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="],
@@ -5629,13 +5546,9 @@
 
     "@opencode-ai/desktop/@actions/artifact": ["@actions/artifact@4.0.0", "", { "dependencies": { "@actions/core": "^1.10.0", "@actions/github": "^6.0.1", "@actions/http-client": "^2.1.0", "@azure/core-http": "^3.0.5", "@azure/storage-blob": "^12.15.0", "@octokit/core": "^5.2.1", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@protobuf-ts/plugin": "^2.2.3-alpha.1", "archiver": "^7.0.1", "jwt-decode": "^3.1.2", "unzip-stream": "^0.3.1" } }, "sha512-HCc2jMJRAfviGFAh0FsOR/jNfWhirxl7W6z8zDtttt0GltwxBLdEIjLiweOPFl9WbyJRW1VWnPUSAixJqcWUMQ=="],
 
-    "@opencode-ai/desktop/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="],
-
-    "@opencode-ai/desktop-electron/@actions/artifact": ["@actions/artifact@4.0.0", "", { "dependencies": { "@actions/core": "^1.10.0", "@actions/github": "^6.0.1", "@actions/http-client": "^2.1.0", "@azure/core-http": "^3.0.5", "@azure/storage-blob": "^12.15.0", "@octokit/core": "^5.2.1", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@protobuf-ts/plugin": "^2.2.3-alpha.1", "archiver": "^7.0.1", "jwt-decode": "^3.1.2", "unzip-stream": "^0.3.1" } }, "sha512-HCc2jMJRAfviGFAh0FsOR/jNfWhirxl7W6z8zDtttt0GltwxBLdEIjLiweOPFl9WbyJRW1VWnPUSAixJqcWUMQ=="],
-
-    "@opencode-ai/desktop-electron/marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="],
+    "@opencode-ai/desktop/marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="],
 
-    "@opencode-ai/desktop-electron/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="],
+    "@opencode-ai/desktop/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="],
 
     "@opencode-ai/ui/@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.3", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/rootless": "^1.5.2", "@solid-primitives/static-store": "^0.1.2", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ=="],
 
@@ -6619,8 +6532,6 @@
 
     "@octokit/rest/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="],
 
-    "@opencode-ai/desktop-electron/@actions/artifact/@actions/http-client": ["@actions/http-client@2.2.3", "", { "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA=="],
-
     "@opencode-ai/desktop/@actions/artifact/@actions/http-client": ["@actions/http-client@2.2.3", "", { "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA=="],
 
     "@opencode-ai/web/@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="],
@@ -7069,8 +6980,6 @@
 
     "@octokit/rest/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
 
-    "@opencode-ai/desktop-electron/@actions/artifact/@actions/http-client/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="],
-
     "@opencode-ai/desktop/@actions/artifact/@actions/http-client/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="],
 
     "@sentry/bundler-plugin-core/glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="],

+ 1 - 1
package.json

@@ -7,7 +7,7 @@
   "packageManager": "bun@1.3.13",
   "scripts": {
     "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts",
-    "dev:desktop": "bun --cwd packages/desktop-electron dev",
+    "dev:desktop": "bun --cwd packages/desktop dev",
     "dev:web": "bun --cwd packages/app dev",
     "dev:console": "ulimit -n 10240 2>/dev/null; bun run --cwd packages/console/app dev",
     "dev:storybook": "bun --cwd packages/storybook storybook",

+ 1 - 1
packages/app/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@opencode-ai/app",
-  "version": "1.14.34",
+  "version": "1.14.35",
   "description": "",
   "type": "module",
   "exports": {

+ 147 - 132
packages/app/src/components/titlebar.tsx

@@ -35,6 +35,9 @@ type TauriApi = {
 const tauriApi = () => (window as unknown as { __TAURI__?: TauriApi }).__TAURI__
 const currentDesktopWindow = () => tauriApi()?.window?.getCurrentWindow?.()
 const currentThemeWindow = () => tauriApi()?.webviewWindow?.getCurrentWebviewWindow?.()
+const titlebarHeight = 40
+const minTitlebarZoom = 0.25
+const windowsControlsBaseWidth = 138 // 3 native Windows caption buttons at 46px each.
 
 export function Titlebar() {
   const layout = useLayout()
@@ -51,7 +54,14 @@ export function Titlebar() {
   const windows = createMemo(() => platform.platform === "desktop" && platform.os === "windows")
   const web = createMemo(() => platform.platform === "web")
   const zoom = () => platform.webviewZoom?.() ?? 1
-  const minHeight = () => (mac() ? `${40 / zoom()}px` : undefined)
+  const titlebarZoom = () => (windows() ? Math.max(zoom(), minTitlebarZoom) : zoom())
+  const counterZoom = () => (windows() && titlebarZoom() < 1 ? 1 / titlebarZoom() : 1)
+  const minHeight = () => {
+    if (mac()) return `${titlebarHeight / zoom()}px`
+    if (windows()) return `${titlebarHeight / Math.min(titlebarZoom(), 1)}px`
+    return undefined
+  }
+  const windowsControlsWidth = () => `${windowsControlsBaseWidth / Math.max(titlebarZoom(), 1)}px`
 
   const [history, setHistory] = createStore({
     stack: [] as string[],
@@ -165,156 +175,161 @@ export function Titlebar() {
 
   return (
     <header
-      class="h-10 shrink-0 bg-background-base relative grid grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center"
+      class="h-10 shrink-0 bg-background-base relative overflow-hidden"
       style={{ "min-height": minHeight() }}
       data-tauri-drag-region
       onMouseDown={drag}
       onDblClick={maximize}
     >
       <div
-        classList={{
-          "flex items-center min-w-0": true,
-          "pl-2": !mac(),
-        }}
+        class="grid h-full min-h-full w-full grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center"
+        style={{ zoom: counterZoom() }}
       >
-        <Show when={mac()}>
-          <div class="h-full shrink-0" style={{ width: `${72 / zoom()}px` }} />
-          <div class="xl:hidden w-10 shrink-0 flex items-center justify-center">
-            <IconButton
-              icon="menu"
-              variant="ghost"
-              class="titlebar-icon rounded-md"
-              onClick={layout.mobileSidebar.toggle}
-              aria-label={language.t("sidebar.menu.toggle")}
-              aria-expanded={layout.mobileSidebar.opened()}
-            />
-          </div>
-        </Show>
-        <Show when={!mac()}>
-          <div class="xl:hidden w-[48px] shrink-0 flex items-center justify-center">
-            <IconButton
-              icon="menu"
-              variant="ghost"
-              class="titlebar-icon rounded-md"
-              onClick={layout.mobileSidebar.toggle}
-              aria-label={language.t("sidebar.menu.toggle")}
-              aria-expanded={layout.mobileSidebar.opened()}
-            />
-          </div>
-        </Show>
-        <div class="flex items-center gap-1 shrink-0">
-          <TooltipKeybind
-            class={web() ? "hidden xl:flex shrink-0 ml-14" : "hidden xl:flex shrink-0 ml-2"}
-            placement="bottom"
-            title={language.t("command.sidebar.toggle")}
-            keybind={command.keybind("sidebar.toggle")}
-          >
-            <Button
-              variant="ghost"
-              class="group/sidebar-toggle titlebar-icon w-8 h-6 p-0 box-border"
-              onClick={layout.sidebar.toggle}
-              aria-label={language.t("command.sidebar.toggle")}
-              aria-expanded={layout.sidebar.opened()}
+        <div
+          classList={{
+            "flex items-center min-w-0": true,
+            "pl-2": !mac(),
+          }}
+        >
+          <Show when={mac()}>
+            <div class="h-full shrink-0" style={{ width: `${72 / zoom()}px` }} />
+            <div class="xl:hidden w-10 shrink-0 flex items-center justify-center">
+              <IconButton
+                icon="menu"
+                variant="ghost"
+                class="titlebar-icon rounded-md"
+                onClick={layout.mobileSidebar.toggle}
+                aria-label={language.t("sidebar.menu.toggle")}
+                aria-expanded={layout.mobileSidebar.opened()}
+              />
+            </div>
+          </Show>
+          <Show when={!mac()}>
+            <div class="xl:hidden w-[48px] shrink-0 flex items-center justify-center">
+              <IconButton
+                icon="menu"
+                variant="ghost"
+                class="titlebar-icon rounded-md"
+                onClick={layout.mobileSidebar.toggle}
+                aria-label={language.t("sidebar.menu.toggle")}
+                aria-expanded={layout.mobileSidebar.opened()}
+              />
+            </div>
+          </Show>
+          <div class="flex items-center gap-1 shrink-0">
+            <TooltipKeybind
+              class={web() ? "hidden xl:flex shrink-0 ml-14" : "hidden xl:flex shrink-0 ml-2"}
+              placement="bottom"
+              title={language.t("command.sidebar.toggle")}
+              keybind={command.keybind("sidebar.toggle")}
             >
-              <Icon size="small" name={layout.sidebar.opened() ? "sidebar-active" : "sidebar"} />
-            </Button>
-          </TooltipKeybind>
-          <div class="hidden xl:flex items-center shrink-0">
-            <Show when={params.dir}>
-              <div
-                class="flex items-center shrink-0 w-8 mr-1"
-                aria-hidden={layout.sidebar.opened() ? "true" : undefined}
+              <Button
+                variant="ghost"
+                class="group/sidebar-toggle titlebar-icon w-8 h-6 p-0 box-border"
+                onClick={layout.sidebar.toggle}
+                aria-label={language.t("command.sidebar.toggle")}
+                aria-expanded={layout.sidebar.opened()}
               >
+                <Icon size="small" name={layout.sidebar.opened() ? "sidebar-active" : "sidebar"} />
+              </Button>
+            </TooltipKeybind>
+            <div class="hidden xl:flex items-center shrink-0">
+              <Show when={params.dir}>
                 <div
-                  class="transition-opacity"
-                  classList={{
-                    "opacity-100 duration-120 ease-out": !layout.sidebar.opened(),
-                    "opacity-0 duration-120 ease-in delay-0 pointer-events-none": layout.sidebar.opened(),
-                  }}
+                  class="flex items-center shrink-0 w-8 mr-1"
+                  aria-hidden={layout.sidebar.opened() ? "true" : undefined}
                 >
-                  <TooltipKeybind
-                    placement="bottom"
-                    title={language.t("command.session.new")}
-                    keybind={command.keybind("session.new")}
-                    openDelay={2000}
+                  <div
+                    class="transition-opacity"
+                    classList={{
+                      "opacity-100 duration-120 ease-out": !layout.sidebar.opened(),
+                      "opacity-0 duration-120 ease-in delay-0 pointer-events-none": layout.sidebar.opened(),
+                    }}
                   >
-                    <Button
-                      variant="ghost"
-                      icon={creating() ? "new-session-active" : "new-session"}
-                      class="titlebar-icon w-8 h-6 p-0 box-border"
-                      disabled={layout.sidebar.opened()}
-                      tabIndex={layout.sidebar.opened() ? -1 : undefined}
-                      onClick={() => {
-                        if (!params.dir) return
-                        navigate(`/${params.dir}/session`)
-                      }}
-                      aria-label={language.t("command.session.new")}
-                      aria-current={creating() ? "page" : undefined}
-                    />
-                  </TooltipKeybind>
-                </div>
-              </div>
-            </Show>
-            <div
-              class="flex items-center shrink-0"
-              classList={{
-                "-translate-x-[36px]": layout.sidebar.opened() && !!params.dir,
-                "duration-180 ease-out": !layout.sidebar.opened(),
-                "duration-180 ease-in": layout.sidebar.opened(),
-              }}
-            >
-              <Show when={hasProjects() && nav()}>
-                <div class="flex items-center gap-0 transition-transform">
-                  <Tooltip placement="bottom" value={language.t("common.goBack")} openDelay={2000}>
-                    <Button
-                      variant="ghost"
-                      icon="chevron-left"
-                      class="titlebar-icon w-6 h-6 p-0 box-border"
-                      disabled={!canBack()}
-                      onClick={back}
-                      aria-label={language.t("common.goBack")}
-                    />
-                  </Tooltip>
-                  <Tooltip placement="bottom" value={language.t("common.goForward")} openDelay={2000}>
-                    <Button
-                      variant="ghost"
-                      icon="chevron-right"
-                      class="titlebar-icon w-6 h-6 p-0 box-border"
-                      disabled={!canForward()}
-                      onClick={forward}
-                      aria-label={language.t("common.goForward")}
-                    />
-                  </Tooltip>
+                    <TooltipKeybind
+                      placement="bottom"
+                      title={language.t("command.session.new")}
+                      keybind={command.keybind("session.new")}
+                      openDelay={2000}
+                    >
+                      <Button
+                        variant="ghost"
+                        icon={creating() ? "new-session-active" : "new-session"}
+                        class="titlebar-icon w-8 h-6 p-0 box-border"
+                        disabled={layout.sidebar.opened()}
+                        tabIndex={layout.sidebar.opened() ? -1 : undefined}
+                        onClick={() => {
+                          if (!params.dir) return
+                          navigate(`/${params.dir}/session`)
+                        }}
+                        aria-label={language.t("command.session.new")}
+                        aria-current={creating() ? "page" : undefined}
+                      />
+                    </TooltipKeybind>
+                  </div>
                 </div>
               </Show>
-              <div id="opencode-titlebar-left" class="flex items-center gap-3 min-w-0 px-2" />
-              {["beta", "dev"].includes(import.meta.env.VITE_OPENCODE_CHANNEL) && (
-                <div class="bg-icon-interactive-base text-[#FFF] font-medium px-2 rounded-sm uppercase font-mono">
-                  {import.meta.env.VITE_OPENCODE_CHANNEL.toUpperCase()}
-                </div>
-              )}
+              <div
+                class="flex items-center shrink-0"
+                classList={{
+                  "-translate-x-[36px]": layout.sidebar.opened() && !!params.dir,
+                  "duration-180 ease-out": !layout.sidebar.opened(),
+                  "duration-180 ease-in": layout.sidebar.opened(),
+                }}
+              >
+                <Show when={hasProjects() && nav()}>
+                  <div class="flex items-center gap-0 transition-transform">
+                    <Tooltip placement="bottom" value={language.t("common.goBack")} openDelay={2000}>
+                      <Button
+                        variant="ghost"
+                        icon="chevron-left"
+                        class="titlebar-icon w-6 h-6 p-0 box-border"
+                        disabled={!canBack()}
+                        onClick={back}
+                        aria-label={language.t("common.goBack")}
+                      />
+                    </Tooltip>
+                    <Tooltip placement="bottom" value={language.t("common.goForward")} openDelay={2000}>
+                      <Button
+                        variant="ghost"
+                        icon="chevron-right"
+                        class="titlebar-icon w-6 h-6 p-0 box-border"
+                        disabled={!canForward()}
+                        onClick={forward}
+                        aria-label={language.t("common.goForward")}
+                      />
+                    </Tooltip>
+                  </div>
+                </Show>
+                <div id="opencode-titlebar-left" class="flex items-center gap-3 min-w-0 px-2" />
+                {["beta", "dev"].includes(import.meta.env.VITE_OPENCODE_CHANNEL) && (
+                  <div class="bg-icon-interactive-base text-[#FFF] font-medium px-2 rounded-sm uppercase font-mono">
+                    {import.meta.env.VITE_OPENCODE_CHANNEL.toUpperCase()}
+                  </div>
+                )}
+              </div>
             </div>
           </div>
         </div>
-      </div>
 
-      <div class="min-w-0 flex items-center justify-center pointer-events-none">
-        <div id="opencode-titlebar-center" class="pointer-events-auto min-w-0 flex justify-center w-fit max-w-full" />
-      </div>
+        <div class="min-w-0 flex items-center justify-center pointer-events-none">
+          <div id="opencode-titlebar-center" class="pointer-events-auto min-w-0 flex justify-center w-fit max-w-full" />
+        </div>
 
-      <div
-        classList={{
-          "flex items-center min-w-0 justify-end": true,
-          "pr-2": !windows(),
-        }}
-        data-tauri-drag-region
-        onMouseDown={drag}
-      >
-        <div id="opencode-titlebar-right" class="flex items-center gap-1 shrink-0 justify-end" />
-        <Show when={windows()}>
-          {!tauriApi() && <div class="w-36 shrink-0" />}
-          <div data-tauri-decorum-tb class="flex flex-row" />
-        </Show>
+        <div
+          classList={{
+            "flex items-center min-w-0 justify-end": true,
+            "pr-2": !windows(),
+          }}
+          data-tauri-drag-region
+          onMouseDown={drag}
+        >
+          <div id="opencode-titlebar-right" class="flex items-center gap-1 shrink-0 justify-end" />
+          <Show when={windows()}>
+            {!tauriApi() && <div class="shrink-0" style={{ width: windowsControlsWidth() }} />}
+            <div data-tauri-decorum-tb class="flex flex-row" />
+          </Show>
+        </div>
       </div>
     </header>
   )

+ 1 - 1
packages/console/app/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@opencode-ai/console-app",
-  "version": "1.14.34",
+  "version": "1.14.35",
   "type": "module",
   "license": "MIT",
   "scripts": {

+ 4 - 11
packages/console/app/src/routes/download/[channel]/[platform].ts

@@ -2,11 +2,11 @@ import type { APIEvent } from "@solidjs/start"
 import type { DownloadPlatform } from "../types"
 
 const prodAssetNames: Record<string, string> = {
-  "darwin-aarch64-dmg": "opencode-desktop-darwin-aarch64.dmg",
-  "darwin-x64-dmg": "opencode-desktop-darwin-x64.dmg",
-  "windows-x64-nsis": "opencode-desktop-windows-x64.exe",
+  "darwin-aarch64-dmg": "opencode-desktop-mac-arm64.dmg",
+  "darwin-x64-dmg": "opencode-desktop-mac-x64.dmg",
+  "windows-x64-nsis": "opencode-desktop-win-x64.exe",
   "linux-x64-deb": "opencode-desktop-linux-amd64.deb",
-  "linux-x64-appimage": "opencode-desktop-linux-amd64.AppImage",
+  "linux-x64-appimage": "opencode-desktop-linux-x86_64.AppImage",
   "linux-x64-rpm": "opencode-desktop-linux-x86_64.rpm",
 } satisfies Record<DownloadPlatform, string>
 
@@ -32,13 +32,6 @@ export async function GET({ params: { platform, channel } }: APIEvent) {
 
   const resp = await fetch(
     `https://github.com/anomalyco/${channel === "stable" ? "opencode" : "opencode-beta"}/releases/latest/download/${assetName}`,
-    {
-      cf: {
-        // in case gh releases has rate limits
-        cacheTtl: 60 * 5,
-        cacheEverything: true,
-      },
-    } as any,
   )
 
   const downloadName = downloadNames[platform]

+ 1 - 1
packages/console/core/package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@opencode-ai/console-core",
-  "version": "1.14.34",
+  "version": "1.14.35",
   "private": true,
   "type": "module",
   "license": "MIT",

+ 1 - 1
packages/console/function/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@opencode-ai/console-function",
-  "version": "1.14.34",
+  "version": "1.14.35",
   "$schema": "https://json.schemastore.org/package.json",
   "private": true,
   "type": "module",

+ 1 - 1
packages/console/mail/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@opencode-ai/console-mail",
-  "version": "1.14.34",
+  "version": "1.14.35",
   "dependencies": {
     "@jsx-email/all": "2.2.3",
     "@jsx-email/cli": "1.4.3",

+ 1 - 1
packages/core/package.json

@@ -1,6 +1,6 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
-  "version": "1.14.34",
+  "version": "1.14.35",
   "name": "@opencode-ai/core",
   "type": "module",
   "license": "MIT",

+ 2 - 0
packages/core/src/global.ts

@@ -71,6 +71,8 @@ export const layer = Layer.effect(
   Effect.sync(() => Service.of(make())),
 )
 
+export const defaultLayer = layer
+
 export const layerWith = (input: Partial<Interface>) =>
   Layer.effect(
     Service,

+ 0 - 28
packages/desktop-electron/.gitignore

@@ -1,28 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
-out/
-
-resources/opencode-cli*
-resources/icons

+ 0 - 4
packages/desktop-electron/AGENTS.md

@@ -1,4 +0,0 @@
-# Desktop package notes
-
-- Renderer process should only call `window.api` from `src/preload`.
-- Main process should register IPC handlers in `src/main/ipc.ts`.

+ 0 - 32
packages/desktop-electron/README.md

@@ -1,32 +0,0 @@
-# OpenCode Desktop
-
-Native OpenCode desktop app, built with Tauri v2.
-
-## Development
-
-From the repo root:
-
-```bash
-bun install
-bun run --cwd packages/desktop tauri dev
-```
-
-This starts the Vite dev server on http://localhost:1420 and opens the native window.
-
-If you only want the web dev server (no native shell):
-
-```bash
-bun run --cwd packages/desktop dev
-```
-
-## Build
-
-To create a production `dist/` and build the native app bundle:
-
-```bash
-bun run --cwd packages/desktop tauri build
-```
-
-## Prerequisites
-
-Running the desktop app requires additional Tauri dependencies (Rust toolchain, platform-specific libraries). See the [Tauri prerequisites](https://v2.tauri.app/start/prerequisites/) for setup instructions.

+ 0 - 69
packages/desktop-electron/package.json

@@ -1,69 +0,0 @@
-{
-  "name": "@opencode-ai/desktop-electron",
-  "private": true,
-  "version": "1.14.34",
-  "type": "module",
-  "license": "MIT",
-  "homepage": "https://opencode.ai",
-  "author": {
-    "name": "OpenCode",
-    "email": "hello@opencode.ai"
-  },
-  "scripts": {
-    "typecheck": "tsgo -b",
-    "predev": "bun ./scripts/predev.ts",
-    "dev": "electron-vite dev",
-    "prebuild": "bun ./scripts/prebuild.ts",
-    "build": "electron-vite build",
-    "preview": "electron-vite preview",
-    "package": "electron-builder --config electron-builder.config.ts",
-    "package:mac": "electron-builder --mac --config electron-builder.config.ts",
-    "package:win": "electron-builder --win --config electron-builder.config.ts",
-    "package:linux": "electron-builder --linux --config electron-builder.config.ts",
-    "native:build": "bun install --cwd native"
-  },
-  "main": "./out/main/index.js",
-  "dependencies": {
-    "effect": "catalog:",
-    "@effect/platform-node": "catalog:",
-    "electron-context-menu": "4.1.2",
-    "electron-log": "^5",
-    "electron-store": "^10",
-    "electron-updater": "^6",
-    "electron-window-state": "^5.0.3",
-    "drizzle-orm": "catalog:",
-    "marked": "^15"
-  },
-  "devDependencies": {
-    "@actions/artifact": "4.0.0",
-    "@lydell/node-pty": "catalog:",
-    "@opencode-ai/app": "workspace:*",
-    "@opencode-ai/ui": "workspace:*",
-    "@sentry/solid": "catalog:",
-    "@sentry/vite-plugin": "catalog:",
-    "@solid-primitives/i18n": "2.2.1",
-    "@solid-primitives/storage": "catalog:",
-    "@solidjs/meta": "catalog:",
-    "@solidjs/router": "0.15.4",
-    "@types/bun": "catalog:",
-    "@types/node": "catalog:",
-    "@typescript/native-preview": "catalog:",
-    "@valibot/to-json-schema": "1.6.0",
-    "electron": "41.2.1",
-    "electron-builder": "^26",
-    "electron-vite": "^5",
-    "solid-js": "catalog:",
-    "sury": "11.0.0-alpha.4",
-    "typescript": "~5.6.2",
-    "vite": "catalog:",
-    "zod-openapi": "5.4.6"
-  },
-  "optionalDependencies": {
-    "@lydell/node-pty-darwin-arm64": "1.2.0-beta.10",
-    "@lydell/node-pty-darwin-x64": "1.2.0-beta.10",
-    "@lydell/node-pty-linux-arm64": "1.2.0-beta.10",
-    "@lydell/node-pty-linux-x64": "1.2.0-beta.10",
-    "@lydell/node-pty-win32-arm64": "1.2.0-beta.10",
-    "@lydell/node-pty-win32-x64": "1.2.0-beta.10"
-  }
-}

+ 0 - 12
packages/desktop-electron/scripts/copy-bundles.ts

@@ -1,12 +0,0 @@
-import { $ } from "bun"
-import * as path from "node:path"
-
-import { RUST_TARGET } from "./utils"
-
-if (!RUST_TARGET) throw new Error("RUST_TARGET not defined")
-
-const BUNDLE_DIR = "dist"
-const BUNDLES_OUT_DIR = path.join(process.cwd(), "dist/bundles")
-
-await $`mkdir -p ${BUNDLES_OUT_DIR}`
-await $`cp -r ${BUNDLE_DIR}/* ${BUNDLES_OUT_DIR}`

+ 0 - 5
packages/desktop-electron/scripts/predev.ts

@@ -1,5 +0,0 @@
-import { $ } from "bun"
-
-await $`bun ./scripts/copy-icons.ts ${process.env.OPENCODE_CHANNEL ?? "dev"}`
-
-await $`cd ../opencode && bun script/build-node.ts`

+ 0 - 9
packages/desktop-electron/scripts/prepare.ts

@@ -1,9 +0,0 @@
-#!/usr/bin/env bun
-import { Script } from "@opencode-ai/script"
-
-await import("./prebuild")
-
-const pkg = await Bun.file("./package.json").json()
-pkg.version = Script.version
-await Bun.write("./package.json", JSON.stringify(pkg, null, 2) + "\n")
-console.log(`Updated package.json version to ${Script.version}`)

+ 0 - 77
packages/desktop-electron/scripts/utils.ts

@@ -1,77 +0,0 @@
-import { $ } from "bun"
-
-export type Channel = "dev" | "beta" | "prod"
-
-export function resolveChannel(): Channel {
-  const raw = Bun.env.OPENCODE_CHANNEL
-  if (raw === "dev" || raw === "beta" || raw === "prod") return raw
-  return "dev"
-}
-
-export const SIDECAR_BINARIES: Array<{ rustTarget: string; ocBinary: string; assetExt: string }> = [
-  {
-    rustTarget: "aarch64-apple-darwin",
-    ocBinary: "opencode-darwin-arm64",
-    assetExt: "zip",
-  },
-  {
-    rustTarget: "x86_64-apple-darwin",
-    ocBinary: "opencode-darwin-x64-baseline",
-    assetExt: "zip",
-  },
-  {
-    rustTarget: "aarch64-pc-windows-msvc",
-    ocBinary: "opencode-windows-arm64",
-    assetExt: "zip",
-  },
-  {
-    rustTarget: "x86_64-pc-windows-msvc",
-    ocBinary: "opencode-windows-x64-baseline",
-    assetExt: "zip",
-  },
-  {
-    rustTarget: "x86_64-unknown-linux-gnu",
-    ocBinary: "opencode-linux-x64-baseline",
-    assetExt: "tar.gz",
-  },
-  {
-    rustTarget: "aarch64-unknown-linux-gnu",
-    ocBinary: "opencode-linux-arm64",
-    assetExt: "tar.gz",
-  },
-]
-
-export const RUST_TARGET = Bun.env.RUST_TARGET
-
-function nativeTarget() {
-  const { platform, arch } = process
-  if (platform === "darwin") return arch === "arm64" ? "aarch64-apple-darwin" : "x86_64-apple-darwin"
-  if (platform === "win32") return arch === "arm64" ? "aarch64-pc-windows-msvc" : "x86_64-pc-windows-msvc"
-  if (platform === "linux") return arch === "arm64" ? "aarch64-unknown-linux-gnu" : "x86_64-unknown-linux-gnu"
-  throw new Error(`Unsupported platform: ${platform}/${arch}`)
-}
-
-export function getCurrentSidecar(target = RUST_TARGET ?? nativeTarget()) {
-  const binaryConfig = SIDECAR_BINARIES.find((b) => b.rustTarget === target)
-  if (!binaryConfig) throw new Error(`Sidecar configuration not available for Rust target '${target}'`)
-
-  return binaryConfig
-}
-
-export async function copyBinaryToSidecarFolder(source: string) {
-  const dir = `resources`
-  await $`mkdir -p ${dir}`
-  const dest = windowsify(`${dir}/opencode-cli`)
-  await $`cp ${source} ${dest}`
-  if (process.platform === "win32" && process.env.GITHUB_ACTIONS === "true") {
-    await $`pwsh -NoLogo -NoProfile -ExecutionPolicy Bypass -File ../../script/sign-windows.ps1 ${dest}`
-  }
-  if (process.platform === "darwin") await $`codesign --force --sign - ${dest}`
-
-  console.log(`Copied ${source} to ${dest}`)
-}
-
-export function windowsify(path: string) {
-  if (path.endsWith(".exe")) return path
-  return `${path}${process.platform === "win32" ? ".exe" : ""}`
-}

+ 0 - 10
packages/desktop-electron/sst-env.d.ts

@@ -1,10 +0,0 @@
-/* This file is auto-generated by SST. Do not edit. */
-/* tslint:disable */
-/* eslint-disable */
-/* deno-fmt-ignore-file */
-/* biome-ignore-all lint: auto-generated */
-
-/// <reference path="../../sst-env.d.ts" />
-
-import "sst"
-export {}

+ 0 - 23
packages/desktop-electron/tsconfig.json

@@ -1,23 +0,0 @@
-{
-  "compilerOptions": {
-    "target": "ESNext",
-    "module": "ESNext",
-    "skipLibCheck": true,
-    "moduleResolution": "bundler",
-    "allowSyntheticDefaultImports": true,
-    "esModuleInterop": true,
-    "jsx": "preserve",
-    "jsxImportSource": "solid-js",
-    "allowJs": true,
-    "resolveJsonModule": true,
-    "strict": true,
-    "isolatedModules": true,
-    "noEmit": true,
-    "emitDeclarationOnly": false,
-    "outDir": "node_modules/.ts-dist",
-    "types": ["vite/client", "node", "electron"]
-  },
-  "references": [{ "path": "../app" }],
-  "include": ["src", "package.json"],
-  "exclude": ["src/**/*.test.ts"]
-}

+ 4 - 0
packages/desktop/.gitignore

@@ -22,3 +22,7 @@ dist-ssr
 *.njsproj
 *.sln
 *.sw?
+out/
+
+resources/opencode-cli*
+resources/icons

+ 2 - 2
packages/desktop/AGENTS.md

@@ -1,4 +1,4 @@
 # Desktop package notes
 
-- Never call `invoke` manually in this package.
-- Use the generated bindings in `packages/desktop/src/bindings.ts` for core commands/events.
+- Renderer process should only call `window.api` from `src/preload`.
+- Main process should register IPC handlers in `src/main/ipc.ts`.

+ 11 - 11
packages/desktop/README.md

@@ -2,10 +2,6 @@
 
 Native OpenCode desktop app, built with Tauri v2.
 
-## Prerequisites
-
-Building the desktop app requires additional Tauri dependencies (Rust toolchain, platform-specific libraries). See the [Tauri prerequisites](https://v2.tauri.app/start/prerequisites/) for setup instructions.
-
 ## Development
 
 From the repo root:
@@ -15,18 +11,22 @@ bun install
 bun run --cwd packages/desktop tauri dev
 ```
 
-## Build
+This starts the Vite dev server on http://localhost:1420 and opens the native window.
+
+If you only want the web dev server (no native shell):
 
 ```bash
-bun run --cwd packages/desktop tauri build
+bun run --cwd packages/desktop dev
 ```
 
-## Troubleshooting
-
-### Rust compiler not found
+## Build
 
-If you see errors about Rust not being found, install it via [rustup](https://rustup.rs/):
+To create a production `dist/` and build the native app bundle:
 
 ```bash
-curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+bun run --cwd packages/desktop tauri build
 ```
+
+## Prerequisites
+
+Running the desktop app requires additional Tauri dependencies (Rust toolchain, platform-specific libraries). See the [Tauri prerequisites](https://v2.tauri.app/start/prerequisites/) for setup instructions.

+ 0 - 0
packages/desktop-electron/electron-builder.config.ts → packages/desktop/electron-builder.config.ts


+ 0 - 0
packages/desktop-electron/electron.vite.config.ts → packages/desktop/electron.vite.config.ts


+ 0 - 0
packages/desktop-electron/icons/README.md → packages/desktop/icons/README.md


+ 0 - 0
packages/desktop-electron/icons/beta/128x128.png → packages/desktop/icons/beta/128x128.png


+ 0 - 0
packages/desktop-electron/icons/beta/128x128@2x.png → packages/desktop/icons/beta/128x128@2x.png


+ 0 - 0
packages/desktop-electron/icons/beta/32x32.png → packages/desktop/icons/beta/32x32.png


+ 0 - 0
packages/desktop-electron/icons/beta/64x64.png → packages/desktop/icons/beta/64x64.png


+ 0 - 0
packages/desktop-electron/icons/beta/Square107x107Logo.png → packages/desktop/icons/beta/Square107x107Logo.png


+ 0 - 0
packages/desktop-electron/icons/beta/Square142x142Logo.png → packages/desktop/icons/beta/Square142x142Logo.png


+ 0 - 0
packages/desktop-electron/icons/beta/Square150x150Logo.png → packages/desktop/icons/beta/Square150x150Logo.png


+ 0 - 0
packages/desktop-electron/icons/beta/Square284x284Logo.png → packages/desktop/icons/beta/Square284x284Logo.png


+ 0 - 0
packages/desktop-electron/icons/beta/Square30x30Logo.png → packages/desktop/icons/beta/Square30x30Logo.png


+ 0 - 0
packages/desktop-electron/icons/beta/Square310x310Logo.png → packages/desktop/icons/beta/Square310x310Logo.png


+ 0 - 0
packages/desktop-electron/icons/beta/Square44x44Logo.png → packages/desktop/icons/beta/Square44x44Logo.png


+ 0 - 0
packages/desktop-electron/icons/beta/Square71x71Logo.png → packages/desktop/icons/beta/Square71x71Logo.png


+ 0 - 0
packages/desktop-electron/icons/beta/Square89x89Logo.png → packages/desktop/icons/beta/Square89x89Logo.png


+ 0 - 0
packages/desktop-electron/icons/beta/StoreLogo.png → packages/desktop/icons/beta/StoreLogo.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-anydpi-v26/ic_launcher.xml → packages/desktop/icons/beta/android/mipmap-anydpi-v26/ic_launcher.xml


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-hdpi/ic_launcher.png → packages/desktop/icons/beta/android/mipmap-hdpi/ic_launcher.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-hdpi/ic_launcher_foreground.png → packages/desktop/icons/beta/android/mipmap-hdpi/ic_launcher_foreground.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-hdpi/ic_launcher_round.png → packages/desktop/icons/beta/android/mipmap-hdpi/ic_launcher_round.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-mdpi/ic_launcher.png → packages/desktop/icons/beta/android/mipmap-mdpi/ic_launcher.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-mdpi/ic_launcher_foreground.png → packages/desktop/icons/beta/android/mipmap-mdpi/ic_launcher_foreground.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-mdpi/ic_launcher_round.png → packages/desktop/icons/beta/android/mipmap-mdpi/ic_launcher_round.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-xhdpi/ic_launcher.png → packages/desktop/icons/beta/android/mipmap-xhdpi/ic_launcher.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-xhdpi/ic_launcher_foreground.png → packages/desktop/icons/beta/android/mipmap-xhdpi/ic_launcher_foreground.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-xhdpi/ic_launcher_round.png → packages/desktop/icons/beta/android/mipmap-xhdpi/ic_launcher_round.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-xxhdpi/ic_launcher.png → packages/desktop/icons/beta/android/mipmap-xxhdpi/ic_launcher.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-xxhdpi/ic_launcher_foreground.png → packages/desktop/icons/beta/android/mipmap-xxhdpi/ic_launcher_foreground.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-xxhdpi/ic_launcher_round.png → packages/desktop/icons/beta/android/mipmap-xxhdpi/ic_launcher_round.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-xxxhdpi/ic_launcher.png → packages/desktop/icons/beta/android/mipmap-xxxhdpi/ic_launcher.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-xxxhdpi/ic_launcher_foreground.png → packages/desktop/icons/beta/android/mipmap-xxxhdpi/ic_launcher_foreground.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/mipmap-xxxhdpi/ic_launcher_round.png → packages/desktop/icons/beta/android/mipmap-xxxhdpi/ic_launcher_round.png


+ 0 - 0
packages/desktop-electron/icons/beta/android/values/ic_launcher_background.xml → packages/desktop/icons/beta/android/values/ic_launcher_background.xml


+ 0 - 0
packages/desktop-electron/icons/beta/dock.png → packages/desktop/icons/beta/dock.png


+ 0 - 0
packages/desktop-electron/icons/beta/icon.icns → packages/desktop/icons/beta/icon.icns


+ 0 - 0
packages/desktop-electron/icons/beta/icon.ico → packages/desktop/icons/beta/icon.ico


+ 0 - 0
packages/desktop-electron/icons/beta/icon.png → packages/desktop/icons/beta/icon.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-20x20@1x.png → packages/desktop/icons/beta/ios/AppIcon-20x20@1x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-20x20@2x-1.png → packages/desktop/icons/beta/ios/AppIcon-20x20@2x-1.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-20x20@2x.png → packages/desktop/icons/beta/ios/AppIcon-20x20@2x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-20x20@3x.png → packages/desktop/icons/beta/ios/AppIcon-20x20@3x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-29x29@1x.png → packages/desktop/icons/beta/ios/AppIcon-29x29@1x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-29x29@2x-1.png → packages/desktop/icons/beta/ios/AppIcon-29x29@2x-1.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-29x29@2x.png → packages/desktop/icons/beta/ios/AppIcon-29x29@2x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-29x29@3x.png → packages/desktop/icons/beta/ios/AppIcon-29x29@3x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-40x40@1x.png → packages/desktop/icons/beta/ios/AppIcon-40x40@1x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-40x40@2x-1.png → packages/desktop/icons/beta/ios/AppIcon-40x40@2x-1.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-40x40@2x.png → packages/desktop/icons/beta/ios/AppIcon-40x40@2x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-40x40@3x.png → packages/desktop/icons/beta/ios/AppIcon-40x40@3x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-512@2x.png → packages/desktop/icons/beta/ios/AppIcon-512@2x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-60x60@2x.png → packages/desktop/icons/beta/ios/AppIcon-60x60@2x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-60x60@3x.png → packages/desktop/icons/beta/ios/AppIcon-60x60@3x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-76x76@1x.png → packages/desktop/icons/beta/ios/AppIcon-76x76@1x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-76x76@2x.png → packages/desktop/icons/beta/ios/AppIcon-76x76@2x.png


+ 0 - 0
packages/desktop-electron/icons/beta/ios/AppIcon-83.5x83.5@2x.png → packages/desktop/icons/beta/ios/AppIcon-83.5x83.5@2x.png


+ 0 - 0
packages/desktop-electron/icons/dev/128x128.png → packages/desktop/icons/dev/128x128.png


+ 0 - 0
packages/desktop-electron/icons/dev/128x128@2x.png → packages/desktop/icons/dev/128x128@2x.png


+ 0 - 0
packages/desktop-electron/icons/dev/32x32.png → packages/desktop/icons/dev/32x32.png


+ 0 - 0
packages/desktop-electron/icons/dev/64x64.png → packages/desktop/icons/dev/64x64.png


+ 0 - 0
packages/desktop-electron/icons/dev/Square107x107Logo.png → packages/desktop/icons/dev/Square107x107Logo.png


+ 0 - 0
packages/desktop-electron/icons/dev/Square142x142Logo.png → packages/desktop/icons/dev/Square142x142Logo.png


+ 0 - 0
packages/desktop-electron/icons/dev/Square150x150Logo.png → packages/desktop/icons/dev/Square150x150Logo.png


+ 0 - 0
packages/desktop-electron/icons/dev/Square284x284Logo.png → packages/desktop/icons/dev/Square284x284Logo.png


+ 0 - 0
packages/desktop-electron/icons/dev/Square30x30Logo.png → packages/desktop/icons/dev/Square30x30Logo.png


+ 0 - 0
packages/desktop-electron/icons/dev/Square310x310Logo.png → packages/desktop/icons/dev/Square310x310Logo.png


+ 0 - 0
packages/desktop-electron/icons/dev/Square44x44Logo.png → packages/desktop/icons/dev/Square44x44Logo.png


+ 0 - 0
packages/desktop-electron/icons/dev/Square71x71Logo.png → packages/desktop/icons/dev/Square71x71Logo.png


+ 0 - 0
packages/desktop-electron/icons/dev/Square89x89Logo.png → packages/desktop/icons/dev/Square89x89Logo.png


+ 0 - 0
packages/desktop-electron/icons/dev/StoreLogo.png → packages/desktop/icons/dev/StoreLogo.png


+ 0 - 0
packages/desktop-electron/icons/dev/android/mipmap-anydpi-v26/ic_launcher.xml → packages/desktop/icons/dev/android/mipmap-anydpi-v26/ic_launcher.xml


+ 0 - 0
packages/desktop-electron/icons/dev/android/mipmap-hdpi/ic_launcher.png → packages/desktop/icons/dev/android/mipmap-hdpi/ic_launcher.png


+ 0 - 0
packages/desktop-electron/icons/dev/android/mipmap-hdpi/ic_launcher_foreground.png → packages/desktop/icons/dev/android/mipmap-hdpi/ic_launcher_foreground.png


+ 0 - 0
packages/desktop-electron/icons/dev/android/mipmap-hdpi/ic_launcher_round.png → packages/desktop/icons/dev/android/mipmap-hdpi/ic_launcher_round.png


+ 0 - 0
packages/desktop-electron/icons/dev/android/mipmap-mdpi/ic_launcher.png → packages/desktop/icons/dev/android/mipmap-mdpi/ic_launcher.png


Some files were not shown because too many files changed in this diff