@townco/ui 0.1.6 → 0.1.7

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 (250) hide show
  1. package/README.md +11 -11
  2. package/dist/core/hooks/use-chat-input.d.ts +17 -17
  3. package/dist/core/hooks/use-chat-input.js +55 -64
  4. package/dist/core/hooks/use-chat-messages.d.ts +11 -11
  5. package/dist/core/hooks/use-chat-messages.js +114 -121
  6. package/dist/core/hooks/use-chat-session.d.ts +5 -5
  7. package/dist/core/hooks/use-chat-session.js +80 -78
  8. package/dist/core/index.d.ts +1 -1
  9. package/dist/core/index.js +1 -1
  10. package/dist/core/schemas/chat.d.ts +56 -83
  11. package/dist/core/schemas/chat.js +25 -27
  12. package/dist/core/store/chat-store.d.ts +22 -28
  13. package/dist/core/store/chat-store.js +50 -59
  14. package/dist/gui/components/Button.d.ts +7 -23
  15. package/dist/gui/components/Button.js +27 -40
  16. package/dist/gui/components/Card.d.ts +7 -26
  17. package/dist/gui/components/Card.js +8 -54
  18. package/dist/gui/components/ChatInput.d.ts +36 -58
  19. package/dist/gui/components/ChatInput.js +121 -191
  20. package/dist/gui/components/ChatSecondaryPanel.d.ts +11 -14
  21. package/dist/gui/components/ChatSecondaryPanel.js +38 -115
  22. package/dist/gui/components/ChatStatus.d.ts +2 -4
  23. package/dist/gui/components/ChatStatus.js +34 -45
  24. package/dist/gui/components/Conversation.d.ts +14 -17
  25. package/dist/gui/components/Conversation.js +83 -143
  26. package/dist/gui/components/Dialog.d.ts +11 -57
  27. package/dist/gui/components/Dialog.js +8 -84
  28. package/dist/gui/components/HeightTransition.d.ts +7 -12
  29. package/dist/gui/components/HeightTransition.js +77 -88
  30. package/dist/gui/components/Input.d.ts +6 -13
  31. package/dist/gui/components/Input.js +16 -27
  32. package/dist/gui/components/Label.d.ts +1 -7
  33. package/dist/gui/components/Label.js +2 -12
  34. package/dist/gui/components/MarkdownRenderer.d.ts +4 -6
  35. package/dist/gui/components/MarkdownRenderer.js +81 -178
  36. package/dist/gui/components/Message.d.ts +18 -25
  37. package/dist/gui/components/Message.js +23 -44
  38. package/dist/gui/components/MessageContent.d.ts +22 -29
  39. package/dist/gui/components/MessageContent.js +85 -157
  40. package/dist/gui/components/Reasoning.d.ts +24 -30
  41. package/dist/gui/components/Reasoning.js +60 -187
  42. package/dist/gui/components/Response.d.ts +9 -11
  43. package/dist/gui/components/Response.js +90 -229
  44. package/dist/gui/components/Select.d.ts +10 -69
  45. package/dist/gui/components/Select.js +12 -118
  46. package/dist/gui/components/Tabs.d.ts +4 -24
  47. package/dist/gui/components/Tabs.js +4 -32
  48. package/dist/gui/components/Task.d.ts +24 -28
  49. package/dist/gui/components/Task.js +31 -164
  50. package/dist/gui/components/Textarea.d.ts +7 -15
  51. package/dist/gui/components/Textarea.js +46 -63
  52. package/dist/gui/components/ThinkingBlock.d.ts +10 -20
  53. package/dist/gui/components/ThinkingBlock.js +35 -134
  54. package/dist/gui/components/TodoList.d.ts +10 -12
  55. package/dist/gui/components/TodoList.js +7 -22
  56. package/dist/gui/components/TodoListItem.d.ts +6 -9
  57. package/dist/gui/components/TodoListItem.js +4 -18
  58. package/dist/gui/components/index.d.ts +8 -59
  59. package/dist/gui/components/index.js +8 -42
  60. package/dist/gui/lib/utils.js +1 -1
  61. package/dist/index.d.ts +1 -1
  62. package/dist/index.js +1 -1
  63. package/dist/index.test.js +1 -0
  64. package/dist/sdk/client/acp-client.d.ts +76 -88
  65. package/dist/sdk/client/acp-client.js +217 -215
  66. package/dist/sdk/index.d.ts +1 -1
  67. package/dist/sdk/index.js +1 -1
  68. package/dist/sdk/schemas/agent.d.ts +64 -111
  69. package/dist/sdk/schemas/agent.js +24 -24
  70. package/dist/sdk/schemas/message.d.ts +147 -245
  71. package/dist/sdk/schemas/message.js +40 -40
  72. package/dist/sdk/schemas/session.d.ts +135 -219
  73. package/dist/sdk/schemas/session.js +27 -27
  74. package/dist/sdk/transports/http.d.ts +55 -55
  75. package/dist/sdk/transports/http.js +469 -472
  76. package/dist/sdk/transports/stdio.d.ts +20 -20
  77. package/dist/sdk/transports/stdio.js +286 -289
  78. package/dist/sdk/transports/types.d.ts +42 -42
  79. package/dist/sdk/transports/websocket.d.ts +12 -12
  80. package/dist/sdk/transports/websocket.js +46 -52
  81. package/dist/tui/components/ChatView.d.ts +2 -4
  82. package/dist/tui/components/ChatView.js +18 -51
  83. package/dist/tui/components/GameOfLife.js +35 -64
  84. package/dist/tui/components/InputBox.d.ts +11 -18
  85. package/dist/tui/components/InputBox.js +10 -70
  86. package/dist/tui/components/MessageList.d.ts +2 -4
  87. package/dist/tui/components/MessageList.js +10 -37
  88. package/dist/tui/components/MultiSelect.d.ts +10 -15
  89. package/dist/tui/components/MultiSelect.js +73 -116
  90. package/dist/tui/components/ReadlineInput.d.ts +6 -12
  91. package/dist/tui/components/ReadlineInput.js +237 -252
  92. package/dist/tui/components/SingleSelect.d.ts +9 -15
  93. package/dist/tui/components/SingleSelect.js +43 -84
  94. package/dist/tui/components/StatusBar.d.ts +6 -11
  95. package/dist/tui/components/StatusBar.js +67 -102
  96. package/dist/tui/index.d.ts +1 -1
  97. package/dist/tui/index.js +1 -1
  98. package/package.json +2 -2
  99. package/dist/core/hooks/index.d.ts.map +0 -1
  100. package/dist/core/hooks/index.js.map +0 -1
  101. package/dist/core/hooks/use-chat-input.d.ts.map +0 -1
  102. package/dist/core/hooks/use-chat-input.js.map +0 -1
  103. package/dist/core/hooks/use-chat-messages.d.ts.map +0 -1
  104. package/dist/core/hooks/use-chat-messages.js.map +0 -1
  105. package/dist/core/hooks/use-chat-session.d.ts.map +0 -1
  106. package/dist/core/hooks/use-chat-session.js.map +0 -1
  107. package/dist/core/hooks/use-media-query.d.ts +0 -39
  108. package/dist/core/hooks/use-media-query.js +0 -80
  109. package/dist/core/index.d.ts.map +0 -1
  110. package/dist/core/index.js.map +0 -1
  111. package/dist/core/schemas/chat.d.ts.map +0 -1
  112. package/dist/core/schemas/chat.js.map +0 -1
  113. package/dist/core/schemas/index.d.ts.map +0 -1
  114. package/dist/core/schemas/index.js.map +0 -1
  115. package/dist/core/store/chat-store.d.ts.map +0 -1
  116. package/dist/core/store/chat-store.js.map +0 -1
  117. package/dist/gui/components/Button.d.ts.map +0 -1
  118. package/dist/gui/components/Button.js.map +0 -1
  119. package/dist/gui/components/Card.d.ts.map +0 -1
  120. package/dist/gui/components/Card.js.map +0 -1
  121. package/dist/gui/components/ChatHeader.d.ts +0 -65
  122. package/dist/gui/components/ChatHeader.js +0 -189
  123. package/dist/gui/components/ChatInput.d.ts.map +0 -1
  124. package/dist/gui/components/ChatInput.js.map +0 -1
  125. package/dist/gui/components/ChatInterface.d.ts +0 -12
  126. package/dist/gui/components/ChatInterface.d.ts.map +0 -1
  127. package/dist/gui/components/ChatInterface.js +0 -204
  128. package/dist/gui/components/ChatInterface.js.map +0 -1
  129. package/dist/gui/components/ChatLayout.d.ts +0 -82
  130. package/dist/gui/components/ChatLayout.js +0 -232
  131. package/dist/gui/components/ChatPanelTabContent.d.ts +0 -27
  132. package/dist/gui/components/ChatPanelTabContent.js +0 -93
  133. package/dist/gui/components/ChatPreview.d.ts +0 -12
  134. package/dist/gui/components/ChatPreview.d.ts.map +0 -1
  135. package/dist/gui/components/ChatPreview.js +0 -214
  136. package/dist/gui/components/ChatPreview.js.map +0 -1
  137. package/dist/gui/components/ChatSecondaryPanel.d.ts.map +0 -1
  138. package/dist/gui/components/ChatSecondaryPanel.js.map +0 -1
  139. package/dist/gui/components/ChatSidebar.d.ts +0 -27
  140. package/dist/gui/components/ChatSidebar.js +0 -57
  141. package/dist/gui/components/ChatStatus.d.ts.map +0 -1
  142. package/dist/gui/components/ChatStatus.js.map +0 -1
  143. package/dist/gui/components/ChatView.d.ts +0 -8
  144. package/dist/gui/components/ChatView.d.ts.map +0 -1
  145. package/dist/gui/components/ChatView.js +0 -42
  146. package/dist/gui/components/ChatView.js.map +0 -1
  147. package/dist/gui/components/ConfigPanel.d.ts +0 -20
  148. package/dist/gui/components/ConfigPanel.d.ts.map +0 -1
  149. package/dist/gui/components/ConfigPanel.js +0 -225
  150. package/dist/gui/components/ConfigPanel.js.map +0 -1
  151. package/dist/gui/components/Conversation.d.ts.map +0 -1
  152. package/dist/gui/components/Conversation.js.map +0 -1
  153. package/dist/gui/components/Dialog.d.ts.map +0 -1
  154. package/dist/gui/components/Dialog.js.map +0 -1
  155. package/dist/gui/components/DropdownMenu.d.ts +0 -108
  156. package/dist/gui/components/DropdownMenu.js +0 -215
  157. package/dist/gui/components/HeightTransition.d.ts.map +0 -1
  158. package/dist/gui/components/HeightTransition.js.map +0 -1
  159. package/dist/gui/components/Input.d.ts.map +0 -1
  160. package/dist/gui/components/Input.js.map +0 -1
  161. package/dist/gui/components/InputBox.d.ts +0 -21
  162. package/dist/gui/components/InputBox.d.ts.map +0 -1
  163. package/dist/gui/components/InputBox.js +0 -90
  164. package/dist/gui/components/InputBox.js.map +0 -1
  165. package/dist/gui/components/Label.d.ts.map +0 -1
  166. package/dist/gui/components/Label.js.map +0 -1
  167. package/dist/gui/components/MarkdownRenderer.d.ts.map +0 -1
  168. package/dist/gui/components/MarkdownRenderer.js.map +0 -1
  169. package/dist/gui/components/Message.d.ts.map +0 -1
  170. package/dist/gui/components/Message.js.map +0 -1
  171. package/dist/gui/components/MessageContent.d.ts.map +0 -1
  172. package/dist/gui/components/MessageContent.js.map +0 -1
  173. package/dist/gui/components/MessageList.d.ts.map +0 -1
  174. package/dist/gui/components/MessageList.js.map +0 -1
  175. package/dist/gui/components/PlaygroundLayout.d.ts +0 -14
  176. package/dist/gui/components/PlaygroundLayout.d.ts.map +0 -1
  177. package/dist/gui/components/PlaygroundLayout.js +0 -49
  178. package/dist/gui/components/PlaygroundLayout.js.map +0 -1
  179. package/dist/gui/components/Reasoning.d.ts.map +0 -1
  180. package/dist/gui/components/Reasoning.js.map +0 -1
  181. package/dist/gui/components/Response.d.ts.map +0 -1
  182. package/dist/gui/components/Response.js.map +0 -1
  183. package/dist/gui/components/Select.d.ts.map +0 -1
  184. package/dist/gui/components/Select.js.map +0 -1
  185. package/dist/gui/components/Sonner.d.ts +0 -7
  186. package/dist/gui/components/Sonner.js +0 -34
  187. package/dist/gui/components/StatusBar.d.ts +0 -12
  188. package/dist/gui/components/StatusBar.d.ts.map +0 -1
  189. package/dist/gui/components/StatusBar.js +0 -58
  190. package/dist/gui/components/StatusBar.js.map +0 -1
  191. package/dist/gui/components/Tabs.d.ts.map +0 -1
  192. package/dist/gui/components/Tabs.js.map +0 -1
  193. package/dist/gui/components/Task.d.ts.map +0 -1
  194. package/dist/gui/components/Task.js.map +0 -1
  195. package/dist/gui/components/Textarea.d.ts.map +0 -1
  196. package/dist/gui/components/Textarea.js.map +0 -1
  197. package/dist/gui/components/ThinkingBlock.d.ts.map +0 -1
  198. package/dist/gui/components/ThinkingBlock.js.map +0 -1
  199. package/dist/gui/components/TodoList.d.ts.map +0 -1
  200. package/dist/gui/components/TodoList.js.map +0 -1
  201. package/dist/gui/components/TodoListItem.d.ts.map +0 -1
  202. package/dist/gui/components/TodoListItem.js.map +0 -1
  203. package/dist/gui/components/index.d.ts.map +0 -1
  204. package/dist/gui/components/index.js.map +0 -1
  205. package/dist/gui/index.d.ts.map +0 -1
  206. package/dist/gui/index.js.map +0 -1
  207. package/dist/gui/lib/utils.d.ts.map +0 -1
  208. package/dist/gui/lib/utils.js.map +0 -1
  209. package/dist/index.d.ts.map +0 -1
  210. package/dist/index.js.map +0 -1
  211. package/dist/sdk/client/acp-client.d.ts.map +0 -1
  212. package/dist/sdk/client/acp-client.js.map +0 -1
  213. package/dist/sdk/client/index.d.ts.map +0 -1
  214. package/dist/sdk/client/index.js.map +0 -1
  215. package/dist/sdk/index.d.ts.map +0 -1
  216. package/dist/sdk/index.js.map +0 -1
  217. package/dist/sdk/schemas/agent.d.ts.map +0 -1
  218. package/dist/sdk/schemas/agent.js.map +0 -1
  219. package/dist/sdk/schemas/index.d.ts.map +0 -1
  220. package/dist/sdk/schemas/index.js.map +0 -1
  221. package/dist/sdk/schemas/message.d.ts.map +0 -1
  222. package/dist/sdk/schemas/message.js.map +0 -1
  223. package/dist/sdk/schemas/session.d.ts.map +0 -1
  224. package/dist/sdk/schemas/session.js.map +0 -1
  225. package/dist/sdk/transports/http.d.ts.map +0 -1
  226. package/dist/sdk/transports/http.js.map +0 -1
  227. package/dist/sdk/transports/index.d.ts.map +0 -1
  228. package/dist/sdk/transports/index.js.map +0 -1
  229. package/dist/sdk/transports/stdio.d.ts.map +0 -1
  230. package/dist/sdk/transports/stdio.js.map +0 -1
  231. package/dist/sdk/transports/types.d.ts.map +0 -1
  232. package/dist/sdk/transports/types.js.map +0 -1
  233. package/dist/sdk/transports/websocket.d.ts.map +0 -1
  234. package/dist/sdk/transports/websocket.js.map +0 -1
  235. package/dist/tui/components/ChatView.d.ts.map +0 -1
  236. package/dist/tui/components/ChatView.js.map +0 -1
  237. package/dist/tui/components/GameOfLife.d.ts.map +0 -1
  238. package/dist/tui/components/GameOfLife.js.map +0 -1
  239. package/dist/tui/components/InputBox.d.ts.map +0 -1
  240. package/dist/tui/components/InputBox.js.map +0 -1
  241. package/dist/tui/components/MessageList.d.ts.map +0 -1
  242. package/dist/tui/components/MessageList.js.map +0 -1
  243. package/dist/tui/components/ReadlineInput.d.ts.map +0 -1
  244. package/dist/tui/components/ReadlineInput.js.map +0 -1
  245. package/dist/tui/components/StatusBar.d.ts.map +0 -1
  246. package/dist/tui/components/StatusBar.js.map +0 -1
  247. package/dist/tui/components/index.d.ts.map +0 -1
  248. package/dist/tui/components/index.js.map +0 -1
  249. package/dist/tui/index.d.ts.map +0 -1
  250. package/dist/tui/index.js.map +0 -1
