@shareai-lab/kode 1.1.14 → 1.1.16-dev.2

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 (289) hide show
  1. package/cli.js +77 -82
  2. package/dist/entrypoints/cli.js +59 -38
  3. package/dist/entrypoints/cli.js.map +3 -3
  4. package/dist/index.js +5 -26
  5. package/dist/package.json +4 -1
  6. package/package.json +11 -104
  7. package/dist/test/testAdapters.js +0 -88
  8. package/dist/test/testAdapters.js.map +0 -1
  9. package/src/ProjectOnboarding.tsx +0 -198
  10. package/src/Tool.ts +0 -83
  11. package/src/commands/agents.tsx +0 -3416
  12. package/src/commands/approvedTools.ts +0 -53
  13. package/src/commands/bug.tsx +0 -20
  14. package/src/commands/clear.ts +0 -43
  15. package/src/commands/compact.ts +0 -120
  16. package/src/commands/config.tsx +0 -19
  17. package/src/commands/cost.ts +0 -18
  18. package/src/commands/ctx_viz.ts +0 -209
  19. package/src/commands/doctor.ts +0 -24
  20. package/src/commands/help.tsx +0 -19
  21. package/src/commands/init.ts +0 -37
  22. package/src/commands/listen.ts +0 -42
  23. package/src/commands/login.tsx +0 -51
  24. package/src/commands/logout.tsx +0 -40
  25. package/src/commands/mcp.ts +0 -41
  26. package/src/commands/model.tsx +0 -40
  27. package/src/commands/modelstatus.tsx +0 -20
  28. package/src/commands/onboarding.tsx +0 -34
  29. package/src/commands/pr_comments.ts +0 -59
  30. package/src/commands/refreshCommands.ts +0 -54
  31. package/src/commands/release-notes.ts +0 -34
  32. package/src/commands/resume.tsx +0 -31
  33. package/src/commands/review.ts +0 -49
  34. package/src/commands/terminalSetup.ts +0 -221
  35. package/src/commands.ts +0 -139
  36. package/src/components/ApproveApiKey.tsx +0 -93
  37. package/src/components/AsciiLogo.tsx +0 -13
  38. package/src/components/AutoUpdater.tsx +0 -148
  39. package/src/components/Bug.tsx +0 -367
  40. package/src/components/Config.tsx +0 -293
  41. package/src/components/ConsoleOAuthFlow.tsx +0 -327
  42. package/src/components/Cost.tsx +0 -23
  43. package/src/components/CostThresholdDialog.tsx +0 -46
  44. package/src/components/CustomSelect/option-map.ts +0 -42
  45. package/src/components/CustomSelect/select-option.tsx +0 -78
  46. package/src/components/CustomSelect/select.tsx +0 -152
  47. package/src/components/CustomSelect/theme.ts +0 -45
  48. package/src/components/CustomSelect/use-select-state.ts +0 -414
  49. package/src/components/CustomSelect/use-select.ts +0 -35
  50. package/src/components/FallbackToolUseRejectedMessage.tsx +0 -15
  51. package/src/components/FileEditToolUpdatedMessage.tsx +0 -66
  52. package/src/components/Help.tsx +0 -215
  53. package/src/components/HighlightedCode.tsx +0 -33
  54. package/src/components/InvalidConfigDialog.tsx +0 -113
  55. package/src/components/Link.tsx +0 -32
  56. package/src/components/LogSelector.tsx +0 -86
  57. package/src/components/Logo.tsx +0 -170
  58. package/src/components/MCPServerApprovalDialog.tsx +0 -100
  59. package/src/components/MCPServerDialogCopy.tsx +0 -25
  60. package/src/components/MCPServerMultiselectDialog.tsx +0 -109
  61. package/src/components/Message.tsx +0 -221
  62. package/src/components/MessageResponse.tsx +0 -15
  63. package/src/components/MessageSelector.tsx +0 -211
  64. package/src/components/ModeIndicator.tsx +0 -88
  65. package/src/components/ModelConfig.tsx +0 -301
  66. package/src/components/ModelListManager.tsx +0 -227
  67. package/src/components/ModelSelector.tsx +0 -3387
  68. package/src/components/ModelStatusDisplay.tsx +0 -230
  69. package/src/components/Onboarding.tsx +0 -274
  70. package/src/components/PressEnterToContinue.tsx +0 -11
  71. package/src/components/PromptInput.tsx +0 -760
  72. package/src/components/SentryErrorBoundary.ts +0 -39
  73. package/src/components/Spinner.tsx +0 -129
  74. package/src/components/StickerRequestForm.tsx +0 -16
  75. package/src/components/StructuredDiff.tsx +0 -191
  76. package/src/components/TextInput.tsx +0 -259
  77. package/src/components/TodoItem.tsx +0 -47
  78. package/src/components/TokenWarning.tsx +0 -31
  79. package/src/components/ToolUseLoader.tsx +0 -40
  80. package/src/components/TrustDialog.tsx +0 -106
  81. package/src/components/binary-feedback/BinaryFeedback.tsx +0 -63
  82. package/src/components/binary-feedback/BinaryFeedbackOption.tsx +0 -111
  83. package/src/components/binary-feedback/BinaryFeedbackView.tsx +0 -172
  84. package/src/components/binary-feedback/utils.ts +0 -220
  85. package/src/components/messages/AssistantBashOutputMessage.tsx +0 -22
  86. package/src/components/messages/AssistantLocalCommandOutputMessage.tsx +0 -49
  87. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +0 -19
  88. package/src/components/messages/AssistantTextMessage.tsx +0 -144
  89. package/src/components/messages/AssistantThinkingMessage.tsx +0 -40
  90. package/src/components/messages/AssistantToolUseMessage.tsx +0 -132
  91. package/src/components/messages/TaskProgressMessage.tsx +0 -32
  92. package/src/components/messages/TaskToolMessage.tsx +0 -58
  93. package/src/components/messages/UserBashInputMessage.tsx +0 -28
  94. package/src/components/messages/UserCommandMessage.tsx +0 -30
  95. package/src/components/messages/UserKodingInputMessage.tsx +0 -28
  96. package/src/components/messages/UserPromptMessage.tsx +0 -35
  97. package/src/components/messages/UserTextMessage.tsx +0 -39
  98. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +0 -12
  99. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +0 -36
  100. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +0 -31
  101. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +0 -57
  102. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +0 -35
  103. package/src/components/messages/UserToolResultMessage/utils.tsx +0 -56
  104. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +0 -121
  105. package/src/components/permissions/FallbackPermissionRequest.tsx +0 -153
  106. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +0 -182
  107. package/src/components/permissions/FileEditPermissionRequest/FileEditToolDiff.tsx +0 -77
  108. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +0 -164
  109. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +0 -83
  110. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +0 -240
  111. package/src/components/permissions/PermissionRequest.tsx +0 -101
  112. package/src/components/permissions/PermissionRequestTitle.tsx +0 -69
  113. package/src/components/permissions/hooks.ts +0 -44
  114. package/src/components/permissions/toolUseOptions.ts +0 -59
  115. package/src/components/permissions/utils.ts +0 -23
  116. package/src/constants/betas.ts +0 -5
  117. package/src/constants/claude-asterisk-ascii-art.tsx +0 -238
  118. package/src/constants/figures.ts +0 -4
  119. package/src/constants/keys.ts +0 -3
  120. package/src/constants/macros.ts +0 -11
  121. package/src/constants/modelCapabilities.ts +0 -179
  122. package/src/constants/models.ts +0 -1025
  123. package/src/constants/oauth.ts +0 -18
  124. package/src/constants/product.ts +0 -17
  125. package/src/constants/prompts.ts +0 -168
  126. package/src/constants/releaseNotes.ts +0 -7
  127. package/src/context/PermissionContext.tsx +0 -149
  128. package/src/context.ts +0 -278
  129. package/src/cost-tracker.ts +0 -84
  130. package/src/entrypoints/cli.tsx +0 -1561
  131. package/src/entrypoints/mcp.ts +0 -175
  132. package/src/history.ts +0 -25
  133. package/src/hooks/useApiKeyVerification.ts +0 -59
  134. package/src/hooks/useArrowKeyHistory.ts +0 -55
  135. package/src/hooks/useCanUseTool.ts +0 -138
  136. package/src/hooks/useCancelRequest.ts +0 -39
  137. package/src/hooks/useDoublePress.ts +0 -41
  138. package/src/hooks/useExitOnCtrlCD.ts +0 -31
  139. package/src/hooks/useInterval.ts +0 -25
  140. package/src/hooks/useLogMessages.ts +0 -16
  141. package/src/hooks/useLogStartupTime.ts +0 -12
  142. package/src/hooks/useNotifyAfterTimeout.ts +0 -65
  143. package/src/hooks/usePermissionRequestLogging.ts +0 -44
  144. package/src/hooks/useTerminalSize.ts +0 -49
  145. package/src/hooks/useTextInput.ts +0 -317
  146. package/src/hooks/useUnifiedCompletion.ts +0 -1405
  147. package/src/index.ts +0 -34
  148. package/src/messages.ts +0 -38
  149. package/src/permissions.ts +0 -268
  150. package/src/query.ts +0 -720
  151. package/src/screens/ConfigureNpmPrefix.tsx +0 -197
  152. package/src/screens/Doctor.tsx +0 -219
  153. package/src/screens/LogList.tsx +0 -68
  154. package/src/screens/REPL.tsx +0 -813
  155. package/src/screens/ResumeConversation.tsx +0 -68
  156. package/src/services/adapters/base.ts +0 -38
  157. package/src/services/adapters/chatCompletions.ts +0 -90
  158. package/src/services/adapters/responsesAPI.ts +0 -170
  159. package/src/services/browserMocks.ts +0 -66
  160. package/src/services/claude.ts +0 -2197
  161. package/src/services/customCommands.ts +0 -704
  162. package/src/services/fileFreshness.ts +0 -377
  163. package/src/services/gpt5ConnectionTest.ts +0 -340
  164. package/src/services/mcpClient.ts +0 -564
  165. package/src/services/mcpServerApproval.tsx +0 -50
  166. package/src/services/mentionProcessor.ts +0 -273
  167. package/src/services/modelAdapterFactory.ts +0 -69
  168. package/src/services/notifier.ts +0 -40
  169. package/src/services/oauth.ts +0 -357
  170. package/src/services/openai.ts +0 -1359
  171. package/src/services/responseStateManager.ts +0 -90
  172. package/src/services/sentry.ts +0 -3
  173. package/src/services/statsig.ts +0 -172
  174. package/src/services/statsigStorage.ts +0 -86
  175. package/src/services/systemReminder.ts +0 -507
  176. package/src/services/vcr.ts +0 -161
  177. package/src/test/testAdapters.ts +0 -96
  178. package/src/tools/ArchitectTool/ArchitectTool.tsx +0 -135
  179. package/src/tools/ArchitectTool/prompt.ts +0 -15
  180. package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +0 -576
  181. package/src/tools/BashTool/BashTool.tsx +0 -243
  182. package/src/tools/BashTool/BashToolResultMessage.tsx +0 -38
  183. package/src/tools/BashTool/OutputLine.tsx +0 -49
  184. package/src/tools/BashTool/prompt.ts +0 -174
  185. package/src/tools/BashTool/utils.ts +0 -56
  186. package/src/tools/FileEditTool/FileEditTool.tsx +0 -319
  187. package/src/tools/FileEditTool/prompt.ts +0 -51
  188. package/src/tools/FileEditTool/utils.ts +0 -58
  189. package/src/tools/FileReadTool/FileReadTool.tsx +0 -404
  190. package/src/tools/FileReadTool/prompt.ts +0 -7
  191. package/src/tools/FileWriteTool/FileWriteTool.tsx +0 -301
  192. package/src/tools/FileWriteTool/prompt.ts +0 -10
  193. package/src/tools/GlobTool/GlobTool.tsx +0 -119
  194. package/src/tools/GlobTool/prompt.ts +0 -8
  195. package/src/tools/GrepTool/GrepTool.tsx +0 -147
  196. package/src/tools/GrepTool/prompt.ts +0 -11
  197. package/src/tools/MCPTool/MCPTool.tsx +0 -107
  198. package/src/tools/MCPTool/prompt.ts +0 -3
  199. package/src/tools/MemoryReadTool/MemoryReadTool.tsx +0 -127
  200. package/src/tools/MemoryReadTool/prompt.ts +0 -3
  201. package/src/tools/MemoryWriteTool/MemoryWriteTool.tsx +0 -89
  202. package/src/tools/MemoryWriteTool/prompt.ts +0 -3
  203. package/src/tools/MultiEditTool/MultiEditTool.tsx +0 -388
  204. package/src/tools/MultiEditTool/prompt.ts +0 -45
  205. package/src/tools/NotebookEditTool/NotebookEditTool.tsx +0 -298
  206. package/src/tools/NotebookEditTool/prompt.ts +0 -3
  207. package/src/tools/NotebookReadTool/NotebookReadTool.tsx +0 -258
  208. package/src/tools/NotebookReadTool/prompt.ts +0 -3
  209. package/src/tools/StickerRequestTool/StickerRequestTool.tsx +0 -107
  210. package/src/tools/StickerRequestTool/prompt.ts +0 -19
  211. package/src/tools/TaskTool/TaskTool.tsx +0 -438
  212. package/src/tools/TaskTool/constants.ts +0 -1
  213. package/src/tools/TaskTool/prompt.ts +0 -92
  214. package/src/tools/ThinkTool/ThinkTool.tsx +0 -54
  215. package/src/tools/ThinkTool/prompt.ts +0 -12
  216. package/src/tools/TodoWriteTool/TodoWriteTool.tsx +0 -313
  217. package/src/tools/TodoWriteTool/prompt.ts +0 -63
  218. package/src/tools/URLFetcherTool/URLFetcherTool.tsx +0 -178
  219. package/src/tools/URLFetcherTool/cache.ts +0 -55
  220. package/src/tools/URLFetcherTool/htmlToMarkdown.ts +0 -55
  221. package/src/tools/URLFetcherTool/prompt.ts +0 -17
  222. package/src/tools/WebSearchTool/WebSearchTool.tsx +0 -103
  223. package/src/tools/WebSearchTool/prompt.ts +0 -13
  224. package/src/tools/WebSearchTool/searchProviders.ts +0 -66
  225. package/src/tools/lsTool/lsTool.tsx +0 -272
  226. package/src/tools/lsTool/prompt.ts +0 -2
  227. package/src/tools.ts +0 -67
  228. package/src/types/PermissionMode.ts +0 -120
  229. package/src/types/RequestContext.ts +0 -72
  230. package/src/types/common.d.ts +0 -2
  231. package/src/types/conversation.ts +0 -51
  232. package/src/types/logs.ts +0 -58
  233. package/src/types/modelCapabilities.ts +0 -64
  234. package/src/types/notebook.ts +0 -87
  235. package/src/utils/Cursor.ts +0 -436
  236. package/src/utils/PersistentShell.ts +0 -552
  237. package/src/utils/advancedFuzzyMatcher.ts +0 -290
  238. package/src/utils/agentLoader.ts +0 -278
  239. package/src/utils/agentStorage.ts +0 -97
  240. package/src/utils/array.ts +0 -3
  241. package/src/utils/ask.tsx +0 -99
  242. package/src/utils/auth.ts +0 -13
  243. package/src/utils/autoCompactCore.ts +0 -223
  244. package/src/utils/autoUpdater.ts +0 -458
  245. package/src/utils/betas.ts +0 -20
  246. package/src/utils/browser.ts +0 -14
  247. package/src/utils/cleanup.ts +0 -72
  248. package/src/utils/commands.ts +0 -261
  249. package/src/utils/commonUnixCommands.ts +0 -161
  250. package/src/utils/config.ts +0 -945
  251. package/src/utils/conversationRecovery.ts +0 -55
  252. package/src/utils/debugLogger.ts +0 -1235
  253. package/src/utils/diff.ts +0 -42
  254. package/src/utils/env.ts +0 -57
  255. package/src/utils/errors.ts +0 -21
  256. package/src/utils/exampleCommands.ts +0 -109
  257. package/src/utils/execFileNoThrow.ts +0 -51
  258. package/src/utils/expertChatStorage.ts +0 -136
  259. package/src/utils/file.ts +0 -405
  260. package/src/utils/fileRecoveryCore.ts +0 -71
  261. package/src/utils/format.tsx +0 -44
  262. package/src/utils/fuzzyMatcher.ts +0 -328
  263. package/src/utils/generators.ts +0 -62
  264. package/src/utils/git.ts +0 -92
  265. package/src/utils/globalLogger.ts +0 -77
  266. package/src/utils/http.ts +0 -10
  267. package/src/utils/imagePaste.ts +0 -38
  268. package/src/utils/json.ts +0 -13
  269. package/src/utils/log.ts +0 -382
  270. package/src/utils/markdown.ts +0 -213
  271. package/src/utils/messageContextManager.ts +0 -294
  272. package/src/utils/messages.tsx +0 -945
  273. package/src/utils/model.ts +0 -914
  274. package/src/utils/permissions/filesystem.ts +0 -127
  275. package/src/utils/responseState.ts +0 -23
  276. package/src/utils/ripgrep.ts +0 -167
  277. package/src/utils/secureFile.ts +0 -564
  278. package/src/utils/sessionState.ts +0 -49
  279. package/src/utils/state.ts +0 -25
  280. package/src/utils/style.ts +0 -29
  281. package/src/utils/terminal.ts +0 -50
  282. package/src/utils/theme.ts +0 -127
  283. package/src/utils/thinking.ts +0 -144
  284. package/src/utils/todoStorage.ts +0 -431
  285. package/src/utils/tokens.ts +0 -43
  286. package/src/utils/toolExecutionController.ts +0 -163
  287. package/src/utils/unaryLogging.ts +0 -26
  288. package/src/utils/user.ts +0 -37
  289. package/src/utils/validate.ts +0 -165
