@xiuper/cli 0.0.1

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 (218) hide show
  1. package/README.md +180 -0
  2. package/dist/jsMain/typescript/agents/LLMService.d.ts +40 -0
  3. package/dist/jsMain/typescript/agents/LLMService.d.ts.map +1 -0
  4. package/dist/jsMain/typescript/agents/LLMService.js +156 -0
  5. package/dist/jsMain/typescript/agents/LLMService.js.map +1 -0
  6. package/dist/jsMain/typescript/agents/ServerAgentClient.d.ts +103 -0
  7. package/dist/jsMain/typescript/agents/ServerAgentClient.d.ts.map +1 -0
  8. package/dist/jsMain/typescript/agents/ServerAgentClient.js +142 -0
  9. package/dist/jsMain/typescript/agents/ServerAgentClient.js.map +1 -0
  10. package/dist/jsMain/typescript/agents/render/BaseRenderer.d.ts +87 -0
  11. package/dist/jsMain/typescript/agents/render/BaseRenderer.d.ts.map +1 -0
  12. package/dist/jsMain/typescript/agents/render/BaseRenderer.js +128 -0
  13. package/dist/jsMain/typescript/agents/render/BaseRenderer.js.map +1 -0
  14. package/dist/jsMain/typescript/agents/render/CliRenderer.d.ts +51 -0
  15. package/dist/jsMain/typescript/agents/render/CliRenderer.d.ts.map +1 -0
  16. package/dist/jsMain/typescript/agents/render/CliRenderer.js +564 -0
  17. package/dist/jsMain/typescript/agents/render/CliRenderer.js.map +1 -0
  18. package/dist/jsMain/typescript/agents/render/ServerRenderer.d.ts +55 -0
  19. package/dist/jsMain/typescript/agents/render/ServerRenderer.d.ts.map +1 -0
  20. package/dist/jsMain/typescript/agents/render/ServerRenderer.js +503 -0
  21. package/dist/jsMain/typescript/agents/render/ServerRenderer.js.map +1 -0
  22. package/dist/jsMain/typescript/agents/render/TuiRenderer.d.ts +104 -0
  23. package/dist/jsMain/typescript/agents/render/TuiRenderer.d.ts.map +1 -0
  24. package/dist/jsMain/typescript/agents/render/TuiRenderer.js +279 -0
  25. package/dist/jsMain/typescript/agents/render/TuiRenderer.js.map +1 -0
  26. package/dist/jsMain/typescript/config/ConfigManager.d.ts +146 -0
  27. package/dist/jsMain/typescript/config/ConfigManager.d.ts.map +1 -0
  28. package/dist/jsMain/typescript/config/ConfigManager.js +257 -0
  29. package/dist/jsMain/typescript/config/ConfigManager.js.map +1 -0
  30. package/dist/jsMain/typescript/constants/asciiArt.d.ts +9 -0
  31. package/dist/jsMain/typescript/constants/asciiArt.d.ts.map +1 -0
  32. package/dist/jsMain/typescript/constants/asciiArt.js +47 -0
  33. package/dist/jsMain/typescript/constants/asciiArt.js.map +1 -0
  34. package/dist/jsMain/typescript/design-system/colors.d.ts +492 -0
  35. package/dist/jsMain/typescript/design-system/colors.d.ts.map +1 -0
  36. package/dist/jsMain/typescript/design-system/colors.js +333 -0
  37. package/dist/jsMain/typescript/design-system/colors.js.map +1 -0
  38. package/dist/jsMain/typescript/design-system/index.d.ts +31 -0
  39. package/dist/jsMain/typescript/design-system/index.d.ts.map +1 -0
  40. package/dist/jsMain/typescript/design-system/index.js +195 -0
  41. package/dist/jsMain/typescript/design-system/index.js.map +1 -0
  42. package/dist/jsMain/typescript/design-system/theme-helpers.d.ts +161 -0
  43. package/dist/jsMain/typescript/design-system/theme-helpers.d.ts.map +1 -0
  44. package/dist/jsMain/typescript/design-system/theme-helpers.js +153 -0
  45. package/dist/jsMain/typescript/design-system/theme-helpers.js.map +1 -0
  46. package/dist/jsMain/typescript/i18n/index.d.ts +37 -0
  47. package/dist/jsMain/typescript/i18n/index.d.ts.map +1 -0
  48. package/dist/jsMain/typescript/i18n/index.js +139 -0
  49. package/dist/jsMain/typescript/i18n/index.js.map +1 -0
  50. package/dist/jsMain/typescript/i18n/locales/en.d.ts +6 -0
  51. package/dist/jsMain/typescript/i18n/locales/en.d.ts.map +1 -0
  52. package/dist/jsMain/typescript/i18n/locales/en.js +120 -0
  53. package/dist/jsMain/typescript/i18n/locales/en.js.map +1 -0
  54. package/dist/jsMain/typescript/i18n/locales/zh.d.ts +6 -0
  55. package/dist/jsMain/typescript/i18n/locales/zh.d.ts.map +1 -0
  56. package/dist/jsMain/typescript/i18n/locales/zh.js +120 -0
  57. package/dist/jsMain/typescript/i18n/locales/zh.js.map +1 -0
  58. package/dist/jsMain/typescript/i18n/types.d.ts +124 -0
  59. package/dist/jsMain/typescript/i18n/types.d.ts.map +1 -0
  60. package/dist/jsMain/typescript/i18n/types.js +7 -0
  61. package/dist/jsMain/typescript/i18n/types.js.map +1 -0
  62. package/dist/jsMain/typescript/index.d.ts +9 -0
  63. package/dist/jsMain/typescript/index.d.ts.map +1 -0
  64. package/dist/jsMain/typescript/index.js +380 -0
  65. package/dist/jsMain/typescript/index.js.map +1 -0
  66. package/dist/jsMain/typescript/modes/AgentMode.d.ts +33 -0
  67. package/dist/jsMain/typescript/modes/AgentMode.d.ts.map +1 -0
  68. package/dist/jsMain/typescript/modes/AgentMode.js +243 -0
  69. package/dist/jsMain/typescript/modes/AgentMode.js.map +1 -0
  70. package/dist/jsMain/typescript/modes/ChatMode.d.ts +30 -0
  71. package/dist/jsMain/typescript/modes/ChatMode.d.ts.map +1 -0
  72. package/dist/jsMain/typescript/modes/ChatMode.js +260 -0
  73. package/dist/jsMain/typescript/modes/ChatMode.js.map +1 -0
  74. package/dist/jsMain/typescript/modes/DocumentMode.d.ts +26 -0
  75. package/dist/jsMain/typescript/modes/DocumentMode.d.ts.map +1 -0
  76. package/dist/jsMain/typescript/modes/DocumentMode.js +217 -0
  77. package/dist/jsMain/typescript/modes/DocumentMode.js.map +1 -0
  78. package/dist/jsMain/typescript/modes/Mode.d.ts +72 -0
  79. package/dist/jsMain/typescript/modes/Mode.d.ts.map +1 -0
  80. package/dist/jsMain/typescript/modes/Mode.js +7 -0
  81. package/dist/jsMain/typescript/modes/Mode.js.map +1 -0
  82. package/dist/jsMain/typescript/modes/ModeManager.d.ts +76 -0
  83. package/dist/jsMain/typescript/modes/ModeManager.d.ts.map +1 -0
  84. package/dist/jsMain/typescript/modes/ModeManager.js +156 -0
  85. package/dist/jsMain/typescript/modes/ModeManager.js.map +1 -0
  86. package/dist/jsMain/typescript/modes/ReviewMode.d.ts +52 -0
  87. package/dist/jsMain/typescript/modes/ReviewMode.d.ts.map +1 -0
  88. package/dist/jsMain/typescript/modes/ReviewMode.js +435 -0
  89. package/dist/jsMain/typescript/modes/ReviewMode.js.map +1 -0
  90. package/dist/jsMain/typescript/modes/index.d.ts +9 -0
  91. package/dist/jsMain/typescript/modes/index.d.ts.map +1 -0
  92. package/dist/jsMain/typescript/modes/index.js +7 -0
  93. package/dist/jsMain/typescript/modes/index.js.map +1 -0
  94. package/dist/jsMain/typescript/processors/AtCommandProcessor.d.ts +34 -0
  95. package/dist/jsMain/typescript/processors/AtCommandProcessor.d.ts.map +1 -0
  96. package/dist/jsMain/typescript/processors/AtCommandProcessor.js +118 -0
  97. package/dist/jsMain/typescript/processors/AtCommandProcessor.js.map +1 -0
  98. package/dist/jsMain/typescript/processors/InputRouter.d.ts +84 -0
  99. package/dist/jsMain/typescript/processors/InputRouter.d.ts.map +1 -0
  100. package/dist/jsMain/typescript/processors/InputRouter.js +78 -0
  101. package/dist/jsMain/typescript/processors/InputRouter.js.map +1 -0
  102. package/dist/jsMain/typescript/processors/ModeCommandProcessor.d.ts +25 -0
  103. package/dist/jsMain/typescript/processors/ModeCommandProcessor.d.ts.map +1 -0
  104. package/dist/jsMain/typescript/processors/ModeCommandProcessor.js +127 -0
  105. package/dist/jsMain/typescript/processors/ModeCommandProcessor.js.map +1 -0
  106. package/dist/jsMain/typescript/processors/SlashCommandProcessor.d.ts +68 -0
  107. package/dist/jsMain/typescript/processors/SlashCommandProcessor.d.ts.map +1 -0
  108. package/dist/jsMain/typescript/processors/SlashCommandProcessor.js +391 -0
  109. package/dist/jsMain/typescript/processors/SlashCommandProcessor.js.map +1 -0
  110. package/dist/jsMain/typescript/processors/VariableProcessor.d.ts +44 -0
  111. package/dist/jsMain/typescript/processors/VariableProcessor.d.ts.map +1 -0
  112. package/dist/jsMain/typescript/processors/VariableProcessor.js +105 -0
  113. package/dist/jsMain/typescript/processors/VariableProcessor.js.map +1 -0
  114. package/dist/jsMain/typescript/ui/App.d.ts +16 -0
  115. package/dist/jsMain/typescript/ui/App.d.ts.map +1 -0
  116. package/dist/jsMain/typescript/ui/App.js +208 -0
  117. package/dist/jsMain/typescript/ui/App.js.map +1 -0
  118. package/dist/jsMain/typescript/ui/Banner.d.ts +6 -0
  119. package/dist/jsMain/typescript/ui/Banner.d.ts.map +1 -0
  120. package/dist/jsMain/typescript/ui/Banner.js +13 -0
  121. package/dist/jsMain/typescript/ui/Banner.js.map +1 -0
  122. package/dist/jsMain/typescript/ui/ChatInterface.d.ts +19 -0
  123. package/dist/jsMain/typescript/ui/ChatInterface.d.ts.map +1 -0
  124. package/dist/jsMain/typescript/ui/ChatInterface.js +223 -0
  125. package/dist/jsMain/typescript/ui/ChatInterface.js.map +1 -0
  126. package/dist/jsMain/typescript/ui/CommandSuggestions.d.ts +21 -0
  127. package/dist/jsMain/typescript/ui/CommandSuggestions.d.ts.map +1 -0
  128. package/dist/jsMain/typescript/ui/CommandSuggestions.js +43 -0
  129. package/dist/jsMain/typescript/ui/CommandSuggestions.js.map +1 -0
  130. package/dist/jsMain/typescript/ui/LanguageSwitcher.d.ts +11 -0
  131. package/dist/jsMain/typescript/ui/LanguageSwitcher.d.ts.map +1 -0
  132. package/dist/jsMain/typescript/ui/LanguageSwitcher.js +37 -0
  133. package/dist/jsMain/typescript/ui/LanguageSwitcher.js.map +1 -0
  134. package/dist/jsMain/typescript/ui/MessageRenderer.d.ts +70 -0
  135. package/dist/jsMain/typescript/ui/MessageRenderer.d.ts.map +1 -0
  136. package/dist/jsMain/typescript/ui/MessageRenderer.js +255 -0
  137. package/dist/jsMain/typescript/ui/MessageRenderer.js.map +1 -0
  138. package/dist/jsMain/typescript/ui/ModelConfigForm.d.ts +19 -0
  139. package/dist/jsMain/typescript/ui/ModelConfigForm.d.ts.map +1 -0
  140. package/dist/jsMain/typescript/ui/ModelConfigForm.js +257 -0
  141. package/dist/jsMain/typescript/ui/ModelConfigForm.js.map +1 -0
  142. package/dist/jsMain/typescript/ui/WelcomeScreen.d.ts +12 -0
  143. package/dist/jsMain/typescript/ui/WelcomeScreen.d.ts.map +1 -0
  144. package/dist/jsMain/typescript/ui/WelcomeScreen.js +93 -0
  145. package/dist/jsMain/typescript/ui/WelcomeScreen.js.map +1 -0
  146. package/dist/jsMain/typescript/utils/commandUtils.d.ts +64 -0
  147. package/dist/jsMain/typescript/utils/commandUtils.d.ts.map +1 -0
  148. package/dist/jsMain/typescript/utils/commandUtils.js +195 -0
  149. package/dist/jsMain/typescript/utils/commandUtils.js.map +1 -0
  150. package/dist/jsMain/typescript/utils/domainDictUtils.d.ts +53 -0
  151. package/dist/jsMain/typescript/utils/domainDictUtils.d.ts.map +1 -0
  152. package/dist/jsMain/typescript/utils/domainDictUtils.js +130 -0
  153. package/dist/jsMain/typescript/utils/domainDictUtils.js.map +1 -0
  154. package/dist/jsMain/typescript/utils/markdownSplitter.d.ts +23 -0
  155. package/dist/jsMain/typescript/utils/markdownSplitter.d.ts.map +1 -0
  156. package/dist/jsMain/typescript/utils/markdownSplitter.js +90 -0
  157. package/dist/jsMain/typescript/utils/markdownSplitter.js.map +1 -0
  158. package/dist/jsMain/typescript/utils/outputFormatter.d.ts +70 -0
  159. package/dist/jsMain/typescript/utils/outputFormatter.d.ts.map +1 -0
  160. package/dist/jsMain/typescript/utils/outputFormatter.js +140 -0
  161. package/dist/jsMain/typescript/utils/outputFormatter.js.map +1 -0
  162. package/dist/jsMain/typescript/utils/renderUtils.d.ts +17 -0
  163. package/dist/jsMain/typescript/utils/renderUtils.d.ts.map +1 -0
  164. package/dist/jsMain/typescript/utils/renderUtils.js +128 -0
  165. package/dist/jsMain/typescript/utils/renderUtils.js.map +1 -0
  166. package/dist/test/framework/analyzers/CodeChangeAnalyzer.d.ts +87 -0
  167. package/dist/test/framework/analyzers/CodeChangeAnalyzer.d.ts.map +1 -0
  168. package/dist/test/framework/analyzers/CodeChangeAnalyzer.js +412 -0
  169. package/dist/test/framework/analyzers/CodeChangeAnalyzer.js.map +1 -0
  170. package/dist/test/framework/analyzers/PromptAnalyzer.d.ts +46 -0
  171. package/dist/test/framework/analyzers/PromptAnalyzer.d.ts.map +1 -0
  172. package/dist/test/framework/analyzers/PromptAnalyzer.js +185 -0
  173. package/dist/test/framework/analyzers/PromptAnalyzer.js.map +1 -0
  174. package/dist/test/framework/analyzers/ToolCallAnalyzer.d.ts +45 -0
  175. package/dist/test/framework/analyzers/ToolCallAnalyzer.d.ts.map +1 -0
  176. package/dist/test/framework/analyzers/ToolCallAnalyzer.js +215 -0
  177. package/dist/test/framework/analyzers/ToolCallAnalyzer.js.map +1 -0
  178. package/dist/test/framework/cli.d.ts +8 -0
  179. package/dist/test/framework/cli.d.ts.map +1 -0
  180. package/dist/test/framework/cli.js +175 -0
  181. package/dist/test/framework/cli.js.map +1 -0
  182. package/dist/test/framework/core/TestCase.d.ts +100 -0
  183. package/dist/test/framework/core/TestCase.d.ts.map +1 -0
  184. package/dist/test/framework/core/TestCase.js +101 -0
  185. package/dist/test/framework/core/TestCase.js.map +1 -0
  186. package/dist/test/framework/core/TestEngine.d.ts +89 -0
  187. package/dist/test/framework/core/TestEngine.d.ts.map +1 -0
  188. package/dist/test/framework/core/TestEngine.js +552 -0
  189. package/dist/test/framework/core/TestEngine.js.map +1 -0
  190. package/dist/test/framework/core/TestResult.d.ts +143 -0
  191. package/dist/test/framework/core/TestResult.d.ts.map +1 -0
  192. package/dist/test/framework/core/TestResult.js +76 -0
  193. package/dist/test/framework/core/TestResult.js.map +1 -0
  194. package/dist/test/framework/examples/BasicRobustnessTest.d.ts +19 -0
  195. package/dist/test/framework/examples/BasicRobustnessTest.d.ts.map +1 -0
  196. package/dist/test/framework/examples/BasicRobustnessTest.js +116 -0
  197. package/dist/test/framework/examples/BasicRobustnessTest.js.map +1 -0
  198. package/dist/test/framework/index.d.ts +30 -0
  199. package/dist/test/framework/index.d.ts.map +1 -0
  200. package/dist/test/framework/index.js +38 -0
  201. package/dist/test/framework/index.js.map +1 -0
  202. package/dist/test/framework/loaders/JsonScenarioLoader.d.ts +99 -0
  203. package/dist/test/framework/loaders/JsonScenarioLoader.d.ts.map +1 -0
  204. package/dist/test/framework/loaders/JsonScenarioLoader.js +197 -0
  205. package/dist/test/framework/loaders/JsonScenarioLoader.js.map +1 -0
  206. package/dist/test/framework/reporters/ConsoleReporter.d.ts +25 -0
  207. package/dist/test/framework/reporters/ConsoleReporter.d.ts.map +1 -0
  208. package/dist/test/framework/reporters/ConsoleReporter.js +196 -0
  209. package/dist/test/framework/reporters/ConsoleReporter.js.map +1 -0
  210. package/dist/test/framework/scenarios/ScenarioBuilder.d.ts +62 -0
  211. package/dist/test/framework/scenarios/ScenarioBuilder.d.ts.map +1 -0
  212. package/dist/test/framework/scenarios/ScenarioBuilder.js +285 -0
  213. package/dist/test/framework/scenarios/ScenarioBuilder.js.map +1 -0
  214. package/dist/test/framework/validate-framework.d.ts +9 -0
  215. package/dist/test/framework/validate-framework.d.ts.map +1 -0
  216. package/dist/test/framework/validate-framework.js +187 -0
  217. package/dist/test/framework/validate-framework.js.map +1 -0
  218. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageSwitcher.js","sourceRoot":"","sources":["../../../../src/jsMain/typescript/ui/LanguageSwitcher.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,sBAAsB,EAA6B,MAAM,kBAAkB,CAAC;AAM/G,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE;IACxF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAoB,WAAW,EAAE,CAAC,CAAC;IAEjF,MAAM,eAAe,GAAG;QACtB,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAyB,EAAE;QACtD,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAyB,EAAE;KAC5D,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,IAAkC,EAAE,EAAE;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,cAAc,CAAC,OAAO,CAAC,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,gBAAgB,EAAE,CAAC;gBACrB,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,2CAEhB,CACH;QACN,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,QAAQ;;gBAAW,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAQ,CACpE;QACN,oBAAC,WAAW,IAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,GAAI,CAC3D,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Shared message rendering components