@@ -4,36 +4,32 @@ import * as React from "react";
4
4
  * Enhanced todo/task display with collapsible details and file references
5
5
  */
6
6
  export interface TaskItem {
7
- id: string;
8
- text: string;
9
- status: "pending" | "in_progress" | "completed";
10
- /** Optional file references */
11
- files?: string[];
12
- /** Optional additional details */
13
- details?: string;
7
+ id: string;
8
+ text: string;
9
+ status: "pending" | "in_progress" | "completed";
10
+ /** Optional file references */
11
+ files?: string[];
12
+ /** Optional additional details */
13
+ details?: string;
14
14
  }
15
15
  export interface TaskProps extends React.HTMLAttributes<HTMLDivElement> {
16
- /** Task item data */
17
- task: TaskItem;
18
- /** Show collapsible details */
19
- collapsible?: boolean;
20
- /** Default expanded state */
21
- defaultExpanded?: boolean;
22
- /** Callback when task is clicked */
23
- onTaskClick?: (task: TaskItem) => void;
16
+ /** Task item data */
17
+ task: TaskItem;
18
+ /** Show collapsible details */
19
+ collapsible?: boolean;
20
+ /** Default expanded state */
21
+ defaultExpanded?: boolean;
22
+ /** Callback when task is clicked */
23
+ onTaskClick?: (task: TaskItem) => void;
24
24
  }
