gencode-ai 0.1.1 → 0.1.3

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.
Files changed (287) hide show
  1. package/.gencode/settings.local.json +7 -0
  2. package/CLAUDE.md +86 -0
  3. package/README.md +13 -16
  4. package/dist/agent/agent.d.ts +50 -1
  5. package/dist/agent/agent.d.ts.map +1 -1
  6. package/dist/agent/agent.js +96 -16
  7. package/dist/agent/agent.js.map +1 -1
  8. package/dist/agent/index.d.ts +1 -0
  9. package/dist/agent/index.d.ts.map +1 -1
  10. package/dist/agent/types.d.ts +14 -1
  11. package/dist/agent/types.d.ts.map +1 -1
  12. package/dist/cli/components/App.d.ts +8 -1
  13. package/dist/cli/components/App.d.ts.map +1 -1
  14. package/dist/cli/components/App.js +266 -29
  15. package/dist/cli/components/App.js.map +1 -1
  16. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
  17. package/dist/cli/components/CommandSuggestions.js +2 -0
  18. package/dist/cli/components/CommandSuggestions.js.map +1 -1
  19. package/dist/cli/components/Header.d.ts +1 -1
  20. package/dist/cli/components/Header.d.ts.map +1 -1
  21. package/dist/cli/components/Header.js +4 -6
  22. package/dist/cli/components/Header.js.map +1 -1
  23. package/dist/cli/components/Logo.d.ts +1 -0
  24. package/dist/cli/components/Logo.d.ts.map +1 -1
  25. package/dist/cli/components/Logo.js +16 -3
  26. package/dist/cli/components/Logo.js.map +1 -1
  27. package/dist/cli/components/Messages.d.ts +4 -4
  28. package/dist/cli/components/Messages.d.ts.map +1 -1
  29. package/dist/cli/components/Messages.js +66 -23
  30. package/dist/cli/components/Messages.js.map +1 -1
  31. package/dist/cli/components/PermissionPrompt.d.ts +60 -0
  32. package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
  33. package/dist/cli/components/PermissionPrompt.js +192 -0
  34. package/dist/cli/components/PermissionPrompt.js.map +1 -0
  35. package/dist/cli/components/ProviderManager.js +3 -3
  36. package/dist/cli/components/ProviderManager.js.map +1 -1
  37. package/dist/cli/components/QuestionPrompt.d.ts +23 -0
  38. package/dist/cli/components/QuestionPrompt.d.ts.map +1 -0
  39. package/dist/cli/components/QuestionPrompt.js +231 -0
  40. package/dist/cli/components/QuestionPrompt.js.map +1 -0
  41. package/dist/cli/components/Spinner.d.ts +7 -2
  42. package/dist/cli/components/Spinner.d.ts.map +1 -1
  43. package/dist/cli/components/Spinner.js +116 -25
  44. package/dist/cli/components/Spinner.js.map +1 -1
  45. package/dist/cli/components/TodoList.d.ts +7 -0
  46. package/dist/cli/components/TodoList.d.ts.map +1 -0
  47. package/dist/cli/components/TodoList.js +34 -0
  48. package/dist/cli/components/TodoList.js.map +1 -0
  49. package/dist/cli/components/index.d.ts +2 -0
  50. package/dist/cli/components/index.d.ts.map +1 -1
  51. package/dist/cli/components/index.js +2 -0
  52. package/dist/cli/components/index.js.map +1 -1
  53. package/dist/cli/components/theme.d.ts +7 -0
  54. package/dist/cli/components/theme.d.ts.map +1 -1
  55. package/dist/cli/components/theme.js +11 -1
  56. package/dist/cli/components/theme.js.map +1 -1
  57. package/dist/cli/index.js +47 -7
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/config/index.d.ts +13 -4
  60. package/dist/config/index.d.ts.map +1 -1
  61. package/dist/config/index.js +18 -3
  62. package/dist/config/index.js.map +1 -1
  63. package/dist/config/levels.d.ts +49 -0
  64. package/dist/config/levels.d.ts.map +1 -0
  65. package/dist/config/levels.js +222 -0
  66. package/dist/config/levels.js.map +1 -0
  67. package/dist/config/loader.d.ts +46 -0
  68. package/dist/config/loader.d.ts.map +1 -0
  69. package/dist/config/loader.js +153 -0
  70. package/dist/config/loader.js.map +1 -0
  71. package/dist/config/manager.d.ts +115 -15
  72. package/dist/config/manager.d.ts.map +1 -1
  73. package/dist/config/manager.js +260 -34
  74. package/dist/config/manager.js.map +1 -1
  75. package/dist/config/manager.test.d.ts +5 -0
  76. package/dist/config/manager.test.d.ts.map +1 -0
  77. package/dist/config/manager.test.js +192 -0
  78. package/dist/config/manager.test.js.map +1 -0
  79. package/dist/config/merger.d.ts +56 -0
  80. package/dist/config/merger.d.ts.map +1 -0
  81. package/dist/config/merger.js +177 -0
  82. package/dist/config/merger.js.map +1 -0
  83. package/dist/config/test-utils.d.ts +24 -0
  84. package/dist/config/test-utils.d.ts.map +1 -0
  85. package/dist/config/test-utils.js +55 -0
  86. package/dist/config/test-utils.js.map +1 -0
  87. package/dist/config/types.d.ts +78 -9
  88. package/dist/config/types.d.ts.map +1 -1
  89. package/dist/config/types.js +52 -2
  90. package/dist/config/types.js.map +1 -1
  91. package/dist/memory/import-resolver.d.ts +46 -0
  92. package/dist/memory/import-resolver.d.ts.map +1 -0
  93. package/dist/memory/import-resolver.js +117 -0
  94. package/dist/memory/import-resolver.js.map +1 -0
  95. package/dist/memory/index.d.ts +7 -6
  96. package/dist/memory/index.d.ts.map +1 -1
  97. package/dist/memory/index.js +7 -5
  98. package/dist/memory/index.js.map +1 -1
  99. package/dist/memory/init-prompt.d.ts +22 -0
  100. package/dist/memory/init-prompt.d.ts.map +1 -0
  101. package/dist/memory/init-prompt.js +103 -0
  102. package/dist/memory/init-prompt.js.map +1 -0
  103. package/dist/memory/memory-manager.d.ts +119 -0
  104. package/dist/memory/memory-manager.d.ts.map +1 -0
  105. package/dist/memory/memory-manager.js +587 -0
  106. package/dist/memory/memory-manager.js.map +1 -0
  107. package/dist/memory/rules-parser.d.ts +38 -0
  108. package/dist/memory/rules-parser.d.ts.map +1 -0
  109. package/dist/memory/rules-parser.js +69 -0
  110. package/dist/memory/rules-parser.js.map +1 -0
  111. package/dist/memory/test-utils.d.ts +20 -0
  112. package/dist/memory/test-utils.d.ts.map +1 -0
  113. package/dist/memory/test-utils.js +44 -0
  114. package/dist/memory/test-utils.js.map +1 -0
  115. package/dist/memory/types.d.ts +70 -63
  116. package/dist/memory/types.d.ts.map +1 -1
  117. package/dist/memory/types.js +42 -2
  118. package/dist/memory/types.js.map +1 -1
  119. package/dist/permissions/audit.d.ts +82 -0
  120. package/dist/permissions/audit.d.ts.map +1 -0
  121. package/dist/permissions/audit.js +229 -0
  122. package/dist/permissions/audit.js.map +1 -0
  123. package/dist/permissions/index.d.ts +11 -1
  124. package/dist/permissions/index.d.ts.map +1 -1
  125. package/dist/permissions/index.js +15 -0
  126. package/dist/permissions/index.js.map +1 -1
  127. package/dist/permissions/manager.d.ts +149 -13
  128. package/dist/permissions/manager.d.ts.map +1 -1
  129. package/dist/permissions/manager.js +480 -35
  130. package/dist/permissions/manager.js.map +1 -1
  131. package/dist/permissions/manager.test.d.ts +5 -0
  132. package/dist/permissions/manager.test.d.ts.map +1 -0
  133. package/dist/permissions/manager.test.js +213 -0
  134. package/dist/permissions/manager.test.js.map +1 -0
  135. package/dist/permissions/persistence.d.ts +74 -0
  136. package/dist/permissions/persistence.d.ts.map +1 -0
  137. package/dist/permissions/persistence.js +248 -0
  138. package/dist/permissions/persistence.js.map +1 -0
  139. package/dist/permissions/persistence.test.d.ts +5 -0
  140. package/dist/permissions/persistence.test.d.ts.map +1 -0
  141. package/dist/permissions/persistence.test.js +171 -0
  142. package/dist/permissions/persistence.test.js.map +1 -0
  143. package/dist/permissions/prompt-matcher.d.ts +64 -0
  144. package/dist/permissions/prompt-matcher.d.ts.map +1 -0
  145. package/dist/permissions/prompt-matcher.js +415 -0
  146. package/dist/permissions/prompt-matcher.js.map +1 -0
  147. package/dist/permissions/prompt-matcher.test.d.ts +5 -0
  148. package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
  149. package/dist/permissions/prompt-matcher.test.js +107 -0
  150. package/dist/permissions/prompt-matcher.test.js.map +1 -0
  151. package/dist/permissions/types.d.ts +157 -0
  152. package/dist/permissions/types.d.ts.map +1 -1
  153. package/dist/permissions/types.js +45 -8
  154. package/dist/permissions/types.js.map +1 -1
  155. package/dist/prompts/index.d.ts +92 -0
  156. package/dist/prompts/index.d.ts.map +1 -0
  157. package/dist/prompts/index.js +241 -0
  158. package/dist/prompts/index.js.map +1 -0
  159. package/dist/tools/builtin/ask-user.d.ts +64 -0
  160. package/dist/tools/builtin/ask-user.d.ts.map +1 -0
  161. package/dist/tools/builtin/ask-user.js +148 -0
  162. package/dist/tools/builtin/ask-user.js.map +1 -0
  163. package/dist/tools/builtin/bash.d.ts.map +1 -1
  164. package/dist/tools/builtin/bash.js +2 -1
  165. package/dist/tools/builtin/bash.js.map +1 -1
  166. package/dist/tools/builtin/edit.d.ts.map +1 -1
  167. package/dist/tools/builtin/edit.js +2 -1
  168. package/dist/tools/builtin/edit.js.map +1 -1
  169. package/dist/tools/builtin/glob.d.ts.map +1 -1
  170. package/dist/tools/builtin/glob.js +2 -1
  171. package/dist/tools/builtin/glob.js.map +1 -1
  172. package/dist/tools/builtin/grep.d.ts.map +1 -1
  173. package/dist/tools/builtin/grep.js +2 -1
  174. package/dist/tools/builtin/grep.js.map +1 -1
  175. package/dist/tools/builtin/read.d.ts.map +1 -1
  176. package/dist/tools/builtin/read.js +2 -1
  177. package/dist/tools/builtin/read.js.map +1 -1
  178. package/dist/tools/builtin/todowrite.d.ts +15 -0
  179. package/dist/tools/builtin/todowrite.d.ts.map +1 -0
  180. package/dist/tools/builtin/todowrite.js +88 -0
  181. package/dist/tools/builtin/todowrite.js.map +1 -0
  182. package/dist/tools/builtin/webfetch.d.ts.map +1 -1
  183. package/dist/tools/builtin/webfetch.js +2 -5
  184. package/dist/tools/builtin/webfetch.js.map +1 -1
  185. package/dist/tools/builtin/websearch.d.ts.map +1 -1
  186. package/dist/tools/builtin/websearch.js +2 -16
  187. package/dist/tools/builtin/websearch.js.map +1 -1
  188. package/dist/tools/builtin/write.d.ts.map +1 -1
  189. package/dist/tools/builtin/write.js +2 -1
  190. package/dist/tools/builtin/write.js.map +1 -1
  191. package/dist/tools/index.d.ts +19 -0
  192. package/dist/tools/index.d.ts.map +1 -1
  193. package/dist/tools/index.js +8 -0
  194. package/dist/tools/index.js.map +1 -1
  195. package/dist/tools/types.d.ts +39 -0
  196. package/dist/tools/types.d.ts.map +1 -1
  197. package/dist/tools/types.js +8 -0
  198. package/dist/tools/types.js.map +1 -1
  199. package/docs/config-system-comparison.md +707 -0
  200. package/docs/memory-system.md +238 -0
  201. package/docs/permissions.md +368 -0
  202. package/docs/proposals/0005-todo-system.md +350 -85
  203. package/docs/proposals/0006-memory-system.md +11 -10
  204. package/docs/proposals/0012-ask-user-question.md +1007 -207
  205. package/docs/proposals/0023-permission-enhancements.md +61 -2
  206. package/docs/proposals/0041-configuration-system.md +33 -2
  207. package/docs/proposals/0042-prompt-optimization.md +866 -0
  208. package/docs/proposals/README.md +7 -6
  209. package/examples/test-ask-user.ts +167 -0
  210. package/jest.config.js +26 -0
  211. package/package.json +8 -2
  212. package/src/agent/agent.ts +130 -16
  213. package/src/agent/index.ts +1 -0
  214. package/src/agent/types.ts +13 -1
  215. package/src/cli/components/App.tsx +362 -37
  216. package/src/cli/components/CommandSuggestions.tsx +2 -0
  217. package/src/cli/components/Header.tsx +11 -17
  218. package/src/cli/components/Logo.tsx +76 -9
  219. package/src/cli/components/Messages.tsx +104 -41
  220. package/src/cli/components/PermissionPrompt.tsx +388 -0
  221. package/src/cli/components/ProviderManager.tsx +5 -5
  222. package/src/cli/components/QuestionPrompt.tsx +462 -0
  223. package/src/cli/components/Spinner.tsx +138 -25
  224. package/src/cli/components/TodoList.tsx +54 -0
  225. package/src/cli/components/index.ts +7 -0
  226. package/src/cli/components/theme.ts +11 -1
  227. package/src/cli/index.tsx +54 -6
  228. package/src/config/index.ts +78 -4
  229. package/src/config/levels.test.ts +163 -0
  230. package/src/config/levels.ts +285 -0
  231. package/src/config/loader.test.ts +120 -0
  232. package/src/config/loader.ts +178 -0
  233. package/src/config/manager.test.ts +215 -0
  234. package/src/config/manager.ts +328 -40
  235. package/src/config/merger.test.ts +360 -0
  236. package/src/config/merger.ts +221 -0
  237. package/src/config/test-utils.ts +79 -0
  238. package/src/config/types.ts +152 -9
  239. package/src/memory/import-resolver.test.ts +117 -0
  240. package/src/memory/import-resolver.ts +149 -0
  241. package/src/memory/index.ts +11 -0
  242. package/src/memory/init-prompt.ts +113 -0
  243. package/src/memory/memory-manager.test.ts +198 -0
  244. package/src/memory/memory-manager.ts +716 -0
  245. package/src/memory/rules-parser.test.ts +182 -0
  246. package/src/memory/rules-parser.ts +82 -0
  247. package/src/memory/test-utils.ts +60 -0
  248. package/src/memory/types.ts +119 -0
  249. package/src/permissions/audit.ts +284 -0
  250. package/src/permissions/index.ts +20 -1
  251. package/src/permissions/manager.test.ts +260 -0
  252. package/src/permissions/manager.ts +592 -40
  253. package/src/permissions/persistence.test.ts +220 -0
  254. package/src/permissions/persistence.ts +301 -0
  255. package/src/permissions/prompt-matcher.test.ts +213 -0
  256. package/src/permissions/prompt-matcher.ts +472 -0
  257. package/src/permissions/types.ts +238 -8
  258. package/src/prompts/index.test.ts +279 -0
  259. package/src/prompts/index.ts +306 -0
  260. package/src/prompts/system/anthropic.txt +29 -0
  261. package/src/prompts/system/base.txt +166 -0
  262. package/src/prompts/system/gemini.txt +35 -0
  263. package/src/prompts/system/generic.txt +128 -0
  264. package/src/prompts/system/openai.txt +29 -0
  265. package/src/prompts/tools/ask-user.txt +110 -0
  266. package/src/prompts/tools/bash.txt +60 -0
  267. package/src/prompts/tools/edit.txt +29 -0
  268. package/src/prompts/tools/glob.txt +35 -0
  269. package/src/prompts/tools/grep.txt +43 -0
  270. package/src/prompts/tools/read.txt +22 -0
  271. package/src/prompts/tools/todowrite.txt +71 -0
  272. package/src/prompts/tools/webfetch.txt +34 -0
  273. package/src/prompts/tools/websearch.txt +41 -0
  274. package/src/prompts/tools/write.txt +23 -0
  275. package/src/tools/builtin/ask-user.ts +185 -0
  276. package/src/tools/builtin/bash.ts +2 -1
  277. package/src/tools/builtin/edit.ts +2 -1
  278. package/src/tools/builtin/glob.ts +2 -1
  279. package/src/tools/builtin/grep.ts +2 -1
  280. package/src/tools/builtin/read.ts +2 -1
  281. package/src/tools/builtin/todowrite.ts +102 -0
  282. package/src/tools/builtin/webfetch.ts +2 -5
  283. package/src/tools/builtin/websearch.ts +2 -16
  284. package/src/tools/builtin/write.ts +2 -1
  285. package/src/tools/index.ts +19 -0
  286. package/src/tools/types.ts +30 -0
  287. package/tsconfig.json +1 -1
