diff --git a/.cnb/env.d.ts b/.cnb/env.d.ts
new file mode 100644
index 0000000000000..28dba9fcb0e6e
--- /dev/null
+++ b/.cnb/env.d.ts
@@ -0,0 +1,17 @@
+declare namespace NodeJS {
+ interface ProcessEnv {
+ CNB_API_ENDPOINT?: string;
+ CNB_WEB_ENDPOINT?: string;
+ CNB_TOKEN?: string;
+ CNB_REPO_SLUG?: string;
+ CNB_ISSUE_IID?: string;
+ CNB_PULL_REQUEST_IID?: string;
+ CNB_COMMENT_BODY?: string;
+ CNB_NPC_NAME?: string;
+ CNB_NPC_PROMPT?: string;
+ CNB_NPC_SLUG?: string;
+ CNB_USER_TYPE?: string;
+ CNB_USER_NAME?: string;
+ CNB_USER_NICKNAME?: string;
+ }
+}
diff --git a/.github/workflows/sync-cnb.yml b/.github/workflows/sync-cnb.yml
new file mode 100644
index 0000000000000..e0a3959317c31
--- /dev/null
+++ b/.github/workflows/sync-cnb.yml
@@ -0,0 +1,21 @@
+# .github/workflows/sync-cnb.yml
+
+name: Sync to CNB
+on: [push]
+
+jobs:
+ sync:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Sync to CNB Repository
+ uses: docker://tencentcom/git-sync
+ env:
+ PLUGIN_TARGET_URL: "https://cnb.cool/soucod-github/soucod/openclaw.git"
+ PLUGIN_AUTH_TYPE: "https"
+ PLUGIN_USERNAME: "cnb"
+ PLUGIN_PASSWORD: ${{ secrets.GIT_PASSWORD }}
+ PLUGIN_FORCE: "true"
diff --git a/.openclaw/openclaw.json b/.openclaw/openclaw.json
new file mode 100644
index 0000000000000..578ea1cdc1f21
--- /dev/null
+++ b/.openclaw/openclaw.json
@@ -0,0 +1,80 @@
+{
+ "models": {
+ "mode": "merge",
+ "providers": {
+ "cnb": {
+ "baseUrl": "${CNB_API_ENDPOINT}/${CNB_REPO_SLUG}/-/ai/",
+ "apiKey": "${CNB_TOKEN}",
+ "api": "openai-completions",
+ "models": [
+ {
+ "id": "auto",
+ "name": "CNB-Models",
+ "reasoning": true,
+ "input": [
+ "text"
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "agents": {
+ "defaults": {
+ "model": {
+ "primary": "cnb/auto"
+ },
+ "workspace": "/workspace/clawd",
+ "compaction": {
+ "mode": "safeguard"
+ },
+ "maxConcurrent": 4,
+ "subagents": {
+ "maxConcurrent": 8
+ }
+ }
+ },
+ "tools": {
+ "web": {
+ "search": {
+ "enabled": false
+ },
+ "fetch": {
+ "enabled": true
+ }
+ },
+ "agentToAgent": {
+ "enabled": true
+ },
+ "elevated": {
+ "enabled": true
+ },
+ "exec": {
+ "applyPatch": {
+ "enabled": true
+ }
+ }
+ },
+ "gateway": {
+ "mode": "local",
+ "auth": {
+ "mode": "token",
+ "token": "${CNB_TOKEN}"
+ },
+ "port": 18789,
+ "bind": "lan",
+ "tailscale": {
+ "mode": "off",
+ "resetOnExit": false
+ },
+ "controlUi": {
+ "enabled": true,
+ "allowInsecureAuth": true
+ }
+ },
+ "skills": {
+ "install": {
+ "nodeManager": "npm"
+ }
+ }
+}
diff --git a/.specstory/.gitignore b/.specstory/.gitignore
new file mode 100644
index 0000000000000..7565e341ad318
--- /dev/null
+++ b/.specstory/.gitignore
@@ -0,0 +1,2 @@
+# SpecStory project identity file
+/.project.json
diff --git a/Dockerfile b/Dockerfile
index 4282aff591aa3..678c4cac55695 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -59,6 +59,12 @@ ARG OPENCLAW_DOCKER_BUILD_SKIP_DTS
# Copy pinned Bun binary from the official image instead of fetching via curl.
COPY --from=bun-binary /usr/local/bin/bun /usr/local/bin/bun
+# Install nginx for reverse proxy (required by cnb.cool cloud environment)
+RUN apt-get update && \
+ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends nginx && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
+
RUN corepack enable
WORKDIR /app
diff --git a/NPC.yml b/NPC.yml
new file mode 100644
index 0000000000000..c582420a09d0e
--- /dev/null
+++ b/NPC.yml
@@ -0,0 +1,10 @@
+.npc: &npc
+ - docker:
+ image: node:24
+ stages:
+ - name: run openclaw
+ image: docker.cnb.cool/soucod-github/soucod/openclaw:latest
+
+$:
+ issue.comment@npc: *npc
+ pull_request.comment@npc: *npc
diff --git a/docs/assets/openclaw-logo-text-dark.svg b/docs/assets/openclaw-logo-text-dark.svg
index 317a203c8a421..f46bfa96bb853 100644
--- a/docs/assets/openclaw-logo-text-dark.svg
+++ b/docs/assets/openclaw-logo-text-dark.svg
@@ -1,418 +1 @@
-
-
-
-
+
\ No newline at end of file
diff --git a/docs/assets/openclaw-logo-text.svg b/docs/assets/openclaw-logo-text.svg
index 34038af7b3ec4..f085afba80dbb 100644
--- a/docs/assets/openclaw-logo-text.svg
+++ b/docs/assets/openclaw-logo-text.svg
@@ -1,418 +1 @@
-
-
-
-
+
\ No newline at end of file
diff --git a/docs/assets/pixel-lobster.svg b/docs/assets/pixel-lobster.svg
index 7bfb7fc4d47a8..c72771ce6f8b6 100644
--- a/docs/assets/pixel-lobster.svg
+++ b/docs/assets/pixel-lobster.svg
@@ -1,60 +1 @@
-
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/blacksmith-light.svg b/docs/assets/sponsors/blacksmith-light.svg
index 1b808db0ba431..91483ced13b87 100644
--- a/docs/assets/sponsors/blacksmith-light.svg
+++ b/docs/assets/sponsors/blacksmith-light.svg
@@ -1,14 +1 @@
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/blacksmith.svg b/docs/assets/sponsors/blacksmith.svg
index 5bb1bc2e72c82..0059bee4a82b7 100644
--- a/docs/assets/sponsors/blacksmith.svg
+++ b/docs/assets/sponsors/blacksmith.svg
@@ -1,14 +1 @@
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/convex-light.svg b/docs/assets/sponsors/convex-light.svg
index 1a64a3a63cb91..92ec2d7531c4a 100644
--- a/docs/assets/sponsors/convex-light.svg
+++ b/docs/assets/sponsors/convex-light.svg
@@ -1,16 +1 @@
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/convex.svg b/docs/assets/sponsors/convex.svg
index bd884e9ba65eb..e69de29bb2d1d 100644
--- a/docs/assets/sponsors/convex.svg
+++ b/docs/assets/sponsors/convex.svg
@@ -1,16 +0,0 @@
-
diff --git a/docs/assets/sponsors/github-light.svg b/docs/assets/sponsors/github-light.svg
index e01346c8eac96..16ecdf3b68df6 100644
--- a/docs/assets/sponsors/github-light.svg
+++ b/docs/assets/sponsors/github-light.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/github.svg b/docs/assets/sponsors/github.svg
index 8dd9ef6323cc8..3c62bce7a3beb 100644
--- a/docs/assets/sponsors/github.svg
+++ b/docs/assets/sponsors/github.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/nvidia-dark.svg b/docs/assets/sponsors/nvidia-dark.svg
index e890314f9f471..821ad417bfa45 100644
--- a/docs/assets/sponsors/nvidia-dark.svg
+++ b/docs/assets/sponsors/nvidia-dark.svg
@@ -1,9 +1 @@
-
-
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/nvidia.svg b/docs/assets/sponsors/nvidia.svg
index b6d82b8836587..530a68dbe92a0 100644
--- a/docs/assets/sponsors/nvidia.svg
+++ b/docs/assets/sponsors/nvidia.svg
@@ -1,9 +1 @@
-
-
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/openai-light.svg b/docs/assets/sponsors/openai-light.svg
index 66021ba9b2d44..9b8594c4d40b7 100644
--- a/docs/assets/sponsors/openai-light.svg
+++ b/docs/assets/sponsors/openai-light.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/openai.svg b/docs/assets/sponsors/openai.svg
index 1c3491b9be963..a67b41349480b 100644
--- a/docs/assets/sponsors/openai.svg
+++ b/docs/assets/sponsors/openai.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/vercel-light.svg b/docs/assets/sponsors/vercel-light.svg
index 7af4f4a1f1358..8446ce500e5b6 100644
--- a/docs/assets/sponsors/vercel-light.svg
+++ b/docs/assets/sponsors/vercel-light.svg
@@ -1,5 +1 @@
-
+
\ No newline at end of file
diff --git a/docs/assets/sponsors/vercel.svg b/docs/assets/sponsors/vercel.svg
index d77a5448727f5..ee5f46f6f2eee 100644
--- a/docs/assets/sponsors/vercel.svg
+++ b/docs/assets/sponsors/vercel.svg
@@ -1,5 +1 @@
-
+
\ No newline at end of file
diff --git a/docs/images/groups-flow.svg b/docs/images/groups-flow.svg
index 06189ff07b857..68596831406ff 100644
--- a/docs/images/groups-flow.svg
+++ b/docs/images/groups-flow.svg
@@ -1,52 +1 @@
-
+
\ No newline at end of file
diff --git a/start.sh b/start.sh
new file mode 100644
index 0000000000000..79ec96d5e28d0
--- /dev/null
+++ b/start.sh
@@ -0,0 +1,102 @@
+#!/bin/bash
+
+set -e
+
+# Docker 镜像中 openclaw 的安装目录
+# cnb.cool 会 clone 仓库到工作目录,但 dist/ 目录只存在于镜像的 /app 中
+OPENCLAW_DIR="/app"
+
+# 复制配置文件到 openclaw 默认配置目录
+mkdir -p ~/.openclaw
+cp "${OPENCLAW_DIR}/openclaw.json" ~/.openclaw/openclaw.json
+
+# 配置 nginx 反向代理
+cat > /etc/nginx/nginx.conf < openclaw.log 2>&1 &
+
+PID=$!
+echo "[openclaw] started, pid=$PID"
+
+# 健康检查:等待服务启动
+for i in {1..120}; do
+ if curl -sf http://127.0.0.1:18789 >/dev/null; then
+ echo "[openclaw] service is up"
+ exit 0
+ fi
+ sleep 1
+done
+
+echo "[openclaw] startup timeout"
+# 输出日志帮助调试
+echo "[openclaw] last 50 lines of log:"
+tail -50 openclaw.log 2>/dev/null || echo "[openclaw] no log file found"
+exit 1
diff --git a/ui/public/favicon.svg b/ui/public/favicon.svg
index dfa44629a24f0..9850e789f29a0 100644
--- a/ui/public/favicon.svg
+++ b/ui/public/favicon.svg
@@ -1,54 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-abacus.svg b/ui/public/provider-icons/ProviderIcon-abacus.svg
index 541686bac1774..f5373da9cb469 100644
--- a/ui/public/provider-icons/ProviderIcon-abacus.svg
+++ b/ui/public/provider-icons/ProviderIcon-abacus.svg
@@ -1,17 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-alibaba.svg b/ui/public/provider-icons/ProviderIcon-alibaba.svg
index dce0fb9dabf0d..aea54e21a3198 100644
--- a/ui/public/provider-icons/ProviderIcon-alibaba.svg
+++ b/ui/public/provider-icons/ProviderIcon-alibaba.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-amp.svg b/ui/public/provider-icons/ProviderIcon-amp.svg
index 0af722e0bc4ab..26b6a63d12364 100644
--- a/ui/public/provider-icons/ProviderIcon-amp.svg
+++ b/ui/public/provider-icons/ProviderIcon-amp.svg
@@ -1,6 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-antigravity.svg b/ui/public/provider-icons/ProviderIcon-antigravity.svg
index a915939711b89..4b55bd6e9450f 100644
--- a/ui/public/provider-icons/ProviderIcon-antigravity.svg
+++ b/ui/public/provider-icons/ProviderIcon-antigravity.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-augment.svg b/ui/public/provider-icons/ProviderIcon-augment.svg
index b88ab8f245083..e2af9c0a6cb31 100644
--- a/ui/public/provider-icons/ProviderIcon-augment.svg
+++ b/ui/public/provider-icons/ProviderIcon-augment.svg
@@ -1,15 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-bedrock.svg b/ui/public/provider-icons/ProviderIcon-bedrock.svg
index 9b5f823e0e9ff..ecb0cad63038c 100644
--- a/ui/public/provider-icons/ProviderIcon-bedrock.svg
+++ b/ui/public/provider-icons/ProviderIcon-bedrock.svg
@@ -1,7 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-chutes.svg b/ui/public/provider-icons/ProviderIcon-chutes.svg
index f30860b1a49ec..c53c601473461 100644
--- a/ui/public/provider-icons/ProviderIcon-chutes.svg
+++ b/ui/public/provider-icons/ProviderIcon-chutes.svg
@@ -1,6 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-claude.svg b/ui/public/provider-icons/ProviderIcon-claude.svg
index 9f66bdbb44af7..ea56391de3123 100644
--- a/ui/public/provider-icons/ProviderIcon-claude.svg
+++ b/ui/public/provider-icons/ProviderIcon-claude.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-clawrouter.svg b/ui/public/provider-icons/ProviderIcon-clawrouter.svg
index f8718f87e971d..0b3a198037427 100644
--- a/ui/public/provider-icons/ProviderIcon-clawrouter.svg
+++ b/ui/public/provider-icons/ProviderIcon-clawrouter.svg
@@ -1,7 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-codebuff.svg b/ui/public/provider-icons/ProviderIcon-codebuff.svg
index 6d5f9e4550413..938a157d10e3d 100644
--- a/ui/public/provider-icons/ProviderIcon-codebuff.svg
+++ b/ui/public/provider-icons/ProviderIcon-codebuff.svg
@@ -1,4 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-commandcode.svg b/ui/public/provider-icons/ProviderIcon-commandcode.svg
index eb48c4358a006..d89cb00b7993b 100644
--- a/ui/public/provider-icons/ProviderIcon-commandcode.svg
+++ b/ui/public/provider-icons/ProviderIcon-commandcode.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-crof.svg b/ui/public/provider-icons/ProviderIcon-crof.svg
index fdde018b8f401..92533694b26b6 100644
--- a/ui/public/provider-icons/ProviderIcon-crof.svg
+++ b/ui/public/provider-icons/ProviderIcon-crof.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-crossmodel.svg b/ui/public/provider-icons/ProviderIcon-crossmodel.svg
index e7634bd5cddbc..e3271108b5ecf 100644
--- a/ui/public/provider-icons/ProviderIcon-crossmodel.svg
+++ b/ui/public/provider-icons/ProviderIcon-crossmodel.svg
@@ -1,5 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-deepseek.svg b/ui/public/provider-icons/ProviderIcon-deepseek.svg
index 72020f9ad3646..f3f76cccbaa93 100644
--- a/ui/public/provider-icons/ProviderIcon-deepseek.svg
+++ b/ui/public/provider-icons/ProviderIcon-deepseek.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-devin.svg b/ui/public/provider-icons/ProviderIcon-devin.svg
index e2b1cd5f678e1..61d16f8fabe93 100644
--- a/ui/public/provider-icons/ProviderIcon-devin.svg
+++ b/ui/public/provider-icons/ProviderIcon-devin.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-doubao.svg b/ui/public/provider-icons/ProviderIcon-doubao.svg
index 9c20430a1cdc4..787113dbabe21 100644
--- a/ui/public/provider-icons/ProviderIcon-doubao.svg
+++ b/ui/public/provider-icons/ProviderIcon-doubao.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-factory.svg b/ui/public/provider-icons/ProviderIcon-factory.svg
index f7807d8abe9ad..aafa31ce7bd27 100644
--- a/ui/public/provider-icons/ProviderIcon-factory.svg
+++ b/ui/public/provider-icons/ProviderIcon-factory.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-grok.svg b/ui/public/provider-icons/ProviderIcon-grok.svg
index 92ebe354af66a..6e420dfe90b9c 100644
--- a/ui/public/provider-icons/ProviderIcon-grok.svg
+++ b/ui/public/provider-icons/ProviderIcon-grok.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-groq.svg b/ui/public/provider-icons/ProviderIcon-groq.svg
index 9ed9259861ae3..31407efd3e39e 100644
--- a/ui/public/provider-icons/ProviderIcon-groq.svg
+++ b/ui/public/provider-icons/ProviderIcon-groq.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-jetbrains.svg b/ui/public/provider-icons/ProviderIcon-jetbrains.svg
index f3ea51604bd80..fb47bb09bb8c7 100644
--- a/ui/public/provider-icons/ProviderIcon-jetbrains.svg
+++ b/ui/public/provider-icons/ProviderIcon-jetbrains.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-kilo.svg b/ui/public/provider-icons/ProviderIcon-kilo.svg
index 8ac89bf534676..abdac76e751b8 100644
--- a/ui/public/provider-icons/ProviderIcon-kilo.svg
+++ b/ui/public/provider-icons/ProviderIcon-kilo.svg
@@ -1,5 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-kimi.svg b/ui/public/provider-icons/ProviderIcon-kimi.svg
index 77cba2eacd8b3..d21f26693bcfb 100644
--- a/ui/public/provider-icons/ProviderIcon-kimi.svg
+++ b/ui/public/provider-icons/ProviderIcon-kimi.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-kiro.svg b/ui/public/provider-icons/ProviderIcon-kiro.svg
index d89f122131d35..5cc8004b4ac85 100644
--- a/ui/public/provider-icons/ProviderIcon-kiro.svg
+++ b/ui/public/provider-icons/ProviderIcon-kiro.svg
@@ -1,13 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-litellm.svg b/ui/public/provider-icons/ProviderIcon-litellm.svg
index 3a6c20b880397..304f0dcd70da4 100644
--- a/ui/public/provider-icons/ProviderIcon-litellm.svg
+++ b/ui/public/provider-icons/ProviderIcon-litellm.svg
@@ -1,16 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-llmproxy.svg b/ui/public/provider-icons/ProviderIcon-llmproxy.svg
index 812831dcacca8..2f516c573c8e5 100644
--- a/ui/public/provider-icons/ProviderIcon-llmproxy.svg
+++ b/ui/public/provider-icons/ProviderIcon-llmproxy.svg
@@ -1,7 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-manus.svg b/ui/public/provider-icons/ProviderIcon-manus.svg
index fcfd81daf9a3e..7b30a4c403965 100644
--- a/ui/public/provider-icons/ProviderIcon-manus.svg
+++ b/ui/public/provider-icons/ProviderIcon-manus.svg
@@ -1,6 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-mimo.svg b/ui/public/provider-icons/ProviderIcon-mimo.svg
index 50b1b8e3e4e3d..976310e97461d 100644
--- a/ui/public/provider-icons/ProviderIcon-mimo.svg
+++ b/ui/public/provider-icons/ProviderIcon-mimo.svg
@@ -1,4 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-minimax.svg b/ui/public/provider-icons/ProviderIcon-minimax.svg
index 9055daed6aa13..82866be8d3384 100644
--- a/ui/public/provider-icons/ProviderIcon-minimax.svg
+++ b/ui/public/provider-icons/ProviderIcon-minimax.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-mistral.svg b/ui/public/provider-icons/ProviderIcon-mistral.svg
index c946b52252742..785c02adc48fd 100644
--- a/ui/public/provider-icons/ProviderIcon-mistral.svg
+++ b/ui/public/provider-icons/ProviderIcon-mistral.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-ollama.svg b/ui/public/provider-icons/ProviderIcon-ollama.svg
index 92efd117e8cc0..3c46f4fec552f 100644
--- a/ui/public/provider-icons/ProviderIcon-ollama.svg
+++ b/ui/public/provider-icons/ProviderIcon-ollama.svg
@@ -1,7 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-opencode.svg b/ui/public/provider-icons/ProviderIcon-opencode.svg
index eaebc91bd5b94..514d4e2c749c0 100644
--- a/ui/public/provider-icons/ProviderIcon-opencode.svg
+++ b/ui/public/provider-icons/ProviderIcon-opencode.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-opencodego.svg b/ui/public/provider-icons/ProviderIcon-opencodego.svg
index eaebc91bd5b94..514d4e2c749c0 100644
--- a/ui/public/provider-icons/ProviderIcon-opencodego.svg
+++ b/ui/public/provider-icons/ProviderIcon-opencodego.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-openrouter.svg b/ui/public/provider-icons/ProviderIcon-openrouter.svg
index 94e78feeed446..de4ae94429ba1 100644
--- a/ui/public/provider-icons/ProviderIcon-openrouter.svg
+++ b/ui/public/provider-icons/ProviderIcon-openrouter.svg
@@ -1,13 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-perplexity.svg b/ui/public/provider-icons/ProviderIcon-perplexity.svg
index d869791b2c8a6..855f61d5a9a04 100644
--- a/ui/public/provider-icons/ProviderIcon-perplexity.svg
+++ b/ui/public/provider-icons/ProviderIcon-perplexity.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-poe.svg b/ui/public/provider-icons/ProviderIcon-poe.svg
index 5e654565f3ca2..b2e2536b70120 100644
--- a/ui/public/provider-icons/ProviderIcon-poe.svg
+++ b/ui/public/provider-icons/ProviderIcon-poe.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-sakana.svg b/ui/public/provider-icons/ProviderIcon-sakana.svg
index 5e199bb74f801..09fb7ec9a8052 100644
--- a/ui/public/provider-icons/ProviderIcon-sakana.svg
+++ b/ui/public/provider-icons/ProviderIcon-sakana.svg
@@ -1,5 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-stepfun.svg b/ui/public/provider-icons/ProviderIcon-stepfun.svg
index 01ee0e40dd065..e2339d3e28f05 100644
--- a/ui/public/provider-icons/ProviderIcon-stepfun.svg
+++ b/ui/public/provider-icons/ProviderIcon-stepfun.svg
@@ -1,32 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-synthetic.svg b/ui/public/provider-icons/ProviderIcon-synthetic.svg
index b50f4da2cc467..e4dd6ea71cb45 100644
--- a/ui/public/provider-icons/ProviderIcon-synthetic.svg
+++ b/ui/public/provider-icons/ProviderIcon-synthetic.svg
@@ -1,14 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-venice.svg b/ui/public/provider-icons/ProviderIcon-venice.svg
index 31408ddf783f9..580788bcbc121 100644
--- a/ui/public/provider-icons/ProviderIcon-venice.svg
+++ b/ui/public/provider-icons/ProviderIcon-venice.svg
@@ -1,4 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-vertexai.svg b/ui/public/provider-icons/ProviderIcon-vertexai.svg
index ae255273e19b5..06a9ffbfbc025 100644
--- a/ui/public/provider-icons/ProviderIcon-vertexai.svg
+++ b/ui/public/provider-icons/ProviderIcon-vertexai.svg
@@ -1,6 +1 @@
-
+
\ No newline at end of file
diff --git a/ui/public/provider-icons/ProviderIcon-zed.svg b/ui/public/provider-icons/ProviderIcon-zed.svg
index fdb37112bcc5c..bd1751ff3b1a1 100644
--- a/ui/public/provider-icons/ProviderIcon-zed.svg
+++ b/ui/public/provider-icons/ProviderIcon-zed.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file