/** * pi SDK 集成冒烟测试(与 src/main/pi/agent-service.ts 相同的调用路径) * 用法:node scripts/smoke.mjs * 验证点:会话创建、事件订阅、prompt 在无凭据时的报错传播。 */ import { createAgentSession } from '@earendil-works/pi-coding-agent' import { homedir } from 'node:os' const events = [] let settled = false console.log('[smoke] creating session (cwd=%s)...', homedir()) const { session } = await createAgentSession({ cwd: homedir() }) console.log('[smoke] session created: id=%s model=%s/%s', session.sessionId, session.model?.provider ?? '-', session.model?.id ?? '-') session.subscribe((event) => { events.push(event.type) if (event.type === 'message_update' && event.assistantMessageEvent?.type?.endsWith('_delta')) { const d = event.assistantMessageEvent.delta ?? '' process.stdout.write(d) } }) try { await session.prompt('回复"链路正常"两个字即可,不要调用任何工具。') console.log('\n[smoke] prompt resolved; event sequence:', [...new Set(events)].join(' -> ')) const last = session.getLastAssistantText() console.log('[smoke] last assistant text:', last ? JSON.stringify(last.slice(0, 120)) : '(none)') settled = true } catch (err) { console.log('\n[smoke] prompt rejected as expected (no credentials):', err instanceof Error ? err.message : err) } const stats = session.getSessionStats() console.log('[smoke] stats:', JSON.stringify({ messages: session.messages.length, cost: stats.cost })) console.log('[smoke] active tools:', session.getActiveToolNames().join(', ')) session.dispose() console.log('[smoke] done, settled=%s', String(settled)) process.exit(0)