mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-17 13:55:50 +00:00
* fix: 修复settings.json内存状态溢出的问题 * fix: 修复auto mode gate check未处理的promise rejection 在 bypassPermissionsKillswitch.ts 的 useKickOffCheckAndDisableAutoModeIfNeeded 中,void fire-and-forget 调用缺少 .catch() 处理,导致 verifyAutoModeGateAccess 失败时产生 unhandled promise rejection。同时移除 permissionSetup.ts 中冗余的 null check。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: 开放 auto mode 和 bypass mode 给所有用户 通过 Shift+Tab 统一循环:default → acceptEdits → plan → auto → bypassPermissions → default - 移除 USER_TYPE 分支判断,所有用户使用同一循环路径 - isBypassPermissionsModeAvailable 始终为 true - isAutoModeAvailable 初始化直接为 true - 移除 AutoModeOptInDialog 确认流程 - 简化 isAutoModeGateEnabled 仅保留快模式熔断器 - 简化 verifyAutoModeGateAccess 仅检查快模式 - 移除 GrowthBook/Statsig 远程门控 - bypass permissions killswitch 改为 no-op - 新增 24 个测试覆盖循环逻辑和门控不变量 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: 为sideQuery添加Langfuse追踪 sideQuery 绕过了 claude.ts 的主 API 路径,导致所有走 sideQuery 的调用 (auto mode classifier、permission explainer、session search 等)都没有 Langfuse 记录。现在为每次 sideQuery 调用创建独立 trace 并记录 LLM observation, 未配置 Langfuse 时全部 no-op。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: ACP availableModes 补齐 bypassPermissions 并修正测试 import 路径 - ACP agent availableModes 按条件包含 bypassPermissions(非 root/sandbox) - 顺序对齐 REPL 循环:default → acceptEdits → plan → auto → bypassPermissions - 新增 2 个测试验证 availableModes 包含 bypassPermissions 及模式切换 - 修正 getNextPermissionMode.test.ts 和 permissionSetup.test.ts 的 import 路径 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
import type { ToolPermissionContext } from '../../Tool.js'
|
|
import { logForDebugging } from '../debug.js'
|
|
import type { PermissionMode } from './PermissionMode.js'
|
|
import { transitionPermissionMode } from './permissionSetup.js'
|
|
|
|
/**
|
|
* Determines the next permission mode when cycling through modes with Shift+Tab.
|
|
*
|
|
* Unified cycle for all users (no USER_TYPE distinction):
|
|
* default → acceptEdits → plan → auto → bypassPermissions → default
|
|
*/
|
|
export function getNextPermissionMode(
|
|
toolPermissionContext: ToolPermissionContext,
|
|
_teamContext?: { leadAgentId: string },
|
|
): PermissionMode {
|
|
switch (toolPermissionContext.mode) {
|
|
case 'default':
|
|
return 'acceptEdits'
|
|
|
|
case 'acceptEdits':
|
|
return 'plan'
|
|
|
|
case 'plan':
|
|
return 'auto'
|
|
|
|
case 'auto':
|
|
if (toolPermissionContext.isBypassPermissionsModeAvailable) {
|
|
return 'bypassPermissions'
|
|
}
|
|
return 'default'
|
|
|
|
case 'bypassPermissions':
|
|
return 'default'
|
|
|
|
case 'dontAsk':
|
|
// Not exposed in UI cycle yet, but return default if somehow reached
|
|
return 'default'
|
|
|
|
default:
|
|
// Covers any future modes — always fall back to default
|
|
return 'default'
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Computes the next permission mode and prepares the context for it.
|
|
* Handles any context cleanup needed for the target mode (e.g., stripping
|
|
* dangerous permissions when entering auto mode).
|
|
*
|
|
* @returns The next mode and the context to use (with dangerous permissions stripped if needed)
|
|
*/
|
|
export function cyclePermissionMode(
|
|
toolPermissionContext: ToolPermissionContext,
|
|
teamContext?: { leadAgentId: string },
|
|
): { nextMode: PermissionMode; context: ToolPermissionContext } {
|
|
const nextMode = getNextPermissionMode(toolPermissionContext, teamContext)
|
|
return {
|
|
nextMode,
|
|
context: transitionPermissionMode(
|
|
toolPermissionContext.mode,
|
|
nextMode,
|
|
toolPermissionContext,
|
|
),
|
|
}
|
|
}
|