tianxincode 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 (374) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +57 -0
  3. package/dist/api/api.types.d.ts +350 -0
  4. package/dist/api/api.types.d.ts.map +1 -0
  5. package/dist/api/api.types.js +12 -0
  6. package/dist/api/api.types.js.map +1 -0
  7. package/dist/api/chat.routes.d.ts +26 -0
  8. package/dist/api/chat.routes.d.ts.map +1 -0
  9. package/dist/api/chat.routes.js +275 -0
  10. package/dist/api/chat.routes.js.map +1 -0
  11. package/dist/api/config.routes.d.ts +10 -0
  12. package/dist/api/config.routes.d.ts.map +1 -0
  13. package/dist/api/config.routes.js +150 -0
  14. package/dist/api/config.routes.js.map +1 -0
  15. package/dist/api/db.routes.d.ts +12 -0
  16. package/dist/api/db.routes.d.ts.map +1 -0
  17. package/dist/api/db.routes.js +108 -0
  18. package/dist/api/db.routes.js.map +1 -0
  19. package/dist/api/files.routes.d.ts +14 -0
  20. package/dist/api/files.routes.d.ts.map +1 -0
  21. package/dist/api/files.routes.js +220 -0
  22. package/dist/api/files.routes.js.map +1 -0
  23. package/dist/api/filesystem.routes.d.ts +10 -0
  24. package/dist/api/filesystem.routes.d.ts.map +1 -0
  25. package/dist/api/filesystem.routes.js +181 -0
  26. package/dist/api/filesystem.routes.js.map +1 -0
  27. package/dist/api/index.d.ts +6 -0
  28. package/dist/api/index.d.ts.map +1 -0
  29. package/dist/api/index.js +25 -0
  30. package/dist/api/index.js.map +1 -0
  31. package/dist/api/lsp.d.ts +5 -0
  32. package/dist/api/lsp.d.ts.map +1 -0
  33. package/dist/api/lsp.js +103 -0
  34. package/dist/api/lsp.js.map +1 -0
  35. package/dist/api/projects.routes.d.ts +18 -0
  36. package/dist/api/projects.routes.d.ts.map +1 -0
  37. package/dist/api/projects.routes.js +306 -0
  38. package/dist/api/projects.routes.js.map +1 -0
  39. package/dist/api/session.routes.d.ts +18 -0
  40. package/dist/api/session.routes.d.ts.map +1 -0
  41. package/dist/api/session.routes.js +186 -0
  42. package/dist/api/session.routes.js.map +1 -0
  43. package/dist/api/skills.routes.d.ts +6 -0
  44. package/dist/api/skills.routes.d.ts.map +1 -0
  45. package/dist/api/skills.routes.js +54 -0
  46. package/dist/api/skills.routes.js.map +1 -0
  47. package/dist/cli/args.d.ts +49 -0
  48. package/dist/cli/args.d.ts.map +1 -0
  49. package/dist/cli/args.js +77 -0
  50. package/dist/cli/args.js.map +1 -0
  51. package/dist/cli/cli.types.d.ts +22 -0
  52. package/dist/cli/cli.types.d.ts.map +1 -0
  53. package/dist/cli/cli.types.js +5 -0
  54. package/dist/cli/cli.types.js.map +1 -0
  55. package/dist/cli/commands.d.ts +30 -0
  56. package/dist/cli/commands.d.ts.map +1 -0
  57. package/dist/cli/commands.js +263 -0
  58. package/dist/cli/commands.js.map +1 -0
  59. package/dist/cli/index.d.ts +7 -0
  60. package/dist/cli/index.d.ts.map +1 -0
  61. package/dist/cli/index.js +6 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/components/App.d.ts +34 -0
  64. package/dist/components/App.d.ts.map +1 -0
  65. package/dist/components/App.js +639 -0
  66. package/dist/components/App.js.map +1 -0
  67. package/dist/config/index.d.ts +2 -0
  68. package/dist/config/index.d.ts.map +1 -0
  69. package/dist/config/index.js +2 -0
  70. package/dist/config/index.js.map +1 -0
  71. package/dist/config/tx.config.d.ts +31 -0
  72. package/dist/config/tx.config.d.ts.map +1 -0
  73. package/dist/config/tx.config.js +29 -0
  74. package/dist/config/tx.config.js.map +1 -0
  75. package/dist/index.d.ts +15 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +79 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/lsp/client.d.ts +55 -0
  80. package/dist/lsp/client.d.ts.map +1 -0
  81. package/dist/lsp/client.js +252 -0
  82. package/dist/lsp/client.js.map +1 -0
  83. package/dist/lsp/downloader.d.ts +17 -0
  84. package/dist/lsp/downloader.d.ts.map +1 -0
  85. package/dist/lsp/downloader.js +302 -0
  86. package/dist/lsp/downloader.js.map +1 -0
  87. package/dist/lsp/index.d.ts +13 -0
  88. package/dist/lsp/index.d.ts.map +1 -0
  89. package/dist/lsp/index.js +30 -0
  90. package/dist/lsp/index.js.map +1 -0
  91. package/dist/lsp/launch.d.ts +17 -0
  92. package/dist/lsp/launch.d.ts.map +1 -0
  93. package/dist/lsp/launch.js +69 -0
  94. package/dist/lsp/launch.js.map +1 -0
  95. package/dist/lsp/manager.d.ts +19 -0
  96. package/dist/lsp/manager.d.ts.map +1 -0
  97. package/dist/lsp/manager.js +251 -0
  98. package/dist/lsp/manager.js.map +1 -0
  99. package/dist/lsp/server.d.ts +11 -0
  100. package/dist/lsp/server.d.ts.map +1 -0
  101. package/dist/lsp/server.js +302 -0
  102. package/dist/lsp/server.js.map +1 -0
  103. package/dist/lsp/sql.d.ts +11 -0
  104. package/dist/lsp/sql.d.ts.map +1 -0
  105. package/dist/lsp/sql.js +23 -0
  106. package/dist/lsp/sql.js.map +1 -0
  107. package/dist/lsp/types.d.ts +58 -0
  108. package/dist/lsp/types.d.ts.map +1 -0
  109. package/dist/lsp/types.js +13 -0
  110. package/dist/lsp/types.js.map +1 -0
  111. package/dist/modules/ai/ai.service.d.ts +182 -0
  112. package/dist/modules/ai/ai.service.d.ts.map +1 -0
  113. package/dist/modules/ai/ai.service.js +280 -0
  114. package/dist/modules/ai/ai.service.js.map +1 -0
  115. package/dist/modules/ai/ai.types.d.ts +54 -0
  116. package/dist/modules/ai/ai.types.d.ts.map +1 -0
  117. package/dist/modules/ai/ai.types.js +2 -0
  118. package/dist/modules/ai/ai.types.js.map +1 -0
  119. package/dist/modules/ai/index.d.ts +6 -0
  120. package/dist/modules/ai/index.d.ts.map +1 -0
  121. package/dist/modules/ai/index.js +5 -0
  122. package/dist/modules/ai/index.js.map +1 -0
  123. package/dist/modules/ai/openai.provider.d.ts +138 -0
  124. package/dist/modules/ai/openai.provider.d.ts.map +1 -0
  125. package/dist/modules/ai/openai.provider.js +279 -0
  126. package/dist/modules/ai/openai.provider.js.map +1 -0
  127. package/dist/modules/ai/react/index.d.ts +5 -0
  128. package/dist/modules/ai/react/index.d.ts.map +1 -0
  129. package/dist/modules/ai/react/index.js +4 -0
  130. package/dist/modules/ai/react/index.js.map +1 -0
  131. package/dist/modules/ai/react/prompt/role.txt +51 -0
  132. package/dist/modules/ai/react/react.parser.d.ts +75 -0
  133. package/dist/modules/ai/react/react.parser.d.ts.map +1 -0
  134. package/dist/modules/ai/react/react.parser.js +278 -0
  135. package/dist/modules/ai/react/react.parser.js.map +1 -0
  136. package/dist/modules/ai/react/react.prompts.d.ts +26 -0
  137. package/dist/modules/ai/react/react.prompts.d.ts.map +1 -0
  138. package/dist/modules/ai/react/react.prompts.js +180 -0
  139. package/dist/modules/ai/react/react.prompts.js.map +1 -0
  140. package/dist/modules/ai/react/react.types.d.ts +47 -0
  141. package/dist/modules/ai/react/react.types.d.ts.map +1 -0
  142. package/dist/modules/ai/react/react.types.js +2 -0
  143. package/dist/modules/ai/react/react.types.js.map +1 -0
  144. package/dist/modules/ai/react.agent.d.ts +40 -0
  145. package/dist/modules/ai/react.agent.d.ts.map +1 -0
  146. package/dist/modules/ai/react.agent.js +136 -0
  147. package/dist/modules/ai/react.agent.js.map +1 -0
  148. package/dist/modules/ai/summarizer/index.d.ts +4 -0
  149. package/dist/modules/ai/summarizer/index.d.ts.map +1 -0
  150. package/dist/modules/ai/summarizer/index.js +3 -0
  151. package/dist/modules/ai/summarizer/index.js.map +1 -0
  152. package/dist/modules/ai/summarizer/summarizer.prompts.d.ts +15 -0
  153. package/dist/modules/ai/summarizer/summarizer.prompts.d.ts.map +1 -0
  154. package/dist/modules/ai/summarizer/summarizer.prompts.js +47 -0
  155. package/dist/modules/ai/summarizer/summarizer.prompts.js.map +1 -0
  156. package/dist/modules/ai/summarizer/summarizer.service.d.ts +24 -0
  157. package/dist/modules/ai/summarizer/summarizer.service.d.ts.map +1 -0
  158. package/dist/modules/ai/summarizer/summarizer.service.js +153 -0
  159. package/dist/modules/ai/summarizer/summarizer.service.js.map +1 -0
  160. package/dist/modules/ai/summarizer/summarizer.types.d.ts +21 -0
  161. package/dist/modules/ai/summarizer/summarizer.types.d.ts.map +1 -0
  162. package/dist/modules/ai/summarizer/summarizer.types.js +5 -0
  163. package/dist/modules/ai/summarizer/summarizer.types.js.map +1 -0
  164. package/dist/modules/config/config.service.d.ts +32 -0
  165. package/dist/modules/config/config.service.d.ts.map +1 -0
  166. package/dist/modules/config/config.service.js +163 -0
  167. package/dist/modules/config/config.service.js.map +1 -0
  168. package/dist/modules/config/config.types.d.ts +44 -0
  169. package/dist/modules/config/config.types.d.ts.map +1 -0
  170. package/dist/modules/config/config.types.js +21 -0
  171. package/dist/modules/config/config.types.js.map +1 -0
  172. package/dist/modules/config/index.d.ts +10 -0
  173. package/dist/modules/config/index.d.ts.map +1 -0
  174. package/dist/modules/config/index.js +10 -0
  175. package/dist/modules/config/index.js.map +1 -0
  176. package/dist/modules/context/context.service.d.ts +46 -0
  177. package/dist/modules/context/context.service.d.ts.map +1 -0
  178. package/dist/modules/context/context.service.js +216 -0
  179. package/dist/modules/context/context.service.js.map +1 -0
  180. package/dist/modules/context/context.types.d.ts +30 -0
  181. package/dist/modules/context/context.types.d.ts.map +1 -0
  182. package/dist/modules/context/context.types.js +5 -0
  183. package/dist/modules/context/context.types.js.map +1 -0
  184. package/dist/modules/context/index.d.ts +10 -0
  185. package/dist/modules/context/index.d.ts.map +1 -0
  186. package/dist/modules/context/index.js +10 -0
  187. package/dist/modules/context/index.js.map +1 -0
  188. package/dist/modules/db/db.service.d.ts +97 -0
  189. package/dist/modules/db/db.service.d.ts.map +1 -0
  190. package/dist/modules/db/db.service.js +387 -0
  191. package/dist/modules/db/db.service.js.map +1 -0
  192. package/dist/modules/db/db.types.d.ts +8 -0
  193. package/dist/modules/db/db.types.d.ts.map +1 -0
  194. package/dist/modules/db/db.types.js +7 -0
  195. package/dist/modules/db/db.types.js.map +1 -0
  196. package/dist/modules/db/index.d.ts +10 -0
  197. package/dist/modules/db/index.d.ts.map +1 -0
  198. package/dist/modules/db/index.js +9 -0
  199. package/dist/modules/db/index.js.map +1 -0
  200. package/dist/modules/logger/index.d.ts +2 -0
  201. package/dist/modules/logger/index.d.ts.map +1 -0
  202. package/dist/modules/logger/index.js +2 -0
  203. package/dist/modules/logger/index.js.map +1 -0
  204. package/dist/modules/logger/logger.d.ts +26 -0
  205. package/dist/modules/logger/logger.d.ts.map +1 -0
  206. package/dist/modules/logger/logger.js +57 -0
  207. package/dist/modules/logger/logger.js.map +1 -0
  208. package/dist/modules/memory/index.d.ts +9 -0
  209. package/dist/modules/memory/index.d.ts.map +1 -0
  210. package/dist/modules/memory/index.js +9 -0
  211. package/dist/modules/memory/index.js.map +1 -0
  212. package/dist/modules/memory/memory.service.d.ts +191 -0
  213. package/dist/modules/memory/memory.service.d.ts.map +1 -0
  214. package/dist/modules/memory/memory.service.js +282 -0
  215. package/dist/modules/memory/memory.service.js.map +1 -0
  216. package/dist/modules/memory/memory.types.d.ts +13 -0
  217. package/dist/modules/memory/memory.types.d.ts.map +1 -0
  218. package/dist/modules/memory/memory.types.js +5 -0
  219. package/dist/modules/memory/memory.types.js.map +1 -0
  220. package/dist/modules/session/index.d.ts +9 -0
  221. package/dist/modules/session/index.d.ts.map +1 -0
  222. package/dist/modules/session/index.js +9 -0
  223. package/dist/modules/session/index.js.map +1 -0
  224. package/dist/modules/session/session.service.d.ts +252 -0
  225. package/dist/modules/session/session.service.d.ts.map +1 -0
  226. package/dist/modules/session/session.service.js +406 -0
  227. package/dist/modules/session/session.service.js.map +1 -0
  228. package/dist/modules/session/session.types.d.ts +34 -0
  229. package/dist/modules/session/session.types.d.ts.map +1 -0
  230. package/dist/modules/session/session.types.js +5 -0
  231. package/dist/modules/session/session.types.js.map +1 -0
  232. package/dist/modules/skill/index.d.ts +8 -0
  233. package/dist/modules/skill/index.d.ts.map +1 -0
  234. package/dist/modules/skill/index.js +7 -0
  235. package/dist/modules/skill/index.js.map +1 -0
  236. package/dist/modules/skill/skill.service.d.ts +72 -0
  237. package/dist/modules/skill/skill.service.d.ts.map +1 -0
  238. package/dist/modules/skill/skill.service.js +283 -0
  239. package/dist/modules/skill/skill.service.js.map +1 -0
  240. package/dist/modules/skill/skill.tool.d.ts +19 -0
  241. package/dist/modules/skill/skill.tool.d.ts.map +1 -0
  242. package/dist/modules/skill/skill.tool.js +92 -0
  243. package/dist/modules/skill/skill.tool.js.map +1 -0
  244. package/dist/modules/skill/skill.txt +18 -0
  245. package/dist/modules/skill/skill.types.d.ts +40 -0
  246. package/dist/modules/skill/skill.types.d.ts.map +1 -0
  247. package/dist/modules/skill/skill.types.js +6 -0
  248. package/dist/modules/skill/skill.types.js.map +1 -0
  249. package/dist/modules/skill/skills.manager.d.ts +30 -0
  250. package/dist/modules/skill/skills.manager.d.ts.map +1 -0
  251. package/dist/modules/skill/skills.manager.js +182 -0
  252. package/dist/modules/skill/skills.manager.js.map +1 -0
  253. package/dist/modules/tools/builtin/bash.d.ts +3 -0
  254. package/dist/modules/tools/builtin/bash.d.ts.map +1 -0
  255. package/dist/modules/tools/builtin/bash.js +124 -0
  256. package/dist/modules/tools/builtin/bash.js.map +1 -0
  257. package/dist/modules/tools/builtin/bash.tool.d.ts +6 -0
  258. package/dist/modules/tools/builtin/bash.tool.d.ts.map +1 -0
  259. package/dist/modules/tools/builtin/bash.tool.js +52 -0
  260. package/dist/modules/tools/builtin/bash.tool.js.map +1 -0
  261. package/dist/modules/tools/builtin/bash.txt +81 -0
  262. package/dist/modules/tools/builtin/code_search.d.ts +3 -0
  263. package/dist/modules/tools/builtin/code_search.d.ts.map +1 -0
  264. package/dist/modules/tools/builtin/code_search.js +85 -0
  265. package/dist/modules/tools/builtin/code_search.js.map +1 -0
  266. package/dist/modules/tools/builtin/code_search.txt +18 -0
  267. package/dist/modules/tools/builtin/edit-file.tool.d.ts +6 -0
  268. package/dist/modules/tools/builtin/edit-file.tool.d.ts.map +1 -0
  269. package/dist/modules/tools/builtin/edit-file.tool.js +58 -0
  270. package/dist/modules/tools/builtin/edit-file.tool.js.map +1 -0
  271. package/dist/modules/tools/builtin/edit_file.d.ts +3 -0
  272. package/dist/modules/tools/builtin/edit_file.d.ts.map +1 -0
  273. package/dist/modules/tools/builtin/edit_file.js +69 -0
  274. package/dist/modules/tools/builtin/edit_file.js.map +1 -0
  275. package/dist/modules/tools/builtin/edit_file.txt +10 -0
  276. package/dist/modules/tools/builtin/glob.d.ts +3 -0
  277. package/dist/modules/tools/builtin/glob.d.ts.map +1 -0
  278. package/dist/modules/tools/builtin/glob.js +84 -0
  279. package/dist/modules/tools/builtin/glob.js.map +1 -0
  280. package/dist/modules/tools/builtin/glob.tool.d.ts +6 -0
  281. package/dist/modules/tools/builtin/glob.tool.d.ts.map +1 -0
  282. package/dist/modules/tools/builtin/glob.tool.js +81 -0
  283. package/dist/modules/tools/builtin/glob.tool.js.map +1 -0
  284. package/dist/modules/tools/builtin/glob.txt +10 -0
  285. package/dist/modules/tools/builtin/grep.d.ts +3 -0
  286. package/dist/modules/tools/builtin/grep.d.ts.map +1 -0
  287. package/dist/modules/tools/builtin/grep.js +93 -0
  288. package/dist/modules/tools/builtin/grep.js.map +1 -0
  289. package/dist/modules/tools/builtin/grep.tool.d.ts +6 -0
  290. package/dist/modules/tools/builtin/grep.tool.d.ts.map +1 -0
  291. package/dist/modules/tools/builtin/grep.tool.js +96 -0
  292. package/dist/modules/tools/builtin/grep.tool.js.map +1 -0
  293. package/dist/modules/tools/builtin/grep.txt +12 -0
  294. package/dist/modules/tools/builtin/index.d.ts +8 -0
  295. package/dist/modules/tools/builtin/index.d.ts.map +1 -0
  296. package/dist/modules/tools/builtin/index.js +88 -0
  297. package/dist/modules/tools/builtin/index.js.map +1 -0
  298. package/dist/modules/tools/builtin/lsp.d.ts +7 -0
  299. package/dist/modules/tools/builtin/lsp.d.ts.map +1 -0
  300. package/dist/modules/tools/builtin/lsp.js +125 -0
  301. package/dist/modules/tools/builtin/lsp.js.map +1 -0
  302. package/dist/modules/tools/builtin/lsp.txt +19 -0
  303. package/dist/modules/tools/builtin/memory.d.ts +3 -0
  304. package/dist/modules/tools/builtin/memory.d.ts.map +1 -0
  305. package/dist/modules/tools/builtin/memory.js +76 -0
  306. package/dist/modules/tools/builtin/memory.js.map +1 -0
  307. package/dist/modules/tools/builtin/memory.txt +36 -0
  308. package/dist/modules/tools/builtin/read-file.tool.d.ts +6 -0
  309. package/dist/modules/tools/builtin/read-file.tool.d.ts.map +1 -0
  310. package/dist/modules/tools/builtin/read-file.tool.js +46 -0
  311. package/dist/modules/tools/builtin/read-file.tool.js.map +1 -0
  312. package/dist/modules/tools/builtin/read_file.d.ts +3 -0
  313. package/dist/modules/tools/builtin/read_file.d.ts.map +1 -0
  314. package/dist/modules/tools/builtin/read_file.js +99 -0
  315. package/dist/modules/tools/builtin/read_file.js.map +1 -0
  316. package/dist/modules/tools/builtin/read_file.txt +15 -0
  317. package/dist/modules/tools/builtin/todo_read.d.ts +6 -0
  318. package/dist/modules/tools/builtin/todo_read.d.ts.map +1 -0
  319. package/dist/modules/tools/builtin/todo_read.js +24 -0
  320. package/dist/modules/tools/builtin/todo_read.js.map +1 -0
  321. package/dist/modules/tools/builtin/todo_read.txt +14 -0
  322. package/dist/modules/tools/builtin/todo_write.d.ts +6 -0
  323. package/dist/modules/tools/builtin/todo_write.d.ts.map +1 -0
  324. package/dist/modules/tools/builtin/todo_write.js +45 -0
  325. package/dist/modules/tools/builtin/todo_write.js.map +1 -0
  326. package/dist/modules/tools/builtin/todo_write.txt +46 -0
  327. package/dist/modules/tools/builtin/web_fetch.d.ts +3 -0
  328. package/dist/modules/tools/builtin/web_fetch.d.ts.map +1 -0
  329. package/dist/modules/tools/builtin/web_fetch.js +51 -0
  330. package/dist/modules/tools/builtin/web_fetch.js.map +1 -0
  331. package/dist/modules/tools/builtin/web_fetch.txt +15 -0
  332. package/dist/modules/tools/builtin/web_search.d.ts +3 -0
  333. package/dist/modules/tools/builtin/web_search.d.ts.map +1 -0
  334. package/dist/modules/tools/builtin/web_search.js +99 -0
  335. package/dist/modules/tools/builtin/web_search.js.map +1 -0
  336. package/dist/modules/tools/builtin/web_search.txt +16 -0
  337. package/dist/modules/tools/builtin/write-file.tool.d.ts +6 -0
  338. package/dist/modules/tools/builtin/write-file.tool.d.ts.map +1 -0
  339. package/dist/modules/tools/builtin/write-file.tool.js +38 -0
  340. package/dist/modules/tools/builtin/write-file.tool.js.map +1 -0
  341. package/dist/modules/tools/builtin/write_file.d.ts +3 -0
  342. package/dist/modules/tools/builtin/write_file.d.ts.map +1 -0
  343. package/dist/modules/tools/builtin/write_file.js +46 -0
  344. package/dist/modules/tools/builtin/write_file.js.map +1 -0
  345. package/dist/modules/tools/builtin/write_file.txt +9 -0
  346. package/dist/modules/tools/index.d.ts +11 -0
  347. package/dist/modules/tools/index.d.ts.map +1 -0
  348. package/dist/modules/tools/index.js +10 -0
  349. package/dist/modules/tools/index.js.map +1 -0
  350. package/dist/modules/tools/tool.service.d.ts +207 -0
  351. package/dist/modules/tools/tool.service.d.ts.map +1 -0
  352. package/dist/modules/tools/tool.service.js +331 -0
  353. package/dist/modules/tools/tool.service.js.map +1 -0
  354. package/dist/modules/tools/tool.types.d.ts +39 -0
  355. package/dist/modules/tools/tool.types.d.ts.map +1 -0
  356. package/dist/modules/tools/tool.types.js +5 -0
  357. package/dist/modules/tools/tool.types.js.map +1 -0
  358. package/dist/web/index.d.ts +10 -0
  359. package/dist/web/index.d.ts.map +1 -0
  360. package/dist/web/index.js +20 -0
  361. package/dist/web/index.js.map +1 -0
  362. package/dist/web/web.service.d.ts +95 -0
  363. package/dist/web/web.service.d.ts.map +1 -0
  364. package/dist/web/web.service.js +396 -0
  365. package/dist/web/web.service.js.map +1 -0
  366. package/package.json +57 -0
  367. package/web/dist/assets/Layout-Bb76CGAL.js +1 -0
  368. package/web/dist/assets/element-icons-B-tDfklg.woff +0 -0
  369. package/web/dist/assets/element-icons-_lZGOqcG.ttf +0 -0
  370. package/web/dist/assets/index-DQRR0ggU.js +199 -0
  371. package/web/dist/assets/index-KTH-myBB.css +1 -0
  372. package/web/dist/index.html +14 -0
  373. package/web/index.html +13 -0
  374. package/web/package.json +24 -0
