Files
hapi/shared/src/flavors.ts
T
SSU-WEI HUANGandGitHub be1ef2a2e4 feat(dsh): integrate DeepSeek Harness through ACP (#1632)
* feat(dsh): add DeepSeek Harness ACP flavor

* fix(dsh): update mobile flavor catalogs

* fix(dsh): keep mobile spawn policy managed

* fix(dsh): keep managed policy and prompt retry

* fix(dsh): suppress unsupported runner policy flags

* fix(dsh): align native managed-policy UX
2026-08-22 12:37:28 +08:00

73 lines
2.3 KiB
TypeScript

import type { AgentFlavor } from './modes'
// --- Capability constants (prevent literal scattering) ---
export const Capabilities = {
ModelChange: 'model-change',
Effort: 'effort',
} as const
export type Capability = typeof Capabilities[keyof typeof Capabilities]
// --- Per-flavor capability sets ---
const FLAVOR_CAPS: Record<AgentFlavor, ReadonlySet<Capability>> = {
agy: new Set([Capabilities.ModelChange]),
claude: new Set([Capabilities.ModelChange, Capabilities.Effort]),
gemini: new Set([Capabilities.ModelChange]),
kimi: new Set([Capabilities.ModelChange]),
copilot: new Set([Capabilities.ModelChange]),
grok: new Set([Capabilities.ModelChange, Capabilities.Effort]),
codex: new Set([Capabilities.ModelChange]),
dsh: new Set(),
cursor: new Set([Capabilities.ModelChange]),
opencode: new Set([Capabilities.ModelChange]),
pi: new Set([Capabilities.ModelChange, Capabilities.Effort]),
}
// --- Flavor display names ---
const FLAVOR_LABELS: Record<AgentFlavor, string> = {
agy: 'Antigravity',
claude: 'Claude',
gemini: 'Gemini',
kimi: 'Kimi',
copilot: 'Copilot',
grok: 'Grok Build',
codex: 'Codex',
dsh: 'DeepSeek Harness',
cursor: 'Cursor',
opencode: 'OpenCode',
pi: 'Pi',
}
// --- Query functions ---
export function isKnownFlavor(flavor: string | null | undefined): flavor is AgentFlavor {
return typeof flavor === 'string' && Object.hasOwn(FLAVOR_CAPS, flavor)
}
export function hasCapability(flavor: string | null | undefined, cap: Capability): boolean {
if (!isKnownFlavor(flavor)) return false
return FLAVOR_CAPS[flavor].has(cap)
}
export function getFlavorLabel(flavor: string | null | undefined): string {
if (!isKnownFlavor(flavor)) return 'Unknown'
return FLAVOR_LABELS[flavor]
}
// --- Convenience functions ---
export function supportsModelChange(flavor: string | null | undefined): boolean {
return hasCapability(flavor, Capabilities.ModelChange)
}
export function supportsEffort(flavor: string | null | undefined): boolean {
return hasCapability(flavor, Capabilities.Effort)
}
export function isCodexFamilyFlavor(flavor: string | null | undefined): boolean {
return flavor === 'codex'
|| flavor === 'gemini'
|| flavor === 'grok'
|| flavor === 'kimi'
|| flavor === 'copilot'
|| flavor === 'opencode'
}