provider.ts
1 import { 2 parseProviderEndpointMode, 3 parseProviderTargetClause, 4 } from '@/server/chat/slash-command-parser-provider-target' 5 import type { SlashCommand } from './ast' 6 import type { ParsedSlashInput } from './lexer' 7 8 export function parseProviderSlashCommand(input: ParsedSlashInput): SlashCommand | null { 9 if (input.name !== 'provider' && input.name !== 'providers') return null 10 11 const { subcommand, subcommandRest } = parseSubcommand(input.rest) 12 if (!subcommand || subcommand === 'current' || subcommand === 'show') { 13 return { kind: 'provider-current' } 14 } 15 if (subcommand === 'help') return { kind: 'help-provider' } 16 if (subcommand === 'clear' || subcommand === 'reset') { 17 return { kind: 'provider-clear' } 18 } 19 if (subcommand === 'probe' || subcommand === 'check') { 20 const parsed = parseProviderTargetClause(subcommandRest) 21 return parsed ? { kind: 'provider-probe', target: parsed.target } : { kind: 'help-provider' } 22 } 23 if (subcommand === 'use' || subcommand === 'set') { 24 const parsed = parseProviderTargetClause(subcommandRest) 25 if (!parsed) return { kind: 'help-provider' } 26 return { 27 kind: 'provider-use', 28 target: parsed.target, 29 endpointMode: parsed.endpointMode, 30 } 31 } 32 return { kind: 'help-provider' } 33 } 34 35 function parseSubcommand(rest: string): { subcommand: string; subcommandRest: string } { 36 const trimmed = rest.trim() 37 if (!trimmed) return { subcommand: '', subcommandRest: '' } 38 const [subcommand = '', ...restParts] = trimmed.split(/\s+/) 39 return { 40 subcommand: subcommand.toLowerCase(), 41 subcommandRest: restParts.join(' ').trim(), 42 } 43 } 44 45 export { parseProviderEndpointMode }