fix(review): address copilot review
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||||
|
|
||||||
import { createSlashHandler } from '../app/createSlashHandler.js'
|
import { createSlashHandler } from '../app/createSlashHandler.js'
|
||||||
|
import { TUI_SESSION_MODEL_FLAG } from '../domain/slash.js'
|
||||||
import { getOverlayState, resetOverlayState } from '../app/overlayStore.js'
|
import { getOverlayState, resetOverlayState } from '../app/overlayStore.js'
|
||||||
import { getUiState, patchUiState, resetUiState } from '../app/uiStore.js'
|
import { getUiState, patchUiState, resetUiState } from '../app/uiStore.js'
|
||||||
|
|
||||||
@@ -55,7 +56,7 @@ describe('createSlashHandler', () => {
|
|||||||
|
|
||||||
expect(
|
expect(
|
||||||
createSlashHandler(ctx)(
|
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)
|
).toBe(true)
|
||||||
expect(ctx.gateway.rpc).toHaveBeenCalledWith('config.set', {
|
expect(ctx.gateway.rpc).toHaveBeenCalledWith('config.set', {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import type {
|
|||||||
VoiceToggleResponse
|
VoiceToggleResponse
|
||||||
} from '../../../gatewayTypes.js'
|
} from '../../../gatewayTypes.js'
|
||||||
import { fmtK } from '../../../lib/text.js'
|
import { fmtK } from '../../../lib/text.js'
|
||||||
|
import { TUI_SESSION_MODEL_FLAG } from '../../../domain/slash.js'
|
||||||
import type { PanelSection } from '../../../types.js'
|
import type { PanelSection } from '../../../types.js'
|
||||||
import { patchOverlayState } from '../../overlayStore.js'
|
import { patchOverlayState } from '../../overlayStore.js'
|
||||||
import { patchUiState } from '../../uiStore.js'
|
import { patchUiState } from '../../uiStore.js'
|
||||||
@@ -17,8 +18,8 @@ import type { SlashCommand } from '../types.js'
|
|||||||
|
|
||||||
const GLOBAL_MODEL_FLAG_RE = /(?:^|\s)--global(?:\s|$)/
|
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 = new RegExp(`(?:^|\\s)${TUI_SESSION_MODEL_FLAG}(?:\\s|$)`)
|
||||||
const TUI_SESSION_MODEL_RE = /(?:^|\s)--tui-session(?:\s|$)/
|
const TUI_SESSION_STRIP_RE = new RegExp(`\\s*${TUI_SESSION_MODEL_FLAG}\\b\\s*`, 'g')
|
||||||
|
|
||||||
const persistedModelArg = (arg: string) => {
|
const persistedModelArg = (arg: string) => {
|
||||||
const trimmed = arg.trim()
|
const trimmed = arg.trim()
|
||||||
@@ -26,6 +27,9 @@ const persistedModelArg = (arg: string) => {
|
|||||||
return !trimmed || GLOBAL_MODEL_FLAG_RE.test(trimmed) ? trimmed : `${trimmed} --global`
|
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 modelValueForConfigSet = (arg: string) => {
|
||||||
const trimmed = arg.trim()
|
const trimmed = arg.trim()
|
||||||
|
|
||||||
@@ -34,7 +38,7 @@ const modelValueForConfigSet = (arg: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (TUI_SESSION_MODEL_RE.test(trimmed)) {
|
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)
|
return persistedModelArg(trimmed)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { Box, Text, useInput, useStdout } from '@hermes/ink'
|
|||||||
import { useEffect, useMemo, useState } from 'react'
|
import { useEffect, useMemo, useState } from 'react'
|
||||||
|
|
||||||
import { providerDisplayNames } from '../domain/providers.js'
|
import { providerDisplayNames } from '../domain/providers.js'
|
||||||
|
import { TUI_SESSION_MODEL_FLAG } from '../domain/slash.js'
|
||||||
import type { GatewayClient } from '../gatewayClient.js'
|
import type { GatewayClient } from '../gatewayClient.js'
|
||||||
import type { ModelOptionProvider, ModelOptionsResponse } from '../gatewayTypes.js'
|
import type { ModelOptionProvider, ModelOptionsResponse } from '../gatewayTypes.js'
|
||||||
import { asRpcResult, rpcErrorMessage } from '../lib/rpc.js'
|
import { asRpcResult, rpcErrorMessage } from '../lib/rpc.js'
|
||||||
@@ -112,7 +113,7 @@ export function ModelPicker({ gw, onCancel, onSelect, sessionId, t }: ModelPicke
|
|||||||
|
|
||||||
if (provider && model) {
|
if (provider && model) {
|
||||||
onSelect(
|
onSelect(
|
||||||
`${model} --provider ${provider.slug}${persistGlobal ? ' --global' : ' --tui-session'}`
|
`${model} --provider ${provider.slug}${persistGlobal ? ' --global' : ` ${TUI_SESSION_MODEL_FLAG}`}`
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
setStage('provider')
|
setStage('provider')
|
||||||
@@ -140,7 +141,7 @@ export function ModelPicker({ gw, onCancel, onSelect, sessionId, t }: ModelPicke
|
|||||||
}
|
}
|
||||||
} else if (provider && models[offset + n - 1]) {
|
} else if (provider && models[offset + n - 1]) {
|
||||||
onSelect(
|
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}`}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 looksLikeSlashCommand = (text: string) => /^\/[^\s/]*(?:\s|$)/.test(text)
|
||||||
|
|
||||||
export const parseSlashCommand = (cmd: string) => {
|
export const parseSlashCommand = (cmd: string) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user