项目文件夹

文件
wehub-resource-sync 98e40dac97
CLI Smoke Test / smoke-test-linux (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-linux (24) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (24) (push) Has been cancelled
Expo App TypeScript typecheck / typecheck (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:40:49 +08:00

111 行
4.1 KiB
TypeScript

import * as z from 'zod';
export const agentKeys = ['claude', 'codex', 'gemini', 'openclaw', 'agy'] as const;
export type AgentKey = typeof agentKeys[number];
export const AgentDefaultOverrideSchema = z.object({
permissionMode: z.string().optional(),
modelMode: z.string().optional(),
effortLevel: z.string().optional(),
}).passthrough();
export const AgentDefaultOverridesSchema = z.object({
claude: AgentDefaultOverrideSchema.optional(),
codex: AgentDefaultOverrideSchema.optional(),
gemini: AgentDefaultOverrideSchema.optional(),
openclaw: AgentDefaultOverrideSchema.optional(),
agy: AgentDefaultOverrideSchema.optional(),
}).passthrough().default({});
export type AgentDefaultOverride = z.infer<typeof AgentDefaultOverrideSchema>;
export type AgentDefaultOverrides = z.infer<typeof AgentDefaultOverridesSchema>;
export type AgentDefaultField = keyof Pick<AgentDefaultOverride, 'permissionMode' | 'modelMode' | 'effortLevel'>;
export type AgentDefaultConfig = {
permissionMode: string;
modelMode: string;
effortLevel: string | null;
};
const codeAgentDefaults: Record<AgentKey, AgentDefaultConfig> = {
// The Claude UI key for YOLO is `bypassPermissions`; the CLI also accepts
// `yolo` and maps it to the Claude SDK's bypass mode.
claude: { permissionMode: 'bypassPermissions', modelMode: 'opus', effortLevel: 'medium' },
codex: { permissionMode: 'yolo', modelMode: 'gpt-5.5', effortLevel: 'medium' },
gemini: { permissionMode: 'default', modelMode: 'gemini-2.5-pro', effortLevel: null },
openclaw: { permissionMode: 'default', modelMode: 'default', effortLevel: null },
agy: { permissionMode: 'default', modelMode: 'Gemini 3.1 Pro (High)', effortLevel: null },
};
export function normalizeAgentKey(flavor: string | null | undefined): AgentKey {
if (flavor === 'codex' || flavor === 'gemini' || flavor === 'openclaw' || flavor === 'agy') {
return flavor;
}
return 'claude';
}
export function getCodeAgentDefaults(flavor: string | null | undefined): AgentDefaultConfig {
return codeAgentDefaults[normalizeAgentKey(flavor)];
}
export function getAgentDefaultOverride(
overrides: AgentDefaultOverrides | null | undefined,
flavor: string | null | undefined,
): AgentDefaultOverride {
return overrides?.[normalizeAgentKey(flavor)] ?? {};
}
export function resolveAgentDefaultConfig(
overrides: AgentDefaultOverrides | null | undefined,
flavor: string | null | undefined,
): AgentDefaultConfig {
const codeDefaults = getCodeAgentDefaults(flavor);
const userOverride = getAgentDefaultOverride(overrides, flavor);
return {
permissionMode: userOverride.permissionMode ?? codeDefaults.permissionMode,
modelMode: userOverride.modelMode ?? codeDefaults.modelMode,
effortLevel: userOverride.effortLevel ?? codeDefaults.effortLevel,
};
}
export function hasAgentDefaultOverride(
overrides: AgentDefaultOverrides | null | undefined,
flavor: string | null | undefined,
field: AgentDefaultField,
): boolean {
return getAgentDefaultOverride(overrides, flavor)[field] !== undefined;
}
export function getAgentDefaultOverrideValue(
overrides: AgentDefaultOverrides | null | undefined,
flavor: string | null | undefined,
field: AgentDefaultField,
): string | undefined {
return getAgentDefaultOverride(overrides, flavor)[field];
}
export function setAgentDefaultOverride(
overrides: AgentDefaultOverrides | null | undefined,
flavor: string | null | undefined,
field: AgentDefaultField,
value: string | null | undefined,
): AgentDefaultOverrides {
const key = normalizeAgentKey(flavor);
const next: AgentDefaultOverrides = { ...(overrides ?? {}) };
const current: AgentDefaultOverride = { ...(next[key] ?? {}) };
if (value === null || value === undefined) {
delete current[field];
} else {
current[field] = value;
}
if (current.permissionMode === undefined && current.modelMode === undefined && current.effortLevel === undefined) {
delete next[key];
} else {
next[key] = current;
}
return next;
}