@@ -1,16 +1,83 @@
1
1
  import { Box, Text } from 'ink';
2
+ import { colors } from './theme.js';
2
3
 
4
+ // Small G logo for inline use
3
5
  export function Logo() {
4
- // Full G with 3D shadow - subdued slate color
5
- const slateColor = "#64748B"; // Slate 500 - stable, professional
6
6
  return (
7
- <Box flexDirection="column" marginRight={1}>
8
- <Text color={slateColor}> ██████╗ </Text>
9
- <Text color={slateColor}> ██╔════╝ </Text>
10
- <Text color={slateColor}> ██║ ███╗</Text>
11
- <Text color={slateColor}> ██║ ██║</Text>
12
- <Text color={slateColor}> ╚██████╔╝</Text>
13
- <Text color={slateColor}> ╚═════╝ </Text>
7
+ <Box marginRight={1}>
8
+ <Text bold color={colors.brand}>◆</Text>
9
+ </Box>
10
+ );
11
+ }
12
+
13
+ // Large ASCII art logo with elegant gradient
14
+ export function BigLogo() {
15
+ // Indigo gradient - brand colors
16
+ const c1 = '#818CF8'; // Indigo 400
17
+ const c2 = '#818CF8'; // Indigo 400
18
+ const c3 = '#A5B4FC'; // Indigo 300
19
+ const c4 = '#A5B4FC'; // Indigo 300
20
+ const c5 = '#C7D2FE'; // Indigo 200
21
+ const c6 = '#C7D2FE'; // Indigo 200
22
+ const c7 = '#C7D2FE'; // Indigo 200
23
+
24
+ // G E N C O D E
25
+ return (
26
+ <Box flexDirection="column">
27
+ <Text>
28
+ <Text color={c1}> ██████╗ </Text>
29
+ <Text color={c2}>███████╗</Text>
30
+ <Text color={c3}>███╗ ██╗</Text>
31
+ <Text color={c4}> ██████╗</Text>
32
+ <Text color={c5}> ██████╗ </Text>
33
+ <Text color={c6}>██████╗ </Text>
34
+ <Text color={c7}>███████╗</Text>
35
+ </Text>
36
+ <Text>
37
+ <Text color={c1}>██╔════╝ </Text>
38
+ <Text color={c2}>██╔════╝</Text>
39
+ <Text color={c3}>████╗ ██║</Text>
40
+ <Text color={c4}>██╔════╝</Text>
41
+ <Text color={c5}>██╔═══██╗</Text>
42
+ <Text color={c6}>██╔══██╗</Text>
43
+ <Text color={c7}>██╔════╝</Text>
44
+ </Text>
45
+ <Text>
46
+ <Text color={c1}>██║ ███╗</Text>
47
+ <Text color={c2}>█████╗ </Text>
48
+ <Text color={c3}>██╔██╗ ██║</Text>
49
+ <Text color={c4}>██║ </Text>
50
+ <Text color={c5}>██║ ██║</Text>
51
+ <Text color={c6}>██║ ██║</Text>
52
+ <Text color={c7}>█████╗ </Text>
53
+ </Text>
54
+ <Text>
55
+ <Text color={c1}>██║ ██║</Text>
56
+ <Text color={c2}>██╔══╝ </Text>
57
+ <Text color={c3}>██║╚██╗██║</Text>
58
+ <Text color={c4}>██║ </Text>
59
+ <Text color={c5}>██║ ██║</Text>
60
+ <Text color={c6}>██║ ██║</Text>
61
+ <Text color={c7}>██╔══╝ </Text>
62
+ </Text>
63
+ <Text>
64
+ <Text color={c1}>╚██████╔╝</Text>
65
+ <Text color={c2}>███████╗</Text>
66
+ <Text color={c3}>██║ ╚████║</Text>
67
+ <Text color={c4}>╚██████╗</Text>
68
+ <Text color={c5}>╚██████╔╝</Text>
69
+ <Text color={c6}>██████╔╝</Text>
70
+ <Text color={c7}>███████╗</Text>
71
+ </Text>
72
+ <Text>
73
+ <Text color={c1}> ╚═════╝ </Text>
74
+ <Text color={c2}>╚══════╝</Text>
75
+ <Text color={c3}>╚═╝ ╚═══╝</Text>
76
+ <Text color={c4}> ╚═════╝</Text>
77
+ <Text color={c5}> ╚═════╝ </Text>
78
+ <Text color={c6}>╚═════╝ </Text>
79
+ <Text color={c7}>╚══════╝</Text>
80
+ </Text>
14
81
  </Box>
15
82
  );
16
83
  }
