@shareai-lab/kode 1.1.13 → 1.1.16

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 (288) hide show
  1. package/dist/entrypoints/cli.js +2 -1
  2. package/dist/entrypoints/cli.js.map +2 -2
  3. package/dist/index.js +5 -26
  4. package/dist/package.json +4 -1
  5. package/package.json +9 -104
  6. package/dist/test/testAdapters.js +0 -88
  7. package/dist/test/testAdapters.js.map +0 -1
  8. package/src/ProjectOnboarding.tsx +0 -198
  9. package/src/Tool.ts +0 -83
  10. package/src/commands/agents.tsx +0 -3416
  11. package/src/commands/approvedTools.ts +0 -53
  12. package/src/commands/bug.tsx +0 -20
  13. package/src/commands/clear.ts +0 -43
  14. package/src/commands/compact.ts +0 -120
  15. package/src/commands/config.tsx +0 -19
  16. package/src/commands/cost.ts +0 -18
  17. package/src/commands/ctx_viz.ts +0 -209
  18. package/src/commands/doctor.ts +0 -24
  19. package/src/commands/help.tsx +0 -19
  20. package/src/commands/init.ts +0 -37
  21. package/src/commands/listen.ts +0 -42
  22. package/src/commands/login.tsx +0 -51
  23. package/src/commands/logout.tsx +0 -40
  24. package/src/commands/mcp.ts +0 -41
  25. package/src/commands/model.tsx +0 -40
  26. package/src/commands/modelstatus.tsx +0 -20
  27. package/src/commands/onboarding.tsx +0 -34
  28. package/src/commands/pr_comments.ts +0 -59
  29. package/src/commands/refreshCommands.ts +0 -54
  30. package/src/commands/release-notes.ts +0 -34
  31. package/src/commands/resume.tsx +0 -31
  32. package/src/commands/review.ts +0 -49
  33. package/src/commands/terminalSetup.ts +0 -221
  34. package/src/commands.ts +0 -139
  35. package/src/components/ApproveApiKey.tsx +0 -93
  36. package/src/components/AsciiLogo.tsx +0 -13
  37. package/src/components/AutoUpdater.tsx +0 -148
  38. package/src/components/Bug.tsx +0 -367
  39. package/src/components/Config.tsx +0 -293
  40. package/src/components/ConsoleOAuthFlow.tsx +0 -327
  41. package/src/components/Cost.tsx +0 -23
  42. package/src/components/CostThresholdDialog.tsx +0 -46
  43. package/src/components/CustomSelect/option-map.ts +0 -42
  44. package/src/components/CustomSelect/select-option.tsx +0 -78
  45. package/src/components/CustomSelect/select.tsx +0 -152
  46. package/src/components/CustomSelect/theme.ts +0 -45
  47. package/src/components/CustomSelect/use-select-state.ts +0 -414
  48. package/src/components/CustomSelect/use-select.ts +0 -35
  49. package/src/components/FallbackToolUseRejectedMessage.tsx +0 -15
  50. package/src/components/FileEditToolUpdatedMessage.tsx +0 -66
  51. package/src/components/Help.tsx +0 -215
  52. package/src/components/HighlightedCode.tsx +0 -33
  53. package/src/components/InvalidConfigDialog.tsx +0 -113
  54. package/src/components/Link.tsx +0 -32
  55. package/src/components/LogSelector.tsx +0 -86
  56. package/src/components/Logo.tsx +0 -170
  57. package/src/components/MCPServerApprovalDialog.tsx +0 -100
  58. package/src/components/MCPServerDialogCopy.tsx +0 -25
  59. package/src/components/MCPServerMultiselectDialog.tsx +0 -109
  60. package/src/components/Message.tsx +0 -221
  61. package/src/components/MessageResponse.tsx +0 -15
  62. package/src/components/MessageSelector.tsx +0 -211
  63. package/src/components/ModeIndicator.tsx +0 -88
  64. package/src/components/ModelConfig.tsx +0 -301
  65. package/src/components/ModelListManager.tsx +0 -227
  66. package/src/components/ModelSelector.tsx +0 -3387
  67. package/src/components/ModelStatusDisplay.tsx +0 -230
  68. package/src/components/Onboarding.tsx +0 -274
  69. package/src/components/PressEnterToContinue.tsx +0 -11
  70. package/src/components/PromptInput.tsx +0 -760
  71. package/src/components/SentryErrorBoundary.ts +0 -39
  72. package/src/components/Spinner.tsx +0 -129
  73. package/src/components/StickerRequestForm.tsx +0 -16
  74. package/src/components/StructuredDiff.tsx +0 -191
  75. package/src/components/TextInput.tsx +0 -259
  76. package/src/components/TodoItem.tsx +0 -47
  77. package/src/components/TokenWarning.tsx +0 -31
  78. package/src/components/ToolUseLoader.tsx +0 -40
  79. package/src/components/TrustDialog.tsx +0 -106
  80. package/src/components/binary-feedback/BinaryFeedback.tsx +0 -63
  81. package/src/components/binary-feedback/BinaryFeedbackOption.tsx +0 -111
  82. package/src/components/binary-feedback/BinaryFeedbackView.tsx +0 -172
  83. package/src/components/binary-feedback/utils.ts +0 -220
  84. package/src/components/messages/AssistantBashOutputMessage.tsx +0 -22
  85. package/src/components/messages/AssistantLocalCommandOutputMessage.tsx +0 -49
  86. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +0 -19
  87. package/src/components/messages/AssistantTextMessage.tsx +0 -144
  88. package/src/components/messages/AssistantThinkingMessage.tsx +0 -40
  89. package/src/components/messages/AssistantToolUseMessage.tsx +0 -132
  90. package/src/components/messages/TaskProgressMessage.tsx +0 -32
  91. package/src/components/messages/TaskToolMessage.tsx +0 -58
  92. package/src/components/messages/UserBashInputMessage.tsx +0 -28
  93. package/src/components/messages/UserCommandMessage.tsx +0 -30
  94. package/src/components/messages/UserKodingInputMessage.tsx +0 -28
  95. package/src/components/messages/UserPromptMessage.tsx +0 -35
  96. package/src/components/messages/UserTextMessage.tsx +0 -39
  97. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +0 -12
  98. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +0 -36
  99. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +0 -31
  100. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +0 -57
  101. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +0 -35
  102. package/src/components/messages/UserToolResultMessage/utils.tsx +0 -56
  103. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +0 -121
  104. package/src/components/permissions/FallbackPermissionRequest.tsx +0 -153
  105. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +0 -182
  106. package/src/components/permissions/FileEditPermissionRequest/FileEditToolDiff.tsx +0 -77
  107. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +0 -164
  108. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +0 -83
  109. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +0 -240
  110. package/src/components/permissions/PermissionRequest.tsx +0 -101
  111. package/src/components/permissions/PermissionRequestTitle.tsx +0 -69
  112. package/src/components/permissions/hooks.ts +0 -44
  113. package/src/components/permissions/toolUseOptions.ts +0 -59
  114. package/src/components/permissions/utils.ts +0 -23
  115. package/src/constants/betas.ts +0 -5
  116. package/src/constants/claude-asterisk-ascii-art.tsx +0 -238
  117. package/src/constants/figures.ts +0 -4
  118. package/src/constants/keys.ts +0 -3
  119. package/src/constants/macros.ts +0 -11
  120. package/src/constants/modelCapabilities.ts +0 -179
  121. package/src/constants/models.ts +0 -1025
  122. package/src/constants/oauth.ts +0 -18
  123. package/src/constants/product.ts +0 -17
  124. package/src/constants/prompts.ts +0 -168
  125. package/src/constants/releaseNotes.ts +0 -7
  126. package/src/context/PermissionContext.tsx +0 -149
  127. package/src/context.ts +0 -278
  128. package/src/cost-tracker.ts +0 -84
  129. package/src/entrypoints/cli.tsx +0 -1561
  130. package/src/entrypoints/mcp.ts +0 -175
  131. package/src/history.ts +0 -25
  132. package/src/hooks/useApiKeyVerification.ts +0 -59
  133. package/src/hooks/useArrowKeyHistory.ts +0 -55
  134. package/src/hooks/useCanUseTool.ts +0 -138
  135. package/src/hooks/useCancelRequest.ts +0 -39
  136. package/src/hooks/useDoublePress.ts +0 -41
  137. package/src/hooks/useExitOnCtrlCD.ts +0 -31
  138. package/src/hooks/useInterval.ts +0 -25
  139. package/src/hooks/useLogMessages.ts +0 -16
  140. package/src/hooks/useLogStartupTime.ts +0 -12
  141. package/src/hooks/useNotifyAfterTimeout.ts +0 -65
  142. package/src/hooks/usePermissionRequestLogging.ts +0 -44
  143. package/src/hooks/useTerminalSize.ts +0 -49
  144. package/src/hooks/useTextInput.ts +0 -317
  145. package/src/hooks/useUnifiedCompletion.ts +0 -1405
  146. package/src/index.ts +0 -34
  147. package/src/messages.ts +0 -38
  148. package/src/permissions.ts +0 -268
  149. package/src/query.ts +0 -720
  150. package/src/screens/ConfigureNpmPrefix.tsx +0 -197
  151. package/src/screens/Doctor.tsx +0 -219
  152. package/src/screens/LogList.tsx +0 -68
  153. package/src/screens/REPL.tsx +0 -813
  154. package/src/screens/ResumeConversation.tsx +0 -68
  155. package/src/services/adapters/base.ts +0 -38
  156. package/src/services/adapters/chatCompletions.ts +0 -90
  157. package/src/services/adapters/responsesAPI.ts +0 -170
  158. package/src/services/browserMocks.ts +0 -66
  159. package/src/services/claude.ts +0 -2197
  160. package/src/services/customCommands.ts +0 -704
  161. package/src/services/fileFreshness.ts +0 -377
  162. package/src/services/gpt5ConnectionTest.ts +0 -340
  163. package/src/services/mcpClient.ts +0 -564
  164. package/src/services/mcpServerApproval.tsx +0 -50
  165. package/src/services/mentionProcessor.ts +0 -273
  166. package/src/services/modelAdapterFactory.ts +0 -69
  167. package/src/services/notifier.ts +0 -40
  168. package/src/services/oauth.ts +0 -357
  169. package/src/services/openai.ts +0 -1359
  170. package/src/services/responseStateManager.ts +0 -90
  171. package/src/services/sentry.ts +0 -3
  172. package/src/services/statsig.ts +0 -172
  173. package/src/services/statsigStorage.ts +0 -86
  174. package/src/services/systemReminder.ts +0 -507
  175. package/src/services/vcr.ts +0 -161
  176. package/src/test/testAdapters.ts +0 -96
  177. package/src/tools/ArchitectTool/ArchitectTool.tsx +0 -135
  178. package/src/tools/ArchitectTool/prompt.ts +0 -15
  179. package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +0 -576
  180. package/src/tools/BashTool/BashTool.tsx +0 -243
  181. package/src/tools/BashTool/BashToolResultMessage.tsx +0 -38
  182. package/src/tools/BashTool/OutputLine.tsx +0 -49
  183. package/src/tools/BashTool/prompt.ts +0 -174
  184. package/src/tools/BashTool/utils.ts +0 -56
  185. package/src/tools/FileEditTool/FileEditTool.tsx +0 -319
  186. package/src/tools/FileEditTool/prompt.ts +0 -51
  187. package/src/tools/FileEditTool/utils.ts +0 -58
  188. package/src/tools/FileReadTool/FileReadTool.tsx +0 -404
  189. package/src/tools/FileReadTool/prompt.ts +0 -7
  190. package/src/tools/FileWriteTool/FileWriteTool.tsx +0 -301
  191. package/src/tools/FileWriteTool/prompt.ts +0 -10
  192. package/src/tools/GlobTool/GlobTool.tsx +0 -119
  193. package/src/tools/GlobTool/prompt.ts +0 -8
  194. package/src/tools/GrepTool/GrepTool.tsx +0 -147
  195. package/src/tools/GrepTool/prompt.ts +0 -11
  196. package/src/tools/MCPTool/MCPTool.tsx +0 -107
  197. package/src/tools/MCPTool/prompt.ts +0 -3
  198. package/src/tools/MemoryReadTool/MemoryReadTool.tsx +0 -127
  199. package/src/tools/MemoryReadTool/prompt.ts +0 -3
  200. package/src/tools/MemoryWriteTool/MemoryWriteTool.tsx +0 -89
  201. package/src/tools/MemoryWriteTool/prompt.ts +0 -3
  202. package/src/tools/MultiEditTool/MultiEditTool.tsx +0 -388
  203. package/src/tools/MultiEditTool/prompt.ts +0 -45
  204. package/src/tools/NotebookEditTool/NotebookEditTool.tsx +0 -298
  205. package/src/tools/NotebookEditTool/prompt.ts +0 -3
  206. package/src/tools/NotebookReadTool/NotebookReadTool.tsx +0 -258
  207. package/src/tools/NotebookReadTool/prompt.ts +0 -3
  208. package/src/tools/StickerRequestTool/StickerRequestTool.tsx +0 -107
  209. package/src/tools/StickerRequestTool/prompt.ts +0 -19
  210. package/src/tools/TaskTool/TaskTool.tsx +0 -438
  211. package/src/tools/TaskTool/constants.ts +0 -1
  212. package/src/tools/TaskTool/prompt.ts +0 -92
  213. package/src/tools/ThinkTool/ThinkTool.tsx +0 -54
  214. package/src/tools/ThinkTool/prompt.ts +0 -12
  215. package/src/tools/TodoWriteTool/TodoWriteTool.tsx +0 -313
  216. package/src/tools/TodoWriteTool/prompt.ts +0 -63
  217. package/src/tools/URLFetcherTool/URLFetcherTool.tsx +0 -178
  218. package/src/tools/URLFetcherTool/cache.ts +0 -55
  219. package/src/tools/URLFetcherTool/htmlToMarkdown.ts +0 -55
  220. package/src/tools/URLFetcherTool/prompt.ts +0 -17
  221. package/src/tools/WebSearchTool/WebSearchTool.tsx +0 -103
  222. package/src/tools/WebSearchTool/prompt.ts +0 -13
  223. package/src/tools/WebSearchTool/searchProviders.ts +0 -66
  224. package/src/tools/lsTool/lsTool.tsx +0 -272
  225. package/src/tools/lsTool/prompt.ts +0 -2
  226. package/src/tools.ts +0 -67
  227. package/src/types/PermissionMode.ts +0 -120
  228. package/src/types/RequestContext.ts +0 -72
  229. package/src/types/common.d.ts +0 -2
  230. package/src/types/conversation.ts +0 -51
  231. package/src/types/logs.ts +0 -58
  232. package/src/types/modelCapabilities.ts +0 -64
  233. package/src/types/notebook.ts +0 -87
  234. package/src/utils/Cursor.ts +0 -436
  235. package/src/utils/PersistentShell.ts +0 -552
  236. package/src/utils/advancedFuzzyMatcher.ts +0 -290
  237. package/src/utils/agentLoader.ts +0 -278
  238. package/src/utils/agentStorage.ts +0 -97
  239. package/src/utils/array.ts +0 -3
  240. package/src/utils/ask.tsx +0 -99
  241. package/src/utils/auth.ts +0 -13
  242. package/src/utils/autoCompactCore.ts +0 -223
  243. package/src/utils/autoUpdater.ts +0 -458
  244. package/src/utils/betas.ts +0 -20
  245. package/src/utils/browser.ts +0 -14
  246. package/src/utils/cleanup.ts +0 -72
  247. package/src/utils/commands.ts +0 -261
  248. package/src/utils/commonUnixCommands.ts +0 -161
  249. package/src/utils/config.ts +0 -945
  250. package/src/utils/conversationRecovery.ts +0 -55
  251. package/src/utils/debugLogger.ts +0 -1235
  252. package/src/utils/diff.ts +0 -42
  253. package/src/utils/env.ts +0 -57
  254. package/src/utils/errors.ts +0 -21
  255. package/src/utils/exampleCommands.ts +0 -109
  256. package/src/utils/execFileNoThrow.ts +0 -51
  257. package/src/utils/expertChatStorage.ts +0 -136
  258. package/src/utils/file.ts +0 -405
  259. package/src/utils/fileRecoveryCore.ts +0 -71
  260. package/src/utils/format.tsx +0 -44
  261. package/src/utils/fuzzyMatcher.ts +0 -328
  262. package/src/utils/generators.ts +0 -62
  263. package/src/utils/git.ts +0 -92
  264. package/src/utils/globalLogger.ts +0 -77
  265. package/src/utils/http.ts +0 -10
  266. package/src/utils/imagePaste.ts +0 -38
  267. package/src/utils/json.ts +0 -13
  268. package/src/utils/log.ts +0 -382
  269. package/src/utils/markdown.ts +0 -213
  270. package/src/utils/messageContextManager.ts +0 -294
  271. package/src/utils/messages.tsx +0 -945
  272. package/src/utils/model.ts +0 -914
  273. package/src/utils/permissions/filesystem.ts +0 -127
  274. package/src/utils/responseState.ts +0 -23
  275. package/src/utils/ripgrep.ts +0 -167
  276. package/src/utils/secureFile.ts +0 -564
  277. package/src/utils/sessionState.ts +0 -49
  278. package/src/utils/state.ts +0 -25
  279. package/src/utils/style.ts +0 -29
  280. package/src/utils/terminal.ts +0 -50
  281. package/src/utils/theme.ts +0 -127
  282. package/src/utils/thinking.ts +0 -144
  283. package/src/utils/todoStorage.ts +0 -431
  284. package/src/utils/tokens.ts +0 -43
  285. package/src/utils/toolExecutionController.ts +0 -163
  286. package/src/utils/unaryLogging.ts +0 -26
  287. package/src/utils/user.ts +0 -37
  288. package/src/utils/validate.ts +0 -165
