@agentskit/ink
Advanced tools
+5
-2
@@ -236,3 +236,6 @@ 'use strict'; | ||
| ink.useInput((input, key) => { | ||
| if (isBusy) return; | ||
| if (isBusy) { | ||
| if (chat.status === "streaming" && key.escape) chat.stop(); | ||
| return; | ||
| } | ||
| if (key.upArrow) { | ||
@@ -286,3 +289,3 @@ if (effectiveHistory.length === 0) return; | ||
| }); | ||
| const hint = isBusy ? chat.status === "streaming" ? "streaming response... press Ctrl+C to abort" : "input disabled" : effectiveHistory.length > 0 ? `${placeholder} \xB7 \u2191/\u2193 to recall previous messages` : placeholder; | ||
| const hint = isBusy ? chat.status === "streaming" ? "streaming response... press Esc to stop" : "input disabled" : effectiveHistory.length > 0 ? `${placeholder} \xB7 \u2191/\u2193 to recall previous messages` : placeholder; | ||
| return /* @__PURE__ */ jsxRuntime.jsxs(ink.Box, { flexDirection: "column", children: [ | ||
@@ -289,0 +292,0 @@ /* @__PURE__ */ jsxRuntime.jsx(ink.Text, { dimColor: true, children: hint }), |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/useChat.ts","../src/progress-observer.ts","../src/components/ChatContainer.tsx","../src/components/MarkdownText.tsx","../src/components/theme.tsx","../src/components/Message.tsx","../src/components/InputBar.tsx","../src/components/ToolCallView.tsx","../src/components/ThinkingIndicator.tsx","../src/components/StatusHeader.tsx","../src/components/ToolConfirmation.tsx","../src/components/TopologyGraphView.tsx"],"names":["useRef","createChatController","useEffect","useSyncExternalStore","Box","Marked","markedTerminal","useMemo","jsx","Text","createContext","useContext","jsxs","useState","useInput","truncate","SPINNER_FRAMES","React"],"mappings":"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","file":"index.cjs","sourcesContent":["// NOTE: This hook is intentionally duplicated from @agentskit/react (packages/react/src/useChat.ts).\n// The two packages are React siblings and cannot cross-depend, so the hook is kept in sync\n// manually. A sync-guard test at packages/ink/tests/useChat-sync.test.ts will fail if they drift.\n// When changing this file, mirror the same change in packages/react/src/useChat.ts.\nimport { useEffect, useRef, useSyncExternalStore } from 'react'\nimport { createChatController } from '@agentskit/core'\nimport type { ChatConfig, ChatController, ChatReturn } from '@agentskit/core'\n\nexport function useChat(config: ChatConfig): ChatReturn {\n const controllerRef = useRef<ChatController | null>(null)\n\n if (!controllerRef.current) {\n controllerRef.current = createChatController(config)\n }\n\n useEffect(() => {\n controllerRef.current?.updateConfig(config)\n }, [config])\n\n useEffect(() => () => controllerRef.current?.stop(), [])\n\n const state = useSyncExternalStore(\n controllerRef.current.subscribe,\n controllerRef.current.getState,\n controllerRef.current.getState\n )\n\n return {\n ...state,\n send: controllerRef.current.send,\n stop: controllerRef.current.stop,\n retry: controllerRef.current.retry,\n edit: controllerRef.current.edit,\n regenerate: controllerRef.current.regenerate,\n setInput: controllerRef.current.setInput,\n clear: controllerRef.current.clear,\n approve: controllerRef.current.approve,\n deny: controllerRef.current.deny,\n }\n}\n","import type { AgentEvent, Observer } from '@agentskit/core'\n\n/**\n * Headless progress renderer for standalone (non-chat) agent runs. Returns an\n * Observer you pass in `observers: [...]`; it renders `{ type: 'progress' }`\n * AgentEvents as an animated spinner line per stage — no Ink/React render tree,\n * just ANSI, so it works in any terminal or CI log. Same braille frames as the\n * chat-UI ThinkingIndicator.\n *\n * ```ts\n * import { createProgressObserver } from '@agentskit/ink'\n * const agent = createMyAgent({ adapter, observers: [createProgressObserver()] })\n * ```\n */\nexport const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const\n\nconst C = {\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n reset: '\\x1b[0m',\n}\n\nexport interface ProgressObserverOptions {\n /** Where to write. Default: process.stdout. */\n write?: (chunk: string) => void\n /** Disable ANSI colors/animation (e.g. non-TTY CI). Default: !process.stdout.isTTY. */\n plain?: boolean\n}\n\nexport function createProgressObserver(options: ProgressObserverOptions = {}): Observer {\n const write = options.write ?? ((s: string) => process.stdout.write(s))\n const plain = options.plain ?? !process.stdout?.isTTY\n let timer: ReturnType<typeof setInterval> | null = null\n let frame = 0\n const stop = () => {\n if (timer) {\n clearInterval(timer)\n timer = null\n }\n }\n\n return {\n name: 'progress-renderer',\n on(event: AgentEvent) {\n if (event.type !== 'progress') return\n const label = event.label.padEnd(12)\n\n if (event.status === 'start') {\n if (plain) {\n write(` … ${event.label}\\n`)\n return\n }\n stop()\n timer = setInterval(() => {\n frame = (frame + 1) % SPINNER_FRAMES.length\n write(`\\r ${C.cyan}${SPINNER_FRAMES[frame]}${C.reset} ${label}\\x1b[K`)\n }, 80)\n // Don't let the spinner keep the event loop alive if the run throws\n // before the resolving event fires.\n timer.unref?.()\n return\n }\n\n stop()\n const sym = event.status === 'ok' ? '✓' : event.status === 'error' ? '⛔' : '–'\n const color = event.status === 'ok' ? C.green : event.status === 'error' ? C.red : C.yellow\n const cr = plain ? '' : '\\r'\n const clr = plain ? '' : '\\x1b[K' // clear to EOL so a long spinner line leaves no leftover chars\n const c = plain ? '' : color\n const r = plain ? '' : C.reset\n const d = plain ? '' : C.dim\n // Build `time` from the plain-aware codes too — otherwise the duration keeps\n // raw ANSI in non-TTY/CI logs, defeating the whole point of `plain`.\n const time = event.durationMs ? ` ${d}(${(event.durationMs / 1000).toFixed(1)}s)${r}` : ''\n write(`${cr} ${c}${sym}${r} ${label} ${d}${event.detail ?? ''}${r}${time}${clr}\\n`)\n },\n }\n}\n","import React, { type ReactNode } from 'react'\nimport { Box } from 'ink'\n\nexport interface ChatContainerProps {\n children: ReactNode\n}\n\nexport function ChatContainer({ children }: ChatContainerProps) {\n return (\n <Box flexDirection=\"column\" gap={1}>\n {children}\n </Box>\n )\n}\n","import React, { useMemo } from 'react'\nimport { Text } from 'ink'\nimport { Marked } from 'marked'\nimport { markedTerminal } from 'marked-terminal'\n\nexport interface MarkdownTextProps {\n content: string\n}\n\n/**\n * One shared Marked instance — creating it per render forces the terminal\n * renderer to re-register its hooks every time.\n */\nconst marked = new Marked()\nmarked.use(\n markedTerminal({\n width: 80,\n reflowText: true,\n tab: 2,\n }) as unknown as Parameters<typeof marked.use>[0]\n)\n\n/**\n * Renders markdown (incl. tables, code blocks, links) to ANSI-styled text.\n * Delegates parsing to `marked` and terminal rendering to `marked-terminal`;\n * Ink's `<Text>` passes ANSI escapes through untouched.\n */\nexport function MarkdownText({ content }: MarkdownTextProps) {\n const rendered = useMemo(() => {\n try {\n const output = marked.parse(content, { async: false }) as string\n return output.replace(/\\n+$/, '')\n } catch {\n return content\n }\n }, [content])\n\n return <Text>{rendered}</Text>\n}\n","import React, { createContext, useContext } from 'react'\nimport type { MessageRole, ToolCallStatus } from '@agentskit/core'\n\nexport interface InkTheme {\n roles: Record<MessageRole, { icon: string; label: string; color: string }>\n toolStatus: Record<ToolCallStatus, { icon: string; color: string; label: string }>\n prompt: { active: string; busy: string }\n inputText: { active: string; busy: string }\n header: { border: string; title: string }\n usage: { prompt: string; completion: string }\n segment: {\n provider: string\n model: string\n modeLive: string\n modeDemo: string\n tools: string\n muted: string\n }\n}\n\nexport const defaultInkTheme: InkTheme = {\n roles: {\n user: { icon: '❯', label: 'you', color: 'green' },\n assistant: { icon: '✦', label: 'assistant', color: 'cyan' },\n system: { icon: '◆', label: 'system', color: 'yellow' },\n tool: { icon: '⚙', label: 'tool', color: 'magenta' },\n },\n toolStatus: {\n pending: { icon: '○', color: 'gray', label: 'pending' },\n running: { icon: '⠋', color: 'cyan', label: 'running' },\n complete: { icon: '✓', color: 'green', label: 'complete' },\n error: { icon: '✗', color: 'red', label: 'error' },\n requires_confirmation: { icon: '?', color: 'yellow', label: 'requires_confirmation' },\n },\n prompt: { active: 'cyan', busy: 'gray' },\n inputText: { active: 'white', busy: 'gray' },\n header: { border: 'cyan', title: 'cyan' },\n usage: { prompt: 'green', completion: 'yellow' },\n segment: {\n provider: 'cyan',\n model: 'magenta',\n modeLive: 'green',\n modeDemo: 'yellow',\n tools: 'blue',\n muted: 'gray',\n },\n}\n\nconst ThemeContext = createContext<InkTheme>(defaultInkTheme)\n\nexport function InkThemeProvider({\n theme,\n children,\n}: {\n theme?: Partial<InkTheme>\n children: React.ReactNode\n}) {\n const merged: InkTheme = theme ? { ...defaultInkTheme, ...theme } : defaultInkTheme\n return <ThemeContext.Provider value={merged}>{children}</ThemeContext.Provider>\n}\n\nexport function useInkTheme(): InkTheme {\n return useContext(ThemeContext)\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport type { Message as MessageType, TokenUsage } from '@agentskit/core'\nimport { MarkdownText } from './MarkdownText'\nimport { useInkTheme } from './theme'\n\nexport interface MessageProps {\n message: MessageType\n /**\n * Render assistant message content as markdown (headings, lists, code,\n * bold, italic, links). Default: `true`. Set to `false` to render as\n * plain text — useful for tool output or raw logs.\n */\n markdown?: boolean\n /**\n * Show inline token usage below assistant messages when the adapter\n * surfaces it (via `message.metadata.usage`). Default: `true`.\n */\n showUsage?: boolean\n}\n\nfunction formatTokens(n: number): string {\n if (n < 1000) return String(n)\n if (n < 1_000_000) return `${(n / 1000).toFixed(1)}k`\n return `${(n / 1_000_000).toFixed(2)}m`\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text\n return `${text.slice(0, max)}…`\n}\n\nexport function Message({ message, markdown = true, showUsage = true }: MessageProps) {\n const theme = useInkTheme()\n const meta = theme.roles[message.role] ?? theme.roles.assistant\n const isStreaming = message.status === 'streaming'\n\n // Tool-role messages are raw results passed back to the model; render compact.\n if (message.role === 'tool') {\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text dimColor>\n <Text color={meta.color}>{meta.icon} </Text>\n tool result\n </Text>\n <Text dimColor>{truncate(message.content, 400)}</Text>\n </Box>\n )\n }\n\n const shouldRenderMarkdown = markdown && message.role === 'assistant' && !!message.content\n const usage = message.metadata?.usage as TokenUsage | undefined\n const shouldRenderUsage =\n showUsage && message.role === 'assistant' && usage && usage.totalTokens > 0\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={meta.color} bold>\n {meta.icon} {meta.label}\n </Text>\n {isStreaming ? <Text dimColor> · streaming</Text> : null}\n </Box>\n {message.content ? (\n shouldRenderMarkdown ? (\n <MarkdownText content={message.content} />\n ) : (\n <Text>{message.content}</Text>\n )\n ) : null}\n {shouldRenderUsage && usage ? (\n <Box>\n <Text dimColor>tokens </Text>\n <Text color={theme.usage.prompt}>↑{formatTokens(usage.promptTokens)}</Text>\n <Text dimColor> </Text>\n <Text color={theme.usage.completion}>↓{formatTokens(usage.completionTokens)}</Text>\n <Text dimColor> · </Text>\n <Text dimColor>{formatTokens(usage.totalTokens)} total</Text>\n </Box>\n ) : null}\n </Box>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { ChatReturn } from '@agentskit/core'\nimport { useInkTheme } from './theme'\n\nexport interface InputBarProps {\n chat: ChatReturn\n placeholder?: string\n disabled?: boolean\n /**\n * Prior messages to cycle through with arrow up/down. Typically the user\n * messages from `chat.messages`, most recent last. Omitted → derived\n * from `chat.messages`.\n */\n history?: string[]\n /**\n * Optional hook called on Enter before `chat.send`. Return `true` if the\n * handler consumed the input (e.g. a slash command); the bar will skip\n * calling `chat.send` and clear the input itself.\n */\n onSubmitInput?: (input: string) => boolean | Promise<boolean>\n}\n\nconst CURSOR_MS = 500\n\nfunction deriveHistory(chat: ChatReturn): string[] {\n return chat.messages\n .filter(m => m.role === 'user')\n .map(m => m.content)\n}\n\nexport function InputBar({\n chat,\n placeholder = 'Type a message...',\n disabled = false,\n history,\n onSubmitInput,\n}: InputBarProps) {\n const theme = useInkTheme()\n const isBusy = disabled || chat.status === 'streaming'\n const [cursorOn, setCursorOn] = useState(true)\n\n // Pointer into history. -1 = live input. 0..N-1 = pointing at history[i].\n const [historyIndex, setHistoryIndex] = useState(-1)\n // Snapshot of the in-progress input so the user can scroll back to it.\n const liveDraftRef = useRef<string>('')\n\n const effectiveHistory = history ?? deriveHistory(chat)\n\n useEffect(() => {\n const id = setInterval(() => setCursorOn(v => !v), CURSOR_MS)\n return () => clearInterval(id)\n }, [])\n\n useInput((input, key) => {\n if (isBusy) return\n\n if (key.upArrow) {\n if (effectiveHistory.length === 0) return\n if (historyIndex === -1) liveDraftRef.current = chat.input\n const nextIndex = historyIndex === -1\n ? effectiveHistory.length - 1\n : Math.max(0, historyIndex - 1)\n setHistoryIndex(nextIndex)\n chat.setInput(effectiveHistory[nextIndex])\n return\n }\n\n if (key.downArrow) {\n if (historyIndex === -1) return\n const nextIndex = historyIndex + 1\n if (nextIndex >= effectiveHistory.length) {\n setHistoryIndex(-1)\n chat.setInput(liveDraftRef.current)\n } else {\n setHistoryIndex(nextIndex)\n chat.setInput(effectiveHistory[nextIndex])\n }\n return\n }\n\n if (key.return) {\n const value = chat.input\n if (!value.trim()) return\n setHistoryIndex(-1)\n liveDraftRef.current = ''\n if (onSubmitInput) {\n void Promise.resolve(onSubmitInput(value)).then(consumed => {\n if (consumed) {\n chat.setInput('')\n return\n }\n void chat.send(value)\n })\n return\n }\n void chat.send(value)\n return\n }\n\n if (key.backspace || key.delete) {\n // Any edit exits history navigation so subsequent text builds a new\n // draft, not a mutation of the recalled message.\n if (historyIndex !== -1) setHistoryIndex(-1)\n chat.setInput(chat.input.slice(0, -1))\n return\n }\n\n if (input && !key.ctrl && !key.meta) {\n if (historyIndex !== -1) setHistoryIndex(-1)\n chat.setInput(`${chat.input}${input}`)\n }\n })\n\n const hint = isBusy\n ? chat.status === 'streaming'\n ? 'streaming response... press Ctrl+C to abort'\n : 'input disabled'\n : effectiveHistory.length > 0\n ? `${placeholder} · ↑/↓ to recall previous messages`\n : placeholder\n\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>{hint}</Text>\n <Box>\n <Text color={isBusy ? theme.prompt.busy : theme.prompt.active} bold>\n ❯{' '}\n </Text>\n <Text color={isBusy ? theme.inputText.busy : theme.inputText.active}>\n {chat.input}\n {!isBusy && cursorOn ? <Text inverse> </Text> : null}\n </Text>\n </Box>\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolCall } from '@agentskit/core'\nimport { useInkTheme } from './theme'\n\nexport interface ToolCallViewProps {\n toolCall: ToolCall\n expanded?: boolean\n /** Max characters rendered from result/error. Default 500. */\n resultPreviewChars?: number\n /** Max characters rendered from args. Default 120. */\n argsPreviewChars?: number\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text\n return `${text.slice(0, max)}…`\n}\n\nfunction previewArgs(args: unknown, max: number): string {\n try {\n const serialized = typeof args === 'string' ? args : JSON.stringify(args)\n return truncate(serialized ?? '', max)\n } catch {\n return '[unserializable]'\n }\n}\n\nexport function ToolCallView({\n toolCall,\n expanded = false,\n resultPreviewChars = 500,\n argsPreviewChars = 120,\n}: ToolCallViewProps) {\n const theme = useInkTheme()\n const meta = theme.toolStatus[toolCall.status] ?? theme.toolStatus.pending\n const [frame, setFrame] = useState(0)\n const isRunning = toolCall.status === 'running'\n\n useEffect(() => {\n if (!isRunning) return\n const id = setInterval(() => setFrame(f => (f + 1) % SPINNER.length), 80)\n return () => clearInterval(id)\n }, [isRunning])\n\n const icon = isRunning ? SPINNER[frame] : meta.icon\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={meta.color} paddingX={1}>\n <Box>\n <Text color={meta.color} bold>\n {icon} {toolCall.name}\n </Text>\n <Text dimColor> · {meta.label}</Text>\n </Box>\n\n {expanded ? (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text dimColor>args: {previewArgs(toolCall.args, argsPreviewChars)}</Text>\n {toolCall.result ? (\n <Text>{truncate(toolCall.result, resultPreviewChars)}</Text>\n ) : null}\n {toolCall.error ? (\n <Text color={theme.toolStatus.error.color}>{truncate(toolCall.error, resultPreviewChars)}</Text>\n ) : null}\n </Box>\n ) : null}\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface ThinkingIndicatorProps {\n visible: boolean\n label?: string\n}\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\nconst FRAME_MS = 80\n\nexport function ThinkingIndicator({ visible, label = 'Thinking' }: ThinkingIndicatorProps) {\n const [frame, setFrame] = useState(0)\n\n useEffect(() => {\n if (!visible) return\n const id = setInterval(() => {\n setFrame(f => (f + 1) % SPINNER_FRAMES.length)\n }, FRAME_MS)\n return () => clearInterval(id)\n }, [visible])\n\n if (!visible) return null\n\n return (\n <Box>\n <Text color=\"cyan\">{SPINNER_FRAMES[frame]} </Text>\n <Text dimColor italic>\n {label}\n </Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { useInkTheme } from './theme'\n\nexport interface StatusHeaderProps {\n title?: string\n provider?: string\n model?: string\n tools?: string[]\n mode?: 'demo' | 'live'\n messageCount?: number\n sessionId?: string\n}\n\nexport function StatusHeader({\n title = 'AgentsKit CLI',\n provider,\n model,\n tools,\n mode,\n messageCount,\n sessionId,\n}: StatusHeaderProps) {\n const theme = useInkTheme()\n const segments: Array<{ label: string; value: string; color?: string }> = []\n\n if (provider) segments.push({ label: 'provider', value: provider, color: theme.segment.provider })\n if (model) segments.push({ label: 'model', value: model, color: theme.segment.model })\n if (mode) segments.push({ label: 'mode', value: mode, color: mode === 'live' ? theme.segment.modeLive : theme.segment.modeDemo })\n if (tools && tools.length > 0) {\n segments.push({ label: 'tools', value: tools.join(','), color: theme.segment.tools })\n }\n if (typeof messageCount === 'number') {\n segments.push({ label: 'msgs', value: String(messageCount), color: theme.segment.muted })\n }\n if (sessionId) {\n segments.push({ label: 'session', value: sessionId.slice(0, 12), color: theme.segment.muted })\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.header.border} paddingX={1}>\n <Text color={theme.header.title} bold>\n ✦ {title}\n </Text>\n {segments.length > 0 ? (\n <Text wrap=\"truncate-end\">\n {segments.map((seg, i) => (\n <React.Fragment key={seg.label}>\n {i > 0 ? <Text dimColor> · </Text> : null}\n <Text dimColor>{seg.label}=</Text>\n <Text color={seg.color ?? 'white'}>{seg.value}</Text>\n </React.Fragment>\n ))}\n </Text>\n ) : null}\n </Box>\n )\n}\n","import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { ToolCall } from '@agentskit/core'\n\nexport interface ToolConfirmationProps {\n toolCall: ToolCall\n onApprove: (toolCallId: string) => void\n onDeny: (toolCallId: string, reason?: string) => void\n /**\n * Called when the user picks \"allow for this session\" — approves the\n * current call and signals that further calls with this tool name should\n * run without prompting.\n */\n onApproveAlways?: (toolCallId: string, toolName: string) => void\n}\n\ntype Choice = 'allow_once' | 'allow_session' | 'deny'\n\ninterface Option {\n key: Choice\n label: string\n hint: string\n color: string\n}\n\nconst OPTIONS: Option[] = [\n { key: 'allow_once', label: 'Yes', hint: 'allow this call', color: 'green' },\n { key: 'allow_session', label: 'Yes, for session', hint: 'stop asking for this tool', color: 'cyan' },\n { key: 'deny', label: 'No', hint: 'deny and tell the model why', color: 'red' },\n]\n\nexport function ToolConfirmation({\n toolCall,\n onApprove,\n onDeny,\n onApproveAlways,\n}: ToolConfirmationProps) {\n const [index, setIndex] = useState(0)\n const active = toolCall.status === 'requires_confirmation'\n\n useInput((input, key) => {\n if (!active) return\n\n if (key.upArrow || (key.shift && key.tab)) {\n setIndex(i => (i - 1 + OPTIONS.length) % OPTIONS.length)\n return\n }\n if (key.downArrow || key.tab) {\n setIndex(i => (i + 1) % OPTIONS.length)\n return\n }\n\n if (key.return) {\n const choice = OPTIONS[index].key\n if (choice === 'allow_once') onApprove(toolCall.id)\n else if (choice === 'allow_session') {\n if (onApproveAlways) onApproveAlways(toolCall.id, toolCall.name)\n else onApprove(toolCall.id)\n }\n else onDeny(toolCall.id)\n return\n }\n\n // Numeric shortcuts for quick picking.\n if (input === '1') { setIndex(0); onApprove(toolCall.id) }\n else if (input === '2') {\n setIndex(1)\n if (onApproveAlways) onApproveAlways(toolCall.id, toolCall.name)\n else onApprove(toolCall.id)\n }\n else if (input === '3') { setIndex(2); onDeny(toolCall.id) }\n })\n\n if (!active) return null\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1} borderColor=\"yellow\">\n <Text color=\"yellow\" bold>\n ⚠ Allow {toolCall.name}?\n </Text>\n <Text dimColor>{JSON.stringify(toolCall.args)}</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {OPTIONS.map((opt, i) => {\n const selected = i === index\n return (\n <Box key={opt.key}>\n <Text color={selected ? opt.color : 'gray'}>\n {selected ? '❯ ' : ' '}\n </Text>\n <Text color={selected ? opt.color : 'white'} bold={selected}>\n {i + 1}. {opt.label}\n </Text>\n <Text dimColor> — {opt.hint}</Text>\n </Box>\n )\n })}\n </Box>\n <Text dimColor>↑/↓ to move, Enter to pick, 1–3 for shortcuts</Text>\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { useInkTheme } from './theme'\n\nexport interface TopologyGraphViewNode {\n id: string\n label: string\n topology: string\n startCount: number\n endCount: number\n errorCount: number\n lastActiveAt: number\n}\n\nexport interface TopologyGraphViewEdge {\n id: string\n from: string\n to: string\n count: number\n lastTask?: string\n lastResult?: string\n}\n\nexport interface TopologyGraphViewSnapshot {\n nodes: TopologyGraphViewNode[]\n edges: TopologyGraphViewEdge[]\n updatedAt: string\n}\n\nexport interface TopologyGraphSource {\n toJSON: () => TopologyGraphViewSnapshot\n subscribe: (handler: (s: TopologyGraphViewSnapshot) => void) => () => void\n}\n\nexport interface TopologyGraphViewProps {\n source: TopologyGraphSource\n}\n\nexport function TopologyGraphView({ source }: TopologyGraphViewProps) {\n const theme = useInkTheme()\n const [snap, setSnap] = useState<TopologyGraphViewSnapshot>(() => source.toJSON())\n\n useEffect(() => source.subscribe(setSnap), [source])\n\n const root = snap.nodes.find(n => n.id === '__root__')\n const others = snap.nodes.filter(n => n.id !== '__root__')\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1}>\n <Text bold>({root?.topology ?? 'topology'})</Text>\n {others.map(node => {\n const status =\n node.errorCount > 0\n ? { icon: '✗', color: theme.toolStatus.error.color }\n : node.endCount > 0\n ? { icon: '✓', color: theme.toolStatus.complete.color }\n : { icon: '…', color: theme.toolStatus.running.color }\n return (\n <Box key={node.id}>\n <Text color={status.color}>\n {' ├─ '}\n {status.icon} {node.label}\n </Text>\n <Text dimColor>\n {' '}({node.startCount} starts, {node.endCount} done)\n </Text>\n </Box>\n )\n })}\n </Box>\n )\n}\n"]} | ||
| {"version":3,"sources":["../src/useChat.ts","../src/progress-observer.ts","../src/components/ChatContainer.tsx","../src/components/MarkdownText.tsx","../src/components/theme.tsx","../src/components/Message.tsx","../src/components/InputBar.tsx","../src/components/ToolCallView.tsx","../src/components/ThinkingIndicator.tsx","../src/components/StatusHeader.tsx","../src/components/ToolConfirmation.tsx","../src/components/TopologyGraphView.tsx"],"names":["useRef","createChatController","useEffect","useSyncExternalStore","Box","Marked","markedTerminal","useMemo","jsx","Text","createContext","useContext","jsxs","useState","useInput","truncate","SPINNER_FRAMES","React"],"mappings":"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","file":"index.cjs","sourcesContent":["// NOTE: This hook is intentionally duplicated from @agentskit/react (packages/react/src/useChat.ts).\n// The two packages are React siblings and cannot cross-depend, so the hook is kept in sync\n// manually. A sync-guard test at packages/ink/tests/useChat-sync.test.ts will fail if they drift.\n// When changing this file, mirror the same change in packages/react/src/useChat.ts.\nimport { useEffect, useRef, useSyncExternalStore } from 'react'\nimport { createChatController } from '@agentskit/core'\nimport type { ChatConfig, ChatController, ChatReturn } from '@agentskit/core'\n\nexport function useChat(config: ChatConfig): ChatReturn {\n const controllerRef = useRef<ChatController | null>(null)\n\n if (!controllerRef.current) {\n controllerRef.current = createChatController(config)\n }\n\n useEffect(() => {\n controllerRef.current?.updateConfig(config)\n }, [config])\n\n useEffect(() => () => controllerRef.current?.stop(), [])\n\n const state = useSyncExternalStore(\n controllerRef.current.subscribe,\n controllerRef.current.getState,\n controllerRef.current.getState\n )\n\n return {\n ...state,\n send: controllerRef.current.send,\n stop: controllerRef.current.stop,\n retry: controllerRef.current.retry,\n edit: controllerRef.current.edit,\n regenerate: controllerRef.current.regenerate,\n setInput: controllerRef.current.setInput,\n clear: controllerRef.current.clear,\n approve: controllerRef.current.approve,\n deny: controllerRef.current.deny,\n }\n}\n","import type { AgentEvent, Observer } from '@agentskit/core'\n\n/**\n * Headless progress renderer for standalone (non-chat) agent runs. Returns an\n * Observer you pass in `observers: [...]`; it renders `{ type: 'progress' }`\n * AgentEvents as an animated spinner line per stage — no Ink/React render tree,\n * just ANSI, so it works in any terminal or CI log. Same braille frames as the\n * chat-UI ThinkingIndicator.\n *\n * ```ts\n * import { createProgressObserver } from '@agentskit/ink'\n * const agent = createMyAgent({ adapter, observers: [createProgressObserver()] })\n * ```\n */\nexport const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const\n\nconst C = {\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n reset: '\\x1b[0m',\n}\n\nexport interface ProgressObserverOptions {\n /** Where to write. Default: process.stdout. */\n write?: (chunk: string) => void\n /** Disable ANSI colors/animation (e.g. non-TTY CI). Default: !process.stdout.isTTY. */\n plain?: boolean\n}\n\nexport function createProgressObserver(options: ProgressObserverOptions = {}): Observer {\n const write = options.write ?? ((s: string) => process.stdout.write(s))\n const plain = options.plain ?? !process.stdout?.isTTY\n let timer: ReturnType<typeof setInterval> | null = null\n let frame = 0\n const stop = () => {\n if (timer) {\n clearInterval(timer)\n timer = null\n }\n }\n\n return {\n name: 'progress-renderer',\n on(event: AgentEvent) {\n if (event.type !== 'progress') return\n const label = event.label.padEnd(12)\n\n if (event.status === 'start') {\n if (plain) {\n write(` … ${event.label}\\n`)\n return\n }\n stop()\n timer = setInterval(() => {\n frame = (frame + 1) % SPINNER_FRAMES.length\n write(`\\r ${C.cyan}${SPINNER_FRAMES[frame]}${C.reset} ${label}\\x1b[K`)\n }, 80)\n // Don't let the spinner keep the event loop alive if the run throws\n // before the resolving event fires.\n timer.unref?.()\n return\n }\n\n stop()\n const sym = event.status === 'ok' ? '✓' : event.status === 'error' ? '⛔' : '–'\n const color = event.status === 'ok' ? C.green : event.status === 'error' ? C.red : C.yellow\n const cr = plain ? '' : '\\r'\n const clr = plain ? '' : '\\x1b[K' // clear to EOL so a long spinner line leaves no leftover chars\n const c = plain ? '' : color\n const r = plain ? '' : C.reset\n const d = plain ? '' : C.dim\n // Build `time` from the plain-aware codes too — otherwise the duration keeps\n // raw ANSI in non-TTY/CI logs, defeating the whole point of `plain`.\n const time = event.durationMs ? ` ${d}(${(event.durationMs / 1000).toFixed(1)}s)${r}` : ''\n write(`${cr} ${c}${sym}${r} ${label} ${d}${event.detail ?? ''}${r}${time}${clr}\\n`)\n },\n }\n}\n","import React, { type ReactNode } from 'react'\nimport { Box } from 'ink'\n\nexport interface ChatContainerProps {\n children: ReactNode\n}\n\nexport function ChatContainer({ children }: ChatContainerProps) {\n return (\n <Box flexDirection=\"column\" gap={1}>\n {children}\n </Box>\n )\n}\n","import React, { useMemo } from 'react'\nimport { Text } from 'ink'\nimport { Marked } from 'marked'\nimport { markedTerminal } from 'marked-terminal'\n\nexport interface MarkdownTextProps {\n content: string\n}\n\n/**\n * One shared Marked instance — creating it per render forces the terminal\n * renderer to re-register its hooks every time.\n */\nconst marked = new Marked()\nmarked.use(\n markedTerminal({\n width: 80,\n reflowText: true,\n tab: 2,\n }) as unknown as Parameters<typeof marked.use>[0]\n)\n\n/**\n * Renders markdown (incl. tables, code blocks, links) to ANSI-styled text.\n * Delegates parsing to `marked` and terminal rendering to `marked-terminal`;\n * Ink's `<Text>` passes ANSI escapes through untouched.\n */\nexport function MarkdownText({ content }: MarkdownTextProps) {\n const rendered = useMemo(() => {\n try {\n const output = marked.parse(content, { async: false }) as string\n return output.replace(/\\n+$/, '')\n } catch {\n return content\n }\n }, [content])\n\n return <Text>{rendered}</Text>\n}\n","import React, { createContext, useContext } from 'react'\nimport type { MessageRole, ToolCallStatus } from '@agentskit/core'\n\nexport interface InkTheme {\n roles: Record<MessageRole, { icon: string; label: string; color: string }>\n toolStatus: Record<ToolCallStatus, { icon: string; color: string; label: string }>\n prompt: { active: string; busy: string }\n inputText: { active: string; busy: string }\n header: { border: string; title: string }\n usage: { prompt: string; completion: string }\n segment: {\n provider: string\n model: string\n modeLive: string\n modeDemo: string\n tools: string\n muted: string\n }\n}\n\nexport const defaultInkTheme: InkTheme = {\n roles: {\n user: { icon: '❯', label: 'you', color: 'green' },\n assistant: { icon: '✦', label: 'assistant', color: 'cyan' },\n system: { icon: '◆', label: 'system', color: 'yellow' },\n tool: { icon: '⚙', label: 'tool', color: 'magenta' },\n },\n toolStatus: {\n pending: { icon: '○', color: 'gray', label: 'pending' },\n running: { icon: '⠋', color: 'cyan', label: 'running' },\n complete: { icon: '✓', color: 'green', label: 'complete' },\n error: { icon: '✗', color: 'red', label: 'error' },\n requires_confirmation: { icon: '?', color: 'yellow', label: 'requires_confirmation' },\n },\n prompt: { active: 'cyan', busy: 'gray' },\n inputText: { active: 'white', busy: 'gray' },\n header: { border: 'cyan', title: 'cyan' },\n usage: { prompt: 'green', completion: 'yellow' },\n segment: {\n provider: 'cyan',\n model: 'magenta',\n modeLive: 'green',\n modeDemo: 'yellow',\n tools: 'blue',\n muted: 'gray',\n },\n}\n\nconst ThemeContext = createContext<InkTheme>(defaultInkTheme)\n\nexport function InkThemeProvider({\n theme,\n children,\n}: {\n theme?: Partial<InkTheme>\n children: React.ReactNode\n}) {\n const merged: InkTheme = theme ? { ...defaultInkTheme, ...theme } : defaultInkTheme\n return <ThemeContext.Provider value={merged}>{children}</ThemeContext.Provider>\n}\n\nexport function useInkTheme(): InkTheme {\n return useContext(ThemeContext)\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport type { Message as MessageType, TokenUsage } from '@agentskit/core'\nimport { MarkdownText } from './MarkdownText'\nimport { useInkTheme } from './theme'\n\nexport interface MessageProps {\n message: MessageType\n /**\n * Render assistant message content as markdown (headings, lists, code,\n * bold, italic, links). Default: `true`. Set to `false` to render as\n * plain text — useful for tool output or raw logs.\n */\n markdown?: boolean\n /**\n * Show inline token usage below assistant messages when the adapter\n * surfaces it (via `message.metadata.usage`). Default: `true`.\n */\n showUsage?: boolean\n}\n\nfunction formatTokens(n: number): string {\n if (n < 1000) return String(n)\n if (n < 1_000_000) return `${(n / 1000).toFixed(1)}k`\n return `${(n / 1_000_000).toFixed(2)}m`\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text\n return `${text.slice(0, max)}…`\n}\n\nexport function Message({ message, markdown = true, showUsage = true }: MessageProps) {\n const theme = useInkTheme()\n const meta = theme.roles[message.role] ?? theme.roles.assistant\n const isStreaming = message.status === 'streaming'\n\n // Tool-role messages are raw results passed back to the model; render compact.\n if (message.role === 'tool') {\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text dimColor>\n <Text color={meta.color}>{meta.icon} </Text>\n tool result\n </Text>\n <Text dimColor>{truncate(message.content, 400)}</Text>\n </Box>\n )\n }\n\n const shouldRenderMarkdown = markdown && message.role === 'assistant' && !!message.content\n const usage = message.metadata?.usage as TokenUsage | undefined\n const shouldRenderUsage =\n showUsage && message.role === 'assistant' && usage && usage.totalTokens > 0\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={meta.color} bold>\n {meta.icon} {meta.label}\n </Text>\n {isStreaming ? <Text dimColor> · streaming</Text> : null}\n </Box>\n {message.content ? (\n shouldRenderMarkdown ? (\n <MarkdownText content={message.content} />\n ) : (\n <Text>{message.content}</Text>\n )\n ) : null}\n {shouldRenderUsage && usage ? (\n <Box>\n <Text dimColor>tokens </Text>\n <Text color={theme.usage.prompt}>↑{formatTokens(usage.promptTokens)}</Text>\n <Text dimColor> </Text>\n <Text color={theme.usage.completion}>↓{formatTokens(usage.completionTokens)}</Text>\n <Text dimColor> · </Text>\n <Text dimColor>{formatTokens(usage.totalTokens)} total</Text>\n </Box>\n ) : null}\n </Box>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { ChatReturn } from '@agentskit/core'\nimport { useInkTheme } from './theme'\n\nexport interface InputBarProps {\n chat: ChatReturn\n placeholder?: string\n disabled?: boolean\n /**\n * Prior messages to cycle through with arrow up/down. Typically the user\n * messages from `chat.messages`, most recent last. Omitted → derived\n * from `chat.messages`.\n */\n history?: string[]\n /**\n * Optional hook called on Enter before `chat.send`. Return `true` if the\n * handler consumed the input (e.g. a slash command); the bar will skip\n * calling `chat.send` and clear the input itself.\n */\n onSubmitInput?: (input: string) => boolean | Promise<boolean>\n}\n\nconst CURSOR_MS = 500\n\nfunction deriveHistory(chat: ChatReturn): string[] {\n return chat.messages\n .filter(m => m.role === 'user')\n .map(m => m.content)\n}\n\nexport function InputBar({\n chat,\n placeholder = 'Type a message...',\n disabled = false,\n history,\n onSubmitInput,\n}: InputBarProps) {\n const theme = useInkTheme()\n const isBusy = disabled || chat.status === 'streaming'\n const [cursorOn, setCursorOn] = useState(true)\n\n // Pointer into history. -1 = live input. 0..N-1 = pointing at history[i].\n const [historyIndex, setHistoryIndex] = useState(-1)\n // Snapshot of the in-progress input so the user can scroll back to it.\n const liveDraftRef = useRef<string>('')\n\n const effectiveHistory = history ?? deriveHistory(chat)\n\n useEffect(() => {\n const id = setInterval(() => setCursorOn(v => !v), CURSOR_MS)\n return () => clearInterval(id)\n }, [])\n\n useInput((input, key) => {\n if (isBusy) {\n if (chat.status === 'streaming' && key.escape) chat.stop()\n return\n }\n\n if (key.upArrow) {\n if (effectiveHistory.length === 0) return\n if (historyIndex === -1) liveDraftRef.current = chat.input\n const nextIndex = historyIndex === -1\n ? effectiveHistory.length - 1\n : Math.max(0, historyIndex - 1)\n setHistoryIndex(nextIndex)\n chat.setInput(effectiveHistory[nextIndex])\n return\n }\n\n if (key.downArrow) {\n if (historyIndex === -1) return\n const nextIndex = historyIndex + 1\n if (nextIndex >= effectiveHistory.length) {\n setHistoryIndex(-1)\n chat.setInput(liveDraftRef.current)\n } else {\n setHistoryIndex(nextIndex)\n chat.setInput(effectiveHistory[nextIndex])\n }\n return\n }\n\n if (key.return) {\n const value = chat.input\n if (!value.trim()) return\n setHistoryIndex(-1)\n liveDraftRef.current = ''\n if (onSubmitInput) {\n void Promise.resolve(onSubmitInput(value)).then(consumed => {\n if (consumed) {\n chat.setInput('')\n return\n }\n void chat.send(value)\n })\n return\n }\n void chat.send(value)\n return\n }\n\n if (key.backspace || key.delete) {\n // Any edit exits history navigation so subsequent text builds a new\n // draft, not a mutation of the recalled message.\n if (historyIndex !== -1) setHistoryIndex(-1)\n chat.setInput(chat.input.slice(0, -1))\n return\n }\n\n if (input && !key.ctrl && !key.meta) {\n if (historyIndex !== -1) setHistoryIndex(-1)\n chat.setInput(`${chat.input}${input}`)\n }\n })\n\n const hint = isBusy\n ? chat.status === 'streaming'\n ? 'streaming response... press Esc to stop'\n : 'input disabled'\n : effectiveHistory.length > 0\n ? `${placeholder} · ↑/↓ to recall previous messages`\n : placeholder\n\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>{hint}</Text>\n <Box>\n <Text color={isBusy ? theme.prompt.busy : theme.prompt.active} bold>\n ❯{' '}\n </Text>\n <Text color={isBusy ? theme.inputText.busy : theme.inputText.active}>\n {chat.input}\n {!isBusy && cursorOn ? <Text inverse> </Text> : null}\n </Text>\n </Box>\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolCall } from '@agentskit/core'\nimport { useInkTheme } from './theme'\n\nexport interface ToolCallViewProps {\n toolCall: ToolCall\n expanded?: boolean\n /** Max characters rendered from result/error. Default 500. */\n resultPreviewChars?: number\n /** Max characters rendered from args. Default 120. */\n argsPreviewChars?: number\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text\n return `${text.slice(0, max)}…`\n}\n\nfunction previewArgs(args: unknown, max: number): string {\n try {\n const serialized = typeof args === 'string' ? args : JSON.stringify(args)\n return truncate(serialized ?? '', max)\n } catch {\n return '[unserializable]'\n }\n}\n\nexport function ToolCallView({\n toolCall,\n expanded = false,\n resultPreviewChars = 500,\n argsPreviewChars = 120,\n}: ToolCallViewProps) {\n const theme = useInkTheme()\n const meta = theme.toolStatus[toolCall.status] ?? theme.toolStatus.pending\n const [frame, setFrame] = useState(0)\n const isRunning = toolCall.status === 'running'\n\n useEffect(() => {\n if (!isRunning) return\n const id = setInterval(() => setFrame(f => (f + 1) % SPINNER.length), 80)\n return () => clearInterval(id)\n }, [isRunning])\n\n const icon = isRunning ? SPINNER[frame] : meta.icon\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={meta.color} paddingX={1}>\n <Box>\n <Text color={meta.color} bold>\n {icon} {toolCall.name}\n </Text>\n <Text dimColor> · {meta.label}</Text>\n </Box>\n\n {expanded ? (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text dimColor>args: {previewArgs(toolCall.args, argsPreviewChars)}</Text>\n {toolCall.result ? (\n <Text>{truncate(toolCall.result, resultPreviewChars)}</Text>\n ) : null}\n {toolCall.error ? (\n <Text color={theme.toolStatus.error.color}>{truncate(toolCall.error, resultPreviewChars)}</Text>\n ) : null}\n </Box>\n ) : null}\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface ThinkingIndicatorProps {\n visible: boolean\n label?: string\n}\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\nconst FRAME_MS = 80\n\nexport function ThinkingIndicator({ visible, label = 'Thinking' }: ThinkingIndicatorProps) {\n const [frame, setFrame] = useState(0)\n\n useEffect(() => {\n if (!visible) return\n const id = setInterval(() => {\n setFrame(f => (f + 1) % SPINNER_FRAMES.length)\n }, FRAME_MS)\n return () => clearInterval(id)\n }, [visible])\n\n if (!visible) return null\n\n return (\n <Box>\n <Text color=\"cyan\">{SPINNER_FRAMES[frame]} </Text>\n <Text dimColor italic>\n {label}\n </Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { useInkTheme } from './theme'\n\nexport interface StatusHeaderProps {\n title?: string\n provider?: string\n model?: string\n tools?: string[]\n mode?: 'demo' | 'live'\n messageCount?: number\n sessionId?: string\n}\n\nexport function StatusHeader({\n title = 'AgentsKit CLI',\n provider,\n model,\n tools,\n mode,\n messageCount,\n sessionId,\n}: StatusHeaderProps) {\n const theme = useInkTheme()\n const segments: Array<{ label: string; value: string; color?: string }> = []\n\n if (provider) segments.push({ label: 'provider', value: provider, color: theme.segment.provider })\n if (model) segments.push({ label: 'model', value: model, color: theme.segment.model })\n if (mode) segments.push({ label: 'mode', value: mode, color: mode === 'live' ? theme.segment.modeLive : theme.segment.modeDemo })\n if (tools && tools.length > 0) {\n segments.push({ label: 'tools', value: tools.join(','), color: theme.segment.tools })\n }\n if (typeof messageCount === 'number') {\n segments.push({ label: 'msgs', value: String(messageCount), color: theme.segment.muted })\n }\n if (sessionId) {\n segments.push({ label: 'session', value: sessionId.slice(0, 12), color: theme.segment.muted })\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.header.border} paddingX={1}>\n <Text color={theme.header.title} bold>\n ✦ {title}\n </Text>\n {segments.length > 0 ? (\n <Text wrap=\"truncate-end\">\n {segments.map((seg, i) => (\n <React.Fragment key={seg.label}>\n {i > 0 ? <Text dimColor> · </Text> : null}\n <Text dimColor>{seg.label}=</Text>\n <Text color={seg.color ?? 'white'}>{seg.value}</Text>\n </React.Fragment>\n ))}\n </Text>\n ) : null}\n </Box>\n )\n}\n","import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { ToolCall } from '@agentskit/core'\n\nexport interface ToolConfirmationProps {\n toolCall: ToolCall\n onApprove: (toolCallId: string) => void\n onDeny: (toolCallId: string, reason?: string) => void\n /**\n * Called when the user picks \"allow for this session\" — approves the\n * current call and signals that further calls with this tool name should\n * run without prompting.\n */\n onApproveAlways?: (toolCallId: string, toolName: string) => void\n}\n\ntype Choice = 'allow_once' | 'allow_session' | 'deny'\n\ninterface Option {\n key: Choice\n label: string\n hint: string\n color: string\n}\n\nconst OPTIONS: Option[] = [\n { key: 'allow_once', label: 'Yes', hint: 'allow this call', color: 'green' },\n { key: 'allow_session', label: 'Yes, for session', hint: 'stop asking for this tool', color: 'cyan' },\n { key: 'deny', label: 'No', hint: 'deny and tell the model why', color: 'red' },\n]\n\nexport function ToolConfirmation({\n toolCall,\n onApprove,\n onDeny,\n onApproveAlways,\n}: ToolConfirmationProps) {\n const [index, setIndex] = useState(0)\n const active = toolCall.status === 'requires_confirmation'\n\n useInput((input, key) => {\n if (!active) return\n\n if (key.upArrow || (key.shift && key.tab)) {\n setIndex(i => (i - 1 + OPTIONS.length) % OPTIONS.length)\n return\n }\n if (key.downArrow || key.tab) {\n setIndex(i => (i + 1) % OPTIONS.length)\n return\n }\n\n if (key.return) {\n const choice = OPTIONS[index].key\n if (choice === 'allow_once') onApprove(toolCall.id)\n else if (choice === 'allow_session') {\n if (onApproveAlways) onApproveAlways(toolCall.id, toolCall.name)\n else onApprove(toolCall.id)\n }\n else onDeny(toolCall.id)\n return\n }\n\n // Numeric shortcuts for quick picking.\n if (input === '1') { setIndex(0); onApprove(toolCall.id) }\n else if (input === '2') {\n setIndex(1)\n if (onApproveAlways) onApproveAlways(toolCall.id, toolCall.name)\n else onApprove(toolCall.id)\n }\n else if (input === '3') { setIndex(2); onDeny(toolCall.id) }\n })\n\n if (!active) return null\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1} borderColor=\"yellow\">\n <Text color=\"yellow\" bold>\n ⚠ Allow {toolCall.name}?\n </Text>\n <Text dimColor>{JSON.stringify(toolCall.args)}</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {OPTIONS.map((opt, i) => {\n const selected = i === index\n return (\n <Box key={opt.key}>\n <Text color={selected ? opt.color : 'gray'}>\n {selected ? '❯ ' : ' '}\n </Text>\n <Text color={selected ? opt.color : 'white'} bold={selected}>\n {i + 1}. {opt.label}\n </Text>\n <Text dimColor> — {opt.hint}</Text>\n </Box>\n )\n })}\n </Box>\n <Text dimColor>↑/↓ to move, Enter to pick, 1–3 for shortcuts</Text>\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { useInkTheme } from './theme'\n\nexport interface TopologyGraphViewNode {\n id: string\n label: string\n topology: string\n startCount: number\n endCount: number\n errorCount: number\n lastActiveAt: number\n}\n\nexport interface TopologyGraphViewEdge {\n id: string\n from: string\n to: string\n count: number\n lastTask?: string\n lastResult?: string\n}\n\nexport interface TopologyGraphViewSnapshot {\n nodes: TopologyGraphViewNode[]\n edges: TopologyGraphViewEdge[]\n updatedAt: string\n}\n\nexport interface TopologyGraphSource {\n toJSON: () => TopologyGraphViewSnapshot\n subscribe: (handler: (s: TopologyGraphViewSnapshot) => void) => () => void\n}\n\nexport interface TopologyGraphViewProps {\n source: TopologyGraphSource\n}\n\nexport function TopologyGraphView({ source }: TopologyGraphViewProps) {\n const theme = useInkTheme()\n const [snap, setSnap] = useState<TopologyGraphViewSnapshot>(() => source.toJSON())\n\n useEffect(() => source.subscribe(setSnap), [source])\n\n const root = snap.nodes.find(n => n.id === '__root__')\n const others = snap.nodes.filter(n => n.id !== '__root__')\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1}>\n <Text bold>({root?.topology ?? 'topology'})</Text>\n {others.map(node => {\n const status =\n node.errorCount > 0\n ? { icon: '✗', color: theme.toolStatus.error.color }\n : node.endCount > 0\n ? { icon: '✓', color: theme.toolStatus.complete.color }\n : { icon: '…', color: theme.toolStatus.running.color }\n return (\n <Box key={node.id}>\n <Text color={status.color}>\n {' ├─ '}\n {status.icon} {node.label}\n </Text>\n <Text dimColor>\n {' '}({node.startCount} starts, {node.endCount} done)\n </Text>\n </Box>\n )\n })}\n </Box>\n )\n}\n"]} |
+5
-2
@@ -231,3 +231,6 @@ import { createChatController } from '@agentskit/core'; | ||
| useInput((input, key) => { | ||
| if (isBusy) return; | ||
| if (isBusy) { | ||
| if (chat.status === "streaming" && key.escape) chat.stop(); | ||
| return; | ||
| } | ||
| if (key.upArrow) { | ||
@@ -281,3 +284,3 @@ if (effectiveHistory.length === 0) return; | ||
| }); | ||
| const hint = isBusy ? chat.status === "streaming" ? "streaming response... press Ctrl+C to abort" : "input disabled" : effectiveHistory.length > 0 ? `${placeholder} \xB7 \u2191/\u2193 to recall previous messages` : placeholder; | ||
| const hint = isBusy ? chat.status === "streaming" ? "streaming response... press Esc to stop" : "input disabled" : effectiveHistory.length > 0 ? `${placeholder} \xB7 \u2191/\u2193 to recall previous messages` : placeholder; | ||
| return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [ | ||
@@ -284,0 +287,0 @@ /* @__PURE__ */ jsx(Text, { dimColor: true, children: hint }), |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/useChat.ts","../src/progress-observer.ts","../src/components/ChatContainer.tsx","../src/components/MarkdownText.tsx","../src/components/theme.tsx","../src/components/Message.tsx","../src/components/InputBar.tsx","../src/components/ToolCallView.tsx","../src/components/ThinkingIndicator.tsx","../src/components/StatusHeader.tsx","../src/components/ToolConfirmation.tsx","../src/components/TopologyGraphView.tsx"],"names":["jsx","Box","Text","useRef","useEffect","jsxs","truncate","useState","SPINNER_FRAMES","React","useInput"],"mappings":"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","file":"index.js","sourcesContent":["// NOTE: This hook is intentionally duplicated from @agentskit/react (packages/react/src/useChat.ts).\n// The two packages are React siblings and cannot cross-depend, so the hook is kept in sync\n// manually. A sync-guard test at packages/ink/tests/useChat-sync.test.ts will fail if they drift.\n// When changing this file, mirror the same change in packages/react/src/useChat.ts.\nimport { useEffect, useRef, useSyncExternalStore } from 'react'\nimport { createChatController } from '@agentskit/core'\nimport type { ChatConfig, ChatController, ChatReturn } from '@agentskit/core'\n\nexport function useChat(config: ChatConfig): ChatReturn {\n const controllerRef = useRef<ChatController | null>(null)\n\n if (!controllerRef.current) {\n controllerRef.current = createChatController(config)\n }\n\n useEffect(() => {\n controllerRef.current?.updateConfig(config)\n }, [config])\n\n useEffect(() => () => controllerRef.current?.stop(), [])\n\n const state = useSyncExternalStore(\n controllerRef.current.subscribe,\n controllerRef.current.getState,\n controllerRef.current.getState\n )\n\n return {\n ...state,\n send: controllerRef.current.send,\n stop: controllerRef.current.stop,\n retry: controllerRef.current.retry,\n edit: controllerRef.current.edit,\n regenerate: controllerRef.current.regenerate,\n setInput: controllerRef.current.setInput,\n clear: controllerRef.current.clear,\n approve: controllerRef.current.approve,\n deny: controllerRef.current.deny,\n }\n}\n","import type { AgentEvent, Observer } from '@agentskit/core'\n\n/**\n * Headless progress renderer for standalone (non-chat) agent runs. Returns an\n * Observer you pass in `observers: [...]`; it renders `{ type: 'progress' }`\n * AgentEvents as an animated spinner line per stage — no Ink/React render tree,\n * just ANSI, so it works in any terminal or CI log. Same braille frames as the\n * chat-UI ThinkingIndicator.\n *\n * ```ts\n * import { createProgressObserver } from '@agentskit/ink'\n * const agent = createMyAgent({ adapter, observers: [createProgressObserver()] })\n * ```\n */\nexport const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const\n\nconst C = {\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n reset: '\\x1b[0m',\n}\n\nexport interface ProgressObserverOptions {\n /** Where to write. Default: process.stdout. */\n write?: (chunk: string) => void\n /** Disable ANSI colors/animation (e.g. non-TTY CI). Default: !process.stdout.isTTY. */\n plain?: boolean\n}\n\nexport function createProgressObserver(options: ProgressObserverOptions = {}): Observer {\n const write = options.write ?? ((s: string) => process.stdout.write(s))\n const plain = options.plain ?? !process.stdout?.isTTY\n let timer: ReturnType<typeof setInterval> | null = null\n let frame = 0\n const stop = () => {\n if (timer) {\n clearInterval(timer)\n timer = null\n }\n }\n\n return {\n name: 'progress-renderer',\n on(event: AgentEvent) {\n if (event.type !== 'progress') return\n const label = event.label.padEnd(12)\n\n if (event.status === 'start') {\n if (plain) {\n write(` … ${event.label}\\n`)\n return\n }\n stop()\n timer = setInterval(() => {\n frame = (frame + 1) % SPINNER_FRAMES.length\n write(`\\r ${C.cyan}${SPINNER_FRAMES[frame]}${C.reset} ${label}\\x1b[K`)\n }, 80)\n // Don't let the spinner keep the event loop alive if the run throws\n // before the resolving event fires.\n timer.unref?.()\n return\n }\n\n stop()\n const sym = event.status === 'ok' ? '✓' : event.status === 'error' ? '⛔' : '–'\n const color = event.status === 'ok' ? C.green : event.status === 'error' ? C.red : C.yellow\n const cr = plain ? '' : '\\r'\n const clr = plain ? '' : '\\x1b[K' // clear to EOL so a long spinner line leaves no leftover chars\n const c = plain ? '' : color\n const r = plain ? '' : C.reset\n const d = plain ? '' : C.dim\n // Build `time` from the plain-aware codes too — otherwise the duration keeps\n // raw ANSI in non-TTY/CI logs, defeating the whole point of `plain`.\n const time = event.durationMs ? ` ${d}(${(event.durationMs / 1000).toFixed(1)}s)${r}` : ''\n write(`${cr} ${c}${sym}${r} ${label} ${d}${event.detail ?? ''}${r}${time}${clr}\\n`)\n },\n }\n}\n","import React, { type ReactNode } from 'react'\nimport { Box } from 'ink'\n\nexport interface ChatContainerProps {\n children: ReactNode\n}\n\nexport function ChatContainer({ children }: ChatContainerProps) {\n return (\n <Box flexDirection=\"column\" gap={1}>\n {children}\n </Box>\n )\n}\n","import React, { useMemo } from 'react'\nimport { Text } from 'ink'\nimport { Marked } from 'marked'\nimport { markedTerminal } from 'marked-terminal'\n\nexport interface MarkdownTextProps {\n content: string\n}\n\n/**\n * One shared Marked instance — creating it per render forces the terminal\n * renderer to re-register its hooks every time.\n */\nconst marked = new Marked()\nmarked.use(\n markedTerminal({\n width: 80,\n reflowText: true,\n tab: 2,\n }) as unknown as Parameters<typeof marked.use>[0]\n)\n\n/**\n * Renders markdown (incl. tables, code blocks, links) to ANSI-styled text.\n * Delegates parsing to `marked` and terminal rendering to `marked-terminal`;\n * Ink's `<Text>` passes ANSI escapes through untouched.\n */\nexport function MarkdownText({ content }: MarkdownTextProps) {\n const rendered = useMemo(() => {\n try {\n const output = marked.parse(content, { async: false }) as string\n return output.replace(/\\n+$/, '')\n } catch {\n return content\n }\n }, [content])\n\n return <Text>{rendered}</Text>\n}\n","import React, { createContext, useContext } from 'react'\nimport type { MessageRole, ToolCallStatus } from '@agentskit/core'\n\nexport interface InkTheme {\n roles: Record<MessageRole, { icon: string; label: string; color: string }>\n toolStatus: Record<ToolCallStatus, { icon: string; color: string; label: string }>\n prompt: { active: string; busy: string }\n inputText: { active: string; busy: string }\n header: { border: string; title: string }\n usage: { prompt: string; completion: string }\n segment: {\n provider: string\n model: string\n modeLive: string\n modeDemo: string\n tools: string\n muted: string\n }\n}\n\nexport const defaultInkTheme: InkTheme = {\n roles: {\n user: { icon: '❯', label: 'you', color: 'green' },\n assistant: { icon: '✦', label: 'assistant', color: 'cyan' },\n system: { icon: '◆', label: 'system', color: 'yellow' },\n tool: { icon: '⚙', label: 'tool', color: 'magenta' },\n },\n toolStatus: {\n pending: { icon: '○', color: 'gray', label: 'pending' },\n running: { icon: '⠋', color: 'cyan', label: 'running' },\n complete: { icon: '✓', color: 'green', label: 'complete' },\n error: { icon: '✗', color: 'red', label: 'error' },\n requires_confirmation: { icon: '?', color: 'yellow', label: 'requires_confirmation' },\n },\n prompt: { active: 'cyan', busy: 'gray' },\n inputText: { active: 'white', busy: 'gray' },\n header: { border: 'cyan', title: 'cyan' },\n usage: { prompt: 'green', completion: 'yellow' },\n segment: {\n provider: 'cyan',\n model: 'magenta',\n modeLive: 'green',\n modeDemo: 'yellow',\n tools: 'blue',\n muted: 'gray',\n },\n}\n\nconst ThemeContext = createContext<InkTheme>(defaultInkTheme)\n\nexport function InkThemeProvider({\n theme,\n children,\n}: {\n theme?: Partial<InkTheme>\n children: React.ReactNode\n}) {\n const merged: InkTheme = theme ? { ...defaultInkTheme, ...theme } : defaultInkTheme\n return <ThemeContext.Provider value={merged}>{children}</ThemeContext.Provider>\n}\n\nexport function useInkTheme(): InkTheme {\n return useContext(ThemeContext)\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport type { Message as MessageType, TokenUsage } from '@agentskit/core'\nimport { MarkdownText } from './MarkdownText'\nimport { useInkTheme } from './theme'\n\nexport interface MessageProps {\n message: MessageType\n /**\n * Render assistant message content as markdown (headings, lists, code,\n * bold, italic, links). Default: `true`. Set to `false` to render as\n * plain text — useful for tool output or raw logs.\n */\n markdown?: boolean\n /**\n * Show inline token usage below assistant messages when the adapter\n * surfaces it (via `message.metadata.usage`). Default: `true`.\n */\n showUsage?: boolean\n}\n\nfunction formatTokens(n: number): string {\n if (n < 1000) return String(n)\n if (n < 1_000_000) return `${(n / 1000).toFixed(1)}k`\n return `${(n / 1_000_000).toFixed(2)}m`\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text\n return `${text.slice(0, max)}…`\n}\n\nexport function Message({ message, markdown = true, showUsage = true }: MessageProps) {\n const theme = useInkTheme()\n const meta = theme.roles[message.role] ?? theme.roles.assistant\n const isStreaming = message.status === 'streaming'\n\n // Tool-role messages are raw results passed back to the model; render compact.\n if (message.role === 'tool') {\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text dimColor>\n <Text color={meta.color}>{meta.icon} </Text>\n tool result\n </Text>\n <Text dimColor>{truncate(message.content, 400)}</Text>\n </Box>\n )\n }\n\n const shouldRenderMarkdown = markdown && message.role === 'assistant' && !!message.content\n const usage = message.metadata?.usage as TokenUsage | undefined\n const shouldRenderUsage =\n showUsage && message.role === 'assistant' && usage && usage.totalTokens > 0\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={meta.color} bold>\n {meta.icon} {meta.label}\n </Text>\n {isStreaming ? <Text dimColor> · streaming</Text> : null}\n </Box>\n {message.content ? (\n shouldRenderMarkdown ? (\n <MarkdownText content={message.content} />\n ) : (\n <Text>{message.content}</Text>\n )\n ) : null}\n {shouldRenderUsage && usage ? (\n <Box>\n <Text dimColor>tokens </Text>\n <Text color={theme.usage.prompt}>↑{formatTokens(usage.promptTokens)}</Text>\n <Text dimColor> </Text>\n <Text color={theme.usage.completion}>↓{formatTokens(usage.completionTokens)}</Text>\n <Text dimColor> · </Text>\n <Text dimColor>{formatTokens(usage.totalTokens)} total</Text>\n </Box>\n ) : null}\n </Box>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { ChatReturn } from '@agentskit/core'\nimport { useInkTheme } from './theme'\n\nexport interface InputBarProps {\n chat: ChatReturn\n placeholder?: string\n disabled?: boolean\n /**\n * Prior messages to cycle through with arrow up/down. Typically the user\n * messages from `chat.messages`, most recent last. Omitted → derived\n * from `chat.messages`.\n */\n history?: string[]\n /**\n * Optional hook called on Enter before `chat.send`. Return `true` if the\n * handler consumed the input (e.g. a slash command); the bar will skip\n * calling `chat.send` and clear the input itself.\n */\n onSubmitInput?: (input: string) => boolean | Promise<boolean>\n}\n\nconst CURSOR_MS = 500\n\nfunction deriveHistory(chat: ChatReturn): string[] {\n return chat.messages\n .filter(m => m.role === 'user')\n .map(m => m.content)\n}\n\nexport function InputBar({\n chat,\n placeholder = 'Type a message...',\n disabled = false,\n history,\n onSubmitInput,\n}: InputBarProps) {\n const theme = useInkTheme()\n const isBusy = disabled || chat.status === 'streaming'\n const [cursorOn, setCursorOn] = useState(true)\n\n // Pointer into history. -1 = live input. 0..N-1 = pointing at history[i].\n const [historyIndex, setHistoryIndex] = useState(-1)\n // Snapshot of the in-progress input so the user can scroll back to it.\n const liveDraftRef = useRef<string>('')\n\n const effectiveHistory = history ?? deriveHistory(chat)\n\n useEffect(() => {\n const id = setInterval(() => setCursorOn(v => !v), CURSOR_MS)\n return () => clearInterval(id)\n }, [])\n\n useInput((input, key) => {\n if (isBusy) return\n\n if (key.upArrow) {\n if (effectiveHistory.length === 0) return\n if (historyIndex === -1) liveDraftRef.current = chat.input\n const nextIndex = historyIndex === -1\n ? effectiveHistory.length - 1\n : Math.max(0, historyIndex - 1)\n setHistoryIndex(nextIndex)\n chat.setInput(effectiveHistory[nextIndex])\n return\n }\n\n if (key.downArrow) {\n if (historyIndex === -1) return\n const nextIndex = historyIndex + 1\n if (nextIndex >= effectiveHistory.length) {\n setHistoryIndex(-1)\n chat.setInput(liveDraftRef.current)\n } else {\n setHistoryIndex(nextIndex)\n chat.setInput(effectiveHistory[nextIndex])\n }\n return\n }\n\n if (key.return) {\n const value = chat.input\n if (!value.trim()) return\n setHistoryIndex(-1)\n liveDraftRef.current = ''\n if (onSubmitInput) {\n void Promise.resolve(onSubmitInput(value)).then(consumed => {\n if (consumed) {\n chat.setInput('')\n return\n }\n void chat.send(value)\n })\n return\n }\n void chat.send(value)\n return\n }\n\n if (key.backspace || key.delete) {\n // Any edit exits history navigation so subsequent text builds a new\n // draft, not a mutation of the recalled message.\n if (historyIndex !== -1) setHistoryIndex(-1)\n chat.setInput(chat.input.slice(0, -1))\n return\n }\n\n if (input && !key.ctrl && !key.meta) {\n if (historyIndex !== -1) setHistoryIndex(-1)\n chat.setInput(`${chat.input}${input}`)\n }\n })\n\n const hint = isBusy\n ? chat.status === 'streaming'\n ? 'streaming response... press Ctrl+C to abort'\n : 'input disabled'\n : effectiveHistory.length > 0\n ? `${placeholder} · ↑/↓ to recall previous messages`\n : placeholder\n\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>{hint}</Text>\n <Box>\n <Text color={isBusy ? theme.prompt.busy : theme.prompt.active} bold>\n ❯{' '}\n </Text>\n <Text color={isBusy ? theme.inputText.busy : theme.inputText.active}>\n {chat.input}\n {!isBusy && cursorOn ? <Text inverse> </Text> : null}\n </Text>\n </Box>\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolCall } from '@agentskit/core'\nimport { useInkTheme } from './theme'\n\nexport interface ToolCallViewProps {\n toolCall: ToolCall\n expanded?: boolean\n /** Max characters rendered from result/error. Default 500. */\n resultPreviewChars?: number\n /** Max characters rendered from args. Default 120. */\n argsPreviewChars?: number\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text\n return `${text.slice(0, max)}…`\n}\n\nfunction previewArgs(args: unknown, max: number): string {\n try {\n const serialized = typeof args === 'string' ? args : JSON.stringify(args)\n return truncate(serialized ?? '', max)\n } catch {\n return '[unserializable]'\n }\n}\n\nexport function ToolCallView({\n toolCall,\n expanded = false,\n resultPreviewChars = 500,\n argsPreviewChars = 120,\n}: ToolCallViewProps) {\n const theme = useInkTheme()\n const meta = theme.toolStatus[toolCall.status] ?? theme.toolStatus.pending\n const [frame, setFrame] = useState(0)\n const isRunning = toolCall.status === 'running'\n\n useEffect(() => {\n if (!isRunning) return\n const id = setInterval(() => setFrame(f => (f + 1) % SPINNER.length), 80)\n return () => clearInterval(id)\n }, [isRunning])\n\n const icon = isRunning ? SPINNER[frame] : meta.icon\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={meta.color} paddingX={1}>\n <Box>\n <Text color={meta.color} bold>\n {icon} {toolCall.name}\n </Text>\n <Text dimColor> · {meta.label}</Text>\n </Box>\n\n {expanded ? (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text dimColor>args: {previewArgs(toolCall.args, argsPreviewChars)}</Text>\n {toolCall.result ? (\n <Text>{truncate(toolCall.result, resultPreviewChars)}</Text>\n ) : null}\n {toolCall.error ? (\n <Text color={theme.toolStatus.error.color}>{truncate(toolCall.error, resultPreviewChars)}</Text>\n ) : null}\n </Box>\n ) : null}\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface ThinkingIndicatorProps {\n visible: boolean\n label?: string\n}\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\nconst FRAME_MS = 80\n\nexport function ThinkingIndicator({ visible, label = 'Thinking' }: ThinkingIndicatorProps) {\n const [frame, setFrame] = useState(0)\n\n useEffect(() => {\n if (!visible) return\n const id = setInterval(() => {\n setFrame(f => (f + 1) % SPINNER_FRAMES.length)\n }, FRAME_MS)\n return () => clearInterval(id)\n }, [visible])\n\n if (!visible) return null\n\n return (\n <Box>\n <Text color=\"cyan\">{SPINNER_FRAMES[frame]} </Text>\n <Text dimColor italic>\n {label}\n </Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { useInkTheme } from './theme'\n\nexport interface StatusHeaderProps {\n title?: string\n provider?: string\n model?: string\n tools?: string[]\n mode?: 'demo' | 'live'\n messageCount?: number\n sessionId?: string\n}\n\nexport function StatusHeader({\n title = 'AgentsKit CLI',\n provider,\n model,\n tools,\n mode,\n messageCount,\n sessionId,\n}: StatusHeaderProps) {\n const theme = useInkTheme()\n const segments: Array<{ label: string; value: string; color?: string }> = []\n\n if (provider) segments.push({ label: 'provider', value: provider, color: theme.segment.provider })\n if (model) segments.push({ label: 'model', value: model, color: theme.segment.model })\n if (mode) segments.push({ label: 'mode', value: mode, color: mode === 'live' ? theme.segment.modeLive : theme.segment.modeDemo })\n if (tools && tools.length > 0) {\n segments.push({ label: 'tools', value: tools.join(','), color: theme.segment.tools })\n }\n if (typeof messageCount === 'number') {\n segments.push({ label: 'msgs', value: String(messageCount), color: theme.segment.muted })\n }\n if (sessionId) {\n segments.push({ label: 'session', value: sessionId.slice(0, 12), color: theme.segment.muted })\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.header.border} paddingX={1}>\n <Text color={theme.header.title} bold>\n ✦ {title}\n </Text>\n {segments.length > 0 ? (\n <Text wrap=\"truncate-end\">\n {segments.map((seg, i) => (\n <React.Fragment key={seg.label}>\n {i > 0 ? <Text dimColor> · </Text> : null}\n <Text dimColor>{seg.label}=</Text>\n <Text color={seg.color ?? 'white'}>{seg.value}</Text>\n </React.Fragment>\n ))}\n </Text>\n ) : null}\n </Box>\n )\n}\n","import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { ToolCall } from '@agentskit/core'\n\nexport interface ToolConfirmationProps {\n toolCall: ToolCall\n onApprove: (toolCallId: string) => void\n onDeny: (toolCallId: string, reason?: string) => void\n /**\n * Called when the user picks \"allow for this session\" — approves the\n * current call and signals that further calls with this tool name should\n * run without prompting.\n */\n onApproveAlways?: (toolCallId: string, toolName: string) => void\n}\n\ntype Choice = 'allow_once' | 'allow_session' | 'deny'\n\ninterface Option {\n key: Choice\n label: string\n hint: string\n color: string\n}\n\nconst OPTIONS: Option[] = [\n { key: 'allow_once', label: 'Yes', hint: 'allow this call', color: 'green' },\n { key: 'allow_session', label: 'Yes, for session', hint: 'stop asking for this tool', color: 'cyan' },\n { key: 'deny', label: 'No', hint: 'deny and tell the model why', color: 'red' },\n]\n\nexport function ToolConfirmation({\n toolCall,\n onApprove,\n onDeny,\n onApproveAlways,\n}: ToolConfirmationProps) {\n const [index, setIndex] = useState(0)\n const active = toolCall.status === 'requires_confirmation'\n\n useInput((input, key) => {\n if (!active) return\n\n if (key.upArrow || (key.shift && key.tab)) {\n setIndex(i => (i - 1 + OPTIONS.length) % OPTIONS.length)\n return\n }\n if (key.downArrow || key.tab) {\n setIndex(i => (i + 1) % OPTIONS.length)\n return\n }\n\n if (key.return) {\n const choice = OPTIONS[index].key\n if (choice === 'allow_once') onApprove(toolCall.id)\n else if (choice === 'allow_session') {\n if (onApproveAlways) onApproveAlways(toolCall.id, toolCall.name)\n else onApprove(toolCall.id)\n }\n else onDeny(toolCall.id)\n return\n }\n\n // Numeric shortcuts for quick picking.\n if (input === '1') { setIndex(0); onApprove(toolCall.id) }\n else if (input === '2') {\n setIndex(1)\n if (onApproveAlways) onApproveAlways(toolCall.id, toolCall.name)\n else onApprove(toolCall.id)\n }\n else if (input === '3') { setIndex(2); onDeny(toolCall.id) }\n })\n\n if (!active) return null\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1} borderColor=\"yellow\">\n <Text color=\"yellow\" bold>\n ⚠ Allow {toolCall.name}?\n </Text>\n <Text dimColor>{JSON.stringify(toolCall.args)}</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {OPTIONS.map((opt, i) => {\n const selected = i === index\n return (\n <Box key={opt.key}>\n <Text color={selected ? opt.color : 'gray'}>\n {selected ? '❯ ' : ' '}\n </Text>\n <Text color={selected ? opt.color : 'white'} bold={selected}>\n {i + 1}. {opt.label}\n </Text>\n <Text dimColor> — {opt.hint}</Text>\n </Box>\n )\n })}\n </Box>\n <Text dimColor>↑/↓ to move, Enter to pick, 1–3 for shortcuts</Text>\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { useInkTheme } from './theme'\n\nexport interface TopologyGraphViewNode {\n id: string\n label: string\n topology: string\n startCount: number\n endCount: number\n errorCount: number\n lastActiveAt: number\n}\n\nexport interface TopologyGraphViewEdge {\n id: string\n from: string\n to: string\n count: number\n lastTask?: string\n lastResult?: string\n}\n\nexport interface TopologyGraphViewSnapshot {\n nodes: TopologyGraphViewNode[]\n edges: TopologyGraphViewEdge[]\n updatedAt: string\n}\n\nexport interface TopologyGraphSource {\n toJSON: () => TopologyGraphViewSnapshot\n subscribe: (handler: (s: TopologyGraphViewSnapshot) => void) => () => void\n}\n\nexport interface TopologyGraphViewProps {\n source: TopologyGraphSource\n}\n\nexport function TopologyGraphView({ source }: TopologyGraphViewProps) {\n const theme = useInkTheme()\n const [snap, setSnap] = useState<TopologyGraphViewSnapshot>(() => source.toJSON())\n\n useEffect(() => source.subscribe(setSnap), [source])\n\n const root = snap.nodes.find(n => n.id === '__root__')\n const others = snap.nodes.filter(n => n.id !== '__root__')\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1}>\n <Text bold>({root?.topology ?? 'topology'})</Text>\n {others.map(node => {\n const status =\n node.errorCount > 0\n ? { icon: '✗', color: theme.toolStatus.error.color }\n : node.endCount > 0\n ? { icon: '✓', color: theme.toolStatus.complete.color }\n : { icon: '…', color: theme.toolStatus.running.color }\n return (\n <Box key={node.id}>\n <Text color={status.color}>\n {' ├─ '}\n {status.icon} {node.label}\n </Text>\n <Text dimColor>\n {' '}({node.startCount} starts, {node.endCount} done)\n </Text>\n </Box>\n )\n })}\n </Box>\n )\n}\n"]} | ||
| {"version":3,"sources":["../src/useChat.ts","../src/progress-observer.ts","../src/components/ChatContainer.tsx","../src/components/MarkdownText.tsx","../src/components/theme.tsx","../src/components/Message.tsx","../src/components/InputBar.tsx","../src/components/ToolCallView.tsx","../src/components/ThinkingIndicator.tsx","../src/components/StatusHeader.tsx","../src/components/ToolConfirmation.tsx","../src/components/TopologyGraphView.tsx"],"names":["jsx","Box","Text","useRef","useEffect","jsxs","truncate","useState","SPINNER_FRAMES","React","useInput"],"mappings":"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","file":"index.js","sourcesContent":["// NOTE: This hook is intentionally duplicated from @agentskit/react (packages/react/src/useChat.ts).\n// The two packages are React siblings and cannot cross-depend, so the hook is kept in sync\n// manually. A sync-guard test at packages/ink/tests/useChat-sync.test.ts will fail if they drift.\n// When changing this file, mirror the same change in packages/react/src/useChat.ts.\nimport { useEffect, useRef, useSyncExternalStore } from 'react'\nimport { createChatController } from '@agentskit/core'\nimport type { ChatConfig, ChatController, ChatReturn } from '@agentskit/core'\n\nexport function useChat(config: ChatConfig): ChatReturn {\n const controllerRef = useRef<ChatController | null>(null)\n\n if (!controllerRef.current) {\n controllerRef.current = createChatController(config)\n }\n\n useEffect(() => {\n controllerRef.current?.updateConfig(config)\n }, [config])\n\n useEffect(() => () => controllerRef.current?.stop(), [])\n\n const state = useSyncExternalStore(\n controllerRef.current.subscribe,\n controllerRef.current.getState,\n controllerRef.current.getState\n )\n\n return {\n ...state,\n send: controllerRef.current.send,\n stop: controllerRef.current.stop,\n retry: controllerRef.current.retry,\n edit: controllerRef.current.edit,\n regenerate: controllerRef.current.regenerate,\n setInput: controllerRef.current.setInput,\n clear: controllerRef.current.clear,\n approve: controllerRef.current.approve,\n deny: controllerRef.current.deny,\n }\n}\n","import type { AgentEvent, Observer } from '@agentskit/core'\n\n/**\n * Headless progress renderer for standalone (non-chat) agent runs. Returns an\n * Observer you pass in `observers: [...]`; it renders `{ type: 'progress' }`\n * AgentEvents as an animated spinner line per stage — no Ink/React render tree,\n * just ANSI, so it works in any terminal or CI log. Same braille frames as the\n * chat-UI ThinkingIndicator.\n *\n * ```ts\n * import { createProgressObserver } from '@agentskit/ink'\n * const agent = createMyAgent({ adapter, observers: [createProgressObserver()] })\n * ```\n */\nexport const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const\n\nconst C = {\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n reset: '\\x1b[0m',\n}\n\nexport interface ProgressObserverOptions {\n /** Where to write. Default: process.stdout. */\n write?: (chunk: string) => void\n /** Disable ANSI colors/animation (e.g. non-TTY CI). Default: !process.stdout.isTTY. */\n plain?: boolean\n}\n\nexport function createProgressObserver(options: ProgressObserverOptions = {}): Observer {\n const write = options.write ?? ((s: string) => process.stdout.write(s))\n const plain = options.plain ?? !process.stdout?.isTTY\n let timer: ReturnType<typeof setInterval> | null = null\n let frame = 0\n const stop = () => {\n if (timer) {\n clearInterval(timer)\n timer = null\n }\n }\n\n return {\n name: 'progress-renderer',\n on(event: AgentEvent) {\n if (event.type !== 'progress') return\n const label = event.label.padEnd(12)\n\n if (event.status === 'start') {\n if (plain) {\n write(` … ${event.label}\\n`)\n return\n }\n stop()\n timer = setInterval(() => {\n frame = (frame + 1) % SPINNER_FRAMES.length\n write(`\\r ${C.cyan}${SPINNER_FRAMES[frame]}${C.reset} ${label}\\x1b[K`)\n }, 80)\n // Don't let the spinner keep the event loop alive if the run throws\n // before the resolving event fires.\n timer.unref?.()\n return\n }\n\n stop()\n const sym = event.status === 'ok' ? '✓' : event.status === 'error' ? '⛔' : '–'\n const color = event.status === 'ok' ? C.green : event.status === 'error' ? C.red : C.yellow\n const cr = plain ? '' : '\\r'\n const clr = plain ? '' : '\\x1b[K' // clear to EOL so a long spinner line leaves no leftover chars\n const c = plain ? '' : color\n const r = plain ? '' : C.reset\n const d = plain ? '' : C.dim\n // Build `time` from the plain-aware codes too — otherwise the duration keeps\n // raw ANSI in non-TTY/CI logs, defeating the whole point of `plain`.\n const time = event.durationMs ? ` ${d}(${(event.durationMs / 1000).toFixed(1)}s)${r}` : ''\n write(`${cr} ${c}${sym}${r} ${label} ${d}${event.detail ?? ''}${r}${time}${clr}\\n`)\n },\n }\n}\n","import React, { type ReactNode } from 'react'\nimport { Box } from 'ink'\n\nexport interface ChatContainerProps {\n children: ReactNode\n}\n\nexport function ChatContainer({ children }: ChatContainerProps) {\n return (\n <Box flexDirection=\"column\" gap={1}>\n {children}\n </Box>\n )\n}\n","import React, { useMemo } from 'react'\nimport { Text } from 'ink'\nimport { Marked } from 'marked'\nimport { markedTerminal } from 'marked-terminal'\n\nexport interface MarkdownTextProps {\n content: string\n}\n\n/**\n * One shared Marked instance — creating it per render forces the terminal\n * renderer to re-register its hooks every time.\n */\nconst marked = new Marked()\nmarked.use(\n markedTerminal({\n width: 80,\n reflowText: true,\n tab: 2,\n }) as unknown as Parameters<typeof marked.use>[0]\n)\n\n/**\n * Renders markdown (incl. tables, code blocks, links) to ANSI-styled text.\n * Delegates parsing to `marked` and terminal rendering to `marked-terminal`;\n * Ink's `<Text>` passes ANSI escapes through untouched.\n */\nexport function MarkdownText({ content }: MarkdownTextProps) {\n const rendered = useMemo(() => {\n try {\n const output = marked.parse(content, { async: false }) as string\n return output.replace(/\\n+$/, '')\n } catch {\n return content\n }\n }, [content])\n\n return <Text>{rendered}</Text>\n}\n","import React, { createContext, useContext } from 'react'\nimport type { MessageRole, ToolCallStatus } from '@agentskit/core'\n\nexport interface InkTheme {\n roles: Record<MessageRole, { icon: string; label: string; color: string }>\n toolStatus: Record<ToolCallStatus, { icon: string; color: string; label: string }>\n prompt: { active: string; busy: string }\n inputText: { active: string; busy: string }\n header: { border: string; title: string }\n usage: { prompt: string; completion: string }\n segment: {\n provider: string\n model: string\n modeLive: string\n modeDemo: string\n tools: string\n muted: string\n }\n}\n\nexport const defaultInkTheme: InkTheme = {\n roles: {\n user: { icon: '❯', label: 'you', color: 'green' },\n assistant: { icon: '✦', label: 'assistant', color: 'cyan' },\n system: { icon: '◆', label: 'system', color: 'yellow' },\n tool: { icon: '⚙', label: 'tool', color: 'magenta' },\n },\n toolStatus: {\n pending: { icon: '○', color: 'gray', label: 'pending' },\n running: { icon: '⠋', color: 'cyan', label: 'running' },\n complete: { icon: '✓', color: 'green', label: 'complete' },\n error: { icon: '✗', color: 'red', label: 'error' },\n requires_confirmation: { icon: '?', color: 'yellow', label: 'requires_confirmation' },\n },\n prompt: { active: 'cyan', busy: 'gray' },\n inputText: { active: 'white', busy: 'gray' },\n header: { border: 'cyan', title: 'cyan' },\n usage: { prompt: 'green', completion: 'yellow' },\n segment: {\n provider: 'cyan',\n model: 'magenta',\n modeLive: 'green',\n modeDemo: 'yellow',\n tools: 'blue',\n muted: 'gray',\n },\n}\n\nconst ThemeContext = createContext<InkTheme>(defaultInkTheme)\n\nexport function InkThemeProvider({\n theme,\n children,\n}: {\n theme?: Partial<InkTheme>\n children: React.ReactNode\n}) {\n const merged: InkTheme = theme ? { ...defaultInkTheme, ...theme } : defaultInkTheme\n return <ThemeContext.Provider value={merged}>{children}</ThemeContext.Provider>\n}\n\nexport function useInkTheme(): InkTheme {\n return useContext(ThemeContext)\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport type { Message as MessageType, TokenUsage } from '@agentskit/core'\nimport { MarkdownText } from './MarkdownText'\nimport { useInkTheme } from './theme'\n\nexport interface MessageProps {\n message: MessageType\n /**\n * Render assistant message content as markdown (headings, lists, code,\n * bold, italic, links). Default: `true`. Set to `false` to render as\n * plain text — useful for tool output or raw logs.\n */\n markdown?: boolean\n /**\n * Show inline token usage below assistant messages when the adapter\n * surfaces it (via `message.metadata.usage`). Default: `true`.\n */\n showUsage?: boolean\n}\n\nfunction formatTokens(n: number): string {\n if (n < 1000) return String(n)\n if (n < 1_000_000) return `${(n / 1000).toFixed(1)}k`\n return `${(n / 1_000_000).toFixed(2)}m`\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text\n return `${text.slice(0, max)}…`\n}\n\nexport function Message({ message, markdown = true, showUsage = true }: MessageProps) {\n const theme = useInkTheme()\n const meta = theme.roles[message.role] ?? theme.roles.assistant\n const isStreaming = message.status === 'streaming'\n\n // Tool-role messages are raw results passed back to the model; render compact.\n if (message.role === 'tool') {\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text dimColor>\n <Text color={meta.color}>{meta.icon} </Text>\n tool result\n </Text>\n <Text dimColor>{truncate(message.content, 400)}</Text>\n </Box>\n )\n }\n\n const shouldRenderMarkdown = markdown && message.role === 'assistant' && !!message.content\n const usage = message.metadata?.usage as TokenUsage | undefined\n const shouldRenderUsage =\n showUsage && message.role === 'assistant' && usage && usage.totalTokens > 0\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={meta.color} bold>\n {meta.icon} {meta.label}\n </Text>\n {isStreaming ? <Text dimColor> · streaming</Text> : null}\n </Box>\n {message.content ? (\n shouldRenderMarkdown ? (\n <MarkdownText content={message.content} />\n ) : (\n <Text>{message.content}</Text>\n )\n ) : null}\n {shouldRenderUsage && usage ? (\n <Box>\n <Text dimColor>tokens </Text>\n <Text color={theme.usage.prompt}>↑{formatTokens(usage.promptTokens)}</Text>\n <Text dimColor> </Text>\n <Text color={theme.usage.completion}>↓{formatTokens(usage.completionTokens)}</Text>\n <Text dimColor> · </Text>\n <Text dimColor>{formatTokens(usage.totalTokens)} total</Text>\n </Box>\n ) : null}\n </Box>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { ChatReturn } from '@agentskit/core'\nimport { useInkTheme } from './theme'\n\nexport interface InputBarProps {\n chat: ChatReturn\n placeholder?: string\n disabled?: boolean\n /**\n * Prior messages to cycle through with arrow up/down. Typically the user\n * messages from `chat.messages`, most recent last. Omitted → derived\n * from `chat.messages`.\n */\n history?: string[]\n /**\n * Optional hook called on Enter before `chat.send`. Return `true` if the\n * handler consumed the input (e.g. a slash command); the bar will skip\n * calling `chat.send` and clear the input itself.\n */\n onSubmitInput?: (input: string) => boolean | Promise<boolean>\n}\n\nconst CURSOR_MS = 500\n\nfunction deriveHistory(chat: ChatReturn): string[] {\n return chat.messages\n .filter(m => m.role === 'user')\n .map(m => m.content)\n}\n\nexport function InputBar({\n chat,\n placeholder = 'Type a message...',\n disabled = false,\n history,\n onSubmitInput,\n}: InputBarProps) {\n const theme = useInkTheme()\n const isBusy = disabled || chat.status === 'streaming'\n const [cursorOn, setCursorOn] = useState(true)\n\n // Pointer into history. -1 = live input. 0..N-1 = pointing at history[i].\n const [historyIndex, setHistoryIndex] = useState(-1)\n // Snapshot of the in-progress input so the user can scroll back to it.\n const liveDraftRef = useRef<string>('')\n\n const effectiveHistory = history ?? deriveHistory(chat)\n\n useEffect(() => {\n const id = setInterval(() => setCursorOn(v => !v), CURSOR_MS)\n return () => clearInterval(id)\n }, [])\n\n useInput((input, key) => {\n if (isBusy) {\n if (chat.status === 'streaming' && key.escape) chat.stop()\n return\n }\n\n if (key.upArrow) {\n if (effectiveHistory.length === 0) return\n if (historyIndex === -1) liveDraftRef.current = chat.input\n const nextIndex = historyIndex === -1\n ? effectiveHistory.length - 1\n : Math.max(0, historyIndex - 1)\n setHistoryIndex(nextIndex)\n chat.setInput(effectiveHistory[nextIndex])\n return\n }\n\n if (key.downArrow) {\n if (historyIndex === -1) return\n const nextIndex = historyIndex + 1\n if (nextIndex >= effectiveHistory.length) {\n setHistoryIndex(-1)\n chat.setInput(liveDraftRef.current)\n } else {\n setHistoryIndex(nextIndex)\n chat.setInput(effectiveHistory[nextIndex])\n }\n return\n }\n\n if (key.return) {\n const value = chat.input\n if (!value.trim()) return\n setHistoryIndex(-1)\n liveDraftRef.current = ''\n if (onSubmitInput) {\n void Promise.resolve(onSubmitInput(value)).then(consumed => {\n if (consumed) {\n chat.setInput('')\n return\n }\n void chat.send(value)\n })\n return\n }\n void chat.send(value)\n return\n }\n\n if (key.backspace || key.delete) {\n // Any edit exits history navigation so subsequent text builds a new\n // draft, not a mutation of the recalled message.\n if (historyIndex !== -1) setHistoryIndex(-1)\n chat.setInput(chat.input.slice(0, -1))\n return\n }\n\n if (input && !key.ctrl && !key.meta) {\n if (historyIndex !== -1) setHistoryIndex(-1)\n chat.setInput(`${chat.input}${input}`)\n }\n })\n\n const hint = isBusy\n ? chat.status === 'streaming'\n ? 'streaming response... press Esc to stop'\n : 'input disabled'\n : effectiveHistory.length > 0\n ? `${placeholder} · ↑/↓ to recall previous messages`\n : placeholder\n\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>{hint}</Text>\n <Box>\n <Text color={isBusy ? theme.prompt.busy : theme.prompt.active} bold>\n ❯{' '}\n </Text>\n <Text color={isBusy ? theme.inputText.busy : theme.inputText.active}>\n {chat.input}\n {!isBusy && cursorOn ? <Text inverse> </Text> : null}\n </Text>\n </Box>\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolCall } from '@agentskit/core'\nimport { useInkTheme } from './theme'\n\nexport interface ToolCallViewProps {\n toolCall: ToolCall\n expanded?: boolean\n /** Max characters rendered from result/error. Default 500. */\n resultPreviewChars?: number\n /** Max characters rendered from args. Default 120. */\n argsPreviewChars?: number\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text\n return `${text.slice(0, max)}…`\n}\n\nfunction previewArgs(args: unknown, max: number): string {\n try {\n const serialized = typeof args === 'string' ? args : JSON.stringify(args)\n return truncate(serialized ?? '', max)\n } catch {\n return '[unserializable]'\n }\n}\n\nexport function ToolCallView({\n toolCall,\n expanded = false,\n resultPreviewChars = 500,\n argsPreviewChars = 120,\n}: ToolCallViewProps) {\n const theme = useInkTheme()\n const meta = theme.toolStatus[toolCall.status] ?? theme.toolStatus.pending\n const [frame, setFrame] = useState(0)\n const isRunning = toolCall.status === 'running'\n\n useEffect(() => {\n if (!isRunning) return\n const id = setInterval(() => setFrame(f => (f + 1) % SPINNER.length), 80)\n return () => clearInterval(id)\n }, [isRunning])\n\n const icon = isRunning ? SPINNER[frame] : meta.icon\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={meta.color} paddingX={1}>\n <Box>\n <Text color={meta.color} bold>\n {icon} {toolCall.name}\n </Text>\n <Text dimColor> · {meta.label}</Text>\n </Box>\n\n {expanded ? (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text dimColor>args: {previewArgs(toolCall.args, argsPreviewChars)}</Text>\n {toolCall.result ? (\n <Text>{truncate(toolCall.result, resultPreviewChars)}</Text>\n ) : null}\n {toolCall.error ? (\n <Text color={theme.toolStatus.error.color}>{truncate(toolCall.error, resultPreviewChars)}</Text>\n ) : null}\n </Box>\n ) : null}\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface ThinkingIndicatorProps {\n visible: boolean\n label?: string\n}\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\nconst FRAME_MS = 80\n\nexport function ThinkingIndicator({ visible, label = 'Thinking' }: ThinkingIndicatorProps) {\n const [frame, setFrame] = useState(0)\n\n useEffect(() => {\n if (!visible) return\n const id = setInterval(() => {\n setFrame(f => (f + 1) % SPINNER_FRAMES.length)\n }, FRAME_MS)\n return () => clearInterval(id)\n }, [visible])\n\n if (!visible) return null\n\n return (\n <Box>\n <Text color=\"cyan\">{SPINNER_FRAMES[frame]} </Text>\n <Text dimColor italic>\n {label}\n </Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { useInkTheme } from './theme'\n\nexport interface StatusHeaderProps {\n title?: string\n provider?: string\n model?: string\n tools?: string[]\n mode?: 'demo' | 'live'\n messageCount?: number\n sessionId?: string\n}\n\nexport function StatusHeader({\n title = 'AgentsKit CLI',\n provider,\n model,\n tools,\n mode,\n messageCount,\n sessionId,\n}: StatusHeaderProps) {\n const theme = useInkTheme()\n const segments: Array<{ label: string; value: string; color?: string }> = []\n\n if (provider) segments.push({ label: 'provider', value: provider, color: theme.segment.provider })\n if (model) segments.push({ label: 'model', value: model, color: theme.segment.model })\n if (mode) segments.push({ label: 'mode', value: mode, color: mode === 'live' ? theme.segment.modeLive : theme.segment.modeDemo })\n if (tools && tools.length > 0) {\n segments.push({ label: 'tools', value: tools.join(','), color: theme.segment.tools })\n }\n if (typeof messageCount === 'number') {\n segments.push({ label: 'msgs', value: String(messageCount), color: theme.segment.muted })\n }\n if (sessionId) {\n segments.push({ label: 'session', value: sessionId.slice(0, 12), color: theme.segment.muted })\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.header.border} paddingX={1}>\n <Text color={theme.header.title} bold>\n ✦ {title}\n </Text>\n {segments.length > 0 ? (\n <Text wrap=\"truncate-end\">\n {segments.map((seg, i) => (\n <React.Fragment key={seg.label}>\n {i > 0 ? <Text dimColor> · </Text> : null}\n <Text dimColor>{seg.label}=</Text>\n <Text color={seg.color ?? 'white'}>{seg.value}</Text>\n </React.Fragment>\n ))}\n </Text>\n ) : null}\n </Box>\n )\n}\n","import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { ToolCall } from '@agentskit/core'\n\nexport interface ToolConfirmationProps {\n toolCall: ToolCall\n onApprove: (toolCallId: string) => void\n onDeny: (toolCallId: string, reason?: string) => void\n /**\n * Called when the user picks \"allow for this session\" — approves the\n * current call and signals that further calls with this tool name should\n * run without prompting.\n */\n onApproveAlways?: (toolCallId: string, toolName: string) => void\n}\n\ntype Choice = 'allow_once' | 'allow_session' | 'deny'\n\ninterface Option {\n key: Choice\n label: string\n hint: string\n color: string\n}\n\nconst OPTIONS: Option[] = [\n { key: 'allow_once', label: 'Yes', hint: 'allow this call', color: 'green' },\n { key: 'allow_session', label: 'Yes, for session', hint: 'stop asking for this tool', color: 'cyan' },\n { key: 'deny', label: 'No', hint: 'deny and tell the model why', color: 'red' },\n]\n\nexport function ToolConfirmation({\n toolCall,\n onApprove,\n onDeny,\n onApproveAlways,\n}: ToolConfirmationProps) {\n const [index, setIndex] = useState(0)\n const active = toolCall.status === 'requires_confirmation'\n\n useInput((input, key) => {\n if (!active) return\n\n if (key.upArrow || (key.shift && key.tab)) {\n setIndex(i => (i - 1 + OPTIONS.length) % OPTIONS.length)\n return\n }\n if (key.downArrow || key.tab) {\n setIndex(i => (i + 1) % OPTIONS.length)\n return\n }\n\n if (key.return) {\n const choice = OPTIONS[index].key\n if (choice === 'allow_once') onApprove(toolCall.id)\n else if (choice === 'allow_session') {\n if (onApproveAlways) onApproveAlways(toolCall.id, toolCall.name)\n else onApprove(toolCall.id)\n }\n else onDeny(toolCall.id)\n return\n }\n\n // Numeric shortcuts for quick picking.\n if (input === '1') { setIndex(0); onApprove(toolCall.id) }\n else if (input === '2') {\n setIndex(1)\n if (onApproveAlways) onApproveAlways(toolCall.id, toolCall.name)\n else onApprove(toolCall.id)\n }\n else if (input === '3') { setIndex(2); onDeny(toolCall.id) }\n })\n\n if (!active) return null\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1} borderColor=\"yellow\">\n <Text color=\"yellow\" bold>\n ⚠ Allow {toolCall.name}?\n </Text>\n <Text dimColor>{JSON.stringify(toolCall.args)}</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {OPTIONS.map((opt, i) => {\n const selected = i === index\n return (\n <Box key={opt.key}>\n <Text color={selected ? opt.color : 'gray'}>\n {selected ? '❯ ' : ' '}\n </Text>\n <Text color={selected ? opt.color : 'white'} bold={selected}>\n {i + 1}. {opt.label}\n </Text>\n <Text dimColor> — {opt.hint}</Text>\n </Box>\n )\n })}\n </Box>\n <Text dimColor>↑/↓ to move, Enter to pick, 1–3 for shortcuts</Text>\n </Box>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { useInkTheme } from './theme'\n\nexport interface TopologyGraphViewNode {\n id: string\n label: string\n topology: string\n startCount: number\n endCount: number\n errorCount: number\n lastActiveAt: number\n}\n\nexport interface TopologyGraphViewEdge {\n id: string\n from: string\n to: string\n count: number\n lastTask?: string\n lastResult?: string\n}\n\nexport interface TopologyGraphViewSnapshot {\n nodes: TopologyGraphViewNode[]\n edges: TopologyGraphViewEdge[]\n updatedAt: string\n}\n\nexport interface TopologyGraphSource {\n toJSON: () => TopologyGraphViewSnapshot\n subscribe: (handler: (s: TopologyGraphViewSnapshot) => void) => () => void\n}\n\nexport interface TopologyGraphViewProps {\n source: TopologyGraphSource\n}\n\nexport function TopologyGraphView({ source }: TopologyGraphViewProps) {\n const theme = useInkTheme()\n const [snap, setSnap] = useState<TopologyGraphViewSnapshot>(() => source.toJSON())\n\n useEffect(() => source.subscribe(setSnap), [source])\n\n const root = snap.nodes.find(n => n.id === '__root__')\n const others = snap.nodes.filter(n => n.id !== '__root__')\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1}>\n <Text bold>({root?.topology ?? 'topology'})</Text>\n {others.map(node => {\n const status =\n node.errorCount > 0\n ? { icon: '✗', color: theme.toolStatus.error.color }\n : node.endCount > 0\n ? { icon: '✓', color: theme.toolStatus.complete.color }\n : { icon: '…', color: theme.toolStatus.running.color }\n return (\n <Box key={node.id}>\n <Text color={status.color}>\n {' ├─ '}\n {status.icon} {node.label}\n </Text>\n <Text dimColor>\n {' '}({node.startCount} starts, {node.endCount} done)\n </Text>\n </Box>\n )\n })}\n </Box>\n )\n}\n"]} |
+1
-1
| { | ||
| "name": "@agentskit/ink", | ||
| "version": "0.9.4", | ||
| "version": "0.9.5", | ||
| "description": "Ink terminal components and hooks for AgentsKit.", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
156722
0.31%1237
0.49%