3
+ * Extracted from ChatInterface for reuse in CLI and other contexts
4
+ * Supports hierarchical tree-like message formatting
5
+ */
6
+ import React from 'react';
7
+ export interface Message {
8
+ role: 'user' | 'assistant' | 'system' | 'compiling';
9
+ content: string;
10
+ showPrefix?: boolean;
11
+ }
12
+ export interface TreeMessage {
13
+ type: 'action' | 'detail' | 'info' | 'error' | 'success';
14
+ content: string;
15
+ children?: TreeMessage[];
16
+ metadata?: {
17
+ file?: string;
18
+ operation?: string;
19
+ status?: 'running' | 'completed' | 'failed';
20
+ };
21
+ }
22
+ export interface TreeMessageBubbleProps {
23
+ message: TreeMessage;
24
+ level?: number;
25
+ isLast?: boolean;
26
+ isPending?: boolean;
27
+ }
28
+ interface MessageBubbleProps {
29
+ message: Message;
30
+ isPending?: boolean;
31
+ }
32
+ /**
33
+ * Renders a tree-structured message with hierarchical formatting
34
+ * Uses bullet points (●) for top-level items and branches (⎿) for children
35
+ */
36
+ export declare const TreeMessageBubble: React.FC<TreeMessageBubbleProps>;
37
+ /**
38
+ * Helper functions to create tree messages
39
+ */
40
+ export declare const createTreeMessage: {
41
+ action: (content: string, children?: TreeMessage[], metadata?: TreeMessage["metadata"]) => TreeMessage;
42
+ detail: (content: string, children?: TreeMessage[], metadata?: TreeMessage["metadata"]) => TreeMessage;
43
+ success: (content: string, children?: TreeMessage[], metadata?: TreeMessage["metadata"]) => TreeMessage;
44
+ error: (content: string, children?: TreeMessage[], metadata?: TreeMessage["metadata"]) => TreeMessage;
45
+ info: (content: string, children?: TreeMessage[], metadata?: TreeMessage["metadata"]) => TreeMessage;
46
+ fileOperation: (operation: string, file: string, details?: string[], status?: "running" | "completed" | "failed") => TreeMessage;
47
+ };
48
+ /**
49
+ * Renders a single message bubble with appropriate styling
50
+ * Enhanced to support tree-like formatting when content contains structured data
51
+ */
52
+ export declare const MessageBubble: React.FC<MessageBubbleProps>;
53
+ interface ContentBlocksProps {
54
+ content: string;
55
+ isPending: boolean;
56
+ }
57
+ interface TreeStructuredContentProps {
58
+ content: string;
59
+ isPending: boolean;
60
+ }
61
+ /**
62
+ * Renders tree-structured content by parsing bullet points and branches
63
+ */
64
+ export declare const TreeStructuredContent: React.FC<TreeStructuredContentProps>;
65
+ /**
66
+ * Renders content blocks with code highlighting
67
+ */
68
+ export declare const ContentBlocks: React.FC<ContentBlocksProps>;
69
+ export {};
70
+ //# sourceMappingURL=MessageRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageRenderer.d.ts","sourceRoot":"","sources":["../../../../src/jsMain/typescript/ui/MessageRenderer.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;KAC7C,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAyF9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB;sBACV,MAAM,aAAa,WAAW,EAAE,aAAa,WAAW,CAAC,UAAU,CAAC,KAAG,WAAW;sBAOlF,MAAM,aAAa,WAAW,EAAE,aAAa,WAAW,CAAC,UAAU,CAAC,KAAG,WAAW;uBAOjF,MAAM,aAAa,WAAW,EAAE,aAAa,WAAW,CAAC,UAAU,CAAC,KAAG,WAAW;qBAOpF,MAAM,aAAa,WAAW,EAAE,aAAa,WAAW,CAAC,UAAU,CAAC,KAAG,WAAW;oBAOnF,MAAM,aAAa,WAAW,EAAE,aAAa,WAAW,CAAC,UAAU,CAAC,KAAG,WAAW;+BAOvE,MAAM,QAAQ,MAAM,YAAY,MAAM,EAAE,WAAU,SAAS,GAAG,WAAW,GAAG,QAAQ,KAAiB,WAAW;CAM5I,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA2DtD,CAAC;AAEF,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,0BAA0B;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAwDtE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA6EtD,CAAC"}
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Shared message rendering components
3
+ * Extracted from ChatInterface for reuse in CLI and other contexts
4
+ * Supports hierarchical tree-like message formatting
5
+ */
6
+ import React from 'react';
7
+ import { Box, Text } from 'ink';
8
+ import Spinner from 'ink-spinner';
9
+ import { parseCodeBlocksSync } from '../utils/renderUtils.js';
10
+ import { t } from '../i18n/index.js';
11
+ import { semanticInk } from '../design-system/theme-helpers.js';
12
+ // Tree formatting symbols
13
+ const TREE_SYMBOLS = {
14
+ bullet: '●',
15
+ branch: '⎿',
16
+ indent: ' ',
17
+ space: ' ',
18
+ };
19
+ /**
20
+ * Renders a tree-structured message with hierarchical formatting
21
+ * Uses bullet points (●) for top-level items and branches (⎿) for children
22
+ */
23
+ export const TreeMessageBubble = ({ message, level = 0, isLast = true, isPending = false }) => {
24
+ const getSymbol = () => {
25
+ if (level === 0) {
26
+ return TREE_SYMBOLS.bullet;
27
+ }
28
+ return TREE_SYMBOLS.branch;
29
+ };
30
+ const getIndent = () => {
31
+ if (level === 0)
32
+ return '';
33
+ return TREE_SYMBOLS.indent.repeat(level - 1) + TREE_SYMBOLS.space;
34
+ };
35
+ const getColor = () => {
36
+ switch (message.type) {
37
+ case 'action':
38
+ return semanticInk.primary;
39
+ case 'success':
40
+ return semanticInk.success;
41
+ case 'error':
42
+ return semanticInk.error;
43
+ case 'detail':
44
+ return semanticInk.accent;
45
+ case 'info':
46
+ default:
47
+ return semanticInk.muted;
48
+ }
49
+ };
50
+ const renderContent = () => {
51
+ const symbol = getSymbol();
52
+ const indent = getIndent();
53
+ const color = getColor();
54
+ return (React.createElement(Box, { flexDirection: "column" },
55
+ React.createElement(Box, null,
56
+ React.createElement(Text, { color: color },
57
+ indent,
58
+ symbol,
59
+ TREE_SYMBOLS.space,
60
+ message.content,
61
+ isPending && message.metadata?.status === 'running' && (React.createElement(Text, { color: semanticInk.warning },
62
+ " ",
63
+ React.createElement(Spinner, { type: "dots" }))))),
64
+ message.metadata && (React.createElement(Box, { paddingLeft: indent.length + 2 },
65
+ message.metadata.file && (React.createElement(Text, { dimColor: true },
66
+ TREE_SYMBOLS.branch,
67
+ " ",
68
+ message.metadata.file)),
69
+ message.metadata.operation && (React.createElement(Text, { dimColor: true },
70
+ TREE_SYMBOLS.indent,
71
+ message.metadata.operation)))),
72
+ message.children && message.children.length > 0 && (React.createElement(Box, { flexDirection: "column" }, message.children.map((child, idx) => (React.createElement(TreeMessageBubble, { key: idx, message: child, level: level + 1, isLast: idx === message.children.length - 1, isPending: isPending })))))));
73
+ };
74
+ return (React.createElement(Box, { marginBottom: level === 0 ? 1 : 0 }, renderContent()));
75
+ };
76
+ /**
77
+ * Helper functions to create tree messages
78
+ */
79
+ export const createTreeMessage = {
80
+ action: (content, children, metadata) => ({
81
+ type: 'action',
82
+ content,
83
+ children,
84
+ metadata,
85
+ }),
86
+ detail: (content, children, metadata) => ({
87
+ type: 'detail',
88
+ content,
89
+ children,
90
+ metadata,
91
+ }),
92
+ success: (content, children, metadata) => ({
93
+ type: 'success',
94
+ content,
95
+ children,
96
+ metadata,
97
+ }),
98
+ error: (content, children, metadata) => ({
99
+ type: 'error',
100
+ content,
101
+ children,
102
+ metadata,
103
+ }),
104
+ info: (content, children, metadata) => ({
105
+ type: 'info',
106
+ content,
107
+ children,
108
+ metadata,
109
+ }),
110
+ fileOperation: (operation, file, details, status = 'completed') => ({
111
+ type: status === 'failed' ? 'error' : status === 'running' ? 'action' : 'success',
112
+ content: operation,
113
+ metadata: { file, operation, status },
114
+ children: details ? details.map(detail => createTreeMessage.detail(detail)) : undefined,
115
+ }),
116
+ };
117
+ /**
118
+ * Renders a single message bubble with appropriate styling
119
+ * Enhanced to support tree-like formatting when content contains structured data
120
+ */
121
+ export const MessageBubble = ({ message, isPending = false }) => {
122
+ // Handle different message roles
123
+ if (message.role === 'compiling') {
124
+ return (React.createElement(Box, { marginBottom: 1 },
125
+ React.createElement(Text, { color: semanticInk.warning },
126
+ React.createElement(Spinner, { type: "dots" }),
127
+ " ",
128
+ message.content)));
129
+ }
130
+ if (message.role === 'system') {
131
+ return (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
132
+ React.createElement(Box, null,
133
+ React.createElement(Text, { bold: true, color: semanticInk.primary },
134
+ t('chat.prefixes.system'),
135
+ ":")),
136
+ React.createElement(Box, { paddingLeft: 2 },
137
+ React.createElement(Text, { dimColor: true }, message.content))));
138
+ }
139
+ const isUser = message.role === 'user';
140
+ const color = isUser ? semanticInk.success : semanticInk.accent;
141
+ const prefix = isUser ? t('chat.prefixes.you') : t('chat.prefixes.ai');
142
+ // Check if we should show prefix (defaults to true for backward compatibility)
143
+ const showPrefix = message.showPrefix !== false;
144
+ // Try to parse content as tree structure if it contains bullet points
145
+ const isTreeStructured = message.content.includes('●') || message.content.includes('⎿');
146
+ return (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
147
+ showPrefix && (React.createElement(Box, null,
148
+ React.createElement(Text, { bold: true, color: color },
149
+ prefix,
150
+ ":",
151
+ isPending && !isUser && (React.createElement(Text, { color: semanticInk.accent },
152
+ " ",
153
+ React.createElement(Spinner, { type: "dots" })))))),
154
+ React.createElement(Box, { paddingLeft: showPrefix ? 2 : 0 }, isTreeStructured ? (React.createElement(TreeStructuredContent, { content: message.content || '', isPending: isPending })) : (React.createElement(ContentBlocks, { content: message.content || '', isPending: isPending })))));
155
+ };
156
+ /**
157
+ * Renders tree-structured content by parsing bullet points and branches
158
+ */
159
+ export const TreeStructuredContent = ({ content, isPending }) => {
160
+ if (!content && isPending) {
161
+ return React.createElement(Text, { dimColor: true }, "...");
162
+ }
163
+ if (!content) {
164
+ return null;
165
+ }
166
+ const lines = content.split('\n');
167
+ return (React.createElement(Box, { flexDirection: "column" }, lines.map((line, idx) => {
168
+ const trimmedLine = line.trim();
169
+ // Skip empty lines
170
+ if (!trimmedLine) {
171
+ return null;
172
+ }
173
+ // Detect tree structure symbols
174
+ const isBulletPoint = trimmedLine.startsWith('●');
175
+ const isBranch = trimmedLine.startsWith('⎿');
176
+ const isIndented = line.startsWith(' ') || line.startsWith(' ') || line.startsWith(' ');
177
+ let color = semanticInk.primary;
178
+ let content = trimmedLine;
179
+ if (isBulletPoint) {
180
+ color = semanticInk.primary;
181
+ content = trimmedLine.substring(1).trim(); // Remove bullet
182
+ }
183
+ else if (isBranch) {
184
+ color = semanticInk.accent;
185
+ content = trimmedLine.substring(1).trim(); // Remove branch
186
+ }
187
+ else if (isIndented) {
188
+ color = semanticInk.muted;
189
+ }
190
+ // Calculate indentation level
191
+ const indentLevel = Math.floor((line.length - line.trimStart().length) / 2);
192
+ const indentString = TREE_SYMBOLS.indent.repeat(Math.max(0, indentLevel));
193
+ return (React.createElement(Box, { key: idx },
194
+ React.createElement(Text, { color: color },
195
+ isBulletPoint && `${TREE_SYMBOLS.bullet} `,
196
+ isBranch && `${indentString}${TREE_SYMBOLS.branch} `,
197
+ !isBulletPoint && !isBranch && indentString,
198
+ content)));
199
+ })));
200
+ };
201
+ /**
202
+ * Renders content blocks with code highlighting
203
+ */
204
+ export const ContentBlocks = ({ content, isPending }) => {
205
+ if (!content && isPending) {
206
+ return React.createElement(Text, { dimColor: true }, "...");
207
+ }
208
+ if (!content) {
209
+ return null;
210
+ }
211
+ // Parse content into blocks
212
+ const blocks = parseCodeBlocksSync(content);
213
+ return (React.createElement(Box, { flexDirection: "column" }, blocks.map((block, idx) => {
214
+ if (!block.languageId) {
215
+ // Text block - filter empty lines and render with proper spacing
216
+ const lines = block.text.split('\n');
217
+ // Filter out leading and trailing empty lines
218
+ let startIdx = 0;
219
+ let endIdx = lines.length - 1;
220
+ while (startIdx < lines.length && lines[startIdx].trim() === '') {
221
+ startIdx++;
222
+ }
223
+ while (endIdx >= 0 && lines[endIdx].trim() === '') {
224
+ endIdx--;
225
+ }
226
+ const trimmedLines = lines.slice(startIdx, endIdx + 1);
227
+ // If block is empty after trimming, skip it
228
+ if (trimmedLines.length === 0) {
229
+ return null;
230
+ }
231
+ return (React.createElement(Box, { key: idx, flexDirection: "column", marginBottom: idx < blocks.length - 1 ? 1 : 0 }, trimmedLines.map((line, lineIdx) => {
232
+ // For empty lines in the middle, only render if surrounded by non-empty lines
233
+ if (line.trim() === '') {
234
+ // Check if this is a paragraph break (should show as spacing)
235
+ const prevLine = lineIdx > 0 ? trimmedLines[lineIdx - 1] : '';
236
+ const nextLine = lineIdx < trimmedLines.length - 1 ? trimmedLines[lineIdx + 1] : '';
237
+ // Only render empty line if it's between two non-empty lines
238
+ if (prevLine.trim() && nextLine.trim()) {
239
+ return React.createElement(Text, { key: lineIdx }, " ");
240
+ }
241
+ return null;
242
+ }
243
+ return React.createElement(Text, { key: lineIdx }, line);
244
+ })));
245
+ }
246
+ else {
247
+ // Code block - preserve all lines including empty ones (formatting matters)
248
+ const codeLines = block.text.split('\n');
249
+ return (React.createElement(Box, { key: idx, flexDirection: "column", marginBottom: idx < blocks.length - 1 ? 1 : 0 },
250
+ block.languageId && (React.createElement(Text, { dimColor: true }, `[${block.languageId}]`)),
251
+ React.createElement(Box, { borderStyle: "round", borderColor: semanticInk.muted, paddingX: 1, flexDirection: "column" }, codeLines.map((line, lineIdx) => (React.createElement(Text, { key: lineIdx }, line || ' '))))));
252
+ }
253
+ })));
254
+ };
255
+ //# sourceMappingURL=MessageRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageRenderer.js","sourceRoot":"","sources":["../../../../src/jsMain/typescript/ui/MessageRenderer.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAEhE,0BAA0B;AAC1B,MAAM,YAAY,GAAG;IACnB,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,GAAG;CACF,CAAC;AA+BX;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAClE,OAAO,EACP,KAAK,GAAG,CAAC,EACT,MAAM,GAAG,IAAI,EACb,SAAS,GAAG,KAAK,EAClB,EAAE,EAAE;IACH,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,YAAY,CAAC,MAAM,CAAC;QAC7B,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;IACpE,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,QAAQ;gBACX,OAAO,WAAW,CAAC,OAAO,CAAC;YAC7B,KAAK,SAAS;gBACZ,OAAO,WAAW,CAAC,OAAO,CAAC;YAC7B,KAAK,OAAO;gBACV,OAAO,WAAW,CAAC,KAAK,CAAC;YAC3B,KAAK,QAAQ;gBACX,OAAO,WAAW,CAAC,MAAM,CAAC;YAC5B,KAAK,MAAM,CAAC;YACZ;gBACE,OAAO,WAAW,CAAC,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QAEzB,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,GAAG;gBACF,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;oBACf,MAAM;oBAAE,MAAM;oBAAE,YAAY,CAAC,KAAK;oBAAE,OAAO,CAAC,OAAO;oBACnD,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,IAAI,CACtD,oBAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,OAAO;;wBAAG,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,CAAO,CAClE,CACI,CACH;YAGL,OAAO,CAAC,QAAQ,IAAI,CACnB,oBAAC,GAAG,IAAC,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;gBAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CACxB,oBAAC,IAAI,IAAC,QAAQ;oBACX,YAAY,CAAC,MAAM;;oBAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CACvC,CACR;gBACA,OAAO,CAAC,QAAQ,CAAC,SAAS,IAAI,CAC7B,oBAAC,IAAI,IAAC,QAAQ;oBACX,YAAY,CAAC,MAAM;oBAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAC3C,CACR,CACG,CACP;YAGA,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAClD,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CACpC,oBAAC,iBAAiB,IAChB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,KAAK,EACd,KAAK,EAAE,KAAK,GAAG,CAAC,EAChB,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,QAAS,CAAC,MAAM,GAAG,CAAC,EAC5C,SAAS,EAAE,SAAS,GACpB,CACH,CAAC,CACE,CACP,CACG,CACP,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,YAAY,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IACnC,aAAa,EAAE,CACZ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,CAAC,OAAe,EAAE,QAAwB,EAAE,QAAkC,EAAe,EAAE,CAAC,CAAC;QACvG,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,QAAQ;QACR,QAAQ;KACT,CAAC;IAEF,MAAM,EAAE,CAAC,OAAe,EAAE,QAAwB,EAAE,QAAkC,EAAe,EAAE,CAAC,CAAC;QACvG,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,QAAQ;QACR,QAAQ;KACT,CAAC;IAEF,OAAO,EAAE,CAAC,OAAe,EAAE,QAAwB,EAAE,QAAkC,EAAe,EAAE,CAAC,CAAC;QACxG,IAAI,EAAE,SAAS;QACf,OAAO;QACP,QAAQ;QACR,QAAQ;KACT,CAAC;IAEF,KAAK,EAAE,CAAC,OAAe,EAAE,QAAwB,EAAE,QAAkC,EAAe,EAAE,CAAC,CAAC;QACtG,IAAI,EAAE,OAAO;QACb,OAAO;QACP,QAAQ;QACR,QAAQ;KACT,CAAC;IAEF,IAAI,EAAE,CAAC,OAAe,EAAE,QAAwB,EAAE,QAAkC,EAAe,EAAE,CAAC,CAAC;QACrG,IAAI,EAAE,MAAM;QACZ,OAAO;QACP,QAAQ;QACR,QAAQ;KACT,CAAC;IAEF,aAAa,EAAE,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAkB,EAAE,SAA6C,WAAW,EAAe,EAAE,CAAC,CAAC;QAC9I,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACjF,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE;QACrC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;KACxF,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAAE,OAAO,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE,EAAE;IAC5F,iCAAiC;IACjC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,CACL,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,OAAO;gBAC9B,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG;;gBAAE,OAAO,CAAC,OAAO,CACnC,CACH,CACP,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC;YACzC,oBAAC,GAAG;gBACF,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,WAAW,CAAC,OAAO;oBAClC,CAAC,CAAC,sBAAsB,CAAC;wBACrB,CACH;YACN,oBAAC,GAAG,IAAC,WAAW,EAAE,CAAC;gBACjB,oBAAC,IAAI,IAAC,QAAQ,UAAE,OAAO,CAAC,OAAO,CAAQ,CACnC,CACF,CACP,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAEvE,+EAA+E;IAC/E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC;IAEhD,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAExF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC;QAExC,UAAU,IAAI,CACb,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK;gBACpB,MAAM;;gBACN,SAAS,IAAI,CAAC,MAAM,IAAI,CACvB,oBAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,MAAM;;oBAAG,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,CAAO,CACjE,CACI,CACH,CACP;QACD,oBAAC,GAAG,IAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IACjC,gBAAgB,CAAC,CAAC,CAAC,CAClB,oBAAC,qBAAqB,IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,GAAI,CAChF,CAAC,CAAC,CAAC,CACF,oBAAC,aAAa,IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,GAAI,CACxE,CACG,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAYF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAyC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;IACpG,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;QAC1B,OAAO,oBAAC,IAAI,IAAC,QAAQ,gBAAW,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,IACxB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAEhC,mBAAmB;QACnB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gCAAgC;QAChC,MAAM,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE9F,IAAI,KAAK,GAAW,WAAW,CAAC,OAAO,CAAC;QACxC,IAAI,OAAO,GAAG,WAAW,CAAC;QAE1B,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC;YAC5B,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,gBAAgB;QAC7D,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;YAC3B,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,gBAAgB;QAC7D,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAC5B,CAAC;QAED,8BAA8B;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;QAE1E,OAAO,CACL,oBAAC,GAAG,IAAC,GAAG,EAAE,GAAG;YACX,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;gBACf,aAAa,IAAI,GAAG,YAAY,CAAC,MAAM,GAAG;gBAC1C,QAAQ,IAAI,GAAG,YAAY,GAAG,YAAY,CAAC,MAAM,GAAG;gBACpD,CAAC,aAAa,IAAI,CAAC,QAAQ,IAAI,YAAY;gBAC3C,OAAO,CACH,CACH,CACP,CAAC;IACJ,CAAC,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;IACpF,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;QAC1B,OAAO,oBAAC,IAAI,IAAC,QAAQ,gBAAW,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4BAA4B;IAC5B,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE5C,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,IACxB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACtB,iEAAiE;YACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAErC,8CAA8C;YAC9C,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAE9B,OAAO,QAAQ,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAChE,QAAQ,EAAE,CAAC;YACb,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClD,MAAM,EAAE,CAAC;YACX,CAAC;YAED,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YAEvD,4CAA4C;YAC5C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,CACL,oBAAC,GAAG,IAAC,GAAG,EAAE,GAAG,EAAE,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAChF,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;gBAClC,8EAA8E;gBAC9E,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACvB,8DAA8D;oBAC9D,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,MAAM,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAEpF,6DAA6D;oBAC7D,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;wBACvC,OAAO,oBAAC,IAAI,IAAC,GAAG,EAAE,OAAO,QAAU,CAAC;oBACtC,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,oBAAC,IAAI,IAAC,GAAG,EAAE,OAAO,IAAG,IAAI,CAAQ,CAAC;YAC3C,CAAC,CAAC,CACE,CACP,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,4EAA4E;YAC5E,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,OAAO,CACL,oBAAC,GAAG,IAAC,GAAG,EAAE,GAAG,EAAE,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEhF,KAAK,CAAC,UAAU,IAAI,CACnB,oBAAC,IAAI,IAAC,QAAQ,UAAE,IAAI,KAAK,CAAC,UAAU,GAAG,CAAQ,CAChD;gBAED,oBAAC,GAAG,IAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,IACzF,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAChC,oBAAC,IAAI,IAAC,GAAG,EAAE,OAAO,IAAG,IAAI,IAAI,GAAG,CAAQ,CACzC,CAAC,CACE,CACF,CACP,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ModelConfigForm - 模型配置表单
3
+ *
4
+ * 提供一个简洁的表单让用户配置 LLM provider、model 和 API key
5
+ */
6
+ import React from 'react';
7
+ import type { LLMProvider } from '../config/ConfigManager.js';
8
+ interface ModelConfigFormProps {
9
+ onSubmit: (config: {
10
+ provider: LLMProvider;
11
+ model: string;
12
+ apiKey: string;
13
+ baseUrl?: string;
14
+ }) => void;
15
+ onCancel?: () => void;
16
+ }
17
+ export declare const ModelConfigForm: React.FC<ModelConfigFormProps>;
18
+ export {};
19
+ //# sourceMappingURL=ModelConfigForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelConfigForm.d.ts","sourceRoot":"","sources":["../../../../src/jsMain/typescript/ui/ModelConfigForm.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,WAAW,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAK,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAoBD,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA6Q1D,CAAC"}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * ModelConfigForm - 模型配置表单
3
+ *
4
+ * 提供一个简洁的表单让用户配置 LLM provider、model 和 API key
5
+ */
6
+ import React, { useState } from 'react';
7
+ import { Box, Text } from 'ink';
8
+ import TextInput from 'ink-text-input';
9
+ import SelectInput from 'ink-select-input';
10
+ import { t } from '../i18n/index.js';
11
+ // Provider 选项 - will be generated dynamically with translations
12
+ // 每个 provider 的默认模型和示例
13
+ const PROVIDER_DEFAULTS = {
14
+ openai: { defaultModel: 'gpt-4', needsApiKey: true },
15
+ anthropic: { defaultModel: 'claude-3-5-sonnet-20241022', needsApiKey: true },
16
+ google: { defaultModel: 'gemini-pro', needsApiKey: true },
17
+ deepseek: { defaultModel: 'deepseek-chat', needsApiKey: true },
18
+ ollama: { defaultModel: 'llama2', needsApiKey: false, baseUrl: 'http://localhost:11434', requiresBaseUrl: true },
19
+ openrouter: { defaultModel: 'openai/gpt-4', needsApiKey: true },
20
+ glm: { defaultModel: 'glm-4-plus', needsApiKey: true, baseUrl: 'https://open.bigmodel.cn/api/paas/v4', requiresBaseUrl: true },
21
+ qwen: { defaultModel: 'qwen-max', needsApiKey: true, baseUrl: 'https://dashscope.aliyuncs.com/api/v1', requiresBaseUrl: true },
22
+ kimi: { defaultModel: 'moonshot-v1-32k', needsApiKey: true, baseUrl: 'https://api.moonshot.cn/v1', requiresBaseUrl: true },
23
+ 'custom-openai-base': { defaultModel: 'model-name', needsApiKey: true, baseUrl: 'https://api.example.com/v1', requiresBaseUrl: true },
24
+ };
25
+ export const ModelConfigForm = ({ onSubmit, onCancel }) => {
26
+ const [step, setStep] = useState('provider');
27
+ const [provider, setProvider] = useState('openai');
28
+ const [model, setModel] = useState('');
29
+ const [apiKey, setApiKey] = useState('');
30
+ const [baseUrl, setBaseUrl] = useState('');
31
+ const providerInfo = PROVIDER_DEFAULTS[provider];
32
+ // Generate provider options dynamically with translations
33
+ const PROVIDER_OPTIONS = [
34
+ { label: t('modelConfig.providers.openai'), value: 'openai' },
35
+ { label: t('modelConfig.providers.anthropic'), value: 'anthropic' },
36
+ { label: t('modelConfig.providers.google'), value: 'google' },
37
+ { label: t('modelConfig.providers.deepseek'), value: 'deepseek' },
38
+ { label: t('modelConfig.providers.ollama'), value: 'ollama' },
39
+ { label: t('modelConfig.providers.openrouter'), value: 'openrouter' },
40
+ { label: t('modelConfig.providers.glm'), value: 'glm' },
41
+ { label: t('modelConfig.providers.qwen'), value: 'qwen' },
42
+ { label: t('modelConfig.providers.kimi'), value: 'kimi' },
43
+ { label: t('modelConfig.providers.customOpenAIBase'), value: 'custom-openai-base' },
44
+ ];
45
+ const handleProviderSelect = (item) => {
46
+ const selectedProvider = item.value;
47
+ setProvider(selectedProvider);
48
+ setModel(PROVIDER_DEFAULTS[selectedProvider].defaultModel);
49
+ setBaseUrl(PROVIDER_DEFAULTS[selectedProvider].baseUrl || '');
50
+ setStep('model');
51
+ };
52
+ const handleModelSubmit = (value) => {
53
+ setModel(value);
54
+ // If provider doesn't need API key (like Ollama), skip to baseUrl
55
+ if (!providerInfo.needsApiKey) {
56
+ if (providerInfo.baseUrl) {
57
+ setStep('baseUrl');
58
+ }
59
+ else {
60
+ setStep('confirm');
61
+ }
62
+ }
63
+ else {
64
+ setStep('apiKey');
65
+ }
66
+ };
67
+ const handleApiKeySubmit = (value) => {
68
+ setApiKey(value);
69
+ // Ask for baseUrl if provider requires one
70
+ if (providerInfo.requiresBaseUrl) {
71
+ setStep('baseUrl');
72
+ }
73
+ else {
74
+ setStep('confirm');
75
+ }
76
+ };
77
+ const handleBaseUrlSubmit = (value) => {
78
+ setBaseUrl(value);
79
+ setStep('confirm');
80
+ };
81
+ const handleConfirm = () => {
82
+ onSubmit({
83
+ provider,
84
+ model: model || providerInfo.defaultModel,
85
+ apiKey,
86
+ baseUrl: baseUrl || undefined,
87
+ });
88
+ };
89
+ const handleBack = () => {
90
+ switch (step) {
91
+ case 'model':
92
+ setStep('provider');
93
+ break;
94
+ case 'apiKey':
95
+ setStep('model');
96
+ break;
97
+ case 'baseUrl':
98
+ if (providerInfo.needsApiKey) {
99
+ setStep('apiKey');
100
+ }
101
+ else {
102
+ setStep('model');
103
+ }
104
+ break;
105
+ case 'confirm':
106
+ if (baseUrl || provider === 'ollama') {
107
+ setStep('baseUrl');
108
+ }
109
+ else if (providerInfo.needsApiKey) {
110
+ setStep('apiKey');
111
+ }
112
+ else {
113
+ setStep('model');
114
+ }
115
+ break;
116
+ }
117
+ };
118
+ return (React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
119
+ React.createElement(Box, { marginBottom: 1 },
120
+ React.createElement(Text, { bold: true, color: "cyan" },
121
+ t('modelConfig.title'),
122
+ " (",
123
+ t('modelConfig.stepInfo'),
124
+ ")")),
125
+ React.createElement(Box, { marginBottom: 1 },
126
+ React.createElement(Text, { dimColor: true }, t('modelConfig.nextStepInfo'))),
127
+ step === 'provider' && (React.createElement(Box, { flexDirection: "column" },
128
+ React.createElement(Box, { marginBottom: 1 },
129
+ React.createElement(Text, { dimColor: true }, t('modelConfig.selectProvider'))),
130
+ React.createElement(SelectInput, { items: PROVIDER_OPTIONS, onSelect: handleProviderSelect }),
131
+ onCancel && (React.createElement(Box, { marginTop: 1 },
132
+ React.createElement(Text, { dimColor: true }, t('welcome.exitHint')))))),
133
+ step === 'model' && (React.createElement(Box, { flexDirection: "column" },
134
+ React.createElement(Box, { marginBottom: 1 },
135
+ React.createElement(Text, null,
136
+ React.createElement(Text, { color: "green" }, "\u2713"),
137
+ " ",
138
+ t('modelConfig.fields.provider'),
139
+ ": ",
140
+ React.createElement(Text, { bold: true }, provider))),
141
+ React.createElement(Box, { marginBottom: 1 },
142
+ React.createElement(Text, { dimColor: true },
143
+ t('modelConfig.enterModel'),
144
+ " (",
145
+ t('modelConfig.defaultHint', { default: providerInfo.defaultModel }),
146
+ "):")),
147
+ React.createElement(Box, null,
148
+ React.createElement(Text, { color: "cyan" },
149
+ t('modelConfig.fields.model'),
150
+ ": "),
151
+ React.createElement(TextInput, { value: model, onChange: setModel, onSubmit: handleModelSubmit, placeholder: providerInfo.defaultModel })),
152
+ React.createElement(Box, { marginTop: 1 },
153
+ React.createElement(Text, { dimColor: true }, t('modelConfig.backHint'))))),
154
+ step === 'apiKey' && (React.createElement(Box, { flexDirection: "column" },
155
+ React.createElement(Box, { marginBottom: 1 },
156
+ React.createElement(Text, null,
157
+ React.createElement(Text, { color: "green" }, "\u2713"),
158
+ " ",
159
+ t('modelConfig.fields.provider'),
160
+ ": ",
161
+ React.createElement(Text, { bold: true }, provider)),
162
+ React.createElement(Text, null,
163
+ React.createElement(Text, { color: "green" }, "\u2713"),
164
+ " ",
165
+ t('modelConfig.fields.model'),
166
+ ": ",
167
+ React.createElement(Text, { bold: true }, model))),
168
+ React.createElement(Box, { marginBottom: 1 },
169
+ React.createElement(Text, { dimColor: true }, t('modelConfig.enterApiKey'))),
170
+ React.createElement(Box, null,
171
+ React.createElement(Text, { color: "cyan" },
172
+ t('modelConfig.fields.apiKey'),
173
+ ": "),
174
+ React.createElement(TextInput, { value: apiKey, onChange: setApiKey, onSubmit: handleApiKeySubmit, placeholder: "sk-...", mask: "*" })),
175
+ React.createElement(Box, { marginTop: 1 },
176
+ React.createElement(Text, { dimColor: true }, t('modelConfig.backHint'))))),
177
+ step === 'baseUrl' && (React.createElement(Box, { flexDirection: "column" },
178
+ React.createElement(Box, { marginBottom: 1 },
179
+ React.createElement(Text, null,
180
+ React.createElement(Text, { color: "green" }, "\u2713"),
181
+ " ",
182
+ t('modelConfig.fields.provider'),
183
+ ": ",
184
+ React.createElement(Text, { bold: true }, provider)),
185
+ React.createElement(Text, null,
186
+ React.createElement(Text, { color: "green" }, "\u2713"),
187
+ " ",
188
+ t('modelConfig.fields.model'),
189
+ ": ",
190
+ React.createElement(Text, { bold: true }, model)),
191
+ providerInfo.needsApiKey && (React.createElement(Text, null,
192
+ React.createElement(Text, { color: "green" }, "\u2713"),
193
+ " ",
194
+ t('modelConfig.fields.apiKey'),
195
+ ": ",
196
+ React.createElement(Text, { bold: true },
197
+ '*'.repeat(8),
198
+ "...")))),
199
+ React.createElement(Box, { marginBottom: 1 },
200
+ React.createElement(Text, { dimColor: true }, provider === 'ollama'
201
+ ? t('modelConfig.ollamaUrl')
202
+ : t('modelConfig.customBaseUrl'))),
203
+ React.createElement(Box, null,
204
+ React.createElement(Text, { color: "cyan" },
205
+ t('modelConfig.fields.baseUrl'),
206
+ ": "),
207
+ React.createElement(TextInput, { value: baseUrl, onChange: setBaseUrl, onSubmit: handleBaseUrlSubmit, placeholder: providerInfo.baseUrl || 'https://api.example.com' })),
208
+ React.createElement(Box, { marginTop: 1 },
209
+ React.createElement(Text, { dimColor: true },
210
+ t('modelConfig.leaveEmpty'),
211
+ " \u2022 ",
212
+ t('modelConfig.backHint'))))),
213
+ step === 'confirm' && (React.createElement(Box, { flexDirection: "column" },
214
+ React.createElement(Box, { marginBottom: 1 },
215
+ React.createElement(Text, { bold: true, color: "green" }, t('modelConfig.summary'))),
216
+ React.createElement(Box, { flexDirection: "column", marginBottom: 1, paddingLeft: 2 },
217
+ React.createElement(Text, null,
218
+ "\u2022 ",
219
+ t('modelConfig.fields.provider'),
220
+ ": ",
221
+ React.createElement(Text, { bold: true, color: "cyan" }, provider)),
222
+ React.createElement(Text, null,
223
+ "\u2022 ",
224
+ t('modelConfig.fields.model'),
225
+ ": ",
226
+ React.createElement(Text, { bold: true, color: "cyan" }, model)),
227
+ providerInfo.needsApiKey && (React.createElement(Text, null,
228
+ "\u2022 ",
229
+ t('modelConfig.fields.apiKey'),
230
+ ": ",
231
+ React.createElement(Text, { bold: true, color: "cyan" },
232
+ apiKey.substring(0, 8),
233
+ "...",
234
+ apiKey.substring(apiKey.length - 4)))),
235
+ baseUrl && (React.createElement(Text, null,
236
+ "\u2022 ",
237
+ t('modelConfig.fields.baseUrl'),
238
+ ": ",
239
+ React.createElement(Text, { bold: true, color: "cyan" }, baseUrl)))),
240
+ React.createElement(Box, { marginBottom: 1 },
241
+ React.createElement(Text, { dimColor: true },
242
+ t('modelConfig.nameHint'),
243
+ ", ",
244
+ t('modelConfig.backHint'))),
245
+ React.createElement(SelectInput, { items: [
246
+ { label: `✓ ${t('common.save')}`, value: 'save' },
247
+ { label: `← ${t('common.back')}`, value: 'back' }
248
+ ], onSelect: (item) => {
249
+ if (item.value === 'save') {
250
+ handleConfirm();
251
+ }
252
+ else {
253
+ handleBack();
254
+ }
255
+ } })))));
256
+ };
257
+ //# sourceMappingURL=ModelConfigForm.js.map