@shareai-lab/kode 1.1.12 → 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 +44 -23
  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 +28 -7
  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,687 @@
1
+ import { memoize } from "lodash-es";
2
+ import { getDynamicConfig } from "../services/statsig.js";
3
+ import { logError } from "./log.js";
4
+ import {
5
+ getGlobalConfig,
6
+ saveGlobalConfig
7
+ } from "./config.js";
8
+ const USE_BEDROCK = !!process.env.CLAUDE_CODE_USE_BEDROCK;
9
+ const USE_VERTEX = !!process.env.CLAUDE_CODE_USE_VERTEX;
10
+ const DEFAULT_MODEL_CONFIG = {
11
+ bedrock: "us.anthropic.claude-3-7-sonnet-20250219-v1:0",
12
+ vertex: "claude-3-7-sonnet@20250219",
13
+ firstParty: "claude-sonnet-4-20250514"
14
+ };
15
+ async function getModelConfig() {
16
+ try {
17
+ return await getDynamicConfig(
18
+ "tengu-capable-model-config",
19
+ DEFAULT_MODEL_CONFIG
20
+ );
21
+ } catch (error) {
22
+ logError(error);
23
+ return DEFAULT_MODEL_CONFIG;
24
+ }
25
+ }
26
+ const getSlowAndCapableModel = memoize(async () => {
27
+ const config = await getGlobalConfig();
28
+ const modelManager = new ModelManager(config);
29
+ const model = modelManager.getMainAgentModel();
30
+ if (model) {
31
+ return model;
32
+ }
33
+ const modelConfig = await getModelConfig();
34
+ if (USE_BEDROCK) return modelConfig.bedrock;
35
+ if (USE_VERTEX) return modelConfig.vertex;
36
+ return modelConfig.firstParty;
37
+ });
38
+ async function isDefaultSlowAndCapableModel() {
39
+ return !process.env.ANTHROPIC_MODEL || process.env.ANTHROPIC_MODEL === await getSlowAndCapableModel();
40
+ }
41
+ function getVertexRegionForModel(model) {
42
+ if (model?.startsWith("claude-3-5-haiku")) {
43
+ return process.env.VERTEX_REGION_CLAUDE_3_5_HAIKU;
44
+ } else if (model?.startsWith("claude-3-5-sonnet")) {
45
+ return process.env.VERTEX_REGION_CLAUDE_3_5_SONNET;
46
+ } else if (model?.startsWith("claude-3-7-sonnet")) {
47
+ return process.env.VERTEX_REGION_CLAUDE_3_7_SONNET;
48
+ }
49
+ }
50
+ class ModelManager {
51
+ config;
52
+ // Using any to handle legacy properties
53
+ modelProfiles;
54
+ constructor(config) {
55
+ this.config = config;
56
+ this.modelProfiles = config.modelProfiles || [];
57
+ }
58
+ /**
59
+ * Get the current terminal model (for interactive CLI sessions)
60
+ */
61
+ getCurrentModel() {
62
+ const mainModelName = this.config.modelPointers?.main;
63
+ if (mainModelName) {
64
+ const profile = this.findModelProfile(mainModelName);
65
+ if (profile && profile.isActive) {
66
+ return profile.modelName;
67
+ }
68
+ }
69
+ return this.getMainAgentModel();
70
+ }
71
+ /**
72
+ * Get the main agent default model (for non-terminal mode and MCP calls)
73
+ */
74
+ getMainAgentModel() {
75
+ const mainModelName = this.config.modelPointers?.main;
76
+ if (mainModelName) {
77
+ const profile = this.findModelProfile(mainModelName);
78
+ if (profile && profile.isActive) {
79
+ return profile.modelName;
80
+ }
81
+ }
82
+ const activeProfile = this.modelProfiles.find((p) => p.isActive);
83
+ if (activeProfile) {
84
+ return activeProfile.modelName;
85
+ }
86
+ return null;
87
+ }
88
+ /**
89
+ * Get the task tool default model (for Task tool sub-agents)
90
+ */
91
+ getTaskToolModel() {
92
+ const taskModelName = this.config.modelPointers?.task;
93
+ if (taskModelName) {
94
+ const profile = this.findModelProfile(taskModelName);
95
+ if (profile && profile.isActive) {
96
+ return profile.modelName;
97
+ }
98
+ }
99
+ return this.getMainAgentModel();
100
+ }
101
+ /**
102
+ * Switch to the next available model with simple context overflow handling
103
+ * If target model can't handle current context, shows warning and reverts after delay
104
+ *
105
+ * @param currentContextTokens - Current conversation token count for validation
106
+ * @returns Object with model name and context status information
107
+ */
108
+ switchToNextModelWithContextCheck(currentContextTokens = 0) {
109
+ const allProfiles = this.getAllConfiguredModels();
110
+ if (allProfiles.length === 0) {
111
+ return {
112
+ success: false,
113
+ modelName: null,
114
+ previousModelName: null,
115
+ contextOverflow: false,
116
+ usagePercentage: 0
117
+ };
118
+ }
119
+ allProfiles.sort((a, b) => {
120
+ return a.createdAt - b.createdAt;
121
+ });
122
+ const currentMainModelName = this.config.modelPointers?.main;
123
+ const currentModel = currentMainModelName ? this.findModelProfile(currentMainModelName) : null;
124
+ const previousModelName = currentModel?.name || null;
125
+ if (!currentMainModelName) {
126
+ const firstModel = allProfiles[0];
127
+ if (!firstModel.isActive) {
128
+ firstModel.isActive = true;
129
+ }
130
+ this.setPointer("main", firstModel.modelName);
131
+ this.updateLastUsed(firstModel.modelName);
132
+ const analysis2 = this.analyzeContextCompatibility(
133
+ firstModel,
134
+ currentContextTokens
135
+ );
136
+ return {
137
+ success: true,
138
+ modelName: firstModel.name,
139
+ previousModelName: null,
140
+ contextOverflow: !analysis2.compatible,
141
+ usagePercentage: analysis2.usagePercentage
142
+ };
143
+ }
144
+ const currentIndex = allProfiles.findIndex(
145
+ (p) => p.modelName === currentMainModelName
146
+ );
147
+ if (currentIndex === -1) {
148
+ const firstModel = allProfiles[0];
149
+ if (!firstModel.isActive) {
150
+ firstModel.isActive = true;
151
+ }
152
+ this.setPointer("main", firstModel.modelName);
153
+ this.updateLastUsed(firstModel.modelName);
154
+ const analysis2 = this.analyzeContextCompatibility(
155
+ firstModel,
156
+ currentContextTokens
157
+ );
158
+ return {
159
+ success: true,
160
+ modelName: firstModel.name,
161
+ previousModelName,
162
+ contextOverflow: !analysis2.compatible,
163
+ usagePercentage: analysis2.usagePercentage
164
+ };
165
+ }
166
+ if (allProfiles.length === 1) {
167
+ return {
168
+ success: false,
169
+ modelName: null,
170
+ previousModelName,
171
+ contextOverflow: false,
172
+ usagePercentage: 0
173
+ };
174
+ }
175
+ const nextIndex = (currentIndex + 1) % allProfiles.length;
176
+ const nextModel = allProfiles[nextIndex];
177
+ const wasInactive = !nextModel.isActive;
178
+ if (!nextModel.isActive) {
179
+ nextModel.isActive = true;
180
+ }
181
+ const analysis = this.analyzeContextCompatibility(
182
+ nextModel,
183
+ currentContextTokens
184
+ );
185
+ this.setPointer("main", nextModel.modelName);
186
+ this.updateLastUsed(nextModel.modelName);
187
+ if (wasInactive) {
188
+ this.saveConfig();
189
+ }
190
+ return {
191
+ success: true,
192
+ modelName: nextModel.name,
193
+ previousModelName,
194
+ contextOverflow: !analysis.compatible,
195
+ usagePercentage: analysis.usagePercentage
196
+ };
197
+ }
198
+ /**
199
+ * Simple model switching for UI components (compatible interface)
200
+ * @param currentContextTokens - Current conversation token count for validation
201
+ * @returns Compatible interface for PromptInput component
202
+ */
203
+ switchToNextModel(currentContextTokens = 0) {
204
+ const result = this.switchToNextModelWithContextCheck(currentContextTokens);
205
+ if (!result.success) {
206
+ const allModels2 = this.getAllConfiguredModels();
207
+ if (allModels2.length === 0) {
208
+ return {
209
+ success: false,
210
+ modelName: null,
211
+ blocked: false,
212
+ message: "\u274C No models configured. Use /model to add models."
213
+ };
214
+ } else if (allModels2.length === 1) {
215
+ return {
216
+ success: false,
217
+ modelName: null,
218
+ blocked: false,
219
+ message: `\u26A0\uFE0F Only one model configured (${allModels2[0].modelName}). Use /model to add more models for switching.`
220
+ };
221
+ }
222
+ }
223
+ const currentModel = this.findModelProfile(this.config.modelPointers?.main);
224
+ const allModels = this.getAllConfiguredModels();
225
+ const currentIndex = allModels.findIndex((m) => m.modelName === currentModel?.modelName);
226
+ const totalModels = allModels.length;
227
+ return {
228
+ success: result.success,
229
+ modelName: result.modelName,
230
+ blocked: result.contextOverflow,
231
+ message: result.success ? result.contextOverflow ? `\u26A0\uFE0F Context usage: ${result.usagePercentage.toFixed(1)}% - ${result.modelName}` : `\u2705 Switched to ${result.modelName} (${currentIndex + 1}/${totalModels})${currentModel?.provider ? ` [${currentModel.provider}]` : ""}` : `\u274C Failed to switch models`
232
+ };
233
+ }
234
+ /**
235
+ * Revert to previous model (used when context overflow requires rollback)
236
+ */
237
+ revertToPreviousModel(previousModelName) {
238
+ const previousModel = this.modelProfiles.find(
239
+ (p) => p.name === previousModelName && p.isActive
240
+ );
241
+ if (!previousModel) {
242
+ return false;
243
+ }
244
+ this.setPointer("main", previousModel.modelName);
245
+ this.updateLastUsed(previousModel.modelName);
246
+ return true;
247
+ }
248
+ /**
249
+ * Enhanced context validation with different severity levels
250
+ */
251
+ analyzeContextCompatibility(model, contextTokens) {
252
+ const usableContext = Math.floor(model.contextLength * 0.8);
253
+ const usagePercentage = contextTokens / usableContext * 100;
254
+ if (usagePercentage <= 70) {
255
+ return {
256
+ compatible: true,
257
+ severity: "safe",
258
+ usagePercentage,
259
+ recommendation: "Full context preserved"
260
+ };
261
+ } else if (usagePercentage <= 90) {
262
+ return {
263
+ compatible: true,
264
+ severity: "warning",
265
+ usagePercentage,
266
+ recommendation: "Context usage high, consider compression"
267
+ };
268
+ } else {
269
+ return {
270
+ compatible: false,
271
+ severity: "critical",
272
+ usagePercentage,
273
+ recommendation: "Auto-compression or message truncation required"
274
+ };
275
+ }
276
+ }
277
+ /**
278
+ * Switch to next model with enhanced context analysis
279
+ */
280
+ switchToNextModelWithAnalysis(currentContextTokens = 0) {
281
+ const result = this.switchToNextModel(currentContextTokens);
282
+ if (!result.success || !result.modelName) {
283
+ return {
284
+ modelName: null,
285
+ contextAnalysis: null,
286
+ requiresCompression: false,
287
+ estimatedTokensAfterSwitch: 0
288
+ };
289
+ }
290
+ const newModel = this.getModel("main");
291
+ if (!newModel) {
292
+ return {
293
+ modelName: result.modelName,
294
+ contextAnalysis: null,
295
+ requiresCompression: false,
296
+ estimatedTokensAfterSwitch: currentContextTokens
297
+ };
298
+ }
299
+ const analysis = this.analyzeContextCompatibility(
300
+ newModel,
301
+ currentContextTokens
302
+ );
303
+ return {
304
+ modelName: result.modelName,
305
+ contextAnalysis: analysis,
306
+ requiresCompression: analysis.severity === "critical",
307
+ estimatedTokensAfterSwitch: currentContextTokens
308
+ };
309
+ }
310
+ /**
311
+ * Check if a model can handle the given context size (legacy method)
312
+ */
313
+ canModelHandleContext(model, contextTokens) {
314
+ const analysis = this.analyzeContextCompatibility(model, contextTokens);
315
+ return analysis.compatible;
316
+ }
317
+ /**
318
+ * Find the first model that can handle the given context size
319
+ */
320
+ findModelWithSufficientContext(models, contextTokens) {
321
+ return models.find((model) => this.canModelHandleContext(model, contextTokens)) || null;
322
+ }
323
+ /**
324
+ * Unified model getter for different contexts
325
+ */
326
+ getModelForContext(contextType) {
327
+ switch (contextType) {
328
+ case "terminal":
329
+ return this.getCurrentModel();
330
+ case "main-agent":
331
+ return this.getMainAgentModel();
332
+ case "task-tool":
333
+ return this.getTaskToolModel();
334
+ default:
335
+ return this.getMainAgentModel();
336
+ }
337
+ }
338
+ /**
339
+ * Get all active model profiles
340
+ */
341
+ getActiveModelProfiles() {
342
+ return this.modelProfiles.filter((p) => p.isActive);
343
+ }
344
+ /**
345
+ * Check if any models are configured
346
+ */
347
+ hasConfiguredModels() {
348
+ return this.getActiveModelProfiles().length > 0;
349
+ }
350
+ // New model pointer system methods
351
+ /**
352
+ * Get model by pointer type (main, task, reasoning, quick)
353
+ */
354
+ getModel(pointer) {
355
+ const pointerId = this.config.modelPointers?.[pointer];
356
+ if (!pointerId) {
357
+ return this.getDefaultModel();
358
+ }
359
+ const profile = this.findModelProfile(pointerId);
360
+ return profile && profile.isActive ? profile : this.getDefaultModel();
361
+ }
362
+ /**
363
+ * Get model name by pointer type
364
+ */
365
+ getModelName(pointer) {
366
+ const profile = this.getModel(pointer);
367
+ return profile ? profile.modelName : null;
368
+ }
369
+ /**
370
+ * Get reasoning model (with fallback)
371
+ */
372
+ getReasoningModel() {
373
+ return this.getModelName("reasoning") || this.getModelName("main");
374
+ }
375
+ /**
376
+ * Get quick model (with fallback)
377
+ */
378
+ getQuickModel() {
379
+ return this.getModelName("quick") || this.getModelName("task") || this.getModelName("main");
380
+ }
381
+ /**
382
+ * Add a new model profile with duplicate validation
383
+ */
384
+ async addModel(config) {
385
+ const existingByModelName = this.modelProfiles.find(
386
+ (p) => p.modelName === config.modelName
387
+ );
388
+ if (existingByModelName) {
389
+ throw new Error(
390
+ `Model with modelName '${config.modelName}' already exists: ${existingByModelName.name}`
391
+ );
392
+ }
393
+ const existingByName = this.modelProfiles.find((p) => p.name === config.name);
394
+ if (existingByName) {
395
+ throw new Error(`Model with name '${config.name}' already exists`);
396
+ }
397
+ const newModel = {
398
+ ...config,
399
+ createdAt: Date.now(),
400
+ isActive: true
401
+ };
402
+ this.modelProfiles.push(newModel);
403
+ if (this.modelProfiles.length === 1) {
404
+ this.config.modelPointers = {
405
+ main: config.modelName,
406
+ task: config.modelName,
407
+ reasoning: config.modelName,
408
+ quick: config.modelName
409
+ };
410
+ this.config.defaultModelName = config.modelName;
411
+ }
412
+ this.saveConfig();
413
+ return config.modelName;
414
+ }
415
+ /**
416
+ * Set model pointer assignment
417
+ */
418
+ setPointer(pointer, modelName) {
419
+ if (!this.findModelProfile(modelName)) {
420
+ throw new Error(`Model '${modelName}' not found`);
421
+ }
422
+ if (!this.config.modelPointers) {
423
+ this.config.modelPointers = {
424
+ main: "",
425
+ task: "",
426
+ reasoning: "",
427
+ quick: ""
428
+ };
429
+ }
430
+ this.config.modelPointers[pointer] = modelName;
431
+ this.saveConfig();
432
+ }
433
+ /**
434
+ * Get all active models for pointer assignment
435
+ */
436
+ getAvailableModels() {
437
+ return this.modelProfiles.filter((p) => p.isActive);
438
+ }
439
+ /**
440
+ * Get all configured models (both active and inactive) for switching
441
+ */
442
+ getAllConfiguredModels() {
443
+ return this.modelProfiles;
444
+ }
445
+ /**
446
+ * Get all available model names (modelName field) - active only
447
+ */
448
+ getAllAvailableModelNames() {
449
+ return this.getAvailableModels().map((p) => p.modelName);
450
+ }
451
+ /**
452
+ * Get all configured model names (both active and inactive)
453
+ */
454
+ getAllConfiguredModelNames() {
455
+ return this.getAllConfiguredModels().map((p) => p.modelName);
456
+ }
457
+ /**
458
+ * Debug method to get detailed model switching information
459
+ */
460
+ getModelSwitchingDebugInfo() {
461
+ const availableModels = this.getAvailableModels();
462
+ const currentMainModelName = this.config.modelPointers?.main;
463
+ return {
464
+ totalModels: this.modelProfiles.length,
465
+ activeModels: availableModels.length,
466
+ inactiveModels: this.modelProfiles.length - availableModels.length,
467
+ currentMainModel: currentMainModelName || null,
468
+ availableModels: this.modelProfiles.map((p) => ({
469
+ name: p.name,
470
+ modelName: p.modelName,
471
+ provider: p.provider,
472
+ isActive: p.isActive,
473
+ lastUsed: p.lastUsed
474
+ })),
475
+ modelPointers: this.config.modelPointers || {}
476
+ };
477
+ }
478
+ /**
479
+ * Remove a model profile
480
+ */
481
+ removeModel(modelName) {
482
+ this.modelProfiles = this.modelProfiles.filter(
483
+ (p) => p.modelName !== modelName
484
+ );
485
+ if (this.config.modelPointers) {
486
+ Object.keys(this.config.modelPointers).forEach((pointer) => {
487
+ if (this.config.modelPointers[pointer] === modelName) {
488
+ this.config.modelPointers[pointer] = this.config.defaultModelName || "";
489
+ }
490
+ });
491
+ }
492
+ this.saveConfig();
493
+ }
494
+ /**
495
+ * Get default model profile
496
+ */
497
+ getDefaultModel() {
498
+ if (this.config.defaultModelId) {
499
+ const profile = this.findModelProfile(this.config.defaultModelId);
500
+ if (profile && profile.isActive) {
501
+ return profile;
502
+ }
503
+ }
504
+ return this.modelProfiles.find((p) => p.isActive) || null;
505
+ }
506
+ /**
507
+ * Save configuration changes
508
+ */
509
+ saveConfig() {
510
+ const updatedConfig = {
511
+ ...this.config,
512
+ modelProfiles: this.modelProfiles
513
+ };
514
+ saveGlobalConfig(updatedConfig);
515
+ }
516
+ /**
517
+ * Get a fallback model when no specific model is configured
518
+ */
519
+ async getFallbackModel() {
520
+ const modelConfig = await getModelConfig();
521
+ if (USE_BEDROCK) return modelConfig.bedrock;
522
+ if (USE_VERTEX) return modelConfig.vertex;
523
+ return modelConfig.firstParty;
524
+ }
525
+ /**
526
+ * 统一的模型解析方法:支持指针、model ID 和真实模型名称
527
+ * @param modelParam - 可以是模型指针 ('main', 'task', etc.)、内部model ID 或真实模型名称 ('gpt-4o', 'claude-3-5-sonnet')
528
+ * @returns ModelProfile 或 null
529
+ */
530
+ resolveModel(modelParam) {
531
+ if (["main", "task", "reasoning", "quick"].includes(modelParam)) {
532
+ const pointerId = this.config.modelPointers?.[modelParam];
533
+ if (pointerId) {
534
+ let profile2 = this.findModelProfile(pointerId);
535
+ if (!profile2) {
536
+ profile2 = this.findModelProfileByModelName(pointerId);
537
+ }
538
+ if (profile2 && profile2.isActive) {
539
+ return profile2;
540
+ }
541
+ }
542
+ return this.getDefaultModel();
543
+ }
544
+ let profile = this.findModelProfile(modelParam);
545
+ if (profile && profile.isActive) {
546
+ return profile;
547
+ }
548
+ profile = this.findModelProfileByModelName(modelParam);
549
+ if (profile && profile.isActive) {
550
+ return profile;
551
+ }
552
+ profile = this.findModelProfileByName(modelParam);
553
+ if (profile && profile.isActive) {
554
+ return profile;
555
+ }
556
+ return this.getDefaultModel();
557
+ }
558
+ /**
559
+ * 解析模型参数并返回完整信息
560
+ */
561
+ resolveModelWithInfo(modelParam) {
562
+ const isPointer = ["main", "task", "reasoning", "quick"].includes(
563
+ modelParam
564
+ );
565
+ if (isPointer) {
566
+ const pointerId = this.config.modelPointers?.[modelParam];
567
+ if (!pointerId) {
568
+ return {
569
+ success: false,
570
+ profile: null,
571
+ error: `Model pointer '${modelParam}' is not configured. Use /model to set up models.`
572
+ };
573
+ }
574
+ let profile = this.findModelProfile(pointerId);
575
+ if (!profile) {
576
+ profile = this.findModelProfileByModelName(pointerId);
577
+ }
578
+ if (!profile) {
579
+ return {
580
+ success: false,
581
+ profile: null,
582
+ error: `Model pointer '${modelParam}' points to invalid model '${pointerId}'. Use /model to reconfigure.`
583
+ };
584
+ }
585
+ if (!profile.isActive) {
586
+ return {
587
+ success: false,
588
+ profile: null,
589
+ error: `Model '${profile.name}' (pointed by '${modelParam}') is inactive. Use /model to activate it.`
590
+ };
591
+ }
592
+ return {
593
+ success: true,
594
+ profile
595
+ };
596
+ } else {
597
+ let profile = this.findModelProfile(modelParam);
598
+ if (!profile) {
599
+ profile = this.findModelProfileByModelName(modelParam);
600
+ }
601
+ if (!profile) {
602
+ profile = this.findModelProfileByName(modelParam);
603
+ }
604
+ if (!profile) {
605
+ return {
606
+ success: false,
607
+ profile: null,
608
+ error: `Model '${modelParam}' not found. Use /model to add models.`
609
+ };
610
+ }
611
+ if (!profile.isActive) {
612
+ return {
613
+ success: false,
614
+ profile: null,
615
+ error: `Model '${profile.name}' is inactive. Use /model to activate it.`
616
+ };
617
+ }
618
+ return {
619
+ success: true,
620
+ profile
621
+ };
622
+ }
623
+ }
624
+ // Private helper methods
625
+ findModelProfile(modelName) {
626
+ return this.modelProfiles.find((p) => p.modelName === modelName) || null;
627
+ }
628
+ findModelProfileByModelName(modelName) {
629
+ return this.modelProfiles.find((p) => p.modelName === modelName) || null;
630
+ }
631
+ findModelProfileByName(name) {
632
+ return this.modelProfiles.find((p) => p.name === name) || null;
633
+ }
634
+ updateLastUsed(modelName) {
635
+ const profile = this.findModelProfile(modelName);
636
+ if (profile) {
637
+ profile.lastUsed = Date.now();
638
+ }
639
+ }
640
+ }
641
+ let globalModelManager = null;
642
+ const getModelManager = () => {
643
+ try {
644
+ if (!globalModelManager) {
645
+ const config = getGlobalConfig();
646
+ if (!config) {
647
+ console.warn(
648
+ "No global config available, creating ModelManager with empty config"
649
+ );
650
+ globalModelManager = new ModelManager({
651
+ modelProfiles: [],
652
+ modelPointers: { main: "", task: "", reasoning: "", quick: "" }
653
+ });
654
+ } else {
655
+ globalModelManager = new ModelManager(config);
656
+ }
657
+ }
658
+ return globalModelManager;
659
+ } catch (error) {
660
+ console.error("Error creating ModelManager:", error);
661
+ return new ModelManager({
662
+ modelProfiles: [],
663
+ modelPointers: { main: "", task: "", reasoning: "", quick: "" }
664
+ });
665
+ }
666
+ };
667
+ const reloadModelManager = () => {
668
+ globalModelManager = null;
669
+ getModelManager();
670
+ };
671
+ const getQuickModel = () => {
672
+ const manager = getModelManager();
673
+ const quickModel = manager.getModel("quick");
674
+ return quickModel?.modelName || "quick";
675
+ };
676
+ export {
677
+ ModelManager,
678
+ USE_BEDROCK,
679
+ USE_VERTEX,
680
+ getModelManager,
681
+ getQuickModel,
682
+ getSlowAndCapableModel,
683
+ getVertexRegionForModel,
684
+ isDefaultSlowAndCapableModel,
685
+ reloadModelManager
686
+ };
687
+ //# sourceMappingURL=model.js.map