slopus--happy
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
111 行
4.1 KiB
TypeScript
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;
|
|
}
|