25
- export declare const Task: React.ForwardRefExoticComponent<
26
- TaskProps & React.RefAttributes<HTMLDivElement>
27
- >;
25
+ export declare const Task: React.ForwardRefExoticComponent<TaskProps & React.RefAttributes<HTMLDivElement>>;
28
26
  export interface TaskListProps extends React.HTMLAttributes<HTMLDivElement> {
29
- tasks: TaskItem[];
30
- /** Show collapsible details */
31
- collapsible?: boolean;
32
- /** Callback when task is clicked */
33
- onTaskClick?: (task: TaskItem) => void;
34
- /** Empty state message */
35
- emptyMessage?: string;
27
+ tasks: TaskItem[];
28
+ /** Show collapsible details */
29
+ collapsible?: boolean;
30
+ /** Callback when task is clicked */
31
+ onTaskClick?: (task: TaskItem) => void;
32
+ /** Empty state message */
33
+ emptyMessage?: string;
36
34
  }
37
- export declare const TaskList: React.ForwardRefExoticComponent<
38
- TaskListProps & React.RefAttributes<HTMLDivElement>
39
- >;
35
+ export declare const TaskList: React.ForwardRefExoticComponent<TaskListProps & React.RefAttributes<HTMLDivElement>>;
@@ -1,170 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
2
  import { CheckCircle2, ChevronDown, Circle, Loader2 } from "lucide-react";