@@ -0,0 +1,639 @@
1
+ /**
2
+ * App 主组件
3
+ *
4
+ * 这是 TXCode CLI 模式的主界面组件,使用 Ink (类 React) 库渲染到终端
5
+ *
6
+ * 核心功能:
7
+ * 1. 用户输入处理 - 接收键盘输入,支持命令和聊天
8
+ * 2. 消息展示 - 显示用户/AI 的聊天消息
9
+ * 3. AI 调用 - 调用 AI 服务处理用户问题
10
+ * 4. 工具调用展示 - 实时显示 AI 的思考和工具调用过程
11
+ * 5. 文件选择 - 支持 @ 符号触发文件选择器
12
+ * 6. 模型选择 - 支持 /model 命令切换 AI 模型
13
+ * 7. 状态显示 - 显示 Token 使用量、压缩比例等
14
+ */
15
+ import React, { useState, useEffect, useCallback } from 'react';
16
+ import { Box, Text, useInput, useApp, Static } from 'ink';
17
+ import { v4 as uuidv4 } from 'uuid';
18
+ import * as fs from 'fs';
19
+ import * as path from 'path';
20
+ import { executeCommand } from '../cli/commands.js';
21
+ import { sessionService } from '../modules/session/index.js';
22
+ import { memoryService } from '../modules/memory/index.js';
23
+ import { aiService } from '../modules/ai/index.js';
24
+ /**
25
+ * App 主组件函数
26
+ *
27
+ * 组件状态说明:
28
+ * - input: 用户输入的文本
29
+ * - cursorPosition: 光标位置 (支持光标左右移动)
30
+ * - messages: 聊天消息列表
31
+ * - status: 当前状态 (idle/thinking)
32
+ * - currentSession: 当前会话 ID
33
+ * - error: 错误信息
34
+ * - tokenStats: Token 统计
35
+ * - compressionPercent: 压缩百分比
36
+ * - currentModelName: 当前模型名称
37
+ * - fileSelectMode: 文件选择模式
38
+ * - modelSelectMode: 模型选择模式
39
+ * - inputHistory: 输入历史 (上下键遍历)
40
+ */
41
+ export function App() {
42
+ // ========== Hooks ==========
43
+ // useApp() 提供 Ink 应用的上下文,包含 exit() 方法用于退出程序
44
+ const { exit } = useApp();
45
+ // ========== 输入相关状态 ==========
46
+ /** 用户输入的文本 */
47
+ const [input, setInput] = useState('');
48
+ /** 光标在输入框中的位置 */
49
+ const [cursorPosition, setCursorPosition] = useState(0);
50
+ // ========== 消息相关状态 ==========
51
+ /** 聊天消息列表 */
52
+ const [messages, setMessages] = useState([]);
53
+ /** 当前状态:idle(空闲) 或 thinking(AI 思考中) */
54
+ const [status, setStatus] = useState('idle');
55
+ /** 当前会话 ID */
56
+ const [currentSession, setCurrentSession] = useState(null);
57
+ /** 错误信息 */
58
+ const [error, setError] = useState(null);
59
+ // ========== 统计相关状态 ==========
60
+ /** Token 统计 */
61
+ const [tokenStats, setTokenStats] = useState({
62
+ promptTokens: 0,
63
+ completionTokens: 0,
64
+ totalTokens: 0,
65
+ });
66
+ /** 压缩百分比 */
67
+ const [compressionPercent, setCompressionPercent] = useState(0);
68
+ /** 当前模型名称 */
69
+ const [currentModelName, setCurrentModelName] = useState('deepseek-chat');
70
+ // ========== 文件选择相关状态 ==========
71
+ /** 是否处于文件选择模式 */
72
+ const [fileSelectMode, setFileSelectMode] = useState(false);
73
+ /** 当前目录路径 */
74
+ const [currentDir, setCurrentDir] = useState('');
75
+ /** 基础目录路径 */
76
+ const [baseDir, setBaseDir] = useState('');
77
+ /** 文件列表 */
78
+ const [fileList, setFileList] = useState([]);
79
+ /** 当前选中项索引 */
80
+ const [selectedIndex, setSelectedIndex] = useState(0);
81
+ // ========== 模型选择相关状态 ==========
82
+ /** 是否处于模型选择模式 */
83
+ const [modelSelectMode, setModelSelectMode] = useState(false);
84
+ /** 模型列表 */
85
+ const [modelList, setModelList] = useState([]);
86
+ /** 当前选中模型索引 */
87
+ const [modelSelectedIndex, setModelSelectedIndex] = useState(0);
88
+ // ========== 输入历史相关状态 ==========
89
+ /** 输入历史记录 */
90
+ const [inputHistory, setInputHistory] = useState([]);
91
+ /** 当前历史记录索引 */
92
+ const [historyIndex, setHistoryIndex] = useState(-1);
93
+ // ========== 辅助函数 ==========
94
+ /**
95
+ * 加载目录内容 - 用于文件选择器
96
+ * @param dir - 目录路径
97
+ * @param resetBaseDir - 是否重置基础目录
98
+ */
99
+ const loadDirectory = useCallback((dir, resetBaseDir = false) => {
100
+ try {
101
+ // 设置基础目录 (如果是首次或需要重置)
102
+ if (!baseDir || resetBaseDir) {
103
+ setBaseDir(dir);
104
+ }
105
+ const files = [];
106
+ // 添加父目录选项 (..)
107
+ const parentDir = path.dirname(dir);
108
+ if (parentDir !== dir) {
109
+ files.push({ name: '..', path: parentDir, isDirectory: true });
110
+ }
111
+ // 读取目录内容
112
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
113
+ for (const entry of entries) {
114
+ if (entry.name === '.' || entry.name === '..')
115
+ continue;
116
+ const fullPath = path.join(dir, entry.name);
117
+ files.push({
118
+ name: entry.name,
119
+ path: fullPath,
120
+ isDirectory: entry.isDirectory()
121
+ });
122
+ }
123
+ files.sort((a, b) => {
124
+ if (a.name === '..')
125
+ return -1;
126
+ if (b.name === '..')
127
+ return 1;
128
+ if (a.isDirectory && !b.isDirectory)
129
+ return -1;
130
+ if (!a.isDirectory && b.isDirectory)
131
+ return 1;
132
+ return a.name.localeCompare(b.name);
133
+ });
134
+ setFileList(files.slice(0, 50));
135
+ setCurrentDir(dir);
136
+ setSelectedIndex(0);
137
+ }
138
+ catch (err) {
139
+ setFileList([]);
140
+ }
141
+ }, [baseDir]);
142
+ /**
143
+ * 加载可用模型列表 - 从配置服务获取所有可用的 AI 模型
144
+ */
145
+ const loadModels = useCallback(async () => {
146
+ try {
147
+ const { configService } = await import('../modules/config/index.js');
148
+ const providers = configService.getProviders();
149
+ const models = [];
150
+ // 遍历所有提供商,获取其模型列表
151
+ for (const provider of providers) {
152
+ const providerModels = configService.getModels(provider.id);
153
+ for (const m of providerModels) {
154
+ models.push({ id: m.id, name: `${provider.name}/${m.name}` });
155
+ }
156
+ }
157
+ // 如果没有模型,添加默认模型
158
+ if (models.length === 0) {
159
+ models.push({ id: 'deepseek-chat', name: 'deepseek-chat' });
160
+ }
161
+ setModelList(models);
162
+ setModelSelectedIndex(0);
163
+ }
164
+ catch (err) {
165
+ setModelList([]);
166
+ }
167
+ }, []);
168
+ // ========== 初始化 ==========
169
+ useEffect(() => {
170
+ const session = sessionService.getCurrent();
171
+ if (session) {
172
+ setCurrentSession(session.id);
173
+ const msgs = memoryService.getPermanentMessages(session.id);
174
+ setMessages(msgs.map(m => ({
175
+ id: uuidv4(),
176
+ role: m.role,
177
+ content: m.content,
178
+ timestamp: new Date(m.createdAt),
179
+ })));
180
+ }
181
+ const loadCurrentModel = async () => {
182
+ try {
183
+ const { configService } = await import('../modules/config/index.js');
184
+ const provider = configService.getDefaultProvider();
185
+ if (provider) {
186
+ setCurrentModelName(provider.name);
187
+ }
188
+ }
189
+ catch { }
190
+ };
191
+ loadCurrentModel();
192
+ }, []);
193
+ // ========== 消息管理 ==========
194
+ /**
195
+ * 添加消息到列表 - 防止重复添加相同的消息
196
+ * @param role - 消息角色
197
+ * @param content - 消息内容
198
+ */
199
+ const addMessage = useCallback((role, content) => {
200
+ const contentKey = `${role}:${content.slice(0, 100)}`;
201
+ setMessages(prev => {
202
+ // 检查最后一条消息是否相同 (防重复)
203
+ const lastMsg = prev[prev.length - 1];
204
+ if (lastMsg && lastMsg.role === role && lastMsg.content === content) {
205
+ return prev;
206
+ }
207
+ const msg = {
208
+ id: uuidv4(),
209
+ role,
210
+ content,
211
+ timestamp: new Date(),
212
+ };
213
+ return [...prev, msg];
214
+ });
215
+ }, []);
216
+ // ========== 核心业务逻辑 ==========
217
+ /**
218
+ * 提交用户输入 - 处理流程:
219
+ * 1. 检查输入是否有效
220
+ * 2. 如果是命令 (/开头),执行命令
221
+ * 3. 否则调用 AI 服务处理
222
+ * 4. 更新 UI 和状态
223
+ */
224
+ const handleSubmit = useCallback(async () => {
225
+ // 验证输入:不能为空,且当前不在思考中
226
+ if (!input.trim() || status === 'thinking')
227
+ return;
228
+ // ========== 准备输入 ==========
229
+ const trimmedInput = input.trim();
230
+ setInput(''); // 清空输入框
231
+ setCursorPosition(0); // 重置光标位置
232
+ setError(null); // 清空错误
233
+ // ========== 命令处理 ==========
234
+ // 以 / 开头的输入作为命令处理
235
+ if (trimmedInput.startsWith('/')) {
236
+ const result = await executeCommand(trimmedInput);
237
+ if (result.message) {
238
+ addMessage('system', result.message);
239
+ }
240
+ if (result.data?.exit) {
241
+ exit();
242
+ }
243
+ if (result.data?.id && result.success) {
244
+ setCurrentSession(result.data.id);
245
+ }
246
+ return;
247
+ }
248
+ addMessage('user', trimmedInput);
249
+ let sessionId = currentSession;
250
+ if (!sessionId) {
251
+ const session = sessionService.create('Chat Session');
252
+ sessionId = session.id;
253
+ setCurrentSession(sessionId);
254
+ sessionService.switchTo(sessionId);
255
+ }
256
+ setStatus('thinking');
257
+ try {
258
+ const result = await aiService.chatWithReAct(trimmedInput, {
259
+ sessionId: sessionId,
260
+ memoryService,
261
+ onStep: (state, iteration) => {
262
+ if (state.thought) {
263
+ const thoughtPreview = state.thought.length > 150
264
+ ? state.thought.slice(0, 150) + '...'
265
+ : state.thought;
266
+ addMessage('system', `💭 ${thoughtPreview}`);
267
+ }
268
+ const actionNames = {
269
+ 'read_file': '读取文件',
270
+ 'write_file': '创建文件',
271
+ 'edit_file': '编辑文件',
272
+ 'execute_bash': '执行命令',
273
+ 'bash': '执行命令',
274
+ 'find_files': '搜索文件',
275
+ 'grep': '搜索内容',
276
+ 'glob': '文件匹配',
277
+ 'loadSkill': '加载技能',
278
+ 'todowrite': '任务列表',
279
+ 'task': '任务代理',
280
+ 'webfetch': '网页获取',
281
+ 'question': '提问',
282
+ };
283
+ const actionName = actionNames[state.action] || state.action;
284
+ let stepInfo = `🔧 ${actionName}`;
285
+ if (state.actionInput) {
286
+ try {
287
+ const inputObj = typeof state.actionInput === 'string'
288
+ ? JSON.parse(state.actionInput)
289
+ : state.actionInput;
290
+ if (state.action === 'read_file') {
291
+ const offset = inputObj.offset ?? 1;
292
+ const limit = inputObj.limit ?? 300;
293
+ stepInfo += `: ${inputObj.file_path} (行${offset}-${offset + limit - 1})`;
294
+ }
295
+ else if (state.action === 'edit_file') {
296
+ stepInfo += `: ${inputObj.file_path}`;
297
+ }
298
+ else if (state.action === 'write_file') {
299
+ stepInfo += `: ${inputObj.file_path}`;
300
+ }
301
+ else if (state.action === 'execute_bash' || state.action === 'bash') {
302
+ stepInfo += `: ${inputObj.command?.slice(0, 50)}`;
303
+ }
304
+ else if (state.action === 'find_files' || state.action === 'glob') {
305
+ stepInfo += `: ${inputObj.pattern}`;
306
+ }
307
+ else if (state.action === 'grep') {
308
+ stepInfo += `: ${inputObj.pattern}`;
309
+ }
310
+ else if (state.action === 'loadSkill') {
311
+ stepInfo += `: ${inputObj.skillPath}`;
312
+ }
313
+ else if (state.action === 'webfetch') {
314
+ stepInfo += `: ${inputObj.url?.slice(0, 50)}`;
315
+ }
316
+ else if (state.action === 'todowrite') {
317
+ if (inputObj.todos && Array.isArray(inputObj.todos)) {
318
+ stepInfo += `: ${inputObj.todos.length} 个任务`;
319
+ }
320
+ if (state.observation && typeof state.observation === 'object' && state.observation.metadata?.todos) {
321
+ const todos = state.observation.metadata.todos;
322
+ const statusIcons = {
323
+ completed: '✅',
324
+ in_progress: '🔄',
325
+ pending: '⬜',
326
+ cancelled: '❌'
327
+ };
328
+ for (const todo of todos) {
329
+ const icon = statusIcons[todo.status] || '⬜';
330
+ const name = todo.content || todo.name || '';
331
+ addMessage('system', ` ${icon} ${name}`);
332
+ }
333
+ }
334
+ }
335
+ else if (state.action === 'question') {
336
+ stepInfo += `: ${inputObj.questions?.length || 0} 个问题`;
337
+ }
338
+ else {
339
+ const keys = Object.keys(inputObj);
340
+ if (keys.length > 0) {
341
+ const firstKey = keys[0];
342
+ const val = inputObj[firstKey];
343
+ if (typeof val === 'string') {
344
+ stepInfo += `: ${val.slice(0, 50)}`;
345
+ }
346
+ else if (typeof val === 'number') {
347
+ stepInfo += `: ${val}`;
348
+ }
349
+ }
350
+ }
351
+ }
352
+ catch { }
353
+ }
354
+ if (state.observation) {
355
+ const obsStr = typeof state.observation === 'string'
356
+ ? state.observation
357
+ : JSON.stringify(state.observation);
358
+ const isFailed = obsStr.startsWith('错误:') ||
359
+ obsStr.startsWith('Error:') ||
360
+ obsStr.includes('未找到') ||
361
+ obsStr.includes('不存在');
362
+ if (isFailed) {
363
+ addMessage('system', `${stepInfo} ❌`);
364
+ }
365
+ else {
366
+ addMessage('system', `${stepInfo} ✓`);
367
+ }
368
+ }
369
+ else {
370
+ addMessage('system', stepInfo);
371
+ }
372
+ },
373
+ });
374
+ if (result.answer) {
375
+ addMessage('assistant', result.answer);
376
+ memoryService.addMessage(sessionId, 'assistant', result.answer, true);
377
+ }
378
+ if (result.usage) {
379
+ setTokenStats(prev => ({
380
+ promptTokens: prev.promptTokens + result.usage.promptTokens,
381
+ completionTokens: prev.completionTokens + result.usage.completionTokens,
382
+ totalTokens: prev.totalTokens + result.usage.totalTokens,
383
+ }));
384
+ }
385
+ if (sessionId) {
386
+ const stats = memoryService.getSessionStats(sessionId);
387
+ if (stats.totalMessages > 0) {
388
+ const compressPercent = Math.round((stats.compressedCount / stats.totalMessages) * 100);
389
+ setCompressionPercent(compressPercent);
390
+ }
391
+ }
392
+ }
393
+ catch (err) {
394
+ const errorMsg = err instanceof Error ? err.message : 'Unknown error';
395
+ setError(errorMsg);
396
+ addMessage('system', `错误: ${errorMsg}`);
397
+ }
398
+ finally {
399
+ setStatus('idle');
400
+ }
401
+ }, [input, status, currentSession, addMessage, exit]);
402
+ // ========== 键盘输入处理 ==========
403
+ /**
404
+ * useInput Hook - 处理所有键盘输入事件
405
+ * 根据当前模式 (普通/文件选择/模型选择) 执行不同逻辑
406
+ */
407
+ useInput((char, key) => {
408
+ // ========== 文件选择模式 ==========
409
+ if (fileSelectMode) {
410
+ const keyAny = key;
411
+ if (keyAny.upArrow) {
412
+ setSelectedIndex(prev => Math.max(0, prev - 1));
413
+ }
414
+ else if (keyAny.downArrow) {
415
+ setSelectedIndex(prev => Math.min(fileList.length - 1, prev + 1));
416
+ }
417
+ else if (key.return) {
418
+ if (fileList[selectedIndex]) {
419
+ const selected = fileList[selectedIndex];
420
+ if (selected.isDirectory || selected.name === '..') {
421
+ const newInput = input + selected.name + '/';
422
+ setInput(newInput);
423
+ setCursorPosition(newInput.length);
424
+ loadDirectory(selected.path);
425
+ }
426
+ else {
427
+ const fullPath = selected.path;
428
+ const effectiveBaseDir = baseDir || process.cwd();
429
+ let relativePath = path.relative(effectiveBaseDir, fullPath);
430
+ relativePath = relativePath.split(path.sep).join('/');
431
+ const atIndex = input.lastIndexOf('@');
432
+ const newInput = atIndex !== -1
433
+ ? input.slice(0, atIndex + 1) + relativePath + ' '
434
+ : input + relativePath + ' ';
435
+ setInput(newInput);
436
+ setCursorPosition(newInput.length);
437
+ setFileSelectMode(false);
438
+ setFileList([]);
439
+ setBaseDir('');
440
+ }
441
+ }
442
+ }
443
+ else if (key.escape) {
444
+ setFileSelectMode(false);
445
+ setFileList([]);
446
+ setBaseDir('');
447
+ }
448
+ return;
449
+ }
450
+ if (modelSelectMode) {
451
+ const keyAny = key;
452
+ if (keyAny.upArrow) {
453
+ setModelSelectedIndex(prev => Math.max(0, prev - 1));
454
+ }
455
+ else if (keyAny.downArrow) {
456
+ setModelSelectedIndex(prev => Math.min(modelList.length - 1, prev + 1));
457
+ }
458
+ else if (key.return) {
459
+ if (modelList[modelSelectedIndex]) {
460
+ setCurrentModelName(modelList[modelSelectedIndex].name);
461
+ addMessage('system', `已切换到模型: ${modelList[modelSelectedIndex].name}`);
462
+ }
463
+ setModelSelectMode(false);
464
+ setModelList([]);
465
+ }
466
+ else if (key.escape) {
467
+ setModelSelectMode(false);
468
+ setModelList([]);
469
+ }
470
+ return;
471
+ }
472
+ const keyAny = key;
473
+ if (keyAny.upArrow) {
474
+ if (inputHistory.length > 0) {
475
+ const newIndex = historyIndex < inputHistory.length - 1 ? historyIndex + 1 : historyIndex;
476
+ setHistoryIndex(newIndex);
477
+ const historyInput = inputHistory[inputHistory.length - 1 - newIndex];
478
+ setInput(historyInput);
479
+ setCursorPosition(historyInput.length);
480
+ }
481
+ return;
482
+ }
483
+ if (keyAny.downArrow) {
484
+ if (historyIndex > 0) {
485
+ const newIndex = historyIndex - 1;
486
+ setHistoryIndex(newIndex);
487
+ const historyInput = inputHistory[inputHistory.length - 1 - newIndex];
488
+ setInput(historyInput);
489
+ setCursorPosition(historyInput.length);
490
+ }
491
+ else if (historyIndex === 0) {
492
+ setHistoryIndex(-1);
493
+ setInput('');
494
+ setCursorPosition(0);
495
+ }
496
+ return;
497
+ }
498
+ if (keyAny.leftArrow) {
499
+ setCursorPosition(prev => Math.max(0, prev - 1));
500
+ return;
501
+ }
502
+ if (keyAny.rightArrow) {
503
+ setCursorPosition(prev => Math.min(input.length, prev + 1));
504
+ return;
505
+ }
506
+ if (key.return) {
507
+ if (input === '/model') {
508
+ setModelSelectMode(true);
509
+ loadModels();
510
+ return;
511
+ }
512
+ if (input.trim()) {
513
+ setInputHistory(prev => [...prev, input]);
514
+ setHistoryIndex(-1);
515
+ }
516
+ handleSubmit();
517
+ }
518
+ else if (key.backspace || key.delete) {
519
+ if (cursorPosition > 0) {
520
+ const newInput = input.slice(0, cursorPosition - 1) + input.slice(cursorPosition);
521
+ setInput(newInput);
522
+ setCursorPosition(prev => prev - 1);
523
+ setHistoryIndex(-1);
524
+ if ((newInput.endsWith('/') || newInput.endsWith(path.sep)) && newInput.length > 1) {
525
+ const inputPath = newInput.endsWith('//') || newInput.endsWith(path.sep + path.sep)
526
+ ? newInput.slice(0, -1)
527
+ : newInput;
528
+ const dirPath = path.isAbsolute(inputPath) ? inputPath : path.resolve(process.cwd(), inputPath);
529
+ setFileSelectMode(true);
530
+ loadDirectory(dirPath);
531
+ }
532
+ }
533
+ }
534
+ else if (key.escape) {
535
+ exit();
536
+ }
537
+ else if (char && !key.ctrl && !key.meta) {
538
+ const newInput = input.slice(0, cursorPosition) + char + input.slice(cursorPosition);
539
+ setInput(newInput);
540
+ setCursorPosition(prev => prev + char.length);
541
+ setHistoryIndex(-1);
542
+ if (char === '@') {
543
+ setFileSelectMode(true);
544
+ loadDirectory(process.cwd(), true);
545
+ }
546
+ if (newInput === '/model') {
547
+ setModelSelectMode(true);
548
+ loadModels();
549
+ }
550
+ }
551
+ });
552
+ // ========== UI 渲染 ==========
553
+ const sessionText = currentSession ? `${currentSession.slice(0, 8)}` : '无会话';
554
+ const isToolCall = (content) => {
555
+ return content.startsWith('🔧') ||
556
+ content.startsWith('✓') ||
557
+ content.startsWith('* ');
558
+ };
559
+ const isThought = (content) => {
560
+ return content.startsWith('💭') || content.startsWith('~ ');
561
+ };
562
+ const formatToolCall = (content) => {
563
+ if (content.startsWith('🔧 ')) {
564
+ return content.replace('🔧 ', '* ').replace(' ✓', '').replace(' ❌', '');
565
+ }
566
+ return content;
567
+ };
568
+ const formatThought = (content) => {
569
+ if (content.startsWith('💭 ')) {
570
+ return content.replace('💭 ', '~ ');
571
+ }
572
+ return content;
573
+ };
574
+ return (React.createElement(Box, { flexDirection: "column", padding: 1 },
575
+ React.createElement(Box, { flexDirection: "column" },
576
+ React.createElement(Static, { items: messages }, (msg) => {
577
+ const isError = msg.role === 'system' && msg.content.startsWith('错误:');
578
+ const isTool = msg.role === 'system' && isToolCall(msg.content);
579
+ const isThoughtMsg = msg.role === 'system' && isThought(msg.content);
580
+ if (msg.role === 'user') {
581
+ return (React.createElement(Box, { key: msg.id, backgroundColor: "#121212", paddingX: 2, paddingY: 1, borderLeft: "2", borderColor: "#27272a", marginBottom: 1 },
582
+ React.createElement(Text, { bold: true, color: "#f4f4f5" },
583
+ "# ",
584
+ msg.content)));
585
+ }
586
+ if (msg.role === 'assistant') {
587
+ return (React.createElement(Box, { key: msg.id, marginBottom: 1, paddingLeft: 2 },
588
+ React.createElement(Text, { color: "#d4d4d8" }, msg.content)));
589
+ }
590
+ if (isThoughtMsg) {
591
+ return (React.createElement(Box, { key: msg.id, marginBottom: 1, paddingLeft: 2 },
592
+ React.createElement(Text, { bold: true, color: "cyan" }, formatThought(msg.content))));
593
+ }
594
+ if (isTool) {
595
+ return (React.createElement(Box, { key: msg.id, marginBottom: 1, paddingLeft: 2 },
596
+ React.createElement(Text, { dimColor: true }, formatToolCall(msg.content))));
597
+ }
598
+ if (isError) {
599
+ return (React.createElement(Box, { key: msg.id, marginBottom: 1, paddingLeft: 2 },
600
+ React.createElement(Text, { color: "red" }, msg.content)));
601
+ }
602
+ return null;
603
+ }),
604
+ status === 'thinking' && (React.createElement(Box, { marginBottom: 1, paddingLeft: 2 },
605
+ React.createElement(Text, { bold: true, color: "cyan" }, "\u25A3 Build"),
606
+ React.createElement(Text, { dimColor: true },
607
+ " \u00B7 ",
608
+ currentModelName)))),
609
+ React.createElement(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, marginBottom: 1 },
610
+ React.createElement(Text, { dimColor: true }, '> '),
611
+ React.createElement(Text, null, input.slice(0, cursorPosition)),
612
+ React.createElement(Text, { color: "cyan" }, "\u258B"),
613
+ React.createElement(Text, null, input.slice(cursorPosition))),
614
+ fileSelectMode && (React.createElement(Box, { flexDirection: "column", marginBottom: 1, paddingX: 1 },
615
+ React.createElement(Text, { dimColor: true },
616
+ currentDir || '/',
617
+ " (\u2191\u2193 \u9009\u62E9, Enter \u786E\u8BA4, ESC \u53D6\u6D88)"),
618
+ fileList.slice(0, 15).map((file, index) => (React.createElement(Box, { key: file.path },
619
+ React.createElement(Text, null, index === selectedIndex ? (React.createElement(Text, { bold: true, color: "green" }, `▶ ${file.name}${file.isDirectory ? '/' : ''}`)) : (React.createElement(Text, { dimColor: true }, ` ${file.name}${file.isDirectory ? '/' : ''}`)))))),
620
+ fileList.length === 0 && (React.createElement(Text, { dimColor: true }, "\u7A7A\u76EE\u5F55...")))),
621
+ modelSelectMode && (React.createElement(Box, { flexDirection: "column", marginBottom: 1, paddingX: 1 },
622
+ React.createElement(Text, { dimColor: true }, "\u9009\u62E9\u6A21\u578B (\u2191\u2193 \u9009\u62E9, Enter \u786E\u8BA4, ESC \u53D6\u6D88):"),
623
+ modelList.map((model, index) => (React.createElement(Box, { key: model.id },
624
+ React.createElement(Text, null, index === modelSelectedIndex ? (React.createElement(Text, { bold: true, color: "green" }, `▶ ${model.name}`)) : (React.createElement(Text, { dimColor: true }, ` ${model.name}`)))))),
625
+ modelList.length === 0 && (React.createElement(Text, { dimColor: true }, "\u672A\u627E\u5230\u6A21\u578B...")))),
626
+ React.createElement(Box, { paddingX: 2 },
627
+ React.createElement(Text, { dimColor: true },
628
+ "\u5C31\u7EEA | \u6A21\u578B: ",
629
+ currentModelName,
630
+ tokenStats.totalTokens > 0 && ` | Token: ${tokenStats.totalTokens}`,
631
+ compressionPercent > 0 && ` | 压缩: ${compressionPercent}%`,
632
+ ` | 会话: ${sessionText}`,
633
+ ' | /help 帮助 | ESC 退出')),
634
+ error && (React.createElement(Box, { marginTop: 1 },
635
+ React.createElement(Text, { color: "red" },
636
+ "\u9519\u8BEF: ",
637
+ error)))));
638
+ }
639
+ //# sourceMappingURL=App.js.map