@townco/ui 0.1.0

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 (271) hide show
  1. package/README.md +175 -0
  2. package/dist/core/hooks/index.d.ts +6 -0
  3. package/dist/core/hooks/index.d.ts.map +1 -0
  4. package/dist/core/hooks/index.js +6 -0
  5. package/dist/core/hooks/index.js.map +1 -0
  6. package/dist/core/hooks/use-chat-input.d.ts +23 -0
  7. package/dist/core/hooks/use-chat-input.d.ts.map +1 -0
  8. package/dist/core/hooks/use-chat-input.js +63 -0
  9. package/dist/core/hooks/use-chat-input.js.map +1 -0
  10. package/dist/core/hooks/use-chat-messages.d.ts +17 -0
  11. package/dist/core/hooks/use-chat-messages.d.ts.map +1 -0
  12. package/dist/core/hooks/use-chat-messages.js +121 -0
  13. package/dist/core/hooks/use-chat-messages.js.map +1 -0
  14. package/dist/core/hooks/use-chat-session.d.ts +11 -0
  15. package/dist/core/hooks/use-chat-session.d.ts.map +1 -0
  16. package/dist/core/hooks/use-chat-session.js +87 -0
  17. package/dist/core/hooks/use-chat-session.js.map +1 -0
  18. package/dist/core/hooks/use-media-query.d.ts +39 -0
  19. package/dist/core/hooks/use-media-query.js +80 -0
  20. package/dist/core/index.d.ts +9 -0
  21. package/dist/core/index.d.ts.map +1 -0
  22. package/dist/core/index.js +9 -0
  23. package/dist/core/index.js.map +1 -0
  24. package/dist/core/schemas/chat.d.ts +78 -0
  25. package/dist/core/schemas/chat.d.ts.map +1 -0
  26. package/dist/core/schemas/chat.js +49 -0
  27. package/dist/core/schemas/chat.js.map +1 -0
  28. package/dist/core/schemas/index.d.ts +4 -0
  29. package/dist/core/schemas/index.d.ts.map +1 -0
  30. package/dist/core/schemas/index.js +4 -0
  31. package/dist/core/schemas/index.js.map +1 -0
  32. package/dist/core/store/chat-store.d.ts +30 -0
  33. package/dist/core/store/chat-store.d.ts.map +1 -0
  34. package/dist/core/store/chat-store.js +56 -0
  35. package/dist/core/store/chat-store.js.map +1 -0
  36. package/dist/gui/components/Button.d.ts +11 -0
  37. package/dist/gui/components/Button.d.ts.map +1 -0
  38. package/dist/gui/components/Button.js +33 -0
  39. package/dist/gui/components/Button.js.map +1 -0
  40. package/dist/gui/components/Card.d.ts +8 -0
  41. package/dist/gui/components/Card.d.ts.map +1 -0
  42. package/dist/gui/components/Card.js +16 -0
  43. package/dist/gui/components/Card.js.map +1 -0
  44. package/dist/gui/components/ChatHeader.d.ts +38 -0
  45. package/dist/gui/components/ChatHeader.js +84 -0
  46. package/dist/gui/components/ChatInput.d.ts +42 -0
  47. package/dist/gui/components/ChatInput.d.ts.map +1 -0
  48. package/dist/gui/components/ChatInput.js +137 -0
  49. package/dist/gui/components/ChatInput.js.map +1 -0
  50. package/dist/gui/components/ChatInterface.d.ts +9 -0
  51. package/dist/gui/components/ChatInterface.d.ts.map +1 -0
  52. package/dist/gui/components/ChatInterface.js +132 -0
  53. package/dist/gui/components/ChatInterface.js.map +1 -0
  54. package/dist/gui/components/ChatLayout.d.ts +52 -0
  55. package/dist/gui/components/ChatLayout.js +105 -0
  56. package/dist/gui/components/ChatPanelTabContent.d.ts +18 -0
  57. package/dist/gui/components/ChatPanelTabContent.js +15 -0
  58. package/dist/gui/components/ChatPreview.d.ts +9 -0
  59. package/dist/gui/components/ChatPreview.d.ts.map +1 -0
  60. package/dist/gui/components/ChatPreview.js +164 -0
  61. package/dist/gui/components/ChatPreview.js.map +1 -0
  62. package/dist/gui/components/ChatSecondaryPanel.d.ts +20 -0
  63. package/dist/gui/components/ChatSecondaryPanel.d.ts.map +1 -0
  64. package/dist/gui/components/ChatSecondaryPanel.js +44 -0
  65. package/dist/gui/components/ChatSecondaryPanel.js.map +1 -0
  66. package/dist/gui/components/ChatSidebar.d.ts +14 -0
  67. package/dist/gui/components/ChatSidebar.js +23 -0
  68. package/dist/gui/components/ChatStatus.d.ts +6 -0
  69. package/dist/gui/components/ChatStatus.d.ts.map +1 -0
  70. package/dist/gui/components/ChatStatus.js +38 -0
  71. package/dist/gui/components/ChatStatus.js.map +1 -0
  72. package/dist/gui/components/ChatView.d.ts +6 -0
  73. package/dist/gui/components/ChatView.d.ts.map +1 -0
  74. package/dist/gui/components/ChatView.js +13 -0
  75. package/dist/gui/components/ChatView.js.map +1 -0
  76. package/dist/gui/components/ConfigPanel.d.ts +16 -0
  77. package/dist/gui/components/ConfigPanel.d.ts.map +1 -0
  78. package/dist/gui/components/ConfigPanel.js +48 -0
  79. package/dist/gui/components/ConfigPanel.js.map +1 -0
  80. package/dist/gui/components/Conversation.d.ts +20 -0
  81. package/dist/gui/components/Conversation.d.ts.map +1 -0
  82. package/dist/gui/components/Conversation.js +87 -0
  83. package/dist/gui/components/Conversation.js.map +1 -0
  84. package/dist/gui/components/Dialog.d.ts +19 -0
  85. package/dist/gui/components/Dialog.d.ts.map +1 -0
  86. package/dist/gui/components/Dialog.js +22 -0
  87. package/dist/gui/components/Dialog.js.map +1 -0
  88. package/dist/gui/components/DropdownMenu.d.ts +27 -0
  89. package/dist/gui/components/DropdownMenu.js +68 -0
  90. package/dist/gui/components/HeightTransition.d.ts +10 -0
  91. package/dist/gui/components/HeightTransition.d.ts.map +1 -0
  92. package/dist/gui/components/HeightTransition.js +80 -0
  93. package/dist/gui/components/HeightTransition.js.map +1 -0
  94. package/dist/gui/components/Input.d.ts +9 -0
  95. package/dist/gui/components/Input.d.ts.map +1 -0
  96. package/dist/gui/components/Input.js +21 -0
  97. package/dist/gui/components/Input.js.map +1 -0
  98. package/dist/gui/components/InputBox.d.ts +14 -0
  99. package/dist/gui/components/InputBox.d.ts.map +1 -0
  100. package/dist/gui/components/InputBox.js +18 -0
  101. package/dist/gui/components/InputBox.js.map +1 -0
  102. package/dist/gui/components/Label.d.ts +4 -0
  103. package/dist/gui/components/Label.d.ts.map +1 -0
  104. package/dist/gui/components/Label.js +7 -0
  105. package/dist/gui/components/Label.js.map +1 -0
  106. package/dist/gui/components/MarkdownRenderer.d.ts +6 -0
  107. package/dist/gui/components/MarkdownRenderer.d.ts.map +1 -0
  108. package/dist/gui/components/MarkdownRenderer.js +86 -0
  109. package/dist/gui/components/MarkdownRenderer.js.map +1 -0
  110. package/dist/gui/components/Message.d.ts +26 -0
  111. package/dist/gui/components/Message.d.ts.map +1 -0
  112. package/dist/gui/components/Message.js +33 -0
  113. package/dist/gui/components/Message.js.map +1 -0
  114. package/dist/gui/components/MessageContent.d.ts +26 -0
  115. package/dist/gui/components/MessageContent.d.ts.map +1 -0
  116. package/dist/gui/components/MessageContent.js +104 -0
  117. package/dist/gui/components/MessageContent.js.map +1 -0
  118. package/dist/gui/components/MessageList.d.ts +6 -0
  119. package/dist/gui/components/MessageList.d.ts.map +1 -0
  120. package/dist/gui/components/MessageList.js +1 -0
  121. package/dist/gui/components/MessageList.js.map +1 -0
  122. package/dist/gui/components/PlaygroundLayout.d.ts +10 -0
  123. package/dist/gui/components/PlaygroundLayout.d.ts.map +1 -0
  124. package/dist/gui/components/PlaygroundLayout.js +18 -0
  125. package/dist/gui/components/PlaygroundLayout.js.map +1 -0
  126. package/dist/gui/components/Reasoning.d.ts +31 -0
  127. package/dist/gui/components/Reasoning.d.ts.map +1 -0
  128. package/dist/gui/components/Reasoning.js +70 -0
  129. package/dist/gui/components/Reasoning.js.map +1 -0
  130. package/dist/gui/components/Response.d.ts +16 -0
  131. package/dist/gui/components/Response.d.ts.map +1 -0
  132. package/dist/gui/components/Response.js +95 -0
  133. package/dist/gui/components/Response.js.map +1 -0
  134. package/dist/gui/components/Select.d.ts +13 -0
  135. package/dist/gui/components/Select.d.ts.map +1 -0
  136. package/dist/gui/components/Select.js +26 -0
  137. package/dist/gui/components/Select.js.map +1 -0
  138. package/dist/gui/components/Sonner.d.ts +5 -0
  139. package/dist/gui/components/Sonner.js +23 -0
  140. package/dist/gui/components/StatusBar.d.ts +8 -0
  141. package/dist/gui/components/StatusBar.d.ts.map +1 -0
  142. package/dist/gui/components/StatusBar.js +11 -0
  143. package/dist/gui/components/StatusBar.js.map +1 -0
  144. package/dist/gui/components/Tabs.d.ts +7 -0
  145. package/dist/gui/components/Tabs.d.ts.map +1 -0
  146. package/dist/gui/components/Tabs.js +12 -0
  147. package/dist/gui/components/Tabs.js.map +1 -0
  148. package/dist/gui/components/Task.d.ts +35 -0
  149. package/dist/gui/components/Task.d.ts.map +1 -0
  150. package/dist/gui/components/Task.js +37 -0
  151. package/dist/gui/components/Task.js.map +1 -0
  152. package/dist/gui/components/Textarea.d.ts +11 -0
  153. package/dist/gui/components/Textarea.d.ts.map +1 -0
  154. package/dist/gui/components/Textarea.js +51 -0
  155. package/dist/gui/components/Textarea.js.map +1 -0
  156. package/dist/gui/components/ThinkingBlock.d.ts +12 -0
  157. package/dist/gui/components/ThinkingBlock.d.ts.map +1 -0
  158. package/dist/gui/components/ThinkingBlock.js +40 -0
  159. package/dist/gui/components/ThinkingBlock.js.map +1 -0
  160. package/dist/gui/components/TodoList.d.ts +20 -0
  161. package/dist/gui/components/TodoList.d.ts.map +1 -0
  162. package/dist/gui/components/TodoList.js +11 -0
  163. package/dist/gui/components/TodoList.js.map +1 -0
  164. package/dist/gui/components/TodoListItem.d.ts +10 -0
  165. package/dist/gui/components/TodoListItem.d.ts.map +1 -0
  166. package/dist/gui/components/TodoListItem.js +7 -0
  167. package/dist/gui/components/TodoListItem.js.map +1 -0
  168. package/dist/gui/components/index.d.ts +23 -0
  169. package/dist/gui/components/index.d.ts.map +1 -0
  170. package/dist/gui/components/index.js +28 -0
  171. package/dist/gui/components/index.js.map +1 -0
  172. package/dist/gui/index.d.ts +2 -0
  173. package/dist/gui/index.d.ts.map +1 -0
  174. package/dist/gui/index.js +4 -0
  175. package/dist/gui/index.js.map +1 -0
  176. package/dist/gui/lib/utils.d.ts +2 -0
  177. package/dist/gui/lib/utils.d.ts.map +1 -0
  178. package/dist/gui/lib/utils.js +5 -0
  179. package/dist/gui/lib/utils.js.map +1 -0
  180. package/dist/index.d.ts +11 -0
  181. package/dist/index.d.ts.map +1 -0
  182. package/dist/index.js +12 -0
  183. package/dist/index.js.map +1 -0
  184. package/dist/index.test.d.ts +0 -0
  185. package/dist/index.test.js +1 -0
  186. package/dist/sdk/client/acp-client.d.ts +84 -0
  187. package/dist/sdk/client/acp-client.d.ts.map +1 -0
  188. package/dist/sdk/client/acp-client.js +225 -0
  189. package/dist/sdk/client/acp-client.js.map +1 -0
  190. package/dist/sdk/client/index.d.ts +4 -0
  191. package/dist/sdk/client/index.d.ts.map +1 -0
  192. package/dist/sdk/client/index.js +4 -0
  193. package/dist/sdk/client/index.js.map +1 -0
  194. package/dist/sdk/index.d.ts +9 -0
  195. package/dist/sdk/index.d.ts.map +1 -0
  196. package/dist/sdk/index.js +9 -0
  197. package/dist/sdk/index.js.map +1 -0
  198. package/dist/sdk/schemas/agent.d.ts +87 -0
  199. package/dist/sdk/schemas/agent.d.ts.map +1 -0
  200. package/dist/sdk/schemas/agent.js +50 -0
  201. package/dist/sdk/schemas/agent.js.map +1 -0
  202. package/dist/sdk/schemas/index.d.ts +6 -0
  203. package/dist/sdk/schemas/index.d.ts.map +1 -0
  204. package/dist/sdk/schemas/index.js +6 -0
  205. package/dist/sdk/schemas/index.js.map +1 -0
  206. package/dist/sdk/schemas/message.d.ts +195 -0
  207. package/dist/sdk/schemas/message.d.ts.map +1 -0
  208. package/dist/sdk/schemas/message.js +95 -0
  209. package/dist/sdk/schemas/message.js.map +1 -0
  210. package/dist/sdk/schemas/session.d.ts +158 -0
  211. package/dist/sdk/schemas/session.d.ts.map +1 -0
  212. package/dist/sdk/schemas/session.js +54 -0
  213. package/dist/sdk/schemas/session.js.map +1 -0
  214. package/dist/sdk/transports/http.d.ts +63 -0
  215. package/dist/sdk/transports/http.d.ts.map +1 -0
  216. package/dist/sdk/transports/http.js +476 -0
  217. package/dist/sdk/transports/http.js.map +1 -0
  218. package/dist/sdk/transports/index.d.ts +7 -0
  219. package/dist/sdk/transports/index.d.ts.map +1 -0
  220. package/dist/sdk/transports/index.js +7 -0
  221. package/dist/sdk/transports/index.js.map +1 -0
  222. package/dist/sdk/transports/stdio.d.ts +28 -0
  223. package/dist/sdk/transports/stdio.d.ts.map +1 -0
  224. package/dist/sdk/transports/stdio.js +294 -0
  225. package/dist/sdk/transports/stdio.js.map +1 -0
  226. package/dist/sdk/transports/types.d.ts +63 -0
  227. package/dist/sdk/transports/types.d.ts.map +1 -0
  228. package/dist/sdk/transports/types.js +1 -0
  229. package/dist/sdk/transports/types.js.map +1 -0
  230. package/dist/sdk/transports/websocket.d.ts +20 -0
  231. package/dist/sdk/transports/websocket.d.ts.map +1 -0
  232. package/dist/sdk/transports/websocket.js +52 -0
  233. package/dist/sdk/transports/websocket.js.map +1 -0
  234. package/dist/tui/components/ChatView.d.ts +5 -0
  235. package/dist/tui/components/ChatView.d.ts.map +1 -0
  236. package/dist/tui/components/ChatView.js +24 -0
  237. package/dist/tui/components/ChatView.js.map +1 -0
  238. package/dist/tui/components/GameOfLife.d.ts +1 -0
  239. package/dist/tui/components/GameOfLife.d.ts.map +1 -0
  240. package/dist/tui/components/GameOfLife.js +50 -0
  241. package/dist/tui/components/GameOfLife.js.map +1 -0
  242. package/dist/tui/components/InputBox.d.ts +13 -0
  243. package/dist/tui/components/InputBox.d.ts.map +1 -0
  244. package/dist/tui/components/InputBox.js +15 -0
  245. package/dist/tui/components/InputBox.js.map +1 -0
  246. package/dist/tui/components/MessageList.d.ts +5 -0
  247. package/dist/tui/components/MessageList.d.ts.map +1 -0
  248. package/dist/tui/components/MessageList.js +16 -0
  249. package/dist/tui/components/MessageList.js.map +1 -0
  250. package/dist/tui/components/MultiSelect.d.ts +13 -0
  251. package/dist/tui/components/MultiSelect.js +72 -0
  252. package/dist/tui/components/ReadlineInput.d.ts +8 -0
  253. package/dist/tui/components/ReadlineInput.d.ts.map +1 -0
  254. package/dist/tui/components/ReadlineInput.js +240 -0
  255. package/dist/tui/components/ReadlineInput.js.map +1 -0
  256. package/dist/tui/components/SingleSelect.d.ts +13 -0
  257. package/dist/tui/components/SingleSelect.js +46 -0
  258. package/dist/tui/components/StatusBar.d.ts +9 -0
  259. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  260. package/dist/tui/components/StatusBar.js +82 -0
  261. package/dist/tui/components/StatusBar.js.map +1 -0
  262. package/dist/tui/components/index.d.ts +11 -0
  263. package/dist/tui/components/index.d.ts.map +1 -0
  264. package/dist/tui/components/index.js +11 -0
  265. package/dist/tui/components/index.js.map +1 -0
  266. package/dist/tui/index.d.ts +7 -0
  267. package/dist/tui/index.d.ts.map +1 -0
  268. package/dist/tui/index.js +7 -0
  269. package/dist/tui/index.js.map +1 -0
  270. package/package.json +86 -0
  271. package/src/styles/global.css +152 -0
