mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
* fix: 修复状态栏 context 计数器在 loading 时闪现为 0 的问题 第三方 API(如智谱)在 message_start 中可能不返回完整 usage 数据, 导致 getCurrentUsage 返回全零 usage 对象,使 ctx 显示为 0%。 双重保护: - getCurrentUsage: 跳过全零 usage,继续往前找有真实数据的 message - calculateContextPercentages: totalInputTokens 为 0 时返回 null Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 外部化 ESM 包使用 createRequire 替代裸 require color-diff-napi、image-processor-napi、audio-capture-napi 声明 "type": "module" 但使用裸 require(),Node.js ESM 中 require 不可用。改用 createRequire(import.meta.url) 或顶层 import。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: getDefaultSonnetModel 优先使用用户配置的模型,修复第三方 provider 模型不存在错误 当用户通过 ANTHROPIC_MODEL 或 settings 配置了自定义 provider 支持的模型时, getDefaultSonnetModel/Haiku/Opus 现在会优先使用该配置,而非硬编码 Anthropic 官方模型 ID。 同时改进 Langfuse 可观测性:sideQuery 失败时记录错误信息到 span, optional 模式下标记 WARNING 而非 ERROR。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 将 auto_mode classifier 的 side-query span 绑定到父 trace classifyYoloAction 及 classifyYoloActionXml 接收 parentSpan 参数, 透传给 sideQuery 调用,使 auto_mode 的 side-query span 嵌套在主 agent trace 下。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 穷鬼模式下跳过 memdir_relevance side-query Poor mode 启用时不执行 findRelevantMemories 的预取调用, 避免额外的 API token 消耗。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: 添加 test:all 脚本用于完成任务后的全量检查 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: Vite 构建补齐缺失的 feature flags,修复 auto mode 不可见 Vite 构建插件的 DEFAULT_BUILD_FEATURES 缺少 BUDDY、TRANSCRIPT_CLASSIFIER、 BRIDGE_MODE、ACP、BG_SESSIONS、TEMPLATES,导致 feature('TRANSCRIPT_CLASSIFIER') 被替换为 false,auto mode 从 Shift+Tab 循环中消失。与 build.ts 对齐。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 统一 feature flags 到 defines.ts,修复 Vite 构建缺失 auto mode 将 DEFAULT_BUILD_FEATURES 列表从 build.ts、dev.ts、vite-plugin-feature-flags.ts 三处内联定义统一到 scripts/defines.ts 单一导出。之前的 Vite 插件缺少 TRANSCRIPT_CLASSIFIER 等 feature flag,导致 auto mode 在 Vite 构建中不可见。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
83 lines
2.9 KiB
TypeScript
83 lines
2.9 KiB
TypeScript
import type { Plugin } from "rollup";
|
|
import { DEFAULT_BUILD_FEATURES } from "./defines.ts";
|
|
|
|
/**
|
|
* Collect enabled feature flags from defaults + env vars.
|
|
*/
|
|
export function getEnabledFeatures(): Set<string> {
|
|
const envFeatures = Object.keys(process.env)
|
|
.filter((k) => k.startsWith("FEATURE_"))
|
|
.map((k) => k.replace("FEATURE_", ""));
|
|
return new Set([...DEFAULT_BUILD_FEATURES, ...envFeatures]);
|
|
}
|
|
|
|
// Regex to match feature('FLAG_NAME') calls with string literal arguments
|
|
const FEATURE_CALL_RE = /feature\s*\(\s*['"]([\w]+)['"]\s*\)/g;
|
|
|
|
/**
|
|
* Vite/Rollup plugin that replaces `feature('X')` calls with boolean literals
|
|
* at the transform stage, BEFORE the bundler resolves imports.
|
|
*
|
|
* This approach is necessary because some feature-gated code blocks contain
|
|
* require() calls to files that don't exist (e.g. hunter.js inside
|
|
* feature('REVIEW_ARTIFACT')). The bundler must see these as dead code
|
|
* (`if (false) { ... }`) before attempting import resolution.
|
|
*
|
|
* Also resolves `import { feature } from 'bun:bundle'` as a virtual module
|
|
* to prevent "module not found" errors.
|
|
*/
|
|
export default function featureFlagsPlugin(): Plugin {
|
|
const features = getEnabledFeatures();
|
|
|
|
const virtualModuleId = "bun:bundle";
|
|
const resolvedVirtualModuleId = "\0" + virtualModuleId;
|
|
|
|
return {
|
|
name: "feature-flags",
|
|
|
|
// Resolve bun:bundle as a virtual module (prevents "module not found")
|
|
resolveId(id) {
|
|
if (id === virtualModuleId) {
|
|
return resolvedVirtualModuleId;
|
|
}
|
|
},
|
|
|
|
// Provide a stub export for bun:bundle (unused at runtime after transform)
|
|
load(id) {
|
|
if (id === resolvedVirtualModuleId) {
|
|
return "export function feature(name) { return false; }";
|
|
}
|
|
},
|
|
|
|
// Replace feature('X') calls with true/false literals at transform time,
|
|
// and transpile `using` declarations for Node.js compatibility.
|
|
transform(code, id) {
|
|
// Skip node_modules
|
|
if (id.includes("node_modules")) return null;
|
|
|
|
let modified = false;
|
|
|
|
// 1. Replace feature('X') calls with boolean literals
|
|
let matchCount = 0;
|
|
let transformed = code.replace(FEATURE_CALL_RE, (match, flagName) => {
|
|
matchCount++;
|
|
return features.has(flagName) ? "true" : "false";
|
|
});
|
|
if (matchCount > 0) modified = true;
|
|
|
|
// 2. Transpile `using _ = expr;` to `const _ = expr;` for Node.js compat.
|
|
// Node.js v22 does not support `using` declarations (Explicit Resource Management).
|
|
// Safe because: SLOW_OPERATION_LOGGING is not enabled, so slowLogging returns
|
|
// a no-op disposable whose [Symbol.dispose]() is empty.
|
|
if (transformed.includes("using _")) {
|
|
transformed = transformed.replace(/\busing\s+(_\w*)\s*=/g, "const $1 =");
|
|
modified = true;
|
|
}
|
|
|
|
if (!modified) return null;
|
|
|
|
return { code: transformed, map: null };
|
|
},
|
|
};
|
|
}
|