diff --git a/AGENTS.md b/AGENTS.md
index aab608e..3975391 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -2,7 +2,7 @@
## 项目
-本仓库包含 SenlinAI 项目工作台 MVP。
+本仓库包含森林AI项目工作台 MVP。
该产品是一个以项目为中心、面向私有化部署的工作台,服务于个人知识工作者、团队负责人和可信的内部用户。它用于组织项目任务、inbox 条目、Markdown 笔记、文件、AI 会话、项目内标签,以及轻量级任务分发。
diff --git a/README.md b/README.md
index 3b51685..6135f41 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-# SenlinAI Agent Workbench
+# 森林AI
-SenlinAI Agent Workbench 是一个以项目为中心的私有化工作台 MVP。
+森林AI 是一个以项目为中心的私有化工作台 MVP。
## 本地开发
diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml
index 6bf3e63..2b83110 100644
--- a/apps/desktop/src-tauri/Cargo.toml
+++ b/apps/desktop/src-tauri/Cargo.toml
@@ -1,8 +1,8 @@
[package]
name = "senlinai_workbench"
version = "0.1.0"
-description = "SenlinAI project workbench desktop shell"
-authors = ["SenlinAI"]
+description = "森林AI 项目工作台桌面端"
+authors = ["森林AI"]
edition = "2021"
[lib]
diff --git a/apps/desktop/src-tauri/icons/128x128.png b/apps/desktop/src-tauri/icons/128x128.png
new file mode 100644
index 0000000..e54c249
Binary files /dev/null and b/apps/desktop/src-tauri/icons/128x128.png differ
diff --git a/apps/desktop/src-tauri/icons/128x128@2x.png b/apps/desktop/src-tauri/icons/128x128@2x.png
new file mode 100644
index 0000000..2d620ac
Binary files /dev/null and b/apps/desktop/src-tauri/icons/128x128@2x.png differ
diff --git a/apps/desktop/src-tauri/icons/32x32.png b/apps/desktop/src-tauri/icons/32x32.png
new file mode 100644
index 0000000..c843a55
Binary files /dev/null and b/apps/desktop/src-tauri/icons/32x32.png differ
diff --git a/apps/desktop/src-tauri/icons/icon.icns b/apps/desktop/src-tauri/icons/icon.icns
new file mode 100644
index 0000000..a21bda4
Binary files /dev/null and b/apps/desktop/src-tauri/icons/icon.icns differ
diff --git a/apps/desktop/src-tauri/icons/icon.ico b/apps/desktop/src-tauri/icons/icon.ico
index e0c73af..2a5bb4b 100644
Binary files a/apps/desktop/src-tauri/icons/icon.ico and b/apps/desktop/src-tauri/icons/icon.ico differ
diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs
index 413e3fd..060dbf9 100644
--- a/apps/desktop/src-tauri/src/lib.rs
+++ b/apps/desktop/src-tauri/src/lib.rs
@@ -3,5 +3,5 @@ pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_opener::init())
.run(tauri::generate_context!())
- .expect("error while running SenlinAI Workbench");
+ .expect("启动森林AI时发生错误");
}
diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json
index 71d7b61..5c877b5 100644
--- a/apps/desktop/src-tauri/tauri.conf.json
+++ b/apps/desktop/src-tauri/tauri.conf.json
@@ -1,6 +1,6 @@
{
"$schema": "https://schema.tauri.app/config/2",
- "productName": "SenlinAI Workbench",
+ "productName": "森林AI",
"version": "0.1.0",
"identifier": "ai.senlin.workbench",
"build": {
@@ -12,7 +12,7 @@
"app": {
"windows": [
{
- "title": "项目工作台",
+ "title": "森林AI",
"width": 1280,
"height": 820
}
@@ -24,6 +24,12 @@
"bundle": {
"active": true,
"targets": "all",
- "icon": ["icons/icon.ico"]
+ "icon": [
+ "icons/32x32.png",
+ "icons/128x128.png",
+ "icons/128x128@2x.png",
+ "icons/icon.icns",
+ "icons/icon.ico"
+ ]
}
}
diff --git a/apps/web_v1/README.md b/apps/web_v1/README.md
index c086495..f963b5a 100644
--- a/apps/web_v1/README.md
+++ b/apps/web_v1/README.md
@@ -1,6 +1,6 @@
-# SenlinAI Acro React
+# 森林AI Web 客户端
-SenlinAI primary web client built with React, TypeScript, Vite, and Arco Design.
+森林AI主 Web 客户端,使用 React、TypeScript、Vite 和 Arco Design 构建。
This app is the active web client under `apps/web_v1`.
diff --git a/apps/web_v1/index.html b/apps/web_v1/index.html
index c80d6e3..7075a74 100644
--- a/apps/web_v1/index.html
+++ b/apps/web_v1/index.html
@@ -1,10 +1,12 @@
-
+
-
+
- web_v1
+
+
+ 森林AI
diff --git a/apps/web_v1/public/favicon.svg b/apps/web_v1/public/favicon.svg
index 6893eb1..dc3662b 100644
--- a/apps/web_v1/public/favicon.svg
+++ b/apps/web_v1/public/favicon.svg
@@ -1 +1,10 @@
-
\ No newline at end of file
+
diff --git a/apps/web_v1/public/senlinai-icon.svg b/apps/web_v1/public/senlinai-icon.svg
new file mode 100644
index 0000000..dc3662b
--- /dev/null
+++ b/apps/web_v1/public/senlinai-icon.svg
@@ -0,0 +1,10 @@
+
diff --git a/apps/web_v1/scripts/structure-check.mjs b/apps/web_v1/scripts/structure-check.mjs
index 11b5fa6..13bef57 100644
--- a/apps/web_v1/scripts/structure-check.mjs
+++ b/apps/web_v1/scripts/structure-check.mjs
@@ -25,6 +25,23 @@ const requiredFiles = [
const failures = requiredFiles.filter((file) => !existsSync(file)).map((file) => `missing ${file}`)
+const html = readFileSync('index.html', 'utf8')
+if (!html.includes('')) failures.push('index language must be zh-CN')
+if (!html.includes('森林AI')) failures.push('document title must be 森林AI')
+if (!html.includes('href="/senlinai-icon.svg"')) failures.push('favicon must use /senlinai-icon.svg')
+if (!existsSync('public/senlinai-icon.svg')) failures.push('missing public/senlinai-icon.svg')
+
+for (const file of ['src/pages/login.tsx', 'src/pages/projects/project-topbar.tsx', 'src/pages/projects/project-rail.tsx']) {
+ const source = readFileSync(file, 'utf8')
+ if (!source.includes('/senlinai-icon.svg')) failures.push(`${file} must use the brand icon`)
+}
+
+for (const forbidden of ['森林Agent', 'SenlinAI Workbench']) {
+ for (const file of requiredFiles.filter((name) => name.endsWith('.tsx'))) {
+ if (readFileSync(file, 'utf8').includes(forbidden)) failures.push(`${file} contains legacy product name ${forbidden}`)
+ }
+}
+
if (existsSync('src/App.tsx')) {
failures.push('legacy src/App.tsx should be removed after page split')
}
diff --git a/apps/web_v1/src/App.css b/apps/web_v1/src/App.css
index bce5986..74b45ea 100644
--- a/apps/web_v1/src/App.css
+++ b/apps/web_v1/src/App.css
@@ -113,23 +113,23 @@
gap: 16px;
}
-.brand-symbol {
+.brand-icon {
width: 32px;
height: 32px;
- display: grid;
- place-items: center;
+ display: block;
border-radius: 8px;
- background: var(--senlin-primary);
- color: white;
- font-weight: 800;
- font-size: 18px;
}
-.brand-lockup.large .brand-symbol {
+.brand-lockup.large .brand-icon {
width: 46px;
height: 46px;
border-radius: 12px;
- font-size: 24px;
+}
+
+.rail-brand-icon {
+ width: 40px;
+ height: 40px;
+ border-radius: 10px;
}
.brand-name {
diff --git a/apps/web_v1/src/pages/login.tsx b/apps/web_v1/src/pages/login.tsx
index f477e8f..5ef1d51 100644
--- a/apps/web_v1/src/pages/login.tsx
+++ b/apps/web_v1/src/pages/login.tsx
@@ -38,8 +38,8 @@ export function LoginPage({ onLogin }: { onLogin: (input: { server: string; emai
-
S
-
森林Agent
+

+
森林AI
私有部署 · 安全可控的智能协作平台
知识沉淀 · 团队协作 · AI Agent
@@ -51,7 +51,7 @@ export function LoginPage({ onLogin }: { onLogin: (input: { server: string; emai
-
登录到您的 SenlinAI
+
登录到您的森林AI
连接私有工作台
@@ -81,7 +81,7 @@ export function LoginPage({ onLogin }: { onLogin: (input: { server: string; emai
安全 · 专注 · 高效
- SenlinAI 是面向知识工作者与内部团队的私有部署工作台,帮助团队在统一空间中收集信息、整理知识、协同决策。
+ 森林AI 是面向知识工作者与内部团队的私有部署工作台,帮助团队在统一空间中收集信息、整理知识、协同决策。
} title="私有部署,数据自有" desc="所有数据与模型运行在您的环境中,安全可控。" />
} title="知识沉淀,结构清晰" desc="从收集到整理,形成可复用的团队知识库。" />
diff --git a/apps/web_v1/src/pages/projects/project-rail.tsx b/apps/web_v1/src/pages/projects/project-rail.tsx
index 2874c0d..0d8bb10 100644
--- a/apps/web_v1/src/pages/projects/project-rail.tsx
+++ b/apps/web_v1/src/pages/projects/project-rail.tsx
@@ -1,6 +1,6 @@
import type { CSSProperties } from 'react'
import { Badge, Button, Layout, Space } from '@arco-design/web-react'
-import { IconCompass, IconDashboard, IconPlus } from '@arco-design/web-react/icon'
+import { IconCompass, IconPlus } from '@arco-design/web-react/icon'
import type { Project, WorkbenchView } from './project-types'
const { Sider } = Layout
@@ -26,10 +26,10 @@ export function ProjectRail({
}
+ icon={
}
onClick={onSelectWorkspace}
- aria-label="工作台"
- title="工作台"
+ aria-label="森林AI 工作台"
+ title="森林AI 工作台"
/>