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 }