@zds-ai/cli 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 (204) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +497 -0
  3. package/dist/agent/grok-agent.d.ts +250 -0
  4. package/dist/agent/grok-agent.js +2480 -0
  5. package/dist/agent/grok-agent.js.map +1 -0
  6. package/dist/agent/index.d.ts +14 -0
  7. package/dist/agent/index.js +136 -0
  8. package/dist/agent/index.js.map +1 -0
  9. package/dist/commands/mcp.d.ts +2 -0
  10. package/dist/commands/mcp.js +239 -0
  11. package/dist/commands/mcp.js.map +1 -0
  12. package/dist/grok/client.d.ts +55 -0
  13. package/dist/grok/client.js +276 -0
  14. package/dist/grok/client.js.map +1 -0
  15. package/dist/grok/tools.d.ts +8 -0
  16. package/dist/grok/tools.js +878 -0
  17. package/dist/grok/tools.js.map +1 -0
  18. package/dist/hooks/use-enhanced-input.d.ts +38 -0
  19. package/dist/hooks/use-enhanced-input.js +228 -0
  20. package/dist/hooks/use-enhanced-input.js.map +1 -0
  21. package/dist/hooks/use-input-handler.d.ts +36 -0
  22. package/dist/hooks/use-input-handler.js +1099 -0
  23. package/dist/hooks/use-input-handler.js.map +1 -0
  24. package/dist/hooks/use-input-history.d.ts +9 -0
  25. package/dist/hooks/use-input-history.js +61 -0
  26. package/dist/hooks/use-input-history.js.map +1 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.js +869 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/mcp/client.d.ts +41 -0
  31. package/dist/mcp/client.js +224 -0
  32. package/dist/mcp/client.js.map +1 -0
  33. package/dist/mcp/config.d.ts +13 -0
  34. package/dist/mcp/config.js +56 -0
  35. package/dist/mcp/config.js.map +1 -0
  36. package/dist/mcp/transports.d.ts +53 -0
  37. package/dist/mcp/transports.js +256 -0
  38. package/dist/mcp/transports.js.map +1 -0
  39. package/dist/tools/character-tool.d.ts +27 -0
  40. package/dist/tools/character-tool.js +194 -0
  41. package/dist/tools/character-tool.js.map +1 -0
  42. package/dist/tools/clear-cache-tool.d.ts +14 -0
  43. package/dist/tools/clear-cache-tool.js +82 -0
  44. package/dist/tools/clear-cache-tool.js.map +1 -0
  45. package/dist/tools/confirmation-tool.d.ts +16 -0
  46. package/dist/tools/confirmation-tool.js +72 -0
  47. package/dist/tools/confirmation-tool.js.map +1 -0
  48. package/dist/tools/env-tool.d.ts +17 -0
  49. package/dist/tools/env-tool.js +89 -0
  50. package/dist/tools/env-tool.js.map +1 -0
  51. package/dist/tools/file-conversion-tool.d.ts +16 -0
  52. package/dist/tools/file-conversion-tool.js +181 -0
  53. package/dist/tools/file-conversion-tool.js.map +1 -0
  54. package/dist/tools/image-tool.d.ts +22 -0
  55. package/dist/tools/image-tool.js +268 -0
  56. package/dist/tools/image-tool.js.map +1 -0
  57. package/dist/tools/index.d.ts +14 -0
  58. package/dist/tools/index.js +15 -0
  59. package/dist/tools/index.js.map +1 -0
  60. package/dist/tools/internet-tool.d.ts +11 -0
  61. package/dist/tools/internet-tool.js +108 -0
  62. package/dist/tools/internet-tool.js.map +1 -0
  63. package/dist/tools/introspect-tool.d.ts +11 -0
  64. package/dist/tools/introspect-tool.js +243 -0
  65. package/dist/tools/introspect-tool.js.map +1 -0
  66. package/dist/tools/morph-editor.d.ts +38 -0
  67. package/dist/tools/morph-editor.js +318 -0
  68. package/dist/tools/morph-editor.js.map +1 -0
  69. package/dist/tools/restart-tool.d.ts +7 -0
  70. package/dist/tools/restart-tool.js +24 -0
  71. package/dist/tools/restart-tool.js.map +1 -0
  72. package/dist/tools/search.d.ts +71 -0
  73. package/dist/tools/search.js +340 -0
  74. package/dist/tools/search.js.map +1 -0
  75. package/dist/tools/task-tool.d.ts +19 -0
  76. package/dist/tools/task-tool.js +115 -0
  77. package/dist/tools/task-tool.js.map +1 -0
  78. package/dist/tools/text-editor.d.ts +35 -0
  79. package/dist/tools/text-editor.js +669 -0
  80. package/dist/tools/text-editor.js.map +1 -0
  81. package/dist/tools/tool-discovery.d.ts +20 -0
  82. package/dist/tools/tool-discovery.js +45 -0
  83. package/dist/tools/tool-discovery.js.map +1 -0
  84. package/dist/tools/zsh.d.ts +13 -0
  85. package/dist/tools/zsh.js +168 -0
  86. package/dist/tools/zsh.js.map +1 -0
  87. package/dist/types/index.d.ts +31 -0
  88. package/dist/types/index.js +2 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/ui/app.d.ts +7 -0
  91. package/dist/ui/app.js +99 -0
  92. package/dist/ui/app.js.map +1 -0
  93. package/dist/ui/components/active-task-status.d.ts +7 -0
  94. package/dist/ui/components/active-task-status.js +37 -0
  95. package/dist/ui/components/active-task-status.js.map +1 -0
  96. package/dist/ui/components/api-key-input.d.ts +7 -0
  97. package/dist/ui/components/api-key-input.js +80 -0
  98. package/dist/ui/components/api-key-input.js.map +1 -0
  99. package/dist/ui/components/backend-status.d.ts +7 -0
  100. package/dist/ui/components/backend-status.js +85 -0
  101. package/dist/ui/components/backend-status.js.map +1 -0
  102. package/dist/ui/components/chat-history.d.ts +8 -0
  103. package/dist/ui/components/chat-history.js +187 -0
  104. package/dist/ui/components/chat-history.js.map +1 -0
  105. package/dist/ui/components/chat-input.d.ts +9 -0
  106. package/dist/ui/components/chat-input.js +63 -0
  107. package/dist/ui/components/chat-input.js.map +1 -0
  108. package/dist/ui/components/chat-interface.d.ts +9 -0
  109. package/dist/ui/components/chat-interface.js +389 -0
  110. package/dist/ui/components/chat-interface.js.map +1 -0
  111. package/dist/ui/components/command-suggestions.d.ts +17 -0
  112. package/dist/ui/components/command-suggestions.js +22 -0
  113. package/dist/ui/components/command-suggestions.js.map +1 -0
  114. package/dist/ui/components/confirmation-dialog.d.ts +11 -0
  115. package/dist/ui/components/confirmation-dialog.js +105 -0
  116. package/dist/ui/components/confirmation-dialog.js.map +1 -0
  117. package/dist/ui/components/context-status.d.ts +7 -0
  118. package/dist/ui/components/context-status.js +36 -0
  119. package/dist/ui/components/context-status.js.map +1 -0
  120. package/dist/ui/components/diff-renderer.d.ts +13 -0
  121. package/dist/ui/components/diff-renderer.js +206 -0
  122. package/dist/ui/components/diff-renderer.js.map +1 -0
  123. package/dist/ui/components/loading-spinner.d.ts +8 -0
  124. package/dist/ui/components/loading-spinner.js +64 -0
  125. package/dist/ui/components/loading-spinner.js.map +1 -0
  126. package/dist/ui/components/mcp-status.d.ts +5 -0
  127. package/dist/ui/components/mcp-status.js +57 -0
  128. package/dist/ui/components/mcp-status.js.map +1 -0
  129. package/dist/ui/components/model-selection.d.ts +12 -0
  130. package/dist/ui/components/model-selection.js +17 -0
  131. package/dist/ui/components/model-selection.js.map +1 -0
  132. package/dist/ui/components/mood-status.d.ts +7 -0
  133. package/dist/ui/components/mood-status.js +34 -0
  134. package/dist/ui/components/mood-status.js.map +1 -0
  135. package/dist/ui/components/persona-status.d.ts +7 -0
  136. package/dist/ui/components/persona-status.js +34 -0
  137. package/dist/ui/components/persona-status.js.map +1 -0
  138. package/dist/ui/shared/max-sized-box.d.ts +8 -0
  139. package/dist/ui/shared/max-sized-box.js +6 -0
  140. package/dist/ui/shared/max-sized-box.js.map +1 -0
  141. package/dist/ui/utils/code-colorizer.d.ts +2 -0
  142. package/dist/ui/utils/code-colorizer.js +7 -0
  143. package/dist/ui/utils/code-colorizer.js.map +1 -0
  144. package/dist/ui/utils/colors.d.ts +14 -0
  145. package/dist/ui/utils/colors.js +15 -0
  146. package/dist/ui/utils/colors.js.map +1 -0
  147. package/dist/ui/utils/markdown-renderer.d.ts +4 -0
  148. package/dist/ui/utils/markdown-renderer.js +40 -0
  149. package/dist/ui/utils/markdown-renderer.js.map +1 -0
  150. package/dist/utils/auth-helper.d.ts +63 -0
  151. package/dist/utils/auth-helper.js +129 -0
  152. package/dist/utils/auth-helper.js.map +1 -0
  153. package/dist/utils/chat-history-manager-sqlite.d.ts +92 -0
  154. package/dist/utils/chat-history-manager-sqlite.js +334 -0
  155. package/dist/utils/chat-history-manager-sqlite.js.map +1 -0
  156. package/dist/utils/chat-history-manager.d.ts +87 -0
  157. package/dist/utils/chat-history-manager.js +273 -0
  158. package/dist/utils/chat-history-manager.js.map +1 -0
  159. package/dist/utils/chat-history-manager.json-backup.d.ts +69 -0
  160. package/dist/utils/chat-history-manager.json-backup.js +215 -0
  161. package/dist/utils/chat-history-manager.json-backup.js.map +1 -0
  162. package/dist/utils/confirmation-service.d.ts +46 -0
  163. package/dist/utils/confirmation-service.js +165 -0
  164. package/dist/utils/confirmation-service.js.map +1 -0
  165. package/dist/utils/custom-instructions.d.ts +1 -0
  166. package/dist/utils/custom-instructions.js +30 -0
  167. package/dist/utils/custom-instructions.js.map +1 -0
  168. package/dist/utils/database-connection.d.ts +27 -0
  169. package/dist/utils/database-connection.js +81 -0
  170. package/dist/utils/database-connection.js.map +1 -0
  171. package/dist/utils/database-schema.d.ts +17 -0
  172. package/dist/utils/database-schema.js +93 -0
  173. package/dist/utils/database-schema.js.map +1 -0
  174. package/dist/utils/error-logger.d.ts +13 -0
  175. package/dist/utils/error-logger.js +56 -0
  176. package/dist/utils/error-logger.js.map +1 -0
  177. package/dist/utils/hook-executor.d.ts +59 -0
  178. package/dist/utils/hook-executor.js +351 -0
  179. package/dist/utils/hook-executor.js.map +1 -0
  180. package/dist/utils/model-config.d.ts +28 -0
  181. package/dist/utils/model-config.js +42 -0
  182. package/dist/utils/model-config.js.map +1 -0
  183. package/dist/utils/path-utils.d.ts +4 -0
  184. package/dist/utils/path-utils.js +12 -0
  185. package/dist/utils/path-utils.js.map +1 -0
  186. package/dist/utils/settings-manager.d.ts +169 -0
  187. package/dist/utils/settings-manager.js +403 -0
  188. package/dist/utils/settings-manager.js.map +1 -0
  189. package/dist/utils/settings.d.ts +1 -0
  190. package/dist/utils/settings.js +4 -0
  191. package/dist/utils/settings.js.map +1 -0
  192. package/dist/utils/slash-commands.d.ts +25 -0
  193. package/dist/utils/slash-commands.js +454 -0
  194. package/dist/utils/slash-commands.js.map +1 -0
  195. package/dist/utils/startup-hook.d.ts +13 -0
  196. package/dist/utils/startup-hook.js +44 -0
  197. package/dist/utils/startup-hook.js.map +1 -0
  198. package/dist/utils/text-utils.d.ts +80 -0
  199. package/dist/utils/text-utils.js +182 -0
  200. package/dist/utils/text-utils.js.map +1 -0
  201. package/dist/utils/token-counter.d.ts +33 -0
  202. package/dist/utils/token-counter.js +78 -0
  203. package/dist/utils/token-counter.js.map +1 -0
  204. package/package.json +102 -0
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Professional diff renderer component
3
+ */
4
+ import React from 'react';
5
+ interface DiffRendererProps {
6
+ diffContent: string;
7
+ filename?: string;
8
+ tabWidth?: number;
9
+ availableTerminalHeight?: number;
10
+ terminalWidth?: number;
11
+ }
12
+ export declare const DiffRenderer: ({ diffContent, filename, tabWidth, availableTerminalHeight, terminalWidth, }: DiffRendererProps) => React.ReactElement;
13
+ export {};
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Professional diff renderer component
3
+ */
4
+ import React from 'react';
5
+ import { Box, Text } from 'ink';
6
+ import { Colors } from '../utils/colors.js';
7
+ import crypto from 'crypto';
8
+ import { MaxSizedBox } from '../shared/max-sized-box.js';
9
+ function parseDiffWithLineNumbers(diffContent) {
10
+ const lines = diffContent.split('\n');
11
+ const result = [];
12
+ let currentOldLine = 0;
13
+ let currentNewLine = 0;
14
+ let inHunk = false;
15
+ const hunkHeaderRegex = /^@@ -(\d+),?\d* \+(\d+),?\d* @@/;
16
+ for (const line of lines) {
17
+ const hunkMatch = line.match(hunkHeaderRegex);
18
+ if (hunkMatch) {
19
+ currentOldLine = parseInt(hunkMatch[1], 10);
20
+ currentNewLine = parseInt(hunkMatch[2], 10);
21
+ inHunk = true;
22
+ result.push({ type: 'hunk', content: line });
23
+ // We need to adjust the starting point because the first line number applies to the *first* actual line change/context,
24
+ // but we increment *before* pushing that line. So decrement here.
25
+ currentOldLine--;
26
+ currentNewLine--;
27
+ continue;
28
+ }
29
+ if (!inHunk) {
30
+ // Skip standard Git header lines more robustly
31
+ if (line.startsWith('--- ') ||
32
+ line.startsWith('+++ ') ||
33
+ line.startsWith('diff --git') ||
34
+ line.startsWith('index ') ||
35
+ line.startsWith('similarity index') ||
36
+ line.startsWith('rename from') ||
37
+ line.startsWith('rename to') ||
38
+ line.startsWith('new file mode') ||
39
+ line.startsWith('deleted file mode'))
40
+ continue;
41
+ // If it's not a hunk or header, skip (or handle as 'other' if needed)
42
+ continue;
43
+ }
44
+ if (line.startsWith('+')) {
45
+ currentNewLine++; // Increment before pushing
46
+ result.push({
47
+ type: 'add',
48
+ newLine: currentNewLine,
49
+ content: line.substring(1),
50
+ });
51
+ }
52
+ else if (line.startsWith('-')) {
53
+ currentOldLine++; // Increment before pushing
54
+ result.push({
55
+ type: 'del',
56
+ oldLine: currentOldLine,
57
+ content: line.substring(1),
58
+ });
59
+ }
60
+ else if (line.startsWith(' ')) {
61
+ currentOldLine++; // Increment before pushing
62
+ currentNewLine++;
63
+ result.push({
64
+ type: 'context',
65
+ oldLine: currentOldLine,
66
+ newLine: currentNewLine,
67
+ content: line.substring(1),
68
+ });
69
+ }
70
+ else if (line.startsWith('\\')) {
71
+ // Handle ""
72
+ result.push({ type: 'other', content: line });
73
+ }
74
+ }
75
+ return result;
76
+ }
77
+ const DEFAULT_TAB_WIDTH = 4; // Spaces per tab for normalization
78
+ export const DiffRenderer = ({ diffContent, filename, tabWidth = DEFAULT_TAB_WIDTH, availableTerminalHeight, terminalWidth = 80, }) => {
79
+ if (!diffContent || typeof diffContent !== 'string') {
80
+ return React.createElement(Text, { color: Colors.AccentYellow }, "No diff content.");
81
+ }
82
+ // Strip the first summary line (e.g. "Updated file.txt with 1 addition and 2 removals")
83
+ const lines = diffContent.split('\n');
84
+ const firstLine = lines[0];
85
+ let actualDiffContent = diffContent;
86
+ if (firstLine && (firstLine.startsWith('Updated ') || firstLine.startsWith('Created '))) {
87
+ actualDiffContent = lines.slice(1).join('\n');
88
+ }
89
+ const parsedLines = parseDiffWithLineNumbers(actualDiffContent);
90
+ if (parsedLines.length === 0) {
91
+ return React.createElement(Text, { dimColor: true }, "No changes detected.");
92
+ }
93
+ // Always render as diff format to show line numbers and + signs
94
+ const renderedOutput = renderDiffContent(parsedLines, filename, tabWidth, availableTerminalHeight, terminalWidth);
95
+ return React.createElement(React.Fragment, null, renderedOutput);
96
+ };
97
+ const renderDiffContent = (parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH, availableTerminalHeight, terminalWidth) => {
98
+ // 1. Normalize whitespace (replace tabs with spaces) *before* further processing
99
+ const normalizedLines = parsedLines.map((line) => ({
100
+ ...line,
101
+ content: line.content.replace(/\t/g, ' '.repeat(tabWidth)),
102
+ }));
103
+ // Filter out non-displayable lines (hunks, potentially 'other') using the normalized list
104
+ const displayableLines = normalizedLines.filter((l) => l.type !== 'hunk' && l.type !== 'other');
105
+ if (displayableLines.length === 0) {
106
+ return React.createElement(Text, { dimColor: true }, "No changes detected.");
107
+ }
108
+ // Calculate the minimum indentation across all displayable lines
109
+ let baseIndentation = Infinity; // Start high to find the minimum
110
+ for (const line of displayableLines) {
111
+ // Only consider lines with actual content for indentation calculation
112
+ if (line.content.trim() === '')
113
+ continue;
114
+ const firstCharIndex = line.content.search(/\S/); // Find index of first non-whitespace char
115
+ const currentIndent = firstCharIndex === -1 ? 0 : firstCharIndex; // Indent is 0 if no non-whitespace found
116
+ baseIndentation = Math.min(baseIndentation, currentIndent);
117
+ }
118
+ // If baseIndentation remained Infinity (e.g., no displayable lines with content), default to 0
119
+ if (!isFinite(baseIndentation)) {
120
+ baseIndentation = 0;
121
+ }
122
+ const key = filename
123
+ ? `diff-box-${filename}`
124
+ : `diff-box-${crypto.createHash('sha1').update(JSON.stringify(parsedLines)).digest('hex')}`;
125
+ let lastLineNumber = null;
126
+ const MAX_CONTEXT_LINES_WITHOUT_GAP = 5;
127
+ return (React.createElement(MaxSizedBox, { maxHeight: availableTerminalHeight, maxWidth: terminalWidth, key: key }, displayableLines.reduce((acc, line, index) => {
128
+ // Determine the relevant line number for gap calculation based on type
129
+ let relevantLineNumberForGapCalc = null;
130
+ if (line.type === 'add' || line.type === 'context') {
131
+ relevantLineNumberForGapCalc = line.newLine ?? null;
132
+ }
133
+ else if (line.type === 'del') {
134
+ // For deletions, the gap is typically in relation to the original file's line numbering
135
+ relevantLineNumberForGapCalc = line.oldLine ?? null;
136
+ }
137
+ if (lastLineNumber !== null &&
138
+ relevantLineNumberForGapCalc !== null &&
139
+ relevantLineNumberForGapCalc >
140
+ lastLineNumber + MAX_CONTEXT_LINES_WITHOUT_GAP + 1) {
141
+ acc.push(React.createElement(Box, { key: `gap-${index}` },
142
+ React.createElement(Text, { wrap: "truncate" }, '═'.repeat(terminalWidth))));
143
+ }
144
+ const lineKey = `diff-line-${index}`;
145
+ let gutterNumStr = '';
146
+ let backgroundColor = undefined;
147
+ let prefixSymbol = ' ';
148
+ let dim = false;
149
+ switch (line.type) {
150
+ case 'add':
151
+ gutterNumStr = (line.newLine ?? '').toString();
152
+ backgroundColor = '#86efac'; // Light green for additions
153
+ prefixSymbol = '+';
154
+ lastLineNumber = line.newLine ?? null;
155
+ break;
156
+ case 'del':
157
+ gutterNumStr = (line.oldLine ?? '').toString();
158
+ backgroundColor = 'redBright'; // Light red for deletions
159
+ prefixSymbol = '-';
160
+ // For deletions, update lastLineNumber based on oldLine if it's advancing.
161
+ // This helps manage gaps correctly if there are multiple consecutive deletions
162
+ // or if a deletion is followed by a context line far away in the original file.
163
+ if (line.oldLine !== undefined) {
164
+ lastLineNumber = line.oldLine;
165
+ }
166
+ break;
167
+ case 'context':
168
+ gutterNumStr = (line.newLine ?? '').toString();
169
+ dim = true;
170
+ prefixSymbol = ' ';
171
+ lastLineNumber = line.newLine ?? null;
172
+ break;
173
+ default:
174
+ return acc;
175
+ }
176
+ const displayContent = line.content.substring(baseIndentation);
177
+ acc.push(React.createElement(Box, { key: lineKey, flexDirection: "row" },
178
+ React.createElement(Text, { color: Colors.Gray, dimColor: dim }, gutterNumStr.padEnd(4)),
179
+ React.createElement(Text, { color: backgroundColor ? '#000000' : undefined, backgroundColor: backgroundColor, dimColor: !backgroundColor && dim },
180
+ prefixSymbol,
181
+ " "),
182
+ React.createElement(Text, { color: backgroundColor ? '#000000' : undefined, backgroundColor: backgroundColor, dimColor: !backgroundColor && dim, wrap: "wrap" }, displayContent)));
183
+ return acc;
184
+ }, [])));
185
+ };
186
+ const getLanguageFromExtension = (extension) => {
187
+ const languageMap = {
188
+ js: 'javascript',
189
+ ts: 'typescript',
190
+ py: 'python',
191
+ json: 'json',
192
+ css: 'css',
193
+ html: 'html',
194
+ sh: 'bash',
195
+ md: 'markdown',
196
+ yaml: 'yaml',
197
+ yml: 'yaml',
198
+ txt: 'plaintext',
199
+ java: 'java',
200
+ c: 'c',
201
+ cpp: 'cpp',
202
+ rb: 'ruby',
203
+ };
204
+ return languageMap[extension] || null; // Return null if extension not found
205
+ };
206
+ //# sourceMappingURL=diff-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-renderer.js","sourceRoot":"","sources":["../../../src/ui/components/diff-renderer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ interface LoadingSpinnerProps {
3
+ isActive: boolean;
4
+ processingTime: number;
5
+ tokenCount: number;
6
+ }
7
+ export declare const LoadingSpinner: React.MemoExoticComponent<({ isActive, processingTime, tokenCount, }: LoadingSpinnerProps) => React.JSX.Element>;
8
+ export {};
@@ -0,0 +1,64 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { formatTokenCount } from "../../utils/token-counter.js";
4
+ const loadingTexts = [
5
+ "Thinking...",
6
+ "Computing...",
7
+ "Analyzing...",
8
+ "Processing...",
9
+ "Calculating...",
10
+ "Interfacing...",
11
+ "Optimizing...",
12
+ "Synthesizing...",
13
+ "Decrypting...",
14
+ "Calibrating...",
15
+ "Bootstrapping...",
16
+ "Synchronizing...",
17
+ "Compiling...",
18
+ "Downloading...",
19
+ ];
20
+ const spinnerFrames = ["/", "-", "\\", "|"];
21
+ export const LoadingSpinner = React.memo(({ isActive, processingTime, tokenCount, }) => {
22
+ const [spinnerFrame, setSpinnerFrame] = useState(0);
23
+ const [loadingTextIndex, setLoadingTextIndex] = useState(0);
24
+ useEffect(() => {
25
+ if (!isActive)
26
+ return;
27
+ // Reduced frequency: 1000ms to reduce flickering
28
+ const interval = setInterval(() => {
29
+ setSpinnerFrame((prev) => (prev + 1) % spinnerFrames.length);
30
+ }, 1000);
31
+ return () => clearInterval(interval);
32
+ }, [isActive]);
33
+ useEffect(() => {
34
+ if (!isActive)
35
+ return;
36
+ setLoadingTextIndex(Math.floor(Math.random() * loadingTexts.length));
37
+ // Increased interval: 5s instead of 4s to reduce state changes
38
+ const interval = setInterval(() => {
39
+ setLoadingTextIndex(Math.floor(Math.random() * loadingTexts.length));
40
+ }, 5000);
41
+ return () => clearInterval(interval);
42
+ }, [isActive]);
43
+ if (!isActive)
44
+ return null;
45
+ return (React.createElement(Box, { marginTop: 1 },
46
+ React.createElement(Text, { color: "cyan" },
47
+ spinnerFrames[spinnerFrame],
48
+ " ",
49
+ loadingTexts[loadingTextIndex],
50
+ " "),
51
+ React.createElement(Text, { color: "gray" },
52
+ "(",
53
+ processingTime,
54
+ "s \u00B7 \u2191 ",
55
+ formatTokenCount(tokenCount),
56
+ " tokens \u00B7 esc to interrupt)")));
57
+ }, (prevProps, nextProps) => {
58
+ // Custom comparison to prevent unnecessary re-renders
59
+ // Only re-render if props actually changed
60
+ return (prevProps.isActive === nextProps.isActive &&
61
+ prevProps.processingTime === nextProps.processingTime &&
62
+ prevProps.tokenCount === nextProps.tokenCount);
63
+ });
64
+ //# sourceMappingURL=loading-spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-spinner.js","sourceRoot":"","sources":["../../../src/ui/components/loading-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAU,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAQhE,MAAM,YAAY,GAAG;IACnB,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,eAAe;IACf,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,cAAc;IACd,gBAAgB;CACjB,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EACxC,QAAQ,EACR,cAAc,EACd,UAAU,GACU,EAAE,EAAE;IACxB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,iDAAiD;QACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAErE,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,OAAO,CACL,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;QACf,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;YACf,aAAa,CAAC,YAAY,CAAC;;YAAG,YAAY,CAAC,gBAAgB,CAAC;YAAE,GAAG,CAC7D;QACP,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;YACd,cAAc;;YAAQ,gBAAgB,CAAC,UAAU,CAAC;+CAE/C,CACH,CACP,CAAC;AACJ,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE;IAC1B,sDAAsD;IACtD,2CAA2C;IAC3C,OAAO,CACL,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ;QACzC,SAAS,CAAC,cAAc,KAAK,SAAS,CAAC,cAAc;QACrD,SAAS,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,CAC9C,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ interface MCPStatusProps {
3
+ }
4
+ export declare function MCPStatus({}: MCPStatusProps): React.JSX.Element;
5
+ export {};
@@ -0,0 +1,57 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { getMCPManager } from "../../grok/tools.js";
4
+ export function MCPStatus({}) {
5
+ const [connectedServers, setConnectedServers] = useState([]);
6
+ const [availableTools, setAvailableTools] = useState([]);
7
+ useEffect(() => {
8
+ const updateStatus = async () => {
9
+ try {
10
+ const manager = getMCPManager();
11
+ const servers = manager.getServers();
12
+ const tools = await manager.getTools();
13
+ setConnectedServers(servers);
14
+ setAvailableTools(tools);
15
+ }
16
+ catch (error) {
17
+ // MCP manager not initialized yet
18
+ setConnectedServers([]);
19
+ setAvailableTools([]);
20
+ }
21
+ };
22
+ // Initial update with a small delay to allow MCP initialization
23
+ const initialTimer = setTimeout(updateStatus, 2000);
24
+ // Listen for MCP server events instead of polling
25
+ let manager;
26
+ try {
27
+ manager = getMCPManager();
28
+ // Update on server add/remove events
29
+ const handleServerChange = () => updateStatus();
30
+ manager.on('serverAdded', handleServerChange);
31
+ manager.on('serverRemoved', handleServerChange);
32
+ manager.on('serverError', handleServerChange);
33
+ // Cleanup listeners on unmount
34
+ return () => {
35
+ clearTimeout(initialTimer);
36
+ if (manager) {
37
+ manager.off('serverAdded', handleServerChange);
38
+ manager.off('serverRemoved', handleServerChange);
39
+ manager.off('serverError', handleServerChange);
40
+ }
41
+ };
42
+ }
43
+ catch (error) {
44
+ // MCP not available, just cleanup timer
45
+ return () => clearTimeout(initialTimer);
46
+ }
47
+ }, []);
48
+ if (connectedServers.length === 0) {
49
+ return null;
50
+ }
51
+ return (React.createElement(Box, { marginLeft: 1 },
52
+ React.createElement(Text, { color: "green" },
53
+ "\u2692 mcps: ",
54
+ connectedServers.length,
55
+ " ")));
56
+ }
57
+ //# sourceMappingURL=mcp-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-status.js","sourceRoot":"","sources":["../../../src/ui/components/mcp-status.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKpD,MAAM,UAAU,SAAS,CAAC,EAAkB;IAC1C,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IAEpE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;YAC9B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAEvC,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBAC7B,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,kCAAkC;gBAClC,mBAAmB,CAAC,EAAE,CAAC,CAAC;gBACxB,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;QAEF,gEAAgE;QAChE,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAEpD,kDAAkD;QAClD,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,aAAa,EAAE,CAAC;YAE1B,qCAAqC;YACrC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;YAChD,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;YAC9C,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;YAChD,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;YAE9C,+BAA+B;YAC/B,OAAO,GAAG,EAAE;gBACV,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3B,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;oBAC/C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;oBACjD,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wCAAwC;YACxC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;QAChB,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO;;YAAU,gBAAgB,CAAC,MAAM;gBAAS,CACzD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ interface ModelOption {
3
+ model: string;
4
+ }
5
+ interface ModelSelectionProps {
6
+ models: ModelOption[];
7
+ selectedIndex: number;
8
+ isVisible: boolean;
9
+ currentModel: string;
10
+ }
11
+ export declare function ModelSelection({ models, selectedIndex, isVisible, currentModel, }: ModelSelectionProps): React.JSX.Element;
12
+ export {};
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ export function ModelSelection({ models, selectedIndex, isVisible, currentModel, }) {
4
+ if (!isVisible)
5
+ return null;
6
+ return (React.createElement(Box, { marginTop: 1, flexDirection: "column" },
7
+ React.createElement(Box, { marginBottom: 1 },
8
+ React.createElement(Text, { color: "cyan" },
9
+ "Select Grok Model (current: ",
10
+ currentModel,
11
+ "):")),
12
+ models.map((modelOption, index) => (React.createElement(Box, { key: index, paddingLeft: 1 },
13
+ React.createElement(Text, { color: index === selectedIndex ? "black" : "white", backgroundColor: index === selectedIndex ? "cyan" : undefined }, modelOption.model)))),
14
+ React.createElement(Box, { marginTop: 1 },
15
+ React.createElement(Text, { color: "gray", dimColor: true }, "\u2191\u2193 navigate \u2022 Enter/Tab select \u2022 Esc cancel"))));
16
+ }
17
+ //# sourceMappingURL=model-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../../../src/ui/components/model-selection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAahC,MAAM,UAAU,cAAc,CAAC,EAC7B,MAAM,EACN,aAAa,EACb,SAAS,EACT,YAAY,GACQ;IACpB,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,OAAO,CACL,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;QACvC,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;gBAA8B,YAAY;qBAAU,CAClE;QACL,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,CAClC,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;YAC7B,oBAAC,IAAI,IACH,KAAK,EAAE,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAClD,eAAe,EAAE,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAE5D,WAAW,CAAC,KAAK,CACb,CACH,CACP,CAAC;QACF,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;YACf,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,4EAEpB,CACH,CACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ import { GrokAgent } from "../../agent/grok-agent.js";
3
+ interface MoodStatusProps {
4
+ agent?: GrokAgent;
5
+ }
6
+ export declare const MoodStatus: React.MemoExoticComponent<({ agent }: MoodStatusProps) => React.JSX.Element>;
7
+ export {};
@@ -0,0 +1,34 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import { Box, Text } from "ink";
3
+ export const MoodStatus = React.memo(({ agent }) => {
4
+ const [mood, setMood] = useState("");
5
+ const [color, setColor] = useState("white");
6
+ useEffect(() => {
7
+ if (!agent) {
8
+ return;
9
+ }
10
+ // Get initial value
11
+ const initialMood = agent.getMood();
12
+ const initialColor = agent.getMoodColor();
13
+ setMood(initialMood);
14
+ setColor(initialColor);
15
+ // Listen for mood changes
16
+ const handleMoodChange = (data) => {
17
+ setMood(data.mood);
18
+ setColor(data.color);
19
+ };
20
+ agent.on('moodChange', handleMoodChange);
21
+ // Cleanup listener on unmount
22
+ return () => {
23
+ agent.off('moodChange', handleMoodChange);
24
+ };
25
+ }, [agent]);
26
+ if (!agent || !mood) {
27
+ return null;
28
+ }
29
+ return (React.createElement(Box, { marginLeft: 1 },
30
+ React.createElement(Text, { color: color },
31
+ "\uD83D\uDCAD ",
32
+ mood.substring(0, 10))));
33
+ });
34
+ //# sourceMappingURL=mood-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mood-status.js","sourceRoot":"","sources":["../../../src/ui/components/mood-status.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAmB,EAAE,EAAE;IAClE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,OAAO,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1C,OAAO,CAAC,WAAW,CAAC,CAAC;QACrB,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEvB,0BAA0B;QAC1B,MAAM,gBAAgB,GAAG,CAAC,IAAqC,EAAE,EAAE;YACjE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAEzC,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;QAChB,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAY;;YACnB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CACpB,CACH,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ import { GrokAgent } from "../../agent/grok-agent.js";
3
+ interface PersonaStatusProps {
4
+ agent?: GrokAgent;
5
+ }
6
+ export declare const PersonaStatus: React.MemoExoticComponent<({ agent }: PersonaStatusProps) => React.JSX.Element>;
7
+ export {};
@@ -0,0 +1,34 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import { Box, Text } from "ink";
3
+ export const PersonaStatus = React.memo(({ agent }) => {
4
+ const [persona, setPersona] = useState("");
5
+ const [color, setColor] = useState("white");
6
+ useEffect(() => {
7
+ if (!agent) {
8
+ return;
9
+ }
10
+ // Get initial value
11
+ const initialPersona = agent.getPersona();
12
+ const initialColor = agent.getPersonaColor();
13
+ setPersona(initialPersona);
14
+ setColor(initialColor);
15
+ // Listen for persona changes
16
+ const handlePersonaChange = (data) => {
17
+ setPersona(data.persona);
18
+ setColor(data.color);
19
+ };
20
+ agent.on('personaChange', handlePersonaChange);
21
+ // Cleanup listener on unmount
22
+ return () => {
23
+ agent.off('personaChange', handlePersonaChange);
24
+ };
25
+ }, [agent]);
26
+ if (!agent || !persona) {
27
+ return null;
28
+ }
29
+ return (React.createElement(Box, { marginLeft: 1 },
30
+ React.createElement(Text, { color: color },
31
+ "\uD83C\uDFAD ",
32
+ persona.substring(0, 20))));
33
+ });
34
+ //# sourceMappingURL=persona-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-status.js","sourceRoot":"","sources":["../../../src/ui/components/persona-status.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAsB,EAAE,EAAE;IACxE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,OAAO,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;QAC7C,UAAU,CAAC,cAAc,CAAC,CAAC;QAC3B,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEvB,6BAA6B;QAC7B,MAAM,mBAAmB,GAAG,CAAC,IAAwC,EAAE,EAAE;YACvE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;QAE/C,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;QAChB,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAY;;YACnB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CACvB,CACH,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ interface MaxSizedBoxProps {
3
+ maxHeight?: number;
4
+ maxWidth?: number;
5
+ children: React.ReactNode;
6
+ }
7
+ export declare const MaxSizedBox: React.FC<MaxSizedBoxProps>;
8
+ export {};
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { Box } from 'ink';
3
+ export const MaxSizedBox = ({ maxHeight, maxWidth, children, ...props }) => {
4
+ return (React.createElement(Box, { flexDirection: "column", ...props }, children));
5
+ };
6
+ //# sourceMappingURL=max-sized-box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-sized-box.js","sourceRoot":"","sources":["../../../src/ui/shared/max-sized-box.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAQ1B,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EACtD,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,EAAE;IACH,OAAO,CACL,oBAAC,GAAG,IACF,aAAa,EAAC,QAAQ,KAClB,KAAK,IAER,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const colorizeCode: (content: string, language: string | null, availableTerminalHeight?: number, terminalWidth?: number) => React.ReactNode;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { Text, Box } from 'ink';
3
+ export const colorizeCode = (content, language, availableTerminalHeight, terminalWidth) => {
4
+ // Simple plain text rendering - could be enhanced with syntax highlighting later
5
+ return (React.createElement(Box, { flexDirection: "column" }, content.split('\n').map((line, index) => (React.createElement(Text, { key: index, wrap: "wrap" }, line)))));
6
+ };
7
+ //# sourceMappingURL=code-colorizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-colorizer.js","sourceRoot":"","sources":["../../../src/ui/utils/code-colorizer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAAe,EACf,QAAuB,EACvB,uBAAgC,EAChC,aAAsB,EACL,EAAE;IACnB,iFAAiF;IACjF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,IACxB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACxC,oBAAC,IAAI,IAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAC,MAAM,IAC1B,IAAI,CACA,CACR,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Color constants for the CLI interface
3
+ */
4
+ export declare const Colors: {
5
+ readonly AccentYellow: "yellow";
6
+ readonly Gray: "gray";
7
+ readonly Red: "red";
8
+ readonly Green: "green";
9
+ readonly Blue: "blue";
10
+ readonly Cyan: "cyan";
11
+ readonly Magenta: "magenta";
12
+ readonly White: "white";
13
+ readonly Black: "black";
14
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Color constants for the CLI interface
3
+ */
4
+ export const Colors = {
5
+ AccentYellow: 'yellow',
6
+ Gray: 'gray',
7
+ Red: 'red',
8
+ Green: 'green',
9
+ Blue: 'blue',
10
+ Cyan: 'cyan',
11
+ Magenta: 'magenta',
12
+ White: 'white',
13
+ Black: 'black'
14
+ };
15
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../../src/ui/utils/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,YAAY,EAAE,QAAQ;IACtB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACN,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare function MarkdownRenderer({ content }: {
3
+ content: string;
4
+ }): React.JSX.Element;