diff --git a/package.json.bak.pre-015 b/package.json.bak.pre-015
new file mode 100644
index 0000000..7be9fd4
--- /dev/null
+++ b/package.json.bak.pre-015
@@ -0,0 +1,195 @@
+{
+ "name": "dsh-apes-sidebar",
+ "version": "1.0.0",
+ "description": "APE fork of dsh-better-sidebar v0.18.0: VSCode-like right sidebar (explorer / editor / terminal / git / browser) + apes:* information-layer tabs (tasks / agents / apps / messages / profile). Forked from omdsh-dev/DSH-better-sidebar under MIT.",
+ "type": "module",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/omdsh-dev/DSH-better-sidebar"
+ },
+ "forkedFrom": {
+ "name": "dsh-better-sidebar",
+ "version": "0.18.0",
+ "commit": "9e1a034",
+ "url": "https://github.com/omdsh-dev/DSH-better-sidebar"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "main": "lib/index.js",
+ "types": "lib/types/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./lib/types/index.d.ts",
+ "default": "./lib/index.js"
+ },
+ "./invariant": {
+ "types": "./lib/types/invariant.d.ts",
+ "default": "./lib/invariant.js"
+ },
+ "./client": {
+ "types": "./lib/types/client/index.d.ts",
+ "default": "./lib/client.js"
+ },
+ "./client/service": {
+ "types": "./lib/types/client/service.d.ts",
+ "default": "./lib/client.js"
+ },
+ "./client/api": {
+ "types": "./lib/types/client/service.d.ts",
+ "default": "./lib/client.js"
+ },
+ "./src/*": "./src/*",
+ "./package.json": "./package.json"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "packageManager": "pnpm@11.8.0",
+ "dsh": {
+ "bundle": {
+ "patch": "./cordis.patch.yml"
+ },
+ "client": {
+ "inject": [
+ "@deepseek-ai/dsh-client-locale",
+ "@deepseek-ai/dsh-client-ui-slots",
+ "@deepseek-ai/dsh-client-ui-conversation",
+ "@deepseek-ai/dsh-client-modules"
+ ],
+ "platform": "web"
+ }
+ },
+ "files": [
+ "lib/index.js",
+ "lib/invariant.js",
+ "lib/client.js",
+ "lib/client-registry.js",
+ "lib/client-terminal.js",
+ "lib/client-editor.js",
+ "lib/client-mermaid.js",
+ "lib/types/**/*.d.ts",
+ "src",
+ "scripts/install.sh",
+ "scripts/install.ps1",
+ "scripts/switch.sh",
+ "cordis.patch.yml",
+ "README.md",
+ "README_EN.md",
+ "LICENSE"
+ ],
+ "scripts": {
+ "build": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\" && tsc -p tsconfig.build.json && tsdown",
+ "prepublishOnly": "pnpm build",
+ "typecheck": "tsc --noEmit",
+ "bundle": "tsdown",
+ "watch": "tsdown --watch",
+ "prepare": "tsdown",
+ "test": "vitest run",
+ "test:mount": "bash scripts/e2e-mount.sh",
+ "test:mount:aggregate": "bash scripts/e2e-aggregate-mount.sh",
+ "clean": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\"",
+ "check:consumer-types": "bash scripts/check-consumer-types.sh",
+ "switch": "bash scripts/switch.sh",
+ "switch:status": "bash scripts/switch.sh --status",
+ "switch:aps": "bash scripts/switch.sh aps",
+ "switch:upstream": "bash scripts/switch.sh upstream"
+ },
+ "license": "MIT",
+ "peerDependencies": {
+ "@deepseek-ai/cordis": "^4.0.2",
+ "@deepseek-ai/dsh-agent": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-locale": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-host-webserver": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-invariants": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-settings": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-subagent": "^0.1.2-rc.1",
+ "@deepseek-ai/dsh-tools": "^0.1.2-rc.1",
+ "@huanlin/dsh-plugin-better-locale": "^0.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@huanlin/dsh-plugin-better-locale": {
+ "optional": true
+ }
+ },
+ "dependencies": {
+ "@codemirror/commands": "^6.10.4",
+ "@codemirror/lang-cpp": "^6.0.3",
+ "@codemirror/lang-css": "^6.3.1",
+ "@codemirror/lang-go": "^6.0.1",
+ "@codemirror/lang-html": "^6.4.12",
+ "@codemirror/lang-java": "^6.0.2",
+ "@codemirror/lang-javascript": "^6.2.5",
+ "@codemirror/lang-json": "^6.0.2",
+ "@codemirror/lang-markdown": "^6.5.2",
+ "@codemirror/lang-php": "^6.0.2",
+ "@codemirror/lang-python": "^6.2.1",
+ "@codemirror/lang-rust": "^6.0.2",
+ "@codemirror/lang-sql": "^6.10.0",
+ "@codemirror/lang-vue": "^0.1.3",
+ "@codemirror/lang-xml": "^6.1.0",
+ "@codemirror/lang-yaml": "^6.1.3",
+ "@codemirror/language": "^6.12.4",
+ "@codemirror/legacy-modes": "^6.5.3",
+ "@codemirror/search": "^6.7.1",
+ "@codemirror/state": "^6.7.1",
+ "@codemirror/view": "^6.43.8",
+ "@lezer/highlight": "^1.2.3",
+ "clsx": "^2.1.1",
+ "dompurify": "^3.4.14",
+ "mermaid": "^11.16.1",
+ "node-pty": "^1.1.0",
+ "react-icons": "5.7.0",
+ "rxjs": "^7.8.2",
+ "schemastery": "^3.18.0",
+ "ws": "^8.18.0"
+ },
+ "devDependencies": {
+ "@cordisjs/plugin-loader": "^1.0.0-rc.5",
+ "@deepseek-ai/dsh-agent": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-attachment": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-locale": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-ui-settings": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-code-runtime": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-host-webserver": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-invariants": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-llm": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-scope": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-session": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-session-projection": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-settings": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-subagent": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-system-prompt": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-tools": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-user-approval": "0.1.2-rc.1",
+ "@deepseek-ai/dsh-util-time": "0.1.2-rc.1",
+ "@huanlin/dsh-plugin-better-locale": "^0.1.0",
+ "@playwright/test": "^1.62.1",
+ "@types/node": "^24.0.0",
+ "@types/react": "~18.3.1",
+ "@types/react-dom": "~18.3.1",
+ "@types/ws": "^8.5.10",
+ "@xterm/addon-fit": "^0.11.0",
+ "@xterm/xterm": "^5.5.0",
+ "cordis": "^4.0.0-rc.8",
+ "jsdom": "^29.1.1",
+ "lightningcss": "^1.32.0",
+ "react": "^18.2.0",
+ "react-dom": "18.2.0",
+ "tsdown": "^0.22.2",
+ "typescript": "^5.6.0",
+ "unrun": "^0.2.39",
+ "vitest": "^4.1.8"
+ }
+}
diff --git a/package.json.bak.pre-anter b/package.json.bak.pre-anter
new file mode 100644
index 0000000..29b0d65
--- /dev/null
+++ b/package.json.bak.pre-anter
@@ -0,0 +1,195 @@
+{
+ "name": "dsh-apes-sidebar",
+ "version": "1.0.0",
+ "description": "APE fork of dsh-better-sidebar v0.18.0: VSCode-like right sidebar (explorer / editor / terminal / git / browser) + apes:* information-layer tabs (tasks / agents / apps / messages / profile). Forked from omdsh-dev/DSH-better-sidebar under MIT.",
+ "type": "module",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/omdsh-dev/DSH-better-sidebar"
+ },
+ "forkedFrom": {
+ "name": "dsh-better-sidebar",
+ "version": "0.18.0",
+ "commit": "9e1a034",
+ "url": "https://github.com/omdsh-dev/DSH-better-sidebar"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "main": "lib/index.js",
+ "types": "lib/types/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./lib/types/index.d.ts",
+ "default": "./lib/index.js"
+ },
+ "./invariant": {
+ "types": "./lib/types/invariant.d.ts",
+ "default": "./lib/invariant.js"
+ },
+ "./client": {
+ "types": "./lib/types/client/index.d.ts",
+ "default": "./lib/client.js"
+ },
+ "./client/service": {
+ "types": "./lib/types/client/service.d.ts",
+ "default": "./lib/client.js"
+ },
+ "./client/api": {
+ "types": "./lib/types/client/service.d.ts",
+ "default": "./lib/client.js"
+ },
+ "./src/*": "./src/*",
+ "./package.json": "./package.json"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "packageManager": "pnpm@11.8.0",
+ "dsh": {
+ "bundle": {
+ "patch": "./cordis.patch.yml"
+ },
+ "client": {
+ "inject": [
+ "@deepseek-ai/dsh-client-locale",
+ "@deepseek-ai/dsh-client-ui-slots",
+ "@deepseek-ai/dsh-client-ui-conversation",
+ "@deepseek-ai/dsh-client-modules"
+ ],
+ "platform": "web"
+ }
+ },
+ "files": [
+ "lib/index.js",
+ "lib/invariant.js",
+ "lib/client.js",
+ "lib/client-registry.js",
+ "lib/client-terminal.js",
+ "lib/client-editor.js",
+ "lib/client-mermaid.js",
+ "lib/types/**/*.d.ts",
+ "src",
+ "scripts/install.sh",
+ "scripts/install.ps1",
+ "scripts/switch.sh",
+ "cordis.patch.yml",
+ "README.md",
+ "README_EN.md",
+ "LICENSE"
+ ],
+ "scripts": {
+ "build": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\" && tsc -p tsconfig.build.json && tsdown",
+ "prepublishOnly": "pnpm build",
+ "typecheck": "tsc --noEmit",
+ "bundle": "tsdown",
+ "watch": "tsdown --watch",
+ "prepare": "tsdown",
+ "test": "vitest run",
+ "test:mount": "bash scripts/e2e-mount.sh",
+ "test:mount:aggregate": "bash scripts/e2e-aggregate-mount.sh",
+ "clean": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\"",
+ "check:consumer-types": "bash scripts/check-consumer-types.sh",
+ "switch": "bash scripts/switch.sh",
+ "switch:status": "bash scripts/switch.sh --status",
+ "switch:aps": "bash scripts/switch.sh aps",
+ "switch:upstream": "bash scripts/switch.sh upstream"
+ },
+ "license": "MIT",
+ "peerDependencies": {
+ "@deepseek-ai/cordis": "^4.0.2",
+ "@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-locale": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-host-webserver": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-invariants": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-session": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-settings": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-subagent": "^0.1.5-rc.2",
+ "@deepseek-ai/dsh-tools": "^0.1.5-rc.2",
+ "@huanlin/dsh-plugin-better-locale": "^0.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@huanlin/dsh-plugin-better-locale": {
+ "optional": true
+ }
+ },
+ "dependencies": {
+ "@codemirror/commands": "^6.10.4",
+ "@codemirror/lang-cpp": "^6.0.3",
+ "@codemirror/lang-css": "^6.3.1",
+ "@codemirror/lang-go": "^6.0.1",
+ "@codemirror/lang-html": "^6.4.12",
+ "@codemirror/lang-java": "^6.0.2",
+ "@codemirror/lang-javascript": "^6.2.5",
+ "@codemirror/lang-json": "^6.0.2",
+ "@codemirror/lang-markdown": "^6.5.2",
+ "@codemirror/lang-php": "^6.0.2",
+ "@codemirror/lang-python": "^6.2.1",
+ "@codemirror/lang-rust": "^6.0.2",
+ "@codemirror/lang-sql": "^6.10.0",
+ "@codemirror/lang-vue": "^0.1.3",
+ "@codemirror/lang-xml": "^6.1.0",
+ "@codemirror/lang-yaml": "^6.1.3",
+ "@codemirror/language": "^6.12.4",
+ "@codemirror/legacy-modes": "^6.5.3",
+ "@codemirror/search": "^6.7.1",
+ "@codemirror/state": "^6.7.1",
+ "@codemirror/view": "^6.43.8",
+ "@lezer/highlight": "^1.2.3",
+ "clsx": "^2.1.1",
+ "dompurify": "^3.4.14",
+ "mermaid": "^11.16.1",
+ "node-pty": "^1.1.0",
+ "react-icons": "5.7.0",
+ "rxjs": "^7.8.2",
+ "schemastery": "^3.18.0",
+ "ws": "^8.18.0"
+ },
+ "devDependencies": {
+ "@cordisjs/plugin-loader": "^1.0.0-rc.5",
+ "@deepseek-ai/dsh-agent": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-attachment": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-locale": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-ui-settings": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-code-runtime": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-host-webserver": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-invariants": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-llm": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-scope": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-session": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-session-projection": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-settings": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-subagent": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-system-prompt": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-tools": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-user-approval": "0.1.5-rc.2",
+ "@deepseek-ai/dsh-util-time": "0.1.5-rc.2",
+ "@huanlin/dsh-plugin-better-locale": "^0.1.0",
+ "@playwright/test": "^1.62.1",
+ "@types/node": "^24.0.0",
+ "@types/react": "~18.3.1",
+ "@types/react-dom": "~18.3.1",
+ "@types/ws": "^8.5.10",
+ "@xterm/addon-fit": "^0.11.0",
+ "@xterm/xterm": "^5.5.0",
+ "cordis": "^4.0.0-rc.8",
+ "jsdom": "^29.1.1",
+ "lightningcss": "^1.32.0",
+ "react": "^18.2.0",
+ "react-dom": "18.2.0",
+ "tsdown": "^0.22.2",
+ "typescript": "^5.6.0",
+ "unrun": "^0.2.39",
+ "vitest": "^4.1.8"
+ }
+}
diff --git a/src/client/apes/icons.tsx b/src/client/apes/icons.tsx
new file mode 100644
index 0000000..47e3a2e
--- /dev/null
+++ b/src/client/apes/icons.tsx
@@ -0,0 +1,51 @@
+/**
+ * Custom fill-style icons for apes tabs — matching the visual weight of
+ * DSH native tabs (which use `fill: currentColor` paths, not outline/mask).
+ *
+ * DSH's `@deepseek-ai/dsh-client-ui-primitives` only ships outline variants
+ * for agent/gauge/user, so we define our own fill variants here to ensure
+ * the apes tabs look "official" in the + menu.
+ */
+import type { ReactNode } from 'react'
+
+/** Agent icon: a simple robot/agent face (fill style). */
+export function IconAgentFill16({ size = 16, className }: { size?: number; className?: string }): ReactNode {
+ return (
+
+ )
+}
+
+/** Gauge/app icon: a simple app grid (fill style). */
+export function IconGaugeFill16({ size = 16, className }: { size?: number; className?: string }): ReactNode {
+ return (
+
+ )
+}
+
+/** User/profile icon: a simple user silhouette (fill style). */
+export function IconUserFill16({ size = 16, className }: { size?: number; className?: string }): ReactNode {
+ return (
+
+ )
+}
diff --git a/src/client/apes/tabs.tsx b/src/client/apes/tabs.tsx
index 1ce6190..1ce232a 100644
--- a/src/client/apes/tabs.tsx
+++ b/src/client/apes/tabs.tsx
@@ -26,7 +26,7 @@
*/
import { useCallback, useMemo, useState, type CSSProperties } from 'react'
import { useSyncExternalStore } from 'react'
-import { IconAgentPresetOutline16, IconGaugeOutline16, IconUserOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'
+import { IconAgentFill16, IconGaugeFill16, IconUserFill16 } from './icons.tsx'
import type { TabComponentProps, TabDescriptor } from '../service.ts'
import type {
SidebarSessionList,
@@ -231,7 +231,7 @@ function ApesAppsView(props: TabComponentProps) {
* to `service.registerTab`. Information-layer tabs are single-instance.
*/
export const apesTabs: TabDescriptor[] = [
- { id: 'apes:agents', title: () => t('apesAgentsTitle'), icon: (size: number) => , order: 60, single: true, component: ApesAgentsView },
- { id: 'apes:apps', title: () => t('apesAppsTitle'), icon: (size: number) => , order: 65, single: true, component: ApesAppsView },
- { id: 'apes:profile', title: () => t('apesProfileTitle'), icon: (size: number) => , order: 70, single: true, component: ApesProfileView },
+ { id: 'apes:agents', title: () => t('apesAgentsTitle'), icon: (size: number) => , order: 60, single: true, component: ApesAgentsView },
+ { id: 'apes:apps', title: () => t('apesAppsTitle'), icon: (size: number) => , order: 65, single: true, component: ApesAppsView },
+ { id: 'apes:profile', title: () => t('apesProfileTitle'), icon: (size: number) => , order: 70, single: true, component: ApesProfileView },
]