From efaf4afd9c7eec83303f93cb6f5de4469b563b84 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Sat, 9 May 2026 23:04:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20Provider=20Registr?= =?UTF-8?q?y=E3=80=81StatusLine=E3=80=81Cache=20Stats=20=E5=92=8C=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E5=A2=9E=E5=BC=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - providerRegistry: OpenAI 兼容 provider 切换(Cerebras/Groq/DeepSeek/Qwen) - StatusLine: 增强状态栏(缓存命中率、TTL 倒计时、自定义 shell 命令) - cacheStats: 缓存命中率和 token 签名追踪 - ultrareviewPreflight: 代码审查预检服务 - SkillsMenu/filterSkills: 技能菜单过滤增强 - MagicDocs/langfuse prompts: 提示词更新 - claude.ts: API 客户端更新 Co-Authored-By: glm-5-turbo --- .../review/UltrareviewPreflightDialog.tsx | 56 +++ .../__tests__/ultrareviewCommand.test.tsx | 312 ++++++++++++ src/components/BuiltinStatusLine.tsx | 128 +++++ src/components/StatusLine.tsx | 191 ++++++- src/components/__tests__/StatusLine.test.tsx | 190 +++++++ src/components/skills/SkillsMenu.tsx | 139 +++--- .../skills/__tests__/filterSkills.test.ts | 68 +++ src/components/skills/filterSkills.ts | 36 ++ src/keybindings/validate.ts | 3 + .../MagicDocs/__tests__/prompts.test.ts | 410 +++++++++++++++ src/services/MagicDocs/prompts.ts | 6 + .../__tests__/ultrareviewPreflight.test.ts | 226 +++++++++ src/services/api/claude.ts | 195 +++----- src/services/api/ultrareviewPreflight.ts | 81 +++ .../langfuse/__tests__/langfuse.test.ts | 15 + src/services/langfuse/sanitize.ts | 11 +- .../providerRegistry/__tests__/loader.test.ts | 133 +++++ .../__tests__/providerCompatMatrix.test.ts | 204 ++++++++ .../__tests__/switcher.test.ts | 129 +++++ src/services/providerRegistry/loader.ts | 246 +++++++++ .../providerRegistry/providerCompatMatrix.ts | 179 +++++++ src/services/providerRegistry/switcher.ts | 111 +++++ src/services/providerRegistry/types.ts | 51 ++ src/utils/__tests__/cacheStats.test.ts | 465 ++++++++++++++++++ src/utils/__tests__/lanBeacon.test.ts | 40 +- src/utils/cacheStats.ts | 109 ++++ src/utils/cacheStatsState.ts | 92 ++++ src/utils/config.ts | 6 + 28 files changed, 3613 insertions(+), 219 deletions(-) create mode 100644 src/commands/review/UltrareviewPreflightDialog.tsx create mode 100644 src/commands/review/__tests__/ultrareviewCommand.test.tsx create mode 100644 src/components/BuiltinStatusLine.tsx create mode 100644 src/components/__tests__/StatusLine.test.tsx create mode 100644 src/components/skills/__tests__/filterSkills.test.ts create mode 100644 src/components/skills/filterSkills.ts create mode 100644 src/services/MagicDocs/__tests__/prompts.test.ts create mode 100644 src/services/api/__tests__/ultrareviewPreflight.test.ts create mode 100644 src/services/api/ultrareviewPreflight.ts create mode 100644 src/services/providerRegistry/__tests__/loader.test.ts create mode 100644 src/services/providerRegistry/__tests__/providerCompatMatrix.test.ts create mode 100644 src/services/providerRegistry/__tests__/switcher.test.ts create mode 100644 src/services/providerRegistry/loader.ts create mode 100644 src/services/providerRegistry/providerCompatMatrix.ts create mode 100644 src/services/providerRegistry/switcher.ts create mode 100644 src/services/providerRegistry/types.ts create mode 100644 src/utils/__tests__/cacheStats.test.ts create mode 100644 src/utils/cacheStats.ts create mode 100644 src/utils/cacheStatsState.ts diff --git a/src/commands/review/UltrareviewPreflightDialog.tsx b/src/commands/review/UltrareviewPreflightDialog.tsx new file mode 100644 index 000000000..261ba3796 --- /dev/null +++ b/src/commands/review/UltrareviewPreflightDialog.tsx @@ -0,0 +1,56 @@ +import React, { useCallback, useRef, useState } from 'react'; +import { Box, Dialog, Text } from '@anthropic/ink'; +import { Select } from '../../components/CustomSelect/select.js'; + +type Props = { + billingNote: string | null; + onConfirm: (signal: AbortSignal) => Promise; + onCancel: () => void; +}; + +/** + * Dialog shown when /v1/ultrareview/preflight returns action='confirm'. + * Displays the server-provided billing_note (or a generic fallback) and + * gives the user a Proceed / Cancel choice. + */ +export function UltrareviewPreflightDialog({ billingNote, onConfirm, onCancel }: Props): React.ReactNode { + const [isLaunching, setIsLaunching] = useState(false); + const abortControllerRef = useRef(new AbortController()); + + const handleSelect = useCallback( + (value: string) => { + if (value === 'proceed') { + setIsLaunching(true); + void onConfirm(abortControllerRef.current.signal).catch(() => setIsLaunching(false)); + } else { + onCancel(); + } + }, + [onConfirm, onCancel], + ); + + const handleCancel = useCallback(() => { + abortControllerRef.current.abort(); + onCancel(); + }, [onCancel]); + + const options = [ + { label: 'Proceed', value: 'proceed' }, + { label: 'Cancel', value: 'cancel' }, + ]; + + const displayNote = billingNote ?? 'This run may incur additional cost.'; + + return ( + + + {displayNote} + {isLaunching ? ( + Launching… + ) : ( +