@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,85 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import { Box, Text } from "ink";
3
+ /**
4
+ * Truncate backend/model display by removing vowel groups from left to right
5
+ * Vowel groups at the start of words are preserved
6
+ * @param display The display string to truncate
7
+ * @param maxLength Maximum length (default 38, which is 40 minus icon and nbsp)
8
+ */
9
+ function truncateBackendModel(display, maxLength = 38) {
10
+ if (display.length <= maxLength) {
11
+ return display;
12
+ }
13
+ const vowels = /[aeiou]/i;
14
+ const wordBoundary = /[:\/-]/;
15
+ // Track positions to remove
16
+ const toRemove = new Set();
17
+ let i = 0;
18
+ while (i < display.length) {
19
+ // Check if we've truncated enough
20
+ if (display.length - toRemove.size <= maxLength) {
21
+ break;
22
+ }
23
+ if (vowels.test(display[i])) {
24
+ // Check if at word start (beginning of string or after boundary)
25
+ const atWordStart = i === 0 || wordBoundary.test(display[i - 1]);
26
+ if (!atWordStart) {
27
+ // Mark consecutive vowels for removal
28
+ while (i < display.length && vowels.test(display[i])) {
29
+ toRemove.add(i);
30
+ i++;
31
+ }
32
+ continue;
33
+ }
34
+ }
35
+ i++;
36
+ }
37
+ // Build result without removed characters
38
+ return display
39
+ .split('')
40
+ .filter((_, idx) => !toRemove.has(idx))
41
+ .join('');
42
+ }
43
+ export const BackendStatus = React.memo(({ agent }) => {
44
+ const [model, setModel] = useState("");
45
+ useEffect(() => {
46
+ if (!agent) {
47
+ return;
48
+ }
49
+ // Get initial value
50
+ const initialModel = agent.getCurrentModel();
51
+ setModel(initialModel);
52
+ // Listen for model changes
53
+ const handleModelChange = (data) => {
54
+ setModel(data.model);
55
+ };
56
+ agent.on('modelChange', handleModelChange);
57
+ // Cleanup listener on unmount
58
+ return () => {
59
+ agent.off('modelChange', handleModelChange);
60
+ };
61
+ }, [agent]);
62
+ if (!agent) {
63
+ return null;
64
+ }
65
+ const backend = agent.getBackend();
66
+ let displayModel = model || agent.getCurrentModel();
67
+ // Strip -cloud suffix from model name only if backend is ollama-cloud
68
+ if (backend === 'ollama-cloud' && displayModel.includes('-cloud')) {
69
+ displayModel = displayModel.replace('-cloud', '');
70
+ }
71
+ // Get bot name from environment
72
+ const botName = process.env.ZDS_AI_AGENT_BOT_NAME;
73
+ // Build backend/model part
74
+ let backendModel = `${backend}/${displayModel}`;
75
+ // Truncate backend/model if needed (accounting for botName if present)
76
+ const maxBackendModelLength = botName ? 37 - botName.length : 38;
77
+ backendModel = truncateBackendModel(backendModel, maxBackendModelLength);
78
+ // Format: [botName:]backend/model
79
+ const display = botName ? `${botName}:${backendModel}` : backendModel;
80
+ return (React.createElement(Box, { marginRight: 2 },
81
+ React.createElement(Text, { color: "yellow" },
82
+ "\u224B\u00A0",
83
+ display)));
84
+ });
85
+ //# sourceMappingURL=backend-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-status.js","sourceRoot":"","sources":["../../../src/ui/components/backend-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;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,OAAe,EAAE,YAAoB,EAAE;IACnE,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC;IAC1B,MAAM,YAAY,GAAG,QAAQ,CAAC;IAE9B,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,kCAAkC;QAClC,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;YAChD,MAAM;QACR,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,iEAAiE;YACjE,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAEjE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,sCAAsC;gBACtC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAChB,CAAC,EAAE,CAAC;gBACN,CAAC;gBACD,SAAS;YACX,CAAC;QACH,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IAED,0CAA0C;IAC1C,OAAO,OAAO;SACX,KAAK,CAAC,EAAE,CAAC;SACT,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SACtC,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAsB,EAAE,EAAE;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;QAC7C,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEvB,2BAA2B;QAC3B,MAAM,iBAAiB,GAAG,CAAC,IAAuB,EAAE,EAAE;YACpD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAE3C,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;IACnC,IAAI,YAAY,GAAG,KAAK,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;IAEpD,sEAAsE;IACtE,IAAI,OAAO,KAAK,cAAc,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClE,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,gCAAgC;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAElD,2BAA2B;IAC3B,IAAI,YAAY,GAAG,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC;IAEhD,uEAAuE;IACvE,MAAM,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,YAAY,GAAG,oBAAoB,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAEzE,kCAAkC;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;IAEtE,OAAO,CACL,oBAAC,GAAG,IAAC,WAAW,EAAE,CAAC;QACjB,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ;;YACV,OAAO,CACV,CACH,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { ChatEntry } from "../../agent/grok-agent.js";
3
+ interface ChatHistoryProps {
4
+ entries: ChatEntry[];
5
+ isConfirmationActive?: boolean;
6
+ }
7
+ export declare function ChatHistory({ entries, isConfirmationActive, }: ChatHistoryProps): React.JSX.Element;
8
+ export {};
@@ -0,0 +1,187 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ import { DiffRenderer } from "./diff-renderer.js";
4
+ import { MarkdownRenderer } from "../utils/markdown-renderer.js";
5
+ const TRUNCATE_LINES = 3;
6
+ // Helper function to truncate content to first N lines
7
+ function truncateContent(content, maxLines = TRUNCATE_LINES) {
8
+ const lines = content.split("\n");
9
+ // Only truncate if we're hiding more than 2 lines (otherwise showing "… +1 lines" is worse UX)
10
+ if (lines.length <= maxLines + 2) {
11
+ return { truncated: content, hiddenLines: 0 };
12
+ }
13
+ const truncated = lines.slice(0, maxLines).join("\n");
14
+ const hiddenLines = lines.length - maxLines;
15
+ return { truncated, hiddenLines };
16
+ }
17
+ // Memoized ChatEntry component to prevent unnecessary re-renders
18
+ const MemoizedChatEntry = React.memo(({ entry, index }) => {
19
+ const renderDiff = (diffContent, filename) => {
20
+ return (React.createElement(DiffRenderer, { diffContent: diffContent, filename: filename, terminalWidth: 80 }));
21
+ };
22
+ const renderFileContent = (content) => {
23
+ const lines = content.split("\n");
24
+ // Calculate minimum indentation like DiffRenderer does
25
+ let baseIndentation = Infinity;
26
+ for (const line of lines) {
27
+ if (line.trim() === "")
28
+ continue;
29
+ const firstCharIndex = line.search(/\S/);
30
+ const currentIndent = firstCharIndex === -1 ? 0 : firstCharIndex;
31
+ baseIndentation = Math.min(baseIndentation, currentIndent);
32
+ }
33
+ if (!isFinite(baseIndentation)) {
34
+ baseIndentation = 0;
35
+ }
36
+ return lines.map((line, index) => {
37
+ const displayContent = line.substring(baseIndentation);
38
+ return (React.createElement(Text, { key: index, color: "gray" }, displayContent));
39
+ });
40
+ };
41
+ switch (entry.type) {
42
+ case "user":
43
+ return (React.createElement(Box, { key: index, flexDirection: "column", marginTop: 1 },
44
+ React.createElement(Box, null,
45
+ React.createElement(Text, { color: "gray" },
46
+ ">",
47
+ " ",
48
+ entry.content || ""))));
49
+ case "assistant":
50
+ return (React.createElement(Box, { key: index, flexDirection: "column", marginTop: 1 },
51
+ React.createElement(Box, { flexDirection: "row", alignItems: "flex-start" },
52
+ React.createElement(Text, { color: "white" }, "\u23FA "),
53
+ React.createElement(Box, { flexDirection: "column", flexGrow: 1 },
54
+ entry.preserveFormatting ? (
55
+ // Preserve formatting: split lines and render each line as-is
56
+ (() => {
57
+ const content = (entry.content || "").trim();
58
+ const lines = content.split('\n');
59
+ return (React.createElement(Box, { flexDirection: "column" }, lines.map((line, lineIdx) => (React.createElement(Text, { key: lineIdx, color: "white" }, line)))));
60
+ })()) : entry.tool_calls ? (
61
+ // If there are tool calls, just show plain text
62
+ React.createElement(Text, { color: "white" }, (entry.content || "").trim())) : (
63
+ // Normal chat: use MarkdownRenderer with reflowText
64
+ React.createElement(MarkdownRenderer, { content: (entry.content || "").trim() })),
65
+ entry.isStreaming && React.createElement(Text, { color: "cyan" }, "\u2588")))));
66
+ case "tool_call":
67
+ case "tool_result":
68
+ const getToolActionName = (toolName) => {
69
+ // Handle MCP tools with mcp__servername__toolname format
70
+ if (toolName.startsWith("mcp__")) {
71
+ const parts = toolName.split("__");
72
+ if (parts.length >= 3) {
73
+ const serverName = parts[1];
74
+ const actualToolName = parts.slice(2).join("__");
75
+ return `${serverName.charAt(0).toUpperCase() + serverName.slice(1)}/${actualToolName.replace(/_/g, " ")}`;
76
+ }
77
+ }
78
+ // Return the actual tool name from the function call
79
+ return toolName;
80
+ };
81
+ const toolName = entry.toolCall?.function?.name || "unknown tool";
82
+ const actionName = getToolActionName(toolName);
83
+ // If toolCall is completely missing, show error state
84
+ if (!entry.toolCall || !entry.toolCall.function) {
85
+ return (React.createElement(Box, { key: index, flexDirection: "column", marginTop: 1 },
86
+ React.createElement(Box, null,
87
+ React.createElement(Text, { color: "magenta" }, "\u23FA"),
88
+ React.createElement(Text, { color: "red" }, " [Missing tool call data]"))));
89
+ }
90
+ const getFilePath = (toolCall) => {
91
+ if (toolCall?.function?.arguments) {
92
+ try {
93
+ const args = JSON.parse(toolCall.function.arguments);
94
+ if (toolCall.function.name === "universalSearch") {
95
+ return args.query;
96
+ }
97
+ return args.path || args.file_path || args.command || "";
98
+ }
99
+ catch {
100
+ return "";
101
+ }
102
+ }
103
+ return "";
104
+ };
105
+ const filePath = getFilePath(entry.toolCall);
106
+ const isExecuting = entry.type === "tool_call" || !entry.toolResult;
107
+ // Format JSON content for better readability
108
+ const formatToolContent = (content, toolName) => {
109
+ if (toolName.startsWith("mcp__")) {
110
+ try {
111
+ // Try to parse as JSON and format it
112
+ const parsed = JSON.parse(content);
113
+ if (Array.isArray(parsed)) {
114
+ // For arrays, show a summary instead of full JSON
115
+ return `Found ${parsed.length} items`;
116
+ }
117
+ else if (typeof parsed === 'object') {
118
+ // For objects, show a formatted version
119
+ return JSON.stringify(parsed, null, 2);
120
+ }
121
+ }
122
+ catch {
123
+ // If not JSON, return as is
124
+ return content;
125
+ }
126
+ }
127
+ return content;
128
+ };
129
+ const shouldShowDiff = entry.toolCall?.function?.name === "str_replace_editor" &&
130
+ entry.toolResult?.success &&
131
+ entry.content.includes("Updated") &&
132
+ entry.content.includes("---") &&
133
+ entry.content.includes("+++");
134
+ const shouldShowFileContent = (entry.toolCall?.function?.name === "view_file" ||
135
+ entry.toolCall?.function?.name === "create_file") &&
136
+ entry.toolResult?.success &&
137
+ !shouldShowDiff;
138
+ return (React.createElement(Box, { key: index, flexDirection: "column", marginTop: 1 },
139
+ React.createElement(Box, null,
140
+ React.createElement(Text, { color: "magenta" }, "\u23FA"),
141
+ React.createElement(Text, { color: "white" },
142
+ " ",
143
+ filePath ? `${actionName}(${filePath})` : actionName)),
144
+ React.createElement(Box, { marginLeft: 2, flexDirection: "column" }, isExecuting ? (React.createElement(Text, { color: "cyan" }, "\u23BF Executing...")) : (() => {
145
+ const content = entry.content || "";
146
+ const displayOutput = entry.toolResult?.displayOutput;
147
+ // Only show displayOutput if it exists and provides additional value
148
+ const showDisplayOutput = displayOutput && displayOutput.trim() !== content.trim();
149
+ const { truncated, hiddenLines } = truncateContent(content);
150
+ return (React.createElement(React.Fragment, null,
151
+ showDisplayOutput && (React.createElement(Text, { color: "gray" },
152
+ "\u23BF ",
153
+ displayOutput)),
154
+ React.createElement(Text, { color: "gray" }, showDisplayOutput ? truncated : `⎿ ${truncated}`),
155
+ hiddenLines > 0 && (React.createElement(Text, { color: "gray", dimColor: true },
156
+ " \u2026 +",
157
+ hiddenLines,
158
+ " lines (ctrl+o to expand)"))));
159
+ })()),
160
+ shouldShowDiff && !isExecuting && (React.createElement(Box, { marginLeft: 4, flexDirection: "column" }, renderDiff(entry.content || "", filePath)))));
161
+ case "system":
162
+ return (React.createElement(Box, { key: index, flexDirection: "column", marginTop: 1 },
163
+ React.createElement(Box, null,
164
+ React.createElement(Text, { color: "blue" }, "\uD83D\uDD27 System: "),
165
+ React.createElement(Box, { flexDirection: "column", marginLeft: 2 },
166
+ React.createElement(Text, { color: "blue", dimColor: true },
167
+ (entry.content || "").split('\n').slice(0, 3).join('\n'),
168
+ (entry.content || "").split('\n').length > 3 ? '\n...' : '')))));
169
+ default:
170
+ return null;
171
+ }
172
+ });
173
+ MemoizedChatEntry.displayName = "MemoizedChatEntry";
174
+ export function ChatHistory({ entries, isConfirmationActive = false, }) {
175
+ // Filter out tool_call entries with "Executing..." when confirmation is active
176
+ const filteredEntries = isConfirmationActive
177
+ ? entries.filter((entry) => !(entry.type === "tool_call" && entry.content === "Executing..."))
178
+ : entries;
179
+ return (React.createElement(Box, { flexDirection: "column" }, filteredEntries.slice(-20).map((entry, index) => {
180
+ // Ensure timestamp is a Date object (defensive check)
181
+ const timestamp = entry.timestamp instanceof Date
182
+ ? entry.timestamp
183
+ : new Date(entry.timestamp);
184
+ return (React.createElement(MemoizedChatEntry, { key: `${timestamp.getTime()}-${index}`, entry: entry, index: index }));
185
+ })));
186
+ }
187
+ //# sourceMappingURL=chat-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-history.js","sourceRoot":"","sources":["../../../src/ui/components/chat-history.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ interface ChatInputProps {
3
+ input: string;
4
+ cursorPosition: number;
5
+ isProcessing: boolean;
6
+ isStreaming: boolean;
7
+ }
8
+ export declare const ChatInput: React.MemoExoticComponent<({ input, cursorPosition, isProcessing, isStreaming, }: ChatInputProps) => React.JSX.Element>;
9
+ export {};
@@ -0,0 +1,63 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ export const ChatInput = React.memo(({ input, cursorPosition, isProcessing, isStreaming, }) => {
4
+ const beforeCursor = input.slice(0, cursorPosition);
5
+ const afterCursor = input.slice(cursorPosition);
6
+ // Handle multiline input display
7
+ const lines = input.split("\n");
8
+ const isMultiline = lines.length > 1;
9
+ // Calculate cursor position across lines
10
+ let currentLineIndex = 0;
11
+ let currentCharIndex = 0;
12
+ let totalChars = 0;
13
+ for (let i = 0; i < lines.length; i++) {
14
+ if (totalChars + lines[i].length >= cursorPosition) {
15
+ currentLineIndex = i;
16
+ currentCharIndex = cursorPosition - totalChars;
17
+ break;
18
+ }
19
+ totalChars += lines[i].length + 1; // +1 for newline
20
+ }
21
+ const showCursor = !isProcessing && !isStreaming;
22
+ const borderColor = isProcessing || isStreaming ? "yellow" : "blue";
23
+ const promptColor = "cyan";
24
+ if (isMultiline) {
25
+ return (React.createElement(Box, { borderStyle: "round", borderColor: borderColor, paddingY: 0, marginTop: 1 }, lines.map((line, index) => {
26
+ const isCurrentLine = index === currentLineIndex;
27
+ const promptChar = index === 0 ? "❯" : "│";
28
+ if (isCurrentLine) {
29
+ const beforeCursorInLine = line.slice(0, currentCharIndex);
30
+ const cursorChar = line.slice(currentCharIndex, currentCharIndex + 1) || " ";
31
+ const afterCursorInLine = line.slice(currentCharIndex + 1);
32
+ return (React.createElement(Box, { key: index },
33
+ React.createElement(Text, { color: promptColor },
34
+ promptChar,
35
+ " "),
36
+ React.createElement(Text, null,
37
+ beforeCursorInLine,
38
+ showCursor && (React.createElement(Text, { backgroundColor: "white", color: "black" }, cursorChar)),
39
+ !showCursor && cursorChar !== " " && cursorChar,
40
+ afterCursorInLine)));
41
+ }
42
+ else {
43
+ return (React.createElement(Box, { key: index },
44
+ React.createElement(Text, { color: promptColor },
45
+ promptChar,
46
+ " "),
47
+ React.createElement(Text, null, line)));
48
+ }
49
+ })));
50
+ }
51
+ // Single line input box
52
+ const cursorChar = input.slice(cursorPosition, cursorPosition + 1) || " ";
53
+ const afterCursorText = input.slice(cursorPosition + 1);
54
+ return (React.createElement(Box, { borderStyle: "round", borderColor: borderColor, paddingX: 0, paddingY: 0, marginTop: 1 },
55
+ React.createElement(Box, null,
56
+ React.createElement(Text, { color: promptColor }, "\u276F "),
57
+ React.createElement(Text, null,
58
+ beforeCursor,
59
+ showCursor && (React.createElement(Text, { backgroundColor: "white", color: "black" }, cursorChar)),
60
+ !showCursor && cursorChar !== " " && cursorChar,
61
+ afterCursorText))));
62
+ });
63
+ //# sourceMappingURL=chat-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-input.js","sourceRoot":"","sources":["../../../src/ui/components/chat-input.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import { GrokAgent } from "../../agent/grok-agent.js";
3
+ interface ChatInterfaceProps {
4
+ agent?: GrokAgent;
5
+ initialMessage?: string;
6
+ fresh?: boolean;
7
+ }
8
+ export default function ChatInterface({ agent, initialMessage, fresh, }: ChatInterfaceProps): React.JSX.Element;
9
+ export {};