import readline from 'node:readline'; const send = m => process.stdout.write(JSON.stringify(m) + '\n'); let initialized = false; let acknowledged = false; let approvalId; let turn = 0; const finish = () => { const ids = { threadId: 'thr_demo', turnId: `turn_${turn}`, itemId: `msg_${turn}` }; send({ method: 'item/started', params: { ...ids, item: { id: ids.itemId, type: 'agentMessage', text: '' } } }); for (const delta of ['接続できました。', 'これはモック応答です。']) { send({ method: 'item/agentMessage/delta', params: { ...ids, delta } }); } send({ method: 'item/completed', params: { ...ids, item: { id: ids.itemId, type: 'agentMessage', text: '接続できました。これはモック応答です。' } } }); send({ method: 'turn/completed', params: { threadId: ids.threadId, turn: { id: ids.turnId, status: 'completed', items: [], error: null } } }); }; readline.createInterface({ input: process.stdin }).on('line', line => { const m = JSON.parse(line); if (!m.method) { if (m.id === approvalId) { send({ method: 'serverRequest/resolved', params: { threadId: 'thr_demo', requestId: m.id } }); finish(); } return; } if (m.method === 'initialize') { if (initialized) return send({ id: m.id, error: { code: -32600, message: 'Already initialized' } }); initialized = true; return send({ id: m.id, result: { userAgent: 'guide-mock/1.0', platformFamily: 'unix', platformOs: 'mock' } }); } if (m.method === 'initialized') { acknowledged = initialized; return; } if (!acknowledged) return send({ id: m.id, error: { code: -32600, message: 'Not initialized' } }); if (m.method === 'thread/start' || m.method === 'thread/resume') { return send({ id: m.id, result: { thread: { id: 'thr_demo' } } }); } if (m.method === 'turn/start') { turn++; send({ method: 'turn/started', params: { threadId: 'thr_demo', turn: { id: `turn_${turn}`, status: 'inProgress', items: [], error: null } } }); if (process.env.GUIDE_MOCK_APPROVAL === '1') { approvalId = m.id; // 同じ id の逆向き要求でも衝突しないことを試す。 send({ method: 'item/commandExecution/requestApproval', id: approvalId, params: { threadId: 'thr_demo', turnId: `turn_${turn}`, itemId: 'cmd_demo', command: 'echo demo', cwd: '/tmp', reason: '教材の模擬承認' } }); } else finish(); // 応答より先に完了通知を送り、取りこぼしを試す。 send({ id: m.id, result: { turn: { id: `turn_${turn}`, status: 'inProgress', items: [], error: null } } }); return; } send({ id: m.id, error: { code: -32601, message: 'Method not found' } }); });