2
3
  import * as React from "react";
3
4
  import { useState } from "react";
4
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  import { cn } from "../lib/utils.js";
6
- export const Task = React.forwardRef(
7
- (
8
- {
9
- task,
10
- collapsible = true,
11
- defaultExpanded = false,
12
- onTaskClick,
13
- className,
14
- ...props
15
- },
16
- ref,
17
- ) => {
18
- const [isExpanded, setIsExpanded] = useState(defaultExpanded);
19
- const hasDetails = !!(
20
- task.details ||
21
- (task.files && task.files.length > 0)
22
- );
23
- const StatusIcon = {
24
- pending: Circle,
25
- in_progress: Loader2,
26
- completed: CheckCircle2,
27
- }[task.status];
28
- const getStatusColor = () => {
29
- switch (task.status) {
30
- case "completed":
31
- return "text-green-500";
32
- case "in_progress":
33
- return "text-primary";
34
- default:
35
- return "text-foreground opacity-40";
36
- }
37
- };
38
- const handleClick = () => {
39
- if (hasDetails && collapsible) {
40
- setIsExpanded(!isExpanded);
41
- }
42
- onTaskClick?.(task);
43
- };
44
- return _jsxs("div", {
45
- ref: ref,
46
- className: cn(
47
- "rounded-lg border border-border bg-card transition-all",
48
- "hover:shadow-sm hover:border-border/80",
49
- className,
50
- ),
51
- ...props,
52
- children: [
53
- _jsxs("button", {
54
- type: "button",
55
- onClick: handleClick,
56
- className: cn(
57
- "w-full flex items-center gap-3 px-3 py-2.5 text-left",
58
- hasDetails && collapsible && "cursor-pointer",
59
- ),
60
- disabled: !hasDetails && !collapsible,
61
- children: [
62
- _jsx(StatusIcon, {
63
- className: cn(
64
- "w-4 h-4 shrink-0",
65
- getStatusColor(),
66
- task.status === "in_progress" && "animate-spin",
67
- ),
68
- }),
69
- _jsx("span", {
70
- className: cn(
71
- "flex-1 text-sm font-[var(--font-family)]",
72
- task.status === "completed" && "line-through opacity-60",
73
- task.status === "in_progress" && "font-medium",
74
- ),
75
- children: task.text,
76
- }),
77
- hasDetails &&
78
- collapsible &&
79
- _jsx(ChevronDown, {
80
- className: cn(
81
- "w-4 h-4 text-foreground opacity-50 transition-transform duration-200 shrink-0",
82
- isExpanded && "rotate-180",
83
- ),
84
- "aria-hidden": "true",
85
- }),
86
- ],
87
- }),
88
- hasDetails &&
89
- isExpanded &&
90
- _jsxs("div", {
91
- className:
92
- "px-3 pb-3 pt-1 border-t border-border/50 animate-fadeIn",
93
- children: [
94
- task.details &&
95
- _jsx("p", {
96
- className:
97
- "text-sm text-foreground opacity-80 leading-relaxed mb-2",
98
- children: task.details,
99
- }),
100
- task.files &&
101
- task.files.length > 0 &&
102
- _jsxs("div", {
103
- className: "space-y-1",
104
- children: [
105
- _jsx("span", {
106
- className:
107
- "text-xs font-medium text-foreground opacity-60 uppercase tracking-wide",
108
- children: "Files:",
109
- }),
110
- _jsx("div", {
111
- className: "space-y-1",
112
- children: task.files.map((file) =>
113
- _jsx(
114
- "div",
115
- {
116
- className:
117
- "text-xs font-mono text-foreground opacity-70 bg-background px-2 py-1 rounded border border-border/50",
118
- children: file,
119
- },
120
- file,
121
- ),
122
- ),
123
- }),
124
- ],
125
- }),
126
- ],
127
- }),
128
- ],
129
- });
130
- },
131
- );
6
+ export const Task = React.forwardRef(({ task, collapsible = true, defaultExpanded = false, onTaskClick, className, ...props }, ref) => {
7
+ const [isExpanded, setIsExpanded] = useState(defaultExpanded);
8
+ const hasDetails = !!(task.details ||
9
+ (task.files && task.files.length > 0));
10
+ const StatusIcon = {
11
+ pending: Circle,
12
+ in_progress: Loader2,
13
+ completed: CheckCircle2,
14
+ }[task.status];
15
+ const getStatusColor = () => {
16
+ switch (task.status) {
17
+ case "completed":
18
+ return "text-green-500";
19
+ case "in_progress":
20
+ return "text-primary";
21
+ default:
22
+ return "text-foreground opacity-40";
23
+ }
24
+ };
25
+ const handleClick = () => {
26
+ if (hasDetails && collapsible) {
27
+ setIsExpanded(!isExpanded);
28
+ }
29
+ onTaskClick?.(task);
30
+ };
31
+ return (_jsxs("div", { ref: ref, className: cn("rounded-lg border border-border bg-card transition-all", "hover:shadow-sm hover:border-border/80", className), ...props, children: [_jsxs("button", { type: "button", onClick: handleClick, className: cn("w-full flex items-center gap-3 px-3 py-2.5 text-left", hasDetails && collapsible && "cursor-pointer"), disabled: !hasDetails && !collapsible, children: [_jsx(StatusIcon, { className: cn("w-4 h-4 shrink-0", getStatusColor(), task.status === "in_progress" && "animate-spin") }), _jsx("span", { className: cn("flex-1 text-sm font-[var(--font-family)]", task.status === "completed" && "line-through opacity-60", task.status === "in_progress" && "font-medium"), children: task.text }), hasDetails && collapsible && (_jsx(ChevronDown, { className: cn("w-4 h-4 text-foreground opacity-50 transition-transform duration-200 shrink-0", isExpanded && "rotate-180"), "aria-hidden": "true" }))] }), hasDetails && isExpanded && (_jsxs("div", { className: "px-3 pb-3 pt-1 border-t border-border/50 animate-fadeIn", children: [task.details && (_jsx("p", { className: "text-sm text-foreground opacity-80 leading-relaxed mb-2", children: task.details })), task.files && task.files.length > 0 && (_jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "text-xs font-medium text-foreground opacity-60 uppercase tracking-wide", children: "Files:" }), _jsx("div", { className: "space-y-1", children: task.files.map((file) => (_jsx("div", { className: "text-xs font-mono text-foreground opacity-70 bg-background px-2 py-1 rounded border border-border/50", children: file }, file))) })] }))] }))] }));
32
+ });
132
33
  Task.displayName = "Task";
