@townco/ui 0.1.16 → 0.1.18

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 (212) hide show
  1. package/dist/core/hooks/use-chat-input.d.ts +17 -17
  2. package/dist/core/hooks/use-chat-input.js +55 -64
  3. package/dist/core/hooks/use-chat-messages.js +114 -121
  4. package/dist/core/hooks/use-chat-session.d.ts +1 -1
  5. package/dist/core/hooks/use-chat-session.js +80 -78
  6. package/dist/gui/components/Button.d.ts +7 -23
  7. package/dist/gui/components/Button.js +27 -40
  8. package/dist/gui/components/Card.d.ts +7 -26
  9. package/dist/gui/components/Card.js +8 -54
  10. package/dist/gui/components/ChatSecondaryPanel.d.ts +25 -14
  11. package/dist/gui/components/ChatSecondaryPanel.js +60 -115
  12. package/dist/gui/components/ChatStatus.d.ts +2 -4
  13. package/dist/gui/components/ChatStatus.js +34 -45
  14. package/dist/gui/components/Conversation.d.ts +14 -17
  15. package/dist/gui/components/Conversation.js +83 -143
  16. package/dist/gui/components/Dialog.d.ts +11 -57
  17. package/dist/gui/components/Dialog.js +8 -84
  18. package/dist/gui/components/HeightTransition.d.ts +7 -12
  19. package/dist/gui/components/HeightTransition.js +77 -88
  20. package/dist/gui/components/Input.d.ts +6 -13
  21. package/dist/gui/components/Input.js +16 -27
  22. package/dist/gui/components/Label.d.ts +1 -7
  23. package/dist/gui/components/Label.js +2 -12
  24. package/dist/gui/components/MarkdownRenderer.d.ts +4 -6
  25. package/dist/gui/components/MarkdownRenderer.js +81 -178
  26. package/dist/gui/components/MessageContent.d.ts +22 -29
  27. package/dist/gui/components/PanelTabsHeader.d.ts +17 -0
  28. package/dist/gui/components/PanelTabsHeader.js +31 -0
  29. package/dist/gui/components/Reasoning.d.ts +24 -30
  30. package/dist/gui/components/Reasoning.js +60 -187
  31. package/dist/gui/components/Response.d.ts +9 -11
  32. package/dist/gui/components/Response.js +90 -229
  33. package/dist/gui/components/Select.d.ts +10 -69
  34. package/dist/gui/components/Select.js +12 -118
  35. package/dist/gui/components/Tabs.d.ts +4 -24
  36. package/dist/gui/components/Tabs.js +4 -32
  37. package/dist/gui/components/Task.d.ts +24 -28
  38. package/dist/gui/components/Task.js +31 -164
  39. package/dist/gui/components/Textarea.d.ts +7 -15
  40. package/dist/gui/components/Textarea.js +46 -63
  41. package/dist/gui/components/ThinkingBlock.d.ts +10 -20
  42. package/dist/gui/components/ThinkingBlock.js +35 -134
  43. package/dist/gui/components/TodoList.d.ts +10 -12
  44. package/dist/gui/components/TodoList.js +7 -22
  45. package/dist/gui/components/TodoListItem.d.ts +6 -9
  46. package/dist/gui/components/TodoListItem.js +4 -18
  47. package/dist/gui/components/ToolCall.js +5 -5
  48. package/dist/gui/components/index.d.ts +1 -0
  49. package/dist/gui/components/index.js +1 -0
  50. package/dist/gui/lib/utils.js +1 -1
  51. package/dist/index.test.js +1 -0
  52. package/dist/sdk/client/acp-client.d.ts +76 -88
  53. package/dist/sdk/client/acp-client.js +217 -215
  54. package/dist/sdk/schemas/agent.d.ts +64 -111
  55. package/dist/sdk/schemas/agent.js +24 -24
  56. package/dist/sdk/schemas/message.d.ts +147 -245
  57. package/dist/sdk/schemas/message.js +40 -40
  58. package/dist/sdk/schemas/session.d.ts +6 -6
  59. package/dist/sdk/transports/http.d.ts +55 -55
  60. package/dist/sdk/transports/stdio.d.ts +20 -20
  61. package/dist/sdk/transports/types.d.ts +42 -42
  62. package/dist/sdk/transports/websocket.d.ts +12 -12
  63. package/dist/sdk/transports/websocket.js +46 -52
  64. package/dist/tui/components/ChatView.d.ts +2 -4
  65. package/dist/tui/components/GameOfLife.js +35 -64
  66. package/dist/tui/components/InputBox.d.ts +11 -18
  67. package/dist/tui/components/InputBox.js +10 -70
  68. package/dist/tui/components/ReadlineInput.d.ts +6 -12
  69. package/dist/tui/components/ReadlineInput.js +237 -252
  70. package/dist/tui/components/SingleSelect.d.ts +9 -15
  71. package/dist/tui/components/SingleSelect.js +43 -84
  72. package/dist/tui/components/StatusBar.d.ts +6 -11
  73. package/dist/tui/components/StatusBar.js +67 -102
  74. package/package.json +3 -3
  75. package/dist/core/hooks/index.d.ts.map +0 -1
  76. package/dist/core/hooks/index.js.map +0 -1
  77. package/dist/core/hooks/use-chat-input.d.ts.map +0 -1
  78. package/dist/core/hooks/use-chat-input.js.map +0 -1
  79. package/dist/core/hooks/use-chat-messages.d.ts.map +0 -1
  80. package/dist/core/hooks/use-chat-messages.js.map +0 -1
  81. package/dist/core/hooks/use-chat-session.d.ts.map +0 -1
  82. package/dist/core/hooks/use-chat-session.js.map +0 -1
  83. package/dist/core/index.d.ts.map +0 -1
  84. package/dist/core/index.js.map +0 -1
  85. package/dist/core/schemas/chat.d.ts.map +0 -1
  86. package/dist/core/schemas/chat.js.map +0 -1
  87. package/dist/core/schemas/index.d.ts.map +0 -1
  88. package/dist/core/schemas/index.js.map +0 -1
  89. package/dist/core/store/chat-store.d.ts.map +0 -1
  90. package/dist/core/store/chat-store.js.map +0 -1
  91. package/dist/gui/components/Button.d.ts.map +0 -1
  92. package/dist/gui/components/Button.js.map +0 -1
  93. package/dist/gui/components/Card.d.ts.map +0 -1
  94. package/dist/gui/components/Card.js.map +0 -1
  95. package/dist/gui/components/ChatInput.d.ts.map +0 -1
  96. package/dist/gui/components/ChatInput.js.map +0 -1
  97. package/dist/gui/components/ChatInterface.d.ts +0 -12
  98. package/dist/gui/components/ChatInterface.d.ts.map +0 -1
  99. package/dist/gui/components/ChatInterface.js +0 -204
  100. package/dist/gui/components/ChatInterface.js.map +0 -1
  101. package/dist/gui/components/ChatPreview.d.ts +0 -12
  102. package/dist/gui/components/ChatPreview.d.ts.map +0 -1
  103. package/dist/gui/components/ChatPreview.js +0 -214
  104. package/dist/gui/components/ChatPreview.js.map +0 -1
  105. package/dist/gui/components/ChatSecondaryPanel.d.ts.map +0 -1
  106. package/dist/gui/components/ChatSecondaryPanel.js.map +0 -1
  107. package/dist/gui/components/ChatStatus.d.ts.map +0 -1
  108. package/dist/gui/components/ChatStatus.js.map +0 -1
  109. package/dist/gui/components/ChatView.d.ts +0 -8
  110. package/dist/gui/components/ChatView.d.ts.map +0 -1
  111. package/dist/gui/components/ChatView.js +0 -42
  112. package/dist/gui/components/ChatView.js.map +0 -1
  113. package/dist/gui/components/ConfigPanel.d.ts +0 -20
  114. package/dist/gui/components/ConfigPanel.d.ts.map +0 -1
  115. package/dist/gui/components/ConfigPanel.js +0 -225
  116. package/dist/gui/components/ConfigPanel.js.map +0 -1
  117. package/dist/gui/components/Conversation.d.ts.map +0 -1
  118. package/dist/gui/components/Conversation.js.map +0 -1
  119. package/dist/gui/components/Dialog.d.ts.map +0 -1
  120. package/dist/gui/components/Dialog.js.map +0 -1
  121. package/dist/gui/components/HeightTransition.d.ts.map +0 -1
  122. package/dist/gui/components/HeightTransition.js.map +0 -1
  123. package/dist/gui/components/Input.d.ts.map +0 -1
  124. package/dist/gui/components/Input.js.map +0 -1
  125. package/dist/gui/components/InputBox.d.ts +0 -21
  126. package/dist/gui/components/InputBox.d.ts.map +0 -1
  127. package/dist/gui/components/InputBox.js +0 -90
  128. package/dist/gui/components/InputBox.js.map +0 -1
  129. package/dist/gui/components/Label.d.ts.map +0 -1
  130. package/dist/gui/components/Label.js.map +0 -1
  131. package/dist/gui/components/MarkdownRenderer.d.ts.map +0 -1
  132. package/dist/gui/components/MarkdownRenderer.js.map +0 -1
  133. package/dist/gui/components/Message.d.ts.map +0 -1
  134. package/dist/gui/components/Message.js.map +0 -1
  135. package/dist/gui/components/MessageContent.d.ts.map +0 -1
  136. package/dist/gui/components/MessageContent.js.map +0 -1
  137. package/dist/gui/components/MessageList.d.ts.map +0 -1
  138. package/dist/gui/components/MessageList.js.map +0 -1
  139. package/dist/gui/components/PlaygroundLayout.d.ts +0 -14
  140. package/dist/gui/components/PlaygroundLayout.d.ts.map +0 -1
  141. package/dist/gui/components/PlaygroundLayout.js +0 -49
  142. package/dist/gui/components/PlaygroundLayout.js.map +0 -1
  143. package/dist/gui/components/Reasoning.d.ts.map +0 -1
  144. package/dist/gui/components/Reasoning.js.map +0 -1
  145. package/dist/gui/components/Response.d.ts.map +0 -1
  146. package/dist/gui/components/Response.js.map +0 -1
  147. package/dist/gui/components/Select.d.ts.map +0 -1
  148. package/dist/gui/components/Select.js.map +0 -1
  149. package/dist/gui/components/StatusBar.d.ts +0 -12
  150. package/dist/gui/components/StatusBar.d.ts.map +0 -1
  151. package/dist/gui/components/StatusBar.js +0 -58
  152. package/dist/gui/components/StatusBar.js.map +0 -1
  153. package/dist/gui/components/Tabs.d.ts.map +0 -1
  154. package/dist/gui/components/Tabs.js.map +0 -1
  155. package/dist/gui/components/Task.d.ts.map +0 -1
  156. package/dist/gui/components/Task.js.map +0 -1
  157. package/dist/gui/components/Textarea.d.ts.map +0 -1
  158. package/dist/gui/components/Textarea.js.map +0 -1
  159. package/dist/gui/components/ThinkingBlock.d.ts.map +0 -1
  160. package/dist/gui/components/ThinkingBlock.js.map +0 -1
  161. package/dist/gui/components/TodoList.d.ts.map +0 -1
  162. package/dist/gui/components/TodoList.js.map +0 -1
  163. package/dist/gui/components/TodoListItem.d.ts.map +0 -1
  164. package/dist/gui/components/TodoListItem.js.map +0 -1
  165. package/dist/gui/components/index.d.ts.map +0 -1
  166. package/dist/gui/components/index.js.map +0 -1
  167. package/dist/gui/index.d.ts.map +0 -1
  168. package/dist/gui/index.js.map +0 -1
  169. package/dist/gui/lib/utils.d.ts.map +0 -1
  170. package/dist/gui/lib/utils.js.map +0 -1
  171. package/dist/index.d.ts.map +0 -1
  172. package/dist/index.js.map +0 -1
  173. package/dist/sdk/client/acp-client.d.ts.map +0 -1
  174. package/dist/sdk/client/acp-client.js.map +0 -1
  175. package/dist/sdk/client/index.d.ts.map +0 -1
  176. package/dist/sdk/client/index.js.map +0 -1
  177. package/dist/sdk/index.d.ts.map +0 -1
  178. package/dist/sdk/index.js.map +0 -1
  179. package/dist/sdk/schemas/agent.d.ts.map +0 -1
  180. package/dist/sdk/schemas/agent.js.map +0 -1
  181. package/dist/sdk/schemas/index.d.ts.map +0 -1
  182. package/dist/sdk/schemas/index.js.map +0 -1
  183. package/dist/sdk/schemas/message.d.ts.map +0 -1
  184. package/dist/sdk/schemas/message.js.map +0 -1
  185. package/dist/sdk/schemas/session.d.ts.map +0 -1
  186. package/dist/sdk/schemas/session.js.map +0 -1
  187. package/dist/sdk/transports/http.d.ts.map +0 -1
  188. package/dist/sdk/transports/http.js.map +0 -1
  189. package/dist/sdk/transports/index.d.ts.map +0 -1
  190. package/dist/sdk/transports/index.js.map +0 -1
  191. package/dist/sdk/transports/stdio.d.ts.map +0 -1
  192. package/dist/sdk/transports/stdio.js.map +0 -1
  193. package/dist/sdk/transports/types.d.ts.map +0 -1
  194. package/dist/sdk/transports/types.js.map +0 -1
  195. package/dist/sdk/transports/websocket.d.ts.map +0 -1
  196. package/dist/sdk/transports/websocket.js.map +0 -1
  197. package/dist/tui/components/ChatView.d.ts.map +0 -1
  198. package/dist/tui/components/ChatView.js.map +0 -1
  199. package/dist/tui/components/GameOfLife.d.ts.map +0 -1
  200. package/dist/tui/components/GameOfLife.js.map +0 -1
  201. package/dist/tui/components/InputBox.d.ts.map +0 -1
  202. package/dist/tui/components/InputBox.js.map +0 -1
  203. package/dist/tui/components/MessageList.d.ts.map +0 -1
  204. package/dist/tui/components/MessageList.js.map +0 -1
  205. package/dist/tui/components/ReadlineInput.d.ts.map +0 -1
  206. package/dist/tui/components/ReadlineInput.js.map +0 -1
  207. package/dist/tui/components/StatusBar.d.ts.map +0 -1
  208. package/dist/tui/components/StatusBar.js.map +0 -1
  209. package/dist/tui/components/index.d.ts.map +0 -1
  210. package/dist/tui/components/index.js.map +0 -1
  211. package/dist/tui/index.d.ts.map +0 -1
  212. package/dist/tui/index.js.map +0 -1