@@ -38,12 +38,15 @@ interface UserMessageProps {
38
38
 
39
39
  export function UserMessage({ text }: UserMessageProps) {
40
40
  const lines = text.trimEnd().split('\n');
41
+ // Subtle gray - ~8% darker than pure white
42
+ const inputBg = '#EFEFEF';
43
+
41
44
  return (
42
45
  <Box flexDirection="column" marginTop={1} marginBottom={0}>
43
46
  {lines.map((line, i) => (
44
- <Box key={i}>
47
+ <Box key={i} backgroundColor={inputBg}>
45
48
  <Text color={colors.brand}>{icons.userPrompt} </Text>
46
- <Text backgroundColor={colors.inputBg} color={colors.text}> {line} </Text>
49
+ <Text>{line}</Text>
47
50
  </Box>
48
51
  ))}
49
52
  </Box>
@@ -88,8 +91,9 @@ export function AssistantMessage({ text, streaming }: AssistantMessageProps) {
88
91
  return (
89
92
  <Box flexDirection="column" marginTop={1} marginBottom={0}>
90
93
  <Box>
91
- <Text color={colors.success}>{icons.assistant} </Text>
92
- <Text>{rendered}</Text>
94
+ <Text color={colors.success}>{icons.assistant}</Text>
95
+ <Text> </Text>
96
+ <Text wrap="wrap">{rendered}</Text>
93
97
  </Box>
94
98
  </Box>
95
99
  );
@@ -100,29 +104,74 @@ interface ToolCallProps {
100
104
  input: Record<string, unknown>;
101
105
  }
102
106
 
107
+ // Format tool input for display
108
+ function formatToolInput(name: string, input: Record<string, unknown>): string {
109
+ switch (name) {
110
+ case 'Read':
111
+ return input.file_path as string || '';
112
+ case 'Write':
113
+ case 'Edit':
114
+ return input.file_path as string || '';
115
+ case 'Glob':
116
+ return input.pattern as string || '';
117
+ case 'Grep':
118
+ return `"${input.pattern}"` + (input.path ? ` in ${input.path}` : '');
119
+ case 'Bash':
120
+ return truncate(input.command as string || '', 50);
121
+ case 'WebFetch':
122
+ return input.url as string || '';
123
+ case 'WebSearch':
124
+ return `"${input.query}"` || '';
125
+ case 'TodoWrite': {
126
+ const todos = input.todos as Array<{ content: string; status: string }> || [];
127
+ return `${todos.length} task${todos.length !== 1 ? 's' : ''}`;
128
+ }
129
+ case 'AskUserQuestion': {
130
+ // Show collapsed JSON preview
131
+ const json = JSON.stringify(input);
132
+ return truncate(json, 60);
133
+ }
134
+ default:
135
+ return truncate(JSON.stringify(input), 40);
136
+ }
137
+ }
138
+
103
139
  export function ToolCall({ name, input }: ToolCallProps) {
104
- // WebFetch: Show "Fetch(url)" instead of JSON (Claude Code style)
105
- if (name === 'WebFetch' && input?.url) {
106
- const shortUrl = truncate(input.url as string, 60);
140
+ // Hide TodoWrite (shown in TodoList component)
141
+ if (name === 'TodoWrite') return null;
142
+
143
+ // Special display for AskUserQuestion (Claude Code style with expand hint)
144
+ if (name === 'AskUserQuestion') {
145
+ const json = JSON.stringify(input);
146
+ const displayJson = truncate(json, 70);
147
+
107
148
  return (
108
- <Box marginTop={1}>
109
- <Text color={colors.tool}>{icons.fetch}</Text>
110
- <Text> Fetch(</Text>
111
- <Text color={colors.info}>{shortUrl}</Text>
112
- <Text>)</Text>
149
+ <Box marginTop={1} flexDirection="column">
150
+ <Box>
151
+ <Text color={colors.tool}>{icons.tool}</Text>
152
+ <Text> </Text>
153
+ <Text bold>{name}</Text>
154
+ <Text color={colors.textMuted}> </Text>
155
+ <Text color={colors.textSecondary}>{displayJson}</Text>
156
+ <Text color={colors.textMuted}> ctrl+o</Text>
157
+ </Box>
113
158
  </Box>
114
159
  );
115
160
  }
116
161
 
117
- // Default: Show tool name with JSON input
118
- const shortInput = truncate(JSON.stringify(input), 50);
162
+ const displayInput = formatToolInput(name, input);
119
163
 
120
164
  return (
121
165
  <Box marginTop={1}>
122
- <Text dimColor>
123
- <Text color={colors.tool}>{icons.tool}</Text> {name}{' '}
124
- <Text color={colors.textMuted}>{shortInput}</Text>
125
- </Text>
166
+ <Text color={colors.tool}>{icons.tool}</Text>
167
+ <Text> </Text>
168
+ <Text bold>{name}</Text>
169
+ {displayInput && (
170
+ <>
171
+ <Text color={colors.textMuted}> </Text>
172
+ <Text color={colors.textSecondary}>{truncate(displayInput, 60)}</Text>
173
+ </>
174
+ )}
126
175
  </Box>
127
176
  );
128
177
  }
@@ -134,31 +183,43 @@ interface PendingToolCallProps {
134
183
  }
135
184
 
136
185
  export function PendingToolCall({ name, input }: PendingToolCallProps) {
137
- // WebFetch: Show "Fetch(url)" with spinner
138
- if (name === 'WebFetch' && input?.url) {
139
- const shortUrl = truncate(input.url as string, 60);
186
+ // Hide TodoWrite (shown in TodoList component)
187
+ if (name === 'TodoWrite') return null;
188
+
189
+ // Special display for AskUserQuestion
190
+ if (name === 'AskUserQuestion') {
191
+ const json = JSON.stringify(input);
192
+ const displayJson = truncate(json, 70);
193
+
140
194
  return (
141
195
  <Box marginTop={1}>
142
196
  <Text color={colors.tool}>
143
197
  <InkSpinner type="dots" />
144
198
  </Text>
145
- <Text> Fetch(</Text>
146
- <Text color={colors.info}>{shortUrl}</Text>
147
- <Text>)</Text>
199
+ <Text> </Text>
200
+ <Text bold>{name}</Text>
201
+ <Text color={colors.textMuted}> </Text>
202
+ <Text color={colors.textSecondary}>{displayJson}</Text>
203
+ <Text color={colors.textMuted}> ctrl+o</Text>
148
204
  </Box>
149
205
  );
150
206
  }
151
207
 
152
- // Default: Show tool name with spinner
153
- const shortInput = truncate(JSON.stringify(input), 50);
208
+ const displayInput = formatToolInput(name, input);
154
209
 
155
210
  return (
156
211
  <Box marginTop={1}>
157
212
  <Text color={colors.tool}>
158
213
  <InkSpinner type="dots" />
159
214
  </Text>
160
- <Text> {name} </Text>
161
- <Text color={colors.textMuted}>{shortInput}</Text>
215
+ <Text> </Text>
216
+ <Text bold>{name}</Text>
217
+ {displayInput && (
218
+ <>
219
+ <Text> </Text>
220
+ <Text color={colors.textSecondary}>{truncate(displayInput, 60)}</Text>
221
+ </>
222
+ )}
162
223
  </Box>
163
224
  );
164
225
  }
@@ -186,23 +247,26 @@ export function ToolResult({ name, success, output, metadata }: ToolResultProps)
186
247
  if (metadata?.subtitle) {
187
248
  return (
188
249
  <Box marginLeft={2}>
189
- <Text dimColor>
190
- <Text>{icons.treeEnd}</Text>{' '}
191
- <Text color={statusColor}>{metadata.subtitle}</Text>
192
- </Text>
250
+ <Text color={colors.textMuted}>{icons.treeEnd}</Text>
251
+ <Text> </Text>
252
+ <Text color={statusColor}>{metadata.subtitle}</Text>
193
253
  </Box>
194
254
  );
195
255
  }
196
256
 
197
- // Default: Show first line of output
198
- const displayOutput = truncate(output.split('\n')[0]?.trim() || '', 50);
257
+ // TodoWrite: Don't show result (TodoList component shows the full list)
258
+ if (name === 'TodoWrite') {
259
+ return null;
260
+ }
261
+
262
+ // Default: Show first line of output with status icon
263
+ const displayOutput = truncate(output.split('\n')[0]?.trim() || '', 60);
199
264
 
200
265
  return (
201
266
  <Box marginLeft={2}>
202
- <Text dimColor>
203
- <Text>{icons.treeEnd}</Text> {name}{' '}
204
- <Text color={statusColor}>{displayOutput}</Text>
205
- </Text>
267
+ <Text color={colors.textMuted}>{icons.treeEnd}</Text>
268
+ <Text> </Text>
269
+ <Text color={statusColor}>{displayOutput || (success ? 'Done' : 'Failed')}</Text>
206
270
  </Box>
207
271
  );
208
272
  }
@@ -238,11 +302,10 @@ interface WelcomeMessageProps {
238
302
  model: string;
239
303
  }
240
304
 
241
- export function WelcomeMessage({ model }: WelcomeMessageProps) {
305
+ export function WelcomeMessage({ model: _model }: WelcomeMessageProps) {
242
306
  return (
243
307
  <Box marginTop={1} marginBottom={0}>
244
- <Text color={colors.textMuted}>Welcome to </Text>
245
- <Text color={colors.brand}>{model}</Text>
308
+ <Text color={colors.textMuted}>? for help · Ctrl+C to exit</Text>
246
309
  </Box>
247
310
  );
248
311
  }