133
- export const TaskList = React.forwardRef(
134
- (
135
- {
136
- tasks,
137
- collapsible = true,
138
- onTaskClick,
139
- emptyMessage = "No tasks yet.",
140
- className,
141
- ...props
142
- },
143
- ref,
144
- ) => {
145
- return _jsx("div", {
146
- ref: ref,
147
- className: cn("space-y-2 max-h-96 overflow-y-auto", className),
148
- ...props,
149
- children:
150
- tasks.length === 0
151
- ? _jsx("p", {
152
- className:
153
- "text-sm text-foreground opacity-60 italic py-4 text-center",
154
- children: emptyMessage,
155
- })
156
- : tasks.map((task) =>
157
- _jsx(
158
- Task,
159
- {
160
- task: task,
161
- collapsible: collapsible,
162
- ...(onTaskClick ? { onTaskClick } : {}),
163
- },
164
- task.id,
165
- ),
166
- ),
167
- });
168
- },
169
- );
34
+ export const TaskList = React.forwardRef(({ tasks, collapsible = true, onTaskClick, emptyMessage = "No tasks yet.", className, ...props }, ref) => {
35
+ return (_jsx("div", { ref: ref, className: cn("space-y-2 max-h-96 overflow-y-auto", className), ...props, children: tasks.length === 0 ? (_jsx("p", { className: "text-sm text-foreground opacity-60 italic py-4 text-center", children: emptyMessage })) : (tasks.map((task) => (_jsx(Task, { task: task, collapsible: collapsible, ...(onTaskClick ? { onTaskClick } : {}) }, task.id)))) }));
36
+ });
170
37
  TaskList.displayName = "TaskList";
