@shareai-lab/kode 1.1.11 → 1.1.13

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 (593) hide show
  1. package/cli.js +56 -33
  2. package/dist/ProjectOnboarding.js +99 -0
  3. package/dist/ProjectOnboarding.js.map +7 -0
  4. package/dist/Tool.js +1 -0
  5. package/dist/Tool.js.map +7 -0
  6. package/dist/commands/agents.js +2087 -0
  7. package/dist/commands/agents.js.map +7 -0
  8. package/dist/commands/approvedTools.js +36 -0
  9. package/dist/commands/approvedTools.js.map +7 -0
  10. package/dist/commands/bug.js +21 -0
  11. package/dist/commands/bug.js.map +7 -0
  12. package/dist/commands/clear.js +37 -0
  13. package/dist/commands/clear.js.map +7 -0
  14. package/dist/commands/compact.js +104 -0
  15. package/dist/commands/compact.js.map +7 -0
  16. package/dist/commands/config.js +20 -0
  17. package/dist/commands/config.js.map +7 -0
  18. package/dist/commands/cost.js +19 -0
  19. package/dist/commands/cost.js.map +7 -0
  20. package/dist/commands/ctx_viz.js +152 -0
  21. package/dist/commands/ctx_viz.js.map +7 -0
  22. package/dist/commands/doctor.js +25 -0
  23. package/dist/commands/doctor.js.map +7 -0
  24. package/dist/commands/help.js +20 -0
  25. package/dist/commands/help.js.map +7 -0
  26. package/dist/commands/init.js +38 -0
  27. package/dist/commands/init.js.map +7 -0
  28. package/dist/commands/listen.js +37 -0
  29. package/dist/commands/listen.js.map +7 -0
  30. package/dist/commands/login.js +37 -0
  31. package/dist/commands/login.js.map +7 -0
  32. package/dist/commands/logout.js +33 -0
  33. package/dist/commands/logout.js.map +7 -0
  34. package/dist/commands/mcp.js +34 -0
  35. package/dist/commands/mcp.js.map +7 -0
  36. package/dist/commands/model.js +41 -0
  37. package/dist/commands/model.js.map +7 -0
  38. package/dist/commands/modelstatus.js +21 -0
  39. package/dist/commands/modelstatus.js.map +7 -0
  40. package/dist/commands/onboarding.js +36 -0
  41. package/dist/commands/onboarding.js.map +7 -0
  42. package/dist/commands/pr_comments.js +61 -0
  43. package/dist/commands/pr_comments.js.map +7 -0
  44. package/dist/commands/refreshCommands.js +37 -0
  45. package/dist/commands/refreshCommands.js.map +7 -0
  46. package/dist/commands/release-notes.js +30 -0
  47. package/dist/commands/release-notes.js.map +7 -0
  48. package/dist/commands/resume.js +35 -0
  49. package/dist/commands/resume.js.map +7 -0
  50. package/dist/commands/review.js +51 -0
  51. package/dist/commands/review.js.map +7 -0
  52. package/dist/commands/terminalSetup.js +163 -0
  53. package/dist/commands/terminalSetup.js.map +7 -0
  54. package/dist/commands.js +84 -0
  55. package/dist/commands.js.map +7 -0
  56. package/dist/components/ApproveApiKey.js +74 -0
  57. package/dist/components/ApproveApiKey.js.map +7 -0
  58. package/dist/components/AsciiLogo.js +12 -0
  59. package/dist/components/AsciiLogo.js.map +7 -0
  60. package/dist/components/AutoUpdater.js +74 -0
  61. package/dist/components/AutoUpdater.js.map +7 -0
  62. package/dist/components/Bug.js +147 -0
  63. package/dist/components/Bug.js.map +7 -0
  64. package/dist/components/Config.js +166 -0
  65. package/dist/components/Config.js.map +7 -0
  66. package/dist/components/ConsoleOAuthFlow.js +188 -0
  67. package/dist/components/ConsoleOAuthFlow.js.map +7 -0
  68. package/dist/components/Cost.js +13 -0
  69. package/dist/components/Cost.js.map +7 -0
  70. package/dist/components/CostThresholdDialog.js +38 -0
  71. package/dist/components/CostThresholdDialog.js.map +7 -0
  72. package/dist/components/CustomSelect/option-map.js +32 -0
  73. package/dist/components/CustomSelect/option-map.js.map +7 -0
  74. package/dist/components/CustomSelect/select-option.js +34 -0
  75. package/dist/components/CustomSelect/select-option.js.map +7 -0
  76. package/dist/components/CustomSelect/select.js +64 -0
  77. package/dist/components/CustomSelect/select.js.map +7 -0
  78. package/dist/components/CustomSelect/theme.js +1 -0
  79. package/dist/components/CustomSelect/theme.js.map +7 -0
  80. package/dist/components/CustomSelect/use-select-state.js +220 -0
  81. package/dist/components/CustomSelect/use-select-state.js.map +7 -0
  82. package/dist/components/CustomSelect/use-select.js +21 -0
  83. package/dist/components/CustomSelect/use-select.js.map +7 -0
  84. package/dist/components/FallbackToolUseRejectedMessage.js +11 -0
  85. package/dist/components/FallbackToolUseRejectedMessage.js.map +7 -0
  86. package/dist/components/FileEditToolUpdatedMessage.js +31 -0
  87. package/dist/components/FileEditToolUpdatedMessage.js.map +7 -0
  88. package/dist/components/Help.js +41 -0
  89. package/dist/components/Help.js.map +7 -0
  90. package/dist/components/HighlightedCode.js +30 -0
  91. package/dist/components/HighlightedCode.js.map +7 -0
  92. package/dist/components/InvalidConfigDialog.js +83 -0
  93. package/dist/components/InvalidConfigDialog.js.map +7 -0
  94. package/dist/components/Link.js +18 -0
  95. package/dist/components/Link.js.map +7 -0
  96. package/dist/components/LogSelector.js +50 -0
  97. package/dist/components/LogSelector.js.map +7 -0
  98. package/dist/components/Logo.js +89 -0
  99. package/dist/components/Logo.js.map +7 -0
  100. package/dist/components/MCPServerApprovalDialog.js +79 -0
  101. package/dist/components/MCPServerApprovalDialog.js.map +7 -0
  102. package/dist/components/MCPServerDialogCopy.js +11 -0
  103. package/dist/components/MCPServerDialogCopy.js.map +7 -0
  104. package/dist/components/MCPServerMultiselectDialog.js +80 -0
  105. package/dist/components/MCPServerMultiselectDialog.js.map +7 -0
  106. package/dist/components/Message.js +146 -0
  107. package/dist/components/Message.js.map +7 -0
  108. package/dist/components/MessageResponse.js +9 -0
  109. package/dist/components/MessageResponse.js.map +7 -0
  110. package/dist/components/MessageSelector.js +133 -0
  111. package/dist/components/MessageSelector.js.map +7 -0
  112. package/dist/components/ModeIndicator.js +38 -0
  113. package/dist/components/ModeIndicator.js.map +7 -0
  114. package/dist/components/ModelConfig.js +208 -0
  115. package/dist/components/ModelConfig.js.map +7 -0
  116. package/dist/components/ModelListManager.js +140 -0
  117. package/dist/components/ModelListManager.js.map +7 -0
  118. package/dist/components/ModelSelector.js +1985 -0
  119. package/dist/components/ModelSelector.js.map +7 -0
  120. package/dist/components/ModelStatusDisplay.js +87 -0
  121. package/dist/components/ModelStatusDisplay.js.map +7 -0
  122. package/dist/components/Onboarding.js +153 -0
  123. package/dist/components/Onboarding.js.map +7 -0
  124. package/dist/components/PressEnterToContinue.js +10 -0
  125. package/dist/components/PressEnterToContinue.js.map +7 -0
  126. package/dist/components/PromptInput.js +501 -0
  127. package/dist/components/PromptInput.js.map +7 -0
  128. package/dist/components/SentryErrorBoundary.js +27 -0
  129. package/dist/components/SentryErrorBoundary.js.map +7 -0
  130. package/dist/components/Spinner.js +101 -0
  131. package/dist/components/Spinner.js.map +7 -0
  132. package/dist/components/StickerRequestForm.js +7 -0
  133. package/dist/components/StickerRequestForm.js.map +7 -0
  134. package/dist/components/StructuredDiff.js +148 -0
  135. package/dist/components/StructuredDiff.js.map +7 -0
  136. package/dist/components/TextInput.js +100 -0
  137. package/dist/components/TextInput.js.map +7 -0
  138. package/dist/components/TodoItem.js +35 -0
  139. package/dist/components/TodoItem.js.map +7 -0
  140. package/dist/components/TokenWarning.js +19 -0
  141. package/dist/components/TokenWarning.js.map +7 -0
  142. package/dist/components/ToolUseLoader.js +24 -0
  143. package/dist/components/ToolUseLoader.js.map +7 -0
  144. package/dist/components/TrustDialog.js +76 -0
  145. package/dist/components/TrustDialog.js.map +7 -0
  146. package/dist/components/binary-feedback/BinaryFeedback.js +50 -0
  147. package/dist/components/binary-feedback/BinaryFeedback.js.map +7 -0
  148. package/dist/components/binary-feedback/BinaryFeedbackOption.js +94 -0
  149. package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +7 -0
  150. package/dist/components/binary-feedback/BinaryFeedbackView.js +139 -0
  151. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +7 -0
  152. package/dist/components/binary-feedback/utils.js +161 -0
  153. package/dist/components/binary-feedback/utils.js.map +7 -0
  154. package/dist/components/messages/AssistantBashOutputMessage.js +23 -0
  155. package/dist/components/messages/AssistantBashOutputMessage.js.map +7 -0
  156. package/dist/components/messages/AssistantLocalCommandOutputMessage.js +36 -0
  157. package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +7 -0
  158. package/dist/components/messages/AssistantRedactedThinkingMessage.js +12 -0
  159. package/dist/components/messages/AssistantRedactedThinkingMessage.js.map +7 -0
  160. package/dist/components/messages/AssistantTextMessage.js +78 -0
  161. package/dist/components/messages/AssistantTextMessage.js.map +7 -0
  162. package/dist/components/messages/AssistantThinkingMessage.js +27 -0
  163. package/dist/components/messages/AssistantThinkingMessage.js.map +7 -0
  164. package/dist/components/messages/AssistantToolUseMessage.js +91 -0
  165. package/dist/components/messages/AssistantToolUseMessage.js.map +7 -0
  166. package/dist/components/messages/TaskProgressMessage.js +11 -0
  167. package/dist/components/messages/TaskProgressMessage.js.map +7 -0
  168. package/dist/components/messages/TaskToolMessage.js +39 -0
  169. package/dist/components/messages/TaskToolMessage.js.map +7 -0
  170. package/dist/components/messages/UserBashInputMessage.js +18 -0
  171. package/dist/components/messages/UserBashInputMessage.js.map +7 -0
  172. package/dist/components/messages/UserCommandMessage.js +20 -0
  173. package/dist/components/messages/UserCommandMessage.js.map +7 -0
  174. package/dist/components/messages/UserKodingInputMessage.js +18 -0
  175. package/dist/components/messages/UserKodingInputMessage.js.map +7 -0
  176. package/dist/components/messages/UserPromptMessage.js +20 -0
  177. package/dist/components/messages/UserPromptMessage.js.map +7 -0
  178. package/dist/components/messages/UserTextMessage.js +25 -0
  179. package/dist/components/messages/UserTextMessage.js.map +7 -0
  180. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +10 -0
  181. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +7 -0
  182. package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js +15 -0
  183. package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js.map +7 -0
  184. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +25 -0
  185. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +7 -0
  186. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +47 -0
  187. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +7 -0
  188. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +23 -0
  189. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +7 -0
  190. package/dist/components/messages/UserToolResultMessage/utils.js +42 -0
  191. package/dist/components/messages/UserToolResultMessage/utils.js.map +7 -0
  192. package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js +112 -0
  193. package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js.map +7 -0
  194. package/dist/components/permissions/FallbackPermissionRequest.js +131 -0
  195. package/dist/components/permissions/FallbackPermissionRequest.js.map +7 -0
  196. package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +159 -0
  197. package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js.map +7 -0
  198. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +58 -0
  199. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +7 -0
  200. package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +153 -0
  201. package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js.map +7 -0
  202. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +70 -0
  203. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +7 -0
  204. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +212 -0
  205. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +7 -0
  206. package/dist/components/permissions/PermissionRequest.js +70 -0
  207. package/dist/components/permissions/PermissionRequest.js.map +7 -0
  208. package/dist/components/permissions/PermissionRequestTitle.js +52 -0
  209. package/dist/components/permissions/PermissionRequestTitle.js.map +7 -0
  210. package/dist/components/permissions/hooks.js +28 -0
  211. package/dist/components/permissions/hooks.js.map +7 -0
  212. package/dist/components/permissions/toolUseOptions.js +46 -0
  213. package/dist/components/permissions/toolUseOptions.js.map +7 -0
  214. package/dist/components/permissions/utils.js +21 -0
  215. package/dist/components/permissions/utils.js.map +7 -0
  216. package/dist/constants/betas.js +11 -0
  217. package/dist/constants/betas.js.map +7 -0
  218. package/dist/constants/claude-asterisk-ascii-art.js +242 -0
  219. package/dist/constants/claude-asterisk-ascii-art.js.map +7 -0
  220. package/dist/constants/figures.js +6 -0
  221. package/dist/constants/figures.js.map +7 -0
  222. package/dist/constants/keys.js +7 -0
  223. package/dist/constants/keys.js.map +7 -0
  224. package/dist/constants/macros.js +13 -0
  225. package/dist/constants/macros.js.map +7 -0
  226. package/dist/constants/modelCapabilities.js +154 -0
  227. package/dist/constants/modelCapabilities.js.map +7 -0
  228. package/dist/constants/models.js +1029 -0
  229. package/dist/constants/models.js.map +7 -0
  230. package/dist/constants/oauth.js +18 -0
  231. package/dist/constants/oauth.js.map +7 -0
  232. package/dist/constants/product.js +26 -0
  233. package/dist/constants/product.js.map +7 -0
  234. package/dist/constants/prompts.js +168 -0
  235. package/dist/constants/prompts.js.map +7 -0
  236. package/dist/constants/releaseNotes.js +9 -0
  237. package/dist/constants/releaseNotes.js.map +7 -0
  238. package/dist/context/PermissionContext.js +111 -0
  239. package/dist/context/PermissionContext.js.map +7 -0
  240. package/dist/context.js +259 -0
  241. package/dist/context.js.map +7 -0
  242. package/dist/cost-tracker.js +76 -0
  243. package/dist/cost-tracker.js.map +7 -0
  244. package/dist/entrypoints/cli.js +1101 -0
  245. package/dist/entrypoints/cli.js.map +7 -0
  246. package/dist/entrypoints/mcp.js +150 -0
  247. package/dist/entrypoints/mcp.js.map +7 -0
  248. package/dist/history.js +25 -0
  249. package/dist/history.js.map +7 -0
  250. package/dist/hooks/useApiKeyVerification.js +12 -0
  251. package/dist/hooks/useApiKeyVerification.js.map +7 -0
  252. package/dist/hooks/useArrowKeyHistory.js +50 -0
  253. package/dist/hooks/useArrowKeyHistory.js.map +7 -0
  254. package/dist/hooks/useCanUseTool.js +112 -0
  255. package/dist/hooks/useCanUseTool.js.map +7 -0
  256. package/dist/hooks/useCancelRequest.js +30 -0
  257. package/dist/hooks/useCancelRequest.js.map +7 -0
  258. package/dist/hooks/useDoublePress.js +31 -0
  259. package/dist/hooks/useDoublePress.js.map +7 -0
  260. package/dist/hooks/useExitOnCtrlCD.js +26 -0
  261. package/dist/hooks/useExitOnCtrlCD.js.map +7 -0
  262. package/dist/hooks/useInterval.js +18 -0
  263. package/dist/hooks/useInterval.js.map +7 -0
  264. package/dist/hooks/useLogMessages.js +14 -0
  265. package/dist/hooks/useLogMessages.js.map +7 -0
  266. package/dist/hooks/useLogStartupTime.js +15 -0
  267. package/dist/hooks/useLogStartupTime.js.map +7 -0
  268. package/dist/hooks/useNotifyAfterTimeout.js +42 -0
  269. package/dist/hooks/useNotifyAfterTimeout.js.map +7 -0
  270. package/dist/hooks/usePermissionRequestLogging.js +28 -0
  271. package/dist/hooks/usePermissionRequestLogging.js.map +7 -0
  272. package/dist/hooks/useTerminalSize.js +38 -0
  273. package/dist/hooks/useTerminalSize.js.map +7 -0
  274. package/dist/hooks/useTextInput.js +250 -0
  275. package/dist/hooks/useTextInput.js.map +7 -0
  276. package/dist/hooks/useUnifiedCompletion.js +929 -0
  277. package/dist/hooks/useUnifiedCompletion.js.map +7 -0
  278. package/dist/index.js +26 -0
  279. package/dist/index.js.map +7 -0
  280. package/dist/messages.js +33 -0
  281. package/dist/messages.js.map +7 -0
  282. package/dist/package.json +1 -0
  283. package/dist/permissions.js +194 -0
  284. package/dist/permissions.js.map +7 -0
  285. package/dist/query.js +492 -0
  286. package/dist/query.js.map +7 -0
  287. package/dist/screens/ConfigureNpmPrefix.js +128 -0
  288. package/dist/screens/ConfigureNpmPrefix.js.map +7 -0
  289. package/dist/screens/Doctor.js +143 -0
  290. package/dist/screens/Doctor.js.map +7 -0
  291. package/dist/screens/LogList.js +55 -0
  292. package/dist/screens/LogList.js.map +7 -0
  293. package/dist/screens/REPL.js +596 -0
  294. package/dist/screens/REPL.js.map +7 -0
  295. package/dist/screens/ResumeConversation.js +56 -0
  296. package/dist/screens/ResumeConversation.js.map +7 -0
  297. package/dist/services/adapters/base.js +29 -0
  298. package/dist/services/adapters/base.js.map +7 -0
  299. package/dist/services/adapters/chatCompletions.js +69 -0
  300. package/dist/services/adapters/chatCompletions.js.map +7 -0
  301. package/dist/services/adapters/responsesAPI.js +126 -0
  302. package/dist/services/adapters/responsesAPI.js.map +7 -0
  303. package/dist/services/browserMocks.js +48 -0
  304. package/dist/services/browserMocks.js.map +7 -0
  305. package/dist/services/claude.js +1605 -0
  306. package/dist/services/claude.js.map +7 -0
  307. package/dist/services/customCommands.js +359 -0
  308. package/dist/services/customCommands.js.map +7 -0
  309. package/dist/services/fileFreshness.js +280 -0
  310. package/dist/services/fileFreshness.js.map +7 -0
  311. package/dist/services/gpt5ConnectionTest.js +248 -0
  312. package/dist/services/gpt5ConnectionTest.js.map +7 -0
  313. package/dist/services/mcpClient.js +435 -0
  314. package/dist/services/mcpClient.js.map +7 -0
  315. package/dist/services/mcpServerApproval.js +55 -0
  316. package/dist/services/mcpServerApproval.js.map +7 -0
  317. package/dist/services/mentionProcessor.js +200 -0
  318. package/dist/services/mentionProcessor.js.map +7 -0
  319. package/dist/services/modelAdapterFactory.js +47 -0
  320. package/dist/services/modelAdapterFactory.js.map +7 -0
  321. package/dist/services/notifier.js +35 -0
  322. package/dist/services/notifier.js.map +7 -0
  323. package/dist/services/oauth.js +259 -0
  324. package/dist/services/oauth.js.map +7 -0
  325. package/dist/services/openai.js +998 -0
  326. package/dist/services/openai.js.map +7 -0
  327. package/dist/services/responseStateManager.js +68 -0
  328. package/dist/services/responseStateManager.js.map +7 -0
  329. package/dist/services/sentry.js +9 -0
  330. package/dist/services/sentry.js.map +7 -0
  331. package/dist/services/statsig.js +112 -0
  332. package/dist/services/statsig.js.map +7 -0
  333. package/dist/services/statsigStorage.js +75 -0
  334. package/dist/services/statsigStorage.js.map +7 -0
  335. package/dist/services/systemReminder.js +353 -0
  336. package/dist/services/systemReminder.js.map +7 -0
  337. package/dist/services/vcr.js +133 -0
  338. package/dist/services/vcr.js.map +7 -0
  339. package/dist/test/testAdapters.js +88 -0
  340. package/dist/test/testAdapters.js.map +1 -0
  341. package/dist/tools/ArchitectTool/ArchitectTool.js +119 -0
  342. package/dist/tools/ArchitectTool/ArchitectTool.js.map +7 -0
  343. package/dist/tools/ArchitectTool/prompt.js +18 -0
  344. package/dist/tools/ArchitectTool/prompt.js.map +7 -0
  345. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +423 -0
  346. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +7 -0
  347. package/dist/tools/BashTool/BashTool.js +188 -0
  348. package/dist/tools/BashTool/BashTool.js.map +7 -0
  349. package/dist/tools/BashTool/BashToolResultMessage.js +21 -0
  350. package/dist/tools/BashTool/BashToolResultMessage.js.map +7 -0
  351. package/dist/tools/BashTool/OutputLine.js +30 -0
  352. package/dist/tools/BashTool/OutputLine.js.map +7 -0
  353. package/dist/tools/BashTool/prompt.js +179 -0
  354. package/dist/tools/BashTool/prompt.js.map +7 -0
  355. package/dist/tools/BashTool/utils.js +51 -0
  356. package/dist/tools/BashTool/utils.js.map +7 -0
  357. package/dist/tools/FileEditTool/FileEditTool.js +228 -0
  358. package/dist/tools/FileEditTool/FileEditTool.js.map +7 -0
  359. package/dist/tools/FileEditTool/prompt.js +54 -0
  360. package/dist/tools/FileEditTool/prompt.js.map +7 -0
  361. package/dist/tools/FileEditTool/utils.js +42 -0
  362. package/dist/tools/FileEditTool/utils.js.map +7 -0
  363. package/dist/tools/FileReadTool/FileReadTool.js +272 -0
  364. package/dist/tools/FileReadTool/FileReadTool.js.map +7 -0
  365. package/dist/tools/FileReadTool/prompt.js +10 -0
  366. package/dist/tools/FileReadTool/prompt.js.map +7 -0
  367. package/dist/tools/FileWriteTool/FileWriteTool.js +204 -0
  368. package/dist/tools/FileWriteTool/FileWriteTool.js.map +7 -0
  369. package/dist/tools/FileWriteTool/prompt.js +14 -0
  370. package/dist/tools/FileWriteTool/prompt.js.map +7 -0
  371. package/dist/tools/GlobTool/GlobTool.js +88 -0
  372. package/dist/tools/GlobTool/GlobTool.js.map +7 -0
  373. package/dist/tools/GlobTool/prompt.js +12 -0
  374. package/dist/tools/GlobTool/prompt.js.map +7 -0
  375. package/dist/tools/GrepTool/GrepTool.js +107 -0
  376. package/dist/tools/GrepTool/GrepTool.js.map +7 -0
  377. package/dist/tools/GrepTool/prompt.js +15 -0
  378. package/dist/tools/GrepTool/prompt.js.map +7 -0
  379. package/dist/tools/MCPTool/MCPTool.js +90 -0
  380. package/dist/tools/MCPTool/MCPTool.js.map +7 -0
  381. package/dist/tools/MCPTool/prompt.js +7 -0
  382. package/dist/tools/MCPTool/prompt.js.map +7 -0
  383. package/dist/tools/MemoryReadTool/MemoryReadTool.js +103 -0
  384. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +7 -0
  385. package/dist/tools/MemoryReadTool/prompt.js +7 -0
  386. package/dist/tools/MemoryReadTool/prompt.js.map +7 -0
  387. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +77 -0
  388. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +7 -0
  389. package/dist/tools/MemoryWriteTool/prompt.js +7 -0
  390. package/dist/tools/MemoryWriteTool/prompt.js.map +7 -0
  391. package/dist/tools/MultiEditTool/MultiEditTool.js +293 -0
  392. package/dist/tools/MultiEditTool/MultiEditTool.js.map +7 -0
  393. package/dist/tools/MultiEditTool/prompt.js +48 -0
  394. package/dist/tools/MultiEditTool/prompt.js.map +7 -0
  395. package/dist/tools/NotebookEditTool/NotebookEditTool.js +238 -0
  396. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +7 -0
  397. package/dist/tools/NotebookEditTool/prompt.js +7 -0
  398. package/dist/tools/NotebookEditTool/prompt.js.map +7 -0
  399. package/dist/tools/NotebookReadTool/NotebookReadTool.js +212 -0
  400. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +7 -0
  401. package/dist/tools/NotebookReadTool/prompt.js +7 -0
  402. package/dist/tools/NotebookReadTool/prompt.js.map +7 -0
  403. package/dist/tools/StickerRequestTool/StickerRequestTool.js +86 -0
  404. package/dist/tools/StickerRequestTool/StickerRequestTool.js.map +7 -0
  405. package/dist/tools/StickerRequestTool/prompt.js +23 -0
  406. package/dist/tools/StickerRequestTool/prompt.js.map +7 -0
  407. package/dist/tools/TaskTool/TaskTool.js +308 -0
  408. package/dist/tools/TaskTool/TaskTool.js.map +7 -0
  409. package/dist/tools/TaskTool/constants.js +5 -0
  410. package/dist/tools/TaskTool/constants.js.map +7 -0
  411. package/dist/tools/TaskTool/prompt.js +82 -0
  412. package/dist/tools/TaskTool/prompt.js.map +7 -0
  413. package/dist/tools/ThinkTool/ThinkTool.js +48 -0
  414. package/dist/tools/ThinkTool/ThinkTool.js.map +7 -0
  415. package/dist/tools/ThinkTool/prompt.js +16 -0
  416. package/dist/tools/ThinkTool/prompt.js.map +7 -0
  417. package/dist/tools/TodoWriteTool/TodoWriteTool.js +216 -0
  418. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +7 -0
  419. package/dist/tools/TodoWriteTool/prompt.js +66 -0
  420. package/dist/tools/TodoWriteTool/prompt.js.map +7 -0
  421. package/dist/tools/URLFetcherTool/URLFetcherTool.js +137 -0
  422. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +7 -0
  423. package/dist/tools/URLFetcherTool/cache.js +45 -0
  424. package/dist/tools/URLFetcherTool/cache.js.map +7 -0
  425. package/dist/tools/URLFetcherTool/htmlToMarkdown.js +42 -0
  426. package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +7 -0
  427. package/dist/tools/URLFetcherTool/prompt.js +22 -0
  428. package/dist/tools/URLFetcherTool/prompt.js.map +7 -0
  429. package/dist/tools/WebSearchTool/WebSearchTool.js +86 -0
  430. package/dist/tools/WebSearchTool/WebSearchTool.js.map +7 -0
  431. package/dist/tools/WebSearchTool/prompt.js +17 -0
  432. package/dist/tools/WebSearchTool/prompt.js.map +7 -0
  433. package/dist/tools/WebSearchTool/searchProviders.js +48 -0
  434. package/dist/tools/WebSearchTool/searchProviders.js.map +7 -0
  435. package/dist/tools/lsTool/lsTool.js +201 -0
  436. package/dist/tools/lsTool/lsTool.js.map +7 -0
  437. package/dist/tools/lsTool/prompt.js +5 -0
  438. package/dist/tools/lsTool/prompt.js.map +7 -0
  439. package/dist/tools.js +64 -0
  440. package/dist/tools.js.map +7 -0
  441. package/dist/types/PermissionMode.js +82 -0
  442. package/dist/types/PermissionMode.js.map +7 -0
  443. package/dist/types/RequestContext.js +47 -0
  444. package/dist/types/RequestContext.js.map +7 -0
  445. package/dist/types/common.d.js +1 -0
  446. package/dist/types/common.d.js.map +7 -0
  447. package/dist/types/conversation.js +1 -0
  448. package/dist/types/conversation.js.map +7 -0
  449. package/dist/types/logs.js +1 -0
  450. package/dist/types/logs.js.map +7 -0
  451. package/dist/types/modelCapabilities.js +1 -0
  452. package/dist/types/modelCapabilities.js.map +7 -0
  453. package/dist/types/notebook.js +1 -0
  454. package/dist/types/notebook.js.map +7 -0
  455. package/dist/utils/Cursor.js +313 -0
  456. package/dist/utils/Cursor.js.map +7 -0
  457. package/dist/utils/PersistentShell.js +382 -0
  458. package/dist/utils/PersistentShell.js.map +7 -0
  459. package/dist/utils/advancedFuzzyMatcher.js +206 -0
  460. package/dist/utils/advancedFuzzyMatcher.js.map +7 -0
  461. package/dist/utils/agentLoader.js +199 -0
  462. package/dist/utils/agentLoader.js.map +7 -0
  463. package/dist/utils/agentStorage.js +59 -0
  464. package/dist/utils/agentStorage.js.map +7 -0
  465. package/dist/utils/array.js +7 -0
  466. package/dist/utils/array.js.map +7 -0
  467. package/dist/utils/ask.js +77 -0
  468. package/dist/utils/ask.js.map +7 -0
  469. package/dist/utils/auth.js +11 -0
  470. package/dist/utils/auth.js.map +7 -0
  471. package/dist/utils/autoCompactCore.js +149 -0
  472. package/dist/utils/autoCompactCore.js.map +7 -0
  473. package/dist/utils/autoUpdater.js +362 -0
  474. package/dist/utils/autoUpdater.js.map +7 -0
  475. package/dist/utils/betas.js +21 -0
  476. package/dist/utils/betas.js.map +7 -0
  477. package/dist/utils/browser.js +15 -0
  478. package/dist/utils/browser.js.map +7 -0
  479. package/dist/utils/cleanup.js +54 -0
  480. package/dist/utils/cleanup.js.map +7 -0
  481. package/dist/utils/commands.js +207 -0
  482. package/dist/utils/commands.js.map +7 -0
  483. package/dist/utils/commonUnixCommands.js +687 -0
  484. package/dist/utils/commonUnixCommands.js.map +7 -0
  485. package/dist/utils/config.js +655 -0
  486. package/dist/utils/config.js.map +7 -0
  487. package/dist/utils/conversationRecovery.js +35 -0
  488. package/dist/utils/conversationRecovery.js.map +7 -0
  489. package/dist/utils/debugLogger.js +891 -0
  490. package/dist/utils/debugLogger.js.map +7 -0
  491. package/dist/utils/diff.js +32 -0
  492. package/dist/utils/diff.js.map +7 -0
  493. package/dist/utils/env.js +44 -0
  494. package/dist/utils/env.js.map +7 -0
  495. package/dist/utils/errors.js +23 -0
  496. package/dist/utils/errors.js.map +7 -0
  497. package/dist/utils/exampleCommands.js +80 -0
  498. package/dist/utils/exampleCommands.js.map +7 -0
  499. package/dist/utils/execFileNoThrow.js +44 -0
  500. package/dist/utils/execFileNoThrow.js.map +7 -0
  501. package/dist/utils/expertChatStorage.js +78 -0
  502. package/dist/utils/expertChatStorage.js.map +7 -0
  503. package/dist/utils/file.js +282 -0
  504. package/dist/utils/file.js.map +7 -0
  505. package/dist/utils/fileRecoveryCore.js +41 -0
  506. package/dist/utils/fileRecoveryCore.js.map +7 -0
  507. package/dist/utils/format.js +41 -0
  508. package/dist/utils/format.js.map +7 -0
  509. package/dist/utils/fuzzyMatcher.js +252 -0
  510. package/dist/utils/fuzzyMatcher.js.map +7 -0
  511. package/dist/utils/generators.js +46 -0
  512. package/dist/utils/generators.js.map +7 -0
  513. package/dist/utils/git.js +83 -0
  514. package/dist/utils/git.js.map +7 -0
  515. package/dist/utils/globalLogger.js +54 -0
  516. package/dist/utils/globalLogger.js.map +7 -0
  517. package/dist/utils/http.js +7 -0
  518. package/dist/utils/http.js.map +7 -0
  519. package/dist/utils/imagePaste.js +29 -0
  520. package/dist/utils/imagePaste.js.map +7 -0
  521. package/dist/utils/json.js +16 -0
  522. package/dist/utils/json.js.map +7 -0
  523. package/dist/utils/log.js +298 -0
  524. package/dist/utils/log.js.map +7 -0
  525. package/dist/utils/markdown.js +187 -0
  526. package/dist/utils/markdown.js.map +7 -0
  527. package/dist/utils/messageContextManager.js +195 -0
  528. package/dist/utils/messageContextManager.js.map +7 -0
  529. package/dist/utils/messages.js +633 -0
  530. package/dist/utils/messages.js.map +7 -0
  531. package/dist/utils/model.js +687 -0
  532. package/dist/utils/model.js.map +7 -0
  533. package/dist/utils/permissions/filesystem.js +80 -0
  534. package/dist/utils/permissions/filesystem.js.map +7 -0
  535. package/dist/utils/responseState.js +20 -0
  536. package/dist/utils/responseState.js.map +7 -0
  537. package/dist/utils/ripgrep.js +131 -0
  538. package/dist/utils/ripgrep.js.map +7 -0
  539. package/dist/utils/secureFile.js +483 -0
  540. package/dist/utils/secureFile.js.map +7 -0
  541. package/dist/utils/sessionState.js +31 -0
  542. package/dist/utils/sessionState.js.map +7 -0
  543. package/dist/utils/state.js +24 -0
  544. package/dist/utils/state.js.map +7 -0
  545. package/dist/utils/style.js +31 -0
  546. package/dist/utils/style.js.map +7 -0
  547. package/dist/utils/terminal.js +43 -0
  548. package/dist/utils/terminal.js.map +7 -0
  549. package/dist/utils/theme.js +102 -0
  550. package/dist/utils/theme.js.map +7 -0
  551. package/dist/utils/thinking.js +103 -0
  552. package/dist/utils/thinking.js.map +7 -0
  553. package/dist/utils/todoStorage.js +291 -0
  554. package/dist/utils/todoStorage.js.map +7 -0
  555. package/dist/utils/tokens.js +30 -0
  556. package/dist/utils/tokens.js.map +7 -0
  557. package/dist/utils/toolExecutionController.js +109 -0
  558. package/dist/utils/toolExecutionController.js.map +7 -0
  559. package/dist/utils/unaryLogging.js +14 -0
  560. package/dist/utils/unaryLogging.js.map +7 -0
  561. package/dist/utils/user.js +40 -0
  562. package/dist/utils/user.js.map +7 -0
  563. package/dist/utils/validate.js +132 -0
  564. package/dist/utils/validate.js.map +7 -0
  565. package/dist/yoga.wasm +0 -0
  566. package/package.json +31 -10
  567. package/src/Tool.ts +4 -3
  568. package/src/commands/agents.tsx +10 -4
  569. package/src/components/messages/AssistantToolUseMessage.tsx +5 -6
  570. package/src/constants/macros.ts +5 -2
  571. package/src/entrypoints/cli.tsx +38 -19
  572. package/src/entrypoints/mcp.ts +1 -2
  573. package/src/hooks/useDoublePress.ts +0 -1
  574. package/src/hooks/useTextInput.ts +4 -5
  575. package/src/hooks/useUnifiedCompletion.ts +2 -2
  576. package/src/index.ts +34 -0
  577. package/src/query.ts +13 -8
  578. package/src/screens/Doctor.tsx +1 -1
  579. package/src/screens/REPL.tsx +13 -9
  580. package/src/services/openai.ts +25 -4
  581. package/src/tools/ArchitectTool/ArchitectTool.tsx +18 -5
  582. package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +21 -14
  583. package/src/tools/FileEditTool/FileEditTool.tsx +6 -2
  584. package/src/tools/FileWriteTool/FileWriteTool.tsx +7 -3
  585. package/src/tools/MultiEditTool/MultiEditTool.tsx +26 -4
  586. package/src/tools/NotebookReadTool/NotebookReadTool.tsx +1 -1
  587. package/src/tools/StickerRequestTool/StickerRequestTool.tsx +28 -14
  588. package/src/tools/TaskTool/TaskTool.tsx +8 -36
  589. package/src/types/common.d.ts +2 -0
  590. package/src/utils/generators.ts +1 -1
  591. package/src/utils/messageContextManager.ts +5 -0
  592. package/src/utils/messages.tsx +8 -2
  593. package/src/utils/thinking.ts +1 -1