@@ -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>>;
@@ -1,26 +1,11 @@
1
- import * as React from "react";
2
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import { cn } from "../lib/utils.js";
4
4
  import { TodoListItem } from "./TodoListItem.js";
5
- export const TodoList = React.forwardRef(
6
- ({ client, todos, className, ...props }, ref) => {
7
- // For now, just use prop-based todos
8
- // Future: Add hook to get todos from store when available
9
- const todosToDisplay = todos || [];
10
- return _jsx("div", {
11
- ref: ref,
12
- className: cn("space-y-2 max-h-64 overflow-y-auto", className),
13
- ...props,
14
- children:
15
- todosToDisplay.length === 0
16
- ? _jsx("p", {
17
- className: "text-sm text-foreground opacity-60 italic",
18
- children: "No tasks yet.",
19
- })
20
- : todosToDisplay.map((todo) =>
21
- _jsx(TodoListItem, { todo: todo }, todo.id),
22
- ),
23
- });
24
- },
25
- );
5
+ export const TodoList = React.forwardRef(({ client, todos, className, ...props }, ref) => {
6
+ // For now, just use prop-based todos
7
+ // Future: Add hook to get todos from store when available
8
+ const todosToDisplay = todos || [];
9
+ return (_jsx("div", { ref: ref, className: cn("space-y-2 max-h-64 overflow-y-auto", className), ...props, children: todosToDisplay.length === 0 ? (_jsx("p", { className: "text-sm text-foreground opacity-60 italic", children: "No tasks yet." })) : (todosToDisplay.map((todo) => (_jsx(TodoListItem, { todo: todo }, todo.id)))) }));
10
+ });
26
11
  TodoList.displayName = "TodoList";
