@rnsk/tui
v0.0.3
Published
Terminal UI for Runstack — chat with your toolkits from the terminal via @ai-sdk/tui.
Readme
@rnsk/tui
Terminal UI for Runstack — chat with your toolkits from the terminal via @ai-sdk/tui + DefaultChatTransport.
Uses POST /api/tui/chat (API-key auth)
Install
npm i -g @rnsk/tuiAuth
rnsk auth login
# paste: rnsk_…
# One-off via env (no config write)
RNSK_API_KEY=rnsk_… rnsk chatKeys are stored in ~/.config/rnsk/config.json (0600, XDG_CONFIG_HOME respected, legacy ~/.rnsk/config.json read) or RNSK_API_KEY env.
Create a key at https://runstack.engineer → Settings → Workspace → API Keys.
Chat
rnsk chat
rnsk chat --toolkit github --toolkit notion
rnsk chat --agent agent_abc123 --title "Support Agent"
rnsk chat --system-prompt "Be concise"Controls (from @ai-sdk/tui): Enter submit, y/n approve tools, ↑/↓ PgUp/PgDn scroll, Ctrl+L repaint, Esc/Ctrl+C exit.
When a tool needs OAuth, initiateConnection returns a URL in the tool output — open it, connect in the browser, then type “connected”.
Programmatic
import { runRunstackTUI, createRunstackTransport } from '@rnsk/tui';
import { runAgentTUI } from '@ai-sdk/tui';
await runRunstackTUI({ apiKey: 'rnsk_…', toolkitIds: ['github'] });
// or custom
const transport = createRunstackTransport({ apiKey: 'rnsk_…', agentIds: ['agent_xxx'] });
await runAgentTUI({ title: 'Runstack', transport });How it works
DefaultChatTransport→POST {apiBase}/api/tui/chatwithAuthorization: Bearer rnsk_…+{messages: UIMessage[], agentIds?, toolkitIds?, systemPrompt?}.- Server streams back
UIMessagechunks viapipeUIMessageStreamToResponse. runAgentTUIrenders markdown, tool cards, reasoning, approvals.
Troubleshooting
Missing API key→rnsk auth loginorRNSK_API_KEY=…401→ key invalid — recreate at Settings → Workspace → API Keys on https://runstack.engineer429→ usage limit — upgrade planNetwork error→ checkapiBasereachable:curl -H "Authorization: Bearer rnsk_…" https://app.runstack.engineer/api/tui/config
