grok-cli-hurry-mode 1.0.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 (137) hide show
  1. package/.grok/settings.json +3 -0
  2. package/LICENSE +21 -0
  3. package/README.md +452 -0
  4. package/dist/agent/grok-agent.d.ts +54 -0
  5. package/dist/agent/grok-agent.js +674 -0
  6. package/dist/agent/grok-agent.js.map +1 -0
  7. package/dist/agent/index.d.ts +14 -0
  8. package/dist/agent/index.js +137 -0
  9. package/dist/agent/index.js.map +1 -0
  10. package/dist/commands/mcp.d.ts +2 -0
  11. package/dist/commands/mcp.js +245 -0
  12. package/dist/commands/mcp.js.map +1 -0
  13. package/dist/grok/client.d.ts +49 -0
  14. package/dist/grok/client.js +85 -0
  15. package/dist/grok/client.js.map +1 -0
  16. package/dist/grok/tools.d.ts +8 -0
  17. package/dist/grok/tools.js +357 -0
  18. package/dist/grok/tools.js.map +1 -0
  19. package/dist/hooks/use-enhanced-input.d.ts +37 -0
  20. package/dist/hooks/use-enhanced-input.js +217 -0
  21. package/dist/hooks/use-enhanced-input.js.map +1 -0
  22. package/dist/hooks/use-input-handler.d.ts +34 -0
  23. package/dist/hooks/use-input-handler.js +611 -0
  24. package/dist/hooks/use-input-handler.js.map +1 -0
  25. package/dist/hooks/use-input-history.d.ts +9 -0
  26. package/dist/hooks/use-input-history.js +64 -0
  27. package/dist/hooks/use-input-history.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +151949 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/mcp/client.d.ts +29 -0
  32. package/dist/mcp/client.js +167 -0
  33. package/dist/mcp/client.js.map +1 -0
  34. package/dist/mcp/config.d.ts +13 -0
  35. package/dist/mcp/config.js +51 -0
  36. package/dist/mcp/config.js.map +1 -0
  37. package/dist/mcp/transports.d.ts +51 -0
  38. package/dist/mcp/transports.js +229 -0
  39. package/dist/mcp/transports.js.map +1 -0
  40. package/dist/node_modules/react/index.js +1841 -0
  41. package/dist/tools/bash.d.ts +10 -0
  42. package/dist/tools/bash.js +81 -0
  43. package/dist/tools/bash.js.map +1 -0
  44. package/dist/tools/confirmation-tool.d.ts +16 -0
  45. package/dist/tools/confirmation-tool.js +75 -0
  46. package/dist/tools/confirmation-tool.js.map +1 -0
  47. package/dist/tools/index.d.ts +6 -0
  48. package/dist/tools/index.js +16 -0
  49. package/dist/tools/index.js.map +1 -0
  50. package/dist/tools/morph-editor.d.ts +36 -0
  51. package/dist/tools/morph-editor.js +347 -0
  52. package/dist/tools/morph-editor.js.map +1 -0
  53. package/dist/tools/search.d.ts +69 -0
  54. package/dist/tools/search.js +341 -0
  55. package/dist/tools/search.js.map +1 -0
  56. package/dist/tools/text-editor.d.ts +16 -0
  57. package/dist/tools/text-editor.js +565 -0
  58. package/dist/tools/text-editor.js.map +1 -0
  59. package/dist/tools/todo-tool.d.ts +20 -0
  60. package/dist/tools/todo-tool.js +135 -0
  61. package/dist/tools/todo-tool.js.map +1 -0
  62. package/dist/types/index.d.ts +30 -0
  63. package/dist/types/index.js +3 -0
  64. package/dist/types/index.js.map +1 -0
  65. package/dist/ui/app.d.ts +7 -0
  66. package/dist/ui/app.js +160 -0
  67. package/dist/ui/app.js.map +1 -0
  68. package/dist/ui/components/api-key-input.d.ts +7 -0
  69. package/dist/ui/components/api-key-input.js +124 -0
  70. package/dist/ui/components/api-key-input.js.map +1 -0
  71. package/dist/ui/components/chat-history.d.ts +8 -0
  72. package/dist/ui/components/chat-history.js +177 -0
  73. package/dist/ui/components/chat-history.js.map +1 -0
  74. package/dist/ui/components/chat-input.d.ts +9 -0
  75. package/dist/ui/components/chat-input.js +87 -0
  76. package/dist/ui/components/chat-input.js.map +1 -0
  77. package/dist/ui/components/chat-interface.d.ts +8 -0
  78. package/dist/ui/components/chat-interface.js +344 -0
  79. package/dist/ui/components/chat-interface.js.map +1 -0
  80. package/dist/ui/components/command-suggestions.d.ts +17 -0
  81. package/dist/ui/components/command-suggestions.js +68 -0
  82. package/dist/ui/components/command-suggestions.js.map +1 -0
  83. package/dist/ui/components/confirmation-dialog.d.ts +11 -0
  84. package/dist/ui/components/confirmation-dialog.js +167 -0
  85. package/dist/ui/components/confirmation-dialog.js.map +1 -0
  86. package/dist/ui/components/diff-renderer.d.ts +13 -0
  87. package/dist/ui/components/diff-renderer.js +217 -0
  88. package/dist/ui/components/diff-renderer.js.map +1 -0
  89. package/dist/ui/components/loading-spinner.d.ts +8 -0
  90. package/dist/ui/components/loading-spinner.js +92 -0
  91. package/dist/ui/components/loading-spinner.js.map +1 -0
  92. package/dist/ui/components/mcp-status.d.ts +5 -0
  93. package/dist/ui/components/mcp-status.js +74 -0
  94. package/dist/ui/components/mcp-status.js.map +1 -0
  95. package/dist/ui/components/model-selection.d.ts +12 -0
  96. package/dist/ui/components/model-selection.js +28 -0
  97. package/dist/ui/components/model-selection.js.map +1 -0
  98. package/dist/ui/shared/max-sized-box.d.ts +8 -0
  99. package/dist/ui/shared/max-sized-box.js +15 -0
  100. package/dist/ui/shared/max-sized-box.js.map +1 -0
  101. package/dist/ui/utils/code-colorizer.d.ts +2 -0
  102. package/dist/ui/utils/code-colorizer.js +18 -0
  103. package/dist/ui/utils/code-colorizer.js.map +1 -0
  104. package/dist/ui/utils/colors.d.ts +14 -0
  105. package/dist/ui/utils/colors.js +18 -0
  106. package/dist/ui/utils/colors.js.map +1 -0
  107. package/dist/ui/utils/markdown-renderer.d.ts +4 -0
  108. package/dist/ui/utils/markdown-renderer.js +29 -0
  109. package/dist/ui/utils/markdown-renderer.js.map +1 -0
  110. package/dist/utils/confirmation-service.d.ts +33 -0
  111. package/dist/utils/confirmation-service.js +113 -0
  112. package/dist/utils/confirmation-service.js.map +1 -0
  113. package/dist/utils/custom-instructions.d.ts +1 -0
  114. package/dist/utils/custom-instructions.js +53 -0
  115. package/dist/utils/custom-instructions.js.map +1 -0
  116. package/dist/utils/model-config.d.ts +28 -0
  117. package/dist/utils/model-config.js +49 -0
  118. package/dist/utils/model-config.js.map +1 -0
  119. package/dist/utils/settings-manager.d.ts +94 -0
  120. package/dist/utils/settings-manager.js +275 -0
  121. package/dist/utils/settings-manager.js.map +1 -0
  122. package/dist/utils/settings.d.ts +1 -0
  123. package/dist/utils/settings.js +8 -0
  124. package/dist/utils/settings.js.map +1 -0
  125. package/dist/utils/text-utils.d.ts +80 -0
  126. package/dist/utils/text-utils.js +197 -0
  127. package/dist/utils/text-utils.js.map +1 -0
  128. package/dist/utils/token-counter.d.ts +33 -0
  129. package/dist/utils/token-counter.js +83 -0
  130. package/dist/utils/token-counter.js.map +1 -0
  131. package/dist/yoga.wasm +0 -0
  132. package/eslint.config.mjs +28 -0
  133. package/fix.awk +41 -0
  134. package/grok-logo-screenshot.png +0 -0
  135. package/package.json +68 -0
  136. package/sed_cmd.sh +35 -0
  137. package/temp.txt +29 -0