@@ -1,367 +0,0 @@
1
- import { Box, Text, useInput } from 'ink'
2
- import * as React from 'react'
3
- import { useState, useCallback, useEffect } from 'react'
4
- import { getTheme } from '../utils/theme'
5
- import { getMessagesGetter } from '../messages'
6
- import type { Message } from '../query'
7
- import TextInput from './TextInput'
8
- import { logError, getInMemoryErrors } from '../utils/log'
9
- import { env } from '../utils/env'
10
- import { getGitState, getIsGit, GitRepoState } from '../utils/git'
11
- import { useTerminalSize } from '../hooks/useTerminalSize'
12
- import { getAnthropicApiKey, getGlobalConfig } from '../utils/config'
13
- import { USER_AGENT } from '../utils/http'
14
- import { logEvent } from '../services/statsig'
15
- import { PRODUCT_NAME } from '../constants/product'
16
- import { API_ERROR_MESSAGE_PREFIX, queryQuick } from '../services/claude'
17
- import { openBrowser } from '../utils/browser'
18
- import { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'
19
- import { MACRO } from '../constants/macros'
20
- import { GITHUB_ISSUES_REPO_URL } from '../constants/product'
21
-
22
- type Props = {
23
- onDone(result: string): void
24
- }
25
-
26
- type Step = 'userInput' | 'consent' | 'submitting' | 'done'
27
-
28
- type FeedbackData = {
29
- // Removing because of privacy concerns. Add this back in when we have a more
30
- // robust tool for viewing feedback data that can de-identify users
31
- // user_id: string
32
- // session_id: string
33
- message_count: number
34
- datetime: string
35
- description: string
36
- platform: string
37
- gitRepo: boolean
38
- version: string | null
39
- transcript: Message[]
40
- }
41
-
42
- export function Bug({ onDone }: Props): React.ReactNode {
43
- const [step, setStep] = useState<Step>('userInput')
44
- const [cursorOffset, setCursorOffset] = useState(0)
45
- const [description, setDescription] = useState('')
46
- const [feedbackId, setFeedbackId] = useState<string | null>(null)
47
- const [error, setError] = useState<string | null>(null)
48
- const [envInfo, setEnvInfo] = useState<{
49
- isGit: boolean
50
- gitState: GitRepoState | null
51
- }>({ isGit: false, gitState: null })
52
- const [title, setTitle] = useState<string | null>(null)
53
- const textInputColumns = useTerminalSize().columns - 4
54
- const messages = getMessagesGetter()()
55
-
56
- useEffect(() => {
57
- async function loadEnvInfo() {
58
- const isGit = await getIsGit()
59
- let gitState: GitRepoState | null = null
60
- if (isGit) {
61
- gitState = await getGitState()
62
- }
63
- setEnvInfo({ isGit, gitState })
64
- }
65
- void loadEnvInfo()
66
- }, [])
67
-
68
- const exitState = useExitOnCtrlCD(() => process.exit(0))
69
-
70
- const submitReport = useCallback(async () => {
71
- setStep('done')
72
- // setStep('submitting')
73
- // setError(null)
74
- // setFeedbackId(null)
75
-
76
- // const reportData = {
77
- // message_count: messages.length,
78
- // datetime: new Date().toISOString(),
79
- // description,
80
- // platform: env.platform,
81
- // gitRepo: envInfo.isGit,
82
- // terminal: env.terminal,
83
- // version: MACRO.VERSION,
84
- // transcript: messages,
85
- // errors: getInMemoryErrors(),
86
- // }
87
-
88
- // const [result, t] = await Promise.all([
89
- // submitFeedback(reportData),
90
- // generateTitle(description),
91
- // ])
92
-
93
- // setTitle(t)
94
-
95
- // if (result.success) {
96
- // if (result.feedbackId) {
97
- // setFeedbackId(result.feedbackId)
98
- // logEvent('tengu_bug_report_submitted', {
99
- // feedback_id: result.feedbackId,
100
- // })
101
- // }
102
- // setStep('done')
103
- // } else {
104
- // console.log(result)
105
- // setError('Could not submit feedback. Please try again later.')
106
- // setStep('userInput')
107
- // }
108
- }, [description, envInfo.isGit, messages])
109
-
110
- useInput((input, key) => {
111
- // Allow any key press to close the dialog when done or when there's an error
112
- // if (step === 'done') {
113
- // if (key.return && feedbackId && title) {
114
- // // Open GitHub issue URL when Enter is pressed
115
- // const issueUrl = createGitHubIssueUrl(feedbackId, title, description)
116
- // void openBrowser(issueUrl)
117
- // }
118
- // onDone('<bash-stdout>Bug report submitted</bash-stdout>')
119
- // return
120
- // }
121
-
122
- if (error) {
123
- onDone('<bash-stderr>Error submitting bug report</bash-stderr>')
124
- return
125
- }
126
-
127
- if (key.escape) {
128
- onDone('<bash-stderr>Bug report cancelled</bash-stderr>')
129
- return
130
- }
131
-
132
- if (step === 'consent' && (key.return || input === ' ')) {
133
- const issueUrl = createGitHubIssueUrl(
134
- feedbackId,
135
- description.slice(0, 80),
136
- description,
137
- )
138
- void openBrowser(issueUrl)
139
- onDone('<bash-stdout>Bug report submitted</bash-stdout>')
140
- }
141
- })
142
-
143
- const theme = getTheme()
144
-
145
- return (
146
- <>
147
- <Box
148
- flexDirection="column"
149
- borderStyle="round"
150
- borderColor={theme.permission}
151
- paddingX={1}
152
- paddingBottom={1}
153
- gap={1}
154
- >
155
- <Text bold color={theme.permission}>
156
- Submit Bug Report
157
- </Text>
158
- {step === 'userInput' && (
159
- <Box flexDirection="column" gap={1}>
160
- <Text>
161
- Describe the issue below and copy/paste any errors you see:
162
- </Text>
163
- <TextInput
164
- value={description}
165
- onChange={setDescription}
166
- columns={textInputColumns}
167
- onSubmit={() => setStep('consent')}
168
- onExitMessage={() =>
169
- onDone('<bash-stderr>Bug report cancelled</bash-stderr>')
170
- }
171
- cursorOffset={cursorOffset}
172
- onChangeCursorOffset={setCursorOffset}
173
- />
174
- {error && (
175
- <Box flexDirection="column" gap={1}>
176
- <Text color="red">{error}</Text>
177
- <Text dimColor>Press any key to close</Text>
178
- </Box>
179
- )}
180
- </Box>
181
- )}
182
-
183
- {step === 'consent' && (
184
- <Box flexDirection="column">
185
- <Text>This report will include:</Text>
186
- <Box marginLeft={2} flexDirection="column">
187
- <Text>
188
- - Your bug description: <Text dimColor>{description}</Text>
189
- </Text>
190
- <Text>
191
- - Environment info:{' '}
192
- <Text dimColor>
193
- {env.platform}, {env.terminal}, v{MACRO.VERSION}
194
- </Text>
195
- </Text>
196
- {/* {envInfo.gitState && (
197
- <Text>
198
- - Git repo metadata:{' '}
199
- <Text dimColor>
200
- {envInfo.gitState.branchName}
201
- {envInfo.gitState.commitHash
202
- ? `, ${envInfo.gitState.commitHash.slice(0, 7)}`
203
- : ''}
204
- {envInfo.gitState.remoteUrl
205
- ? ` @ ${envInfo.gitState.remoteUrl}`
206
- : ''}
207
- {!envInfo.gitState.isHeadOnRemote && ', not synced'}
208
- {!envInfo.gitState.isClean && ', has local changes'}
209
- </Text>
210
- </Text>
211
- )} */}
212
- <Text>- Model settings (no api keys)</Text>
213
- </Box>
214
- {/* <Box marginTop={1}>
215
- <Text wrap="wrap" dimColor>
216
- We will use your feedback to debug related issues or to improve{' '}
217
- {PRODUCT_NAME}&apos;s functionality (eg. to reduce the risk of
218
- bugs occurring in the future). Anthropic will not train
219
- generative models using feedback from {PRODUCT_NAME}.
220
- </Text>
221
- </Box>
222
- <Box marginTop={1}>
223
- <Text>
224
- Press <Text bold>Enter</Text> to confirm and submit.
225
- </Text>
226
- </Box> */}
227
- </Box>
228
- )}
229
-
230
- {step === 'submitting' && (
231
- <Box flexDirection="row" gap={1}>
232
- <Text>Submitting report…</Text>
233
- </Box>
234
- )}
235
-
236
- {step === 'done' && (
237
- <Box flexDirection="column">
238
- <Text color={getTheme().success}>Thank you for your report!</Text>
239
- {feedbackId && <Text dimColor>Feedback ID: {feedbackId}</Text>}
240
- <Box marginTop={1}>
241
- <Text>Press </Text>
242
- <Text bold>Enter </Text>
243
- <Text>
244
- to also create a GitHub issue, or any other key to close.
245
- </Text>
246
- </Box>
247
- </Box>
248
- )}
249
- </Box>
250
-
251
- <Box marginLeft={3}>
252
- <Text dimColor>
253
- {exitState.pending ? (
254
- <>Press {exitState.keyName} again to exit</>
255
- ) : step === 'userInput' ? (
256
- <>Enter to continue · Esc to cancel</>
257
- ) : step === 'consent' ? (
258
- <>Enter to open browser to create GitHub issue · Esc to cancel</>
259
- ) : null}
260
- </Text>
261
- </Box>
262
- </>
263
- )
264
- }
265
-
266
- function createGitHubIssueUrl(
267
- feedbackId: string,
268
- title: string,
269
- description: string,
270
- ): string {
271
- const globalConfig = getGlobalConfig()
272
-
273
- // Get ModelProfile information instead of legacy model info
274
- const modelProfiles = globalConfig.modelProfiles || []
275
- const activeProfiles = modelProfiles.filter(p => p.isActive)
276
-
277
- let modelInfo = '## Models\n'
278
- if (activeProfiles.length === 0) {
279
- modelInfo += '- No model profiles configured\n'
280
- } else {
281
- activeProfiles.forEach(profile => {
282
- modelInfo += `- ${profile.name}\n`
283
- modelInfo += ` - provider: ${profile.provider}\n`
284
- modelInfo += ` - model: ${profile.modelName}\n`
285
- modelInfo += ` - baseURL: ${profile.baseURL}\n`
286
- modelInfo += ` - maxTokens: ${profile.maxTokens}\n`
287
- modelInfo += ` - contextLength: ${profile.contextLength}\n`
288
- if (profile.reasoningEffort) {
289
- modelInfo += ` - reasoning effort: ${profile.reasoningEffort}\n`
290
- }
291
- })
292
- }
293
-
294
- const body = encodeURIComponent(`
295
- ## Bug Description
296
- ${description}
297
-
298
- ## Environment Info
299
- - Platform: ${env.platform}
300
- - Terminal: ${env.terminal}
301
- - Version: ${MACRO.VERSION || 'unknown'}
302
-
303
- ${modelInfo}`)
304
- return `${GITHUB_ISSUES_REPO_URL}/new?title=${encodeURIComponent(title)}&body=${body}&labels=user-reported,bug`
305
- }
306
-
307
- async function generateTitle(description: string): Promise<string> {
308
- const response = await queryQuick({
309
- systemPrompt: [
310
- 'Generate a concise issue title (max 80 chars) that captures the key point of this feedback. Do not include quotes or prefixes like "Feedback:" or "Issue:". If you cannot generate a title, just use "User Feedback".',
311
- ],
312
- userPrompt: description,
313
- })
314
- const title =
315
- response.message.content[0]?.type === 'text'
316
- ? response.message.content[0].text
317
- : 'Bug Report'
318
- if (title.startsWith(API_ERROR_MESSAGE_PREFIX)) {
319
- return `Bug Report: ${description.slice(0, 60)}${description.length > 60 ? '...' : ''}`
320
- }
321
- return title
322
- }
323
-
324
- async function submitFeedback(
325
- data: FeedbackData,
326
- ): Promise<{ success: boolean; feedbackId?: string }> {
327
- return { success: true, feedbackId: '123' }
328
- // try {
329
- // const apiKey = getAnthropicApiKey()
330
- // if (!apiKey) {
331
- // return { success: false }
332
- // }
333
-
334
- // const response = await fetch(
335
- // 'https://api.anthropic.com/api/claude_cli_feedback',
336
- // {
337
- // method: 'POST',
338
- // headers: {
339
- // 'Content-Type': 'application/json',
340
- // 'User-Agent': USER_AGENT,
341
- // 'x-api-key': apiKey,
342
- // },
343
- // body: JSON.stringify({
344
- // content: JSON.stringify(data),
345
- // }),
346
- // },
347
- // )
348
-
349
- // if (response.ok) {
350
- // const result = await response.json()
351
- // if (result?.feedback_id) {
352
- // return { success: true, feedbackId: result.feedback_id }
353
- // }
354
- // logError('Failed to submit feedback: request did not return feedback_id')
355
- // return { success: false }
356
- // }
357
-
358
- // logError('Failed to submit feedback:' + response.status)
359
- // return { success: false }
360
- // } catch (err) {
361
- // logError(
362
- // 'Error submitting feedback: ' +
363
- // (err instanceof Error ? err.message : 'Unknown error'),
364
- // )
365
- // return { success: false }
366
- // }
367
- }
@@ -1,293 +0,0 @@
1
- import { Box, Text, useInput } from 'ink'
2
- import * as React from 'react'
3
- import { useState } from 'react'
4
- import figures from 'figures'
5
- import { getTheme } from '../utils/theme'
6
- import {
7
- GlobalConfig,
8
- saveGlobalConfig,
9
- getGlobalConfig,
10
- } from '../utils/config.js'
11
- import chalk from 'chalk'
12
- import { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'
13
- import { getModelManager } from '../utils/model'
14
-
15
- type Props = {
16
- onClose: () => void
17
- }
18
-
19
- type Setting =
20
- | {
21
- id: string
22
- label: string
23
- value: boolean
24
- onChange(value: boolean): void
25
- type: 'boolean'
26
- disabled?: boolean
27
- }
28
- | {
29
- id: string
30
- label: string
31
- value: string
32
- options: string[]
33
- onChange(value: string): void
34
- type: 'enum'
35
- disabled?: boolean
36
- }
37
- | {
38
- id: string
39
- label: string
40
- value: string
41
- onChange(value: string): void
42
- type: 'string'
43
- disabled?: boolean
44
- }
45
- | {
46
- id: string
47
- label: string
48
- value: number
49
- onChange(value: number): void
50
- type: 'number'
51
- disabled?: boolean
52
- }
53
-
54
- export function Config({ onClose }: Props): React.ReactNode {
55
- const [globalConfig, setGlobalConfig] = useState(getGlobalConfig())
56
- const initialConfig = React.useRef(getGlobalConfig())
57
- const [selectedIndex, setSelectedIndex] = useState(0)
58
- const exitState = useExitOnCtrlCD(() => process.exit(0))
59
- const [editingString, setEditingString] = useState(false)
60
- const [currentInput, setCurrentInput] = useState('')
61
- const [inputError, setInputError] = useState<string | null>(null)
62
-
63
- const modelManager = getModelManager()
64
- const activeProfiles = modelManager.getAvailableModels()
65
-
66
- const settings: Setting[] = [
67
- // Global settings
68
- {
69
- id: 'theme',
70
- label: 'Theme',
71
- value: globalConfig.theme ?? 'dark',
72
- options: ['dark', 'light'],
73
- onChange(theme: string) {
74
- const config = { ...getGlobalConfig(), theme: theme as any }
75
- saveGlobalConfig(config)
76
- setGlobalConfig(config)
77
- },
78
- type: 'enum',
79
- },
80
- {
81
- id: 'verbose',
82
- label: 'Verbose mode',
83
- value: globalConfig.verbose ?? false,
84
- onChange(verbose: boolean) {
85
- const config = { ...getGlobalConfig(), verbose }
86
- saveGlobalConfig(config)
87
- setGlobalConfig(config)
88
- },
89
- type: 'boolean',
90
- },
91
- {
92
- id: 'stream',
93
- label: 'Stream responses',
94
- value: globalConfig.stream ?? true,
95
- onChange(stream: boolean) {
96
- const config = { ...getGlobalConfig(), stream }
97
- saveGlobalConfig(config)
98
- setGlobalConfig(config)
99
- },
100
- type: 'boolean',
101
- },
102
- ]
103
-
104
- const theme = getTheme()
105
-
106
- useInput((input, key) => {
107
- if (editingString) {
108
- if (key.return) {
109
- const currentSetting = settings[selectedIndex]
110
- if (currentSetting?.type === 'string') {
111
- try {
112
- currentSetting.onChange(currentInput)
113
- setEditingString(false)
114
- setCurrentInput('')
115
- setInputError(null)
116
- } catch (error) {
117
- setInputError(
118
- error instanceof Error ? error.message : 'Invalid input',
119
- )
120
- }
121
- } else if (currentSetting?.type === 'number') {
122
- const numValue = parseFloat(currentInput)
123
- if (isNaN(numValue)) {
124
- setInputError('Please enter a valid number')
125
- } else {
126
- try {
127
- ;(currentSetting as any).onChange(numValue)
128
- setEditingString(false)
129
- setCurrentInput('')
130
- setInputError(null)
131
- } catch (error) {
132
- setInputError(
133
- error instanceof Error ? error.message : 'Invalid input',
134
- )
135
- }
136
- }
137
- }
138
- } else if (key.escape) {
139
- setEditingString(false)
140
- setCurrentInput('')
141
- setInputError(null)
142
- } else if (key.delete || key.backspace) {
143
- setCurrentInput(prev => prev.slice(0, -1))
144
- } else if (input) {
145
- setCurrentInput(prev => prev + input)
146
- }
147
- return
148
- }
149
-
150
- if (key.upArrow && !exitState.pending) {
151
- setSelectedIndex(prev => Math.max(0, prev - 1))
152
- } else if (key.downArrow && !exitState.pending) {
153
- setSelectedIndex(prev => Math.min(settings.length - 1, prev + 1))
154
- } else if (key.return && !exitState.pending) {
155
- const currentSetting = settings[selectedIndex]
156
- if (currentSetting?.disabled) return
157
-
158
- if (currentSetting?.type === 'boolean') {
159
- currentSetting.onChange(!currentSetting.value)
160
- } else if (currentSetting?.type === 'enum') {
161
- const currentIndex = currentSetting.options.indexOf(
162
- currentSetting.value,
163
- )
164
- const nextIndex = (currentIndex + 1) % currentSetting.options.length
165
- currentSetting.onChange(currentSetting.options[nextIndex])
166
- } else if (
167
- currentSetting?.type === 'string' ||
168
- currentSetting?.type === 'number'
169
- ) {
170
- setCurrentInput(String(currentSetting.value))
171
- setEditingString(true)
172
- setInputError(null)
173
- }
174
- } else if (key.escape && !exitState.pending) {
175
- // Check if config has changed
176
- const currentConfigString = JSON.stringify(getGlobalConfig())
177
- const initialConfigString = JSON.stringify(initialConfig.current)
178
-
179
- if (currentConfigString !== initialConfigString) {
180
- // Config has changed, save it
181
- saveGlobalConfig(getGlobalConfig())
182
- }
183
-
184
- onClose()
185
- }
186
- })
187
-
188
- return (
189
- <Box flexDirection="column" gap={1}>
190
- <Box
191
- flexDirection="column"
192
- borderStyle="round"
193
- borderColor={theme.secondaryBorder}
194
- paddingX={2}
195
- paddingY={1}
196
- gap={1}
197
- >
198
- <Text bold>
199
- Configuration{' '}
200
- {exitState.pending
201
- ? `(press ${exitState.keyName} again to exit)`
202
- : ''}
203
- </Text>
204
-
205
- {/* Model Configuration Summary */}
206
- <Box flexDirection="column" marginY={1}>
207
- <Text bold color={theme.success}>
208
- Model Configuration:
209
- </Text>
210
- {activeProfiles.length === 0 ? (
211
- <Text color={theme.secondaryText}>
212
- No models configured. Use /model to add models.
213
- </Text>
214
- ) : (
215
- <Box flexDirection="column" marginLeft={2}>
216
- {activeProfiles.map(profile => (
217
- <React.Fragment key={profile.modelName}>
218
- <Text color={theme.secondaryText}>
219
- • {profile.name} ({profile.provider})
220
- </Text>
221
- </React.Fragment>
222
- ))}
223
- <Box marginTop={1}>
224
- <Text color={theme.suggestion}>
225
- Use /model to manage model configurations
226
- </Text>
227
- </Box>
228
- </Box>
229
- )}
230
- </Box>
231
-
232
- {/* Settings List */}
233
- <Box flexDirection="column">
234
- {settings.map((setting, index) => (
235
- <Box key={setting.id} flexDirection="column">
236
- <Box flexDirection="row" gap={1}>
237
- <Text
238
- color={
239
- index === selectedIndex
240
- ? theme.success
241
- : setting.disabled
242
- ? theme.secondaryText
243
- : theme.text
244
- }
245
- >
246
- {index === selectedIndex ? figures.pointer : ' '}{' '}
247
- {setting.label}
248
- </Text>
249
- <Text
250
- color={
251
- setting.disabled ? theme.secondaryText : theme.suggestion
252
- }
253
- >
254
- {setting.type === 'boolean'
255
- ? setting.value
256
- ? 'enabled'
257
- : 'disabled'
258
- : setting.type === 'enum'
259
- ? setting.value
260
- : String(setting.value)}
261
- </Text>
262
- </Box>
263
- {index === selectedIndex && editingString && (
264
- <Box flexDirection="column" marginLeft={2}>
265
- <Text color={theme.suggestion}>
266
- Enter new value: {currentInput}
267
- </Text>
268
- {inputError && <Text color="red">{inputError}</Text>}
269
- </Box>
270
- )}
271
- </Box>
272
- ))}
273
- </Box>
274
-
275
- <Box marginTop={1}>
276
- <Text dimColor>
277
- {editingString ? (
278
- 'Enter to save · Esc to cancel'
279
- ) : (
280
- <>
281
- ↑/↓ to navigate · Enter to change · Esc to close
282
- <Text color={theme.suggestion}>
283
- {' '}
284
- · Use /model for model config
285
- </Text>
286
- </>
287
- )}
288
- </Text>
289
- </Box>
290
- </Box>
291
- </Box>
292
- )
293
- }