fix(review): address copilot review

This commit is contained in:
Austin Pickett 2026-04-27 11:06:28 -04:00
parent a0b62e0c5a
commit 082acc75b0
4 changed files with 15 additions and 6 deletions

View File

@ -1,6 +1,7 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { createSlashHandler } from '../app/createSlashHandler.js'
import { TUI_SESSION_MODEL_FLAG } from '../domain/slash.js'
import { getOverlayState, resetOverlayState } from '../app/overlayStore.js'
import { getUiState, patchUiState, resetUiState } from '../app/uiStore.js'
@ -55,7 +56,7 @@ describe('createSlashHandler', () => {
expect(
createSlashHandler(ctx)(
'/model anthropic/claude-sonnet-4.6 --provider openrouter --tui-session'
`/model anthropic/claude-sonnet-4.6 --provider openrouter ${TUI_SESSION_MODEL_FLAG}`
)
).toBe(true)
expect(ctx.gateway.rpc).toHaveBeenCalledWith('config.set', {

View File

@ -10,6 +10,7 @@ import type {
VoiceToggleResponse
} from '../../../gatewayTypes.js'
import { fmtK } from '../../../lib/text.js'
import { TUI_SESSION_MODEL_FLAG } from '../../../domain/slash.js'
import type { PanelSection } from '../../../types.js'
import { patchOverlayState } from '../../overlayStore.js'
import { patchUiState } from '../../uiStore.js'
@ -17,8 +18,8 @@ import type { SlashCommand } from '../types.js'
const GLOBAL_MODEL_FLAG_RE = /(?:^|\s)--global(?:\s|$)/
/** Stripped before `config.set`; TUI model picker uses this for session-scoped switches. */
const TUI_SESSION_MODEL_RE = /(?:^|\s)--tui-session(?:\s|$)/
const TUI_SESSION_MODEL_RE = new RegExp(`(?:^|\\s)${TUI_SESSION_MODEL_FLAG}(?:\\s|$)`)
const TUI_SESSION_STRIP_RE = new RegExp(`\\s*${TUI_SESSION_MODEL_FLAG}\\b\\s*`, 'g')
const persistedModelArg = (arg: string) => {
const trimmed = arg.trim()
@ -26,6 +27,9 @@ const persistedModelArg = (arg: string) => {
return !trimmed || GLOBAL_MODEL_FLAG_RE.test(trimmed) ? trimmed : `${trimmed} --global`
}
const stripTuiSessionFlag = (trimmed: string) =>
trimmed.replace(TUI_SESSION_STRIP_RE, ' ').replace(/\s+/g, ' ').trim()
const modelValueForConfigSet = (arg: string) => {
const trimmed = arg.trim()
@ -34,7 +38,7 @@ const modelValueForConfigSet = (arg: string) => {
}
if (TUI_SESSION_MODEL_RE.test(trimmed)) {
return trimmed.replace(/\s*--tui-session\b\s*/g, ' ').replace(/\s+/g, ' ').trim()
return stripTuiSessionFlag(trimmed)
}
return persistedModelArg(trimmed)

View File

@ -2,6 +2,7 @@ import { Box, Text, useInput, useStdout } from '@hermes/ink'
import { useEffect, useMemo, useState } from 'react'
import { providerDisplayNames } from '../domain/providers.js'
import { TUI_SESSION_MODEL_FLAG } from '../domain/slash.js'
import type { GatewayClient } from '../gatewayClient.js'
import type { ModelOptionProvider, ModelOptionsResponse } from '../gatewayTypes.js'
import { asRpcResult, rpcErrorMessage } from '../lib/rpc.js'
@ -112,7 +113,7 @@ export function ModelPicker({ gw, onCancel, onSelect, sessionId, t }: ModelPicke
if (provider && model) {
onSelect(
`${model} --provider ${provider.slug}${persistGlobal ? ' --global' : ' --tui-session'}`
`${model} --provider ${provider.slug}${persistGlobal ? ' --global' : ` ${TUI_SESSION_MODEL_FLAG}`}`
)
} else {
setStage('provider')
@ -140,7 +141,7 @@ export function ModelPicker({ gw, onCancel, onSelect, sessionId, t }: ModelPicke
}
} else if (provider && models[offset + n - 1]) {
onSelect(
`${models[offset + n - 1]} --provider ${provider.slug}${persistGlobal ? ' --global' : ' --tui-session'}`
`${models[offset + n - 1]} --provider ${provider.slug}${persistGlobal ? ' --global' : ` ${TUI_SESSION_MODEL_FLAG}`}`
)
}
}

View File

@ -1,3 +1,6 @@
/** Appended to `/model` args from the TUI picker for session scope; stripped in `session` slash before `config.set`. */
export const TUI_SESSION_MODEL_FLAG = '--tui-session'
export const looksLikeSlashCommand = (text: string) => /^\/[^\s/]*(?:\s|$)/.test(text)
export const parseSlashCommand = (cmd: string) => {