@@ -1,19 +1,11 @@
1
1
  import { type VariantProps } from "class-variance-authority";
2
2
  import * as React from "react";
3
- declare const textareaVariants: (
4
- props?:
5
- | ({
6
- variant?: "default" | "error" | "success" | null | undefined;
7
- } & import("class-variance-authority/types").ClassProp)
8
- | undefined,
9
- ) => string;
10
- export interface TextareaProps
11
- extends React.TextareaHTMLAttributes<HTMLTextAreaElement>,
12
- VariantProps<typeof textareaVariants> {
13
- autoResize?: boolean;
14
- maxHeight?: number;
3
+ declare const textareaVariants: (props?: ({
4
+ variant?: "success" | "default" | "error" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement>, VariantProps<typeof textareaVariants> {
7
+ autoResize?: boolean;
8
+ maxHeight?: number;
15
9
  }
16
- declare const Textarea: React.ForwardRefExoticComponent<
17
- TextareaProps & React.RefAttributes<HTMLTextAreaElement>
18
- >;
10
+ declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
19
11
  export { Textarea, textareaVariants };
@@ -1,68 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  import { cva } from "class-variance-authority";
2
3
  import * as React from "react";
3
- import { jsx as _jsx } from "react/jsx-runtime";
4
4
  import { cn } from "../lib/utils.js";
5
-
6
- const textareaVariants = cva(
7
- "flex min-h-[80px] w-full rounded-md border bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 resize-none",
8
- {
9
- variants: {
10
- variant: {
11
- default: "border-input focus-visible:ring-ring",
12
- error: "border-destructive focus-visible:ring-destructive",
13
- success: "border-green-500 focus-visible:ring-green-500",
14
- },
15
- },
16
- defaultVariants: {
17
- variant: "default",
18
- },
19
- },
20
- );
21
- const Textarea = React.forwardRef(
22
- (
23
- { className, autoResize = false, maxHeight = 200, variant, ...props },
24
- ref,
25
- ) => {
26
- const textareaRef = React.useRef(null);
27
- const handleRef = React.useCallback(
28
- (node) => {
29
- textareaRef.current = node;
30
- if (typeof ref === "function") {
31
- ref(node);
32
- } else if (ref) {
33
- ref.current = node;
34
- }
35
- },
36
- [ref],
37
- );
38
- const adjustHeight = React.useCallback(() => {
39
- const textarea = textareaRef.current;
40
- if (!textarea || !autoResize) return;
41
- // Reset height to auto to get the correct scrollHeight
42
- textarea.style.height = "auto";
43
- // Set new height based on content, respecting maxHeight
44
- const newHeight = Math.min(textarea.scrollHeight, maxHeight);
45
- textarea.style.height = `${newHeight}px`;
46
- // Enable scrollbar if content exceeds maxHeight
47
- if (textarea.scrollHeight > maxHeight) {
48
- textarea.style.overflowY = "auto";
49
- } else {
50
- textarea.style.overflowY = "hidden";
51
- }
52
- }, [autoResize, maxHeight]);
53
- React.useEffect(() => {
54
- adjustHeight();
55
- }, [adjustHeight]);
56
- return _jsx("textarea", {
57
- className: cn(
58
- textareaVariants({ variant }),
59
- autoResize && "overflow-y-hidden",
60
- className,
61
- ),
62
- ref: handleRef,
63
- ...props,
64
- });
65
- },
66
- );
5
+ const textareaVariants = cva("flex min-h-[80px] w-full rounded-md border bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 resize-none", {
6
+ variants: {
7
+ variant: {
8
+ default: "border-input focus-visible:ring-ring",
9
+ error: "border-destructive focus-visible:ring-destructive",
10
+ success: "border-green-500 focus-visible:ring-green-500",
11
+ },
12
+ },
13
+ defaultVariants: {
14
+ variant: "default",
15
+ },
16
+ });
17
+ const Textarea = React.forwardRef(({ className, autoResize = false, maxHeight = 200, variant, ...props }, ref) => {
18
+ const textareaRef = React.useRef(null);
19
+ const handleRef = React.useCallback((node) => {
20
+ textareaRef.current = node;
21
+ if (typeof ref === "function") {
22
+ ref(node);
23
+ }
24
+ else if (ref) {
25
+ ref.current = node;
26
+ }
27
+ }, [ref]);
28
+ const adjustHeight = React.useCallback(() => {
29
+ const textarea = textareaRef.current;
30
+ if (!textarea || !autoResize)
31
+ return;
32
+ // Reset height to auto to get the correct scrollHeight
33
+ textarea.style.height = "auto";
34
+ // Set new height based on content, respecting maxHeight
35
+ const newHeight = Math.min(textarea.scrollHeight, maxHeight);
36
+ textarea.style.height = `${newHeight}px`;
37
+ // Enable scrollbar if content exceeds maxHeight
38
+ if (textarea.scrollHeight > maxHeight) {
39
+ textarea.style.overflowY = "auto";
40
+ }
41
+ else {
42
+ textarea.style.overflowY = "hidden";
43
+ }
44
+ }, [autoResize, maxHeight]);
45
+ React.useEffect(() => {
46
+ adjustHeight();
47
+ }, [adjustHeight]);
48
+ return (_jsx("textarea", { className: cn(textareaVariants({ variant }), autoResize && "overflow-y-hidden", className), ref: handleRef, ...props }));
49
+ });
67
50
  Textarea.displayName = "Textarea";
68
51
  export { Textarea, textareaVariants };
@@ -1,22 +1,12 @@
1
1
  import { type VariantProps } from "class-variance-authority";
2
- declare const thinkingBlockVariants: (
3
- props?:
4
- | ({
5
- variant?: "default" | "subtle" | "prominent" | null | undefined;
6
- } & import("class-variance-authority/types").ClassProp)
7
- | undefined,
8
- ) => string;
9
- export interface ThinkingBlockProps
10
- extends VariantProps<typeof thinkingBlockVariants> {
11
- thinking?: string;
12
- isStreaming?: boolean;
13
- displayMode?: "collapsible" | "inline";
14
- className?: string;
2
+ declare const thinkingBlockVariants: (props?: ({
3
+ variant?: "default" | "subtle" | "prominent" | null | undefined;
4
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
5
+ export interface ThinkingBlockProps extends VariantProps<typeof thinkingBlockVariants> {
6
+ thinking?: string;
7
+ isStreaming?: boolean;
8
+ displayMode?: "collapsible" | "inline";
9
+ className?: string;
15
10
  }
16
- export declare function ThinkingBlock({
17
- thinking,
18
- isStreaming,
19
- displayMode,
20
- variant,
21
- className,
22
- }: ThinkingBlockProps): import("react/jsx-runtime").JSX.Element | null;
11
+ export declare function ThinkingBlock({ thinking, isStreaming, displayMode, variant, className, }: ThinkingBlockProps): import("react/jsx-runtime").JSX.Element | null;
12
+ export {};
@@ -1,139 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
2
  import { cva } from "class-variance-authority";
2
3
  import { ChevronDown } from "lucide-react";
3
4
  import { useState } from "react";
4
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  import { cn } from "../lib/utils.js";
6
-
7
- const thinkingBlockVariants = cva(
8
- "mb-3 p-3 rounded-lg bg-card border border-border",
9
- {
10
- variants: {
11
- variant: {
12
- default: "opacity-70",
13
- subtle: "opacity-50",
14
- prominent: "opacity-90",
15
- },
16
- },
17
- defaultVariants: {
18
- variant: "default",
19
- },
20
- },
21
- );
22
- const thinkingIconVariants = cva(
23
- "w-4 h-4 text-foreground opacity-60 transition-transform",
24
- {
25
- variants: {
26
- expanded: {
27
- true: "rotate-180",
28
- false: "",
29
- },
30
- },
31
- defaultVariants: {
32
- expanded: false,
33
- },
34
- },
35
- );
36
- export function ThinkingBlock({
37
- thinking,
38
- isStreaming,
39
- displayMode = "collapsible",
40
- variant,
41
- className,
42
- }) {
43
- const [isExpanded, setIsExpanded] = useState(false);
44
- if (!thinking && !isStreaming) {
45
- return null;
46
- }
47
- // Inline mode - always visible
48
- if (displayMode === "inline") {
49
- return _jsxs("div", {
50
- className: cn(thinkingBlockVariants({ variant }), className),
51
- children: [
52
- _jsxs("div", {
53
- className: "flex items-start gap-2",
54
- children: [
55
- _jsx("span", {
56
- className:
57
- "text-xs font-medium text-foreground opacity-60 uppercase tracking-wide",
58
- children: "Thinking",
59
- }),
60
- isStreaming &&
61
- _jsx("span", {
62
- className:
63
- "inline-block w-2 h-2 bg-primary rounded-full animate-pulse",
64
- }),
65
- ],
66
- }),
67
- _jsxs("div", {
68
- className:
69
- "mt-2 text-sm italic text-foreground opacity-80 leading-relaxed whitespace-pre-wrap",
70
- children: [
71
- thinking,
72
- isStreaming &&
73
- thinking &&
74
- _jsx("span", {
75
- className: "inline-block animate-typing",
76
- children: "...",
77
- }),
78
- ],
79
- }),
80
- ],
81
- });
82
- }
83
- // Collapsible mode
84
- return _jsxs("div", {
85
- className: cn("mb-3", className),
86
- children: [
87
- _jsxs("button", {
88
- type: "button",
89
- onClick: () => setIsExpanded(!isExpanded),
90
- className:
91
- "w-full flex items-center justify-between p-2 rounded-lg bg-card border border-border hover:bg-card transition-colors text-left",
92
- children: [
93
- _jsxs("div", {
94
- className: "flex items-center gap-2",
95
- children: [
96
- _jsx("span", {
97
- className:
98
- "text-xs font-medium text-foreground opacity-60 uppercase tracking-wide",
99
- children: "Thinking",
100
- }),
101
- isStreaming &&
102
- _jsx("span", {
103
- className:
104
- "inline-block w-2 h-2 bg-primary rounded-full animate-pulse",
105
- }),
106
- !isExpanded &&
107
- thinking &&
108
- _jsxs("span", {
109
- className:
110
- "text-xs text-foreground opacity-50 truncate max-w-[200px]",
111
- children: [thinking.substring(0, 50), "..."],
112
- }),
113
- ],
114
- }),
115
- _jsx(ChevronDown, {
116
- className: thinkingIconVariants({ expanded: isExpanded }),
117
- }),
118
- ],
119
- }),
120
- isExpanded &&
121
- _jsx("div", {
122
- className: cn(thinkingBlockVariants({ variant }), "mt-2"),
123
- children: _jsxs("div", {
124
- className:
125
- "text-sm italic text-foreground opacity-80 leading-relaxed whitespace-pre-wrap",
126
- children: [
127
- thinking,
128
- isStreaming &&
129
- thinking &&
130
- _jsx("span", {
131
- className: "inline-block animate-typing",
132
- children: "...",
133
- }),
134
- ],
135
- }),
136
- }),
137
- ],
138
- });
6
+ const thinkingBlockVariants = cva("mb-3 p-3 rounded-lg bg-card border border-border", {
7
+ variants: {
8
+ variant: {
9
+ default: "opacity-70",
10
+ subtle: "opacity-50",
11
+ prominent: "opacity-90",
12
+ },
13
+ },
14
+ defaultVariants: {
15
+ variant: "default",
16
+ },
17
+ });
18
+ const thinkingIconVariants = cva("w-4 h-4 text-foreground opacity-60 transition-transform", {
19
+ variants: {
20
+ expanded: {
21
+ true: "rotate-180",
22
+ false: "",
23
+ },
24
+ },
25
+ defaultVariants: {
26
+ expanded: false,
27
+ },
28
+ });
29
+ export function ThinkingBlock({ thinking, isStreaming, displayMode = "collapsible", variant, className, }) {
30
+ const [isExpanded, setIsExpanded] = useState(false);
31
+ if (!thinking && !isStreaming) {
32
+ return null;
33
+ }
34
+ // Inline mode - always visible
35
+ if (displayMode === "inline") {
36
+ return (_jsxs("div", { className: cn(thinkingBlockVariants({ variant }), className), children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-xs font-medium text-foreground opacity-60 uppercase tracking-wide", children: "Thinking" }), isStreaming && (_jsx("span", { className: "inline-block w-2 h-2 bg-primary rounded-full animate-pulse" }))] }), _jsxs("div", { className: "mt-2 text-sm italic text-foreground opacity-80 leading-relaxed whitespace-pre-wrap", children: [thinking, isStreaming && thinking && (_jsx("span", { className: "inline-block animate-typing", children: "..." }))] })] }));
37
+ }
38
+ // Collapsible mode
39
+ return (_jsxs("div", { className: cn("mb-3", className), children: [_jsxs("button", { type: "button", onClick: () => setIsExpanded(!isExpanded), className: "w-full flex items-center justify-between p-2 rounded-lg bg-card border border-border hover:bg-card transition-colors text-left", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs font-medium text-foreground opacity-60 uppercase tracking-wide", children: "Thinking" }), isStreaming && (_jsx("span", { className: "inline-block w-2 h-2 bg-primary rounded-full animate-pulse" })), !isExpanded && thinking && (_jsxs("span", { className: "text-xs text-foreground opacity-50 truncate max-w-[200px]", children: [thinking.substring(0, 50), "..."] }))] }), _jsx(ChevronDown, { className: thinkingIconVariants({ expanded: isExpanded }) })] }), isExpanded && (_jsx("div", { className: cn(thinkingBlockVariants({ variant }), "mt-2"), children: _jsxs("div", { className: "text-sm italic text-foreground opacity-80 leading-relaxed whitespace-pre-wrap", children: [thinking, isStreaming && thinking && (_jsx("span", { className: "inline-block animate-typing", children: "..." }))] }) }))] }));
139
40
  }
@@ -7,16 +7,14 @@ import { type TodoItem } from "./TodoListItem.js";
7
7
  * 2. Prop-based: Pass `todos` prop directly
8
8
  */
9
9
  export interface TodoListProps extends React.HTMLAttributes<HTMLDivElement> {
10
- /**
11
- * ACP Client for hook-based todo fetching (future support)
12
- */
13
- client?: AcpClient | null;
14
- /**
15
- * Todos to display (prop-based pattern)
16
- * Either client or todos should be provided
17
- */
18
- todos?: TodoItem[];
10
+ /**
11
+ * ACP Client for hook-based todo fetching (future support)
12
+ */
13
+ client?: AcpClient | null;
14
+ /**
15
+ * Todos to display (prop-based pattern)
16
+ * Either client or todos should be provided
17
+ */
18
+ todos?: TodoItem[];
19
19
  }
20
- export declare const TodoList: React.ForwardRefExoticComponent<
21
- TodoListProps & React.RefAttributes<HTMLDivElement>
22
- >;
20
+ export declare const TodoList: React.ForwardRefExoticComponent<TodoListProps & React.RefAttributes<HTMLDivElement>>;