Files
CC-Switch/src/types/omo.ts
T
Jason 5c32ec58be chore: upgrade all GPT model references to gpt-5.4
GPT no longer has separate codex variants (gpt-5.x-codex), unified as
gpt-5.4. Updated ~26 references across 8 files:

- Codex provider presets: default param + 12 vendor configs
- Codex custom template default model
- Universal provider default Codex model (gpt-4o → gpt-5.4)
- OpenCode @ai-sdk/openai: consolidated 7 old models into single gpt-5.4
- OpenCode RightCode: removed gpt-5.2-codex entry
- OMO agent/category recommended models (7 references)
- Stream check default Codex model
- Universal form fallback and placeholder
- Codex form placeholder text
2026-03-09 21:26:51 +08:00

425 lines
12 KiB
TypeScript

export interface OmoLocalFileData {
agents?: Record<string, Record<string, unknown>>;
categories?: Record<string, Record<string, unknown>>;
otherFields?: Record<string, unknown>;
filePath: string;
lastModified?: string;
}
export interface OmoAgentDef {
key: string;
display: string;
descKey: string;
tooltipKey: string;
recommended?: string;
group: "main" | "sub";
}
export interface OmoCategoryDef {
key: string;
display: string;
descKey: string;
tooltipKey: string;
recommended?: string;
}
export const OMO_BUILTIN_AGENTS: OmoAgentDef[] = [
{
key: "sisyphus",
display: "Sisyphus",
descKey: "omo.agentDesc.sisyphus",
tooltipKey: "omo.agentTooltip.sisyphus",
recommended: "claude-opus-4-6",
group: "main",
},
{
key: "hephaestus",
display: "Hephaestus",
descKey: "omo.agentDesc.hephaestus",
tooltipKey: "omo.agentTooltip.hephaestus",
recommended: "gpt-5.4",
group: "main",
},
{
key: "prometheus",
display: "Prometheus",
descKey: "omo.agentDesc.prometheus",
tooltipKey: "omo.agentTooltip.prometheus",
recommended: "claude-opus-4-6",
group: "main",
},
{
key: "atlas",
display: "Atlas",
descKey: "omo.agentDesc.atlas",
tooltipKey: "omo.agentTooltip.atlas",
recommended: "kimi-k2.5",
group: "main",
},
{
key: "oracle",
display: "Oracle",
descKey: "omo.agentDesc.oracle",
tooltipKey: "omo.agentTooltip.oracle",
recommended: "gpt-5.4",
group: "sub",
},
{
key: "librarian",
display: "Librarian",
descKey: "omo.agentDesc.librarian",
tooltipKey: "omo.agentTooltip.librarian",
recommended: "gemini-3-flash",
group: "sub",
},
{
key: "explore",
display: "Explore",
descKey: "omo.agentDesc.explore",
tooltipKey: "omo.agentTooltip.explore",
recommended: "grok-code-fast-1",
group: "sub",
},
{
key: "multimodal-looker",
display: "Multimodal-Looker",
descKey: "omo.agentDesc.multimodalLooker",
tooltipKey: "omo.agentTooltip.multimodalLooker",
recommended: "kimi-k2.5",
group: "sub",
},
{
key: "metis",
display: "Metis",
descKey: "omo.agentDesc.metis",
tooltipKey: "omo.agentTooltip.metis",
recommended: "claude-opus-4-6",
group: "sub",
},
{
key: "momus",
display: "Momus",
descKey: "omo.agentDesc.momus",
tooltipKey: "omo.agentTooltip.momus",
recommended: "gpt-5.4",
group: "sub",
},
{
key: "sisyphus-junior",
display: "Sisyphus-Junior",
descKey: "omo.agentDesc.sisyphusJunior",
tooltipKey: "omo.agentTooltip.sisyphusJunior",
group: "sub",
},
];
export const OMO_BUILTIN_CATEGORIES: OmoCategoryDef[] = [
{
key: "visual-engineering",
display: "Visual Engineering",
descKey: "omo.categoryDesc.visualEngineering",
tooltipKey: "omo.categoryTooltip.visualEngineering",
recommended: "gemini-3-pro",
},
{
key: "ultrabrain",
display: "Ultrabrain",
descKey: "omo.categoryDesc.ultrabrain",
tooltipKey: "omo.categoryTooltip.ultrabrain",
recommended: "gpt-5.4",
},
{
key: "deep",
display: "Deep",
descKey: "omo.categoryDesc.deep",
tooltipKey: "omo.categoryTooltip.deep",
recommended: "gpt-5.4",
},
{
key: "artistry",
display: "Artistry",
descKey: "omo.categoryDesc.artistry",
tooltipKey: "omo.categoryTooltip.artistry",
recommended: "gemini-3-pro",
},
{
key: "quick",
display: "Quick",
descKey: "omo.categoryDesc.quick",
tooltipKey: "omo.categoryTooltip.quick",
recommended: "claude-haiku-4-5",
},
{
key: "unspecified-low",
display: "Unspecified Low",
descKey: "omo.categoryDesc.unspecifiedLow",
tooltipKey: "omo.categoryTooltip.unspecifiedLow",
recommended: "claude-sonnet-4-6",
},
{
key: "unspecified-high",
display: "Unspecified High",
descKey: "omo.categoryDesc.unspecifiedHigh",
tooltipKey: "omo.categoryTooltip.unspecifiedHigh",
recommended: "claude-opus-4-6",
},
{
key: "writing",
display: "Writing",
descKey: "omo.categoryDesc.writing",
tooltipKey: "omo.categoryTooltip.writing",
recommended: "gemini-3-flash",
},
];
export const OMO_DISABLEABLE_AGENTS = [
{ value: "Prometheus (Planner)", label: "Prometheus (Planner)" },
{ value: "Atlas", label: "Atlas" },
{ value: "oracle", label: "Oracle" },
{ value: "librarian", label: "Librarian" },
{ value: "explore", label: "Explore" },
{ value: "multimodal-looker", label: "Multimodal Looker" },
{ value: "frontend-ui-ux-engineer", label: "Frontend UI/UX Engineer" },
{ value: "document-writer", label: "Document Writer" },
{ value: "Sisyphus-Junior", label: "Sisyphus-Junior" },
{ value: "Metis (Plan Consultant)", label: "Metis (Plan Consultant)" },
{ value: "Momus (Plan Reviewer)", label: "Momus (Plan Reviewer)" },
{ value: "OpenCode-Builder", label: "OpenCode-Builder" },
] as const;
export const OMO_DISABLEABLE_MCPS = [
{ value: "context7", label: "context7" },
{ value: "grep_app", label: "grep_app" },
{ value: "websearch", label: "websearch" },
] as const;
export const OMO_DISABLEABLE_HOOKS = [
{ value: "todo-continuation-enforcer", label: "todo-continuation-enforcer" },
{ value: "context-window-monitor", label: "context-window-monitor" },
{ value: "session-recovery", label: "session-recovery" },
{ value: "session-notification", label: "session-notification" },
{ value: "comment-checker", label: "comment-checker" },
{ value: "grep-output-truncator", label: "grep-output-truncator" },
{ value: "tool-output-truncator", label: "tool-output-truncator" },
{
value: "directory-agents-injector",
label: "directory-agents-injector",
},
{
value: "directory-readme-injector",
label: "directory-readme-injector",
},
{
value: "empty-task-response-detector",
label: "empty-task-response-detector",
},
{ value: "think-mode", label: "think-mode" },
{
value: "anthropic-context-window-limit-recovery",
label: "anthropic-context-window-limit-recovery",
},
{ value: "rules-injector", label: "rules-injector" },
{ value: "background-notification", label: "background-notification" },
{ value: "auto-update-checker", label: "auto-update-checker" },
{ value: "startup-toast", label: "startup-toast" },
{ value: "keyword-detector", label: "keyword-detector" },
{ value: "agent-usage-reminder", label: "agent-usage-reminder" },
{ value: "non-interactive-env", label: "non-interactive-env" },
{ value: "interactive-bash-session", label: "interactive-bash-session" },
{
value: "compaction-context-injector",
label: "compaction-context-injector",
},
{
value: "thinking-block-validator",
label: "thinking-block-validator",
},
{ value: "claude-code-hooks", label: "claude-code-hooks" },
{ value: "ralph-loop", label: "ralph-loop" },
{ value: "preemptive-compaction", label: "preemptive-compaction" },
] as const;
export const OMO_DISABLEABLE_SKILLS = [
{ value: "playwright", label: "playwright" },
{ value: "agent-browser", label: "agent-browser" },
{ value: "git-master", label: "git-master" },
] as const;
export const OMO_DEFAULT_SCHEMA_URL =
"https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json";
export const OMO_SISYPHUS_AGENT_PLACEHOLDER = `{
"disabled": false,
"default_builder_enabled": false,
"planner_enabled": true,
"replace_plan": true
}`;
export const OMO_LSP_PLACEHOLDER = `{
"typescript-language-server": {
"command": ["typescript-language-server", "--stdio"],
"extensions": [".ts", ".tsx"],
"priority": 10
},
"pylsp": {
"disabled": true
}
}`;
export const OMO_EXPERIMENTAL_PLACEHOLDER = `{
"truncate_all_tool_outputs": true,
"aggressive_truncation": true,
"auto_resume": true
}`;
export const OMO_BACKGROUND_TASK_PLACEHOLDER = `{
"defaultConcurrency": 5,
"providerConcurrency": {
"anthropic": 3,
"openai": 5,
"google": 10
},
"modelConcurrency": {
"anthropic/claude-opus-4-6": 2,
"google/gemini-3-flash": 10
}
}`;
export const OMO_BROWSER_AUTOMATION_PLACEHOLDER = `{
"provider": "playwright"
}`;
export const OMO_CLAUDE_CODE_PLACEHOLDER = `{
"mcp": true,
"commands": true,
"skills": true,
"agents": true,
"hooks": true,
"plugins": true
}`;
export function parseOmoOtherFieldsObject(
raw: string,
): Record<string, unknown> | undefined {
if (!raw.trim()) return undefined;
const parsed: unknown = JSON.parse(raw);
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
return undefined;
}
return parsed as Record<string, unknown>;
}
// ============================================================================
// OMO Slim (oh-my-opencode-slim) definitions
// ============================================================================
export const OMO_SLIM_BUILTIN_AGENTS: OmoAgentDef[] = [
{
key: "orchestrator",
display: "Orchestrator",
descKey: "omo.slimAgentDesc.orchestrator",
tooltipKey: "omo.slimAgentTooltip.orchestrator",
recommended: "claude-opus-4-6",
group: "main",
},
{
key: "oracle",
display: "Oracle",
descKey: "omo.slimAgentDesc.oracle",
tooltipKey: "omo.slimAgentTooltip.oracle",
recommended: "gpt-5.4",
group: "sub",
},
{
key: "librarian",
display: "Librarian",
descKey: "omo.slimAgentDesc.librarian",
tooltipKey: "omo.slimAgentTooltip.librarian",
recommended: "gemini-3-flash",
group: "sub",
},
{
key: "explorer",
display: "Explorer",
descKey: "omo.slimAgentDesc.explorer",
tooltipKey: "omo.slimAgentTooltip.explorer",
recommended: "grok-code-fast-1",
group: "sub",
},
{
key: "designer",
display: "Designer",
descKey: "omo.slimAgentDesc.designer",
tooltipKey: "omo.slimAgentTooltip.designer",
recommended: "gemini-3-pro",
group: "sub",
},
{
key: "fixer",
display: "Fixer",
descKey: "omo.slimAgentDesc.fixer",
tooltipKey: "omo.slimAgentTooltip.fixer",
recommended: "gpt-5.4",
group: "sub",
},
];
export const OMO_SLIM_DISABLEABLE_AGENTS = [
{ value: "orchestrator", label: "Orchestrator" },
{ value: "oracle", label: "Oracle" },
{ value: "librarian", label: "Librarian" },
{ value: "explorer", label: "Explorer" },
{ value: "designer", label: "Designer" },
{ value: "fixer", label: "Fixer" },
] as const;
export const OMO_SLIM_DISABLEABLE_MCPS = [
{ value: "context7", label: "context7" },
{ value: "grep_app", label: "grep_app" },
{ value: "websearch", label: "websearch" },
] as const;
export const OMO_SLIM_DISABLEABLE_HOOKS = [
{ value: "auto-update-checker", label: "auto-update-checker" },
{ value: "phase-reminder", label: "phase-reminder" },
{ value: "post-read-nudge", label: "post-read-nudge" },
] as const;
export const OMO_SLIM_DEFAULT_SCHEMA_URL =
"https://raw.githubusercontent.com/alvinunreal/oh-my-opencode-slim/master/assets/oh-my-opencode-slim.schema.json";
export function buildOmoProfilePreview(
agents: Record<string, Record<string, unknown>>,
categories: Record<string, Record<string, unknown>> | undefined,
otherFieldsStr: string,
options?: { slim?: boolean },
): Record<string, unknown> {
const result: Record<string, unknown> = {};
const isSlim = options?.slim ?? false;
if (Object.keys(agents).length > 0) result["agents"] = agents;
if (!isSlim && categories && Object.keys(categories).length > 0)
result["categories"] = categories;
try {
const other = parseOmoOtherFieldsObject(otherFieldsStr);
if (other) {
for (const [k, v] of Object.entries(other)) {
result[k] = v;
}
}
} catch {}
return result;
}
/** @deprecated Use buildOmoProfilePreview with options.slim=true */
export function buildOmoSlimProfilePreview(
agents: Record<string, Record<string, unknown>>,
otherFieldsStr: string,
): Record<string, unknown> {
return buildOmoProfilePreview(agents, undefined, otherFieldsStr, {
slim: true,
});
}