@nanocollective/nanocoder 1.11.3

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 (392) hide show
  1. package/LICENSE.md +23 -0
  2. package/README.md +366 -0
  3. package/dist/app/hooks/useAppInitialization.d.ts +26 -0
  4. package/dist/app/hooks/useAppInitialization.d.ts.map +1 -0
  5. package/dist/app/hooks/useAppInitialization.js +151 -0
  6. package/dist/app/hooks/useAppInitialization.js.map +1 -0
  7. package/dist/app/hooks/useAppState.d.ts +84 -0
  8. package/dist/app/hooks/useAppState.d.ts.map +1 -0
  9. package/dist/app/hooks/useAppState.js +162 -0
  10. package/dist/app/hooks/useAppState.js.map +1 -0
  11. package/dist/app/hooks/useChatHandler.d.ts +26 -0
  12. package/dist/app/hooks/useChatHandler.d.ts.map +1 -0
  13. package/dist/app/hooks/useChatHandler.js +532 -0
  14. package/dist/app/hooks/useChatHandler.js.map +1 -0
  15. package/dist/app/hooks/useDirectoryTrust.d.ts +15 -0
  16. package/dist/app/hooks/useDirectoryTrust.d.ts.map +1 -0
  17. package/dist/app/hooks/useDirectoryTrust.js +77 -0
  18. package/dist/app/hooks/useDirectoryTrust.js.map +1 -0
  19. package/dist/app/hooks/useModeHandlers.d.ts +31 -0
  20. package/dist/app/hooks/useModeHandlers.d.ts.map +1 -0
  21. package/dist/app/hooks/useModeHandlers.js +98 -0
  22. package/dist/app/hooks/useModeHandlers.js.map +1 -0
  23. package/dist/app/hooks/useToolHandler.d.ts +32 -0
  24. package/dist/app/hooks/useToolHandler.d.ts.map +1 -0
  25. package/dist/app/hooks/useToolHandler.js +154 -0
  26. package/dist/app/hooks/useToolHandler.js.map +1 -0
  27. package/dist/app/utils/appUtils.d.ts +4 -0
  28. package/dist/app/utils/appUtils.d.ts.map +1 -0
  29. package/dist/app/utils/appUtils.js +147 -0
  30. package/dist/app/utils/appUtils.js.map +1 -0
  31. package/dist/app/utils/conversationState.d.ts +68 -0
  32. package/dist/app/utils/conversationState.d.ts.map +1 -0
  33. package/dist/app/utils/conversationState.js +199 -0
  34. package/dist/app/utils/conversationState.js.map +1 -0
  35. package/dist/app.d.ts +2 -0
  36. package/dist/app.d.ts.map +1 -0
  37. package/dist/app.js +193 -0
  38. package/dist/app.js.map +1 -0
  39. package/dist/cli.d.ts +3 -0
  40. package/dist/cli.d.ts.map +1 -0
  41. package/dist/cli.js +6 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/client-factory.d.ts +6 -0
  44. package/dist/client-factory.d.ts.map +1 -0
  45. package/dist/client-factory.js +111 -0
  46. package/dist/client-factory.js.map +1 -0
  47. package/dist/command-parser.d.ts +5 -0
  48. package/dist/command-parser.d.ts.map +1 -0
  49. package/dist/command-parser.js +36 -0
  50. package/dist/command-parser.js.map +1 -0
  51. package/dist/commands/clear.d.ts +3 -0
  52. package/dist/commands/clear.d.ts.map +1 -0
  53. package/dist/commands/clear.js +17 -0
  54. package/dist/commands/clear.js.map +1 -0
  55. package/dist/commands/custom-commands.d.ts +3 -0
  56. package/dist/commands/custom-commands.d.ts.map +1 -0
  57. package/dist/commands/custom-commands.js +41 -0
  58. package/dist/commands/custom-commands.js.map +1 -0
  59. package/dist/commands/debug.d.ts +3 -0
  60. package/dist/commands/debug.d.ts.map +1 -0
  61. package/dist/commands/debug.js +86 -0
  62. package/dist/commands/debug.js.map +1 -0
  63. package/dist/commands/exit.d.ts +3 -0
  64. package/dist/commands/exit.d.ts.map +1 -0
  65. package/dist/commands/exit.js +17 -0
  66. package/dist/commands/exit.js.map +1 -0
  67. package/dist/commands/export.d.ts +3 -0
  68. package/dist/commands/export.d.ts.map +1 -0
  69. package/dist/commands/export.js +63 -0
  70. package/dist/commands/export.js.map +1 -0
  71. package/dist/commands/help.d.ts +3 -0
  72. package/dist/commands/help.d.ts.map +1 -0
  73. package/dist/commands/help.js +31 -0
  74. package/dist/commands/help.js.map +1 -0
  75. package/dist/commands/index.d.ts +13 -0
  76. package/dist/commands/index.d.ts.map +1 -0
  77. package/dist/commands/index.js +13 -0
  78. package/dist/commands/index.js.map +1 -0
  79. package/dist/commands/init.d.ts +3 -0
  80. package/dist/commands/init.d.ts.map +1 -0
  81. package/dist/commands/init.js +214 -0
  82. package/dist/commands/init.js.map +1 -0
  83. package/dist/commands/mcp.d.ts +9 -0
  84. package/dist/commands/mcp.d.ts.map +1 -0
  85. package/dist/commands/mcp.js +41 -0
  86. package/dist/commands/mcp.js.map +1 -0
  87. package/dist/commands/model.d.ts +3 -0
  88. package/dist/commands/model.d.ts.map +1 -0
  89. package/dist/commands/model.js +11 -0
  90. package/dist/commands/model.js.map +1 -0
  91. package/dist/commands/provider.d.ts +3 -0
  92. package/dist/commands/provider.d.ts.map +1 -0
  93. package/dist/commands/provider.js +11 -0
  94. package/dist/commands/provider.js.map +1 -0
  95. package/dist/commands/theme.d.ts +3 -0
  96. package/dist/commands/theme.d.ts.map +1 -0
  97. package/dist/commands/theme.js +11 -0
  98. package/dist/commands/theme.js.map +1 -0
  99. package/dist/commands/update.d.ts +3 -0
  100. package/dist/commands/update.d.ts.map +1 -0
  101. package/dist/commands/update.js +10 -0
  102. package/dist/commands/update.js.map +1 -0
  103. package/dist/commands.d.ts +16 -0
  104. package/dist/commands.d.ts.map +1 -0
  105. package/dist/commands.js +46 -0
  106. package/dist/commands.js.map +1 -0
  107. package/dist/components/assistant-message.d.ts +4 -0
  108. package/dist/components/assistant-message.d.ts.map +1 -0
  109. package/dist/components/assistant-message.js +43 -0
  110. package/dist/components/assistant-message.js.map +1 -0
  111. package/dist/components/bash-execution-indicator.d.ts +4 -0
  112. package/dist/components/bash-execution-indicator.d.ts.map +1 -0
  113. package/dist/components/bash-execution-indicator.js +9 -0
  114. package/dist/components/bash-execution-indicator.js.map +1 -0
  115. package/dist/components/cancelling-indicator.d.ts +3 -0
  116. package/dist/components/cancelling-indicator.d.ts.map +1 -0
  117. package/dist/components/cancelling-indicator.js +10 -0
  118. package/dist/components/cancelling-indicator.js.map +1 -0
  119. package/dist/components/chat-queue.d.ts +4 -0
  120. package/dist/components/chat-queue.d.ts.map +1 -0
  121. package/dist/components/chat-queue.js +23 -0
  122. package/dist/components/chat-queue.js.map +1 -0
  123. package/dist/components/custom-commands.d.ts +7 -0
  124. package/dist/components/custom-commands.d.ts.map +1 -0
  125. package/dist/components/custom-commands.js +27 -0
  126. package/dist/components/custom-commands.js.map +1 -0
  127. package/dist/components/error-message.d.ts +7 -0
  128. package/dist/components/error-message.d.ts.map +1 -0
  129. package/dist/components/error-message.js +12 -0
  130. package/dist/components/error-message.js.map +1 -0
  131. package/dist/components/info-message.d.ts +6 -0
  132. package/dist/components/info-message.d.ts.map +1 -0
  133. package/dist/components/info-message.js +11 -0
  134. package/dist/components/info-message.js.map +1 -0
  135. package/dist/components/model-selector.d.ts +10 -0
  136. package/dist/components/model-selector.d.ts.map +1 -0
  137. package/dist/components/model-selector.js +59 -0
  138. package/dist/components/model-selector.js.map +1 -0
  139. package/dist/components/provider-selector.d.ts +9 -0
  140. package/dist/components/provider-selector.d.ts.map +1 -0
  141. package/dist/components/provider-selector.js +36 -0
  142. package/dist/components/provider-selector.js.map +1 -0
  143. package/dist/components/security-disclaimer.d.ts +7 -0
  144. package/dist/components/security-disclaimer.d.ts.map +1 -0
  145. package/dist/components/security-disclaimer.js +36 -0
  146. package/dist/components/security-disclaimer.js.map +1 -0
  147. package/dist/components/status.d.ts +6 -0
  148. package/dist/components/status.d.ts.map +1 -0
  149. package/dist/components/status.js +35 -0
  150. package/dist/components/status.js.map +1 -0
  151. package/dist/components/success-message.d.ts +6 -0
  152. package/dist/components/success-message.d.ts.map +1 -0
  153. package/dist/components/success-message.js +11 -0
  154. package/dist/components/success-message.js.map +1 -0
  155. package/dist/components/theme-selector.d.ts +8 -0
  156. package/dist/components/theme-selector.d.ts.map +1 -0
  157. package/dist/components/theme-selector.js +40 -0
  158. package/dist/components/theme-selector.js.map +1 -0
  159. package/dist/components/thinking-indicator.d.ts +4 -0
  160. package/dist/components/thinking-indicator.d.ts.map +1 -0
  161. package/dist/components/thinking-indicator.js +32 -0
  162. package/dist/components/thinking-indicator.js.map +1 -0
  163. package/dist/components/tool-confirmation.d.ts +9 -0
  164. package/dist/components/tool-confirmation.d.ts.map +1 -0
  165. package/dist/components/tool-confirmation.js +72 -0
  166. package/dist/components/tool-confirmation.js.map +1 -0
  167. package/dist/components/tool-execution-indicator.d.ts +3 -0
  168. package/dist/components/tool-execution-indicator.d.ts.map +1 -0
  169. package/dist/components/tool-execution-indicator.js +9 -0
  170. package/dist/components/tool-execution-indicator.js.map +1 -0
  171. package/dist/components/tool-message.d.ts +10 -0
  172. package/dist/components/tool-message.d.ts.map +1 -0
  173. package/dist/components/tool-message.js +16 -0
  174. package/dist/components/tool-message.js.map +1 -0
  175. package/dist/components/update-message.d.ts +7 -0
  176. package/dist/components/update-message.d.ts.map +1 -0
  177. package/dist/components/update-message.js +93 -0
  178. package/dist/components/update-message.js.map +1 -0
  179. package/dist/components/user-input.d.ts +10 -0
  180. package/dist/components/user-input.d.ts.map +1 -0
  181. package/dist/components/user-input.js +188 -0
  182. package/dist/components/user-input.js.map +1 -0
  183. package/dist/components/user-message.d.ts +4 -0
  184. package/dist/components/user-message.d.ts.map +1 -0
  185. package/dist/components/user-message.js +15 -0
  186. package/dist/components/user-message.js.map +1 -0
  187. package/dist/components/welcome-message.d.ts +3 -0
  188. package/dist/components/welcome-message.d.ts.map +1 -0
  189. package/dist/components/welcome-message.js +21 -0
  190. package/dist/components/welcome-message.js.map +1 -0
  191. package/dist/config/index.d.ts +10 -0
  192. package/dist/config/index.d.ts.map +1 -0
  193. package/dist/config/index.js +44 -0
  194. package/dist/config/index.js.map +1 -0
  195. package/dist/config/logging.d.ts +14 -0
  196. package/dist/config/logging.d.ts.map +1 -0
  197. package/dist/config/logging.js +58 -0
  198. package/dist/config/logging.js.map +1 -0
  199. package/dist/config/preferences.d.ts +7 -0
  200. package/dist/config/preferences.d.ts.map +1 -0
  201. package/dist/config/preferences.js +46 -0
  202. package/dist/config/preferences.js.map +1 -0
  203. package/dist/config/themes.d.ts +6 -0
  204. package/dist/config/themes.d.ts.map +1 -0
  205. package/dist/config/themes.js +295 -0
  206. package/dist/config/themes.js.map +1 -0
  207. package/dist/custom-commands/executor.d.ts +12 -0
  208. package/dist/custom-commands/executor.d.ts.map +1 -0
  209. package/dist/custom-commands/executor.js +45 -0
  210. package/dist/custom-commands/executor.js.map +1 -0
  211. package/dist/custom-commands/index.d.ts +4 -0
  212. package/dist/custom-commands/index.d.ts.map +1 -0
  213. package/dist/custom-commands/index.js +4 -0
  214. package/dist/custom-commands/index.js.map +1 -0
  215. package/dist/custom-commands/loader.d.ts +41 -0
  216. package/dist/custom-commands/loader.d.ts.map +1 -0
  217. package/dist/custom-commands/loader.js +129 -0
  218. package/dist/custom-commands/loader.js.map +1 -0
  219. package/dist/custom-commands/parser.d.ts +10 -0
  220. package/dist/custom-commands/parser.d.ts.map +1 -0
  221. package/dist/custom-commands/parser.js +181 -0
  222. package/dist/custom-commands/parser.js.map +1 -0
  223. package/dist/hooks/useInputState.d.ts +14 -0
  224. package/dist/hooks/useInputState.d.ts.map +1 -0
  225. package/dist/hooks/useInputState.js +66 -0
  226. package/dist/hooks/useInputState.js.map +1 -0
  227. package/dist/hooks/useTerminalWidth.d.ts +2 -0
  228. package/dist/hooks/useTerminalWidth.d.ts.map +1 -0
  229. package/dist/hooks/useTerminalWidth.js +20 -0
  230. package/dist/hooks/useTerminalWidth.js.map +1 -0
  231. package/dist/hooks/useTheme.d.ts +9 -0
  232. package/dist/hooks/useTheme.d.ts.map +1 -0
  233. package/dist/hooks/useTheme.js +10 -0
  234. package/dist/hooks/useTheme.js.map +1 -0
  235. package/dist/hooks/useUIState.d.ts +19 -0
  236. package/dist/hooks/useUIState.d.ts.map +1 -0
  237. package/dist/hooks/useUIState.js +46 -0
  238. package/dist/hooks/useUIState.js.map +1 -0
  239. package/dist/init/agents-template-generator.d.ts +29 -0
  240. package/dist/init/agents-template-generator.d.ts.map +1 -0
  241. package/dist/init/agents-template-generator.js +340 -0
  242. package/dist/init/agents-template-generator.js.map +1 -0
  243. package/dist/init/existing-rules-extractor.d.ts +43 -0
  244. package/dist/init/existing-rules-extractor.d.ts.map +1 -0
  245. package/dist/init/existing-rules-extractor.js +226 -0
  246. package/dist/init/existing-rules-extractor.js.map +1 -0
  247. package/dist/init/file-scanner.d.ts +40 -0
  248. package/dist/init/file-scanner.d.ts.map +1 -0
  249. package/dist/init/file-scanner.js +153 -0
  250. package/dist/init/file-scanner.js.map +1 -0
  251. package/dist/init/framework-detector.d.ts +57 -0
  252. package/dist/init/framework-detector.d.ts.map +1 -0
  253. package/dist/init/framework-detector.js +277 -0
  254. package/dist/init/framework-detector.js.map +1 -0
  255. package/dist/init/language-detector.d.ts +31 -0
  256. package/dist/init/language-detector.d.ts.map +1 -0
  257. package/dist/init/language-detector.js +205 -0
  258. package/dist/init/language-detector.js.map +1 -0
  259. package/dist/init/project-analyzer.d.ts +62 -0
  260. package/dist/init/project-analyzer.d.ts.map +1 -0
  261. package/dist/init/project-analyzer.js +294 -0
  262. package/dist/init/project-analyzer.js.map +1 -0
  263. package/dist/langgraph-client.d.ts +20 -0
  264. package/dist/langgraph-client.d.ts.map +1 -0
  265. package/dist/langgraph-client.js +245 -0
  266. package/dist/langgraph-client.js.map +1 -0
  267. package/dist/mcp/mcp-client.d.ts +23 -0
  268. package/dist/mcp/mcp-client.d.ts.map +1 -0
  269. package/dist/mcp/mcp-client.js +194 -0
  270. package/dist/mcp/mcp-client.js.map +1 -0
  271. package/dist/mcp/mcp-tool-adapter.d.ts +22 -0
  272. package/dist/mcp/mcp-tool-adapter.d.ts.map +1 -0
  273. package/dist/mcp/mcp-tool-adapter.js +49 -0
  274. package/dist/mcp/mcp-tool-adapter.js.map +1 -0
  275. package/dist/message-handler.d.ts +7 -0
  276. package/dist/message-handler.d.ts.map +1 -0
  277. package/dist/message-handler.js +53 -0
  278. package/dist/message-handler.js.map +1 -0
  279. package/dist/prompt-history.d.ts +14 -0
  280. package/dist/prompt-history.d.ts.map +1 -0
  281. package/dist/prompt-history.js +88 -0
  282. package/dist/prompt-history.js.map +1 -0
  283. package/dist/tool-calling/index.d.ts +6 -0
  284. package/dist/tool-calling/index.d.ts.map +1 -0
  285. package/dist/tool-calling/index.js +5 -0
  286. package/dist/tool-calling/index.js.map +1 -0
  287. package/dist/tool-calling/json-parser.d.ts +7 -0
  288. package/dist/tool-calling/json-parser.d.ts.map +1 -0
  289. package/dist/tool-calling/json-parser.js +168 -0
  290. package/dist/tool-calling/json-parser.js.map +1 -0
  291. package/dist/tool-calling/xml-parser.d.ts +34 -0
  292. package/dist/tool-calling/xml-parser.d.ts.map +1 -0
  293. package/dist/tool-calling/xml-parser.js +113 -0
  294. package/dist/tool-calling/xml-parser.js.map +1 -0
  295. package/dist/tools/create-file.d.ts +3 -0
  296. package/dist/tools/create-file.d.ts.map +1 -0
  297. package/dist/tools/create-file.js +66 -0
  298. package/dist/tools/create-file.js.map +1 -0
  299. package/dist/tools/delete-lines.d.ts +3 -0
  300. package/dist/tools/delete-lines.d.ts.map +1 -0
  301. package/dist/tools/delete-lines.js +218 -0
  302. package/dist/tools/delete-lines.js.map +1 -0
  303. package/dist/tools/execute-bash.d.ts +3 -0
  304. package/dist/tools/execute-bash.d.ts.map +1 -0
  305. package/dist/tools/execute-bash.js +107 -0
  306. package/dist/tools/execute-bash.js.map +1 -0
  307. package/dist/tools/index.d.ts +7 -0
  308. package/dist/tools/index.d.ts.map +1 -0
  309. package/dist/tools/index.js +23 -0
  310. package/dist/tools/index.js.map +1 -0
  311. package/dist/tools/insert-lines.d.ts +3 -0
  312. package/dist/tools/insert-lines.d.ts.map +1 -0
  313. package/dist/tools/insert-lines.js +185 -0
  314. package/dist/tools/insert-lines.js.map +1 -0
  315. package/dist/tools/read-file.d.ts +3 -0
  316. package/dist/tools/read-file.d.ts.map +1 -0
  317. package/dist/tools/read-file.js +81 -0
  318. package/dist/tools/read-file.js.map +1 -0
  319. package/dist/tools/read-many-files.d.ts +3 -0
  320. package/dist/tools/read-many-files.d.ts.map +1 -0
  321. package/dist/tools/read-many-files.js +109 -0
  322. package/dist/tools/read-many-files.js.map +1 -0
  323. package/dist/tools/replace-lines.d.ts +3 -0
  324. package/dist/tools/replace-lines.d.ts.map +1 -0
  325. package/dist/tools/replace-lines.js +220 -0
  326. package/dist/tools/replace-lines.js.map +1 -0
  327. package/dist/tools/tool-manager.d.ts +54 -0
  328. package/dist/tools/tool-manager.d.ts.map +1 -0
  329. package/dist/tools/tool-manager.js +108 -0
  330. package/dist/tools/tool-manager.js.map +1 -0
  331. package/dist/types/app.d.ts +46 -0
  332. package/dist/types/app.d.ts.map +1 -0
  333. package/dist/types/app.js +2 -0
  334. package/dist/types/app.js.map +1 -0
  335. package/dist/types/commands.d.ts +36 -0
  336. package/dist/types/commands.d.ts.map +1 -0
  337. package/dist/types/commands.js +2 -0
  338. package/dist/types/commands.js.map +1 -0
  339. package/dist/types/components.d.ts +87 -0
  340. package/dist/types/components.d.ts.map +1 -0
  341. package/dist/types/components.js +2 -0
  342. package/dist/types/components.js.map +1 -0
  343. package/dist/types/config.d.ts +35 -0
  344. package/dist/types/config.d.ts.map +1 -0
  345. package/dist/types/config.js +2 -0
  346. package/dist/types/config.js.map +1 -0
  347. package/dist/types/core.d.ts +57 -0
  348. package/dist/types/core.d.ts.map +1 -0
  349. package/dist/types/core.js +2 -0
  350. package/dist/types/core.js.map +1 -0
  351. package/dist/types/hooks.d.ts +26 -0
  352. package/dist/types/hooks.d.ts.map +1 -0
  353. package/dist/types/hooks.js +2 -0
  354. package/dist/types/hooks.js.map +1 -0
  355. package/dist/types/index.d.ts +11 -0
  356. package/dist/types/index.d.ts.map +1 -0
  357. package/dist/types/index.js +12 -0
  358. package/dist/types/index.js.map +1 -0
  359. package/dist/types/mcp.d.ts +19 -0
  360. package/dist/types/mcp.d.ts.map +1 -0
  361. package/dist/types/mcp.js +2 -0
  362. package/dist/types/mcp.js.map +1 -0
  363. package/dist/types/tools.d.ts +31 -0
  364. package/dist/types/tools.d.ts.map +1 -0
  365. package/dist/types/tools.js +2 -0
  366. package/dist/types/tools.js.map +1 -0
  367. package/dist/types/ui.d.ts +22 -0
  368. package/dist/types/ui.d.ts.map +1 -0
  369. package/dist/types/ui.js +2 -0
  370. package/dist/types/ui.js.map +1 -0
  371. package/dist/types/utils.d.ts +19 -0
  372. package/dist/types/utils.d.ts.map +1 -0
  373. package/dist/types/utils.js +2 -0
  374. package/dist/types/utils.js.map +1 -0
  375. package/dist/utils/message-queue.d.ts +8 -0
  376. package/dist/utils/message-queue.d.ts.map +1 -0
  377. package/dist/utils/message-queue.js +50 -0
  378. package/dist/utils/message-queue.js.map +1 -0
  379. package/dist/utils/programming-language-helper.d.ts +2 -0
  380. package/dist/utils/programming-language-helper.d.ts.map +1 -0
  381. package/dist/utils/programming-language-helper.js +32 -0
  382. package/dist/utils/programming-language-helper.js.map +1 -0
  383. package/dist/utils/prompt-processor.d.ts +6 -0
  384. package/dist/utils/prompt-processor.d.ts.map +1 -0
  385. package/dist/utils/prompt-processor.js +103 -0
  386. package/dist/utils/prompt-processor.js.map +1 -0
  387. package/dist/utils/update-checker.d.ts +6 -0
  388. package/dist/utils/update-checker.d.ts.map +1 -0
  389. package/dist/utils/update-checker.js +120 -0
  390. package/dist/utils/update-checker.js.map +1 -0
  391. package/package.json +97 -0
  392. package/source/app/prompts/main-prompt.md +107 -0