@@ -0,0 +1,294 @@
1
+ import { spawn } from "node:child_process";
2
+ import { Readable, Writable } from "node:stream";
3
+ import { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION, } from "@agentclientprotocol/sdk";
4
+ /**
5
+ * Stdio transport implementation using Agent Client Protocol SDK
6
+ * Uses JSON-RPC 2.0 over stdio to communicate with agents
7
+ */
8
+ export class StdioTransport {
9
+ options;
10
+ agentProcess = null;
11
+ connection = null;
12
+ connected = false;
13
+ sessionUpdateCallbacks = new Set();
14
+ errorCallbacks = new Set();
15
+ messageQueue = [];
16
+ currentSessionId = null;
17
+ chunkResolvers = [];
18
+ streamComplete = false;
19
+ constructor(options) {
20
+ this.options = options;
21
+ }
22
+ async connect() {
23
+ if (this.connected) {
24
+ return;
25
+ }
26
+ try {
27
+ // Spawn the agent process
28
+ this.agentProcess = spawn(this.options.agentPath, this.options.agentArgs || [], {
29
+ cwd: this.options.workingDirectory || process.cwd(),
30
+ env: { ...process.env, ...this.options.environment },
31
+ stdio: ["pipe", "pipe", "pipe"],
32
+ });
33
+ if (!this.agentProcess.stdin ||
34
+ !this.agentProcess.stdout ||
35
+ !this.agentProcess.stderr) {
36
+ throw new Error("Failed to create stdio pipes for agent process");
37
+ }
38
+ // Convert Node.js streams to Web streams
39
+ const outputStream = Writable.toWeb(this.agentProcess.stdin);
40
+ const inputStream = Readable.toWeb(this.agentProcess.stdout);
41
+ // Create the bidirectional stream using ndJsonStream
42
+ const stream = ndJsonStream(outputStream, inputStream);
43
+ // Create ACP client implementation factory
44
+ const self = this;
45
+ const clientFactory = (_agent) => {
46
+ return {
47
+ async requestPermission(params) {
48
+ // For now, auto-approve all permissions
49
+ // In a real implementation, this should prompt the user
50
+ console.log(`Permission requested:`, params);
51
+ // @ts-expect-error - Type mismatch with ACP SDK v0.5.1
52
+ return { outcome: "approved" };
53
+ },
54
+ async sessionUpdate(params) {
55
+ // Handle session updates from the agent
56
+ const paramsExtended = params;
57
+ const update = paramsExtended.update;
58
+ const sessionUpdate = {
59
+ sessionId: self.currentSessionId || params.sessionId,
60
+ status: "active",
61
+ };
62
+ // Queue message chunks if present - content is in update.content
63
+ if (update?.content) {
64
+ const content = update.content;
65
+ let chunk = null;
66
+ if (content.type === "text" && content.text) {
67
+ chunk = {
68
+ id: params.sessionId,
69
+ role: "assistant",
70
+ contentDelta: { type: "text", text: content.text },
71
+ isComplete: false,
72
+ };
73
+ }
74
+ else if (content.type === "tool_call") {
75
+ chunk = {
76
+ id: params.sessionId,
77
+ role: "assistant",
78
+ contentDelta: content,
79
+ isComplete: false,
80
+ };
81
+ }
82
+ if (chunk) {
83
+ // Resolve any waiting receive() calls immediately
84
+ const resolver = self.chunkResolvers.shift();
85
+ if (resolver) {
86
+ resolver(chunk);
87
+ }
88
+ else {
89
+ // Only queue if no resolver is waiting
90
+ self.messageQueue.push(chunk);
91
+ }
92
+ }
93
+ }
94
+ self.notifySessionUpdate(sessionUpdate);
95
+ },
96
+ async writeTextFile(params) {
97
+ const fs = await import("node:fs/promises");
98
+ await fs.writeFile(params.path, params.content, "utf-8");
99
+ return {};
100
+ },
101
+ async readTextFile(params) {
102
+ const fs = await import("node:fs/promises");
103
+ const content = await fs.readFile(params.path, "utf-8");
104
+ return { content };
105
+ },
106
+ };
107
+ };
108
+ // Create the client-side connection
109
+ this.connection = new ClientSideConnection(clientFactory, stream);
110
+ // Handle stderr for debugging
111
+ this.agentProcess.stderr.on("data", (data) => {
112
+ console.error(`Agent stderr: ${data}`);
113
+ });
114
+ // Handle process exit
115
+ this.agentProcess.on("exit", (code, signal) => {
116
+ this.connected = false;
117
+ const error = new Error(`Agent process exited with code ${code} and signal ${signal}`);
118
+ this.notifyError(error);
119
+ });
120
+ // Listen for connection closure
121
+ this.connection.closed.then(() => {
122
+ this.connected = false;
123
+ });
124
+ // Initialize the connection
125
+ const initResponse = await this.connection.initialize({
126
+ protocolVersion: PROTOCOL_VERSION,
127
+ clientCapabilities: {
128
+ fs: {
129
+ readTextFile: true,
130
+ writeTextFile: true,
131
+ },
132
+ },
133
+ });
134
+ console.log("ACP connection initialized:", initResponse);
135
+ this.connected = true;
136
+ }
137
+ catch (error) {
138
+ this.connected = false;
139
+ const err = error instanceof Error ? error : new Error(String(error));
140
+ this.notifyError(err);
141
+ throw err;
142
+ }
143
+ }
144
+ async disconnect() {
145
+ if (!this.connected) {
146
+ return;
147
+ }
148
+ try {
149
+ // Terminate the agent process (this will close the connection)
150
+ if (this.agentProcess) {
151
+ this.agentProcess.kill();
152
+ this.agentProcess = null;
153
+ }
154
+ // Wait for connection to close
155
+ if (this.connection) {
156
+ await this.connection.closed;
157
+ }
158
+ this.connection = null;
159
+ this.connected = false;
160
+ this.currentSessionId = null;
161
+ }
162
+ catch (error) {
163
+ const err = error instanceof Error ? error : new Error(String(error));
164
+ this.notifyError(err);
165
+ throw err;
166
+ }
167
+ }
168
+ async send(message) {
169
+ if (!this.connected || !this.connection) {
170
+ throw new Error("Transport not connected");
171
+ }
172
+ try {
173
+ // Reset stream state for new message
174
+ this.streamComplete = false;
175
+ this.messageQueue = [];
176
+ // If no session, create one first
177
+ if (!this.currentSessionId) {
178
+ const sessionResponse = await this.connection.newSession({
179
+ cwd: this.options.workingDirectory || process.cwd(),
180
+ mcpServers: [],
181
+ });
182
+ this.currentSessionId = sessionResponse.sessionId;
183
+ }
184
+ // Convert our message format to ACP prompt format
185
+ const textContent = message.content
186
+ .filter((c) => c.type === "text")
187
+ .map((c) => c.text)
188
+ .join("\n");
189
+ // Send the prompt - ACP expects "prompt" field with ContentBlock[]
190
+ const promptResponse = await this.connection.prompt({
191
+ sessionId: this.currentSessionId,
192
+ prompt: [
193
+ {
194
+ type: "text",
195
+ text: textContent,
196
+ },
197
+ ],
198
+ });
199
+ console.log("Prompt response:", promptResponse);
200
+ // Mark stream as complete after prompt finishes
201
+ this.streamComplete = true;
202
+ // Resolve any waiting receive() calls with completion
203
+ const resolver = this.chunkResolvers.shift();
204
+ if (resolver) {
205
+ resolver({
206
+ id: this.currentSessionId || "unknown",
207
+ role: "assistant",
208
+ contentDelta: { type: "text", text: "" },
209
+ isComplete: true,
210
+ });
211
+ }
212
+ }
213
+ catch (error) {
214
+ this.streamComplete = true;
215
+ const err = error instanceof Error ? error : new Error(String(error));
216
+ this.notifyError(err);
217
+ throw err;
218
+ }
219
+ }
220
+ async *receive() {
221
+ // Keep yielding chunks until stream is complete
222
+ while (!this.streamComplete) {
223
+ // Check if there are queued messages
224
+ if (this.messageQueue.length > 0) {
225
+ const chunk = this.messageQueue.shift();
226
+ if (chunk) {
227
+ yield chunk;
228
+ }
229
+ }
230
+ else {
231
+ // Wait for next chunk to arrive
232
+ const chunk = await new Promise((resolve) => {
233
+ this.chunkResolvers.push(resolve);
234
+ });
235
+ if (chunk.isComplete) {
236
+ yield chunk;
237
+ return;
238
+ }
239
+ else {
240
+ yield chunk;
241
+ }
242
+ }
243
+ }
244
+ // Yield any remaining queued messages
245
+ while (this.messageQueue.length > 0) {
246
+ const chunk = this.messageQueue.shift();
247
+ if (chunk) {
248
+ yield chunk;
249
+ }
250
+ }
251
+ // Mark the stream as complete
252
+ yield {
253
+ id: this.currentSessionId || "unknown",
254
+ role: "assistant",
255
+ contentDelta: { type: "text", text: "" },
256
+ isComplete: true,
257
+ };
258
+ }
259
+ isConnected() {
260
+ return this.connected;
261
+ }
262
+ onSessionUpdate(callback) {
263
+ this.sessionUpdateCallbacks.add(callback);
264
+ return () => {
265
+ this.sessionUpdateCallbacks.delete(callback);
266
+ };
267
+ }
268
+ onError(callback) {
269
+ this.errorCallbacks.add(callback);
270
+ return () => {
271
+ this.errorCallbacks.delete(callback);
272
+ };
273
+ }
274
+ notifySessionUpdate(update) {
275
+ for (const callback of this.sessionUpdateCallbacks) {
276
+ try {
277
+ callback(update);
278
+ }
279
+ catch (error) {
280
+ console.error("Error in session update callback:", error);
281
+ }
282
+ }
283
+ }
284
+ notifyError(error) {
285
+ for (const callback of this.errorCallbacks) {
286
+ try {
287
+ callback(error);
288
+ }
289
+ catch (err) {
290
+ console.error("Error in error callback:", err);
291
+ }
292
+ }
293
+ }
294
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/sdk/transports/stdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { Message, MessageChunk, SessionUpdate } from "../schemas/index.js";
2
+ /**
3
+ * Transport interface for different communication methods
4
+ */
5
+ export interface Transport {
6
+ /**
7
+ * Initialize the transport connection
8
+ */
9
+ connect(): Promise<void>;
10
+ /**
11
+ * Close the transport connection
12
+ */
13
+ disconnect(): Promise<void>;
14
+ /**
15
+ * Send a message through the transport
16
+ */
17
+ send(message: Message): Promise<void>;
18
+ /**
19
+ * Receive messages from the transport
20
+ * Returns an async iterator for streaming support
21
+ */
22
+ receive(): AsyncIterableIterator<MessageChunk>;
23
+ /**
24
+ * Get current connection status
25
+ */
26
+ isConnected(): boolean;
27
+ /**
28
+ * Subscribe to session updates
29
+ */
30
+ onSessionUpdate(callback: (update: SessionUpdate) => void): () => void;
31
+ /**
32
+ * Subscribe to errors
33
+ */
34
+ onError(callback: (error: Error) => void): () => void;
35
+ }
36
+ /**
37
+ * Stdio transport options
38
+ */
39
+ export interface StdioTransportOptions {
40
+ agentPath: string;
41
+ agentArgs?: string[];
42
+ environment?: Record<string, string>;
43
+ workingDirectory?: string;
44
+ timeout?: number;
45
+ }
46
+ /**
47
+ * HTTP transport options
48
+ */
49
+ export interface HttpTransportOptions {
50
+ baseUrl: string;
51
+ apiKey?: string;
52
+ timeout?: number;
53
+ headers?: Record<string, string>;
54
+ }
55
+ /**
56
+ * WebSocket transport options
57
+ */
58
+ export interface WebSocketTransportOptions {
59
+ url: string;
60
+ protocols?: string[];
61
+ reconnect?: boolean;
62
+ reconnectDelay?: number;
63
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sdk/transports/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;OAGG;IACH,OAAO,IAAI,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAE/C;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC;IAEvB;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAEvE;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/sdk/transports/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { Message, MessageChunk, SessionUpdate } from "../schemas/index.js";
2
+ import type { Transport, WebSocketTransportOptions } from "./types.js";
3
+ /**
4
+ * WebSocket transport implementation (STUB)
5
+ * Will be implemented when HTTP ACP server with WebSocket support is ready
6
+ */
7
+ export declare class WebSocketTransport implements Transport {
8
+ private ws;
9
+ private connected;
10
+ private sessionUpdateCallbacks;
11
+ private errorCallbacks;
12
+ constructor(_options: WebSocketTransportOptions);
13
+ connect(): Promise<void>;
14
+ disconnect(): Promise<void>;
15
+ send(_message: Message): Promise<void>;
16
+ receive(): AsyncIterableIterator<MessageChunk>;
17
+ isConnected(): boolean;
18
+ onSessionUpdate(callback: (update: SessionUpdate) => void): () => void;
19
+ onError(callback: (error: Error) => void): () => void;
20
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../../src/sdk/transports/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvE;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,sBAAsB,CAClB;IACZ,OAAO,CAAC,cAAc,CAA0C;gBAGpD,QAAQ,EAAE,yBAAyB;IAIzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAOxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,OAAO,IAAI,qBAAqB,CAAC,YAAY,CAAC;IAOrD,WAAW,IAAI,OAAO;IAItB,eAAe,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAOtE,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI;CAMtD"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * WebSocket transport implementation (STUB)
3
+ * Will be implemented when HTTP ACP server with WebSocket support is ready
4
+ */
5
+ export class WebSocketTransport {
6
+ ws = null;
7
+ connected = false;
8
+ sessionUpdateCallbacks = new Set();
9
+ errorCallbacks = new Set();
10
+ // biome-ignore lint/complexity/noUselessConstructor: Constructor needed for type compatibility with other transports
11
+ constructor(_options) {
12
+ // Options will be used when WebSocket transport is implemented
13
+ }
14
+ async connect() {
15
+ // TODO: Implement WebSocket connection
16
+ throw new Error("WebSocketTransport not yet implemented. Waiting for HTTP ACP server.");
17
+ }
18
+ async disconnect() {
19
+ if (this.ws) {
20
+ this.ws.close();
21
+ this.ws = null;
22
+ }
23
+ this.connected = false;
24
+ }
25
+ async send(_message) {
26
+ if (!this.connected || !this.ws) {
27
+ throw new Error("Transport not connected");
28
+ }
29
+ // TODO: Implement WebSocket message sending
30
+ throw new Error("WebSocketTransport not yet implemented. Waiting for HTTP ACP server.");
31
+ }
32
+ // biome-ignore lint/correctness/useYield: .
33
+ async *receive() {
34
+ // TODO: Implement WebSocket message receiving
35
+ throw new Error("WebSocketTransport not yet implemented. Waiting for HTTP ACP server.");
36
+ }
37
+ isConnected() {
38
+ return this.connected;
39
+ }
40
+ onSessionUpdate(callback) {
41
+ this.sessionUpdateCallbacks.add(callback);
42
+ return () => {
43
+ this.sessionUpdateCallbacks.delete(callback);
44
+ };
45
+ }
46
+ onError(callback) {
47
+ this.errorCallbacks.add(callback);
48
+ return () => {
49
+ this.errorCallbacks.delete(callback);
50
+ };
51
+ }
52
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/sdk/transports/websocket.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACrB,EAAE,GAAqB,IAAI,CAAC;IAC5B,SAAS,GAAG,KAAK,CAAC;IAClB,sBAAsB,GAC5B,IAAI,GAAG,EAAE,CAAC;IACJ,cAAc,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEhE,qHAAqH;IACrH,YAAY,QAAmC;QAC7C,+DAA+D;IACjE,CAAC;IAED,KAAK,CAAC,OAAO;QACX,uCAAuC;QACvC,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAiB;QAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,4CAA4C;QAC5C,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,CAAC,OAAO;QACZ,8CAA8C;QAC9C,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,eAAe,CAAC,QAAyC;QACvD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,QAAgC;QACtC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { AcpClient } from "../../sdk/client/index.js";
2
+ export interface ChatViewProps {
3
+ client: AcpClient | null;
4
+ }
5
+ export declare function ChatView({ client }: ChatViewProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatView.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ChatView.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,2CAyDjD"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box } from "ink";
3
+ import { useChatInput, useChatMessages, useChatSession, useChatStore, } from "../../core/index.js";
4
+ import { InputBox } from "./InputBox.js";
5
+ import { MessageList } from "./MessageList.js";
6
+ import { StatusBar } from "./StatusBar.js";
7
+ export function ChatView({ client }) {
8
+ const setIsStreaming = useChatStore((state) => state.setIsStreaming);
9
+ const streamingStartTime = useChatStore((state) => state.streamingStartTime);
10
+ // Use headless hooks for business logic
11
+ const { connectionStatus, sessionId } = useChatSession(client);
12
+ const { messages, isStreaming } = useChatMessages(client);
13
+ const { value, isSubmitting, attachedFiles, onChange, onSubmit } = useChatInput(client);
14
+ // Check if we're actively receiving content (hide waiting indicator)
15
+ const hasStreamingContent = messages.some((msg) => msg.isStreaming && msg.content.length > 0);
16
+ // Callbacks for keyboard shortcuts
17
+ const handleEscape = () => {
18
+ if (isStreaming) {
19
+ // TODO: Implement proper cancellation when SDK supports it
20
+ setIsStreaming(false);
21
+ }
22
+ };
23
+ return (_jsxs(Box, { flexDirection: "column", height: "100%", children: [_jsx(Box, { flexGrow: 1, flexDirection: "column", children: _jsx(MessageList, { messages: messages }) }), _jsx(InputBox, { value: value, isSubmitting: isSubmitting, attachedFiles: attachedFiles, onChange: onChange, onSubmit: onSubmit, onEscape: handleEscape }), _jsx(StatusBar, { connectionStatus: connectionStatus, sessionId: sessionId, isStreaming: isStreaming, streamingStartTime: streamingStartTime, hasStreamingContent: hasStreamingContent })] }));
24
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatView.js","sourceRoot":"","sources":["../../../src/tui/components/ChatView.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,GACb,MAAM,qBAAqB,CAAC;AAO7B,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAiB;IAChD,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACrE,MAAM,kBAAkB,GAAG,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAE7E,wCAAwC;IACxC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,EACJ,KAAK,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,YAAY,GACb,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEzB,qEAAqE;IACrE,MAAM,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CACvC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CACnD,CAAC;IAEF,mCAAmC;IACnC,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,WAAW,EAAE,CAAC;YAChB,2DAA2D;YAC3D,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,aAEvC,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,YACtC,KAAC,WAAW,IAAC,QAAQ,EAAE,QAAQ,GAAI,GAC/B,EAGN,KAAC,QAAQ,IACP,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,YAAY,GACtB,EAGF,KAAC,SAAS,IACR,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,kBAAkB,EAAE,kBAAkB,EACtC,mBAAmB,EAAE,mBAAmB,GACxC,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function GameOfLife(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GameOfLife.d.ts","sourceRoot":"","sources":["../../../src/tui/components/GameOfLife.tsx"],"names":[],"mappings":"AAyCA,wBAAgB,UAAU,4CA4BzB"}
@@ -0,0 +1,50 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { useEffect, useState } from "react";
4
+ const ROWS = 12;
5
+ const COLS = 60;
6
+ // Initialize with a random pattern
7
+ function createRandomGrid() {
8
+ return Array.from({ length: ROWS }, () => Array.from({ length: COLS }, () => Math.random() < 0.3));
9
+ }
10
+ // Count living neighbors
11
+ function countNeighbors(grid, row, col) {
12
+ let count = 0;
13
+ for (let i = -1; i <= 1; i++) {
14
+ for (let j = -1; j <= 1; j++) {
15
+ if (i === 0 && j === 0)
16
+ continue;
17
+ const newRow = (row + i + ROWS) % ROWS;
18
+ const newCol = (col + j + COLS) % COLS;
19
+ if (grid[newRow]?.[newCol])
20
+ count++;
21
+ }
22
+ }
23
+ return count;
24
+ }
25
+ // Compute next generation
26
+ function nextGeneration(grid) {
27
+ return grid.map((row, i) => row.map((cell, j) => {
28
+ const neighbors = countNeighbors(grid, i, j);
29
+ if (cell) {
30
+ return neighbors === 2 || neighbors === 3;
31
+ }
32
+ else {
33
+ return neighbors === 3;
34
+ }
35
+ }));
36
+ }
37
+ export function GameOfLife() {
38
+ const [grid, setGrid] = useState(createRandomGrid);
39
+ const [generation, setGeneration] = useState(0);
40
+ // Generate stable row IDs on mount
41
+ const rowIds = useState(() => Array.from({ length: ROWS }, (_, i) => `row-${i}`))[0];
42
+ useEffect(() => {
43
+ const interval = setInterval(() => {
44
+ setGrid((prevGrid) => nextGeneration(prevGrid));
45
+ setGeneration((prev) => prev + 1);
46
+ }, 150);
47
+ return () => clearInterval(interval);
48
+ }, []);
49
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsxs(Text, { color: "gray", italic: true, children: ["Conway's Game of Life (generation ", generation, ")"] }), grid.map((row, i) => (_jsx(Text, { color: "green", children: row.map((cell) => (cell ? "█" : " ")).join("") }, rowIds[i]))), _jsx(Text, { color: "gray", italic: true, children: "Start typing to begin..." })] }));
50
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GameOfLife.js","sourceRoot":"","sources":["../../../src/tui/components/GameOfLife.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface InputBoxProps {
2
+ value: string;
3
+ isSubmitting: boolean;
4
+ attachedFiles: Array<{
5
+ name: string;
6
+ path: string;
7
+ size: number;
8
+ }>;
9
+ onChange: (value: string) => void;
10
+ onSubmit: () => void;
11
+ onEscape?: () => void;
12
+ }
13
+ export declare function InputBox({ value, isSubmitting, attachedFiles, onChange, onSubmit, onEscape, }: InputBoxProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputBox.d.ts","sourceRoot":"","sources":["../../../src/tui/components/InputBox.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,GACT,EAAE,aAAa,2CAuCf"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useStdout } from "ink";
3
+ import { ReadlineInput } from "./ReadlineInput.js";
4
+ export function InputBox({ value, isSubmitting, attachedFiles, onChange, onSubmit, onEscape, }) {
5
+ const { stdout } = useStdout();
6
+ const terminalWidth = stdout?.columns || 80;
7
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "blue", children: "─".repeat(terminalWidth) }), attachedFiles.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingTop: 1, children: [_jsx(Text, { dimColor: true, children: "Attached files:" }), attachedFiles.map((file) => (_jsxs(Box, { children: [_jsxs(Text, { color: "cyan", children: [" ", file.name] }), _jsxs(Text, { dimColor: true, children: [" (", formatFileSize(file.size), ")"] })] }, file.path)))] })), _jsxs(Box, { paddingY: 1, children: [_jsx(Text, { bold: true, color: "blue", children: "> " }), isSubmitting ? (_jsx(Text, { color: "gray", italic: true, children: "Sending..." })) : onEscape ? (_jsx(ReadlineInput, { value: value, onChange: onChange, onSubmit: onSubmit, onEscape: onEscape, placeholder: "Type your message..." })) : (_jsx(ReadlineInput, { value: value, onChange: onChange, onSubmit: onSubmit, placeholder: "Type your message..." }))] }), _jsx(Text, { color: "blue", children: "─".repeat(terminalWidth) })] }));
8
+ }
9
+ function formatFileSize(bytes) {
10
+ if (bytes < 1024)
11
+ return `${bytes} B`;
12
+ if (bytes < 1024 * 1024)
13
+ return `${(bytes / 1024).toFixed(1)} KB`;
14
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
15
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputBox.js","sourceRoot":"","sources":["../../../src/tui/components/InputBox.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYnD,MAAM,UAAU,QAAQ,CAAC,EACvB,KAAK,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,GACM;IACd,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAE5C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAQ,EACpD,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAC3B,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,aACvC,KAAC,IAAI,IAAC,QAAQ,sCAAuB,EACpC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAClC,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAG,IAAI,CAAC,IAAI,IAAQ,EACtC,MAAC,IAAI,IAAC,QAAQ,yBAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAF5C,KAAK,CAGT,CACP,CAAC,IACE,CACP,EACD,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,aACd,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,YACpB,IAAI,GACA,EACN,YAAY,CAAC,CAAC,CAAC,CACd,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,iCAElB,CACR,CAAC,CAAC,CAAC,CACF,KAAC,aAAa,IACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAC,sBAAsB,GAClC,CACH,IACG,EACN,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAQ,IACjD,CACP,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DisplayMessage } from "../../core/index.js";
2
+ export interface MessageListProps {
3
+ messages: DisplayMessage[];
4
+ }
5
+ export declare function MessageList({ messages }: MessageListProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/tui/components/MessageList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CAYzD"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { GameOfLife } from "./GameOfLife.js";
4
+ export function MessageList({ messages }) {
5
+ return (_jsx(Box, { flexDirection: "column", paddingX: 1, paddingY: 1, children: messages.length === 0 ? (_jsx(GameOfLife, {})) : (messages.map((message) => (_jsx(Message, { message: message }, message.id)))) }));
6
+ }
7
+ function Message({ message }) {
8
+ const roleColor = message.role === "user"
9
+ ? "blue"
10
+ : message.role === "assistant"
11
+ ? "green"
12
+ : "gray";
13
+ const roleSymbol = message.role === "user" ? ">" : message.role === "assistant" ? "⏺" : "•";
14
+ const trimmedContent = message.content?.trim() || "";
15
+ return (_jsx(Box, { flexDirection: "column", marginY: 1, children: _jsxs(Box, { children: [_jsxs(Text, { bold: true, color: roleColor, children: [roleSymbol, " "] }), message.role === "user" ? (_jsx(Text, { backgroundColor: "gray", children: trimmedContent })) : (_jsx(Text, { children: trimmedContent }))] }) }));
16
+ }