@@ -0,0 +1,33 @@
1
+ export declare class TokenCounter {
2
+ private encoder;
3
+ constructor(model?: string);
4
+ /**
5
+ * Count tokens in a string
6
+ */
7
+ countTokens(text: string): number;
8
+ /**
9
+ * Count tokens in messages array (for chat completions)
10
+ */
11
+ countMessageTokens(messages: Array<{
12
+ role: string;
13
+ content: string | null;
14
+ [key: string]: any;
15
+ }>): number;
16
+ /**
17
+ * Estimate tokens for streaming content
18
+ * This is an approximation since we don't have the full response yet
19
+ */
20
+ estimateStreamingTokens(accumulatedContent: string): number;
21
+ /**
22
+ * Clean up resources
23
+ */
24
+ dispose(): void;
25
+ }
26
+ /**
27
+ * Format token count for display (e.g., 1.2k for 1200)
28
+ */
29
+ export declare function formatTokenCount(count: number): string;
30
+ /**
31
+ * Create a token counter instance
32
+ */
33
+ export declare function createTokenCounter(model?: string): TokenCounter;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TokenCounter = void 0;
4
+ exports.formatTokenCount = formatTokenCount;
5
+ exports.createTokenCounter = createTokenCounter;
6
+ const tiktoken_1 = require("tiktoken");
7
+ class TokenCounter {
8
+ constructor(model = 'gpt-4') {
9
+ try {
10
+ // Try to get encoding for specific model
11
+ this.encoder = (0, tiktoken_1.encoding_for_model)(model);
12
+ }
13
+ catch {
14
+ // Fallback to cl100k_base (used by GPT-4 and most modern models)
15
+ this.encoder = (0, tiktoken_1.get_encoding)('cl100k_base');
16
+ }
17
+ }
18
+ /**
19
+ * Count tokens in a string
20
+ */
21
+ countTokens(text) {
22
+ if (!text)
23
+ return 0;
24
+ return this.encoder.encode(text).length;
25
+ }
26
+ /**
27
+ * Count tokens in messages array (for chat completions)
28
+ */
29
+ countMessageTokens(messages) {
30
+ let totalTokens = 0;
31
+ for (const message of messages) {
32
+ // Every message follows <|start|>{role/name}\n{content}<|end|\>\n
33
+ totalTokens += 3; // Base tokens per message
34
+ if (message.content && typeof message.content === 'string') {
35
+ totalTokens += this.countTokens(message.content);
36
+ }
37
+ if (message.role) {
38
+ totalTokens += this.countTokens(message.role);
39
+ }
40
+ // Add extra tokens for tool calls if present
41
+ if (message.tool_calls) {
42
+ totalTokens += this.countTokens(JSON.stringify(message.tool_calls));
43
+ }
44
+ }
45
+ totalTokens += 3; // Every reply is primed with <|start|>assistant<|message|>
46
+ return totalTokens;
47
+ }
48
+ /**
49
+ * Estimate tokens for streaming content
50
+ * This is an approximation since we don't have the full response yet
51
+ */
52
+ estimateStreamingTokens(accumulatedContent) {
53
+ return this.countTokens(accumulatedContent);
54
+ }
55
+ /**
56
+ * Clean up resources
57
+ */
58
+ dispose() {
59
+ this.encoder.free();
60
+ }
61
+ }
62
+ exports.TokenCounter = TokenCounter;
63
+ /**
64
+ * Format token count for display (e.g., 1.2k for 1200)
65
+ */
66
+ function formatTokenCount(count) {
67
+ if (count <= 999) {
68
+ return count.toString();
69
+ }
70
+ if (count < 1000000) {
71
+ const k = count / 1000;
72
+ return k % 1 === 0 ? `${k}k` : `${k.toFixed(1)}k`;
73
+ }
74
+ const m = count / 1000000;
75
+ return m % 1 === 0 ? `${m}m` : `${m.toFixed(1)}m`;
76
+ }
77
+ /**
78
+ * Create a token counter instance
79
+ */
80
+ function createTokenCounter(model) {
81
+ return new TokenCounter(model);
82
+ }
83
+ //# sourceMappingURL=token-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":";;;AAuEA,4CAYC;AAKD,gDAEC;AA1FD,uCAAsE;AAEtE,MAAa,YAAY;IAGvB,YAAY,QAAgB,OAAO;QACjC,IAAI,CAAC;YACH,yCAAyC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAA,6BAAkB,EAAC,KAAY,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;YACjE,IAAI,CAAC,OAAO,GAAG,IAAA,uBAAY,EAAC,aAAa,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY;QACtB,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAA6E;QAC9F,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,kEAAkE;YAClE,WAAW,IAAI,CAAC,CAAC,CAAC,0BAA0B;YAE5C,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC3D,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChD,CAAC;YAED,6CAA6C;YAC7C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,WAAW,IAAI,CAAC,CAAC,CAAC,2DAA2D;QAE7E,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,uBAAuB,CAAC,kBAA0B;QAChD,OAAO,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;CACF;AAhED,oCAgEC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,GAAG,OAAS,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,GAAG,KAAK,GAAG,OAAS,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAc;IAC/C,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
package/dist/yoga.wasm ADDED
Binary file
@@ -0,0 +1,28 @@
1
+ import typescriptEslint from '@typescript-eslint/eslint-plugin';
2
+ import typescriptParser from '@typescript-eslint/parser';
3
+
4
+ export default [
5
+ {
6
+ files: ['**/*.ts', '**/*.tsx'],
7
+ languageOptions: {
8
+ parser: typescriptParser,
9
+ ecmaVersion: 'latest',
10
+ sourceType: 'module',
11
+ globals: {
12
+ console: 'readonly',
13
+ process: 'readonly',
14
+ Buffer: 'readonly',
15
+ __dirname: 'readonly',
16
+ __filename: 'readonly',
17
+ global: 'readonly',
18
+ },
19
+ },
20
+ plugins: {
21
+ '@typescript-eslint': typescriptEslint,
22
+ },
23
+ rules: {
24
+ '@typescript-eslint/no-unused-vars': 'error',
25
+ '@typescript-eslint/no-explicit-any': 'warn',
26
+ },
27
+ },
28
+ ];
package/fix.awk ADDED
@@ -0,0 +1,41 @@
1
+ / \/\/ Generate logo with margin to match Ink paddingX={2}/ {
2
+ print " // Generate logo with margin to match Ink paddingX={2}"
3
+ print " const grokLogo = cfonts.render(\"GROK\", {"
4
+ print " font: \"3d\","
5
+ print " align: \"left\","
6
+ print " colors: [\"yellow\", \"red\"],"
7
+ print " space: true,"
8
+ print " maxLength: 0,"
9
+ print " gradient: [\"yellow\", \"red\", \"cyan\"],"
10
+ print " independentGradient: false,"
11
+ print " transitionGradient: true,"
12
+ print " env: \"node\","
13
+ print " });"
14
+ print ""
15
+ print " const hurryLogo = cfonts.render(\"HURRY MODE\", {"
16
+ print " font: \"simple\","
17
+ print " align: \"left\","
18
+ print " colors: [\"yellow\", \"red\"],"
19
+ print " space: true,"
20
+ print " maxLength: 0,"
21
+ print " gradient: [\"yellow\", \"red\", \"cyan\"],"
22
+ print " independentGradient: false,"
23
+ print " transitionGradient: true,"
24
+ print " env: \"node\","
25
+ print " });"
26
+ print ""
27
+ print " const logoOutput = grokLogo.string + \"\\\\n\" + hurryLogo.string;"
28
+ print ""
29
+ print " // Add horizontal margin (2 spaces) to match Ink paddingX={2}"
30
+ print " const logoLines = logoOutput.split(\"\\\\n\");"
31
+ skip = 1
32
+ next
33
+ }
34
+ / const logoLines = \(logoOutput as any\).string.split\("\\\\n"\);/ {
35
+ if (skip) {
36
+ skip = 0
37
+ next
38
+ }
39
+ }
40
+ skip { next }
41
+ { print }
Binary file
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "type": "module",
3
+ "name": "grok-cli-hurry-mode",
4
+ "version": "1.0.0",
5
+ "description": "An open-source AI agent that brings the power of Grok directly into your terminal.",
6
+ "main": "dist/index.js",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "types": "./dist/index.d.ts"
11
+ }
12
+ },
13
+ "bin": {
14
+ "grok": "dist/index.js"
15
+ },
16
+ "scripts": {
17
+ "build": "bun x tsc",
18
+ "build:bun": "bun run tsc",
19
+ "dev": "bun run src/index.ts",
20
+ "dev:node": "tsx src/index.ts",
21
+ "start": "node dist/index.js",
22
+ "start:bun": "bun run dist/index.js",
23
+ "lint": "eslint . --ext .js,.jsx,.ts,.tsx",
24
+ "typecheck": "tsc --noEmit",
25
+ "install:bun": "bun install"
26
+ },
27
+ "keywords": [
28
+ "cli",
29
+ "agent",
30
+ "text-editor",
31
+ "grok",
32
+ "ai"
33
+ ],
34
+ "author": "hinetapora",
35
+ "license": "MIT",
36
+ "dependencies": {
37
+ "@modelcontextprotocol/sdk": "^1.17.0",
38
+ "axios": "^1.7.0",
39
+ "cfonts": "^3.3.0",
40
+ "chalk": "^5.3.0",
41
+ "commander": "^12.0.0",
42
+ "dotenv": "^16.4.0",
43
+ "enquirer": "^2.4.1",
44
+ "fs-extra": "^11.2.0",
45
+ "ink": "^4.4.1",
46
+ "marked": "^15.0.12",
47
+ "marked-terminal": "^7.3.0",
48
+ "openai": "^5.10.1",
49
+ "react": "^18.3.1",
50
+ "ripgrep-node": "^1.0.0",
51
+ "tiktoken": "^1.0.21"
52
+ },
53
+ "devDependencies": {
54
+ "@eslint/js": "^9.37.0",
55
+ "@types/fs-extra": "^11.0.2",
56
+ "@types/node": "^20.8.0",
57
+ "@types/react": "^18.3.3",
58
+ "@typescript-eslint/eslint-plugin": "^8.37.0",
59
+ "@typescript-eslint/parser": "^8.37.0",
60
+ "esbuild": "^0.25.10",
61
+ "eslint": "^9.31.0",
62
+ "tsx": "^4.0.0"
63
+ },
64
+ "engines": {
65
+ "node": ">=18.0.0"
66
+ },
67
+ "preferGlobal": true
68
+ }
package/sed_cmd.sh ADDED
@@ -0,0 +1,35 @@
1
+ sed -i '' 's|const logoOutput = cfonts.render("GROK\\nHURRY MODE", {
2
+ font: "3d",
3
+ align: "left",
4
+ colors: ["yellow", "red"],
5
+ space: true,
6
+ maxLength: "0",
7
+ gradient: ["yellow", "red", "cyan"],
8
+ independentGradient: false,
9
+ transitionGradient: true,
10
+ env: "node",
11
+ });|const grokLogo = cfonts.render("GROK", {
12
+ font: "3d",
13
+ align: "left",
14
+ colors: ["yellow", "red"],
15
+ space: true,
16
+ maxLength: "0",
17
+ gradient: ["yellow", "red", "cyan"],
18
+ independentGradient: false,
19
+ transitionGradient: true,
20
+ env: "node",
21
+ });
22
+
23
+ const hurryLogo = cfonts.render("HURRY MODE", {
24
+ font: "simple",
25
+ align: "left",
26
+ colors: ["yellow", "red"],
27
+ space: true,
28
+ maxLength: "0",
29
+ gradient: ["yellow", "red", "cyan"],
30
+ independentGradient: false,
31
+ transitionGradient: true,
32
+ env: "node",
33
+ });
34
+
35
+ const logoOutput = grokLogo.string + "\\n" + hurryLogo.string;|g' src/ui/components/chat-interface.tsx
package/temp.txt ADDED
@@ -0,0 +1,29 @@
1
+ // Generate logo
2
+ const grokLogo = cfonts.render("GROK", {
3
+ font: "3d",
4
+ align: "left",
5
+ colors: ["yellow", "red"],
6
+ space: true,
7
+ maxLength: 0,
8
+ gradient: ["yellow", "red", "cyan"],
9
+ independentGradient: false,
10
+ transitionGradient: true,
11
+ env: "node",
12
+ });
13
+
14
+ const hurryLogo = cfonts.render("HURRY MODE", {
15
+ font: "simple",
16
+ align: "left",
17
+ colors: ["yellow", "red"],
18
+ space: true,
19
+ maxLength: 0,
20
+ gradient: ["yellow", "red", "cyan"],
21
+ independentGradient: false,
22
+ transitionGradient: true,
23
+ env: "node",
24
+ });
25
+
26
+ const logoOutput = grokLogo.string + "\n" + hurryLogo.string;
27
+
28
+ // Add horizontal margin (2 spaces) to match Ink paddingX={2}
29
+ const logoLines = logoOutput.split("\n");