@@ -0,0 +1,68 @@
1
+ import type { Message, ToolCall } from '../../types/core.js';
2
+ export interface ConversationProgress {
3
+ originalTask: string;
4
+ currentStep: number;
5
+ totalEstimatedSteps: number;
6
+ completedActions: string[];
7
+ nextAction?: string;
8
+ toolCallsExecuted: number;
9
+ lastToolCall?: ToolCall;
10
+ isRepeatingAction: boolean;
11
+ contextSummary?: string;
12
+ }
13
+ export interface ConversationState {
14
+ progress: ConversationProgress;
15
+ lastAssistantMessage?: Message;
16
+ conversationStartTime: number;
17
+ toolExecutionCount: number;
18
+ recentToolCalls: ToolCall[];
19
+ }
20
+ export declare class ConversationStateManager {
21
+ private state;
22
+ private maxRecentToolCalls;
23
+ /**
24
+ * Initialize conversation state from the first user message
25
+ */
26
+ initializeState(userMessage: string): ConversationState;
27
+ /**
28
+ * Update state after tool execution
29
+ */
30
+ updateAfterToolExecution(toolCall: ToolCall, result: string): void;
31
+ /**
32
+ * Update assistant message in state
33
+ */
34
+ updateAssistantMessage(message: Message): void;
35
+ /**
36
+ * Generate context-aware continuation prompt
37
+ */
38
+ generateContinuationContext(): string;
39
+ /**
40
+ * Get current state
41
+ */
42
+ getState(): ConversationState | null;
43
+ /**
44
+ * Reset state
45
+ */
46
+ reset(): void;
47
+ /**
48
+ * Estimate number of steps for a task
49
+ */
50
+ private estimateSteps;
51
+ /**
52
+ * Detect if the current tool call is repetitive
53
+ */
54
+ private detectRepetition;
55
+ /**
56
+ * Describe what a tool action accomplished
57
+ */
58
+ private describeToolAction;
59
+ /**
60
+ * Generate intelligent next step suggestions
61
+ */
62
+ private generateNextStepSuggestion;
63
+ /**
64
+ * Detect if a message is a simple greeting to avoid over-interpreting
65
+ */
66
+ private isSimpleGreeting;
67
+ }
68
+ //# sourceMappingURL=conversationState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversationState.d.ts","sourceRoot":"","sources":["../../../source/app/utils/conversationState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,QAAQ,EAAC,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,QAAQ,EAAE,CAAC;CAC5B;AAED,qBAAa,wBAAwB;IACpC,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,kBAAkB,CAAK;IAE/B;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB;IAmBvD;;OAEG;IACH,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA8BlE;;OAEG;IACH,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK9C;;OAEG;IACH,2BAA2B,IAAI,MAAM;IA2BrC;;OAEG;IACH,QAAQ,IAAI,iBAAiB,GAAG,IAAI;IAIpC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAuClC;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAaxB"}
@@ -0,0 +1,199 @@
1
+ export class ConversationStateManager {
2
+ state = null;
3
+ maxRecentToolCalls = 5;
4
+ /**
5
+ * Initialize conversation state from the first user message
6
+ */
7
+ initializeState(userMessage) {
8
+ // Detect if this is a simple greeting to avoid over-interpreting
9
+ const isSimpleGreeting = this.isSimpleGreeting(userMessage);
10
+ this.state = {
11
+ progress: {
12
+ originalTask: userMessage,
13
+ currentStep: 1,
14
+ totalEstimatedSteps: isSimpleGreeting ? 1 : this.estimateSteps(userMessage),
15
+ completedActions: [],
16
+ toolCallsExecuted: 0,
17
+ isRepeatingAction: false,
18
+ },
19
+ conversationStartTime: Date.now(),
20
+ toolExecutionCount: 0,
21
+ recentToolCalls: [],
22
+ };
23
+ return this.state;
24
+ }
25
+ /**
26
+ * Update state after tool execution
27
+ */
28
+ updateAfterToolExecution(toolCall, result) {
29
+ if (!this.state)
30
+ return;
31
+ // Add to recent tool calls
32
+ this.state.recentToolCalls.push(toolCall);
33
+ if (this.state.recentToolCalls.length > this.maxRecentToolCalls) {
34
+ this.state.recentToolCalls.shift();
35
+ }
36
+ // Check for repetition
37
+ const isRepeating = this.detectRepetition(toolCall);
38
+ // Update progress
39
+ this.state.progress.toolCallsExecuted++;
40
+ this.state.progress.lastToolCall = toolCall;
41
+ this.state.progress.isRepeatingAction = isRepeating;
42
+ this.state.progress.currentStep++;
43
+ // Add completed action
44
+ const actionDescription = this.describeToolAction(toolCall, result);
45
+ this.state.progress.completedActions.push(actionDescription);
46
+ // Update total estimated steps if needed
47
+ if (this.state.progress.currentStep > this.state.progress.totalEstimatedSteps) {
48
+ this.state.progress.totalEstimatedSteps = this.state.progress.currentStep + 2;
49
+ }
50
+ this.state.toolExecutionCount++;
51
+ }
52
+ /**
53
+ * Update assistant message in state
54
+ */
55
+ updateAssistantMessage(message) {
56
+ if (!this.state)
57
+ return;
58
+ this.state.lastAssistantMessage = message;
59
+ }
60
+ /**
61
+ * Generate context-aware continuation prompt
62
+ */
63
+ generateContinuationContext() {
64
+ if (!this.state)
65
+ return '';
66
+ const progress = this.state.progress;
67
+ let context = `[Task Progress: Step ${progress.currentStep} of ~${progress.totalEstimatedSteps}]\n`;
68
+ context += `[Original Task: "${progress.originalTask}"]\n\n`;
69
+ if (progress.completedActions.length > 0) {
70
+ context += `Recent actions completed:\n`;
71
+ progress.completedActions.slice(-3).forEach((action, i) => {
72
+ context += `${i + 1}. ${action}\n`;
73
+ });
74
+ context += '\n';
75
+ }
76
+ if (progress.isRepeatingAction) {
77
+ context += `⚠️ Warning: You may be repeating a similar action. Consider a different approach or move to the next step.\n\n`;
78
+ }
79
+ // Suggest next logical step
80
+ context += this.generateNextStepSuggestion();
81
+ context += `Continue working toward completing: "${progress.originalTask}"`;
82
+ return context;
83
+ }
84
+ /**
85
+ * Get current state
86
+ */
87
+ getState() {
88
+ return this.state;
89
+ }
90
+ /**
91
+ * Reset state
92
+ */
93
+ reset() {
94
+ this.state = null;
95
+ }
96
+ /**
97
+ * Estimate number of steps for a task
98
+ */
99
+ estimateSteps(task) {
100
+ const taskLower = task.toLowerCase();
101
+ // Simple heuristics based on task complexity
102
+ if (taskLower.includes('create') || taskLower.includes('build') || taskLower.includes('implement')) {
103
+ return 5;
104
+ }
105
+ if (taskLower.includes('fix') || taskLower.includes('debug') || taskLower.includes('troubleshoot')) {
106
+ return 4;
107
+ }
108
+ if (taskLower.includes('analyze') || taskLower.includes('understand') || taskLower.includes('explain')) {
109
+ return 3;
110
+ }
111
+ if (taskLower.includes('read') || taskLower.includes('show') || taskLower.includes('list')) {
112
+ return 2;
113
+ }
114
+ // Default based on length
115
+ return Math.max(3, Math.min(8, Math.ceil(task.length / 50)));
116
+ }
117
+ /**
118
+ * Detect if the current tool call is repetitive
119
+ */
120
+ detectRepetition(toolCall) {
121
+ if (this.state.recentToolCalls.length < 2)
122
+ return false;
123
+ const recent = this.state.recentToolCalls.slice(-2);
124
+ return recent.some(prevCall => prevCall.function.name === toolCall.function.name &&
125
+ JSON.stringify(prevCall.function.arguments) === JSON.stringify(toolCall.function.arguments));
126
+ }
127
+ /**
128
+ * Describe what a tool action accomplished
129
+ */
130
+ describeToolAction(toolCall, _result) {
131
+ const toolName = toolCall.function.name;
132
+ const args = toolCall.function.arguments;
133
+ switch (toolName) {
134
+ case 'read_file':
135
+ return `Read file: ${args.filename || args.path || 'unknown'}`;
136
+ case 'write_file':
137
+ case 'create_file':
138
+ return `Created/wrote file: ${args.filename || args.path || 'unknown'}`;
139
+ case 'edit_file':
140
+ return `Edited file: ${args.filename || args.path || 'unknown'}`;
141
+ case 'execute_bash':
142
+ return `Executed command: ${(args.command || '').substring(0, 50)}${args.command?.length > 50 ? '...' : ''}`;
143
+ default:
144
+ return `Used ${toolName}`;
145
+ }
146
+ }
147
+ /**
148
+ * Generate intelligent next step suggestions
149
+ */
150
+ generateNextStepSuggestion() {
151
+ if (!this.state)
152
+ return '';
153
+ const progress = this.state.progress;
154
+ const lastTool = progress.lastToolCall;
155
+ if (!lastTool) {
156
+ return 'Consider what information you need to gather first.\n\n';
157
+ }
158
+ const suggestions = [];
159
+ // Suggest logical next steps based on last tool
160
+ switch (lastTool.function.name) {
161
+ case 'read_file':
162
+ suggestions.push('Based on the file contents, determine what changes or analysis are needed.');
163
+ break;
164
+ case 'execute_bash':
165
+ suggestions.push('Review the command output and decide on the next action.');
166
+ break;
167
+ case 'create_file':
168
+ case 'write_file':
169
+ suggestions.push('Consider testing or verifying the file you just created.');
170
+ break;
171
+ case 'edit_file':
172
+ suggestions.push('Consider testing the changes or making additional modifications.');
173
+ break;
174
+ default:
175
+ suggestions.push('Use the tool result to inform your next action.');
176
+ }
177
+ // Add progress-based suggestions
178
+ if (progress.currentStep / progress.totalEstimatedSteps > 0.7) {
179
+ suggestions.push('You\'re near completion - focus on finalizing and testing.');
180
+ }
181
+ return suggestions.join(' ') + '\n\n';
182
+ }
183
+ /**
184
+ * Detect if a message is a simple greeting to avoid over-interpreting
185
+ */
186
+ isSimpleGreeting(message) {
187
+ const lowerMessage = message.toLowerCase().trim();
188
+ const greetings = [
189
+ 'hi', 'hello', 'hey', 'hiya', 'howdy',
190
+ 'good morning', 'good afternoon', 'good evening',
191
+ 'what\'s up', 'whats up', 'sup', 'yo'
192
+ ];
193
+ // Check if the entire message is just a greeting (with optional punctuation)
194
+ const cleanMessage = lowerMessage.replace(/[!?.,\s]+$/g, '');
195
+ return greetings.includes(cleanMessage) ||
196
+ (cleanMessage.length <= 10 && greetings.some(greeting => cleanMessage.includes(greeting)));
197
+ }
198
+ }
199
+ //# sourceMappingURL=conversationState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversationState.js","sourceRoot":"","sources":["../../../source/app/utils/conversationState.ts"],"names":[],"mappings":"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"}
package/dist/app.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export default function App(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../source/app.tsx"],"names":[],"mappings":"AAmCA,MAAM,CAAC,OAAO,UAAU,GAAG,4CA0S1B"}
package/dist/app.js ADDED
@@ -0,0 +1,193 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useApp } from 'ink';
3
+ import WelcomeMessage from './components/welcome-message.js';
4
+ import React from 'react';
5
+ import { getThemeColors } from './config/themes.js';
6
+ import { ThemeContext } from './hooks/useTheme.js';
7
+ import UserInput from './components/user-input.js';
8
+ import Status from './components/status.js';
9
+ import ChatQueue from './components/chat-queue.js';
10
+ import ModelSelector from './components/model-selector.js';
11
+ import ProviderSelector from './components/provider-selector.js';
12
+ import ThemeSelector from './components/theme-selector.js';
13
+ import ThinkingIndicator from './components/thinking-indicator.js';
14
+ import CancellingIndicator from './components/cancelling-indicator.js';
15
+ import ToolConfirmation from './components/tool-confirmation.js';
16
+ import ToolExecutionIndicator from './components/tool-execution-indicator.js';
17
+ import BashExecutionIndicator from './components/bash-execution-indicator.js';
18
+ import { setGlobalMessageQueue } from './utils/message-queue.js';
19
+ import Spinner from 'ink-spinner';
20
+ import SecurityDisclaimer from './components/security-disclaimer.js';
21
+ // Import extracted hooks and utilities
22
+ import { useAppState } from './app/hooks/useAppState.js';
23
+ import { useChatHandler } from './app/hooks/useChatHandler.js';
24
+ import { useToolHandler } from './app/hooks/useToolHandler.js';
25
+ import { useModeHandlers } from './app/hooks/useModeHandlers.js';
26
+ import { useAppInitialization } from './app/hooks/useAppInitialization.js';
27
+ import { useDirectoryTrust } from './app/hooks/useDirectoryTrust.js';
28
+ import { createClearMessagesHandler, handleMessageSubmission, } from './app/utils/appUtils.js';
29
+ // Provide shared UI state to components
30
+ import { UIStateProvider } from './hooks/useUIState.js';
31
+ export default function App() {
32
+ // Use extracted hooks
33
+ const appState = useAppState();
34
+ const { exit } = useApp();
35
+ const { isTrusted, handleConfirmTrust, isTrustLoading, isTrustedError } = useDirectoryTrust();
36
+ const handleExit = () => {
37
+ exit();
38
+ };
39
+ // Create theme context value
40
+ const themeContextValue = {
41
+ currentTheme: appState.currentTheme,
42
+ colors: getThemeColors(appState.currentTheme),
43
+ setCurrentTheme: appState.setCurrentTheme,
44
+ };
45
+ // Initialize global message queue on component mount
46
+ React.useEffect(() => {
47
+ setGlobalMessageQueue(appState.addToChatQueue);
48
+ }, []);
49
+ // Setup chat handler
50
+ const chatHandler = useChatHandler({
51
+ client: appState.client,
52
+ toolManager: appState.toolManager,
53
+ messages: appState.messages,
54
+ setMessages: appState.updateMessages,
55
+ getMessageTokens: appState.getMessageTokens,
56
+ currentModel: appState.currentModel,
57
+ setIsThinking: appState.setIsThinking,
58
+ setIsCancelling: appState.setIsCancelling,
59
+ setThinkingStats: appState.setThinkingStats,
60
+ addToChatQueue: appState.addToChatQueue,
61
+ componentKeyCounter: appState.componentKeyCounter,
62
+ abortController: appState.abortController,
63
+ setAbortController: appState.setAbortController,
64
+ onStartToolConfirmationFlow: (toolCalls, updatedMessages, assistantMsg, systemMessage) => {
65
+ appState.setPendingToolCalls(toolCalls);
66
+ appState.setCurrentToolIndex(0);
67
+ appState.setCompletedToolResults([]);
68
+ appState.setCurrentConversationContext({
69
+ updatedMessages,
70
+ assistantMsg,
71
+ systemMessage,
72
+ });
73
+ appState.setIsToolConfirmationMode(true);
74
+ },
75
+ });
76
+ // Setup tool handler
77
+ const toolHandler = useToolHandler({
78
+ pendingToolCalls: appState.pendingToolCalls,
79
+ currentToolIndex: appState.currentToolIndex,
80
+ completedToolResults: appState.completedToolResults,
81
+ currentConversationContext: appState.currentConversationContext,
82
+ setPendingToolCalls: appState.setPendingToolCalls,
83
+ setCurrentToolIndex: appState.setCurrentToolIndex,
84
+ setCompletedToolResults: appState.setCompletedToolResults,
85
+ setCurrentConversationContext: appState.setCurrentConversationContext,
86
+ setIsToolConfirmationMode: appState.setIsToolConfirmationMode,
87
+ setIsToolExecuting: appState.setIsToolExecuting,
88
+ setMessages: appState.updateMessages,
89
+ addToChatQueue: appState.addToChatQueue,
90
+ componentKeyCounter: appState.componentKeyCounter,
91
+ resetToolConfirmationState: appState.resetToolConfirmationState,
92
+ onProcessAssistantResponse: chatHandler.processAssistantResponse,
93
+ client: appState.client,
94
+ currentProvider: appState.currentProvider,
95
+ });
96
+ // Setup mode handlers
97
+ const modeHandlers = useModeHandlers({
98
+ client: appState.client,
99
+ currentModel: appState.currentModel,
100
+ currentProvider: appState.currentProvider,
101
+ setClient: appState.setClient,
102
+ setCurrentModel: appState.setCurrentModel,
103
+ setCurrentProvider: appState.setCurrentProvider,
104
+ setCurrentTheme: appState.setCurrentTheme,
105
+ setMessages: appState.updateMessages,
106
+ setIsModelSelectionMode: appState.setIsModelSelectionMode,
107
+ setIsProviderSelectionMode: appState.setIsProviderSelectionMode,
108
+ setIsThemeSelectionMode: appState.setIsThemeSelectionMode,
109
+ addToChatQueue: appState.addToChatQueue,
110
+ componentKeyCounter: appState.componentKeyCounter,
111
+ });
112
+ // Setup initialization
113
+ useAppInitialization({
114
+ setClient: appState.setClient,
115
+ setCurrentModel: appState.setCurrentModel,
116
+ setCurrentProvider: appState.setCurrentProvider,
117
+ setToolManager: appState.setToolManager,
118
+ setCustomCommandLoader: appState.setCustomCommandLoader,
119
+ setCustomCommandExecutor: appState.setCustomCommandExecutor,
120
+ setCustomCommandCache: appState.setCustomCommandCache,
121
+ setStartChat: appState.setStartChat,
122
+ setMcpInitialized: appState.setMcpInitialized,
123
+ addToChatQueue: appState.addToChatQueue,
124
+ componentKeyCounter: appState.componentKeyCounter,
125
+ customCommandCache: appState.customCommandCache,
126
+ });
127
+ // Memoize handlers to prevent unnecessary re-renders
128
+ const clearMessages = React.useMemo(() => createClearMessagesHandler(appState.updateMessages, appState.client), [appState.updateMessages, appState.client]);
129
+ const handleCancel = React.useCallback(() => {
130
+ if (appState.abortController) {
131
+ appState.setIsCancelling(true);
132
+ appState.abortController.abort();
133
+ }
134
+ }, [appState.abortController, appState.setIsCancelling]);
135
+ const handleMessageSubmit = React.useCallback(async (message) => {
136
+ await handleMessageSubmission(message, {
137
+ customCommandCache: appState.customCommandCache,
138
+ customCommandLoader: appState.customCommandLoader,
139
+ customCommandExecutor: appState.customCommandExecutor,
140
+ onClearMessages: clearMessages,
141
+ onEnterModelSelectionMode: modeHandlers.enterModelSelectionMode,
142
+ onEnterProviderSelectionMode: modeHandlers.enterProviderSelectionMode,
143
+ onEnterThemeSelectionMode: modeHandlers.enterThemeSelectionMode,
144
+ onHandleChatMessage: chatHandler.handleChatMessage,
145
+ onAddToChatQueue: appState.addToChatQueue,
146
+ componentKeyCounter: appState.componentKeyCounter,
147
+ setMessages: appState.updateMessages,
148
+ messages: appState.messages,
149
+ setIsBashExecuting: appState.setIsBashExecuting,
150
+ setCurrentBashCommand: appState.setCurrentBashCommand,
151
+ provider: appState.currentProvider,
152
+ model: appState.currentModel,
153
+ getMessageTokens: appState.getMessageTokens,
154
+ });
155
+ }, [
156
+ appState.customCommandCache,
157
+ appState.customCommandLoader,
158
+ appState.customCommandExecutor,
159
+ clearMessages,
160
+ modeHandlers.enterModelSelectionMode,
161
+ modeHandlers.enterProviderSelectionMode,
162
+ chatHandler.handleChatMessage,
163
+ appState.addToChatQueue,
164
+ appState.componentKeyCounter,
165
+ appState.updateMessages,
166
+ appState.messages,
167
+ appState.setIsBashExecuting,
168
+ appState.setCurrentBashCommand,
169
+ ]);
170
+ // Memoize static components to prevent unnecessary re-renders
171
+ const staticComponents = React.useMemo(() => [
172
+ _jsx(Status, { provider: appState.currentProvider, model: appState.currentModel }, "status"),
173
+ ], [appState.currentProvider, appState.currentModel]);
174
+ // Handle loading state for directory trust check
175
+ if (isTrustLoading) {
176
+ return (_jsx(Box, { flexDirection: "column", padding: 1, children: _jsxs(Text, { color: themeContextValue.colors.secondary, children: [_jsx(Spinner, { type: "dots2" }), " Checking directory trust..."] }) }));
177
+ }
178
+ // Handle error state for directory trust
179
+ if (isTrustedError) {
180
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Text, { color: themeContextValue.colors.error, children: ["\u26A0\uFE0F Error checking directory trust: ", isTrustedError] }), _jsx(Text, { color: themeContextValue.colors.secondary, children: "Please restart the application or check your permissions." })] }));
181
+ }
182
+ // Show security disclaimer if directory is not trusted
183
+ if (!isTrusted) {
184
+ return (_jsx(SecurityDisclaimer, { onConfirm: handleConfirmTrust, onExit: handleExit }));
185
+ }
186
+ return (_jsx(ThemeContext.Provider, { value: themeContextValue, children: _jsx(UIStateProvider, { children: _jsxs(Box, { flexDirection: "column", padding: 1, width: "100%", children: [_jsxs(Box, { flexGrow: 1, flexDirection: "column", minHeight: 0, children: [_jsx(WelcomeMessage, {}), appState.startChat && (_jsx(ChatQueue, { staticComponents: staticComponents, queuedComponents: appState.chatComponents }))] }), appState.startChat && (_jsxs(Box, { flexDirection: "column", children: [appState.isCancelling ? (_jsx(CancellingIndicator, {})) : appState.isThinking ? (_jsx(ThinkingIndicator, { contextSize: appState.thinkingStats.contextSize, totalTokensUsed: appState.thinkingStats.totalTokensUsed, tokensPerSecond: appState.thinkingStats.tokensPerSecond })) : null, appState.isModelSelectionMode ? (_jsx(ModelSelector, { client: appState.client, currentModel: appState.currentModel, onModelSelect: modeHandlers.handleModelSelect, onCancel: modeHandlers.handleModelSelectionCancel })) : appState.isProviderSelectionMode ? (_jsx(ProviderSelector, { currentProvider: appState.currentProvider, onProviderSelect: modeHandlers.handleProviderSelect, onCancel: modeHandlers.handleProviderSelectionCancel })) : appState.isThemeSelectionMode ? (_jsx(ThemeSelector, { onThemeSelect: modeHandlers.handleThemeSelect, onCancel: modeHandlers.handleThemeSelectionCancel })) : appState.isToolConfirmationMode &&
187
+ appState.pendingToolCalls[appState.currentToolIndex] ? (_jsx(ToolConfirmation, { toolCall: appState.pendingToolCalls[appState.currentToolIndex], onConfirm: toolHandler.handleToolConfirmation, onCancel: toolHandler.handleToolConfirmationCancel })) : appState.isToolExecuting &&
188
+ appState.pendingToolCalls[appState.currentToolIndex] ? (_jsx(ToolExecutionIndicator, { toolName: appState.pendingToolCalls[appState.currentToolIndex]
189
+ .function.name, currentIndex: appState.currentToolIndex, totalTools: appState.pendingToolCalls.length })) : appState.isBashExecuting ? (_jsx(BashExecutionIndicator, { command: appState.currentBashCommand })) : appState.mcpInitialized && appState.client ? (_jsx(UserInput, { customCommands: Array.from(appState.customCommandCache.keys()), onSubmit: handleMessageSubmit, disabled: appState.isThinking ||
190
+ appState.isToolExecuting ||
191
+ appState.isBashExecuting, onCancel: handleCancel })) : appState.mcpInitialized && !appState.client ? (_jsx(Text, { color: themeContextValue.colors.secondary, children: "\u26A0\uFE0F No LLM provider available. Chat is disabled. Please fix your provider configuration and restart." })) : (_jsxs(Text, { color: themeContextValue.colors.secondary, children: [_jsx(Spinner, { type: "dots2" }), " Loading..."] }))] }))] }) }) }));
192
+ }
193
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../source/app.tsx"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.tsx"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { render } from 'ink';
4
+ import App from './app.js';
5
+ render(_jsx(App, {}));
6
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../source/cli.tsx"],"names":[],"mappings":";;AACA,OAAO,EAAC,MAAM,EAAC,MAAM,KAAK,CAAC;AAC3B,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { LLMClient, ProviderType } from './types/index.js';
2
+ export declare function createLLMClient(provider?: ProviderType): Promise<{
3
+ client: LLMClient;
4
+ actualProvider: ProviderType;
5
+ }>;
6
+ //# sourceMappingURL=client-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-factory.d.ts","sourceRoot":"","sources":["../source/client-factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,SAAS,EAAE,YAAY,EAA0B,MAAM,kBAAkB,CAAC;AAIvF,wBAAsB,eAAe,CACpC,QAAQ,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,cAAc,EAAE,YAAY,CAAA;CAAC,CAAC,CAO5D"}
@@ -0,0 +1,111 @@
1
+ import { LangGraphClient } from './langgraph-client.js';
2
+ import { appConfig } from './config/index.js';
3
+ import { loadPreferences } from './config/preferences.js';
4
+ import { existsSync } from 'fs';
5
+ import { join } from 'path';
6
+ export async function createLLMClient(provider) {
7
+ // Check if agents.config.json exists
8
+ const agentsJsonPath = join(process.cwd(), 'agents.config.json');
9
+ const hasConfigFile = existsSync(agentsJsonPath);
10
+ // Always use LangGraph - it handles both tool-calling and non-tool-calling models
11
+ return createLangGraphClient(provider, hasConfigFile);
12
+ }
13
+ async function createLangGraphClient(requestedProvider, hasConfigFile = true) {
14
+ // Load provider configs
15
+ const providers = loadProviderConfigs();
16
+ if (providers.length === 0) {
17
+ if (!hasConfigFile) {
18
+ throw new Error('No agents.config.json found. Please create a configuration file with provider settings.');
19
+ }
20
+ else {
21
+ throw new Error('No providers configured in agents.config.json');
22
+ }
23
+ }
24
+ // Determine which provider to try first
25
+ let targetProvider;
26
+ if (requestedProvider) {
27
+ targetProvider = requestedProvider;
28
+ }
29
+ else {
30
+ // Use preferences or default to first available provider
31
+ const preferences = loadPreferences();
32
+ targetProvider = preferences.lastProvider || providers[0].name;
33
+ }
34
+ // Order providers: requested first, then others
35
+ const availableProviders = providers.map(p => p.name);
36
+ const providerOrder = [
37
+ targetProvider,
38
+ ...availableProviders.filter(p => p !== targetProvider)
39
+ ];
40
+ const errors = [];
41
+ for (const providerType of providerOrder) {
42
+ try {
43
+ const providerConfig = providers.find(p => p.name === providerType);
44
+ if (!providerConfig) {
45
+ continue;
46
+ }
47
+ // Test provider connection
48
+ await testProviderConnection(providerConfig);
49
+ const client = await LangGraphClient.create(providerConfig);
50
+ return { client, actualProvider: providerType };
51
+ }
52
+ catch (error) {
53
+ errors.push(`${providerType}: ${error.message}`);
54
+ }
55
+ }
56
+ // If we get here, all providers failed
57
+ if (!hasConfigFile) {
58
+ const combinedError = `No providers available: ${errors[0]?.split(': ')[1] || 'Unknown error'}\n\nPlease create an agents.config.json file with provider configuration.`;
59
+ throw new Error(combinedError);
60
+ }
61
+ else {
62
+ const combinedError = `All configured providers failed:\n${errors.map(e => `• ${e}`).join('\n')}\n\nPlease check your provider configuration in agents.config.json`;
63
+ throw new Error(combinedError);
64
+ }
65
+ }
66
+ function loadProviderConfigs() {
67
+ const providers = [];
68
+ // Load providers from the new providers array structure
69
+ if (appConfig.providers) {
70
+ for (const provider of appConfig.providers) {
71
+ providers.push({
72
+ name: provider.name,
73
+ type: 'openai',
74
+ models: provider.models || [],
75
+ config: {
76
+ baseURL: provider.baseUrl,
77
+ apiKey: provider.apiKey || 'dummy-key',
78
+ }
79
+ });
80
+ }
81
+ }
82
+ return providers;
83
+ }
84
+ async function testProviderConnection(providerConfig) {
85
+ // Test local servers for connectivity
86
+ if (providerConfig.config.baseURL && providerConfig.config.baseURL.includes('localhost')) {
87
+ try {
88
+ await fetch(providerConfig.config.baseURL, {
89
+ signal: AbortSignal.timeout(5000)
90
+ });
91
+ // Don't check response.ok as some servers return 404 for root path
92
+ // We just need to confirm the server responded (not a network error)
93
+ }
94
+ catch (error) {
95
+ // Only throw if it's a network error, not a 404 or other HTTP response
96
+ if (error instanceof TypeError) {
97
+ throw new Error(`Server not accessible at ${providerConfig.config.baseURL}`);
98
+ }
99
+ // For AbortError (timeout), also throw
100
+ if (error instanceof Error && error.name === 'AbortError') {
101
+ throw new Error(`Server not accessible at ${providerConfig.config.baseURL}`);
102
+ }
103
+ // Other errors (like HTTP errors) mean the server is responding, so pass
104
+ }
105
+ }
106
+ // Require API key for hosted providers
107
+ if (!providerConfig.config.apiKey && !providerConfig.config.baseURL?.includes('localhost')) {
108
+ throw new Error('API key required for hosted providers');
109
+ }
110
+ }
111
+ //# sourceMappingURL=client-factory.js.map