@@ -0,0 +1,1101 @@
1
+ #!/usr/bin/env -S node --no-warnings=ExperimentalWarning --enable-source-maps
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+ import { initSentry } from "../services/sentry.js";
5
+ import { PRODUCT_COMMAND, PRODUCT_NAME } from "../constants/product.js";
6
+ initSentry();
7
+ try {
8
+ if (!process.env.YOGA_WASM_PATH) {
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ const devCandidate = join(__dirname, "../../yoga.wasm");
12
+ const distCandidate = join(__dirname, "./yoga.wasm");
13
+ const resolved = existsSync(distCandidate) ? distCandidate : existsSync(devCandidate) ? devCandidate : void 0;
14
+ if (resolved) {
15
+ process.env.YOGA_WASM_PATH = resolved;
16
+ }
17
+ }
18
+ } catch {
19
+ }
20
+ import * as dontcare from "@anthropic-ai/sdk/shims/node";
21
+ Object.keys(dontcare);
22
+ import React from "react";
23
+ import { ReadStream } from "tty";
24
+ import { openSync, existsSync } from "fs";
25
+ import { addToHistory } from "../history.js";
26
+ import { getContext, setContext, removeContext } from "../context.js";
27
+ import { Command } from "@commander-js/extra-typings";
28
+ import { ask } from "../utils/ask.js";
29
+ import { hasPermissionsToUseTool } from "../permissions.js";
30
+ import { getTools } from "../tools.js";
31
+ import {
32
+ getGlobalConfig,
33
+ getCurrentProjectConfig,
34
+ saveGlobalConfig,
35
+ saveCurrentProjectConfig,
36
+ setConfigForCLI,
37
+ deleteConfigForCLI,
38
+ getConfigForCLI,
39
+ listConfigForCLI,
40
+ enableConfigs,
41
+ validateAndRepairAllGPT5Profiles
42
+ } from "../utils/config.js";
43
+ import { cwd } from "process";
44
+ import { dateToFilename, logError, parseLogFilename } from "../utils/log.js";
45
+ import { initDebugLogger } from "../utils/debugLogger.js";
46
+ import { Onboarding } from "../components/Onboarding.js";
47
+ import { Doctor } from "../screens/Doctor.js";
48
+ import { TrustDialog } from "../components/TrustDialog.js";
49
+ import { checkHasTrustDialogAccepted } from "../utils/config.js";
50
+ import { isDefaultSlowAndCapableModel } from "../utils/model.js";
51
+ import { LogList } from "../screens/LogList.js";
52
+ import { ResumeConversation } from "../screens/ResumeConversation.js";
53
+ import { startMCPServer } from "./mcp.js";
54
+ import { getCwd, setCwd, setOriginalCwd } from "../utils/state.js";
55
+ import { omit } from "lodash-es";
56
+ import { getCommands } from "../commands.js";
57
+ import { getNextAvailableLogForkNumber, loadLogList } from "../utils/log.js";
58
+ import { loadMessagesFromLog } from "../utils/conversationRecovery.js";
59
+ import { cleanupOldMessageFilesInBackground } from "../utils/cleanup.js";
60
+ import {
61
+ handleListApprovedTools,
62
+ handleRemoveApprovedTool
63
+ } from "../commands/approvedTools.js";
64
+ import {
65
+ addMcpServer,
66
+ getMcpServer,
67
+ listMCPServers,
68
+ parseEnvVars,
69
+ removeMcpServer,
70
+ getClients,
71
+ ensureConfigScope
72
+ } from "../services/mcpClient.js";
73
+ import { handleMcprcServerApprovals } from "../services/mcpServerApproval.js";
74
+ import { logEvent } from "../services/statsig.js";
75
+ import { cursorShow } from "ansi-escapes";
76
+ import {
77
+ getLatestVersion,
78
+ assertMinVersion,
79
+ getUpdateCommandSuggestions
80
+ } from "../utils/autoUpdater.js";
81
+ import { gt } from "semver";
82
+ import { CACHE_PATHS } from "../utils/log.js";
83
+ import { PersistentShell } from "../utils/PersistentShell.js";
84
+ import { clearTerminal } from "../utils/terminal.js";
85
+ import { showInvalidConfigDialog } from "../components/InvalidConfigDialog.js";
86
+ import { ConfigParseError } from "../utils/errors.js";
87
+ import { grantReadPermissionForOriginalDir } from "../utils/permissions/filesystem.js";
88
+ import { MACRO } from "../constants/macros.js";
89
+ function completeOnboarding() {
90
+ const config = getGlobalConfig();
91
+ saveGlobalConfig({
92
+ ...config,
93
+ hasCompletedOnboarding: true,
94
+ lastOnboardingVersion: MACRO.VERSION
95
+ });
96
+ }
97
+ async function showSetupScreens(safeMode, print) {
98
+ if (process.env.NODE_ENV === "test") {
99
+ return;
100
+ }
101
+ const config = getGlobalConfig();
102
+ if (!config.theme || !config.hasCompletedOnboarding) {
103
+ await clearTerminal();
104
+ const { render: render2 } = await import("ink");
105
+ await new Promise((resolve) => {
106
+ render2(
107
+ /* @__PURE__ */ React.createElement(
108
+ Onboarding,
109
+ {
110
+ onDone: async () => {
111
+ completeOnboarding();
112
+ await clearTerminal();
113
+ resolve();
114
+ }
115
+ }
116
+ ),
117
+ {
118
+ exitOnCtrlC: false
119
+ }
120
+ );
121
+ });
122
+ }
123
+ if (!print && safeMode) {
124
+ if (!checkHasTrustDialogAccepted()) {
125
+ await new Promise((resolve) => {
126
+ const onDone = () => {
127
+ grantReadPermissionForOriginalDir();
128
+ resolve();
129
+ };
130
+ render(/* @__PURE__ */ React.createElement(TrustDialog, { onDone }), {
131
+ exitOnCtrlC: false
132
+ });
133
+ });
134
+ }
135
+ if (process.env.USER_TYPE === "ant") {
136
+ await handleMcprcServerApprovals();
137
+ }
138
+ }
139
+ }
140
+ function logStartup() {
141
+ const config = getGlobalConfig();
142
+ saveGlobalConfig({
143
+ ...config,
144
+ numStartups: (config.numStartups ?? 0) + 1
145
+ });
146
+ }
147
+ async function setup(cwd2, safeMode) {
148
+ if (cwd2 !== process.cwd()) {
149
+ setOriginalCwd(cwd2);
150
+ }
151
+ await setCwd(cwd2);
152
+ grantReadPermissionForOriginalDir();
153
+ let agentLoader;
154
+ try {
155
+ agentLoader = await import("../utils/agentLoader.js");
156
+ } catch {
157
+ agentLoader = await import("../utils/agentLoader.js");
158
+ }
159
+ const { startAgentWatcher, clearAgentCache } = agentLoader;
160
+ await startAgentWatcher(() => {
161
+ console.log("\u2705 Agent configurations hot-reloaded");
162
+ });
163
+ if (safeMode) {
164
+ if (process.platform !== "win32" && typeof process.getuid === "function" && process.getuid() === 0) {
165
+ console.error(
166
+ `--safe mode cannot be used with root/sudo privileges for security reasons`
167
+ );
168
+ process.exit(1);
169
+ }
170
+ }
171
+ if (process.env.NODE_ENV === "test") {
172
+ return;
173
+ }
174
+ cleanupOldMessageFilesInBackground();
175
+ getContext();
176
+ const globalConfig = getGlobalConfig();
177
+ if (globalConfig.iterm2KeyBindingInstalled === true && globalConfig.shiftEnterKeyBindingInstalled !== true) {
178
+ const updatedConfig = {
179
+ ...globalConfig,
180
+ shiftEnterKeyBindingInstalled: true
181
+ };
182
+ delete updatedConfig.iterm2KeyBindingInstalled;
183
+ saveGlobalConfig(updatedConfig);
184
+ }
185
+ const projectConfig = getCurrentProjectConfig();
186
+ if (projectConfig.lastCost !== void 0 && projectConfig.lastDuration !== void 0) {
187
+ logEvent("tengu_exit", {
188
+ last_session_cost: String(projectConfig.lastCost),
189
+ last_session_api_duration: String(projectConfig.lastAPIDuration),
190
+ last_session_duration: String(projectConfig.lastDuration),
191
+ last_session_id: projectConfig.lastSessionId
192
+ });
193
+ }
194
+ const autoUpdaterStatus = globalConfig.autoUpdaterStatus ?? "not_configured";
195
+ if (autoUpdaterStatus === "not_configured") {
196
+ logEvent("tengu_setup_auto_updater_not_configured", {});
197
+ await new Promise((resolve) => {
198
+ render(/* @__PURE__ */ React.createElement(Doctor, { onDone: () => resolve() }));
199
+ });
200
+ }
201
+ }
202
+ async function main() {
203
+ initDebugLogger();
204
+ try {
205
+ enableConfigs();
206
+ try {
207
+ const repairResult = validateAndRepairAllGPT5Profiles();
208
+ if (repairResult.repaired > 0) {
209
+ console.log(`\u{1F527} Auto-repaired ${repairResult.repaired} GPT-5 model configurations`);
210
+ }
211
+ } catch (repairError) {
212
+ console.warn("\u26A0\uFE0F GPT-5 configuration validation failed:", repairError);
213
+ }
214
+ } catch (error) {
215
+ if (error instanceof ConfigParseError) {
216
+ await showInvalidConfigDialog({ error });
217
+ return;
218
+ }
219
+ }
220
+ let inputPrompt = "";
221
+ let renderContext = {
222
+ exitOnCtrlC: false,
223
+ onFlicker() {
224
+ logEvent("tengu_flicker", {});
225
+ }
226
+ };
227
+ if (!process.stdin.isTTY && !process.env.CI && // Input hijacking breaks MCP.
228
+ !process.argv.includes("mcp")) {
229
+ inputPrompt = await stdin();
230
+ if (process.platform !== "win32") {
231
+ try {
232
+ const ttyFd = openSync("/dev/tty", "r");
233
+ renderContext = { ...renderContext, stdin: new ReadStream(ttyFd) };
234
+ } catch (err) {
235
+ logError(`Could not open /dev/tty: ${err}`);
236
+ }
237
+ }
238
+ }
239
+ await parseArgs(inputPrompt, renderContext);
240
+ }
241
+ async function parseArgs(stdinContent, renderContext) {
242
+ const program = new Command();
243
+ const renderContextWithExitOnCtrlC = {
244
+ ...renderContext,
245
+ exitOnCtrlC: true
246
+ };
247
+ const commands = await getCommands();
248
+ const commandList = commands.filter((cmd) => !cmd.isHidden).map((cmd) => `/${cmd.name} - ${cmd.description}`).join("\n");
249
+ program.name(PRODUCT_COMMAND).description(
250
+ `${PRODUCT_NAME} - starts an interactive session by default, use -p/--print for non-interactive output
251
+
252
+ Slash commands available during an interactive session:
253
+ ${commandList}`
254
+ ).argument("[prompt]", "Your prompt", String).option("-c, --cwd <cwd>", "The current working directory", String, cwd()).option("-d, --debug", "Enable debug mode", () => true).option(
255
+ "--debug-verbose",
256
+ "Enable verbose debug terminal output",
257
+ () => true
258
+ ).option(
259
+ "--verbose",
260
+ "Override verbose mode setting from config",
261
+ () => true
262
+ ).option("-e, --enable-architect", "Enable the Architect tool", () => true).option(
263
+ "-p, --print",
264
+ "Print response and exit (useful for pipes)",
265
+ () => true
266
+ ).option(
267
+ "--safe",
268
+ "Enable strict permission checking mode (default is permissive)",
269
+ () => true
270
+ ).action(
271
+ async (prompt, { cwd: cwd2, debug, verbose, enableArchitect, print, safe }) => {
272
+ await showSetupScreens(safe, print);
273
+ logEvent("tengu_init", {
274
+ entrypoint: PRODUCT_COMMAND,
275
+ hasInitialPrompt: Boolean(prompt).toString(),
276
+ hasStdin: Boolean(stdinContent).toString(),
277
+ enableArchitect: enableArchitect?.toString() ?? "false",
278
+ verbose: verbose?.toString() ?? "false",
279
+ debug: debug?.toString() ?? "false",
280
+ print: print?.toString() ?? "false"
281
+ });
282
+ await setup(cwd2, safe);
283
+ assertMinVersion();
284
+ const [tools, mcpClients] = await Promise.all([
285
+ getTools(
286
+ enableArchitect ?? getCurrentProjectConfig().enableArchitectTool
287
+ ),
288
+ getClients()
289
+ ]);
290
+ const inputPrompt = [prompt, stdinContent].filter(Boolean).join("\n");
291
+ if (print) {
292
+ if (!inputPrompt) {
293
+ console.error(
294
+ "Error: Input must be provided either through stdin or as a prompt argument when using --print"
295
+ );
296
+ process.exit(1);
297
+ }
298
+ addToHistory(inputPrompt);
299
+ const { resultText: response } = await ask({
300
+ commands,
301
+ hasPermissionsToUseTool,
302
+ messageLogName: dateToFilename(/* @__PURE__ */ new Date()),
303
+ prompt: inputPrompt,
304
+ cwd: cwd2,
305
+ tools,
306
+ safeMode: safe
307
+ });
308
+ console.log(response);
309
+ process.exit(0);
310
+ } else {
311
+ const isDefaultModel = await isDefaultSlowAndCapableModel();
312
+ const updateInfo = await (async () => {
313
+ try {
314
+ const latest = await getLatestVersion();
315
+ if (latest && gt(latest, MACRO.VERSION)) {
316
+ const cmds = await getUpdateCommandSuggestions();
317
+ return { version: latest, commands: cmds };
318
+ }
319
+ } catch {
320
+ }
321
+ return { version: null, commands: null };
322
+ })();
323
+ {
324
+ const { render: render2 } = await import("ink");
325
+ const { REPL } = await import("../screens/REPL.js");
326
+ render2(
327
+ /* @__PURE__ */ React.createElement(
328
+ REPL,
329
+ {
330
+ commands,
331
+ debug,
332
+ initialPrompt: inputPrompt,
333
+ messageLogName: dateToFilename(/* @__PURE__ */ new Date()),
334
+ shouldShowPromptInput: true,
335
+ verbose,
336
+ tools,
337
+ safeMode: safe,
338
+ mcpClients,
339
+ isDefaultModel,
340
+ initialUpdateVersion: updateInfo.version,
341
+ initialUpdateCommands: updateInfo.commands
342
+ }
343
+ ),
344
+ renderContext
345
+ );
346
+ }
347
+ }
348
+ }
349
+ ).version(MACRO.VERSION, "-v, --version");
350
+ const config = program.command("config").description(
351
+ `Manage configuration (eg. ${PRODUCT_COMMAND} config set -g theme dark)`
352
+ );
353
+ config.command("get <key>").description("Get a config value").option("-c, --cwd <cwd>", "The current working directory", String, cwd()).option("-g, --global", "Use global config").action(async (key, { cwd: cwd2, global }) => {
354
+ await setup(cwd2, false);
355
+ console.log(getConfigForCLI(key, global ?? false));
356
+ process.exit(0);
357
+ });
358
+ config.command("set <key> <value>").description("Set a config value").option("-c, --cwd <cwd>", "The current working directory", String, cwd()).option("-g, --global", "Use global config").action(async (key, value, { cwd: cwd2, global }) => {
359
+ await setup(cwd2, false);
360
+ setConfigForCLI(key, value, global ?? false);
361
+ console.log(`Set ${key} to ${value}`);
362
+ process.exit(0);
363
+ });
364
+ config.command("remove <key>").description("Remove a config value").option("-c, --cwd <cwd>", "The current working directory", String, cwd()).option("-g, --global", "Use global config").action(async (key, { cwd: cwd2, global }) => {
365
+ await setup(cwd2, false);
366
+ deleteConfigForCLI(key, global ?? false);
367
+ console.log(`Removed ${key}`);
368
+ process.exit(0);
369
+ });
370
+ config.command("list").description("List all config values").option("-c, --cwd <cwd>", "The current working directory", String, cwd()).option("-g, --global", "Use global config", false).action(async ({ cwd: cwd2, global }) => {
371
+ await setup(cwd2, false);
372
+ console.log(
373
+ JSON.stringify(global ? listConfigForCLI(true) : listConfigForCLI(false), null, 2)
374
+ );
375
+ process.exit(0);
376
+ });
377
+ const allowedTools = program.command("approved-tools").description("Manage approved tools");
378
+ allowedTools.command("list").description("List all approved tools").action(async () => {
379
+ const result = handleListApprovedTools(getCwd());
380
+ console.log(result);
381
+ process.exit(0);
382
+ });
383
+ allowedTools.command("remove <tool>").description("Remove a tool from the list of approved tools").action(async (tool) => {
384
+ const result = handleRemoveApprovedTool(tool);
385
+ logEvent("tengu_approved_tool_remove", {
386
+ tool,
387
+ success: String(result.success)
388
+ });
389
+ console.log(result.message);
390
+ process.exit(result.success ? 0 : 1);
391
+ });
392
+ const mcp = program.command("mcp").description("Configure and manage MCP servers");
393
+ mcp.command("serve").description(`Start the ${PRODUCT_NAME} MCP server`).action(async () => {
394
+ const providedCwd = program.opts().cwd ?? cwd();
395
+ logEvent("tengu_mcp_start", { providedCwd });
396
+ if (!existsSync(providedCwd)) {
397
+ console.error(`Error: Directory ${providedCwd} does not exist`);
398
+ process.exit(1);
399
+ }
400
+ try {
401
+ await setup(providedCwd, false);
402
+ await startMCPServer(providedCwd);
403
+ } catch (error) {
404
+ console.error("Error: Failed to start MCP server:", error);
405
+ process.exit(1);
406
+ }
407
+ });
408
+ mcp.command("add-sse <name> <url>").description("Add an SSE server").option(
409
+ "-s, --scope <scope>",
410
+ "Configuration scope (project or global)",
411
+ "project"
412
+ ).action(async (name, url, options) => {
413
+ try {
414
+ const scope = ensureConfigScope(options.scope);
415
+ logEvent("tengu_mcp_add", { name, type: "sse", scope });
416
+ addMcpServer(name, { type: "sse", url }, scope);
417
+ console.log(
418
+ `Added SSE MCP server ${name} with URL ${url} to ${scope} config`
419
+ );
420
+ process.exit(0);
421
+ } catch (error) {
422
+ console.error(error.message);
423
+ process.exit(1);
424
+ }
425
+ });
426
+ mcp.command("add [name] [commandOrUrl] [args...]").description("Add a server (run without arguments for interactive wizard)").option(
427
+ "-s, --scope <scope>",
428
+ "Configuration scope (project or global)",
429
+ "project"
430
+ ).option(
431
+ "-e, --env <env...>",
432
+ "Set environment variables (e.g. -e KEY=value)"
433
+ ).action(async (name, commandOrUrl, args, options) => {
434
+ try {
435
+ if (!name) {
436
+ console.log("Interactive wizard mode: Enter the server details");
437
+ const { createInterface } = await import("readline");
438
+ const rl = createInterface({
439
+ input: process.stdin,
440
+ output: process.stdout
441
+ });
442
+ const question = (query) => new Promise((resolve) => rl.question(query, resolve));
443
+ const serverName = await question("Server name: ");
444
+ if (!serverName) {
445
+ console.error("Error: Server name is required");
446
+ rl.close();
447
+ process.exit(1);
448
+ }
449
+ const serverType = await question(
450
+ "Server type (stdio or sse) [stdio]: "
451
+ );
452
+ const type = serverType && ["stdio", "sse"].includes(serverType) ? serverType : "stdio";
453
+ const prompt = type === "stdio" ? "Command: " : "URL: ";
454
+ const commandOrUrlValue = await question(prompt);
455
+ if (!commandOrUrlValue) {
456
+ console.error(
457
+ `Error: ${type === "stdio" ? "Command" : "URL"} is required`
458
+ );
459
+ rl.close();
460
+ process.exit(1);
461
+ }
462
+ let serverArgs = [];
463
+ let serverEnv = {};
464
+ if (type === "stdio") {
465
+ const argsStr = await question(
466
+ "Command arguments (space-separated): "
467
+ );
468
+ serverArgs = argsStr ? argsStr.split(" ").filter(Boolean) : [];
469
+ const envStr = await question(
470
+ "Environment variables (format: KEY1=value1,KEY2=value2): "
471
+ );
472
+ if (envStr) {
473
+ const envPairs = envStr.split(",").map((pair) => pair.trim());
474
+ serverEnv = parseEnvVars(envPairs.map((pair) => pair));
475
+ }
476
+ }
477
+ const scopeStr = await question(
478
+ "Configuration scope (project or global) [project]: "
479
+ );
480
+ const serverScope = ensureConfigScope(scopeStr || "project");
481
+ rl.close();
482
+ if (type === "sse") {
483
+ logEvent("tengu_mcp_add", {
484
+ name: serverName,
485
+ type: "sse",
486
+ scope: serverScope
487
+ });
488
+ addMcpServer(
489
+ serverName,
490
+ { type: "sse", url: commandOrUrlValue },
491
+ serverScope
492
+ );
493
+ console.log(
494
+ `Added SSE MCP server ${serverName} with URL ${commandOrUrlValue} to ${serverScope} config`
495
+ );
496
+ } else {
497
+ logEvent("tengu_mcp_add", {
498
+ name: serverName,
499
+ type: "stdio",
500
+ scope: serverScope
501
+ });
502
+ addMcpServer(
503
+ serverName,
504
+ {
505
+ type: "stdio",
506
+ command: commandOrUrlValue,
507
+ args: serverArgs,
508
+ env: serverEnv
509
+ },
510
+ serverScope
511
+ );
512
+ console.log(
513
+ `Added stdio MCP server ${serverName} with command: ${commandOrUrlValue} ${serverArgs.join(" ")} to ${serverScope} config`
514
+ );
515
+ }
516
+ } else if (name && commandOrUrl) {
517
+ const scope = ensureConfigScope(options.scope);
518
+ if (commandOrUrl.match(/^https?:\/\//)) {
519
+ logEvent("tengu_mcp_add", { name, type: "sse", scope });
520
+ addMcpServer(name, { type: "sse", url: commandOrUrl }, scope);
521
+ console.log(
522
+ `Added SSE MCP server ${name} with URL ${commandOrUrl} to ${scope} config`
523
+ );
524
+ } else {
525
+ logEvent("tengu_mcp_add", { name, type: "stdio", scope });
526
+ const env2 = parseEnvVars(options.env);
527
+ addMcpServer(
528
+ name,
529
+ { type: "stdio", command: commandOrUrl, args: args || [], env: env2 },
530
+ scope
531
+ );
532
+ console.log(
533
+ `Added stdio MCP server ${name} with command: ${commandOrUrl} ${(args || []).join(" ")} to ${scope} config`
534
+ );
535
+ }
536
+ } else {
537
+ console.error(
538
+ "Error: Missing required arguments. Either provide no arguments for interactive mode or specify name and command/URL."
539
+ );
540
+ process.exit(1);
541
+ }
542
+ process.exit(0);
543
+ } catch (error) {
544
+ console.error(error.message);
545
+ process.exit(1);
546
+ }
547
+ });
548
+ mcp.command("remove <name>").description("Remove an MCP server").option(
549
+ "-s, --scope <scope>",
550
+ "Configuration scope (project, global, or mcprc)",
551
+ "project"
552
+ ).action(async (name, options) => {
553
+ try {
554
+ const scope = ensureConfigScope(options.scope);
555
+ logEvent("tengu_mcp_delete", { name, scope });
556
+ removeMcpServer(name, scope);
557
+ console.log(`Removed MCP server ${name} from ${scope} config`);
558
+ process.exit(0);
559
+ } catch (error) {
560
+ console.error(error.message);
561
+ process.exit(1);
562
+ }
563
+ });
564
+ mcp.command("list").description("List configured MCP servers").action(() => {
565
+ logEvent("tengu_mcp_list", {});
566
+ const servers = listMCPServers();
567
+ if (Object.keys(servers).length === 0) {
568
+ console.log(
569
+ `No MCP servers configured. Use \`${PRODUCT_COMMAND} mcp add\` to add a server.`
570
+ );
571
+ } else {
572
+ for (const [name, server] of Object.entries(servers)) {
573
+ if (server.type === "sse") {
574
+ console.log(`${name}: ${server.url} (SSE)`);
575
+ } else {
576
+ console.log(`${name}: ${server.command} ${server.args.join(" ")}`);
577
+ }
578
+ }
579
+ }
580
+ process.exit(0);
581
+ });
582
+ mcp.command("add-json <name> <json>").description("Add an MCP server (stdio or SSE) with a JSON string").option(
583
+ "-s, --scope <scope>",
584
+ "Configuration scope (project or global)",
585
+ "project"
586
+ ).action(async (name, jsonStr, options) => {
587
+ try {
588
+ const scope = ensureConfigScope(options.scope);
589
+ let serverConfig;
590
+ try {
591
+ serverConfig = JSON.parse(jsonStr);
592
+ } catch (e) {
593
+ console.error("Error: Invalid JSON string");
594
+ process.exit(1);
595
+ }
596
+ if (!serverConfig.type || !["stdio", "sse"].includes(serverConfig.type)) {
597
+ console.error('Error: Server type must be "stdio" or "sse"');
598
+ process.exit(1);
599
+ }
600
+ if (serverConfig.type === "sse" && !serverConfig.url) {
601
+ console.error("Error: SSE server must have a URL");
602
+ process.exit(1);
603
+ }
604
+ if (serverConfig.type === "stdio" && !serverConfig.command) {
605
+ console.error("Error: stdio server must have a command");
606
+ process.exit(1);
607
+ }
608
+ logEvent("tengu_mcp_add_json", { name, type: serverConfig.type, scope });
609
+ addMcpServer(name, serverConfig, scope);
610
+ if (serverConfig.type === "sse") {
611
+ console.log(
612
+ `Added SSE MCP server ${name} with URL ${serverConfig.url} to ${scope} config`
613
+ );
614
+ } else {
615
+ console.log(
616
+ `Added stdio MCP server ${name} with command: ${serverConfig.command} ${(serverConfig.args || []).join(" ")} to ${scope} config`
617
+ );
618
+ }
619
+ process.exit(0);
620
+ } catch (error) {
621
+ console.error(error.message);
622
+ process.exit(1);
623
+ }
624
+ });
625
+ mcp.command("get <name>").description("Get details about an MCP server").action((name) => {
626
+ logEvent("tengu_mcp_get", { name });
627
+ const server = getMcpServer(name);
628
+ if (!server) {
629
+ console.error(`No MCP server found with name: ${name}`);
630
+ process.exit(1);
631
+ }
632
+ console.log(`${name}:`);
633
+ console.log(` Scope: ${server.scope}`);
634
+ if (server.type === "sse") {
635
+ console.log(` Type: sse`);
636
+ console.log(` URL: ${server.url}`);
637
+ } else {
638
+ console.log(` Type: stdio`);
639
+ console.log(` Command: ${server.command}`);
640
+ console.log(` Args: ${server.args.join(" ")}`);
641
+ if (server.env) {
642
+ console.log(" Environment:");
643
+ for (const [key, value] of Object.entries(server.env)) {
644
+ console.log(` ${key}=${value}`);
645
+ }
646
+ }
647
+ }
648
+ process.exit(0);
649
+ });
650
+ mcp.command("add-from-claude-desktop").description(
651
+ "Import MCP servers from Claude Desktop (Mac, Windows and WSL)"
652
+ ).option(
653
+ "-s, --scope <scope>",
654
+ "Configuration scope (project or global)",
655
+ "project"
656
+ ).action(async (options) => {
657
+ try {
658
+ const scope = ensureConfigScope(options.scope);
659
+ const platform = process.platform;
660
+ const { existsSync: existsSync2, readFileSync } = await import("fs");
661
+ const { join: join2 } = await import("path");
662
+ const { exec } = await import("child_process");
663
+ const isWSL = platform === "linux" && existsSync2("/proc/version") && readFileSync("/proc/version", "utf-8").toLowerCase().includes("microsoft");
664
+ if (platform !== "darwin" && platform !== "win32" && !isWSL) {
665
+ console.error(
666
+ "Error: This command is only supported on macOS, Windows, and WSL"
667
+ );
668
+ process.exit(1);
669
+ }
670
+ let configPath;
671
+ if (platform === "darwin") {
672
+ configPath = join2(
673
+ process.env.HOME || "~",
674
+ "Library/Application Support/Claude/claude_desktop_config.json"
675
+ );
676
+ } else if (platform === "win32") {
677
+ configPath = join2(
678
+ process.env.APPDATA || "",
679
+ "Claude/claude_desktop_config.json"
680
+ );
681
+ } else if (isWSL) {
682
+ const whoamiCommand = await new Promise((resolve, reject) => {
683
+ exec(
684
+ 'powershell.exe -Command "whoami"',
685
+ (err, stdout) => {
686
+ if (err) reject(err);
687
+ else resolve(stdout.trim().split("\\").pop() || "");
688
+ }
689
+ );
690
+ });
691
+ configPath = `/mnt/c/Users/${whoamiCommand}/AppData/Roaming/Claude/claude_desktop_config.json`;
692
+ }
693
+ if (!existsSync2(configPath)) {
694
+ console.error(
695
+ `Error: Claude Desktop config file not found at ${configPath}`
696
+ );
697
+ process.exit(1);
698
+ }
699
+ let config2;
700
+ try {
701
+ const configContent = readFileSync(configPath, "utf-8");
702
+ config2 = JSON.parse(configContent);
703
+ } catch (err) {
704
+ console.error(`Error reading config file: ${err}`);
705
+ process.exit(1);
706
+ }
707
+ const mcpServers = config2.mcpServers || {};
708
+ const serverNames = Object.keys(mcpServers);
709
+ const numServers = serverNames.length;
710
+ if (numServers === 0) {
711
+ console.log("No MCP servers found in Claude Desktop config");
712
+ process.exit(0);
713
+ }
714
+ const serversInfo = serverNames.map((name) => {
715
+ const server = mcpServers[name];
716
+ let description = "";
717
+ if (server.type === "sse") {
718
+ description = `SSE: ${server.url}`;
719
+ } else {
720
+ description = `stdio: ${server.command} ${(server.args || []).join(" ")}`;
721
+ }
722
+ return { name, description, server };
723
+ });
724
+ const ink = await import("ink");
725
+ const reactModule = await import("react");
726
+ const inkjsui = await import("@inkjs/ui");
727
+ const utilsTheme = await import("../utils/theme.js");
728
+ const { render: render2 } = ink;
729
+ const React2 = reactModule;
730
+ const { MultiSelect } = inkjsui;
731
+ const { Box, Text } = ink;
732
+ const { getTheme } = utilsTheme;
733
+ await new Promise((resolve) => {
734
+ function ClaudeDesktopImport() {
735
+ const { useState } = reactModule;
736
+ const [isFinished, setIsFinished] = useState(false);
737
+ const [importResults, setImportResults] = useState([]);
738
+ const [isImporting, setIsImporting] = useState(false);
739
+ const theme = getTheme();
740
+ const importServers = async (selectedServers) => {
741
+ setIsImporting(true);
742
+ const results = [];
743
+ for (const name of selectedServers) {
744
+ try {
745
+ const server = mcpServers[name];
746
+ const existingServer = getMcpServer(name);
747
+ if (existingServer) {
748
+ continue;
749
+ }
750
+ addMcpServer(name, server, scope);
751
+ results.push({ name, success: true });
752
+ } catch (err) {
753
+ results.push({ name, success: false });
754
+ }
755
+ }
756
+ setImportResults(results);
757
+ setIsImporting(false);
758
+ setIsFinished(true);
759
+ setTimeout(() => {
760
+ resolve();
761
+ }, 1e3);
762
+ };
763
+ const handleConfirm = async (selectedServers) => {
764
+ const existingServers = selectedServers.filter(
765
+ (name) => getMcpServer(name)
766
+ );
767
+ if (existingServers.length > 0) {
768
+ const results = [];
769
+ const newServers = selectedServers.filter(
770
+ (name) => !getMcpServer(name)
771
+ );
772
+ for (const name of newServers) {
773
+ try {
774
+ const server = mcpServers[name];
775
+ addMcpServer(name, server, scope);
776
+ results.push({ name, success: true });
777
+ } catch (err) {
778
+ results.push({ name, success: false });
779
+ }
780
+ }
781
+ for (const name of existingServers) {
782
+ try {
783
+ const server = mcpServers[name];
784
+ addMcpServer(name, server, scope);
785
+ results.push({ name, success: true });
786
+ } catch (err) {
787
+ results.push({ name, success: false });
788
+ }
789
+ }
790
+ setImportResults(results);
791
+ setIsImporting(false);
792
+ setIsFinished(true);
793
+ setTimeout(() => {
794
+ resolve();
795
+ }, 1e3);
796
+ } else {
797
+ await importServers(selectedServers);
798
+ }
799
+ };
800
+ return /* @__PURE__ */ React2.createElement(Box, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React2.createElement(
801
+ Box,
802
+ {
803
+ flexDirection: "column",
804
+ borderStyle: "round",
805
+ borderColor: theme.kode,
806
+ padding: 1,
807
+ width: "100%"
808
+ },
809
+ /* @__PURE__ */ React2.createElement(Text, { bold: true, color: theme.kode }, "Import MCP Servers from Claude Desktop"),
810
+ /* @__PURE__ */ React2.createElement(Box, { marginY: 1 }, /* @__PURE__ */ React2.createElement(Text, null, "Found ", numServers, " MCP servers in Claude Desktop.")),
811
+ /* @__PURE__ */ React2.createElement(Text, null, "Please select the servers you want to import:"),
812
+ /* @__PURE__ */ React2.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React2.createElement(
813
+ MultiSelect,
814
+ {
815
+ options: serverNames.map((name) => ({
816
+ label: name,
817
+ value: name
818
+ })),
819
+ defaultValue: serverNames,
820
+ onSubmit: handleConfirm
821
+ }
822
+ ))
823
+ ), /* @__PURE__ */ React2.createElement(Box, { marginTop: 0, marginLeft: 3 }, /* @__PURE__ */ React2.createElement(Text, { dimColor: true }, "Space to select \xB7 Enter to confirm \xB7 Esc to cancel")), isFinished && /* @__PURE__ */ React2.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React2.createElement(Text, { color: theme.success }, "Successfully imported", " ", importResults.filter((r) => r.success).length, " MCP server to local config.")));
824
+ }
825
+ const { unmount } = render2(/* @__PURE__ */ React2.createElement(ClaudeDesktopImport, null));
826
+ setTimeout(() => {
827
+ unmount();
828
+ resolve();
829
+ }, 3e4);
830
+ });
831
+ process.exit(0);
832
+ } catch (error) {
833
+ console.error(`Error: ${error.message}`);
834
+ process.exit(1);
835
+ }
836
+ });
837
+ const resetMcpChoices = () => {
838
+ const config2 = getCurrentProjectConfig();
839
+ saveCurrentProjectConfig({
840
+ ...config2,
841
+ approvedMcprcServers: [],
842
+ rejectedMcprcServers: []
843
+ });
844
+ console.log("All .mcprc server approvals and rejections have been reset.");
845
+ console.log(
846
+ `You will be prompted for approval next time you start ${PRODUCT_NAME}.`
847
+ );
848
+ process.exit(0);
849
+ };
850
+ mcp.command("reset-project-choices").description(
851
+ "Reset all approved and rejected project-scoped (.mcp.json) servers within this project"
852
+ ).action(() => {
853
+ logEvent("tengu_mcp_reset_project_choices", {});
854
+ resetMcpChoices();
855
+ });
856
+ if (process.env.USER_TYPE === "ant") {
857
+ mcp.command("reset-mcprc-choices").description(
858
+ "Reset all approved and rejected .mcprc servers for this project"
859
+ ).action(() => {
860
+ logEvent("tengu_mcp_reset_mcprc_choices", {});
861
+ resetMcpChoices();
862
+ });
863
+ }
864
+ program.command("doctor").description(`Check the health of your ${PRODUCT_NAME} auto-updater`).action(async () => {
865
+ logEvent("tengu_doctor_command", {});
866
+ await new Promise((resolve) => {
867
+ render(/* @__PURE__ */ React.createElement(Doctor, { onDone: () => resolve(), doctorMode: true }));
868
+ });
869
+ process.exit(0);
870
+ });
871
+ program.command("update").description("Show manual upgrade commands (no auto-install)").action(async () => {
872
+ logEvent("tengu_update_check", {});
873
+ console.log(`Current version: ${MACRO.VERSION}`);
874
+ console.log("Checking for updates...");
875
+ const latestVersion = await getLatestVersion();
876
+ if (!latestVersion) {
877
+ console.error("Failed to check for updates");
878
+ process.exit(1);
879
+ }
880
+ if (latestVersion === MACRO.VERSION) {
881
+ console.log(`${PRODUCT_NAME} is up to date`);
882
+ process.exit(0);
883
+ }
884
+ console.log(`New version available: ${latestVersion}`);
885
+ const { getUpdateCommandSuggestions: getUpdateCommandSuggestions2 } = await import("../utils/autoUpdater.js");
886
+ const cmds = await getUpdateCommandSuggestions2();
887
+ console.log("\nRun one of the following commands to update:");
888
+ for (const c of cmds) console.log(` ${c}`);
889
+ if (process.platform !== "win32") {
890
+ console.log('\nNote: you may need to prefix with "sudo" on macOS/Linux.');
891
+ }
892
+ process.exit(0);
893
+ });
894
+ program.command("log").description("Manage conversation logs.").argument(
895
+ "[number]",
896
+ "A number (0, 1, 2, etc.) to display a specific log",
897
+ parseInt
898
+ ).option("-c, --cwd <cwd>", "The current working directory", String, cwd()).action(async (number, { cwd: cwd2 }) => {
899
+ await setup(cwd2, false);
900
+ logEvent("tengu_view_logs", { number: number?.toString() ?? "" });
901
+ const context2 = {};
902
+ const { unmount } = render(
903
+ /* @__PURE__ */ React.createElement(LogList, { context: context2, type: "messages", logNumber: number }),
904
+ renderContextWithExitOnCtrlC
905
+ );
906
+ context2.unmount = unmount;
907
+ });
908
+ program.command("resume").description(
909
+ "Resume a previous conversation. Optionally provide a number (0, 1, 2, etc.) or file path to resume a specific conversation."
910
+ ).argument(
911
+ "[identifier]",
912
+ "A number (0, 1, 2, etc.) or file path to resume a specific conversation"
913
+ ).option("-c, --cwd <cwd>", "The current working directory", String, cwd()).option("-e, --enable-architect", "Enable the Architect tool", () => true).option("-v, --verbose", "Do not truncate message output", () => true).option(
914
+ "--safe",
915
+ "Enable strict permission checking mode (default is permissive)",
916
+ () => true
917
+ ).action(async (identifier, { cwd: cwd2, enableArchitect, safe, verbose }) => {
918
+ await setup(cwd2, safe);
919
+ assertMinVersion();
920
+ const [tools, commands2, logs, mcpClients] = await Promise.all([
921
+ getTools(
922
+ enableArchitect ?? getCurrentProjectConfig().enableArchitectTool
923
+ ),
924
+ getCommands(),
925
+ loadLogList(CACHE_PATHS.messages()),
926
+ getClients()
927
+ ]);
928
+ if (identifier !== void 0) {
929
+ const number = Math.abs(parseInt(identifier));
930
+ const isNumber = !isNaN(number);
931
+ let messages, date, forkNumber;
932
+ try {
933
+ if (isNumber) {
934
+ logEvent("tengu_resume", { number: number.toString() });
935
+ const log = logs[number];
936
+ if (!log) {
937
+ console.error("No conversation found at index", number);
938
+ process.exit(1);
939
+ }
940
+ messages = await loadMessagesFromLog(log.fullPath, tools);
941
+ ({ date, forkNumber } = log);
942
+ } else {
943
+ logEvent("tengu_resume", { filePath: identifier });
944
+ if (!existsSync(identifier)) {
945
+ console.error("File does not exist:", identifier);
946
+ process.exit(1);
947
+ }
948
+ messages = await loadMessagesFromLog(identifier, tools);
949
+ const pathSegments = identifier.split("/");
950
+ const filename = pathSegments[pathSegments.length - 1] ?? "unknown";
951
+ ({ date, forkNumber } = parseLogFilename(filename));
952
+ }
953
+ const fork = getNextAvailableLogForkNumber(date, forkNumber ?? 1, 0);
954
+ const isDefaultModel = await isDefaultSlowAndCapableModel();
955
+ {
956
+ const { render: render2 } = await import("ink");
957
+ const { REPL } = await import("../screens/REPL.js");
958
+ render2(
959
+ /* @__PURE__ */ React.createElement(
960
+ REPL,
961
+ {
962
+ initialPrompt: "",
963
+ messageLogName: date,
964
+ initialForkNumber: fork,
965
+ shouldShowPromptInput: true,
966
+ verbose,
967
+ commands: commands2,
968
+ tools,
969
+ safeMode: safe,
970
+ initialMessages: messages,
971
+ mcpClients,
972
+ isDefaultModel
973
+ }
974
+ ),
975
+ { exitOnCtrlC: false }
976
+ );
977
+ }
978
+ } catch (error) {
979
+ logError(`Failed to load conversation: ${error}`);
980
+ process.exit(1);
981
+ }
982
+ } else {
983
+ const context2 = {};
984
+ const { unmount } = render(
985
+ /* @__PURE__ */ React.createElement(
986
+ ResumeConversation,
987
+ {
988
+ context: context2,
989
+ commands: commands2,
990
+ logs,
991
+ tools,
992
+ verbose
993
+ }
994
+ ),
995
+ renderContextWithExitOnCtrlC
996
+ );
997
+ context2.unmount = unmount;
998
+ }
999
+ });
1000
+ program.command("error").description(
1001
+ "View error logs. Optionally provide a number (0, -1, -2, etc.) to display a specific log."
1002
+ ).argument(
1003
+ "[number]",
1004
+ "A number (0, 1, 2, etc.) to display a specific log",
1005
+ parseInt
1006
+ ).option("-c, --cwd <cwd>", "The current working directory", String, cwd()).action(async (number, { cwd: cwd2 }) => {
1007
+ await setup(cwd2, false);
1008
+ logEvent("tengu_view_errors", { number: number?.toString() ?? "" });
1009
+ const context2 = {};
1010
+ const { unmount } = render(
1011
+ /* @__PURE__ */ React.createElement(LogList, { context: context2, type: "errors", logNumber: number }),
1012
+ renderContextWithExitOnCtrlC
1013
+ );
1014
+ context2.unmount = unmount;
1015
+ });
1016
+ const context = program.command("context").description(
1017
+ `Set static context (eg. ${PRODUCT_COMMAND} context add-file ./src/*.py)`
1018
+ );
1019
+ context.command("get <key>").option("-c, --cwd <cwd>", "The current working directory", String, cwd()).description("Get a value from context").action(async (key, { cwd: cwd2 }) => {
1020
+ await setup(cwd2, false);
1021
+ logEvent("tengu_context_get", { key });
1022
+ const context2 = omit(
1023
+ await getContext(),
1024
+ "codeStyle",
1025
+ "directoryStructure"
1026
+ );
1027
+ console.log(context2[key]);
1028
+ process.exit(0);
1029
+ });
1030
+ context.command("set <key> <value>").description("Set a value in context").option("-c, --cwd <cwd>", "The current working directory", String, cwd()).action(async (key, value, { cwd: cwd2 }) => {
1031
+ await setup(cwd2, false);
1032
+ logEvent("tengu_context_set", { key });
1033
+ setContext(key, value);
1034
+ console.log(`Set context.${key} to "${value}"`);
1035
+ process.exit(0);
1036
+ });
1037
+ context.command("list").description("List all context values").option("-c, --cwd <cwd>", "The current working directory", String, cwd()).action(async ({ cwd: cwd2 }) => {
1038
+ await setup(cwd2, false);
1039
+ logEvent("tengu_context_list", {});
1040
+ const context2 = omit(
1041
+ await getContext(),
1042
+ "codeStyle",
1043
+ "directoryStructure",
1044
+ "gitStatus"
1045
+ );
1046
+ console.log(JSON.stringify(context2, null, 2));
1047
+ process.exit(0);
1048
+ });
1049
+ context.command("remove <key>").description("Remove a value from context").option("-c, --cwd <cwd>", "The current working directory", String, cwd()).action(async (key, { cwd: cwd2 }) => {
1050
+ await setup(cwd2, false);
1051
+ logEvent("tengu_context_delete", { key });
1052
+ removeContext(key);
1053
+ console.log(`Removed context.${key}`);
1054
+ process.exit(0);
1055
+ });
1056
+ await program.parseAsync(process.argv);
1057
+ return program;
1058
+ }
1059
+ async function stdin() {
1060
+ if (process.stdin.isTTY) {
1061
+ return "";
1062
+ }
1063
+ let data = "";
1064
+ for await (const chunk of process.stdin) data += chunk;
1065
+ return data;
1066
+ }
1067
+ process.on("exit", () => {
1068
+ resetCursor();
1069
+ PersistentShell.getInstance().close();
1070
+ });
1071
+ function gracefulExit(code = 0) {
1072
+ try {
1073
+ resetCursor();
1074
+ } catch {
1075
+ }
1076
+ try {
1077
+ PersistentShell.getInstance().close();
1078
+ } catch {
1079
+ }
1080
+ process.exit(code);
1081
+ }
1082
+ process.on("SIGINT", () => gracefulExit(0));
1083
+ process.on("SIGTERM", () => gracefulExit(0));
1084
+ process.on("SIGBREAK", () => gracefulExit(0));
1085
+ process.on("unhandledRejection", (err) => {
1086
+ console.error("Unhandled rejection:", err);
1087
+ gracefulExit(1);
1088
+ });
1089
+ process.on("uncaughtException", (err) => {
1090
+ console.error("Uncaught exception:", err);
1091
+ gracefulExit(1);
1092
+ });
1093
+ function resetCursor() {
1094
+ const terminal = process.stderr.isTTY ? process.stderr : process.stdout.isTTY ? process.stdout : void 0;
1095
+ terminal?.write(`\x1B[?25h${cursorShow}`);
1096
+ }
1097
+ main();
1098
+ export {
1099
+ completeOnboarding
1100
+ };
1101
+ //# sourceMappingURL=cli.js.map