/ src / server / chat / slash-command-parser / provider.ts
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 }