@@ -1,13 +1,10 @@
1
1
  import * as React from "react";
2
2
  export interface TodoItem {
3
- id: string;
4
- text: string;
5
- status: "pending" | "in_progress" | "completed";
3
+ id: string;
4
+ text: string;
5
+ status: "pending" | "in_progress" | "completed";
6
6
  }
7
- export interface TodoListItemProps
8
- extends React.HTMLAttributes<HTMLDivElement> {
9
- todo: TodoItem;
7
+ export interface TodoListItemProps extends React.HTMLAttributes<HTMLDivElement> {
8
+ todo: TodoItem;
10
9
  }
11
- export declare const TodoListItem: React.ForwardRefExoticComponent<
12
- TodoListItemProps & React.RefAttributes<HTMLDivElement>
13
- >;
10
+ export declare const TodoListItem: React.ForwardRefExoticComponent<TodoListItemProps & React.RefAttributes<HTMLDivElement>>;
@@ -1,21 +1,7 @@
1
- import * as React from "react";
2
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import { cn } from "../lib/utils.js";
4
- export const TodoListItem = React.forwardRef(
5
- ({ todo, className, ...props }, ref) => {
6
- return _jsx("div", {
7
- ref: ref,
8
- className: cn("flex items-center gap-3 px-3 py-2 rounded-lg", className),
9
- ...props,
10
- children: _jsx("span", {
11
- className: cn(
12
- "flex-1 text-[var(--font-size)] font-[var(--font-family)]",
13
- todo.status === "completed" && "line-through opacity-60",
14
- todo.status === "in_progress" && "shimmer-animation",
15
- ),
16
- children: todo.text,
17
- }),
18
- });
19
- },
20
- );
4
+ export const TodoListItem = React.forwardRef(({ todo, className, ...props }, ref) => {
5
+ return (_jsx("div", { ref: ref, className: cn("flex items-center gap-3 px-3 py-2 rounded-lg", className), ...props, children: _jsx("span", { className: cn("flex-1 text-[var(--font-size)] font-[var(--font-family)]", todo.status === "completed" && "line-through opacity-60", todo.status === "in_progress" && "shimmer-animation"), children: todo.text }) }));
6
+ });
21
7
  TodoListItem.displayName = "TodoListItem";
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import JsonView from "@uiw/react-json-view";
2
3
  import { Wrench } from "lucide-react";
3
4
  import { useState } from "react";
4
- import ReactJson from "react-json-view";
5
5
  /**
6
6
  * Tool call status badge styles
7
7
  */
@@ -33,7 +33,7 @@ export function ToolCall({ toolCall }) {
33
33
  const [isExpanded, setIsExpanded] = useState(false);
34
34
  return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("button", { type: "button", className: "flex items-center gap-1.5 cursor-pointer bg-transparent border-none p-0 text-left group w-fit", onClick: () => setIsExpanded(!isExpanded), "aria-expanded": isExpanded, children: [_jsxs("span", { className: `inline-flex items-center gap-1.5 px-2 py-1 text-xs font-medium rounded ${statusStyles[toolCall.status]}`, children: [_jsx(Wrench, { className: "h-3 w-3" }), _jsx("span", { children: toolCall.title }), toolCall.status === "completed" && _jsx("span", { children: "\u2713" })] }), _jsx("span", { className: "text-gray-400 text-xs opacity-0 group-hover:opacity-100 transition-opacity", children: isExpanded ? "▲" : "▼" })] }), isExpanded && (_jsxs("div", { className: "mt-2 space-y-3 text-sm border border-gray-200 rounded-md p-3 bg-white shadow-sm max-w-full", children: [toolCall.locations && toolCall.locations.length > 0 && (_jsxs("div", { children: [_jsx("div", { className: "text-xs font-semibold text-gray-500 uppercase tracking-wide mb-1.5", children: "Files" }), _jsx("ul", { className: "space-y-1", children: toolCall.locations.map((loc) => (_jsxs("li", { className: "font-mono text-xs text-gray-700 bg-gray-50 px-2 py-1 rounded", children: [loc.path, loc.line !== null &&
35
35
  loc.line !== undefined &&
36
- `:${loc.line}`] }, `${loc.path}:${loc.line ?? ""}`))) })] })), toolCall.rawInput && Object.keys(toolCall.rawInput).length > 0 && (_jsxs("div", { children: [_jsx("div", { className: "text-xs font-semibold text-gray-500 uppercase tracking-wide mb-1.5", children: "Input" }), _jsx("div", { className: "bg-gray-50 p-2 rounded border border-gray-200", children: _jsx(ReactJson, { src: toolCall.rawInput, name: false, collapsed: 1, displayDataTypes: false, displayObjectSize: false, enableClipboard: true, style: { fontSize: "11px", backgroundColor: "transparent" }, theme: "rjv-default" }) })] })), toolCall.content && toolCall.content.length > 0 && (_jsxs("div", { children: [_jsx("div", { className: "text-xs font-semibold text-gray-500 uppercase tracking-wide mb-1.5", children: "Output" }), _jsx("div", { className: "space-y-2", children: toolCall.content.map((block, idx) => {
36
+ `:${loc.line}`] }, `${loc.path}:${loc.line ?? ""}`))) })] })), toolCall.rawInput && Object.keys(toolCall.rawInput).length > 0 && (_jsxs("div", { children: [_jsx("div", { className: "text-xs font-semibold text-gray-500 uppercase tracking-wide mb-1.5", children: "Input" }), _jsx("div", { className: "bg-gray-50 p-2 rounded border border-gray-200", children: _jsx(JsonView, { value: toolCall.rawInput, collapsed: false, displayDataTypes: false, displayObjectSize: false, enableClipboard: true, style: { fontSize: "11px", backgroundColor: "transparent" } }) })] })), toolCall.content && toolCall.content.length > 0 && (_jsxs("div", { children: [_jsx("div", { className: "text-xs font-semibold text-gray-500 uppercase tracking-wide mb-1.5", children: "Output" }), _jsx("div", { className: "space-y-2", children: toolCall.content.map((block, idx) => {
37
37
  // Generate a stable key based on content
38
38
  const getBlockKey = () => {
39
39
  if (block.type === "diff" && "path" in block) {
@@ -56,12 +56,12 @@ export function ToolCall({ toolCall }) {
56
56
  // Try to parse as JSON
57
57
  try {
58
58
  const parsed = JSON.parse(text);
59
- // If it's an object or array, render with ReactJson
59
+ // If it's an object or array, render with JsonView
60
60
  if (typeof parsed === "object" && parsed !== null) {
61
- return (_jsx("div", { className: "bg-gray-50 p-2 rounded border border-gray-200", children: _jsx(ReactJson, { src: parsed, name: false, collapsed: 1, displayDataTypes: false, displayObjectSize: false, enableClipboard: true, style: {
61
+ return (_jsx("div", { className: "bg-gray-50 p-2 rounded border border-gray-200", children: _jsx(JsonView, { value: parsed, collapsed: false, displayDataTypes: false, displayObjectSize: false, enableClipboard: true, style: {
62
62
  fontSize: "11px",
63
63
  backgroundColor: "transparent",
64
- }, theme: "rjv-default" }) }, key));
64
+ } }) }, key));
65
65
  }
66
66
  }
67
67
  catch {
@@ -19,6 +19,7 @@ export { MarkdownRenderer } from "./MarkdownRenderer.js";
19
19
  export { Message, type MessageProps } from "./Message.js";
20
20
  export { MessageContent, type MessageContentProps } from "./MessageContent.js";
21
21
  export type { DisplayMessage } from "./MessageList.js";
22
+ export { PanelTabsHeader, type PanelTabsHeaderProps, } from "./PanelTabsHeader.js";
22
23
  export { Reasoning, type ReasoningProps } from "./Reasoning.js";
23
24
  export { Response, type ResponseProps } from "./Response.js";
24
25
  export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, } from "./Select.js";
@@ -24,6 +24,7 @@ export { Label } from "./Label.js";
24
24
  export { MarkdownRenderer } from "./MarkdownRenderer.js";
25
25
  export { Message } from "./Message.js";
26
26
  export { MessageContent } from "./MessageContent.js";
27
+ export { PanelTabsHeader, } from "./PanelTabsHeader.js";
27
28
  export { Reasoning } from "./Reasoning.js";
28
29
  export { Response } from "./Response.js";
29
30
  export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, } from "./Select.js";
@@ -1,5 +1,5 @@
1
1
  import { clsx } from "clsx";
2
2
  import { twMerge } from "tailwind-merge";
3
3
  export function cn(...inputs) {
4
- return twMerge(clsx(inputs));
4
+ return twMerge(clsx(inputs));
5
5
  }
@@ -0,0 +1 @@
1
+ "use strict";