/** * Interactive Session Example * Demonstrates handling all message types and building an interactive experience */ import { query } from '@instantlyeasy/claude-code-sdk-ts'; import readline from 'readline'; const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); function prompt(question) { return new Promise((resolve) => { rl.question(question, resolve); }); } async function runQuery(userPrompt, options = {}) { const defaultOptions = { permissionMode: 'acceptEdits', allowedTools: ['Read', 'Write', 'Edit', 'Bash', 'Grep', 'Glob'] }; const mergedOptions = { ...defaultOptions, ...options }; console.log('\n' + '─'.repeat(60)); let hasOutput = false; for await (const message of query(userPrompt, mergedOptions)) { switch (message.type) { case 'system': if (message.subtype === 'init') { console.log(`šŸš€ Session ${message.data.session_id.slice(0, 8)}...`); console.log(`šŸ“‹ Available tools: ${message.data.tools.slice(0, 5).join(', ')}...`); console.log('─'.repeat(60) + '\n'); } break; case 'assistant': hasOutput = true; for (const block of message.content) { if (block.type === 'text') { console.log('šŸ¤– Claude:', block.text); } else if (block.type === 'tool_use') { console.log(`\nšŸ”§ ${block.name}:`, JSON.stringify(block.input, null, 2)); } } break; case 'user': // Tool results - you could show these if desired for (const block of message.content) { if (block.type === 'tool_result' && block.content) { console.log(`āœ… Result: ${block.content.slice(0, 100)}${block.content.length > 100 ? '...' : ''}`); } } break; case 'result': if (!hasOutput) { console.log('šŸ¤– Claude:', message.content); } console.log('\n' + '─'.repeat(60)); console.log(`✨ Completed in ${message.usage?.output_tokens || 0} tokens`); console.log(`šŸ’° Cost: $${message.cost?.total_cost || 0}`); break; } } } async function main() { console.log('šŸŽÆ Claude Code SDK - Interactive Session'); console.log('Type "exit" to quit, "help" for commands\n'); const helpText = ` Available commands: exit - Quit the session help - Show this help model: - Change model (e.g., model:opus) mode: - Change permission mode (default/acceptEdits/bypassPermissions) Example prompts: - Create a Python script that calculates fibonacci numbers - What files are in the current directory? - Read package.json and explain what this project does - Create a simple web server in Node.js `; let currentOptions = {}; while (true) { const input = await prompt('\nšŸ’­ Your prompt: '); if (input.toLowerCase() === 'exit') { console.log('\nšŸ‘‹ Goodbye!'); break; } if (input.toLowerCase() === 'help') { console.log(helpText); continue; } if (input.startsWith('model:')) { currentOptions.model = input.slice(6); console.log(`āœ“ Model set to: ${currentOptions.model}`); continue; } if (input.startsWith('mode:')) { currentOptions.permissionMode = input.slice(5); console.log(`āœ“ Permission mode set to: ${currentOptions.permissionMode}`); continue; } try { await runQuery(input, currentOptions); } catch (error) { console.error('\nāŒ Error:', error.message); if (error.message.includes('authentication')) { console.log('\nšŸ’” Tip: Make sure you\'re logged in with: claude login'); } } } rl.close(); } main().catch(console.error);