50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
import { safeParseJSON } from './json'
|
|
import { logError } from './log'
|
|
|
|
export function setTerminalTitle(title: string): void {
|
|
if (process.platform === 'win32') {
|
|
process.title = title ? `✳ ${title}` : title
|
|
} else {
|
|
process.stdout.write(`\x1b]0;${title ? `✳ ${title}` : ''}\x07`)
|
|
}
|
|
}
|
|
|
|
export async function updateTerminalTitle(message: string): Promise<void> {
|
|
try {
|
|
const result = await queryQuick({
|
|
systemPrompt: [
|
|
"Analyze if this message indicates a new conversation topic. If it does, extract a 2-3 word title that captures the new topic. Format your response as a JSON object with two fields: 'isNewTopic' (boolean) and 'title' (string, or null if isNewTopic is false). Only include these fields, no other text.",
|
|
],
|
|
userPrompt: message,
|
|
enablePromptCaching: true,
|
|
})
|
|
|
|
const content = result.message.content
|
|
.filter(_ => _.type === 'text')
|
|
.map(_ => _.text)
|
|
.join('')
|
|
|
|
const response = safeParseJSON(content)
|
|
if (
|
|
response &&
|
|
typeof response === 'object' &&
|
|
'isNewTopic' in response &&
|
|
'title' in response
|
|
) {
|
|
if (response.isNewTopic && response.title) {
|
|
setTerminalTitle(response.title as string)
|
|
}
|
|
}
|
|
} catch (error) {
|
|
logError(error)
|
|
}
|
|
}
|
|
|
|
export function clearTerminal(): Promise<void> {
|
|
return new Promise(resolve => {
|
|
process.stdout.write('\x1b[2J\x1b[3J\x1b[H', () => {
|
|
resolve()
|
|
})
|
|
})
|
|
}
|