From 731ba235154bc9d32de25c598676af7b2bdcfc71 Mon Sep 17 00:00:00 2001 From: shumengya Date: Mon, 15 Jun 2026 14:32:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=E7=BE=8E=E5=8C=96=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E7=95=8C=E9=9D=A2=E5=B9=B6=E9=87=8D=E6=9E=84=20/is=20?= =?UTF-8?q?=E5=B7=A5=E5=85=B7/=E6=8F=92=E4=BB=B6=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 缩小标题加 ❯ 引导符、彩色版本号、中文说明 - 去除启动头部段落间空行 - /is 本地扩展和 npm 扩展合并为 [插件] 分组展示 - /is 新增 [工具] 区块显示所有注册工具及激活状态 Co-Authored-By: Claude Sonnet 4.6 --- .pi/agent/AGENTS.md | 2 +- .pi/agent/extensions/startup-chinese/index.ts | 10 ++-- packages/ai/src/models.generated.ts | 55 +++++++++++++++++++ .../src/modes/interactive/interactive-mode.ts | 35 ++++++++++-- sproutclaw.bat | 41 ++++++++++---- 5 files changed, 122 insertions(+), 21 deletions(-) diff --git a/.pi/agent/AGENTS.md b/.pi/agent/AGENTS.md index 8e0ff456..d70e79c0 100755 --- a/.pi/agent/AGENTS.md +++ b/.pi/agent/AGENTS.md @@ -20,7 +20,7 @@ - 如果用户需要你生成总结文档,教程时,除非用户强制要求,否则默认储存目录为smallmengya的/shumengya/docs 目录下 ## 服务器运维规范 -- `smallmengya`(本机)作为开发环境、测试环境和 LXC 容器宿主机 +- `smallmengya`作为开发环境、测试环境和 LXC 容器宿主机 - `bigmengya`(通过 SSH 连接)作为 Docker 容器机 - `alycd`(通过 SSH 连接)作为内网对外开放的服务器 diff --git a/.pi/agent/extensions/startup-chinese/index.ts b/.pi/agent/extensions/startup-chinese/index.ts index b3a82173..3271ce9a 100644 --- a/.pi/agent/extensions/startup-chinese/index.ts +++ b/.pi/agent/extensions/startup-chinese/index.ts @@ -73,8 +73,11 @@ function renderSproutclawLogo(theme: any, width: number): string[] { if (width < 96) { return [ [ + rgb("❯ ", [100, 200, 255]), theme.bold(gradientText("SproutClaw")), - theme.fg("dim", ` v${VERSION}`), + rgb(` v${VERSION}`, [170, 235, 255]), + rgb(" · ", [80, 100, 130]), + rgb("萌芽运维开发助手", [190, 170, 255]), ].join(""), ]; } @@ -134,16 +137,13 @@ export default function (pi: ExtensionAPI) { divider, ...renderSproutclawLogo(theme, width), divider, - rgb("萌芽运维开发 Agent 助手", [170, 235, 255]), - "", + rgb("萌芽运维开发Agent助手", [170, 235, 255]), ]; if (expanded) { lines.push(expandedInstructions); - lines.push(""); lines.push(onboarding); } else { lines.push(compactOnboarding); - lines.push(""); lines.push(onboarding); } return lines; diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index 18d4da54..3a9d0031 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -4746,6 +4746,42 @@ export const MODELS = { contextWindow: 262144, maxTokens: 32768, } satisfies Model<"google-generative-ai">, + "gemma-4-E2B-it": { + id: "gemma-4-E2B-it", + name: "Gemma 4 E2B IT", + api: "google-generative-ai", + provider: "google", + baseUrl: "https://generativelanguage.googleapis.com/v1beta", + reasoning: true, + thinkingLevelMap: {"off":null,"minimal":"MINIMAL","low":null,"medium":null,"high":"HIGH"}, + input: ["text", "image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 131072, + maxTokens: 8192, + } satisfies Model<"google-generative-ai">, + "gemma-4-E4B-it": { + id: "gemma-4-E4B-it", + name: "Gemma 4 E4B IT", + api: "google-generative-ai", + provider: "google", + baseUrl: "https://generativelanguage.googleapis.com/v1beta", + reasoning: true, + thinkingLevelMap: {"off":null,"minimal":"MINIMAL","low":null,"medium":null,"high":"HIGH"}, + input: ["text", "image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 131072, + maxTokens: 8192, + } satisfies Model<"google-generative-ai">, }, "google-vertex": { "gemini-1.5-flash": { @@ -12830,6 +12866,25 @@ export const MODELS = { contextWindow: 262144, maxTokens: 131000, } satisfies Model<"openai-completions">, + "moonshotai/Kimi-K2.7-Code": { + id: "moonshotai/Kimi-K2.7-Code", + name: "Kimi K2.7 Code", + api: "openai-completions", + provider: "together", + baseUrl: "https://api.together.ai/v1", + compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","supportsStrictMode":false,"supportsLongCacheRetention":false,"thinkingFormat":"together"}, + reasoning: true, + thinkingLevelMap: {"minimal":null,"low":null,"medium":null}, + input: ["text"], + cost: { + input: 0.95, + output: 4, + cacheRead: 0.19, + cacheWrite: 0, + }, + contextWindow: 262144, + maxTokens: 131072, + } satisfies Model<"openai-completions">, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts index 3755a587..26e87dc9 100644 --- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts @@ -1422,19 +1422,30 @@ export class InteractiveMode { }; const { local, packages } = this.splitExtensionsByOrigin(extensions); + const allExtensionLabels = [ + ...this.getCompactExtensionLabels(local), + ...this.getCompactExtensionLabels(packages), + ]; + const pluginCompactList = formatCompactGrid(allExtensionLabels); + + const expandedParts: string[] = []; if (local.length > 0) { const localGroups = this.buildScopeGroups(local); const localList = this.formatScopeGroups(localGroups, extensionFormatOptions); - const localCompactList = formatCompactGrid(this.getCompactExtensionLabels(local)); - addLoadedSection("本地扩展", localCompactList, localList, "mdHeading", local.length); + expandedParts.push( + `${theme.fg("mdHeading", " 本地扩展")} ${theme.fg("muted", String(local.length))}\n${localList}`, + ); } - if (packages.length > 0) { const packageGroups = this.buildScopeGroups(packages); const packageList = this.formatScopeGroups(packageGroups, extensionFormatOptions); - const packageCompactList = formatCompactGrid(this.getCompactExtensionLabels(packages)); - addLoadedSection("npm 扩展", packageCompactList, packageList, "mdHeading", packages.length); + expandedParts.push( + `${theme.fg("mdHeading", " npm 扩展")} ${theme.fg("muted", String(packages.length))}\n${packageList}`, + ); } + const pluginExpandedList = expandedParts.join("\n"); + + addLoadedSection("插件", pluginCompactList, pluginExpandedList, "mdHeading", extensions.length); } // Show loaded themes (excluding built-in) @@ -1459,6 +1470,20 @@ export class InteractiveMode { ); addLoadedSection("Themes", themeCompactList, themeList, "mdHeading", customThemes.length); } + + const allTools = this.session.getAllTools(); + if (allTools.length > 0) { + const activeToolNames = new Set(this.session.getActiveToolNames()); + const toolCompactList = formatCompactGrid(allTools.map((t) => t.name)); + const toolList = allTools + .map((t) => { + const active = activeToolNames.has(t.name); + const marker = active ? " " : theme.fg("dim", "✗ "); + return `${marker}${theme.fg("dim", t.name)}${t.description ? theme.fg("dim", ` ${t.description.split("\n")[0].slice(0, 60)}`) : ""}`; + }) + .join("\n"); + addLoadedSection("工具", toolCompactList, toolList, "mdHeading", allTools.length); + } } if (showDiagnostics) { diff --git a/sproutclaw.bat b/sproutclaw.bat index 37d6a7d9..9486cc66 100644 --- a/sproutclaw.bat +++ b/sproutclaw.bat @@ -1,15 +1,36 @@ @echo off setlocal - set "SCRIPT_DIR=%~dp0" -if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" -set "PI_CODING_AGENT_DIR=%SCRIPT_DIR%\.pi\agent" -set "PI_CLI_DIST=%SCRIPT_DIR%\packages\coding-agent\dist\cli.js" - -if not exist "%PI_CLI_DIST%" ( - echo Build output not found: %PI_CLI_DIST% >&2 - echo Run from repo root: npm run build >&2 - exit /b 1 +if "%SCRIPT_DIR:~-1%"=="" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" +if not defined PI_CODING_AGENT_DIR ( + set "PI_CODING_AGENT_DIR=%SCRIPT_DIR%.piagent" ) -node "%PI_CLI_DIST%" %* +if "%~1"=="" goto run +if /I "%~1"=="run" ( + shift + goto run +) +if /I "%~1"=="build" ( + shift + npm run build %* + exit /b %ERRORLEVEL% +) +if /I "%~1"=="help" goto help +if "%~1"=="-h" goto help +if "%~1"=="--help" goto help + +:run +call "%SCRIPT_DIR%pi-built.bat" %* +exit /b %ERRORLEVEL% + +:help +echo sproutclaw - SproutClaw pi 构建版启动器 +echo. +echo 用法: +echo sproutclaw 启动 pi(构建版) +echo sproutclaw run [args] 同 sproutclaw +echo sproutclaw build 从源码构建所有包 +echo. +echo 其余参数透传给 pi,例如: sproutclaw --version +exit /b 0