ast.ts
  1  import type {
  2    GlobalDefaults,
  3  } from '@/lib/shared/chat'
  4  import type { CliAgentBackendId } from '@/server/agents/session-bridge'
  5  import type { ProviderCommandTarget } from '@/server/chat/slash-command-parser-provider-target'
  6  import type { SessionChatEndpointMode } from '@/server/providers/session-overrides'
  7  import type {
  8    ProviderReasoningLevel,
  9    ProviderThinkingLevel,
 10  } from '@/server/providers/types'
 11  
 12  export type SlashCommand =
 13    | { kind: 'list-agent-backends' }
 14    | { kind: 'agent-probe'; backendId?: CliAgentBackendId }
 15    | { kind: 'list-agent-sessions'; backendId?: CliAgentBackendId }
 16    | { kind: 'list-helper-sessions' }
 17    | { kind: 'agent-latest'; backendId: CliAgentBackendId; selector?: string }
 18    | {
 19      kind: 'agent-send'
 20      backendId: CliAgentBackendId
 21      selector?: string
 22      cwd?: string
 23      prompt: string
 24    }
 25    | { kind: 'help-agents' }
 26    | { kind: 'provider-current' }
 27    | { kind: 'provider-clear' }
 28    | { kind: 'help-provider' }
 29    | { kind: 'provider-probe'; target: ProviderCommandTarget }
 30    | {
 31      kind: 'provider-use'
 32      target: ProviderCommandTarget
 33      endpointMode?: SessionChatEndpointMode
 34    }
 35    | { kind: 'settings-show' }
 36    | { kind: 'settings-defaults-show' }
 37    | {
 38      kind: 'settings-defaults-update'
 39      patch: Partial<GlobalDefaults>
 40      scopeLabel: string
 41    }
 42    | { kind: 'think-show' }
 43    | { kind: 'think-set'; thinkingLevel: ProviderThinkingLevel | null }
 44    | { kind: 'reasoning-show' }
 45    | { kind: 'reasoning-set'; reasoningLevel: ProviderReasoningLevel | null }
 46    | { kind: 'model-list' }
 47    | { kind: 'model-current' }
 48    | { kind: 'model-clear' }
 49    | { kind: 'model-set'; model: string }
 50    | { kind: 'help-model' }
 51    | {
 52      kind: 'web-search'
 53      query: string
 54      searchType?: 'web' | 'image' | 'news' | 'video'
 55    }
 56    | { kind: 'web-fetch'; url: string }
 57    | { kind: 'help-web' }
 58  
 59  export const HELPER_SESSIONS_COMMAND_NAMES = new Set([
 60    'listhelpersessions',
 61    'listlocalsessions',
 62    'helpersessions',
 63    'sessions',
 64    'listsessions',
 65  ])
 66  
 67  export const SETTINGS_DEFAULTS_CLEAR_ALL_PATCH: Partial<GlobalDefaults> = {
 68    chatModel: null,
 69    thinkingLevel: null,
 70    reasoningLevel: null,
 71    defaultProviderId: null,
 72    providerEndpointMode: null,
 73  }
 74  
 75  export const SETTINGS_PROVIDER_CLEAR_PATCH: Partial<GlobalDefaults> = {
 76    defaultProviderId: null,
 77    providerEndpointMode: null,
 78  }
 79  
 80  export type SettingsDefaultsClearTarget =
 81    | 'all'
 82    | 'model'
 83    | 'thinking'
 84    | 'reasoning'
 85    | 'provider'
 86    | 'endpoint'
 87  
 88  export const SETTINGS_DEFAULTS_CLEAR_TARGET_ALIASES: Readonly<
 89    Partial<Record<string, SettingsDefaultsClearTarget>>
 90  > = {
 91    all: 'all',
 92    model: 'model',
 93    think: 'thinking',
 94    thinking: 'thinking',
 95    reasoning: 'reasoning',
 96    provider: 'provider',
 97    endpoint: 'endpoint',
 98  }
 99  
100  export type SettingsDefaultsFieldKind =
101    | 'model'
102    | 'thinking'
103    | 'reasoning'
104    | 'providerId'
105    | 'endpointMode'
106  
107  export const SETTINGS_DEFAULTS_FIELD_ALIAS_TO_KIND: Readonly<
108    Partial<Record<string, SettingsDefaultsFieldKind>>
109  > = {
110    model: 'model',
111    chatmodel: 'model',
112    chat_model: 'model',
113    think: 'thinking',
114    thinking: 'thinking',
115    reasoning: 'reasoning',
116    provider: 'providerId',
117    provider_preset: 'providerId',
118    preset: 'providerId',
119    provider_id: 'providerId',
120    providerid: 'providerId',
121    endpoint: 'endpointMode',
122    endpoint_mode: 'endpointMode',
123  }
124  
125  export type SettingsDefaultsFieldCommandInput = {
126    rawValue: string
127    clearValue: boolean
128  }
129  
130  export function parseProviderDefaultPreset(
131    value: string,
132  ): string | null {
133    const trimmed = value.trim()
134    if (trimmed.length === 0) return null
135    return trimmed.toLowerCase()
136  }