From 5a1aca9189457fef02ca686ac26a45f15ad0753c Mon Sep 17 00:00:00 2001
From: Tuhin Mahmud <112567239+tuhin-cmd@users.noreply.github.com>
Date: Sat, 21 Feb 2026 06:17:47 +0600
Subject: [PATCH 1/9] docs: add Bangla README translation (#14331)
---
README.ar.md | 3 +-
README.bn.md | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++
README.br.md | 3 +-
README.bs.md | 3 +-
README.da.md | 3 +-
README.de.md | 3 +-
README.es.md | 3 +-
README.fr.md | 3 +-
README.it.md | 3 +-
README.ja.md | 3 +-
README.ko.md | 3 +-
README.md | 3 +-
README.no.md | 3 +-
README.pl.md | 3 +-
README.ru.md | 3 +-
README.th.md | 3 +-
README.tr.md | 3 +-
README.uk.md | 3 +-
README.zh.md | 3 +-
README.zht.md | 3 +-
20 files changed, 177 insertions(+), 19 deletions(-)
create mode 100644 README.bn.md
diff --git a/README.ar.md b/README.ar.md
index f24e598d5..aeb2f04b7 100644
--- a/README.ar.md
+++ b/README.ar.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.bn.md b/README.bn.md
new file mode 100644
index 000000000..6cf1f0fbd
--- /dev/null
+++ b/README.bn.md
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+ওপেন সোর্স এআই কোডিং এজেন্ট।
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা
+
+
+[](https://opencode.ai)
+
+---
+
+### ইনস্টলেশন (Installation)
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Package managers
+npm i -g opencode-ai@latest # or bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS and Linux (recommended, always up to date)
+brew install opencode # macOS and Linux (official brew formula, updated less)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # Any OS
+nix run nixpkgs#opencode # or github:anomalyco/opencode for latest dev branch
+```
+
+> [!TIP]
+> ইনস্টল করার আগে ০.১.x এর চেয়ে পুরোনো ভার্সনগুলো মুছে ফেলুন।
+
+### ডেস্কটপ অ্যাপ (BETA)
+
+OpenCode ডেস্কটপ অ্যাপ্লিকেশন হিসেবেও উপলব্ধ। সরাসরি [রিলিজ পেজ](https://github.com/anomalyco/opencode/releases) অথবা [opencode.ai/download](https://opencode.ai/download) থেকে ডাউনলোড করুন।
+
+| প্ল্যাটফর্ম | ডাউনলোড |
+| --------------------- | ------------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-darwin-aarch64.dmg` |
+| macOS (Intel) | `opencode-desktop-darwin-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, or AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### ইনস্টলেশন ডিরেক্টরি (Installation Directory)
+
+ইনস্টল স্ক্রিপ্টটি ইনস্টলেশন পাতের জন্য নিম্নলিখিত অগ্রাধিকার ক্রম মেনে চলে:
+
+1. `$OPENCODE_INSTALL_DIR` - কাস্টম ইনস্টলেশন ডিরেক্টরি
+2. `$XDG_BIN_DIR` - XDG বেস ডিরেক্টরি স্পেসিফিকেশন সমর্থিত পাথ
+3. `$HOME/bin` - সাধারণ ব্যবহারকারী বাইনারি ডিরেক্টরি (যদি বিদ্যমান থাকে বা তৈরি করা যায়)
+4. `$HOME/.opencode/bin` - ডিফল্ট ফলব্যাক
+
+```bash
+# উদাহরণ
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### এজেন্টস (Agents)
+
+OpenCode এ দুটি বিল্ট-ইন এজেন্ট রয়েছে যা আপনি `Tab` কি(key) দিয়ে পরিবর্তন করতে পারবেন।
+
+- **build** - ডিফল্ট, ডেভেলপমেন্টের কাজের জন্য সম্পূর্ণ অ্যাক্সেসযুক্ত এজেন্ট
+- **plan** - বিশ্লেষণ এবং কোড এক্সপ্লোরেশনের জন্য রিড-ওনলি এজেন্ট
+ - ডিফল্টভাবে ফাইল এডিট করতে দেয় না
+ - ব্যাশ কমান্ড চালানোর আগে অনুমতি চায়
+ - অপরিচিত কোডবেস এক্সপ্লোর করা বা পরিবর্তনের পরিকল্পনা করার জন্য আদর্শ
+
+এছাড়াও জটিল অনুসন্ধান এবং মাল্টিস্টেপ টাস্কের জন্য একটি **general** সাবএজেন্ট অন্তর্ভুক্ত রয়েছে।
+এটি অভ্যন্তরীণভাবে ব্যবহৃত হয় এবং মেসেজে `@general` লিখে ব্যবহার করা যেতে পারে।
+
+এজেন্টদের সম্পর্কে আরও জানুন: [docs](https://opencode.ai/docs/agents)।
+
+### ডকুমেন্টেশন (Documentation)
+
+কিভাবে OpenCode কনফিগার করবেন সে সম্পর্কে আরও তথ্যের জন্য, [**আমাদের ডকস দেখুন**](https://opencode.ai/docs)।
+
+### অবদান (Contributing)
+
+আপনি যদি OpenCode এ অবদান রাখতে চান, অনুগ্রহ করে একটি পুল রিকোয়েস্ট সাবমিট করার আগে আমাদের [কন্ট্রিবিউটিং ডকস](./CONTRIBUTING.md) পড়ে নিন।
+
+### OpenCode এর উপর বিল্ডিং (Building on OpenCode)
+
+আপনি যদি এমন প্রজেক্টে কাজ করেন যা OpenCode এর সাথে সম্পর্কিত এবং প্রজেক্টের নামের অংশ হিসেবে "opencode" ব্যবহার করেন, উদাহরণস্বরূপ "opencode-dashboard" বা "opencode-mobile", তবে দয়া করে আপনার README তে একটি নোট যোগ করে স্পষ্ট করুন যে এই প্রজেক্টটি OpenCode দল দ্বারা তৈরি হয়নি এবং আমাদের সাথে এর কোনো সরাসরি সম্পর্ক নেই।
+
+### সচরাচর জিজ্ঞাসিত প্রশ্নাবলী (FAQ)
+
+#### এটি ক্লড কোড (Claude Code) থেকে কীভাবে আলাদা?
+
+ক্যাপাবিলিটির দিক থেকে এটি ক্লড কোডের (Claude Code) মতই। এখানে মূল পার্থক্যগুলো দেওয়া হলো:
+
+- ১০০% ওপেন সোর্স
+- কোনো প্রোভাইডারের সাথে আবদ্ধ নয়। যদিও আমরা [OpenCode Zen](https://opencode.ai/zen) এর মাধ্যমে মডেলসমূহ ব্যবহারের পরামর্শ দিই, OpenCode ক্লড (Claude), ওপেনএআই (OpenAI), গুগল (Google), অথবা লোকাল মডেলগুলোর সাথেও ব্যবহার করা যেতে পারে। যেমন যেমন মডেলগুলো উন্নত হবে, তাদের মধ্যকার পার্থক্য কমে আসবে এবং দামও কমবে, তাই প্রোভাইডার-অজ্ঞাস্টিক হওয়া খুবই গুরুত্বপূর্ণ।
+- আউট-অফ-দ্য-বক্স LSP সাপোর্ট
+- TUI এর উপর ফোকাস। OpenCode নিওভিম (neovim) ব্যবহারকারী এবং [terminal.shop](https://terminal.shop) এর নির্মাতাদের দ্বারা তৈরি; আমরা টার্মিনালে কী কী সম্ভব তার সীমাবদ্ধতা ছাড়িয়ে যাওয়ার চেষ্টা করছি।
+- ক্লায়েন্ট/সার্ভার আর্কিটেকচার। এটি যেমন OpenCode কে আপনার কম্পিউটারে চালানোর সুযোগ দেয়, তেমনি আপনি মোবাইল অ্যাপ থেকে রিমোটলি এটি নিয়ন্ত্রণ করতে পারবেন, অর্থাৎ TUI ফ্রন্টএন্ড কেবল সম্ভাব্য ক্লায়েন্টগুলোর মধ্যে একটি।
+
+---
+
+**আমাদের কমিউনিটিতে যুক্ত হোন** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.br.md b/README.br.md
index 4802c4996..6044dad6c 100644
--- a/README.br.md
+++ b/README.br.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.bs.md b/README.bs.md
index 9ad685201..ef54a8369 100644
--- a/README.bs.md
+++ b/README.bs.md
@@ -33,7 +33,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.da.md b/README.da.md
index 4b1302dbc..3ffbbe820 100644
--- a/README.da.md
+++ b/README.da.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.de.md b/README.de.md
index 16116dc72..64c6628b4 100644
--- a/README.de.md
+++ b/README.de.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.es.md b/README.es.md
index 5c18ff4ac..875c8b083 100644
--- a/README.es.md
+++ b/README.es.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.fr.md b/README.fr.md
index 0382164be..254d38577 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.it.md b/README.it.md
index c966ccec4..b1f75c2d2 100644
--- a/README.it.md
+++ b/README.it.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.ja.md b/README.ja.md
index 11109e7eb..31d11dcf1 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.ko.md b/README.ko.md
index 23fea76b1..5f9de2cf3 100644
--- a/README.ko.md
+++ b/README.ko.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.md b/README.md
index 99b4b2c50..620415c96 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.no.md b/README.no.md
index 9b9e90dc3..125e18125 100644
--- a/README.no.md
+++ b/README.no.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.pl.md b/README.pl.md
index fced98dfc..61ef5870c 100644
--- a/README.pl.md
+++ b/README.pl.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.ru.md b/README.ru.md
index a7c590c16..fed1101c0 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.th.md b/README.th.md
index 0999167f2..01d68dd8d 100644
--- a/README.th.md
+++ b/README.th.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.tr.md b/README.tr.md
index 67f84e4dd..bfb18e1b4 100644
--- a/README.tr.md
+++ b/README.tr.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.uk.md b/README.uk.md
index 77e859a45..ed20fbf23 100644
--- a/README.uk.md
+++ b/README.uk.md
@@ -33,7 +33,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.zh.md b/README.zh.md
index 113d476b2..c6d1c1d11 100644
--- a/README.zh.md
+++ b/README.zh.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.zht.md b/README.zht.md
index b51810444..0dd44a9f0 100644
--- a/README.zht.md
+++ b/README.zht.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
From d0ce2950e4f53fa323391c011b4d51d85fe9678e Mon Sep 17 00:00:00 2001
From: "opencode-agent[bot]"
Date: Sat, 21 Feb 2026 00:18:43 +0000
Subject: [PATCH 2/9] chore: generate
---
README.bn.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.bn.md b/README.bn.md
index 6cf1f0fbd..a3ffdc0d8 100644
--- a/README.bn.md
+++ b/README.bn.md
@@ -66,7 +66,7 @@ nix run nixpkgs#opencode # or github:anomalyco/opencode for latest dev
OpenCode ডেস্কটপ অ্যাপ্লিকেশন হিসেবেও উপলব্ধ। সরাসরি [রিলিজ পেজ](https://github.com/anomalyco/opencode/releases) অথবা [opencode.ai/download](https://opencode.ai/download) থেকে ডাউনলোড করুন।
-| প্ল্যাটফর্ম | ডাউনলোড |
+| প্ল্যাটফর্ম | ডাউনলোড |
| --------------------- | ------------------------------------- |
| macOS (Apple Silicon) | `opencode-desktop-darwin-aarch64.dmg` |
| macOS (Intel) | `opencode-desktop-darwin-x64.dmg` |
From e77b2cfd61b02c369b1aa6a586761cde9d0dc53e Mon Sep 17 00:00:00 2001
From: Frank
Date: Fri, 20 Feb 2026 19:38:27 -0500
Subject: [PATCH 3/9] wip: zen lite
---
.../app/src/routes/workspace/[id]/model-section.tsx | 2 +-
.../app/src/routes/zen/lite/v1/chat/completions.ts | 12 ++++++++++++
packages/console/app/src/routes/zen/util/handler.ts | 3 ++-
.../app/src/routes/zen/v1/chat/completions.ts | 1 +
packages/console/app/src/routes/zen/v1/messages.ts | 1 +
packages/console/app/src/routes/zen/v1/models.ts | 2 +-
.../console/app/src/routes/zen/v1/models/[model].ts | 1 +
packages/console/app/src/routes/zen/v1/responses.ts | 1 +
packages/console/core/src/model.ts | 7 ++++---
9 files changed, 24 insertions(+), 6 deletions(-)
create mode 100644 packages/console/app/src/routes/zen/lite/v1/chat/completions.ts
diff --git a/packages/console/app/src/routes/workspace/[id]/model-section.tsx b/packages/console/app/src/routes/workspace/[id]/model-section.tsx
index 97f95278a..a4b64889c 100644
--- a/packages/console/app/src/routes/workspace/[id]/model-section.tsx
+++ b/packages/console/app/src/routes/workspace/[id]/model-section.tsx
@@ -36,7 +36,7 @@ const getModelsInfo = query(async (workspaceID: string) => {
"use server"
return withActor(async () => {
return {
- all: Object.entries(ZenData.list().models)
+ all: Object.entries(ZenData.list("full").models)
.filter(([id, _model]) => !["claude-3-5-haiku"].includes(id))
.filter(([id, _model]) => !id.startsWith("alpha-"))
.sort(([idA, modelA], [idB, modelB]) => {
diff --git a/packages/console/app/src/routes/zen/lite/v1/chat/completions.ts b/packages/console/app/src/routes/zen/lite/v1/chat/completions.ts
new file mode 100644
index 000000000..9a57e893f
--- /dev/null
+++ b/packages/console/app/src/routes/zen/lite/v1/chat/completions.ts
@@ -0,0 +1,12 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { handler } from "~/routes/zen/util/handler"
+
+export function POST(input: APIEvent) {
+ return handler(input, {
+ format: "oa-compat",
+ modelList: "lite",
+ parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
+ parseModel: (url: string, body: any) => body.model,
+ parseIsStream: (url: string, body: any) => !!body.stream,
+ })
+}
diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts
index ee717ba5f..5f2b51c21 100644
--- a/packages/console/app/src/routes/zen/util/handler.ts
+++ b/packages/console/app/src/routes/zen/util/handler.ts
@@ -44,6 +44,7 @@ export async function handler(
input: APIEvent,
opts: {
format: ZenData.Format
+ modelList: "lite" | "full"
parseApiKey: (headers: Headers) => string | undefined
parseModel: (url: string, body: any) => string
parseIsStream: (url: string, body: any) => boolean
@@ -77,7 +78,7 @@ export async function handler(
request: requestId,
client: ocClient,
})
- const zenData = ZenData.list()
+ const zenData = ZenData.list(opts.modelList)
const modelInfo = validateModel(zenData, model)
const dataDumper = createDataDumper(sessionId, requestId, projectId)
const trialLimiter = createTrialLimiter(modelInfo.trial, ip, ocClient)
diff --git a/packages/console/app/src/routes/zen/v1/chat/completions.ts b/packages/console/app/src/routes/zen/v1/chat/completions.ts
index 655459129..e9e05197e 100644
--- a/packages/console/app/src/routes/zen/v1/chat/completions.ts
+++ b/packages/console/app/src/routes/zen/v1/chat/completions.ts
@@ -4,6 +4,7 @@ import { handler } from "~/routes/zen/util/handler"
export function POST(input: APIEvent) {
return handler(input, {
format: "oa-compat",
+ modelList: "full",
parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
parseModel: (url: string, body: any) => body.model,
parseIsStream: (url: string, body: any) => !!body.stream,
diff --git a/packages/console/app/src/routes/zen/v1/messages.ts b/packages/console/app/src/routes/zen/v1/messages.ts
index 54d223f95..9c09315a6 100644
--- a/packages/console/app/src/routes/zen/v1/messages.ts
+++ b/packages/console/app/src/routes/zen/v1/messages.ts
@@ -4,6 +4,7 @@ import { handler } from "~/routes/zen/util/handler"
export function POST(input: APIEvent) {
return handler(input, {
format: "anthropic",
+ modelList: "full",
parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined,
parseModel: (url: string, body: any) => body.model,
parseIsStream: (url: string, body: any) => !!body.stream,
diff --git a/packages/console/app/src/routes/zen/v1/models.ts b/packages/console/app/src/routes/zen/v1/models.ts
index ee2b3ab54..f9c14eded 100644
--- a/packages/console/app/src/routes/zen/v1/models.ts
+++ b/packages/console/app/src/routes/zen/v1/models.ts
@@ -17,7 +17,7 @@ export async function OPTIONS(input: APIEvent) {
}
export async function GET(input: APIEvent) {
- const zenData = ZenData.list()
+ const zenData = ZenData.list("full")
const disabledModels = await authenticate()
return new Response(
diff --git a/packages/console/app/src/routes/zen/v1/models/[model].ts b/packages/console/app/src/routes/zen/v1/models/[model].ts
index b20378e37..a4edd5861 100644
--- a/packages/console/app/src/routes/zen/v1/models/[model].ts
+++ b/packages/console/app/src/routes/zen/v1/models/[model].ts
@@ -4,6 +4,7 @@ import { handler } from "~/routes/zen/util/handler"
export function POST(input: APIEvent) {
return handler(input, {
format: "google",
+ modelList: "full",
parseApiKey: (headers: Headers) => headers.get("x-goog-api-key") ?? undefined,
parseModel: (url: string, body: any) => url.split("/").pop()?.split(":")?.[0] ?? "",
parseIsStream: (url: string, body: any) =>
diff --git a/packages/console/app/src/routes/zen/v1/responses.ts b/packages/console/app/src/routes/zen/v1/responses.ts
index a82a667cc..cae625cf6 100644
--- a/packages/console/app/src/routes/zen/v1/responses.ts
+++ b/packages/console/app/src/routes/zen/v1/responses.ts
@@ -4,6 +4,7 @@ import { handler } from "~/routes/zen/util/handler"
export function POST(input: APIEvent) {
return handler(input, {
format: "openai",
+ modelList: "full",
parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
parseModel: (url: string, body: any) => body.model,
parseIsStream: (url: string, body: any) => !!body.stream,
diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts
index 6011cac37..e868b176e 100644
--- a/packages/console/core/src/model.ts
+++ b/packages/console/core/src/model.ts
@@ -73,6 +73,7 @@ export namespace ZenData {
const ModelsSchema = z.object({
models: z.record(z.string(), z.union([ModelSchema, z.array(ModelSchema.extend({ formatFilter: FormatSchema }))])),
+ liteModels: z.record(z.string(), ModelSchema),
providers: z.record(z.string(), ProviderSchema),
providerFamilies: z.record(z.string(), ProviderFamilySchema),
})
@@ -81,7 +82,7 @@ export namespace ZenData {
return input
})
- export const list = fn(z.void(), () => {
+ export const list = fn(z.enum(["lite", "full"]), (modelList) => {
const json = JSON.parse(
Resource.ZEN_MODELS1.value +
Resource.ZEN_MODELS2.value +
@@ -114,9 +115,9 @@ export namespace ZenData {
Resource.ZEN_MODELS29.value +
Resource.ZEN_MODELS30.value,
)
- const { models, providers, providerFamilies } = ModelsSchema.parse(json)
+ const { models, liteModels, providers, providerFamilies } = ModelsSchema.parse(json)
return {
- models,
+ models: modelList === "lite" ? liteModels : models,
providers: Object.fromEntries(
Object.entries(providers).map(([id, provider]) => [
id,
From b75a27d43e7b4d39621e7d6a00840e0a7d98e3b2 Mon Sep 17 00:00:00 2001
From: Adam <2363879+adamdotdevin@users.noreply.github.com>
Date: Fri, 20 Feb 2026 19:37:30 -0600
Subject: [PATCH 4/9] chore: cleanup
---
packages/ui/src/components/message-part.css | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css
index 3415c034c..07a718141 100644
--- a/packages/ui/src/components/message-part.css
+++ b/packages/ui/src/components/message-part.css
@@ -490,8 +490,10 @@
}
[data-component="edit-content"] {
+ border-radius: inherit;
border-top: 1px solid var(--border-weaker-base);
max-height: 420px;
+ overflow-x: hidden;
overflow-y: auto;
scrollbar-width: none;
@@ -500,15 +502,24 @@
&::-webkit-scrollbar {
display: none;
}
+
+ [data-component="diff"] {
+ border-radius: inherit;
+ overflow: hidden;
+ }
}
[data-component="write-content"] {
+ border-radius: inherit;
border-top: 1px solid var(--border-weaker-base);
max-height: 240px;
+ overflow-x: hidden;
overflow-y: auto;
[data-component="code"] {
- padding-bottom: 0px !important;
+ padding-bottom: 0 !important;
+ border-radius: inherit;
+ overflow: hidden;
}
/* Hide scrollbar */
@@ -1285,6 +1296,8 @@
}
[data-component="apply-patch-file-diff"] {
+ border-radius: inherit;
+ overflow-x: hidden;
overflow-y: auto;
scrollbar-width: none;
-ms-overflow-style: none;
@@ -1292,6 +1305,11 @@
&::-webkit-scrollbar {
display: none;
}
+
+ [data-component="diff"] {
+ border-radius: inherit;
+ overflow: hidden;
+ }
}
[data-component="tool-loaded-file"] {
From 6d58d899f711cb6f278ac02907ad4440d71b5184 Mon Sep 17 00:00:00 2001
From: Adam <2363879+adamdotdevin@users.noreply.github.com>
Date: Fri, 20 Feb 2026 19:44:06 -0600
Subject: [PATCH 5/9] fix: e2e test outdated
---
packages/app/e2e/selectors.ts | 3 ---
packages/app/e2e/settings/settings.spec.ts | 13 +++++--------
2 files changed, 5 insertions(+), 11 deletions(-)
diff --git a/packages/app/e2e/selectors.ts b/packages/app/e2e/selectors.ts
index be0bc0571..5fad2c06b 100644
--- a/packages/app/e2e/selectors.ts
+++ b/packages/app/e2e/selectors.ts
@@ -20,11 +20,8 @@ export const settingsNotificationsAgentSelector = '[data-action="settings-notifi
export const settingsNotificationsPermissionsSelector = '[data-action="settings-notifications-permissions"]'
export const settingsNotificationsErrorsSelector = '[data-action="settings-notifications-errors"]'
export const settingsSoundsAgentSelector = '[data-action="settings-sounds-agent"]'
-export const settingsSoundsAgentEnabledSelector = '[data-action="settings-sounds-agent-enabled"]'
export const settingsSoundsPermissionsSelector = '[data-action="settings-sounds-permissions"]'
-export const settingsSoundsPermissionsEnabledSelector = '[data-action="settings-sounds-permissions-enabled"]'
export const settingsSoundsErrorsSelector = '[data-action="settings-sounds-errors"]'
-export const settingsSoundsErrorsEnabledSelector = '[data-action="settings-sounds-errors-enabled"]'
export const settingsUpdatesStartupSelector = '[data-action="settings-updates-startup"]'
export const settingsReleaseNotesSelector = '[data-action="settings-release-notes"]'
diff --git a/packages/app/e2e/settings/settings.spec.ts b/packages/app/e2e/settings/settings.spec.ts
index 9fbcf79f5..c2a8522eb 100644
--- a/packages/app/e2e/settings/settings.spec.ts
+++ b/packages/app/e2e/settings/settings.spec.ts
@@ -9,7 +9,6 @@ import {
settingsNotificationsPermissionsSelector,
settingsReleaseNotesSelector,
settingsSoundsAgentSelector,
- settingsSoundsAgentEnabledSelector,
settingsSoundsErrorsSelector,
settingsSoundsPermissionsSelector,
settingsThemeSelector,
@@ -336,21 +335,19 @@ test("changing sound agent selection persists in localStorage", async ({ page, g
expect(stored?.sounds?.agent).not.toBe("staplebops-01")
})
-test("disabling agent sound disables sound selection", async ({ page, gotoSession }) => {
+test("selecting none disables agent sound", async ({ page, gotoSession }) => {
await gotoSession()
const dialog = await openSettings(page)
const select = dialog.locator(settingsSoundsAgentSelector)
- const switchContainer = dialog.locator(settingsSoundsAgentEnabledSelector)
const trigger = select.locator('[data-slot="select-select-trigger"]')
await expect(select).toBeVisible()
- await expect(switchContainer).toBeVisible()
await expect(trigger).toBeEnabled()
- await switchContainer.locator('[data-slot="switch-control"]').click()
- await page.waitForTimeout(100)
-
- await expect(trigger).toBeDisabled()
+ await trigger.click()
+ const items = page.locator('[data-slot="select-select-item"]')
+ await expect(items.first()).toBeVisible()
+ await items.first().click()
const stored = await page.evaluate((key) => {
const raw = localStorage.getItem(key)
From 206d81e02c5953f6652fdadfc69f5826943da08c Mon Sep 17 00:00:00 2001
From: Brendan Allan
Date: Sat, 21 Feb 2026 11:11:08 +0800
Subject: [PATCH 6/9] desktop: beta icon
---
packages/desktop/src-tauri/icons/README.md | 4 ++--
.../desktop/src-tauri/icons/beta/128x128.png | Bin 0 -> 10186 bytes
.../src-tauri/icons/beta/128x128@2x.png | Bin 0 -> 36252 bytes
.../desktop/src-tauri/icons/beta/32x32.png | Bin 0 -> 1309 bytes
.../desktop/src-tauri/icons/beta/64x64.png | Bin 0 -> 3587 bytes
.../src-tauri/icons/beta/Square107x107Logo.png | Bin 0 -> 7562 bytes
.../src-tauri/icons/beta/Square142x142Logo.png | Bin 0 -> 12279 bytes
.../src-tauri/icons/beta/Square150x150Logo.png | Bin 0 -> 13445 bytes
.../src-tauri/icons/beta/Square284x284Logo.png | Bin 0 -> 45201 bytes
.../src-tauri/icons/beta/Square30x30Logo.png | Bin 0 -> 1281 bytes
.../src-tauri/icons/beta/Square310x310Logo.png | Bin 0 -> 54725 bytes
.../src-tauri/icons/beta/Square44x44Logo.png | Bin 0 -> 2167 bytes
.../src-tauri/icons/beta/Square71x71Logo.png | Bin 0 -> 4121 bytes
.../src-tauri/icons/beta/Square89x89Logo.png | Bin 0 -> 5782 bytes
.../desktop/src-tauri/icons/beta/StoreLogo.png | Bin 0 -> 2559 bytes
.../android/mipmap-anydpi-v26/ic_launcher.xml | 5 +++++
.../beta/android/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2077 bytes
.../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 15269 bytes
.../android/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 1887 bytes
.../beta/android/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2083 bytes
.../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 7845 bytes
.../android/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 1792 bytes
.../beta/android/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5778 bytes
.../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 25523 bytes
.../android/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5026 bytes
.../beta/android/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 10758 bytes
.../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 60763 bytes
.../mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 9312 bytes
.../android/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 17122 bytes
.../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 116520 bytes
.../mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 14941 bytes
.../android/values/ic_launcher_background.xml | 4 ++++
.../desktop/src-tauri/icons/beta/icon.icns | Bin 0 -> 882048 bytes
packages/desktop/src-tauri/icons/beta/icon.ico | Bin 0 -> 49612 bytes
packages/desktop/src-tauri/icons/beta/icon.png | Bin 0 -> 172485 bytes
.../icons/beta/ios/AppIcon-20x20@1x.png | Bin 0 -> 687 bytes
.../icons/beta/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 1660 bytes
.../icons/beta/ios/AppIcon-20x20@2x.png | Bin 0 -> 1660 bytes
.../icons/beta/ios/AppIcon-20x20@3x.png | Bin 0 -> 2950 bytes
.../icons/beta/ios/AppIcon-29x29@1x.png | Bin 0 -> 1072 bytes
.../icons/beta/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 2834 bytes
.../icons/beta/ios/AppIcon-29x29@2x.png | Bin 0 -> 2834 bytes
.../icons/beta/ios/AppIcon-29x29@3x.png | Bin 0 -> 5048 bytes
.../icons/beta/ios/AppIcon-40x40@1x.png | Bin 0 -> 1660 bytes
.../icons/beta/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 4396 bytes
.../icons/beta/ios/AppIcon-40x40@2x.png | Bin 0 -> 4396 bytes
.../icons/beta/ios/AppIcon-40x40@3x.png | Bin 0 -> 8452 bytes
.../icons/beta/ios/AppIcon-512@2x.png | Bin 0 -> 596205 bytes
.../icons/beta/ios/AppIcon-60x60@2x.png | Bin 0 -> 8452 bytes
.../icons/beta/ios/AppIcon-60x60@3x.png | Bin 0 -> 16916 bytes
.../icons/beta/ios/AppIcon-76x76@1x.png | Bin 0 -> 4193 bytes
.../icons/beta/ios/AppIcon-76x76@2x.png | Bin 0 -> 12523 bytes
.../icons/beta/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 14760 bytes
.../desktop/src-tauri/tauri.beta.conf.json | 12 ++++++++++++
54 files changed, 23 insertions(+), 2 deletions(-)
create mode 100644 packages/desktop/src-tauri/icons/beta/128x128.png
create mode 100644 packages/desktop/src-tauri/icons/beta/128x128@2x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/32x32.png
create mode 100644 packages/desktop/src-tauri/icons/beta/64x64.png
create mode 100644 packages/desktop/src-tauri/icons/beta/Square107x107Logo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/Square142x142Logo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/Square150x150Logo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/Square284x284Logo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/Square30x30Logo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/Square310x310Logo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/Square44x44Logo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/Square71x71Logo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/Square89x89Logo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/StoreLogo.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-anydpi-v26/ic_launcher.xml
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher_foreground.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher_round.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher_foreground.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher_round.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher_foreground.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher_round.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher_foreground.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher_round.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher_foreground.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher_round.png
create mode 100644 packages/desktop/src-tauri/icons/beta/android/values/ic_launcher_background.xml
create mode 100644 packages/desktop/src-tauri/icons/beta/icon.icns
create mode 100644 packages/desktop/src-tauri/icons/beta/icon.ico
create mode 100644 packages/desktop/src-tauri/icons/beta/icon.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@1x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@2x-1.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@2x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@3x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@1x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@2x-1.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@2x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@3x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@1x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@2x-1.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@2x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@3x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-512@2x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-60x60@2x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-60x60@3x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-76x76@1x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-76x76@2x.png
create mode 100644 packages/desktop/src-tauri/icons/beta/ios/AppIcon-83.5x83.5@2x.png
diff --git a/packages/desktop/src-tauri/icons/README.md b/packages/desktop/src-tauri/icons/README.md
index db86593cc..fa219a77e 100644
--- a/packages/desktop/src-tauri/icons/README.md
+++ b/packages/desktop/src-tauri/icons/README.md
@@ -3,8 +3,8 @@
Here's the process I've been using to create icons:
- Save source image as `app-icon.png` in `packages/desktop`
-- `cd` to `src-tauri`
-- Run `bun tauri icons -o icons/{environment}`
+- `cd` to `packages/desktop`
+- Run `bun tauri icon -o src-tauri/icons/{environment}`
- Use [Image2Icon](https://img2icnsapp.com/)'s 'Big Sur Icon' preset to generate an `icon.icns` file and place it in the appropriate icons folder
The Image2Icon step is necessary as the `icon.icns` generated by `app-icon.png` does not apply the shadow/padding expected by macOS,
diff --git a/packages/desktop/src-tauri/icons/beta/128x128.png b/packages/desktop/src-tauri/icons/beta/128x128.png
new file mode 100644
index 0000000000000000000000000000000000000000..751e80f1fda6c870e534f66fdbb28064932ea3fb
GIT binary patch
literal 10186
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
Ef}l4+Jpcdz
literal 0
HcmV?d00001
diff --git a/packages/desktop/src-tauri/icons/beta/128x128@2x.png b/packages/desktop/src-tauri/icons/beta/128x128@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe330df419aae7dbbe375a9a2b8e7488e95e5c40
GIT binary patch
literal 36252
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