@@ -1,100 +0,0 @@
1
- import React from 'react'
2
- import { Box, Text, useInput } from 'ink'
3
- import { getTheme } from '../utils/theme'
4
- import { Select } from './CustomSelect/select'
5
- import {
6
- saveCurrentProjectConfig,
7
- getCurrentProjectConfig,
8
- } from '../utils/config.js'
9
- import { MCPServerDialogCopy } from './MCPServerDialogCopy'
10
- import { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'
11
-
12
- type Props = {
13
- serverName: string
14
- onDone(): void
15
- }
16
-
17
- export function MCPServerApprovalDialog({
18
- serverName,
19
- onDone,
20
- }: Props): React.ReactNode {
21
- const theme = getTheme()
22
- function onChange(value: 'yes' | 'no') {
23
- const config = getCurrentProjectConfig()
24
- switch (value) {
25
- case 'yes': {
26
- if (!config.approvedMcprcServers) {
27
- config.approvedMcprcServers = []
28
- }
29
- if (!config.approvedMcprcServers.includes(serverName)) {
30
- config.approvedMcprcServers.push(serverName)
31
- }
32
- saveCurrentProjectConfig(config)
33
- onDone()
34
- break
35
- }
36
- case 'no': {
37
- if (!config.rejectedMcprcServers) {
38
- config.rejectedMcprcServers = []
39
- }
40
- if (!config.rejectedMcprcServers.includes(serverName)) {
41
- config.rejectedMcprcServers.push(serverName)
42
- }
43
- saveCurrentProjectConfig(config)
44
- onDone()
45
- break
46
- }
47
- }
48
- }
49
-
50
- const exitState = useExitOnCtrlCD(() => process.exit(0))
51
-
52
- useInput((_input, key) => {
53
- if (key.escape) {
54
- onDone()
55
- return
56
- }
57
- })
58
-
59
- return (
60
- <>
61
- <Box
62
- flexDirection="column"
63
- gap={1}
64
- padding={1}
65
- borderStyle="round"
66
- borderColor={theme.warning}
67
- >
68
- <Text bold color={theme.warning}>
69
- New MCP Server Detected
70
- </Text>
71
- <Text>
72
- This project contains a .mcprc file with an MCP server that requires
73
- your approval:
74
- </Text>
75
- <Text bold>{serverName}</Text>
76
-
77
- <MCPServerDialogCopy />
78
-
79
- <Text>Do you want to approve this MCP server?</Text>
80
-
81
- <Select
82
- options={[
83
- { label: 'Yes, approve this server', value: 'yes' },
84
- { label: 'No, reject this server', value: 'no' },
85
- ]}
86
- onChange={value => onChange(value as 'yes' | 'no')}
87
- />
88
- </Box>
89
- <Box marginLeft={3}>
90
- <Text dimColor>
91
- {exitState.pending ? (
92
- <>Press {exitState.keyName} again to exit</>
93
- ) : (
94
- <>Enter to confirm · Esc to reject</>
95
- )}
96
- </Text>
97
- </Box>
98
- </>
99
- )
100
- }
@@ -1,25 +0,0 @@
1
- import React from 'react'
2
- import { Text } from 'ink'
3
- import Link from 'ink-link'
4
- import { PRODUCT_NAME, PRODUCT_COMMAND } from '../constants/product'
5
-
6
- export function MCPServerDialogCopy(): React.ReactNode {
7
- return (
8
- <>
9
- <Text>
10
- MCP servers provide additional functionality to {PRODUCT_NAME}. They may
11
- execute code, make network requests, or access system resources via tool
12
- calls. All tool calls will require your explicit approval before
13
- execution. For more information, see{' '}
14
- <Link url="https://docs.anthropic.com/s/claude-code-mcp">
15
- MCP documentation
16
- </Link>
17
- </Text>
18
-
19
- <Text dimColor>
20
- Remember: You can always change these choices later by running `
21
- {PRODUCT_COMMAND} mcp reset-mcprc-choices`
22
- </Text>
23
- </>
24
- )
25
- }
@@ -1,109 +0,0 @@
1
- import React from 'react'
2
- import { Box, Text, useInput } from 'ink'
3
- import { getTheme } from '../utils/theme'
4
- import { MultiSelect } from '@inkjs/ui'
5
- import {
6
- saveCurrentProjectConfig,
7
- getCurrentProjectConfig,
8
- } from '../utils/config.js'
9
- import { partition } from 'lodash-es'
10
- import { MCPServerDialogCopy } from './MCPServerDialogCopy'
11
- import { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'
12
-
13
- type Props = {
14
- serverNames: string[]
15
- onDone(): void
16
- }
17
-
18
- export function MCPServerMultiselectDialog({
19
- serverNames,
20
- onDone,
21
- }: Props): React.ReactNode {
22
- const theme = getTheme()
23
- function onSubmit(selectedServers: string[]) {
24
- const config = getCurrentProjectConfig()
25
-
26
- // Initialize arrays if they don't exist
27
- if (!config.approvedMcprcServers) {
28
- config.approvedMcprcServers = []
29
- }
30
- if (!config.rejectedMcprcServers) {
31
- config.rejectedMcprcServers = []
32
- }
33
-
34
- // Use partition to separate approved and rejected servers
35
- const [approvedServers, rejectedServers] = partition(serverNames, server =>
36
- selectedServers.includes(server),
37
- )
38
-
39
- // Add new servers directly to the respective lists
40
- config.approvedMcprcServers.push(...approvedServers)
41
- config.rejectedMcprcServers.push(...rejectedServers)
42
-
43
- saveCurrentProjectConfig(config)
44
- onDone()
45
- }
46
-
47
- const exitState = useExitOnCtrlCD(() => process.exit())
48
-
49
- useInput((_input, key) => {
50
- if (key.escape) {
51
- // On escape, treat all servers as rejected
52
- const config = getCurrentProjectConfig()
53
- if (!config.rejectedMcprcServers) {
54
- config.rejectedMcprcServers = []
55
- }
56
-
57
- for (const server of serverNames) {
58
- if (!config.rejectedMcprcServers.includes(server)) {
59
- config.rejectedMcprcServers.push(server)
60
- }
61
- }
62
-
63
- saveCurrentProjectConfig(config)
64
- onDone()
65
- return
66
- }
67
- })
68
-
69
- return (
70
- <>
71
- <Box
72
- flexDirection="column"
73
- gap={1}
74
- padding={1}
75
- borderStyle="round"
76
- borderColor={theme.warning}
77
- >
78
- <Text bold color={theme.warning}>
79
- New MCP Servers Detected
80
- </Text>
81
- <Text>
82
- This project contains a .mcprc file with {serverNames.length} MCP
83
- servers that require your approval.
84
- </Text>
85
- <MCPServerDialogCopy />
86
-
87
- <Text>Please select the servers you want to enable:</Text>
88
-
89
- <MultiSelect
90
- options={serverNames.map(server => ({
91
- label: server,
92
- value: server,
93
- }))}
94
- defaultValue={serverNames}
95
- onSubmit={onSubmit}
96
- />
97
- </Box>
98
- <Box marginLeft={3}>
99
- <Text dimColor>
100
- {exitState.pending ? (
101
- <>Press {exitState.keyName} again to exit</>
102
- ) : (
103
- <>Space to select · Enter to confirm · Esc to reject all</>
104
- )}
105
- </Text>
106
- </Box>
107
- </>
108
- )
109
- }
@@ -1,221 +0,0 @@
1
- import { Box } from 'ink'
2
- import * as React from 'react'
3
- import type { AssistantMessage, Message, UserMessage } from '../query'
4
- import type {
5
- ContentBlock,
6
- DocumentBlockParam,
7
- ImageBlockParam,
8
- TextBlockParam,
9
- ThinkingBlockParam,
10
- ToolResultBlockParam,
11
- ToolUseBlockParam,
12
- } from '@anthropic-ai/sdk/resources/index.mjs'
13
- import { Tool } from '../Tool'
14
- import { logError } from '../utils/log'
15
- import { UserToolResultMessage } from './messages/UserToolResultMessage/UserToolResultMessage'
16
- import { AssistantToolUseMessage } from './messages/AssistantToolUseMessage'
17
- import { AssistantTextMessage } from './messages/AssistantTextMessage'
18
- import { UserTextMessage } from './messages/UserTextMessage'
19
- import { NormalizedMessage } from '../utils/messages'
20
- import { AssistantThinkingMessage } from './messages/AssistantThinkingMessage'
21
- import { AssistantRedactedThinkingMessage } from './messages/AssistantRedactedThinkingMessage'
22
- import { useTerminalSize } from '../hooks/useTerminalSize'
23
-
24
- type Props = {
25
- message: UserMessage | AssistantMessage
26
- messages: NormalizedMessage[]
27
- // TODO: Find a way to remove this, and leave spacing to the consumer
28
- addMargin: boolean
29
- tools: Tool[]
30
- verbose: boolean
31
- debug: boolean
32
- erroredToolUseIDs: Set<string>
33
- inProgressToolUseIDs: Set<string>
34
- unresolvedToolUseIDs: Set<string>
35
- shouldAnimate: boolean
36
- shouldShowDot: boolean
37
- width?: number | string
38
- }
39
-
40
- export function Message({
41
- message,
42
- messages,
43
- addMargin,
44
- tools,
45
- verbose,
46
- debug,
47
- erroredToolUseIDs,
48
- inProgressToolUseIDs,
49
- unresolvedToolUseIDs,
50
- shouldAnimate,
51
- shouldShowDot,
52
- width,
53
- }: Props): React.ReactNode {
54
- // Assistant message
55
- if (message.type === 'assistant') {
56
- return (
57
- <Box flexDirection="column" width="100%">
58
- {message.message.content.map((_, index) => (
59
- <AssistantMessage
60
- key={index}
61
- param={_}
62
- costUSD={message.costUSD}
63
- durationMs={message.durationMs}
64
- addMargin={addMargin}
65
- tools={tools}
66
- debug={debug}
67
- options={{ verbose }}
68
- erroredToolUseIDs={erroredToolUseIDs}
69
- inProgressToolUseIDs={inProgressToolUseIDs}
70
- unresolvedToolUseIDs={unresolvedToolUseIDs}
71
- shouldAnimate={shouldAnimate}
72
- shouldShowDot={shouldShowDot}
73
- width={width}
74
- />
75
- ))}
76
- </Box>
77
- )
78
- }
79
-
80
- // User message
81
- // TODO: normalize upstream
82
- const content =
83
- typeof message.message.content === 'string'
84
- ? [{ type: 'text', text: message.message.content } as TextBlockParam]
85
- : message.message.content
86
- return (
87
- <Box flexDirection="column" width="100%">
88
- {content.map((_, index) => (
89
- <UserMessage
90
- key={index}
91
- message={message}
92
- messages={messages}
93
- addMargin={addMargin}
94
- tools={tools}
95
- param={_ as TextBlockParam}
96
- options={{ verbose }}
97
- />
98
- ))}
99
- </Box>
100
- )
101
- }
102
-
103
- function UserMessage({
104
- message,
105
- messages,
106
- addMargin,
107
- tools,
108
- param,
109
- options: { verbose },
110
- }: {
111
- message: UserMessage
112
- messages: Message[]
113
- addMargin: boolean
114
- tools: Tool[]
115
- param:
116
- | TextBlockParam
117
- | DocumentBlockParam
118
- | ImageBlockParam
119
- | ToolUseBlockParam
120
- | ToolResultBlockParam
121
- options: {
122
- verbose: boolean
123
- }
124
- key?: React.Key
125
- }): React.ReactNode {
126
- const { columns } = useTerminalSize()
127
- switch (param.type) {
128
- case 'text':
129
- return <UserTextMessage addMargin={addMargin} param={param} />
130
- case 'tool_result':
131
- return (
132
- <UserToolResultMessage
133
- param={param}
134
- message={message}
135
- messages={messages}
136
- tools={tools}
137
- verbose={verbose}
138
- width={columns - 5}
139
- />
140
- )
141
- }
142
- }
143
-
144
- function AssistantMessage({
145
- param,
146
- costUSD,
147
- durationMs,
148
- addMargin,
149
- tools,
150
- debug,
151
- options: { verbose },
152
- erroredToolUseIDs,
153
- inProgressToolUseIDs,
154
- unresolvedToolUseIDs,
155
- shouldAnimate,
156
- shouldShowDot,
157
- width,
158
- }: {
159
- param:
160
- | ContentBlock
161
- | TextBlockParam
162
- | ImageBlockParam
163
- | ThinkingBlockParam
164
- | ToolUseBlockParam
165
- | ToolResultBlockParam
166
- costUSD: number
167
- durationMs: number
168
- addMargin: boolean
169
- tools: Tool[]
170
- debug: boolean
171
- options: {
172
- verbose: boolean
173
- }
174
- erroredToolUseIDs: Set<string>
175
- inProgressToolUseIDs: Set<string>
176
- unresolvedToolUseIDs: Set<string>
177
- shouldAnimate: boolean
178
- shouldShowDot: boolean
179
- width?: number | string
180
- key?: React.Key
181
- }): React.ReactNode {
182
- switch (param.type) {
183
- case 'tool_use':
184
- return (
185
- <AssistantToolUseMessage
186
- param={param}
187
- costUSD={costUSD}
188
- durationMs={durationMs}
189
- addMargin={addMargin}
190
- tools={tools}
191
- debug={debug}
192
- verbose={verbose}
193
- erroredToolUseIDs={erroredToolUseIDs}
194
- inProgressToolUseIDs={inProgressToolUseIDs}
195
- unresolvedToolUseIDs={unresolvedToolUseIDs}
196
- shouldAnimate={shouldAnimate}
197
- shouldShowDot={shouldShowDot}
198
- />
199
- )
200
- case 'text':
201
- return (
202
- <AssistantTextMessage
203
- param={param}
204
- costUSD={costUSD}
205
- durationMs={durationMs}
206
- debug={debug}
207
- addMargin={addMargin}
208
- shouldShowDot={shouldShowDot}
209
- verbose={verbose}
210
- width={width}
211
- />
212
- )
213
- case 'redacted_thinking':
214
- return <AssistantRedactedThinkingMessage addMargin={addMargin} />
215
- case 'thinking':
216
- return <AssistantThinkingMessage addMargin={addMargin} param={param} />
217
- default:
218
- logError(`Unable to render message type: ${param.type}`)
219
- return null
220
- }
221
- }
@@ -1,15 +0,0 @@
1
- import { Box, Text } from 'ink'
2
- import * as React from 'react'
3
-
4
- type Props = {
5
- children: React.ReactNode
6
- }
7
-
8
- export function MessageResponse({ children }: Props): React.ReactNode {
9
- return (
10
- <Box flexDirection="row" height={1} overflow="hidden">
11
- <Text>{' '}⎿ &nbsp;</Text>
12
- {children}
13
- </Box>
14
- )
15
- }
@@ -1,211 +0,0 @@
1
- import { Box, Text, useInput } from 'ink'
2
- import * as React from 'react'
3
- import { useMemo, useState, useEffect } from 'react'
4
- import figures from 'figures'
5
- import { getTheme } from '../utils/theme'
6
- import { Message as MessageComponent } from './Message'
7
- import { randomUUID } from 'crypto'
8
- import { type Tool } from '../Tool'
9
- import {
10
- createUserMessage,
11
- isEmptyMessageText,
12
- isNotEmptyMessage,
13
- normalizeMessages,
14
- } from '../utils/messages.js'
15
- import { logEvent } from '../services/statsig'
16
- import type { AssistantMessage, UserMessage } from '../query'
17
- import { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'
18
-
19
- type Props = {
20
- erroredToolUseIDs: Set<string>
21
- messages: (UserMessage | AssistantMessage)[]
22
- onSelect: (message: UserMessage) => void
23
- onEscape: () => void
24
- tools: Tool[]
25
- unresolvedToolUseIDs: Set<string>
26
- }
27
-
28
- const MAX_VISIBLE_MESSAGES = 7
29
-
30
- export function MessageSelector({
31
- erroredToolUseIDs,
32
- messages,
33
- onSelect,
34
- onEscape,
35
- tools,
36
- unresolvedToolUseIDs,
37
- }: Props): React.ReactNode {
38
- const currentUUID = useMemo(randomUUID, [])
39
-
40
- // Log when selector is opened
41
- useEffect(() => {
42
- logEvent('tengu_message_selector_opened', {})
43
- }, [])
44
-
45
- function handleSelect(message: UserMessage) {
46
- const indexFromEnd = messages.length - 1 - messages.indexOf(message)
47
- logEvent('tengu_message_selector_selected', {
48
- index_from_end: indexFromEnd.toString(),
49
- message_type: message.type,
50
- is_current_prompt: (message.uuid === currentUUID).toString(),
51
- })
52
- onSelect(message)
53
- }
54
-
55
- function handleEscape() {
56
- logEvent('tengu_message_selector_cancelled', {})
57
- onEscape()
58
- }
59
-
60
- // Add current prompt as a virtual message
61
- const allItems = useMemo(
62
- () => [
63
- // Filter out tool results
64
- ...messages
65
- .filter(
66
- _ =>
67
- !(
68
- _.type === 'user' &&
69
- Array.isArray(_.message.content) &&
70
- _.message.content[0]?.type === 'tool_result'
71
- ),
72
- )
73
- // Filter out assistant messages, until we have a way to kick off the tool use loop from REPL
74
- .filter(_ => _.type !== 'assistant'),
75
- { ...createUserMessage(''), uuid: currentUUID } as UserMessage,
76
- ],
77
- [messages, currentUUID],
78
- )
79
- const [selectedIndex, setSelectedIndex] = useState(allItems.length - 1)
80
-
81
- const exitState = useExitOnCtrlCD(() => process.exit(0))
82
-
83
- useInput((input, key) => {
84
- if (key.tab || key.escape) {
85
- handleEscape()
86
- return
87
- }
88
- if (key.return) {
89
- handleSelect(allItems[selectedIndex]!)
90
- return
91
- }
92
- if (key.upArrow) {
93
- if (key.ctrl || key.shift || key.meta) {
94
- // Jump to top with any modifier key
95
- setSelectedIndex(0)
96
- } else {
97
- setSelectedIndex(prev => Math.max(0, prev - 1))
98
- }
99
- }
100
- if (key.downArrow) {
101
- if (key.ctrl || key.shift || key.meta) {
102
- // Jump to bottom with any modifier key
103
- setSelectedIndex(allItems.length - 1)
104
- } else {
105
- setSelectedIndex(prev => Math.min(allItems.length - 1, prev + 1))
106
- }
107
- }
108
-
109
- // Handle number keys (1-9)
110
- const num = Number(input)
111
- if (!isNaN(num) && num >= 1 && num <= Math.min(9, allItems.length)) {
112
- if (!allItems[num - 1]) {
113
- return
114
- }
115
- handleSelect(allItems[num - 1]!)
116
- }
117
- })
118
-
119
- const firstVisibleIndex = Math.max(
120
- 0,
121
- Math.min(
122
- selectedIndex - Math.floor(MAX_VISIBLE_MESSAGES / 2),
123
- allItems.length - MAX_VISIBLE_MESSAGES,
124
- ),
125
- )
126
-
127
- const normalizedMessages = useMemo(
128
- () => normalizeMessages(messages).filter(isNotEmptyMessage),
129
- [messages],
130
- )
131
-
132
- return (
133
- <>
134
- <Box
135
- flexDirection="column"
136
- borderStyle="round"
137
- borderColor={getTheme().secondaryBorder}
138
- height={4 + Math.min(MAX_VISIBLE_MESSAGES, allItems.length) * 2}
139
- paddingX={1}
140
- marginTop={1}
141
- >
142
- <Box flexDirection="column" minHeight={2} marginBottom={1}>
143
- <Text bold>Jump to a previous message</Text>
144
- <Text dimColor>This will fork the conversation</Text>
145
- </Box>
146
- {allItems
147
- .slice(firstVisibleIndex, firstVisibleIndex + MAX_VISIBLE_MESSAGES)
148
- .map((msg, index) => {
149
- const actualIndex = firstVisibleIndex + index
150
- const isSelected = actualIndex === selectedIndex
151
- const isCurrent = msg.uuid === currentUUID
152
-
153
- return (
154
- <Box key={msg.uuid} flexDirection="row" height={2} minHeight={2}>
155
- <Box width={7}>
156
- {isSelected ? (
157
- <Text color="blue" bold>
158
- {figures.pointer} {firstVisibleIndex + index + 1}{' '}
159
- </Text>
160
- ) : (
161
- <Text>
162
- {' '}
163
- {firstVisibleIndex + index + 1}{' '}
164
- </Text>
165
- )}
166
- </Box>
167
- <Box height={1} overflow="hidden" width={100}>
168
- {isCurrent ? (
169
- <Box width="100%">
170
- <Text dimColor italic>
171
- {'(current)'}
172
- </Text>
173
- </Box>
174
- ) : Array.isArray(msg.message.content) &&
175
- msg.message.content[0]?.type === 'text' &&
176
- isEmptyMessageText(msg.message.content[0].text) ? (
177
- <Text dimColor italic>
178
- (empty message)
179
- </Text>
180
- ) : (
181
- <MessageComponent
182
- message={msg}
183
- messages={normalizedMessages}
184
- addMargin={false}
185
- tools={tools}
186
- verbose={false}
187
- debug={false}
188
- erroredToolUseIDs={erroredToolUseIDs}
189
- inProgressToolUseIDs={new Set()}
190
- unresolvedToolUseIDs={unresolvedToolUseIDs}
191
- shouldAnimate={false}
192
- shouldShowDot={false}
193
- />
194
- )}
195
- </Box>
196
- </Box>
197
- )
198
- })}
199
- </Box>
200
- <Box marginLeft={3}>
201
- <Text dimColor>
202
- {exitState.pending ? (
203
- <>Press {exitState.keyName} again to exit</>
204
- ) : (
205
- <>↑/↓ to select · Enter to confirm · Tab/Esc to cancel</>
206
- )}
207
- </Text>
208
- </Box>
209
- </>
210
- )
211
- }