import type { Context } from 'cordis' import type { GenerateOptions, StreamChunk } from '@deepseek-ai/dsh-llm' import { CallId, LlmAdapter } from '@deepseek-ai/dsh-llm' const CONTROL_PROBE = '\u001b]2;MODEL_CONTROLLED\u0007\u001b[999CMODEL_CURSOR\u009b31mMODEL_C1' const INITIAL_TEXT = `I need one decision before I continue. ${CONTROL_PROBE}` const FINAL_TEXT = 'Decision received. Scripted TUI run complete.' function textChunks(text: string): StreamChunk[] { return [ { type: 'block-start', index: 0, blockType: 'text' }, ...Array.from(text, (char): StreamChunk => ({ type: 'text-delta', index: 0, text: char })), { type: 'block-end', index: 0, block: { type: 'text', text } }, { type: 'usage', usage: { inputTokens: 20, outputTokens: text.length } }, { type: 'finish', reason: { kind: 'stop' } }, ] } /** Keyless two-step adapter for the real-PTY TUI conversation test. */ class ScriptedTuiAdapter extends LlmAdapter { async * stream(options: GenerateOptions): AsyncIterable { const hasToolResult = options.messages.at(-1)?.content.some(block => block.type === 'tool-result') ?? false if (hasToolResult) { for (const chunk of textChunks(FINAL_TEXT)) yield chunk return } const args = JSON.stringify({ questions: [{ id: 'mode', header: 'Execution mode', question: 'How should the scripted run proceed?', options: [ { label: 'Safe', description: 'Use the guarded path.' }, { label: 'Fast', description: 'Use the shorter path.' }, ], }], }) const callId = CallId('call-ask-mode') yield { type: 'block-start', index: 0, blockType: 'text' } for (const char of INITIAL_TEXT) yield { type: 'text-delta', index: 0, text: char } yield { type: 'block-end', index: 0, block: { type: 'text', text: INITIAL_TEXT } } yield { type: 'block-start', index: 1, blockType: 'tool-call' } yield { type: 'tool-call-delta', index: 1, id: callId, name: 'ask_user_question', argumentsDelta: args } yield { type: 'block-end', index: 1, block: { type: 'tool-call', id: callId, name: 'ask_user_question', arguments: args }, } yield { type: 'usage', usage: { inputTokens: 20, outputTokens: 10 } } yield { type: 'finish', reason: { kind: 'tool-calls' } } } } export const name = 'tui-scripted-llm' export const inject = ['llm'] /** Register the network-free adapter used by the PTY fixture. */ export function apply(ctx: Context): void { ctx.llm.registerAdapter(['tui-scripted'], new ScriptedTuiAdapter()) }