agentk8 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import { render } from 'ink';
4
4
  import meow from 'meow';
5
5
  import { App } from './components/App.js';
6
6
  import { checkClaudeInstalled } from './lib/claude.js';
7
- const VERSION = '2.2.0';
7
+ const VERSION = '2.2.1';
8
8
  const cli = meow(`
9
9
  Usage
10
10
  $ agentk8 [options]
@@ -1,12 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import { Box, Text, useApp, useInput, Static } from 'ink';
4
- import { Banner } from './Banner.js';
4
+ import { WelcomeBox } from './WelcomeBox.js';
5
5
  import { ChatMessage } from './ChatMessage.js';
6
6
  import { Input } from './Input.js';
7
7
  import { StatusBar } from './StatusBar.js';
8
8
  import { ThinkingIndicator } from './ThinkingIndicator.js';
9
- import { AgentPanel } from './AgentPanel.js';
10
9
  import { runClaude } from '../lib/claude.js';
11
10
  export const App = ({ mode, version }) => {
12
11
  const { exit } = useApp();
@@ -45,7 +44,6 @@ export const App = ({ mode, version }) => {
45
44
  if (awaitingApproval) {
46
45
  if (input.toLowerCase() === 'y' || input.toLowerCase() === 'yes') {
47
46
  setAwaitingApproval(false);
48
- // Execute the pending plan
49
47
  if (pendingPlan) {
50
48
  await executeTask(pendingPlan);
51
49
  setPendingPlan(null);
@@ -93,11 +91,9 @@ Respond with:
93
91
 
94
92
  Format your response clearly with headers.`;
95
93
  const result = await runClaude(planPrompt, mode);
96
- // Mark orchestrator done, detect other agents
97
94
  const mentioned = detectMentionedAgents(result.response);
98
95
  setCompletedAgents(['Orchestrator', ...mentioned]);
99
96
  setActiveAgent(undefined);
100
- // Add plan message
101
97
  const planMessage = {
102
98
  id: (Date.now() + 1).toString(),
103
99
  role: 'agent',
@@ -107,11 +103,9 @@ Format your response clearly with headers.`;
107
103
  timestamp: new Date(),
108
104
  };
109
105
  setMessages(prev => [...prev, planMessage]);
110
- // Update tokens
111
106
  if (result.tokens) {
112
107
  setTotalTokens(prev => prev + result.tokens.input + result.tokens.output);
113
108
  }
114
- // Ask for approval
115
109
  setPendingPlan(input);
116
110
  setAwaitingApproval(true);
117
111
  addSystemMessage('Execute this plan? (y/n)');
@@ -170,7 +164,7 @@ Format your response clearly with headers.`;
170
164
  };
171
165
  // Handle slash commands
172
166
  const handleCommand = (cmd) => {
173
- const [command, ...args] = cmd.slice(1).split(' ');
167
+ const [command] = cmd.slice(1).split(' ');
174
168
  switch (command) {
175
169
  case 'exit':
176
170
  case 'quit':
@@ -252,16 +246,16 @@ Ctrl+U - Clear input line`,
252
246
  exit();
253
247
  }
254
248
  });
255
- // Prepare items for Static (include banner as first item)
249
+ // Prepare items for Static (include welcome box as first item)
256
250
  const staticItems = messages.length === 0
257
- ? [{ id: 'banner', isBanner: true, role: 'system', content: '', timestamp: new Date() }]
251
+ ? [{ id: 'welcome', isWelcome: true, role: 'system', content: '', timestamp: new Date() }]
258
252
  : messages;
259
253
  return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: staticItems, children: (item) => {
260
- if ('isBanner' in item && item.isBanner) {
261
- return _jsx(Banner, { version: version }, "banner");
254
+ if ('isWelcome' in item && item.isWelcome) {
255
+ return _jsx(WelcomeBox, { version: version, mode: mode }, "welcome");
262
256
  }
263
257
  return (_jsx(ChatMessage, { role: item.role, agentName: item.agentName, content: item.content, tokens: item.tokens }, item.id));
264
- } }), isProcessing && processingStartTime && (_jsx(ThinkingIndicator, { startTime: processingStartTime })), error && (_jsx(Box, { marginY: 1, marginLeft: 1, children: _jsxs(Text, { color: "#e53e3e", children: ["\u2717 Error: ", error] }) })), _jsx(Input, { onSubmit: handleSubmit, disabled: isProcessing, placeholder: awaitingApproval ? "Execute plan? (y/n)" : "Type a message or /help for commands..." }), _jsx(AgentPanel, { mode: mode, activeAgent: activeAgent, completedAgents: completedAgents }), _jsx(StatusBar, { mode: mode, tokens: totalTokens, startTime: startTime, isProcessing: isProcessing })] }));
258
+ } }), isProcessing && processingStartTime && (_jsx(ThinkingIndicator, { startTime: processingStartTime })), error && (_jsx(Box, { marginY: 1, marginLeft: 1, children: _jsxs(Text, { color: "#e53e3e", children: ["\u2717 Error: ", error] }) })), _jsx(Input, { onSubmit: handleSubmit, disabled: isProcessing, placeholder: awaitingApproval ? "Execute plan? (y/n)" : 'Try "build a password validator"' }), _jsx(StatusBar, { mode: mode, tokens: totalTokens, startTime: startTime, isProcessing: isProcessing, activeAgent: activeAgent, completedAgents: completedAgents })] }));
265
259
  };
266
260
  function formatElapsed(start) {
267
261
  const secs = Math.floor((Date.now() - start.getTime()) / 1000);
@@ -1,23 +1,26 @@
1
- import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import { Box, Text, useInput } from 'ink';
4
4
  // Sophisticated theme
5
5
  const theme = {
6
6
  accent: '#4fd1c5',
7
7
  dim: '#4a5568',
8
+ border: '#4a5568',
8
9
  suggestion: '#718096',
10
+ text: '#e2e8f0',
9
11
  };
10
12
  // Available commands for autocomplete
11
13
  const COMMANDS = ['/help', '/status', '/clear', '/exit', '/plan', '/auto', '/mode', '/agents'];
12
14
  // Store history globally so it persists across re-renders
13
15
  const commandHistory = [];
14
16
  const MAX_HISTORY = 100;
15
- export const Input = ({ onSubmit, placeholder = 'Type a message...', prefix = '>', disabled = false, }) => {
17
+ export const Input = ({ onSubmit, placeholder = 'Type a message...', prefix = '', disabled = false, }) => {
16
18
  const [value, setValue] = useState('');
17
19
  const [cursorPosition, setCursorPosition] = useState(0);
18
20
  const [historyIndex, setHistoryIndex] = useState(-1);
19
- const [tempValue, setTempValue] = useState(''); // Store current input when browsing history
20
- const [tabIndex, setTabIndex] = useState(0); // For cycling through completions
21
+ const [tempValue, setTempValue] = useState('');
22
+ const [tabIndex, setTabIndex] = useState(0);
23
+ const termWidth = process.stdout.columns || 80;
21
24
  // Get autocomplete suggestion
22
25
  const getSuggestion = () => {
23
26
  if (!value.startsWith('/') || value.length < 1)
@@ -33,7 +36,6 @@ export const Input = ({ onSubmit, placeholder = 'Type a message...', prefix = '>
33
36
  return;
34
37
  if (key.return) {
35
38
  if (value.trim()) {
36
- // Add to history (avoid duplicates at the end)
37
39
  if (commandHistory.length === 0 || commandHistory[commandHistory.length - 1] !== value) {
38
40
  commandHistory.push(value);
39
41
  if (commandHistory.length > MAX_HISTORY) {
@@ -48,10 +50,8 @@ export const Input = ({ onSubmit, placeholder = 'Type a message...', prefix = '>
48
50
  }
49
51
  }
50
52
  else if (key.upArrow) {
51
- // Navigate history backwards
52
53
  if (commandHistory.length > 0) {
53
54
  if (historyIndex === -1) {
54
- // Save current input before browsing history
55
55
  setTempValue(value);
56
56
  const newIndex = commandHistory.length - 1;
57
57
  setHistoryIndex(newIndex);
@@ -67,7 +67,6 @@ export const Input = ({ onSubmit, placeholder = 'Type a message...', prefix = '>
67
67
  }
68
68
  }
69
69
  else if (key.downArrow) {
70
- // Navigate history forwards
71
70
  if (historyIndex !== -1) {
72
71
  if (historyIndex < commandHistory.length - 1) {
73
72
  const newIndex = historyIndex + 1;
@@ -76,7 +75,6 @@ export const Input = ({ onSubmit, placeholder = 'Type a message...', prefix = '>
76
75
  setCursorPosition(commandHistory[newIndex].length);
77
76
  }
78
77
  else {
79
- // Return to the original input
80
78
  setHistoryIndex(-1);
81
79
  setValue(tempValue);
82
80
  setCursorPosition(tempValue.length);
@@ -87,7 +85,7 @@ export const Input = ({ onSubmit, placeholder = 'Type a message...', prefix = '>
87
85
  if (cursorPosition > 0) {
88
86
  setValue(prev => prev.slice(0, cursorPosition - 1) + prev.slice(cursorPosition));
89
87
  setCursorPosition(pos => pos - 1);
90
- setHistoryIndex(-1); // Reset history navigation on edit
88
+ setHistoryIndex(-1);
91
89
  }
92
90
  }
93
91
  else if (key.leftArrow) {
@@ -100,28 +98,23 @@ export const Input = ({ onSubmit, placeholder = 'Type a message...', prefix = '>
100
98
  process.exit(0);
101
99
  }
102
100
  else if (key.ctrl && input === 'u') {
103
- // Clear line
104
101
  setValue('');
105
102
  setCursorPosition(0);
106
103
  setHistoryIndex(-1);
107
104
  }
108
105
  else if (key.ctrl && input === 'a') {
109
- // Go to beginning
110
106
  setCursorPosition(0);
111
107
  }
112
108
  else if (key.ctrl && input === 'e') {
113
- // Go to end
114
109
  setCursorPosition(value.length);
115
110
  }
116
111
  else if (key.tab) {
117
- // Tab completion
118
112
  if (suggestion) {
119
113
  const completed = value + suggestion;
120
114
  setValue(completed);
121
115
  setCursorPosition(completed.length);
122
116
  }
123
117
  else if (value.startsWith('/')) {
124
- // Cycle through matching commands
125
118
  const matches = COMMANDS.filter(cmd => cmd.startsWith(value.toLowerCase()));
126
119
  if (matches.length > 0) {
127
120
  const nextIndex = (tabIndex + 1) % matches.length;
@@ -134,14 +127,14 @@ export const Input = ({ onSubmit, placeholder = 'Type a message...', prefix = '>
134
127
  else if (!key.ctrl && !key.meta && input) {
135
128
  setValue(prev => prev.slice(0, cursorPosition) + input + prev.slice(cursorPosition));
136
129
  setCursorPosition(pos => pos + input.length);
137
- setHistoryIndex(-1); // Reset history navigation on edit
138
- setTabIndex(0); // Reset tab completion cycle
130
+ setHistoryIndex(-1);
131
+ setTabIndex(0);
139
132
  }
140
133
  });
141
134
  // Render input with cursor
142
135
  const beforeCursor = value.slice(0, cursorPosition);
143
136
  const atCursor = value[cursorPosition] || ' ';
144
137
  const afterCursor = value.slice(cursorPosition + 1);
145
- return (_jsxs(Box, { marginTop: 1, children: [_jsxs(Text, { color: theme.accent, bold: true, children: [prefix, " "] }), value.length === 0 && !disabled ? (_jsx(Text, { color: theme.dim, children: placeholder })) : (_jsxs(_Fragment, { children: [_jsx(Text, { children: beforeCursor }), _jsx(Text, { inverse: true, children: atCursor }), _jsx(Text, { children: afterCursor }), suggestion && cursorPosition === value.length && (_jsx(Text, { color: theme.suggestion, children: suggestion }))] })), disabled && _jsx(Text, { color: theme.dim, children: " processing..." })] }));
138
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: _jsx(Text, { color: theme.border, children: '─'.repeat(termWidth) }) }), _jsxs(Box, { paddingX: 1, children: [_jsxs(Text, { color: theme.accent, children: [prefix, " "] }), value.length === 0 && !disabled ? (_jsx(Text, { color: theme.dim, children: placeholder })) : (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.text, children: beforeCursor }), _jsx(Text, { inverse: true, children: atCursor }), _jsx(Text, { color: theme.text, children: afterCursor }), suggestion && cursorPosition === value.length && (_jsx(Text, { color: theme.suggestion, children: suggestion }))] })), disabled && _jsx(Text, { color: theme.dim, children: " processing..." })] }), _jsx(Box, { children: _jsx(Text, { color: theme.border, children: '─'.repeat(termWidth) }) })] }));
146
139
  };
147
140
  export default Input;
@@ -1,9 +1,12 @@
1
1
  import React from 'react';
2
+ import { AgentName } from './AgentPanel.js';
2
3
  interface StatusBarProps {
3
4
  mode: 'dev' | 'ml';
4
5
  tokens: number;
5
6
  startTime: Date;
6
7
  isProcessing?: boolean;
8
+ activeAgent?: AgentName;
9
+ completedAgents?: AgentName[];
7
10
  }
8
11
  export declare const StatusBar: React.FC<StatusBarProps>;
9
12
  export default StatusBar;
@@ -1,17 +1,30 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useEffect } from 'react';
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React, { useState, useEffect } from 'react';
3
3
  import { Box, Text } from 'ink';
4
4
  import { icons } from '../themes/retro.js';
5
- // Matching sophisticated theme
5
+ // Theme
6
6
  const theme = {
7
- border: '#2d3748',
7
+ border: '#4a5568',
8
8
  accent: '#4fd1c5',
9
9
  highlight: '#81e6d9',
10
- dim: '#4a5568',
11
- glow: '#319795',
10
+ dim: '#718096',
11
+ active: '#f6e05e',
12
+ done: '#48bb78',
12
13
  };
13
- export const StatusBar = ({ mode, tokens, startTime, isProcessing = false, }) => {
14
- const [elapsed, setElapsed] = useState('0s');
14
+ // Agent icons
15
+ const agentIcons = {
16
+ Orchestrator: '◆',
17
+ Engineer: '⚙',
18
+ Tester: '✓',
19
+ Security: '⛨',
20
+ Scout: '◎',
21
+ Researcher: '◈',
22
+ 'ML Engineer': '⬡',
23
+ 'Data Engineer': '⬢',
24
+ Evaluator: '◉',
25
+ };
26
+ export const StatusBar = ({ mode, tokens, startTime, isProcessing = false, activeAgent, completedAgents = [], }) => {
27
+ const [elapsed, setElapsed] = useState('');
15
28
  const [spinnerFrame, setSpinnerFrame] = useState(0);
16
29
  useEffect(() => {
17
30
  if (!isProcessing) {
@@ -42,7 +55,17 @@ export const StatusBar = ({ mode, tokens, startTime, isProcessing = false, }) =>
42
55
  return t.toString();
43
56
  };
44
57
  const modeLabel = mode === 'dev' ? 'DEV' : 'ML';
45
- const termWidth = process.stdout.columns || 80;
46
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: theme.border, children: ''.repeat(termWidth) }), _jsxs(Box, { justifyContent: "space-between", width: termWidth, children: [_jsxs(Box, { children: [_jsx(Text, { color: theme.dim, children: ' ◇ ' }), _jsx(Text, { color: theme.accent, children: modeLabel }), _jsx(Text, { color: theme.border, children: ' │ ' }), _jsx(Text, { color: theme.dim, children: "/help" }), isProcessing && (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.border, children: ' │ ' }), _jsx(Text, { color: theme.highlight, children: icons.spinner[spinnerFrame] })] }))] }), _jsxs(Box, { children: [elapsed && (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.dim, children: elapsed }), _jsx(Text, { color: theme.border, children: ' │ ' })] })), _jsxs(Text, { color: theme.accent, children: ["\u2191 ", formatTokens(tokens)] }), _jsx(Text, { color: theme.dim, children: ' tokens ' })] })] })] }));
58
+ // Get agents for this mode
59
+ const modeAgents = mode === 'dev'
60
+ ? ['Orchestrator', 'Engineer', 'Tester', 'Security']
61
+ : ['Orchestrator', 'Researcher', 'ML Engineer', 'Evaluator'];
62
+ const getAgentColor = (agent) => {
63
+ if (activeAgent === agent)
64
+ return theme.active;
65
+ if (completedAgents.includes(agent))
66
+ return theme.done;
67
+ return theme.dim;
68
+ };
69
+ return (_jsxs(Box, { children: [_jsx(Text, { color: theme.dim, children: " " }), _jsx(Text, { color: theme.accent, children: modeLabel }), _jsx(Text, { color: theme.border, children: " \u2502 " }), modeAgents.map((agent, i) => (_jsxs(React.Fragment, { children: [_jsx(Text, { color: getAgentColor(agent), children: "[" }), _jsx(Text, { color: getAgentColor(agent), children: agentIcons[agent] }), _jsx(Text, { color: getAgentColor(agent), children: "]" }), i < modeAgents.length - 1 && _jsx(Text, { color: theme.dim, children: " " })] }, agent))), _jsx(Text, { color: theme.border, children: " \u2502 " }), _jsx(Text, { color: theme.dim, children: "? help" }), isProcessing && (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.border, children: " \u2502 " }), _jsx(Text, { color: theme.highlight, children: icons.spinner[spinnerFrame] })] })), elapsed && (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.border, children: " \u2502 " }), _jsx(Text, { color: theme.dim, children: elapsed })] })), _jsx(Text, { color: theme.dim, children: ' '.repeat(3) }), _jsxs(Text, { color: theme.accent, children: ["\u2191 ", formatTokens(tokens)] }), _jsx(Text, { color: theme.dim, children: " tokens" })] }));
47
70
  };
48
71
  export default StatusBar;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface WelcomeBoxProps {
3
+ version: string;
4
+ mode: 'dev' | 'ml';
5
+ }
6
+ export declare const WelcomeBox: React.FC<WelcomeBoxProps>;
7
+ export default WelcomeBox;
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Box, Text } from 'ink';
4
+ const theme = {
5
+ border: '#4a5568',
6
+ accent: '#4fd1c5',
7
+ highlight: '#81e6d9',
8
+ dim: '#718096',
9
+ text: '#e2e8f0',
10
+ title: '#f6e05e',
11
+ };
12
+ export const WelcomeBox = ({ version, mode }) => {
13
+ const termWidth = Math.min(process.stdout.columns || 120, 120);
14
+ const boxWidth = termWidth - 4;
15
+ const leftWidth = Math.floor(boxWidth * 0.45);
16
+ const rightWidth = boxWidth - leftWidth - 3;
17
+ const modeLabel = mode === 'dev' ? 'Software Development' : 'ML Research';
18
+ const agents = mode === 'dev'
19
+ ? ['Orchestrator', 'Engineer', 'Tester', 'Security']
20
+ : ['Orchestrator', 'Researcher', 'ML Engineer', 'Evaluator'];
21
+ // Title bar
22
+ const titleText = ` AGENT-K v${version} `;
23
+ const titlePadLeft = Math.floor((boxWidth - titleText.length) / 2);
24
+ const titlePadRight = boxWidth - titleText.length - titlePadLeft;
25
+ return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u256D" }), _jsx(Text, { color: theme.border, children: '─'.repeat(titlePadLeft - 1) }), _jsx(Text, { color: theme.title, bold: true, children: titleText }), _jsx(Text, { color: theme.border, children: '─'.repeat(titlePadRight - 1) }), _jsx(Text, { color: theme.border, children: "\u256E" })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u2502" }), _jsx(Text, { children: ' '.repeat(boxWidth) }), _jsx(Text, { color: theme.border, children: "\u2502" })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u2502" }), _jsx(Box, { width: leftWidth, justifyContent: "center", children: _jsx(Text, { color: theme.accent, children: " /\\_/\\ " }) }), _jsx(Text, { color: theme.border, children: "\u2502" }), _jsxs(Box, { width: rightWidth, paddingLeft: 1, children: [_jsx(Text, { color: theme.text, children: "Welcome to " }), _jsx(Text, { color: theme.accent, bold: true, children: "AGENT-K" })] }), _jsx(Text, { color: theme.border, children: "\u2502" })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u2502" }), _jsx(Box, { width: leftWidth, justifyContent: "center", children: _jsx(Text, { color: theme.accent, children: " ( o.o ) " }) }), _jsx(Text, { color: theme.border, children: "\u2502" }), _jsx(Box, { width: rightWidth, paddingLeft: 1, children: _jsx(Text, { color: theme.dim, children: "Multi-Agent Intelligence System" }) }), _jsx(Text, { color: theme.border, children: "\u2502" })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u2502" }), _jsx(Box, { width: leftWidth, justifyContent: "center", children: _jsxs(Text, { color: theme.accent, children: [" ", '>', " ", '<', " "] }) }), _jsx(Text, { color: theme.border, children: "\u2502" }), _jsxs(Box, { width: rightWidth, paddingLeft: 1, children: [_jsx(Text, { color: theme.dim, children: "Mode: " }), _jsx(Text, { color: theme.highlight, children: modeLabel })] }), _jsx(Text, { color: theme.border, children: "\u2502" })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u2502" }), _jsx(Text, { children: ' '.repeat(boxWidth) }), _jsx(Text, { color: theme.border, children: "\u2502" })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u2502" }), _jsx(Box, { width: boxWidth, justifyContent: "center", children: agents.map((agent, i) => (_jsxs(React.Fragment, { children: [_jsx(Text, { color: theme.accent, children: "\u25C6 " }), _jsx(Text, { color: theme.text, children: agent }), i < agents.length - 1 && _jsx(Text, { color: theme.dim, children: " \u00B7 " })] }, agent))) }), _jsx(Text, { color: theme.border, children: "\u2502" })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u2502" }), _jsx(Text, { children: ' '.repeat(boxWidth) }), _jsx(Text, { color: theme.border, children: "\u2502" })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u2502" }), _jsx(Box, { width: boxWidth, justifyContent: "center", children: _jsx(Text, { color: theme.dim, children: "/help for commands \u00B7 /plan or /auto to set mode \u00B7 Ctrl+C to exit" }) }), _jsx(Text, { color: theme.border, children: "\u2502" })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.border, children: "\u2570" }), _jsx(Text, { color: theme.border, children: '─'.repeat(boxWidth) }), _jsx(Text, { color: theme.border, children: "\u256F" })] })] }));
26
+ };
27
+ export default WelcomeBox;
@@ -1,5 +1,6 @@
1
1
  export { App } from './App.js';
2
2
  export { Banner } from './Banner.js';
3
+ export { WelcomeBox } from './WelcomeBox.js';
3
4
  export { ChatMessage } from './ChatMessage.js';
4
5
  export { Input } from './Input.js';
5
6
  export { StatusBar } from './StatusBar.js';
@@ -1,5 +1,6 @@
1
1
  export { App } from './App.js';
2
2
  export { Banner } from './Banner.js';
3
+ export { WelcomeBox } from './WelcomeBox.js';
3
4
  export { ChatMessage } from './ChatMessage.js';
4
5
  export { Input } from './Input.js';
5
6
  export { StatusBar } from './StatusBar.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentk8",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "description": "Multi-Agent Claude Code Terminal Suite",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",